u-boot/arch/arm/include/asm/mach-imx/mxc_i2c.h
Simon Glass 8b85dfc675 dm: Avoid accessing seq directly
At present various drivers etc. access the device's 'seq' member directly.
This makes it harder to change the meaning of that member. Change access
to go through a function instead.

The drivers/i2c/lpc32xx_i2c.c file is left unchanged for now.

Signed-off-by: Simon Glass <sjg@chromium.org>
2020-12-18 20:32:21 -07:00

105 lines
2.8 KiB
C

/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
*/
#ifndef __ASM_ARCH_MXC_MXC_I2C_H__
#define __ASM_ARCH_MXC_MXC_I2C_H__
#include <asm-generic/gpio.h>
#include <asm/mach-imx/iomux-v3.h>
#if CONFIG_IS_ENABLED(CLK)
#include <clk.h>
#endif
struct i2c_pin_ctrl {
iomux_v3_cfg_t i2c_mode;
iomux_v3_cfg_t gpio_mode;
unsigned char gp;
unsigned char spare;
};
struct i2c_pads_info {
struct i2c_pin_ctrl scl;
struct i2c_pin_ctrl sda;
};
/*
* Information about i2c controller
* struct mxc_i2c_bus - information about the i2c[x] bus
* @index: i2c bus index
* @base: Address of I2C bus controller
* @driver_data: Flags for different platforms, such as I2C_QUIRK_FLAG.
* @speed: Speed of I2C bus
* @pads_info: pinctrl info for this i2c bus, will be used when pinctrl is ok.
* The following two is only to be compatible with non-DM part.
* @idle_bus_fn: function to force bus idle
* @idle_bus_data: parameter for idle_bus_fun
* For DM:
* bus: The device structure for i2c bus controller
* scl-gpio: specify the gpio related to SCL pin
* sda-gpio: specify the gpio related to SDA pin
*/
struct mxc_i2c_bus {
/*
* board file can use this index to locate which i2c_pads_info is for
* i2c_idle_bus. When pinmux is implement, this entry can be
* discarded. Here we do not use dev_seq(dev), because we do not want to
* export device to board file.
*/
int index;
ulong base;
ulong driver_data;
int speed;
struct i2c_pads_info *pads_info;
#if CONFIG_IS_ENABLED(CLK)
struct clk per_clk;
#endif
#ifndef CONFIG_DM_I2C
int (*idle_bus_fn)(void *p);
void *idle_bus_data;
#else
struct udevice *bus;
/* Use gpio to force bus idle when bus state is abnormal */
struct gpio_desc scl_gpio;
struct gpio_desc sda_gpio;
#endif
};
#if defined(CONFIG_MX6QDL)
#define I2C_PADS(name, scl_i2c, scl_gpio, scl_gp, sda_i2c, sda_gpio, sda_gp) \
struct i2c_pads_info mx6q_##name = { \
.scl = { \
.i2c_mode = MX6Q_##scl_i2c, \
.gpio_mode = MX6Q_##scl_gpio, \
.gp = scl_gp, \
}, \
.sda = { \
.i2c_mode = MX6Q_##sda_i2c, \
.gpio_mode = MX6Q_##sda_gpio, \
.gp = sda_gp, \
} \
}; \
struct i2c_pads_info mx6s_##name = { \
.scl = { \
.i2c_mode = MX6DL_##scl_i2c, \
.gpio_mode = MX6DL_##scl_gpio, \
.gp = scl_gp, \
}, \
.sda = { \
.i2c_mode = MX6DL_##sda_i2c, \
.gpio_mode = MX6DL_##sda_gpio, \
.gp = sda_gp, \
} \
};
#define I2C_PADS_INFO(name) \
(is_mx6dq() || is_mx6dqp()) ? &mx6q_##name : &mx6s_##name
#endif
int setup_i2c(unsigned i2c_index, int speed, int slave_addr,
struct i2c_pads_info *p);
void bus_i2c_init(int index, int speed, int slave_addr,
int (*idle_bus_fn)(void *p), void *p);
int force_idle_bus(void *priv);
int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus);
#endif