aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSekhar Nori <nsekhar@ti.com>2009-11-16 06:51:37 -0500
committerKevin Hilman <khilman@deeprootsystems.com>2010-02-04 16:29:38 -0500
commit948c66df0d5e23dbcb84bee39a11b56c8a0d3e41 (patch)
tree73f44815624ac8b43436bccb804126e910c36f94
parente2da3aaa4254d9e79d9524190fc7e5f0cbdc3c33 (diff)
davinci: cpuidle: move mapping of DDR2 controller registers out of driver
When suspend is supported, both cpuidle and suspend code need to work on DDR2 registers. Instead of mapping the DDR2 registers twice, do it once outside of cpuidle driver and let cpuidle driver get the virtual base address of DDR2 registers. Signed-off-by: Sekhar Nori <nsekhar@ti.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
-rw-r--r--arch/arm/mach-davinci/cpuidle.c33
-rw-r--r--arch/arm/mach-davinci/devices-da8xx.c16
-rw-r--r--arch/arm/mach-davinci/include/mach/cpuidle.h1
-rw-r--r--arch/arm/mach-davinci/include/mach/da8xx.h1
4 files changed, 21 insertions, 30 deletions
diff --git a/arch/arm/mach-davinci/cpuidle.c b/arch/arm/mach-davinci/cpuidle.c
index beda3b579688..bd59f31b8a95 100644
--- a/arch/arm/mach-davinci/cpuidle.c
+++ b/arch/arm/mach-davinci/cpuidle.c
@@ -106,8 +106,6 @@ static int __init davinci_cpuidle_probe(struct platform_device *pdev)
106 int ret; 106 int ret;
107 struct cpuidle_device *device; 107 struct cpuidle_device *device;
108 struct davinci_cpuidle_config *pdata = pdev->dev.platform_data; 108 struct davinci_cpuidle_config *pdata = pdev->dev.platform_data;
109 struct resource *ddr2_regs;
110 resource_size_t len;
111 109
112 device = &per_cpu(davinci_cpuidle_device, smp_processor_id()); 110 device = &per_cpu(davinci_cpuidle_device, smp_processor_id());
113 111
@@ -116,28 +114,12 @@ static int __init davinci_cpuidle_probe(struct platform_device *pdev)
116 return -ENOENT; 114 return -ENOENT;
117 } 115 }
118 116
119 ddr2_regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 117 ddr2_reg_base = pdata->ddr2_ctlr_base;
120 if (!ddr2_regs) {
121 dev_err(&pdev->dev, "cannot get DDR2 controller register base");
122 return -ENODEV;
123 }
124
125 len = resource_size(ddr2_regs);
126
127 ddr2_regs = request_mem_region(ddr2_regs->start, len, ddr2_regs->name);
128 if (!ddr2_regs)
129 return -EBUSY;
130
131 ddr2_reg_base = ioremap(ddr2_regs->start, len);
132 if (!ddr2_reg_base) {
133 ret = -ENOMEM;
134 goto ioremap_fail;
135 }
136 118
137 ret = cpuidle_register_driver(&davinci_idle_driver); 119 ret = cpuidle_register_driver(&davinci_idle_driver);
138 if (ret) { 120 if (ret) {
139 dev_err(&pdev->dev, "failed to register driver\n"); 121 dev_err(&pdev->dev, "failed to register driver\n");
140 goto driver_register_fail; 122 return ret;
141 } 123 }
142 124
143 /* Wait for interrupt state */ 125 /* Wait for interrupt state */
@@ -164,18 +146,11 @@ static int __init davinci_cpuidle_probe(struct platform_device *pdev)
164 ret = cpuidle_register_device(device); 146 ret = cpuidle_register_device(device);
165 if (ret) { 147 if (ret) {
166 dev_err(&pdev->dev, "failed to register device\n"); 148 dev_err(&pdev->dev, "failed to register device\n");
167 goto device_register_fail; 149 cpuidle_unregister_driver(&davinci_idle_driver);
150 return ret;
168 } 151 }
169 152
170 return 0; 153 return 0;
171
172device_register_fail:
173 cpuidle_unregister_driver(&davinci_idle_driver);
174driver_register_fail:
175 iounmap(ddr2_reg_base);
176ioremap_fail:
177 release_mem_region(ddr2_regs->start, len);
178 return ret;
179} 154}
180 155
181static struct platform_driver davinci_cpuidle_driver = { 156static struct platform_driver davinci_cpuidle_driver = {
diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c
index 745534eb63c7..0c759ad0aeee 100644
--- a/arch/arm/mach-davinci/devices-da8xx.c
+++ b/arch/arm/mach-davinci/devices-da8xx.c
@@ -496,6 +496,19 @@ int da8xx_register_rtc(void)
496 return ret; 496 return ret;
497} 497}
498 498
499static void __iomem *da8xx_ddr2_ctlr_base;
500void __iomem * __init da8xx_get_mem_ctlr(void)
501{
502 if (da8xx_ddr2_ctlr_base)
503 return da8xx_ddr2_ctlr_base;
504
505 da8xx_ddr2_ctlr_base = ioremap(DA8XX_DDR2_CTL_BASE, SZ_32K);
506 if (!da8xx_ddr2_ctlr_base)
507 pr_warning("%s: Unable to map DDR2 controller", __func__);
508
509 return da8xx_ddr2_ctlr_base;
510}
511
499static struct resource da8xx_cpuidle_resources[] = { 512static struct resource da8xx_cpuidle_resources[] = {
500 { 513 {
501 .start = DA8XX_DDR2_CTL_BASE, 514 .start = DA8XX_DDR2_CTL_BASE,
@@ -521,6 +534,7 @@ static struct platform_device da8xx_cpuidle_device = {
521 534
522int __init da8xx_register_cpuidle(void) 535int __init da8xx_register_cpuidle(void)
523{ 536{
537 da8xx_cpuidle_pdata.ddr2_ctlr_base = da8xx_get_mem_ctlr();
538
524 return platform_device_register(&da8xx_cpuidle_device); 539 return platform_device_register(&da8xx_cpuidle_device);
525} 540}
526
diff --git a/arch/arm/mach-davinci/include/mach/cpuidle.h b/arch/arm/mach-davinci/include/mach/cpuidle.h
index cbfc6a9c81b4..74f088b0edfb 100644
--- a/arch/arm/mach-davinci/include/mach/cpuidle.h
+++ b/arch/arm/mach-davinci/include/mach/cpuidle.h
@@ -12,6 +12,7 @@
12 12
13struct davinci_cpuidle_config { 13struct davinci_cpuidle_config {
14 u32 ddr2_pdown; 14 u32 ddr2_pdown;
15 void __iomem *ddr2_ctlr_base;
15}; 16};
16 17
17#endif 18#endif
diff --git a/arch/arm/mach-davinci/include/mach/da8xx.h b/arch/arm/mach-davinci/include/mach/da8xx.h
index bddc4d4a806e..cab4a25ebe4f 100644
--- a/arch/arm/mach-davinci/include/mach/da8xx.h
+++ b/arch/arm/mach-davinci/include/mach/da8xx.h
@@ -94,6 +94,7 @@ void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata);
94int da8xx_register_rtc(void); 94int da8xx_register_rtc(void);
95int da850_register_cpufreq(void); 95int da850_register_cpufreq(void);
96int da8xx_register_cpuidle(void); 96int da8xx_register_cpuidle(void);
97void __iomem * __init da8xx_get_mem_ctlr(void);
97 98
98extern struct platform_device da8xx_serial_device; 99extern struct platform_device da8xx_serial_device;
99extern struct emac_platform_data da8xx_emac_pdata; 100extern struct emac_platform_data da8xx_emac_pdata;