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