Skip to contentSkip to conversation

davinci: eliminate use of IO_ADDRESS() on sysmod

PATCH Superseded Manjunath Hadli 3 participants 4 messages Mar 15, 2011 – Mar 23, 2011

Subsystems (4)

v17 of 19 Superseded Latest is v19 →

lore
Share & tools
lore
#0 lore raw

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
index d3b2040..b7ef950 100644
@@ -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
index a5f8a80..1baab94 100644
@@ -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
index 02d2cc3..a788980 100644
@@ -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
index 9a2376b..77dea11 100644
@@ -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
index 1e0f809..ce93b83 100644
@@ -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
index 414e0b9..5296025 100644
@@ -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
#1 lore raw

PATCH v17 8/13 davinci: eliminate use of IO_ADDRESS() on sysmod

Quoted 48 lines · Manjunath

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 +8 -1
index d3b2040..b7ef950 100644
@@ -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 -4
 			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));

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

#2 lore raw

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

#3 lore raw

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

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