[PATCH V4 3/3] ARM: SAMSUNG: Add lookup of sdhci-s3c clocks using generic names

Rajeshwari Birje rajeshwari.birje at gmail.com
Wed Oct 12 08:36:20 EDT 2011


Hi Sylwester,


On Wed, Oct 12, 2011 at 3:54 PM, Sylwester Nawrocki
<s.nawrocki at samsung.com> wrote:
> Hi Rajeshwari,
>
> On 10/12/2011 11:43 AM, Rajeshwari Shinde wrote:
>> Add support for lookup of sdhci-s3c controller clocks using generic names
>> for s3c2416, s3c64xx, s5pc100, s5pv210 and exynos4 SoC's.
>>
>> Signed-off-by: Rajeshwari Shinde <rajeshwari.s at samsung.com>
>> ---
>>  arch/arm/mach-exynos4/clock.c         |   88 ++++++++++-------
>>  arch/arm/mach-s3c2416/clock.c         |   68 +++++++------
>>  arch/arm/mach-s3c64xx/clock.c         |  126 +++++++++++++++----------
>>  arch/arm/mach-s5pc100/clock.c         |  130 ++++++++++++++++----------
>>  arch/arm/mach-s5pv210/clock.c         |  167 ++++++++++++++++++++-------------
>>  arch/arm/plat-s3c24xx/s3c2443-clock.c |   15 ++-
>>  6 files changed, 359 insertions(+), 235 deletions(-)
>>
>> diff --git a/arch/arm/mach-exynos4/clock.c b/arch/arm/mach-exynos4/clock.c
>> index 9f50e33..c6383b9 100644
>> --- a/arch/arm/mach-exynos4/clock.c
>> +++ b/arch/arm/mach-exynos4/clock.c
>> @@ -1157,42 +1157,6 @@ static struct clksrc_clk clksrcs[] = {
>>               .reg_div = { .reg = S5P_CLKDIV_MFC, .shift = 0, .size = 4 },
>>       }, {
>>               .clk            = {
>> -                     .name           = "sclk_mmc",
>> -                     .devname        = "s3c-sdhci.0",
>> -                     .parent         = &clk_dout_mmc0.clk,
>> -                     .enable         = exynos4_clksrc_mask_fsys_ctrl,
>> -                     .ctrlbit        = (1 << 0),
>> -             },
>> -             .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 },
>> -     }, {
>> -             .clk            = {
>> -                     .name           = "sclk_mmc",
>> -                     .devname        = "s3c-sdhci.1",
>> -                     .parent         = &clk_dout_mmc1.clk,
>> -                     .enable         = exynos4_clksrc_mask_fsys_ctrl,
>> -                     .ctrlbit        = (1 << 4),
>> -             },
>> -             .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 },
>> -     }, {
>> -             .clk            = {
>> -                     .name           = "sclk_mmc",
>> -                     .devname        = "s3c-sdhci.2",
>> -                     .parent         = &clk_dout_mmc2.clk,
>> -                     .enable         = exynos4_clksrc_mask_fsys_ctrl,
>> -                     .ctrlbit        = (1 << 8),
>> -             },
>> -             .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 },
>> -     }, {
>> -             .clk            = {
>> -                     .name           = "sclk_mmc",
>> -                     .devname        = "s3c-sdhci.3",
>> -                     .parent         = &clk_dout_mmc3.clk,
>> -                     .enable         = exynos4_clksrc_mask_fsys_ctrl,
>> -                     .ctrlbit        = (1 << 12),
>> -             },
>> -             .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 },
>> -     }, {
>> -             .clk            = {
>>                       .name           = "sclk_dwmmc",
>>                       .parent         = &clk_dout_mmc4.clk,
>>                       .enable         = exynos4_clksrc_mask_fsys_ctrl,
>> @@ -1250,6 +1214,50 @@ static struct clksrc_clk clk_sclk_uart3 = {
>>       .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 12, .size = 4 },
>>  };
>>
>> +static struct clksrc_clk clk_sclk_mmc0 = {
>> +     .clk            = {
>> +             .name           = "sclk_mmc",
>> +             .devname        = "s3c-sdhci.0",
>
> Would it make sense to drop this 'devname' field here and others
> until sclk_mmc3 ....

*** The devname here distinguishes these clocks. So it should be okay
to have a devname for these clocks.

>
>> +             .parent         = &clk_dout_mmc0.clk,
>> +             .enable         = exynos4_clksrc_mask_fsys_ctrl,
>> +             .ctrlbit        = (1 << 0),
>> +     },
>> +     .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 },
>> +};
>> +
>> +static struct clksrc_clk clk_sclk_mmc1 = {
>> +     .clk            = {
>> +             .name           = "sclk_mmc",
>> +             .devname        = "s3c-sdhci.1",
>
>> +             .parent         = &clk_dout_mmc1.clk,
>> +             .enable         = exynos4_clksrc_mask_fsys_ctrl,
>> +             .ctrlbit        = (1 << 4),
>> +     },
>> +     .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 },
>> +};
>> +
>> +static struct clksrc_clk clk_sclk_mmc2 = {
>> +     .clk            = {
>> +             .name           = "sclk_mmc",
>> +             .devname        = "s3c-sdhci.2",
>
>> +             .parent         = &clk_dout_mmc2.clk,
>> +             .enable         = exynos4_clksrc_mask_fsys_ctrl,
>> +             .ctrlbit        = (1 << 8),
>> +     },
>> +     .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 },
>> +};
>> +
>> +static struct clksrc_clk clk_sclk_mmc3 = {
>> +     .clk            = {
>> +             .name           = "sclk_mmc",
>> +             .devname        = "s3c-sdhci.3",
>
>> +             .parent         = &clk_dout_mmc3.clk,
>> +             .enable         = exynos4_clksrc_mask_fsys_ctrl,
>> +             .ctrlbit        = (1 << 12),
>> +     },
>> +     .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 },
>> +};
>> +
>>  /* Clock initialization code */
>>  static struct clksrc_clk *sysclks[] = {
>>       &clk_mout_apll,
>> @@ -1289,6 +1297,10 @@ static struct clksrc_clk *clksrc_cdev[] = {
>>       &clk_sclk_uart1,
>>       &clk_sclk_uart2,
>>       &clk_sclk_uart3,
>> +     &clk_sclk_mmc0,
>> +     &clk_sclk_mmc1,
>> +     &clk_sclk_mmc2,
>> +     &clk_sclk_mmc3,
>
> ..then drop the above 4 lines...

**** The registration for these clocks are important. The
s3c_register_clksrc() function sets the .ops of this clock and also
its parent. So the registration cannot be dropped.

>
>>  };
>>
>>  static struct clk_lookup exynos4_clk_lookup[] = {
>> @@ -1296,6 +1308,10 @@ static struct clk_lookup exynos4_clk_lookup[] = {
>>       CLKDEV_INIT("exynos4210-uart.1", "clk_uart_baud0", &clk_sclk_uart1.clk),
>>       CLKDEV_INIT("exynos4210-uart.2", "clk_uart_baud0", &clk_sclk_uart2.clk),
>>       CLKDEV_INIT("exynos4210-uart.3", "clk_uart_baud0", &clk_sclk_uart3.clk),
>> +     CLKDEV_INIT("exynos4-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk),
>> +     CLKDEV_INIT("exynos4-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk),
>> +     CLKDEV_INIT("exynos4-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),
>> +     CLKDEV_INIT("exynos4-sdhci.3", "mmc_busclk.2", &clk_sclk_mmc3.clk),
>
> ..and add something like:
>
>  +      CLKDEV_INIT("s3c-sdhci.0", "sclk_mmc", &clk_sclk_mmc0.clk),
>  +      CLKDEV_INIT("s3c-sdhci.1", "sclk_mmc", &clk_sclk_mmc1.clk),
>  +      CLKDEV_INIT("s3c-sdhci.2", "sclk_mmc", &clk_sclk_mmc2.clk),
>  +      CLKDEV_INIT("s3c-sdhci.3", "sclk_mmc", &clk_sclk_mmc3.clk),
>
> ?

**** The driver uses a common name for the possible bus clock sources,
that is “mmc_busclk”. This keeps the clock lookup code in the driver
simple. Also, there could be SoC’s which do no use sclk_mmc as the bus
clock name as per the user manual


>
> Also I'm wondering why we're using different device names for clk_sclk_mmc0..3
> clocks, i.e. exynos4-sdhci.? and s3c-sdhci.? ?
>
> Does it all work on exynos ? I would expect the device name to be same
> across all the clock definitions, otherwise clk_get(dev, ..) will fail.

**** There was a patch submitted to rename the device name of sdhci
for Exynos to exynos4-sdhci. I will remove this change from this patch
and let that patch handle this change.

>
>>  };
>>
>
> Regards
> --
> Sylwester Nawrocki
> Samsung Poland R&D Center
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

Regards,
Rajeshwari Shinde.



More information about the linux-arm-kernel mailing list