Lines Matching refs:iproc_i2c

238 static void bcm_iproc_i2c_enable_disable(struct bcm_iproc_i2c_dev *iproc_i2c,
241 static inline u32 iproc_i2c_rd_reg(struct bcm_iproc_i2c_dev *iproc_i2c, in iproc_i2c_rd_reg() argument
246 if (iproc_i2c->idm_base) { in iproc_i2c_rd_reg()
247 spin_lock(&iproc_i2c->idm_lock); in iproc_i2c_rd_reg()
248 writel(iproc_i2c->ape_addr_mask, in iproc_i2c_rd_reg()
249 iproc_i2c->idm_base + IDM_CTRL_DIRECT_OFFSET); in iproc_i2c_rd_reg()
250 val = readl(iproc_i2c->base + offset); in iproc_i2c_rd_reg()
251 spin_unlock(&iproc_i2c->idm_lock); in iproc_i2c_rd_reg()
253 val = readl(iproc_i2c->base + offset); in iproc_i2c_rd_reg()
259 static inline void iproc_i2c_wr_reg(struct bcm_iproc_i2c_dev *iproc_i2c, in iproc_i2c_wr_reg() argument
262 if (iproc_i2c->idm_base) { in iproc_i2c_wr_reg()
263 spin_lock(&iproc_i2c->idm_lock); in iproc_i2c_wr_reg()
264 writel(iproc_i2c->ape_addr_mask, in iproc_i2c_wr_reg()
265 iproc_i2c->idm_base + IDM_CTRL_DIRECT_OFFSET); in iproc_i2c_wr_reg()
266 writel(val, iproc_i2c->base + offset); in iproc_i2c_wr_reg()
267 spin_unlock(&iproc_i2c->idm_lock); in iproc_i2c_wr_reg()
269 writel(val, iproc_i2c->base + offset); in iproc_i2c_wr_reg()
274 struct bcm_iproc_i2c_dev *iproc_i2c, bool need_reset) in bcm_iproc_i2c_slave_init() argument
278 iproc_i2c->tx_underrun = 0; in bcm_iproc_i2c_slave_init()
281 val = iproc_i2c_rd_reg(iproc_i2c, CFG_OFFSET); in bcm_iproc_i2c_slave_init()
283 iproc_i2c_wr_reg(iproc_i2c, CFG_OFFSET, val); in bcm_iproc_i2c_slave_init()
290 iproc_i2c_wr_reg(iproc_i2c, CFG_OFFSET, val); in bcm_iproc_i2c_slave_init()
295 iproc_i2c_wr_reg(iproc_i2c, S_FIFO_CTRL_OFFSET, val); in bcm_iproc_i2c_slave_init()
298 val = iproc_i2c_rd_reg(iproc_i2c, TIM_CFG_OFFSET); in bcm_iproc_i2c_slave_init()
301 iproc_i2c_wr_reg(iproc_i2c, TIM_CFG_OFFSET, val); in bcm_iproc_i2c_slave_init()
304 val = iproc_i2c_rd_reg(iproc_i2c, S_CFG_SMBUS_ADDR_OFFSET); in bcm_iproc_i2c_slave_init()
307 val |= (iproc_i2c->slave->addr << S_CFG_NIC_SMB_ADDR3_SHIFT); in bcm_iproc_i2c_slave_init()
308 iproc_i2c_wr_reg(iproc_i2c, S_CFG_SMBUS_ADDR_OFFSET, val); in bcm_iproc_i2c_slave_init()
311 iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, ISR_MASK_SLAVE); in bcm_iproc_i2c_slave_init()
319 iproc_i2c->slave_int_mask = val; in bcm_iproc_i2c_slave_init()
320 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val); in bcm_iproc_i2c_slave_init()
324 struct bcm_iproc_i2c_dev *iproc_i2c) in bcm_iproc_i2c_check_slave_status() argument
328 val = iproc_i2c_rd_reg(iproc_i2c, S_CMD_OFFSET); in bcm_iproc_i2c_check_slave_status()
335 dev_err(iproc_i2c->device, "slave random stretch time timeout\n"); in bcm_iproc_i2c_check_slave_status()
338 bcm_iproc_i2c_enable_disable(iproc_i2c, false); in bcm_iproc_i2c_check_slave_status()
339 bcm_iproc_i2c_slave_init(iproc_i2c, true); in bcm_iproc_i2c_check_slave_status()
340 bcm_iproc_i2c_enable_disable(iproc_i2c, true); in bcm_iproc_i2c_check_slave_status()
344 static void bcm_iproc_i2c_slave_read(struct bcm_iproc_i2c_dev *iproc_i2c) in bcm_iproc_i2c_slave_read() argument
351 val = iproc_i2c_rd_reg(iproc_i2c, S_RX_OFFSET); in bcm_iproc_i2c_slave_read()
357 i2c_slave_event(iproc_i2c->slave, in bcm_iproc_i2c_slave_read()
359 iproc_i2c->rx_start_rcvd = true; in bcm_iproc_i2c_slave_read()
360 iproc_i2c->slave_read_complete = false; in bcm_iproc_i2c_slave_read()
362 iproc_i2c->rx_start_rcvd) { in bcm_iproc_i2c_slave_read()
364 i2c_slave_event(iproc_i2c->slave, in bcm_iproc_i2c_slave_read()
367 iproc_i2c->rx_start_rcvd) { in bcm_iproc_i2c_slave_read()
369 if (iproc_i2c->slave_rx_only) in bcm_iproc_i2c_slave_read()
370 i2c_slave_event(iproc_i2c->slave, in bcm_iproc_i2c_slave_read()
374 i2c_slave_event(iproc_i2c->slave, I2C_SLAVE_STOP, in bcm_iproc_i2c_slave_read()
377 iproc_i2c->rx_start_rcvd = false; in bcm_iproc_i2c_slave_read()
378 iproc_i2c->slave_read_complete = true; in bcm_iproc_i2c_slave_read()
388 struct bcm_iproc_i2c_dev *iproc_i2c = (struct bcm_iproc_i2c_dev *)data; in slave_rx_tasklet_fn() local
391 bcm_iproc_i2c_slave_read(iproc_i2c); in slave_rx_tasklet_fn()
396 if (!iproc_i2c->slave_rx_only && iproc_i2c->slave_read_complete) { in slave_rx_tasklet_fn()
407 iproc_i2c->tx_underrun = 0; in slave_rx_tasklet_fn()
408 iproc_i2c->slave_int_mask |= BIT(IE_S_TX_UNDERRUN_SHIFT); in slave_rx_tasklet_fn()
415 iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, int_clr); in slave_rx_tasklet_fn()
417 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, iproc_i2c->slave_int_mask); in slave_rx_tasklet_fn()
420 static bool bcm_iproc_i2c_slave_isr(struct bcm_iproc_i2c_dev *iproc_i2c, in bcm_iproc_i2c_slave_isr() argument
439 val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); in bcm_iproc_i2c_slave_isr()
440 val &= ~iproc_i2c->slave_int_mask; in bcm_iproc_i2c_slave_isr()
441 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val); in bcm_iproc_i2c_slave_isr()
445 iproc_i2c->slave_rx_only = false; in bcm_iproc_i2c_slave_isr()
448 iproc_i2c->slave_rx_only = true; in bcm_iproc_i2c_slave_isr()
451 tasklet_schedule(&iproc_i2c->slave_rx_tasklet); in bcm_iproc_i2c_slave_isr()
454 iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, in bcm_iproc_i2c_slave_isr()
459 iproc_i2c->tx_underrun++; in bcm_iproc_i2c_slave_isr()
460 if (iproc_i2c->tx_underrun == 1) in bcm_iproc_i2c_slave_isr()
462 i2c_slave_event(iproc_i2c->slave, in bcm_iproc_i2c_slave_isr()
467 i2c_slave_event(iproc_i2c->slave, in bcm_iproc_i2c_slave_isr()
471 iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, value); in bcm_iproc_i2c_slave_isr()
474 iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val); in bcm_iproc_i2c_slave_isr()
477 iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, in bcm_iproc_i2c_slave_isr()
487 iproc_i2c->slave_int_mask &= ~BIT(IE_S_TX_UNDERRUN_SHIFT); in bcm_iproc_i2c_slave_isr()
488 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, in bcm_iproc_i2c_slave_isr()
489 iproc_i2c->slave_int_mask); in bcm_iproc_i2c_slave_isr()
493 iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, val); in bcm_iproc_i2c_slave_isr()
496 iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val); in bcm_iproc_i2c_slave_isr()
499 val = iproc_i2c_rd_reg(iproc_i2c, S_FIFO_CTRL_OFFSET); in bcm_iproc_i2c_slave_isr()
501 iproc_i2c_wr_reg(iproc_i2c, S_FIFO_CTRL_OFFSET, val); in bcm_iproc_i2c_slave_isr()
503 i2c_slave_event(iproc_i2c->slave, I2C_SLAVE_STOP, &value); in bcm_iproc_i2c_slave_isr()
506 iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, in bcm_iproc_i2c_slave_isr()
511 if (!iproc_i2c->slave_rx_only) in bcm_iproc_i2c_slave_isr()
512 bcm_iproc_i2c_check_slave_status(iproc_i2c); in bcm_iproc_i2c_slave_isr()
517 static void bcm_iproc_i2c_read_valid_bytes(struct bcm_iproc_i2c_dev *iproc_i2c) in bcm_iproc_i2c_read_valid_bytes() argument
519 struct i2c_msg *msg = iproc_i2c->msg; in bcm_iproc_i2c_read_valid_bytes()
523 while (iproc_i2c->rx_bytes < msg->len) { in bcm_iproc_i2c_read_valid_bytes()
524 val = iproc_i2c_rd_reg(iproc_i2c, M_RX_OFFSET); in bcm_iproc_i2c_read_valid_bytes()
530 msg->buf[iproc_i2c->rx_bytes] = in bcm_iproc_i2c_read_valid_bytes()
532 iproc_i2c->rx_bytes++; in bcm_iproc_i2c_read_valid_bytes()
536 static void bcm_iproc_i2c_send(struct bcm_iproc_i2c_dev *iproc_i2c) in bcm_iproc_i2c_send() argument
538 struct i2c_msg *msg = iproc_i2c->msg; in bcm_iproc_i2c_send()
539 unsigned int tx_bytes = msg->len - iproc_i2c->tx_bytes; in bcm_iproc_i2c_send()
547 unsigned int idx = iproc_i2c->tx_bytes + i; in bcm_iproc_i2c_send()
555 if (iproc_i2c->irq) { in bcm_iproc_i2c_send()
562 tmp = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); in bcm_iproc_i2c_send()
564 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, in bcm_iproc_i2c_send()
570 iproc_i2c_wr_reg(iproc_i2c, M_TX_OFFSET, val); in bcm_iproc_i2c_send()
574 iproc_i2c->tx_bytes += tx_bytes; in bcm_iproc_i2c_send()
577 static void bcm_iproc_i2c_read(struct bcm_iproc_i2c_dev *iproc_i2c) in bcm_iproc_i2c_read() argument
579 struct i2c_msg *msg = iproc_i2c->msg; in bcm_iproc_i2c_read()
582 bcm_iproc_i2c_read_valid_bytes(iproc_i2c); in bcm_iproc_i2c_read()
583 bytes_left = msg->len - iproc_i2c->rx_bytes; in bcm_iproc_i2c_read()
585 if (iproc_i2c->irq) { in bcm_iproc_i2c_read()
587 val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); in bcm_iproc_i2c_read()
589 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val); in bcm_iproc_i2c_read()
591 } else if (bytes_left < iproc_i2c->thld_bytes) { in bcm_iproc_i2c_read()
593 val = iproc_i2c_rd_reg(iproc_i2c, M_FIFO_CTRL_OFFSET); in bcm_iproc_i2c_read()
596 iproc_i2c_wr_reg(iproc_i2c, M_FIFO_CTRL_OFFSET, val); in bcm_iproc_i2c_read()
597 iproc_i2c->thld_bytes = bytes_left; in bcm_iproc_i2c_read()
606 static void bcm_iproc_i2c_process_m_event(struct bcm_iproc_i2c_dev *iproc_i2c, in bcm_iproc_i2c_process_m_event() argument
611 bcm_iproc_i2c_send(iproc_i2c); in bcm_iproc_i2c_process_m_event()
615 bcm_iproc_i2c_read(iproc_i2c); in bcm_iproc_i2c_process_m_event()
619 iproc_i2c->xfer_is_done = 1; in bcm_iproc_i2c_process_m_event()
620 if (iproc_i2c->irq) in bcm_iproc_i2c_process_m_event()
621 complete(&iproc_i2c->done); in bcm_iproc_i2c_process_m_event()
627 struct bcm_iproc_i2c_dev *iproc_i2c = data; in bcm_iproc_i2c_isr() local
632 status = iproc_i2c_rd_reg(iproc_i2c, IS_OFFSET); in bcm_iproc_i2c_isr()
634 slave_status = status & iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET) & in bcm_iproc_i2c_isr()
638 ret = bcm_iproc_i2c_slave_isr(iproc_i2c, slave_status); in bcm_iproc_i2c_isr()
650 bcm_iproc_i2c_process_m_event(iproc_i2c, status); in bcm_iproc_i2c_isr()
651 iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, status); in bcm_iproc_i2c_isr()
656 static int bcm_iproc_i2c_init(struct bcm_iproc_i2c_dev *iproc_i2c) in bcm_iproc_i2c_init() argument
661 val = iproc_i2c_rd_reg(iproc_i2c, CFG_OFFSET); in bcm_iproc_i2c_init()
664 iproc_i2c_wr_reg(iproc_i2c, CFG_OFFSET, val); in bcm_iproc_i2c_init()
671 iproc_i2c_wr_reg(iproc_i2c, CFG_OFFSET, val); in bcm_iproc_i2c_init()
675 iproc_i2c_wr_reg(iproc_i2c, M_FIFO_CTRL_OFFSET, val); in bcm_iproc_i2c_init()
677 val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); in bcm_iproc_i2c_init()
680 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val); in bcm_iproc_i2c_init()
683 iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, 0xffffffff); in bcm_iproc_i2c_init()
688 static void bcm_iproc_i2c_enable_disable(struct bcm_iproc_i2c_dev *iproc_i2c, in bcm_iproc_i2c_enable_disable() argument
693 val = iproc_i2c_rd_reg(iproc_i2c, CFG_OFFSET); in bcm_iproc_i2c_enable_disable()
698 iproc_i2c_wr_reg(iproc_i2c, CFG_OFFSET, val); in bcm_iproc_i2c_enable_disable()
701 static int bcm_iproc_i2c_check_status(struct bcm_iproc_i2c_dev *iproc_i2c, in bcm_iproc_i2c_check_status() argument
706 val = iproc_i2c_rd_reg(iproc_i2c, M_CMD_OFFSET); in bcm_iproc_i2c_check_status()
714 dev_dbg(iproc_i2c->device, "lost bus arbitration\n"); in bcm_iproc_i2c_check_status()
718 dev_dbg(iproc_i2c->device, "NAK addr:0x%02x\n", msg->addr); in bcm_iproc_i2c_check_status()
722 dev_dbg(iproc_i2c->device, "NAK data\n"); in bcm_iproc_i2c_check_status()
726 dev_dbg(iproc_i2c->device, "bus timeout\n"); in bcm_iproc_i2c_check_status()
730 dev_dbg(iproc_i2c->device, "FIFO under-run\n"); in bcm_iproc_i2c_check_status()
734 dev_dbg(iproc_i2c->device, "RX FIFO full\n"); in bcm_iproc_i2c_check_status()
738 dev_dbg(iproc_i2c->device, "unknown error code=%d\n", val); in bcm_iproc_i2c_check_status()
741 bcm_iproc_i2c_enable_disable(iproc_i2c, false); in bcm_iproc_i2c_check_status()
742 bcm_iproc_i2c_init(iproc_i2c); in bcm_iproc_i2c_check_status()
743 bcm_iproc_i2c_enable_disable(iproc_i2c, true); in bcm_iproc_i2c_check_status()
749 static int bcm_iproc_i2c_xfer_wait(struct bcm_iproc_i2c_dev *iproc_i2c, in bcm_iproc_i2c_xfer_wait() argument
757 iproc_i2c_wr_reg(iproc_i2c, M_CMD_OFFSET, cmd); in bcm_iproc_i2c_xfer_wait()
759 if (iproc_i2c->irq) { in bcm_iproc_i2c_xfer_wait()
760 time_left = wait_for_completion_timeout(&iproc_i2c->done, in bcm_iproc_i2c_xfer_wait()
763 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, 0); in bcm_iproc_i2c_xfer_wait()
765 iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); in bcm_iproc_i2c_xfer_wait()
767 synchronize_irq(iproc_i2c->irq); in bcm_iproc_i2c_xfer_wait()
773 status = iproc_i2c_rd_reg(iproc_i2c, in bcm_iproc_i2c_xfer_wait()
775 bcm_iproc_i2c_process_m_event(iproc_i2c, status); in bcm_iproc_i2c_xfer_wait()
776 iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, status); in bcm_iproc_i2c_xfer_wait()
785 } while (!iproc_i2c->xfer_is_done); in bcm_iproc_i2c_xfer_wait()
788 if (!time_left && !iproc_i2c->xfer_is_done) { in bcm_iproc_i2c_xfer_wait()
789 dev_err(iproc_i2c->device, "transaction timed out\n"); in bcm_iproc_i2c_xfer_wait()
793 iproc_i2c_wr_reg(iproc_i2c, M_FIFO_CTRL_OFFSET, val); in bcm_iproc_i2c_xfer_wait()
797 ret = bcm_iproc_i2c_check_status(iproc_i2c, msg); in bcm_iproc_i2c_xfer_wait()
801 iproc_i2c_wr_reg(iproc_i2c, M_FIFO_CTRL_OFFSET, val); in bcm_iproc_i2c_xfer_wait()
814 static int bcm_iproc_i2c_xfer_internal(struct bcm_iproc_i2c_dev *iproc_i2c, in bcm_iproc_i2c_xfer_internal() argument
824 if (!!(iproc_i2c_rd_reg(iproc_i2c, in bcm_iproc_i2c_xfer_internal()
826 dev_warn(iproc_i2c->device, "bus is busy\n"); in bcm_iproc_i2c_xfer_internal()
830 iproc_i2c->msg = msg; in bcm_iproc_i2c_xfer_internal()
834 iproc_i2c_wr_reg(iproc_i2c, M_TX_OFFSET, addr); in bcm_iproc_i2c_xfer_internal()
850 iproc_i2c_wr_reg(iproc_i2c, M_TX_OFFSET, val); in bcm_iproc_i2c_xfer_internal()
852 iproc_i2c->tx_bytes = tx_bytes; in bcm_iproc_i2c_xfer_internal()
858 iproc_i2c->msg = msg; /* point to second msg */ in bcm_iproc_i2c_xfer_internal()
867 iproc_i2c_wr_reg(iproc_i2c, M_TX_OFFSET, val); in bcm_iproc_i2c_xfer_internal()
871 if (iproc_i2c->irq) in bcm_iproc_i2c_xfer_internal()
872 reinit_completion(&iproc_i2c->done); in bcm_iproc_i2c_xfer_internal()
874 iproc_i2c->xfer_is_done = 0; in bcm_iproc_i2c_xfer_internal()
889 msg->len > iproc_i2c->tx_bytes) in bcm_iproc_i2c_xfer_internal()
904 iproc_i2c->rx_bytes = 0; in bcm_iproc_i2c_xfer_internal()
906 iproc_i2c->thld_bytes = M_RX_FIFO_THLD_VALUE; in bcm_iproc_i2c_xfer_internal()
908 iproc_i2c->thld_bytes = msg->len; in bcm_iproc_i2c_xfer_internal()
911 tmp = iproc_i2c_rd_reg(iproc_i2c, M_FIFO_CTRL_OFFSET); in bcm_iproc_i2c_xfer_internal()
913 tmp |= iproc_i2c->thld_bytes << M_FIFO_RX_THLD_SHIFT; in bcm_iproc_i2c_xfer_internal()
914 iproc_i2c_wr_reg(iproc_i2c, M_FIFO_CTRL_OFFSET, tmp); in bcm_iproc_i2c_xfer_internal()
928 if (iproc_i2c->irq) in bcm_iproc_i2c_xfer_internal()
929 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val_intr_en); in bcm_iproc_i2c_xfer_internal()
931 return bcm_iproc_i2c_xfer_wait(iproc_i2c, msg, val); in bcm_iproc_i2c_xfer_internal()
937 struct bcm_iproc_i2c_dev *iproc_i2c = i2c_get_adapdata(adapter); in bcm_iproc_i2c_xfer() local
945 dev_err(iproc_i2c->device, "Invalid repeated start\n"); in bcm_iproc_i2c_xfer()
950 ret = bcm_iproc_i2c_xfer_internal(iproc_i2c, msgs, process_call); in bcm_iproc_i2c_xfer()
952 dev_dbg(iproc_i2c->device, "xfer failed\n"); in bcm_iproc_i2c_xfer()
984 static int bcm_iproc_i2c_cfg_speed(struct bcm_iproc_i2c_dev *iproc_i2c) in bcm_iproc_i2c_cfg_speed() argument
988 int ret = of_property_read_u32(iproc_i2c->device->of_node, in bcm_iproc_i2c_cfg_speed()
991 dev_info(iproc_i2c->device, in bcm_iproc_i2c_cfg_speed()
997 dev_err(iproc_i2c->device, "%d Hz bus speed not supported\n", in bcm_iproc_i2c_cfg_speed()
999 dev_err(iproc_i2c->device, in bcm_iproc_i2c_cfg_speed()
1008 iproc_i2c->bus_speed = bus_speed; in bcm_iproc_i2c_cfg_speed()
1009 val = iproc_i2c_rd_reg(iproc_i2c, TIM_CFG_OFFSET); in bcm_iproc_i2c_cfg_speed()
1012 iproc_i2c_wr_reg(iproc_i2c, TIM_CFG_OFFSET, val); in bcm_iproc_i2c_cfg_speed()
1014 dev_info(iproc_i2c->device, "bus set to %u Hz\n", bus_speed); in bcm_iproc_i2c_cfg_speed()
1022 struct bcm_iproc_i2c_dev *iproc_i2c; in bcm_iproc_i2c_probe() local
1026 iproc_i2c = devm_kzalloc(&pdev->dev, sizeof(*iproc_i2c), in bcm_iproc_i2c_probe()
1028 if (!iproc_i2c) in bcm_iproc_i2c_probe()
1031 platform_set_drvdata(pdev, iproc_i2c); in bcm_iproc_i2c_probe()
1032 iproc_i2c->device = &pdev->dev; in bcm_iproc_i2c_probe()
1033 iproc_i2c->type = in bcm_iproc_i2c_probe()
1035 init_completion(&iproc_i2c->done); in bcm_iproc_i2c_probe()
1038 iproc_i2c->base = devm_ioremap_resource(iproc_i2c->device, res); in bcm_iproc_i2c_probe()
1039 if (IS_ERR(iproc_i2c->base)) in bcm_iproc_i2c_probe()
1040 return PTR_ERR(iproc_i2c->base); in bcm_iproc_i2c_probe()
1042 if (iproc_i2c->type == IPROC_I2C_NIC) { in bcm_iproc_i2c_probe()
1044 iproc_i2c->idm_base = devm_ioremap_resource(iproc_i2c->device, in bcm_iproc_i2c_probe()
1046 if (IS_ERR(iproc_i2c->idm_base)) in bcm_iproc_i2c_probe()
1047 return PTR_ERR(iproc_i2c->idm_base); in bcm_iproc_i2c_probe()
1049 ret = of_property_read_u32(iproc_i2c->device->of_node, in bcm_iproc_i2c_probe()
1051 &iproc_i2c->ape_addr_mask); in bcm_iproc_i2c_probe()
1053 dev_err(iproc_i2c->device, in bcm_iproc_i2c_probe()
1058 spin_lock_init(&iproc_i2c->idm_lock); in bcm_iproc_i2c_probe()
1065 ret = bcm_iproc_i2c_init(iproc_i2c); in bcm_iproc_i2c_probe()
1069 ret = bcm_iproc_i2c_cfg_speed(iproc_i2c); in bcm_iproc_i2c_probe()
1075 ret = devm_request_irq(iproc_i2c->device, irq, in bcm_iproc_i2c_probe()
1077 iproc_i2c); in bcm_iproc_i2c_probe()
1079 dev_err(iproc_i2c->device, in bcm_iproc_i2c_probe()
1084 iproc_i2c->irq = irq; in bcm_iproc_i2c_probe()
1086 dev_warn(iproc_i2c->device, in bcm_iproc_i2c_probe()
1090 bcm_iproc_i2c_enable_disable(iproc_i2c, true); in bcm_iproc_i2c_probe()
1092 adap = &iproc_i2c->adapter; in bcm_iproc_i2c_probe()
1093 i2c_set_adapdata(adap, iproc_i2c); in bcm_iproc_i2c_probe()
1096 of_node_full_name(iproc_i2c->device->of_node)); in bcm_iproc_i2c_probe()
1107 struct bcm_iproc_i2c_dev *iproc_i2c = platform_get_drvdata(pdev); in bcm_iproc_i2c_remove() local
1109 if (iproc_i2c->irq) { in bcm_iproc_i2c_remove()
1114 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, 0); in bcm_iproc_i2c_remove()
1115 iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); in bcm_iproc_i2c_remove()
1116 synchronize_irq(iproc_i2c->irq); in bcm_iproc_i2c_remove()
1119 i2c_del_adapter(&iproc_i2c->adapter); in bcm_iproc_i2c_remove()
1120 bcm_iproc_i2c_enable_disable(iproc_i2c, false); in bcm_iproc_i2c_remove()
1129 struct bcm_iproc_i2c_dev *iproc_i2c = dev_get_drvdata(dev); in bcm_iproc_i2c_suspend() local
1131 if (iproc_i2c->irq) { in bcm_iproc_i2c_suspend()
1136 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, 0); in bcm_iproc_i2c_suspend()
1137 iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); in bcm_iproc_i2c_suspend()
1138 synchronize_irq(iproc_i2c->irq); in bcm_iproc_i2c_suspend()
1142 bcm_iproc_i2c_enable_disable(iproc_i2c, false); in bcm_iproc_i2c_suspend()
1149 struct bcm_iproc_i2c_dev *iproc_i2c = dev_get_drvdata(dev); in bcm_iproc_i2c_resume() local
1157 ret = bcm_iproc_i2c_init(iproc_i2c); in bcm_iproc_i2c_resume()
1162 val = iproc_i2c_rd_reg(iproc_i2c, TIM_CFG_OFFSET); in bcm_iproc_i2c_resume()
1164 val |= (iproc_i2c->bus_speed == I2C_MAX_FAST_MODE_FREQ) << TIM_CFG_MODE_400_SHIFT; in bcm_iproc_i2c_resume()
1165 iproc_i2c_wr_reg(iproc_i2c, TIM_CFG_OFFSET, val); in bcm_iproc_i2c_resume()
1167 bcm_iproc_i2c_enable_disable(iproc_i2c, true); in bcm_iproc_i2c_resume()
1185 struct bcm_iproc_i2c_dev *iproc_i2c = i2c_get_adapdata(slave->adapter); in bcm_iproc_i2c_reg_slave() local
1187 if (iproc_i2c->slave) in bcm_iproc_i2c_reg_slave()
1193 iproc_i2c->slave = slave; in bcm_iproc_i2c_reg_slave()
1195 tasklet_init(&iproc_i2c->slave_rx_tasklet, slave_rx_tasklet_fn, in bcm_iproc_i2c_reg_slave()
1196 (unsigned long)iproc_i2c); in bcm_iproc_i2c_reg_slave()
1198 bcm_iproc_i2c_slave_init(iproc_i2c, false); in bcm_iproc_i2c_reg_slave()
1205 struct bcm_iproc_i2c_dev *iproc_i2c = i2c_get_adapdata(slave->adapter); in bcm_iproc_i2c_unreg_slave() local
1207 if (!iproc_i2c->slave) in bcm_iproc_i2c_unreg_slave()
1210 disable_irq(iproc_i2c->irq); in bcm_iproc_i2c_unreg_slave()
1213 tmp = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); in bcm_iproc_i2c_unreg_slave()
1216 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, tmp); in bcm_iproc_i2c_unreg_slave()
1218 tasklet_kill(&iproc_i2c->slave_rx_tasklet); in bcm_iproc_i2c_unreg_slave()
1221 tmp = iproc_i2c_rd_reg(iproc_i2c, S_CFG_SMBUS_ADDR_OFFSET); in bcm_iproc_i2c_unreg_slave()
1223 iproc_i2c_wr_reg(iproc_i2c, S_CFG_SMBUS_ADDR_OFFSET, tmp); in bcm_iproc_i2c_unreg_slave()
1227 iproc_i2c_wr_reg(iproc_i2c, S_FIFO_CTRL_OFFSET, tmp); in bcm_iproc_i2c_unreg_slave()
1230 iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, ISR_MASK_SLAVE); in bcm_iproc_i2c_unreg_slave()
1232 iproc_i2c->slave = NULL; in bcm_iproc_i2c_unreg_slave()
1234 enable_irq(iproc_i2c->irq); in bcm_iproc_i2c_unreg_slave()