Lines Matching +full:i2c +full:- +full:lt +full:- +full:enable

1 // SPDX-License-Identifier: GPL-2.0+
3 * i2c driver for Freescale i.MX series
8 * Based on i2c-imx.c from linux kernel:
12 * Copyright (C) 2008 Darius Augulis <darius.augulis at teltonika.lt>
18 #include <asm/arch/imx-regs.h>
20 #include <asm/mach-imx/mxc_i2c.h>
22 #include <i2c.h>
146 /* start the required I2C clock */ in i2c_imx_get_clk()
147 writel(readl(&sc_regs->cgr0) | (3 << CONFIG_SYS_I2C_CLK_OFFSET), in i2c_imx_get_clk()
148 &sc_regs->cgr0); in i2c_imx_get_clk()
153 div = (i2c_clk_rate + rate - 1) / rate; in i2c_imx_get_clk()
156 else if (div > i2c_clk_div[ARRAY_SIZE(i2c_clk_div) - 1][0]) in i2c_imx_get_clk()
157 clk_div = ARRAY_SIZE(i2c_clk_div) - 1; in i2c_imx_get_clk()
167 * Set I2C Bus speed
171 ulong base = i2c_bus->base; in bus_i2c_set_bus_speed()
172 bool quirk = i2c_bus->driver_data & I2C_QUIRK_FLAG ? true : false; in bus_i2c_set_bus_speed()
178 return -EINVAL; in bus_i2c_set_bus_speed()
197 bool quirk = i2c_bus->driver_data & I2C_QUIRK_FLAG ? true : false; in wait_for_sr_state()
199 ulong base = i2c_bus->base; in wait_for_sr_state()
213 return -ERESTART; in wait_for_sr_state()
224 return -ETIMEDOUT; in wait_for_sr_state()
230 int reg_shift = i2c_bus->driver_data & I2C_QUIRK_FLAG ? in tx_byte()
232 ulong base = i2c_bus->base; in tx_byte()
241 return -EREMOTEIO; in tx_byte()
246 * Stub implementations for outer i2c slave operations.
255 * Stop I2C transaction
260 int reg_shift = i2c_bus->driver_data & I2C_QUIRK_FLAG ? in i2c_imx_stop()
262 ulong base = i2c_bus->base; in i2c_imx_stop()
281 bool quirk = i2c_bus->driver_data & I2C_QUIRK_FLAG ? true : false; in i2c_init_transfer_()
282 ulong base = i2c_bus->base; in i2c_init_transfer_()
285 /* Reset i2c slave */ in i2c_init_transfer_()
288 /* Enable I2C controller */ in i2c_init_transfer_()
307 /* Start I2C transaction */ in i2c_init_transfer_()
325 while (alen--) { in i2c_init_transfer_()
338 if (i2c_bus && i2c_bus->idle_bus_fn) in i2c_idle_bus()
339 return i2c_bus->idle_bus_fn(i2c_bus->idle_bus_data); in i2c_idle_bus()
344 * See Linux Documentation/devicetree/bindings/i2c/i2c-imx.txt
346 * scl-gpios: specify the gpio related to SCL pin
347 * sda-gpios: specify the gpio related to SDA pin
348 * add pinctrl to configure i2c pins to gpio function for i2c
356 struct udevice *bus = i2c_bus->bus; in i2c_idle_bus()
357 struct gpio_desc *scl_gpio = &i2c_bus->scl_gpio; in i2c_idle_bus()
358 struct gpio_desc *sda_gpio = &i2c_bus->sda_gpio; in i2c_idle_bus()
366 * GPIO pinctrl for i2c force idle is not a must, in i2c_idle_bus()
369 * i2c bus state. Do not return failure, because in i2c_idle_bus()
402 ret = -EBUSY; in i2c_idle_bus()
419 int reg_shift = i2c_bus->driver_data & I2C_QUIRK_FLAG ? in i2c_init_transfer()
422 if (!i2c_bus->base) in i2c_init_transfer()
423 return -EINVAL; in i2c_init_transfer()
430 if (ret == -EREMOTEIO) in i2c_init_transfer()
435 if (ret != -ERESTART) in i2c_init_transfer()
437 writeb(I2CR_IDIS, i2c_bus->base + (I2CR << reg_shift)); in i2c_init_transfer()
442 printf("%s: give up i2c_regs=0x%lx\n", __func__, i2c_bus->base); in i2c_init_transfer()
476 int reg_shift = i2c_bus->driver_data & I2C_QUIRK_FLAG ? in i2c_read_data()
478 ulong base = i2c_bus->base; in i2c_read_data()
505 if (i == (len - 1)) { in i2c_read_data()
507 } else if (i == (len - 2)) { in i2c_read_data()
527 * Read data from I2C device
534 int reg_shift = i2c_bus->driver_data & I2C_QUIRK_FLAG ? in bus_i2c_read()
536 ulong base = i2c_bus->base; in bus_i2c_read()
561 * Write data to I2C device
632 return &mxc_i2c_buses[adap->hwadapnr]; in i2c_get_base()
657 int __enable_i2c_clk(unsigned char enable, unsigned i2c_num) in __enable_i2c_clk() argument
661 int enable_i2c_clk(unsigned char enable, unsigned i2c_num)
670 debug("Error i2c index\n"); in bus_i2c_init()
676 * variable here. This function could be called while U-Boot is in bus_i2c_init()
687 debug("I2C-%d clk fail to enable.\n", index); in bus_i2c_init()
695 * Early init I2C for prepare read the clk through I2C.
704 /* Set I2C divider value */ in i2c_early_init_f()
709 /* Enable I2C */ in i2c_early_init_f()
714 * Init I2C Bus
718 bus_i2c_init(adap->hwadapnr, speed, slaveaddr, NULL, NULL); in mxc_i2c_init()
722 * Set I2C Speed
730 * Register mxc i2c adapters
808 const void *fdt = gd->fdt_blob;
813 i2c_bus->driver_data = dev_get_driver_data(bus);
817 return -EINVAL;
819 i2c_bus->base = addr;
820 i2c_bus->index = bus->seq;
821 i2c_bus->bus = bus;
823 /* Enable clk */
824 ret = enable_i2c_clk(1, bus->seq);
829 * See Documentation/devicetree/bindings/i2c/i2c-imx.txt
832 ret = fdt_stringlist_search(fdt, node, "pinctrl-names", "gpio");
834 debug("i2c bus %d at 0x%2lx, no gpio pinctrl state.\n", bus->seq, i2c_bus->base);
837 "scl-gpios", 0, &i2c_bus->scl_gpio,
840 "sda-gpios", 0, &i2c_bus->sda_gpio,
842 if (!dm_gpio_is_valid(&i2c_bus->sda_gpio) ||
843 !dm_gpio_is_valid(&i2c_bus->scl_gpio) ||
845 dev_err(dev, "i2c bus %d at %lu, fail to request scl/sda gpio\n", bus->seq, i2c_bus->base);
846 return -EINVAL;
853 enable_i2c_clk(0, bus->seq);
862 debug("i2c : controller bus %d at %lu , speed %d: ",
863 bus->seq, i2c_bus->base,
864 i2c_bus->speed);
890 ulong base = i2c_bus->base;
891 int reg_shift = i2c_bus->driver_data & I2C_QUIRK_FLAG ?
899 ret = i2c_init_transfer(i2c_bus, msg->addr, 0, 0);
905 for (; nmsgs > 0; nmsgs--, msg++) {
907 debug("i2c_xfer: chip=0x%x, len=0x%x\n", msg->addr, msg->len);
908 if (msg->flags & I2C_M_RD)
909 ret = i2c_read_data(i2c_bus, msg->addr, msg->buf,
910 msg->len);
912 ret = i2c_write_data(i2c_bus, msg->addr, msg->buf,
913 msg->len);
922 ret = tx_byte(i2c_bus, (msg->addr << 1) | 1);
946 { .compatible = "fsl,imx21-i2c", },
947 { .compatible = "fsl,vf610-i2c", .data = I2C_QUIRK_FLAG, },