Lines Matching refs:i2c

90 static int kempld_i2c_process(struct kempld_i2c_data *i2c)  in kempld_i2c_process()  argument
92 struct kempld_device_data *pld = i2c->pld; in kempld_i2c_process()
94 struct i2c_msg *msg = i2c->msg; in kempld_i2c_process()
101 if (i2c->state == STATE_DONE || i2c->state == STATE_ERROR) { in kempld_i2c_process()
104 if (i2c->state == STATE_ERROR) in kempld_i2c_process()
111 i2c->state = STATE_ERROR; in kempld_i2c_process()
116 if (i2c->state == STATE_INIT) { in kempld_i2c_process()
120 i2c->state = STATE_ADDR; in kempld_i2c_process()
123 if (i2c->state == STATE_ADDR) { in kempld_i2c_process()
125 if (i2c->msg->flags & I2C_M_TEN) { in kempld_i2c_process()
126 addr = 0xf0 | ((i2c->msg->addr >> 7) & 0x6); in kempld_i2c_process()
127 i2c->state = STATE_ADDR10; in kempld_i2c_process()
129 addr = (i2c->msg->addr << 1); in kempld_i2c_process()
130 i2c->state = STATE_START; in kempld_i2c_process()
134 addr |= (i2c->msg->flags & I2C_M_RD) ? 1 : 0; in kempld_i2c_process()
143 if (i2c->state == STATE_ADDR10) { in kempld_i2c_process()
144 kempld_write8(pld, KEMPLD_I2C_DATA, i2c->msg->addr & 0xff); in kempld_i2c_process()
147 i2c->state = STATE_START; in kempld_i2c_process()
151 if (i2c->state == STATE_START || i2c->state == STATE_WRITE) { in kempld_i2c_process()
152 i2c->state = (msg->flags & I2C_M_RD) ? STATE_READ : STATE_WRITE; in kempld_i2c_process()
155 i2c->state = STATE_ERROR; in kempld_i2c_process()
160 msg->buf[i2c->pos++] = kempld_read8(pld, KEMPLD_I2C_DATA); in kempld_i2c_process()
163 if (i2c->pos >= msg->len) { in kempld_i2c_process()
164 i2c->nmsgs--; in kempld_i2c_process()
165 i2c->msg++; in kempld_i2c_process()
166 i2c->pos = 0; in kempld_i2c_process()
167 msg = i2c->msg; in kempld_i2c_process()
169 if (i2c->nmsgs) { in kempld_i2c_process()
171 i2c->state = STATE_ADDR; in kempld_i2c_process()
174 i2c->state = (msg->flags & I2C_M_RD) in kempld_i2c_process()
178 i2c->state = STATE_DONE; in kempld_i2c_process()
184 if (i2c->state == STATE_READ) { in kempld_i2c_process()
185 kempld_write8(pld, KEMPLD_I2C_CMD, i2c->pos == (msg->len - 1) ? in kempld_i2c_process()
188 kempld_write8(pld, KEMPLD_I2C_DATA, msg->buf[i2c->pos++]); in kempld_i2c_process()
198 struct kempld_i2c_data *i2c = i2c_get_adapdata(adap); in kempld_i2c_xfer() local
199 struct kempld_device_data *pld = i2c->pld; in kempld_i2c_xfer()
203 i2c->msg = msgs; in kempld_i2c_xfer()
204 i2c->pos = 0; in kempld_i2c_xfer()
205 i2c->nmsgs = num; in kempld_i2c_xfer()
206 i2c->state = STATE_INIT; in kempld_i2c_xfer()
211 ret = kempld_i2c_process(i2c); in kempld_i2c_xfer()
214 if (i2c->state == STATE_DONE || i2c->state == STATE_ERROR) in kempld_i2c_xfer()
215 return (i2c->state == STATE_DONE) ? num : ret; in kempld_i2c_xfer()
223 i2c->state = STATE_ERROR; in kempld_i2c_xfer()
231 static void kempld_i2c_device_init(struct kempld_i2c_data *i2c) in kempld_i2c_device_init() argument
233 struct kempld_device_data *pld = i2c->pld; in kempld_i2c_device_init()
302 struct kempld_i2c_data *i2c; in kempld_i2c_probe() local
306 i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); in kempld_i2c_probe()
307 if (!i2c) in kempld_i2c_probe()
310 i2c->pld = pld; in kempld_i2c_probe()
311 i2c->dev = &pdev->dev; in kempld_i2c_probe()
312 i2c->adap = kempld_i2c_adapter; in kempld_i2c_probe()
313 i2c->adap.dev.parent = i2c->dev; in kempld_i2c_probe()
314 i2c_set_adapdata(&i2c->adap, i2c); in kempld_i2c_probe()
315 platform_set_drvdata(pdev, i2c); in kempld_i2c_probe()
321 i2c->was_active = true; in kempld_i2c_probe()
323 kempld_i2c_device_init(i2c); in kempld_i2c_probe()
328 i2c->adap.nr = i2c_bus; in kempld_i2c_probe()
329 ret = i2c_add_numbered_adapter(&i2c->adap); in kempld_i2c_probe()
333 dev_info(i2c->dev, "I2C bus initialized at %dkHz\n", in kempld_i2c_probe()
341 struct kempld_i2c_data *i2c = platform_get_drvdata(pdev); in kempld_i2c_remove() local
342 struct kempld_device_data *pld = i2c->pld; in kempld_i2c_remove()
350 if (!i2c->was_active) { in kempld_i2c_remove()
357 i2c_del_adapter(&i2c->adap); in kempld_i2c_remove()
365 struct kempld_i2c_data *i2c = platform_get_drvdata(pdev); in kempld_i2c_suspend() local
366 struct kempld_device_data *pld = i2c->pld; in kempld_i2c_suspend()
380 struct kempld_i2c_data *i2c = platform_get_drvdata(pdev); in kempld_i2c_resume() local
381 struct kempld_device_data *pld = i2c->pld; in kempld_i2c_resume()
384 kempld_i2c_device_init(i2c); in kempld_i2c_resume()