davinci: eliminate use of IO_ADDRESS() on sysmod
PATCH v17 8/13 davinci: eliminate use of IO_ADDRESS() on sysmod
Current devices.c file has a number of instances where IO_ADDRESS() is used for system module register access. Eliminate this in favor of a ioremap() based access.
Consequent to this, a new global pointer davinci_sysmodbase has been introduced which gets initialized during the initialization of each relevant SoC.
In this patch davinci_sysmodbase is used by davinci_setup_mmc but the later patches in the series use the same in different places using DAVINCI_SYSMODULE_VIRT.This patch lays the foundation for that.
--- arch/arm/mach-davinci/devices.c | 23 ++++++++++++++--------- arch/arm/mach-davinci/dm355.c | 1 + arch/arm/mach-davinci/dm365.c | 1 + arch/arm/mach-davinci/dm644x.c | 1 + arch/arm/mach-davinci/dm646x.c | 1 + arch/arm/mach-davinci/include/mach/hardware.h | 6 ++++++ 6 files changed, 24 insertions(+), 9 deletions(-)
arch/arm/mach-davinci/devices.c +14 -9
@@ -33,6 +33,14 @@#define DM365_MMCSD0_BASE 0x01D11000#define DM365_MMCSD1_BASE 0x01D00000 +void __iomem *davinci_sysmodbase; + +void davinci_map_sysmod (void ) +{ + davinci_sysmodbase =ioremap_nocache (DAVINCI_SYSTEM_MODULE_BASE ,0x800 ); +WARN_ON (!davinci_sysmodbase); +} +static struct resource i2c_resources[] = { { .start =DAVINCI_I2C_BASE ,
@@ -210,12 +218,12 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config)davinci_cfg_reg (DM355_SD1_DATA2 );davinci_cfg_reg (DM355_SD1_DATA3 ); }else if (cpu_is_davinci_dm365 ()) { -void __iomem *pupdctl1 = -IO_ADDRESS (DAVINCI_SYSTEM_MODULE_BASE +0x7c ); -/* Configure pull down control */ -__raw_writel ((__raw_readl (pupdctl1) & ~0xfc0 ), - pupdctl1); +void __iomem *pupdctl1 =DAVINCI_SYSMODULE_VIRT (0x7c ); +unsigned v; + + v =__raw_readl (pupdctl1); +__raw_writel (v & ~0xfc0 , pupdctl1); mmcsd1_resources[0 ].start =DM365_MMCSD1_BASE ; mmcsd1_resources[0].end = DM365_MMCSD1_BASE +
@@ -244,11 +252,8 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config) mmcsd0_resources[2 ].start =IRQ_DM365_SDIOINT0 ; }else if (cpu_is_davinci_dm644x ()) {/* REVISIT: should this be in board-init code? */ -void __iomem *base = -IO_ADDRESS (DAVINCI_SYSTEM_MODULE_BASE ); -/* Power-on 3.3V IO cells */ -__raw_writel (0 , base +DM64XX_VDD3P3V_PWDN ); +writel (0 ,DAVINCI_SYSMODULE_VIRT (DM64XX_VDD3P3V_PWDN ));/*Set up the pull regiter for MMC */ davinci_cfg_reg (DM644X_MSTK ); }
arch/arm/mach-davinci/dm355.c +1 -0
@@ -874,6 +874,7 @@ void __init dm355_init_asp1(u32 evt_enable, struct snd_platform_data *pdata)void __init dm355_init (void ) {davinci_common_init (&davinci_soc_info_dm355); +davinci_map_sysmod (); }static int __init dm355_init_devices (void )
arch/arm/mach-davinci/dm365.c +1 -0
@@ -1127,6 +1127,7 @@ void __init dm365_init_rtc(void)void __init dm365_init (void ) {davinci_common_init (&davinci_soc_info_dm365); +davinci_map_sysmod (); }static struct resource dm365_vpss_resources[] = {
arch/arm/mach-davinci/dm644x.c +1 -0
@@ -779,6 +779,7 @@ void __init dm644x_init_asp(struct snd_platform_data *pdata)void __init dm644x_init (void ) {davinci_common_init (&davinci_soc_info_dm644x); +davinci_map_sysmod (); }static int __init dm644x_init_devices (void )
arch/arm/mach-davinci/dm646x.c +1 -0
@@ -903,6 +903,7 @@ void __init dm646x_init(void) {dm646x_board_setup_refclk (&ref_clk);davinci_common_init (&davinci_soc_info_dm646x); +davinci_map_sysmod (); }static int __init dm646x_init_devices (void )
arch/arm/mach-davinci/include/mach/hardware.h +6 -0
@@ -21,6 +21,12 @@*/ #define DAVINCI_SYSTEM_MODULE_BASE 0x01C40000 +#ifndef __ASSEMBLER__ +extern void __iomem *davinci_sysmodbase; +#define DAVINCI_SYSMODULE_VIRT (x) (davinci_sysmodbase + (x)) +void davinci_map_sysmod (void ); +#endif +/* * I/O mapping */
Signature · 1 line
1.6.2.4
PATCH v17 8/13 davinci: eliminate use of IO_ADDRESS() on sysmod
Quoted 48 lines · Manjunath
Current
devices.cfile has a number of instances whereIO_ADDRESS()is used for system module register access. Eliminate this in favor of aioremap()based access.Consequent to this, a new global pointer
davinci_sysmodbasehas been introduced which gets initialized during the initialization of each relevant SoC.In this patch
davinci_sysmodbaseis used bydavinci_setup_mmcbut the later patches in the series use the same in different places using DAVINCI_SYSMODULE_VIRT.This patch lays the foundation for that.Signed-off-by Manjunath Hadli <[email protected]>--- arch/arm/mach-davinci/devices.c | 23 ++++++++++++++--------- arch/arm/mach-davinci/dm355.c | 1 + arch/arm/mach-davinci/dm365.c | 1 + arch/arm/mach-davinci/dm644x.c | 1 + arch/arm/mach-davinci/dm646x.c | 1 + arch/arm/mach-davinci/include/mach/hardware.h | 6 ++++++ 6 files changed, 24 insertions(+), 9 deletions(-)arch/arm/mach-davinci/devices.c +8
-1@@ -33,6 +33,14 @@#define DM365_MMCSD0_BASE 0x01D11000#define DM365_MMCSD1_BASE 0x01D00000 +void __iomem *davinci_sysmodbase; + +void davinci_map_sysmod (void ) +{ + davinci_sysmodbase =ioremap_nocache (DAVINCI_SYSTEM_MODULE_BASE ,0x800 ); +WARN_ON (!davinci_sysmodbase); +} +static struct resource i2c_resources[] = { { .start =DAVINCI_I2C_BASE ,@@ -210,12 +218,12 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config)davinci_cfg_reg (DM355_SD1_DATA2 );davinci_cfg_reg (DM355_SD1_DATA3 ); }else if (cpu_is_davinci_dm365 ()) { - void __iomem *pupdctl1 =
arch/arm/mach-davinci/devices.c void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config) · line 226
Quoted 10 lines
arch/arm/mach-davinci/devices.c +5
-4-IO_ADDRESS (DAVINCI_SYSTEM_MODULE_BASE +0x7c ); -/* Configure pull down control */ -__raw_writel ((__raw_readl (pupdctl1) & ~0xfc0 ), - pupdctl1); +void __iomem *pupdctl1 =DAVINCI_SYSMODULE_VIRT (0x7c ); +unsigned v; + + v =__raw_readl (pupdctl1); +__raw_writel (v & ~0xfc0 , pupdctl1);
You fixed this as Sergei requested...
arch/arm/mach-davinci/devices.c void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config) · line 256
Quoted 13 lines
arch/arm/mach-davinci/devices.c +1
-4mmcsd1_resources[0 ].start =DM365_MMCSD1_BASE ; mmcsd1_resources[0].end = DM365_MMCSD1_BASE +@@ -244,11 +252,8 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config) mmcsd0_resources[2 ].start =IRQ_DM365_SDIOINT0 ; }else if (cpu_is_davinci_dm644x ()) {/* REVISIT: should this be in board-init code? */ -void __iomem *base = -IO_ADDRESS (DAVINCI_SYSTEM_MODULE_BASE ); -/* Power-on 3.3V IO cells */ -__raw_writel (0 , base +DM64XX_VDD3P3V_PWDN ); +writel (0 ,DAVINCI_SYSMODULE_VIRT (DM64XX_VDD3P3V_PWDN ));
.. but forgot to fix this. There is nothing wrong with using writel, but it doesn't fit into what the subject of this patch is.
Thanks,
Sekhar
PATCH v17 8/13 davinci: eliminate use of IO_ADDRESS() on sysmod
Quoted 3 lines · Sekhar
.. but forgot to fix this. There is nothing wrong with using writel, but it doesn't fit into what the subject of this patch is.
Well, to be more exact, the __raw_writel was actually wrong here and it should be writel(), but it's certainly better to mention the reason in the changelog, or to make a separate patch for it.
Arnd
PATCH v17 8/13 davinci: eliminate use of IO_ADDRESS() on sysmod
Quoted 9 lines · Arnd Bergmann
Quoted 3 lines · Sekhar
.. but forgot to fix this. There is nothing wrong with using writel, but it doesn't fit into what the subject of this patch is.
Well, to be more exact, the
__raw_writelwas actually wrong here and it should bewritel(), but it's certainly better to mention the reason in the changelog, or to make a separate patch for it.
I wouldn't necessarily classify the use of __raw_writel as wrong (as in a bug) - since the specific code is question is only run on ARMv5 based SoCs.
A lot of DaVinci code uses __raw_* variants, and perhaps should be changed to use readl/writel instead - at least it will help copying that code over for other uses.
That should be the subject of separate (series of) patches.
Thanks,
Sekhar