Lines Matching full:i2c

5  * This is a combined i2c adapter and algorithm driver for the
7 * the same I2C unit (8240, 8245, 85xx).
26 #include <linux/i2c.h>
33 #define DRV_NAME "mpc-i2c"
75 void (*setup)(struct device_node *node, struct mpc_i2c *i2c,
80 static inline void writeccr(struct mpc_i2c *i2c, u32 x) in writeccr() argument
82 writeb(x, i2c->base + MPC_I2C_CR); in writeccr()
87 struct mpc_i2c *i2c = dev_id; in mpc_i2c_isr() local
88 if (readb(i2c->base + MPC_I2C_SR) & CSR_MIF) { in mpc_i2c_isr()
90 i2c->interrupt = readb(i2c->base + MPC_I2C_SR); in mpc_i2c_isr()
91 writeb(0, i2c->base + MPC_I2C_SR); in mpc_i2c_isr()
92 wake_up(&i2c->queue); in mpc_i2c_isr()
102 static void mpc_i2c_fixup(struct mpc_i2c *i2c) in mpc_i2c_fixup() argument
105 u32 delay_val = 1000000 / i2c->real_clk + 1; in mpc_i2c_fixup()
111 writeccr(i2c, 0); in mpc_i2c_fixup()
112 writeccr(i2c, CCR_MSTA | CCR_MTX | CCR_MEN); in mpc_i2c_fixup()
114 writeccr(i2c, CCR_MEN); in mpc_i2c_fixup()
119 static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing) in i2c_wait() argument
125 if (!i2c->irq) { in i2c_wait()
126 while (!(readb(i2c->base + MPC_I2C_SR) & CSR_MIF)) { in i2c_wait()
129 dev_dbg(i2c->dev, "timeout\n"); in i2c_wait()
130 writeccr(i2c, 0); in i2c_wait()
135 x = readb(i2c->base + MPC_I2C_SR); in i2c_wait()
136 writeb(0, i2c->base + MPC_I2C_SR); in i2c_wait()
139 result = wait_event_timeout(i2c->queue, in i2c_wait()
140 (i2c->interrupt & CSR_MIF), timeout); in i2c_wait()
142 if (unlikely(!(i2c->interrupt & CSR_MIF))) { in i2c_wait()
143 dev_dbg(i2c->dev, "wait timeout\n"); in i2c_wait()
144 writeccr(i2c, 0); in i2c_wait()
148 x = i2c->interrupt; in i2c_wait()
149 i2c->interrupt = 0; in i2c_wait()
156 dev_dbg(i2c->dev, "unfinished\n"); in i2c_wait()
161 dev_dbg(i2c->dev, "MAL\n"); in i2c_wait()
166 dev_dbg(i2c->dev, "No RXAK\n"); in i2c_wait()
168 writeccr(i2c, CCR_MEN); in i2c_wait()
214 * We want to choose an FDR/DFSR that generates an I2C bus speed that in mpc_i2c_get_fdr_52xx()
231 struct mpc_i2c *i2c, in mpc_i2c_setup_52xx() argument
237 dev_dbg(i2c->dev, "using fdr %d\n", in mpc_i2c_setup_52xx()
238 readb(i2c->base + MPC_I2C_FDR)); in mpc_i2c_setup_52xx()
242 ret = mpc_i2c_get_fdr_52xx(node, clock, prescaler, &i2c->real_clk); in mpc_i2c_setup_52xx()
245 writeb(fdr & 0xff, i2c->base + MPC_I2C_FDR); in mpc_i2c_setup_52xx()
248 dev_info(i2c->dev, "clock %u Hz (fdr=%d)\n", i2c->real_clk, in mpc_i2c_setup_52xx()
253 struct mpc_i2c *i2c, in mpc_i2c_setup_52xx() argument
261 struct mpc_i2c *i2c, in mpc_i2c_setup_512x() argument
269 /* Enable I2C interrupts for mpc5121 */ in mpc_i2c_setup_512x()
271 "fsl,mpc5121-i2c-ctrl"); in mpc_i2c_setup_512x()
275 /* Interrupt enable bits for i2c-0/1/2: bit 24/26/28 */ in mpc_i2c_setup_512x()
285 mpc_i2c_setup_52xx(node, i2c, clock, prescaler); in mpc_i2c_setup_512x()
289 struct mpc_i2c *i2c, in mpc_i2c_setup_512x() argument
359 if (of_device_is_compatible(node, "fsl,mpc8544-i2c")) in mpc_i2c_get_fdr_8xxx()
366 pr_debug("I2C: src_clock=%d clock=%d divider=%d\n", in mpc_i2c_get_fdr_8xxx()
370 * We want to choose an FDR/DFSR that generates an I2C bus speed that in mpc_i2c_get_fdr_8xxx()
384 struct mpc_i2c *i2c, in mpc_i2c_setup_8xxx() argument
390 dev_dbg(i2c->dev, "using dfsrr %d, fdr %d\n", in mpc_i2c_setup_8xxx()
391 readb(i2c->base + MPC_I2C_DFSRR), in mpc_i2c_setup_8xxx()
392 readb(i2c->base + MPC_I2C_FDR)); in mpc_i2c_setup_8xxx()
396 ret = mpc_i2c_get_fdr_8xxx(node, clock, prescaler, &i2c->real_clk); in mpc_i2c_setup_8xxx()
399 writeb(fdr & 0xff, i2c->base + MPC_I2C_FDR); in mpc_i2c_setup_8xxx()
400 writeb((fdr >> 8) & 0xff, i2c->base + MPC_I2C_DFSRR); in mpc_i2c_setup_8xxx()
403 dev_info(i2c->dev, "clock %d Hz (dfsrr=%d fdr=%d)\n", in mpc_i2c_setup_8xxx()
404 i2c->real_clk, fdr >> 8, fdr & 0xff); in mpc_i2c_setup_8xxx()
409 struct mpc_i2c *i2c, in mpc_i2c_setup_8xxx() argument
415 static void mpc_i2c_start(struct mpc_i2c *i2c) in mpc_i2c_start() argument
418 writeb(0, i2c->base + MPC_I2C_SR); in mpc_i2c_start()
420 writeccr(i2c, CCR_MEN); in mpc_i2c_start()
423 static void mpc_i2c_stop(struct mpc_i2c *i2c) in mpc_i2c_stop() argument
425 writeccr(i2c, CCR_MEN); in mpc_i2c_stop()
428 static int mpc_write(struct mpc_i2c *i2c, int target, in mpc_write() argument
432 unsigned timeout = i2c->adap.timeout; in mpc_write()
436 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); in mpc_write()
438 writeb((target << 1), i2c->base + MPC_I2C_DR); in mpc_write()
440 result = i2c_wait(i2c, timeout, 1); in mpc_write()
446 writeb(data[i], i2c->base + MPC_I2C_DR); in mpc_write()
448 result = i2c_wait(i2c, timeout, 1); in mpc_write()
456 static int mpc_read(struct mpc_i2c *i2c, int target, in mpc_read() argument
459 unsigned timeout = i2c->adap.timeout; in mpc_read()
464 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); in mpc_read()
466 writeb((target << 1) | 1, i2c->base + MPC_I2C_DR); in mpc_read()
468 result = i2c_wait(i2c, timeout, 1); in mpc_read()
474 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK); in mpc_read()
476 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA); in mpc_read()
478 readb(i2c->base + MPC_I2C_DR); in mpc_read()
482 result = i2c_wait(i2c, timeout, 0); in mpc_read()
488 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK); in mpc_read()
491 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX); in mpc_read()
492 data[i] = readb(i2c->base + MPC_I2C_DR); in mpc_read()
504 struct mpc_i2c *i2c = i2c_get_adapdata(adap); in mpc_xfer() local
506 mpc_i2c_start(i2c); in mpc_xfer()
509 while (readb(i2c->base + MPC_I2C_SR) & CSR_MBB) { in mpc_xfer()
511 dev_dbg(i2c->dev, "Interrupted\n"); in mpc_xfer()
512 writeccr(i2c, 0); in mpc_xfer()
516 u8 status = readb(i2c->base + MPC_I2C_SR); in mpc_xfer()
518 dev_dbg(i2c->dev, "timeout\n"); in mpc_xfer()
521 i2c->base + MPC_I2C_SR); in mpc_xfer()
522 mpc_i2c_fixup(i2c); in mpc_xfer()
531 dev_dbg(i2c->dev, in mpc_xfer()
537 mpc_read(i2c, pmsg->addr, pmsg->buf, pmsg->len, i); in mpc_xfer()
540 mpc_write(i2c, pmsg->addr, pmsg->buf, pmsg->len, i); in mpc_xfer()
542 mpc_i2c_stop(i2c); in mpc_xfer()
567 struct mpc_i2c *i2c; in fsl_i2c_probe() local
577 i2c = kzalloc(sizeof(*i2c), GFP_KERNEL); in fsl_i2c_probe()
578 if (!i2c) in fsl_i2c_probe()
581 i2c->dev = &op->dev; /* for debug and error output */ in fsl_i2c_probe()
583 init_waitqueue_head(&i2c->queue); in fsl_i2c_probe()
585 i2c->base = of_iomap(op->dev.of_node, 0); in fsl_i2c_probe()
586 if (!i2c->base) { in fsl_i2c_probe()
587 dev_err(i2c->dev, "failed to map controller\n"); in fsl_i2c_probe()
592 i2c->irq = irq_of_parse_and_map(op->dev.of_node, 0); in fsl_i2c_probe()
593 if (i2c->irq) { /* no i2c->irq implies polling */ in fsl_i2c_probe()
594 result = request_irq(i2c->irq, mpc_i2c_isr, in fsl_i2c_probe()
595 IRQF_SHARED, "i2c-mpc", i2c); in fsl_i2c_probe()
597 dev_err(i2c->dev, "failed to attach interrupt\n"); in fsl_i2c_probe()
613 data->setup(op->dev.of_node, i2c, clock, data->prescaler); in fsl_i2c_probe()
617 mpc_i2c_setup_8xxx(op->dev.of_node, i2c, clock, 0); in fsl_i2c_probe()
626 dev_info(i2c->dev, "timeout %u us\n", mpc_ops.timeout * 1000000 / HZ); in fsl_i2c_probe()
628 dev_set_drvdata(&op->dev, i2c); in fsl_i2c_probe()
630 i2c->adap = mpc_ops; in fsl_i2c_probe()
631 i2c_set_adapdata(&i2c->adap, i2c); in fsl_i2c_probe()
632 i2c->adap.dev.parent = &op->dev; in fsl_i2c_probe()
633 i2c->adap.dev.of_node = of_node_get(op->dev.of_node); in fsl_i2c_probe()
635 result = i2c_add_adapter(&i2c->adap); in fsl_i2c_probe()
637 dev_err(i2c->dev, "failed to add adapter\n"); in fsl_i2c_probe()
640 of_i2c_register_devices(&i2c->adap); in fsl_i2c_probe()
646 free_irq(i2c->irq, i2c); in fsl_i2c_probe()
648 irq_dispose_mapping(i2c->irq); in fsl_i2c_probe()
649 iounmap(i2c->base); in fsl_i2c_probe()
651 kfree(i2c); in fsl_i2c_probe()
657 struct mpc_i2c *i2c = dev_get_drvdata(&op->dev); in fsl_i2c_remove() local
659 i2c_del_adapter(&i2c->adap); in fsl_i2c_remove()
662 if (i2c->irq) in fsl_i2c_remove()
663 free_irq(i2c->irq, i2c); in fsl_i2c_remove()
665 irq_dispose_mapping(i2c->irq); in fsl_i2c_remove()
666 iounmap(i2c->base); in fsl_i2c_remove()
667 kfree(i2c); in fsl_i2c_remove()
694 {.compatible = "mpc5200-i2c", .data = &mpc_i2c_data_52xx, },
695 {.compatible = "fsl,mpc5200b-i2c", .data = &mpc_i2c_data_52xx, },
696 {.compatible = "fsl,mpc5200-i2c", .data = &mpc_i2c_data_52xx, },
697 {.compatible = "fsl,mpc5121-i2c", .data = &mpc_i2c_data_512x, },
698 {.compatible = "fsl,mpc8313-i2c", .data = &mpc_i2c_data_8313, },
699 {.compatible = "fsl,mpc8543-i2c", .data = &mpc_i2c_data_8543, },
700 {.compatible = "fsl,mpc8544-i2c", .data = &mpc_i2c_data_8544, },
702 {.compatible = "fsl-i2c", },
721 MODULE_DESCRIPTION("I2C-Bus adapter for MPC107 bridge and "