1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #ifndef __ASM_ARCH_MXC_MXC_I2C_H__ 7*4882a593Smuzhiyun #define __ASM_ARCH_MXC_MXC_I2C_H__ 8*4882a593Smuzhiyun #include <asm-generic/gpio.h> 9*4882a593Smuzhiyun #include <asm/mach-imx/iomux-v3.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun struct i2c_pin_ctrl { 12*4882a593Smuzhiyun iomux_v3_cfg_t i2c_mode; 13*4882a593Smuzhiyun iomux_v3_cfg_t gpio_mode; 14*4882a593Smuzhiyun unsigned char gp; 15*4882a593Smuzhiyun unsigned char spare; 16*4882a593Smuzhiyun }; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun struct i2c_pads_info { 19*4882a593Smuzhiyun struct i2c_pin_ctrl scl; 20*4882a593Smuzhiyun struct i2c_pin_ctrl sda; 21*4882a593Smuzhiyun }; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* 24*4882a593Smuzhiyun * Information about i2c controller 25*4882a593Smuzhiyun * struct mxc_i2c_bus - information about the i2c[x] bus 26*4882a593Smuzhiyun * @index: i2c bus index 27*4882a593Smuzhiyun * @base: Address of I2C bus controller 28*4882a593Smuzhiyun * @driver_data: Flags for different platforms, such as I2C_QUIRK_FLAG. 29*4882a593Smuzhiyun * @speed: Speed of I2C bus 30*4882a593Smuzhiyun * @pads_info: pinctrl info for this i2c bus, will be used when pinctrl is ok. 31*4882a593Smuzhiyun * The following two is only to be compatible with non-DM part. 32*4882a593Smuzhiyun * @idle_bus_fn: function to force bus idle 33*4882a593Smuzhiyun * @idle_bus_data: parameter for idle_bus_fun 34*4882a593Smuzhiyun * For DM: 35*4882a593Smuzhiyun * bus: The device structure for i2c bus controller 36*4882a593Smuzhiyun * scl-gpio: specify the gpio related to SCL pin 37*4882a593Smuzhiyun * sda-gpio: specify the gpio related to SDA pin 38*4882a593Smuzhiyun */ 39*4882a593Smuzhiyun struct mxc_i2c_bus { 40*4882a593Smuzhiyun /* 41*4882a593Smuzhiyun * board file can use this index to locate which i2c_pads_info is for 42*4882a593Smuzhiyun * i2c_idle_bus. When pinmux is implement, this entry can be 43*4882a593Smuzhiyun * discarded. Here we do not use dev->seq, because we do not want to 44*4882a593Smuzhiyun * export device to board file. 45*4882a593Smuzhiyun */ 46*4882a593Smuzhiyun int index; 47*4882a593Smuzhiyun ulong base; 48*4882a593Smuzhiyun ulong driver_data; 49*4882a593Smuzhiyun int speed; 50*4882a593Smuzhiyun struct i2c_pads_info *pads_info; 51*4882a593Smuzhiyun #ifndef CONFIG_DM_I2C 52*4882a593Smuzhiyun int (*idle_bus_fn)(void *p); 53*4882a593Smuzhiyun void *idle_bus_data; 54*4882a593Smuzhiyun #else 55*4882a593Smuzhiyun struct udevice *bus; 56*4882a593Smuzhiyun /* Use gpio to force bus idle when bus state is abnormal */ 57*4882a593Smuzhiyun struct gpio_desc scl_gpio; 58*4882a593Smuzhiyun struct gpio_desc sda_gpio; 59*4882a593Smuzhiyun #endif 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #if defined(CONFIG_MX6QDL) 63*4882a593Smuzhiyun #define I2C_PADS(name, scl_i2c, scl_gpio, scl_gp, sda_i2c, sda_gpio, sda_gp) \ 64*4882a593Smuzhiyun struct i2c_pads_info mx6q_##name = { \ 65*4882a593Smuzhiyun .scl = { \ 66*4882a593Smuzhiyun .i2c_mode = MX6Q_##scl_i2c, \ 67*4882a593Smuzhiyun .gpio_mode = MX6Q_##scl_gpio, \ 68*4882a593Smuzhiyun .gp = scl_gp, \ 69*4882a593Smuzhiyun }, \ 70*4882a593Smuzhiyun .sda = { \ 71*4882a593Smuzhiyun .i2c_mode = MX6Q_##sda_i2c, \ 72*4882a593Smuzhiyun .gpio_mode = MX6Q_##sda_gpio, \ 73*4882a593Smuzhiyun .gp = sda_gp, \ 74*4882a593Smuzhiyun } \ 75*4882a593Smuzhiyun }; \ 76*4882a593Smuzhiyun struct i2c_pads_info mx6s_##name = { \ 77*4882a593Smuzhiyun .scl = { \ 78*4882a593Smuzhiyun .i2c_mode = MX6DL_##scl_i2c, \ 79*4882a593Smuzhiyun .gpio_mode = MX6DL_##scl_gpio, \ 80*4882a593Smuzhiyun .gp = scl_gp, \ 81*4882a593Smuzhiyun }, \ 82*4882a593Smuzhiyun .sda = { \ 83*4882a593Smuzhiyun .i2c_mode = MX6DL_##sda_i2c, \ 84*4882a593Smuzhiyun .gpio_mode = MX6DL_##sda_gpio, \ 85*4882a593Smuzhiyun .gp = sda_gp, \ 86*4882a593Smuzhiyun } \ 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun #define I2C_PADS_INFO(name) \ 91*4882a593Smuzhiyun (is_cpu_type(MXC_CPU_MX6Q) || is_cpu_type(MXC_CPU_MX6D)) ? \ 92*4882a593Smuzhiyun &mx6q_##name : &mx6s_##name 93*4882a593Smuzhiyun #endif 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun int setup_i2c(unsigned i2c_index, int speed, int slave_addr, 96*4882a593Smuzhiyun struct i2c_pads_info *p); 97*4882a593Smuzhiyun void bus_i2c_init(int index, int speed, int slave_addr, 98*4882a593Smuzhiyun int (*idle_bus_fn)(void *p), void *p); 99*4882a593Smuzhiyun int force_idle_bus(void *priv); 100*4882a593Smuzhiyun int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus); 101*4882a593Smuzhiyun #endif 102