Lines Matching +full:keystone +full:- +full:gpio
1 // SPDX-License-Identifier: GPL-2.0-or-later
10 * ----------------------------------------------------------------------------
12 * ----------------------------------------------------------------------------
20 #include <linux/gpio/consumer.h>
32 /* ----- global defines ----------------------------------------------- */
94 /* set SDA and SCL as GPIO */
97 /* set SCL as output when used as GPIO*/
99 /* set SDA as output when used as GPIO*/
102 /* read SCL GPIO level */
104 /* read SDA GPIO level */
107 /*set the SCL GPIO high */
109 /*set the SDA GPIO high */
112 /* set the SCL GPIO low */
114 /* set the SDA GPIO low */
146 writew_relaxed(val, i2c_dev->base + reg); in davinci_i2c_write_reg()
151 return readw_relaxed(i2c_dev->base + reg); in davinci_i2c_read_reg()
175 u32 input_clock = clk_get_rate(dev->clk); in i2c_davinci_calc_clk_dividers()
180 * input clk --> PSC Div -----------> ICCL/H Div --> output clock in i2c_davinci_calc_clk_dividers()
186 * (ICCL + ICCH) = clk = (input clk / ((psc +1) * output clk)) - 2d; in i2c_davinci_calc_clk_dividers()
193 * d is always 6 on Keystone I2C controller in i2c_davinci_calc_clk_dividers()
197 * Both Davinci and current Keystone User Guides recommend a value in i2c_davinci_calc_clk_dividers()
204 psc = (input_clock / 12000000) - 1; in i2c_davinci_calc_clk_dividers()
207 d = (psc >= 2) ? 5 : 7 - psc; in i2c_davinci_calc_clk_dividers()
209 if (device_is_compatible(dev->dev, "ti,keystone-i2c")) in i2c_davinci_calc_clk_dividers()
212 clk = ((input_clock / (psc + 1)) / (dev->bus_freq * 1000)); in i2c_davinci_calc_clk_dividers()
214 if (input_clock / (psc + 1) / clk > dev->bus_freq * 1000) in i2c_davinci_calc_clk_dividers()
217 * According to I2C-BUS Spec 2.1, in FAST-MODE LOW period should be at in i2c_davinci_calc_clk_dividers()
221 if (dev->bus_freq > 100) in i2c_davinci_calc_clk_dividers()
234 clkh = clk - clkl - d; in i2c_davinci_calc_clk_dividers()
235 clkl -= d; in i2c_davinci_calc_clk_dividers()
238 clkl = clk - (d << 1); in i2c_davinci_calc_clk_dividers()
245 dev_dbg(dev->dev, "input_clock = %d, CLK = %d\n", input_clock, clk); in i2c_davinci_calc_clk_dividers()
266 dev_dbg(dev->dev, "PSC = %d\n", in i2c_davinci_init()
268 dev_dbg(dev->dev, "CLKL = %d\n", in i2c_davinci_init()
270 dev_dbg(dev->dev, "CLKH = %d\n", in i2c_davinci_init()
272 dev_dbg(dev->dev, "bus_freq = %dkHz\n", dev->bus_freq); in i2c_davinci_init()
347 /* change to GPIO mode */ in davinci_i2c_scl_prepare_recovery()
376 unsigned long timeout = jiffies + dev->adapter.timeout; in i2c_davinci_wait_bus_not_busy()
384 dev_warn(dev->dev, "timeout waiting for bus ready\n"); in i2c_davinci_wait_bus_not_busy()
385 i2c_recover_bus(&dev->adapter); in i2c_davinci_wait_bus_not_busy()
389 * short-circuit in i2c_davinci_wait_bus_not_busy()
392 return -EIO; in i2c_davinci_wait_bus_not_busy()
409 if (msg->addr == DAVINCI_I2C_OWN_ADDRESS) { in i2c_davinci_xfer_msg()
410 dev_warn(dev->dev, "transfer to own address aborted\n"); in i2c_davinci_xfer_msg()
411 return -EADDRNOTAVAIL; in i2c_davinci_xfer_msg()
415 davinci_i2c_write_reg(dev, DAVINCI_I2C_SAR_REG, msg->addr); in i2c_davinci_xfer_msg()
417 dev->buf = msg->buf; in i2c_davinci_xfer_msg()
418 dev->buf_len = msg->len; in i2c_davinci_xfer_msg()
419 dev->stop = stop; in i2c_davinci_xfer_msg()
421 davinci_i2c_write_reg(dev, DAVINCI_I2C_CNT_REG, dev->buf_len); in i2c_davinci_xfer_msg()
423 reinit_completion(&dev->cmd_complete); in i2c_davinci_xfer_msg()
424 dev->cmd_err = 0; in i2c_davinci_xfer_msg()
429 if (msg->flags & I2C_M_TEN) in i2c_davinci_xfer_msg()
431 if (!(msg->flags & I2C_M_RD)) in i2c_davinci_xfer_msg()
433 if (msg->len == 0) in i2c_davinci_xfer_msg()
438 if (msg->flags & I2C_M_RD) in i2c_davinci_xfer_msg()
444 dev->terminate = 0; in i2c_davinci_xfer_msg()
448 * on OMAP-L138, but don't set STT yet to avoid a race with XRDY in i2c_davinci_xfer_msg()
455 * because transmit-data-ready interrupt can come before in i2c_davinci_xfer_msg()
456 * NACK-interrupt during sending of previous message and in i2c_davinci_xfer_msg()
460 if ((!(msg->flags & I2C_M_RD)) && dev->buf_len) { in i2c_davinci_xfer_msg()
461 davinci_i2c_write_reg(dev, DAVINCI_I2C_DXR_REG, *dev->buf++); in i2c_davinci_xfer_msg()
462 dev->buf_len--; in i2c_davinci_xfer_msg()
467 if (stop && msg->len != 0) in i2c_davinci_xfer_msg()
471 time_left = wait_for_completion_timeout(&dev->cmd_complete, in i2c_davinci_xfer_msg()
472 dev->adapter.timeout); in i2c_davinci_xfer_msg()
475 dev->buf_len = 0; in i2c_davinci_xfer_msg()
476 return -ETIMEDOUT; in i2c_davinci_xfer_msg()
478 if (dev->buf_len) { in i2c_davinci_xfer_msg()
480 * or dev->cmd_err denotes an error. in i2c_davinci_xfer_msg()
482 dev_err(dev->dev, "abnormal termination buf_len=%zu\n", in i2c_davinci_xfer_msg()
483 dev->buf_len); in i2c_davinci_xfer_msg()
484 dev->terminate = 1; in i2c_davinci_xfer_msg()
486 dev->buf_len = 0; in i2c_davinci_xfer_msg()
487 return -EREMOTEIO; in i2c_davinci_xfer_msg()
491 if (likely(!dev->cmd_err)) in i2c_davinci_xfer_msg()
492 return msg->len; in i2c_davinci_xfer_msg()
495 if (dev->cmd_err & DAVINCI_I2C_STR_AL) { in i2c_davinci_xfer_msg()
497 return -EIO; in i2c_davinci_xfer_msg()
500 if (dev->cmd_err & DAVINCI_I2C_STR_NACK) { in i2c_davinci_xfer_msg()
501 if (msg->flags & I2C_M_IGNORE_NAK) in i2c_davinci_xfer_msg()
502 return msg->len; in i2c_davinci_xfer_msg()
506 return -EREMOTEIO; in i2c_davinci_xfer_msg()
508 return -EIO; in i2c_davinci_xfer_msg()
521 dev_dbg(dev->dev, "%s: msgs: %d\n", __func__, num); in i2c_davinci_xfer()
523 ret = pm_runtime_resume_and_get(dev->dev); in i2c_davinci_xfer()
525 dev_err(dev->dev, "Failed to runtime_get device: %d\n", ret); in i2c_davinci_xfer()
531 dev_warn(dev->dev, "timeout waiting for bus ready\n"); in i2c_davinci_xfer()
536 ret = i2c_davinci_xfer_msg(adap, &msgs[i], (i == (num - 1))); in i2c_davinci_xfer()
537 dev_dbg(dev->dev, "%s [%d/%d] ret: %d\n", __func__, i + 1, num, in i2c_davinci_xfer()
546 pm_runtime_mark_last_busy(dev->dev); in i2c_davinci_xfer()
547 pm_runtime_put_autosuspend(dev->dev); in i2c_davinci_xfer()
565 if (!dev->terminate) in terminate_read()
566 dev_err(dev->dev, "RDR IRQ while no data requested\n"); in terminate_read()
574 if (!dev->terminate) in terminate_write()
575 dev_dbg(dev->dev, "TDR IRQ while no data to send\n"); in terminate_write()
589 if (pm_runtime_suspended(dev->dev)) in i2c_davinci_isr()
593 dev_dbg(dev->dev, "%s: stat=0x%x\n", __func__, stat); in i2c_davinci_isr()
595 dev_warn(dev->dev, "Too much work in one IRQ\n"); in i2c_davinci_isr()
602 dev->cmd_err |= DAVINCI_I2C_STR_AL; in i2c_davinci_isr()
603 dev->buf_len = 0; in i2c_davinci_isr()
604 complete(&dev->cmd_complete); in i2c_davinci_isr()
608 dev->cmd_err |= DAVINCI_I2C_STR_NACK; in i2c_davinci_isr()
609 dev->buf_len = 0; in i2c_davinci_isr()
610 complete(&dev->cmd_complete); in i2c_davinci_isr()
616 if (((dev->buf_len == 0) && (dev->stop != 0)) || in i2c_davinci_isr()
617 (dev->cmd_err & DAVINCI_I2C_STR_NACK)) { in i2c_davinci_isr()
624 complete(&dev->cmd_complete); in i2c_davinci_isr()
628 if (dev->buf_len) { in i2c_davinci_isr()
629 *dev->buf++ = in i2c_davinci_isr()
632 dev->buf_len--; in i2c_davinci_isr()
633 if (dev->buf_len) in i2c_davinci_isr()
646 if (dev->buf_len) { in i2c_davinci_isr()
648 *dev->buf++); in i2c_davinci_isr()
649 dev->buf_len--; in i2c_davinci_isr()
650 if (dev->buf_len) in i2c_davinci_isr()
668 complete(&dev->cmd_complete); in i2c_davinci_isr()
672 dev_dbg(dev->dev, "Address as target interrupt\n"); in i2c_davinci_isr()
676 dev_warn(dev->dev, "Unrecognized irq stat %d\n", stat); in i2c_davinci_isr()
692 i2c_lock_bus(&dev->adapter, I2C_LOCK_ROOT_ADAPTER); in i2c_davinci_cpufreq_transition()
699 i2c_unlock_bus(&dev->adapter, I2C_LOCK_ROOT_ADAPTER); in i2c_davinci_cpufreq_transition()
706 dev->freq_transition.notifier_call = i2c_davinci_cpufreq_transition; in i2c_davinci_cpufreq_register()
708 return cpufreq_register_notifier(&dev->freq_transition, in i2c_davinci_cpufreq_register()
714 cpufreq_unregister_notifier(&dev->freq_transition, in i2c_davinci_cpufreq_deregister()
734 {.compatible = "ti,davinci-i2c", },
735 {.compatible = "ti,keystone-i2c", },
751 dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); in davinci_i2c_probe()
753 return -ENOMEM; in davinci_i2c_probe()
755 init_completion(&dev->cmd_complete); in davinci_i2c_probe()
757 dev->dev = &pdev->dev; in davinci_i2c_probe()
758 dev->irq = irq; in davinci_i2c_probe()
761 r = device_property_read_u32(&pdev->dev, "clock-frequency", &prop); in davinci_i2c_probe()
765 dev->bus_freq = prop / 1000; in davinci_i2c_probe()
767 dev->has_pfunc = device_property_present(&pdev->dev, "ti,has-pfunc"); in davinci_i2c_probe()
769 dev->clk = devm_clk_get(&pdev->dev, NULL); in davinci_i2c_probe()
770 if (IS_ERR(dev->clk)) in davinci_i2c_probe()
771 return PTR_ERR(dev->clk); in davinci_i2c_probe()
773 dev->base = devm_platform_ioremap_resource(pdev, 0); in davinci_i2c_probe()
774 if (IS_ERR(dev->base)) { in davinci_i2c_probe()
775 return PTR_ERR(dev->base); in davinci_i2c_probe()
778 pm_runtime_set_autosuspend_delay(dev->dev, in davinci_i2c_probe()
780 pm_runtime_use_autosuspend(dev->dev); in davinci_i2c_probe()
782 pm_runtime_enable(dev->dev); in davinci_i2c_probe()
784 r = pm_runtime_resume_and_get(dev->dev); in davinci_i2c_probe()
786 dev_err(dev->dev, "failed to runtime_get device: %d\n", r); in davinci_i2c_probe()
792 r = devm_request_irq(&pdev->dev, dev->irq, i2c_davinci_isr, 0, in davinci_i2c_probe()
793 pdev->name, dev); in davinci_i2c_probe()
795 dev_err(&pdev->dev, "failure requesting irq %i\n", dev->irq); in davinci_i2c_probe()
801 dev_err(&pdev->dev, "failed to register cpufreq\n"); in davinci_i2c_probe()
805 adap = &dev->adapter; in davinci_i2c_probe()
807 adap->owner = THIS_MODULE; in davinci_i2c_probe()
808 adap->class = I2C_CLASS_DEPRECATED; in davinci_i2c_probe()
809 strscpy(adap->name, "DaVinci I2C adapter", sizeof(adap->name)); in davinci_i2c_probe()
810 adap->algo = &i2c_davinci_algo; in davinci_i2c_probe()
811 adap->dev.parent = &pdev->dev; in davinci_i2c_probe()
812 adap->timeout = DAVINCI_I2C_TIMEOUT; in davinci_i2c_probe()
813 adap->dev.of_node = dev_of_node(&pdev->dev); in davinci_i2c_probe()
815 if (dev->has_pfunc) in davinci_i2c_probe()
816 adap->bus_recovery_info = &davinci_i2c_scl_recovery_info; in davinci_i2c_probe()
818 adap->nr = pdev->id; in davinci_i2c_probe()
823 pm_runtime_mark_last_busy(dev->dev); in davinci_i2c_probe()
824 pm_runtime_put_autosuspend(dev->dev); in davinci_i2c_probe()
829 pm_runtime_dont_use_autosuspend(dev->dev); in davinci_i2c_probe()
830 pm_runtime_put_sync(dev->dev); in davinci_i2c_probe()
832 pm_runtime_disable(dev->dev); in davinci_i2c_probe()
844 i2c_del_adapter(&dev->adapter); in davinci_i2c_remove()
846 ret = pm_runtime_get_sync(&pdev->dev); in davinci_i2c_remove()
848 dev_err(&pdev->dev, "Failed to resume device\n"); in davinci_i2c_remove()
852 pm_runtime_dont_use_autosuspend(dev->dev); in davinci_i2c_remove()
853 pm_runtime_put_sync(dev->dev); in davinci_i2c_remove()
854 pm_runtime_disable(dev->dev); in davinci_i2c_remove()