Lines Matching refs:dev

168 static u32 dw_readl(struct dw_i2c_dev *dev, int offset)  in dw_readl()  argument
172 if (dev->accessor_flags & ACCESS_16BIT) in dw_readl()
173 value = readw_relaxed(dev->base + offset) | in dw_readl()
174 (readw_relaxed(dev->base + offset + 2) << 16); in dw_readl()
176 value = readl_relaxed(dev->base + offset); in dw_readl()
178 if (dev->accessor_flags & ACCESS_SWAP) in dw_readl()
184 static void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset) in dw_writel() argument
186 if (dev->accessor_flags & ACCESS_SWAP) in dw_writel()
189 if (dev->accessor_flags & ACCESS_16BIT) { in dw_writel()
190 writew_relaxed((u16)b, dev->base + offset); in dw_writel()
191 writew_relaxed((u16)(b >> 16), dev->base + offset + 2); in dw_writel()
193 writel_relaxed(b, dev->base + offset); in dw_writel()
253 static void __i2c_dw_enable(struct dw_i2c_dev *dev, bool enable) in __i2c_dw_enable() argument
258 dw_writel(dev, enable, DW_IC_ENABLE); in __i2c_dw_enable()
259 if ((dw_readl(dev, DW_IC_ENABLE_STATUS) & 1) == enable) in __i2c_dw_enable()
270 dev_warn(dev->dev, "timeout in %sabling adapter\n", in __i2c_dw_enable()
282 int i2c_dw_init(struct dw_i2c_dev *dev) in i2c_dw_init() argument
290 if (dev->acquire_lock) { in i2c_dw_init()
291 ret = dev->acquire_lock(dev); in i2c_dw_init()
293 dev_err(dev->dev, "couldn't acquire bus ownership\n"); in i2c_dw_init()
298 input_clock_khz = dev->get_clk_rate_khz(dev); in i2c_dw_init()
300 reg = dw_readl(dev, DW_IC_COMP_TYPE); in i2c_dw_init()
303 dev->accessor_flags |= ACCESS_SWAP; in i2c_dw_init()
306 dev->accessor_flags |= ACCESS_16BIT; in i2c_dw_init()
308 dev_err(dev->dev, "Unknown Synopsys component type: " in i2c_dw_init()
310 if (dev->release_lock) in i2c_dw_init()
311 dev->release_lock(dev); in i2c_dw_init()
316 __i2c_dw_enable(dev, false); in i2c_dw_init()
320 sda_falling_time = dev->sda_falling_time ?: 300; /* ns */ in i2c_dw_init()
321 scl_falling_time = dev->scl_falling_time ?: 300; /* ns */ in i2c_dw_init()
324 if (dev->ss_hcnt && dev->ss_lcnt) { in i2c_dw_init()
325 hcnt = dev->ss_hcnt; in i2c_dw_init()
326 lcnt = dev->ss_lcnt; in i2c_dw_init()
338 dw_writel(dev, hcnt, DW_IC_SS_SCL_HCNT); in i2c_dw_init()
339 dw_writel(dev, lcnt, DW_IC_SS_SCL_LCNT); in i2c_dw_init()
340 dev_dbg(dev->dev, "Standard-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt); in i2c_dw_init()
343 if (dev->fs_hcnt && dev->fs_lcnt) { in i2c_dw_init()
344 hcnt = dev->fs_hcnt; in i2c_dw_init()
345 lcnt = dev->fs_lcnt; in i2c_dw_init()
357 dw_writel(dev, hcnt, DW_IC_FS_SCL_HCNT); in i2c_dw_init()
358 dw_writel(dev, lcnt, DW_IC_FS_SCL_LCNT); in i2c_dw_init()
359 dev_dbg(dev->dev, "Fast-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt); in i2c_dw_init()
362 if (dev->sda_hold_time) { in i2c_dw_init()
363 reg = dw_readl(dev, DW_IC_COMP_VERSION); in i2c_dw_init()
365 dw_writel(dev, dev->sda_hold_time, DW_IC_SDA_HOLD); in i2c_dw_init()
367 dev_warn(dev->dev, in i2c_dw_init()
372 dw_writel(dev, dev->tx_fifo_depth / 2, DW_IC_TX_TL); in i2c_dw_init()
373 dw_writel(dev, 0, DW_IC_RX_TL); in i2c_dw_init()
376 dw_writel(dev, dev->master_cfg , DW_IC_CON); in i2c_dw_init()
378 if (dev->release_lock) in i2c_dw_init()
379 dev->release_lock(dev); in i2c_dw_init()
387 static int i2c_dw_wait_bus_not_busy(struct dw_i2c_dev *dev) in i2c_dw_wait_bus_not_busy() argument
391 while (dw_readl(dev, DW_IC_STATUS) & DW_IC_STATUS_ACTIVITY) { in i2c_dw_wait_bus_not_busy()
393 dev_warn(dev->dev, "timeout waiting for bus ready\n"); in i2c_dw_wait_bus_not_busy()
403 static void i2c_dw_xfer_init(struct dw_i2c_dev *dev) in i2c_dw_xfer_init() argument
405 struct i2c_msg *msgs = dev->msgs; in i2c_dw_xfer_init()
409 __i2c_dw_enable(dev, false); in i2c_dw_xfer_init()
412 ic_con = dw_readl(dev, DW_IC_CON); in i2c_dw_xfer_init()
413 if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) { in i2c_dw_xfer_init()
426 dw_writel(dev, ic_con, DW_IC_CON); in i2c_dw_xfer_init()
432 dw_writel(dev, msgs[dev->msg_write_idx].addr | ic_tar, DW_IC_TAR); in i2c_dw_xfer_init()
435 i2c_dw_disable_int(dev); in i2c_dw_xfer_init()
438 __i2c_dw_enable(dev, true); in i2c_dw_xfer_init()
441 dw_readl(dev, DW_IC_CLR_INTR); in i2c_dw_xfer_init()
442 dw_writel(dev, DW_IC_INTR_DEFAULT_MASK, DW_IC_INTR_MASK); in i2c_dw_xfer_init()
452 i2c_dw_xfer_msg(struct dw_i2c_dev *dev) in i2c_dw_xfer_msg() argument
454 struct i2c_msg *msgs = dev->msgs; in i2c_dw_xfer_msg()
457 u32 addr = msgs[dev->msg_write_idx].addr; in i2c_dw_xfer_msg()
458 u32 buf_len = dev->tx_buf_len; in i2c_dw_xfer_msg()
459 u8 *buf = dev->tx_buf; in i2c_dw_xfer_msg()
464 for (; dev->msg_write_idx < dev->msgs_num; dev->msg_write_idx++) { in i2c_dw_xfer_msg()
470 if (msgs[dev->msg_write_idx].addr != addr) { in i2c_dw_xfer_msg()
471 dev_err(dev->dev, in i2c_dw_xfer_msg()
473 dev->msg_err = -EINVAL; in i2c_dw_xfer_msg()
477 if (msgs[dev->msg_write_idx].len == 0) { in i2c_dw_xfer_msg()
478 dev_err(dev->dev, in i2c_dw_xfer_msg()
480 dev->msg_err = -EINVAL; in i2c_dw_xfer_msg()
484 if (!(dev->status & STATUS_WRITE_IN_PROGRESS)) { in i2c_dw_xfer_msg()
486 buf = msgs[dev->msg_write_idx].buf; in i2c_dw_xfer_msg()
487 buf_len = msgs[dev->msg_write_idx].len; in i2c_dw_xfer_msg()
493 if ((dev->master_cfg & DW_IC_CON_RESTART_EN) && in i2c_dw_xfer_msg()
494 (dev->msg_write_idx > 0)) in i2c_dw_xfer_msg()
498 tx_limit = dev->tx_fifo_depth - dw_readl(dev, DW_IC_TXFLR); in i2c_dw_xfer_msg()
499 rx_limit = dev->rx_fifo_depth - dw_readl(dev, DW_IC_RXFLR); in i2c_dw_xfer_msg()
510 if (dev->msg_write_idx == dev->msgs_num - 1 && in i2c_dw_xfer_msg()
519 if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { in i2c_dw_xfer_msg()
522 if (rx_limit - dev->rx_outstanding <= 0) in i2c_dw_xfer_msg()
525 dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD); in i2c_dw_xfer_msg()
527 dev->rx_outstanding++; in i2c_dw_xfer_msg()
529 dw_writel(dev, cmd | *buf++, DW_IC_DATA_CMD); in i2c_dw_xfer_msg()
533 dev->tx_buf = buf; in i2c_dw_xfer_msg()
534 dev->tx_buf_len = buf_len; in i2c_dw_xfer_msg()
538 dev->status |= STATUS_WRITE_IN_PROGRESS; in i2c_dw_xfer_msg()
541 dev->status &= ~STATUS_WRITE_IN_PROGRESS; in i2c_dw_xfer_msg()
548 if (dev->msg_write_idx == dev->msgs_num) in i2c_dw_xfer_msg()
551 if (dev->msg_err) in i2c_dw_xfer_msg()
554 dw_writel(dev, intr_mask, DW_IC_INTR_MASK); in i2c_dw_xfer_msg()
558 i2c_dw_read(struct dw_i2c_dev *dev) in i2c_dw_read() argument
560 struct i2c_msg *msgs = dev->msgs; in i2c_dw_read()
563 for (; dev->msg_read_idx < dev->msgs_num; dev->msg_read_idx++) { in i2c_dw_read()
567 if (!(msgs[dev->msg_read_idx].flags & I2C_M_RD)) in i2c_dw_read()
570 if (!(dev->status & STATUS_READ_IN_PROGRESS)) { in i2c_dw_read()
571 len = msgs[dev->msg_read_idx].len; in i2c_dw_read()
572 buf = msgs[dev->msg_read_idx].buf; in i2c_dw_read()
574 len = dev->rx_buf_len; in i2c_dw_read()
575 buf = dev->rx_buf; in i2c_dw_read()
578 rx_valid = dw_readl(dev, DW_IC_RXFLR); in i2c_dw_read()
581 *buf++ = dw_readl(dev, DW_IC_DATA_CMD); in i2c_dw_read()
582 dev->rx_outstanding--; in i2c_dw_read()
586 dev->status |= STATUS_READ_IN_PROGRESS; in i2c_dw_read()
587 dev->rx_buf_len = len; in i2c_dw_read()
588 dev->rx_buf = buf; in i2c_dw_read()
591 dev->status &= ~STATUS_READ_IN_PROGRESS; in i2c_dw_read()
595 static int i2c_dw_handle_tx_abort(struct dw_i2c_dev *dev) in i2c_dw_handle_tx_abort() argument
597 unsigned long abort_source = dev->abort_source; in i2c_dw_handle_tx_abort()
602 dev_dbg(dev->dev, in i2c_dw_handle_tx_abort()
608 dev_err(dev->dev, "%s: %s\n", __func__, abort_sources[i]); in i2c_dw_handle_tx_abort()
624 struct dw_i2c_dev *dev = i2c_get_adapdata(adap); in i2c_dw_xfer() local
627 dev_dbg(dev->dev, "%s: msgs: %d\n", __func__, num); in i2c_dw_xfer()
629 mutex_lock(&dev->lock); in i2c_dw_xfer()
630 pm_runtime_get_sync(dev->dev); in i2c_dw_xfer()
632 reinit_completion(&dev->cmd_complete); in i2c_dw_xfer()
633 dev->msgs = msgs; in i2c_dw_xfer()
634 dev->msgs_num = num; in i2c_dw_xfer()
635 dev->cmd_err = 0; in i2c_dw_xfer()
636 dev->msg_write_idx = 0; in i2c_dw_xfer()
637 dev->msg_read_idx = 0; in i2c_dw_xfer()
638 dev->msg_err = 0; in i2c_dw_xfer()
639 dev->status = STATUS_IDLE; in i2c_dw_xfer()
640 dev->abort_source = 0; in i2c_dw_xfer()
641 dev->rx_outstanding = 0; in i2c_dw_xfer()
643 if (dev->acquire_lock) { in i2c_dw_xfer()
644 ret = dev->acquire_lock(dev); in i2c_dw_xfer()
646 dev_err(dev->dev, "couldn't acquire bus ownership\n"); in i2c_dw_xfer()
651 ret = i2c_dw_wait_bus_not_busy(dev); in i2c_dw_xfer()
656 i2c_dw_xfer_init(dev); in i2c_dw_xfer()
659 if (!wait_for_completion_timeout(&dev->cmd_complete, HZ)) { in i2c_dw_xfer()
660 dev_err(dev->dev, "controller timed out\n"); in i2c_dw_xfer()
662 i2c_dw_init(dev); in i2c_dw_xfer()
674 __i2c_dw_enable(dev, false); in i2c_dw_xfer()
676 if (dev->msg_err) { in i2c_dw_xfer()
677 ret = dev->msg_err; in i2c_dw_xfer()
682 if (likely(!dev->cmd_err)) { in i2c_dw_xfer()
688 if (dev->cmd_err == DW_IC_ERR_TX_ABRT) { in i2c_dw_xfer()
689 ret = i2c_dw_handle_tx_abort(dev); in i2c_dw_xfer()
695 if (dev->release_lock) in i2c_dw_xfer()
696 dev->release_lock(dev); in i2c_dw_xfer()
699 pm_runtime_mark_last_busy(dev->dev); in i2c_dw_xfer()
700 pm_runtime_put_autosuspend(dev->dev); in i2c_dw_xfer()
701 mutex_unlock(&dev->lock); in i2c_dw_xfer()
708 struct dw_i2c_dev *dev = i2c_get_adapdata(adap); in i2c_dw_func() local
709 return dev->functionality; in i2c_dw_func()
717 static u32 i2c_dw_read_clear_intrbits(struct dw_i2c_dev *dev) in i2c_dw_read_clear_intrbits() argument
733 stat = dw_readl(dev, DW_IC_INTR_STAT); in i2c_dw_read_clear_intrbits()
743 dw_readl(dev, DW_IC_CLR_RX_UNDER); in i2c_dw_read_clear_intrbits()
745 dw_readl(dev, DW_IC_CLR_RX_OVER); in i2c_dw_read_clear_intrbits()
747 dw_readl(dev, DW_IC_CLR_TX_OVER); in i2c_dw_read_clear_intrbits()
749 dw_readl(dev, DW_IC_CLR_RD_REQ); in i2c_dw_read_clear_intrbits()
755 dev->abort_source = dw_readl(dev, DW_IC_TX_ABRT_SOURCE); in i2c_dw_read_clear_intrbits()
756 dw_readl(dev, DW_IC_CLR_TX_ABRT); in i2c_dw_read_clear_intrbits()
759 dw_readl(dev, DW_IC_CLR_RX_DONE); in i2c_dw_read_clear_intrbits()
761 dw_readl(dev, DW_IC_CLR_ACTIVITY); in i2c_dw_read_clear_intrbits()
763 dw_readl(dev, DW_IC_CLR_STOP_DET); in i2c_dw_read_clear_intrbits()
765 dw_readl(dev, DW_IC_CLR_START_DET); in i2c_dw_read_clear_intrbits()
767 dw_readl(dev, DW_IC_CLR_GEN_CALL); in i2c_dw_read_clear_intrbits()
778 struct dw_i2c_dev *dev = dev_id; in i2c_dw_isr() local
781 enabled = dw_readl(dev, DW_IC_ENABLE); in i2c_dw_isr()
782 stat = dw_readl(dev, DW_IC_RAW_INTR_STAT); in i2c_dw_isr()
783 dev_dbg(dev->dev, "%s: enabled=%#x stat=%#x\n", __func__, enabled, stat); in i2c_dw_isr()
787 stat = i2c_dw_read_clear_intrbits(dev); in i2c_dw_isr()
790 dev->cmd_err |= DW_IC_ERR_TX_ABRT; in i2c_dw_isr()
791 dev->status = STATUS_IDLE; in i2c_dw_isr()
797 dw_writel(dev, 0, DW_IC_INTR_MASK); in i2c_dw_isr()
802 i2c_dw_read(dev); in i2c_dw_isr()
805 i2c_dw_xfer_msg(dev); in i2c_dw_isr()
814 if ((stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) || dev->msg_err) in i2c_dw_isr()
815 complete(&dev->cmd_complete); in i2c_dw_isr()
816 else if (unlikely(dev->accessor_flags & ACCESS_INTR_MASK)) { in i2c_dw_isr()
818 stat = dw_readl(dev, DW_IC_INTR_MASK); in i2c_dw_isr()
819 i2c_dw_disable_int(dev); in i2c_dw_isr()
820 dw_writel(dev, stat, DW_IC_INTR_MASK); in i2c_dw_isr()
826 void i2c_dw_disable(struct dw_i2c_dev *dev) in i2c_dw_disable() argument
829 __i2c_dw_enable(dev, false); in i2c_dw_disable()
832 dw_writel(dev, 0, DW_IC_INTR_MASK); in i2c_dw_disable()
833 dw_readl(dev, DW_IC_CLR_INTR); in i2c_dw_disable()
837 void i2c_dw_disable_int(struct dw_i2c_dev *dev) in i2c_dw_disable_int() argument
839 dw_writel(dev, 0, DW_IC_INTR_MASK); in i2c_dw_disable_int()
843 u32 i2c_dw_read_comp_param(struct dw_i2c_dev *dev) in i2c_dw_read_comp_param() argument
845 return dw_readl(dev, DW_IC_COMP_PARAM_1); in i2c_dw_read_comp_param()
849 int i2c_dw_probe(struct dw_i2c_dev *dev) in i2c_dw_probe() argument
851 struct i2c_adapter *adap = &dev->adapter; in i2c_dw_probe()
854 init_completion(&dev->cmd_complete); in i2c_dw_probe()
855 mutex_init(&dev->lock); in i2c_dw_probe()
857 r = i2c_dw_init(dev); in i2c_dw_probe()
864 adap->dev.parent = dev->dev; in i2c_dw_probe()
865 i2c_set_adapdata(adap, dev); in i2c_dw_probe()
867 i2c_dw_disable_int(dev); in i2c_dw_probe()
868 r = devm_request_irq(dev->dev, dev->irq, i2c_dw_isr, IRQF_SHARED, in i2c_dw_probe()
869 dev_name(dev->dev), dev); in i2c_dw_probe()
871 dev_err(dev->dev, "failure requesting irq %i: %d\n", in i2c_dw_probe()
872 dev->irq, r); in i2c_dw_probe()
878 dev_err(dev->dev, "failure adding adapter: %d\n", r); in i2c_dw_probe()