[U-Boot] [PATCH] driver: i2c:s3c24x0: init each channel during probe
Naveen Krishna Ch
naveenkrishna.ch at gmail.com
Fri Nov 22 09:50:52 CET 2013
Hello All,
On 22 November 2013 14:18, Naveen Krishna Chatradhi
<ch.naveen at samsung.com> wrote:
> Each I2C channel must be inited during the probe and then set "active"
> instead of initing the channel for every time we select the bus
> using "i2c dev bus"
>
> Signed-off-by: Naveen Krishna Chatradhi <ch.naveen at samsung.com>
> ---
> drivers/i2c/s3c24x0_i2c.c | 29 +++++++++++++----------------
> 1 file changed, 13 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/i2c/s3c24x0_i2c.c b/drivers/i2c/s3c24x0_i2c.c
> index f77a9d1..7136771 100644
> --- a/drivers/i2c/s3c24x0_i2c.c
> +++ b/drivers/i2c/s3c24x0_i2c.c
> @@ -408,22 +408,7 @@ static void exynos5_i2c_reset(struct s3c24x0_i2c_bus *i2c_bus)
> #ifdef CONFIG_I2C_MULTI_BUS
> int i2c_set_bus_num(unsigned int bus)
> {
> - struct s3c24x0_i2c_bus *i2c_bus;
> -
> - i2c_bus = get_bus(bus);
> - if (!i2c_bus)
> - return -1;
> g_current_bus = bus;
> -
> - if (i2c_bus->is_highspeed) {
> - if (hsi2c_get_clk_details(i2c_bus))
> - return -1;
> - hsi2c_ch_init(i2c_bus);
> - } else {
> - i2c_ch_init(i2c_bus->regs, i2c_bus->clock_frequency,
> - CONFIG_SYS_I2C_SLAVE);
> - }
> -
> return 0;
> }
>
> @@ -989,7 +974,6 @@ static void process_nodes(const void *blob, int node_list[], int count,
> continue;
>
> bus = &i2c_bus[i];
> - bus->active = true;
> bus->is_highspeed = is_highspeed;
>
> if (is_highspeed)
> @@ -1009,6 +993,19 @@ static void process_nodes(const void *blob, int node_list[], int count,
>
> /* Mark position as used */
> node_list[i] = -1;
> +
> + if (bus->is_highspeed) {
> + if (hsi2c_get_clk_details(bus)) {
> + bus->active = false;
> + break;
> + }
> + hsi2c_ch_init(bus);
> + exynos5_i2c_reset(bus);
HSI2C module on Exynos5260 needs a reset of module during reset.
Similar patch is being posted for kernel at
http://www.kernelhub.org/?msg=365741&p=2
As this is a one time activity, guess resetting all channels is not a problem.
I can implement a "SoC type quirk" to distinguish otherwise.
> + } else {
> + i2c_ch_init(bus->regs, bus->clock_frequency,
> + CONFIG_SYS_I2C_SLAVE);
> + }
> + bus->active = true;
> }
> }
>
> --
> 1.7.10.4
>
--
Shine bright,
(: Nav :)
More information about the U-Boot
mailing list