diff options
-rw-r--r-- | arch/arm/mach-s3c2410/Kconfig | 8 | ||||
-rw-r--r-- | arch/arm/mach-s3c2410/Makefile | 3 | ||||
-rw-r--r-- | arch/arm/mach-s3c2410/h1940-bluetooth.c | 88 | ||||
-rw-r--r-- | arch/arm/mach-s3c2410/mach-bast.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-s3c2410/mach-h1940.c | 105 | ||||
-rw-r--r-- | arch/arm/mach-s3c2410/mach-n30.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-s3c2410/mach-qt2410.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-s3c2412/mach-jive.c | 11 | ||||
-rw-r--r-- | arch/arm/mach-s3c2412/mach-vstms.c | 10 | ||||
-rw-r--r-- | arch/arm/mach-s3c2440/mach-anubis.c | 12 | ||||
-rw-r--r-- | arch/arm/mach-s3c2440/mach-at2440evb.c | 9 | ||||
-rw-r--r-- | arch/arm/mach-s3c2440/mach-mini2440.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-s3c2440/mach-osiris.c | 11 | ||||
-rw-r--r-- | arch/arm/mach-s3c2440/mach-rx3715.c | 9 | ||||
-rw-r--r-- | arch/arm/mach-s3c2442/mach-gta02.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-s3c6410/mach-hmt.c | 2 | ||||
-rw-r--r-- | arch/arm/plat-s3c/dev-nand.c | 97 | ||||
-rw-r--r-- | arch/arm/plat-s3c/include/plat/nand.h | 8 | ||||
-rw-r--r-- | arch/arm/plat-s3c24xx/common-smdk.c | 2 |
19 files changed, 305 insertions, 100 deletions
diff --git a/arch/arm/mach-s3c2410/Kconfig b/arch/arm/mach-s3c2410/Kconfig index 3d4e9da3fa52..dd1fcc7e6708 100644 --- a/arch/arm/mach-s3c2410/Kconfig +++ b/arch/arm/mach-s3c2410/Kconfig | |||
@@ -81,6 +81,14 @@ config ARCH_H1940 | |||
81 | help | 81 | help |
82 | Say Y here if you are using the HP IPAQ H1940 | 82 | Say Y here if you are using the HP IPAQ H1940 |
83 | 83 | ||
84 | config H1940BT | ||
85 | tristate "Control the state of H1940 bluetooth chip" | ||
86 | depends on ARCH_H1940 | ||
87 | select RFKILL | ||
88 | help | ||
89 | This is a simple driver that is able to control | ||
90 | the state of built in bluetooth chip on h1940. | ||
91 | |||
84 | config PM_H1940 | 92 | config PM_H1940 |
85 | bool | 93 | bool |
86 | help | 94 | help |
diff --git a/arch/arm/mach-s3c2410/Makefile b/arch/arm/mach-s3c2410/Makefile index 2ab5ba4b266f..0d468e96e83e 100644 --- a/arch/arm/mach-s3c2410/Makefile +++ b/arch/arm/mach-s3c2410/Makefile | |||
@@ -21,7 +21,8 @@ obj-$(CONFIG_S3C2410_PLLTABLE) += pll.o | |||
21 | # Machine support | 21 | # Machine support |
22 | 22 | ||
23 | obj-$(CONFIG_ARCH_SMDK2410) += mach-smdk2410.o | 23 | obj-$(CONFIG_ARCH_SMDK2410) += mach-smdk2410.o |
24 | obj-$(CONFIG_ARCH_H1940) += mach-h1940.o h1940-bluetooth.o | 24 | obj-$(CONFIG_ARCH_H1940) += mach-h1940.o |
25 | obj-$(CONFIG_H1940BT) += h1940-bluetooth.o | ||
25 | obj-$(CONFIG_PM_H1940) += pm-h1940.o | 26 | obj-$(CONFIG_PM_H1940) += pm-h1940.o |
26 | obj-$(CONFIG_MACH_N30) += mach-n30.o | 27 | obj-$(CONFIG_MACH_N30) += mach-n30.o |
27 | obj-$(CONFIG_ARCH_BAST) += mach-bast.o usb-simtec.o | 28 | obj-$(CONFIG_ARCH_BAST) += mach-bast.o usb-simtec.o |
diff --git a/arch/arm/mach-s3c2410/h1940-bluetooth.c b/arch/arm/mach-s3c2410/h1940-bluetooth.c index 5aabf117cbb0..b7d1f8d27bc2 100644 --- a/arch/arm/mach-s3c2410/h1940-bluetooth.c +++ b/arch/arm/mach-s3c2410/h1940-bluetooth.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/ctype.h> | 17 | #include <linux/ctype.h> |
18 | #include <linux/leds.h> | 18 | #include <linux/leds.h> |
19 | #include <linux/gpio.h> | 19 | #include <linux/gpio.h> |
20 | #include <linux/rfkill.h> | ||
20 | 21 | ||
21 | #include <mach/regs-gpio.h> | 22 | #include <mach/regs-gpio.h> |
22 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
@@ -24,21 +25,10 @@ | |||
24 | 25 | ||
25 | #define DRV_NAME "h1940-bt" | 26 | #define DRV_NAME "h1940-bt" |
26 | 27 | ||
27 | #ifdef CONFIG_LEDS_H1940 | ||
28 | DEFINE_LED_TRIGGER(bt_led_trigger); | ||
29 | #endif | ||
30 | |||
31 | static int state; | ||
32 | |||
33 | /* Bluetooth control */ | 28 | /* Bluetooth control */ |
34 | static void h1940bt_enable(int on) | 29 | static void h1940bt_enable(int on) |
35 | { | 30 | { |
36 | if (on) { | 31 | if (on) { |
37 | #ifdef CONFIG_LEDS_H1940 | ||
38 | /* flashing Blue */ | ||
39 | led_trigger_event(bt_led_trigger, LED_HALF); | ||
40 | #endif | ||
41 | |||
42 | /* Power on the chip */ | 32 | /* Power on the chip */ |
43 | h1940_latch_control(0, H1940_LATCH_BLUETOOTH_POWER); | 33 | h1940_latch_control(0, H1940_LATCH_BLUETOOTH_POWER); |
44 | /* Reset the chip */ | 34 | /* Reset the chip */ |
@@ -46,48 +36,31 @@ static void h1940bt_enable(int on) | |||
46 | s3c2410_gpio_setpin(S3C2410_GPH(1), 1); | 36 | s3c2410_gpio_setpin(S3C2410_GPH(1), 1); |
47 | mdelay(10); | 37 | mdelay(10); |
48 | s3c2410_gpio_setpin(S3C2410_GPH(1), 0); | 38 | s3c2410_gpio_setpin(S3C2410_GPH(1), 0); |
49 | |||
50 | state = 1; | ||
51 | } | 39 | } |
52 | else { | 40 | else { |
53 | #ifdef CONFIG_LEDS_H1940 | ||
54 | led_trigger_event(bt_led_trigger, 0); | ||
55 | #endif | ||
56 | |||
57 | s3c2410_gpio_setpin(S3C2410_GPH(1), 1); | 41 | s3c2410_gpio_setpin(S3C2410_GPH(1), 1); |
58 | mdelay(10); | 42 | mdelay(10); |
59 | s3c2410_gpio_setpin(S3C2410_GPH(1), 0); | 43 | s3c2410_gpio_setpin(S3C2410_GPH(1), 0); |
60 | mdelay(10); | 44 | mdelay(10); |
61 | h1940_latch_control(H1940_LATCH_BLUETOOTH_POWER, 0); | 45 | h1940_latch_control(H1940_LATCH_BLUETOOTH_POWER, 0); |
62 | |||
63 | state = 0; | ||
64 | } | 46 | } |
65 | } | 47 | } |
66 | 48 | ||
67 | static ssize_t h1940bt_show(struct device *dev, struct device_attribute *attr, char *buf) | 49 | static int h1940bt_set_block(void *data, bool blocked) |
68 | { | 50 | { |
69 | return snprintf(buf, PAGE_SIZE, "%d\n", state); | 51 | h1940bt_enable(!blocked); |
52 | return 0; | ||
70 | } | 53 | } |
71 | 54 | ||
72 | static ssize_t h1940bt_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | 55 | static const struct rfkill_ops h1940bt_rfkill_ops = { |
73 | { | 56 | .set_block = h1940bt_set_block, |
74 | int new_state; | 57 | }; |
75 | char *endp; | ||
76 | |||
77 | new_state = simple_strtoul(buf, &endp, 0); | ||
78 | if (*endp && !isspace(*endp)) | ||
79 | return -EINVAL; | ||
80 | |||
81 | h1940bt_enable(new_state); | ||
82 | |||
83 | return count; | ||
84 | } | ||
85 | static DEVICE_ATTR(enable, 0644, | ||
86 | h1940bt_show, | ||
87 | h1940bt_store); | ||
88 | 58 | ||
89 | static int __init h1940bt_probe(struct platform_device *pdev) | 59 | static int __init h1940bt_probe(struct platform_device *pdev) |
90 | { | 60 | { |
61 | struct rfkill *rfk; | ||
62 | int ret = 0; | ||
63 | |||
91 | /* Configures BT serial port GPIOs */ | 64 | /* Configures BT serial port GPIOs */ |
92 | s3c2410_gpio_cfgpin(S3C2410_GPH(0), S3C2410_GPH0_nCTS0); | 65 | s3c2410_gpio_cfgpin(S3C2410_GPH(0), S3C2410_GPH0_nCTS0); |
93 | s3c2410_gpio_pullup(S3C2410_GPH(0), 1); | 66 | s3c2410_gpio_pullup(S3C2410_GPH(0), 1); |
@@ -98,21 +71,44 @@ static int __init h1940bt_probe(struct platform_device *pdev) | |||
98 | s3c2410_gpio_cfgpin(S3C2410_GPH(3), S3C2410_GPH3_RXD0); | 71 | s3c2410_gpio_cfgpin(S3C2410_GPH(3), S3C2410_GPH3_RXD0); |
99 | s3c2410_gpio_pullup(S3C2410_GPH(3), 1); | 72 | s3c2410_gpio_pullup(S3C2410_GPH(3), 1); |
100 | 73 | ||
101 | #ifdef CONFIG_LEDS_H1940 | ||
102 | led_trigger_register_simple("h1940-bluetooth", &bt_led_trigger); | ||
103 | #endif | ||
104 | 74 | ||
105 | /* disable BT by default */ | 75 | rfk = rfkill_alloc(DRV_NAME, &pdev->dev, RFKILL_TYPE_BLUETOOTH, |
106 | h1940bt_enable(0); | 76 | &h1940bt_rfkill_ops, NULL); |
77 | if (!rfk) { | ||
78 | ret = -ENOMEM; | ||
79 | goto err_rfk_alloc; | ||
80 | } | ||
81 | |||
82 | rfkill_set_led_trigger_name(rfk, "h1940-bluetooth"); | ||
83 | |||
84 | ret = rfkill_register(rfk); | ||
85 | if (ret) | ||
86 | goto err_rfkill; | ||
87 | |||
88 | platform_set_drvdata(pdev, rfk); | ||
89 | |||
90 | return 0; | ||
107 | 91 | ||
108 | return device_create_file(&pdev->dev, &dev_attr_enable); | 92 | err_rfkill: |
93 | rfkill_destroy(rfk); | ||
94 | err_rfk_alloc: | ||
95 | return ret; | ||
109 | } | 96 | } |
110 | 97 | ||
111 | static int h1940bt_remove(struct platform_device *pdev) | 98 | static int h1940bt_remove(struct platform_device *pdev) |
112 | { | 99 | { |
113 | #ifdef CONFIG_LEDS_H1940 | 100 | struct rfkill *rfk = platform_get_drvdata(pdev); |
114 | led_trigger_unregister_simple(bt_led_trigger); | 101 | |
115 | #endif | 102 | platform_set_drvdata(pdev, NULL); |
103 | |||
104 | if (rfk) { | ||
105 | rfkill_unregister(rfk); | ||
106 | rfkill_destroy(rfk); | ||
107 | } | ||
108 | rfk = NULL; | ||
109 | |||
110 | h1940bt_enable(0); | ||
111 | |||
116 | return 0; | 112 | return 0; |
117 | } | 113 | } |
118 | 114 | ||
diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c index c425eefb9f89..4c79ac8a6c33 100644 --- a/arch/arm/mach-s3c2410/mach-bast.c +++ b/arch/arm/mach-s3c2410/mach-bast.c | |||
@@ -248,7 +248,7 @@ static int chip0_map[] = { 1 }; | |||
248 | static int chip1_map[] = { 2 }; | 248 | static int chip1_map[] = { 2 }; |
249 | static int chip2_map[] = { 3 }; | 249 | static int chip2_map[] = { 3 }; |
250 | 250 | ||
251 | static struct mtd_partition bast_default_nand_part[] = { | 251 | static struct mtd_partition __initdata bast_default_nand_part[] = { |
252 | [0] = { | 252 | [0] = { |
253 | .name = "Boot Agent", | 253 | .name = "Boot Agent", |
254 | .size = SZ_16K, | 254 | .size = SZ_16K, |
@@ -274,7 +274,7 @@ static struct mtd_partition bast_default_nand_part[] = { | |||
274 | * socket. | 274 | * socket. |
275 | */ | 275 | */ |
276 | 276 | ||
277 | static struct s3c2410_nand_set bast_nand_sets[] = { | 277 | static struct s3c2410_nand_set __initdata bast_nand_sets[] = { |
278 | [0] = { | 278 | [0] = { |
279 | .name = "SmartMedia", | 279 | .name = "SmartMedia", |
280 | .nr_chips = 1, | 280 | .nr_chips = 1, |
@@ -324,7 +324,7 @@ static void bast_nand_select(struct s3c2410_nand_set *set, int slot) | |||
324 | __raw_writeb(tmp, BAST_VA_CTRL2); | 324 | __raw_writeb(tmp, BAST_VA_CTRL2); |
325 | } | 325 | } |
326 | 326 | ||
327 | static struct s3c2410_platform_nand bast_nand_info = { | 327 | static struct s3c2410_platform_nand __initdata bast_nand_info = { |
328 | .tacls = 30, | 328 | .tacls = 30, |
329 | .twrph0 = 60, | 329 | .twrph0 = 60, |
330 | .twrph1 = 60, | 330 | .twrph1 = 60, |
@@ -631,7 +631,6 @@ static void __init bast_map_io(void) | |||
631 | 631 | ||
632 | s3c24xx_register_clocks(bast_clocks, ARRAY_SIZE(bast_clocks)); | 632 | s3c24xx_register_clocks(bast_clocks, ARRAY_SIZE(bast_clocks)); |
633 | 633 | ||
634 | s3c_device_nand.dev.platform_data = &bast_nand_info; | ||
635 | s3c_device_hwmon.dev.platform_data = &bast_hwmon_info; | 634 | s3c_device_hwmon.dev.platform_data = &bast_hwmon_info; |
636 | 635 | ||
637 | s3c24xx_init_io(bast_iodesc, ARRAY_SIZE(bast_iodesc)); | 636 | s3c24xx_init_io(bast_iodesc, ARRAY_SIZE(bast_iodesc)); |
@@ -645,6 +644,7 @@ static void __init bast_init(void) | |||
645 | sysdev_register(&bast_pm_sysdev); | 644 | sysdev_register(&bast_pm_sysdev); |
646 | 645 | ||
647 | s3c_i2c0_set_platdata(&bast_i2c_info); | 646 | s3c_i2c0_set_platdata(&bast_i2c_info); |
647 | s3c_nand_set_platdata(&bast_nand_info); | ||
648 | s3c24xx_fb_set_platdata(&bast_fb_info); | 648 | s3c24xx_fb_set_platdata(&bast_fb_info); |
649 | platform_add_devices(bast_devices, ARRAY_SIZE(bast_devices)); | 649 | platform_add_devices(bast_devices, ARRAY_SIZE(bast_devices)); |
650 | 650 | ||
diff --git a/arch/arm/mach-s3c2410/mach-h1940.c b/arch/arm/mach-s3c2410/mach-h1940.c index d9cd5ddecf4a..49053254c98d 100644 --- a/arch/arm/mach-s3c2410/mach-h1940.c +++ b/arch/arm/mach-s3c2410/mach-h1940.c | |||
@@ -21,6 +21,11 @@ | |||
21 | #include <linux/serial_core.h> | 21 | #include <linux/serial_core.h> |
22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <linux/gpio.h> | ||
25 | #include <linux/pwm_backlight.h> | ||
26 | #include <video/platform_lcd.h> | ||
27 | |||
28 | #include <linux/mmc/host.h> | ||
24 | 29 | ||
25 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
26 | #include <asm/mach/map.h> | 31 | #include <asm/mach/map.h> |
@@ -32,9 +37,12 @@ | |||
32 | 37 | ||
33 | #include <plat/regs-serial.h> | 38 | #include <plat/regs-serial.h> |
34 | #include <mach/regs-lcd.h> | 39 | #include <mach/regs-lcd.h> |
35 | #include <mach/regs-gpio.h> | ||
36 | #include <mach/regs-clock.h> | 40 | #include <mach/regs-clock.h> |
37 | 41 | ||
42 | #include <mach/regs-gpio.h> | ||
43 | #include <mach/gpio-fns.h> | ||
44 | #include <mach/gpio-nrs.h> | ||
45 | |||
38 | #include <mach/h1940.h> | 46 | #include <mach/h1940.h> |
39 | #include <mach/h1940-latch.h> | 47 | #include <mach/h1940-latch.h> |
40 | #include <mach/fb.h> | 48 | #include <mach/fb.h> |
@@ -46,6 +54,7 @@ | |||
46 | #include <plat/cpu.h> | 54 | #include <plat/cpu.h> |
47 | #include <plat/pll.h> | 55 | #include <plat/pll.h> |
48 | #include <plat/pm.h> | 56 | #include <plat/pm.h> |
57 | #include <plat/mci.h> | ||
49 | 58 | ||
50 | static struct map_desc h1940_iodesc[] __initdata = { | 59 | static struct map_desc h1940_iodesc[] __initdata = { |
51 | [0] = { | 60 | [0] = { |
@@ -171,16 +180,90 @@ static struct s3c2410fb_mach_info h1940_fb_info __initdata = { | |||
171 | .gpdup_mask= 0xffffffff, | 180 | .gpdup_mask= 0xffffffff, |
172 | }; | 181 | }; |
173 | 182 | ||
174 | static struct platform_device s3c_device_leds = { | 183 | static struct platform_device h1940_device_leds = { |
175 | .name = "h1940-leds", | 184 | .name = "h1940-leds", |
176 | .id = -1, | 185 | .id = -1, |
177 | }; | 186 | }; |
178 | 187 | ||
179 | static struct platform_device s3c_device_bluetooth = { | 188 | static struct platform_device h1940_device_bluetooth = { |
180 | .name = "h1940-bt", | 189 | .name = "h1940-bt", |
181 | .id = -1, | 190 | .id = -1, |
182 | }; | 191 | }; |
183 | 192 | ||
193 | static struct s3c24xx_mci_pdata h1940_mmc_cfg = { | ||
194 | .gpio_detect = S3C2410_GPF(5), | ||
195 | .gpio_wprotect = S3C2410_GPH(8), | ||
196 | .set_power = NULL, | ||
197 | .ocr_avail = MMC_VDD_32_33, | ||
198 | }; | ||
199 | |||
200 | static int h1940_backlight_init(struct device *dev) | ||
201 | { | ||
202 | gpio_request(S3C2410_GPB(0), "Backlight"); | ||
203 | |||
204 | s3c2410_gpio_setpin(S3C2410_GPB(0), 0); | ||
205 | s3c2410_gpio_pullup(S3C2410_GPB(0), 0); | ||
206 | s3c2410_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0); | ||
207 | |||
208 | return 0; | ||
209 | } | ||
210 | |||
211 | static void h1940_backlight_exit(struct device *dev) | ||
212 | { | ||
213 | s3c2410_gpio_cfgpin(S3C2410_GPB(0), 1/*S3C2410_GPB0_OUTP*/); | ||
214 | } | ||
215 | |||
216 | static struct platform_pwm_backlight_data backlight_data = { | ||
217 | .pwm_id = 0, | ||
218 | .max_brightness = 100, | ||
219 | .dft_brightness = 50, | ||
220 | /* tcnt = 0x31 */ | ||
221 | .pwm_period_ns = 36296, | ||
222 | .init = h1940_backlight_init, | ||
223 | .exit = h1940_backlight_exit, | ||
224 | }; | ||
225 | |||
226 | static struct platform_device h1940_backlight = { | ||
227 | .name = "pwm-backlight", | ||
228 | .dev = { | ||
229 | .parent = &s3c_device_timer[0].dev, | ||
230 | .platform_data = &backlight_data, | ||
231 | }, | ||
232 | .id = -1, | ||
233 | }; | ||
234 | |||
235 | static void h1940_lcd_power_set(struct plat_lcd_data *pd, | ||
236 | unsigned int power) | ||
237 | { | ||
238 | int value; | ||
239 | |||
240 | if (!power) { | ||
241 | /* set to 3ec */ | ||
242 | s3c2410_gpio_setpin(S3C2410_GPC(0), 0); | ||
243 | /* wait for 3ac */ | ||
244 | do { | ||
245 | value = s3c2410_gpio_getpin(S3C2410_GPC(6)); | ||
246 | } while (value); | ||
247 | /* set to 38c */ | ||
248 | s3c2410_gpio_setpin(S3C2410_GPC(5), 0); | ||
249 | } else { | ||
250 | /* Set to 3ac */ | ||
251 | s3c2410_gpio_setpin(S3C2410_GPC(5), 1); | ||
252 | /* Set to 3ad */ | ||
253 | s3c2410_gpio_setpin(S3C2410_GPC(0), 1); | ||
254 | } | ||
255 | } | ||
256 | |||
257 | static struct plat_lcd_data h1940_lcd_power_data = { | ||
258 | .set_power = h1940_lcd_power_set, | ||
259 | }; | ||
260 | |||
261 | static struct platform_device h1940_lcd_powerdev = { | ||
262 | .name = "platform-lcd", | ||
263 | .dev.parent = &s3c_device_lcd.dev, | ||
264 | .dev.platform_data = &h1940_lcd_power_data, | ||
265 | }; | ||
266 | |||
184 | static struct platform_device *h1940_devices[] __initdata = { | 267 | static struct platform_device *h1940_devices[] __initdata = { |
185 | &s3c_device_usb, | 268 | &s3c_device_usb, |
186 | &s3c_device_lcd, | 269 | &s3c_device_lcd, |
@@ -188,8 +271,13 @@ static struct platform_device *h1940_devices[] __initdata = { | |||
188 | &s3c_device_i2c0, | 271 | &s3c_device_i2c0, |
189 | &s3c_device_iis, | 272 | &s3c_device_iis, |
190 | &s3c_device_usbgadget, | 273 | &s3c_device_usbgadget, |
191 | &s3c_device_leds, | 274 | &h1940_device_leds, |
192 | &s3c_device_bluetooth, | 275 | &h1940_device_bluetooth, |
276 | &s3c_device_sdi, | ||
277 | &s3c_device_rtc, | ||
278 | &s3c_device_timer[0], | ||
279 | &h1940_backlight, | ||
280 | &h1940_lcd_powerdev, | ||
193 | }; | 281 | }; |
194 | 282 | ||
195 | static void __init h1940_map_io(void) | 283 | static void __init h1940_map_io(void) |
@@ -219,6 +307,8 @@ static void __init h1940_init(void) | |||
219 | s3c24xx_udc_set_platdata(&h1940_udc_cfg); | 307 | s3c24xx_udc_set_platdata(&h1940_udc_cfg); |
220 | s3c_i2c0_set_platdata(NULL); | 308 | s3c_i2c0_set_platdata(NULL); |
221 | 309 | ||
310 | s3c_device_sdi.dev.platform_data = &h1940_mmc_cfg; | ||
311 | |||
222 | /* Turn off suspend on both USB ports, and switch the | 312 | /* Turn off suspend on both USB ports, and switch the |
223 | * selectable USB port to USB device mode. */ | 313 | * selectable USB port to USB device mode. */ |
224 | 314 | ||
@@ -231,6 +321,11 @@ static void __init h1940_init(void) | |||
231 | | (0x03 << S3C24XX_PLLCON_SDIVSHIFT); | 321 | | (0x03 << S3C24XX_PLLCON_SDIVSHIFT); |
232 | writel(tmp, S3C2410_UPLLCON); | 322 | writel(tmp, S3C2410_UPLLCON); |
233 | 323 | ||
324 | gpio_request(S3C2410_GPC(0), "LCD power"); | ||
325 | gpio_request(S3C2410_GPC(5), "LCD power"); | ||
326 | gpio_request(S3C2410_GPC(6), "LCD power"); | ||
327 | |||
328 | |||
234 | platform_add_devices(h1940_devices, ARRAY_SIZE(h1940_devices)); | 329 | platform_add_devices(h1940_devices, ARRAY_SIZE(h1940_devices)); |
235 | } | 330 | } |
236 | 331 | ||
diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c index 0f6ed61af415..0405712c2263 100644 --- a/arch/arm/mach-s3c2410/mach-n30.c +++ b/arch/arm/mach-s3c2410/mach-n30.c | |||
@@ -338,7 +338,7 @@ static struct platform_device *n35_devices[] __initdata = { | |||
338 | &n35_button_device, | 338 | &n35_button_device, |
339 | }; | 339 | }; |
340 | 340 | ||
341 | static struct s3c2410_platform_i2c n30_i2ccfg = { | 341 | static struct s3c2410_platform_i2c __initdata n30_i2ccfg = { |
342 | .flags = 0, | 342 | .flags = 0, |
343 | .slave_addr = 0x10, | 343 | .slave_addr = 0x10, |
344 | .frequency = 10*1000, | 344 | .frequency = 10*1000, |
@@ -500,8 +500,8 @@ static void __init n30_init_irq(void) | |||
500 | static void __init n30_init(void) | 500 | static void __init n30_init(void) |
501 | { | 501 | { |
502 | s3c24xx_fb_set_platdata(&n30_fb_info); | 502 | s3c24xx_fb_set_platdata(&n30_fb_info); |
503 | s3c_device_i2c0.dev.platform_data = &n30_i2ccfg; | ||
504 | s3c24xx_udc_set_platdata(&n30_udc_cfg); | 503 | s3c24xx_udc_set_platdata(&n30_udc_cfg); |
504 | s3c_i2c0_set_platdata(&n30_i2ccfg); | ||
505 | 505 | ||
506 | /* Turn off suspend on both USB ports, and switch the | 506 | /* Turn off suspend on both USB ports, and switch the |
507 | * selectable USB port to USB device mode. */ | 507 | * selectable USB port to USB device mode. */ |
diff --git a/arch/arm/mach-s3c2410/mach-qt2410.c b/arch/arm/mach-s3c2410/mach-qt2410.c index 2cc9849eb448..ab092bcda393 100644 --- a/arch/arm/mach-s3c2410/mach-qt2410.c +++ b/arch/arm/mach-s3c2410/mach-qt2410.c | |||
@@ -258,7 +258,7 @@ static struct platform_device *qt2410_devices[] __initdata = { | |||
258 | &qt2410_led, | 258 | &qt2410_led, |
259 | }; | 259 | }; |
260 | 260 | ||
261 | static struct mtd_partition qt2410_nand_part[] = { | 261 | static struct mtd_partition __initdata qt2410_nand_part[] = { |
262 | [0] = { | 262 | [0] = { |
263 | .name = "U-Boot", | 263 | .name = "U-Boot", |
264 | .size = 0x30000, | 264 | .size = 0x30000, |
@@ -286,7 +286,7 @@ static struct mtd_partition qt2410_nand_part[] = { | |||
286 | }, | 286 | }, |
287 | }; | 287 | }; |
288 | 288 | ||
289 | static struct s3c2410_nand_set qt2410_nand_sets[] = { | 289 | static struct s3c2410_nand_set __initdata qt2410_nand_sets[] = { |
290 | [0] = { | 290 | [0] = { |
291 | .name = "NAND", | 291 | .name = "NAND", |
292 | .nr_chips = 1, | 292 | .nr_chips = 1, |
@@ -299,7 +299,7 @@ static struct s3c2410_nand_set qt2410_nand_sets[] = { | |||
299 | * chips and beyond. | 299 | * chips and beyond. |
300 | */ | 300 | */ |
301 | 301 | ||
302 | static struct s3c2410_platform_nand qt2410_nand_info = { | 302 | static struct s3c2410_platform_nand __initdata qt2410_nand_info = { |
303 | .tacls = 20, | 303 | .tacls = 20, |
304 | .twrph0 = 60, | 304 | .twrph0 = 60, |
305 | .twrph1 = 20, | 305 | .twrph1 = 20, |
@@ -331,7 +331,7 @@ static void __init qt2410_map_io(void) | |||
331 | 331 | ||
332 | static void __init qt2410_machine_init(void) | 332 | static void __init qt2410_machine_init(void) |
333 | { | 333 | { |
334 | s3c_device_nand.dev.platform_data = &qt2410_nand_info; | 334 | s3c_nand_set_platdata(&qt2410_nand_info); |
335 | 335 | ||
336 | switch (tft_type) { | 336 | switch (tft_type) { |
337 | case 'p': /* production */ | 337 | case 'p': /* production */ |
diff --git a/arch/arm/mach-s3c2412/mach-jive.c b/arch/arm/mach-s3c2412/mach-jive.c index 8df506eac903..c9fa3fca486c 100644 --- a/arch/arm/mach-s3c2412/mach-jive.c +++ b/arch/arm/mach-s3c2412/mach-jive.c | |||
@@ -96,7 +96,7 @@ static struct s3c2410_uartcfg jive_uartcfgs[] = { | |||
96 | * 0x017d0000-0x02bd0000 : cramfs B | 96 | * 0x017d0000-0x02bd0000 : cramfs B |
97 | * 0x02bd0000-0x03fd0000 : yaffs | 97 | * 0x02bd0000-0x03fd0000 : yaffs |
98 | */ | 98 | */ |
99 | static struct mtd_partition jive_imageA_nand_part[] = { | 99 | static struct mtd_partition __initdata jive_imageA_nand_part[] = { |
100 | 100 | ||
101 | #ifdef CONFIG_MACH_JIVE_SHOW_BOOTLOADER | 101 | #ifdef CONFIG_MACH_JIVE_SHOW_BOOTLOADER |
102 | /* Don't allow access to the bootloader from linux */ | 102 | /* Don't allow access to the bootloader from linux */ |
@@ -154,7 +154,7 @@ static struct mtd_partition jive_imageA_nand_part[] = { | |||
154 | }, | 154 | }, |
155 | }; | 155 | }; |
156 | 156 | ||
157 | static struct mtd_partition jive_imageB_nand_part[] = { | 157 | static struct mtd_partition __initdata jive_imageB_nand_part[] = { |
158 | 158 | ||
159 | #ifdef CONFIG_MACH_JIVE_SHOW_BOOTLOADER | 159 | #ifdef CONFIG_MACH_JIVE_SHOW_BOOTLOADER |
160 | /* Don't allow access to the bootloader from linux */ | 160 | /* Don't allow access to the bootloader from linux */ |
@@ -213,7 +213,7 @@ static struct mtd_partition jive_imageB_nand_part[] = { | |||
213 | }, | 213 | }, |
214 | }; | 214 | }; |
215 | 215 | ||
216 | static struct s3c2410_nand_set jive_nand_sets[] = { | 216 | static struct s3c2410_nand_set __initdata jive_nand_sets[] = { |
217 | [0] = { | 217 | [0] = { |
218 | .name = "flash", | 218 | .name = "flash", |
219 | .nr_chips = 1, | 219 | .nr_chips = 1, |
@@ -222,7 +222,7 @@ static struct s3c2410_nand_set jive_nand_sets[] = { | |||
222 | }, | 222 | }, |
223 | }; | 223 | }; |
224 | 224 | ||
225 | static struct s3c2410_platform_nand jive_nand_info = { | 225 | static struct s3c2410_platform_nand __initdata jive_nand_info = { |
226 | /* set taken from osiris nand timings, possibly still conservative */ | 226 | /* set taken from osiris nand timings, possibly still conservative */ |
227 | .tacls = 30, | 227 | .tacls = 30, |
228 | .twrph0 = 55, | 228 | .twrph0 = 55, |
@@ -631,7 +631,8 @@ static void __init jive_machine_init(void) | |||
631 | 631 | ||
632 | s3c_pm_init(); | 632 | s3c_pm_init(); |
633 | 633 | ||
634 | s3c_device_nand.dev.platform_data = &jive_nand_info; | 634 | /** TODO - check that this is after the cmdline option! */ |
635 | s3c_nand_set_platdata(&jive_nand_info); | ||
635 | 636 | ||
636 | /* initialise the spi */ | 637 | /* initialise the spi */ |
637 | 638 | ||
diff --git a/arch/arm/mach-s3c2412/mach-vstms.c b/arch/arm/mach-s3c2412/mach-vstms.c index 11e8ad49fc7b..a6ba591b26bb 100644 --- a/arch/arm/mach-s3c2412/mach-vstms.c +++ b/arch/arm/mach-s3c2412/mach-vstms.c | |||
@@ -76,7 +76,7 @@ static struct s3c2410_uartcfg vstms_uartcfgs[] __initdata = { | |||
76 | } | 76 | } |
77 | }; | 77 | }; |
78 | 78 | ||
79 | static struct mtd_partition vstms_nand_part[] = { | 79 | static struct mtd_partition __initdata vstms_nand_part[] = { |
80 | [0] = { | 80 | [0] = { |
81 | .name = "Boot Agent", | 81 | .name = "Boot Agent", |
82 | .size = 0x7C000, | 82 | .size = 0x7C000, |
@@ -99,7 +99,7 @@ static struct mtd_partition vstms_nand_part[] = { | |||
99 | }, | 99 | }, |
100 | }; | 100 | }; |
101 | 101 | ||
102 | static struct s3c2410_nand_set vstms_nand_sets[] = { | 102 | static struct s3c2410_nand_set __initdata vstms_nand_sets[] = { |
103 | [0] = { | 103 | [0] = { |
104 | .name = "NAND", | 104 | .name = "NAND", |
105 | .nr_chips = 1, | 105 | .nr_chips = 1, |
@@ -112,7 +112,7 @@ static struct s3c2410_nand_set vstms_nand_sets[] = { | |||
112 | * chips and beyond. | 112 | * chips and beyond. |
113 | */ | 113 | */ |
114 | 114 | ||
115 | static struct s3c2410_platform_nand vstms_nand_info = { | 115 | static struct s3c2410_platform_nand __initdata vstms_nand_info = { |
116 | .tacls = 20, | 116 | .tacls = 20, |
117 | .twrph0 = 60, | 117 | .twrph0 = 60, |
118 | .twrph1 = 20, | 118 | .twrph1 = 20, |
@@ -143,8 +143,6 @@ static void __init vstms_fixup(struct machine_desc *desc, | |||
143 | 143 | ||
144 | static void __init vstms_map_io(void) | 144 | static void __init vstms_map_io(void) |
145 | { | 145 | { |
146 | s3c_device_nand.dev.platform_data = &vstms_nand_info; | ||
147 | |||
148 | s3c24xx_init_io(vstms_iodesc, ARRAY_SIZE(vstms_iodesc)); | 146 | s3c24xx_init_io(vstms_iodesc, ARRAY_SIZE(vstms_iodesc)); |
149 | s3c24xx_init_clocks(12000000); | 147 | s3c24xx_init_clocks(12000000); |
150 | s3c24xx_init_uarts(vstms_uartcfgs, ARRAY_SIZE(vstms_uartcfgs)); | 148 | s3c24xx_init_uarts(vstms_uartcfgs, ARRAY_SIZE(vstms_uartcfgs)); |
@@ -153,6 +151,8 @@ static void __init vstms_map_io(void) | |||
153 | static void __init vstms_init(void) | 151 | static void __init vstms_init(void) |
154 | { | 152 | { |
155 | s3c_i2c0_set_platdata(NULL); | 153 | s3c_i2c0_set_platdata(NULL); |
154 | s3c_nand_set_platdata(&vstms_nand_info); | ||
155 | |||
156 | platform_add_devices(vstms_devices, ARRAY_SIZE(vstms_devices)); | 156 | platform_add_devices(vstms_devices, ARRAY_SIZE(vstms_devices)); |
157 | } | 157 | } |
158 | 158 | ||
diff --git a/arch/arm/mach-s3c2440/mach-anubis.c b/arch/arm/mach-s3c2440/mach-anubis.c index c3705b99d15c..62a4c3eba97f 100644 --- a/arch/arm/mach-s3c2440/mach-anubis.c +++ b/arch/arm/mach-s3c2440/mach-anubis.c | |||
@@ -139,7 +139,7 @@ static int external_map[] = { 2 }; | |||
139 | static int chip0_map[] = { 0 }; | 139 | static int chip0_map[] = { 0 }; |
140 | static int chip1_map[] = { 1 }; | 140 | static int chip1_map[] = { 1 }; |
141 | 141 | ||
142 | static struct mtd_partition anubis_default_nand_part[] = { | 142 | static struct mtd_partition __initdata anubis_default_nand_part[] = { |
143 | [0] = { | 143 | [0] = { |
144 | .name = "Boot Agent", | 144 | .name = "Boot Agent", |
145 | .size = SZ_16K, | 145 | .size = SZ_16K, |
@@ -162,7 +162,7 @@ static struct mtd_partition anubis_default_nand_part[] = { | |||
162 | } | 162 | } |
163 | }; | 163 | }; |
164 | 164 | ||
165 | static struct mtd_partition anubis_default_nand_part_large[] = { | 165 | static struct mtd_partition __initdata anubis_default_nand_part_large[] = { |
166 | [0] = { | 166 | [0] = { |
167 | .name = "Boot Agent", | 167 | .name = "Boot Agent", |
168 | .size = SZ_128K, | 168 | .size = SZ_128K, |
@@ -192,7 +192,7 @@ static struct mtd_partition anubis_default_nand_part_large[] = { | |||
192 | * socket. | 192 | * socket. |
193 | */ | 193 | */ |
194 | 194 | ||
195 | static struct s3c2410_nand_set anubis_nand_sets[] = { | 195 | static struct s3c2410_nand_set __initdata anubis_nand_sets[] = { |
196 | [1] = { | 196 | [1] = { |
197 | .name = "External", | 197 | .name = "External", |
198 | .nr_chips = 1, | 198 | .nr_chips = 1, |
@@ -234,7 +234,7 @@ static void anubis_nand_select(struct s3c2410_nand_set *set, int slot) | |||
234 | __raw_writeb(tmp, ANUBIS_VA_CTRL1); | 234 | __raw_writeb(tmp, ANUBIS_VA_CTRL1); |
235 | } | 235 | } |
236 | 236 | ||
237 | static struct s3c2410_platform_nand anubis_nand_info = { | 237 | static struct s3c2410_platform_nand __initdata anubis_nand_info = { |
238 | .tacls = 25, | 238 | .tacls = 25, |
239 | .twrph0 = 55, | 239 | .twrph0 = 55, |
240 | .twrph1 = 40, | 240 | .twrph1 = 40, |
@@ -466,8 +466,6 @@ static void __init anubis_map_io(void) | |||
466 | 466 | ||
467 | s3c24xx_register_clocks(anubis_clocks, ARRAY_SIZE(anubis_clocks)); | 467 | s3c24xx_register_clocks(anubis_clocks, ARRAY_SIZE(anubis_clocks)); |
468 | 468 | ||
469 | s3c_device_nand.dev.platform_data = &anubis_nand_info; | ||
470 | |||
471 | s3c24xx_init_io(anubis_iodesc, ARRAY_SIZE(anubis_iodesc)); | 469 | s3c24xx_init_io(anubis_iodesc, ARRAY_SIZE(anubis_iodesc)); |
472 | s3c24xx_init_clocks(0); | 470 | s3c24xx_init_clocks(0); |
473 | s3c24xx_init_uarts(anubis_uartcfgs, ARRAY_SIZE(anubis_uartcfgs)); | 471 | s3c24xx_init_uarts(anubis_uartcfgs, ARRAY_SIZE(anubis_uartcfgs)); |
@@ -488,7 +486,9 @@ static void __init anubis_map_io(void) | |||
488 | static void __init anubis_init(void) | 486 | static void __init anubis_init(void) |
489 | { | 487 | { |
490 | s3c_i2c0_set_platdata(NULL); | 488 | s3c_i2c0_set_platdata(NULL); |
489 | s3c_nand_set_platdata(&anubis_nand_info); | ||
491 | simtec_audio_add(NULL, false, &anubis_audio); | 490 | simtec_audio_add(NULL, false, &anubis_audio); |
491 | |||
492 | platform_add_devices(anubis_devices, ARRAY_SIZE(anubis_devices)); | 492 | platform_add_devices(anubis_devices, ARRAY_SIZE(anubis_devices)); |
493 | 493 | ||
494 | i2c_register_board_info(0, anubis_i2c_devs, | 494 | i2c_register_board_info(0, anubis_i2c_devs, |
diff --git a/arch/arm/mach-s3c2440/mach-at2440evb.c b/arch/arm/mach-s3c2440/mach-at2440evb.c index dfc7010935da..aa69290e04c6 100644 --- a/arch/arm/mach-s3c2440/mach-at2440evb.c +++ b/arch/arm/mach-s3c2440/mach-at2440evb.c | |||
@@ -96,7 +96,7 @@ static struct s3c2410_uartcfg at2440evb_uartcfgs[] __initdata = { | |||
96 | 96 | ||
97 | /* NAND Flash on AT2440EVB board */ | 97 | /* NAND Flash on AT2440EVB board */ |
98 | 98 | ||
99 | static struct mtd_partition at2440evb_default_nand_part[] = { | 99 | static struct mtd_partition __initdata at2440evb_default_nand_part[] = { |
100 | [0] = { | 100 | [0] = { |
101 | .name = "Boot Agent", | 101 | .name = "Boot Agent", |
102 | .size = SZ_256K, | 102 | .size = SZ_256K, |
@@ -114,7 +114,7 @@ static struct mtd_partition at2440evb_default_nand_part[] = { | |||
114 | }, | 114 | }, |
115 | }; | 115 | }; |
116 | 116 | ||
117 | static struct s3c2410_nand_set at2440evb_nand_sets[] = { | 117 | static struct s3c2410_nand_set __initdata at2440evb_nand_sets[] = { |
118 | [0] = { | 118 | [0] = { |
119 | .name = "nand", | 119 | .name = "nand", |
120 | .nr_chips = 1, | 120 | .nr_chips = 1, |
@@ -123,7 +123,7 @@ static struct s3c2410_nand_set at2440evb_nand_sets[] = { | |||
123 | }, | 123 | }, |
124 | }; | 124 | }; |
125 | 125 | ||
126 | static struct s3c2410_platform_nand at2440evb_nand_info = { | 126 | static struct s3c2410_platform_nand __initdata at2440evb_nand_info = { |
127 | .tacls = 25, | 127 | .tacls = 25, |
128 | .twrph0 = 55, | 128 | .twrph0 = 55, |
129 | .twrph1 = 40, | 129 | .twrph1 = 40, |
@@ -216,8 +216,6 @@ static struct platform_device *at2440evb_devices[] __initdata = { | |||
216 | 216 | ||
217 | static void __init at2440evb_map_io(void) | 217 | static void __init at2440evb_map_io(void) |
218 | { | 218 | { |
219 | s3c_device_nand.dev.platform_data = &at2440evb_nand_info; | ||
220 | s3c_device_sdi.name = "s3c2440-sdi"; | ||
221 | s3c_device_sdi.dev.platform_data = &at2440evb_mci_pdata; | 219 | s3c_device_sdi.dev.platform_data = &at2440evb_mci_pdata; |
222 | 220 | ||
223 | s3c24xx_init_io(at2440evb_iodesc, ARRAY_SIZE(at2440evb_iodesc)); | 221 | s3c24xx_init_io(at2440evb_iodesc, ARRAY_SIZE(at2440evb_iodesc)); |
@@ -228,6 +226,7 @@ static void __init at2440evb_map_io(void) | |||
228 | static void __init at2440evb_init(void) | 226 | static void __init at2440evb_init(void) |
229 | { | 227 | { |
230 | s3c24xx_fb_set_platdata(&at2440evb_fb_info); | 228 | s3c24xx_fb_set_platdata(&at2440evb_fb_info); |
229 | s3c_nand_set_platdata(&at2440evb_nand_info); | ||
231 | s3c_i2c0_set_platdata(NULL); | 230 | s3c_i2c0_set_platdata(NULL); |
232 | 231 | ||
233 | platform_add_devices(at2440evb_devices, ARRAY_SIZE(at2440evb_devices)); | 232 | platform_add_devices(at2440evb_devices, ARRAY_SIZE(at2440evb_devices)); |
diff --git a/arch/arm/mach-s3c2440/mach-mini2440.c b/arch/arm/mach-s3c2440/mach-mini2440.c index 1c3382fefdd2..547d4fc99131 100644 --- a/arch/arm/mach-s3c2440/mach-mini2440.c +++ b/arch/arm/mach-s3c2440/mach-mini2440.c | |||
@@ -532,7 +532,6 @@ static void __init mini2440_map_io(void) | |||
532 | s3c24xx_init_clocks(12000000); | 532 | s3c24xx_init_clocks(12000000); |
533 | s3c24xx_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs)); | 533 | s3c24xx_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs)); |
534 | 534 | ||
535 | s3c_device_nand.dev.platform_data = &mini2440_nand_info; | ||
536 | s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg; | 535 | s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg; |
537 | } | 536 | } |
538 | 537 | ||
@@ -677,8 +676,11 @@ static void __init mini2440_init(void) | |||
677 | printk("\n"); | 676 | printk("\n"); |
678 | s3c24xx_fb_set_platdata(&mini2440_fb_info); | 677 | s3c24xx_fb_set_platdata(&mini2440_fb_info); |
679 | } | 678 | } |
679 | |||
680 | s3c24xx_udc_set_platdata(&mini2440_udc_cfg); | 680 | s3c24xx_udc_set_platdata(&mini2440_udc_cfg); |
681 | s3c_nand_set_platdata(&mini2440_nand_info); | ||
681 | s3c_i2c0_set_platdata(NULL); | 682 | s3c_i2c0_set_platdata(NULL); |
683 | |||
682 | i2c_register_board_info(0, mini2440_i2c_devs, | 684 | i2c_register_board_info(0, mini2440_i2c_devs, |
683 | ARRAY_SIZE(mini2440_i2c_devs)); | 685 | ARRAY_SIZE(mini2440_i2c_devs)); |
684 | 686 | ||
diff --git a/arch/arm/mach-s3c2440/mach-osiris.c b/arch/arm/mach-s3c2440/mach-osiris.c index 9b04de2481d7..015dfb2a80da 100644 --- a/arch/arm/mach-s3c2440/mach-osiris.c +++ b/arch/arm/mach-s3c2440/mach-osiris.c | |||
@@ -150,7 +150,7 @@ static int external_map[] = { 2 }; | |||
150 | static int chip0_map[] = { 0 }; | 150 | static int chip0_map[] = { 0 }; |
151 | static int chip1_map[] = { 1 }; | 151 | static int chip1_map[] = { 1 }; |
152 | 152 | ||
153 | static struct mtd_partition osiris_default_nand_part[] = { | 153 | static struct mtd_partition __initdata osiris_default_nand_part[] = { |
154 | [0] = { | 154 | [0] = { |
155 | .name = "Boot Agent", | 155 | .name = "Boot Agent", |
156 | .size = SZ_16K, | 156 | .size = SZ_16K, |
@@ -173,7 +173,7 @@ static struct mtd_partition osiris_default_nand_part[] = { | |||
173 | } | 173 | } |
174 | }; | 174 | }; |
175 | 175 | ||
176 | static struct mtd_partition osiris_default_nand_part_large[] = { | 176 | static struct mtd_partition __initdata osiris_default_nand_part_large[] = { |
177 | [0] = { | 177 | [0] = { |
178 | .name = "Boot Agent", | 178 | .name = "Boot Agent", |
179 | .size = SZ_128K, | 179 | .size = SZ_128K, |
@@ -203,7 +203,7 @@ static struct mtd_partition osiris_default_nand_part_large[] = { | |||
203 | * socket. | 203 | * socket. |
204 | */ | 204 | */ |
205 | 205 | ||
206 | static struct s3c2410_nand_set osiris_nand_sets[] = { | 206 | static struct s3c2410_nand_set __initdata osiris_nand_sets[] = { |
207 | [1] = { | 207 | [1] = { |
208 | .name = "External", | 208 | .name = "External", |
209 | .nr_chips = 1, | 209 | .nr_chips = 1, |
@@ -245,7 +245,7 @@ static void osiris_nand_select(struct s3c2410_nand_set *set, int slot) | |||
245 | __raw_writeb(tmp, OSIRIS_VA_CTRL0); | 245 | __raw_writeb(tmp, OSIRIS_VA_CTRL0); |
246 | } | 246 | } |
247 | 247 | ||
248 | static struct s3c2410_platform_nand osiris_nand_info = { | 248 | static struct s3c2410_platform_nand __initdata osiris_nand_info = { |
249 | .tacls = 25, | 249 | .tacls = 25, |
250 | .twrph0 = 60, | 250 | .twrph0 = 60, |
251 | .twrph1 = 60, | 251 | .twrph1 = 60, |
@@ -411,8 +411,6 @@ static void __init osiris_map_io(void) | |||
411 | 411 | ||
412 | s3c24xx_register_clocks(osiris_clocks, ARRAY_SIZE(osiris_clocks)); | 412 | s3c24xx_register_clocks(osiris_clocks, ARRAY_SIZE(osiris_clocks)); |
413 | 413 | ||
414 | s3c_device_nand.dev.platform_data = &osiris_nand_info; | ||
415 | |||
416 | s3c24xx_init_io(osiris_iodesc, ARRAY_SIZE(osiris_iodesc)); | 414 | s3c24xx_init_io(osiris_iodesc, ARRAY_SIZE(osiris_iodesc)); |
417 | s3c24xx_init_clocks(0); | 415 | s3c24xx_init_clocks(0); |
418 | s3c24xx_init_uarts(osiris_uartcfgs, ARRAY_SIZE(osiris_uartcfgs)); | 416 | s3c24xx_init_uarts(osiris_uartcfgs, ARRAY_SIZE(osiris_uartcfgs)); |
@@ -442,6 +440,7 @@ static void __init osiris_init(void) | |||
442 | sysdev_register(&osiris_pm_sysdev); | 440 | sysdev_register(&osiris_pm_sysdev); |
443 | 441 | ||
444 | s3c_i2c0_set_platdata(NULL); | 442 | s3c_i2c0_set_platdata(NULL); |
443 | s3c_nand_set_platdata(&osiris_nand_info); | ||
445 | 444 | ||
446 | s3c_cpufreq_setboard(&osiris_cpufreq); | 445 | s3c_cpufreq_setboard(&osiris_cpufreq); |
447 | 446 | ||
diff --git a/arch/arm/mach-s3c2440/mach-rx3715.c b/arch/arm/mach-s3c2440/mach-rx3715.c index e394ecd01510..a952a13afb1f 100644 --- a/arch/arm/mach-s3c2440/mach-rx3715.c +++ b/arch/arm/mach-s3c2440/mach-rx3715.c | |||
@@ -149,7 +149,7 @@ static struct s3c2410fb_mach_info rx3715_fb_info __initdata = { | |||
149 | .gpdup_mask = 0xffffffff, | 149 | .gpdup_mask = 0xffffffff, |
150 | }; | 150 | }; |
151 | 151 | ||
152 | static struct mtd_partition rx3715_nand_part[] = { | 152 | static struct mtd_partition __initdata rx3715_nand_part[] = { |
153 | [0] = { | 153 | [0] = { |
154 | .name = "Whole Flash", | 154 | .name = "Whole Flash", |
155 | .offset = 0, | 155 | .offset = 0, |
@@ -158,7 +158,7 @@ static struct mtd_partition rx3715_nand_part[] = { | |||
158 | } | 158 | } |
159 | }; | 159 | }; |
160 | 160 | ||
161 | static struct s3c2410_nand_set rx3715_nand_sets[] = { | 161 | static struct s3c2410_nand_set __initdata rx3715_nand_sets[] = { |
162 | [0] = { | 162 | [0] = { |
163 | .name = "Internal", | 163 | .name = "Internal", |
164 | .nr_chips = 1, | 164 | .nr_chips = 1, |
@@ -167,7 +167,7 @@ static struct s3c2410_nand_set rx3715_nand_sets[] = { | |||
167 | }, | 167 | }, |
168 | }; | 168 | }; |
169 | 169 | ||
170 | static struct s3c2410_platform_nand rx3715_nand_info = { | 170 | static struct s3c2410_platform_nand __initdata rx3715_nand_info = { |
171 | .tacls = 25, | 171 | .tacls = 25, |
172 | .twrph0 = 50, | 172 | .twrph0 = 50, |
173 | .twrph1 = 15, | 173 | .twrph1 = 15, |
@@ -186,8 +186,6 @@ static struct platform_device *rx3715_devices[] __initdata = { | |||
186 | 186 | ||
187 | static void __init rx3715_map_io(void) | 187 | static void __init rx3715_map_io(void) |
188 | { | 188 | { |
189 | s3c_device_nand.dev.platform_data = &rx3715_nand_info; | ||
190 | |||
191 | s3c24xx_init_io(rx3715_iodesc, ARRAY_SIZE(rx3715_iodesc)); | 189 | s3c24xx_init_io(rx3715_iodesc, ARRAY_SIZE(rx3715_iodesc)); |
192 | s3c24xx_init_clocks(16934000); | 190 | s3c24xx_init_clocks(16934000); |
193 | s3c24xx_init_uarts(rx3715_uartcfgs, ARRAY_SIZE(rx3715_uartcfgs)); | 191 | s3c24xx_init_uarts(rx3715_uartcfgs, ARRAY_SIZE(rx3715_uartcfgs)); |
@@ -205,6 +203,7 @@ static void __init rx3715_init_machine(void) | |||
205 | #endif | 203 | #endif |
206 | s3c_pm_init(); | 204 | s3c_pm_init(); |
207 | 205 | ||
206 | s3c_nand_set_platdata(&rx3715_nand_info); | ||
208 | s3c24xx_fb_set_platdata(&rx3715_fb_info); | 207 | s3c24xx_fb_set_platdata(&rx3715_fb_info); |
209 | platform_add_devices(rx3715_devices, ARRAY_SIZE(rx3715_devices)); | 208 | platform_add_devices(rx3715_devices, ARRAY_SIZE(rx3715_devices)); |
210 | } | 209 | } |
diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c index 0fb385bd9cd9..f76d6ff4aeb9 100644 --- a/arch/arm/mach-s3c2442/mach-gta02.c +++ b/arch/arm/mach-s3c2442/mach-gta02.c | |||
@@ -423,7 +423,7 @@ static struct i2c_board_info gta02_i2c_devs[] __initdata = { | |||
423 | }, | 423 | }, |
424 | }; | 424 | }; |
425 | 425 | ||
426 | static struct s3c2410_nand_set gta02_nand_sets[] = { | 426 | static struct s3c2410_nand_set __initdata gta02_nand_sets[] = { |
427 | [0] = { | 427 | [0] = { |
428 | /* | 428 | /* |
429 | * This name is also hard-coded in the boot loaders, so | 429 | * This name is also hard-coded in the boot loaders, so |
@@ -442,7 +442,7 @@ static struct s3c2410_nand_set gta02_nand_sets[] = { | |||
442 | * data sheet (K5D2G13ACM-D075 MCP Memory). | 442 | * data sheet (K5D2G13ACM-D075 MCP Memory). |
443 | */ | 443 | */ |
444 | 444 | ||
445 | static struct s3c2410_platform_nand gta02_nand_info = { | 445 | static struct s3c2410_platform_nand __initdata gta02_nand_info = { |
446 | .tacls = 0, | 446 | .tacls = 0, |
447 | .twrph0 = 25, | 447 | .twrph0 = 25, |
448 | .twrph1 = 15, | 448 | .twrph1 = 15, |
@@ -621,9 +621,9 @@ static void __init gta02_machine_init(void) | |||
621 | #endif | 621 | #endif |
622 | 622 | ||
623 | s3c_device_usb.dev.platform_data = >a02_usb_info; | 623 | s3c_device_usb.dev.platform_data = >a02_usb_info; |
624 | s3c_device_nand.dev.platform_data = >a02_nand_info; | ||
625 | 624 | ||
626 | s3c24xx_udc_set_platdata(>a02_udc_cfg); | 625 | s3c24xx_udc_set_platdata(>a02_udc_cfg); |
626 | s3c_nand_set_platdata(>a02_nand_info); | ||
627 | s3c_i2c0_set_platdata(NULL); | 627 | s3c_i2c0_set_platdata(NULL); |
628 | 628 | ||
629 | i2c_register_board_info(0, gta02_i2c_devs, ARRAY_SIZE(gta02_i2c_devs)); | 629 | i2c_register_board_info(0, gta02_i2c_devs, ARRAY_SIZE(gta02_i2c_devs)); |
diff --git a/arch/arm/mach-s3c6410/mach-hmt.c b/arch/arm/mach-s3c6410/mach-hmt.c index c5741056193f..cdd4b5378552 100644 --- a/arch/arm/mach-s3c6410/mach-hmt.c +++ b/arch/arm/mach-s3c6410/mach-hmt.c | |||
@@ -250,7 +250,7 @@ static void __init hmt_machine_init(void) | |||
250 | { | 250 | { |
251 | s3c_i2c0_set_platdata(NULL); | 251 | s3c_i2c0_set_platdata(NULL); |
252 | s3c_fb_set_platdata(&hmt_lcd_pdata); | 252 | s3c_fb_set_platdata(&hmt_lcd_pdata); |
253 | s3c_device_nand.dev.platform_data = &hmt_nand_info; | 253 | s3c_nand_set_platdata(&hmt_nand_info); |
254 | 254 | ||
255 | gpio_request(S3C64XX_GPC(7), "usb power"); | 255 | gpio_request(S3C64XX_GPC(7), "usb power"); |
256 | gpio_direction_output(S3C64XX_GPC(7), 0); | 256 | gpio_direction_output(S3C64XX_GPC(7), 0); |
diff --git a/arch/arm/plat-s3c/dev-nand.c b/arch/arm/plat-s3c/dev-nand.c index 4e5323732434..e771e77dcd54 100644 --- a/arch/arm/plat-s3c/dev-nand.c +++ b/arch/arm/plat-s3c/dev-nand.c | |||
@@ -9,8 +9,12 @@ | |||
9 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | 11 | ||
12 | #include <linux/mtd/mtd.h> | ||
13 | #include <linux/mtd/partitions.h> | ||
14 | |||
12 | #include <mach/map.h> | 15 | #include <mach/map.h> |
13 | #include <plat/devs.h> | 16 | #include <plat/devs.h> |
17 | #include <plat/nand.h> | ||
14 | 18 | ||
15 | static struct resource s3c_nand_resource[] = { | 19 | static struct resource s3c_nand_resource[] = { |
16 | [0] = { | 20 | [0] = { |
@@ -28,3 +32,96 @@ struct platform_device s3c_device_nand = { | |||
28 | }; | 32 | }; |
29 | 33 | ||
30 | EXPORT_SYMBOL(s3c_device_nand); | 34 | EXPORT_SYMBOL(s3c_device_nand); |
35 | |||
36 | /** | ||
37 | * s3c_nand_copy_set() - copy nand set data | ||
38 | * @set: The new structure, directly copied from the old. | ||
39 | * | ||
40 | * Copy all the fields from the NAND set field from what is probably __initdata | ||
41 | * to new kernel memory. The code returns 0 if the copy happened correctly or | ||
42 | * an error code for the calling function to display. | ||
43 | * | ||
44 | * Note, we currently do not try and look to see if we've already copied the | ||
45 | * data in a previous set. | ||
46 | */ | ||
47 | static int __init s3c_nand_copy_set(struct s3c2410_nand_set *set) | ||
48 | { | ||
49 | void *ptr; | ||
50 | int size; | ||
51 | |||
52 | size = sizeof(struct mtd_partition) * set->nr_partitions; | ||
53 | if (size) { | ||
54 | ptr = kmemdup(set->partitions, size, GFP_KERNEL); | ||
55 | set->partitions = ptr; | ||
56 | |||
57 | if (!ptr) | ||
58 | return -ENOMEM; | ||
59 | } | ||
60 | |||
61 | size = sizeof(int) * set->nr_chips; | ||
62 | if (size) { | ||
63 | ptr = kmemdup(set->nr_map, size, GFP_KERNEL); | ||
64 | set->nr_map = ptr; | ||
65 | |||
66 | if (!ptr) | ||
67 | return -ENOMEM; | ||
68 | } | ||
69 | |||
70 | if (set->ecc_layout) { | ||
71 | ptr = kmemdup(set->ecc_layout, | ||
72 | sizeof(struct nand_ecclayout), GFP_KERNEL); | ||
73 | set->ecc_layout = ptr; | ||
74 | |||
75 | if (!ptr) | ||
76 | return -ENOMEM; | ||
77 | } | ||
78 | |||
79 | return 0; | ||
80 | } | ||
81 | |||
82 | void __init s3c_nand_set_platdata(struct s3c2410_platform_nand *nand) | ||
83 | { | ||
84 | struct s3c2410_platform_nand *npd; | ||
85 | int size; | ||
86 | int ret; | ||
87 | |||
88 | /* note, if we get a failure in allocation, we simply drop out of the | ||
89 | * function. If there is so little memory available at initialisation | ||
90 | * time then there is little chance the system is going to run. | ||
91 | */ | ||
92 | |||
93 | npd = kmemdup(nand, sizeof(struct s3c2410_platform_nand), GFP_KERNEL); | ||
94 | if (!npd) { | ||
95 | printk(KERN_ERR "%s: failed copying platform data\n", __func__); | ||
96 | return; | ||
97 | } | ||
98 | |||
99 | /* now see if we need to copy any of the nand set data */ | ||
100 | |||
101 | size = sizeof(struct s3c2410_nand_set) * npd->nr_sets; | ||
102 | if (size) { | ||
103 | struct s3c2410_nand_set *from = npd->sets; | ||
104 | struct s3c2410_nand_set *to; | ||
105 | int i; | ||
106 | |||
107 | to = kmemdup(from, size, GFP_KERNEL); | ||
108 | npd->sets = to; /* set, even if we failed */ | ||
109 | |||
110 | if (!to) { | ||
111 | printk(KERN_ERR "%s: no memory for sets\n", __func__); | ||
112 | return; | ||
113 | } | ||
114 | |||
115 | for (i = 0; i < npd->nr_sets; i++) { | ||
116 | ret = s3c_nand_copy_set(to); | ||
117 | if (!ret) { | ||
118 | printk(KERN_ERR "%s: failed to copy set %d\n", | ||
119 | __func__, i); | ||
120 | return; | ||
121 | } | ||
122 | to++; | ||
123 | } | ||
124 | } | ||
125 | } | ||
126 | |||
127 | EXPORT_SYMBOL_GPL(s3c_nand_set_platdata); | ||
diff --git a/arch/arm/plat-s3c/include/plat/nand.h b/arch/arm/plat-s3c/include/plat/nand.h index 18f958801e64..065985978413 100644 --- a/arch/arm/plat-s3c/include/plat/nand.h +++ b/arch/arm/plat-s3c/include/plat/nand.h | |||
@@ -55,3 +55,11 @@ struct s3c2410_platform_nand { | |||
55 | int chip); | 55 | int chip); |
56 | }; | 56 | }; |
57 | 57 | ||
58 | /** | ||
59 | * s3c_nand_set_platdata() - register NAND platform data. | ||
60 | * @nand: The NAND platform data to register with s3c_device_nand. | ||
61 | * | ||
62 | * This function copies the given NAND platform data, @nand and registers | ||
63 | * it with the s3c_device_nand. This allows @nand to be __initdata. | ||
64 | */ | ||
65 | extern void s3c_nand_set_platdata(struct s3c2410_platform_nand *nand); | ||
diff --git a/arch/arm/plat-s3c24xx/common-smdk.c b/arch/arm/plat-s3c24xx/common-smdk.c index aa119863c5ce..9e0e20ad2e46 100644 --- a/arch/arm/plat-s3c24xx/common-smdk.c +++ b/arch/arm/plat-s3c24xx/common-smdk.c | |||
@@ -198,7 +198,7 @@ void __init smdk_machine_init(void) | |||
198 | if (machine_is_smdk2443()) | 198 | if (machine_is_smdk2443()) |
199 | smdk_nand_info.twrph0 = 50; | 199 | smdk_nand_info.twrph0 = 50; |
200 | 200 | ||
201 | s3c_device_nand.dev.platform_data = &smdk_nand_info; | 201 | s3c_nand_set_platdata(&smdk_nand_info); |
202 | 202 | ||
203 | platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs)); | 203 | platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs)); |
204 | 204 | ||