mirror of
https://git.codelinaro.org/clo/qsdk/oss/boot/u-boot-2016.git
synced 2025-12-10 07:44:53 +01:00
drivers: i2c: qup: Add multiple I2C bus support
Added support for multiple i2c alias in device-tree so as to enable multiple qup i2c modules. Change-Id: I58b1b91c66e3b42cc5d603ce29f94e90b6d86ae1 Signed-off-by: Gokul Sriram Palanisamy <quic_gokulsri@quicinc.com>
This commit is contained in:
parent
6ae5d30ef1
commit
08c3332f34
2 changed files with 51 additions and 31 deletions
|
|
@ -26,23 +26,30 @@ void i2c_clock_config()
|
|||
int cfg, i2c_id;
|
||||
int i2c_node;
|
||||
const u32 *i2c_base;
|
||||
int i;
|
||||
char alias[6];
|
||||
|
||||
i2c_node = fdt_path_offset(gd->fdt_blob, "i2c0");
|
||||
if (i2c_node >= 0) {
|
||||
i2c_base = fdt_getprop(gd->fdt_blob, i2c_node, "reg", NULL);
|
||||
if (i2c_base) {
|
||||
i2c_id = I2C_PORT_ID(fdt32_to_cpu(i2c_base[0]));
|
||||
/* Configure qup1_i2c_apps_clk_src */
|
||||
cfg = (GCC_BLSP1_QUP1_I2C_APPS_CFG_RCGR_SRC_SEL |
|
||||
GCC_BLSP1_QUP1_I2C_APPS_CFG_RCGR_SRC_DIV);
|
||||
writel(cfg, GCC_BLSP1_QUP_I2C_APPS_CFG_RCGR(i2c_id));
|
||||
for (i = 0; i < CONFIG_IPQ_MAX_BLSP_QUPS; i++) {
|
||||
memset(alias, 0, 6);
|
||||
snprintf(alias, 5, "i2c%d", i);
|
||||
|
||||
writel(CMD_UPDATE, GCC_BLSP1_QUP_I2C_APPS_CMD_RCGR(i2c_id));
|
||||
mdelay(100);
|
||||
writel(ROOT_EN, GCC_BLSP1_QUP_I2C_APPS_CMD_RCGR(i2c_id));
|
||||
i2c_node = fdt_path_offset(gd->fdt_blob, alias);
|
||||
if (i2c_node >= 0) {
|
||||
i2c_base = fdt_getprop(gd->fdt_blob, i2c_node, "reg", NULL);
|
||||
if (i2c_base) {
|
||||
i2c_id = I2C_PORT_ID(fdt32_to_cpu(i2c_base[0]));
|
||||
/* Configure qup1_i2c_apps_clk_src */
|
||||
cfg = (GCC_BLSP1_QUP1_I2C_APPS_CFG_RCGR_SRC_SEL |
|
||||
GCC_BLSP1_QUP1_I2C_APPS_CFG_RCGR_SRC_DIV);
|
||||
writel(cfg, GCC_BLSP1_QUP_I2C_APPS_CFG_RCGR(i2c_id));
|
||||
|
||||
/* Configure CBCR */
|
||||
writel(CLK_ENABLE, GCC_BLSP1_QUP_I2C_APPS_CBCR(i2c_id));
|
||||
writel(CMD_UPDATE, GCC_BLSP1_QUP_I2C_APPS_CMD_RCGR(i2c_id));
|
||||
mdelay(100);
|
||||
writel(ROOT_EN, GCC_BLSP1_QUP_I2C_APPS_CMD_RCGR(i2c_id));
|
||||
|
||||
/* Configure CBCR */
|
||||
writel(CLK_ENABLE, GCC_BLSP1_QUP_I2C_APPS_CBCR(i2c_id));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
DECLARE_GLOBAL_DATA_PTR;
|
||||
static int src_clk_freq;
|
||||
static int i2c_base_addr;
|
||||
static int i2c_hw_initialized;
|
||||
static int i2c_board_initialized;
|
||||
static int io_mode;
|
||||
static int clk_en;
|
||||
|
|
@ -36,6 +35,7 @@ static int qup_i2c_start_seq;
|
|||
|
||||
struct i2c_qup_bus {
|
||||
int *i2c_base_addr;
|
||||
int i2c_hw_initialized;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -113,12 +113,19 @@ void config_i2c_mode(void)
|
|||
void config_i2c_gpio(void)
|
||||
{
|
||||
int i2c_node, gpio_node;
|
||||
int i;
|
||||
char alias[6];
|
||||
|
||||
i2c_node = fdt_path_offset(gd->fdt_blob, "i2c0");
|
||||
if (i2c_node >= 0) {
|
||||
gpio_node = fdt_subnode_offset(gd->fdt_blob, i2c_node, "i2c_gpio");
|
||||
if (gpio_node >= 0)
|
||||
qca_gpio_init(gpio_node);
|
||||
for (i = 0; i < CONFIG_IPQ_MAX_BLSP_QUPS; i++) {
|
||||
memset(alias, 0, 6);
|
||||
snprintf(alias, 5, "i2c%d", i);
|
||||
|
||||
i2c_node = fdt_path_offset(gd->fdt_blob, alias);
|
||||
if (i2c_node >= 0) {
|
||||
gpio_node = fdt_subnode_offset(gd->fdt_blob, i2c_node, "i2c_gpio");
|
||||
if (gpio_node >= 0)
|
||||
qca_gpio_init(gpio_node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -126,7 +133,7 @@ void i2c_qca_board_init(struct i2c_qup_bus *i2c_bus)
|
|||
{
|
||||
config_i2c_gpio();
|
||||
i2c_clock_config();
|
||||
i2c_hw_initialized = 0;
|
||||
i2c_bus->i2c_hw_initialized = 0;
|
||||
i2c_board_initialized = 1;
|
||||
}
|
||||
|
||||
|
|
@ -181,8 +188,6 @@ static int i2c_hw_init(int qup_version)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
i2c_hw_initialized = 1;
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -351,8 +356,10 @@ int i2c_read_data(struct i2c_qup_bus *i2c_bus, uchar chip, uint addr, int alen,
|
|||
i2c_qca_board_init(i2c_bus);
|
||||
}
|
||||
|
||||
if (!i2c_hw_initialized) {
|
||||
i2c_hw_init(qup_v2);
|
||||
if (!i2c_bus->i2c_hw_initialized) {
|
||||
ret = i2c_hw_init(qup_v2);
|
||||
if (ret == SUCCESS)
|
||||
i2c_bus->i2c_hw_initialized = 1;
|
||||
}
|
||||
|
||||
writel(0x3C, i2c_base_addr + QUP_ERROR_FLAGS_OFFSET);
|
||||
|
|
@ -459,8 +466,10 @@ int i2c_read_data_qup_v1(struct i2c_qup_bus *i2c_bus, uchar chip, uint addr, int
|
|||
i2c_qca_board_init(i2c_bus);
|
||||
}
|
||||
|
||||
if (!i2c_hw_initialized) {
|
||||
i2c_hw_init(qup_v1);
|
||||
if (!i2c_bus->i2c_hw_initialized) {
|
||||
ret = i2c_hw_init(qup_v1);
|
||||
if (ret == SUCCESS)
|
||||
i2c_bus->i2c_hw_initialized = 1;
|
||||
}
|
||||
|
||||
writel(0x3C, i2c_base_addr + QUP_ERROR_FLAGS_OFFSET);
|
||||
|
|
@ -580,8 +589,10 @@ int i2c_write_data_qup_v1(struct i2c_qup_bus *i2c_bus, uchar chip, uint addr,
|
|||
i2c_qca_board_init(i2c_bus);
|
||||
}
|
||||
|
||||
if(!i2c_hw_initialized) {
|
||||
i2c_hw_init(qup_v1);
|
||||
if(!i2c_bus->i2c_hw_initialized) {
|
||||
ret = i2c_hw_init(qup_v1);
|
||||
if (ret == SUCCESS)
|
||||
i2c_bus->i2c_hw_initialized = 1;
|
||||
}
|
||||
|
||||
/* Set to RUN state */
|
||||
|
|
@ -653,8 +664,10 @@ int i2c_write_data(struct i2c_qup_bus *i2c_bus, uchar chip, uint addr, int alen,
|
|||
i2c_qca_board_init(i2c_bus);
|
||||
}
|
||||
|
||||
if (!i2c_hw_initialized) {
|
||||
i2c_hw_init(qup_v2);
|
||||
if (!i2c_bus->i2c_hw_initialized) {
|
||||
ret = i2c_hw_init(qup_v2);
|
||||
if (ret == SUCCESS)
|
||||
i2c_bus->i2c_hw_initialized = 1;
|
||||
}
|
||||
|
||||
writel(0x3C, i2c_base_addr + QUP_ERROR_FLAGS_OFFSET);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue