Lines Matching refs:dev

169 static void bcm_kona_i2c_send_cmd_to_ctrl(struct bcm_kona_i2c_dev *dev,  in bcm_kona_i2c_send_cmd_to_ctrl()  argument
172 dev_dbg(dev->device, "%s, %d\n", __func__, cmd); in bcm_kona_i2c_send_cmd_to_ctrl()
178 dev->base + CS_OFFSET); in bcm_kona_i2c_send_cmd_to_ctrl()
185 dev->base + CS_OFFSET); in bcm_kona_i2c_send_cmd_to_ctrl()
192 dev->base + CS_OFFSET); in bcm_kona_i2c_send_cmd_to_ctrl()
198 dev->base + CS_OFFSET); in bcm_kona_i2c_send_cmd_to_ctrl()
202 dev_err(dev->device, "Unknown command %d\n", cmd); in bcm_kona_i2c_send_cmd_to_ctrl()
206 static void bcm_kona_i2c_enable_clock(struct bcm_kona_i2c_dev *dev) in bcm_kona_i2c_enable_clock() argument
208 writel(readl(dev->base + CLKEN_OFFSET) | CLKEN_CLKEN_MASK, in bcm_kona_i2c_enable_clock()
209 dev->base + CLKEN_OFFSET); in bcm_kona_i2c_enable_clock()
212 static void bcm_kona_i2c_disable_clock(struct bcm_kona_i2c_dev *dev) in bcm_kona_i2c_disable_clock() argument
214 writel(readl(dev->base + CLKEN_OFFSET) & ~CLKEN_CLKEN_MASK, in bcm_kona_i2c_disable_clock()
215 dev->base + CLKEN_OFFSET); in bcm_kona_i2c_disable_clock()
220 struct bcm_kona_i2c_dev *dev = devid; in bcm_kona_i2c_isr() local
221 uint32_t status = readl(dev->base + ISR_OFFSET); in bcm_kona_i2c_isr()
229 dev->base + TXFCR_OFFSET); in bcm_kona_i2c_isr()
231 writel(status & ~ISR_RESERVED_MASK, dev->base + ISR_OFFSET); in bcm_kona_i2c_isr()
232 complete_all(&dev->done); in bcm_kona_i2c_isr()
238 static int bcm_kona_i2c_wait_if_busy(struct bcm_kona_i2c_dev *dev) in bcm_kona_i2c_wait_if_busy() argument
242 while (readl(dev->base + ISR_OFFSET) & ISR_CMDBUSY_MASK) in bcm_kona_i2c_wait_if_busy()
244 dev_err(dev->device, "CMDBUSY timeout\n"); in bcm_kona_i2c_wait_if_busy()
252 static int bcm_kona_send_i2c_cmd(struct bcm_kona_i2c_dev *dev, in bcm_kona_send_i2c_cmd() argument
259 rc = bcm_kona_i2c_wait_if_busy(dev); in bcm_kona_send_i2c_cmd()
264 writel(IER_I2C_INT_EN_MASK, dev->base + IER_OFFSET); in bcm_kona_send_i2c_cmd()
267 reinit_completion(&dev->done); in bcm_kona_send_i2c_cmd()
270 bcm_kona_i2c_send_cmd_to_ctrl(dev, cmd); in bcm_kona_send_i2c_cmd()
273 time_left = wait_for_completion_timeout(&dev->done, time_left); in bcm_kona_send_i2c_cmd()
276 writel(0, dev->base + IER_OFFSET); in bcm_kona_send_i2c_cmd()
279 dev_err(dev->device, "controller timed out\n"); in bcm_kona_send_i2c_cmd()
284 bcm_kona_i2c_send_cmd_to_ctrl(dev, BCM_CMD_NOACTION); in bcm_kona_send_i2c_cmd()
290 static int bcm_kona_i2c_read_fifo_single(struct bcm_kona_i2c_dev *dev, in bcm_kona_i2c_read_fifo_single() argument
297 reinit_completion(&dev->done); in bcm_kona_i2c_read_fifo_single()
300 writel(IER_READ_COMPLETE_INT_MASK, dev->base + IER_OFFSET); in bcm_kona_i2c_read_fifo_single()
305 dev->base + RXFCR_OFFSET); in bcm_kona_i2c_read_fifo_single()
308 time_left = wait_for_completion_timeout(&dev->done, time_left); in bcm_kona_i2c_read_fifo_single()
311 writel(0, dev->base + IER_OFFSET); in bcm_kona_i2c_read_fifo_single()
314 dev_err(dev->device, "RX FIFO time out\n"); in bcm_kona_i2c_read_fifo_single()
320 *buf = readl(dev->base + RXFIFORDOUT_OFFSET); in bcm_kona_i2c_read_fifo_single()
326 static int bcm_kona_i2c_read_fifo(struct bcm_kona_i2c_dev *dev, in bcm_kona_i2c_read_fifo() argument
342 rc = bcm_kona_i2c_read_fifo_single(dev, tmp_buf, bytes_to_read, in bcm_kona_i2c_read_fifo()
355 static int bcm_kona_i2c_write_byte(struct bcm_kona_i2c_dev *dev, uint8_t data, in bcm_kona_i2c_write_byte() argument
363 rc = bcm_kona_i2c_wait_if_busy(dev); in bcm_kona_i2c_write_byte()
368 writel(ISR_SES_DONE_MASK, dev->base + ISR_OFFSET); in bcm_kona_i2c_write_byte()
371 writel(IER_I2C_INT_EN_MASK, dev->base + IER_OFFSET); in bcm_kona_i2c_write_byte()
374 reinit_completion(&dev->done); in bcm_kona_i2c_write_byte()
377 writel(data, dev->base + DAT_OFFSET); in bcm_kona_i2c_write_byte()
380 time_left = wait_for_completion_timeout(&dev->done, time_left); in bcm_kona_i2c_write_byte()
383 writel(0, dev->base + IER_OFFSET); in bcm_kona_i2c_write_byte()
386 dev_dbg(dev->device, "controller timed out\n"); in bcm_kona_i2c_write_byte()
390 nak_received = readl(dev->base + CS_OFFSET) & CS_ACK_MASK ? 1 : 0; in bcm_kona_i2c_write_byte()
393 dev_dbg(dev->device, "unexpected NAK/ACK\n"); in bcm_kona_i2c_write_byte()
401 static int bcm_kona_i2c_write_fifo_single(struct bcm_kona_i2c_dev *dev, in bcm_kona_i2c_write_fifo_single() argument
409 reinit_completion(&dev->done); in bcm_kona_i2c_write_fifo_single()
413 dev->base + IER_OFFSET); in bcm_kona_i2c_write_fifo_single()
416 disable_irq(dev->irq); in bcm_kona_i2c_write_fifo_single()
420 writel(buf[k], (dev->base + DAT_OFFSET)); in bcm_kona_i2c_write_fifo_single()
423 enable_irq(dev->irq); in bcm_kona_i2c_write_fifo_single()
427 time_left = wait_for_completion_timeout(&dev->done, time_left); in bcm_kona_i2c_write_fifo_single()
428 fifo_status = readl(dev->base + FIFO_STATUS_OFFSET); in bcm_kona_i2c_write_fifo_single()
432 writel(0, dev->base + IER_OFFSET); in bcm_kona_i2c_write_fifo_single()
435 if (readl(dev->base + CS_OFFSET) & CS_ACK_MASK) { in bcm_kona_i2c_write_fifo_single()
436 dev_err(dev->device, "unexpected NAK\n"); in bcm_kona_i2c_write_fifo_single()
442 dev_err(dev->device, "completion timed out\n"); in bcm_kona_i2c_write_fifo_single()
451 static int bcm_kona_i2c_write_fifo(struct bcm_kona_i2c_dev *dev, in bcm_kona_i2c_write_fifo() argument
464 rc = bcm_kona_i2c_write_fifo_single(dev, tmp_buf, in bcm_kona_i2c_write_fifo()
477 static int bcm_kona_i2c_do_addr(struct bcm_kona_i2c_dev *dev, in bcm_kona_i2c_do_addr() argument
485 if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0) in bcm_kona_i2c_do_addr()
490 if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0) in bcm_kona_i2c_do_addr()
495 if (bcm_kona_send_i2c_cmd(dev, BCM_CMD_RESTART) < 0) in bcm_kona_i2c_do_addr()
500 if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0) in bcm_kona_i2c_do_addr()
509 if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0) in bcm_kona_i2c_do_addr()
516 static void bcm_kona_i2c_enable_autosense(struct bcm_kona_i2c_dev *dev) in bcm_kona_i2c_enable_autosense() argument
518 writel(readl(dev->base + CLKEN_OFFSET) & ~CLKEN_AUTOSENSE_OFF_MASK, in bcm_kona_i2c_enable_autosense()
519 dev->base + CLKEN_OFFSET); in bcm_kona_i2c_enable_autosense()
522 static void bcm_kona_i2c_config_timing(struct bcm_kona_i2c_dev *dev) in bcm_kona_i2c_config_timing() argument
524 writel(readl(dev->base + HSTIM_OFFSET) & ~HSTIM_HS_MODE_MASK, in bcm_kona_i2c_config_timing()
525 dev->base + HSTIM_OFFSET); in bcm_kona_i2c_config_timing()
527 writel((dev->std_cfg->prescale << TIM_PRESCALE_SHIFT) | in bcm_kona_i2c_config_timing()
528 (dev->std_cfg->time_p << TIM_P_SHIFT) | in bcm_kona_i2c_config_timing()
529 (dev->std_cfg->no_div << TIM_NO_DIV_SHIFT) | in bcm_kona_i2c_config_timing()
530 (dev->std_cfg->time_div << TIM_DIV_SHIFT), in bcm_kona_i2c_config_timing()
531 dev->base + TIM_OFFSET); in bcm_kona_i2c_config_timing()
533 writel((dev->std_cfg->time_m << CLKEN_M_SHIFT) | in bcm_kona_i2c_config_timing()
534 (dev->std_cfg->time_n << CLKEN_N_SHIFT) | in bcm_kona_i2c_config_timing()
536 dev->base + CLKEN_OFFSET); in bcm_kona_i2c_config_timing()
539 static void bcm_kona_i2c_config_timing_hs(struct bcm_kona_i2c_dev *dev) in bcm_kona_i2c_config_timing_hs() argument
541 writel((dev->hs_cfg->prescale << TIM_PRESCALE_SHIFT) | in bcm_kona_i2c_config_timing_hs()
542 (dev->hs_cfg->time_p << TIM_P_SHIFT) | in bcm_kona_i2c_config_timing_hs()
543 (dev->hs_cfg->no_div << TIM_NO_DIV_SHIFT) | in bcm_kona_i2c_config_timing_hs()
544 (dev->hs_cfg->time_div << TIM_DIV_SHIFT), in bcm_kona_i2c_config_timing_hs()
545 dev->base + TIM_OFFSET); in bcm_kona_i2c_config_timing_hs()
547 writel((dev->hs_cfg->hs_hold << HSTIM_HS_HOLD_SHIFT) | in bcm_kona_i2c_config_timing_hs()
548 (dev->hs_cfg->hs_high_phase << HSTIM_HS_HIGH_PHASE_SHIFT) | in bcm_kona_i2c_config_timing_hs()
549 (dev->hs_cfg->hs_setup << HSTIM_HS_SETUP_SHIFT), in bcm_kona_i2c_config_timing_hs()
550 dev->base + HSTIM_OFFSET); in bcm_kona_i2c_config_timing_hs()
552 writel(readl(dev->base + HSTIM_OFFSET) | HSTIM_HS_MODE_MASK, in bcm_kona_i2c_config_timing_hs()
553 dev->base + HSTIM_OFFSET); in bcm_kona_i2c_config_timing_hs()
556 static int bcm_kona_i2c_switch_to_hs(struct bcm_kona_i2c_dev *dev) in bcm_kona_i2c_switch_to_hs() argument
561 rc = bcm_kona_i2c_write_byte(dev, MASTERCODE, 1); in bcm_kona_i2c_switch_to_hs()
568 rc = clk_set_rate(dev->external_clk, HS_EXT_CLK_FREQ); in bcm_kona_i2c_switch_to_hs()
570 dev_err(dev->device, "%s: clk_set_rate returned %d\n", in bcm_kona_i2c_switch_to_hs()
576 bcm_kona_i2c_config_timing_hs(dev); in bcm_kona_i2c_switch_to_hs()
579 rc = bcm_kona_send_i2c_cmd(dev, BCM_CMD_RESTART); in bcm_kona_i2c_switch_to_hs()
581 dev_err(dev->device, "High speed restart command failed\n"); in bcm_kona_i2c_switch_to_hs()
586 static int bcm_kona_i2c_switch_to_std(struct bcm_kona_i2c_dev *dev) in bcm_kona_i2c_switch_to_std() argument
591 bcm_kona_i2c_config_timing(dev); in bcm_kona_i2c_switch_to_std()
594 rc = clk_set_rate(dev->external_clk, STD_EXT_CLK_FREQ); in bcm_kona_i2c_switch_to_std()
596 dev_err(dev->device, "%s: clk_set_rate returned %d\n", in bcm_kona_i2c_switch_to_std()
607 struct bcm_kona_i2c_dev *dev = i2c_get_adapdata(adapter); in bcm_kona_i2c_xfer() local
612 rc = clk_prepare_enable(dev->external_clk); in bcm_kona_i2c_xfer()
614 dev_err(dev->device, "%s: peri clock enable failed. err %d\n", in bcm_kona_i2c_xfer()
620 writel(0, dev->base + PADCTL_OFFSET); in bcm_kona_i2c_xfer()
623 bcm_kona_i2c_enable_clock(dev); in bcm_kona_i2c_xfer()
626 rc = bcm_kona_send_i2c_cmd(dev, BCM_CMD_START); in bcm_kona_i2c_xfer()
628 dev_err(dev->device, "Start command failed rc = %d\n", rc); in bcm_kona_i2c_xfer()
633 if (dev->hs_cfg) { in bcm_kona_i2c_xfer()
634 rc = bcm_kona_i2c_switch_to_hs(dev); in bcm_kona_i2c_xfer()
645 rc = bcm_kona_send_i2c_cmd(dev, BCM_CMD_RESTART); in bcm_kona_i2c_xfer()
647 dev_err(dev->device, in bcm_kona_i2c_xfer()
655 rc = bcm_kona_i2c_do_addr(dev, pmsg); in bcm_kona_i2c_xfer()
657 dev_err(dev->device, in bcm_kona_i2c_xfer()
666 rc = bcm_kona_i2c_read_fifo(dev, pmsg); in bcm_kona_i2c_xfer()
668 dev_err(dev->device, "read failure\n"); in bcm_kona_i2c_xfer()
672 rc = bcm_kona_i2c_write_fifo(dev, pmsg); in bcm_kona_i2c_xfer()
674 dev_err(dev->device, "write failure"); in bcm_kona_i2c_xfer()
684 bcm_kona_send_i2c_cmd(dev, BCM_CMD_STOP); in bcm_kona_i2c_xfer()
687 if (dev->hs_cfg) { in bcm_kona_i2c_xfer()
688 int hs_rc = bcm_kona_i2c_switch_to_std(dev); in bcm_kona_i2c_xfer()
696 writel(PADCTL_PAD_OUT_EN_MASK, dev->base + PADCTL_OFFSET); in bcm_kona_i2c_xfer()
699 bcm_kona_i2c_disable_clock(dev); in bcm_kona_i2c_xfer()
701 clk_disable_unprepare(dev->external_clk); in bcm_kona_i2c_xfer()
717 static int bcm_kona_i2c_assign_bus_speed(struct bcm_kona_i2c_dev *dev) in bcm_kona_i2c_assign_bus_speed() argument
720 int ret = of_property_read_u32(dev->device->of_node, "clock-frequency", in bcm_kona_i2c_assign_bus_speed()
723 dev_err(dev->device, "missing clock-frequency property\n"); in bcm_kona_i2c_assign_bus_speed()
729 dev->std_cfg = &std_cfg_table[BCM_SPD_100K]; in bcm_kona_i2c_assign_bus_speed()
732 dev->std_cfg = &std_cfg_table[BCM_SPD_400K]; in bcm_kona_i2c_assign_bus_speed()
735 dev->std_cfg = &std_cfg_table[BCM_SPD_1MHZ]; in bcm_kona_i2c_assign_bus_speed()
739 dev->std_cfg = &std_cfg_table[BCM_SPD_100K]; in bcm_kona_i2c_assign_bus_speed()
740 dev->hs_cfg = &hs_cfg_table[BCM_SPD_3P4MHZ]; in bcm_kona_i2c_assign_bus_speed()
754 struct bcm_kona_i2c_dev *dev; in bcm_kona_i2c_probe() local
759 dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); in bcm_kona_i2c_probe()
760 if (!dev) in bcm_kona_i2c_probe()
763 platform_set_drvdata(pdev, dev); in bcm_kona_i2c_probe()
764 dev->device = &pdev->dev; in bcm_kona_i2c_probe()
765 init_completion(&dev->done); in bcm_kona_i2c_probe()
769 dev->base = devm_ioremap_resource(dev->device, iomem); in bcm_kona_i2c_probe()
770 if (IS_ERR(dev->base)) in bcm_kona_i2c_probe()
774 dev->external_clk = devm_clk_get(dev->device, NULL); in bcm_kona_i2c_probe()
775 if (IS_ERR(dev->external_clk)) { in bcm_kona_i2c_probe()
776 dev_err(dev->device, "couldn't get clock\n"); in bcm_kona_i2c_probe()
780 rc = clk_set_rate(dev->external_clk, STD_EXT_CLK_FREQ); in bcm_kona_i2c_probe()
782 dev_err(dev->device, "%s: clk_set_rate returned %d\n", in bcm_kona_i2c_probe()
787 rc = clk_prepare_enable(dev->external_clk); in bcm_kona_i2c_probe()
789 dev_err(dev->device, "couldn't enable clock\n"); in bcm_kona_i2c_probe()
794 rc = bcm_kona_i2c_assign_bus_speed(dev); in bcm_kona_i2c_probe()
799 bcm_kona_i2c_enable_clock(dev); in bcm_kona_i2c_probe()
802 bcm_kona_i2c_config_timing(dev); in bcm_kona_i2c_probe()
805 writel(0, dev->base + TOUT_OFFSET); in bcm_kona_i2c_probe()
808 bcm_kona_i2c_enable_autosense(dev); in bcm_kona_i2c_probe()
812 dev->base + TXFCR_OFFSET); in bcm_kona_i2c_probe()
815 writel(0, dev->base + IER_OFFSET); in bcm_kona_i2c_probe()
824 dev->base + ISR_OFFSET); in bcm_kona_i2c_probe()
827 dev->irq = platform_get_irq(pdev, 0); in bcm_kona_i2c_probe()
828 if (dev->irq < 0) { in bcm_kona_i2c_probe()
829 dev_err(dev->device, "no irq resource\n"); in bcm_kona_i2c_probe()
835 rc = devm_request_irq(&pdev->dev, dev->irq, bcm_kona_i2c_isr, in bcm_kona_i2c_probe()
836 IRQF_SHARED, pdev->name, dev); in bcm_kona_i2c_probe()
838 dev_err(dev->device, "failed to request irq %i\n", dev->irq); in bcm_kona_i2c_probe()
843 bcm_kona_i2c_send_cmd_to_ctrl(dev, BCM_CMD_NOACTION); in bcm_kona_i2c_probe()
846 writel(PADCTL_PAD_OUT_EN_MASK, dev->base + PADCTL_OFFSET); in bcm_kona_i2c_probe()
849 bcm_kona_i2c_disable_clock(dev); in bcm_kona_i2c_probe()
852 clk_disable_unprepare(dev->external_clk); in bcm_kona_i2c_probe()
855 adap = &dev->adapter; in bcm_kona_i2c_probe()
856 i2c_set_adapdata(adap, dev); in bcm_kona_i2c_probe()
860 adap->dev.parent = &pdev->dev; in bcm_kona_i2c_probe()
861 adap->dev.of_node = pdev->dev.of_node; in bcm_kona_i2c_probe()
865 dev_err(dev->device, "failed to add adapter\n"); in bcm_kona_i2c_probe()
869 dev_info(dev->device, "device registered successfully\n"); in bcm_kona_i2c_probe()
874 bcm_kona_i2c_disable_clock(dev); in bcm_kona_i2c_probe()
875 clk_disable_unprepare(dev->external_clk); in bcm_kona_i2c_probe()
882 struct bcm_kona_i2c_dev *dev = platform_get_drvdata(pdev); in bcm_kona_i2c_remove() local
884 i2c_del_adapter(&dev->adapter); in bcm_kona_i2c_remove()