[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