Commit a0e157af authored by Arnd Bergmann's avatar Arnd Bergmann

ARM: s3c64xx: prepare initcalls for multiplatform

In a multiplatform kernel, each initcall is run regardless
of the platform it is meant for, so it must not attempt to
access SoC-specific registers.

This adds 'if (soc_is_s3c64xx)' to all initcalls that are
specific to the s3c64xx platform, to prevent them from breaking
other platforms once we can build them into a combined kernel.
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Reviewed-by: default avatarKrzysztof Kozlowski <k.kozlowski@samsung.com>
parent 0f20e456
...@@ -208,7 +208,7 @@ void __init s3c64xx_init_io(struct map_desc *mach_desc, int size) ...@@ -208,7 +208,7 @@ void __init s3c64xx_init_io(struct map_desc *mach_desc, int size)
static __init int s3c64xx_dev_init(void) static __init int s3c64xx_dev_init(void)
{ {
/* Not applicable when using DT. */ /* Not applicable when using DT. */
if (of_have_populated_dt()) if (of_have_populated_dt() || !soc_is_s3c64xx())
return 0; return 0;
subsys_system_register(&s3c64xx_subsys, NULL); subsys_system_register(&s3c64xx_subsys, NULL);
...@@ -413,7 +413,7 @@ static int __init s3c64xx_init_irq_eint(void) ...@@ -413,7 +413,7 @@ static int __init s3c64xx_init_irq_eint(void)
int irq; int irq;
/* On DT-enabled systems EINTs are handled by pinctrl-s3c64xx driver. */ /* On DT-enabled systems EINTs are handled by pinctrl-s3c64xx driver. */
if (of_have_populated_dt()) if (of_have_populated_dt() || !soc_is_s3c64xx())
return -ENODEV; return -ENODEV;
for (irq = IRQ_EINT(0); irq <= IRQ_EINT(27); irq++) { for (irq = IRQ_EINT(0); irq <= IRQ_EINT(27); irq++) {
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <asm/cpuidle.h> #include <asm/cpuidle.h>
#include <plat/cpu.h>
#include <mach/map.h> #include <mach/map.h>
#include "regs-sys.h" #include "regs-sys.h"
...@@ -57,6 +58,8 @@ static struct cpuidle_driver s3c64xx_cpuidle_driver = { ...@@ -57,6 +58,8 @@ static struct cpuidle_driver s3c64xx_cpuidle_driver = {
static int __init s3c64xx_init_cpuidle(void) static int __init s3c64xx_init_cpuidle(void)
{ {
return cpuidle_register(&s3c64xx_cpuidle_driver, NULL); if (soc_is_s3c64xx())
return cpuidle_register(&s3c64xx_cpuidle_driver, NULL);
return 0;
} }
device_initcall(s3c64xx_init_cpuidle); device_initcall(s3c64xx_init_cpuidle);
...@@ -113,7 +113,7 @@ static struct syscore_ops s3c64xx_irq_syscore_ops = { ...@@ -113,7 +113,7 @@ static struct syscore_ops s3c64xx_irq_syscore_ops = {
static __init int s3c64xx_syscore_init(void) static __init int s3c64xx_syscore_init(void)
{ {
/* Appropriate drivers (pinctrl, uart) handle this when using DT. */ /* Appropriate drivers (pinctrl, uart) handle this when using DT. */
if (of_have_populated_dt()) if (of_have_populated_dt() || !soc_is_s3c64xx())
return 0; return 0;
register_syscore_ops(&s3c64xx_irq_syscore_ops); register_syscore_ops(&s3c64xx_irq_syscore_ops);
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/platform_data/spi-s3c64xx.h> #include <linux/platform_data/spi-s3c64xx.h>
#include <plat/cpu.h>
#include "crag6410.h" #include "crag6410.h"
static struct s3c64xx_spi_csinfo wm0010_spi_csinfo = { static struct s3c64xx_spi_csinfo wm0010_spi_csinfo = {
...@@ -399,6 +400,9 @@ static struct i2c_driver wlf_gf_module_driver = { ...@@ -399,6 +400,9 @@ static struct i2c_driver wlf_gf_module_driver = {
static int __init wlf_gf_module_register(void) static int __init wlf_gf_module_register(void)
{ {
if (!soc_is_s3c64xx())
return 0;
return i2c_add_driver(&wlf_gf_module_driver); return i2c_add_driver(&wlf_gf_module_driver);
} }
device_initcall(wlf_gf_module_register); device_initcall(wlf_gf_module_register);
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/amba/pl08x.h> #include <linux/amba/pl08x.h>
#include <linux/of.h> #include <linux/of.h>
#include <plat/cpu.h>
#include <mach/irqs.h> #include <mach/irqs.h>
#include <mach/map.h> #include <mach/map.h>
...@@ -230,6 +231,9 @@ static AMBA_AHB_DEVICE(s3c64xx_dma1, "dma-pl080s.1", 0, ...@@ -230,6 +231,9 @@ static AMBA_AHB_DEVICE(s3c64xx_dma1, "dma-pl080s.1", 0,
static int __init s3c64xx_pl080_init(void) static int __init s3c64xx_pl080_init(void)
{ {
if (!soc_is_s3c64xx())
return 0;
/* Set all DMA configuration to be DMA, not SDMA */ /* Set all DMA configuration to be DMA, not SDMA */
writel(0xffffff, S3C64XX_SDMA_SEL); writel(0xffffff, S3C64XX_SDMA_SEL);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <mach/map.h> #include <mach/map.h>
#include <mach/irqs.h> #include <mach/irqs.h>
#include <plat/cpu.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/pm.h> #include <plat/pm.h>
#include <plat/wakeup-mask.h> #include <plat/wakeup-mask.h>
...@@ -332,6 +333,9 @@ int __init s3c64xx_pm_init(void) ...@@ -332,6 +333,9 @@ int __init s3c64xx_pm_init(void)
static __init int s3c64xx_pm_initcall(void) static __init int s3c64xx_pm_initcall(void)
{ {
if (!soc_is_s3c64xx())
return 0;
pm_cpu_prep = s3c64xx_pm_prepare; pm_cpu_prep = s3c64xx_pm_prepare;
pm_cpu_sleep = s3c64xx_cpu_suspend; pm_cpu_sleep = s3c64xx_cpu_suspend;
......
...@@ -81,7 +81,7 @@ static struct device s3c6400_dev = { ...@@ -81,7 +81,7 @@ static struct device s3c6400_dev = {
static int __init s3c6400_core_init(void) static int __init s3c6400_core_init(void)
{ {
/* Not applicable when using DT. */ /* Not applicable when using DT. */
if (of_have_populated_dt()) if (of_have_populated_dt() || soc_is_s3c64xx())
return 0; return 0;
return subsys_system_register(&s3c6400_subsys, NULL); return subsys_system_register(&s3c6400_subsys, NULL);
......
...@@ -84,7 +84,7 @@ static struct device s3c6410_dev = { ...@@ -84,7 +84,7 @@ static struct device s3c6410_dev = {
static int __init s3c6410_core_init(void) static int __init s3c6410_core_init(void)
{ {
/* Not applicable when using DT. */ /* Not applicable when using DT. */
if (of_have_populated_dt()) if (of_have_populated_dt() || !soc_is_s3c64xx())
return 0; return 0;
return subsys_system_register(&s3c6410_subsys, NULL); return subsys_system_register(&s3c6410_subsys, NULL);
......
...@@ -1176,14 +1176,16 @@ static __init int samsung_gpiolib_init(void) ...@@ -1176,14 +1176,16 @@ static __init int samsung_gpiolib_init(void)
* interfaces. For legacy (non-DT) platforms this driver is used. * interfaces. For legacy (non-DT) platforms this driver is used.
*/ */
if (of_have_populated_dt()) if (of_have_populated_dt())
return -ENODEV; return 0;
samsung_gpiolib_set_cfg(samsung_gpio_cfgs, ARRAY_SIZE(samsung_gpio_cfgs));
if (soc_is_s3c24xx()) { if (soc_is_s3c24xx()) {
samsung_gpiolib_set_cfg(samsung_gpio_cfgs,
ARRAY_SIZE(samsung_gpio_cfgs));
s3c24xx_gpiolib_add_chips(s3c24xx_gpios, s3c24xx_gpiolib_add_chips(s3c24xx_gpios,
ARRAY_SIZE(s3c24xx_gpios), S3C24XX_VA_GPIO); ARRAY_SIZE(s3c24xx_gpios), S3C24XX_VA_GPIO);
} else if (soc_is_s3c64xx()) { } else if (soc_is_s3c64xx()) {
samsung_gpiolib_set_cfg(samsung_gpio_cfgs,
ARRAY_SIZE(samsung_gpio_cfgs));
samsung_gpiolib_add_2bit_chips(s3c64xx_gpios_2bit, samsung_gpiolib_add_2bit_chips(s3c64xx_gpios_2bit,
ARRAY_SIZE(s3c64xx_gpios_2bit), ARRAY_SIZE(s3c64xx_gpios_2bit),
S3C64XX_VA_GPIO + 0xE0, 0x20); S3C64XX_VA_GPIO + 0xE0, 0x20);
...@@ -1192,9 +1194,6 @@ static __init int samsung_gpiolib_init(void) ...@@ -1192,9 +1194,6 @@ static __init int samsung_gpiolib_init(void)
S3C64XX_VA_GPIO); S3C64XX_VA_GPIO);
samsung_gpiolib_add_4bit2_chips(s3c64xx_gpios_4bit2, samsung_gpiolib_add_4bit2_chips(s3c64xx_gpios_4bit2,
ARRAY_SIZE(s3c64xx_gpios_4bit2)); ARRAY_SIZE(s3c64xx_gpios_4bit2));
} else {
WARN(1, "Unknown SoC in gpio-samsung, no GPIOs added\n");
return -ENODEV;
} }
return 0; return 0;
......
...@@ -152,6 +152,11 @@ static int __init s3c_arch_init(void) ...@@ -152,6 +152,11 @@ static int __init s3c_arch_init(void)
{ {
int ret; int ret;
/* init is only needed for ATAGS based platforms */
if (!IS_ENABLED(CONFIG_ATAGS) ||
(!soc_is_s3c24xx() && !soc_is_s3c64xx()))
return 0;
// do the correct init for cpu // do the correct init for cpu
if (cpu == NULL) { if (cpu == NULL) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment