Lines Matching refs:drvdata

96 static void gxp_i2c_start(struct gxp_i2c_drvdata *drvdata)
100 drvdata->buf = drvdata->curr_msg->buf;
101 drvdata->buf_remaining = drvdata->curr_msg->len;
104 value = drvdata->curr_msg->addr << 9;
107 value |= drvdata->curr_msg->flags & I2C_M_RD ? RW_CMD | START_CMD : START_CMD;
109 drvdata->state = GXP_I2C_ADDR_PHASE;
110 writew(value, drvdata->base + GXP_I2CMCMD);
117 struct gxp_i2c_drvdata *drvdata = i2c_get_adapdata(adapter);
120 drvdata->msgs_remaining = num;
121 drvdata->curr_msg = msgs;
122 drvdata->msgs_num = num;
123 reinit_completion(&drvdata->completion);
125 gxp_i2c_start(drvdata);
127 time_left = wait_for_completion_timeout(&drvdata->completion,
129 ret = num - drvdata->msgs_remaining;
133 if (drvdata->state == GXP_I2C_ADDR_NACK)
136 if (drvdata->state == GXP_I2C_DATA_NACK)
153 struct gxp_i2c_drvdata *drvdata = i2c_get_adapdata(slave->adapter);
155 if (drvdata->slave)
161 drvdata->slave = slave;
163 writeb(slave->addr << 1, drvdata->base + GXP_I2COWNADR);
165 SLAVE_EVT_STALL, drvdata->base + GXP_I2CSCMD);
172 struct gxp_i2c_drvdata *drvdata = i2c_get_adapdata(slave->adapter);
174 WARN_ON(!drvdata->slave);
176 writeb(0x00, drvdata->base + GXP_I2COWNADR);
178 SLAVE_EVT_MASK, drvdata->base + GXP_I2CSCMD);
180 drvdata->slave = NULL;
195 static void gxp_i2c_stop(struct gxp_i2c_drvdata *drvdata)
198 writeb(MASTER_EVT_CLR | STOP_CMD, drvdata->base + GXP_I2CMCMD);
200 complete(&drvdata->completion);
203 static void gxp_i2c_restart(struct gxp_i2c_drvdata *drvdata)
207 drvdata->buf = drvdata->curr_msg->buf;
208 drvdata->buf_remaining = drvdata->curr_msg->len;
210 value = drvdata->curr_msg->addr << 9;
212 if (drvdata->curr_msg->flags & I2C_M_RD) {
220 drvdata->state = GXP_I2C_ADDR_PHASE;
222 writew(value, drvdata->base + GXP_I2CMCMD);
225 static void gxp_i2c_chk_addr_ack(struct gxp_i2c_drvdata *drvdata)
229 value = readb(drvdata->base + GXP_I2CSTAT);
232 drvdata->state = GXP_I2C_ADDR_NACK;
233 gxp_i2c_stop(drvdata);
237 if (drvdata->curr_msg->flags & I2C_M_RD) {
239 if (drvdata->buf_remaining == 0) {
241 drvdata->msgs_remaining--;
242 drvdata->state = GXP_I2C_COMP;
243 gxp_i2c_stop(drvdata);
246 drvdata->state = GXP_I2C_RDATA_PHASE;
248 if (drvdata->buf_remaining == 1) {
251 drvdata->base + GXP_I2CMCMD);
255 RW_CMD, drvdata->base + GXP_I2CMCMD);
259 if (drvdata->buf_remaining == 0) {
261 drvdata->msgs_remaining--;
262 drvdata->state = GXP_I2C_COMP;
263 gxp_i2c_stop(drvdata);
266 value = *drvdata->buf;
270 drvdata->buf++;
271 drvdata->buf_remaining--;
272 drvdata->state = GXP_I2C_WDATA_PHASE;
273 writew(value, drvdata->base + GXP_I2CMCMD);
277 static void gxp_i2c_ack_data(struct gxp_i2c_drvdata *drvdata)
282 value = readb(drvdata->base + GXP_I2CSNPDAT);
283 *drvdata->buf = value;
284 drvdata->buf++;
285 drvdata->buf_remaining--;
287 if (drvdata->buf_remaining == 0) {
289 drvdata->msgs_remaining--;
291 if (drvdata->msgs_remaining == 0) {
293 drvdata->state = GXP_I2C_COMP;
294 gxp_i2c_stop(drvdata);
298 drvdata->curr_msg++;
299 gxp_i2c_restart(drvdata);
304 drvdata->state = GXP_I2C_RDATA_PHASE;
305 if (drvdata->buf_remaining == 1) {
308 drvdata->base + GXP_I2CMCMD);
312 RW_CMD, drvdata->base + GXP_I2CMCMD);
316 static void gxp_i2c_chk_data_ack(struct gxp_i2c_drvdata *drvdata)
320 value = readb(drvdata->base + GXP_I2CSTAT);
323 drvdata->state = GXP_I2C_DATA_NACK;
324 gxp_i2c_stop(drvdata);
329 if (drvdata->buf_remaining == 0) {
331 drvdata->msgs_remaining--;
333 if (drvdata->msgs_remaining == 0) {
335 drvdata->state = GXP_I2C_COMP;
336 gxp_i2c_stop(drvdata);
340 drvdata->curr_msg++;
341 gxp_i2c_restart(drvdata);
346 value = *drvdata->buf;
351 drvdata->buf++;
352 drvdata->buf_remaining--;
353 drvdata->state = GXP_I2C_WDATA_PHASE;
354 writew(value, drvdata->base + GXP_I2CMCMD);
357 static bool gxp_i2c_slave_irq_handler(struct gxp_i2c_drvdata *drvdata)
363 value = readb(drvdata->base + GXP_I2CEVTERR);
367 value = readb(drvdata->base + GXP_I2CSTAT);
370 if (drvdata->stopped == 0)
371 i2c_slave_event(drvdata->slave, I2C_SLAVE_STOP, &buf);
373 SLAVE_ACK_ENAB | SLAVE_EVT_STALL, drvdata->base + GXP_I2CSCMD);
374 drvdata->stopped = 1;
377 drvdata->stopped = 0;
379 i2c_slave_event(drvdata->slave,
383 writew(value, drvdata->base + GXP_I2CSCMD);
386 ret = i2c_slave_event(drvdata->slave,
392 drvdata->base + GXP_I2CSCMD);
396 SLAVE_EVT_STALL, drvdata->base + GXP_I2CSCMD);
401 value = readb(drvdata->base + GXP_I2CSTAT);
406 i2c_slave_event(drvdata->slave,
410 writew(value, drvdata->base + GXP_I2CSCMD);
415 drvdata->base + GXP_I2CSCMD);
419 value = readb(drvdata->base + GXP_I2CSNPDAT);
421 ret = i2c_slave_event(drvdata->slave,
427 drvdata->base + GXP_I2CSCMD);
431 SLAVE_EVT_STALL, drvdata->base + GXP_I2CSCMD);
443 struct gxp_i2c_drvdata *drvdata = (struct gxp_i2c_drvdata *)_drvdata;
448 if (!(value & BIT(drvdata->engine)))
451 value = readb(drvdata->base + GXP_I2CEVTERR);
457 writeb(0x00, drvdata->base + GXP_I2CEVTERR);
458 drvdata->state = GXP_I2C_ERROR;
459 gxp_i2c_stop(drvdata);
466 if (gxp_i2c_slave_irq_handler(drvdata))
473 switch (drvdata->state) {
475 gxp_i2c_chk_addr_ack(drvdata);
479 gxp_i2c_ack_data(drvdata);
483 gxp_i2c_chk_data_ack(drvdata);
490 static void gxp_i2c_init(struct gxp_i2c_drvdata *drvdata)
492 drvdata->state = GXP_I2C_IDLE;
493 writeb(2000000 / drvdata->t.bus_freq_hz,
494 drvdata->base + GXP_I2CFREQDIV);
496 drvdata->base + GXP_I2CFLTFAIR);
497 writeb(GXP_DATA_EDGE_RST_CTRL, drvdata->base + GXP_I2CTMOEDG);
498 writeb(0x00, drvdata->base + GXP_I2CCYCTIM);
499 writeb(0x00, drvdata->base + GXP_I2CSNPAA);
500 writeb(0x00, drvdata->base + GXP_I2CADVFEAT);
502 SLAVE_EVT_MASK, drvdata->base + GXP_I2CSCMD);
503 writeb(MASTER_EVT_CLR, drvdata->base + GXP_I2CMCMD);
504 writeb(0x00, drvdata->base + GXP_I2CEVTERR);
505 writeb(0x00, drvdata->base + GXP_I2COWNADR);
510 struct gxp_i2c_drvdata *drvdata;
526 drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata),
528 if (!drvdata)
531 platform_set_drvdata(pdev, drvdata);
532 drvdata->dev = &pdev->dev;
533 init_completion(&drvdata->completion);
535 drvdata->base = devm_platform_ioremap_resource(pdev, 0);
536 if (IS_ERR(drvdata->base))
537 return PTR_ERR(drvdata->base);
540 drvdata->engine = ((size_t)drvdata->base & 0xf00) >> 8;
542 if (drvdata->engine >= GXP_MAX_I2C_ENGINE) {
544 drvdata->engine);
551 drvdata->irq = rc;
552 rc = devm_request_irq(&pdev->dev, drvdata->irq, gxp_i2c_irq_handler,
553 IRQF_SHARED, gxp_i2c_name[drvdata->engine], drvdata);
557 i2c_parse_fw_timings(&pdev->dev, &drvdata->t, true);
559 gxp_i2c_init(drvdata);
562 regmap_update_bits(i2cg_map, GXP_I2CINTEN, BIT(drvdata->engine),
563 BIT(drvdata->engine));
565 adapter = &drvdata->adapter;
566 i2c_set_adapdata(adapter, drvdata);
583 struct gxp_i2c_drvdata *drvdata = platform_get_drvdata(pdev);
586 regmap_update_bits(i2cg_map, GXP_I2CINTEN, BIT(drvdata->engine), 0);
587 i2c_del_adapter(&drvdata->adapter);