imx: Add error checking to setup_i2c()
Since this function can fail, check its return value. Signed-off-by: Simon Glass <sjg@chromium.org> Tested-by: Nikita Kiryanov <nikita@compulab.co.il>
This commit is contained in:
parent
b8893327e9
commit
edbf8b4f8c
|
@ -69,15 +69,29 @@ static void * const i2c_bases[] = {
|
|||
};
|
||||
|
||||
/* i2c_index can be from 0 - 2 */
|
||||
void setup_i2c(unsigned i2c_index, int speed, int slave_addr,
|
||||
int setup_i2c(unsigned i2c_index, int speed, int slave_addr,
|
||||
struct i2c_pads_info *p)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (i2c_index >= ARRAY_SIZE(i2c_bases))
|
||||
return;
|
||||
return -EINVAL;
|
||||
/* Enable i2c clock */
|
||||
enable_i2c_clk(1, i2c_index);
|
||||
ret = enable_i2c_clk(1, i2c_index);
|
||||
if (ret)
|
||||
goto err_clk;
|
||||
|
||||
/* Make sure bus is idle */
|
||||
force_idle_bus(p);
|
||||
ret = force_idle_bus(p);
|
||||
if (ret)
|
||||
goto err_idle;
|
||||
|
||||
bus_i2c_init(i2c_bases[i2c_index], speed, slave_addr,
|
||||
force_idle_bus, p);
|
||||
|
||||
return 0;
|
||||
|
||||
err_idle:
|
||||
err_clk:
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ struct i2c_pads_info {
|
|||
&mx6q_##name : &mx6s_##name
|
||||
#endif
|
||||
|
||||
void setup_i2c(unsigned i2c_index, int speed, int slave_addr,
|
||||
int setup_i2c(unsigned i2c_index, int speed, int slave_addr,
|
||||
struct i2c_pads_info *p);
|
||||
void bus_i2c_init(void *base, int speed, int slave_addr,
|
||||
int (*idle_bus_fn)(void *p), void *p);
|
||||
|
|
|
@ -141,14 +141,36 @@ I2C_PADS(i2c2_pads,
|
|||
IMX_GPIO_NR(1, 6));
|
||||
|
||||
|
||||
static void cm_fx6_setup_i2c(void)
|
||||
static int cm_fx6_setup_one_i2c(int busnum, struct i2c_pads_info *pads)
|
||||
{
|
||||
setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, I2C_PADS_INFO(i2c0_pads));
|
||||
setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, I2C_PADS_INFO(i2c1_pads));
|
||||
setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, I2C_PADS_INFO(i2c2_pads));
|
||||
int ret;
|
||||
|
||||
ret = setup_i2c(busnum, CONFIG_SYS_I2C_SPEED, 0x7f, pads);
|
||||
if (ret)
|
||||
printf("Warning: I2C%d setup failed: %d\n", busnum, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cm_fx6_setup_i2c(void)
|
||||
{
|
||||
int ret = 0, err;
|
||||
|
||||
/* i2c<x>_pads are wierd macro variables; we can't use an array */
|
||||
err = cm_fx6_setup_one_i2c(0, I2C_PADS_INFO(i2c0_pads));
|
||||
if (err)
|
||||
ret = err;
|
||||
err = cm_fx6_setup_one_i2c(1, I2C_PADS_INFO(i2c1_pads));
|
||||
if (err)
|
||||
ret = err;
|
||||
err = cm_fx6_setup_one_i2c(2, I2C_PADS_INFO(i2c2_pads));
|
||||
if (err)
|
||||
ret = err;
|
||||
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
static void cm_fx6_setup_i2c(void) { }
|
||||
static int cm_fx6_setup_i2c(void) { return 0; }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_USB_EHCI_MX6
|
||||
|
@ -409,9 +431,15 @@ void ft_board_setup(void *blob, bd_t *bd)
|
|||
|
||||
int board_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
|
||||
cm_fx6_setup_gpmi_nand();
|
||||
cm_fx6_setup_i2c();
|
||||
|
||||
/* Warn on failure but do not abort boot */
|
||||
ret = cm_fx6_setup_i2c();
|
||||
if (ret)
|
||||
printf("Warning: I2C setup failed: %d\n", ret);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue