Lines Matching defs:omap
30 #include <linux/platform_data/i2c-omap.h>
263 static int omap_i2c_xfer_data(struct omap_i2c_dev *omap);
265 static inline void omap_i2c_write_reg(struct omap_i2c_dev *omap,
268 writew_relaxed(val, omap->base +
269 (omap->regs[reg] << omap->reg_shift));
272 static inline u16 omap_i2c_read_reg(struct omap_i2c_dev *omap, int reg)
274 return readw_relaxed(omap->base +
275 (omap->regs[reg] << omap->reg_shift));
278 static void __omap_i2c_init(struct omap_i2c_dev *omap)
281 omap_i2c_write_reg(omap, OMAP_I2C_CON_REG, 0);
284 omap_i2c_write_reg(omap, OMAP_I2C_PSC_REG, omap->pscstate);
287 omap_i2c_write_reg(omap, OMAP_I2C_SCLL_REG, omap->scllstate);
288 omap_i2c_write_reg(omap, OMAP_I2C_SCLH_REG, omap->sclhstate);
289 if (omap->rev >= OMAP_I2C_REV_ON_3430_3530)
290 omap_i2c_write_reg(omap, OMAP_I2C_WE_REG, omap->westate);
293 omap_i2c_write_reg(omap, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN);
305 if (omap->iestate)
306 omap_i2c_write_reg(omap, OMAP_I2C_IE_REG, omap->iestate);
309 static int omap_i2c_reset(struct omap_i2c_dev *omap)
314 if (omap->rev >= OMAP_I2C_OMAP1_REV_2) {
315 sysc = omap_i2c_read_reg(omap, OMAP_I2C_SYSC_REG);
318 omap_i2c_write_reg(omap, OMAP_I2C_CON_REG,
319 omap_i2c_read_reg(omap, OMAP_I2C_CON_REG) &
322 omap_i2c_write_reg(omap, OMAP_I2C_SYSC_REG, SYSC_SOFTRESET_MASK);
326 omap_i2c_write_reg(omap, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN);
327 while (!(omap_i2c_read_reg(omap, OMAP_I2C_SYSS_REG) &
330 dev_warn(omap->dev, "timeout waiting "
338 omap_i2c_write_reg(omap, OMAP_I2C_SYSC_REG, sysc);
340 if (omap->rev > OMAP_I2C_REV_ON_3430_3530) {
342 omap->bb_valid = 0;
349 static int omap_i2c_init(struct omap_i2c_dev *omap)
358 if (omap->rev >= OMAP_I2C_REV_ON_3430_3530) {
364 omap->westate = OMAP_I2C_WE_ALL;
367 if (omap->flags & OMAP_I2C_FLAG_ALWAYS_ARMXOR_CLK) {
374 fclk = clk_get(omap->dev, "fck");
377 dev_err(omap->dev, "could not get fck: %i\n", error);
398 if (!(omap->flags & OMAP_I2C_FLAG_SIMPLE_CLOCK)) {
406 if (omap->speed > 400 ||
407 omap->flags & OMAP_I2C_FLAG_FORCE_19200_INT_CLK)
409 else if (omap->speed > 100)
413 fclk = clk_get(omap->dev, "fck");
416 dev_err(omap->dev, "could not get fck: %i\n", error);
428 if (omap->speed > 400) {
437 scl = fclk_rate / omap->speed;
440 } else if (omap->speed > 100) {
444 scl = internal_clk / omap->speed;
449 fsscll = internal_clk / (omap->speed * 2) - 7;
450 fssclh = internal_clk / (omap->speed * 2) - 5;
459 scll = fclk_rate / (omap->speed * 2) - 7 + psc;
460 sclh = fclk_rate / (omap->speed * 2) - 7 + psc;
463 omap->iestate = (OMAP_I2C_IE_XRDY | OMAP_I2C_IE_RRDY |
465 OMAP_I2C_IE_AL) | ((omap->fifo_size) ?
468 omap->pscstate = psc;
469 omap->scllstate = scll;
470 omap->sclhstate = sclh;
472 if (omap->rev <= OMAP_I2C_REV_ON_3430_3530) {
474 omap->bb_valid = 1;
477 __omap_i2c_init(omap);
485 static int omap_i2c_recover_bus(struct omap_i2c_dev *omap)
489 systest = omap_i2c_read_reg(omap, OMAP_I2C_SYSTEST_REG);
495 return i2c_recover_bus(&omap->adapter);
501 static int omap_i2c_wait_for_bb(struct omap_i2c_dev *omap)
506 while (omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG) & OMAP_I2C_STAT_BB) {
508 return omap_i2c_recover_bus(omap);
543 static int omap_i2c_wait_for_bb_valid(struct omap_i2c_dev *omap)
550 if (omap->bb_valid)
555 stat = omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG);
568 systest = omap_i2c_read_reg(omap, OMAP_I2C_SYSTEST_REG);
594 dev_warn(omap->dev, "timeout waiting for bus ready\n");
595 return omap_i2c_recover_bus(omap);
601 omap->bb_valid = 1;
605 static void omap_i2c_resize_fifo(struct omap_i2c_dev *omap, u8 size, bool is_rx)
609 if (omap->flags & OMAP_I2C_FLAG_NO_FIFO)
619 omap->threshold = clamp(size, (u8) 1, omap->fifo_size);
621 buf = omap_i2c_read_reg(omap, OMAP_I2C_BUF_REG);
626 buf |= ((omap->threshold - 1) << 8) | OMAP_I2C_BUF_RXFIF_CLR;
630 buf |= (omap->threshold - 1) | OMAP_I2C_BUF_TXFIF_CLR;
633 omap_i2c_write_reg(omap, OMAP_I2C_BUF_REG, buf);
635 if (omap->rev < OMAP_I2C_REV_ON_3630)
636 omap->b_hw = 1; /* Enable hardware fixes */
639 if (omap->set_mpu_wkup_lat != NULL)
640 omap->latency = (1000000 * omap->threshold) /
641 (1000 * omap->speed / 8);
644 static void omap_i2c_wait(struct omap_i2c_dev *omap)
647 u16 mask = omap_i2c_read_reg(omap, OMAP_I2C_IE_REG);
651 stat = omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG);
662 struct omap_i2c_dev *omap = i2c_get_adapdata(adap);
667 dev_dbg(omap->dev, "addr: 0x%04x, len: %d, flags: 0x%x, stop: %d\n",
670 omap->receiver = !!(msg->flags & I2C_M_RD);
671 omap_i2c_resize_fifo(omap, msg->len, omap->receiver);
673 omap_i2c_write_reg(omap, OMAP_I2C_SA_REG, msg->addr);
676 omap->buf = msg->buf;
677 omap->buf_len = msg->len;
679 /* make sure writes to omap->buf_len are ordered */
682 omap_i2c_write_reg(omap, OMAP_I2C_CNT_REG, omap->buf_len);
685 w = omap_i2c_read_reg(omap, OMAP_I2C_BUF_REG);
687 omap_i2c_write_reg(omap, OMAP_I2C_BUF_REG, w);
690 reinit_completion(&omap->cmd_complete);
691 omap->cmd_err = 0;
696 if (omap->speed > 400)
706 if (!omap->b_hw && stop)
713 omap_i2c_write_reg(omap, OMAP_I2C_CON_REG, w);
718 if (omap->b_hw && stop) {
720 u16 con = omap_i2c_read_reg(omap, OMAP_I2C_CON_REG);
722 con = omap_i2c_read_reg(omap, OMAP_I2C_CON_REG);
726 dev_err(omap->dev, "controller timed out "
735 omap_i2c_write_reg(omap, OMAP_I2C_CON_REG, w);
743 timeout = wait_for_completion_timeout(&omap->cmd_complete,
747 omap_i2c_wait(omap);
748 ret = omap_i2c_xfer_data(omap);
755 dev_err(omap->dev, "controller timed out\n");
756 omap_i2c_reset(omap);
757 __omap_i2c_init(omap);
761 if (likely(!omap->cmd_err))
765 if (omap->cmd_err & (OMAP_I2C_STAT_ROVR | OMAP_I2C_STAT_XUDF)) {
766 omap_i2c_reset(omap);
767 __omap_i2c_init(omap);
771 if (omap->cmd_err & OMAP_I2C_STAT_AL)
774 if (omap->cmd_err & OMAP_I2C_STAT_NACK) {
778 w = omap_i2c_read_reg(omap, OMAP_I2C_CON_REG);
780 omap_i2c_write_reg(omap, OMAP_I2C_CON_REG, w);
795 struct omap_i2c_dev *omap = i2c_get_adapdata(adap);
799 r = pm_runtime_get_sync(omap->dev);
803 r = omap_i2c_wait_for_bb_valid(omap);
807 r = omap_i2c_wait_for_bb(omap);
811 if (omap->set_mpu_wkup_lat != NULL)
812 omap->set_mpu_wkup_lat(omap->dev, omap->latency);
824 omap_i2c_wait_for_bb(omap);
826 if (omap->set_mpu_wkup_lat != NULL)
827 omap->set_mpu_wkup_lat(omap->dev, -1);
830 pm_runtime_mark_last_busy(omap->dev);
831 pm_runtime_put_autosuspend(omap->dev);
855 omap_i2c_complete_cmd(struct omap_i2c_dev *omap, u16 err)
857 omap->cmd_err |= err;
858 complete(&omap->cmd_complete);
862 omap_i2c_ack_stat(struct omap_i2c_dev *omap, u16 stat)
864 omap_i2c_write_reg(omap, OMAP_I2C_STAT_REG, stat);
867 static inline void i2c_omap_errata_i207(struct omap_i2c_dev *omap, u16 stat)
878 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_RDR);
881 if (!(omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG)
885 if (omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG)
887 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_RDR);
888 dev_dbg(omap->dev, "RDR when bus is busy.\n");
901 struct omap_i2c_dev *omap = dev_id;
904 if (pm_runtime_suspended(omap->dev))
907 iv = omap_i2c_read_reg(omap, OMAP_I2C_IV_REG);
912 dev_err(omap->dev, "Arbitration lost\n");
913 omap_i2c_complete_cmd(omap, OMAP_I2C_STAT_AL);
916 omap_i2c_complete_cmd(omap, OMAP_I2C_STAT_NACK);
917 omap_i2c_write_reg(omap, OMAP_I2C_CON_REG, OMAP_I2C_CON_STP);
920 omap_i2c_complete_cmd(omap, 0);
923 if (omap->buf_len) {
924 w = omap_i2c_read_reg(omap, OMAP_I2C_DATA_REG);
925 *omap->buf++ = w;
926 omap->buf_len--;
927 if (omap->buf_len) {
928 *omap->buf++ = w >> 8;
929 omap->buf_len--;
932 dev_err(omap->dev, "RRDY IRQ while no data requested\n");
935 if (omap->buf_len) {
936 w = *omap->buf++;
937 omap->buf_len--;
938 if (omap->buf_len) {
939 w |= *omap->buf++ << 8;
940 omap->buf_len--;
942 omap_i2c_write_reg(omap, OMAP_I2C_DATA_REG, w);
944 dev_err(omap->dev, "XRDY IRQ while no data to send\n");
961 static int errata_omap3_i462(struct omap_i2c_dev *omap)
967 stat = omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG);
972 omap_i2c_ack_stat(omap, (OMAP_I2C_STAT_XRDY |
975 omap->cmd_err |= OMAP_I2C_STAT_NACK;
976 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_NACK);
980 dev_err(omap->dev, "Arbitration lost\n");
981 omap->cmd_err |= OMAP_I2C_STAT_AL;
982 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_AL);
992 dev_err(omap->dev, "timeout waiting on XUDF bit\n");
999 static void omap_i2c_receive_data(struct omap_i2c_dev *omap, u8 num_bytes,
1005 w = omap_i2c_read_reg(omap, OMAP_I2C_DATA_REG);
1006 *omap->buf++ = w;
1007 omap->buf_len--;
1013 if (omap->flags & OMAP_I2C_FLAG_16BIT_DATA_REG) {
1014 *omap->buf++ = w >> 8;
1015 omap->buf_len--;
1020 static int omap_i2c_transmit_data(struct omap_i2c_dev *omap, u8 num_bytes,
1026 w = *omap->buf++;
1027 omap->buf_len--;
1033 if (omap->flags & OMAP_I2C_FLAG_16BIT_DATA_REG) {
1034 w |= *omap->buf++ << 8;
1035 omap->buf_len--;
1038 if (omap->errata & I2C_OMAP_ERRATA_I462) {
1041 ret = errata_omap3_i462(omap);
1046 omap_i2c_write_reg(omap, OMAP_I2C_DATA_REG, w);
1055 struct omap_i2c_dev *omap = dev_id;
1060 stat = omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG);
1061 mask = omap_i2c_read_reg(omap, OMAP_I2C_IE_REG) & ~OMAP_I2C_STAT_NACK;
1069 static int omap_i2c_xfer_data(struct omap_i2c_dev *omap)
1076 bits = omap_i2c_read_reg(omap, OMAP_I2C_IE_REG);
1077 stat = omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG);
1081 if (omap->receiver)
1092 dev_dbg(omap->dev, "IRQ (ISR = 0x%04x)\n", stat);
1094 dev_warn(omap->dev, "Too much work in one IRQ\n");
1100 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_NACK);
1104 dev_err(omap->dev, "Arbitration lost\n");
1106 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_AL);
1113 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_ARDY);
1117 omap_i2c_ack_stat(omap, (OMAP_I2C_STAT_RRDY |
1128 if (omap->fifo_size)
1129 num_bytes = omap->buf_len;
1131 if (omap->errata & I2C_OMAP_ERRATA_I207) {
1132 i2c_omap_errata_i207(omap, stat);
1133 num_bytes = (omap_i2c_read_reg(omap,
1137 omap_i2c_receive_data(omap, num_bytes, true);
1138 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_RDR);
1145 if (omap->threshold)
1146 num_bytes = omap->threshold;
1148 omap_i2c_receive_data(omap, num_bytes, false);
1149 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_RRDY);
1157 if (omap->fifo_size)
1158 num_bytes = omap->buf_len;
1160 ret = omap_i2c_transmit_data(omap, num_bytes, true);
1164 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_XDR);
1172 if (omap->threshold)
1173 num_bytes = omap->threshold;
1175 ret = omap_i2c_transmit_data(omap, num_bytes, false);
1179 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_XRDY);
1184 dev_err(omap->dev, "Receive overrun\n");
1186 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_ROVR);
1191 dev_err(omap->dev, "Transmit underflow\n");
1193 omap_i2c_ack_stat(omap, OMAP_I2C_STAT_XUDF);
1205 struct omap_i2c_dev *omap = dev_id;
1207 ret = omap_i2c_xfer_data(omap);
1209 omap_i2c_complete_cmd(omap, ret);
1356 struct omap_i2c_dev *omap;
1371 omap = devm_kzalloc(&pdev->dev, sizeof(struct omap_i2c_dev), GFP_KERNEL);
1372 if (!omap)
1375 omap->base = devm_platform_ioremap_resource(pdev, 0);
1376 if (IS_ERR(omap->base))
1377 return PTR_ERR(omap->base);
1384 omap->flags = pdata->flags;
1388 omap->speed = freq / 1000;
1390 omap->speed = pdata->clkrate;
1391 omap->flags = pdata->flags;
1392 omap->set_mpu_wkup_lat = pdata->set_mpu_wkup_lat;
1395 omap->dev = &pdev->dev;
1396 omap->irq = irq;
1398 platform_set_drvdata(pdev, omap);
1399 init_completion(&omap->cmd_complete);
1401 omap->reg_shift = (omap->flags >> OMAP_I2C_FLAG_BUS_SHIFT__SHIFT) & 3;
1403 pm_runtime_enable(omap->dev);
1404 pm_runtime_set_autosuspend_delay(omap->dev, OMAP_I2C_PM_TIMEOUT);
1405 pm_runtime_use_autosuspend(omap->dev);
1407 r = pm_runtime_resume_and_get(omap->dev);
1417 rev = readw_relaxed(omap->base + 0x04);
1419 omap->scheme = OMAP_I2C_SCHEME(rev);
1420 switch (omap->scheme) {
1422 omap->regs = (u8 *)reg_map_ip_v1;
1423 omap->rev = omap_i2c_read_reg(omap, OMAP_I2C_REV_REG);
1424 minor = OMAP_I2C_REV_SCHEME_0_MAJOR(omap->rev);
1425 major = OMAP_I2C_REV_SCHEME_0_MAJOR(omap->rev);
1429 omap->regs = (u8 *)reg_map_ip_v2;
1431 omap_i2c_read_reg(omap, OMAP_I2C_IP_V2_REVNB_LO);
1434 omap->rev = rev;
1437 omap->errata = 0;
1439 if (omap->rev >= OMAP_I2C_REV_ON_2430 &&
1440 omap->rev < OMAP_I2C_REV_ON_4430_PLUS)
1441 omap->errata |= I2C_OMAP_ERRATA_I207;
1443 if (omap->rev <= OMAP_I2C_REV_ON_3430_3530)
1444 omap->errata |= I2C_OMAP_ERRATA_I462;
1446 if (!(omap->flags & OMAP_I2C_FLAG_NO_FIFO)) {
1450 s = (omap_i2c_read_reg(omap, OMAP_I2C_BUFSTAT_REG) >> 14) & 0x3;
1451 omap->fifo_size = 0x8 << s;
1459 omap->fifo_size = (omap->fifo_size / 2);
1461 if (omap->rev < OMAP_I2C_REV_ON_3630)
1462 omap->b_hw = 1; /* Enable hardware fixes */
1465 if (omap->set_mpu_wkup_lat != NULL)
1466 omap->latency = (1000000 * omap->fifo_size) /
1467 (1000 * omap->speed / 8);
1471 omap_i2c_init(omap);
1473 if (omap->rev < OMAP_I2C_OMAP1_REV_2)
1474 r = devm_request_irq(&pdev->dev, omap->irq, omap_i2c_omap1_isr,
1475 IRQF_NO_SUSPEND, pdev->name, omap);
1477 r = devm_request_threaded_irq(&pdev->dev, omap->irq,
1480 pdev->name, omap);
1483 dev_err(omap->dev, "failure requesting irq %i\n", omap->irq);
1487 adap = &omap->adapter;
1488 i2c_set_adapdata(adap, omap);
1504 dev_info(omap->dev, "bus %d rev%d.%d at %d kHz\n", adap->nr,
1505 major, minor, omap->speed);
1507 pm_runtime_mark_last_busy(omap->dev);
1508 pm_runtime_put_autosuspend(omap->dev);
1513 omap_i2c_write_reg(omap, OMAP_I2C_CON_REG, 0);
1514 pm_runtime_dont_use_autosuspend(omap->dev);
1515 pm_runtime_put_sync(omap->dev);
1524 struct omap_i2c_dev *omap = platform_get_drvdata(pdev);
1527 i2c_del_adapter(&omap->adapter);
1532 omap_i2c_write_reg(omap, OMAP_I2C_CON_REG, 0);
1541 struct omap_i2c_dev *omap = dev_get_drvdata(dev);
1543 omap->iestate = omap_i2c_read_reg(omap, OMAP_I2C_IE_REG);
1545 if (omap->scheme == OMAP_I2C_SCHEME_0)
1546 omap_i2c_write_reg(omap, OMAP_I2C_IE_REG, 0);
1548 omap_i2c_write_reg(omap, OMAP_I2C_IP_V2_IRQENABLE_CLR,
1551 if (omap->rev < OMAP_I2C_OMAP1_REV_2) {
1552 omap_i2c_read_reg(omap, OMAP_I2C_IV_REG); /* Read clears */
1554 omap_i2c_write_reg(omap, OMAP_I2C_STAT_REG, omap->iestate);
1557 omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG);
1567 struct omap_i2c_dev *omap = dev_get_drvdata(dev);
1571 if (!omap->regs)
1574 __omap_i2c_init(omap);