[U-Boot] [PATCH] driver: i2c:s3c24x0: init each channel during probe

Heiko Schocher hs at denx.de
Mon Nov 25 07:46:27 CET 2013


Hello Naveen,

Am 22.11.2013 09:50, schrieb Naveen Krishna Ch:
> 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(-)

This patch do not apply based on the patches from Piotr Wilczek, see

[U-Boot,V2,1/2] driver:i2c:s3c24x0: adapt driver to new i2c
http://patchwork.ozlabs.org/patch/292705/
[U-Boot,2/2] driver:i2c:s3c24x0: fix clock init for hsi2c
http://patchwork.ozlabs.org/patch/292706/

Could you rebase your patch on base of this two patches?

Thanks!

>> 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.

Ok, from my side.

> I can implement a "SoC type quirk" to distinguish otherwise.

bye,
Heiko
-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany


More information about the U-Boot mailing list