Lines Matching refs:i2c_imx
265 static inline int is_imx1_i2c(struct imx_i2c_struct *i2c_imx) in is_imx1_i2c() argument
267 return i2c_imx->hwdata->devtype == IMX1_I2C; in is_imx1_i2c()
271 struct imx_i2c_struct *i2c_imx, unsigned int reg) in imx_i2c_write_reg() argument
273 writeb(val, i2c_imx->base + (reg << i2c_imx->hwdata->regshift)); in imx_i2c_write_reg()
276 static inline unsigned char imx_i2c_read_reg(struct imx_i2c_struct *i2c_imx, in imx_i2c_read_reg() argument
279 return readb(i2c_imx->base + (reg << i2c_imx->hwdata->regshift)); in imx_i2c_read_reg()
283 static void i2c_imx_dma_request(struct imx_i2c_struct *i2c_imx, in i2c_imx_dma_request() argument
288 struct device *dev = &i2c_imx->adapter.dev; in i2c_imx_dma_request()
302 (IMX_I2C_I2DR << i2c_imx->hwdata->regshift); in i2c_imx_dma_request()
319 (IMX_I2C_I2DR << i2c_imx->hwdata->regshift); in i2c_imx_dma_request()
329 i2c_imx->dma = dma; in i2c_imx_dma_request()
347 struct imx_i2c_struct *i2c_imx = (struct imx_i2c_struct *)arg; in i2c_imx_dma_callback() local
348 struct imx_i2c_dma *dma = i2c_imx->dma; in i2c_imx_dma_callback()
355 static int i2c_imx_dma_xfer(struct imx_i2c_struct *i2c_imx, in i2c_imx_dma_xfer() argument
358 struct imx_i2c_dma *dma = i2c_imx->dma; in i2c_imx_dma_xfer()
360 struct device *dev = &i2c_imx->adapter.dev; in i2c_imx_dma_xfer()
379 txdesc->callback_param = i2c_imx; in i2c_imx_dma_xfer()
396 static void i2c_imx_dma_free(struct imx_i2c_struct *i2c_imx) in i2c_imx_dma_free() argument
398 struct imx_i2c_dma *dma = i2c_imx->dma; in i2c_imx_dma_free()
415 static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy) in i2c_imx_bus_busy() argument
420 dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); in i2c_imx_bus_busy()
423 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR); in i2c_imx_bus_busy()
428 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2SR); in i2c_imx_bus_busy()
437 dev_dbg(&i2c_imx->adapter.dev, in i2c_imx_bus_busy()
447 static int i2c_imx_trx_complete(struct imx_i2c_struct *i2c_imx) in i2c_imx_trx_complete() argument
449 wait_event_timeout(i2c_imx->queue, i2c_imx->i2csr & I2SR_IIF, HZ / 10); in i2c_imx_trx_complete()
451 if (unlikely(!(i2c_imx->i2csr & I2SR_IIF))) { in i2c_imx_trx_complete()
452 dev_dbg(&i2c_imx->adapter.dev, "<%s> Timeout\n", __func__); in i2c_imx_trx_complete()
455 dev_dbg(&i2c_imx->adapter.dev, "<%s> TRX complete\n", __func__); in i2c_imx_trx_complete()
456 i2c_imx->i2csr = 0; in i2c_imx_trx_complete()
460 static int i2c_imx_acked(struct imx_i2c_struct *i2c_imx) in i2c_imx_acked() argument
462 if (imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR) & I2SR_RXAK) { in i2c_imx_acked()
463 dev_dbg(&i2c_imx->adapter.dev, "<%s> No ACK\n", __func__); in i2c_imx_acked()
467 dev_dbg(&i2c_imx->adapter.dev, "<%s> ACK received\n", __func__); in i2c_imx_acked()
471 static void i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx) in i2c_imx_set_clk() argument
473 struct imx_i2c_clk_pair *i2c_clk_div = i2c_imx->hwdata->clk_div; in i2c_imx_set_clk()
479 i2c_clk_rate = clk_get_rate(i2c_imx->clk); in i2c_imx_set_clk()
480 if (i2c_imx->cur_clk == i2c_clk_rate) in i2c_imx_set_clk()
483 i2c_imx->cur_clk = i2c_clk_rate; in i2c_imx_set_clk()
485 div = (i2c_clk_rate + i2c_imx->bitrate - 1) / i2c_imx->bitrate; in i2c_imx_set_clk()
488 else if (div > i2c_clk_div[i2c_imx->hwdata->ndivs - 1].div) in i2c_imx_set_clk()
489 i = i2c_imx->hwdata->ndivs - 1; in i2c_imx_set_clk()
495 i2c_imx->ifdr = i2c_clk_div[i].val; in i2c_imx_set_clk()
503 i2c_imx->disable_delay = (500000U * i2c_clk_div[i].div in i2c_imx_set_clk()
507 dev_dbg(&i2c_imx->adapter.dev, "I2C_CLK=%d, REQ DIV=%d\n", in i2c_imx_set_clk()
509 dev_dbg(&i2c_imx->adapter.dev, "IFDR[IC]=0x%x, REAL DIV=%d\n", in i2c_imx_set_clk()
514 static int i2c_imx_start(struct imx_i2c_struct *i2c_imx) in i2c_imx_start() argument
519 dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); in i2c_imx_start()
521 i2c_imx_set_clk(i2c_imx); in i2c_imx_start()
523 result = clk_prepare_enable(i2c_imx->clk); in i2c_imx_start()
526 imx_i2c_write_reg(i2c_imx->ifdr, i2c_imx, IMX_I2C_IFDR); in i2c_imx_start()
528 imx_i2c_write_reg(i2c_imx->hwdata->i2sr_clr_opcode, i2c_imx, IMX_I2C_I2SR); in i2c_imx_start()
529 imx_i2c_write_reg(i2c_imx->hwdata->i2cr_ien_opcode, i2c_imx, IMX_I2C_I2CR); in i2c_imx_start()
535 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_start()
537 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_start()
538 result = i2c_imx_bus_busy(i2c_imx, 1); in i2c_imx_start()
541 i2c_imx->stopped = 0; in i2c_imx_start()
545 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_start()
549 static void i2c_imx_stop(struct imx_i2c_struct *i2c_imx) in i2c_imx_stop() argument
553 if (!i2c_imx->stopped) { in i2c_imx_stop()
555 dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); in i2c_imx_stop()
556 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_stop()
558 if (i2c_imx->dma) in i2c_imx_stop()
560 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_stop()
562 if (is_imx1_i2c(i2c_imx)) { in i2c_imx_stop()
567 udelay(i2c_imx->disable_delay); in i2c_imx_stop()
570 if (!i2c_imx->stopped) { in i2c_imx_stop()
571 i2c_imx_bus_busy(i2c_imx, 0); in i2c_imx_stop()
572 i2c_imx->stopped = 1; in i2c_imx_stop()
576 temp = i2c_imx->hwdata->i2cr_ien_opcode ^ I2CR_IEN, in i2c_imx_stop()
577 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_stop()
578 clk_disable_unprepare(i2c_imx->clk); in i2c_imx_stop()
583 struct imx_i2c_struct *i2c_imx = dev_id; in i2c_imx_isr() local
586 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR); in i2c_imx_isr()
589 i2c_imx->i2csr = temp; in i2c_imx_isr()
591 temp |= (i2c_imx->hwdata->i2sr_clr_opcode & I2SR_IIF); in i2c_imx_isr()
592 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2SR); in i2c_imx_isr()
593 wake_up(&i2c_imx->queue); in i2c_imx_isr()
600 static int i2c_imx_dma_write(struct imx_i2c_struct *i2c_imx, in i2c_imx_dma_write() argument
607 struct imx_i2c_dma *dma = i2c_imx->dma; in i2c_imx_dma_write()
608 struct device *dev = &i2c_imx->adapter.dev; in i2c_imx_dma_write()
614 result = i2c_imx_dma_xfer(i2c_imx, msgs); in i2c_imx_dma_write()
618 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_write()
620 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_write()
626 imx_i2c_write_reg(msgs->addr << 1, i2c_imx, IMX_I2C_I2DR); in i2c_imx_dma_write()
627 reinit_completion(&i2c_imx->dma->cmd_complete); in i2c_imx_dma_write()
629 &i2c_imx->dma->cmd_complete, in i2c_imx_dma_write()
638 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR); in i2c_imx_dma_write()
649 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_write()
651 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_write()
655 i2c_imx, IMX_I2C_I2DR); in i2c_imx_dma_write()
656 result = i2c_imx_trx_complete(i2c_imx); in i2c_imx_dma_write()
660 return i2c_imx_acked(i2c_imx); in i2c_imx_dma_write()
663 static int i2c_imx_dma_read(struct imx_i2c_struct *i2c_imx, in i2c_imx_dma_read() argument
670 struct imx_i2c_dma *dma = i2c_imx->dma; in i2c_imx_dma_read()
671 struct device *dev = &i2c_imx->adapter.dev; in i2c_imx_dma_read()
673 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_read()
675 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_read()
682 result = i2c_imx_dma_xfer(i2c_imx, msgs); in i2c_imx_dma_read()
686 reinit_completion(&i2c_imx->dma->cmd_complete); in i2c_imx_dma_read()
688 &i2c_imx->dma->cmd_complete, in i2c_imx_dma_read()
697 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR); in i2c_imx_dma_read()
708 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_read()
710 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_read()
713 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_read()
715 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_read()
717 msgs->buf[msgs->len-2] = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR); in i2c_imx_dma_read()
719 result = i2c_imx_trx_complete(i2c_imx); in i2c_imx_dma_read()
729 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_read()
731 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_dma_read()
732 i2c_imx_bus_busy(i2c_imx, 0); in i2c_imx_dma_read()
733 i2c_imx->stopped = 1; in i2c_imx_dma_read()
742 temp = readb(i2c_imx->base + IMX_I2C_I2CR); in i2c_imx_dma_read()
744 writeb(temp, i2c_imx->base + IMX_I2C_I2CR); in i2c_imx_dma_read()
746 msgs->buf[msgs->len-1] = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR); in i2c_imx_dma_read()
751 static int i2c_imx_write(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs) in i2c_imx_write() argument
755 dev_dbg(&i2c_imx->adapter.dev, "<%s> write slave address: addr=0x%x\n", in i2c_imx_write()
759 imx_i2c_write_reg(msgs->addr << 1, i2c_imx, IMX_I2C_I2DR); in i2c_imx_write()
760 result = i2c_imx_trx_complete(i2c_imx); in i2c_imx_write()
763 result = i2c_imx_acked(i2c_imx); in i2c_imx_write()
766 dev_dbg(&i2c_imx->adapter.dev, "<%s> write data\n", __func__); in i2c_imx_write()
770 dev_dbg(&i2c_imx->adapter.dev, in i2c_imx_write()
773 imx_i2c_write_reg(msgs->buf[i], i2c_imx, IMX_I2C_I2DR); in i2c_imx_write()
774 result = i2c_imx_trx_complete(i2c_imx); in i2c_imx_write()
777 result = i2c_imx_acked(i2c_imx); in i2c_imx_write()
784 static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs, bool is_lastmsg) in i2c_imx_read() argument
790 dev_dbg(&i2c_imx->adapter.dev, in i2c_imx_read()
795 imx_i2c_write_reg((msgs->addr << 1) | 0x01, i2c_imx, IMX_I2C_I2DR); in i2c_imx_read()
796 result = i2c_imx_trx_complete(i2c_imx); in i2c_imx_read()
799 result = i2c_imx_acked(i2c_imx); in i2c_imx_read()
803 dev_dbg(&i2c_imx->adapter.dev, "<%s> setup bus\n", __func__); in i2c_imx_read()
806 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_read()
815 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_read()
816 imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR); /* dummy read */ in i2c_imx_read()
818 dev_dbg(&i2c_imx->adapter.dev, "<%s> read data\n", __func__); in i2c_imx_read()
820 if (i2c_imx->dma && msgs->len >= DMA_THRESHOLD && !block_data) in i2c_imx_read()
821 return i2c_imx_dma_read(i2c_imx, msgs, is_lastmsg); in i2c_imx_read()
827 result = i2c_imx_trx_complete(i2c_imx); in i2c_imx_read()
836 len = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR); in i2c_imx_read()
839 dev_dbg(&i2c_imx->adapter.dev, in i2c_imx_read()
850 dev_dbg(&i2c_imx->adapter.dev, in i2c_imx_read()
852 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_read()
854 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_read()
855 i2c_imx_bus_busy(i2c_imx, 0); in i2c_imx_read()
856 i2c_imx->stopped = 1; in i2c_imx_read()
865 temp = readb(i2c_imx->base + IMX_I2C_I2CR); in i2c_imx_read()
867 writeb(temp, i2c_imx->base + IMX_I2C_I2CR); in i2c_imx_read()
870 dev_dbg(&i2c_imx->adapter.dev, in i2c_imx_read()
872 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_read()
874 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_read()
879 msgs->buf[i] = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR); in i2c_imx_read()
880 dev_dbg(&i2c_imx->adapter.dev, in i2c_imx_read()
893 struct imx_i2c_struct *i2c_imx = i2c_get_adapdata(adapter); in i2c_imx_xfer() local
895 dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); in i2c_imx_xfer()
898 result = i2c_imx_start(i2c_imx); in i2c_imx_xfer()
908 dev_dbg(&i2c_imx->adapter.dev, in i2c_imx_xfer()
910 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_xfer()
912 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); in i2c_imx_xfer()
913 result = i2c_imx_bus_busy(i2c_imx, 1); in i2c_imx_xfer()
917 dev_dbg(&i2c_imx->adapter.dev, in i2c_imx_xfer()
921 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); in i2c_imx_xfer()
922 dev_dbg(&i2c_imx->adapter.dev, in i2c_imx_xfer()
928 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR); in i2c_imx_xfer()
929 dev_dbg(&i2c_imx->adapter.dev, in i2c_imx_xfer()
938 result = i2c_imx_read(i2c_imx, &msgs[i], is_lastmsg); in i2c_imx_xfer()
940 if (i2c_imx->dma && msgs[i].len >= DMA_THRESHOLD) in i2c_imx_xfer()
941 result = i2c_imx_dma_write(i2c_imx, &msgs[i]); in i2c_imx_xfer()
943 result = i2c_imx_write(i2c_imx, &msgs[i]); in i2c_imx_xfer()
951 i2c_imx_stop(i2c_imx); in i2c_imx_xfer()
953 dev_dbg(&i2c_imx->adapter.dev, "<%s> exit with: %s: %d\n", __func__, in i2c_imx_xfer()
974 struct imx_i2c_struct *i2c_imx; in i2c_imx_probe() local
995 i2c_imx = devm_kzalloc(&pdev->dev, sizeof(*i2c_imx), GFP_KERNEL); in i2c_imx_probe()
996 if (!i2c_imx) in i2c_imx_probe()
1000 i2c_imx->hwdata = of_id->data; in i2c_imx_probe()
1002 i2c_imx->hwdata = (struct imx_i2c_hwdata *) in i2c_imx_probe()
1006 strlcpy(i2c_imx->adapter.name, pdev->name, sizeof(i2c_imx->adapter.name)); in i2c_imx_probe()
1007 i2c_imx->adapter.owner = THIS_MODULE; in i2c_imx_probe()
1008 i2c_imx->adapter.algo = &i2c_imx_algo; in i2c_imx_probe()
1009 i2c_imx->adapter.dev.parent = &pdev->dev; in i2c_imx_probe()
1010 i2c_imx->adapter.nr = pdev->id; in i2c_imx_probe()
1011 i2c_imx->adapter.dev.of_node = pdev->dev.of_node; in i2c_imx_probe()
1012 i2c_imx->base = base; in i2c_imx_probe()
1015 i2c_imx->clk = devm_clk_get(&pdev->dev, NULL); in i2c_imx_probe()
1016 if (IS_ERR(i2c_imx->clk)) { in i2c_imx_probe()
1018 return PTR_ERR(i2c_imx->clk); in i2c_imx_probe()
1021 ret = clk_prepare_enable(i2c_imx->clk); in i2c_imx_probe()
1028 pdev->name, i2c_imx); in i2c_imx_probe()
1035 init_waitqueue_head(&i2c_imx->queue); in i2c_imx_probe()
1038 i2c_set_adapdata(&i2c_imx->adapter, i2c_imx); in i2c_imx_probe()
1041 i2c_imx->bitrate = IMX_I2C_BIT_RATE; in i2c_imx_probe()
1043 "clock-frequency", &i2c_imx->bitrate); in i2c_imx_probe()
1045 i2c_imx->bitrate = pdata->bitrate; in i2c_imx_probe()
1048 imx_i2c_write_reg(i2c_imx->hwdata->i2cr_ien_opcode ^ I2CR_IEN, in i2c_imx_probe()
1049 i2c_imx, IMX_I2C_I2CR); in i2c_imx_probe()
1050 imx_i2c_write_reg(i2c_imx->hwdata->i2sr_clr_opcode, i2c_imx, IMX_I2C_I2SR); in i2c_imx_probe()
1053 ret = i2c_add_numbered_adapter(&i2c_imx->adapter); in i2c_imx_probe()
1060 platform_set_drvdata(pdev, i2c_imx); in i2c_imx_probe()
1061 clk_disable_unprepare(i2c_imx->clk); in i2c_imx_probe()
1063 dev_dbg(&i2c_imx->adapter.dev, "claimed irq %d\n", irq); in i2c_imx_probe()
1064 dev_dbg(&i2c_imx->adapter.dev, "device resources: %pR\n", res); in i2c_imx_probe()
1065 dev_dbg(&i2c_imx->adapter.dev, "adapter name: \"%s\"\n", in i2c_imx_probe()
1066 i2c_imx->adapter.name); in i2c_imx_probe()
1067 dev_info(&i2c_imx->adapter.dev, "IMX I2C adapter registered\n"); in i2c_imx_probe()
1070 i2c_imx_dma_request(i2c_imx, phy_addr); in i2c_imx_probe()
1075 clk_disable_unprepare(i2c_imx->clk); in i2c_imx_probe()
1081 struct imx_i2c_struct *i2c_imx = platform_get_drvdata(pdev); in i2c_imx_remove() local
1084 dev_dbg(&i2c_imx->adapter.dev, "adapter removed\n"); in i2c_imx_remove()
1085 i2c_del_adapter(&i2c_imx->adapter); in i2c_imx_remove()
1087 if (i2c_imx->dma) in i2c_imx_remove()
1088 i2c_imx_dma_free(i2c_imx); in i2c_imx_remove()
1091 imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IADR); in i2c_imx_remove()
1092 imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IFDR); in i2c_imx_remove()
1093 imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2CR); in i2c_imx_remove()
1094 imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2SR); in i2c_imx_remove()