• Home
  • Raw
  • Download

Lines Matching refs:i2c

81 	void (*setup)(struct device_node *node, struct mpc_i2c *i2c,
86 static inline void writeccr(struct mpc_i2c *i2c, u32 x) in writeccr() argument
88 writeb(x, i2c->base + MPC_I2C_CR); in writeccr()
93 struct mpc_i2c *i2c = dev_id; in mpc_i2c_isr() local
94 if (readb(i2c->base + MPC_I2C_SR) & CSR_MIF) { in mpc_i2c_isr()
96 i2c->interrupt = readb(i2c->base + MPC_I2C_SR); in mpc_i2c_isr()
97 writeb(0, i2c->base + MPC_I2C_SR); in mpc_i2c_isr()
98 wake_up(&i2c->queue); in mpc_i2c_isr()
109 static void mpc_i2c_fixup(struct mpc_i2c *i2c) in mpc_i2c_fixup() argument
112 u32 delay_val = 1000000 / i2c->real_clk + 1; in mpc_i2c_fixup()
118 writeccr(i2c, 0); in mpc_i2c_fixup()
119 writeccr(i2c, CCR_MSTA | CCR_MTX | CCR_MEN); in mpc_i2c_fixup()
120 readb(i2c->base + MPC_I2C_DR); in mpc_i2c_fixup()
121 writeccr(i2c, CCR_MEN); in mpc_i2c_fixup()
126 static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing) in i2c_wait() argument
132 if (!i2c->irq) { in i2c_wait()
133 while (!(readb(i2c->base + MPC_I2C_SR) & CSR_MIF)) { in i2c_wait()
136 dev_dbg(i2c->dev, "timeout\n"); in i2c_wait()
137 writeccr(i2c, 0); in i2c_wait()
142 cmd_err = readb(i2c->base + MPC_I2C_SR); in i2c_wait()
143 writeb(0, i2c->base + MPC_I2C_SR); in i2c_wait()
146 result = wait_event_timeout(i2c->queue, in i2c_wait()
147 (i2c->interrupt & CSR_MIF), timeout); in i2c_wait()
149 if (unlikely(!(i2c->interrupt & CSR_MIF))) { in i2c_wait()
150 dev_dbg(i2c->dev, "wait timeout\n"); in i2c_wait()
151 writeccr(i2c, 0); in i2c_wait()
155 cmd_err = i2c->interrupt; in i2c_wait()
156 i2c->interrupt = 0; in i2c_wait()
163 dev_dbg(i2c->dev, "unfinished\n"); in i2c_wait()
168 dev_dbg(i2c->dev, "MAL\n"); in i2c_wait()
173 dev_dbg(i2c->dev, "No RXAK\n"); in i2c_wait()
175 writeccr(i2c, CCR_MEN); in i2c_wait()
238 struct mpc_i2c *i2c, in mpc_i2c_setup_52xx() argument
244 dev_dbg(i2c->dev, "using fdr %d\n", in mpc_i2c_setup_52xx()
245 readb(i2c->base + MPC_I2C_FDR)); in mpc_i2c_setup_52xx()
249 ret = mpc_i2c_get_fdr_52xx(node, clock, prescaler, &i2c->real_clk); in mpc_i2c_setup_52xx()
252 writeb(fdr & 0xff, i2c->base + MPC_I2C_FDR); in mpc_i2c_setup_52xx()
255 dev_info(i2c->dev, "clock %u Hz (fdr=%d)\n", i2c->real_clk, in mpc_i2c_setup_52xx()
260 struct mpc_i2c *i2c, in mpc_i2c_setup_52xx() argument
268 struct mpc_i2c *i2c, in mpc_i2c_setup_512x() argument
292 mpc_i2c_setup_52xx(node, i2c, clock, prescaler); in mpc_i2c_setup_512x()
296 struct mpc_i2c *i2c, in mpc_i2c_setup_512x() argument
417 struct mpc_i2c *i2c, in mpc_i2c_setup_8xxx() argument
423 dev_dbg(i2c->dev, "using dfsrr %d, fdr %d\n", in mpc_i2c_setup_8xxx()
424 readb(i2c->base + MPC_I2C_DFSRR), in mpc_i2c_setup_8xxx()
425 readb(i2c->base + MPC_I2C_FDR)); in mpc_i2c_setup_8xxx()
429 ret = mpc_i2c_get_fdr_8xxx(node, clock, prescaler, &i2c->real_clk); in mpc_i2c_setup_8xxx()
432 writeb(fdr & 0xff, i2c->base + MPC_I2C_FDR); in mpc_i2c_setup_8xxx()
433 writeb((fdr >> 8) & 0xff, i2c->base + MPC_I2C_DFSRR); in mpc_i2c_setup_8xxx()
436 dev_info(i2c->dev, "clock %d Hz (dfsrr=%d fdr=%d)\n", in mpc_i2c_setup_8xxx()
437 i2c->real_clk, fdr >> 8, fdr & 0xff); in mpc_i2c_setup_8xxx()
442 struct mpc_i2c *i2c, in mpc_i2c_setup_8xxx() argument
448 static void mpc_i2c_start(struct mpc_i2c *i2c) in mpc_i2c_start() argument
451 writeb(0, i2c->base + MPC_I2C_SR); in mpc_i2c_start()
453 writeccr(i2c, CCR_MEN); in mpc_i2c_start()
456 static void mpc_i2c_stop(struct mpc_i2c *i2c) in mpc_i2c_stop() argument
458 writeccr(i2c, CCR_MEN); in mpc_i2c_stop()
461 static int mpc_write(struct mpc_i2c *i2c, int target, in mpc_write() argument
465 unsigned timeout = i2c->adap.timeout; in mpc_write()
469 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); in mpc_write()
471 writeb((target << 1), i2c->base + MPC_I2C_DR); in mpc_write()
473 result = i2c_wait(i2c, timeout, 1); in mpc_write()
479 writeb(data[i], i2c->base + MPC_I2C_DR); in mpc_write()
481 result = i2c_wait(i2c, timeout, 1); in mpc_write()
489 static int mpc_read(struct mpc_i2c *i2c, int target, in mpc_read() argument
492 unsigned timeout = i2c->adap.timeout; in mpc_read()
497 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); in mpc_read()
499 writeb((target << 1) | 1, i2c->base + MPC_I2C_DR); in mpc_read()
501 result = i2c_wait(i2c, timeout, 1); in mpc_read()
507 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK); in mpc_read()
509 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA); in mpc_read()
511 readb(i2c->base + MPC_I2C_DR); in mpc_read()
517 result = i2c_wait(i2c, timeout, 0); in mpc_read()
528 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA in mpc_read()
532 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA in mpc_read()
536 byte = readb(i2c->base + MPC_I2C_DR); in mpc_read()
551 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA in mpc_read()
566 struct mpc_i2c *i2c = i2c_get_adapdata(adap); in mpc_xfer() local
568 mpc_i2c_start(i2c); in mpc_xfer()
571 while (readb(i2c->base + MPC_I2C_SR) & CSR_MBB) { in mpc_xfer()
573 dev_dbg(i2c->dev, "Interrupted\n"); in mpc_xfer()
574 writeccr(i2c, 0); in mpc_xfer()
578 u8 status = readb(i2c->base + MPC_I2C_SR); in mpc_xfer()
580 dev_dbg(i2c->dev, "timeout\n"); in mpc_xfer()
583 i2c->base + MPC_I2C_SR); in mpc_xfer()
584 mpc_i2c_fixup(i2c); in mpc_xfer()
593 dev_dbg(i2c->dev, in mpc_xfer()
600 ret = mpc_read(i2c, pmsg->addr, pmsg->buf, pmsg->len, i, in mpc_xfer()
606 mpc_write(i2c, pmsg->addr, pmsg->buf, pmsg->len, i); in mpc_xfer()
609 mpc_i2c_stop(i2c); /* Initiate STOP */ in mpc_xfer()
612 while (readb(i2c->base + MPC_I2C_SR) & CSR_MBB) { in mpc_xfer()
614 u8 status = readb(i2c->base + MPC_I2C_SR); in mpc_xfer()
616 dev_dbg(i2c->dev, "timeout\n"); in mpc_xfer()
619 i2c->base + MPC_I2C_SR); in mpc_xfer()
620 mpc_i2c_fixup(i2c); in mpc_xfer()
650 struct mpc_i2c *i2c; in fsl_i2c_probe() local
663 i2c = kzalloc(sizeof(*i2c), GFP_KERNEL); in fsl_i2c_probe()
664 if (!i2c) in fsl_i2c_probe()
667 i2c->dev = &op->dev; /* for debug and error output */ in fsl_i2c_probe()
669 init_waitqueue_head(&i2c->queue); in fsl_i2c_probe()
671 i2c->base = of_iomap(op->dev.of_node, 0); in fsl_i2c_probe()
672 if (!i2c->base) { in fsl_i2c_probe()
673 dev_err(i2c->dev, "failed to map controller\n"); in fsl_i2c_probe()
678 i2c->irq = irq_of_parse_and_map(op->dev.of_node, 0); in fsl_i2c_probe()
679 if (i2c->irq) { /* no i2c->irq implies polling */ in fsl_i2c_probe()
680 result = request_irq(i2c->irq, mpc_i2c_isr, in fsl_i2c_probe()
681 IRQF_SHARED, "i2c-mpc", i2c); in fsl_i2c_probe()
683 dev_err(i2c->dev, "failed to attach interrupt\n"); in fsl_i2c_probe()
699 i2c->clk_per = clk; in fsl_i2c_probe()
714 data->setup(op->dev.of_node, i2c, clock, data->prescaler); in fsl_i2c_probe()
718 mpc_i2c_setup_8xxx(op->dev.of_node, i2c, clock, 0); in fsl_i2c_probe()
727 dev_info(i2c->dev, "timeout %u us\n", mpc_ops.timeout * 1000000 / HZ); in fsl_i2c_probe()
729 platform_set_drvdata(op, i2c); in fsl_i2c_probe()
731 i2c->adap = mpc_ops; in fsl_i2c_probe()
733 scnprintf(i2c->adap.name, sizeof(i2c->adap.name), in fsl_i2c_probe()
735 i2c_set_adapdata(&i2c->adap, i2c); in fsl_i2c_probe()
736 i2c->adap.dev.parent = &op->dev; in fsl_i2c_probe()
737 i2c->adap.dev.of_node = of_node_get(op->dev.of_node); in fsl_i2c_probe()
739 result = i2c_add_adapter(&i2c->adap); in fsl_i2c_probe()
746 if (i2c->clk_per) in fsl_i2c_probe()
747 clk_disable_unprepare(i2c->clk_per); in fsl_i2c_probe()
748 free_irq(i2c->irq, i2c); in fsl_i2c_probe()
750 irq_dispose_mapping(i2c->irq); in fsl_i2c_probe()
751 iounmap(i2c->base); in fsl_i2c_probe()
753 kfree(i2c); in fsl_i2c_probe()
759 struct mpc_i2c *i2c = platform_get_drvdata(op); in fsl_i2c_remove() local
761 i2c_del_adapter(&i2c->adap); in fsl_i2c_remove()
763 if (i2c->clk_per) in fsl_i2c_remove()
764 clk_disable_unprepare(i2c->clk_per); in fsl_i2c_remove()
766 if (i2c->irq) in fsl_i2c_remove()
767 free_irq(i2c->irq, i2c); in fsl_i2c_remove()
769 irq_dispose_mapping(i2c->irq); in fsl_i2c_remove()
770 iounmap(i2c->base); in fsl_i2c_remove()
771 kfree(i2c); in fsl_i2c_remove()
778 struct mpc_i2c *i2c = dev_get_drvdata(dev); in mpc_i2c_suspend() local
780 i2c->fdr = readb(i2c->base + MPC_I2C_FDR); in mpc_i2c_suspend()
781 i2c->dfsrr = readb(i2c->base + MPC_I2C_DFSRR); in mpc_i2c_suspend()
788 struct mpc_i2c *i2c = dev_get_drvdata(dev); in mpc_i2c_resume() local
790 writeb(i2c->fdr, i2c->base + MPC_I2C_FDR); in mpc_i2c_resume()
791 writeb(i2c->dfsrr, i2c->base + MPC_I2C_DFSRR); in mpc_i2c_resume()