Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Sekhar Nori and committed by
Kevin Hilman
948c66df e2da3aaa

+21 -30
+4 -29
arch/arm/mach-davinci/cpuidle.c
··· 106 106 int ret; 107 107 struct cpuidle_device *device; 108 108 struct davinci_cpuidle_config *pdata = pdev->dev.platform_data; 109 - struct resource *ddr2_regs; 110 - resource_size_t len; 111 109 112 110 device = &per_cpu(davinci_cpuidle_device, smp_processor_id()); 113 111 ··· 114 116 return -ENOENT; 115 117 } 116 118 117 - ddr2_regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 118 - if (!ddr2_regs) { 119 - dev_err(&pdev->dev, "cannot get DDR2 controller register base"); 120 - return -ENODEV; 121 - } 122 - 123 - len = resource_size(ddr2_regs); 124 - 125 - ddr2_regs = request_mem_region(ddr2_regs->start, len, ddr2_regs->name); 126 - if (!ddr2_regs) 127 - return -EBUSY; 128 - 129 - ddr2_reg_base = ioremap(ddr2_regs->start, len); 130 - if (!ddr2_reg_base) { 131 - ret = -ENOMEM; 132 - goto ioremap_fail; 133 - } 119 + ddr2_reg_base = pdata->ddr2_ctlr_base; 134 120 135 121 ret = cpuidle_register_driver(&davinci_idle_driver); 136 122 if (ret) { 137 123 dev_err(&pdev->dev, "failed to register driver\n"); 138 - goto driver_register_fail; 124 + return ret; 139 125 } 140 126 141 127 /* Wait for interrupt state */ ··· 146 164 ret = cpuidle_register_device(device); 147 165 if (ret) { 148 166 dev_err(&pdev->dev, "failed to register device\n"); 149 - goto device_register_fail; 167 + cpuidle_unregister_driver(&davinci_idle_driver); 168 + return ret; 150 169 } 151 170 152 171 return 0; 153 - 154 - device_register_fail: 155 - cpuidle_unregister_driver(&davinci_idle_driver); 156 - driver_register_fail: 157 - iounmap(ddr2_reg_base); 158 - ioremap_fail: 159 - release_mem_region(ddr2_regs->start, len); 160 - return ret; 161 172 } 162 173 163 174 static struct platform_driver davinci_cpuidle_driver = {
+15 -1
arch/arm/mach-davinci/devices-da8xx.c
··· 496 496 return ret; 497 497 } 498 498 499 + static void __iomem *da8xx_ddr2_ctlr_base; 500 + void __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 + 499 512 static struct resource da8xx_cpuidle_resources[] = { 500 513 { 501 514 .start = DA8XX_DDR2_CTL_BASE, ··· 534 521 535 522 int __init da8xx_register_cpuidle(void) 536 523 { 524 + da8xx_cpuidle_pdata.ddr2_ctlr_base = da8xx_get_mem_ctlr(); 525 + 537 526 return platform_device_register(&da8xx_cpuidle_device); 538 527 } 539 -
+1
arch/arm/mach-davinci/include/mach/cpuidle.h
··· 12 12 13 13 struct davinci_cpuidle_config { 14 14 u32 ddr2_pdown; 15 + void __iomem *ddr2_ctlr_base; 15 16 }; 16 17 17 18 #endif
+1
arch/arm/mach-davinci/include/mach/da8xx.h
··· 94 94 int da8xx_register_rtc(void); 95 95 int da850_register_cpufreq(void); 96 96 int da8xx_register_cpuidle(void); 97 + void __iomem * __init da8xx_get_mem_ctlr(void); 97 98 98 99 extern struct platform_device da8xx_serial_device; 99 100 extern struct emac_platform_data da8xx_emac_pdata;