diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-10-28 07:27:34 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-10-28 07:27:34 -0400 |
commit | f9cef506815386df4bd7e463b59e0a0984ce0355 (patch) | |
tree | b26a202b2f0472e3ebe889012312b115917717f9 /arch/arm | |
parent | 9ae21ca362679757786f5abe556c7943e9001426 (diff) | |
parent | cbff3eb3e6e3c618583a7435f87c1548aa12b0ad (diff) |
Merge branch 'for-rmk' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into devel-stable
Conflicts:
arch/arm/mach-s3c64xx/dev-audio.c
Diffstat (limited to 'arch/arm')
157 files changed, 6574 insertions, 1314 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 9b2ef2fb3cae..c0d6bdae263a 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -727,9 +727,11 @@ config ARCH_S5PC100 | |||
727 | config ARCH_S5PV210 | 727 | config ARCH_S5PV210 |
728 | bool "Samsung S5PV210/S5PC110" | 728 | bool "Samsung S5PV210/S5PC110" |
729 | select CPU_V7 | 729 | select CPU_V7 |
730 | select ARCH_SPARSEMEM_ENABLE | ||
730 | select GENERIC_GPIO | 731 | select GENERIC_GPIO |
731 | select HAVE_CLK | 732 | select HAVE_CLK |
732 | select ARM_L1_CACHE_SHIFT_6 | 733 | select ARM_L1_CACHE_SHIFT_6 |
734 | select ARCH_HAS_CPUFREQ | ||
733 | select ARCH_USES_GETTIMEOFFSET | 735 | select ARCH_USES_GETTIMEOFFSET |
734 | select HAVE_S3C2410_I2C | 736 | select HAVE_S3C2410_I2C |
735 | select HAVE_S3C_RTC | 737 | select HAVE_S3C_RTC |
@@ -740,9 +742,13 @@ config ARCH_S5PV210 | |||
740 | config ARCH_S5PV310 | 742 | config ARCH_S5PV310 |
741 | bool "Samsung S5PV310/S5PC210" | 743 | bool "Samsung S5PV310/S5PC210" |
742 | select CPU_V7 | 744 | select CPU_V7 |
745 | select ARCH_SPARSEMEM_ENABLE | ||
743 | select GENERIC_GPIO | 746 | select GENERIC_GPIO |
744 | select HAVE_CLK | 747 | select HAVE_CLK |
745 | select GENERIC_CLOCKEVENTS | 748 | select GENERIC_CLOCKEVENTS |
749 | select HAVE_S3C_RTC | ||
750 | select HAVE_S3C2410_I2C | ||
751 | select HAVE_S3C2410_WATCHDOG | ||
746 | help | 752 | help |
747 | Samsung S5PV310 series based systems | 753 | Samsung S5PV310 series based systems |
748 | 754 | ||
diff --git a/arch/arm/include/asm/hardware/cache-l2x0.h b/arch/arm/include/asm/hardware/cache-l2x0.h index 6bcba48800fe..351ca8d02aa7 100644 --- a/arch/arm/include/asm/hardware/cache-l2x0.h +++ b/arch/arm/include/asm/hardware/cache-l2x0.h | |||
@@ -53,6 +53,10 @@ | |||
53 | #define L2X0_LINE_DATA 0xF10 | 53 | #define L2X0_LINE_DATA 0xF10 |
54 | #define L2X0_LINE_TAG 0xF30 | 54 | #define L2X0_LINE_TAG 0xF30 |
55 | #define L2X0_DEBUG_CTRL 0xF40 | 55 | #define L2X0_DEBUG_CTRL 0xF40 |
56 | #define L2X0_PREFETCH_CTRL 0xF60 | ||
57 | #define L2X0_POWER_CTRL 0xF80 | ||
58 | #define L2X0_DYNAMIC_CLK_GATING_EN (1 << 1) | ||
59 | #define L2X0_STNDBY_MODE_EN (1 << 0) | ||
56 | 60 | ||
57 | #ifndef __ASSEMBLY__ | 61 | #ifndef __ASSEMBLY__ |
58 | extern void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask); | 62 | extern void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask); |
diff --git a/arch/arm/mach-s3c2410/include/mach/gpio.h b/arch/arm/mach-s3c2410/include/mach/gpio.h index b649bf2ccd5c..f7f6b07df30e 100644 --- a/arch/arm/mach-s3c2410/include/mach/gpio.h +++ b/arch/arm/mach-s3c2410/include/mach/gpio.h | |||
@@ -22,6 +22,8 @@ | |||
22 | 22 | ||
23 | #ifdef CONFIG_CPU_S3C244X | 23 | #ifdef CONFIG_CPU_S3C244X |
24 | #define ARCH_NR_GPIOS (32 * 9 + CONFIG_S3C24XX_GPIO_EXTRA) | 24 | #define ARCH_NR_GPIOS (32 * 9 + CONFIG_S3C24XX_GPIO_EXTRA) |
25 | #elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416) | ||
26 | #define ARCH_NR_GPIOS (32 * 12 + CONFIG_S3C24XX_GPIO_EXTRA) | ||
25 | #else | 27 | #else |
26 | #define ARCH_NR_GPIOS (256 + CONFIG_S3C24XX_GPIO_EXTRA) | 28 | #define ARCH_NR_GPIOS (256 + CONFIG_S3C24XX_GPIO_EXTRA) |
27 | #endif | 29 | #endif |
@@ -30,8 +32,10 @@ | |||
30 | #include <mach/gpio-nrs.h> | 32 | #include <mach/gpio-nrs.h> |
31 | #include <mach/gpio-fns.h> | 33 | #include <mach/gpio-fns.h> |
32 | 34 | ||
33 | #ifdef CONFIG_CPU_S3C24XX | 35 | #ifdef CONFIG_CPU_S3C244X |
34 | #define S3C_GPIO_END (S3C2410_GPIO_BANKJ + 32) | 36 | #define S3C_GPIO_END (S3C2410_GPJ(0) + 32) |
37 | #elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416) | ||
38 | #define S3C_GPIO_END (S3C2410_GPM(0) + 32) | ||
35 | #else | 39 | #else |
36 | #define S3C_GPIO_END (S3C2410_GPIO_BANKH + 32) | 40 | #define S3C_GPIO_END (S3C2410_GPH(0) + 32) |
37 | #endif | 41 | #endif |
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-s3c2443-clock.h b/arch/arm/mach-s3c2410/include/mach/regs-s3c2443-clock.h index 08ab9dfb6ae6..101aeea22310 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-s3c2443-clock.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-s3c2443-clock.h | |||
@@ -118,6 +118,8 @@ | |||
118 | #define S3C2443_SCLKCON_UARTCLK (1<<8) | 118 | #define S3C2443_SCLKCON_UARTCLK (1<<8) |
119 | #define S3C2443_SCLKCON_USBHOST (1<<1) | 119 | #define S3C2443_SCLKCON_USBHOST (1<<1) |
120 | 120 | ||
121 | #define S3C2443_PWRCFG_SLEEP (1<<15) | ||
122 | |||
121 | #include <asm/div64.h> | 123 | #include <asm/div64.h> |
122 | 124 | ||
123 | static inline unsigned int | 125 | static inline unsigned int |
diff --git a/arch/arm/mach-s3c2410/include/mach/vmalloc.h b/arch/arm/mach-s3c2410/include/mach/vmalloc.h index 54297eb0bf5e..7a311e8dddba 100644 --- a/arch/arm/mach-s3c2410/include/mach/vmalloc.h +++ b/arch/arm/mach-s3c2410/include/mach/vmalloc.h | |||
@@ -15,6 +15,6 @@ | |||
15 | #ifndef __ASM_ARCH_VMALLOC_H | 15 | #ifndef __ASM_ARCH_VMALLOC_H |
16 | #define __ASM_ARCH_VMALLOC_H | 16 | #define __ASM_ARCH_VMALLOC_H |
17 | 17 | ||
18 | #define VMALLOC_END 0xE0000000UL | 18 | #define VMALLOC_END 0xF6000000UL |
19 | 19 | ||
20 | #endif /* __ASM_ARCH_VMALLOC_H */ | 20 | #endif /* __ASM_ARCH_VMALLOC_H */ |
diff --git a/arch/arm/mach-s3c2412/s3c2412.c b/arch/arm/mach-s3c2412/s3c2412.c index bef39f77729d..4c6df51ddf33 100644 --- a/arch/arm/mach-s3c2412/s3c2412.c +++ b/arch/arm/mach-s3c2412/s3c2412.c | |||
@@ -51,6 +51,7 @@ | |||
51 | #include <plat/clock.h> | 51 | #include <plat/clock.h> |
52 | #include <plat/pm.h> | 52 | #include <plat/pm.h> |
53 | #include <plat/pll.h> | 53 | #include <plat/pll.h> |
54 | #include <plat/nand-core.h> | ||
54 | 55 | ||
55 | #ifndef CONFIG_CPU_S3C2412_ONLY | 56 | #ifndef CONFIG_CPU_S3C2412_ONLY |
56 | void __iomem *s3c24xx_va_gpio2 = S3C24XX_VA_GPIO; | 57 | void __iomem *s3c24xx_va_gpio2 = S3C24XX_VA_GPIO; |
@@ -92,7 +93,7 @@ void __init s3c2412_init_uarts(struct s3c2410_uartcfg *cfg, int no) | |||
92 | /* rename devices that are s3c2412/s3c2413 specific */ | 93 | /* rename devices that are s3c2412/s3c2413 specific */ |
93 | s3c_device_sdi.name = "s3c2412-sdi"; | 94 | s3c_device_sdi.name = "s3c2412-sdi"; |
94 | s3c_device_lcd.name = "s3c2412-lcd"; | 95 | s3c_device_lcd.name = "s3c2412-lcd"; |
95 | s3c_device_nand.name = "s3c2412-nand"; | 96 | s3c_nand_setname("s3c2412-nand"); |
96 | 97 | ||
97 | /* alter IRQ of SDI controller */ | 98 | /* alter IRQ of SDI controller */ |
98 | 99 | ||
diff --git a/arch/arm/mach-s3c2416/Kconfig b/arch/arm/mach-s3c2416/Kconfig index 657e4fe17f39..87b9c9f003bd 100644 --- a/arch/arm/mach-s3c2416/Kconfig +++ b/arch/arm/mach-s3c2416/Kconfig | |||
@@ -25,6 +25,11 @@ config S3C2416_DMA | |||
25 | help | 25 | help |
26 | Internal config node for S3C2416 DMA support | 26 | Internal config node for S3C2416 DMA support |
27 | 27 | ||
28 | config S3C2416_PM | ||
29 | bool | ||
30 | help | ||
31 | Internal config node to apply S3C2416 power management | ||
32 | |||
28 | menu "S3C2416 Machines" | 33 | menu "S3C2416 Machines" |
29 | 34 | ||
30 | config MACH_SMDK2416 | 35 | config MACH_SMDK2416 |
@@ -33,6 +38,7 @@ config MACH_SMDK2416 | |||
33 | select S3C_DEV_FB | 38 | select S3C_DEV_FB |
34 | select S3C_DEV_HSMMC | 39 | select S3C_DEV_HSMMC |
35 | select S3C_DEV_HSMMC1 | 40 | select S3C_DEV_HSMMC1 |
41 | select S3C2416_PM if PM | ||
36 | help | 42 | help |
37 | Say Y here if you are using an SMDK2416 | 43 | Say Y here if you are using an SMDK2416 |
38 | 44 | ||
diff --git a/arch/arm/mach-s3c2416/Makefile b/arch/arm/mach-s3c2416/Makefile index 6c12c7bf40ad..ef038d62ffdb 100644 --- a/arch/arm/mach-s3c2416/Makefile +++ b/arch/arm/mach-s3c2416/Makefile | |||
@@ -11,7 +11,7 @@ obj- := | |||
11 | 11 | ||
12 | obj-$(CONFIG_CPU_S3C2416) += s3c2416.o clock.o | 12 | obj-$(CONFIG_CPU_S3C2416) += s3c2416.o clock.o |
13 | obj-$(CONFIG_CPU_S3C2416) += irq.o | 13 | obj-$(CONFIG_CPU_S3C2416) += irq.o |
14 | 14 | obj-$(CONFIG_S3C2416_PM) += pm.o | |
15 | #obj-$(CONFIG_S3C2416_DMA) += dma.o | 15 | #obj-$(CONFIG_S3C2416_DMA) += dma.o |
16 | 16 | ||
17 | # Machine support | 17 | # Machine support |
diff --git a/arch/arm/mach-s3c2416/irq.c b/arch/arm/mach-s3c2416/irq.c index 89f521d59d06..084d121f368c 100644 --- a/arch/arm/mach-s3c2416/irq.c +++ b/arch/arm/mach-s3c2416/irq.c | |||
@@ -243,6 +243,8 @@ static int __init s3c2416_irq_add(struct sys_device *sysdev) | |||
243 | 243 | ||
244 | static struct sysdev_driver s3c2416_irq_driver = { | 244 | static struct sysdev_driver s3c2416_irq_driver = { |
245 | .add = s3c2416_irq_add, | 245 | .add = s3c2416_irq_add, |
246 | .suspend = s3c24xx_irq_suspend, | ||
247 | .resume = s3c24xx_irq_resume, | ||
246 | }; | 248 | }; |
247 | 249 | ||
248 | static int __init s3c2416_irq_init(void) | 250 | static int __init s3c2416_irq_init(void) |
diff --git a/arch/arm/mach-s3c2416/pm.c b/arch/arm/mach-s3c2416/pm.c new file mode 100644 index 000000000000..4a04205b04d5 --- /dev/null +++ b/arch/arm/mach-s3c2416/pm.c | |||
@@ -0,0 +1,84 @@ | |||
1 | /* linux/arch/arm/mach-s3c2416/pm.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * S3C2416 - PM support (Based on Ben Dooks' S3C2412 PM support) | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/sysdev.h> | ||
14 | #include <linux/io.h> | ||
15 | |||
16 | #include <asm/cacheflush.h> | ||
17 | |||
18 | #include <mach/regs-power.h> | ||
19 | #include <mach/regs-s3c2443-clock.h> | ||
20 | |||
21 | #include <plat/cpu.h> | ||
22 | #include <plat/pm.h> | ||
23 | |||
24 | extern void s3c2412_sleep_enter(void); | ||
25 | |||
26 | static void s3c2416_cpu_suspend(void) | ||
27 | { | ||
28 | flush_cache_all(); | ||
29 | |||
30 | /* enable wakeup sources regardless of battery state */ | ||
31 | __raw_writel(S3C2443_PWRCFG_SLEEP, S3C2443_PWRCFG); | ||
32 | |||
33 | /* set the mode as sleep, 2BED represents "Go to BED" */ | ||
34 | __raw_writel(0x2BED, S3C2443_PWRMODE); | ||
35 | |||
36 | s3c2412_sleep_enter(); | ||
37 | } | ||
38 | |||
39 | static void s3c2416_pm_prepare(void) | ||
40 | { | ||
41 | /* | ||
42 | * write the magic value u-boot uses to check for resume into | ||
43 | * the INFORM0 register, and ensure INFORM1 is set to the | ||
44 | * correct address to resume from. | ||
45 | */ | ||
46 | __raw_writel(0x2BED, S3C2412_INFORM0); | ||
47 | __raw_writel(virt_to_phys(s3c_cpu_resume), S3C2412_INFORM1); | ||
48 | } | ||
49 | |||
50 | static int s3c2416_pm_add(struct sys_device *sysdev) | ||
51 | { | ||
52 | pm_cpu_prep = s3c2416_pm_prepare; | ||
53 | pm_cpu_sleep = s3c2416_cpu_suspend; | ||
54 | |||
55 | return 0; | ||
56 | } | ||
57 | |||
58 | static int s3c2416_pm_suspend(struct sys_device *dev, pm_message_t state) | ||
59 | { | ||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | static int s3c2416_pm_resume(struct sys_device *dev) | ||
64 | { | ||
65 | /* unset the return-from-sleep amd inform flags */ | ||
66 | __raw_writel(0x0, S3C2443_PWRMODE); | ||
67 | __raw_writel(0x0, S3C2412_INFORM0); | ||
68 | __raw_writel(0x0, S3C2412_INFORM1); | ||
69 | |||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | static struct sysdev_driver s3c2416_pm_driver = { | ||
74 | .add = s3c2416_pm_add, | ||
75 | .suspend = s3c2416_pm_suspend, | ||
76 | .resume = s3c2416_pm_resume, | ||
77 | }; | ||
78 | |||
79 | static __init int s3c2416_pm_init(void) | ||
80 | { | ||
81 | return sysdev_driver_register(&s3c2416_sysclass, &s3c2416_pm_driver); | ||
82 | } | ||
83 | |||
84 | arch_initcall(s3c2416_pm_init); | ||
diff --git a/arch/arm/mach-s3c2416/s3c2416.c b/arch/arm/mach-s3c2416/s3c2416.c index bc30245e133b..63f39cdc0972 100644 --- a/arch/arm/mach-s3c2416/s3c2416.c +++ b/arch/arm/mach-s3c2416/s3c2416.c | |||
@@ -56,6 +56,7 @@ | |||
56 | 56 | ||
57 | #include <plat/iic-core.h> | 57 | #include <plat/iic-core.h> |
58 | #include <plat/fb-core.h> | 58 | #include <plat/fb-core.h> |
59 | #include <plat/nand-core.h> | ||
59 | 60 | ||
60 | static struct map_desc s3c2416_iodesc[] __initdata = { | 61 | static struct map_desc s3c2416_iodesc[] __initdata = { |
61 | IODESC_ENT(WATCHDOG), | 62 | IODESC_ENT(WATCHDOG), |
@@ -100,7 +101,7 @@ void __init s3c2416_init_uarts(struct s3c2410_uartcfg *cfg, int no) | |||
100 | { | 101 | { |
101 | s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no); | 102 | s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no); |
102 | 103 | ||
103 | s3c_device_nand.name = "s3c2416-nand"; | 104 | s3c_nand_setname("s3c2412-nand"); |
104 | } | 105 | } |
105 | 106 | ||
106 | /* s3c2416_map_io | 107 | /* s3c2416_map_io |
diff --git a/arch/arm/mach-s3c2440/s3c244x.c b/arch/arm/mach-s3c2440/s3c244x.c index 5e4a97e76533..90c1707b9c95 100644 --- a/arch/arm/mach-s3c2440/s3c244x.c +++ b/arch/arm/mach-s3c2440/s3c244x.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <plat/cpu.h> | 44 | #include <plat/cpu.h> |
45 | #include <plat/pm.h> | 45 | #include <plat/pm.h> |
46 | #include <plat/pll.h> | 46 | #include <plat/pll.h> |
47 | #include <plat/nand-core.h> | ||
47 | 48 | ||
48 | static struct map_desc s3c244x_iodesc[] __initdata = { | 49 | static struct map_desc s3c244x_iodesc[] __initdata = { |
49 | IODESC_ENT(CLKPWR), | 50 | IODESC_ENT(CLKPWR), |
@@ -68,7 +69,7 @@ void __init s3c244x_map_io(void) | |||
68 | 69 | ||
69 | s3c_device_sdi.name = "s3c2440-sdi"; | 70 | s3c_device_sdi.name = "s3c2440-sdi"; |
70 | s3c_device_i2c0.name = "s3c2440-i2c"; | 71 | s3c_device_i2c0.name = "s3c2440-i2c"; |
71 | s3c_device_nand.name = "s3c2440-nand"; | 72 | s3c_nand_setname("s3c2440-nand"); |
72 | s3c_device_ts.name = "s3c2440-ts"; | 73 | s3c_device_ts.name = "s3c2440-ts"; |
73 | s3c_device_usbgadget.name = "s3c2440-usbgadget"; | 74 | s3c_device_usbgadget.name = "s3c2440-usbgadget"; |
74 | } | 75 | } |
diff --git a/arch/arm/mach-s3c2443/s3c2443.c b/arch/arm/mach-s3c2443/s3c2443.c index 839b6b2ced74..33d18dd1ebd5 100644 --- a/arch/arm/mach-s3c2443/s3c2443.c +++ b/arch/arm/mach-s3c2443/s3c2443.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <plat/devs.h> | 36 | #include <plat/devs.h> |
37 | #include <plat/cpu.h> | 37 | #include <plat/cpu.h> |
38 | #include <plat/fb-core.h> | 38 | #include <plat/fb-core.h> |
39 | #include <plat/nand-core.h> | ||
39 | 40 | ||
40 | static struct map_desc s3c2443_iodesc[] __initdata = { | 41 | static struct map_desc s3c2443_iodesc[] __initdata = { |
41 | IODESC_ENT(WATCHDOG), | 42 | IODESC_ENT(WATCHDOG), |
@@ -62,7 +63,7 @@ int __init s3c2443_init(void) | |||
62 | 63 | ||
63 | s3c24xx_reset_hook = s3c2443_hard_reset; | 64 | s3c24xx_reset_hook = s3c2443_hard_reset; |
64 | 65 | ||
65 | s3c_device_nand.name = "s3c2412-nand"; | 66 | s3c_nand_setname("s3c2412-nand"); |
66 | s3c_fb_setname("s3c2443-fb"); | 67 | s3c_fb_setname("s3c2443-fb"); |
67 | 68 | ||
68 | /* change WDT IRQ number */ | 69 | /* change WDT IRQ number */ |
diff --git a/arch/arm/mach-s3c24a0/include/mach/vmalloc.h b/arch/arm/mach-s3c24a0/include/mach/vmalloc.h index 914656820794..6480b15277f3 100644 --- a/arch/arm/mach-s3c24a0/include/mach/vmalloc.h +++ b/arch/arm/mach-s3c24a0/include/mach/vmalloc.h | |||
@@ -12,6 +12,6 @@ | |||
12 | #ifndef __ASM_ARCH_VMALLOC_H | 12 | #ifndef __ASM_ARCH_VMALLOC_H |
13 | #define __ASM_ARCH_VMALLOC_H | 13 | #define __ASM_ARCH_VMALLOC_H |
14 | 14 | ||
15 | #define VMALLOC_END (0xe0000000UL) | 15 | #define VMALLOC_END 0xF6000000UL |
16 | 16 | ||
17 | #endif /* __ASM_ARCH_VMALLOC_H */ | 17 | #endif /* __ASM_ARCH_VMALLOC_H */ |
diff --git a/arch/arm/mach-s3c64xx/Kconfig b/arch/arm/mach-s3c64xx/Kconfig index 1e4d78af7d84..fe1fd3007ae4 100644 --- a/arch/arm/mach-s3c64xx/Kconfig +++ b/arch/arm/mach-s3c64xx/Kconfig | |||
@@ -98,12 +98,33 @@ config MACH_ANW6410 | |||
98 | help | 98 | help |
99 | Machine support for the A&W6410 | 99 | Machine support for the A&W6410 |
100 | 100 | ||
101 | config MACH_MINI6410 | ||
102 | bool "MINI6410" | ||
103 | select CPU_S3C6410 | ||
104 | select S3C_DEV_HSMMC | ||
105 | select S3C_DEV_HSMMC1 | ||
106 | select S3C64XX_SETUP_SDHCI | ||
107 | select S3C_DEV_USB_HOST | ||
108 | select S3C_DEV_NAND | ||
109 | select S3C_DEV_FB | ||
110 | select S3C64XX_SETUP_FB_24BPP | ||
111 | select SAMSUNG_DEV_ADC | ||
112 | select SAMSUNG_DEV_TS | ||
113 | help | ||
114 | Machine support for the FriendlyARM MINI6410 | ||
115 | |||
101 | config MACH_REAL6410 | 116 | config MACH_REAL6410 |
102 | bool "REAL6410" | 117 | bool "REAL6410" |
103 | select CPU_S3C6410 | 118 | select CPU_S3C6410 |
104 | select S3C_DEV_HSMMC | 119 | select S3C_DEV_HSMMC |
105 | select S3C_DEV_HSMMC1 | 120 | select S3C_DEV_HSMMC1 |
106 | select S3C64XX_SETUP_SDHCI | 121 | select S3C64XX_SETUP_SDHCI |
122 | select S3C_DEV_FB | ||
123 | select S3C64XX_SETUP_FB_24BPP | ||
124 | select S3C_DEV_NAND | ||
125 | select SAMSUNG_DEV_ADC | ||
126 | select SAMSUNG_DEV_TS | ||
127 | select S3C_DEV_USB_HOST | ||
107 | help | 128 | help |
108 | Machine support for the CoreWind REAL6410 | 129 | Machine support for the CoreWind REAL6410 |
109 | 130 | ||
diff --git a/arch/arm/mach-s3c64xx/Makefile b/arch/arm/mach-s3c64xx/Makefile index 90221a2e0c55..4657363f0674 100644 --- a/arch/arm/mach-s3c64xx/Makefile +++ b/arch/arm/mach-s3c64xx/Makefile | |||
@@ -53,6 +53,7 @@ obj-$(CONFIG_MACH_ANW6410) += mach-anw6410.o | |||
53 | obj-$(CONFIG_MACH_SMDK6400) += mach-smdk6400.o | 53 | obj-$(CONFIG_MACH_SMDK6400) += mach-smdk6400.o |
54 | obj-$(CONFIG_MACH_SMDK6410) += mach-smdk6410.o | 54 | obj-$(CONFIG_MACH_SMDK6410) += mach-smdk6410.o |
55 | obj-$(CONFIG_MACH_REAL6410) += mach-real6410.o | 55 | obj-$(CONFIG_MACH_REAL6410) += mach-real6410.o |
56 | obj-$(CONFIG_MACH_MINI6410) += mach-mini6410.o | ||
56 | obj-$(CONFIG_MACH_NCP) += mach-ncp.o | 57 | obj-$(CONFIG_MACH_NCP) += mach-ncp.o |
57 | obj-$(CONFIG_MACH_HMT) += mach-hmt.o | 58 | obj-$(CONFIG_MACH_HMT) += mach-hmt.o |
58 | obj-$(CONFIG_MACH_SMARTQ) += mach-smartq.o | 59 | obj-$(CONFIG_MACH_SMARTQ) += mach-smartq.o |
diff --git a/arch/arm/mach-s3c64xx/dev-audio.c b/arch/arm/mach-s3c64xx/dev-audio.c index 3838335f125b..76426a32c013 100644 --- a/arch/arm/mach-s3c64xx/dev-audio.c +++ b/arch/arm/mach-s3c64xx/dev-audio.c | |||
@@ -22,27 +22,16 @@ | |||
22 | #include <plat/audio.h> | 22 | #include <plat/audio.h> |
23 | #include <plat/gpio-cfg.h> | 23 | #include <plat/gpio-cfg.h> |
24 | 24 | ||
25 | #include <mach/gpio-bank-c.h> | ||
26 | #include <mach/gpio-bank-d.h> | ||
27 | #include <mach/gpio-bank-e.h> | ||
28 | #include <mach/gpio-bank-h.h> | ||
29 | |||
30 | static int s3c64xx_i2sv3_cfg_gpio(struct platform_device *pdev) | 25 | static int s3c64xx_i2sv3_cfg_gpio(struct platform_device *pdev) |
31 | { | 26 | { |
27 | unsigned int base; | ||
28 | |||
32 | switch (pdev->id) { | 29 | switch (pdev->id) { |
33 | case 0: | 30 | case 0: |
34 | s3c_gpio_cfgpin(S3C64XX_GPD(0), S3C64XX_GPD0_I2S0_CLK); | 31 | base = S3C64XX_GPD(0); |
35 | s3c_gpio_cfgpin(S3C64XX_GPD(1), S3C64XX_GPD1_I2S0_CDCLK); | ||
36 | s3c_gpio_cfgpin(S3C64XX_GPD(2), S3C64XX_GPD2_I2S0_LRCLK); | ||
37 | s3c_gpio_cfgpin(S3C64XX_GPD(3), S3C64XX_GPD3_I2S0_DI); | ||
38 | s3c_gpio_cfgpin(S3C64XX_GPD(4), S3C64XX_GPD4_I2S0_D0); | ||
39 | break; | 32 | break; |
40 | case 1: | 33 | case 1: |
41 | s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C64XX_GPE0_I2S1_CLK); | 34 | base = S3C64XX_GPE(0); |
42 | s3c_gpio_cfgpin(S3C64XX_GPE(1), S3C64XX_GPE1_I2S1_CDCLK); | ||
43 | s3c_gpio_cfgpin(S3C64XX_GPE(2), S3C64XX_GPE2_I2S1_LRCLK); | ||
44 | s3c_gpio_cfgpin(S3C64XX_GPE(3), S3C64XX_GPE3_I2S1_DI); | ||
45 | s3c_gpio_cfgpin(S3C64XX_GPE(4), S3C64XX_GPE4_I2S1_D0); | ||
46 | break; | 35 | break; |
47 | default: | 36 | default: |
48 | printk(KERN_DEBUG "Invalid I2S Controller number: %d\n", | 37 | printk(KERN_DEBUG "Invalid I2S Controller number: %d\n", |
@@ -50,18 +39,17 @@ static int s3c64xx_i2sv3_cfg_gpio(struct platform_device *pdev) | |||
50 | return -EINVAL; | 39 | return -EINVAL; |
51 | } | 40 | } |
52 | 41 | ||
42 | s3c_gpio_cfgpin_range(base, 5, S3C_GPIO_SFN(3)); | ||
43 | |||
53 | return 0; | 44 | return 0; |
54 | } | 45 | } |
55 | 46 | ||
56 | static int s3c64xx_i2sv4_cfg_gpio(struct platform_device *pdev) | 47 | static int s3c64xx_i2sv4_cfg_gpio(struct platform_device *pdev) |
57 | { | 48 | { |
58 | s3c_gpio_cfgpin(S3C64XX_GPC(4), S3C64XX_GPC4_I2S_V40_DO0); | 49 | s3c_gpio_cfgpin(S3C64XX_GPC(4), S3C_GPIO_SFN(5)); |
59 | s3c_gpio_cfgpin(S3C64XX_GPC(5), S3C64XX_GPC5_I2S_V40_DO1); | 50 | s3c_gpio_cfgpin(S3C64XX_GPC(5), S3C_GPIO_SFN(5)); |
60 | s3c_gpio_cfgpin(S3C64XX_GPC(7), S3C64XX_GPC7_I2S_V40_DO2); | 51 | s3c_gpio_cfgpin(S3C64XX_GPC(7), S3C_GPIO_SFN(5)); |
61 | s3c_gpio_cfgpin(S3C64XX_GPH(6), S3C64XX_GPH6_I2S_V40_BCLK); | 52 | s3c_gpio_cfgpin_range(S3C64XX_GPH(6), 4, S3C_GPIO_SFN(5)); |
62 | s3c_gpio_cfgpin(S3C64XX_GPH(7), S3C64XX_GPH7_I2S_V40_CDCLK); | ||
63 | s3c_gpio_cfgpin(S3C64XX_GPH(8), S3C64XX_GPH8_I2S_V40_LRCLK); | ||
64 | s3c_gpio_cfgpin(S3C64XX_GPH(9), S3C64XX_GPH9_I2S_V40_DI); | ||
65 | 53 | ||
66 | return 0; | 54 | return 0; |
67 | } | 55 | } |
@@ -170,20 +158,14 @@ EXPORT_SYMBOL(s3c64xx_device_iisv4); | |||
170 | 158 | ||
171 | static int s3c64xx_pcm_cfg_gpio(struct platform_device *pdev) | 159 | static int s3c64xx_pcm_cfg_gpio(struct platform_device *pdev) |
172 | { | 160 | { |
161 | unsigned int base; | ||
162 | |||
173 | switch (pdev->id) { | 163 | switch (pdev->id) { |
174 | case 0: | 164 | case 0: |
175 | s3c_gpio_cfgpin(S3C64XX_GPD(0), S3C64XX_GPD0_PCM0_SCLK); | 165 | base = S3C64XX_GPD(0); |
176 | s3c_gpio_cfgpin(S3C64XX_GPD(1), S3C64XX_GPD1_PCM0_EXTCLK); | ||
177 | s3c_gpio_cfgpin(S3C64XX_GPD(2), S3C64XX_GPD2_PCM0_FSYNC); | ||
178 | s3c_gpio_cfgpin(S3C64XX_GPD(3), S3C64XX_GPD3_PCM0_SIN); | ||
179 | s3c_gpio_cfgpin(S3C64XX_GPD(4), S3C64XX_GPD4_PCM0_SOUT); | ||
180 | break; | 166 | break; |
181 | case 1: | 167 | case 1: |
182 | s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C64XX_GPE0_PCM1_SCLK); | 168 | base = S3C64XX_GPE(0); |
183 | s3c_gpio_cfgpin(S3C64XX_GPE(1), S3C64XX_GPE1_PCM1_EXTCLK); | ||
184 | s3c_gpio_cfgpin(S3C64XX_GPE(2), S3C64XX_GPE2_PCM1_FSYNC); | ||
185 | s3c_gpio_cfgpin(S3C64XX_GPE(3), S3C64XX_GPE3_PCM1_SIN); | ||
186 | s3c_gpio_cfgpin(S3C64XX_GPE(4), S3C64XX_GPE4_PCM1_SOUT); | ||
187 | break; | 169 | break; |
188 | default: | 170 | default: |
189 | printk(KERN_DEBUG "Invalid PCM Controller number: %d\n", | 171 | printk(KERN_DEBUG "Invalid PCM Controller number: %d\n", |
@@ -191,6 +173,7 @@ static int s3c64xx_pcm_cfg_gpio(struct platform_device *pdev) | |||
191 | return -EINVAL; | 173 | return -EINVAL; |
192 | } | 174 | } |
193 | 175 | ||
176 | s3c_gpio_cfgpin_range(base, 5, S3C_GPIO_SFN(2)); | ||
194 | return 0; | 177 | return 0; |
195 | } | 178 | } |
196 | 179 | ||
@@ -264,24 +247,12 @@ EXPORT_SYMBOL(s3c64xx_device_pcm1); | |||
264 | 247 | ||
265 | static int s3c64xx_ac97_cfg_gpd(struct platform_device *pdev) | 248 | static int s3c64xx_ac97_cfg_gpd(struct platform_device *pdev) |
266 | { | 249 | { |
267 | s3c_gpio_cfgpin(S3C64XX_GPD(0), S3C64XX_GPD0_AC97_BITCLK); | 250 | return s3c_gpio_cfgpin_range(S3C64XX_GPD(0), 5, S3C_GPIO_SFN(4)); |
268 | s3c_gpio_cfgpin(S3C64XX_GPD(1), S3C64XX_GPD1_AC97_nRESET); | ||
269 | s3c_gpio_cfgpin(S3C64XX_GPD(2), S3C64XX_GPD2_AC97_SYNC); | ||
270 | s3c_gpio_cfgpin(S3C64XX_GPD(3), S3C64XX_GPD3_AC97_SDI); | ||
271 | s3c_gpio_cfgpin(S3C64XX_GPD(4), S3C64XX_GPD4_AC97_SDO); | ||
272 | |||
273 | return 0; | ||
274 | } | 251 | } |
275 | 252 | ||
276 | static int s3c64xx_ac97_cfg_gpe(struct platform_device *pdev) | 253 | static int s3c64xx_ac97_cfg_gpe(struct platform_device *pdev) |
277 | { | 254 | { |
278 | s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C64XX_GPE0_AC97_BITCLK); | 255 | return s3c_gpio_cfgpin_range(S3C64XX_GPE(0), 5, S3C_GPIO_SFN(4)); |
279 | s3c_gpio_cfgpin(S3C64XX_GPE(1), S3C64XX_GPE1_AC97_nRESET); | ||
280 | s3c_gpio_cfgpin(S3C64XX_GPE(2), S3C64XX_GPE2_AC97_SYNC); | ||
281 | s3c_gpio_cfgpin(S3C64XX_GPE(3), S3C64XX_GPE3_AC97_SDI); | ||
282 | s3c_gpio_cfgpin(S3C64XX_GPE(4), S3C64XX_GPE4_AC97_SDO); | ||
283 | |||
284 | return 0; | ||
285 | } | 256 | } |
286 | 257 | ||
287 | static struct resource s3c64xx_ac97_resource[] = { | 258 | static struct resource s3c64xx_ac97_resource[] = { |
diff --git a/arch/arm/mach-s3c64xx/gpiolib.c b/arch/arm/mach-s3c64xx/gpiolib.c index 300dee4a667b..fd99a82e82c4 100644 --- a/arch/arm/mach-s3c64xx/gpiolib.c +++ b/arch/arm/mach-s3c64xx/gpiolib.c | |||
@@ -195,11 +195,6 @@ static struct s3c_gpio_cfg gpio_2bit_cfg_eint11 = { | |||
195 | .get_pull = s3c_gpio_getpull_updown, | 195 | .get_pull = s3c_gpio_getpull_updown, |
196 | }; | 196 | }; |
197 | 197 | ||
198 | int s3c64xx_gpio2int_gpn(struct gpio_chip *chip, unsigned pin) | ||
199 | { | ||
200 | return IRQ_EINT(0) + pin; | ||
201 | } | ||
202 | |||
203 | static struct s3c_gpio_chip gpio_2bit[] = { | 198 | static struct s3c_gpio_chip gpio_2bit[] = { |
204 | { | 199 | { |
205 | .base = S3C64XX_GPF_BASE, | 200 | .base = S3C64XX_GPF_BASE, |
@@ -227,12 +222,13 @@ static struct s3c_gpio_chip gpio_2bit[] = { | |||
227 | }, | 222 | }, |
228 | }, { | 223 | }, { |
229 | .base = S3C64XX_GPN_BASE, | 224 | .base = S3C64XX_GPN_BASE, |
225 | .irq_base = IRQ_EINT(0), | ||
230 | .config = &gpio_2bit_cfg_eint10, | 226 | .config = &gpio_2bit_cfg_eint10, |
231 | .chip = { | 227 | .chip = { |
232 | .base = S3C64XX_GPN(0), | 228 | .base = S3C64XX_GPN(0), |
233 | .ngpio = S3C64XX_GPIO_N_NR, | 229 | .ngpio = S3C64XX_GPIO_N_NR, |
234 | .label = "GPN", | 230 | .label = "GPN", |
235 | .to_irq = s3c64xx_gpio2int_gpn, | 231 | .to_irq = samsung_gpiolib_to_irq, |
236 | }, | 232 | }, |
237 | }, { | 233 | }, { |
238 | .base = S3C64XX_GPO_BASE, | 234 | .base = S3C64XX_GPO_BASE, |
diff --git a/arch/arm/mach-s3c64xx/include/mach/vmalloc.h b/arch/arm/mach-s3c64xx/include/mach/vmalloc.h index bc0e91389864..23f75e556a30 100644 --- a/arch/arm/mach-s3c64xx/include/mach/vmalloc.h +++ b/arch/arm/mach-s3c64xx/include/mach/vmalloc.h | |||
@@ -15,6 +15,6 @@ | |||
15 | #ifndef __ASM_ARCH_VMALLOC_H | 15 | #ifndef __ASM_ARCH_VMALLOC_H |
16 | #define __ASM_ARCH_VMALLOC_H | 16 | #define __ASM_ARCH_VMALLOC_H |
17 | 17 | ||
18 | #define VMALLOC_END 0xE0000000UL | 18 | #define VMALLOC_END 0xF6000000UL |
19 | 19 | ||
20 | #endif /* __ASM_ARCH_VMALLOC_H */ | 20 | #endif /* __ASM_ARCH_VMALLOC_H */ |
diff --git a/arch/arm/mach-s3c64xx/mach-mini6410.c b/arch/arm/mach-s3c64xx/mach-mini6410.c new file mode 100644 index 000000000000..249c62956471 --- /dev/null +++ b/arch/arm/mach-s3c64xx/mach-mini6410.c | |||
@@ -0,0 +1,357 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/mach-mini6410.c | ||
2 | * | ||
3 | * Copyright 2010 Darius Augulis <augulis.darius@gmail.com> | ||
4 | * Copyright 2008 Openmoko, Inc. | ||
5 | * Copyright 2008 Simtec Electronics | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * http://armlinux.simtec.co.uk/ | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | */ | ||
14 | |||
15 | #include <linux/init.h> | ||
16 | #include <linux/interrupt.h> | ||
17 | #include <linux/fb.h> | ||
18 | #include <linux/gpio.h> | ||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/list.h> | ||
21 | #include <linux/dm9000.h> | ||
22 | #include <linux/mtd/mtd.h> | ||
23 | #include <linux/mtd/partitions.h> | ||
24 | #include <linux/serial_core.h> | ||
25 | #include <linux/types.h> | ||
26 | |||
27 | #include <asm/mach-types.h> | ||
28 | #include <asm/mach/arch.h> | ||
29 | #include <asm/mach/map.h> | ||
30 | |||
31 | #include <mach/map.h> | ||
32 | #include <mach/regs-fb.h> | ||
33 | #include <mach/regs-gpio.h> | ||
34 | #include <mach/regs-modem.h> | ||
35 | #include <mach/regs-srom.h> | ||
36 | #include <mach/s3c6410.h> | ||
37 | |||
38 | #include <plat/adc.h> | ||
39 | #include <plat/cpu.h> | ||
40 | #include <plat/devs.h> | ||
41 | #include <plat/fb.h> | ||
42 | #include <plat/nand.h> | ||
43 | #include <plat/regs-serial.h> | ||
44 | #include <plat/ts.h> | ||
45 | |||
46 | #include <video/platform_lcd.h> | ||
47 | |||
48 | #define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK) | ||
49 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB) | ||
50 | #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) | ||
51 | |||
52 | static struct s3c2410_uartcfg mini6410_uartcfgs[] __initdata = { | ||
53 | [0] = { | ||
54 | .hwport = 0, | ||
55 | .flags = 0, | ||
56 | .ucon = UCON, | ||
57 | .ulcon = ULCON, | ||
58 | .ufcon = UFCON, | ||
59 | }, | ||
60 | [1] = { | ||
61 | .hwport = 1, | ||
62 | .flags = 0, | ||
63 | .ucon = UCON, | ||
64 | .ulcon = ULCON, | ||
65 | .ufcon = UFCON, | ||
66 | }, | ||
67 | [2] = { | ||
68 | .hwport = 2, | ||
69 | .flags = 0, | ||
70 | .ucon = UCON, | ||
71 | .ulcon = ULCON, | ||
72 | .ufcon = UFCON, | ||
73 | }, | ||
74 | [3] = { | ||
75 | .hwport = 3, | ||
76 | .flags = 0, | ||
77 | .ucon = UCON, | ||
78 | .ulcon = ULCON, | ||
79 | .ufcon = UFCON, | ||
80 | }, | ||
81 | }; | ||
82 | |||
83 | /* DM9000AEP 10/100 ethernet controller */ | ||
84 | |||
85 | static struct resource mini6410_dm9k_resource[] = { | ||
86 | [0] = { | ||
87 | .start = S3C64XX_PA_XM0CSN1, | ||
88 | .end = S3C64XX_PA_XM0CSN1 + 1, | ||
89 | .flags = IORESOURCE_MEM | ||
90 | }, | ||
91 | [1] = { | ||
92 | .start = S3C64XX_PA_XM0CSN1 + 4, | ||
93 | .end = S3C64XX_PA_XM0CSN1 + 5, | ||
94 | .flags = IORESOURCE_MEM | ||
95 | }, | ||
96 | [2] = { | ||
97 | .start = S3C_EINT(7), | ||
98 | .end = S3C_EINT(7), | ||
99 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | ||
100 | } | ||
101 | }; | ||
102 | |||
103 | static struct dm9000_plat_data mini6410_dm9k_pdata = { | ||
104 | .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM), | ||
105 | }; | ||
106 | |||
107 | static struct platform_device mini6410_device_eth = { | ||
108 | .name = "dm9000", | ||
109 | .id = -1, | ||
110 | .num_resources = ARRAY_SIZE(mini6410_dm9k_resource), | ||
111 | .resource = mini6410_dm9k_resource, | ||
112 | .dev = { | ||
113 | .platform_data = &mini6410_dm9k_pdata, | ||
114 | }, | ||
115 | }; | ||
116 | |||
117 | static struct mtd_partition mini6410_nand_part[] = { | ||
118 | [0] = { | ||
119 | .name = "uboot", | ||
120 | .size = SZ_1M, | ||
121 | .offset = 0, | ||
122 | }, | ||
123 | [1] = { | ||
124 | .name = "kernel", | ||
125 | .size = SZ_2M, | ||
126 | .offset = SZ_1M, | ||
127 | }, | ||
128 | [2] = { | ||
129 | .name = "rootfs", | ||
130 | .size = MTDPART_SIZ_FULL, | ||
131 | .offset = SZ_1M + SZ_2M, | ||
132 | }, | ||
133 | }; | ||
134 | |||
135 | static struct s3c2410_nand_set mini6410_nand_sets[] = { | ||
136 | [0] = { | ||
137 | .name = "nand", | ||
138 | .nr_chips = 1, | ||
139 | .nr_partitions = ARRAY_SIZE(mini6410_nand_part), | ||
140 | .partitions = mini6410_nand_part, | ||
141 | }, | ||
142 | }; | ||
143 | |||
144 | static struct s3c2410_platform_nand mini6410_nand_info = { | ||
145 | .tacls = 25, | ||
146 | .twrph0 = 55, | ||
147 | .twrph1 = 40, | ||
148 | .nr_sets = ARRAY_SIZE(mini6410_nand_sets), | ||
149 | .sets = mini6410_nand_sets, | ||
150 | }; | ||
151 | |||
152 | static struct s3c_fb_pd_win mini6410_fb_win[] = { | ||
153 | { | ||
154 | .win_mode = { /* 4.3" 480x272 */ | ||
155 | .left_margin = 3, | ||
156 | .right_margin = 2, | ||
157 | .upper_margin = 1, | ||
158 | .lower_margin = 1, | ||
159 | .hsync_len = 40, | ||
160 | .vsync_len = 1, | ||
161 | .xres = 480, | ||
162 | .yres = 272, | ||
163 | }, | ||
164 | .max_bpp = 32, | ||
165 | .default_bpp = 16, | ||
166 | }, { | ||
167 | .win_mode = { /* 7.0" 800x480 */ | ||
168 | .left_margin = 8, | ||
169 | .right_margin = 13, | ||
170 | .upper_margin = 7, | ||
171 | .lower_margin = 5, | ||
172 | .hsync_len = 3, | ||
173 | .vsync_len = 1, | ||
174 | .xres = 800, | ||
175 | .yres = 480, | ||
176 | }, | ||
177 | .max_bpp = 32, | ||
178 | .default_bpp = 16, | ||
179 | }, | ||
180 | }; | ||
181 | |||
182 | static struct s3c_fb_platdata mini6410_lcd_pdata __initdata = { | ||
183 | .setup_gpio = s3c64xx_fb_gpio_setup_24bpp, | ||
184 | .win[0] = &mini6410_fb_win[0], | ||
185 | .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB, | ||
186 | .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC, | ||
187 | }; | ||
188 | |||
189 | static void mini6410_lcd_power_set(struct plat_lcd_data *pd, | ||
190 | unsigned int power) | ||
191 | { | ||
192 | if (power) | ||
193 | gpio_direction_output(S3C64XX_GPE(0), 1); | ||
194 | else | ||
195 | gpio_direction_output(S3C64XX_GPE(0), 0); | ||
196 | } | ||
197 | |||
198 | static struct plat_lcd_data mini6410_lcd_power_data = { | ||
199 | .set_power = mini6410_lcd_power_set, | ||
200 | }; | ||
201 | |||
202 | static struct platform_device mini6410_lcd_powerdev = { | ||
203 | .name = "platform-lcd", | ||
204 | .dev.parent = &s3c_device_fb.dev, | ||
205 | .dev.platform_data = &mini6410_lcd_power_data, | ||
206 | }; | ||
207 | |||
208 | static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = { | ||
209 | .delay = 10000, | ||
210 | .presc = 49, | ||
211 | .oversampling_shift = 2, | ||
212 | }; | ||
213 | |||
214 | static struct platform_device *mini6410_devices[] __initdata = { | ||
215 | &mini6410_device_eth, | ||
216 | &s3c_device_hsmmc0, | ||
217 | &s3c_device_hsmmc1, | ||
218 | &s3c_device_ohci, | ||
219 | &s3c_device_nand, | ||
220 | &s3c_device_fb, | ||
221 | &mini6410_lcd_powerdev, | ||
222 | &s3c_device_adc, | ||
223 | &s3c_device_ts, | ||
224 | }; | ||
225 | |||
226 | static void __init mini6410_map_io(void) | ||
227 | { | ||
228 | u32 tmp; | ||
229 | |||
230 | s3c64xx_init_io(NULL, 0); | ||
231 | s3c24xx_init_clocks(12000000); | ||
232 | s3c24xx_init_uarts(mini6410_uartcfgs, ARRAY_SIZE(mini6410_uartcfgs)); | ||
233 | |||
234 | /* set the LCD type */ | ||
235 | tmp = __raw_readl(S3C64XX_SPCON); | ||
236 | tmp &= ~S3C64XX_SPCON_LCD_SEL_MASK; | ||
237 | tmp |= S3C64XX_SPCON_LCD_SEL_RGB; | ||
238 | __raw_writel(tmp, S3C64XX_SPCON); | ||
239 | |||
240 | /* remove the LCD bypass */ | ||
241 | tmp = __raw_readl(S3C64XX_MODEM_MIFPCON); | ||
242 | tmp &= ~MIFPCON_LCD_BYPASS; | ||
243 | __raw_writel(tmp, S3C64XX_MODEM_MIFPCON); | ||
244 | } | ||
245 | |||
246 | /* | ||
247 | * mini6410_features string | ||
248 | * | ||
249 | * 0-9 LCD configuration | ||
250 | * | ||
251 | */ | ||
252 | static char mini6410_features_str[12] __initdata = "0"; | ||
253 | |||
254 | static int __init mini6410_features_setup(char *str) | ||
255 | { | ||
256 | if (str) | ||
257 | strlcpy(mini6410_features_str, str, | ||
258 | sizeof(mini6410_features_str)); | ||
259 | return 1; | ||
260 | } | ||
261 | |||
262 | __setup("mini6410=", mini6410_features_setup); | ||
263 | |||
264 | #define FEATURE_SCREEN (1 << 0) | ||
265 | |||
266 | struct mini6410_features_t { | ||
267 | int done; | ||
268 | int lcd_index; | ||
269 | }; | ||
270 | |||
271 | static void mini6410_parse_features( | ||
272 | struct mini6410_features_t *features, | ||
273 | const char *features_str) | ||
274 | { | ||
275 | const char *fp = features_str; | ||
276 | |||
277 | features->done = 0; | ||
278 | features->lcd_index = 0; | ||
279 | |||
280 | while (*fp) { | ||
281 | char f = *fp++; | ||
282 | |||
283 | switch (f) { | ||
284 | case '0'...'9': /* tft screen */ | ||
285 | if (features->done & FEATURE_SCREEN) { | ||
286 | printk(KERN_INFO "MINI6410: '%c' ignored, " | ||
287 | "screen type already set\n", f); | ||
288 | } else { | ||
289 | int li = f - '0'; | ||
290 | if (li >= ARRAY_SIZE(mini6410_fb_win)) | ||
291 | printk(KERN_INFO "MINI6410: '%c' out " | ||
292 | "of range LCD mode\n", f); | ||
293 | else { | ||
294 | features->lcd_index = li; | ||
295 | } | ||
296 | } | ||
297 | features->done |= FEATURE_SCREEN; | ||
298 | break; | ||
299 | } | ||
300 | } | ||
301 | } | ||
302 | |||
303 | static void __init mini6410_machine_init(void) | ||
304 | { | ||
305 | u32 cs1; | ||
306 | struct mini6410_features_t features = { 0 }; | ||
307 | |||
308 | printk(KERN_INFO "MINI6410: Option string mini6410=%s\n", | ||
309 | mini6410_features_str); | ||
310 | |||
311 | /* Parse the feature string */ | ||
312 | mini6410_parse_features(&features, mini6410_features_str); | ||
313 | |||
314 | mini6410_lcd_pdata.win[0] = &mini6410_fb_win[features.lcd_index]; | ||
315 | |||
316 | printk(KERN_INFO "MINI6410: selected LCD display is %dx%d\n", | ||
317 | mini6410_lcd_pdata.win[0]->win_mode.xres, | ||
318 | mini6410_lcd_pdata.win[0]->win_mode.yres); | ||
319 | |||
320 | s3c_nand_set_platdata(&mini6410_nand_info); | ||
321 | s3c_fb_set_platdata(&mini6410_lcd_pdata); | ||
322 | s3c24xx_ts_set_platdata(&s3c_ts_platform); | ||
323 | |||
324 | /* configure nCS1 width to 16 bits */ | ||
325 | |||
326 | cs1 = __raw_readl(S3C64XX_SROM_BW) & | ||
327 | ~(S3C64XX_SROM_BW__CS_MASK << S3C64XX_SROM_BW__NCS1__SHIFT); | ||
328 | cs1 |= ((1 << S3C64XX_SROM_BW__DATAWIDTH__SHIFT) | | ||
329 | (1 << S3C64XX_SROM_BW__WAITENABLE__SHIFT) | | ||
330 | (1 << S3C64XX_SROM_BW__BYTEENABLE__SHIFT)) << | ||
331 | S3C64XX_SROM_BW__NCS1__SHIFT; | ||
332 | __raw_writel(cs1, S3C64XX_SROM_BW); | ||
333 | |||
334 | /* set timing for nCS1 suitable for ethernet chip */ | ||
335 | |||
336 | __raw_writel((0 << S3C64XX_SROM_BCX__PMC__SHIFT) | | ||
337 | (6 << S3C64XX_SROM_BCX__TACP__SHIFT) | | ||
338 | (4 << S3C64XX_SROM_BCX__TCAH__SHIFT) | | ||
339 | (1 << S3C64XX_SROM_BCX__TCOH__SHIFT) | | ||
340 | (13 << S3C64XX_SROM_BCX__TACC__SHIFT) | | ||
341 | (4 << S3C64XX_SROM_BCX__TCOS__SHIFT) | | ||
342 | (0 << S3C64XX_SROM_BCX__TACS__SHIFT), S3C64XX_SROM_BC1); | ||
343 | |||
344 | gpio_request(S3C64XX_GPF(15), "LCD power"); | ||
345 | gpio_request(S3C64XX_GPE(0), "LCD power"); | ||
346 | |||
347 | platform_add_devices(mini6410_devices, ARRAY_SIZE(mini6410_devices)); | ||
348 | } | ||
349 | |||
350 | MACHINE_START(MINI6410, "MINI6410") | ||
351 | /* Maintainer: Darius Augulis <augulis.darius@gmail.com> */ | ||
352 | .boot_params = S3C64XX_PA_SDRAM + 0x100, | ||
353 | .init_irq = s3c6410_init_irq, | ||
354 | .map_io = mini6410_map_io, | ||
355 | .init_machine = mini6410_machine_init, | ||
356 | .timer = &s3c24xx_timer, | ||
357 | MACHINE_END | ||
diff --git a/arch/arm/mach-s3c64xx/mach-real6410.c b/arch/arm/mach-s3c64xx/mach-real6410.c index 4b4475da8ec6..f9ef9b5c5f5a 100644 --- a/arch/arm/mach-s3c64xx/mach-real6410.c +++ b/arch/arm/mach-s3c64xx/mach-real6410.c | |||
@@ -12,23 +12,39 @@ | |||
12 | * | 12 | * |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/kernel.h> | 15 | #include <linux/init.h> |
16 | #include <linux/types.h> | ||
17 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
17 | #include <linux/fb.h> | ||
18 | #include <linux/gpio.h> | ||
19 | #include <linux/kernel.h> | ||
18 | #include <linux/list.h> | 20 | #include <linux/list.h> |
19 | #include <linux/init.h> | ||
20 | #include <linux/dm9000.h> | 21 | #include <linux/dm9000.h> |
21 | #include <linux/serial_core.h> | 22 | #include <linux/mtd/mtd.h> |
23 | #include <linux/mtd/partitions.h> | ||
22 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/serial_core.h> | ||
26 | #include <linux/types.h> | ||
27 | |||
23 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
24 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
25 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
31 | |||
26 | #include <mach/map.h> | 32 | #include <mach/map.h> |
27 | #include <mach/s3c6410.h> | 33 | #include <mach/regs-fb.h> |
34 | #include <mach/regs-gpio.h> | ||
35 | #include <mach/regs-modem.h> | ||
28 | #include <mach/regs-srom.h> | 36 | #include <mach/regs-srom.h> |
37 | #include <mach/s3c6410.h> | ||
38 | |||
39 | #include <plat/adc.h> | ||
29 | #include <plat/cpu.h> | 40 | #include <plat/cpu.h> |
30 | #include <plat/devs.h> | 41 | #include <plat/devs.h> |
42 | #include <plat/fb.h> | ||
43 | #include <plat/nand.h> | ||
31 | #include <plat/regs-serial.h> | 44 | #include <plat/regs-serial.h> |
45 | #include <plat/ts.h> | ||
46 | |||
47 | #include <video/platform_lcd.h> | ||
32 | 48 | ||
33 | #define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK) | 49 | #define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK) |
34 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB) | 50 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB) |
@@ -99,22 +115,192 @@ static struct platform_device real6410_device_eth = { | |||
99 | }, | 115 | }, |
100 | }; | 116 | }; |
101 | 117 | ||
118 | static struct s3c_fb_pd_win real6410_fb_win[] = { | ||
119 | { | ||
120 | .win_mode = { /* 4.3" 480x272 */ | ||
121 | .left_margin = 3, | ||
122 | .right_margin = 2, | ||
123 | .upper_margin = 1, | ||
124 | .lower_margin = 1, | ||
125 | .hsync_len = 40, | ||
126 | .vsync_len = 1, | ||
127 | .xres = 480, | ||
128 | .yres = 272, | ||
129 | }, | ||
130 | .max_bpp = 32, | ||
131 | .default_bpp = 16, | ||
132 | }, { | ||
133 | .win_mode = { /* 7.0" 800x480 */ | ||
134 | .left_margin = 8, | ||
135 | .right_margin = 13, | ||
136 | .upper_margin = 7, | ||
137 | .lower_margin = 5, | ||
138 | .hsync_len = 3, | ||
139 | .vsync_len = 1, | ||
140 | .xres = 800, | ||
141 | .yres = 480, | ||
142 | }, | ||
143 | .max_bpp = 32, | ||
144 | .default_bpp = 16, | ||
145 | }, | ||
146 | }; | ||
147 | |||
148 | static struct s3c_fb_platdata real6410_lcd_pdata __initdata = { | ||
149 | .setup_gpio = s3c64xx_fb_gpio_setup_24bpp, | ||
150 | .win[0] = &real6410_fb_win[0], | ||
151 | .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB, | ||
152 | .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC, | ||
153 | }; | ||
154 | |||
155 | static struct mtd_partition real6410_nand_part[] = { | ||
156 | [0] = { | ||
157 | .name = "uboot", | ||
158 | .size = SZ_1M, | ||
159 | .offset = 0, | ||
160 | }, | ||
161 | [1] = { | ||
162 | .name = "kernel", | ||
163 | .size = SZ_2M, | ||
164 | .offset = SZ_1M, | ||
165 | }, | ||
166 | [2] = { | ||
167 | .name = "rootfs", | ||
168 | .size = MTDPART_SIZ_FULL, | ||
169 | .offset = SZ_1M + SZ_2M, | ||
170 | }, | ||
171 | }; | ||
172 | |||
173 | static struct s3c2410_nand_set real6410_nand_sets[] = { | ||
174 | [0] = { | ||
175 | .name = "nand", | ||
176 | .nr_chips = 1, | ||
177 | .nr_partitions = ARRAY_SIZE(real6410_nand_part), | ||
178 | .partitions = real6410_nand_part, | ||
179 | }, | ||
180 | }; | ||
181 | |||
182 | static struct s3c2410_platform_nand real6410_nand_info = { | ||
183 | .tacls = 25, | ||
184 | .twrph0 = 55, | ||
185 | .twrph1 = 40, | ||
186 | .nr_sets = ARRAY_SIZE(real6410_nand_sets), | ||
187 | .sets = real6410_nand_sets, | ||
188 | }; | ||
189 | |||
102 | static struct platform_device *real6410_devices[] __initdata = { | 190 | static struct platform_device *real6410_devices[] __initdata = { |
103 | &real6410_device_eth, | 191 | &real6410_device_eth, |
104 | &s3c_device_hsmmc0, | 192 | &s3c_device_hsmmc0, |
105 | &s3c_device_hsmmc1, | 193 | &s3c_device_hsmmc1, |
194 | &s3c_device_fb, | ||
195 | &s3c_device_nand, | ||
196 | &s3c_device_adc, | ||
197 | &s3c_device_ts, | ||
198 | &s3c_device_ohci, | ||
199 | }; | ||
200 | |||
201 | static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = { | ||
202 | .delay = 10000, | ||
203 | .presc = 49, | ||
204 | .oversampling_shift = 2, | ||
106 | }; | 205 | }; |
107 | 206 | ||
108 | static void __init real6410_map_io(void) | 207 | static void __init real6410_map_io(void) |
109 | { | 208 | { |
209 | u32 tmp; | ||
210 | |||
110 | s3c64xx_init_io(NULL, 0); | 211 | s3c64xx_init_io(NULL, 0); |
111 | s3c24xx_init_clocks(12000000); | 212 | s3c24xx_init_clocks(12000000); |
112 | s3c24xx_init_uarts(real6410_uartcfgs, ARRAY_SIZE(real6410_uartcfgs)); | 213 | s3c24xx_init_uarts(real6410_uartcfgs, ARRAY_SIZE(real6410_uartcfgs)); |
214 | |||
215 | /* set the LCD type */ | ||
216 | tmp = __raw_readl(S3C64XX_SPCON); | ||
217 | tmp &= ~S3C64XX_SPCON_LCD_SEL_MASK; | ||
218 | tmp |= S3C64XX_SPCON_LCD_SEL_RGB; | ||
219 | __raw_writel(tmp, S3C64XX_SPCON); | ||
220 | |||
221 | /* remove the LCD bypass */ | ||
222 | tmp = __raw_readl(S3C64XX_MODEM_MIFPCON); | ||
223 | tmp &= ~MIFPCON_LCD_BYPASS; | ||
224 | __raw_writel(tmp, S3C64XX_MODEM_MIFPCON); | ||
225 | } | ||
226 | |||
227 | /* | ||
228 | * real6410_features string | ||
229 | * | ||
230 | * 0-9 LCD configuration | ||
231 | * | ||
232 | */ | ||
233 | static char real6410_features_str[12] __initdata = "0"; | ||
234 | |||
235 | static int __init real6410_features_setup(char *str) | ||
236 | { | ||
237 | if (str) | ||
238 | strlcpy(real6410_features_str, str, | ||
239 | sizeof(real6410_features_str)); | ||
240 | return 1; | ||
241 | } | ||
242 | |||
243 | __setup("real6410=", real6410_features_setup); | ||
244 | |||
245 | #define FEATURE_SCREEN (1 << 0) | ||
246 | |||
247 | struct real6410_features_t { | ||
248 | int done; | ||
249 | int lcd_index; | ||
250 | }; | ||
251 | |||
252 | static void real6410_parse_features( | ||
253 | struct real6410_features_t *features, | ||
254 | const char *features_str) | ||
255 | { | ||
256 | const char *fp = features_str; | ||
257 | |||
258 | features->done = 0; | ||
259 | features->lcd_index = 0; | ||
260 | |||
261 | while (*fp) { | ||
262 | char f = *fp++; | ||
263 | |||
264 | switch (f) { | ||
265 | case '0'...'9': /* tft screen */ | ||
266 | if (features->done & FEATURE_SCREEN) { | ||
267 | printk(KERN_INFO "REAL6410: '%c' ignored, " | ||
268 | "screen type already set\n", f); | ||
269 | } else { | ||
270 | int li = f - '0'; | ||
271 | if (li >= ARRAY_SIZE(real6410_fb_win)) | ||
272 | printk(KERN_INFO "REAL6410: '%c' out " | ||
273 | "of range LCD mode\n", f); | ||
274 | else { | ||
275 | features->lcd_index = li; | ||
276 | } | ||
277 | } | ||
278 | features->done |= FEATURE_SCREEN; | ||
279 | break; | ||
280 | } | ||
281 | } | ||
113 | } | 282 | } |
114 | 283 | ||
115 | static void __init real6410_machine_init(void) | 284 | static void __init real6410_machine_init(void) |
116 | { | 285 | { |
117 | u32 cs1; | 286 | u32 cs1; |
287 | struct real6410_features_t features = { 0 }; | ||
288 | |||
289 | printk(KERN_INFO "REAL6410: Option string real6410=%s\n", | ||
290 | real6410_features_str); | ||
291 | |||
292 | /* Parse the feature string */ | ||
293 | real6410_parse_features(&features, real6410_features_str); | ||
294 | |||
295 | real6410_lcd_pdata.win[0] = &real6410_fb_win[features.lcd_index]; | ||
296 | |||
297 | printk(KERN_INFO "REAL6410: selected LCD display is %dx%d\n", | ||
298 | real6410_lcd_pdata.win[0]->win_mode.xres, | ||
299 | real6410_lcd_pdata.win[0]->win_mode.yres); | ||
300 | |||
301 | s3c_fb_set_platdata(&real6410_lcd_pdata); | ||
302 | s3c_nand_set_platdata(&real6410_nand_info); | ||
303 | s3c24xx_ts_set_platdata(&s3c_ts_platform); | ||
118 | 304 | ||
119 | /* configure nCS1 width to 16 bits */ | 305 | /* configure nCS1 width to 16 bits */ |
120 | 306 | ||
@@ -136,6 +322,8 @@ static void __init real6410_machine_init(void) | |||
136 | (4 << S3C64XX_SROM_BCX__TCOS__SHIFT) | | 322 | (4 << S3C64XX_SROM_BCX__TCOS__SHIFT) | |
137 | (0 << S3C64XX_SROM_BCX__TACS__SHIFT), S3C64XX_SROM_BC1); | 323 | (0 << S3C64XX_SROM_BCX__TACS__SHIFT), S3C64XX_SROM_BC1); |
138 | 324 | ||
325 | gpio_request(S3C64XX_GPF(15), "LCD power"); | ||
326 | |||
139 | platform_add_devices(real6410_devices, ARRAY_SIZE(real6410_devices)); | 327 | platform_add_devices(real6410_devices, ARRAY_SIZE(real6410_devices)); |
140 | } | 328 | } |
141 | 329 | ||
diff --git a/arch/arm/mach-s3c64xx/setup-fb-24bpp.c b/arch/arm/mach-s3c64xx/setup-fb-24bpp.c index 000736877df2..8f3091182f9c 100644 --- a/arch/arm/mach-s3c64xx/setup-fb-24bpp.c +++ b/arch/arm/mach-s3c64xx/setup-fb-24bpp.c | |||
@@ -23,15 +23,6 @@ | |||
23 | 23 | ||
24 | extern void s3c64xx_fb_gpio_setup_24bpp(void) | 24 | extern void s3c64xx_fb_gpio_setup_24bpp(void) |
25 | { | 25 | { |
26 | unsigned int gpio; | 26 | s3c_gpio_cfgrange_nopull(S3C64XX_GPI(0), 16, S3C_GPIO_SFN(2)); |
27 | 27 | s3c_gpio_cfgrange_nopull(S3C64XX_GPJ(0), 12, S3C_GPIO_SFN(2)); | |
28 | for (gpio = S3C64XX_GPI(0); gpio <= S3C64XX_GPI(15); gpio++) { | ||
29 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
30 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
31 | } | ||
32 | |||
33 | for (gpio = S3C64XX_GPJ(0); gpio <= S3C64XX_GPJ(11); gpio++) { | ||
34 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
35 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
36 | } | ||
37 | } | 28 | } |
diff --git a/arch/arm/mach-s3c64xx/setup-ide.c b/arch/arm/mach-s3c64xx/setup-ide.c index c12c315f33bc..41b425602d88 100644 --- a/arch/arm/mach-s3c64xx/setup-ide.c +++ b/arch/arm/mach-s3c64xx/setup-ide.c | |||
@@ -17,11 +17,11 @@ | |||
17 | #include <mach/map.h> | 17 | #include <mach/map.h> |
18 | #include <mach/regs-clock.h> | 18 | #include <mach/regs-clock.h> |
19 | #include <plat/gpio-cfg.h> | 19 | #include <plat/gpio-cfg.h> |
20 | #include <plat/ata.h> | ||
20 | 21 | ||
21 | void s3c64xx_ide_setup_gpio(void) | 22 | void s3c64xx_ide_setup_gpio(void) |
22 | { | 23 | { |
23 | u32 reg; | 24 | u32 reg; |
24 | u32 gpio = 0; | ||
25 | 25 | ||
26 | reg = readl(S3C_MEM_SYS_CFG) & (~0x3f); | 26 | reg = readl(S3C_MEM_SYS_CFG) & (~0x3f); |
27 | 27 | ||
@@ -32,15 +32,12 @@ void s3c64xx_ide_setup_gpio(void) | |||
32 | s3c_gpio_cfgpin(S3C64XX_GPB(4), S3C_GPIO_SFN(4)); | 32 | s3c_gpio_cfgpin(S3C64XX_GPB(4), S3C_GPIO_SFN(4)); |
33 | 33 | ||
34 | /* Set XhiDATA[15:0] pins as CF Data[15:0] */ | 34 | /* Set XhiDATA[15:0] pins as CF Data[15:0] */ |
35 | for (gpio = S3C64XX_GPK(0); gpio <= S3C64XX_GPK(15); gpio++) | 35 | s3c_gpio_cfgpin_range(S3C64XX_GPK(0), 16, S3C_GPIO_SFN(5)); |
36 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(5)); | ||
37 | 36 | ||
38 | /* Set XhiADDR[2:0] pins as CF ADDR[2:0] */ | 37 | /* Set XhiADDR[2:0] pins as CF ADDR[2:0] */ |
39 | for (gpio = S3C64XX_GPL(0); gpio <= S3C64XX_GPL(2); gpio++) | 38 | s3c_gpio_cfgpin_range(S3C64XX_GPL(0), 3, S3C_GPIO_SFN(6)); |
40 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(6)); | ||
41 | 39 | ||
42 | /* Set Xhi ctrl pins as CF ctrl pins(IORDY, IOWR, IORD, CE[0:1]) */ | 40 | /* Set Xhi ctrl pins as CF ctrl pins(IORDY, IOWR, IORD, CE[0:1]) */ |
43 | s3c_gpio_cfgpin(S3C64XX_GPM(5), S3C_GPIO_SFN(1)); | 41 | s3c_gpio_cfgpin(S3C64XX_GPM(5), S3C_GPIO_SFN(1)); |
44 | for (gpio = S3C64XX_GPM(0); gpio <= S3C64XX_GPM(4); gpio++) | 42 | s3c_gpio_cfgpin_range(S3C64XX_GPM(0), 5, S3C_GPIO_SFN(6)); |
45 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(6)); | ||
46 | } | 43 | } |
diff --git a/arch/arm/mach-s3c64xx/setup-keypad.c b/arch/arm/mach-s3c64xx/setup-keypad.c index abc34e4e1a93..f8ed0d22db70 100644 --- a/arch/arm/mach-s3c64xx/setup-keypad.c +++ b/arch/arm/mach-s3c64xx/setup-keypad.c | |||
@@ -12,23 +12,13 @@ | |||
12 | 12 | ||
13 | #include <linux/gpio.h> | 13 | #include <linux/gpio.h> |
14 | #include <plat/gpio-cfg.h> | 14 | #include <plat/gpio-cfg.h> |
15 | #include <plat/keypad.h> | ||
15 | 16 | ||
16 | void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols) | 17 | void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols) |
17 | { | 18 | { |
18 | unsigned int gpio; | ||
19 | unsigned int end; | ||
20 | |||
21 | /* Set all the necessary GPK pins to special-function 3: KP_ROW[x] */ | 19 | /* Set all the necessary GPK pins to special-function 3: KP_ROW[x] */ |
22 | end = S3C64XX_GPK(8 + rows); | 20 | s3c_gpio_cfgrange_nopull(S3C64XX_GPK(8), 8 + rows, S3C_GPIO_SFN(3)); |
23 | for (gpio = S3C64XX_GPK(8); gpio < end; gpio++) { | ||
24 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
25 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
26 | } | ||
27 | 21 | ||
28 | /* Set all the necessary GPL pins to special-function 3: KP_COL[x] */ | 22 | /* Set all the necessary GPL pins to special-function 3: KP_COL[x] */ |
29 | end = S3C64XX_GPL(0 + cols); | 23 | s3c_gpio_cfgrange_nopull(S3C64XX_GPL(0), cols, S3C_GPIO_SFN(3)); |
30 | for (gpio = S3C64XX_GPL(0); gpio < end; gpio++) { | ||
31 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
32 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
33 | } | ||
34 | } | 24 | } |
diff --git a/arch/arm/mach-s3c64xx/setup-sdhci-gpio.c b/arch/arm/mach-s3c64xx/setup-sdhci-gpio.c index 322359591374..6eac071afae2 100644 --- a/arch/arm/mach-s3c64xx/setup-sdhci-gpio.c +++ b/arch/arm/mach-s3c64xx/setup-sdhci-gpio.c | |||
@@ -24,16 +24,9 @@ | |||
24 | void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | 24 | void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) |
25 | { | 25 | { |
26 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | 26 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; |
27 | unsigned int gpio; | ||
28 | unsigned int end; | ||
29 | 27 | ||
30 | end = S3C64XX_GPG(2 + width); | 28 | /* Set all the necessary GPG pins to special-function 2 */ |
31 | 29 | s3c_gpio_cfgrange_nopull(S3C64XX_GPG(0), 2 + width, S3C_GPIO_SFN(2)); | |
32 | /* Set all the necessary GPG pins to special-function 0 */ | ||
33 | for (gpio = S3C64XX_GPG(0); gpio < end; gpio++) { | ||
34 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
35 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
36 | } | ||
37 | 30 | ||
38 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | 31 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { |
39 | s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP); | 32 | s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP); |
@@ -44,16 +37,9 @@ void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | |||
44 | void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) | 37 | void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) |
45 | { | 38 | { |
46 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | 39 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; |
47 | unsigned int gpio; | ||
48 | unsigned int end; | ||
49 | 40 | ||
50 | end = S3C64XX_GPH(2 + width); | 41 | /* Set all the necessary GPH pins to special-function 2 */ |
51 | 42 | s3c_gpio_cfgrange_nopull(S3C64XX_GPH(0), 2 + width, S3C_GPIO_SFN(2)); | |
52 | /* Set all the necessary GPG pins to special-function 0 */ | ||
53 | for (gpio = S3C64XX_GPH(0); gpio < end; gpio++) { | ||
54 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
55 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
56 | } | ||
57 | 43 | ||
58 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | 44 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { |
59 | s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP); | 45 | s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP); |
@@ -63,20 +49,9 @@ void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) | |||
63 | 49 | ||
64 | void s3c64xx_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width) | 50 | void s3c64xx_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width) |
65 | { | 51 | { |
66 | unsigned int gpio; | 52 | /* Set all the necessary GPH pins to special-function 3 */ |
67 | unsigned int end; | 53 | s3c_gpio_cfgrange_nopull(S3C64XX_GPH(6), width, S3C_GPIO_SFN(3)); |
68 | 54 | ||
69 | end = S3C64XX_GPH(6 + width); | 55 | /* Set all the necessary GPC pins to special-function 3 */ |
70 | 56 | s3c_gpio_cfgrange_nopull(S3C64XX_GPC(4), 2, S3C_GPIO_SFN(3)); | |
71 | /* Set all the necessary GPH pins to special-function 1 */ | ||
72 | for (gpio = S3C64XX_GPH(6); gpio < end; gpio++) { | ||
73 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
74 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
75 | } | ||
76 | |||
77 | /* Set all the necessary GPC pins to special-function 1 */ | ||
78 | for (gpio = S3C64XX_GPC(4); gpio < S3C64XX_GPC(6); gpio++) { | ||
79 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
80 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
81 | } | ||
82 | } | 57 | } |
diff --git a/arch/arm/mach-s5p6442/Kconfig b/arch/arm/mach-s5p6442/Kconfig index 0fda0a5df968..33569e4007c4 100644 --- a/arch/arm/mach-s5p6442/Kconfig +++ b/arch/arm/mach-s5p6442/Kconfig | |||
@@ -11,7 +11,6 @@ if ARCH_S5P6442 | |||
11 | 11 | ||
12 | config CPU_S5P6442 | 12 | config CPU_S5P6442 |
13 | bool | 13 | bool |
14 | select PLAT_S5P | ||
15 | select S3C_PL330_DMA | 14 | select S3C_PL330_DMA |
16 | help | 15 | help |
17 | Enable S5P6442 CPU support | 16 | Enable S5P6442 CPU support |
diff --git a/arch/arm/mach-s5p6442/clock.c b/arch/arm/mach-s5p6442/clock.c index dcd20f17212a..16d6e7e61b50 100644 --- a/arch/arm/mach-s5p6442/clock.c +++ b/arch/arm/mach-s5p6442/clock.c | |||
@@ -192,6 +192,11 @@ static struct clk clk_pclkd1 = { | |||
192 | .parent = &clk_hclkd1, | 192 | .parent = &clk_hclkd1, |
193 | }; | 193 | }; |
194 | 194 | ||
195 | int s5p6442_clk_ip0_ctrl(struct clk *clk, int enable) | ||
196 | { | ||
197 | return s5p_gatectrl(S5P_CLKGATE_IP0, clk, enable); | ||
198 | } | ||
199 | |||
195 | int s5p6442_clk_ip3_ctrl(struct clk *clk, int enable) | 200 | int s5p6442_clk_ip3_ctrl(struct clk *clk, int enable) |
196 | { | 201 | { |
197 | return s5p_gatectrl(S5P_CLKGATE_IP3, clk, enable); | 202 | return s5p_gatectrl(S5P_CLKGATE_IP3, clk, enable); |
@@ -335,6 +340,16 @@ void __init_or_cpufreq s5p6442_setup_clocks(void) | |||
335 | clk_pclkd1.rate = pclkd1; | 340 | clk_pclkd1.rate = pclkd1; |
336 | } | 341 | } |
337 | 342 | ||
343 | static struct clk init_clocks_disable[] = { | ||
344 | { | ||
345 | .name = "pdma", | ||
346 | .id = -1, | ||
347 | .parent = &clk_pclkd1, | ||
348 | .enable = s5p6442_clk_ip0_ctrl, | ||
349 | .ctrlbit = (1 << 3), | ||
350 | }, | ||
351 | }; | ||
352 | |||
338 | static struct clk init_clocks[] = { | 353 | static struct clk init_clocks[] = { |
339 | { | 354 | { |
340 | .name = "systimer", | 355 | .name = "systimer", |
@@ -393,10 +408,23 @@ static struct clk *clks[] __initdata = { | |||
393 | 408 | ||
394 | void __init s5p6442_register_clocks(void) | 409 | void __init s5p6442_register_clocks(void) |
395 | { | 410 | { |
411 | struct clk *clkptr; | ||
412 | int i, ret; | ||
413 | |||
396 | s3c24xx_register_clocks(clks, ARRAY_SIZE(clks)); | 414 | s3c24xx_register_clocks(clks, ARRAY_SIZE(clks)); |
397 | 415 | ||
398 | s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); | 416 | s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); |
399 | s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); | 417 | s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); |
400 | 418 | ||
419 | clkptr = init_clocks_disable; | ||
420 | for (i = 0; i < ARRAY_SIZE(init_clocks_disable); i++, clkptr++) { | ||
421 | ret = s3c24xx_register_clock(clkptr); | ||
422 | if (ret < 0) { | ||
423 | printk(KERN_ERR "Fail to register clock %s (%d)\n", | ||
424 | clkptr->name, ret); | ||
425 | } else | ||
426 | (clkptr->enable)(clkptr, 0); | ||
427 | } | ||
428 | |||
401 | s3c_pwmclk_init(); | 429 | s3c_pwmclk_init(); |
402 | } | 430 | } |
diff --git a/arch/arm/mach-s5p6442/dev-audio.c b/arch/arm/mach-s5p6442/dev-audio.c index 7a4e34720b7b..3462197ff352 100644 --- a/arch/arm/mach-s5p6442/dev-audio.c +++ b/arch/arm/mach-s5p6442/dev-audio.c | |||
@@ -21,22 +21,16 @@ | |||
21 | 21 | ||
22 | static int s5p6442_cfg_i2s(struct platform_device *pdev) | 22 | static int s5p6442_cfg_i2s(struct platform_device *pdev) |
23 | { | 23 | { |
24 | unsigned int base; | ||
25 | |||
24 | /* configure GPIO for i2s port */ | 26 | /* configure GPIO for i2s port */ |
25 | switch (pdev->id) { | 27 | switch (pdev->id) { |
26 | case 1: | 28 | case 1: |
27 | s3c_gpio_cfgpin(S5P6442_GPC1(0), S3C_GPIO_SFN(2)); | 29 | base = S5P6442_GPC1(0); |
28 | s3c_gpio_cfgpin(S5P6442_GPC1(1), S3C_GPIO_SFN(2)); | ||
29 | s3c_gpio_cfgpin(S5P6442_GPC1(2), S3C_GPIO_SFN(2)); | ||
30 | s3c_gpio_cfgpin(S5P6442_GPC1(3), S3C_GPIO_SFN(2)); | ||
31 | s3c_gpio_cfgpin(S5P6442_GPC1(4), S3C_GPIO_SFN(2)); | ||
32 | break; | 30 | break; |
33 | 31 | ||
34 | case -1: | 32 | case -1: |
35 | s3c_gpio_cfgpin(S5P6442_GPC0(0), S3C_GPIO_SFN(2)); | 33 | base = S5P6442_GPC0(0); |
36 | s3c_gpio_cfgpin(S5P6442_GPC0(1), S3C_GPIO_SFN(2)); | ||
37 | s3c_gpio_cfgpin(S5P6442_GPC0(2), S3C_GPIO_SFN(2)); | ||
38 | s3c_gpio_cfgpin(S5P6442_GPC0(3), S3C_GPIO_SFN(2)); | ||
39 | s3c_gpio_cfgpin(S5P6442_GPC0(4), S3C_GPIO_SFN(2)); | ||
40 | break; | 34 | break; |
41 | 35 | ||
42 | default: | 36 | default: |
@@ -44,6 +38,7 @@ static int s5p6442_cfg_i2s(struct platform_device *pdev) | |||
44 | return -EINVAL; | 38 | return -EINVAL; |
45 | } | 39 | } |
46 | 40 | ||
41 | s3c_gpio_cfgpin_range(base, 5, S3C_GPIO_SFN(2)); | ||
47 | return 0; | 42 | return 0; |
48 | } | 43 | } |
49 | 44 | ||
@@ -111,21 +106,15 @@ struct platform_device s5p6442_device_iis1 = { | |||
111 | 106 | ||
112 | static int s5p6442_pcm_cfg_gpio(struct platform_device *pdev) | 107 | static int s5p6442_pcm_cfg_gpio(struct platform_device *pdev) |
113 | { | 108 | { |
109 | unsigned int base; | ||
110 | |||
114 | switch (pdev->id) { | 111 | switch (pdev->id) { |
115 | case 0: | 112 | case 0: |
116 | s3c_gpio_cfgpin(S5P6442_GPC0(0), S3C_GPIO_SFN(3)); | 113 | base = S5P6442_GPC0(0); |
117 | s3c_gpio_cfgpin(S5P6442_GPC0(1), S3C_GPIO_SFN(3)); | ||
118 | s3c_gpio_cfgpin(S5P6442_GPC0(2), S3C_GPIO_SFN(3)); | ||
119 | s3c_gpio_cfgpin(S5P6442_GPC0(3), S3C_GPIO_SFN(3)); | ||
120 | s3c_gpio_cfgpin(S5P6442_GPC0(4), S3C_GPIO_SFN(3)); | ||
121 | break; | 114 | break; |
122 | 115 | ||
123 | case 1: | 116 | case 1: |
124 | s3c_gpio_cfgpin(S5P6442_GPC1(0), S3C_GPIO_SFN(3)); | 117 | base = S5P6442_GPC1(0); |
125 | s3c_gpio_cfgpin(S5P6442_GPC1(1), S3C_GPIO_SFN(3)); | ||
126 | s3c_gpio_cfgpin(S5P6442_GPC1(2), S3C_GPIO_SFN(3)); | ||
127 | s3c_gpio_cfgpin(S5P6442_GPC1(3), S3C_GPIO_SFN(3)); | ||
128 | s3c_gpio_cfgpin(S5P6442_GPC1(4), S3C_GPIO_SFN(3)); | ||
129 | break; | 118 | break; |
130 | 119 | ||
131 | default: | 120 | default: |
@@ -133,6 +122,7 @@ static int s5p6442_pcm_cfg_gpio(struct platform_device *pdev) | |||
133 | return -EINVAL; | 122 | return -EINVAL; |
134 | } | 123 | } |
135 | 124 | ||
125 | s3c_gpio_cfgpin_range(base, 5, S3C_GPIO_SFN(3)); | ||
136 | return 0; | 126 | return 0; |
137 | } | 127 | } |
138 | 128 | ||
diff --git a/arch/arm/mach-s5p6442/dev-spi.c b/arch/arm/mach-s5p6442/dev-spi.c index e894651a88bd..cce8c2470709 100644 --- a/arch/arm/mach-s5p6442/dev-spi.c +++ b/arch/arm/mach-s5p6442/dev-spi.c | |||
@@ -38,11 +38,9 @@ static int s5p6442_spi_cfg_gpio(struct platform_device *pdev) | |||
38 | switch (pdev->id) { | 38 | switch (pdev->id) { |
39 | case 0: | 39 | case 0: |
40 | s3c_gpio_cfgpin(S5P6442_GPB(0), S3C_GPIO_SFN(2)); | 40 | s3c_gpio_cfgpin(S5P6442_GPB(0), S3C_GPIO_SFN(2)); |
41 | s3c_gpio_cfgpin(S5P6442_GPB(2), S3C_GPIO_SFN(2)); | ||
42 | s3c_gpio_cfgpin(S5P6442_GPB(3), S3C_GPIO_SFN(2)); | ||
43 | s3c_gpio_setpull(S5P6442_GPB(0), S3C_GPIO_PULL_UP); | 41 | s3c_gpio_setpull(S5P6442_GPB(0), S3C_GPIO_PULL_UP); |
44 | s3c_gpio_setpull(S5P6442_GPB(2), S3C_GPIO_PULL_UP); | 42 | s3c_gpio_cfgall_range(S5P6442_GPB(2), 2, |
45 | s3c_gpio_setpull(S5P6442_GPB(3), S3C_GPIO_PULL_UP); | 43 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
46 | break; | 44 | break; |
47 | 45 | ||
48 | default: | 46 | default: |
diff --git a/arch/arm/mach-s5p6442/dma.c b/arch/arm/mach-s5p6442/dma.c index ad4f8704b93d..7dfb13654f8a 100644 --- a/arch/arm/mach-s5p6442/dma.c +++ b/arch/arm/mach-s5p6442/dma.c | |||
@@ -82,7 +82,7 @@ static struct s3c_pl330_platdata s5p6442_pdma_pdata = { | |||
82 | 82 | ||
83 | static struct platform_device s5p6442_device_pdma = { | 83 | static struct platform_device s5p6442_device_pdma = { |
84 | .name = "s3c-pl330", | 84 | .name = "s3c-pl330", |
85 | .id = 1, | 85 | .id = -1, |
86 | .num_resources = ARRAY_SIZE(s5p6442_pdma_resource), | 86 | .num_resources = ARRAY_SIZE(s5p6442_pdma_resource), |
87 | .resource = s5p6442_pdma_resource, | 87 | .resource = s5p6442_pdma_resource, |
88 | .dev = { | 88 | .dev = { |
diff --git a/arch/arm/mach-s5p6442/include/mach/regs-clock.h b/arch/arm/mach-s5p6442/include/mach/regs-clock.h index d8360b5d4ece..00828a336991 100644 --- a/arch/arm/mach-s5p6442/include/mach/regs-clock.h +++ b/arch/arm/mach-s5p6442/include/mach/regs-clock.h | |||
@@ -46,6 +46,7 @@ | |||
46 | #define S5P_CLK_DIV5 S5P_CLKREG(0x314) | 46 | #define S5P_CLK_DIV5 S5P_CLKREG(0x314) |
47 | #define S5P_CLK_DIV6 S5P_CLKREG(0x318) | 47 | #define S5P_CLK_DIV6 S5P_CLKREG(0x318) |
48 | 48 | ||
49 | #define S5P_CLKGATE_IP0 S5P_CLKREG(0x460) | ||
49 | #define S5P_CLKGATE_IP3 S5P_CLKREG(0x46C) | 50 | #define S5P_CLKGATE_IP3 S5P_CLKREG(0x46C) |
50 | 51 | ||
51 | /* CLK_OUT */ | 52 | /* CLK_OUT */ |
diff --git a/arch/arm/mach-s5p6442/include/mach/vmalloc.h b/arch/arm/mach-s5p6442/include/mach/vmalloc.h index f5c83f02c18e..4aa55e55ac47 100644 --- a/arch/arm/mach-s5p6442/include/mach/vmalloc.h +++ b/arch/arm/mach-s5p6442/include/mach/vmalloc.h | |||
@@ -12,6 +12,6 @@ | |||
12 | #ifndef __ASM_ARCH_VMALLOC_H | 12 | #ifndef __ASM_ARCH_VMALLOC_H |
13 | #define __ASM_ARCH_VMALLOC_H | 13 | #define __ASM_ARCH_VMALLOC_H |
14 | 14 | ||
15 | #define VMALLOC_END 0xE0000000UL | 15 | #define VMALLOC_END 0xF6000000UL |
16 | 16 | ||
17 | #endif /* __ASM_ARCH_VMALLOC_H */ | 17 | #endif /* __ASM_ARCH_VMALLOC_H */ |
diff --git a/arch/arm/mach-s5p64x0/Kconfig b/arch/arm/mach-s5p64x0/Kconfig index fbcae9352022..164d2783d381 100644 --- a/arch/arm/mach-s5p64x0/Kconfig +++ b/arch/arm/mach-s5p64x0/Kconfig | |||
@@ -9,14 +9,12 @@ if ARCH_S5P64X0 | |||
9 | 9 | ||
10 | config CPU_S5P6440 | 10 | config CPU_S5P6440 |
11 | bool | 11 | bool |
12 | select PLAT_S5P | ||
13 | select S3C_PL330_DMA | 12 | select S3C_PL330_DMA |
14 | help | 13 | help |
15 | Enable S5P6440 CPU support | 14 | Enable S5P6440 CPU support |
16 | 15 | ||
17 | config CPU_S5P6450 | 16 | config CPU_S5P6450 |
18 | bool | 17 | bool |
19 | select PLAT_S5P | ||
20 | select S3C_PL330_DMA | 18 | select S3C_PL330_DMA |
21 | help | 19 | help |
22 | Enable S5P6450 CPU support | 20 | Enable S5P6450 CPU support |
diff --git a/arch/arm/mach-s5p64x0/clock-s5p6440.c b/arch/arm/mach-s5p64x0/clock-s5p6440.c index f93dcd8b4d6a..e4883dc1c8d7 100644 --- a/arch/arm/mach-s5p64x0/clock-s5p6440.c +++ b/arch/arm/mach-s5p64x0/clock-s5p6440.c | |||
@@ -79,13 +79,16 @@ static int s5p6440_epll_set_rate(struct clk *clk, unsigned long rate) | |||
79 | __raw_writel(epll_con, S5P64X0_EPLL_CON); | 79 | __raw_writel(epll_con, S5P64X0_EPLL_CON); |
80 | __raw_writel(epll_con_k, S5P64X0_EPLL_CON_K); | 80 | __raw_writel(epll_con_k, S5P64X0_EPLL_CON_K); |
81 | 81 | ||
82 | printk(KERN_WARNING "EPLL Rate changes from %lu to %lu\n", | ||
83 | clk->rate, rate); | ||
84 | |||
82 | clk->rate = rate; | 85 | clk->rate = rate; |
83 | 86 | ||
84 | return 0; | 87 | return 0; |
85 | } | 88 | } |
86 | 89 | ||
87 | static struct clk_ops s5p6440_epll_ops = { | 90 | static struct clk_ops s5p6440_epll_ops = { |
88 | .get_rate = s5p64x0_epll_get_rate, | 91 | .get_rate = s5p_epll_get_rate, |
89 | .set_rate = s5p6440_epll_set_rate, | 92 | .set_rate = s5p6440_epll_set_rate, |
90 | }; | 93 | }; |
91 | 94 | ||
@@ -150,6 +153,12 @@ static struct clk init_clocks_disable[] = { | |||
150 | .enable = s5p64x0_hclk0_ctrl, | 153 | .enable = s5p64x0_hclk0_ctrl, |
151 | .ctrlbit = (1 << 8), | 154 | .ctrlbit = (1 << 8), |
152 | }, { | 155 | }, { |
156 | .name = "pdma", | ||
157 | .id = -1, | ||
158 | .parent = &clk_hclk_low.clk, | ||
159 | .enable = s5p64x0_hclk0_ctrl, | ||
160 | .ctrlbit = (1 << 12), | ||
161 | }, { | ||
153 | .name = "hsmmc", | 162 | .name = "hsmmc", |
154 | .id = 0, | 163 | .id = 0, |
155 | .parent = &clk_hclk_low.clk, | 164 | .parent = &clk_hclk_low.clk, |
@@ -331,12 +340,6 @@ static struct clk init_clocks[] = { | |||
331 | .enable = s5p64x0_hclk0_ctrl, | 340 | .enable = s5p64x0_hclk0_ctrl, |
332 | .ctrlbit = (1 << 21), | 341 | .ctrlbit = (1 << 21), |
333 | }, { | 342 | }, { |
334 | .name = "dma", | ||
335 | .id = -1, | ||
336 | .parent = &clk_hclk_low.clk, | ||
337 | .enable = s5p64x0_hclk0_ctrl, | ||
338 | .ctrlbit = (1 << 12), | ||
339 | }, { | ||
340 | .name = "uart", | 343 | .name = "uart", |
341 | .id = 0, | 344 | .id = 0, |
342 | .parent = &clk_pclk_low.clk, | 345 | .parent = &clk_pclk_low.clk, |
@@ -548,7 +551,7 @@ void __init_or_cpufreq s5p6440_setup_clocks(void) | |||
548 | 551 | ||
549 | /* Set S5P6440 functions for clk_fout_epll */ | 552 | /* Set S5P6440 functions for clk_fout_epll */ |
550 | 553 | ||
551 | clk_fout_epll.enable = s5p64x0_epll_enable; | 554 | clk_fout_epll.enable = s5p_epll_enable; |
552 | clk_fout_epll.ops = &s5p6440_epll_ops; | 555 | clk_fout_epll.ops = &s5p6440_epll_ops; |
553 | 556 | ||
554 | clk_48m.enable = s5p64x0_clk48m_ctrl; | 557 | clk_48m.enable = s5p64x0_clk48m_ctrl; |
diff --git a/arch/arm/mach-s5p64x0/clock-s5p6450.c b/arch/arm/mach-s5p64x0/clock-s5p6450.c index f9afb05b217c..7dbf3c968f53 100644 --- a/arch/arm/mach-s5p64x0/clock-s5p6450.c +++ b/arch/arm/mach-s5p64x0/clock-s5p6450.c | |||
@@ -80,13 +80,16 @@ static int s5p6450_epll_set_rate(struct clk *clk, unsigned long rate) | |||
80 | __raw_writel(epll_con, S5P64X0_EPLL_CON); | 80 | __raw_writel(epll_con, S5P64X0_EPLL_CON); |
81 | __raw_writel(epll_con_k, S5P64X0_EPLL_CON_K); | 81 | __raw_writel(epll_con_k, S5P64X0_EPLL_CON_K); |
82 | 82 | ||
83 | printk(KERN_WARNING "EPLL Rate changes from %lu to %lu\n", | ||
84 | clk->rate, rate); | ||
85 | |||
83 | clk->rate = rate; | 86 | clk->rate = rate; |
84 | 87 | ||
85 | return 0; | 88 | return 0; |
86 | } | 89 | } |
87 | 90 | ||
88 | static struct clk_ops s5p6450_epll_ops = { | 91 | static struct clk_ops s5p6450_epll_ops = { |
89 | .get_rate = s5p64x0_epll_get_rate, | 92 | .get_rate = s5p_epll_get_rate, |
90 | .set_rate = s5p6450_epll_set_rate, | 93 | .set_rate = s5p6450_epll_set_rate, |
91 | }; | 94 | }; |
92 | 95 | ||
@@ -186,6 +189,12 @@ static struct clk init_clocks_disable[] = { | |||
186 | .enable = s5p64x0_hclk0_ctrl, | 189 | .enable = s5p64x0_hclk0_ctrl, |
187 | .ctrlbit = (1 << 3), | 190 | .ctrlbit = (1 << 3), |
188 | }, { | 191 | }, { |
192 | .name = "pdma", | ||
193 | .id = -1, | ||
194 | .parent = &clk_hclk_low.clk, | ||
195 | .enable = s5p64x0_hclk0_ctrl, | ||
196 | .ctrlbit = (1 << 12), | ||
197 | }, { | ||
189 | .name = "hsmmc", | 198 | .name = "hsmmc", |
190 | .id = 0, | 199 | .id = 0, |
191 | .parent = &clk_hclk_low.clk, | 200 | .parent = &clk_hclk_low.clk, |
@@ -283,12 +292,6 @@ static struct clk init_clocks[] = { | |||
283 | .enable = s5p64x0_hclk0_ctrl, | 292 | .enable = s5p64x0_hclk0_ctrl, |
284 | .ctrlbit = (1 << 21), | 293 | .ctrlbit = (1 << 21), |
285 | }, { | 294 | }, { |
286 | .name = "dma", | ||
287 | .id = -1, | ||
288 | .parent = &clk_hclk_low.clk, | ||
289 | .enable = s5p64x0_hclk0_ctrl, | ||
290 | .ctrlbit = (1 << 12), | ||
291 | }, { | ||
292 | .name = "uart", | 295 | .name = "uart", |
293 | .id = 0, | 296 | .id = 0, |
294 | .parent = &clk_pclk_low.clk, | 297 | .parent = &clk_pclk_low.clk, |
@@ -581,7 +584,7 @@ void __init_or_cpufreq s5p6450_setup_clocks(void) | |||
581 | 584 | ||
582 | /* Set S5P6450 functions for clk_fout_epll */ | 585 | /* Set S5P6450 functions for clk_fout_epll */ |
583 | 586 | ||
584 | clk_fout_epll.enable = s5p64x0_epll_enable; | 587 | clk_fout_epll.enable = s5p_epll_enable; |
585 | clk_fout_epll.ops = &s5p6450_epll_ops; | 588 | clk_fout_epll.ops = &s5p6450_epll_ops; |
586 | 589 | ||
587 | clk_48m.enable = s5p64x0_clk48m_ctrl; | 590 | clk_48m.enable = s5p64x0_clk48m_ctrl; |
diff --git a/arch/arm/mach-s5p64x0/clock.c b/arch/arm/mach-s5p64x0/clock.c index 523ba8039ac2..b52c6e2f37a6 100644 --- a/arch/arm/mach-s5p64x0/clock.c +++ b/arch/arm/mach-s5p64x0/clock.c | |||
@@ -73,24 +73,6 @@ static const u32 clock_table[][3] = { | |||
73 | {L2 * 1000, (3 << ARM_DIV_RATIO_SHIFT), (0 << S5P64X0_CLKDIV0_HCLK_SHIFT)}, | 73 | {L2 * 1000, (3 << ARM_DIV_RATIO_SHIFT), (0 << S5P64X0_CLKDIV0_HCLK_SHIFT)}, |
74 | }; | 74 | }; |
75 | 75 | ||
76 | int s5p64x0_epll_enable(struct clk *clk, int enable) | ||
77 | { | ||
78 | unsigned int ctrlbit = clk->ctrlbit; | ||
79 | unsigned int epll_con = __raw_readl(S5P64X0_EPLL_CON) & ~ctrlbit; | ||
80 | |||
81 | if (enable) | ||
82 | __raw_writel(epll_con | ctrlbit, S5P64X0_EPLL_CON); | ||
83 | else | ||
84 | __raw_writel(epll_con, S5P64X0_EPLL_CON); | ||
85 | |||
86 | return 0; | ||
87 | } | ||
88 | |||
89 | unsigned long s5p64x0_epll_get_rate(struct clk *clk) | ||
90 | { | ||
91 | return clk->rate; | ||
92 | } | ||
93 | |||
94 | unsigned long s5p64x0_armclk_get_rate(struct clk *clk) | 76 | unsigned long s5p64x0_armclk_get_rate(struct clk *clk) |
95 | { | 77 | { |
96 | unsigned long rate = clk_get_rate(clk->parent); | 78 | unsigned long rate = clk_get_rate(clk->parent); |
diff --git a/arch/arm/mach-s5p64x0/dev-audio.c b/arch/arm/mach-s5p64x0/dev-audio.c index fa097bd68ca4..396bacc0a39a 100644 --- a/arch/arm/mach-s5p64x0/dev-audio.c +++ b/arch/arm/mach-s5p64x0/dev-audio.c | |||
@@ -24,13 +24,8 @@ static int s5p6440_cfg_i2s(struct platform_device *pdev) | |||
24 | /* configure GPIO for i2s port */ | 24 | /* configure GPIO for i2s port */ |
25 | switch (pdev->id) { | 25 | switch (pdev->id) { |
26 | case -1: | 26 | case -1: |
27 | s3c_gpio_cfgpin(S5P6440_GPR(4), S3C_GPIO_SFN(5)); | 27 | s3c_gpio_cfgpin_range(S5P6440_GPR(4), 5, S3C_GPIO_SFN(5)); |
28 | s3c_gpio_cfgpin(S5P6440_GPR(5), S3C_GPIO_SFN(5)); | 28 | s3c_gpio_cfgpin_range(S5P6440_GPR(13), 2, S3C_GPIO_SFN(5)); |
29 | s3c_gpio_cfgpin(S5P6440_GPR(6), S3C_GPIO_SFN(5)); | ||
30 | s3c_gpio_cfgpin(S5P6440_GPR(7), S3C_GPIO_SFN(5)); | ||
31 | s3c_gpio_cfgpin(S5P6440_GPR(8), S3C_GPIO_SFN(5)); | ||
32 | s3c_gpio_cfgpin(S5P6440_GPR(13), S3C_GPIO_SFN(5)); | ||
33 | s3c_gpio_cfgpin(S5P6440_GPR(14), S3C_GPIO_SFN(5)); | ||
34 | break; | 29 | break; |
35 | 30 | ||
36 | default: | 31 | default: |
@@ -47,13 +42,9 @@ static int s5p6450_cfg_i2s(struct platform_device *pdev) | |||
47 | switch (pdev->id) { | 42 | switch (pdev->id) { |
48 | case -1: | 43 | case -1: |
49 | s3c_gpio_cfgpin(S5P6450_GPB(4), S3C_GPIO_SFN(5)); | 44 | s3c_gpio_cfgpin(S5P6450_GPB(4), S3C_GPIO_SFN(5)); |
50 | s3c_gpio_cfgpin(S5P6450_GPR(4), S3C_GPIO_SFN(5)); | 45 | s3c_gpio_cfgpin_range(S5P6450_GPR(4), 5, S3C_GPIO_SFN(5)); |
51 | s3c_gpio_cfgpin(S5P6450_GPR(5), S3C_GPIO_SFN(5)); | 46 | s3c_gpio_cfgpin_range(S5P6450_GPR(13), 2, S3C_GPIO_SFN(5)); |
52 | s3c_gpio_cfgpin(S5P6450_GPR(6), S3C_GPIO_SFN(5)); | 47 | |
53 | s3c_gpio_cfgpin(S5P6450_GPR(7), S3C_GPIO_SFN(5)); | ||
54 | s3c_gpio_cfgpin(S5P6450_GPR(8), S3C_GPIO_SFN(5)); | ||
55 | s3c_gpio_cfgpin(S5P6450_GPR(13), S3C_GPIO_SFN(5)); | ||
56 | s3c_gpio_cfgpin(S5P6450_GPR(14), S3C_GPIO_SFN(5)); | ||
57 | break; | 48 | break; |
58 | 49 | ||
59 | default: | 50 | default: |
@@ -116,11 +107,8 @@ static int s5p6440_pcm_cfg_gpio(struct platform_device *pdev) | |||
116 | { | 107 | { |
117 | switch (pdev->id) { | 108 | switch (pdev->id) { |
118 | case 0: | 109 | case 0: |
119 | s3c_gpio_cfgpin(S5P6440_GPR(7), S3C_GPIO_SFN(2)); | 110 | s3c_gpio_cfgpin_range(S5P6440_GPR(6), 3, S3C_GPIO_SFN(2)); |
120 | s3c_gpio_cfgpin(S5P6440_GPR(13), S3C_GPIO_SFN(2)); | 111 | s3c_gpio_cfgpin_range(S5P6440_GPR(13), 2, S3C_GPIO_SFN(2)); |
121 | s3c_gpio_cfgpin(S5P6440_GPR(14), S3C_GPIO_SFN(2)); | ||
122 | s3c_gpio_cfgpin(S5P6440_GPR(8), S3C_GPIO_SFN(2)); | ||
123 | s3c_gpio_cfgpin(S5P6440_GPR(6), S3C_GPIO_SFN(2)); | ||
124 | break; | 112 | break; |
125 | 113 | ||
126 | default: | 114 | default: |
diff --git a/arch/arm/mach-s5p64x0/dev-spi.c b/arch/arm/mach-s5p64x0/dev-spi.c index 5b69ec4c8af3..e78ee18c76e3 100644 --- a/arch/arm/mach-s5p64x0/dev-spi.c +++ b/arch/arm/mach-s5p64x0/dev-spi.c | |||
@@ -39,23 +39,15 @@ static char *s5p64x0_spi_src_clks[] = { | |||
39 | */ | 39 | */ |
40 | static int s5p6440_spi_cfg_gpio(struct platform_device *pdev) | 40 | static int s5p6440_spi_cfg_gpio(struct platform_device *pdev) |
41 | { | 41 | { |
42 | unsigned int base; | ||
43 | |||
42 | switch (pdev->id) { | 44 | switch (pdev->id) { |
43 | case 0: | 45 | case 0: |
44 | s3c_gpio_cfgpin(S5P6440_GPC(0), S3C_GPIO_SFN(2)); | 46 | base = S5P6440_GPC(0); |
45 | s3c_gpio_cfgpin(S5P6440_GPC(1), S3C_GPIO_SFN(2)); | ||
46 | s3c_gpio_cfgpin(S5P6440_GPC(2), S3C_GPIO_SFN(2)); | ||
47 | s3c_gpio_setpull(S5P6440_GPC(0), S3C_GPIO_PULL_UP); | ||
48 | s3c_gpio_setpull(S5P6440_GPC(1), S3C_GPIO_PULL_UP); | ||
49 | s3c_gpio_setpull(S5P6440_GPC(2), S3C_GPIO_PULL_UP); | ||
50 | break; | 47 | break; |
51 | 48 | ||
52 | case 1: | 49 | case 1: |
53 | s3c_gpio_cfgpin(S5P6440_GPC(4), S3C_GPIO_SFN(2)); | 50 | base = S5P6440_GPC(4); |
54 | s3c_gpio_cfgpin(S5P6440_GPC(5), S3C_GPIO_SFN(2)); | ||
55 | s3c_gpio_cfgpin(S5P6440_GPC(6), S3C_GPIO_SFN(2)); | ||
56 | s3c_gpio_setpull(S5P6440_GPC(4), S3C_GPIO_PULL_UP); | ||
57 | s3c_gpio_setpull(S5P6440_GPC(5), S3C_GPIO_PULL_UP); | ||
58 | s3c_gpio_setpull(S5P6440_GPC(6), S3C_GPIO_PULL_UP); | ||
59 | break; | 51 | break; |
60 | 52 | ||
61 | default: | 53 | default: |
@@ -63,28 +55,23 @@ static int s5p6440_spi_cfg_gpio(struct platform_device *pdev) | |||
63 | return -EINVAL; | 55 | return -EINVAL; |
64 | } | 56 | } |
65 | 57 | ||
58 | s3c_gpio_cfgall_range(base, 3, | ||
59 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); | ||
60 | |||
66 | return 0; | 61 | return 0; |
67 | } | 62 | } |
68 | 63 | ||
69 | static int s5p6450_spi_cfg_gpio(struct platform_device *pdev) | 64 | static int s5p6450_spi_cfg_gpio(struct platform_device *pdev) |
70 | { | 65 | { |
66 | unsigned int base; | ||
67 | |||
71 | switch (pdev->id) { | 68 | switch (pdev->id) { |
72 | case 0: | 69 | case 0: |
73 | s3c_gpio_cfgpin(S5P6450_GPC(0), S3C_GPIO_SFN(2)); | 70 | base = S5P6450_GPC(0); |
74 | s3c_gpio_cfgpin(S5P6450_GPC(1), S3C_GPIO_SFN(2)); | ||
75 | s3c_gpio_cfgpin(S5P6450_GPC(2), S3C_GPIO_SFN(2)); | ||
76 | s3c_gpio_setpull(S5P6450_GPC(0), S3C_GPIO_PULL_UP); | ||
77 | s3c_gpio_setpull(S5P6450_GPC(1), S3C_GPIO_PULL_UP); | ||
78 | s3c_gpio_setpull(S5P6450_GPC(2), S3C_GPIO_PULL_UP); | ||
79 | break; | 71 | break; |
80 | 72 | ||
81 | case 1: | 73 | case 1: |
82 | s3c_gpio_cfgpin(S5P6450_GPC(4), S3C_GPIO_SFN(2)); | 74 | base = S5P6450_GPC(4); |
83 | s3c_gpio_cfgpin(S5P6450_GPC(5), S3C_GPIO_SFN(2)); | ||
84 | s3c_gpio_cfgpin(S5P6450_GPC(6), S3C_GPIO_SFN(2)); | ||
85 | s3c_gpio_setpull(S5P6450_GPC(4), S3C_GPIO_PULL_UP); | ||
86 | s3c_gpio_setpull(S5P6450_GPC(5), S3C_GPIO_PULL_UP); | ||
87 | s3c_gpio_setpull(S5P6450_GPC(6), S3C_GPIO_PULL_UP); | ||
88 | break; | 75 | break; |
89 | 76 | ||
90 | default: | 77 | default: |
@@ -92,6 +79,9 @@ static int s5p6450_spi_cfg_gpio(struct platform_device *pdev) | |||
92 | return -EINVAL; | 79 | return -EINVAL; |
93 | } | 80 | } |
94 | 81 | ||
82 | s3c_gpio_cfgall_range(base, 3, | ||
83 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); | ||
84 | |||
95 | return 0; | 85 | return 0; |
96 | } | 86 | } |
97 | 87 | ||
diff --git a/arch/arm/mach-s5p64x0/dma.c b/arch/arm/mach-s5p64x0/dma.c index 29a8c2410049..d7ad944b3475 100644 --- a/arch/arm/mach-s5p64x0/dma.c +++ b/arch/arm/mach-s5p64x0/dma.c | |||
@@ -122,7 +122,7 @@ static struct s3c_pl330_platdata s5p6450_pdma_pdata = { | |||
122 | 122 | ||
123 | static struct platform_device s5p64x0_device_pdma = { | 123 | static struct platform_device s5p64x0_device_pdma = { |
124 | .name = "s3c-pl330", | 124 | .name = "s3c-pl330", |
125 | .id = 0, | 125 | .id = -1, |
126 | .num_resources = ARRAY_SIZE(s5p64x0_pdma_resource), | 126 | .num_resources = ARRAY_SIZE(s5p64x0_pdma_resource), |
127 | .resource = s5p64x0_pdma_resource, | 127 | .resource = s5p64x0_pdma_resource, |
128 | .dev = { | 128 | .dev = { |
diff --git a/arch/arm/mach-s5p64x0/include/mach/regs-clock.h b/arch/arm/mach-s5p64x0/include/mach/regs-clock.h index 58e1bc813804..a133f22fa155 100644 --- a/arch/arm/mach-s5p64x0/include/mach/regs-clock.h +++ b/arch/arm/mach-s5p64x0/include/mach/regs-clock.h | |||
@@ -60,4 +60,6 @@ | |||
60 | #define ARM_DIV_RATIO_SHIFT 0 | 60 | #define ARM_DIV_RATIO_SHIFT 0 |
61 | #define ARM_DIV_MASK (0xF << ARM_DIV_RATIO_SHIFT) | 61 | #define ARM_DIV_MASK (0xF << ARM_DIV_RATIO_SHIFT) |
62 | 62 | ||
63 | #define S5P_EPLL_CON S5P64X0_EPLL_CON | ||
64 | |||
63 | #endif /* __ASM_ARCH_REGS_CLOCK_H */ | 65 | #endif /* __ASM_ARCH_REGS_CLOCK_H */ |
diff --git a/arch/arm/mach-s5p64x0/include/mach/vmalloc.h b/arch/arm/mach-s5p64x0/include/mach/vmalloc.h index 97a9df38f1cf..38dcc71a03cc 100644 --- a/arch/arm/mach-s5p64x0/include/mach/vmalloc.h +++ b/arch/arm/mach-s5p64x0/include/mach/vmalloc.h | |||
@@ -15,6 +15,6 @@ | |||
15 | #ifndef __ASM_ARCH_VMALLOC_H | 15 | #ifndef __ASM_ARCH_VMALLOC_H |
16 | #define __ASM_ARCH_VMALLOC_H | 16 | #define __ASM_ARCH_VMALLOC_H |
17 | 17 | ||
18 | #define VMALLOC_END 0xE0000000UL | 18 | #define VMALLOC_END 0xF6000000UL |
19 | 19 | ||
20 | #endif /* __ASM_ARCH_VMALLOC_H */ | 20 | #endif /* __ASM_ARCH_VMALLOC_H */ |
diff --git a/arch/arm/mach-s5p64x0/setup-i2c0.c b/arch/arm/mach-s5p64x0/setup-i2c0.c index dc4cc65a5019..46b463917c54 100644 --- a/arch/arm/mach-s5p64x0/setup-i2c0.c +++ b/arch/arm/mach-s5p64x0/setup-i2c0.c | |||
@@ -25,18 +25,14 @@ struct platform_device; /* don't need the contents */ | |||
25 | 25 | ||
26 | void s5p6440_i2c0_cfg_gpio(struct platform_device *dev) | 26 | void s5p6440_i2c0_cfg_gpio(struct platform_device *dev) |
27 | { | 27 | { |
28 | s3c_gpio_cfgpin(S5P6440_GPB(5), S3C_GPIO_SFN(2)); | 28 | s3c_gpio_cfgall_range(S5P6440_GPB(5), 2, |
29 | s3c_gpio_setpull(S5P6440_GPB(5), S3C_GPIO_PULL_UP); | 29 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
30 | s3c_gpio_cfgpin(S5P6440_GPB(6), S3C_GPIO_SFN(2)); | ||
31 | s3c_gpio_setpull(S5P6440_GPB(6), S3C_GPIO_PULL_UP); | ||
32 | } | 30 | } |
33 | 31 | ||
34 | void s5p6450_i2c0_cfg_gpio(struct platform_device *dev) | 32 | void s5p6450_i2c0_cfg_gpio(struct platform_device *dev) |
35 | { | 33 | { |
36 | s3c_gpio_cfgpin(S5P6450_GPB(5), S3C_GPIO_SFN(2)); | 34 | s3c_gpio_cfgall_range(S5P6450_GPB(5), 2, |
37 | s3c_gpio_setpull(S5P6450_GPB(5), S3C_GPIO_PULL_UP); | 35 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
38 | s3c_gpio_cfgpin(S5P6450_GPB(6), S3C_GPIO_SFN(2)); | ||
39 | s3c_gpio_setpull(S5P6450_GPB(6), S3C_GPIO_PULL_UP); | ||
40 | } | 36 | } |
41 | 37 | ||
42 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) { } | 38 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) { } |
diff --git a/arch/arm/mach-s5p64x0/setup-i2c1.c b/arch/arm/mach-s5p64x0/setup-i2c1.c index 2edd7912f8e4..6ad3b986021c 100644 --- a/arch/arm/mach-s5p64x0/setup-i2c1.c +++ b/arch/arm/mach-s5p64x0/setup-i2c1.c | |||
@@ -25,18 +25,14 @@ struct platform_device; /* don't need the contents */ | |||
25 | 25 | ||
26 | void s5p6440_i2c1_cfg_gpio(struct platform_device *dev) | 26 | void s5p6440_i2c1_cfg_gpio(struct platform_device *dev) |
27 | { | 27 | { |
28 | s3c_gpio_cfgpin(S5P6440_GPR(9), S3C_GPIO_SFN(6)); | 28 | s3c_gpio_cfgall_range(S5P6440_GPR(9), 2, |
29 | s3c_gpio_setpull(S5P6440_GPR(9), S3C_GPIO_PULL_UP); | 29 | S3C_GPIO_SFN(6), S3C_GPIO_PULL_UP); |
30 | s3c_gpio_cfgpin(S5P6440_GPR(10), S3C_GPIO_SFN(6)); | ||
31 | s3c_gpio_setpull(S5P6440_GPR(10), S3C_GPIO_PULL_UP); | ||
32 | } | 30 | } |
33 | 31 | ||
34 | void s5p6450_i2c1_cfg_gpio(struct platform_device *dev) | 32 | void s5p6450_i2c1_cfg_gpio(struct platform_device *dev) |
35 | { | 33 | { |
36 | s3c_gpio_cfgpin(S5P6450_GPR(9), S3C_GPIO_SFN(6)); | 34 | s3c_gpio_cfgall_range(S5P6450_GPR(9), 2, |
37 | s3c_gpio_setpull(S5P6450_GPR(9), S3C_GPIO_PULL_UP); | 35 | S3C_GPIO_SFN(6), S3C_GPIO_PULL_UP); |
38 | s3c_gpio_cfgpin(S5P6450_GPR(10), S3C_GPIO_SFN(6)); | ||
39 | s3c_gpio_setpull(S5P6450_GPR(10), S3C_GPIO_PULL_UP); | ||
40 | } | 36 | } |
41 | 37 | ||
42 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) { } | 38 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) { } |
diff --git a/arch/arm/mach-s5pc100/Kconfig b/arch/arm/mach-s5pc100/Kconfig index 77ae4bfb74ba..b8fbf2fcba6f 100644 --- a/arch/arm/mach-s5pc100/Kconfig +++ b/arch/arm/mach-s5pc100/Kconfig | |||
@@ -9,7 +9,6 @@ if ARCH_S5PC100 | |||
9 | 9 | ||
10 | config CPU_S5PC100 | 10 | config CPU_S5PC100 |
11 | bool | 11 | bool |
12 | select PLAT_S5P | ||
13 | select S5P_EXT_INT | 12 | select S5P_EXT_INT |
14 | select S3C_PL330_DMA | 13 | select S3C_PL330_DMA |
15 | help | 14 | help |
diff --git a/arch/arm/mach-s5pc100/Makefile b/arch/arm/mach-s5pc100/Makefile index a021ed1fb4b6..eecab57d2e5d 100644 --- a/arch/arm/mach-s5pc100/Makefile +++ b/arch/arm/mach-s5pc100/Makefile | |||
@@ -11,7 +11,7 @@ obj- := | |||
11 | 11 | ||
12 | # Core support for S5PC100 system | 12 | # Core support for S5PC100 system |
13 | 13 | ||
14 | obj-$(CONFIG_CPU_S5PC100) += cpu.o init.o clock.o gpiolib.o irq-gpio.o | 14 | obj-$(CONFIG_CPU_S5PC100) += cpu.o init.o clock.o gpiolib.o |
15 | obj-$(CONFIG_CPU_S5PC100) += setup-i2c0.o | 15 | obj-$(CONFIG_CPU_S5PC100) += setup-i2c0.o |
16 | obj-$(CONFIG_CPU_S5PC100) += dma.o | 16 | obj-$(CONFIG_CPU_S5PC100) += dma.o |
17 | 17 | ||
diff --git a/arch/arm/mach-s5pc100/clock.c b/arch/arm/mach-s5pc100/clock.c index 084abd13b0a5..2d4a761a5163 100644 --- a/arch/arm/mach-s5pc100/clock.c +++ b/arch/arm/mach-s5pc100/clock.c | |||
@@ -273,24 +273,6 @@ static struct clksrc_clk clk_div_hdmi = { | |||
273 | .reg_div = { .reg = S5P_CLK_DIV3, .shift = 28, .size = 4 }, | 273 | .reg_div = { .reg = S5P_CLK_DIV3, .shift = 28, .size = 4 }, |
274 | }; | 274 | }; |
275 | 275 | ||
276 | static int s5pc100_epll_enable(struct clk *clk, int enable) | ||
277 | { | ||
278 | unsigned int ctrlbit = clk->ctrlbit; | ||
279 | unsigned int epll_con = __raw_readl(S5P_EPLL_CON) & ~ctrlbit; | ||
280 | |||
281 | if (enable) | ||
282 | __raw_writel(epll_con | ctrlbit, S5P_EPLL_CON); | ||
283 | else | ||
284 | __raw_writel(epll_con, S5P_EPLL_CON); | ||
285 | |||
286 | return 0; | ||
287 | } | ||
288 | |||
289 | static unsigned long s5pc100_epll_get_rate(struct clk *clk) | ||
290 | { | ||
291 | return clk->rate; | ||
292 | } | ||
293 | |||
294 | static u32 epll_div[][4] = { | 276 | static u32 epll_div[][4] = { |
295 | { 32750000, 131, 3, 4 }, | 277 | { 32750000, 131, 3, 4 }, |
296 | { 32768000, 131, 3, 4 }, | 278 | { 32768000, 131, 3, 4 }, |
@@ -341,13 +323,16 @@ static int s5pc100_epll_set_rate(struct clk *clk, unsigned long rate) | |||
341 | 323 | ||
342 | __raw_writel(epll_con, S5P_EPLL_CON); | 324 | __raw_writel(epll_con, S5P_EPLL_CON); |
343 | 325 | ||
326 | printk(KERN_WARNING "EPLL Rate changes from %lu to %lu\n", | ||
327 | clk->rate, rate); | ||
328 | |||
344 | clk->rate = rate; | 329 | clk->rate = rate; |
345 | 330 | ||
346 | return 0; | 331 | return 0; |
347 | } | 332 | } |
348 | 333 | ||
349 | static struct clk_ops s5pc100_epll_ops = { | 334 | static struct clk_ops s5pc100_epll_ops = { |
350 | .get_rate = s5pc100_epll_get_rate, | 335 | .get_rate = s5p_epll_get_rate, |
351 | .set_rate = s5pc100_epll_set_rate, | 336 | .set_rate = s5pc100_epll_set_rate, |
352 | }; | 337 | }; |
353 | 338 | ||
@@ -691,55 +676,55 @@ static struct clk init_clocks_disable[] = { | |||
691 | }, { | 676 | }, { |
692 | .name = "iis", | 677 | .name = "iis", |
693 | .id = 0, | 678 | .id = 0, |
694 | .parent = &clk_div_d1_bus.clk, | 679 | .parent = &clk_div_pclkd1.clk, |
695 | .enable = s5pc100_d1_5_ctrl, | 680 | .enable = s5pc100_d1_5_ctrl, |
696 | .ctrlbit = (1 << 0), | 681 | .ctrlbit = (1 << 0), |
697 | }, { | 682 | }, { |
698 | .name = "iis", | 683 | .name = "iis", |
699 | .id = 1, | 684 | .id = 1, |
700 | .parent = &clk_div_d1_bus.clk, | 685 | .parent = &clk_div_pclkd1.clk, |
701 | .enable = s5pc100_d1_5_ctrl, | 686 | .enable = s5pc100_d1_5_ctrl, |
702 | .ctrlbit = (1 << 1), | 687 | .ctrlbit = (1 << 1), |
703 | }, { | 688 | }, { |
704 | .name = "iis", | 689 | .name = "iis", |
705 | .id = 2, | 690 | .id = 2, |
706 | .parent = &clk_div_d1_bus.clk, | 691 | .parent = &clk_div_pclkd1.clk, |
707 | .enable = s5pc100_d1_5_ctrl, | 692 | .enable = s5pc100_d1_5_ctrl, |
708 | .ctrlbit = (1 << 2), | 693 | .ctrlbit = (1 << 2), |
709 | }, { | 694 | }, { |
710 | .name = "ac97", | 695 | .name = "ac97", |
711 | .id = -1, | 696 | .id = -1, |
712 | .parent = &clk_div_d1_bus.clk, | 697 | .parent = &clk_div_pclkd1.clk, |
713 | .enable = s5pc100_d1_5_ctrl, | 698 | .enable = s5pc100_d1_5_ctrl, |
714 | .ctrlbit = (1 << 3), | 699 | .ctrlbit = (1 << 3), |
715 | }, { | 700 | }, { |
716 | .name = "pcm", | 701 | .name = "pcm", |
717 | .id = 0, | 702 | .id = 0, |
718 | .parent = &clk_div_d1_bus.clk, | 703 | .parent = &clk_div_pclkd1.clk, |
719 | .enable = s5pc100_d1_5_ctrl, | 704 | .enable = s5pc100_d1_5_ctrl, |
720 | .ctrlbit = (1 << 4), | 705 | .ctrlbit = (1 << 4), |
721 | }, { | 706 | }, { |
722 | .name = "pcm", | 707 | .name = "pcm", |
723 | .id = 1, | 708 | .id = 1, |
724 | .parent = &clk_div_d1_bus.clk, | 709 | .parent = &clk_div_pclkd1.clk, |
725 | .enable = s5pc100_d1_5_ctrl, | 710 | .enable = s5pc100_d1_5_ctrl, |
726 | .ctrlbit = (1 << 5), | 711 | .ctrlbit = (1 << 5), |
727 | }, { | 712 | }, { |
728 | .name = "spdif", | 713 | .name = "spdif", |
729 | .id = -1, | 714 | .id = -1, |
730 | .parent = &clk_div_d1_bus.clk, | 715 | .parent = &clk_div_pclkd1.clk, |
731 | .enable = s5pc100_d1_5_ctrl, | 716 | .enable = s5pc100_d1_5_ctrl, |
732 | .ctrlbit = (1 << 6), | 717 | .ctrlbit = (1 << 6), |
733 | }, { | 718 | }, { |
734 | .name = "adc", | 719 | .name = "adc", |
735 | .id = -1, | 720 | .id = -1, |
736 | .parent = &clk_div_d1_bus.clk, | 721 | .parent = &clk_div_pclkd1.clk, |
737 | .enable = s5pc100_d1_5_ctrl, | 722 | .enable = s5pc100_d1_5_ctrl, |
738 | .ctrlbit = (1 << 7), | 723 | .ctrlbit = (1 << 7), |
739 | }, { | 724 | }, { |
740 | .name = "keypad", | 725 | .name = "keypad", |
741 | .id = -1, | 726 | .id = -1, |
742 | .parent = &clk_div_d1_bus.clk, | 727 | .parent = &clk_div_pclkd1.clk, |
743 | .enable = s5pc100_d1_5_ctrl, | 728 | .enable = s5pc100_d1_5_ctrl, |
744 | .ctrlbit = (1 << 8), | 729 | .ctrlbit = (1 << 8), |
745 | }, { | 730 | }, { |
@@ -848,6 +833,18 @@ struct clksrc_sources clk_src_group3 = { | |||
848 | .nr_sources = ARRAY_SIZE(clk_src_group3_list), | 833 | .nr_sources = ARRAY_SIZE(clk_src_group3_list), |
849 | }; | 834 | }; |
850 | 835 | ||
836 | static struct clksrc_clk clk_sclk_audio0 = { | ||
837 | .clk = { | ||
838 | .name = "sclk_audio", | ||
839 | .id = 0, | ||
840 | .ctrlbit = (1 << 8), | ||
841 | .enable = s5pc100_sclk1_ctrl, | ||
842 | }, | ||
843 | .sources = &clk_src_group3, | ||
844 | .reg_src = { .reg = S5P_CLK_SRC3, .shift = 12, .size = 3 }, | ||
845 | .reg_div = { .reg = S5P_CLK_DIV4, .shift = 12, .size = 4 }, | ||
846 | }; | ||
847 | |||
851 | static struct clk *clk_src_group4_list[] = { | 848 | static struct clk *clk_src_group4_list[] = { |
852 | [0] = &clk_mout_epll.clk, | 849 | [0] = &clk_mout_epll.clk, |
853 | [1] = &clk_div_mpll.clk, | 850 | [1] = &clk_div_mpll.clk, |
@@ -862,6 +859,18 @@ struct clksrc_sources clk_src_group4 = { | |||
862 | .nr_sources = ARRAY_SIZE(clk_src_group4_list), | 859 | .nr_sources = ARRAY_SIZE(clk_src_group4_list), |
863 | }; | 860 | }; |
864 | 861 | ||
862 | static struct clksrc_clk clk_sclk_audio1 = { | ||
863 | .clk = { | ||
864 | .name = "sclk_audio", | ||
865 | .id = 1, | ||
866 | .ctrlbit = (1 << 9), | ||
867 | .enable = s5pc100_sclk1_ctrl, | ||
868 | }, | ||
869 | .sources = &clk_src_group4, | ||
870 | .reg_src = { .reg = S5P_CLK_SRC3, .shift = 16, .size = 3 }, | ||
871 | .reg_div = { .reg = S5P_CLK_DIV4, .shift = 16, .size = 4 }, | ||
872 | }; | ||
873 | |||
865 | static struct clk *clk_src_group5_list[] = { | 874 | static struct clk *clk_src_group5_list[] = { |
866 | [0] = &clk_mout_epll.clk, | 875 | [0] = &clk_mout_epll.clk, |
867 | [1] = &clk_div_mpll.clk, | 876 | [1] = &clk_div_mpll.clk, |
@@ -875,6 +884,18 @@ struct clksrc_sources clk_src_group5 = { | |||
875 | .nr_sources = ARRAY_SIZE(clk_src_group5_list), | 884 | .nr_sources = ARRAY_SIZE(clk_src_group5_list), |
876 | }; | 885 | }; |
877 | 886 | ||
887 | static struct clksrc_clk clk_sclk_audio2 = { | ||
888 | .clk = { | ||
889 | .name = "sclk_audio", | ||
890 | .id = 2, | ||
891 | .ctrlbit = (1 << 10), | ||
892 | .enable = s5pc100_sclk1_ctrl, | ||
893 | }, | ||
894 | .sources = &clk_src_group5, | ||
895 | .reg_src = { .reg = S5P_CLK_SRC3, .shift = 20, .size = 3 }, | ||
896 | .reg_div = { .reg = S5P_CLK_DIV4, .shift = 20, .size = 4 }, | ||
897 | }; | ||
898 | |||
878 | static struct clk *clk_src_group6_list[] = { | 899 | static struct clk *clk_src_group6_list[] = { |
879 | [0] = &s5p_clk_27m, | 900 | [0] = &s5p_clk_27m, |
880 | [1] = &clk_vclk54m, | 901 | [1] = &clk_vclk54m, |
@@ -944,6 +965,64 @@ struct clksrc_sources clk_src_pwi = { | |||
944 | .nr_sources = ARRAY_SIZE(clk_src_pwi_list), | 965 | .nr_sources = ARRAY_SIZE(clk_src_pwi_list), |
945 | }; | 966 | }; |
946 | 967 | ||
968 | static struct clk *clk_sclk_spdif_list[] = { | ||
969 | [0] = &clk_sclk_audio0.clk, | ||
970 | [1] = &clk_sclk_audio1.clk, | ||
971 | [2] = &clk_sclk_audio2.clk, | ||
972 | }; | ||
973 | |||
974 | struct clksrc_sources clk_src_sclk_spdif = { | ||
975 | .sources = clk_sclk_spdif_list, | ||
976 | .nr_sources = ARRAY_SIZE(clk_sclk_spdif_list), | ||
977 | }; | ||
978 | |||
979 | static int s5pc100_spdif_set_rate(struct clk *clk, unsigned long rate) | ||
980 | { | ||
981 | struct clk *pclk; | ||
982 | int ret; | ||
983 | |||
984 | pclk = clk_get_parent(clk); | ||
985 | if (IS_ERR(pclk)) | ||
986 | return -EINVAL; | ||
987 | |||
988 | ret = pclk->ops->set_rate(pclk, rate); | ||
989 | clk_put(pclk); | ||
990 | |||
991 | return ret; | ||
992 | } | ||
993 | |||
994 | static unsigned long s5pc100_spdif_get_rate(struct clk *clk) | ||
995 | { | ||
996 | struct clk *pclk; | ||
997 | int rate; | ||
998 | |||
999 | pclk = clk_get_parent(clk); | ||
1000 | if (IS_ERR(pclk)) | ||
1001 | return -EINVAL; | ||
1002 | |||
1003 | rate = pclk->ops->get_rate(clk); | ||
1004 | clk_put(pclk); | ||
1005 | |||
1006 | return rate; | ||
1007 | } | ||
1008 | |||
1009 | static struct clk_ops s5pc100_sclk_spdif_ops = { | ||
1010 | .set_rate = s5pc100_spdif_set_rate, | ||
1011 | .get_rate = s5pc100_spdif_get_rate, | ||
1012 | }; | ||
1013 | |||
1014 | static struct clksrc_clk clk_sclk_spdif = { | ||
1015 | .clk = { | ||
1016 | .name = "sclk_spdif", | ||
1017 | .id = -1, | ||
1018 | .ctrlbit = (1 << 11), | ||
1019 | .enable = s5pc100_sclk1_ctrl, | ||
1020 | .ops = &s5pc100_sclk_spdif_ops, | ||
1021 | }, | ||
1022 | .sources = &clk_src_sclk_spdif, | ||
1023 | .reg_src = { .reg = S5P_CLK_SRC3, .shift = 24, .size = 2 }, | ||
1024 | }; | ||
1025 | |||
947 | static struct clksrc_clk clksrcs[] = { | 1026 | static struct clksrc_clk clksrcs[] = { |
948 | { | 1027 | { |
949 | .clk = { | 1028 | .clk = { |
@@ -1001,39 +1080,6 @@ static struct clksrc_clk clksrcs[] = { | |||
1001 | .reg_src = { .reg = S5P_CLK_SRC2, .shift = 28, .size = 2 }, | 1080 | .reg_src = { .reg = S5P_CLK_SRC2, .shift = 28, .size = 2 }, |
1002 | }, { | 1081 | }, { |
1003 | .clk = { | 1082 | .clk = { |
1004 | .name = "sclk_audio", | ||
1005 | .id = 0, | ||
1006 | .ctrlbit = (1 << 8), | ||
1007 | .enable = s5pc100_sclk1_ctrl, | ||
1008 | |||
1009 | }, | ||
1010 | .sources = &clk_src_group3, | ||
1011 | .reg_src = { .reg = S5P_CLK_SRC3, .shift = 12, .size = 3 }, | ||
1012 | .reg_div = { .reg = S5P_CLK_DIV4, .shift = 12, .size = 4 }, | ||
1013 | }, { | ||
1014 | .clk = { | ||
1015 | .name = "sclk_audio", | ||
1016 | .id = 1, | ||
1017 | .ctrlbit = (1 << 9), | ||
1018 | .enable = s5pc100_sclk1_ctrl, | ||
1019 | |||
1020 | }, | ||
1021 | .sources = &clk_src_group4, | ||
1022 | .reg_src = { .reg = S5P_CLK_SRC3, .shift = 16, .size = 3 }, | ||
1023 | .reg_div = { .reg = S5P_CLK_DIV4, .shift = 16, .size = 4 }, | ||
1024 | }, { | ||
1025 | .clk = { | ||
1026 | .name = "sclk_audio", | ||
1027 | .id = 2, | ||
1028 | .ctrlbit = (1 << 10), | ||
1029 | .enable = s5pc100_sclk1_ctrl, | ||
1030 | |||
1031 | }, | ||
1032 | .sources = &clk_src_group5, | ||
1033 | .reg_src = { .reg = S5P_CLK_SRC3, .shift = 20, .size = 3 }, | ||
1034 | .reg_div = { .reg = S5P_CLK_DIV4, .shift = 20, .size = 4 }, | ||
1035 | }, { | ||
1036 | .clk = { | ||
1037 | .name = "sclk_lcd", | 1083 | .name = "sclk_lcd", |
1038 | .id = -1, | 1084 | .id = -1, |
1039 | .ctrlbit = (1 << 0), | 1085 | .ctrlbit = (1 << 0), |
@@ -1179,6 +1225,10 @@ static struct clksrc_clk *sysclks[] = { | |||
1179 | &clk_div_pclkd1, | 1225 | &clk_div_pclkd1, |
1180 | &clk_div_cam, | 1226 | &clk_div_cam, |
1181 | &clk_div_hdmi, | 1227 | &clk_div_hdmi, |
1228 | &clk_sclk_audio0, | ||
1229 | &clk_sclk_audio1, | ||
1230 | &clk_sclk_audio2, | ||
1231 | &clk_sclk_spdif, | ||
1182 | }; | 1232 | }; |
1183 | 1233 | ||
1184 | void __init_or_cpufreq s5pc100_setup_clocks(void) | 1234 | void __init_or_cpufreq s5pc100_setup_clocks(void) |
@@ -1196,7 +1246,7 @@ void __init_or_cpufreq s5pc100_setup_clocks(void) | |||
1196 | unsigned int ptr; | 1246 | unsigned int ptr; |
1197 | 1247 | ||
1198 | /* Set S5PC100 functions for clk_fout_epll */ | 1248 | /* Set S5PC100 functions for clk_fout_epll */ |
1199 | clk_fout_epll.enable = s5pc100_epll_enable; | 1249 | clk_fout_epll.enable = s5p_epll_enable; |
1200 | clk_fout_epll.ops = &s5pc100_epll_ops; | 1250 | clk_fout_epll.ops = &s5pc100_epll_ops; |
1201 | 1251 | ||
1202 | printk(KERN_DEBUG "%s: registering clocks\n", __func__); | 1252 | printk(KERN_DEBUG "%s: registering clocks\n", __func__); |
diff --git a/arch/arm/mach-s5pc100/dev-audio.c b/arch/arm/mach-s5pc100/dev-audio.c index a699ed6acc23..564e195ec493 100644 --- a/arch/arm/mach-s5pc100/dev-audio.c +++ b/arch/arm/mach-s5pc100/dev-audio.c | |||
@@ -24,19 +24,11 @@ static int s5pc100_cfg_i2s(struct platform_device *pdev) | |||
24 | /* configure GPIO for i2s port */ | 24 | /* configure GPIO for i2s port */ |
25 | switch (pdev->id) { | 25 | switch (pdev->id) { |
26 | case 1: | 26 | case 1: |
27 | s3c_gpio_cfgpin(S5PC100_GPC(0), S3C_GPIO_SFN(2)); | 27 | s3c_gpio_cfgpin_range(S5PC100_GPC(0), 5, S3C_GPIO_SFN(2)); |
28 | s3c_gpio_cfgpin(S5PC100_GPC(1), S3C_GPIO_SFN(2)); | ||
29 | s3c_gpio_cfgpin(S5PC100_GPC(2), S3C_GPIO_SFN(2)); | ||
30 | s3c_gpio_cfgpin(S5PC100_GPC(3), S3C_GPIO_SFN(2)); | ||
31 | s3c_gpio_cfgpin(S5PC100_GPC(4), S3C_GPIO_SFN(2)); | ||
32 | break; | 28 | break; |
33 | 29 | ||
34 | case 2: | 30 | case 2: |
35 | s3c_gpio_cfgpin(S5PC100_GPG3(0), S3C_GPIO_SFN(4)); | 31 | s3c_gpio_cfgpin_range(S5PC100_GPG3(0), 5, S3C_GPIO_SFN(4)); |
36 | s3c_gpio_cfgpin(S5PC100_GPG3(1), S3C_GPIO_SFN(4)); | ||
37 | s3c_gpio_cfgpin(S5PC100_GPG3(2), S3C_GPIO_SFN(4)); | ||
38 | s3c_gpio_cfgpin(S5PC100_GPG3(3), S3C_GPIO_SFN(4)); | ||
39 | s3c_gpio_cfgpin(S5PC100_GPG3(4), S3C_GPIO_SFN(4)); | ||
40 | break; | 32 | break; |
41 | 33 | ||
42 | case -1: /* Dedicated pins */ | 34 | case -1: /* Dedicated pins */ |
@@ -144,19 +136,11 @@ static int s5pc100_pcm_cfg_gpio(struct platform_device *pdev) | |||
144 | { | 136 | { |
145 | switch (pdev->id) { | 137 | switch (pdev->id) { |
146 | case 0: | 138 | case 0: |
147 | s3c_gpio_cfgpin(S5PC100_GPG3(0), S3C_GPIO_SFN(5)); | 139 | s3c_gpio_cfgpin_range(S5PC100_GPG3(0), 5, S3C_GPIO_SFN(5)); |
148 | s3c_gpio_cfgpin(S5PC100_GPG3(1), S3C_GPIO_SFN(5)); | ||
149 | s3c_gpio_cfgpin(S5PC100_GPG3(2), S3C_GPIO_SFN(5)); | ||
150 | s3c_gpio_cfgpin(S5PC100_GPG3(3), S3C_GPIO_SFN(5)); | ||
151 | s3c_gpio_cfgpin(S5PC100_GPG3(4), S3C_GPIO_SFN(5)); | ||
152 | break; | 140 | break; |
153 | 141 | ||
154 | case 1: | 142 | case 1: |
155 | s3c_gpio_cfgpin(S5PC100_GPC(0), S3C_GPIO_SFN(3)); | 143 | s3c_gpio_cfgpin_range(S5PC100_GPC(0), 5, S3C_GPIO_SFN(3)); |
156 | s3c_gpio_cfgpin(S5PC100_GPC(1), S3C_GPIO_SFN(3)); | ||
157 | s3c_gpio_cfgpin(S5PC100_GPC(2), S3C_GPIO_SFN(3)); | ||
158 | s3c_gpio_cfgpin(S5PC100_GPC(3), S3C_GPIO_SFN(3)); | ||
159 | s3c_gpio_cfgpin(S5PC100_GPC(4), S3C_GPIO_SFN(3)); | ||
160 | break; | 144 | break; |
161 | 145 | ||
162 | default: | 146 | default: |
@@ -231,13 +215,7 @@ struct platform_device s5pc100_device_pcm1 = { | |||
231 | 215 | ||
232 | static int s5pc100_ac97_cfg_gpio(struct platform_device *pdev) | 216 | static int s5pc100_ac97_cfg_gpio(struct platform_device *pdev) |
233 | { | 217 | { |
234 | s3c_gpio_cfgpin(S5PC100_GPC(0), S3C_GPIO_SFN(4)); | 218 | return s3c_gpio_cfgpin_range(S5PC100_GPC(0), 5, S3C_GPIO_SFN(4)); |
235 | s3c_gpio_cfgpin(S5PC100_GPC(1), S3C_GPIO_SFN(4)); | ||
236 | s3c_gpio_cfgpin(S5PC100_GPC(2), S3C_GPIO_SFN(4)); | ||
237 | s3c_gpio_cfgpin(S5PC100_GPC(3), S3C_GPIO_SFN(4)); | ||
238 | s3c_gpio_cfgpin(S5PC100_GPC(4), S3C_GPIO_SFN(4)); | ||
239 | |||
240 | return 0; | ||
241 | } | 219 | } |
242 | 220 | ||
243 | static struct resource s5pc100_ac97_resource[] = { | 221 | static struct resource s5pc100_ac97_resource[] = { |
@@ -285,3 +263,57 @@ struct platform_device s5pc100_device_ac97 = { | |||
285 | .coherent_dma_mask = DMA_BIT_MASK(32), | 263 | .coherent_dma_mask = DMA_BIT_MASK(32), |
286 | }, | 264 | }, |
287 | }; | 265 | }; |
266 | |||
267 | /* S/PDIF Controller platform_device */ | ||
268 | static int s5pc100_spdif_cfg_gpd(struct platform_device *pdev) | ||
269 | { | ||
270 | s3c_gpio_cfgpin_range(S5PC100_GPD(5), 2, S3C_GPIO_SFN(3)); | ||
271 | |||
272 | return 0; | ||
273 | } | ||
274 | |||
275 | static int s5pc100_spdif_cfg_gpg3(struct platform_device *pdev) | ||
276 | { | ||
277 | s3c_gpio_cfgpin_range(S5PC100_GPG3(5), 2, S3C_GPIO_SFN(3)); | ||
278 | |||
279 | return 0; | ||
280 | } | ||
281 | |||
282 | static struct resource s5pc100_spdif_resource[] = { | ||
283 | [0] = { | ||
284 | .start = S5PC100_PA_SPDIF, | ||
285 | .end = S5PC100_PA_SPDIF + 0x100 - 1, | ||
286 | .flags = IORESOURCE_MEM, | ||
287 | }, | ||
288 | [1] = { | ||
289 | .start = DMACH_SPDIF, | ||
290 | .end = DMACH_SPDIF, | ||
291 | .flags = IORESOURCE_DMA, | ||
292 | }, | ||
293 | }; | ||
294 | |||
295 | static struct s3c_audio_pdata s5p_spdif_pdata = { | ||
296 | .cfg_gpio = s5pc100_spdif_cfg_gpd, | ||
297 | }; | ||
298 | |||
299 | static u64 s5pc100_spdif_dmamask = DMA_BIT_MASK(32); | ||
300 | |||
301 | struct platform_device s5pc100_device_spdif = { | ||
302 | .name = "samsung-spdif", | ||
303 | .id = -1, | ||
304 | .num_resources = ARRAY_SIZE(s5pc100_spdif_resource), | ||
305 | .resource = s5pc100_spdif_resource, | ||
306 | .dev = { | ||
307 | .platform_data = &s5p_spdif_pdata, | ||
308 | .dma_mask = &s5pc100_spdif_dmamask, | ||
309 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
310 | }, | ||
311 | }; | ||
312 | |||
313 | void __init s5pc100_spdif_setup_gpio(int gpio) | ||
314 | { | ||
315 | if (gpio == S5PC100_SPDIF_GPD) | ||
316 | s5p_spdif_pdata.cfg_gpio = s5pc100_spdif_cfg_gpd; | ||
317 | else | ||
318 | s5p_spdif_pdata.cfg_gpio = s5pc100_spdif_cfg_gpg3; | ||
319 | } | ||
diff --git a/arch/arm/mach-s5pc100/dev-spi.c b/arch/arm/mach-s5pc100/dev-spi.c index a0ef7c302c16..57b19794d9bb 100644 --- a/arch/arm/mach-s5pc100/dev-spi.c +++ b/arch/arm/mach-s5pc100/dev-spi.c | |||
@@ -38,30 +38,20 @@ static int s5pc100_spi_cfg_gpio(struct platform_device *pdev) | |||
38 | { | 38 | { |
39 | switch (pdev->id) { | 39 | switch (pdev->id) { |
40 | case 0: | 40 | case 0: |
41 | s3c_gpio_cfgpin(S5PC100_GPB(0), S3C_GPIO_SFN(2)); | 41 | s3c_gpio_cfgall_range(S5PC100_GPB(0), 3, |
42 | s3c_gpio_cfgpin(S5PC100_GPB(1), S3C_GPIO_SFN(2)); | 42 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
43 | s3c_gpio_cfgpin(S5PC100_GPB(2), S3C_GPIO_SFN(2)); | ||
44 | s3c_gpio_setpull(S5PC100_GPB(0), S3C_GPIO_PULL_UP); | ||
45 | s3c_gpio_setpull(S5PC100_GPB(1), S3C_GPIO_PULL_UP); | ||
46 | s3c_gpio_setpull(S5PC100_GPB(2), S3C_GPIO_PULL_UP); | ||
47 | break; | 43 | break; |
48 | 44 | ||
49 | case 1: | 45 | case 1: |
50 | s3c_gpio_cfgpin(S5PC100_GPB(4), S3C_GPIO_SFN(2)); | 46 | s3c_gpio_cfgall_range(S5PC100_GPB(4), 3, |
51 | s3c_gpio_cfgpin(S5PC100_GPB(5), S3C_GPIO_SFN(2)); | 47 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
52 | s3c_gpio_cfgpin(S5PC100_GPB(6), S3C_GPIO_SFN(2)); | ||
53 | s3c_gpio_setpull(S5PC100_GPB(4), S3C_GPIO_PULL_UP); | ||
54 | s3c_gpio_setpull(S5PC100_GPB(5), S3C_GPIO_PULL_UP); | ||
55 | s3c_gpio_setpull(S5PC100_GPB(6), S3C_GPIO_PULL_UP); | ||
56 | break; | 48 | break; |
57 | 49 | ||
58 | case 2: | 50 | case 2: |
59 | s3c_gpio_cfgpin(S5PC100_GPG3(0), S3C_GPIO_SFN(3)); | 51 | s3c_gpio_cfgpin(S5PC100_GPG3(0), S3C_GPIO_SFN(3)); |
60 | s3c_gpio_cfgpin(S5PC100_GPG3(2), S3C_GPIO_SFN(3)); | ||
61 | s3c_gpio_cfgpin(S5PC100_GPG3(3), S3C_GPIO_SFN(3)); | ||
62 | s3c_gpio_setpull(S5PC100_GPG3(0), S3C_GPIO_PULL_UP); | 52 | s3c_gpio_setpull(S5PC100_GPG3(0), S3C_GPIO_PULL_UP); |
63 | s3c_gpio_setpull(S5PC100_GPG3(2), S3C_GPIO_PULL_UP); | 53 | s3c_gpio_cfgall_range(S5PC100_GPB(2), 2, |
64 | s3c_gpio_setpull(S5PC100_GPG3(3), S3C_GPIO_PULL_UP); | 54 | S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP); |
65 | break; | 55 | break; |
66 | 56 | ||
67 | default: | 57 | default: |
diff --git a/arch/arm/mach-s5pc100/dma.c b/arch/arm/mach-s5pc100/dma.c index 0f5517571e2c..bf4cd0fb97c6 100644 --- a/arch/arm/mach-s5pc100/dma.c +++ b/arch/arm/mach-s5pc100/dma.c | |||
@@ -81,7 +81,7 @@ static struct s3c_pl330_platdata s5pc100_pdma0_pdata = { | |||
81 | 81 | ||
82 | static struct platform_device s5pc100_device_pdma0 = { | 82 | static struct platform_device s5pc100_device_pdma0 = { |
83 | .name = "s3c-pl330", | 83 | .name = "s3c-pl330", |
84 | .id = 1, | 84 | .id = 0, |
85 | .num_resources = ARRAY_SIZE(s5pc100_pdma0_resource), | 85 | .num_resources = ARRAY_SIZE(s5pc100_pdma0_resource), |
86 | .resource = s5pc100_pdma0_resource, | 86 | .resource = s5pc100_pdma0_resource, |
87 | .dev = { | 87 | .dev = { |
@@ -143,7 +143,7 @@ static struct s3c_pl330_platdata s5pc100_pdma1_pdata = { | |||
143 | 143 | ||
144 | static struct platform_device s5pc100_device_pdma1 = { | 144 | static struct platform_device s5pc100_device_pdma1 = { |
145 | .name = "s3c-pl330", | 145 | .name = "s3c-pl330", |
146 | .id = 2, | 146 | .id = 1, |
147 | .num_resources = ARRAY_SIZE(s5pc100_pdma1_resource), | 147 | .num_resources = ARRAY_SIZE(s5pc100_pdma1_resource), |
148 | .resource = s5pc100_pdma1_resource, | 148 | .resource = s5pc100_pdma1_resource, |
149 | .dev = { | 149 | .dev = { |
diff --git a/arch/arm/mach-s5pc100/gpiolib.c b/arch/arm/mach-s5pc100/gpiolib.c index 0fab7f2cd8bf..20856eb7dd51 100644 --- a/arch/arm/mach-s5pc100/gpiolib.c +++ b/arch/arm/mach-s5pc100/gpiolib.c | |||
@@ -1,5 +1,7 @@ | |||
1 | /* | 1 | /* linux/arch/arm/mach-s5pc100/gpiolib.c |
2 | * arch/arm/plat-s5pc100/gpiolib.c | 2 | * |
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
3 | * | 5 | * |
4 | * Copyright 2009 Samsung Electronics Co | 6 | * Copyright 2009 Samsung Electronics Co |
5 | * Kyungmin Park <kyungmin.park@samsung.com> | 7 | * Kyungmin Park <kyungmin.park@samsung.com> |
@@ -61,30 +63,6 @@ | |||
61 | * L3 8 4Bit None | 63 | * L3 8 4Bit None |
62 | */ | 64 | */ |
63 | 65 | ||
64 | static int s5pc100_gpiolib_to_irq(struct gpio_chip *chip, unsigned int offset) | ||
65 | { | ||
66 | return S3C_IRQ_GPIO(chip->base + offset); | ||
67 | } | ||
68 | |||
69 | static int s5pc100_gpiolib_to_eint(struct gpio_chip *chip, unsigned int offset) | ||
70 | { | ||
71 | int base; | ||
72 | |||
73 | base = chip->base - S5PC100_GPH0(0); | ||
74 | if (base == 0) | ||
75 | return IRQ_EINT(offset); | ||
76 | base = chip->base - S5PC100_GPH1(0); | ||
77 | if (base == 0) | ||
78 | return IRQ_EINT(8 + offset); | ||
79 | base = chip->base - S5PC100_GPH2(0); | ||
80 | if (base == 0) | ||
81 | return IRQ_EINT(16 + offset); | ||
82 | base = chip->base - S5PC100_GPH3(0); | ||
83 | if (base == 0) | ||
84 | return IRQ_EINT(24 + offset); | ||
85 | return -EINVAL; | ||
86 | } | ||
87 | |||
88 | static struct s3c_gpio_cfg gpio_cfg = { | 66 | static struct s3c_gpio_cfg gpio_cfg = { |
89 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | 67 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, |
90 | .set_pull = s3c_gpio_setpull_updown, | 68 | .set_pull = s3c_gpio_setpull_updown, |
@@ -104,209 +82,150 @@ static struct s3c_gpio_cfg gpio_cfg_noint = { | |||
104 | .get_pull = s3c_gpio_getpull_updown, | 82 | .get_pull = s3c_gpio_getpull_updown, |
105 | }; | 83 | }; |
106 | 84 | ||
85 | /* | ||
86 | * GPIO bank's base address given the index of the bank in the | ||
87 | * list of all gpio banks. | ||
88 | */ | ||
89 | #define S5PC100_BANK_BASE(bank_nr) (S5P_VA_GPIO + ((bank_nr) * 0x20)) | ||
90 | |||
91 | /* | ||
92 | * Following are the gpio banks in S5PC100. | ||
93 | * | ||
94 | * The 'config' member when left to NULL, is initialized to the default | ||
95 | * structure gpio_cfg in the init function below. | ||
96 | * | ||
97 | * The 'base' member is also initialized in the init function below. | ||
98 | * Note: The initialization of 'base' member of s3c_gpio_chip structure | ||
99 | * uses the above macro and depends on the banks being listed in order here. | ||
100 | */ | ||
107 | static struct s3c_gpio_chip s5pc100_gpio_chips[] = { | 101 | static struct s3c_gpio_chip s5pc100_gpio_chips[] = { |
108 | { | 102 | { |
109 | .base = S5PC100_GPA0_BASE, | ||
110 | .config = &gpio_cfg, | ||
111 | .chip = { | 103 | .chip = { |
112 | .base = S5PC100_GPA0(0), | 104 | .base = S5PC100_GPA0(0), |
113 | .ngpio = S5PC100_GPIO_A0_NR, | 105 | .ngpio = S5PC100_GPIO_A0_NR, |
114 | .label = "GPA0", | 106 | .label = "GPA0", |
115 | }, | 107 | }, |
116 | }, { | 108 | }, { |
117 | .base = S5PC100_GPA1_BASE, | ||
118 | .config = &gpio_cfg, | ||
119 | .chip = { | 109 | .chip = { |
120 | .base = S5PC100_GPA1(0), | 110 | .base = S5PC100_GPA1(0), |
121 | .ngpio = S5PC100_GPIO_A1_NR, | 111 | .ngpio = S5PC100_GPIO_A1_NR, |
122 | .label = "GPA1", | 112 | .label = "GPA1", |
123 | }, | 113 | }, |
124 | }, { | 114 | }, { |
125 | .base = S5PC100_GPB_BASE, | ||
126 | .config = &gpio_cfg, | ||
127 | .chip = { | 115 | .chip = { |
128 | .base = S5PC100_GPB(0), | 116 | .base = S5PC100_GPB(0), |
129 | .ngpio = S5PC100_GPIO_B_NR, | 117 | .ngpio = S5PC100_GPIO_B_NR, |
130 | .label = "GPB", | 118 | .label = "GPB", |
131 | }, | 119 | }, |
132 | }, { | 120 | }, { |
133 | .base = S5PC100_GPC_BASE, | ||
134 | .config = &gpio_cfg, | ||
135 | .chip = { | 121 | .chip = { |
136 | .base = S5PC100_GPC(0), | 122 | .base = S5PC100_GPC(0), |
137 | .ngpio = S5PC100_GPIO_C_NR, | 123 | .ngpio = S5PC100_GPIO_C_NR, |
138 | .label = "GPC", | 124 | .label = "GPC", |
139 | }, | 125 | }, |
140 | }, { | 126 | }, { |
141 | .base = S5PC100_GPD_BASE, | ||
142 | .config = &gpio_cfg, | ||
143 | .chip = { | 127 | .chip = { |
144 | .base = S5PC100_GPD(0), | 128 | .base = S5PC100_GPD(0), |
145 | .ngpio = S5PC100_GPIO_D_NR, | 129 | .ngpio = S5PC100_GPIO_D_NR, |
146 | .label = "GPD", | 130 | .label = "GPD", |
147 | }, | 131 | }, |
148 | }, { | 132 | }, { |
149 | .base = S5PC100_GPE0_BASE, | ||
150 | .config = &gpio_cfg, | ||
151 | .chip = { | 133 | .chip = { |
152 | .base = S5PC100_GPE0(0), | 134 | .base = S5PC100_GPE0(0), |
153 | .ngpio = S5PC100_GPIO_E0_NR, | 135 | .ngpio = S5PC100_GPIO_E0_NR, |
154 | .label = "GPE0", | 136 | .label = "GPE0", |
155 | }, | 137 | }, |
156 | }, { | 138 | }, { |
157 | .base = S5PC100_GPE1_BASE, | ||
158 | .config = &gpio_cfg, | ||
159 | .chip = { | 139 | .chip = { |
160 | .base = S5PC100_GPE1(0), | 140 | .base = S5PC100_GPE1(0), |
161 | .ngpio = S5PC100_GPIO_E1_NR, | 141 | .ngpio = S5PC100_GPIO_E1_NR, |
162 | .label = "GPE1", | 142 | .label = "GPE1", |
163 | }, | 143 | }, |
164 | }, { | 144 | }, { |
165 | .base = S5PC100_GPF0_BASE, | ||
166 | .config = &gpio_cfg, | ||
167 | .chip = { | 145 | .chip = { |
168 | .base = S5PC100_GPF0(0), | 146 | .base = S5PC100_GPF0(0), |
169 | .ngpio = S5PC100_GPIO_F0_NR, | 147 | .ngpio = S5PC100_GPIO_F0_NR, |
170 | .label = "GPF0", | 148 | .label = "GPF0", |
171 | }, | 149 | }, |
172 | }, { | 150 | }, { |
173 | .base = S5PC100_GPF1_BASE, | ||
174 | .config = &gpio_cfg, | ||
175 | .chip = { | 151 | .chip = { |
176 | .base = S5PC100_GPF1(0), | 152 | .base = S5PC100_GPF1(0), |
177 | .ngpio = S5PC100_GPIO_F1_NR, | 153 | .ngpio = S5PC100_GPIO_F1_NR, |
178 | .label = "GPF1", | 154 | .label = "GPF1", |
179 | }, | 155 | }, |
180 | }, { | 156 | }, { |
181 | .base = S5PC100_GPF2_BASE, | ||
182 | .config = &gpio_cfg, | ||
183 | .chip = { | 157 | .chip = { |
184 | .base = S5PC100_GPF2(0), | 158 | .base = S5PC100_GPF2(0), |
185 | .ngpio = S5PC100_GPIO_F2_NR, | 159 | .ngpio = S5PC100_GPIO_F2_NR, |
186 | .label = "GPF2", | 160 | .label = "GPF2", |
187 | }, | 161 | }, |
188 | }, { | 162 | }, { |
189 | .base = S5PC100_GPF3_BASE, | ||
190 | .config = &gpio_cfg, | ||
191 | .chip = { | 163 | .chip = { |
192 | .base = S5PC100_GPF3(0), | 164 | .base = S5PC100_GPF3(0), |
193 | .ngpio = S5PC100_GPIO_F3_NR, | 165 | .ngpio = S5PC100_GPIO_F3_NR, |
194 | .label = "GPF3", | 166 | .label = "GPF3", |
195 | }, | 167 | }, |
196 | }, { | 168 | }, { |
197 | .base = S5PC100_GPG0_BASE, | ||
198 | .config = &gpio_cfg, | ||
199 | .chip = { | 169 | .chip = { |
200 | .base = S5PC100_GPG0(0), | 170 | .base = S5PC100_GPG0(0), |
201 | .ngpio = S5PC100_GPIO_G0_NR, | 171 | .ngpio = S5PC100_GPIO_G0_NR, |
202 | .label = "GPG0", | 172 | .label = "GPG0", |
203 | }, | 173 | }, |
204 | }, { | 174 | }, { |
205 | .base = S5PC100_GPG1_BASE, | ||
206 | .config = &gpio_cfg, | ||
207 | .chip = { | 175 | .chip = { |
208 | .base = S5PC100_GPG1(0), | 176 | .base = S5PC100_GPG1(0), |
209 | .ngpio = S5PC100_GPIO_G1_NR, | 177 | .ngpio = S5PC100_GPIO_G1_NR, |
210 | .label = "GPG1", | 178 | .label = "GPG1", |
211 | }, | 179 | }, |
212 | }, { | 180 | }, { |
213 | .base = S5PC100_GPG2_BASE, | ||
214 | .config = &gpio_cfg, | ||
215 | .chip = { | 181 | .chip = { |
216 | .base = S5PC100_GPG2(0), | 182 | .base = S5PC100_GPG2(0), |
217 | .ngpio = S5PC100_GPIO_G2_NR, | 183 | .ngpio = S5PC100_GPIO_G2_NR, |
218 | .label = "GPG2", | 184 | .label = "GPG2", |
219 | }, | 185 | }, |
220 | }, { | 186 | }, { |
221 | .base = S5PC100_GPG3_BASE, | ||
222 | .config = &gpio_cfg, | ||
223 | .chip = { | 187 | .chip = { |
224 | .base = S5PC100_GPG3(0), | 188 | .base = S5PC100_GPG3(0), |
225 | .ngpio = S5PC100_GPIO_G3_NR, | 189 | .ngpio = S5PC100_GPIO_G3_NR, |
226 | .label = "GPG3", | 190 | .label = "GPG3", |
227 | }, | 191 | }, |
228 | }, { | 192 | }, { |
229 | .base = S5PC100_GPH0_BASE, | ||
230 | .config = &gpio_cfg_eint, | ||
231 | .chip = { | ||
232 | .base = S5PC100_GPH0(0), | ||
233 | .ngpio = S5PC100_GPIO_H0_NR, | ||
234 | .label = "GPH0", | ||
235 | }, | ||
236 | }, { | ||
237 | .base = S5PC100_GPH1_BASE, | ||
238 | .config = &gpio_cfg_eint, | ||
239 | .chip = { | ||
240 | .base = S5PC100_GPH1(0), | ||
241 | .ngpio = S5PC100_GPIO_H1_NR, | ||
242 | .label = "GPH1", | ||
243 | }, | ||
244 | }, { | ||
245 | .base = S5PC100_GPH2_BASE, | ||
246 | .config = &gpio_cfg_eint, | ||
247 | .chip = { | ||
248 | .base = S5PC100_GPH2(0), | ||
249 | .ngpio = S5PC100_GPIO_H2_NR, | ||
250 | .label = "GPH2", | ||
251 | }, | ||
252 | }, { | ||
253 | .base = S5PC100_GPH3_BASE, | ||
254 | .config = &gpio_cfg_eint, | ||
255 | .chip = { | ||
256 | .base = S5PC100_GPH3(0), | ||
257 | .ngpio = S5PC100_GPIO_H3_NR, | ||
258 | .label = "GPH3", | ||
259 | }, | ||
260 | }, { | ||
261 | .base = S5PC100_GPI_BASE, | ||
262 | .config = &gpio_cfg, | ||
263 | .chip = { | 193 | .chip = { |
264 | .base = S5PC100_GPI(0), | 194 | .base = S5PC100_GPI(0), |
265 | .ngpio = S5PC100_GPIO_I_NR, | 195 | .ngpio = S5PC100_GPIO_I_NR, |
266 | .label = "GPI", | 196 | .label = "GPI", |
267 | }, | 197 | }, |
268 | }, { | 198 | }, { |
269 | .base = S5PC100_GPJ0_BASE, | ||
270 | .config = &gpio_cfg, | ||
271 | .chip = { | 199 | .chip = { |
272 | .base = S5PC100_GPJ0(0), | 200 | .base = S5PC100_GPJ0(0), |
273 | .ngpio = S5PC100_GPIO_J0_NR, | 201 | .ngpio = S5PC100_GPIO_J0_NR, |
274 | .label = "GPJ0", | 202 | .label = "GPJ0", |
275 | }, | 203 | }, |
276 | }, { | 204 | }, { |
277 | .base = S5PC100_GPJ1_BASE, | ||
278 | .config = &gpio_cfg, | ||
279 | .chip = { | 205 | .chip = { |
280 | .base = S5PC100_GPJ1(0), | 206 | .base = S5PC100_GPJ1(0), |
281 | .ngpio = S5PC100_GPIO_J1_NR, | 207 | .ngpio = S5PC100_GPIO_J1_NR, |
282 | .label = "GPJ1", | 208 | .label = "GPJ1", |
283 | }, | 209 | }, |
284 | }, { | 210 | }, { |
285 | .base = S5PC100_GPJ2_BASE, | ||
286 | .config = &gpio_cfg, | ||
287 | .chip = { | 211 | .chip = { |
288 | .base = S5PC100_GPJ2(0), | 212 | .base = S5PC100_GPJ2(0), |
289 | .ngpio = S5PC100_GPIO_J2_NR, | 213 | .ngpio = S5PC100_GPIO_J2_NR, |
290 | .label = "GPJ2", | 214 | .label = "GPJ2", |
291 | }, | 215 | }, |
292 | }, { | 216 | }, { |
293 | .base = S5PC100_GPJ3_BASE, | ||
294 | .config = &gpio_cfg, | ||
295 | .chip = { | 217 | .chip = { |
296 | .base = S5PC100_GPJ3(0), | 218 | .base = S5PC100_GPJ3(0), |
297 | .ngpio = S5PC100_GPIO_J3_NR, | 219 | .ngpio = S5PC100_GPIO_J3_NR, |
298 | .label = "GPJ3", | 220 | .label = "GPJ3", |
299 | }, | 221 | }, |
300 | }, { | 222 | }, { |
301 | .base = S5PC100_GPJ4_BASE, | ||
302 | .config = &gpio_cfg, | ||
303 | .chip = { | 223 | .chip = { |
304 | .base = S5PC100_GPJ4(0), | 224 | .base = S5PC100_GPJ4(0), |
305 | .ngpio = S5PC100_GPIO_J4_NR, | 225 | .ngpio = S5PC100_GPIO_J4_NR, |
306 | .label = "GPJ4", | 226 | .label = "GPJ4", |
307 | }, | 227 | }, |
308 | }, { | 228 | }, { |
309 | .base = S5PC100_GPK0_BASE, | ||
310 | .config = &gpio_cfg_noint, | 229 | .config = &gpio_cfg_noint, |
311 | .chip = { | 230 | .chip = { |
312 | .base = S5PC100_GPK0(0), | 231 | .base = S5PC100_GPK0(0), |
@@ -314,7 +233,6 @@ static struct s3c_gpio_chip s5pc100_gpio_chips[] = { | |||
314 | .label = "GPK0", | 233 | .label = "GPK0", |
315 | }, | 234 | }, |
316 | }, { | 235 | }, { |
317 | .base = S5PC100_GPK1_BASE, | ||
318 | .config = &gpio_cfg_noint, | 236 | .config = &gpio_cfg_noint, |
319 | .chip = { | 237 | .chip = { |
320 | .base = S5PC100_GPK1(0), | 238 | .base = S5PC100_GPK1(0), |
@@ -322,7 +240,6 @@ static struct s3c_gpio_chip s5pc100_gpio_chips[] = { | |||
322 | .label = "GPK1", | 240 | .label = "GPK1", |
323 | }, | 241 | }, |
324 | }, { | 242 | }, { |
325 | .base = S5PC100_GPK2_BASE, | ||
326 | .config = &gpio_cfg_noint, | 243 | .config = &gpio_cfg_noint, |
327 | .chip = { | 244 | .chip = { |
328 | .base = S5PC100_GPK2(0), | 245 | .base = S5PC100_GPK2(0), |
@@ -330,7 +247,6 @@ static struct s3c_gpio_chip s5pc100_gpio_chips[] = { | |||
330 | .label = "GPK2", | 247 | .label = "GPK2", |
331 | }, | 248 | }, |
332 | }, { | 249 | }, { |
333 | .base = S5PC100_GPK3_BASE, | ||
334 | .config = &gpio_cfg_noint, | 250 | .config = &gpio_cfg_noint, |
335 | .chip = { | 251 | .chip = { |
336 | .base = S5PC100_GPK3(0), | 252 | .base = S5PC100_GPK3(0), |
@@ -338,7 +254,6 @@ static struct s3c_gpio_chip s5pc100_gpio_chips[] = { | |||
338 | .label = "GPK3", | 254 | .label = "GPK3", |
339 | }, | 255 | }, |
340 | }, { | 256 | }, { |
341 | .base = S5PC100_GPL0_BASE, | ||
342 | .config = &gpio_cfg_noint, | 257 | .config = &gpio_cfg_noint, |
343 | .chip = { | 258 | .chip = { |
344 | .base = S5PC100_GPL0(0), | 259 | .base = S5PC100_GPL0(0), |
@@ -346,7 +261,6 @@ static struct s3c_gpio_chip s5pc100_gpio_chips[] = { | |||
346 | .label = "GPL0", | 261 | .label = "GPL0", |
347 | }, | 262 | }, |
348 | }, { | 263 | }, { |
349 | .base = S5PC100_GPL1_BASE, | ||
350 | .config = &gpio_cfg_noint, | 264 | .config = &gpio_cfg_noint, |
351 | .chip = { | 265 | .chip = { |
352 | .base = S5PC100_GPL1(0), | 266 | .base = S5PC100_GPL1(0), |
@@ -354,7 +268,6 @@ static struct s3c_gpio_chip s5pc100_gpio_chips[] = { | |||
354 | .label = "GPL1", | 268 | .label = "GPL1", |
355 | }, | 269 | }, |
356 | }, { | 270 | }, { |
357 | .base = S5PC100_GPL2_BASE, | ||
358 | .config = &gpio_cfg_noint, | 271 | .config = &gpio_cfg_noint, |
359 | .chip = { | 272 | .chip = { |
360 | .base = S5PC100_GPL2(0), | 273 | .base = S5PC100_GPL2(0), |
@@ -362,7 +275,6 @@ static struct s3c_gpio_chip s5pc100_gpio_chips[] = { | |||
362 | .label = "GPL2", | 275 | .label = "GPL2", |
363 | }, | 276 | }, |
364 | }, { | 277 | }, { |
365 | .base = S5PC100_GPL3_BASE, | ||
366 | .config = &gpio_cfg_noint, | 278 | .config = &gpio_cfg_noint, |
367 | .chip = { | 279 | .chip = { |
368 | .base = S5PC100_GPL3(0), | 280 | .base = S5PC100_GPL3(0), |
@@ -370,56 +282,72 @@ static struct s3c_gpio_chip s5pc100_gpio_chips[] = { | |||
370 | .label = "GPL3", | 282 | .label = "GPL3", |
371 | }, | 283 | }, |
372 | }, { | 284 | }, { |
373 | .base = S5PC100_GPL4_BASE, | ||
374 | .config = &gpio_cfg_noint, | 285 | .config = &gpio_cfg_noint, |
375 | .chip = { | 286 | .chip = { |
376 | .base = S5PC100_GPL4(0), | 287 | .base = S5PC100_GPL4(0), |
377 | .ngpio = S5PC100_GPIO_L4_NR, | 288 | .ngpio = S5PC100_GPIO_L4_NR, |
378 | .label = "GPL4", | 289 | .label = "GPL4", |
379 | }, | 290 | }, |
291 | }, { | ||
292 | .base = (S5P_VA_GPIO + 0xC00), | ||
293 | .config = &gpio_cfg_eint, | ||
294 | .irq_base = IRQ_EINT(0), | ||
295 | .chip = { | ||
296 | .base = S5PC100_GPH0(0), | ||
297 | .ngpio = S5PC100_GPIO_H0_NR, | ||
298 | .label = "GPH0", | ||
299 | .to_irq = samsung_gpiolib_to_irq, | ||
300 | }, | ||
301 | }, { | ||
302 | .base = (S5P_VA_GPIO + 0xC20), | ||
303 | .config = &gpio_cfg_eint, | ||
304 | .irq_base = IRQ_EINT(8), | ||
305 | .chip = { | ||
306 | .base = S5PC100_GPH1(0), | ||
307 | .ngpio = S5PC100_GPIO_H1_NR, | ||
308 | .label = "GPH1", | ||
309 | .to_irq = samsung_gpiolib_to_irq, | ||
310 | }, | ||
311 | }, { | ||
312 | .base = (S5P_VA_GPIO + 0xC40), | ||
313 | .config = &gpio_cfg_eint, | ||
314 | .irq_base = IRQ_EINT(16), | ||
315 | .chip = { | ||
316 | .base = S5PC100_GPH2(0), | ||
317 | .ngpio = S5PC100_GPIO_H2_NR, | ||
318 | .label = "GPH2", | ||
319 | .to_irq = samsung_gpiolib_to_irq, | ||
320 | }, | ||
321 | }, { | ||
322 | .base = (S5P_VA_GPIO + 0xC60), | ||
323 | .config = &gpio_cfg_eint, | ||
324 | .irq_base = IRQ_EINT(24), | ||
325 | .chip = { | ||
326 | .base = S5PC100_GPH3(0), | ||
327 | .ngpio = S5PC100_GPIO_H3_NR, | ||
328 | .label = "GPH3", | ||
329 | .to_irq = samsung_gpiolib_to_irq, | ||
330 | }, | ||
380 | }, | 331 | }, |
381 | }; | 332 | }; |
382 | 333 | ||
383 | /* FIXME move from irq-gpio.c */ | 334 | static __init int s5pc100_gpiolib_init(void) |
384 | extern struct irq_chip s5pc100_gpioint; | ||
385 | extern void s5pc100_irq_gpioint_handler(unsigned int irq, struct irq_desc *desc); | ||
386 | |||
387 | static __init void s5pc100_gpiolib_link(struct s3c_gpio_chip *chip) | ||
388 | { | 335 | { |
389 | /* Interrupt */ | 336 | struct s3c_gpio_chip *chip = s5pc100_gpio_chips; |
390 | if (chip->config == &gpio_cfg) { | 337 | int nr_chips = ARRAY_SIZE(s5pc100_gpio_chips); |
391 | int i, irq; | 338 | int gpioint_group = 0; |
392 | 339 | int i; | |
393 | chip->chip.to_irq = s5pc100_gpiolib_to_irq; | ||
394 | 340 | ||
395 | for (i = 0; i < chip->chip.ngpio; i++) { | 341 | for (i = 0; i < nr_chips; i++, chip++) { |
396 | irq = S3C_IRQ_GPIO_BASE + chip->chip.base + i; | 342 | if (chip->config == NULL) { |
397 | set_irq_chip(irq, &s5pc100_gpioint); | 343 | chip->config = &gpio_cfg; |
398 | set_irq_data(irq, &chip->chip); | 344 | chip->group = gpioint_group++; |
399 | set_irq_handler(irq, handle_level_irq); | ||
400 | set_irq_flags(irq, IRQF_VALID); | ||
401 | } | 345 | } |
402 | } else if (chip->config == &gpio_cfg_eint) { | 346 | if (chip->base == NULL) |
403 | chip->chip.to_irq = s5pc100_gpiolib_to_eint; | 347 | chip->base = S5PC100_BANK_BASE(i); |
404 | } | 348 | } |
405 | } | ||
406 | |||
407 | static __init int s5pc100_gpiolib_init(void) | ||
408 | { | ||
409 | struct s3c_gpio_chip *chip; | ||
410 | int nr_chips; | ||
411 | |||
412 | chip = s5pc100_gpio_chips; | ||
413 | nr_chips = ARRAY_SIZE(s5pc100_gpio_chips); | ||
414 | |||
415 | for (; nr_chips > 0; nr_chips--, chip++) | ||
416 | s5pc100_gpiolib_link(chip); | ||
417 | |||
418 | samsung_gpiolib_add_4bit_chips(s5pc100_gpio_chips, | ||
419 | ARRAY_SIZE(s5pc100_gpio_chips)); | ||
420 | 349 | ||
421 | /* Interrupt */ | 350 | samsung_gpiolib_add_4bit_chips(s5pc100_gpio_chips, nr_chips); |
422 | set_irq_chained_handler(IRQ_GPIOINT, s5pc100_irq_gpioint_handler); | ||
423 | 351 | ||
424 | return 0; | 352 | return 0; |
425 | } | 353 | } |
diff --git a/arch/arm/mach-s5pc100/include/mach/gpio.h b/arch/arm/mach-s5pc100/include/mach/gpio.h index 71ae1f52df1d..29a8a12d9b4f 100644 --- a/arch/arm/mach-s5pc100/include/mach/gpio.h +++ b/arch/arm/mach-s5pc100/include/mach/gpio.h | |||
@@ -146,13 +146,6 @@ enum s5p_gpio_number { | |||
146 | /* define the number of gpios we need to the one after the MP04() range */ | 146 | /* define the number of gpios we need to the one after the MP04() range */ |
147 | #define ARCH_NR_GPIOS (S5PC100_GPIO_END + 1) | 147 | #define ARCH_NR_GPIOS (S5PC100_GPIO_END + 1) |
148 | 148 | ||
149 | #define EINT_MODE S3C_GPIO_SFN(0x2) | ||
150 | |||
151 | #define EINT_GPIO_0(x) S5PC100_GPH0(x) | ||
152 | #define EINT_GPIO_1(x) S5PC100_GPH1(x) | ||
153 | #define EINT_GPIO_2(x) S5PC100_GPH2(x) | ||
154 | #define EINT_GPIO_3(x) S5PC100_GPH3(x) | ||
155 | |||
156 | #include <asm-generic/gpio.h> | 149 | #include <asm-generic/gpio.h> |
157 | 150 | ||
158 | #endif /* __ASM_ARCH_GPIO_H */ | 151 | #endif /* __ASM_ARCH_GPIO_H */ |
diff --git a/arch/arm/mach-s5pc100/include/mach/irqs.h b/arch/arm/mach-s5pc100/include/mach/irqs.h index 06513e647242..d2eb4757381f 100644 --- a/arch/arm/mach-s5pc100/include/mach/irqs.h +++ b/arch/arm/mach-s5pc100/include/mach/irqs.h | |||
@@ -48,8 +48,8 @@ | |||
48 | #define IRQ_SPI1 S5P_IRQ_VIC1(16) | 48 | #define IRQ_SPI1 S5P_IRQ_VIC1(16) |
49 | #define IRQ_SPI2 S5P_IRQ_VIC1(17) | 49 | #define IRQ_SPI2 S5P_IRQ_VIC1(17) |
50 | #define IRQ_IRDA S5P_IRQ_VIC1(18) | 50 | #define IRQ_IRDA S5P_IRQ_VIC1(18) |
51 | #define IRQ_CAN0 S5P_IRQ_VIC1(19) | 51 | #define IRQ_IIC2 S5P_IRQ_VIC1(19) |
52 | #define IRQ_CAN1 S5P_IRQ_VIC1(20) | 52 | #define IRQ_IIC3 S5P_IRQ_VIC1(20) |
53 | #define IRQ_HSIRX S5P_IRQ_VIC1(21) | 53 | #define IRQ_HSIRX S5P_IRQ_VIC1(21) |
54 | #define IRQ_HSITX S5P_IRQ_VIC1(22) | 54 | #define IRQ_HSITX S5P_IRQ_VIC1(22) |
55 | #define IRQ_UHOST S5P_IRQ_VIC1(23) | 55 | #define IRQ_UHOST S5P_IRQ_VIC1(23) |
@@ -100,11 +100,12 @@ | |||
100 | #define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0)) | 100 | #define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0)) |
101 | #define S5P_EINT_BASE2 (IRQ_VIC_END + 1) | 101 | #define S5P_EINT_BASE2 (IRQ_VIC_END + 1) |
102 | 102 | ||
103 | #define S3C_IRQ_GPIO_BASE (IRQ_EINT(31) + 1) | 103 | /* GPIO interrupt */ |
104 | #define S3C_IRQ_GPIO(x) (S3C_IRQ_GPIO_BASE + (x)) | 104 | #define S5P_GPIOINT_BASE (IRQ_EINT(31) + 1) |
105 | #define S5P_GPIOINT_GROUP_MAXNR 21 | ||
105 | 106 | ||
106 | /* Until MP04 Groups -> 40 (exactly 39) Groups * 8 ~= 320 GPIOs */ | 107 | /* Set the default NR_IRQS */ |
107 | #define NR_IRQS (S3C_IRQ_GPIO(320) + 1) | 108 | #define NR_IRQS (IRQ_EINT(31) + S5P_GPIOINT_COUNT + 1) |
108 | 109 | ||
109 | /* Compatibility */ | 110 | /* Compatibility */ |
110 | #define IRQ_LCD_FIFO IRQ_LCD0 | 111 | #define IRQ_LCD_FIFO IRQ_LCD0 |
diff --git a/arch/arm/mach-s5pc100/include/mach/map.h b/arch/arm/mach-s5pc100/include/mach/map.h index 8751ef4a6804..32e9cab5c864 100644 --- a/arch/arm/mach-s5pc100/include/mach/map.h +++ b/arch/arm/mach-s5pc100/include/mach/map.h | |||
@@ -110,6 +110,8 @@ | |||
110 | #define S5PC100_PA_PCM0 0xF2400000 | 110 | #define S5PC100_PA_PCM0 0xF2400000 |
111 | #define S5PC100_PA_PCM1 0xF2500000 | 111 | #define S5PC100_PA_PCM1 0xF2500000 |
112 | 112 | ||
113 | #define S5PC100_PA_SPDIF 0xF2600000 | ||
114 | |||
113 | #define S5PC100_PA_TSADC (0xF3000000) | 115 | #define S5PC100_PA_TSADC (0xF3000000) |
114 | 116 | ||
115 | /* KEYPAD */ | 117 | /* KEYPAD */ |
diff --git a/arch/arm/mach-s5pc100/include/mach/regs-gpio.h b/arch/arm/mach-s5pc100/include/mach/regs-gpio.h index dd6295e1251d..0bf73209ec7b 100644 --- a/arch/arm/mach-s5pc100/include/mach/regs-gpio.h +++ b/arch/arm/mach-s5pc100/include/mach/regs-gpio.h | |||
@@ -11,43 +11,6 @@ | |||
11 | 11 | ||
12 | #include <mach/map.h> | 12 | #include <mach/map.h> |
13 | 13 | ||
14 | /* S5PC100 */ | ||
15 | #define S5PC100_GPIO_BASE S5P_VA_GPIO | ||
16 | #define S5PC100_GPA0_BASE (S5PC100_GPIO_BASE + 0x0000) | ||
17 | #define S5PC100_GPA1_BASE (S5PC100_GPIO_BASE + 0x0020) | ||
18 | #define S5PC100_GPB_BASE (S5PC100_GPIO_BASE + 0x0040) | ||
19 | #define S5PC100_GPC_BASE (S5PC100_GPIO_BASE + 0x0060) | ||
20 | #define S5PC100_GPD_BASE (S5PC100_GPIO_BASE + 0x0080) | ||
21 | #define S5PC100_GPE0_BASE (S5PC100_GPIO_BASE + 0x00A0) | ||
22 | #define S5PC100_GPE1_BASE (S5PC100_GPIO_BASE + 0x00C0) | ||
23 | #define S5PC100_GPF0_BASE (S5PC100_GPIO_BASE + 0x00E0) | ||
24 | #define S5PC100_GPF1_BASE (S5PC100_GPIO_BASE + 0x0100) | ||
25 | #define S5PC100_GPF2_BASE (S5PC100_GPIO_BASE + 0x0120) | ||
26 | #define S5PC100_GPF3_BASE (S5PC100_GPIO_BASE + 0x0140) | ||
27 | #define S5PC100_GPG0_BASE (S5PC100_GPIO_BASE + 0x0160) | ||
28 | #define S5PC100_GPG1_BASE (S5PC100_GPIO_BASE + 0x0180) | ||
29 | #define S5PC100_GPG2_BASE (S5PC100_GPIO_BASE + 0x01A0) | ||
30 | #define S5PC100_GPG3_BASE (S5PC100_GPIO_BASE + 0x01C0) | ||
31 | #define S5PC100_GPH0_BASE (S5PC100_GPIO_BASE + 0x0C00) | ||
32 | #define S5PC100_GPH1_BASE (S5PC100_GPIO_BASE + 0x0C20) | ||
33 | #define S5PC100_GPH2_BASE (S5PC100_GPIO_BASE + 0x0C40) | ||
34 | #define S5PC100_GPH3_BASE (S5PC100_GPIO_BASE + 0x0C60) | ||
35 | #define S5PC100_GPI_BASE (S5PC100_GPIO_BASE + 0x01E0) | ||
36 | #define S5PC100_GPJ0_BASE (S5PC100_GPIO_BASE + 0x0200) | ||
37 | #define S5PC100_GPJ1_BASE (S5PC100_GPIO_BASE + 0x0220) | ||
38 | #define S5PC100_GPJ2_BASE (S5PC100_GPIO_BASE + 0x0240) | ||
39 | #define S5PC100_GPJ3_BASE (S5PC100_GPIO_BASE + 0x0260) | ||
40 | #define S5PC100_GPJ4_BASE (S5PC100_GPIO_BASE + 0x0280) | ||
41 | #define S5PC100_GPK0_BASE (S5PC100_GPIO_BASE + 0x02A0) | ||
42 | #define S5PC100_GPK1_BASE (S5PC100_GPIO_BASE + 0x02C0) | ||
43 | #define S5PC100_GPK2_BASE (S5PC100_GPIO_BASE + 0x02E0) | ||
44 | #define S5PC100_GPK3_BASE (S5PC100_GPIO_BASE + 0x0300) | ||
45 | #define S5PC100_GPL0_BASE (S5PC100_GPIO_BASE + 0x0320) | ||
46 | #define S5PC100_GPL1_BASE (S5PC100_GPIO_BASE + 0x0340) | ||
47 | #define S5PC100_GPL2_BASE (S5PC100_GPIO_BASE + 0x0360) | ||
48 | #define S5PC100_GPL3_BASE (S5PC100_GPIO_BASE + 0x0380) | ||
49 | #define S5PC100_GPL4_BASE (S5PC100_GPIO_BASE + 0x03A0) | ||
50 | |||
51 | #define S5PC100EINT30CON (S5P_VA_GPIO + 0xE00) | 14 | #define S5PC100EINT30CON (S5P_VA_GPIO + 0xE00) |
52 | #define S5P_EINT_CON(x) (S5PC100EINT30CON + ((x) * 0x4)) | 15 | #define S5P_EINT_CON(x) (S5PC100EINT30CON + ((x) * 0x4)) |
53 | 16 | ||
@@ -64,12 +27,12 @@ | |||
64 | 27 | ||
65 | #define eint_irq_to_bit(irq) (1 << (EINT_OFFSET(irq) & 0x7)) | 28 | #define eint_irq_to_bit(irq) (1 << (EINT_OFFSET(irq) & 0x7)) |
66 | 29 | ||
67 | /* values for S5P_EXTINT0 */ | 30 | #define EINT_MODE S3C_GPIO_SFN(0x2) |
68 | #define S5P_EXTINT_LOWLEV (0x00) | 31 | |
69 | #define S5P_EXTINT_HILEV (0x01) | 32 | #define EINT_GPIO_0(x) S5PC100_GPH0(x) |
70 | #define S5P_EXTINT_FALLEDGE (0x02) | 33 | #define EINT_GPIO_1(x) S5PC100_GPH1(x) |
71 | #define S5P_EXTINT_RISEEDGE (0x03) | 34 | #define EINT_GPIO_2(x) S5PC100_GPH2(x) |
72 | #define S5P_EXTINT_BOTHEDGE (0x04) | 35 | #define EINT_GPIO_3(x) S5PC100_GPH3(x) |
73 | 36 | ||
74 | #endif /* __ASM_MACH_S5PC100_REGS_GPIO_H */ | 37 | #endif /* __ASM_MACH_S5PC100_REGS_GPIO_H */ |
75 | 38 | ||
diff --git a/arch/arm/mach-s5pc100/include/mach/vmalloc.h b/arch/arm/mach-s5pc100/include/mach/vmalloc.h index be9df79903ed..44c8e5726d9d 100644 --- a/arch/arm/mach-s5pc100/include/mach/vmalloc.h +++ b/arch/arm/mach-s5pc100/include/mach/vmalloc.h | |||
@@ -12,6 +12,6 @@ | |||
12 | #ifndef __ASM_ARCH_VMALLOC_H | 12 | #ifndef __ASM_ARCH_VMALLOC_H |
13 | #define __ASM_ARCH_VMALLOC_H | 13 | #define __ASM_ARCH_VMALLOC_H |
14 | 14 | ||
15 | #define VMALLOC_END (0xe0000000UL) | 15 | #define VMALLOC_END 0xF6000000UL |
16 | 16 | ||
17 | #endif /* __ASM_ARCH_VMALLOC_H */ | 17 | #endif /* __ASM_ARCH_VMALLOC_H */ |
diff --git a/arch/arm/mach-s5pc100/irq-gpio.c b/arch/arm/mach-s5pc100/irq-gpio.c deleted file mode 100644 index 2bf86c18bc73..000000000000 --- a/arch/arm/mach-s5pc100/irq-gpio.c +++ /dev/null | |||
@@ -1,266 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-s5pc100/irq-gpio.c | ||
3 | * | ||
4 | * Copyright (C) 2009 Samsung Electronics | ||
5 | * | ||
6 | * S5PC100 - Interrupt handling for IRQ_GPIO${group}(x) | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/interrupt.h> | ||
15 | #include <linux/irq.h> | ||
16 | #include <linux/io.h> | ||
17 | #include <linux/gpio.h> | ||
18 | |||
19 | #include <mach/map.h> | ||
20 | #include <plat/gpio-cfg.h> | ||
21 | |||
22 | #define S5P_GPIOREG(x) (S5P_VA_GPIO + (x)) | ||
23 | |||
24 | #define CON_OFFSET 0x700 | ||
25 | #define MASK_OFFSET 0x900 | ||
26 | #define PEND_OFFSET 0xA00 | ||
27 | #define CON_OFFSET_2 0xE00 | ||
28 | #define MASK_OFFSET_2 0xF00 | ||
29 | #define PEND_OFFSET_2 0xF40 | ||
30 | |||
31 | #define GPIOINT_LEVEL_LOW 0x0 | ||
32 | #define GPIOINT_LEVEL_HIGH 0x1 | ||
33 | #define GPIOINT_EDGE_FALLING 0x2 | ||
34 | #define GPIOINT_EDGE_RISING 0x3 | ||
35 | #define GPIOINT_EDGE_BOTH 0x4 | ||
36 | |||
37 | static int group_to_con_offset(int group) | ||
38 | { | ||
39 | return group << 2; | ||
40 | } | ||
41 | |||
42 | static int group_to_mask_offset(int group) | ||
43 | { | ||
44 | return group << 2; | ||
45 | } | ||
46 | |||
47 | static int group_to_pend_offset(int group) | ||
48 | { | ||
49 | return group << 2; | ||
50 | } | ||
51 | |||
52 | static int s5pc100_get_start(unsigned int group) | ||
53 | { | ||
54 | switch (group) { | ||
55 | case 0: return S5PC100_GPIO_A0_START; | ||
56 | case 1: return S5PC100_GPIO_A1_START; | ||
57 | case 2: return S5PC100_GPIO_B_START; | ||
58 | case 3: return S5PC100_GPIO_C_START; | ||
59 | case 4: return S5PC100_GPIO_D_START; | ||
60 | case 5: return S5PC100_GPIO_E0_START; | ||
61 | case 6: return S5PC100_GPIO_E1_START; | ||
62 | case 7: return S5PC100_GPIO_F0_START; | ||
63 | case 8: return S5PC100_GPIO_F1_START; | ||
64 | case 9: return S5PC100_GPIO_F2_START; | ||
65 | case 10: return S5PC100_GPIO_F3_START; | ||
66 | case 11: return S5PC100_GPIO_G0_START; | ||
67 | case 12: return S5PC100_GPIO_G1_START; | ||
68 | case 13: return S5PC100_GPIO_G2_START; | ||
69 | case 14: return S5PC100_GPIO_G3_START; | ||
70 | case 15: return S5PC100_GPIO_I_START; | ||
71 | case 16: return S5PC100_GPIO_J0_START; | ||
72 | case 17: return S5PC100_GPIO_J1_START; | ||
73 | case 18: return S5PC100_GPIO_J2_START; | ||
74 | case 19: return S5PC100_GPIO_J3_START; | ||
75 | case 20: return S5PC100_GPIO_J4_START; | ||
76 | default: | ||
77 | BUG(); | ||
78 | } | ||
79 | |||
80 | return -EINVAL; | ||
81 | } | ||
82 | |||
83 | static int s5pc100_get_group(unsigned int irq) | ||
84 | { | ||
85 | irq -= S3C_IRQ_GPIO(0); | ||
86 | |||
87 | switch (irq) { | ||
88 | case S5PC100_GPIO_A0_START ... S5PC100_GPIO_A1_START - 1: | ||
89 | return 0; | ||
90 | case S5PC100_GPIO_A1_START ... S5PC100_GPIO_B_START - 1: | ||
91 | return 1; | ||
92 | case S5PC100_GPIO_B_START ... S5PC100_GPIO_C_START - 1: | ||
93 | return 2; | ||
94 | case S5PC100_GPIO_C_START ... S5PC100_GPIO_D_START - 1: | ||
95 | return 3; | ||
96 | case S5PC100_GPIO_D_START ... S5PC100_GPIO_E0_START - 1: | ||
97 | return 4; | ||
98 | case S5PC100_GPIO_E0_START ... S5PC100_GPIO_E1_START - 1: | ||
99 | return 5; | ||
100 | case S5PC100_GPIO_E1_START ... S5PC100_GPIO_F0_START - 1: | ||
101 | return 6; | ||
102 | case S5PC100_GPIO_F0_START ... S5PC100_GPIO_F1_START - 1: | ||
103 | return 7; | ||
104 | case S5PC100_GPIO_F1_START ... S5PC100_GPIO_F2_START - 1: | ||
105 | return 8; | ||
106 | case S5PC100_GPIO_F2_START ... S5PC100_GPIO_F3_START - 1: | ||
107 | return 9; | ||
108 | case S5PC100_GPIO_F3_START ... S5PC100_GPIO_G0_START - 1: | ||
109 | return 10; | ||
110 | case S5PC100_GPIO_G0_START ... S5PC100_GPIO_G1_START - 1: | ||
111 | return 11; | ||
112 | case S5PC100_GPIO_G1_START ... S5PC100_GPIO_G2_START - 1: | ||
113 | return 12; | ||
114 | case S5PC100_GPIO_G2_START ... S5PC100_GPIO_G3_START - 1: | ||
115 | return 13; | ||
116 | case S5PC100_GPIO_G3_START ... S5PC100_GPIO_H0_START - 1: | ||
117 | return 14; | ||
118 | case S5PC100_GPIO_I_START ... S5PC100_GPIO_J0_START - 1: | ||
119 | return 15; | ||
120 | case S5PC100_GPIO_J0_START ... S5PC100_GPIO_J1_START - 1: | ||
121 | return 16; | ||
122 | case S5PC100_GPIO_J1_START ... S5PC100_GPIO_J2_START - 1: | ||
123 | return 17; | ||
124 | case S5PC100_GPIO_J2_START ... S5PC100_GPIO_J3_START - 1: | ||
125 | return 18; | ||
126 | case S5PC100_GPIO_J3_START ... S5PC100_GPIO_J4_START - 1: | ||
127 | return 19; | ||
128 | case S5PC100_GPIO_J4_START ... S5PC100_GPIO_K0_START - 1: | ||
129 | return 20; | ||
130 | default: | ||
131 | BUG(); | ||
132 | } | ||
133 | |||
134 | return -EINVAL; | ||
135 | } | ||
136 | |||
137 | static int s5pc100_get_offset(unsigned int irq) | ||
138 | { | ||
139 | struct gpio_chip *chip = get_irq_data(irq); | ||
140 | return irq - S3C_IRQ_GPIO(chip->base); | ||
141 | } | ||
142 | |||
143 | static void s5pc100_gpioint_ack(unsigned int irq) | ||
144 | { | ||
145 | int group, offset, pend_offset; | ||
146 | unsigned int value; | ||
147 | |||
148 | group = s5pc100_get_group(irq); | ||
149 | offset = s5pc100_get_offset(irq); | ||
150 | pend_offset = group_to_pend_offset(group); | ||
151 | |||
152 | value = __raw_readl(S5P_GPIOREG(PEND_OFFSET) + pend_offset); | ||
153 | value |= 1 << offset; | ||
154 | __raw_writel(value, S5P_GPIOREG(PEND_OFFSET) + pend_offset); | ||
155 | } | ||
156 | |||
157 | static void s5pc100_gpioint_mask(unsigned int irq) | ||
158 | { | ||
159 | int group, offset, mask_offset; | ||
160 | unsigned int value; | ||
161 | |||
162 | group = s5pc100_get_group(irq); | ||
163 | offset = s5pc100_get_offset(irq); | ||
164 | mask_offset = group_to_mask_offset(group); | ||
165 | |||
166 | value = __raw_readl(S5P_GPIOREG(MASK_OFFSET) + mask_offset); | ||
167 | value |= 1 << offset; | ||
168 | __raw_writel(value, S5P_GPIOREG(MASK_OFFSET) + mask_offset); | ||
169 | } | ||
170 | |||
171 | static void s5pc100_gpioint_unmask(unsigned int irq) | ||
172 | { | ||
173 | int group, offset, mask_offset; | ||
174 | unsigned int value; | ||
175 | |||
176 | group = s5pc100_get_group(irq); | ||
177 | offset = s5pc100_get_offset(irq); | ||
178 | mask_offset = group_to_mask_offset(group); | ||
179 | |||
180 | value = __raw_readl(S5P_GPIOREG(MASK_OFFSET) + mask_offset); | ||
181 | value &= ~(1 << offset); | ||
182 | __raw_writel(value, S5P_GPIOREG(MASK_OFFSET) + mask_offset); | ||
183 | } | ||
184 | |||
185 | static void s5pc100_gpioint_mask_ack(unsigned int irq) | ||
186 | { | ||
187 | s5pc100_gpioint_mask(irq); | ||
188 | s5pc100_gpioint_ack(irq); | ||
189 | } | ||
190 | |||
191 | static int s5pc100_gpioint_set_type(unsigned int irq, unsigned int type) | ||
192 | { | ||
193 | int group, offset, con_offset; | ||
194 | unsigned int value; | ||
195 | |||
196 | group = s5pc100_get_group(irq); | ||
197 | offset = s5pc100_get_offset(irq); | ||
198 | con_offset = group_to_con_offset(group); | ||
199 | |||
200 | switch (type) { | ||
201 | case IRQ_TYPE_NONE: | ||
202 | printk(KERN_WARNING "No irq type\n"); | ||
203 | return -EINVAL; | ||
204 | case IRQ_TYPE_EDGE_RISING: | ||
205 | type = GPIOINT_EDGE_RISING; | ||
206 | break; | ||
207 | case IRQ_TYPE_EDGE_FALLING: | ||
208 | type = GPIOINT_EDGE_FALLING; | ||
209 | break; | ||
210 | case IRQ_TYPE_EDGE_BOTH: | ||
211 | type = GPIOINT_EDGE_BOTH; | ||
212 | break; | ||
213 | case IRQ_TYPE_LEVEL_HIGH: | ||
214 | type = GPIOINT_LEVEL_HIGH; | ||
215 | break; | ||
216 | case IRQ_TYPE_LEVEL_LOW: | ||
217 | type = GPIOINT_LEVEL_LOW; | ||
218 | break; | ||
219 | default: | ||
220 | BUG(); | ||
221 | } | ||
222 | |||
223 | |||
224 | value = __raw_readl(S5P_GPIOREG(CON_OFFSET) + con_offset); | ||
225 | value &= ~(0xf << (offset * 0x4)); | ||
226 | value |= (type << (offset * 0x4)); | ||
227 | __raw_writel(value, S5P_GPIOREG(CON_OFFSET) + con_offset); | ||
228 | |||
229 | return 0; | ||
230 | } | ||
231 | |||
232 | struct irq_chip s5pc100_gpioint = { | ||
233 | .name = "GPIO", | ||
234 | .ack = s5pc100_gpioint_ack, | ||
235 | .mask = s5pc100_gpioint_mask, | ||
236 | .mask_ack = s5pc100_gpioint_mask_ack, | ||
237 | .unmask = s5pc100_gpioint_unmask, | ||
238 | .set_type = s5pc100_gpioint_set_type, | ||
239 | }; | ||
240 | |||
241 | void s5pc100_irq_gpioint_handler(unsigned int irq, struct irq_desc *desc) | ||
242 | { | ||
243 | int group, offset, pend_offset, mask_offset; | ||
244 | int real_irq, group_end; | ||
245 | unsigned int pend, mask; | ||
246 | |||
247 | group_end = 21; | ||
248 | |||
249 | for (group = 0; group < group_end; group++) { | ||
250 | pend_offset = group_to_pend_offset(group); | ||
251 | pend = __raw_readl(S5P_GPIOREG(PEND_OFFSET) + pend_offset); | ||
252 | if (!pend) | ||
253 | continue; | ||
254 | |||
255 | mask_offset = group_to_mask_offset(group); | ||
256 | mask = __raw_readl(S5P_GPIOREG(MASK_OFFSET) + mask_offset); | ||
257 | pend &= ~mask; | ||
258 | |||
259 | for (offset = 0; offset < 8; offset++) { | ||
260 | if (pend & (1 << offset)) { | ||
261 | real_irq = s5pc100_get_start(group) + offset; | ||
262 | generic_handle_irq(S3C_IRQ_GPIO(real_irq)); | ||
263 | } | ||
264 | } | ||
265 | } | ||
266 | } | ||
diff --git a/arch/arm/mach-s5pc100/mach-smdkc100.c b/arch/arm/mach-s5pc100/mach-smdkc100.c index 880fb075092c..18b405d514d6 100644 --- a/arch/arm/mach-s5pc100/mach-smdkc100.c +++ b/arch/arm/mach-s5pc100/mach-smdkc100.c | |||
@@ -47,6 +47,7 @@ | |||
47 | #include <plat/adc.h> | 47 | #include <plat/adc.h> |
48 | #include <plat/keypad.h> | 48 | #include <plat/keypad.h> |
49 | #include <plat/ts.h> | 49 | #include <plat/ts.h> |
50 | #include <plat/audio.h> | ||
50 | 51 | ||
51 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 52 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
52 | #define SMDKC100_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 53 | #define SMDKC100_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
@@ -196,6 +197,7 @@ static struct platform_device *smdkc100_devices[] __initdata = { | |||
196 | &s5p_device_fimc0, | 197 | &s5p_device_fimc0, |
197 | &s5p_device_fimc1, | 198 | &s5p_device_fimc1, |
198 | &s5p_device_fimc2, | 199 | &s5p_device_fimc2, |
200 | &s5pc100_device_spdif, | ||
199 | }; | 201 | }; |
200 | 202 | ||
201 | static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = { | 203 | static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = { |
@@ -226,6 +228,8 @@ static void __init smdkc100_machine_init(void) | |||
226 | 228 | ||
227 | samsung_keypad_set_platdata(&smdkc100_keypad_data); | 229 | samsung_keypad_set_platdata(&smdkc100_keypad_data); |
228 | 230 | ||
231 | s5pc100_spdif_setup_gpio(S5PC100_SPDIF_GPD); | ||
232 | |||
229 | /* LCD init */ | 233 | /* LCD init */ |
230 | gpio_request(S5PC100_GPD(0), "GPD"); | 234 | gpio_request(S5PC100_GPD(0), "GPD"); |
231 | gpio_request(S5PC100_GPH0(6), "GPH0"); | 235 | gpio_request(S5PC100_GPH0(6), "GPH0"); |
diff --git a/arch/arm/mach-s5pc100/setup-fb-24bpp.c b/arch/arm/mach-s5pc100/setup-fb-24bpp.c index 6eba6cb8e2f4..d31c0f3fe222 100644 --- a/arch/arm/mach-s5pc100/setup-fb-24bpp.c +++ b/arch/arm/mach-s5pc100/setup-fb-24bpp.c | |||
@@ -22,27 +22,15 @@ | |||
22 | 22 | ||
23 | #define DISR_OFFSET 0x7008 | 23 | #define DISR_OFFSET 0x7008 |
24 | 24 | ||
25 | void s5pc100_fb_gpio_setup_24bpp(void) | 25 | static void s5pc100_fb_setgpios(unsigned int base, unsigned int nr) |
26 | { | 26 | { |
27 | unsigned int gpio = 0; | 27 | s3c_gpio_cfgrange_nopull(base, nr, S3C_GPIO_SFN(2)); |
28 | 28 | } | |
29 | for (gpio = S5PC100_GPF0(0); gpio <= S5PC100_GPF0(7); gpio++) { | ||
30 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
31 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
32 | } | ||
33 | |||
34 | for (gpio = S5PC100_GPF1(0); gpio <= S5PC100_GPF1(7); gpio++) { | ||
35 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
36 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
37 | } | ||
38 | |||
39 | for (gpio = S5PC100_GPF2(0); gpio <= S5PC100_GPF2(7); gpio++) { | ||
40 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
41 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
42 | } | ||
43 | 29 | ||
44 | for (gpio = S5PC100_GPF3(0); gpio <= S5PC100_GPF3(3); gpio++) { | 30 | void s5pc100_fb_gpio_setup_24bpp(void) |
45 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | 31 | { |
46 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | 32 | s5pc100_fb_setgpios(S5PC100_GPF0(0), 8); |
47 | } | 33 | s5pc100_fb_setgpios(S5PC100_GPF1(0), 8); |
34 | s5pc100_fb_setgpios(S5PC100_GPF2(0), 8); | ||
35 | s5pc100_fb_setgpios(S5PC100_GPF3(0), 4); | ||
48 | } | 36 | } |
diff --git a/arch/arm/mach-s5pc100/setup-i2c0.c b/arch/arm/mach-s5pc100/setup-i2c0.c index dd3174e6ecc5..eaef7a3bda49 100644 --- a/arch/arm/mach-s5pc100/setup-i2c0.c +++ b/arch/arm/mach-s5pc100/setup-i2c0.c | |||
@@ -23,8 +23,6 @@ struct platform_device; /* don't need the contents */ | |||
23 | 23 | ||
24 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) | 24 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) |
25 | { | 25 | { |
26 | s3c_gpio_cfgpin(S5PC100_GPD(3), S3C_GPIO_SFN(2)); | 26 | s3c_gpio_cfgall_range(S5PC100_GPD(3), 2, |
27 | s3c_gpio_setpull(S5PC100_GPD(3), S3C_GPIO_PULL_UP); | 27 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
28 | s3c_gpio_cfgpin(S5PC100_GPD(4), S3C_GPIO_SFN(2)); | ||
29 | s3c_gpio_setpull(S5PC100_GPD(4), S3C_GPIO_PULL_UP); | ||
30 | } | 28 | } |
diff --git a/arch/arm/mach-s5pc100/setup-i2c1.c b/arch/arm/mach-s5pc100/setup-i2c1.c index d1fec26b69ee..aaff74a90dee 100644 --- a/arch/arm/mach-s5pc100/setup-i2c1.c +++ b/arch/arm/mach-s5pc100/setup-i2c1.c | |||
@@ -23,8 +23,6 @@ struct platform_device; /* don't need the contents */ | |||
23 | 23 | ||
24 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) | 24 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) |
25 | { | 25 | { |
26 | s3c_gpio_cfgpin(S5PC100_GPD(5), S3C_GPIO_SFN(2)); | 26 | s3c_gpio_cfgall_range(S5PC100_GPD(5), 2, |
27 | s3c_gpio_setpull(S5PC100_GPD(5), S3C_GPIO_PULL_UP); | 27 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
28 | s3c_gpio_cfgpin(S5PC100_GPD(6), S3C_GPIO_SFN(2)); | ||
29 | s3c_gpio_setpull(S5PC100_GPD(6), S3C_GPIO_PULL_UP); | ||
30 | } | 28 | } |
diff --git a/arch/arm/mach-s5pc100/setup-ide.c b/arch/arm/mach-s5pc100/setup-ide.c index 83575671fb59..223aae044466 100644 --- a/arch/arm/mach-s5pc100/setup-ide.c +++ b/arch/arm/mach-s5pc100/setup-ide.c | |||
@@ -17,52 +17,39 @@ | |||
17 | #include <mach/regs-clock.h> | 17 | #include <mach/regs-clock.h> |
18 | #include <plat/gpio-cfg.h> | 18 | #include <plat/gpio-cfg.h> |
19 | 19 | ||
20 | static void s5pc100_ide_cfg_gpios(unsigned int base, unsigned int nr) | ||
21 | { | ||
22 | s3c_gpio_cfgrange_nopull(base, nr, S3C_GPIO_SFN(4)); | ||
23 | |||
24 | for (; nr > 0; nr--, base++) | ||
25 | s5p_gpio_set_drvstr(base, S5P_GPIO_DRVSTR_LV4); | ||
26 | } | ||
27 | |||
20 | void s5pc100_ide_setup_gpio(void) | 28 | void s5pc100_ide_setup_gpio(void) |
21 | { | 29 | { |
22 | u32 reg; | 30 | u32 reg; |
23 | u32 gpio = 0; | ||
24 | 31 | ||
25 | /* Independent CF interface, CF chip select configuration */ | 32 | /* Independent CF interface, CF chip select configuration */ |
26 | reg = readl(S5PC100_MEM_SYS_CFG) & (~0x3f); | 33 | reg = readl(S5PC100_MEM_SYS_CFG) & (~0x3f); |
27 | writel(reg | MEM_SYS_CFG_EBI_FIX_PRI_CFCON, S5PC100_MEM_SYS_CFG); | 34 | writel(reg | MEM_SYS_CFG_EBI_FIX_PRI_CFCON, S5PC100_MEM_SYS_CFG); |
28 | 35 | ||
29 | /* CF_Add[0 - 2], CF_IORDY, CF_INTRQ, CF_DMARQ, CF_DMARST, CF_DMACK */ | 36 | /* CF_Add[0 - 2], CF_IORDY, CF_INTRQ, CF_DMARQ, CF_DMARST, CF_DMACK */ |
30 | for (gpio = S5PC100_GPJ0(0); gpio <= S5PC100_GPJ0(7); gpio++) { | 37 | s5pc100_ide_cfg_gpios(S5PC100_GPJ0(0), 8); |
31 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(4)); | ||
32 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
33 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
34 | } | ||
35 | 38 | ||
36 | /*CF_Data[0 - 7] */ | 39 | /*CF_Data[0 - 7] */ |
37 | for (gpio = S5PC100_GPJ2(0); gpio <= S5PC100_GPJ2(7); gpio++) { | 40 | s5pc100_ide_cfg_gpios(S5PC100_GPJ2(0), 8); |
38 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(4)); | ||
39 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
40 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
41 | } | ||
42 | 41 | ||
43 | /* CF_Data[8 - 15] */ | 42 | /* CF_Data[8 - 15] */ |
44 | for (gpio = S5PC100_GPJ3(0); gpio <= S5PC100_GPJ3(7); gpio++) { | 43 | s5pc100_ide_cfg_gpios(S5PC100_GPJ3(0), 8); |
45 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(4)); | ||
46 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
47 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
48 | } | ||
49 | 44 | ||
50 | /* CF_CS0, CF_CS1, CF_IORD, CF_IOWR */ | 45 | /* CF_CS0, CF_CS1, CF_IORD, CF_IOWR */ |
51 | for (gpio = S5PC100_GPJ4(0); gpio <= S5PC100_GPJ4(3); gpio++) { | 46 | s5pc100_ide_cfg_gpios(S5PC100_GPJ4(0), 4); |
52 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(4)); | ||
53 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
54 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
55 | } | ||
56 | 47 | ||
57 | /* EBI_OE, EBI_WE */ | 48 | /* EBI_OE, EBI_WE */ |
58 | for (gpio = S5PC100_GPK0(6); gpio <= S5PC100_GPK0(7); gpio++) | 49 | s3c_gpio_cfgpin_range(S5PC100_GPK0(6), 2, S3C_GPIO_SFN(0)); |
59 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0)); | ||
60 | 50 | ||
61 | /* CF_OE, CF_WE */ | 51 | /* CF_OE, CF_WE */ |
62 | for (gpio = S5PC100_GPK1(6); gpio <= S5PC100_GPK1(7); gpio++) { | 52 | s3c_gpio_cfgrange_nopull(S5PC100_GPK1(6), 8, S3C_GPIO_SFN(2)); |
63 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
64 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
65 | } | ||
66 | 53 | ||
67 | /* CF_CD */ | 54 | /* CF_CD */ |
68 | s3c_gpio_cfgpin(S5PC100_GPK3(5), S3C_GPIO_SFN(2)); | 55 | s3c_gpio_cfgpin(S5PC100_GPK3(5), S3C_GPIO_SFN(2)); |
diff --git a/arch/arm/mach-s5pc100/setup-keypad.c b/arch/arm/mach-s5pc100/setup-keypad.c index d0837a72a58e..ada377f0c206 100644 --- a/arch/arm/mach-s5pc100/setup-keypad.c +++ b/arch/arm/mach-s5pc100/setup-keypad.c | |||
@@ -15,20 +15,9 @@ | |||
15 | 15 | ||
16 | void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols) | 16 | void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols) |
17 | { | 17 | { |
18 | unsigned int gpio; | ||
19 | unsigned int end; | ||
20 | |||
21 | /* Set all the necessary GPH3 pins to special-function 3: KP_ROW[x] */ | 18 | /* Set all the necessary GPH3 pins to special-function 3: KP_ROW[x] */ |
22 | end = S5PC100_GPH3(rows); | 19 | s3c_gpio_cfgrange_nopull(S5PC100_GPH3(0), rows, S3C_GPIO_SFN(3)); |
23 | for (gpio = S5PC100_GPH3(0); gpio < end; gpio++) { | ||
24 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
25 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
26 | } | ||
27 | 20 | ||
28 | /* Set all the necessary GPH2 pins to special-function 3: KP_COL[x] */ | 21 | /* Set all the necessary GPH2 pins to special-function 3: KP_COL[x] */ |
29 | end = S5PC100_GPH2(cols); | 22 | s3c_gpio_cfgrange_nopull(S5PC100_GPH2(0), cols, S3C_GPIO_SFN(3)); |
30 | for (gpio = S5PC100_GPH2(0); gpio < end; gpio++) { | ||
31 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
32 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
33 | } | ||
34 | } | 23 | } |
diff --git a/arch/arm/mach-s5pc100/setup-sdhci-gpio.c b/arch/arm/mach-s5pc100/setup-sdhci-gpio.c index dc7208c639ea..03c02d04c68c 100644 --- a/arch/arm/mach-s5pc100/setup-sdhci-gpio.c +++ b/arch/arm/mach-s5pc100/setup-sdhci-gpio.c | |||
@@ -25,8 +25,6 @@ | |||
25 | void s5pc100_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | 25 | void s5pc100_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) |
26 | { | 26 | { |
27 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | 27 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; |
28 | unsigned int gpio; | ||
29 | unsigned int end; | ||
30 | unsigned int num; | 28 | unsigned int num; |
31 | 29 | ||
32 | num = width; | 30 | num = width; |
@@ -34,20 +32,11 @@ void s5pc100_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | |||
34 | if (width == 8) | 32 | if (width == 8) |
35 | num = width - 2; | 33 | num = width - 2; |
36 | 34 | ||
37 | end = S5PC100_GPG0(2 + num); | ||
38 | |||
39 | /* Set all the necessary GPG0/GPG1 pins to special-function 0 */ | 35 | /* Set all the necessary GPG0/GPG1 pins to special-function 0 */ |
40 | for (gpio = S5PC100_GPG0(0); gpio < end; gpio++) { | 36 | s3c_gpio_cfgrange_nopull(S5PC100_GPG0(0), 2 + num, S3C_GPIO_SFN(2)); |
41 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
42 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
43 | } | ||
44 | 37 | ||
45 | if (width == 8) { | 38 | if (width == 8) |
46 | for (gpio = S5PC100_GPG1(0); gpio <= S5PC100_GPG1(1); gpio++) { | 39 | s3c_gpio_cfgrange_nopull(S5PC100_GPG1(0), 2, S3C_GPIO_SFN(2)); |
47 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
48 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
49 | } | ||
50 | } | ||
51 | 40 | ||
52 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | 41 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { |
53 | s3c_gpio_setpull(S5PC100_GPG1(2), S3C_GPIO_PULL_UP); | 42 | s3c_gpio_setpull(S5PC100_GPG1(2), S3C_GPIO_PULL_UP); |
@@ -58,16 +47,9 @@ void s5pc100_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | |||
58 | void s5pc100_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) | 47 | void s5pc100_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) |
59 | { | 48 | { |
60 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | 49 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; |
61 | unsigned int gpio; | ||
62 | unsigned int end; | ||
63 | |||
64 | end = S5PC100_GPG2(2 + width); | ||
65 | 50 | ||
66 | /* Set all the necessary GPG2 pins to special-function 2 */ | 51 | /* Set all the necessary GPG2 pins to special-function 2 */ |
67 | for (gpio = S5PC100_GPG2(0); gpio < end; gpio++) { | 52 | s3c_gpio_cfgrange_nopull(S5PC100_GPG2(0), 2 + width, S3C_GPIO_SFN(2)); |
68 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
69 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
70 | } | ||
71 | 53 | ||
72 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | 54 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { |
73 | s3c_gpio_setpull(S5PC100_GPG2(6), S3C_GPIO_PULL_UP); | 55 | s3c_gpio_setpull(S5PC100_GPG2(6), S3C_GPIO_PULL_UP); |
@@ -78,16 +60,9 @@ void s5pc100_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) | |||
78 | void s5pc100_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width) | 60 | void s5pc100_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width) |
79 | { | 61 | { |
80 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | 62 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; |
81 | unsigned int gpio; | ||
82 | unsigned int end; | ||
83 | |||
84 | end = S5PC100_GPG3(2 + width); | ||
85 | 63 | ||
86 | /* Set all the necessary GPG3 pins to special-function 2 */ | 64 | /* Set all the necessary GPG3 pins to special-function 2 */ |
87 | for (gpio = S5PC100_GPG3(0); gpio < end; gpio++) { | 65 | s3c_gpio_cfgrange_nopull(S5PC100_GPG3(0), 2 + width, S3C_GPIO_SFN(2)); |
88 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
89 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
90 | } | ||
91 | 66 | ||
92 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | 67 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { |
93 | s3c_gpio_setpull(S5PC100_GPG3(6), S3C_GPIO_PULL_UP); | 68 | s3c_gpio_setpull(S5PC100_GPG3(6), S3C_GPIO_PULL_UP); |
diff --git a/arch/arm/mach-s5pv210/Kconfig b/arch/arm/mach-s5pv210/Kconfig index 5315fec3db86..862f239a0fdb 100644 --- a/arch/arm/mach-s5pv210/Kconfig +++ b/arch/arm/mach-s5pv210/Kconfig | |||
@@ -11,9 +11,9 @@ if ARCH_S5PV210 | |||
11 | 11 | ||
12 | config CPU_S5PV210 | 12 | config CPU_S5PV210 |
13 | bool | 13 | bool |
14 | select PLAT_S5P | ||
15 | select S3C_PL330_DMA | 14 | select S3C_PL330_DMA |
16 | select S5P_EXT_INT | 15 | select S5P_EXT_INT |
16 | select S5PV210_PM if PM | ||
17 | help | 17 | help |
18 | Enable S5PV210 CPU support | 18 | Enable S5PV210 CPU support |
19 | 19 | ||
@@ -58,7 +58,6 @@ menu "S5PC110 Machines" | |||
58 | config MACH_AQUILA | 58 | config MACH_AQUILA |
59 | bool "Aquila" | 59 | bool "Aquila" |
60 | select CPU_S5PV210 | 60 | select CPU_S5PV210 |
61 | select ARCH_SPARSEMEM_ENABLE | ||
62 | select S3C_DEV_FB | 61 | select S3C_DEV_FB |
63 | select S5P_DEV_FIMC0 | 62 | select S5P_DEV_FIMC0 |
64 | select S5P_DEV_FIMC1 | 63 | select S5P_DEV_FIMC1 |
@@ -75,7 +74,7 @@ config MACH_AQUILA | |||
75 | config MACH_GONI | 74 | config MACH_GONI |
76 | bool "GONI" | 75 | bool "GONI" |
77 | select CPU_S5PV210 | 76 | select CPU_S5PV210 |
78 | select ARCH_SPARSEMEM_ENABLE | 77 | select S5P_GPIO_INT |
79 | select S3C_DEV_FB | 78 | select S3C_DEV_FB |
80 | select S5P_DEV_FIMC0 | 79 | select S5P_DEV_FIMC0 |
81 | select S5P_DEV_FIMC1 | 80 | select S5P_DEV_FIMC1 |
@@ -83,8 +82,15 @@ config MACH_GONI | |||
83 | select S3C_DEV_HSMMC | 82 | select S3C_DEV_HSMMC |
84 | select S3C_DEV_HSMMC1 | 83 | select S3C_DEV_HSMMC1 |
85 | select S3C_DEV_HSMMC2 | 84 | select S3C_DEV_HSMMC2 |
85 | select S3C_DEV_I2C1 | ||
86 | select S3C_DEV_I2C2 | ||
87 | select S3C_DEV_USB_HSOTG | ||
86 | select S5P_DEV_ONENAND | 88 | select S5P_DEV_ONENAND |
89 | select SAMSUNG_DEV_KEYPAD | ||
87 | select S5PV210_SETUP_FB_24BPP | 90 | select S5PV210_SETUP_FB_24BPP |
91 | select S5PV210_SETUP_I2C1 | ||
92 | select S5PV210_SETUP_I2C2 | ||
93 | select S5PV210_SETUP_KEYPAD | ||
88 | select S5PV210_SETUP_SDHCI | 94 | select S5PV210_SETUP_SDHCI |
89 | help | 95 | help |
90 | Machine support for Samsung GONI board | 96 | Machine support for Samsung GONI board |
@@ -93,7 +99,6 @@ config MACH_GONI | |||
93 | config MACH_SMDKC110 | 99 | config MACH_SMDKC110 |
94 | bool "SMDKC110" | 100 | bool "SMDKC110" |
95 | select CPU_S5PV210 | 101 | select CPU_S5PV210 |
96 | select ARCH_SPARSEMEM_ENABLE | ||
97 | select S3C_DEV_I2C1 | 102 | select S3C_DEV_I2C1 |
98 | select S3C_DEV_I2C2 | 103 | select S3C_DEV_I2C2 |
99 | select S3C_DEV_RTC | 104 | select S3C_DEV_RTC |
@@ -113,7 +118,6 @@ menu "S5PV210 Machines" | |||
113 | config MACH_SMDKV210 | 118 | config MACH_SMDKV210 |
114 | bool "SMDKV210" | 119 | bool "SMDKV210" |
115 | select CPU_S5PV210 | 120 | select CPU_S5PV210 |
116 | select ARCH_SPARSEMEM_ENABLE | ||
117 | select S3C_DEV_HSMMC | 121 | select S3C_DEV_HSMMC |
118 | select S3C_DEV_HSMMC1 | 122 | select S3C_DEV_HSMMC1 |
119 | select S3C_DEV_HSMMC2 | 123 | select S3C_DEV_HSMMC2 |
@@ -134,6 +138,29 @@ config MACH_SMDKV210 | |||
134 | help | 138 | help |
135 | Machine support for Samsung SMDKV210 | 139 | Machine support for Samsung SMDKV210 |
136 | 140 | ||
141 | config MACH_TORBRECK | ||
142 | bool "Torbreck" | ||
143 | select CPU_S5PV210 | ||
144 | select ARCH_SPARSEMEM_ENABLE | ||
145 | select S3C_DEV_HSMMC | ||
146 | select S3C_DEV_HSMMC1 | ||
147 | select S3C_DEV_HSMMC2 | ||
148 | select S3C_DEV_HSMMC3 | ||
149 | select S3C_DEV_I2C1 | ||
150 | select S3C_DEV_I2C2 | ||
151 | select S3C_DEV_RTC | ||
152 | select S3C_DEV_WDT | ||
153 | select S5PV210_SETUP_I2C1 | ||
154 | select S5PV210_SETUP_I2C2 | ||
155 | select S5PV210_SETUP_SDHCI | ||
156 | help | ||
157 | Machine support for aESOP Torbreck | ||
158 | |||
137 | endmenu | 159 | endmenu |
138 | 160 | ||
161 | config S5PV210_PM | ||
162 | bool | ||
163 | help | ||
164 | Power Management code common to S5PV210 | ||
165 | |||
139 | endif | 166 | endif |
diff --git a/arch/arm/mach-s5pv210/Makefile b/arch/arm/mach-s5pv210/Makefile index 704548912408..ff1a0db57a2f 100644 --- a/arch/arm/mach-s5pv210/Makefile +++ b/arch/arm/mach-s5pv210/Makefile | |||
@@ -14,6 +14,8 @@ obj- := | |||
14 | 14 | ||
15 | obj-$(CONFIG_CPU_S5PV210) += cpu.o init.o clock.o dma.o gpiolib.o | 15 | obj-$(CONFIG_CPU_S5PV210) += cpu.o init.o clock.o dma.o gpiolib.o |
16 | obj-$(CONFIG_CPU_S5PV210) += setup-i2c0.o | 16 | obj-$(CONFIG_CPU_S5PV210) += setup-i2c0.o |
17 | obj-$(CONFIG_S5PV210_PM) += pm.o sleep.o | ||
18 | obj-$(CONFIG_CPU_FREQ) += cpufreq.o | ||
17 | 19 | ||
18 | # machine support | 20 | # machine support |
19 | 21 | ||
@@ -21,6 +23,7 @@ obj-$(CONFIG_MACH_AQUILA) += mach-aquila.o | |||
21 | obj-$(CONFIG_MACH_SMDKV210) += mach-smdkv210.o | 23 | obj-$(CONFIG_MACH_SMDKV210) += mach-smdkv210.o |
22 | obj-$(CONFIG_MACH_SMDKC110) += mach-smdkc110.o | 24 | obj-$(CONFIG_MACH_SMDKC110) += mach-smdkc110.o |
23 | obj-$(CONFIG_MACH_GONI) += mach-goni.o | 25 | obj-$(CONFIG_MACH_GONI) += mach-goni.o |
26 | obj-$(CONFIG_MACH_TORBRECK) += mach-torbreck.o | ||
24 | 27 | ||
25 | # device support | 28 | # device support |
26 | 29 | ||
diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c index d562670e1b0b..019c3a69b0e4 100644 --- a/arch/arm/mach-s5pv210/clock.c +++ b/arch/arm/mach-s5pv210/clock.c | |||
@@ -31,6 +31,8 @@ | |||
31 | #include <plat/clock-clksrc.h> | 31 | #include <plat/clock-clksrc.h> |
32 | #include <plat/s5pv210.h> | 32 | #include <plat/s5pv210.h> |
33 | 33 | ||
34 | static unsigned long xtal; | ||
35 | |||
34 | static struct clksrc_clk clk_mout_apll = { | 36 | static struct clksrc_clk clk_mout_apll = { |
35 | .clk = { | 37 | .clk = { |
36 | .name = "mout_apll", | 38 | .name = "mout_apll", |
@@ -259,6 +261,36 @@ static struct clksrc_clk clk_sclk_vpll = { | |||
259 | .reg_src = { .reg = S5P_CLK_SRC0, .shift = 12, .size = 1 }, | 261 | .reg_src = { .reg = S5P_CLK_SRC0, .shift = 12, .size = 1 }, |
260 | }; | 262 | }; |
261 | 263 | ||
264 | static struct clk *clkset_moutdmc0src_list[] = { | ||
265 | [0] = &clk_sclk_a2m.clk, | ||
266 | [1] = &clk_mout_mpll.clk, | ||
267 | [2] = NULL, | ||
268 | [3] = NULL, | ||
269 | }; | ||
270 | |||
271 | static struct clksrc_sources clkset_moutdmc0src = { | ||
272 | .sources = clkset_moutdmc0src_list, | ||
273 | .nr_sources = ARRAY_SIZE(clkset_moutdmc0src_list), | ||
274 | }; | ||
275 | |||
276 | static struct clksrc_clk clk_mout_dmc0 = { | ||
277 | .clk = { | ||
278 | .name = "mout_dmc0", | ||
279 | .id = -1, | ||
280 | }, | ||
281 | .sources = &clkset_moutdmc0src, | ||
282 | .reg_src = { .reg = S5P_CLK_SRC6, .shift = 24, .size = 2 }, | ||
283 | }; | ||
284 | |||
285 | static struct clksrc_clk clk_sclk_dmc0 = { | ||
286 | .clk = { | ||
287 | .name = "sclk_dmc0", | ||
288 | .id = -1, | ||
289 | .parent = &clk_mout_dmc0.clk, | ||
290 | }, | ||
291 | .reg_div = { .reg = S5P_CLK_DIV6, .shift = 28, .size = 4 }, | ||
292 | }; | ||
293 | |||
262 | static unsigned long s5pv210_clk_imem_get_rate(struct clk *clk) | 294 | static unsigned long s5pv210_clk_imem_get_rate(struct clk *clk) |
263 | { | 295 | { |
264 | return clk_get_rate(clk->parent) / 2; | 296 | return clk_get_rate(clk->parent) / 2; |
@@ -268,8 +300,29 @@ static struct clk_ops clk_hclk_imem_ops = { | |||
268 | .get_rate = s5pv210_clk_imem_get_rate, | 300 | .get_rate = s5pv210_clk_imem_get_rate, |
269 | }; | 301 | }; |
270 | 302 | ||
303 | static unsigned long s5pv210_clk_fout_apll_get_rate(struct clk *clk) | ||
304 | { | ||
305 | return s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON), pll_4508); | ||
306 | } | ||
307 | |||
308 | static struct clk_ops clk_fout_apll_ops = { | ||
309 | .get_rate = s5pv210_clk_fout_apll_get_rate, | ||
310 | }; | ||
311 | |||
271 | static struct clk init_clocks_disable[] = { | 312 | static struct clk init_clocks_disable[] = { |
272 | { | 313 | { |
314 | .name = "pdma", | ||
315 | .id = 0, | ||
316 | .parent = &clk_hclk_psys.clk, | ||
317 | .enable = s5pv210_clk_ip0_ctrl, | ||
318 | .ctrlbit = (1 << 3), | ||
319 | }, { | ||
320 | .name = "pdma", | ||
321 | .id = 1, | ||
322 | .parent = &clk_hclk_psys.clk, | ||
323 | .enable = s5pv210_clk_ip0_ctrl, | ||
324 | .ctrlbit = (1 << 4), | ||
325 | }, { | ||
273 | .name = "rot", | 326 | .name = "rot", |
274 | .id = -1, | 327 | .id = -1, |
275 | .parent = &clk_hclk_dsys.clk, | 328 | .parent = &clk_hclk_dsys.clk, |
@@ -431,6 +484,12 @@ static struct clk init_clocks_disable[] = { | |||
431 | .parent = &clk_p, | 484 | .parent = &clk_p, |
432 | .enable = s5pv210_clk_ip3_ctrl, | 485 | .enable = s5pv210_clk_ip3_ctrl, |
433 | .ctrlbit = (1 << 6), | 486 | .ctrlbit = (1 << 6), |
487 | }, { | ||
488 | .name = "spdif", | ||
489 | .id = -1, | ||
490 | .parent = &clk_p, | ||
491 | .enable = s5pv210_clk_ip3_ctrl, | ||
492 | .ctrlbit = (1 << 0), | ||
434 | }, | 493 | }, |
435 | }; | 494 | }; |
436 | 495 | ||
@@ -660,6 +719,53 @@ static struct clksrc_sources clkset_sclk_spdif = { | |||
660 | .nr_sources = ARRAY_SIZE(clkset_sclk_spdif_list), | 719 | .nr_sources = ARRAY_SIZE(clkset_sclk_spdif_list), |
661 | }; | 720 | }; |
662 | 721 | ||
722 | static int s5pv210_spdif_set_rate(struct clk *clk, unsigned long rate) | ||
723 | { | ||
724 | struct clk *pclk; | ||
725 | int ret; | ||
726 | |||
727 | pclk = clk_get_parent(clk); | ||
728 | if (IS_ERR(pclk)) | ||
729 | return -EINVAL; | ||
730 | |||
731 | ret = pclk->ops->set_rate(pclk, rate); | ||
732 | clk_put(pclk); | ||
733 | |||
734 | return ret; | ||
735 | } | ||
736 | |||
737 | static unsigned long s5pv210_spdif_get_rate(struct clk *clk) | ||
738 | { | ||
739 | struct clk *pclk; | ||
740 | int rate; | ||
741 | |||
742 | pclk = clk_get_parent(clk); | ||
743 | if (IS_ERR(pclk)) | ||
744 | return -EINVAL; | ||
745 | |||
746 | rate = pclk->ops->get_rate(clk); | ||
747 | clk_put(pclk); | ||
748 | |||
749 | return rate; | ||
750 | } | ||
751 | |||
752 | static struct clk_ops s5pv210_sclk_spdif_ops = { | ||
753 | .set_rate = s5pv210_spdif_set_rate, | ||
754 | .get_rate = s5pv210_spdif_get_rate, | ||
755 | }; | ||
756 | |||
757 | static struct clksrc_clk clk_sclk_spdif = { | ||
758 | .clk = { | ||
759 | .name = "sclk_spdif", | ||
760 | .id = -1, | ||
761 | .enable = s5pv210_clk_mask0_ctrl, | ||
762 | .ctrlbit = (1 << 27), | ||
763 | .ops = &s5pv210_sclk_spdif_ops, | ||
764 | }, | ||
765 | .sources = &clkset_sclk_spdif, | ||
766 | .reg_src = { .reg = S5P_CLK_SRC6, .shift = 12, .size = 2 }, | ||
767 | }; | ||
768 | |||
663 | static struct clk *clkset_group2_list[] = { | 769 | static struct clk *clkset_group2_list[] = { |
664 | [0] = &clk_ext_xtal_mux, | 770 | [0] = &clk_ext_xtal_mux, |
665 | [1] = &clk_xusbxti, | 771 | [1] = &clk_xusbxti, |
@@ -744,15 +850,6 @@ static struct clksrc_clk clksrcs[] = { | |||
744 | .sources = &clkset_sclk_mixer, | 850 | .sources = &clkset_sclk_mixer, |
745 | .reg_src = { .reg = S5P_CLK_SRC1, .shift = 4, .size = 1 }, | 851 | .reg_src = { .reg = S5P_CLK_SRC1, .shift = 4, .size = 1 }, |
746 | }, { | 852 | }, { |
747 | .clk = { | ||
748 | .name = "sclk_spdif", | ||
749 | .id = -1, | ||
750 | .enable = s5pv210_clk_mask0_ctrl, | ||
751 | .ctrlbit = (1 << 27), | ||
752 | }, | ||
753 | .sources = &clkset_sclk_spdif, | ||
754 | .reg_src = { .reg = S5P_CLK_SRC6, .shift = 12, .size = 2 }, | ||
755 | }, { | ||
756 | .clk = { | 853 | .clk = { |
757 | .name = "sclk_fimc", | 854 | .name = "sclk_fimc", |
758 | .id = 0, | 855 | .id = 0, |
@@ -953,12 +1050,93 @@ static struct clksrc_clk *sysclks[] = { | |||
953 | &clk_sclk_dac, | 1050 | &clk_sclk_dac, |
954 | &clk_sclk_pixel, | 1051 | &clk_sclk_pixel, |
955 | &clk_sclk_hdmi, | 1052 | &clk_sclk_hdmi, |
1053 | &clk_mout_dmc0, | ||
1054 | &clk_sclk_dmc0, | ||
1055 | &clk_sclk_audio0, | ||
1056 | &clk_sclk_audio1, | ||
1057 | &clk_sclk_audio2, | ||
1058 | &clk_sclk_spdif, | ||
1059 | }; | ||
1060 | |||
1061 | static u32 epll_div[][6] = { | ||
1062 | { 48000000, 0, 48, 3, 3, 0 }, | ||
1063 | { 96000000, 0, 48, 3, 2, 0 }, | ||
1064 | { 144000000, 1, 72, 3, 2, 0 }, | ||
1065 | { 192000000, 0, 48, 3, 1, 0 }, | ||
1066 | { 288000000, 1, 72, 3, 1, 0 }, | ||
1067 | { 32750000, 1, 65, 3, 4, 35127 }, | ||
1068 | { 32768000, 1, 65, 3, 4, 35127 }, | ||
1069 | { 45158400, 0, 45, 3, 3, 10355 }, | ||
1070 | { 45000000, 0, 45, 3, 3, 10355 }, | ||
1071 | { 45158000, 0, 45, 3, 3, 10355 }, | ||
1072 | { 49125000, 0, 49, 3, 3, 9961 }, | ||
1073 | { 49152000, 0, 49, 3, 3, 9961 }, | ||
1074 | { 67737600, 1, 67, 3, 3, 48366 }, | ||
1075 | { 67738000, 1, 67, 3, 3, 48366 }, | ||
1076 | { 73800000, 1, 73, 3, 3, 47710 }, | ||
1077 | { 73728000, 1, 73, 3, 3, 47710 }, | ||
1078 | { 36000000, 1, 32, 3, 4, 0 }, | ||
1079 | { 60000000, 1, 60, 3, 3, 0 }, | ||
1080 | { 72000000, 1, 72, 3, 3, 0 }, | ||
1081 | { 80000000, 1, 80, 3, 3, 0 }, | ||
1082 | { 84000000, 0, 42, 3, 2, 0 }, | ||
1083 | { 50000000, 0, 50, 3, 3, 0 }, | ||
1084 | }; | ||
1085 | |||
1086 | static int s5pv210_epll_set_rate(struct clk *clk, unsigned long rate) | ||
1087 | { | ||
1088 | unsigned int epll_con, epll_con_k; | ||
1089 | unsigned int i; | ||
1090 | |||
1091 | /* Return if nothing changed */ | ||
1092 | if (clk->rate == rate) | ||
1093 | return 0; | ||
1094 | |||
1095 | epll_con = __raw_readl(S5P_EPLL_CON); | ||
1096 | epll_con_k = __raw_readl(S5P_EPLL_CON1); | ||
1097 | |||
1098 | epll_con_k &= ~PLL46XX_KDIV_MASK; | ||
1099 | epll_con &= ~(1 << 27 | | ||
1100 | PLL46XX_MDIV_MASK << PLL46XX_MDIV_SHIFT | | ||
1101 | PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT | | ||
1102 | PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT); | ||
1103 | |||
1104 | for (i = 0; i < ARRAY_SIZE(epll_div); i++) { | ||
1105 | if (epll_div[i][0] == rate) { | ||
1106 | epll_con_k |= epll_div[i][5] << 0; | ||
1107 | epll_con |= (epll_div[i][1] << 27 | | ||
1108 | epll_div[i][2] << PLL46XX_MDIV_SHIFT | | ||
1109 | epll_div[i][3] << PLL46XX_PDIV_SHIFT | | ||
1110 | epll_div[i][4] << PLL46XX_SDIV_SHIFT); | ||
1111 | break; | ||
1112 | } | ||
1113 | } | ||
1114 | |||
1115 | if (i == ARRAY_SIZE(epll_div)) { | ||
1116 | printk(KERN_ERR "%s: Invalid Clock EPLL Frequency\n", | ||
1117 | __func__); | ||
1118 | return -EINVAL; | ||
1119 | } | ||
1120 | |||
1121 | __raw_writel(epll_con, S5P_EPLL_CON); | ||
1122 | __raw_writel(epll_con_k, S5P_EPLL_CON1); | ||
1123 | |||
1124 | printk(KERN_WARNING "EPLL Rate changes from %lu to %lu\n", | ||
1125 | clk->rate, rate); | ||
1126 | |||
1127 | clk->rate = rate; | ||
1128 | |||
1129 | return 0; | ||
1130 | } | ||
1131 | |||
1132 | static struct clk_ops s5pv210_epll_ops = { | ||
1133 | .set_rate = s5pv210_epll_set_rate, | ||
1134 | .get_rate = s5p_epll_get_rate, | ||
956 | }; | 1135 | }; |
957 | 1136 | ||
958 | void __init_or_cpufreq s5pv210_setup_clocks(void) | 1137 | void __init_or_cpufreq s5pv210_setup_clocks(void) |
959 | { | 1138 | { |
960 | struct clk *xtal_clk; | 1139 | struct clk *xtal_clk; |
961 | unsigned long xtal; | ||
962 | unsigned long vpllsrc; | 1140 | unsigned long vpllsrc; |
963 | unsigned long armclk; | 1141 | unsigned long armclk; |
964 | unsigned long hclk_msys; | 1142 | unsigned long hclk_msys; |
@@ -974,6 +1152,10 @@ void __init_or_cpufreq s5pv210_setup_clocks(void) | |||
974 | unsigned int ptr; | 1152 | unsigned int ptr; |
975 | u32 clkdiv0, clkdiv1; | 1153 | u32 clkdiv0, clkdiv1; |
976 | 1154 | ||
1155 | /* Set functions for clk_fout_epll */ | ||
1156 | clk_fout_epll.enable = s5p_epll_enable; | ||
1157 | clk_fout_epll.ops = &s5pv210_epll_ops; | ||
1158 | |||
977 | printk(KERN_DEBUG "%s: registering clocks\n", __func__); | 1159 | printk(KERN_DEBUG "%s: registering clocks\n", __func__); |
978 | 1160 | ||
979 | clkdiv0 = __raw_readl(S5P_CLK_DIV0); | 1161 | clkdiv0 = __raw_readl(S5P_CLK_DIV0); |
@@ -992,11 +1174,12 @@ void __init_or_cpufreq s5pv210_setup_clocks(void) | |||
992 | 1174 | ||
993 | apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON), pll_4508); | 1175 | apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON), pll_4508); |
994 | mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON), pll_4502); | 1176 | mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON), pll_4502); |
995 | epll = s5p_get_pll45xx(xtal, __raw_readl(S5P_EPLL_CON), pll_4500); | 1177 | epll = s5p_get_pll46xx(xtal, __raw_readl(S5P_EPLL_CON), |
1178 | __raw_readl(S5P_EPLL_CON1), pll_4600); | ||
996 | vpllsrc = clk_get_rate(&clk_vpllsrc.clk); | 1179 | vpllsrc = clk_get_rate(&clk_vpllsrc.clk); |
997 | vpll = s5p_get_pll45xx(vpllsrc, __raw_readl(S5P_VPLL_CON), pll_4502); | 1180 | vpll = s5p_get_pll45xx(vpllsrc, __raw_readl(S5P_VPLL_CON), pll_4502); |
998 | 1181 | ||
999 | clk_fout_apll.rate = apll; | 1182 | clk_fout_apll.ops = &clk_fout_apll_ops; |
1000 | clk_fout_mpll.rate = mpll; | 1183 | clk_fout_mpll.rate = mpll; |
1001 | clk_fout_epll.rate = epll; | 1184 | clk_fout_epll.rate = epll; |
1002 | clk_fout_vpll.rate = vpll; | 1185 | clk_fout_vpll.rate = vpll; |
diff --git a/arch/arm/mach-s5pv210/cpu.c b/arch/arm/mach-s5pv210/cpu.c index 2f16bfc0a116..8eb480e201b0 100644 --- a/arch/arm/mach-s5pv210/cpu.c +++ b/arch/arm/mach-s5pv210/cpu.c | |||
@@ -85,6 +85,21 @@ static struct map_desc s5pv210_iodesc[] __initdata = { | |||
85 | .pfn = __phys_to_pfn(S5PV210_PA_SROMC), | 85 | .pfn = __phys_to_pfn(S5PV210_PA_SROMC), |
86 | .length = SZ_4K, | 86 | .length = SZ_4K, |
87 | .type = MT_DEVICE, | 87 | .type = MT_DEVICE, |
88 | }, { | ||
89 | .virtual = (unsigned long)S5P_VA_DMC0, | ||
90 | .pfn = __phys_to_pfn(S5PV210_PA_DMC0), | ||
91 | .length = SZ_4K, | ||
92 | .type = MT_DEVICE, | ||
93 | }, { | ||
94 | .virtual = (unsigned long)S5P_VA_DMC1, | ||
95 | .pfn = __phys_to_pfn(S5PV210_PA_DMC1), | ||
96 | .length = SZ_4K, | ||
97 | .type = MT_DEVICE, | ||
98 | }, { | ||
99 | .virtual = (unsigned long)S3C_VA_USB_HSPHY, | ||
100 | .pfn =__phys_to_pfn(S5PV210_PA_HSPHY), | ||
101 | .length = SZ_4K, | ||
102 | .type = MT_DEVICE, | ||
88 | } | 103 | } |
89 | }; | 104 | }; |
90 | 105 | ||
diff --git a/arch/arm/mach-s5pv210/cpufreq.c b/arch/arm/mach-s5pv210/cpufreq.c new file mode 100644 index 000000000000..a6f22920a2c2 --- /dev/null +++ b/arch/arm/mach-s5pv210/cpufreq.c | |||
@@ -0,0 +1,484 @@ | |||
1 | /* linux/arch/arm/mach-s5pv210/cpufreq.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * CPU frequency scaling for S5PC110/S5PV210 | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/types.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/err.h> | ||
17 | #include <linux/clk.h> | ||
18 | #include <linux/io.h> | ||
19 | #include <linux/cpufreq.h> | ||
20 | |||
21 | #include <mach/map.h> | ||
22 | #include <mach/regs-clock.h> | ||
23 | |||
24 | static struct clk *cpu_clk; | ||
25 | static struct clk *dmc0_clk; | ||
26 | static struct clk *dmc1_clk; | ||
27 | static struct cpufreq_freqs freqs; | ||
28 | |||
29 | /* APLL M,P,S values for 1G/800Mhz */ | ||
30 | #define APLL_VAL_1000 ((1 << 31) | (125 << 16) | (3 << 8) | 1) | ||
31 | #define APLL_VAL_800 ((1 << 31) | (100 << 16) | (3 << 8) | 1) | ||
32 | |||
33 | /* | ||
34 | * DRAM configurations to calculate refresh counter for changing | ||
35 | * frequency of memory. | ||
36 | */ | ||
37 | struct dram_conf { | ||
38 | unsigned long freq; /* HZ */ | ||
39 | unsigned long refresh; /* DRAM refresh counter * 1000 */ | ||
40 | }; | ||
41 | |||
42 | /* DRAM configuration (DMC0 and DMC1) */ | ||
43 | static struct dram_conf s5pv210_dram_conf[2]; | ||
44 | |||
45 | enum perf_level { | ||
46 | L0, L1, L2, L3, L4, | ||
47 | }; | ||
48 | |||
49 | enum s5pv210_mem_type { | ||
50 | LPDDR = 0x1, | ||
51 | LPDDR2 = 0x2, | ||
52 | DDR2 = 0x4, | ||
53 | }; | ||
54 | |||
55 | enum s5pv210_dmc_port { | ||
56 | DMC0 = 0, | ||
57 | DMC1, | ||
58 | }; | ||
59 | |||
60 | static struct cpufreq_frequency_table s5pv210_freq_table[] = { | ||
61 | {L0, 1000*1000}, | ||
62 | {L1, 800*1000}, | ||
63 | {L2, 400*1000}, | ||
64 | {L3, 200*1000}, | ||
65 | {L4, 100*1000}, | ||
66 | {0, CPUFREQ_TABLE_END}, | ||
67 | }; | ||
68 | |||
69 | static u32 clkdiv_val[5][11] = { | ||
70 | /* | ||
71 | * Clock divider value for following | ||
72 | * { APLL, A2M, HCLK_MSYS, PCLK_MSYS, | ||
73 | * HCLK_DSYS, PCLK_DSYS, HCLK_PSYS, PCLK_PSYS, | ||
74 | * ONEDRAM, MFC, G3D } | ||
75 | */ | ||
76 | |||
77 | /* L0 : [1000/200/100][166/83][133/66][200/200] */ | ||
78 | {0, 4, 4, 1, 3, 1, 4, 1, 3, 0, 0}, | ||
79 | |||
80 | /* L1 : [800/200/100][166/83][133/66][200/200] */ | ||
81 | {0, 3, 3, 1, 3, 1, 4, 1, 3, 0, 0}, | ||
82 | |||
83 | /* L2 : [400/200/100][166/83][133/66][200/200] */ | ||
84 | {1, 3, 1, 1, 3, 1, 4, 1, 3, 0, 0}, | ||
85 | |||
86 | /* L3 : [200/200/100][166/83][133/66][200/200] */ | ||
87 | {3, 3, 1, 1, 3, 1, 4, 1, 3, 0, 0}, | ||
88 | |||
89 | /* L4 : [100/100/100][83/83][66/66][100/100] */ | ||
90 | {7, 7, 0, 0, 7, 0, 9, 0, 7, 0, 0}, | ||
91 | }; | ||
92 | |||
93 | /* | ||
94 | * This function set DRAM refresh counter | ||
95 | * accoriding to operating frequency of DRAM | ||
96 | * ch: DMC port number 0 or 1 | ||
97 | * freq: Operating frequency of DRAM(KHz) | ||
98 | */ | ||
99 | static void s5pv210_set_refresh(enum s5pv210_dmc_port ch, unsigned long freq) | ||
100 | { | ||
101 | unsigned long tmp, tmp1; | ||
102 | void __iomem *reg = NULL; | ||
103 | |||
104 | if (ch == DMC0) | ||
105 | reg = (S5P_VA_DMC0 + 0x30); | ||
106 | else if (ch == DMC1) | ||
107 | reg = (S5P_VA_DMC1 + 0x30); | ||
108 | else | ||
109 | printk(KERN_ERR "Cannot find DMC port\n"); | ||
110 | |||
111 | /* Find current DRAM frequency */ | ||
112 | tmp = s5pv210_dram_conf[ch].freq; | ||
113 | |||
114 | do_div(tmp, freq); | ||
115 | |||
116 | tmp1 = s5pv210_dram_conf[ch].refresh; | ||
117 | |||
118 | do_div(tmp1, tmp); | ||
119 | |||
120 | __raw_writel(tmp1, reg); | ||
121 | } | ||
122 | |||
123 | int s5pv210_verify_speed(struct cpufreq_policy *policy) | ||
124 | { | ||
125 | if (policy->cpu) | ||
126 | return -EINVAL; | ||
127 | |||
128 | return cpufreq_frequency_table_verify(policy, s5pv210_freq_table); | ||
129 | } | ||
130 | |||
131 | unsigned int s5pv210_getspeed(unsigned int cpu) | ||
132 | { | ||
133 | if (cpu) | ||
134 | return 0; | ||
135 | |||
136 | return clk_get_rate(cpu_clk) / 1000; | ||
137 | } | ||
138 | |||
139 | static int s5pv210_target(struct cpufreq_policy *policy, | ||
140 | unsigned int target_freq, | ||
141 | unsigned int relation) | ||
142 | { | ||
143 | unsigned long reg; | ||
144 | unsigned int index, priv_index; | ||
145 | unsigned int pll_changing = 0; | ||
146 | unsigned int bus_speed_changing = 0; | ||
147 | |||
148 | freqs.old = s5pv210_getspeed(0); | ||
149 | |||
150 | if (cpufreq_frequency_table_target(policy, s5pv210_freq_table, | ||
151 | target_freq, relation, &index)) | ||
152 | return -EINVAL; | ||
153 | |||
154 | freqs.new = s5pv210_freq_table[index].frequency; | ||
155 | freqs.cpu = 0; | ||
156 | |||
157 | if (freqs.new == freqs.old) | ||
158 | return 0; | ||
159 | |||
160 | /* Finding current running level index */ | ||
161 | if (cpufreq_frequency_table_target(policy, s5pv210_freq_table, | ||
162 | freqs.old, relation, &priv_index)) | ||
163 | return -EINVAL; | ||
164 | |||
165 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | ||
166 | |||
167 | if (freqs.new > freqs.old) { | ||
168 | /* Voltage up: will be implemented */ | ||
169 | } | ||
170 | |||
171 | /* Check if there need to change PLL */ | ||
172 | if ((index == L0) || (priv_index == L0)) | ||
173 | pll_changing = 1; | ||
174 | |||
175 | /* Check if there need to change System bus clock */ | ||
176 | if ((index == L4) || (priv_index == L4)) | ||
177 | bus_speed_changing = 1; | ||
178 | |||
179 | if (bus_speed_changing) { | ||
180 | /* | ||
181 | * Reconfigure DRAM refresh counter value for minimum | ||
182 | * temporary clock while changing divider. | ||
183 | * expected clock is 83Mhz : 7.8usec/(1/83Mhz) = 0x287 | ||
184 | */ | ||
185 | if (pll_changing) | ||
186 | s5pv210_set_refresh(DMC1, 83000); | ||
187 | else | ||
188 | s5pv210_set_refresh(DMC1, 100000); | ||
189 | |||
190 | s5pv210_set_refresh(DMC0, 83000); | ||
191 | } | ||
192 | |||
193 | /* | ||
194 | * APLL should be changed in this level | ||
195 | * APLL -> MPLL(for stable transition) -> APLL | ||
196 | * Some clock source's clock API are not prepared. | ||
197 | * Do not use clock API in below code. | ||
198 | */ | ||
199 | if (pll_changing) { | ||
200 | /* | ||
201 | * 1. Temporary Change divider for MFC and G3D | ||
202 | * SCLKA2M(200/1=200)->(200/4=50)Mhz | ||
203 | */ | ||
204 | reg = __raw_readl(S5P_CLK_DIV2); | ||
205 | reg &= ~(S5P_CLKDIV2_G3D_MASK | S5P_CLKDIV2_MFC_MASK); | ||
206 | reg |= (3 << S5P_CLKDIV2_G3D_SHIFT) | | ||
207 | (3 << S5P_CLKDIV2_MFC_SHIFT); | ||
208 | __raw_writel(reg, S5P_CLK_DIV2); | ||
209 | |||
210 | /* For MFC, G3D dividing */ | ||
211 | do { | ||
212 | reg = __raw_readl(S5P_CLKDIV_STAT0); | ||
213 | } while (reg & ((1 << 16) | (1 << 17))); | ||
214 | |||
215 | /* | ||
216 | * 2. Change SCLKA2M(200Mhz)to SCLKMPLL in MFC_MUX, G3D MUX | ||
217 | * (200/4=50)->(667/4=166)Mhz | ||
218 | */ | ||
219 | reg = __raw_readl(S5P_CLK_SRC2); | ||
220 | reg &= ~(S5P_CLKSRC2_G3D_MASK | S5P_CLKSRC2_MFC_MASK); | ||
221 | reg |= (1 << S5P_CLKSRC2_G3D_SHIFT) | | ||
222 | (1 << S5P_CLKSRC2_MFC_SHIFT); | ||
223 | __raw_writel(reg, S5P_CLK_SRC2); | ||
224 | |||
225 | do { | ||
226 | reg = __raw_readl(S5P_CLKMUX_STAT1); | ||
227 | } while (reg & ((1 << 7) | (1 << 3))); | ||
228 | |||
229 | /* | ||
230 | * 3. DMC1 refresh count for 133Mhz if (index == L4) is | ||
231 | * true refresh counter is already programed in upper | ||
232 | * code. 0x287@83Mhz | ||
233 | */ | ||
234 | if (!bus_speed_changing) | ||
235 | s5pv210_set_refresh(DMC1, 133000); | ||
236 | |||
237 | /* 4. SCLKAPLL -> SCLKMPLL */ | ||
238 | reg = __raw_readl(S5P_CLK_SRC0); | ||
239 | reg &= ~(S5P_CLKSRC0_MUX200_MASK); | ||
240 | reg |= (0x1 << S5P_CLKSRC0_MUX200_SHIFT); | ||
241 | __raw_writel(reg, S5P_CLK_SRC0); | ||
242 | |||
243 | do { | ||
244 | reg = __raw_readl(S5P_CLKMUX_STAT0); | ||
245 | } while (reg & (0x1 << 18)); | ||
246 | |||
247 | } | ||
248 | |||
249 | /* Change divider */ | ||
250 | reg = __raw_readl(S5P_CLK_DIV0); | ||
251 | |||
252 | reg &= ~(S5P_CLKDIV0_APLL_MASK | S5P_CLKDIV0_A2M_MASK | | ||
253 | S5P_CLKDIV0_HCLK200_MASK | S5P_CLKDIV0_PCLK100_MASK | | ||
254 | S5P_CLKDIV0_HCLK166_MASK | S5P_CLKDIV0_PCLK83_MASK | | ||
255 | S5P_CLKDIV0_HCLK133_MASK | S5P_CLKDIV0_PCLK66_MASK); | ||
256 | |||
257 | reg |= ((clkdiv_val[index][0] << S5P_CLKDIV0_APLL_SHIFT) | | ||
258 | (clkdiv_val[index][1] << S5P_CLKDIV0_A2M_SHIFT) | | ||
259 | (clkdiv_val[index][2] << S5P_CLKDIV0_HCLK200_SHIFT) | | ||
260 | (clkdiv_val[index][3] << S5P_CLKDIV0_PCLK100_SHIFT) | | ||
261 | (clkdiv_val[index][4] << S5P_CLKDIV0_HCLK166_SHIFT) | | ||
262 | (clkdiv_val[index][5] << S5P_CLKDIV0_PCLK83_SHIFT) | | ||
263 | (clkdiv_val[index][6] << S5P_CLKDIV0_HCLK133_SHIFT) | | ||
264 | (clkdiv_val[index][7] << S5P_CLKDIV0_PCLK66_SHIFT)); | ||
265 | |||
266 | __raw_writel(reg, S5P_CLK_DIV0); | ||
267 | |||
268 | do { | ||
269 | reg = __raw_readl(S5P_CLKDIV_STAT0); | ||
270 | } while (reg & 0xff); | ||
271 | |||
272 | /* ARM MCS value changed */ | ||
273 | reg = __raw_readl(S5P_ARM_MCS_CON); | ||
274 | reg &= ~0x3; | ||
275 | if (index >= L3) | ||
276 | reg |= 0x3; | ||
277 | else | ||
278 | reg |= 0x1; | ||
279 | |||
280 | __raw_writel(reg, S5P_ARM_MCS_CON); | ||
281 | |||
282 | if (pll_changing) { | ||
283 | /* 5. Set Lock time = 30us*24Mhz = 0x2cf */ | ||
284 | __raw_writel(0x2cf, S5P_APLL_LOCK); | ||
285 | |||
286 | /* | ||
287 | * 6. Turn on APLL | ||
288 | * 6-1. Set PMS values | ||
289 | * 6-2. Wait untile the PLL is locked | ||
290 | */ | ||
291 | if (index == L0) | ||
292 | __raw_writel(APLL_VAL_1000, S5P_APLL_CON); | ||
293 | else | ||
294 | __raw_writel(APLL_VAL_800, S5P_APLL_CON); | ||
295 | |||
296 | do { | ||
297 | reg = __raw_readl(S5P_APLL_CON); | ||
298 | } while (!(reg & (0x1 << 29))); | ||
299 | |||
300 | /* | ||
301 | * 7. Change souce clock from SCLKMPLL(667Mhz) | ||
302 | * to SCLKA2M(200Mhz) in MFC_MUX and G3D MUX | ||
303 | * (667/4=166)->(200/4=50)Mhz | ||
304 | */ | ||
305 | reg = __raw_readl(S5P_CLK_SRC2); | ||
306 | reg &= ~(S5P_CLKSRC2_G3D_MASK | S5P_CLKSRC2_MFC_MASK); | ||
307 | reg |= (0 << S5P_CLKSRC2_G3D_SHIFT) | | ||
308 | (0 << S5P_CLKSRC2_MFC_SHIFT); | ||
309 | __raw_writel(reg, S5P_CLK_SRC2); | ||
310 | |||
311 | do { | ||
312 | reg = __raw_readl(S5P_CLKMUX_STAT1); | ||
313 | } while (reg & ((1 << 7) | (1 << 3))); | ||
314 | |||
315 | /* | ||
316 | * 8. Change divider for MFC and G3D | ||
317 | * (200/4=50)->(200/1=200)Mhz | ||
318 | */ | ||
319 | reg = __raw_readl(S5P_CLK_DIV2); | ||
320 | reg &= ~(S5P_CLKDIV2_G3D_MASK | S5P_CLKDIV2_MFC_MASK); | ||
321 | reg |= (clkdiv_val[index][10] << S5P_CLKDIV2_G3D_SHIFT) | | ||
322 | (clkdiv_val[index][9] << S5P_CLKDIV2_MFC_SHIFT); | ||
323 | __raw_writel(reg, S5P_CLK_DIV2); | ||
324 | |||
325 | /* For MFC, G3D dividing */ | ||
326 | do { | ||
327 | reg = __raw_readl(S5P_CLKDIV_STAT0); | ||
328 | } while (reg & ((1 << 16) | (1 << 17))); | ||
329 | |||
330 | /* 9. Change MPLL to APLL in MSYS_MUX */ | ||
331 | reg = __raw_readl(S5P_CLK_SRC0); | ||
332 | reg &= ~(S5P_CLKSRC0_MUX200_MASK); | ||
333 | reg |= (0x0 << S5P_CLKSRC0_MUX200_SHIFT); | ||
334 | __raw_writel(reg, S5P_CLK_SRC0); | ||
335 | |||
336 | do { | ||
337 | reg = __raw_readl(S5P_CLKMUX_STAT0); | ||
338 | } while (reg & (0x1 << 18)); | ||
339 | |||
340 | /* | ||
341 | * 10. DMC1 refresh counter | ||
342 | * L4 : DMC1 = 100Mhz 7.8us/(1/100) = 0x30c | ||
343 | * Others : DMC1 = 200Mhz 7.8us/(1/200) = 0x618 | ||
344 | */ | ||
345 | if (!bus_speed_changing) | ||
346 | s5pv210_set_refresh(DMC1, 200000); | ||
347 | } | ||
348 | |||
349 | /* | ||
350 | * L4 level need to change memory bus speed, hence onedram clock divier | ||
351 | * and memory refresh parameter should be changed | ||
352 | */ | ||
353 | if (bus_speed_changing) { | ||
354 | reg = __raw_readl(S5P_CLK_DIV6); | ||
355 | reg &= ~S5P_CLKDIV6_ONEDRAM_MASK; | ||
356 | reg |= (clkdiv_val[index][8] << S5P_CLKDIV6_ONEDRAM_SHIFT); | ||
357 | __raw_writel(reg, S5P_CLK_DIV6); | ||
358 | |||
359 | do { | ||
360 | reg = __raw_readl(S5P_CLKDIV_STAT1); | ||
361 | } while (reg & (1 << 15)); | ||
362 | |||
363 | /* Reconfigure DRAM refresh counter value */ | ||
364 | if (index != L4) { | ||
365 | /* | ||
366 | * DMC0 : 166Mhz | ||
367 | * DMC1 : 200Mhz | ||
368 | */ | ||
369 | s5pv210_set_refresh(DMC0, 166000); | ||
370 | s5pv210_set_refresh(DMC1, 200000); | ||
371 | } else { | ||
372 | /* | ||
373 | * DMC0 : 83Mhz | ||
374 | * DMC1 : 100Mhz | ||
375 | */ | ||
376 | s5pv210_set_refresh(DMC0, 83000); | ||
377 | s5pv210_set_refresh(DMC1, 100000); | ||
378 | } | ||
379 | } | ||
380 | |||
381 | if (freqs.new < freqs.old) { | ||
382 | /* Voltage down: will be implemented */ | ||
383 | } | ||
384 | |||
385 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | ||
386 | |||
387 | printk(KERN_DEBUG "Perf changed[L%d]\n", index); | ||
388 | |||
389 | return 0; | ||
390 | } | ||
391 | |||
392 | #ifdef CONFIG_PM | ||
393 | static int s5pv210_cpufreq_suspend(struct cpufreq_policy *policy, | ||
394 | pm_message_t pmsg) | ||
395 | { | ||
396 | return 0; | ||
397 | } | ||
398 | |||
399 | static int s5pv210_cpufreq_resume(struct cpufreq_policy *policy) | ||
400 | { | ||
401 | return 0; | ||
402 | } | ||
403 | #endif | ||
404 | |||
405 | static int check_mem_type(void __iomem *dmc_reg) | ||
406 | { | ||
407 | unsigned long val; | ||
408 | |||
409 | val = __raw_readl(dmc_reg + 0x4); | ||
410 | val = (val & (0xf << 8)); | ||
411 | |||
412 | return val >> 8; | ||
413 | } | ||
414 | |||
415 | static int __init s5pv210_cpu_init(struct cpufreq_policy *policy) | ||
416 | { | ||
417 | unsigned long mem_type; | ||
418 | |||
419 | cpu_clk = clk_get(NULL, "armclk"); | ||
420 | if (IS_ERR(cpu_clk)) | ||
421 | return PTR_ERR(cpu_clk); | ||
422 | |||
423 | dmc0_clk = clk_get(NULL, "sclk_dmc0"); | ||
424 | if (IS_ERR(dmc0_clk)) { | ||
425 | clk_put(cpu_clk); | ||
426 | return PTR_ERR(dmc0_clk); | ||
427 | } | ||
428 | |||
429 | dmc1_clk = clk_get(NULL, "hclk_msys"); | ||
430 | if (IS_ERR(dmc1_clk)) { | ||
431 | clk_put(dmc0_clk); | ||
432 | clk_put(cpu_clk); | ||
433 | return PTR_ERR(dmc1_clk); | ||
434 | } | ||
435 | |||
436 | if (policy->cpu != 0) | ||
437 | return -EINVAL; | ||
438 | |||
439 | /* | ||
440 | * check_mem_type : This driver only support LPDDR & LPDDR2. | ||
441 | * other memory type is not supported. | ||
442 | */ | ||
443 | mem_type = check_mem_type(S5P_VA_DMC0); | ||
444 | |||
445 | if ((mem_type != LPDDR) && (mem_type != LPDDR2)) { | ||
446 | printk(KERN_ERR "CPUFreq doesn't support this memory type\n"); | ||
447 | return -EINVAL; | ||
448 | } | ||
449 | |||
450 | /* Find current refresh counter and frequency each DMC */ | ||
451 | s5pv210_dram_conf[0].refresh = (__raw_readl(S5P_VA_DMC0 + 0x30) * 1000); | ||
452 | s5pv210_dram_conf[0].freq = clk_get_rate(dmc0_clk); | ||
453 | |||
454 | s5pv210_dram_conf[1].refresh = (__raw_readl(S5P_VA_DMC1 + 0x30) * 1000); | ||
455 | s5pv210_dram_conf[1].freq = clk_get_rate(dmc1_clk); | ||
456 | |||
457 | policy->cur = policy->min = policy->max = s5pv210_getspeed(0); | ||
458 | |||
459 | cpufreq_frequency_table_get_attr(s5pv210_freq_table, policy->cpu); | ||
460 | |||
461 | policy->cpuinfo.transition_latency = 40000; | ||
462 | |||
463 | return cpufreq_frequency_table_cpuinfo(policy, s5pv210_freq_table); | ||
464 | } | ||
465 | |||
466 | static struct cpufreq_driver s5pv210_driver = { | ||
467 | .flags = CPUFREQ_STICKY, | ||
468 | .verify = s5pv210_verify_speed, | ||
469 | .target = s5pv210_target, | ||
470 | .get = s5pv210_getspeed, | ||
471 | .init = s5pv210_cpu_init, | ||
472 | .name = "s5pv210", | ||
473 | #ifdef CONFIG_PM | ||
474 | .suspend = s5pv210_cpufreq_suspend, | ||
475 | .resume = s5pv210_cpufreq_resume, | ||
476 | #endif | ||
477 | }; | ||
478 | |||
479 | static int __init s5pv210_cpufreq_init(void) | ||
480 | { | ||
481 | return cpufreq_register_driver(&s5pv210_driver); | ||
482 | } | ||
483 | |||
484 | late_initcall(s5pv210_cpufreq_init); | ||
diff --git a/arch/arm/mach-s5pv210/dev-audio.c b/arch/arm/mach-s5pv210/dev-audio.c index 21dc6cf955c3..1303fcb12b51 100644 --- a/arch/arm/mach-s5pv210/dev-audio.c +++ b/arch/arm/mach-s5pv210/dev-audio.c | |||
@@ -24,29 +24,15 @@ static int s5pv210_cfg_i2s(struct platform_device *pdev) | |||
24 | /* configure GPIO for i2s port */ | 24 | /* configure GPIO for i2s port */ |
25 | switch (pdev->id) { | 25 | switch (pdev->id) { |
26 | case 1: | 26 | case 1: |
27 | s3c_gpio_cfgpin(S5PV210_GPC0(0), S3C_GPIO_SFN(2)); | 27 | s3c_gpio_cfgpin_range(S5PV210_GPC0(0), 5, S3C_GPIO_SFN(2)); |
28 | s3c_gpio_cfgpin(S5PV210_GPC0(1), S3C_GPIO_SFN(2)); | ||
29 | s3c_gpio_cfgpin(S5PV210_GPC0(2), S3C_GPIO_SFN(2)); | ||
30 | s3c_gpio_cfgpin(S5PV210_GPC0(3), S3C_GPIO_SFN(2)); | ||
31 | s3c_gpio_cfgpin(S5PV210_GPC0(4), S3C_GPIO_SFN(2)); | ||
32 | break; | 28 | break; |
33 | 29 | ||
34 | case 2: | 30 | case 2: |
35 | s3c_gpio_cfgpin(S5PV210_GPC1(0), S3C_GPIO_SFN(4)); | 31 | s3c_gpio_cfgpin_range(S5PV210_GPC1(0), 5, S3C_GPIO_SFN(4)); |
36 | s3c_gpio_cfgpin(S5PV210_GPC1(1), S3C_GPIO_SFN(4)); | ||
37 | s3c_gpio_cfgpin(S5PV210_GPC1(2), S3C_GPIO_SFN(4)); | ||
38 | s3c_gpio_cfgpin(S5PV210_GPC1(3), S3C_GPIO_SFN(4)); | ||
39 | s3c_gpio_cfgpin(S5PV210_GPC1(4), S3C_GPIO_SFN(4)); | ||
40 | break; | 32 | break; |
41 | 33 | ||
42 | case -1: | 34 | case -1: |
43 | s3c_gpio_cfgpin(S5PV210_GPI(0), S3C_GPIO_SFN(2)); | 35 | s3c_gpio_cfgpin_range(S5PV210_GPI(0), 7, S3C_GPIO_SFN(2)); |
44 | s3c_gpio_cfgpin(S5PV210_GPI(1), S3C_GPIO_SFN(2)); | ||
45 | s3c_gpio_cfgpin(S5PV210_GPI(2), S3C_GPIO_SFN(2)); | ||
46 | s3c_gpio_cfgpin(S5PV210_GPI(3), S3C_GPIO_SFN(2)); | ||
47 | s3c_gpio_cfgpin(S5PV210_GPI(4), S3C_GPIO_SFN(2)); | ||
48 | s3c_gpio_cfgpin(S5PV210_GPI(5), S3C_GPIO_SFN(2)); | ||
49 | s3c_gpio_cfgpin(S5PV210_GPI(6), S3C_GPIO_SFN(2)); | ||
50 | break; | 36 | break; |
51 | 37 | ||
52 | default: | 38 | default: |
@@ -151,25 +137,13 @@ static int s5pv210_pcm_cfg_gpio(struct platform_device *pdev) | |||
151 | { | 137 | { |
152 | switch (pdev->id) { | 138 | switch (pdev->id) { |
153 | case 0: | 139 | case 0: |
154 | s3c_gpio_cfgpin(S5PV210_GPI(0), S3C_GPIO_SFN(3)); | 140 | s3c_gpio_cfgpin_range(S5PV210_GPI(0), 5, S3C_GPIO_SFN(3)); |
155 | s3c_gpio_cfgpin(S5PV210_GPI(1), S3C_GPIO_SFN(3)); | ||
156 | s3c_gpio_cfgpin(S5PV210_GPI(2), S3C_GPIO_SFN(3)); | ||
157 | s3c_gpio_cfgpin(S5PV210_GPI(3), S3C_GPIO_SFN(3)); | ||
158 | s3c_gpio_cfgpin(S5PV210_GPI(4), S3C_GPIO_SFN(3)); | ||
159 | break; | 141 | break; |
160 | case 1: | 142 | case 1: |
161 | s3c_gpio_cfgpin(S5PV210_GPC0(0), S3C_GPIO_SFN(3)); | 143 | s3c_gpio_cfgpin_range(S5PV210_GPC0(0), 5, S3C_GPIO_SFN(3)); |
162 | s3c_gpio_cfgpin(S5PV210_GPC0(1), S3C_GPIO_SFN(3)); | ||
163 | s3c_gpio_cfgpin(S5PV210_GPC0(2), S3C_GPIO_SFN(3)); | ||
164 | s3c_gpio_cfgpin(S5PV210_GPC0(3), S3C_GPIO_SFN(3)); | ||
165 | s3c_gpio_cfgpin(S5PV210_GPC0(4), S3C_GPIO_SFN(3)); | ||
166 | break; | 144 | break; |
167 | case 2: | 145 | case 2: |
168 | s3c_gpio_cfgpin(S5PV210_GPC1(0), S3C_GPIO_SFN(2)); | 146 | s3c_gpio_cfgpin_range(S5PV210_GPC1(0), 5, S3C_GPIO_SFN(2)); |
169 | s3c_gpio_cfgpin(S5PV210_GPC1(1), S3C_GPIO_SFN(2)); | ||
170 | s3c_gpio_cfgpin(S5PV210_GPC1(2), S3C_GPIO_SFN(2)); | ||
171 | s3c_gpio_cfgpin(S5PV210_GPC1(3), S3C_GPIO_SFN(2)); | ||
172 | s3c_gpio_cfgpin(S5PV210_GPC1(4), S3C_GPIO_SFN(2)); | ||
173 | break; | 147 | break; |
174 | default: | 148 | default: |
175 | printk(KERN_DEBUG "Invalid PCM Controller number!"); | 149 | printk(KERN_DEBUG "Invalid PCM Controller number!"); |
@@ -271,13 +245,7 @@ struct platform_device s5pv210_device_pcm2 = { | |||
271 | 245 | ||
272 | static int s5pv210_ac97_cfg_gpio(struct platform_device *pdev) | 246 | static int s5pv210_ac97_cfg_gpio(struct platform_device *pdev) |
273 | { | 247 | { |
274 | s3c_gpio_cfgpin(S5PV210_GPC0(0), S3C_GPIO_SFN(4)); | 248 | return s3c_gpio_cfgpin_range(S5PV210_GPC0(0), 5, S3C_GPIO_SFN(4)); |
275 | s3c_gpio_cfgpin(S5PV210_GPC0(1), S3C_GPIO_SFN(4)); | ||
276 | s3c_gpio_cfgpin(S5PV210_GPC0(2), S3C_GPIO_SFN(4)); | ||
277 | s3c_gpio_cfgpin(S5PV210_GPC0(3), S3C_GPIO_SFN(4)); | ||
278 | s3c_gpio_cfgpin(S5PV210_GPC0(4), S3C_GPIO_SFN(4)); | ||
279 | |||
280 | return 0; | ||
281 | } | 249 | } |
282 | 250 | ||
283 | static struct resource s5pv210_ac97_resource[] = { | 251 | static struct resource s5pv210_ac97_resource[] = { |
@@ -325,3 +293,43 @@ struct platform_device s5pv210_device_ac97 = { | |||
325 | .coherent_dma_mask = DMA_BIT_MASK(32), | 293 | .coherent_dma_mask = DMA_BIT_MASK(32), |
326 | }, | 294 | }, |
327 | }; | 295 | }; |
296 | |||
297 | /* S/PDIF Controller platform_device */ | ||
298 | |||
299 | static int s5pv210_spdif_cfg_gpio(struct platform_device *pdev) | ||
300 | { | ||
301 | s3c_gpio_cfgpin_range(S5PV210_GPC1(0), 2, S3C_GPIO_SFN(3)); | ||
302 | |||
303 | return 0; | ||
304 | } | ||
305 | |||
306 | static struct resource s5pv210_spdif_resource[] = { | ||
307 | [0] = { | ||
308 | .start = S5PV210_PA_SPDIF, | ||
309 | .end = S5PV210_PA_SPDIF + 0x100 - 1, | ||
310 | .flags = IORESOURCE_MEM, | ||
311 | }, | ||
312 | [1] = { | ||
313 | .start = DMACH_SPDIF, | ||
314 | .end = DMACH_SPDIF, | ||
315 | .flags = IORESOURCE_DMA, | ||
316 | }, | ||
317 | }; | ||
318 | |||
319 | static struct s3c_audio_pdata samsung_spdif_pdata = { | ||
320 | .cfg_gpio = s5pv210_spdif_cfg_gpio, | ||
321 | }; | ||
322 | |||
323 | static u64 s5pv210_spdif_dmamask = DMA_BIT_MASK(32); | ||
324 | |||
325 | struct platform_device s5pv210_device_spdif = { | ||
326 | .name = "samsung-spdif", | ||
327 | .id = -1, | ||
328 | .num_resources = ARRAY_SIZE(s5pv210_spdif_resource), | ||
329 | .resource = s5pv210_spdif_resource, | ||
330 | .dev = { | ||
331 | .platform_data = &samsung_spdif_pdata, | ||
332 | .dma_mask = &s5pv210_spdif_dmamask, | ||
333 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
334 | }, | ||
335 | }; | ||
diff --git a/arch/arm/mach-s5pv210/dev-spi.c b/arch/arm/mach-s5pv210/dev-spi.c index 826cdbc43e20..e3249a47e3b1 100644 --- a/arch/arm/mach-s5pv210/dev-spi.c +++ b/arch/arm/mach-s5pv210/dev-spi.c | |||
@@ -35,23 +35,15 @@ static char *spi_src_clks[] = { | |||
35 | */ | 35 | */ |
36 | static int s5pv210_spi_cfg_gpio(struct platform_device *pdev) | 36 | static int s5pv210_spi_cfg_gpio(struct platform_device *pdev) |
37 | { | 37 | { |
38 | unsigned int base; | ||
39 | |||
38 | switch (pdev->id) { | 40 | switch (pdev->id) { |
39 | case 0: | 41 | case 0: |
40 | s3c_gpio_cfgpin(S5PV210_GPB(0), S3C_GPIO_SFN(2)); | 42 | base = S5PV210_GPB(0); |
41 | s3c_gpio_cfgpin(S5PV210_GPB(1), S3C_GPIO_SFN(2)); | ||
42 | s3c_gpio_cfgpin(S5PV210_GPB(2), S3C_GPIO_SFN(2)); | ||
43 | s3c_gpio_setpull(S5PV210_GPB(0), S3C_GPIO_PULL_UP); | ||
44 | s3c_gpio_setpull(S5PV210_GPB(1), S3C_GPIO_PULL_UP); | ||
45 | s3c_gpio_setpull(S5PV210_GPB(2), S3C_GPIO_PULL_UP); | ||
46 | break; | 43 | break; |
47 | 44 | ||
48 | case 1: | 45 | case 1: |
49 | s3c_gpio_cfgpin(S5PV210_GPB(4), S3C_GPIO_SFN(2)); | 46 | base = S5PV210_GPB(4); |
50 | s3c_gpio_cfgpin(S5PV210_GPB(5), S3C_GPIO_SFN(2)); | ||
51 | s3c_gpio_cfgpin(S5PV210_GPB(6), S3C_GPIO_SFN(2)); | ||
52 | s3c_gpio_setpull(S5PV210_GPB(4), S3C_GPIO_PULL_UP); | ||
53 | s3c_gpio_setpull(S5PV210_GPB(5), S3C_GPIO_PULL_UP); | ||
54 | s3c_gpio_setpull(S5PV210_GPB(6), S3C_GPIO_PULL_UP); | ||
55 | break; | 47 | break; |
56 | 48 | ||
57 | default: | 49 | default: |
@@ -59,6 +51,9 @@ static int s5pv210_spi_cfg_gpio(struct platform_device *pdev) | |||
59 | return -EINVAL; | 51 | return -EINVAL; |
60 | } | 52 | } |
61 | 53 | ||
54 | s3c_gpio_cfgall_range(base, 3, | ||
55 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); | ||
56 | |||
62 | return 0; | 57 | return 0; |
63 | } | 58 | } |
64 | 59 | ||
diff --git a/arch/arm/mach-s5pv210/dma.c b/arch/arm/mach-s5pv210/dma.c index 778ad5fe231a..497d3439a142 100644 --- a/arch/arm/mach-s5pv210/dma.c +++ b/arch/arm/mach-s5pv210/dma.c | |||
@@ -82,7 +82,7 @@ static struct s3c_pl330_platdata s5pv210_pdma0_pdata = { | |||
82 | 82 | ||
83 | static struct platform_device s5pv210_device_pdma0 = { | 83 | static struct platform_device s5pv210_device_pdma0 = { |
84 | .name = "s3c-pl330", | 84 | .name = "s3c-pl330", |
85 | .id = 1, | 85 | .id = 0, |
86 | .num_resources = ARRAY_SIZE(s5pv210_pdma0_resource), | 86 | .num_resources = ARRAY_SIZE(s5pv210_pdma0_resource), |
87 | .resource = s5pv210_pdma0_resource, | 87 | .resource = s5pv210_pdma0_resource, |
88 | .dev = { | 88 | .dev = { |
@@ -144,7 +144,7 @@ static struct s3c_pl330_platdata s5pv210_pdma1_pdata = { | |||
144 | 144 | ||
145 | static struct platform_device s5pv210_device_pdma1 = { | 145 | static struct platform_device s5pv210_device_pdma1 = { |
146 | .name = "s3c-pl330", | 146 | .name = "s3c-pl330", |
147 | .id = 2, | 147 | .id = 1, |
148 | .num_resources = ARRAY_SIZE(s5pv210_pdma1_resource), | 148 | .num_resources = ARRAY_SIZE(s5pv210_pdma1_resource), |
149 | .resource = s5pv210_pdma1_resource, | 149 | .resource = s5pv210_pdma1_resource, |
150 | .dev = { | 150 | .dev = { |
diff --git a/arch/arm/mach-s5pv210/gpiolib.c b/arch/arm/mach-s5pv210/gpiolib.c index 0d459112d039..ab673effd767 100644 --- a/arch/arm/mach-s5pv210/gpiolib.c +++ b/arch/arm/mach-s5pv210/gpiolib.c | |||
@@ -150,6 +150,7 @@ static struct s3c_gpio_chip s5pv210_gpio_4bit[] = { | |||
150 | .label = "GPG3", | 150 | .label = "GPG3", |
151 | }, | 151 | }, |
152 | }, { | 152 | }, { |
153 | .config = &gpio_cfg_noint, | ||
153 | .chip = { | 154 | .chip = { |
154 | .base = S5PV210_GPI(0), | 155 | .base = S5PV210_GPI(0), |
155 | .ngpio = S5PV210_GPIO_I_NR, | 156 | .ngpio = S5PV210_GPIO_I_NR, |
@@ -223,34 +224,42 @@ static struct s3c_gpio_chip s5pv210_gpio_4bit[] = { | |||
223 | }, { | 224 | }, { |
224 | .base = (S5P_VA_GPIO + 0xC00), | 225 | .base = (S5P_VA_GPIO + 0xC00), |
225 | .config = &gpio_cfg_noint, | 226 | .config = &gpio_cfg_noint, |
227 | .irq_base = IRQ_EINT(0), | ||
226 | .chip = { | 228 | .chip = { |
227 | .base = S5PV210_GPH0(0), | 229 | .base = S5PV210_GPH0(0), |
228 | .ngpio = S5PV210_GPIO_H0_NR, | 230 | .ngpio = S5PV210_GPIO_H0_NR, |
229 | .label = "GPH0", | 231 | .label = "GPH0", |
232 | .to_irq = samsung_gpiolib_to_irq, | ||
230 | }, | 233 | }, |
231 | }, { | 234 | }, { |
232 | .base = (S5P_VA_GPIO + 0xC20), | 235 | .base = (S5P_VA_GPIO + 0xC20), |
233 | .config = &gpio_cfg_noint, | 236 | .config = &gpio_cfg_noint, |
237 | .irq_base = IRQ_EINT(8), | ||
234 | .chip = { | 238 | .chip = { |
235 | .base = S5PV210_GPH1(0), | 239 | .base = S5PV210_GPH1(0), |
236 | .ngpio = S5PV210_GPIO_H1_NR, | 240 | .ngpio = S5PV210_GPIO_H1_NR, |
237 | .label = "GPH1", | 241 | .label = "GPH1", |
242 | .to_irq = samsung_gpiolib_to_irq, | ||
238 | }, | 243 | }, |
239 | }, { | 244 | }, { |
240 | .base = (S5P_VA_GPIO + 0xC40), | 245 | .base = (S5P_VA_GPIO + 0xC40), |
241 | .config = &gpio_cfg_noint, | 246 | .config = &gpio_cfg_noint, |
247 | .irq_base = IRQ_EINT(16), | ||
242 | .chip = { | 248 | .chip = { |
243 | .base = S5PV210_GPH2(0), | 249 | .base = S5PV210_GPH2(0), |
244 | .ngpio = S5PV210_GPIO_H2_NR, | 250 | .ngpio = S5PV210_GPIO_H2_NR, |
245 | .label = "GPH2", | 251 | .label = "GPH2", |
252 | .to_irq = samsung_gpiolib_to_irq, | ||
246 | }, | 253 | }, |
247 | }, { | 254 | }, { |
248 | .base = (S5P_VA_GPIO + 0xC60), | 255 | .base = (S5P_VA_GPIO + 0xC60), |
249 | .config = &gpio_cfg_noint, | 256 | .config = &gpio_cfg_noint, |
257 | .irq_base = IRQ_EINT(24), | ||
250 | .chip = { | 258 | .chip = { |
251 | .base = S5PV210_GPH3(0), | 259 | .base = S5PV210_GPH3(0), |
252 | .ngpio = S5PV210_GPIO_H3_NR, | 260 | .ngpio = S5PV210_GPIO_H3_NR, |
253 | .label = "GPH3", | 261 | .label = "GPH3", |
262 | .to_irq = samsung_gpiolib_to_irq, | ||
254 | }, | 263 | }, |
255 | }, | 264 | }, |
256 | }; | 265 | }; |
@@ -259,11 +268,14 @@ static __init int s5pv210_gpiolib_init(void) | |||
259 | { | 268 | { |
260 | struct s3c_gpio_chip *chip = s5pv210_gpio_4bit; | 269 | struct s3c_gpio_chip *chip = s5pv210_gpio_4bit; |
261 | int nr_chips = ARRAY_SIZE(s5pv210_gpio_4bit); | 270 | int nr_chips = ARRAY_SIZE(s5pv210_gpio_4bit); |
271 | int gpioint_group = 0; | ||
262 | int i = 0; | 272 | int i = 0; |
263 | 273 | ||
264 | for (i = 0; i < nr_chips; i++, chip++) { | 274 | for (i = 0; i < nr_chips; i++, chip++) { |
265 | if (chip->config == NULL) | 275 | if (chip->config == NULL) { |
266 | chip->config = &gpio_cfg; | 276 | chip->config = &gpio_cfg; |
277 | chip->group = gpioint_group++; | ||
278 | } | ||
267 | if (chip->base == NULL) | 279 | if (chip->base == NULL) |
268 | chip->base = S5PV210_BANK_BASE(i); | 280 | chip->base = S5PV210_BANK_BASE(i); |
269 | } | 281 | } |
diff --git a/arch/arm/mach-s5pv210/include/mach/irqs.h b/arch/arm/mach-s5pv210/include/mach/irqs.h index e1c020e5a49b..119b95fdc3ce 100644 --- a/arch/arm/mach-s5pv210/include/mach/irqs.h +++ b/arch/arm/mach-s5pv210/include/mach/irqs.h | |||
@@ -55,8 +55,8 @@ | |||
55 | #define IRQ_SPI1 S5P_IRQ_VIC1(16) | 55 | #define IRQ_SPI1 S5P_IRQ_VIC1(16) |
56 | #define IRQ_SPI2 S5P_IRQ_VIC1(17) | 56 | #define IRQ_SPI2 S5P_IRQ_VIC1(17) |
57 | #define IRQ_IRDA S5P_IRQ_VIC1(18) | 57 | #define IRQ_IRDA S5P_IRQ_VIC1(18) |
58 | #define IRQ_CAN0 S5P_IRQ_VIC1(19) | 58 | #define IRQ_IIC2 S5P_IRQ_VIC1(19) |
59 | #define IRQ_CAN1 S5P_IRQ_VIC1(20) | 59 | #define IRQ_IIC3 S5P_IRQ_VIC1(20) |
60 | #define IRQ_HSIRX S5P_IRQ_VIC1(21) | 60 | #define IRQ_HSIRX S5P_IRQ_VIC1(21) |
61 | #define IRQ_HSITX S5P_IRQ_VIC1(22) | 61 | #define IRQ_HSITX S5P_IRQ_VIC1(22) |
62 | #define IRQ_UHOST S5P_IRQ_VIC1(23) | 62 | #define IRQ_UHOST S5P_IRQ_VIC1(23) |
@@ -109,7 +109,7 @@ | |||
109 | 109 | ||
110 | #define IRQ_IPC S5P_IRQ_VIC3(0) | 110 | #define IRQ_IPC S5P_IRQ_VIC3(0) |
111 | #define IRQ_HOSTIF S5P_IRQ_VIC3(1) | 111 | #define IRQ_HOSTIF S5P_IRQ_VIC3(1) |
112 | #define IRQ_MMC3 S5P_IRQ_VIC3(2) | 112 | #define IRQ_HSMMC3 S5P_IRQ_VIC3(2) |
113 | #define IRQ_CEC S5P_IRQ_VIC3(3) | 113 | #define IRQ_CEC S5P_IRQ_VIC3(3) |
114 | #define IRQ_TSI S5P_IRQ_VIC3(4) | 114 | #define IRQ_TSI S5P_IRQ_VIC3(4) |
115 | #define IRQ_MDNIE0 S5P_IRQ_VIC3(5) | 115 | #define IRQ_MDNIE0 S5P_IRQ_VIC3(5) |
@@ -121,8 +121,12 @@ | |||
121 | #define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0)) | 121 | #define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0)) |
122 | #define S5P_EINT_BASE2 (IRQ_VIC_END + 1) | 122 | #define S5P_EINT_BASE2 (IRQ_VIC_END + 1) |
123 | 123 | ||
124 | /* GPIO interrupt */ | ||
125 | #define S5P_GPIOINT_BASE (IRQ_EINT(31) + 1) | ||
126 | #define S5P_GPIOINT_GROUP_MAXNR 22 | ||
127 | |||
124 | /* Set the default NR_IRQS */ | 128 | /* Set the default NR_IRQS */ |
125 | #define NR_IRQS (IRQ_EINT(31) + 1) | 129 | #define NR_IRQS (IRQ_EINT(31) + S5P_GPIOINT_COUNT + 1) |
126 | 130 | ||
127 | /* Compatibility */ | 131 | /* Compatibility */ |
128 | #define IRQ_LCD_FIFO IRQ_LCD0 | 132 | #define IRQ_LCD_FIFO IRQ_LCD0 |
diff --git a/arch/arm/mach-s5pv210/include/mach/map.h b/arch/arm/mach-s5pv210/include/mach/map.h index bd9afd52466a..861d7fe11fc9 100644 --- a/arch/arm/mach-s5pv210/include/mach/map.h +++ b/arch/arm/mach-s5pv210/include/mach/map.h | |||
@@ -57,6 +57,8 @@ | |||
57 | 57 | ||
58 | #define S5P_SZ_UART SZ_256 | 58 | #define S5P_SZ_UART SZ_256 |
59 | 59 | ||
60 | #define S3C_VA_UARTx(x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET)) | ||
61 | |||
60 | #define S5PV210_PA_SROMC (0xE8000000) | 62 | #define S5PV210_PA_SROMC (0xE8000000) |
61 | 63 | ||
62 | #define S5PV210_PA_CFCON (0xE8200000) | 64 | #define S5PV210_PA_CFCON (0xE8200000) |
@@ -73,6 +75,9 @@ | |||
73 | 75 | ||
74 | #define S5PV210_PA_HSMMC(x) (0xEB000000 + ((x) * 0x100000)) | 76 | #define S5PV210_PA_HSMMC(x) (0xEB000000 + ((x) * 0x100000)) |
75 | 77 | ||
78 | #define S5PV210_PA_HSOTG (0xEC000000) | ||
79 | #define S5PV210_PA_HSPHY (0xEC100000) | ||
80 | |||
76 | #define S5PV210_PA_VIC0 (0xF2000000) | 81 | #define S5PV210_PA_VIC0 (0xF2000000) |
77 | #define S5PV210_PA_VIC1 (0xF2100000) | 82 | #define S5PV210_PA_VIC1 (0xF2100000) |
78 | #define S5PV210_PA_VIC2 (0xF2200000) | 83 | #define S5PV210_PA_VIC2 (0xF2200000) |
@@ -81,6 +86,9 @@ | |||
81 | #define S5PV210_PA_SDRAM (0x20000000) | 86 | #define S5PV210_PA_SDRAM (0x20000000) |
82 | #define S5P_PA_SDRAM S5PV210_PA_SDRAM | 87 | #define S5P_PA_SDRAM S5PV210_PA_SDRAM |
83 | 88 | ||
89 | /* S/PDIF */ | ||
90 | #define S5PV210_PA_SPDIF 0xE1100000 | ||
91 | |||
84 | /* I2S */ | 92 | /* I2S */ |
85 | #define S5PV210_PA_IIS0 0xEEE30000 | 93 | #define S5PV210_PA_IIS0 0xEEE30000 |
86 | #define S5PV210_PA_IIS1 0xE2100000 | 94 | #define S5PV210_PA_IIS1 0xE2100000 |
@@ -96,6 +104,9 @@ | |||
96 | 104 | ||
97 | #define S5PV210_PA_ADC (0xE1700000) | 105 | #define S5PV210_PA_ADC (0xE1700000) |
98 | 106 | ||
107 | #define S5PV210_PA_DMC0 (0xF0000000) | ||
108 | #define S5PV210_PA_DMC1 (0xF1400000) | ||
109 | |||
99 | /* compatibiltiy defines. */ | 110 | /* compatibiltiy defines. */ |
100 | #define S3C_PA_UART S5PV210_PA_UART | 111 | #define S3C_PA_UART S5PV210_PA_UART |
101 | #define S3C_PA_HSMMC0 S5PV210_PA_HSMMC(0) | 112 | #define S3C_PA_HSMMC0 S5PV210_PA_HSMMC(0) |
@@ -108,6 +119,7 @@ | |||
108 | #define S3C_PA_FB S5PV210_PA_FB | 119 | #define S3C_PA_FB S5PV210_PA_FB |
109 | #define S3C_PA_RTC S5PV210_PA_RTC | 120 | #define S3C_PA_RTC S5PV210_PA_RTC |
110 | #define S3C_PA_WDT S5PV210_PA_WATCHDOG | 121 | #define S3C_PA_WDT S5PV210_PA_WATCHDOG |
122 | #define S3C_PA_USB_HSOTG S5PV210_PA_HSOTG | ||
111 | #define S5P_PA_FIMC0 S5PV210_PA_FIMC0 | 123 | #define S5P_PA_FIMC0 S5PV210_PA_FIMC0 |
112 | #define S5P_PA_FIMC1 S5PV210_PA_FIMC1 | 124 | #define S5P_PA_FIMC1 S5PV210_PA_FIMC1 |
113 | #define S5P_PA_FIMC2 S5PV210_PA_FIMC2 | 125 | #define S5P_PA_FIMC2 S5PV210_PA_FIMC2 |
diff --git a/arch/arm/mach-s5pv210/include/mach/pm-core.h b/arch/arm/mach-s5pv210/include/mach/pm-core.h new file mode 100644 index 000000000000..e8d394f8b057 --- /dev/null +++ b/arch/arm/mach-s5pv210/include/mach/pm-core.h | |||
@@ -0,0 +1,43 @@ | |||
1 | /* linux/arch/arm/mach-s5pv210/include/mach/pm-core.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * Based on arch/arm/mach-s3c2410/include/mach/pm-core.h, | ||
7 | * Copyright 2008 Simtec Electronics | ||
8 | * Ben Dooks <ben@simtec.co.uk> | ||
9 | * http://armlinux.simtec.co.uk/ | ||
10 | * | ||
11 | * S5PV210 - PM core support for arch/arm/plat-s5p/pm.c | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or modify | ||
14 | * it under the terms of the GNU General Public License version 2 as | ||
15 | * published by the Free Software Foundation. | ||
16 | */ | ||
17 | |||
18 | static inline void s3c_pm_debug_init_uart(void) | ||
19 | { | ||
20 | /* nothing here yet */ | ||
21 | } | ||
22 | |||
23 | static inline void s3c_pm_arch_prepare_irqs(void) | ||
24 | { | ||
25 | __raw_writel(s3c_irqwake_intmask, S5P_WAKEUP_MASK); | ||
26 | __raw_writel(s3c_irqwake_eintmask, S5P_EINT_WAKEUP_MASK); | ||
27 | } | ||
28 | |||
29 | static inline void s3c_pm_arch_stop_clocks(void) | ||
30 | { | ||
31 | /* nothing here yet */ | ||
32 | } | ||
33 | |||
34 | static inline void s3c_pm_arch_show_resume_irqs(void) | ||
35 | { | ||
36 | /* nothing here yet */ | ||
37 | } | ||
38 | |||
39 | static inline void s3c_pm_arch_update_uart(void __iomem *regs, | ||
40 | struct pm_uart_save *save) | ||
41 | { | ||
42 | /* nothing here yet */ | ||
43 | } | ||
diff --git a/arch/arm/mach-s5pv210/include/mach/regs-clock.h b/arch/arm/mach-s5pv210/include/mach/regs-clock.h index 499aef737476..ebaabe021af9 100644 --- a/arch/arm/mach-s5pv210/include/mach/regs-clock.h +++ b/arch/arm/mach-s5pv210/include/mach/regs-clock.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #define S5P_APLL_CON S5P_CLKREG(0x100) | 25 | #define S5P_APLL_CON S5P_CLKREG(0x100) |
26 | #define S5P_MPLL_CON S5P_CLKREG(0x108) | 26 | #define S5P_MPLL_CON S5P_CLKREG(0x108) |
27 | #define S5P_EPLL_CON S5P_CLKREG(0x110) | 27 | #define S5P_EPLL_CON S5P_CLKREG(0x110) |
28 | #define S5P_EPLL_CON1 S5P_CLKREG(0x114) | ||
28 | #define S5P_VPLL_CON S5P_CLKREG(0x120) | 29 | #define S5P_VPLL_CON S5P_CLKREG(0x120) |
29 | 30 | ||
30 | #define S5P_CLK_SRC0 S5P_CLKREG(0x200) | 31 | #define S5P_CLK_SRC0 S5P_CLKREG(0x200) |
@@ -67,11 +68,28 @@ | |||
67 | #define S5P_CLKGATE_BUS1 S5P_CLKREG(0x488) | 68 | #define S5P_CLKGATE_BUS1 S5P_CLKREG(0x488) |
68 | #define S5P_CLK_OUT S5P_CLKREG(0x500) | 69 | #define S5P_CLK_OUT S5P_CLKREG(0x500) |
69 | 70 | ||
71 | /* DIV/MUX STATUS */ | ||
72 | #define S5P_CLKDIV_STAT0 S5P_CLKREG(0x1000) | ||
73 | #define S5P_CLKDIV_STAT1 S5P_CLKREG(0x1004) | ||
74 | #define S5P_CLKMUX_STAT0 S5P_CLKREG(0x1100) | ||
75 | #define S5P_CLKMUX_STAT1 S5P_CLKREG(0x1104) | ||
76 | |||
70 | /* CLKSRC0 */ | 77 | /* CLKSRC0 */ |
71 | #define S5P_CLKSRC0_MUX200_MASK (0x1<<16) | 78 | #define S5P_CLKSRC0_MUX200_SHIFT (16) |
79 | #define S5P_CLKSRC0_MUX200_MASK (0x1 << S5P_CLKSRC0_MUX200_SHIFT) | ||
72 | #define S5P_CLKSRC0_MUX166_MASK (0x1<<20) | 80 | #define S5P_CLKSRC0_MUX166_MASK (0x1<<20) |
73 | #define S5P_CLKSRC0_MUX133_MASK (0x1<<24) | 81 | #define S5P_CLKSRC0_MUX133_MASK (0x1<<24) |
74 | 82 | ||
83 | /* CLKSRC2 */ | ||
84 | #define S5P_CLKSRC2_G3D_SHIFT (0) | ||
85 | #define S5P_CLKSRC2_G3D_MASK (0x3 << S5P_CLKSRC2_G3D_SHIFT) | ||
86 | #define S5P_CLKSRC2_MFC_SHIFT (4) | ||
87 | #define S5P_CLKSRC2_MFC_MASK (0x3 << S5P_CLKSRC2_MFC_SHIFT) | ||
88 | |||
89 | /* CLKSRC6*/ | ||
90 | #define S5P_CLKSRC6_ONEDRAM_SHIFT (24) | ||
91 | #define S5P_CLKSRC6_ONEDRAM_MASK (0x3 << S5P_CLKSRC6_ONEDRAM_SHIFT) | ||
92 | |||
75 | /* CLKDIV0 */ | 93 | /* CLKDIV0 */ |
76 | #define S5P_CLKDIV0_APLL_SHIFT (0) | 94 | #define S5P_CLKDIV0_APLL_SHIFT (0) |
77 | #define S5P_CLKDIV0_APLL_MASK (0x7 << S5P_CLKDIV0_APLL_SHIFT) | 95 | #define S5P_CLKDIV0_APLL_MASK (0x7 << S5P_CLKDIV0_APLL_SHIFT) |
@@ -90,12 +108,24 @@ | |||
90 | #define S5P_CLKDIV0_PCLK66_SHIFT (28) | 108 | #define S5P_CLKDIV0_PCLK66_SHIFT (28) |
91 | #define S5P_CLKDIV0_PCLK66_MASK (0x7 << S5P_CLKDIV0_PCLK66_SHIFT) | 109 | #define S5P_CLKDIV0_PCLK66_MASK (0x7 << S5P_CLKDIV0_PCLK66_SHIFT) |
92 | 110 | ||
111 | /* CLKDIV2 */ | ||
112 | #define S5P_CLKDIV2_G3D_SHIFT (0) | ||
113 | #define S5P_CLKDIV2_G3D_MASK (0xF << S5P_CLKDIV2_G3D_SHIFT) | ||
114 | #define S5P_CLKDIV2_MFC_SHIFT (4) | ||
115 | #define S5P_CLKDIV2_MFC_MASK (0xF << S5P_CLKDIV2_MFC_SHIFT) | ||
116 | |||
117 | /* CLKDIV6 */ | ||
118 | #define S5P_CLKDIV6_ONEDRAM_SHIFT (28) | ||
119 | #define S5P_CLKDIV6_ONEDRAM_MASK (0xF << S5P_CLKDIV6_ONEDRAM_SHIFT) | ||
120 | |||
93 | #define S5P_SWRESET S5P_CLKREG(0x2000) | 121 | #define S5P_SWRESET S5P_CLKREG(0x2000) |
94 | 122 | ||
123 | #define S5P_ARM_MCS_CON S5P_CLKREG(0x6100) | ||
124 | |||
95 | /* Registers related to power management */ | 125 | /* Registers related to power management */ |
96 | #define S5P_PWR_CFG S5P_CLKREG(0xC000) | 126 | #define S5P_PWR_CFG S5P_CLKREG(0xC000) |
97 | #define S5P_EINT_WAKEUP_MASK S5P_CLKREG(0xC004) | 127 | #define S5P_EINT_WAKEUP_MASK S5P_CLKREG(0xC004) |
98 | #define S5P_WAKEUP_MASK S5P_CLKREG(0xC008) | 128 | #define S5P_WAKEUP_MASK S5P_CLKREG(0xC008) |
99 | #define S5P_PWR_MODE S5P_CLKREG(0xC00C) | 129 | #define S5P_PWR_MODE S5P_CLKREG(0xC00C) |
100 | #define S5P_NORMAL_CFG S5P_CLKREG(0xC010) | 130 | #define S5P_NORMAL_CFG S5P_CLKREG(0xC010) |
101 | #define S5P_IDLE_CFG S5P_CLKREG(0xC020) | 131 | #define S5P_IDLE_CFG S5P_CLKREG(0xC020) |
@@ -159,8 +189,11 @@ | |||
159 | #define S5P_SLEEP_CFG_USBOSC_EN (1 << 1) | 189 | #define S5P_SLEEP_CFG_USBOSC_EN (1 << 1) |
160 | 190 | ||
161 | /* OTHERS Resgister */ | 191 | /* OTHERS Resgister */ |
192 | #define S5P_OTHERS_RET_IO (1 << 31) | ||
193 | #define S5P_OTHERS_RET_CF (1 << 30) | ||
194 | #define S5P_OTHERS_RET_MMC (1 << 29) | ||
195 | #define S5P_OTHERS_RET_UART (1 << 28) | ||
162 | #define S5P_OTHERS_USB_SIG_MASK (1 << 16) | 196 | #define S5P_OTHERS_USB_SIG_MASK (1 << 16) |
163 | #define S5P_OTHERS_MIPI_DPHY_EN (1 << 28) | ||
164 | 197 | ||
165 | /* MIPI */ | 198 | /* MIPI */ |
166 | #define S5P_MIPI_DPHY_EN (3) | 199 | #define S5P_MIPI_DPHY_EN (3) |
diff --git a/arch/arm/mach-s5pv210/include/mach/regs-gpio.h b/arch/arm/mach-s5pv210/include/mach/regs-gpio.h index 49e029b4978a..de0c89976078 100644 --- a/arch/arm/mach-s5pv210/include/mach/regs-gpio.h +++ b/arch/arm/mach-s5pv210/include/mach/regs-gpio.h | |||
@@ -31,13 +31,6 @@ | |||
31 | 31 | ||
32 | #define eint_irq_to_bit(irq) (1 << (EINT_OFFSET(irq) & 0x7)) | 32 | #define eint_irq_to_bit(irq) (1 << (EINT_OFFSET(irq) & 0x7)) |
33 | 33 | ||
34 | /* values for S5P_EXTINT0 */ | ||
35 | #define S5P_EXTINT_LOWLEV (0x00) | ||
36 | #define S5P_EXTINT_HILEV (0x01) | ||
37 | #define S5P_EXTINT_FALLEDGE (0x02) | ||
38 | #define S5P_EXTINT_RISEEDGE (0x03) | ||
39 | #define S5P_EXTINT_BOTHEDGE (0x04) | ||
40 | |||
41 | #define EINT_MODE S3C_GPIO_SFN(0xf) | 34 | #define EINT_MODE S3C_GPIO_SFN(0xf) |
42 | 35 | ||
43 | #define EINT_GPIO_0(x) S5PV210_GPH0(x) | 36 | #define EINT_GPIO_0(x) S5PV210_GPH0(x) |
diff --git a/arch/arm/mach-s5pv210/include/mach/regs-sys.h b/arch/arm/mach-s5pv210/include/mach/regs-sys.h new file mode 100644 index 000000000000..26691d39d0f4 --- /dev/null +++ b/arch/arm/mach-s5pv210/include/mach/regs-sys.h | |||
@@ -0,0 +1,19 @@ | |||
1 | /* arch/arm/mach-s5pv210/include/mach/regs-sys.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5PV210 - System registers definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #define S5PV210_USB_PHY_CON (S3C_VA_SYS + 0xE80C) | ||
14 | #define S5PV210_USB_PHY0_EN (1 << 0) | ||
15 | #define S5PV210_USB_PHY1_EN (1 << 1) | ||
16 | |||
17 | /* compatibility defines for s3c-hsotg driver */ | ||
18 | #define S3C64XX_OTHERS S5PV210_USB_PHY_CON | ||
19 | #define S3C64XX_OTHERS_USBMASK S5PV210_USB_PHY0_EN | ||
diff --git a/arch/arm/mach-s5pv210/include/mach/vmalloc.h b/arch/arm/mach-s5pv210/include/mach/vmalloc.h index df9a28808323..a6c659d68a5d 100644 --- a/arch/arm/mach-s5pv210/include/mach/vmalloc.h +++ b/arch/arm/mach-s5pv210/include/mach/vmalloc.h | |||
@@ -17,6 +17,6 @@ | |||
17 | #ifndef __ASM_ARCH_VMALLOC_H | 17 | #ifndef __ASM_ARCH_VMALLOC_H |
18 | #define __ASM_ARCH_VMALLOC_H __FILE__ | 18 | #define __ASM_ARCH_VMALLOC_H __FILE__ |
19 | 19 | ||
20 | #define VMALLOC_END (0xE0000000UL) | 20 | #define VMALLOC_END 0xF6000000UL |
21 | 21 | ||
22 | #endif /* __ASM_ARCH_VMALLOC_H */ | 22 | #endif /* __ASM_ARCH_VMALLOC_H */ |
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c index 00883087363c..28677caf3613 100644 --- a/arch/arm/mach-s5pv210/mach-aquila.c +++ b/arch/arm/mach-s5pv210/mach-aquila.c | |||
@@ -16,6 +16,8 @@ | |||
16 | #include <linux/i2c.h> | 16 | #include <linux/i2c.h> |
17 | #include <linux/i2c-gpio.h> | 17 | #include <linux/i2c-gpio.h> |
18 | #include <linux/mfd/max8998.h> | 18 | #include <linux/mfd/max8998.h> |
19 | #include <linux/mfd/wm8994/pdata.h> | ||
20 | #include <linux/regulator/fixed.h> | ||
19 | #include <linux/gpio_keys.h> | 21 | #include <linux/gpio_keys.h> |
20 | #include <linux/input.h> | 22 | #include <linux/input.h> |
21 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
@@ -379,6 +381,119 @@ static struct max8998_platform_data aquila_max8998_pdata = { | |||
379 | }; | 381 | }; |
380 | #endif | 382 | #endif |
381 | 383 | ||
384 | static struct regulator_consumer_supply wm8994_fixed_voltage0_supplies[] = { | ||
385 | { | ||
386 | .dev_name = "5-001a", | ||
387 | .supply = "DBVDD", | ||
388 | }, { | ||
389 | .dev_name = "5-001a", | ||
390 | .supply = "AVDD2", | ||
391 | }, { | ||
392 | .dev_name = "5-001a", | ||
393 | .supply = "CPVDD", | ||
394 | }, | ||
395 | }; | ||
396 | |||
397 | static struct regulator_consumer_supply wm8994_fixed_voltage1_supplies[] = { | ||
398 | { | ||
399 | .dev_name = "5-001a", | ||
400 | .supply = "SPKVDD1", | ||
401 | }, { | ||
402 | .dev_name = "5-001a", | ||
403 | .supply = "SPKVDD2", | ||
404 | }, | ||
405 | }; | ||
406 | |||
407 | static struct regulator_init_data wm8994_fixed_voltage0_init_data = { | ||
408 | .constraints = { | ||
409 | .always_on = 1, | ||
410 | }, | ||
411 | .num_consumer_supplies = ARRAY_SIZE(wm8994_fixed_voltage0_supplies), | ||
412 | .consumer_supplies = wm8994_fixed_voltage0_supplies, | ||
413 | }; | ||
414 | |||
415 | static struct regulator_init_data wm8994_fixed_voltage1_init_data = { | ||
416 | .constraints = { | ||
417 | .always_on = 1, | ||
418 | }, | ||
419 | .num_consumer_supplies = ARRAY_SIZE(wm8994_fixed_voltage1_supplies), | ||
420 | .consumer_supplies = wm8994_fixed_voltage1_supplies, | ||
421 | }; | ||
422 | |||
423 | static struct fixed_voltage_config wm8994_fixed_voltage0_config = { | ||
424 | .supply_name = "VCC_1.8V_PDA", | ||
425 | .microvolts = 1800000, | ||
426 | .gpio = -EINVAL, | ||
427 | .init_data = &wm8994_fixed_voltage0_init_data, | ||
428 | }; | ||
429 | |||
430 | static struct fixed_voltage_config wm8994_fixed_voltage1_config = { | ||
431 | .supply_name = "V_BAT", | ||
432 | .microvolts = 3700000, | ||
433 | .gpio = -EINVAL, | ||
434 | .init_data = &wm8994_fixed_voltage1_init_data, | ||
435 | }; | ||
436 | |||
437 | static struct platform_device wm8994_fixed_voltage0 = { | ||
438 | .name = "reg-fixed-voltage", | ||
439 | .id = 0, | ||
440 | .dev = { | ||
441 | .platform_data = &wm8994_fixed_voltage0_config, | ||
442 | }, | ||
443 | }; | ||
444 | |||
445 | static struct platform_device wm8994_fixed_voltage1 = { | ||
446 | .name = "reg-fixed-voltage", | ||
447 | .id = 1, | ||
448 | .dev = { | ||
449 | .platform_data = &wm8994_fixed_voltage1_config, | ||
450 | }, | ||
451 | }; | ||
452 | |||
453 | static struct regulator_consumer_supply wm8994_avdd1_supply = { | ||
454 | .dev_name = "5-001a", | ||
455 | .supply = "AVDD1", | ||
456 | }; | ||
457 | |||
458 | static struct regulator_consumer_supply wm8994_dcvdd_supply = { | ||
459 | .dev_name = "5-001a", | ||
460 | .supply = "DCVDD", | ||
461 | }; | ||
462 | |||
463 | static struct regulator_init_data wm8994_ldo1_data = { | ||
464 | .constraints = { | ||
465 | .name = "AVDD1_3.0V", | ||
466 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
467 | }, | ||
468 | .num_consumer_supplies = 1, | ||
469 | .consumer_supplies = &wm8994_avdd1_supply, | ||
470 | }; | ||
471 | |||
472 | static struct regulator_init_data wm8994_ldo2_data = { | ||
473 | .constraints = { | ||
474 | .name = "DCVDD_1.0V", | ||
475 | }, | ||
476 | .num_consumer_supplies = 1, | ||
477 | .consumer_supplies = &wm8994_dcvdd_supply, | ||
478 | }; | ||
479 | |||
480 | static struct wm8994_pdata wm8994_platform_data = { | ||
481 | /* configure gpio1 function: 0x0001(Logic level input/output) */ | ||
482 | .gpio_defaults[0] = 0x0001, | ||
483 | /* configure gpio3/4/5/7 function for AIF2 voice */ | ||
484 | .gpio_defaults[2] = 0x8100, | ||
485 | .gpio_defaults[3] = 0x8100, | ||
486 | .gpio_defaults[4] = 0x8100, | ||
487 | .gpio_defaults[6] = 0x0100, | ||
488 | /* configure gpio8/9/10/11 function for AIF3 BT */ | ||
489 | .gpio_defaults[7] = 0x8100, | ||
490 | .gpio_defaults[8] = 0x0100, | ||
491 | .gpio_defaults[9] = 0x0100, | ||
492 | .gpio_defaults[10] = 0x0100, | ||
493 | .ldo[0] = { S5PV210_MP03(6), NULL, &wm8994_ldo1_data }, /* XM0FRNB_2 */ | ||
494 | .ldo[1] = { 0, NULL, &wm8994_ldo2_data }, | ||
495 | }; | ||
496 | |||
382 | /* GPIO I2C PMIC */ | 497 | /* GPIO I2C PMIC */ |
383 | #define AP_I2C_GPIO_PMIC_BUS_4 4 | 498 | #define AP_I2C_GPIO_PMIC_BUS_4 4 |
384 | static struct i2c_gpio_platform_data aquila_i2c_gpio_pmic_data = { | 499 | static struct i2c_gpio_platform_data aquila_i2c_gpio_pmic_data = { |
@@ -404,6 +519,29 @@ static struct i2c_board_info i2c_gpio_pmic_devs[] __initdata = { | |||
404 | #endif | 519 | #endif |
405 | }; | 520 | }; |
406 | 521 | ||
522 | /* GPIO I2C AP 1.8V */ | ||
523 | #define AP_I2C_GPIO_BUS_5 5 | ||
524 | static struct i2c_gpio_platform_data aquila_i2c_gpio5_data = { | ||
525 | .sda_pin = S5PV210_MP05(3), /* XM0ADDR_11 */ | ||
526 | .scl_pin = S5PV210_MP05(2), /* XM0ADDR_10 */ | ||
527 | }; | ||
528 | |||
529 | static struct platform_device aquila_i2c_gpio5 = { | ||
530 | .name = "i2c-gpio", | ||
531 | .id = AP_I2C_GPIO_BUS_5, | ||
532 | .dev = { | ||
533 | .platform_data = &aquila_i2c_gpio5_data, | ||
534 | }, | ||
535 | }; | ||
536 | |||
537 | static struct i2c_board_info i2c_gpio5_devs[] __initdata = { | ||
538 | { | ||
539 | /* CS/ADDR = low 0x34 (FYI: high = 0x36) */ | ||
540 | I2C_BOARD_INFO("wm8994", 0x1a), | ||
541 | .platform_data = &wm8994_platform_data, | ||
542 | }, | ||
543 | }; | ||
544 | |||
407 | /* PMIC Power button */ | 545 | /* PMIC Power button */ |
408 | static struct gpio_keys_button aquila_gpio_keys_table[] = { | 546 | static struct gpio_keys_button aquila_gpio_keys_table[] = { |
409 | { | 547 | { |
@@ -475,6 +613,7 @@ static void aquila_setup_sdhci(void) | |||
475 | 613 | ||
476 | static struct platform_device *aquila_devices[] __initdata = { | 614 | static struct platform_device *aquila_devices[] __initdata = { |
477 | &aquila_i2c_gpio_pmic, | 615 | &aquila_i2c_gpio_pmic, |
616 | &aquila_i2c_gpio5, | ||
478 | &aquila_device_gpiokeys, | 617 | &aquila_device_gpiokeys, |
479 | &s3c_device_fb, | 618 | &s3c_device_fb, |
480 | &s5p_device_onenand, | 619 | &s5p_device_onenand, |
@@ -484,8 +623,33 @@ static struct platform_device *aquila_devices[] __initdata = { | |||
484 | &s5p_device_fimc0, | 623 | &s5p_device_fimc0, |
485 | &s5p_device_fimc1, | 624 | &s5p_device_fimc1, |
486 | &s5p_device_fimc2, | 625 | &s5p_device_fimc2, |
626 | &s5pv210_device_iis0, | ||
627 | &wm8994_fixed_voltage0, | ||
628 | &wm8994_fixed_voltage1, | ||
487 | }; | 629 | }; |
488 | 630 | ||
631 | static void __init aquila_sound_init(void) | ||
632 | { | ||
633 | unsigned int gpio; | ||
634 | |||
635 | /* CODEC_XTAL_EN | ||
636 | * | ||
637 | * The Aquila board have a oscillator which provide main clock | ||
638 | * to WM8994 codec. The oscillator provide 24MHz clock to WM8994 | ||
639 | * clock. Set gpio setting of "CODEC_XTAL_EN" to enable a oscillator. | ||
640 | * */ | ||
641 | gpio = S5PV210_GPH3(2); /* XEINT_26 */ | ||
642 | gpio_request(gpio, "CODEC_XTAL_EN"); | ||
643 | s3c_gpio_cfgpin(gpio, S3C_GPIO_OUTPUT); | ||
644 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
645 | |||
646 | /* Ths main clock of WM8994 codec uses the output of CLKOUT pin. | ||
647 | * The CLKOUT[9:8] set to 0x3(XUSBXTI) of 0xE010E000(OTHERS) | ||
648 | * because it needs 24MHz clock to operate WM8994 codec. | ||
649 | */ | ||
650 | __raw_writel(__raw_readl(S5P_OTHERS) | (0x3 << 8), S5P_OTHERS); | ||
651 | } | ||
652 | |||
489 | static void __init aquila_map_io(void) | 653 | static void __init aquila_map_io(void) |
490 | { | 654 | { |
491 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 655 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); |
@@ -506,6 +670,11 @@ static void __init aquila_machine_init(void) | |||
506 | s3c_fimc_setname(1, "s5p-fimc"); | 670 | s3c_fimc_setname(1, "s5p-fimc"); |
507 | s3c_fimc_setname(2, "s5p-fimc"); | 671 | s3c_fimc_setname(2, "s5p-fimc"); |
508 | 672 | ||
673 | /* SOUND */ | ||
674 | aquila_sound_init(); | ||
675 | i2c_register_board_info(AP_I2C_GPIO_BUS_5, i2c_gpio5_devs, | ||
676 | ARRAY_SIZE(i2c_gpio5_devs)); | ||
677 | |||
509 | /* FB */ | 678 | /* FB */ |
510 | s3c_fb_set_platdata(&aquila_lcd_pdata); | 679 | s3c_fb_set_platdata(&aquila_lcd_pdata); |
511 | 680 | ||
diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c index d9ecf57fc2a5..b1dcf964a768 100644 --- a/arch/arm/mach-s5pv210/mach-goni.c +++ b/arch/arm/mach-s5pv210/mach-goni.c | |||
@@ -15,7 +15,13 @@ | |||
15 | #include <linux/fb.h> | 15 | #include <linux/fb.h> |
16 | #include <linux/i2c.h> | 16 | #include <linux/i2c.h> |
17 | #include <linux/i2c-gpio.h> | 17 | #include <linux/i2c-gpio.h> |
18 | #include <linux/i2c/qt602240_ts.h> | ||
18 | #include <linux/mfd/max8998.h> | 19 | #include <linux/mfd/max8998.h> |
20 | #include <linux/mfd/wm8994/pdata.h> | ||
21 | #include <linux/regulator/fixed.h> | ||
22 | #include <linux/spi/spi.h> | ||
23 | #include <linux/spi/spi_gpio.h> | ||
24 | #include <linux/lcd.h> | ||
19 | #include <linux/gpio_keys.h> | 25 | #include <linux/gpio_keys.h> |
20 | #include <linux/input.h> | 26 | #include <linux/input.h> |
21 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
@@ -35,7 +41,10 @@ | |||
35 | #include <plat/devs.h> | 41 | #include <plat/devs.h> |
36 | #include <plat/cpu.h> | 42 | #include <plat/cpu.h> |
37 | #include <plat/fb.h> | 43 | #include <plat/fb.h> |
44 | #include <plat/iic.h> | ||
45 | #include <plat/keypad.h> | ||
38 | #include <plat/sdhci.h> | 46 | #include <plat/sdhci.h> |
47 | #include <plat/clock.h> | ||
39 | 48 | ||
40 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 49 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
41 | #define GONI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 50 | #define GONI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
@@ -87,13 +96,12 @@ static struct s3c2410_uartcfg goni_uartcfgs[] __initdata = { | |||
87 | /* Frame Buffer */ | 96 | /* Frame Buffer */ |
88 | static struct s3c_fb_pd_win goni_fb_win0 = { | 97 | static struct s3c_fb_pd_win goni_fb_win0 = { |
89 | .win_mode = { | 98 | .win_mode = { |
90 | .pixclock = 1000000000000ULL / ((16+16+2+480)*(28+3+2+800)*55), | ||
91 | .left_margin = 16, | 99 | .left_margin = 16, |
92 | .right_margin = 16, | 100 | .right_margin = 16, |
93 | .upper_margin = 3, | 101 | .upper_margin = 2, |
94 | .lower_margin = 28, | 102 | .lower_margin = 28, |
95 | .hsync_len = 2, | 103 | .hsync_len = 2, |
96 | .vsync_len = 2, | 104 | .vsync_len = 1, |
97 | .xres = 480, | 105 | .xres = 480, |
98 | .yres = 800, | 106 | .yres = 800, |
99 | .refresh = 55, | 107 | .refresh = 55, |
@@ -111,9 +119,160 @@ static struct s3c_fb_platdata goni_lcd_pdata __initdata = { | |||
111 | .setup_gpio = s5pv210_fb_gpio_setup_24bpp, | 119 | .setup_gpio = s5pv210_fb_gpio_setup_24bpp, |
112 | }; | 120 | }; |
113 | 121 | ||
122 | static int lcd_power_on(struct lcd_device *ld, int enable) | ||
123 | { | ||
124 | return 1; | ||
125 | } | ||
126 | |||
127 | static int reset_lcd(struct lcd_device *ld) | ||
128 | { | ||
129 | static unsigned int first = 1; | ||
130 | int reset_gpio = -1; | ||
131 | |||
132 | reset_gpio = S5PV210_MP05(5); | ||
133 | |||
134 | if (first) { | ||
135 | gpio_request(reset_gpio, "MLCD_RST"); | ||
136 | first = 0; | ||
137 | } | ||
138 | |||
139 | gpio_direction_output(reset_gpio, 1); | ||
140 | return 1; | ||
141 | } | ||
142 | |||
143 | static struct lcd_platform_data goni_lcd_platform_data = { | ||
144 | .reset = reset_lcd, | ||
145 | .power_on = lcd_power_on, | ||
146 | .lcd_enabled = 0, | ||
147 | .reset_delay = 120, /* 120ms */ | ||
148 | .power_on_delay = 25, /* 25ms */ | ||
149 | .power_off_delay = 200, /* 200ms */ | ||
150 | }; | ||
151 | |||
152 | #define LCD_BUS_NUM 3 | ||
153 | static struct spi_board_info spi_board_info[] __initdata = { | ||
154 | { | ||
155 | .modalias = "s6e63m0", | ||
156 | .platform_data = &goni_lcd_platform_data, | ||
157 | .max_speed_hz = 1200000, | ||
158 | .bus_num = LCD_BUS_NUM, | ||
159 | .chip_select = 0, | ||
160 | .mode = SPI_MODE_3, | ||
161 | .controller_data = (void *)S5PV210_MP01(1), /* DISPLAY_CS */ | ||
162 | }, | ||
163 | }; | ||
164 | |||
165 | static struct spi_gpio_platform_data lcd_spi_gpio_data = { | ||
166 | .sck = S5PV210_MP04(1), /* DISPLAY_CLK */ | ||
167 | .mosi = S5PV210_MP04(3), /* DISPLAY_SI */ | ||
168 | .miso = SPI_GPIO_NO_MISO, | ||
169 | .num_chipselect = 1, | ||
170 | }; | ||
171 | |||
172 | static struct platform_device goni_spi_gpio = { | ||
173 | .name = "spi_gpio", | ||
174 | .id = LCD_BUS_NUM, | ||
175 | .dev = { | ||
176 | .parent = &s3c_device_fb.dev, | ||
177 | .platform_data = &lcd_spi_gpio_data, | ||
178 | }, | ||
179 | }; | ||
180 | |||
181 | /* KEYPAD */ | ||
182 | static uint32_t keymap[] __initdata = { | ||
183 | /* KEY(row, col, keycode) */ | ||
184 | KEY(0, 1, KEY_MENU), /* Send */ | ||
185 | KEY(0, 2, KEY_BACK), /* End */ | ||
186 | KEY(1, 1, KEY_CONFIG), /* Half shot */ | ||
187 | KEY(1, 2, KEY_VOLUMEUP), | ||
188 | KEY(2, 1, KEY_CAMERA), /* Full shot */ | ||
189 | KEY(2, 2, KEY_VOLUMEDOWN), | ||
190 | }; | ||
191 | |||
192 | static struct matrix_keymap_data keymap_data __initdata = { | ||
193 | .keymap = keymap, | ||
194 | .keymap_size = ARRAY_SIZE(keymap), | ||
195 | }; | ||
196 | |||
197 | static struct samsung_keypad_platdata keypad_data __initdata = { | ||
198 | .keymap_data = &keymap_data, | ||
199 | .rows = 3, | ||
200 | .cols = 3, | ||
201 | }; | ||
202 | |||
203 | /* Radio */ | ||
204 | static struct i2c_board_info i2c1_devs[] __initdata = { | ||
205 | { | ||
206 | I2C_BOARD_INFO("si470x", 0x10), | ||
207 | }, | ||
208 | }; | ||
209 | |||
210 | static void __init goni_radio_init(void) | ||
211 | { | ||
212 | int gpio; | ||
213 | |||
214 | gpio = S5PV210_GPJ2(4); /* XMSMDATA_4 */ | ||
215 | gpio_request(gpio, "FM_INT"); | ||
216 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf)); | ||
217 | i2c1_devs[0].irq = gpio_to_irq(gpio); | ||
218 | |||
219 | gpio = S5PV210_GPJ2(5); /* XMSMDATA_5 */ | ||
220 | gpio_request(gpio, "FM_RST"); | ||
221 | gpio_direction_output(gpio, 1); | ||
222 | } | ||
223 | |||
224 | /* TSP */ | ||
225 | static struct qt602240_platform_data qt602240_platform_data = { | ||
226 | .x_line = 17, | ||
227 | .y_line = 11, | ||
228 | .x_size = 800, | ||
229 | .y_size = 480, | ||
230 | .blen = 0x21, | ||
231 | .threshold = 0x28, | ||
232 | .voltage = 2800000, /* 2.8V */ | ||
233 | .orient = QT602240_DIAGONAL, | ||
234 | }; | ||
235 | |||
236 | static struct s3c2410_platform_i2c i2c2_data __initdata = { | ||
237 | .flags = 0, | ||
238 | .bus_num = 2, | ||
239 | .slave_addr = 0x10, | ||
240 | .frequency = 400 * 1000, | ||
241 | .sda_delay = 100, | ||
242 | }; | ||
243 | |||
244 | static struct i2c_board_info i2c2_devs[] __initdata = { | ||
245 | { | ||
246 | I2C_BOARD_INFO("qt602240_ts", 0x4a), | ||
247 | .platform_data = &qt602240_platform_data, | ||
248 | }, | ||
249 | }; | ||
250 | |||
251 | static void __init goni_tsp_init(void) | ||
252 | { | ||
253 | int gpio; | ||
254 | |||
255 | gpio = S5PV210_GPJ1(3); /* XMSMADDR_11 */ | ||
256 | gpio_request(gpio, "TSP_LDO_ON"); | ||
257 | gpio_direction_output(gpio, 1); | ||
258 | gpio_export(gpio, 0); | ||
259 | |||
260 | gpio = S5PV210_GPJ0(5); /* XMSMADDR_5 */ | ||
261 | gpio_request(gpio, "TSP_INT"); | ||
262 | |||
263 | s5p_register_gpio_interrupt(gpio); | ||
264 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf)); | ||
265 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | ||
266 | i2c2_devs[0].irq = gpio_to_irq(gpio); | ||
267 | } | ||
268 | |||
114 | /* MAX8998 regulators */ | 269 | /* MAX8998 regulators */ |
115 | #if defined(CONFIG_REGULATOR_MAX8998) || defined(CONFIG_REGULATOR_MAX8998_MODULE) | 270 | #if defined(CONFIG_REGULATOR_MAX8998) || defined(CONFIG_REGULATOR_MAX8998_MODULE) |
116 | 271 | ||
272 | static struct regulator_consumer_supply goni_ldo5_consumers[] = { | ||
273 | REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"), | ||
274 | }; | ||
275 | |||
117 | static struct regulator_init_data goni_ldo2_data = { | 276 | static struct regulator_init_data goni_ldo2_data = { |
118 | .constraints = { | 277 | .constraints = { |
119 | .name = "VALIVE_1.1V", | 278 | .name = "VALIVE_1.1V", |
@@ -153,6 +312,8 @@ static struct regulator_init_data goni_ldo5_data = { | |||
153 | .max_uV = 2800000, | 312 | .max_uV = 2800000, |
154 | .apply_uV = 1, | 313 | .apply_uV = 1, |
155 | }, | 314 | }, |
315 | .num_consumer_supplies = ARRAY_SIZE(goni_ldo5_consumers), | ||
316 | .consumer_supplies = goni_ldo5_consumers, | ||
156 | }; | 317 | }; |
157 | 318 | ||
158 | static struct regulator_init_data goni_ldo6_data = { | 319 | static struct regulator_init_data goni_ldo6_data = { |
@@ -360,6 +521,119 @@ static struct max8998_platform_data goni_max8998_pdata = { | |||
360 | }; | 521 | }; |
361 | #endif | 522 | #endif |
362 | 523 | ||
524 | static struct regulator_consumer_supply wm8994_fixed_voltage0_supplies[] = { | ||
525 | { | ||
526 | .dev_name = "5-001a", | ||
527 | .supply = "DBVDD", | ||
528 | }, { | ||
529 | .dev_name = "5-001a", | ||
530 | .supply = "AVDD2", | ||
531 | }, { | ||
532 | .dev_name = "5-001a", | ||
533 | .supply = "CPVDD", | ||
534 | }, | ||
535 | }; | ||
536 | |||
537 | static struct regulator_consumer_supply wm8994_fixed_voltage1_supplies[] = { | ||
538 | { | ||
539 | .dev_name = "5-001a", | ||
540 | .supply = "SPKVDD1", | ||
541 | }, { | ||
542 | .dev_name = "5-001a", | ||
543 | .supply = "SPKVDD2", | ||
544 | }, | ||
545 | }; | ||
546 | |||
547 | static struct regulator_init_data wm8994_fixed_voltage0_init_data = { | ||
548 | .constraints = { | ||
549 | .always_on = 1, | ||
550 | }, | ||
551 | .num_consumer_supplies = ARRAY_SIZE(wm8994_fixed_voltage0_supplies), | ||
552 | .consumer_supplies = wm8994_fixed_voltage0_supplies, | ||
553 | }; | ||
554 | |||
555 | static struct regulator_init_data wm8994_fixed_voltage1_init_data = { | ||
556 | .constraints = { | ||
557 | .always_on = 1, | ||
558 | }, | ||
559 | .num_consumer_supplies = ARRAY_SIZE(wm8994_fixed_voltage1_supplies), | ||
560 | .consumer_supplies = wm8994_fixed_voltage1_supplies, | ||
561 | }; | ||
562 | |||
563 | static struct fixed_voltage_config wm8994_fixed_voltage0_config = { | ||
564 | .supply_name = "VCC_1.8V_PDA", | ||
565 | .microvolts = 1800000, | ||
566 | .gpio = -EINVAL, | ||
567 | .init_data = &wm8994_fixed_voltage0_init_data, | ||
568 | }; | ||
569 | |||
570 | static struct fixed_voltage_config wm8994_fixed_voltage1_config = { | ||
571 | .supply_name = "V_BAT", | ||
572 | .microvolts = 3700000, | ||
573 | .gpio = -EINVAL, | ||
574 | .init_data = &wm8994_fixed_voltage1_init_data, | ||
575 | }; | ||
576 | |||
577 | static struct platform_device wm8994_fixed_voltage0 = { | ||
578 | .name = "reg-fixed-voltage", | ||
579 | .id = 0, | ||
580 | .dev = { | ||
581 | .platform_data = &wm8994_fixed_voltage0_config, | ||
582 | }, | ||
583 | }; | ||
584 | |||
585 | static struct platform_device wm8994_fixed_voltage1 = { | ||
586 | .name = "reg-fixed-voltage", | ||
587 | .id = 1, | ||
588 | .dev = { | ||
589 | .platform_data = &wm8994_fixed_voltage1_config, | ||
590 | }, | ||
591 | }; | ||
592 | |||
593 | static struct regulator_consumer_supply wm8994_avdd1_supply = { | ||
594 | .dev_name = "5-001a", | ||
595 | .supply = "AVDD1", | ||
596 | }; | ||
597 | |||
598 | static struct regulator_consumer_supply wm8994_dcvdd_supply = { | ||
599 | .dev_name = "5-001a", | ||
600 | .supply = "DCVDD", | ||
601 | }; | ||
602 | |||
603 | static struct regulator_init_data wm8994_ldo1_data = { | ||
604 | .constraints = { | ||
605 | .name = "AVDD1_3.0V", | ||
606 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
607 | }, | ||
608 | .num_consumer_supplies = 1, | ||
609 | .consumer_supplies = &wm8994_avdd1_supply, | ||
610 | }; | ||
611 | |||
612 | static struct regulator_init_data wm8994_ldo2_data = { | ||
613 | .constraints = { | ||
614 | .name = "DCVDD_1.0V", | ||
615 | }, | ||
616 | .num_consumer_supplies = 1, | ||
617 | .consumer_supplies = &wm8994_dcvdd_supply, | ||
618 | }; | ||
619 | |||
620 | static struct wm8994_pdata wm8994_platform_data = { | ||
621 | /* configure gpio1 function: 0x0001(Logic level input/output) */ | ||
622 | .gpio_defaults[0] = 0x0001, | ||
623 | /* configure gpio3/4/5/7 function for AIF2 voice */ | ||
624 | .gpio_defaults[2] = 0x8100, | ||
625 | .gpio_defaults[3] = 0x8100, | ||
626 | .gpio_defaults[4] = 0x8100, | ||
627 | .gpio_defaults[6] = 0x0100, | ||
628 | /* configure gpio8/9/10/11 function for AIF3 BT */ | ||
629 | .gpio_defaults[7] = 0x8100, | ||
630 | .gpio_defaults[8] = 0x0100, | ||
631 | .gpio_defaults[9] = 0x0100, | ||
632 | .gpio_defaults[10] = 0x0100, | ||
633 | .ldo[0] = { S5PV210_MP03(6), NULL, &wm8994_ldo1_data }, /* XM0FRNB_2 */ | ||
634 | .ldo[1] = { 0, NULL, &wm8994_ldo2_data }, | ||
635 | }; | ||
636 | |||
363 | /* GPIO I2C PMIC */ | 637 | /* GPIO I2C PMIC */ |
364 | #define AP_I2C_GPIO_PMIC_BUS_4 4 | 638 | #define AP_I2C_GPIO_PMIC_BUS_4 4 |
365 | static struct i2c_gpio_platform_data goni_i2c_gpio_pmic_data = { | 639 | static struct i2c_gpio_platform_data goni_i2c_gpio_pmic_data = { |
@@ -385,6 +659,29 @@ static struct i2c_board_info i2c_gpio_pmic_devs[] __initdata = { | |||
385 | #endif | 659 | #endif |
386 | }; | 660 | }; |
387 | 661 | ||
662 | /* GPIO I2C AP 1.8V */ | ||
663 | #define AP_I2C_GPIO_BUS_5 5 | ||
664 | static struct i2c_gpio_platform_data goni_i2c_gpio5_data = { | ||
665 | .sda_pin = S5PV210_MP05(3), /* XM0ADDR_11 */ | ||
666 | .scl_pin = S5PV210_MP05(2), /* XM0ADDR_10 */ | ||
667 | }; | ||
668 | |||
669 | static struct platform_device goni_i2c_gpio5 = { | ||
670 | .name = "i2c-gpio", | ||
671 | .id = AP_I2C_GPIO_BUS_5, | ||
672 | .dev = { | ||
673 | .platform_data = &goni_i2c_gpio5_data, | ||
674 | }, | ||
675 | }; | ||
676 | |||
677 | static struct i2c_board_info i2c_gpio5_devs[] __initdata = { | ||
678 | { | ||
679 | /* CS/ADDR = low 0x34 (FYI: high = 0x36) */ | ||
680 | I2C_BOARD_INFO("wm8994", 0x1a), | ||
681 | .platform_data = &wm8994_platform_data, | ||
682 | }, | ||
683 | }; | ||
684 | |||
388 | /* PMIC Power button */ | 685 | /* PMIC Power button */ |
389 | static struct gpio_keys_button goni_gpio_keys_table[] = { | 686 | static struct gpio_keys_button goni_gpio_keys_table[] = { |
390 | { | 687 | { |
@@ -444,11 +741,37 @@ static struct s3c_sdhci_platdata goni_hsmmc2_data __initdata = { | |||
444 | .ext_cd_gpio_invert = 1, | 741 | .ext_cd_gpio_invert = 1, |
445 | }; | 742 | }; |
446 | 743 | ||
744 | static struct regulator_consumer_supply mmc2_supplies[] = { | ||
745 | REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"), | ||
746 | }; | ||
747 | |||
748 | static struct regulator_init_data mmc2_fixed_voltage_init_data = { | ||
749 | .constraints = { | ||
750 | .name = "V_TF_2.8V", | ||
751 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
752 | }, | ||
753 | .num_consumer_supplies = ARRAY_SIZE(mmc2_supplies), | ||
754 | .consumer_supplies = mmc2_supplies, | ||
755 | }; | ||
756 | |||
757 | static struct fixed_voltage_config mmc2_fixed_voltage_config = { | ||
758 | .supply_name = "EXT_FLASH_EN", | ||
759 | .microvolts = 2800000, | ||
760 | .gpio = GONI_EXT_FLASH_EN, | ||
761 | .enable_high = true, | ||
762 | .init_data = &mmc2_fixed_voltage_init_data, | ||
763 | }; | ||
764 | |||
765 | static struct platform_device mmc2_fixed_voltage = { | ||
766 | .name = "reg-fixed-voltage", | ||
767 | .id = 2, | ||
768 | .dev = { | ||
769 | .platform_data = &mmc2_fixed_voltage_config, | ||
770 | }, | ||
771 | }; | ||
772 | |||
447 | static void goni_setup_sdhci(void) | 773 | static void goni_setup_sdhci(void) |
448 | { | 774 | { |
449 | gpio_request(GONI_EXT_FLASH_EN, "FLASH_EN"); | ||
450 | gpio_direction_output(GONI_EXT_FLASH_EN, 1); | ||
451 | |||
452 | s3c_sdhci0_set_platdata(&goni_hsmmc0_data); | 775 | s3c_sdhci0_set_platdata(&goni_hsmmc0_data); |
453 | s3c_sdhci1_set_platdata(&goni_hsmmc1_data); | 776 | s3c_sdhci1_set_platdata(&goni_hsmmc1_data); |
454 | s3c_sdhci2_set_platdata(&goni_hsmmc2_data); | 777 | s3c_sdhci2_set_platdata(&goni_hsmmc2_data); |
@@ -457,7 +780,10 @@ static void goni_setup_sdhci(void) | |||
457 | static struct platform_device *goni_devices[] __initdata = { | 780 | static struct platform_device *goni_devices[] __initdata = { |
458 | &s3c_device_fb, | 781 | &s3c_device_fb, |
459 | &s5p_device_onenand, | 782 | &s5p_device_onenand, |
783 | &goni_spi_gpio, | ||
460 | &goni_i2c_gpio_pmic, | 784 | &goni_i2c_gpio_pmic, |
785 | &goni_i2c_gpio5, | ||
786 | &mmc2_fixed_voltage, | ||
461 | &goni_device_gpiokeys, | 787 | &goni_device_gpiokeys, |
462 | &s5p_device_fimc0, | 788 | &s5p_device_fimc0, |
463 | &s5p_device_fimc1, | 789 | &s5p_device_fimc1, |
@@ -465,8 +791,24 @@ static struct platform_device *goni_devices[] __initdata = { | |||
465 | &s3c_device_hsmmc0, | 791 | &s3c_device_hsmmc0, |
466 | &s3c_device_hsmmc1, | 792 | &s3c_device_hsmmc1, |
467 | &s3c_device_hsmmc2, | 793 | &s3c_device_hsmmc2, |
794 | &s5pv210_device_iis0, | ||
795 | &s3c_device_usb_hsotg, | ||
796 | &samsung_device_keypad, | ||
797 | &s3c_device_i2c1, | ||
798 | &s3c_device_i2c2, | ||
799 | &wm8994_fixed_voltage0, | ||
800 | &wm8994_fixed_voltage1, | ||
468 | }; | 801 | }; |
469 | 802 | ||
803 | static void __init goni_sound_init(void) | ||
804 | { | ||
805 | /* Ths main clock of WM8994 codec uses the output of CLKOUT pin. | ||
806 | * The CLKOUT[9:8] set to 0x3(XUSBXTI) of 0xE010E000(OTHERS) | ||
807 | * because it needs 24MHz clock to operate WM8994 codec. | ||
808 | */ | ||
809 | __raw_writel(__raw_readl(S5P_OTHERS) | (0x3 << 8), S5P_OTHERS); | ||
810 | } | ||
811 | |||
470 | static void __init goni_map_io(void) | 812 | static void __init goni_map_io(void) |
471 | { | 813 | { |
472 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 814 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); |
@@ -476,6 +818,20 @@ static void __init goni_map_io(void) | |||
476 | 818 | ||
477 | static void __init goni_machine_init(void) | 819 | static void __init goni_machine_init(void) |
478 | { | 820 | { |
821 | /* Radio: call before I2C 1 registeration */ | ||
822 | goni_radio_init(); | ||
823 | |||
824 | /* I2C1 */ | ||
825 | s3c_i2c1_set_platdata(NULL); | ||
826 | i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs)); | ||
827 | |||
828 | /* TSP: call before I2C 2 registeration */ | ||
829 | goni_tsp_init(); | ||
830 | |||
831 | /* I2C2 */ | ||
832 | s3c_i2c2_set_platdata(&i2c2_data); | ||
833 | i2c_register_board_info(2, i2c2_devs, ARRAY_SIZE(i2c2_devs)); | ||
834 | |||
479 | /* PMIC */ | 835 | /* PMIC */ |
480 | goni_pmic_init(); | 836 | goni_pmic_init(); |
481 | i2c_register_board_info(AP_I2C_GPIO_PMIC_BUS_4, i2c_gpio_pmic_devs, | 837 | i2c_register_board_info(AP_I2C_GPIO_PMIC_BUS_4, i2c_gpio_pmic_devs, |
@@ -483,9 +839,22 @@ static void __init goni_machine_init(void) | |||
483 | /* SDHCI */ | 839 | /* SDHCI */ |
484 | goni_setup_sdhci(); | 840 | goni_setup_sdhci(); |
485 | 841 | ||
842 | /* SOUND */ | ||
843 | goni_sound_init(); | ||
844 | i2c_register_board_info(AP_I2C_GPIO_BUS_5, i2c_gpio5_devs, | ||
845 | ARRAY_SIZE(i2c_gpio5_devs)); | ||
846 | |||
486 | /* FB */ | 847 | /* FB */ |
487 | s3c_fb_set_platdata(&goni_lcd_pdata); | 848 | s3c_fb_set_platdata(&goni_lcd_pdata); |
488 | 849 | ||
850 | /* SPI */ | ||
851 | spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); | ||
852 | |||
853 | /* KEYPAD */ | ||
854 | samsung_keypad_set_platdata(&keypad_data); | ||
855 | |||
856 | clk_xusbxti.rate = 24000000; | ||
857 | |||
489 | platform_add_devices(goni_devices, ARRAY_SIZE(goni_devices)); | 858 | platform_add_devices(goni_devices, ARRAY_SIZE(goni_devices)); |
490 | } | 859 | } |
491 | 860 | ||
diff --git a/arch/arm/mach-s5pv210/mach-smdkc110.c b/arch/arm/mach-s5pv210/mach-smdkc110.c index cea9bca79d88..0ad7924fe62e 100644 --- a/arch/arm/mach-s5pv210/mach-smdkc110.c +++ b/arch/arm/mach-s5pv210/mach-smdkc110.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <plat/cpu.h> | 28 | #include <plat/cpu.h> |
29 | #include <plat/ata.h> | 29 | #include <plat/ata.h> |
30 | #include <plat/iic.h> | 30 | #include <plat/iic.h> |
31 | #include <plat/pm.h> | ||
31 | 32 | ||
32 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 33 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
33 | #define SMDKC110_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 34 | #define SMDKC110_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
@@ -81,6 +82,7 @@ static struct s3c_ide_platdata smdkc110_ide_pdata __initdata = { | |||
81 | static struct platform_device *smdkc110_devices[] __initdata = { | 82 | static struct platform_device *smdkc110_devices[] __initdata = { |
82 | &s5pv210_device_iis0, | 83 | &s5pv210_device_iis0, |
83 | &s5pv210_device_ac97, | 84 | &s5pv210_device_ac97, |
85 | &s5pv210_device_spdif, | ||
84 | &s3c_device_cfcon, | 86 | &s3c_device_cfcon, |
85 | &s3c_device_i2c0, | 87 | &s3c_device_i2c0, |
86 | &s3c_device_i2c1, | 88 | &s3c_device_i2c1, |
@@ -110,6 +112,8 @@ static void __init smdkc110_map_io(void) | |||
110 | 112 | ||
111 | static void __init smdkc110_machine_init(void) | 113 | static void __init smdkc110_machine_init(void) |
112 | { | 114 | { |
115 | s3c_pm_init(); | ||
116 | |||
113 | s3c_i2c0_set_platdata(NULL); | 117 | s3c_i2c0_set_platdata(NULL); |
114 | s3c_i2c1_set_platdata(NULL); | 118 | s3c_i2c1_set_platdata(NULL); |
115 | s3c_i2c2_set_platdata(NULL); | 119 | s3c_i2c2_set_platdata(NULL); |
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c index 83189ae9da9a..bcd7a5d53401 100644 --- a/arch/arm/mach-s5pv210/mach-smdkv210.c +++ b/arch/arm/mach-s5pv210/mach-smdkv210.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <plat/ata.h> | 31 | #include <plat/ata.h> |
32 | #include <plat/iic.h> | 32 | #include <plat/iic.h> |
33 | #include <plat/keypad.h> | 33 | #include <plat/keypad.h> |
34 | #include <plat/pm.h> | ||
34 | 35 | ||
35 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 36 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
36 | #define SMDKV210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 37 | #define SMDKV210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
@@ -103,6 +104,7 @@ static struct samsung_keypad_platdata smdkv210_keypad_data __initdata = { | |||
103 | static struct platform_device *smdkv210_devices[] __initdata = { | 104 | static struct platform_device *smdkv210_devices[] __initdata = { |
104 | &s5pv210_device_iis0, | 105 | &s5pv210_device_iis0, |
105 | &s5pv210_device_ac97, | 106 | &s5pv210_device_ac97, |
107 | &s5pv210_device_spdif, | ||
106 | &s3c_device_adc, | 108 | &s3c_device_adc, |
107 | &s3c_device_cfcon, | 109 | &s3c_device_cfcon, |
108 | &s3c_device_hsmmc0, | 110 | &s3c_device_hsmmc0, |
@@ -145,6 +147,8 @@ static void __init smdkv210_map_io(void) | |||
145 | 147 | ||
146 | static void __init smdkv210_machine_init(void) | 148 | static void __init smdkv210_machine_init(void) |
147 | { | 149 | { |
150 | s3c_pm_init(); | ||
151 | |||
148 | samsung_keypad_set_platdata(&smdkv210_keypad_data); | 152 | samsung_keypad_set_platdata(&smdkv210_keypad_data); |
149 | s3c24xx_ts_set_platdata(&s3c_ts_platform); | 153 | s3c24xx_ts_set_platdata(&s3c_ts_platform); |
150 | 154 | ||
diff --git a/arch/arm/mach-s5pv210/mach-torbreck.c b/arch/arm/mach-s5pv210/mach-torbreck.c new file mode 100644 index 000000000000..043c938806b0 --- /dev/null +++ b/arch/arm/mach-s5pv210/mach-torbreck.c | |||
@@ -0,0 +1,131 @@ | |||
1 | /* linux/arch/arm/mach-s5pv210/mach-torbreck.c | ||
2 | * | ||
3 | * Copyright (c) 2010 aESOP Community | ||
4 | * http://www.aesop.or.kr/ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/types.h> | ||
13 | #include <linux/i2c.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/serial_core.h> | ||
16 | |||
17 | #include <asm/mach/arch.h> | ||
18 | #include <asm/mach/map.h> | ||
19 | #include <asm/setup.h> | ||
20 | #include <asm/mach-types.h> | ||
21 | |||
22 | #include <mach/map.h> | ||
23 | #include <mach/regs-clock.h> | ||
24 | |||
25 | #include <plat/regs-serial.h> | ||
26 | #include <plat/s5pv210.h> | ||
27 | #include <plat/devs.h> | ||
28 | #include <plat/cpu.h> | ||
29 | #include <plat/iic.h> | ||
30 | |||
31 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | ||
32 | #define TORBRECK_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | ||
33 | S3C2410_UCON_RXILEVEL | \ | ||
34 | S3C2410_UCON_TXIRQMODE | \ | ||
35 | S3C2410_UCON_RXIRQMODE | \ | ||
36 | S3C2410_UCON_RXFIFO_TOI | \ | ||
37 | S3C2443_UCON_RXERR_IRQEN) | ||
38 | |||
39 | #define TORBRECK_ULCON_DEFAULT S3C2410_LCON_CS8 | ||
40 | |||
41 | #define TORBRECK_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \ | ||
42 | S5PV210_UFCON_TXTRIG4 | \ | ||
43 | S5PV210_UFCON_RXTRIG4) | ||
44 | |||
45 | static struct s3c2410_uartcfg torbreck_uartcfgs[] __initdata = { | ||
46 | [0] = { | ||
47 | .hwport = 0, | ||
48 | .flags = 0, | ||
49 | .ucon = TORBRECK_UCON_DEFAULT, | ||
50 | .ulcon = TORBRECK_ULCON_DEFAULT, | ||
51 | .ufcon = TORBRECK_UFCON_DEFAULT, | ||
52 | }, | ||
53 | [1] = { | ||
54 | .hwport = 1, | ||
55 | .flags = 0, | ||
56 | .ucon = TORBRECK_UCON_DEFAULT, | ||
57 | .ulcon = TORBRECK_ULCON_DEFAULT, | ||
58 | .ufcon = TORBRECK_UFCON_DEFAULT, | ||
59 | }, | ||
60 | [2] = { | ||
61 | .hwport = 2, | ||
62 | .flags = 0, | ||
63 | .ucon = TORBRECK_UCON_DEFAULT, | ||
64 | .ulcon = TORBRECK_ULCON_DEFAULT, | ||
65 | .ufcon = TORBRECK_UFCON_DEFAULT, | ||
66 | }, | ||
67 | [3] = { | ||
68 | .hwport = 3, | ||
69 | .flags = 0, | ||
70 | .ucon = TORBRECK_UCON_DEFAULT, | ||
71 | .ulcon = TORBRECK_ULCON_DEFAULT, | ||
72 | .ufcon = TORBRECK_UFCON_DEFAULT, | ||
73 | }, | ||
74 | }; | ||
75 | |||
76 | static struct platform_device *torbreck_devices[] __initdata = { | ||
77 | &s5pv210_device_iis0, | ||
78 | &s3c_device_cfcon, | ||
79 | &s3c_device_hsmmc0, | ||
80 | &s3c_device_hsmmc1, | ||
81 | &s3c_device_hsmmc2, | ||
82 | &s3c_device_hsmmc3, | ||
83 | &s3c_device_i2c0, | ||
84 | &s3c_device_i2c1, | ||
85 | &s3c_device_i2c2, | ||
86 | &s3c_device_rtc, | ||
87 | &s3c_device_wdt, | ||
88 | }; | ||
89 | |||
90 | static struct i2c_board_info torbreck_i2c_devs0[] __initdata = { | ||
91 | /* To Be Updated */ | ||
92 | }; | ||
93 | |||
94 | static struct i2c_board_info torbreck_i2c_devs1[] __initdata = { | ||
95 | /* To Be Updated */ | ||
96 | }; | ||
97 | |||
98 | static struct i2c_board_info torbreck_i2c_devs2[] __initdata = { | ||
99 | /* To Be Updated */ | ||
100 | }; | ||
101 | |||
102 | static void __init torbreck_map_io(void) | ||
103 | { | ||
104 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | ||
105 | s3c24xx_init_clocks(24000000); | ||
106 | s3c24xx_init_uarts(torbreck_uartcfgs, ARRAY_SIZE(torbreck_uartcfgs)); | ||
107 | } | ||
108 | |||
109 | static void __init torbreck_machine_init(void) | ||
110 | { | ||
111 | s3c_i2c0_set_platdata(NULL); | ||
112 | s3c_i2c1_set_platdata(NULL); | ||
113 | s3c_i2c2_set_platdata(NULL); | ||
114 | i2c_register_board_info(0, torbreck_i2c_devs0, | ||
115 | ARRAY_SIZE(torbreck_i2c_devs0)); | ||
116 | i2c_register_board_info(1, torbreck_i2c_devs1, | ||
117 | ARRAY_SIZE(torbreck_i2c_devs1)); | ||
118 | i2c_register_board_info(2, torbreck_i2c_devs2, | ||
119 | ARRAY_SIZE(torbreck_i2c_devs2)); | ||
120 | |||
121 | platform_add_devices(torbreck_devices, ARRAY_SIZE(torbreck_devices)); | ||
122 | } | ||
123 | |||
124 | MACHINE_START(TORBRECK, "TORBRECK") | ||
125 | /* Maintainer: Hyunchul Ko <ghcstop@gmail.com> */ | ||
126 | .boot_params = S5P_PA_SDRAM + 0x100, | ||
127 | .init_irq = s5pv210_init_irq, | ||
128 | .map_io = torbreck_map_io, | ||
129 | .init_machine = torbreck_machine_init, | ||
130 | .timer = &s3c24xx_timer, | ||
131 | MACHINE_END | ||
diff --git a/arch/arm/mach-s5pv210/pm.c b/arch/arm/mach-s5pv210/pm.c new file mode 100644 index 000000000000..549d7924fd4c --- /dev/null +++ b/arch/arm/mach-s5pv210/pm.c | |||
@@ -0,0 +1,166 @@ | |||
1 | /* linux/arch/arm/mach-s5pv210/pm.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * S5PV210 - Power Management support | ||
7 | * | ||
8 | * Based on arch/arm/mach-s3c2410/pm.c | ||
9 | * Copyright (c) 2006 Simtec Electronics | ||
10 | * Ben Dooks <ben@simtec.co.uk> | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License version 2 as | ||
14 | * published by the Free Software Foundation. | ||
15 | */ | ||
16 | |||
17 | #include <linux/init.h> | ||
18 | #include <linux/suspend.h> | ||
19 | #include <linux/io.h> | ||
20 | |||
21 | #include <plat/cpu.h> | ||
22 | #include <plat/pm.h> | ||
23 | #include <plat/regs-timer.h> | ||
24 | |||
25 | #include <mach/regs-irq.h> | ||
26 | #include <mach/regs-clock.h> | ||
27 | |||
28 | static struct sleep_save s5pv210_core_save[] = { | ||
29 | /* Clock source */ | ||
30 | SAVE_ITEM(S5P_CLK_SRC0), | ||
31 | SAVE_ITEM(S5P_CLK_SRC1), | ||
32 | SAVE_ITEM(S5P_CLK_SRC2), | ||
33 | SAVE_ITEM(S5P_CLK_SRC3), | ||
34 | SAVE_ITEM(S5P_CLK_SRC4), | ||
35 | SAVE_ITEM(S5P_CLK_SRC5), | ||
36 | SAVE_ITEM(S5P_CLK_SRC6), | ||
37 | |||
38 | /* Clock source Mask */ | ||
39 | SAVE_ITEM(S5P_CLK_SRC_MASK0), | ||
40 | SAVE_ITEM(S5P_CLK_SRC_MASK1), | ||
41 | |||
42 | /* Clock Divider */ | ||
43 | SAVE_ITEM(S5P_CLK_DIV0), | ||
44 | SAVE_ITEM(S5P_CLK_DIV1), | ||
45 | SAVE_ITEM(S5P_CLK_DIV2), | ||
46 | SAVE_ITEM(S5P_CLK_DIV3), | ||
47 | SAVE_ITEM(S5P_CLK_DIV4), | ||
48 | SAVE_ITEM(S5P_CLK_DIV5), | ||
49 | SAVE_ITEM(S5P_CLK_DIV6), | ||
50 | SAVE_ITEM(S5P_CLK_DIV7), | ||
51 | |||
52 | /* Clock Main Gate */ | ||
53 | SAVE_ITEM(S5P_CLKGATE_MAIN0), | ||
54 | SAVE_ITEM(S5P_CLKGATE_MAIN1), | ||
55 | SAVE_ITEM(S5P_CLKGATE_MAIN2), | ||
56 | |||
57 | /* Clock source Peri Gate */ | ||
58 | SAVE_ITEM(S5P_CLKGATE_PERI0), | ||
59 | SAVE_ITEM(S5P_CLKGATE_PERI1), | ||
60 | |||
61 | /* Clock source SCLK Gate */ | ||
62 | SAVE_ITEM(S5P_CLKGATE_SCLK0), | ||
63 | SAVE_ITEM(S5P_CLKGATE_SCLK1), | ||
64 | |||
65 | /* Clock IP Clock gate */ | ||
66 | SAVE_ITEM(S5P_CLKGATE_IP0), | ||
67 | SAVE_ITEM(S5P_CLKGATE_IP1), | ||
68 | SAVE_ITEM(S5P_CLKGATE_IP2), | ||
69 | SAVE_ITEM(S5P_CLKGATE_IP3), | ||
70 | SAVE_ITEM(S5P_CLKGATE_IP4), | ||
71 | |||
72 | /* Clock Blcok and Bus gate */ | ||
73 | SAVE_ITEM(S5P_CLKGATE_BLOCK), | ||
74 | SAVE_ITEM(S5P_CLKGATE_BUS0), | ||
75 | |||
76 | /* Clock ETC */ | ||
77 | SAVE_ITEM(S5P_CLK_OUT), | ||
78 | SAVE_ITEM(S5P_MDNIE_SEL), | ||
79 | |||
80 | /* PWM Register */ | ||
81 | SAVE_ITEM(S3C2410_TCFG0), | ||
82 | SAVE_ITEM(S3C2410_TCFG1), | ||
83 | SAVE_ITEM(S3C64XX_TINT_CSTAT), | ||
84 | SAVE_ITEM(S3C2410_TCON), | ||
85 | SAVE_ITEM(S3C2410_TCNTB(0)), | ||
86 | SAVE_ITEM(S3C2410_TCMPB(0)), | ||
87 | SAVE_ITEM(S3C2410_TCNTO(0)), | ||
88 | }; | ||
89 | |||
90 | void s5pv210_cpu_suspend(void) | ||
91 | { | ||
92 | unsigned long tmp; | ||
93 | |||
94 | /* issue the standby signal into the pm unit. Note, we | ||
95 | * issue a write-buffer drain just in case */ | ||
96 | |||
97 | tmp = 0; | ||
98 | |||
99 | asm("b 1f\n\t" | ||
100 | ".align 5\n\t" | ||
101 | "1:\n\t" | ||
102 | "mcr p15, 0, %0, c7, c10, 5\n\t" | ||
103 | "mcr p15, 0, %0, c7, c10, 4\n\t" | ||
104 | "wfi" : : "r" (tmp)); | ||
105 | |||
106 | /* we should never get past here */ | ||
107 | panic("sleep resumed to originator?"); | ||
108 | } | ||
109 | |||
110 | static void s5pv210_pm_prepare(void) | ||
111 | { | ||
112 | unsigned int tmp; | ||
113 | |||
114 | /* ensure at least INFORM0 has the resume address */ | ||
115 | __raw_writel(virt_to_phys(s3c_cpu_resume), S5P_INFORM0); | ||
116 | |||
117 | tmp = __raw_readl(S5P_SLEEP_CFG); | ||
118 | tmp &= ~(S5P_SLEEP_CFG_OSC_EN | S5P_SLEEP_CFG_USBOSC_EN); | ||
119 | __raw_writel(tmp, S5P_SLEEP_CFG); | ||
120 | |||
121 | /* WFI for SLEEP mode configuration by SYSCON */ | ||
122 | tmp = __raw_readl(S5P_PWR_CFG); | ||
123 | tmp &= S5P_CFG_WFI_CLEAN; | ||
124 | tmp |= S5P_CFG_WFI_SLEEP; | ||
125 | __raw_writel(tmp, S5P_PWR_CFG); | ||
126 | |||
127 | /* SYSCON interrupt handling disable */ | ||
128 | tmp = __raw_readl(S5P_OTHERS); | ||
129 | tmp |= S5P_OTHER_SYSC_INTOFF; | ||
130 | __raw_writel(tmp, S5P_OTHERS); | ||
131 | |||
132 | s3c_pm_do_save(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save)); | ||
133 | } | ||
134 | |||
135 | static int s5pv210_pm_add(struct sys_device *sysdev) | ||
136 | { | ||
137 | pm_cpu_prep = s5pv210_pm_prepare; | ||
138 | pm_cpu_sleep = s5pv210_cpu_suspend; | ||
139 | |||
140 | return 0; | ||
141 | } | ||
142 | |||
143 | static int s5pv210_pm_resume(struct sys_device *dev) | ||
144 | { | ||
145 | u32 tmp; | ||
146 | |||
147 | tmp = __raw_readl(S5P_OTHERS); | ||
148 | tmp |= (S5P_OTHERS_RET_IO | S5P_OTHERS_RET_CF |\ | ||
149 | S5P_OTHERS_RET_MMC | S5P_OTHERS_RET_UART); | ||
150 | __raw_writel(tmp , S5P_OTHERS); | ||
151 | |||
152 | s3c_pm_do_restore_core(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save)); | ||
153 | |||
154 | return 0; | ||
155 | } | ||
156 | |||
157 | static struct sysdev_driver s5pv210_pm_driver = { | ||
158 | .add = s5pv210_pm_add, | ||
159 | .resume = s5pv210_pm_resume, | ||
160 | }; | ||
161 | |||
162 | static __init int s5pv210_pm_drvinit(void) | ||
163 | { | ||
164 | return sysdev_driver_register(&s5pv210_sysclass, &s5pv210_pm_driver); | ||
165 | } | ||
166 | arch_initcall(s5pv210_pm_drvinit); | ||
diff --git a/arch/arm/mach-s5pv210/setup-fb-24bpp.c b/arch/arm/mach-s5pv210/setup-fb-24bpp.c index 928cf1f125fa..e932ebfac56d 100644 --- a/arch/arm/mach-s5pv210/setup-fb-24bpp.c +++ b/arch/arm/mach-s5pv210/setup-fb-24bpp.c | |||
@@ -21,33 +21,21 @@ | |||
21 | #include <mach/regs-clock.h> | 21 | #include <mach/regs-clock.h> |
22 | #include <plat/gpio-cfg.h> | 22 | #include <plat/gpio-cfg.h> |
23 | 23 | ||
24 | void s5pv210_fb_gpio_setup_24bpp(void) | 24 | static void s5pv210_fb_cfg_gpios(unsigned int base, unsigned int nr) |
25 | { | 25 | { |
26 | unsigned int gpio = 0; | 26 | s3c_gpio_cfgrange_nopull(base, nr, S3C_GPIO_SFN(2)); |
27 | |||
28 | for (gpio = S5PV210_GPF0(0); gpio <= S5PV210_GPF0(7); gpio++) { | ||
29 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
30 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
31 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
32 | } | ||
33 | 27 | ||
34 | for (gpio = S5PV210_GPF1(0); gpio <= S5PV210_GPF1(7); gpio++) { | 28 | for (; nr > 0; nr--, base++) |
35 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | 29 | s5p_gpio_set_drvstr(base, S5P_GPIO_DRVSTR_LV4); |
36 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | 30 | } |
37 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
38 | } | ||
39 | 31 | ||
40 | for (gpio = S5PV210_GPF2(0); gpio <= S5PV210_GPF2(7); gpio++) { | ||
41 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
42 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
43 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
44 | } | ||
45 | 32 | ||
46 | for (gpio = S5PV210_GPF3(0); gpio <= S5PV210_GPF3(3); gpio++) { | 33 | void s5pv210_fb_gpio_setup_24bpp(void) |
47 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | 34 | { |
48 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | 35 | s5pv210_fb_cfg_gpios(S5PV210_GPF0(0), 8); |
49 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | 36 | s5pv210_fb_cfg_gpios(S5PV210_GPF1(0), 8); |
50 | } | 37 | s5pv210_fb_cfg_gpios(S5PV210_GPF2(0), 8); |
38 | s5pv210_fb_cfg_gpios(S5PV210_GPF3(0), 4); | ||
51 | 39 | ||
52 | /* Set DISPLAY_CONTROL register for Display path selection. | 40 | /* Set DISPLAY_CONTROL register for Display path selection. |
53 | * | 41 | * |
diff --git a/arch/arm/mach-s5pv210/setup-i2c0.c b/arch/arm/mach-s5pv210/setup-i2c0.c index d38f7cb7e662..0f1cc3a1c1e8 100644 --- a/arch/arm/mach-s5pv210/setup-i2c0.c +++ b/arch/arm/mach-s5pv210/setup-i2c0.c | |||
@@ -23,8 +23,6 @@ struct platform_device; /* don't need the contents */ | |||
23 | 23 | ||
24 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) | 24 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) |
25 | { | 25 | { |
26 | s3c_gpio_cfgpin(S5PV210_GPD1(0), S3C_GPIO_SFN(2)); | 26 | s3c_gpio_cfgall_range(S5PV210_GPD1(0), 2, |
27 | s3c_gpio_setpull(S5PV210_GPD1(0), S3C_GPIO_PULL_UP); | 27 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
28 | s3c_gpio_cfgpin(S5PV210_GPD1(1), S3C_GPIO_SFN(2)); | ||
29 | s3c_gpio_setpull(S5PV210_GPD1(1), S3C_GPIO_PULL_UP); | ||
30 | } | 28 | } |
diff --git a/arch/arm/mach-s5pv210/setup-i2c1.c b/arch/arm/mach-s5pv210/setup-i2c1.c index 148bb7857d89..f61365a34c56 100644 --- a/arch/arm/mach-s5pv210/setup-i2c1.c +++ b/arch/arm/mach-s5pv210/setup-i2c1.c | |||
@@ -23,8 +23,6 @@ struct platform_device; /* don't need the contents */ | |||
23 | 23 | ||
24 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) | 24 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) |
25 | { | 25 | { |
26 | s3c_gpio_cfgpin(S5PV210_GPD1(2), S3C_GPIO_SFN(2)); | 26 | s3c_gpio_cfgall_range(S5PV210_GPD1(2), 2, |
27 | s3c_gpio_setpull(S5PV210_GPD1(2), S3C_GPIO_PULL_UP); | 27 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
28 | s3c_gpio_cfgpin(S5PV210_GPD1(3), S3C_GPIO_SFN(2)); | ||
29 | s3c_gpio_setpull(S5PV210_GPD1(3), S3C_GPIO_PULL_UP); | ||
30 | } | 28 | } |
diff --git a/arch/arm/mach-s5pv210/setup-i2c2.c b/arch/arm/mach-s5pv210/setup-i2c2.c index 2396cb8c373e..2f91b5cefbc6 100644 --- a/arch/arm/mach-s5pv210/setup-i2c2.c +++ b/arch/arm/mach-s5pv210/setup-i2c2.c | |||
@@ -23,8 +23,6 @@ struct platform_device; /* don't need the contents */ | |||
23 | 23 | ||
24 | void s3c_i2c2_cfg_gpio(struct platform_device *dev) | 24 | void s3c_i2c2_cfg_gpio(struct platform_device *dev) |
25 | { | 25 | { |
26 | s3c_gpio_cfgpin(S5PV210_GPD1(4), S3C_GPIO_SFN(2)); | 26 | s3c_gpio_cfgall_range(S5PV210_GPD1(4), 2, |
27 | s3c_gpio_setpull(S5PV210_GPD1(4), S3C_GPIO_PULL_UP); | 27 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
28 | s3c_gpio_cfgpin(S5PV210_GPD1(5), S3C_GPIO_SFN(2)); | ||
29 | s3c_gpio_setpull(S5PV210_GPD1(5), S3C_GPIO_PULL_UP); | ||
30 | } | 28 | } |
diff --git a/arch/arm/mach-s5pv210/setup-ide.c b/arch/arm/mach-s5pv210/setup-ide.c index b558b1cc8d60..ea123d546bd2 100644 --- a/arch/arm/mach-s5pv210/setup-ide.c +++ b/arch/arm/mach-s5pv210/setup-ide.c | |||
@@ -15,36 +15,25 @@ | |||
15 | 15 | ||
16 | #include <plat/gpio-cfg.h> | 16 | #include <plat/gpio-cfg.h> |
17 | 17 | ||
18 | static void s5pv210_ide_cfg_gpios(unsigned int base, unsigned int nr) | ||
19 | { | ||
20 | s3c_gpio_cfgrange_nopull(base, nr, S3C_GPIO_SFN(4)); | ||
21 | |||
22 | for (; nr > 0; nr--, base++) | ||
23 | s5p_gpio_set_drvstr(base, S5P_GPIO_DRVSTR_LV4); | ||
24 | } | ||
25 | |||
18 | void s5pv210_ide_setup_gpio(void) | 26 | void s5pv210_ide_setup_gpio(void) |
19 | { | 27 | { |
20 | unsigned int gpio = 0; | 28 | /* CF_Add[0 - 2], CF_IORDY, CF_INTRQ, CF_DMARQ, CF_DMARST, CF_DMACK */ |
21 | 29 | s5pv210_ide_cfg_gpios(S5PV210_GPJ0(0), 8); | |
22 | for (gpio = S5PV210_GPJ0(0); gpio <= S5PV210_GPJ0(7); gpio++) { | 30 | |
23 | /* CF_Add[0 - 2], CF_IORDY, CF_INTRQ, CF_DMARQ, CF_DMARST, | 31 | /* CF_Data[0 - 7] */ |
24 | CF_DMACK */ | 32 | s5pv210_ide_cfg_gpios(S5PV210_GPJ2(0), 8); |
25 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(4)); | 33 | |
26 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | 34 | /* CF_Data[8 - 15] */ |
27 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | 35 | s5pv210_ide_cfg_gpios(S5PV210_GPJ3(0), 8); |
28 | } | 36 | |
29 | 37 | /* CF_CS0, CF_CS1, CF_IORD, CF_IOWR */ | |
30 | for (gpio = S5PV210_GPJ2(0); gpio <= S5PV210_GPJ2(7); gpio++) { | 38 | s5pv210_ide_cfg_gpios(S5PV210_GPJ4(0), 4); |
31 | /*CF_Data[0 - 7] */ | ||
32 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(4)); | ||
33 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
34 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
35 | } | ||
36 | |||
37 | for (gpio = S5PV210_GPJ3(0); gpio <= S5PV210_GPJ3(7); gpio++) { | ||
38 | /* CF_Data[8 - 15] */ | ||
39 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(4)); | ||
40 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
41 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
42 | } | ||
43 | |||
44 | for (gpio = S5PV210_GPJ4(0); gpio <= S5PV210_GPJ4(3); gpio++) { | ||
45 | /* CF_CS0, CF_CS1, CF_IORD, CF_IOWR */ | ||
46 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(4)); | ||
47 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
48 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
49 | } | ||
50 | } | 39 | } |
diff --git a/arch/arm/mach-s5pv210/setup-keypad.c b/arch/arm/mach-s5pv210/setup-keypad.c index 37b2790aafc3..c56420a52f48 100644 --- a/arch/arm/mach-s5pv210/setup-keypad.c +++ b/arch/arm/mach-s5pv210/setup-keypad.c | |||
@@ -16,19 +16,9 @@ | |||
16 | 16 | ||
17 | void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols) | 17 | void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols) |
18 | { | 18 | { |
19 | unsigned int gpio, end; | ||
20 | |||
21 | /* Set all the necessary GPH3 pins to special-function 3: KP_ROW[x] */ | 19 | /* Set all the necessary GPH3 pins to special-function 3: KP_ROW[x] */ |
22 | end = S5PV210_GPH3(rows); | 20 | s3c_gpio_cfgrange_nopull(S5PV210_GPH3(0), rows, S3C_GPIO_SFN(3)); |
23 | for (gpio = S5PV210_GPH3(0); gpio < end; gpio++) { | ||
24 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
25 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
26 | } | ||
27 | 21 | ||
28 | /* Set all the necessary GPH2 pins to special-function 3: KP_COL[x] */ | 22 | /* Set all the necessary GPH2 pins to special-function 3: KP_COL[x] */ |
29 | end = S5PV210_GPH2(cols); | 23 | s3c_gpio_cfgrange_nopull(S5PV210_GPH2(0), cols, S3C_GPIO_SFN(3)); |
30 | for (gpio = S5PV210_GPH2(0); gpio < end; gpio++) { | ||
31 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
32 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
33 | } | ||
34 | } | 24 | } |
diff --git a/arch/arm/mach-s5pv210/setup-sdhci-gpio.c b/arch/arm/mach-s5pv210/setup-sdhci-gpio.c index b18587b1ec58..746777d56df9 100644 --- a/arch/arm/mach-s5pv210/setup-sdhci-gpio.c +++ b/arch/arm/mach-s5pv210/setup-sdhci-gpio.c | |||
@@ -26,26 +26,17 @@ | |||
26 | void s5pv210_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | 26 | void s5pv210_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) |
27 | { | 27 | { |
28 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | 28 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; |
29 | unsigned int gpio; | ||
30 | 29 | ||
31 | /* Set all the necessary GPG0/GPG1 pins to special-function 2 */ | 30 | /* Set all the necessary GPG0/GPG1 pins to special-function 2 */ |
32 | for (gpio = S5PV210_GPG0(0); gpio < S5PV210_GPG0(2); gpio++) { | 31 | s3c_gpio_cfgrange_nopull(S5PV210_GPG0(0), 2, S3C_GPIO_SFN(2)); |
33 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | 32 | |
34 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
35 | } | ||
36 | switch (width) { | 33 | switch (width) { |
37 | case 8: | 34 | case 8: |
38 | /* GPG1[3:6] special-funtion 3 */ | 35 | /* GPG1[3:6] special-funtion 3 */ |
39 | for (gpio = S5PV210_GPG1(3); gpio <= S5PV210_GPG1(6); gpio++) { | 36 | s3c_gpio_cfgrange_nopull(S5PV210_GPG1(3), 4, S3C_GPIO_SFN(3)); |
40 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
41 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
42 | } | ||
43 | case 4: | 37 | case 4: |
44 | /* GPG0[3:6] special-funtion 2 */ | 38 | /* GPG0[3:6] special-funtion 2 */ |
45 | for (gpio = S5PV210_GPG0(3); gpio <= S5PV210_GPG0(6); gpio++) { | 39 | s3c_gpio_cfgrange_nopull(S5PV210_GPG0(3), 4, S3C_GPIO_SFN(2)); |
46 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
47 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
48 | } | ||
49 | default: | 40 | default: |
50 | break; | 41 | break; |
51 | } | 42 | } |
@@ -59,19 +50,12 @@ void s5pv210_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | |||
59 | void s5pv210_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) | 50 | void s5pv210_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) |
60 | { | 51 | { |
61 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | 52 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; |
62 | unsigned int gpio; | ||
63 | 53 | ||
64 | /* Set all the necessary GPG1[0:1] pins to special-function 2 */ | 54 | /* Set all the necessary GPG1[0:1] pins to special-function 2 */ |
65 | for (gpio = S5PV210_GPG1(0); gpio < S5PV210_GPG1(2); gpio++) { | 55 | s3c_gpio_cfgrange_nopull(S5PV210_GPG1(0), 2, S3C_GPIO_SFN(2)); |
66 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
67 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
68 | } | ||
69 | 56 | ||
70 | /* Data pin GPG1[3:6] to special-function 2 */ | 57 | /* Data pin GPG1[3:6] to special-function 2 */ |
71 | for (gpio = S5PV210_GPG1(3); gpio <= S5PV210_GPG1(6); gpio++) { | 58 | s3c_gpio_cfgrange_nopull(S5PV210_GPG1(3), 4, S3C_GPIO_SFN(2)); |
72 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
73 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
74 | } | ||
75 | 59 | ||
76 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | 60 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { |
77 | s3c_gpio_setpull(S5PV210_GPG1(2), S3C_GPIO_PULL_UP); | 61 | s3c_gpio_setpull(S5PV210_GPG1(2), S3C_GPIO_PULL_UP); |
@@ -82,27 +66,17 @@ void s5pv210_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) | |||
82 | void s5pv210_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width) | 66 | void s5pv210_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width) |
83 | { | 67 | { |
84 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | 68 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; |
85 | unsigned int gpio; | ||
86 | 69 | ||
87 | /* Set all the necessary GPG2[0:1] pins to special-function 2 */ | 70 | /* Set all the necessary GPG2[0:1] pins to special-function 2 */ |
88 | for (gpio = S5PV210_GPG2(0); gpio < S5PV210_GPG2(2); gpio++) { | 71 | s3c_gpio_cfgrange_nopull(S5PV210_GPG2(0), 2, S3C_GPIO_SFN(2)); |
89 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
90 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
91 | } | ||
92 | 72 | ||
93 | switch (width) { | 73 | switch (width) { |
94 | case 8: | 74 | case 8: |
95 | /* Data pin GPG3[3:6] to special-function 3 */ | 75 | /* Data pin GPG3[3:6] to special-function 3 */ |
96 | for (gpio = S5PV210_GPG3(3); gpio <= S5PV210_GPG3(6); gpio++) { | 76 | s3c_gpio_cfgrange_nopull(S5PV210_GPG3(3), 4, S3C_GPIO_SFN(3)); |
97 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
98 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
99 | } | ||
100 | case 4: | 77 | case 4: |
101 | /* Data pin GPG2[3:6] to special-function 2 */ | 78 | /* Data pin GPG2[3:6] to special-function 2 */ |
102 | for (gpio = S5PV210_GPG2(3); gpio <= S5PV210_GPG2(6); gpio++) { | 79 | s3c_gpio_cfgrange_nopull(S5PV210_GPG2(3), 4, S3C_GPIO_SFN(2)); |
103 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
104 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
105 | } | ||
106 | default: | 80 | default: |
107 | break; | 81 | break; |
108 | } | 82 | } |
@@ -116,19 +90,12 @@ void s5pv210_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width) | |||
116 | void s5pv210_setup_sdhci3_cfg_gpio(struct platform_device *dev, int width) | 90 | void s5pv210_setup_sdhci3_cfg_gpio(struct platform_device *dev, int width) |
117 | { | 91 | { |
118 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | 92 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; |
119 | unsigned int gpio; | ||
120 | 93 | ||
121 | /* Set all the necessary GPG3[0:2] pins to special-function 2 */ | 94 | /* Set all the necessary GPG3[0:1] pins to special-function 2 */ |
122 | for (gpio = S5PV210_GPG3(0); gpio < S5PV210_GPG3(2); gpio++) { | 95 | s3c_gpio_cfgrange_nopull(S5PV210_GPG3(0), 2, S3C_GPIO_SFN(2)); |
123 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
124 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
125 | } | ||
126 | 96 | ||
127 | /* Data pin GPG3[3:6] to special-function 2 */ | 97 | /* Data pin GPG3[3:6] to special-function 2 */ |
128 | for (gpio = S5PV210_GPG3(3); gpio <= S5PV210_GPG3(6); gpio++) { | 98 | s3c_gpio_cfgrange_nopull(S5PV210_GPG3(3), 4, S3C_GPIO_SFN(2)); |
129 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
130 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
131 | } | ||
132 | 99 | ||
133 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | 100 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { |
134 | s3c_gpio_setpull(S5PV210_GPG3(2), S3C_GPIO_PULL_UP); | 101 | s3c_gpio_setpull(S5PV210_GPG3(2), S3C_GPIO_PULL_UP); |
diff --git a/arch/arm/mach-s5pv210/sleep.S b/arch/arm/mach-s5pv210/sleep.S new file mode 100644 index 000000000000..d4d222b716b4 --- /dev/null +++ b/arch/arm/mach-s5pv210/sleep.S | |||
@@ -0,0 +1,170 @@ | |||
1 | /* linux/arch/arm/plat-s5p/sleep.S | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * S5PV210 power Manager (Suspend-To-RAM) support | ||
7 | * Based on S3C2410 sleep code by: | ||
8 | * Ben Dooks, (c) 2004 Simtec Electronics | ||
9 | * | ||
10 | * Based on PXA/SA1100 sleep code by: | ||
11 | * Nicolas Pitre, (c) 2002 Monta Vista Software Inc | ||
12 | * Cliff Brake, (c) 2001 | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | ||
15 | * it under the terms of the GNU General Public License as published by | ||
16 | * the Free Software Foundation; either version 2 of the License, or | ||
17 | * (at your option) any later version. | ||
18 | * | ||
19 | * This program is distributed in the hope that it will be useful, | ||
20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
22 | * GNU General Public License for more details. | ||
23 | * | ||
24 | * You should have received a copy of the GNU General Public License | ||
25 | * along with this program; if not, write to the Free Software | ||
26 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
27 | */ | ||
28 | |||
29 | #include <linux/linkage.h> | ||
30 | #include <asm/assembler.h> | ||
31 | #include <asm/memory.h> | ||
32 | |||
33 | .text | ||
34 | |||
35 | /* s3c_cpu_save | ||
36 | * | ||
37 | * entry: | ||
38 | * r0 = save address (virtual addr of s3c_sleep_save_phys) | ||
39 | */ | ||
40 | |||
41 | ENTRY(s3c_cpu_save) | ||
42 | |||
43 | stmfd sp!, { r3 - r12, lr } | ||
44 | |||
45 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID | ||
46 | mrc p15, 0, r5, c3, c0, 0 @ Domain ID | ||
47 | mrc p15, 0, r6, c2, c0, 0 @ Translation Table BASE0 | ||
48 | mrc p15, 0, r7, c2, c0, 1 @ Translation Table BASE1 | ||
49 | mrc p15, 0, r8, c2, c0, 2 @ Translation Table Control | ||
50 | mrc p15, 0, r9, c1, c0, 0 @ Control register | ||
51 | mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register | ||
52 | mrc p15, 0, r11, c1, c0, 2 @ Co-processor access controls | ||
53 | mrc p15, 0, r12, c10, c2, 0 @ Read PRRR | ||
54 | mrc p15, 0, r3, c10, c2, 1 @ READ NMRR | ||
55 | |||
56 | stmia r0, { r3 - r13 } | ||
57 | |||
58 | bl s3c_pm_cb_flushcache | ||
59 | |||
60 | ldr r0, =pm_cpu_sleep | ||
61 | ldr r0, [ r0 ] | ||
62 | mov pc, r0 | ||
63 | |||
64 | resume_with_mmu: | ||
65 | /* | ||
66 | * After MMU is turned on, restore the previous MMU table. | ||
67 | */ | ||
68 | ldr r9 , =(PAGE_OFFSET - PHYS_OFFSET) | ||
69 | add r4, r4, r9 | ||
70 | str r12, [r4] | ||
71 | |||
72 | ldmfd sp!, { r3 - r12, pc } | ||
73 | |||
74 | .ltorg | ||
75 | |||
76 | .data | ||
77 | |||
78 | .global s3c_sleep_save_phys | ||
79 | s3c_sleep_save_phys: | ||
80 | .word 0 | ||
81 | |||
82 | /* sleep magic, to allow the bootloader to check for an valid | ||
83 | * image to resume to. Must be the first word before the | ||
84 | * s3c_cpu_resume entry. | ||
85 | */ | ||
86 | |||
87 | .word 0x2bedf00d | ||
88 | |||
89 | /* s3c_cpu_resume | ||
90 | * | ||
91 | * resume code entry for bootloader to call | ||
92 | * | ||
93 | * we must put this code here in the data segment as we have no | ||
94 | * other way of restoring the stack pointer after sleep, and we | ||
95 | * must not write to the code segment (code is read-only) | ||
96 | */ | ||
97 | |||
98 | ENTRY(s3c_cpu_resume) | ||
99 | mov r0, #PSR_I_BIT | PSR_F_BIT | SVC_MODE | ||
100 | msr cpsr_c, r0 | ||
101 | |||
102 | mov r1, #0 | ||
103 | mcr p15, 0, r1, c8, c7, 0 @ invalidate TLBs | ||
104 | mcr p15, 0, r1, c7, c5, 0 @ invalidate I Cache | ||
105 | |||
106 | ldr r0, s3c_sleep_save_phys @ address of restore block | ||
107 | ldmia r0, { r3 - r13 } | ||
108 | |||
109 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID | ||
110 | mcr p15, 0, r5, c3, c0, 0 @ Domain ID | ||
111 | |||
112 | mcr p15, 0, r8, c2, c0, 2 @ Translation Table Control | ||
113 | mcr p15, 0, r7, c2, c0, 1 @ Translation Table BASE1 | ||
114 | mcr p15, 0, r6, c2, c0, 0 @ Translation Table BASE0 | ||
115 | |||
116 | mcr p15, 0, r10, c1, c0, 1 @ Auxiliary control register | ||
117 | |||
118 | mov r0, #0 | ||
119 | mcr p15, 0, r0, c8, c7, 0 @ Invalidate I & D TLB | ||
120 | |||
121 | mov r0, #0 @ restore copro access | ||
122 | mcr p15, 0, r11, c1, c0, 2 @ Co-processor access | ||
123 | mcr p15, 0, r0, c7, c5, 4 | ||
124 | |||
125 | mcr p15, 0, r12, c10, c2, 0 @ write PRRR | ||
126 | mcr p15, 0, r3, c10, c2, 1 @ write NMRR | ||
127 | |||
128 | /* | ||
129 | * In Cortex-A8, when MMU is turned on, the pipeline is flushed. | ||
130 | * And there are no valid entries in the MMU table at this point. | ||
131 | * So before turning on the MMU, the MMU entry for the DRAM address | ||
132 | * range is added. After the MMU is turned on, the other entries | ||
133 | * in the MMU table will be restored. | ||
134 | */ | ||
135 | |||
136 | /* r6 = Translation Table BASE0 */ | ||
137 | mov r4, r6 | ||
138 | mov r4, r4, LSR #14 | ||
139 | mov r4, r4, LSL #14 | ||
140 | |||
141 | /* Load address for adding to MMU table list */ | ||
142 | ldr r11, =0xE010F000 @ INFORM0 reg. | ||
143 | ldr r10, [r11, #0] | ||
144 | mov r10, r10, LSR #18 | ||
145 | bic r10, r10, #0x3 | ||
146 | orr r4, r4, r10 | ||
147 | |||
148 | /* Calculate MMU table entry */ | ||
149 | mov r10, r10, LSL #18 | ||
150 | ldr r5, =0x40E | ||
151 | orr r10, r10, r5 | ||
152 | |||
153 | /* Back up originally data */ | ||
154 | ldr r12, [r4] | ||
155 | |||
156 | /* Add calculated MMU table entry into MMU table list */ | ||
157 | str r10, [r4] | ||
158 | |||
159 | ldr r2, =resume_with_mmu | ||
160 | mcr p15, 0, r9, c1, c0, 0 @ turn on MMU, etc | ||
161 | |||
162 | nop | ||
163 | nop | ||
164 | nop | ||
165 | nop | ||
166 | nop @ second-to-last before mmu | ||
167 | |||
168 | mov pc, r2 @ go back to virtual address | ||
169 | |||
170 | .ltorg | ||
diff --git a/arch/arm/mach-s5pv310/Kconfig b/arch/arm/mach-s5pv310/Kconfig index 331b5bd97aba..1150b360f38c 100644 --- a/arch/arm/mach-s5pv310/Kconfig +++ b/arch/arm/mach-s5pv310/Kconfig | |||
@@ -11,7 +11,6 @@ if ARCH_S5PV310 | |||
11 | 11 | ||
12 | config CPU_S5PV310 | 12 | config CPU_S5PV310 |
13 | bool | 13 | bool |
14 | select PLAT_S5P | ||
15 | help | 14 | help |
16 | Enable S5PV310 CPU support | 15 | Enable S5PV310 CPU support |
17 | 16 | ||
@@ -25,21 +24,105 @@ config S5PV310_SETUP_I2C2 | |||
25 | help | 24 | help |
26 | Common setup code for i2c bus 2. | 25 | Common setup code for i2c bus 2. |
27 | 26 | ||
27 | config S5PV310_SETUP_I2C3 | ||
28 | bool | ||
29 | help | ||
30 | Common setup code for i2c bus 3. | ||
31 | |||
32 | config S5PV310_SETUP_I2C4 | ||
33 | bool | ||
34 | help | ||
35 | Common setup code for i2c bus 4. | ||
36 | |||
37 | config S5PV310_SETUP_I2C5 | ||
38 | bool | ||
39 | help | ||
40 | Common setup code for i2c bus 5. | ||
41 | |||
42 | config S5PV310_SETUP_I2C6 | ||
43 | bool | ||
44 | help | ||
45 | Common setup code for i2c bus 6. | ||
46 | |||
47 | config S5PV310_SETUP_I2C7 | ||
48 | bool | ||
49 | help | ||
50 | Common setup code for i2c bus 7. | ||
51 | |||
52 | config S5PV310_SETUP_SDHCI | ||
53 | bool | ||
54 | select S5PV310_SETUP_SDHCI_GPIO | ||
55 | help | ||
56 | Internal helper functions for S5PV310 based SDHCI systems. | ||
57 | |||
58 | config S5PV310_SETUP_SDHCI_GPIO | ||
59 | bool | ||
60 | help | ||
61 | Common setup code for SDHCI gpio. | ||
62 | |||
28 | # machine support | 63 | # machine support |
29 | 64 | ||
30 | config MACH_SMDKV310 | 65 | menu "S5PC210 Machines" |
31 | bool "SMDKV310" | 66 | |
67 | config MACH_SMDKC210 | ||
68 | bool "SMDKC210" | ||
32 | select CPU_S5PV310 | 69 | select CPU_S5PV310 |
33 | select ARCH_SPARSEMEM_ENABLE | 70 | select S3C_DEV_RTC |
71 | select S3C_DEV_WDT | ||
72 | select S3C_DEV_HSMMC | ||
73 | select S3C_DEV_HSMMC1 | ||
74 | select S3C_DEV_HSMMC2 | ||
75 | select S3C_DEV_HSMMC3 | ||
76 | select S5PV310_SETUP_SDHCI | ||
34 | help | 77 | help |
35 | Machine support for Samsung SMDKV310 | 78 | Machine support for Samsung SMDKC210 |
79 | S5PC210(MCP) is one of package option of S5PV310 | ||
36 | 80 | ||
37 | config MACH_UNIVERSAL_C210 | 81 | config MACH_UNIVERSAL_C210 |
38 | bool "Mobile UNIVERSAL_C210 Board" | 82 | bool "Mobile UNIVERSAL_C210 Board" |
39 | select CPU_S5PV310 | 83 | select CPU_S5PV310 |
40 | select ARCH_SPARSEMEM_ENABLE | 84 | select S5P_DEV_ONENAND |
85 | select S3C_DEV_I2C1 | ||
86 | select S5PV310_SETUP_I2C1 | ||
41 | help | 87 | help |
42 | Machine support for Samsung Mobile Universal S5PC210 Reference | 88 | Machine support for Samsung Mobile Universal S5PC210 Reference |
43 | Board. S5PC210(MCP) is one of package option of S5PV310 | 89 | Board. S5PC210(MCP) is one of package option of S5PV310 |
44 | 90 | ||
91 | endmenu | ||
92 | |||
93 | menu "S5PV310 Machines" | ||
94 | |||
95 | config MACH_SMDKV310 | ||
96 | bool "SMDKV310" | ||
97 | select CPU_S5PV310 | ||
98 | select S3C_DEV_RTC | ||
99 | select S3C_DEV_WDT | ||
100 | select S3C_DEV_HSMMC | ||
101 | select S3C_DEV_HSMMC1 | ||
102 | select S3C_DEV_HSMMC2 | ||
103 | select S3C_DEV_HSMMC3 | ||
104 | select S5PV310_SETUP_SDHCI | ||
105 | help | ||
106 | Machine support for Samsung SMDKV310 | ||
107 | |||
108 | endmenu | ||
109 | |||
110 | comment "Configuration for HSMMC bus width" | ||
111 | |||
112 | menu "Use 8-bit bus width" | ||
113 | |||
114 | config S5PV310_SDHCI_CH0_8BIT | ||
115 | bool "Channel 0 with 8-bit bus" | ||
116 | help | ||
117 | Support HSMMC Channel 0 8-bit bus. | ||
118 | If selected, Channel 1 is disabled. | ||
119 | |||
120 | config S5PV310_SDHCI_CH2_8BIT | ||
121 | bool "Channel 2 with 8-bit bus" | ||
122 | help | ||
123 | Support HSMMC Channel 2 8-bit bus. | ||
124 | If selected, Channel 3 is disabled. | ||
125 | |||
126 | endmenu | ||
127 | |||
45 | endif | 128 | endif |
diff --git a/arch/arm/mach-s5pv310/Makefile b/arch/arm/mach-s5pv310/Makefile index d5b51c72340f..84afc64e7c01 100644 --- a/arch/arm/mach-s5pv310/Makefile +++ b/arch/arm/mach-s5pv310/Makefile | |||
@@ -13,7 +13,7 @@ obj- := | |||
13 | # Core support for S5PV310 system | 13 | # Core support for S5PV310 system |
14 | 14 | ||
15 | obj-$(CONFIG_CPU_S5PV310) += cpu.o init.o clock.o irq-combiner.o | 15 | obj-$(CONFIG_CPU_S5PV310) += cpu.o init.o clock.o irq-combiner.o |
16 | obj-$(CONFIG_CPU_S5PV310) += setup-i2c0.o time.o | 16 | obj-$(CONFIG_CPU_S5PV310) += setup-i2c0.o time.o gpiolib.o irq-eint.o |
17 | 17 | ||
18 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o | 18 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o |
19 | obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o | 19 | obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o |
@@ -21,6 +21,7 @@ obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o | |||
21 | 21 | ||
22 | # machine support | 22 | # machine support |
23 | 23 | ||
24 | obj-$(CONFIG_MACH_SMDKC210) += mach-smdkc210.o | ||
24 | obj-$(CONFIG_MACH_SMDKV310) += mach-smdkv310.o | 25 | obj-$(CONFIG_MACH_SMDKV310) += mach-smdkv310.o |
25 | obj-$(CONFIG_MACH_UNIVERSAL_C210) += mach-universal_c210.o | 26 | obj-$(CONFIG_MACH_UNIVERSAL_C210) += mach-universal_c210.o |
26 | 27 | ||
@@ -28,3 +29,10 @@ obj-$(CONFIG_MACH_UNIVERSAL_C210) += mach-universal_c210.o | |||
28 | 29 | ||
29 | obj-$(CONFIG_S5PV310_SETUP_I2C1) += setup-i2c1.o | 30 | obj-$(CONFIG_S5PV310_SETUP_I2C1) += setup-i2c1.o |
30 | obj-$(CONFIG_S5PV310_SETUP_I2C2) += setup-i2c2.o | 31 | obj-$(CONFIG_S5PV310_SETUP_I2C2) += setup-i2c2.o |
32 | obj-$(CONFIG_S5PV310_SETUP_I2C3) += setup-i2c3.o | ||
33 | obj-$(CONFIG_S5PV310_SETUP_I2C4) += setup-i2c4.o | ||
34 | obj-$(CONFIG_S5PV310_SETUP_I2C5) += setup-i2c5.o | ||
35 | obj-$(CONFIG_S5PV310_SETUP_I2C6) += setup-i2c6.o | ||
36 | obj-$(CONFIG_S5PV310_SETUP_I2C7) += setup-i2c7.o | ||
37 | obj-$(CONFIG_S5PV310_SETUP_SDHCI) += setup-sdhci.o | ||
38 | obj-$(CONFIG_S5PV310_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | ||
diff --git a/arch/arm/mach-s5pv310/clock.c b/arch/arm/mach-s5pv310/clock.c index 26a0f03df8ea..58c9d33f36fe 100644 --- a/arch/arm/mach-s5pv310/clock.c +++ b/arch/arm/mach-s5pv310/clock.c | |||
@@ -30,16 +30,92 @@ static struct clk clk_sclk_hdmi27m = { | |||
30 | .rate = 27000000, | 30 | .rate = 27000000, |
31 | }; | 31 | }; |
32 | 32 | ||
33 | static struct clk clk_sclk_hdmiphy = { | ||
34 | .name = "sclk_hdmiphy", | ||
35 | .id = -1, | ||
36 | }; | ||
37 | |||
38 | static struct clk clk_sclk_usbphy0 = { | ||
39 | .name = "sclk_usbphy0", | ||
40 | .id = -1, | ||
41 | .rate = 27000000, | ||
42 | }; | ||
43 | |||
44 | static struct clk clk_sclk_usbphy1 = { | ||
45 | .name = "sclk_usbphy1", | ||
46 | .id = -1, | ||
47 | }; | ||
48 | |||
49 | static int s5pv310_clksrc_mask_top_ctrl(struct clk *clk, int enable) | ||
50 | { | ||
51 | return s5p_gatectrl(S5P_CLKSRC_MASK_TOP, clk, enable); | ||
52 | } | ||
53 | |||
54 | static int s5pv310_clksrc_mask_cam_ctrl(struct clk *clk, int enable) | ||
55 | { | ||
56 | return s5p_gatectrl(S5P_CLKSRC_MASK_CAM, clk, enable); | ||
57 | } | ||
58 | |||
59 | static int s5pv310_clksrc_mask_lcd0_ctrl(struct clk *clk, int enable) | ||
60 | { | ||
61 | return s5p_gatectrl(S5P_CLKSRC_MASK_LCD0, clk, enable); | ||
62 | } | ||
63 | |||
64 | static int s5pv310_clksrc_mask_lcd1_ctrl(struct clk *clk, int enable) | ||
65 | { | ||
66 | return s5p_gatectrl(S5P_CLKSRC_MASK_LCD1, clk, enable); | ||
67 | } | ||
68 | |||
69 | static int s5pv310_clksrc_mask_fsys_ctrl(struct clk *clk, int enable) | ||
70 | { | ||
71 | return s5p_gatectrl(S5P_CLKSRC_MASK_FSYS, clk, enable); | ||
72 | } | ||
73 | |||
33 | static int s5pv310_clksrc_mask_peril0_ctrl(struct clk *clk, int enable) | 74 | static int s5pv310_clksrc_mask_peril0_ctrl(struct clk *clk, int enable) |
34 | { | 75 | { |
35 | return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL0, clk, enable); | 76 | return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL0, clk, enable); |
36 | } | 77 | } |
37 | 78 | ||
79 | static int s5pv310_clksrc_mask_peril1_ctrl(struct clk *clk, int enable) | ||
80 | { | ||
81 | return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL1, clk, enable); | ||
82 | } | ||
83 | |||
84 | static int s5pv310_clk_ip_cam_ctrl(struct clk *clk, int enable) | ||
85 | { | ||
86 | return s5p_gatectrl(S5P_CLKGATE_IP_CAM, clk, enable); | ||
87 | } | ||
88 | |||
89 | static int s5pv310_clk_ip_image_ctrl(struct clk *clk, int enable) | ||
90 | { | ||
91 | return s5p_gatectrl(S5P_CLKGATE_IP_IMAGE, clk, enable); | ||
92 | } | ||
93 | |||
94 | static int s5pv310_clk_ip_lcd0_ctrl(struct clk *clk, int enable) | ||
95 | { | ||
96 | return s5p_gatectrl(S5P_CLKGATE_IP_LCD0, clk, enable); | ||
97 | } | ||
98 | |||
99 | static int s5pv310_clk_ip_lcd1_ctrl(struct clk *clk, int enable) | ||
100 | { | ||
101 | return s5p_gatectrl(S5P_CLKGATE_IP_LCD1, clk, enable); | ||
102 | } | ||
103 | |||
104 | static int s5pv310_clk_ip_fsys_ctrl(struct clk *clk, int enable) | ||
105 | { | ||
106 | return s5p_gatectrl(S5P_CLKGATE_IP_FSYS, clk, enable); | ||
107 | } | ||
108 | |||
38 | static int s5pv310_clk_ip_peril_ctrl(struct clk *clk, int enable) | 109 | static int s5pv310_clk_ip_peril_ctrl(struct clk *clk, int enable) |
39 | { | 110 | { |
40 | return s5p_gatectrl(S5P_CLKGATE_IP_PERIL, clk, enable); | 111 | return s5p_gatectrl(S5P_CLKGATE_IP_PERIL, clk, enable); |
41 | } | 112 | } |
42 | 113 | ||
114 | static int s5pv310_clk_ip_perir_ctrl(struct clk *clk, int enable) | ||
115 | { | ||
116 | return s5p_gatectrl(S5P_CLKGATE_IP_PERIR, clk, enable); | ||
117 | } | ||
118 | |||
43 | /* Core list of CMU_CPU side */ | 119 | /* Core list of CMU_CPU side */ |
44 | 120 | ||
45 | static struct clksrc_clk clk_mout_apll = { | 121 | static struct clksrc_clk clk_mout_apll = { |
@@ -79,7 +155,7 @@ static struct clksrc_clk clk_mout_mpll = { | |||
79 | }; | 155 | }; |
80 | 156 | ||
81 | static struct clk *clkset_moutcore_list[] = { | 157 | static struct clk *clkset_moutcore_list[] = { |
82 | [0] = &clk_sclk_apll.clk, | 158 | [0] = &clk_mout_apll.clk, |
83 | [1] = &clk_mout_mpll.clk, | 159 | [1] = &clk_mout_mpll.clk, |
84 | }; | 160 | }; |
85 | 161 | ||
@@ -150,24 +226,6 @@ static struct clksrc_clk clk_periphclk = { | |||
150 | .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 12, .size = 3 }, | 226 | .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 12, .size = 3 }, |
151 | }; | 227 | }; |
152 | 228 | ||
153 | static struct clksrc_clk clk_atclk = { | ||
154 | .clk = { | ||
155 | .name = "atclk", | ||
156 | .id = -1, | ||
157 | .parent = &clk_moutcore.clk, | ||
158 | }, | ||
159 | .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 16, .size = 3 }, | ||
160 | }; | ||
161 | |||
162 | static struct clksrc_clk clk_pclk_dbg = { | ||
163 | .clk = { | ||
164 | .name = "pclk_dbg", | ||
165 | .id = -1, | ||
166 | .parent = &clk_atclk.clk, | ||
167 | }, | ||
168 | .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 20, .size = 3 }, | ||
169 | }; | ||
170 | |||
171 | /* Core list of CMU_CORE side */ | 229 | /* Core list of CMU_CORE side */ |
172 | 230 | ||
173 | static struct clk *clkset_corebus_list[] = { | 231 | static struct clk *clkset_corebus_list[] = { |
@@ -241,7 +299,7 @@ static struct clk *clkset_aclk_top_list[] = { | |||
241 | [1] = &clk_sclk_apll.clk, | 299 | [1] = &clk_sclk_apll.clk, |
242 | }; | 300 | }; |
243 | 301 | ||
244 | static struct clksrc_sources clkset_aclk_200 = { | 302 | static struct clksrc_sources clkset_aclk = { |
245 | .sources = clkset_aclk_top_list, | 303 | .sources = clkset_aclk_top_list, |
246 | .nr_sources = ARRAY_SIZE(clkset_aclk_top_list), | 304 | .nr_sources = ARRAY_SIZE(clkset_aclk_top_list), |
247 | }; | 305 | }; |
@@ -251,52 +309,37 @@ static struct clksrc_clk clk_aclk_200 = { | |||
251 | .name = "aclk_200", | 309 | .name = "aclk_200", |
252 | .id = -1, | 310 | .id = -1, |
253 | }, | 311 | }, |
254 | .sources = &clkset_aclk_200, | 312 | .sources = &clkset_aclk, |
255 | .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 12, .size = 1 }, | 313 | .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 12, .size = 1 }, |
256 | .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 0, .size = 3 }, | 314 | .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 0, .size = 3 }, |
257 | }; | 315 | }; |
258 | 316 | ||
259 | static struct clksrc_sources clkset_aclk_100 = { | ||
260 | .sources = clkset_aclk_top_list, | ||
261 | .nr_sources = ARRAY_SIZE(clkset_aclk_top_list), | ||
262 | }; | ||
263 | |||
264 | static struct clksrc_clk clk_aclk_100 = { | 317 | static struct clksrc_clk clk_aclk_100 = { |
265 | .clk = { | 318 | .clk = { |
266 | .name = "aclk_100", | 319 | .name = "aclk_100", |
267 | .id = -1, | 320 | .id = -1, |
268 | }, | 321 | }, |
269 | .sources = &clkset_aclk_100, | 322 | .sources = &clkset_aclk, |
270 | .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 16, .size = 1 }, | 323 | .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 16, .size = 1 }, |
271 | .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 4, .size = 4 }, | 324 | .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 4, .size = 4 }, |
272 | }; | 325 | }; |
273 | 326 | ||
274 | static struct clksrc_sources clkset_aclk_160 = { | ||
275 | .sources = clkset_aclk_top_list, | ||
276 | .nr_sources = ARRAY_SIZE(clkset_aclk_top_list), | ||
277 | }; | ||
278 | |||
279 | static struct clksrc_clk clk_aclk_160 = { | 327 | static struct clksrc_clk clk_aclk_160 = { |
280 | .clk = { | 328 | .clk = { |
281 | .name = "aclk_160", | 329 | .name = "aclk_160", |
282 | .id = -1, | 330 | .id = -1, |
283 | }, | 331 | }, |
284 | .sources = &clkset_aclk_160, | 332 | .sources = &clkset_aclk, |
285 | .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 20, .size = 1 }, | 333 | .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 20, .size = 1 }, |
286 | .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 8, .size = 3 }, | 334 | .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 8, .size = 3 }, |
287 | }; | 335 | }; |
288 | 336 | ||
289 | static struct clksrc_sources clkset_aclk_133 = { | ||
290 | .sources = clkset_aclk_top_list, | ||
291 | .nr_sources = ARRAY_SIZE(clkset_aclk_top_list), | ||
292 | }; | ||
293 | |||
294 | static struct clksrc_clk clk_aclk_133 = { | 337 | static struct clksrc_clk clk_aclk_133 = { |
295 | .clk = { | 338 | .clk = { |
296 | .name = "aclk_133", | 339 | .name = "aclk_133", |
297 | .id = -1, | 340 | .id = -1, |
298 | }, | 341 | }, |
299 | .sources = &clkset_aclk_133, | 342 | .sources = &clkset_aclk, |
300 | .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 24, .size = 1 }, | 343 | .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 24, .size = 1 }, |
301 | .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 12, .size = 3 }, | 344 | .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 12, .size = 3 }, |
302 | }; | 345 | }; |
@@ -315,6 +358,8 @@ static struct clksrc_clk clk_vpllsrc = { | |||
315 | .clk = { | 358 | .clk = { |
316 | .name = "vpll_src", | 359 | .name = "vpll_src", |
317 | .id = -1, | 360 | .id = -1, |
361 | .enable = s5pv310_clksrc_mask_top_ctrl, | ||
362 | .ctrlbit = (1 << 0), | ||
318 | }, | 363 | }, |
319 | .sources = &clkset_vpllsrc, | 364 | .sources = &clkset_vpllsrc, |
320 | .reg_src = { .reg = S5P_CLKSRC_TOP1, .shift = 0, .size = 1 }, | 365 | .reg_src = { .reg = S5P_CLKSRC_TOP1, .shift = 0, .size = 1 }, |
@@ -346,7 +391,175 @@ static struct clk init_clocks_disable[] = { | |||
346 | .parent = &clk_aclk_100.clk, | 391 | .parent = &clk_aclk_100.clk, |
347 | .enable = s5pv310_clk_ip_peril_ctrl, | 392 | .enable = s5pv310_clk_ip_peril_ctrl, |
348 | .ctrlbit = (1<<24), | 393 | .ctrlbit = (1<<24), |
349 | } | 394 | }, { |
395 | .name = "csis", | ||
396 | .id = 0, | ||
397 | .enable = s5pv310_clk_ip_cam_ctrl, | ||
398 | .ctrlbit = (1 << 4), | ||
399 | }, { | ||
400 | .name = "csis", | ||
401 | .id = 1, | ||
402 | .enable = s5pv310_clk_ip_cam_ctrl, | ||
403 | .ctrlbit = (1 << 5), | ||
404 | }, { | ||
405 | .name = "fimc", | ||
406 | .id = 0, | ||
407 | .enable = s5pv310_clk_ip_cam_ctrl, | ||
408 | .ctrlbit = (1 << 0), | ||
409 | }, { | ||
410 | .name = "fimc", | ||
411 | .id = 1, | ||
412 | .enable = s5pv310_clk_ip_cam_ctrl, | ||
413 | .ctrlbit = (1 << 1), | ||
414 | }, { | ||
415 | .name = "fimc", | ||
416 | .id = 2, | ||
417 | .enable = s5pv310_clk_ip_cam_ctrl, | ||
418 | .ctrlbit = (1 << 2), | ||
419 | }, { | ||
420 | .name = "fimc", | ||
421 | .id = 3, | ||
422 | .enable = s5pv310_clk_ip_cam_ctrl, | ||
423 | .ctrlbit = (1 << 3), | ||
424 | }, { | ||
425 | .name = "fimd", | ||
426 | .id = 0, | ||
427 | .enable = s5pv310_clk_ip_lcd0_ctrl, | ||
428 | .ctrlbit = (1 << 0), | ||
429 | }, { | ||
430 | .name = "fimd", | ||
431 | .id = 1, | ||
432 | .enable = s5pv310_clk_ip_lcd1_ctrl, | ||
433 | .ctrlbit = (1 << 0), | ||
434 | }, { | ||
435 | .name = "hsmmc", | ||
436 | .id = 0, | ||
437 | .parent = &clk_aclk_133.clk, | ||
438 | .enable = s5pv310_clk_ip_fsys_ctrl, | ||
439 | .ctrlbit = (1 << 5), | ||
440 | }, { | ||
441 | .name = "hsmmc", | ||
442 | .id = 1, | ||
443 | .parent = &clk_aclk_133.clk, | ||
444 | .enable = s5pv310_clk_ip_fsys_ctrl, | ||
445 | .ctrlbit = (1 << 6), | ||
446 | }, { | ||
447 | .name = "hsmmc", | ||
448 | .id = 2, | ||
449 | .parent = &clk_aclk_133.clk, | ||
450 | .enable = s5pv310_clk_ip_fsys_ctrl, | ||
451 | .ctrlbit = (1 << 7), | ||
452 | }, { | ||
453 | .name = "hsmmc", | ||
454 | .id = 3, | ||
455 | .parent = &clk_aclk_133.clk, | ||
456 | .enable = s5pv310_clk_ip_fsys_ctrl, | ||
457 | .ctrlbit = (1 << 8), | ||
458 | }, { | ||
459 | .name = "hsmmc", | ||
460 | .id = 4, | ||
461 | .parent = &clk_aclk_133.clk, | ||
462 | .enable = s5pv310_clk_ip_fsys_ctrl, | ||
463 | .ctrlbit = (1 << 9), | ||
464 | }, { | ||
465 | .name = "sata", | ||
466 | .id = -1, | ||
467 | .enable = s5pv310_clk_ip_fsys_ctrl, | ||
468 | .ctrlbit = (1 << 10), | ||
469 | }, { | ||
470 | .name = "adc", | ||
471 | .id = -1, | ||
472 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
473 | .ctrlbit = (1 << 15), | ||
474 | }, { | ||
475 | .name = "rtc", | ||
476 | .id = -1, | ||
477 | .enable = s5pv310_clk_ip_perir_ctrl, | ||
478 | .ctrlbit = (1 << 15), | ||
479 | }, { | ||
480 | .name = "watchdog", | ||
481 | .id = -1, | ||
482 | .enable = s5pv310_clk_ip_perir_ctrl, | ||
483 | .ctrlbit = (1 << 14), | ||
484 | }, { | ||
485 | .name = "usbhost", | ||
486 | .id = -1, | ||
487 | .enable = s5pv310_clk_ip_fsys_ctrl , | ||
488 | .ctrlbit = (1 << 12), | ||
489 | }, { | ||
490 | .name = "otg", | ||
491 | .id = -1, | ||
492 | .enable = s5pv310_clk_ip_fsys_ctrl, | ||
493 | .ctrlbit = (1 << 13), | ||
494 | }, { | ||
495 | .name = "spi", | ||
496 | .id = 0, | ||
497 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
498 | .ctrlbit = (1 << 16), | ||
499 | }, { | ||
500 | .name = "spi", | ||
501 | .id = 1, | ||
502 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
503 | .ctrlbit = (1 << 17), | ||
504 | }, { | ||
505 | .name = "spi", | ||
506 | .id = 2, | ||
507 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
508 | .ctrlbit = (1 << 18), | ||
509 | }, { | ||
510 | .name = "fimg2d", | ||
511 | .id = -1, | ||
512 | .enable = s5pv310_clk_ip_image_ctrl, | ||
513 | .ctrlbit = (1 << 0), | ||
514 | }, { | ||
515 | .name = "i2c", | ||
516 | .id = 0, | ||
517 | .parent = &clk_aclk_100.clk, | ||
518 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
519 | .ctrlbit = (1 << 6), | ||
520 | }, { | ||
521 | .name = "i2c", | ||
522 | .id = 1, | ||
523 | .parent = &clk_aclk_100.clk, | ||
524 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
525 | .ctrlbit = (1 << 7), | ||
526 | }, { | ||
527 | .name = "i2c", | ||
528 | .id = 2, | ||
529 | .parent = &clk_aclk_100.clk, | ||
530 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
531 | .ctrlbit = (1 << 8), | ||
532 | }, { | ||
533 | .name = "i2c", | ||
534 | .id = 3, | ||
535 | .parent = &clk_aclk_100.clk, | ||
536 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
537 | .ctrlbit = (1 << 9), | ||
538 | }, { | ||
539 | .name = "i2c", | ||
540 | .id = 4, | ||
541 | .parent = &clk_aclk_100.clk, | ||
542 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
543 | .ctrlbit = (1 << 10), | ||
544 | }, { | ||
545 | .name = "i2c", | ||
546 | .id = 5, | ||
547 | .parent = &clk_aclk_100.clk, | ||
548 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
549 | .ctrlbit = (1 << 11), | ||
550 | }, { | ||
551 | .name = "i2c", | ||
552 | .id = 6, | ||
553 | .parent = &clk_aclk_100.clk, | ||
554 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
555 | .ctrlbit = (1 << 12), | ||
556 | }, { | ||
557 | .name = "i2c", | ||
558 | .id = 7, | ||
559 | .parent = &clk_aclk_100.clk, | ||
560 | .enable = s5pv310_clk_ip_peril_ctrl, | ||
561 | .ctrlbit = (1 << 13), | ||
562 | }, | ||
350 | }; | 563 | }; |
351 | 564 | ||
352 | static struct clk init_clocks[] = { | 565 | static struct clk init_clocks[] = { |
@@ -387,6 +600,9 @@ static struct clk *clkset_group_list[] = { | |||
387 | [0] = &clk_ext_xtal_mux, | 600 | [0] = &clk_ext_xtal_mux, |
388 | [1] = &clk_xusbxti, | 601 | [1] = &clk_xusbxti, |
389 | [2] = &clk_sclk_hdmi27m, | 602 | [2] = &clk_sclk_hdmi27m, |
603 | [3] = &clk_sclk_usbphy0, | ||
604 | [4] = &clk_sclk_usbphy1, | ||
605 | [5] = &clk_sclk_hdmiphy, | ||
390 | [6] = &clk_mout_mpll.clk, | 606 | [6] = &clk_mout_mpll.clk, |
391 | [7] = &clk_mout_epll.clk, | 607 | [7] = &clk_mout_epll.clk, |
392 | [8] = &clk_sclk_vpll.clk, | 608 | [8] = &clk_sclk_vpll.clk, |
@@ -397,6 +613,104 @@ static struct clksrc_sources clkset_group = { | |||
397 | .nr_sources = ARRAY_SIZE(clkset_group_list), | 613 | .nr_sources = ARRAY_SIZE(clkset_group_list), |
398 | }; | 614 | }; |
399 | 615 | ||
616 | static struct clk *clkset_mout_g2d0_list[] = { | ||
617 | [0] = &clk_mout_mpll.clk, | ||
618 | [1] = &clk_sclk_apll.clk, | ||
619 | }; | ||
620 | |||
621 | static struct clksrc_sources clkset_mout_g2d0 = { | ||
622 | .sources = clkset_mout_g2d0_list, | ||
623 | .nr_sources = ARRAY_SIZE(clkset_mout_g2d0_list), | ||
624 | }; | ||
625 | |||
626 | static struct clksrc_clk clk_mout_g2d0 = { | ||
627 | .clk = { | ||
628 | .name = "mout_g2d0", | ||
629 | .id = -1, | ||
630 | }, | ||
631 | .sources = &clkset_mout_g2d0, | ||
632 | .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 0, .size = 1 }, | ||
633 | }; | ||
634 | |||
635 | static struct clk *clkset_mout_g2d1_list[] = { | ||
636 | [0] = &clk_mout_epll.clk, | ||
637 | [1] = &clk_sclk_vpll.clk, | ||
638 | }; | ||
639 | |||
640 | static struct clksrc_sources clkset_mout_g2d1 = { | ||
641 | .sources = clkset_mout_g2d1_list, | ||
642 | .nr_sources = ARRAY_SIZE(clkset_mout_g2d1_list), | ||
643 | }; | ||
644 | |||
645 | static struct clksrc_clk clk_mout_g2d1 = { | ||
646 | .clk = { | ||
647 | .name = "mout_g2d1", | ||
648 | .id = -1, | ||
649 | }, | ||
650 | .sources = &clkset_mout_g2d1, | ||
651 | .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 4, .size = 1 }, | ||
652 | }; | ||
653 | |||
654 | static struct clk *clkset_mout_g2d_list[] = { | ||
655 | [0] = &clk_mout_g2d0.clk, | ||
656 | [1] = &clk_mout_g2d1.clk, | ||
657 | }; | ||
658 | |||
659 | static struct clksrc_sources clkset_mout_g2d = { | ||
660 | .sources = clkset_mout_g2d_list, | ||
661 | .nr_sources = ARRAY_SIZE(clkset_mout_g2d_list), | ||
662 | }; | ||
663 | |||
664 | static struct clksrc_clk clk_dout_mmc0 = { | ||
665 | .clk = { | ||
666 | .name = "dout_mmc0", | ||
667 | .id = -1, | ||
668 | }, | ||
669 | .sources = &clkset_group, | ||
670 | .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 0, .size = 4 }, | ||
671 | .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 0, .size = 4 }, | ||
672 | }; | ||
673 | |||
674 | static struct clksrc_clk clk_dout_mmc1 = { | ||
675 | .clk = { | ||
676 | .name = "dout_mmc1", | ||
677 | .id = -1, | ||
678 | }, | ||
679 | .sources = &clkset_group, | ||
680 | .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 4, .size = 4 }, | ||
681 | .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 16, .size = 4 }, | ||
682 | }; | ||
683 | |||
684 | static struct clksrc_clk clk_dout_mmc2 = { | ||
685 | .clk = { | ||
686 | .name = "dout_mmc2", | ||
687 | .id = -1, | ||
688 | }, | ||
689 | .sources = &clkset_group, | ||
690 | .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 8, .size = 4 }, | ||
691 | .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 0, .size = 4 }, | ||
692 | }; | ||
693 | |||
694 | static struct clksrc_clk clk_dout_mmc3 = { | ||
695 | .clk = { | ||
696 | .name = "dout_mmc3", | ||
697 | .id = -1, | ||
698 | }, | ||
699 | .sources = &clkset_group, | ||
700 | .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 12, .size = 4 }, | ||
701 | .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 16, .size = 4 }, | ||
702 | }; | ||
703 | |||
704 | static struct clksrc_clk clk_dout_mmc4 = { | ||
705 | .clk = { | ||
706 | .name = "dout_mmc4", | ||
707 | .id = -1, | ||
708 | }, | ||
709 | .sources = &clkset_group, | ||
710 | .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 16, .size = 4 }, | ||
711 | .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 0, .size = 4 }, | ||
712 | }; | ||
713 | |||
400 | static struct clksrc_clk clksrcs[] = { | 714 | static struct clksrc_clk clksrcs[] = { |
401 | { | 715 | { |
402 | .clk = { | 716 | .clk = { |
@@ -448,7 +762,200 @@ static struct clksrc_clk clksrcs[] = { | |||
448 | .sources = &clkset_group, | 762 | .sources = &clkset_group, |
449 | .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 24, .size = 4 }, | 763 | .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 24, .size = 4 }, |
450 | .reg_div = { .reg = S5P_CLKDIV_PERIL3, .shift = 0, .size = 4 }, | 764 | .reg_div = { .reg = S5P_CLKDIV_PERIL3, .shift = 0, .size = 4 }, |
451 | }, | 765 | }, { |
766 | .clk = { | ||
767 | .name = "sclk_csis", | ||
768 | .id = 0, | ||
769 | .enable = s5pv310_clksrc_mask_cam_ctrl, | ||
770 | .ctrlbit = (1 << 24), | ||
771 | }, | ||
772 | .sources = &clkset_group, | ||
773 | .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 24, .size = 4 }, | ||
774 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 24, .size = 4 }, | ||
775 | }, { | ||
776 | .clk = { | ||
777 | .name = "sclk_csis", | ||
778 | .id = 1, | ||
779 | .enable = s5pv310_clksrc_mask_cam_ctrl, | ||
780 | .ctrlbit = (1 << 28), | ||
781 | }, | ||
782 | .sources = &clkset_group, | ||
783 | .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 28, .size = 4 }, | ||
784 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 28, .size = 4 }, | ||
785 | }, { | ||
786 | .clk = { | ||
787 | .name = "sclk_cam", | ||
788 | .id = 0, | ||
789 | .enable = s5pv310_clksrc_mask_cam_ctrl, | ||
790 | .ctrlbit = (1 << 16), | ||
791 | }, | ||
792 | .sources = &clkset_group, | ||
793 | .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 16, .size = 4 }, | ||
794 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 16, .size = 4 }, | ||
795 | }, { | ||
796 | .clk = { | ||
797 | .name = "sclk_cam", | ||
798 | .id = 1, | ||
799 | .enable = s5pv310_clksrc_mask_cam_ctrl, | ||
800 | .ctrlbit = (1 << 20), | ||
801 | }, | ||
802 | .sources = &clkset_group, | ||
803 | .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 20, .size = 4 }, | ||
804 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 20, .size = 4 }, | ||
805 | }, { | ||
806 | .clk = { | ||
807 | .name = "sclk_fimc", | ||
808 | .id = 0, | ||
809 | .enable = s5pv310_clksrc_mask_cam_ctrl, | ||
810 | .ctrlbit = (1 << 0), | ||
811 | }, | ||
812 | .sources = &clkset_group, | ||
813 | .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 0, .size = 4 }, | ||
814 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 0, .size = 4 }, | ||
815 | }, { | ||
816 | .clk = { | ||
817 | .name = "sclk_fimc", | ||
818 | .id = 1, | ||
819 | .enable = s5pv310_clksrc_mask_cam_ctrl, | ||
820 | .ctrlbit = (1 << 4), | ||
821 | }, | ||
822 | .sources = &clkset_group, | ||
823 | .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 4, .size = 4 }, | ||
824 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 4, .size = 4 }, | ||
825 | }, { | ||
826 | .clk = { | ||
827 | .name = "sclk_fimc", | ||
828 | .id = 2, | ||
829 | .enable = s5pv310_clksrc_mask_cam_ctrl, | ||
830 | .ctrlbit = (1 << 8), | ||
831 | }, | ||
832 | .sources = &clkset_group, | ||
833 | .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 8, .size = 4 }, | ||
834 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 8, .size = 4 }, | ||
835 | }, { | ||
836 | .clk = { | ||
837 | .name = "sclk_fimc", | ||
838 | .id = 3, | ||
839 | .enable = s5pv310_clksrc_mask_cam_ctrl, | ||
840 | .ctrlbit = (1 << 12), | ||
841 | }, | ||
842 | .sources = &clkset_group, | ||
843 | .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 12, .size = 4 }, | ||
844 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 12, .size = 4 }, | ||
845 | }, { | ||
846 | .clk = { | ||
847 | .name = "sclk_fimd", | ||
848 | .id = 0, | ||
849 | .enable = s5pv310_clksrc_mask_lcd0_ctrl, | ||
850 | .ctrlbit = (1 << 0), | ||
851 | }, | ||
852 | .sources = &clkset_group, | ||
853 | .reg_src = { .reg = S5P_CLKSRC_LCD0, .shift = 0, .size = 4 }, | ||
854 | .reg_div = { .reg = S5P_CLKDIV_LCD0, .shift = 0, .size = 4 }, | ||
855 | }, { | ||
856 | .clk = { | ||
857 | .name = "sclk_fimd", | ||
858 | .id = 1, | ||
859 | .enable = s5pv310_clksrc_mask_lcd1_ctrl, | ||
860 | .ctrlbit = (1 << 0), | ||
861 | }, | ||
862 | .sources = &clkset_group, | ||
863 | .reg_src = { .reg = S5P_CLKSRC_LCD1, .shift = 0, .size = 4 }, | ||
864 | .reg_div = { .reg = S5P_CLKDIV_LCD1, .shift = 0, .size = 4 }, | ||
865 | }, { | ||
866 | .clk = { | ||
867 | .name = "sclk_sata", | ||
868 | .id = -1, | ||
869 | .enable = s5pv310_clksrc_mask_fsys_ctrl, | ||
870 | .ctrlbit = (1 << 24), | ||
871 | }, | ||
872 | .sources = &clkset_mout_corebus, | ||
873 | .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 24, .size = 1 }, | ||
874 | .reg_div = { .reg = S5P_CLKDIV_FSYS0, .shift = 20, .size = 4 }, | ||
875 | }, { | ||
876 | .clk = { | ||
877 | .name = "sclk_spi", | ||
878 | .id = 0, | ||
879 | .enable = s5pv310_clksrc_mask_peril1_ctrl, | ||
880 | .ctrlbit = (1 << 16), | ||
881 | }, | ||
882 | .sources = &clkset_group, | ||
883 | .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 16, .size = 4 }, | ||
884 | .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 0, .size = 4 }, | ||
885 | }, { | ||
886 | .clk = { | ||
887 | .name = "sclk_spi", | ||
888 | .id = 1, | ||
889 | .enable = s5pv310_clksrc_mask_peril1_ctrl, | ||
890 | .ctrlbit = (1 << 20), | ||
891 | }, | ||
892 | .sources = &clkset_group, | ||
893 | .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 20, .size = 4 }, | ||
894 | .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 16, .size = 4 }, | ||
895 | }, { | ||
896 | .clk = { | ||
897 | .name = "sclk_spi", | ||
898 | .id = 2, | ||
899 | .enable = s5pv310_clksrc_mask_peril1_ctrl, | ||
900 | .ctrlbit = (1 << 24), | ||
901 | }, | ||
902 | .sources = &clkset_group, | ||
903 | .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 24, .size = 4 }, | ||
904 | .reg_div = { .reg = S5P_CLKDIV_PERIL2, .shift = 0, .size = 4 }, | ||
905 | }, { | ||
906 | .clk = { | ||
907 | .name = "sclk_fimg2d", | ||
908 | .id = -1, | ||
909 | }, | ||
910 | .sources = &clkset_mout_g2d, | ||
911 | .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 8, .size = 1 }, | ||
912 | .reg_div = { .reg = S5P_CLKDIV_IMAGE, .shift = 0, .size = 4 }, | ||
913 | }, { | ||
914 | .clk = { | ||
915 | .name = "sclk_mmc", | ||
916 | .id = 0, | ||
917 | .parent = &clk_dout_mmc0.clk, | ||
918 | .enable = s5pv310_clksrc_mask_fsys_ctrl, | ||
919 | .ctrlbit = (1 << 0), | ||
920 | }, | ||
921 | .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 }, | ||
922 | }, { | ||
923 | .clk = { | ||
924 | .name = "sclk_mmc", | ||
925 | .id = 1, | ||
926 | .parent = &clk_dout_mmc1.clk, | ||
927 | .enable = s5pv310_clksrc_mask_fsys_ctrl, | ||
928 | .ctrlbit = (1 << 4), | ||
929 | }, | ||
930 | .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 }, | ||
931 | }, { | ||
932 | .clk = { | ||
933 | .name = "sclk_mmc", | ||
934 | .id = 2, | ||
935 | .parent = &clk_dout_mmc2.clk, | ||
936 | .enable = s5pv310_clksrc_mask_fsys_ctrl, | ||
937 | .ctrlbit = (1 << 8), | ||
938 | }, | ||
939 | .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 }, | ||
940 | }, { | ||
941 | .clk = { | ||
942 | .name = "sclk_mmc", | ||
943 | .id = 3, | ||
944 | .parent = &clk_dout_mmc3.clk, | ||
945 | .enable = s5pv310_clksrc_mask_fsys_ctrl, | ||
946 | .ctrlbit = (1 << 12), | ||
947 | }, | ||
948 | .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 }, | ||
949 | }, { | ||
950 | .clk = { | ||
951 | .name = "sclk_mmc", | ||
952 | .id = 4, | ||
953 | .parent = &clk_dout_mmc4.clk, | ||
954 | .enable = s5pv310_clksrc_mask_fsys_ctrl, | ||
955 | .ctrlbit = (1 << 16), | ||
956 | }, | ||
957 | .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 8, .size = 8 }, | ||
958 | } | ||
452 | }; | 959 | }; |
453 | 960 | ||
454 | /* Clock initialization code */ | 961 | /* Clock initialization code */ |
@@ -464,8 +971,6 @@ static struct clksrc_clk *sysclks[] = { | |||
464 | &clk_aclk_cores, | 971 | &clk_aclk_cores, |
465 | &clk_aclk_corem1, | 972 | &clk_aclk_corem1, |
466 | &clk_periphclk, | 973 | &clk_periphclk, |
467 | &clk_atclk, | ||
468 | &clk_pclk_dbg, | ||
469 | &clk_mout_corebus, | 974 | &clk_mout_corebus, |
470 | &clk_sclk_dmc, | 975 | &clk_sclk_dmc, |
471 | &clk_aclk_cored, | 976 | &clk_aclk_cored, |
@@ -478,6 +983,11 @@ static struct clksrc_clk *sysclks[] = { | |||
478 | &clk_aclk_100, | 983 | &clk_aclk_100, |
479 | &clk_aclk_160, | 984 | &clk_aclk_160, |
480 | &clk_aclk_133, | 985 | &clk_aclk_133, |
986 | &clk_dout_mmc0, | ||
987 | &clk_dout_mmc1, | ||
988 | &clk_dout_mmc2, | ||
989 | &clk_dout_mmc3, | ||
990 | &clk_dout_mmc4, | ||
481 | }; | 991 | }; |
482 | 992 | ||
483 | void __init_or_cpufreq s5pv310_setup_clocks(void) | 993 | void __init_or_cpufreq s5pv310_setup_clocks(void) |
@@ -490,15 +1000,11 @@ void __init_or_cpufreq s5pv310_setup_clocks(void) | |||
490 | unsigned long vpllsrc; | 1000 | unsigned long vpllsrc; |
491 | unsigned long xtal; | 1001 | unsigned long xtal; |
492 | unsigned long armclk; | 1002 | unsigned long armclk; |
493 | unsigned long aclk_corem0; | ||
494 | unsigned long aclk_cores; | ||
495 | unsigned long aclk_corem1; | ||
496 | unsigned long periphclk; | ||
497 | unsigned long sclk_dmc; | 1003 | unsigned long sclk_dmc; |
498 | unsigned long aclk_cored; | 1004 | unsigned long aclk_200; |
499 | unsigned long aclk_corep; | 1005 | unsigned long aclk_100; |
500 | unsigned long aclk_acp; | 1006 | unsigned long aclk_160; |
501 | unsigned long pclk_acp; | 1007 | unsigned long aclk_133; |
502 | unsigned int ptr; | 1008 | unsigned int ptr; |
503 | 1009 | ||
504 | printk(KERN_DEBUG "%s: registering clocks\n", __func__); | 1010 | printk(KERN_DEBUG "%s: registering clocks\n", __func__); |
@@ -529,26 +1035,21 @@ void __init_or_cpufreq s5pv310_setup_clocks(void) | |||
529 | apll, mpll, epll, vpll); | 1035 | apll, mpll, epll, vpll); |
530 | 1036 | ||
531 | armclk = clk_get_rate(&clk_armclk.clk); | 1037 | armclk = clk_get_rate(&clk_armclk.clk); |
532 | aclk_corem0 = clk_get_rate(&clk_aclk_corem0.clk); | ||
533 | aclk_cores = clk_get_rate(&clk_aclk_cores.clk); | ||
534 | aclk_corem1 = clk_get_rate(&clk_aclk_corem1.clk); | ||
535 | periphclk = clk_get_rate(&clk_periphclk.clk); | ||
536 | sclk_dmc = clk_get_rate(&clk_sclk_dmc.clk); | 1038 | sclk_dmc = clk_get_rate(&clk_sclk_dmc.clk); |
537 | aclk_cored = clk_get_rate(&clk_aclk_cored.clk); | 1039 | |
538 | aclk_corep = clk_get_rate(&clk_aclk_corep.clk); | 1040 | aclk_200 = clk_get_rate(&clk_aclk_200.clk); |
539 | aclk_acp = clk_get_rate(&clk_aclk_acp.clk); | 1041 | aclk_100 = clk_get_rate(&clk_aclk_100.clk); |
540 | pclk_acp = clk_get_rate(&clk_pclk_acp.clk); | 1042 | aclk_160 = clk_get_rate(&clk_aclk_160.clk); |
541 | 1043 | aclk_133 = clk_get_rate(&clk_aclk_133.clk); | |
542 | printk(KERN_INFO "S5PV310: ARMCLK=%ld, COREM0=%ld, CORES=%ld\n" | 1044 | |
543 | "COREM1=%ld, PERI=%ld, DMC=%ld, CORED=%ld\n" | 1045 | printk(KERN_INFO "S5PV310: ARMCLK=%ld, DMC=%ld, ACLK200=%ld\n" |
544 | "COREP=%ld, ACLK_ACP=%ld, PCLK_ACP=%ld", | 1046 | "ACLK100=%ld, ACLK160=%ld, ACLK133=%ld\n", |
545 | armclk, aclk_corem0, aclk_cores, aclk_corem1, | 1047 | armclk, sclk_dmc, aclk_200, |
546 | periphclk, sclk_dmc, aclk_cored, aclk_corep, | 1048 | aclk_100, aclk_160, aclk_133); |
547 | aclk_acp, pclk_acp); | ||
548 | 1049 | ||
549 | clk_f.rate = armclk; | 1050 | clk_f.rate = armclk; |
550 | clk_h.rate = sclk_dmc; | 1051 | clk_h.rate = sclk_dmc; |
551 | clk_p.rate = periphclk; | 1052 | clk_p.rate = aclk_100; |
552 | 1053 | ||
553 | for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++) | 1054 | for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++) |
554 | s3c_set_clksrc(&clksrcs[ptr], true); | 1055 | s3c_set_clksrc(&clksrcs[ptr], true); |
diff --git a/arch/arm/mach-s5pv310/cpu.c b/arch/arm/mach-s5pv310/cpu.c index 4add39853ff9..82ce4aa6d61a 100644 --- a/arch/arm/mach-s5pv310/cpu.c +++ b/arch/arm/mach-s5pv310/cpu.c | |||
@@ -15,10 +15,12 @@ | |||
15 | #include <asm/mach/irq.h> | 15 | #include <asm/mach/irq.h> |
16 | 16 | ||
17 | #include <asm/proc-fns.h> | 17 | #include <asm/proc-fns.h> |
18 | #include <asm/hardware/cache-l2x0.h> | ||
18 | 19 | ||
19 | #include <plat/cpu.h> | 20 | #include <plat/cpu.h> |
20 | #include <plat/clock.h> | 21 | #include <plat/clock.h> |
21 | #include <plat/s5pv310.h> | 22 | #include <plat/s5pv310.h> |
23 | #include <plat/sdhci.h> | ||
22 | 24 | ||
23 | #include <mach/regs-irq.h> | 25 | #include <mach/regs-irq.h> |
24 | 26 | ||
@@ -56,15 +58,30 @@ static struct map_desc s5pv310_iodesc[] __initdata = { | |||
56 | .length = SZ_4K, | 58 | .length = SZ_4K, |
57 | .type = MT_DEVICE, | 59 | .type = MT_DEVICE, |
58 | }, { | 60 | }, { |
59 | .virtual = (unsigned long)S5P_VA_GPIO, | 61 | .virtual = (unsigned long)S5P_VA_GPIO1, |
60 | .pfn = __phys_to_pfn(S5PV310_PA_GPIO1), | 62 | .pfn = __phys_to_pfn(S5PV310_PA_GPIO1), |
61 | .length = SZ_4K, | 63 | .length = SZ_4K, |
62 | .type = MT_DEVICE, | 64 | .type = MT_DEVICE, |
63 | }, { | 65 | }, { |
66 | .virtual = (unsigned long)S5P_VA_GPIO2, | ||
67 | .pfn = __phys_to_pfn(S5PV310_PA_GPIO2), | ||
68 | .length = SZ_4K, | ||
69 | .type = MT_DEVICE, | ||
70 | }, { | ||
71 | .virtual = (unsigned long)S5P_VA_GPIO3, | ||
72 | .pfn = __phys_to_pfn(S5PV310_PA_GPIO3), | ||
73 | .length = SZ_256, | ||
74 | .type = MT_DEVICE, | ||
75 | }, { | ||
64 | .virtual = (unsigned long)S3C_VA_UART, | 76 | .virtual = (unsigned long)S3C_VA_UART, |
65 | .pfn = __phys_to_pfn(S3C_PA_UART), | 77 | .pfn = __phys_to_pfn(S3C_PA_UART), |
66 | .length = SZ_512K, | 78 | .length = SZ_512K, |
67 | .type = MT_DEVICE, | 79 | .type = MT_DEVICE, |
80 | }, { | ||
81 | .virtual = (unsigned long)S5P_VA_SROMC, | ||
82 | .pfn = __phys_to_pfn(S5PV310_PA_SROMC), | ||
83 | .length = SZ_4K, | ||
84 | .type = MT_DEVICE, | ||
68 | }, | 85 | }, |
69 | }; | 86 | }; |
70 | 87 | ||
@@ -83,6 +100,12 @@ static void s5pv310_idle(void) | |||
83 | void __init s5pv310_map_io(void) | 100 | void __init s5pv310_map_io(void) |
84 | { | 101 | { |
85 | iotable_init(s5pv310_iodesc, ARRAY_SIZE(s5pv310_iodesc)); | 102 | iotable_init(s5pv310_iodesc, ARRAY_SIZE(s5pv310_iodesc)); |
103 | |||
104 | /* initialize device information early */ | ||
105 | s5pv310_default_sdhci0(); | ||
106 | s5pv310_default_sdhci1(); | ||
107 | s5pv310_default_sdhci2(); | ||
108 | s5pv310_default_sdhci3(); | ||
86 | } | 109 | } |
87 | 110 | ||
88 | void __init s5pv310_init_clocks(int xtal) | 111 | void __init s5pv310_init_clocks(int xtal) |
@@ -131,6 +154,28 @@ static int __init s5pv310_core_init(void) | |||
131 | 154 | ||
132 | core_initcall(s5pv310_core_init); | 155 | core_initcall(s5pv310_core_init); |
133 | 156 | ||
157 | #ifdef CONFIG_CACHE_L2X0 | ||
158 | static int __init s5pv310_l2x0_cache_init(void) | ||
159 | { | ||
160 | /* TAG, Data Latency Control: 2cycle */ | ||
161 | __raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL); | ||
162 | __raw_writel(0x110, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL); | ||
163 | |||
164 | /* L2X0 Prefetch Control */ | ||
165 | __raw_writel(0x30000007, S5P_VA_L2CC + L2X0_PREFETCH_CTRL); | ||
166 | |||
167 | /* L2X0 Power Control */ | ||
168 | __raw_writel(L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN, | ||
169 | S5P_VA_L2CC + L2X0_POWER_CTRL); | ||
170 | |||
171 | l2x0_init(S5P_VA_L2CC, 0x7C070001, 0xC200ffff); | ||
172 | |||
173 | return 0; | ||
174 | } | ||
175 | |||
176 | early_initcall(s5pv310_l2x0_cache_init); | ||
177 | #endif | ||
178 | |||
134 | int __init s5pv310_init(void) | 179 | int __init s5pv310_init(void) |
135 | { | 180 | { |
136 | printk(KERN_INFO "S5PV310: Initializing architecture\n"); | 181 | printk(KERN_INFO "S5PV310: Initializing architecture\n"); |
diff --git a/arch/arm/mach-s5pv310/gpiolib.c b/arch/arm/mach-s5pv310/gpiolib.c new file mode 100644 index 000000000000..55217b8923ec --- /dev/null +++ b/arch/arm/mach-s5pv310/gpiolib.c | |||
@@ -0,0 +1,304 @@ | |||
1 | /* linux/arch/arm/mach-s5pv310/gpiolib.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * S5PV310 - GPIOlib support | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/irq.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/gpio.h> | ||
17 | |||
18 | #include <mach/map.h> | ||
19 | |||
20 | #include <plat/gpio-core.h> | ||
21 | #include <plat/gpio-cfg.h> | ||
22 | #include <plat/gpio-cfg-helpers.h> | ||
23 | |||
24 | static struct s3c_gpio_cfg gpio_cfg = { | ||
25 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
26 | .set_pull = s3c_gpio_setpull_updown, | ||
27 | .get_pull = s3c_gpio_getpull_updown, | ||
28 | }; | ||
29 | |||
30 | static struct s3c_gpio_cfg gpio_cfg_noint = { | ||
31 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | ||
32 | .set_pull = s3c_gpio_setpull_updown, | ||
33 | .get_pull = s3c_gpio_getpull_updown, | ||
34 | }; | ||
35 | |||
36 | /* | ||
37 | * Following are the gpio banks in v310. | ||
38 | * | ||
39 | * The 'config' member when left to NULL, is initialized to the default | ||
40 | * structure gpio_cfg in the init function below. | ||
41 | * | ||
42 | * The 'base' member is also initialized in the init function below. | ||
43 | * Note: The initialization of 'base' member of s3c_gpio_chip structure | ||
44 | * uses the above macro and depends on the banks being listed in order here. | ||
45 | */ | ||
46 | static struct s3c_gpio_chip s5pv310_gpio_part1_4bit[] = { | ||
47 | { | ||
48 | .chip = { | ||
49 | .base = S5PV310_GPA0(0), | ||
50 | .ngpio = S5PV310_GPIO_A0_NR, | ||
51 | .label = "GPA0", | ||
52 | }, | ||
53 | }, { | ||
54 | .chip = { | ||
55 | .base = S5PV310_GPA1(0), | ||
56 | .ngpio = S5PV310_GPIO_A1_NR, | ||
57 | .label = "GPA1", | ||
58 | }, | ||
59 | }, { | ||
60 | .chip = { | ||
61 | .base = S5PV310_GPB(0), | ||
62 | .ngpio = S5PV310_GPIO_B_NR, | ||
63 | .label = "GPB", | ||
64 | }, | ||
65 | }, { | ||
66 | .chip = { | ||
67 | .base = S5PV310_GPC0(0), | ||
68 | .ngpio = S5PV310_GPIO_C0_NR, | ||
69 | .label = "GPC0", | ||
70 | }, | ||
71 | }, { | ||
72 | .chip = { | ||
73 | .base = S5PV310_GPC1(0), | ||
74 | .ngpio = S5PV310_GPIO_C1_NR, | ||
75 | .label = "GPC1", | ||
76 | }, | ||
77 | }, { | ||
78 | .chip = { | ||
79 | .base = S5PV310_GPD0(0), | ||
80 | .ngpio = S5PV310_GPIO_D0_NR, | ||
81 | .label = "GPD0", | ||
82 | }, | ||
83 | }, { | ||
84 | .chip = { | ||
85 | .base = S5PV310_GPD1(0), | ||
86 | .ngpio = S5PV310_GPIO_D1_NR, | ||
87 | .label = "GPD1", | ||
88 | }, | ||
89 | }, { | ||
90 | .chip = { | ||
91 | .base = S5PV310_GPE0(0), | ||
92 | .ngpio = S5PV310_GPIO_E0_NR, | ||
93 | .label = "GPE0", | ||
94 | }, | ||
95 | }, { | ||
96 | .chip = { | ||
97 | .base = S5PV310_GPE1(0), | ||
98 | .ngpio = S5PV310_GPIO_E1_NR, | ||
99 | .label = "GPE1", | ||
100 | }, | ||
101 | }, { | ||
102 | .chip = { | ||
103 | .base = S5PV310_GPE2(0), | ||
104 | .ngpio = S5PV310_GPIO_E2_NR, | ||
105 | .label = "GPE2", | ||
106 | }, | ||
107 | }, { | ||
108 | .chip = { | ||
109 | .base = S5PV310_GPE3(0), | ||
110 | .ngpio = S5PV310_GPIO_E3_NR, | ||
111 | .label = "GPE3", | ||
112 | }, | ||
113 | }, { | ||
114 | .chip = { | ||
115 | .base = S5PV310_GPE4(0), | ||
116 | .ngpio = S5PV310_GPIO_E4_NR, | ||
117 | .label = "GPE4", | ||
118 | }, | ||
119 | }, { | ||
120 | .chip = { | ||
121 | .base = S5PV310_GPF0(0), | ||
122 | .ngpio = S5PV310_GPIO_F0_NR, | ||
123 | .label = "GPF0", | ||
124 | }, | ||
125 | }, { | ||
126 | .chip = { | ||
127 | .base = S5PV310_GPF1(0), | ||
128 | .ngpio = S5PV310_GPIO_F1_NR, | ||
129 | .label = "GPF1", | ||
130 | }, | ||
131 | }, { | ||
132 | .chip = { | ||
133 | .base = S5PV310_GPF2(0), | ||
134 | .ngpio = S5PV310_GPIO_F2_NR, | ||
135 | .label = "GPF2", | ||
136 | }, | ||
137 | }, { | ||
138 | .chip = { | ||
139 | .base = S5PV310_GPF3(0), | ||
140 | .ngpio = S5PV310_GPIO_F3_NR, | ||
141 | .label = "GPF3", | ||
142 | }, | ||
143 | }, | ||
144 | }; | ||
145 | |||
146 | static struct s3c_gpio_chip s5pv310_gpio_part2_4bit[] = { | ||
147 | { | ||
148 | .chip = { | ||
149 | .base = S5PV310_GPJ0(0), | ||
150 | .ngpio = S5PV310_GPIO_J0_NR, | ||
151 | .label = "GPJ0", | ||
152 | }, | ||
153 | }, { | ||
154 | .chip = { | ||
155 | .base = S5PV310_GPJ1(0), | ||
156 | .ngpio = S5PV310_GPIO_J1_NR, | ||
157 | .label = "GPJ1", | ||
158 | }, | ||
159 | }, { | ||
160 | .chip = { | ||
161 | .base = S5PV310_GPK0(0), | ||
162 | .ngpio = S5PV310_GPIO_K0_NR, | ||
163 | .label = "GPK0", | ||
164 | }, | ||
165 | }, { | ||
166 | .chip = { | ||
167 | .base = S5PV310_GPK1(0), | ||
168 | .ngpio = S5PV310_GPIO_K1_NR, | ||
169 | .label = "GPK1", | ||
170 | }, | ||
171 | }, { | ||
172 | .chip = { | ||
173 | .base = S5PV310_GPK2(0), | ||
174 | .ngpio = S5PV310_GPIO_K2_NR, | ||
175 | .label = "GPK2", | ||
176 | }, | ||
177 | }, { | ||
178 | .chip = { | ||
179 | .base = S5PV310_GPK3(0), | ||
180 | .ngpio = S5PV310_GPIO_K3_NR, | ||
181 | .label = "GPK3", | ||
182 | }, | ||
183 | }, { | ||
184 | .chip = { | ||
185 | .base = S5PV310_GPL0(0), | ||
186 | .ngpio = S5PV310_GPIO_L0_NR, | ||
187 | .label = "GPL0", | ||
188 | }, | ||
189 | }, { | ||
190 | .chip = { | ||
191 | .base = S5PV310_GPL1(0), | ||
192 | .ngpio = S5PV310_GPIO_L1_NR, | ||
193 | .label = "GPL1", | ||
194 | }, | ||
195 | }, { | ||
196 | .chip = { | ||
197 | .base = S5PV310_GPL2(0), | ||
198 | .ngpio = S5PV310_GPIO_L2_NR, | ||
199 | .label = "GPL2", | ||
200 | }, | ||
201 | }, { | ||
202 | .base = (S5P_VA_GPIO2 + 0xC00), | ||
203 | .config = &gpio_cfg_noint, | ||
204 | .irq_base = IRQ_EINT(0), | ||
205 | .chip = { | ||
206 | .base = S5PV310_GPX0(0), | ||
207 | .ngpio = S5PV310_GPIO_X0_NR, | ||
208 | .label = "GPX0", | ||
209 | .to_irq = samsung_gpiolib_to_irq, | ||
210 | }, | ||
211 | }, { | ||
212 | .base = (S5P_VA_GPIO2 + 0xC20), | ||
213 | .config = &gpio_cfg_noint, | ||
214 | .irq_base = IRQ_EINT(8), | ||
215 | .chip = { | ||
216 | .base = S5PV310_GPX1(0), | ||
217 | .ngpio = S5PV310_GPIO_X1_NR, | ||
218 | .label = "GPX1", | ||
219 | .to_irq = samsung_gpiolib_to_irq, | ||
220 | }, | ||
221 | }, { | ||
222 | .base = (S5P_VA_GPIO2 + 0xC40), | ||
223 | .config = &gpio_cfg_noint, | ||
224 | .irq_base = IRQ_EINT(16), | ||
225 | .chip = { | ||
226 | .base = S5PV310_GPX2(0), | ||
227 | .ngpio = S5PV310_GPIO_X2_NR, | ||
228 | .label = "GPX2", | ||
229 | .to_irq = samsung_gpiolib_to_irq, | ||
230 | }, | ||
231 | }, { | ||
232 | .base = (S5P_VA_GPIO2 + 0xC60), | ||
233 | .config = &gpio_cfg_noint, | ||
234 | .irq_base = IRQ_EINT(24), | ||
235 | .chip = { | ||
236 | .base = S5PV310_GPX3(0), | ||
237 | .ngpio = S5PV310_GPIO_X3_NR, | ||
238 | .label = "GPX3", | ||
239 | .to_irq = samsung_gpiolib_to_irq, | ||
240 | }, | ||
241 | }, | ||
242 | }; | ||
243 | |||
244 | static struct s3c_gpio_chip s5pv310_gpio_part3_4bit[] = { | ||
245 | { | ||
246 | .chip = { | ||
247 | .base = S5PV310_GPZ(0), | ||
248 | .ngpio = S5PV310_GPIO_Z_NR, | ||
249 | .label = "GPZ", | ||
250 | }, | ||
251 | }, | ||
252 | }; | ||
253 | |||
254 | static __init int s5pv310_gpiolib_init(void) | ||
255 | { | ||
256 | struct s3c_gpio_chip *chip; | ||
257 | int i; | ||
258 | int nr_chips; | ||
259 | |||
260 | /* GPIO part 1 */ | ||
261 | |||
262 | chip = s5pv310_gpio_part1_4bit; | ||
263 | nr_chips = ARRAY_SIZE(s5pv310_gpio_part1_4bit); | ||
264 | |||
265 | for (i = 0; i < nr_chips; i++, chip++) { | ||
266 | if (chip->config == NULL) | ||
267 | chip->config = &gpio_cfg; | ||
268 | if (chip->base == NULL) | ||
269 | chip->base = S5P_VA_GPIO1 + (i) * 0x20; | ||
270 | } | ||
271 | |||
272 | samsung_gpiolib_add_4bit_chips(s5pv310_gpio_part1_4bit, nr_chips); | ||
273 | |||
274 | /* GPIO part 2 */ | ||
275 | |||
276 | chip = s5pv310_gpio_part2_4bit; | ||
277 | nr_chips = ARRAY_SIZE(s5pv310_gpio_part2_4bit); | ||
278 | |||
279 | for (i = 0; i < nr_chips; i++, chip++) { | ||
280 | if (chip->config == NULL) | ||
281 | chip->config = &gpio_cfg; | ||
282 | if (chip->base == NULL) | ||
283 | chip->base = S5P_VA_GPIO2 + (i) * 0x20; | ||
284 | } | ||
285 | |||
286 | samsung_gpiolib_add_4bit_chips(s5pv310_gpio_part2_4bit, nr_chips); | ||
287 | |||
288 | /* GPIO part 3 */ | ||
289 | |||
290 | chip = s5pv310_gpio_part3_4bit; | ||
291 | nr_chips = ARRAY_SIZE(s5pv310_gpio_part3_4bit); | ||
292 | |||
293 | for (i = 0; i < nr_chips; i++, chip++) { | ||
294 | if (chip->config == NULL) | ||
295 | chip->config = &gpio_cfg; | ||
296 | if (chip->base == NULL) | ||
297 | chip->base = S5P_VA_GPIO3 + (i) * 0x20; | ||
298 | } | ||
299 | |||
300 | samsung_gpiolib_add_4bit_chips(s5pv310_gpio_part3_4bit, nr_chips); | ||
301 | |||
302 | return 0; | ||
303 | } | ||
304 | core_initcall(s5pv310_gpiolib_init); | ||
diff --git a/arch/arm/mach-s5pv310/hotplug.c b/arch/arm/mach-s5pv310/hotplug.c new file mode 100644 index 000000000000..03652c3605f6 --- /dev/null +++ b/arch/arm/mach-s5pv310/hotplug.c | |||
@@ -0,0 +1,144 @@ | |||
1 | /* linux arch/arm/mach-s5pv310/hotplug.c | ||
2 | * | ||
3 | * Cloned from linux/arch/arm/mach-realview/hotplug.c | ||
4 | * | ||
5 | * Copyright (C) 2002 ARM Ltd. | ||
6 | * All Rights Reserved | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/errno.h> | ||
15 | #include <linux/smp.h> | ||
16 | #include <linux/completion.h> | ||
17 | |||
18 | #include <asm/cacheflush.h> | ||
19 | |||
20 | extern volatile int pen_release; | ||
21 | |||
22 | static DECLARE_COMPLETION(cpu_killed); | ||
23 | |||
24 | static inline void cpu_enter_lowpower(void) | ||
25 | { | ||
26 | unsigned int v; | ||
27 | |||
28 | flush_cache_all(); | ||
29 | asm volatile( | ||
30 | " mcr p15, 0, %1, c7, c5, 0\n" | ||
31 | " mcr p15, 0, %1, c7, c10, 4\n" | ||
32 | /* | ||
33 | * Turn off coherency | ||
34 | */ | ||
35 | " mrc p15, 0, %0, c1, c0, 1\n" | ||
36 | " bic %0, %0, #0x20\n" | ||
37 | " mcr p15, 0, %0, c1, c0, 1\n" | ||
38 | " mrc p15, 0, %0, c1, c0, 0\n" | ||
39 | " bic %0, %0, #0x04\n" | ||
40 | " mcr p15, 0, %0, c1, c0, 0\n" | ||
41 | : "=&r" (v) | ||
42 | : "r" (0) | ||
43 | : "cc"); | ||
44 | } | ||
45 | |||
46 | static inline void cpu_leave_lowpower(void) | ||
47 | { | ||
48 | unsigned int v; | ||
49 | |||
50 | asm volatile( | ||
51 | "mrc p15, 0, %0, c1, c0, 0\n" | ||
52 | " orr %0, %0, #0x04\n" | ||
53 | " mcr p15, 0, %0, c1, c0, 0\n" | ||
54 | " mrc p15, 0, %0, c1, c0, 1\n" | ||
55 | " orr %0, %0, #0x20\n" | ||
56 | " mcr p15, 0, %0, c1, c0, 1\n" | ||
57 | : "=&r" (v) | ||
58 | : | ||
59 | : "cc"); | ||
60 | } | ||
61 | |||
62 | static inline void platform_do_lowpower(unsigned int cpu) | ||
63 | { | ||
64 | /* | ||
65 | * there is no power-control hardware on this platform, so all | ||
66 | * we can do is put the core into WFI; this is safe as the calling | ||
67 | * code will have already disabled interrupts | ||
68 | */ | ||
69 | for (;;) { | ||
70 | /* | ||
71 | * here's the WFI | ||
72 | */ | ||
73 | asm(".word 0xe320f003\n" | ||
74 | : | ||
75 | : | ||
76 | : "memory", "cc"); | ||
77 | |||
78 | if (pen_release == cpu) { | ||
79 | /* | ||
80 | * OK, proper wakeup, we're done | ||
81 | */ | ||
82 | break; | ||
83 | } | ||
84 | |||
85 | /* | ||
86 | * getting here, means that we have come out of WFI without | ||
87 | * having been woken up - this shouldn't happen | ||
88 | * | ||
89 | * The trouble is, letting people know about this is not really | ||
90 | * possible, since we are currently running incoherently, and | ||
91 | * therefore cannot safely call printk() or anything else | ||
92 | */ | ||
93 | #ifdef DEBUG | ||
94 | printk(KERN_WARN "CPU%u: spurious wakeup call\n", cpu); | ||
95 | #endif | ||
96 | } | ||
97 | } | ||
98 | |||
99 | int platform_cpu_kill(unsigned int cpu) | ||
100 | { | ||
101 | return wait_for_completion_timeout(&cpu_killed, 5000); | ||
102 | } | ||
103 | |||
104 | /* | ||
105 | * platform-specific code to shutdown a CPU | ||
106 | * | ||
107 | * Called with IRQs disabled | ||
108 | */ | ||
109 | void platform_cpu_die(unsigned int cpu) | ||
110 | { | ||
111 | #ifdef DEBUG | ||
112 | unsigned int this_cpu = hard_smp_processor_id(); | ||
113 | |||
114 | if (cpu != this_cpu) { | ||
115 | printk(KERN_CRIT "Eek! platform_cpu_die running on %u, should be %u\n", | ||
116 | this_cpu, cpu); | ||
117 | BUG(); | ||
118 | } | ||
119 | #endif | ||
120 | |||
121 | printk(KERN_NOTICE "CPU%u: shutdown\n", cpu); | ||
122 | complete(&cpu_killed); | ||
123 | |||
124 | /* | ||
125 | * we're ready for shutdown now, so do it | ||
126 | */ | ||
127 | cpu_enter_lowpower(); | ||
128 | platform_do_lowpower(cpu); | ||
129 | |||
130 | /* | ||
131 | * bring this CPU back into the world of cache | ||
132 | * coherency, and then restore interrupts | ||
133 | */ | ||
134 | cpu_leave_lowpower(); | ||
135 | } | ||
136 | |||
137 | int platform_cpu_disable(unsigned int cpu) | ||
138 | { | ||
139 | /* | ||
140 | * we don't allow CPU 0 to be shutdown (it is still too special | ||
141 | * e.g. clock tick interrupts) | ||
142 | */ | ||
143 | return cpu == 0 ? -EPERM : 0; | ||
144 | } | ||
diff --git a/arch/arm/mach-s5pv310/include/mach/irqs.h b/arch/arm/mach-s5pv310/include/mach/irqs.h index 471fc3bb199a..99e7dad8a85a 100644 --- a/arch/arm/mach-s5pv310/include/mach/irqs.h +++ b/arch/arm/mach-s5pv310/include/mach/irqs.h | |||
@@ -3,7 +3,7 @@ | |||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. |
4 | * http://www.samsung.com/ | 4 | * http://www.samsung.com/ |
5 | * | 5 | * |
6 | * S5PV210 - IRQ definitions | 6 | * S5PV310 - IRQ definitions |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License version 2 as | 9 | * it under the terms of the GNU General Public License version 2 as |
@@ -60,6 +60,9 @@ | |||
60 | #define IRQ_TIMER3_VIC COMBINER_IRQ(22, 3) | 60 | #define IRQ_TIMER3_VIC COMBINER_IRQ(22, 3) |
61 | #define IRQ_TIMER4_VIC COMBINER_IRQ(22, 4) | 61 | #define IRQ_TIMER4_VIC COMBINER_IRQ(22, 4) |
62 | 62 | ||
63 | #define IRQ_RTC_ALARM COMBINER_IRQ(23, 0) | ||
64 | #define IRQ_RTC_TIC COMBINER_IRQ(23, 1) | ||
65 | |||
63 | #define IRQ_UART0 COMBINER_IRQ(26, 0) | 66 | #define IRQ_UART0 COMBINER_IRQ(26, 0) |
64 | #define IRQ_UART1 COMBINER_IRQ(26, 1) | 67 | #define IRQ_UART1 COMBINER_IRQ(26, 1) |
65 | #define IRQ_UART2 COMBINER_IRQ(26, 2) | 68 | #define IRQ_UART2 COMBINER_IRQ(26, 2) |
@@ -67,13 +70,46 @@ | |||
67 | #define IRQ_UART4 COMBINER_IRQ(26, 4) | 70 | #define IRQ_UART4 COMBINER_IRQ(26, 4) |
68 | 71 | ||
69 | #define IRQ_IIC COMBINER_IRQ(27, 0) | 72 | #define IRQ_IIC COMBINER_IRQ(27, 0) |
73 | #define IRQ_IIC1 COMBINER_IRQ(27, 1) | ||
74 | #define IRQ_IIC2 COMBINER_IRQ(27, 2) | ||
75 | #define IRQ_IIC3 COMBINER_IRQ(27, 3) | ||
76 | #define IRQ_IIC4 COMBINER_IRQ(27, 4) | ||
77 | #define IRQ_IIC5 COMBINER_IRQ(27, 5) | ||
78 | #define IRQ_IIC6 COMBINER_IRQ(27, 6) | ||
79 | #define IRQ_IIC7 COMBINER_IRQ(27, 7) | ||
80 | |||
81 | #define IRQ_HSMMC0 COMBINER_IRQ(29, 0) | ||
82 | #define IRQ_HSMMC1 COMBINER_IRQ(29, 1) | ||
83 | #define IRQ_HSMMC2 COMBINER_IRQ(29, 2) | ||
84 | #define IRQ_HSMMC3 COMBINER_IRQ(29, 3) | ||
70 | 85 | ||
71 | #define IRQ_ONENAND_AUDI COMBINER_IRQ(34, 0) | 86 | #define IRQ_ONENAND_AUDI COMBINER_IRQ(34, 0) |
72 | 87 | ||
73 | /* Set the default NR_IRQS */ | 88 | #define IRQ_EINT4 COMBINER_IRQ(37, 0) |
89 | #define IRQ_EINT5 COMBINER_IRQ(37, 1) | ||
90 | #define IRQ_EINT6 COMBINER_IRQ(37, 2) | ||
91 | #define IRQ_EINT7 COMBINER_IRQ(37, 3) | ||
92 | #define IRQ_EINT8 COMBINER_IRQ(38, 0) | ||
93 | |||
94 | #define IRQ_EINT9 COMBINER_IRQ(38, 1) | ||
95 | #define IRQ_EINT10 COMBINER_IRQ(38, 2) | ||
96 | #define IRQ_EINT11 COMBINER_IRQ(38, 3) | ||
97 | #define IRQ_EINT12 COMBINER_IRQ(38, 4) | ||
98 | #define IRQ_EINT13 COMBINER_IRQ(38, 5) | ||
99 | #define IRQ_EINT14 COMBINER_IRQ(38, 6) | ||
100 | #define IRQ_EINT15 COMBINER_IRQ(38, 7) | ||
101 | |||
102 | #define IRQ_EINT16_31 COMBINER_IRQ(39, 0) | ||
74 | 103 | ||
75 | #define NR_IRQS COMBINER_IRQ(MAX_COMBINER_NR, 0) | 104 | #define MAX_COMBINER_NR 40 |
105 | |||
106 | #define S5P_IRQ_EINT_BASE COMBINER_IRQ(MAX_COMBINER_NR, 0) | ||
107 | |||
108 | #define S5P_EINT_BASE1 (S5P_IRQ_EINT_BASE + 0) | ||
109 | #define S5P_EINT_BASE2 (S5P_IRQ_EINT_BASE + 16) | ||
110 | |||
111 | /* Set the default NR_IRQS */ | ||
76 | 112 | ||
77 | #define MAX_COMBINER_NR 39 | 113 | #define NR_IRQS (S5P_IRQ_EINT_BASE + 32) |
78 | 114 | ||
79 | #endif /* __ASM_ARCH_IRQS_H */ | 115 | #endif /* __ASM_ARCH_IRQS_H */ |
diff --git a/arch/arm/mach-s5pv310/include/mach/map.h b/arch/arm/mach-s5pv310/include/mach/map.h index aff6d23624bb..7acf4e77e92e 100644 --- a/arch/arm/mach-s5pv310/include/mach/map.h +++ b/arch/arm/mach-s5pv310/include/mach/map.h | |||
@@ -25,6 +25,8 @@ | |||
25 | 25 | ||
26 | #define S5PV310_PA_SYSRAM (0x02025000) | 26 | #define S5PV310_PA_SYSRAM (0x02025000) |
27 | 27 | ||
28 | #define S5PV310_PA_SROM_BANK(x) (0x04000000 + ((x) * 0x01000000)) | ||
29 | |||
28 | #define S5PC210_PA_ONENAND (0x0C000000) | 30 | #define S5PC210_PA_ONENAND (0x0C000000) |
29 | #define S5P_PA_ONENAND S5PC210_PA_ONENAND | 31 | #define S5P_PA_ONENAND S5PC210_PA_ONENAND |
30 | 32 | ||
@@ -34,12 +36,13 @@ | |||
34 | #define S5PV310_PA_CHIPID (0x10000000) | 36 | #define S5PV310_PA_CHIPID (0x10000000) |
35 | #define S5P_PA_CHIPID S5PV310_PA_CHIPID | 37 | #define S5P_PA_CHIPID S5PV310_PA_CHIPID |
36 | 38 | ||
37 | #define S5PV310_PA_SYSCON (0x10020000) | 39 | #define S5PV310_PA_SYSCON (0x10010000) |
38 | #define S5P_PA_SYSCON S5PV310_PA_SYSCON | 40 | #define S5P_PA_SYSCON S5PV310_PA_SYSCON |
39 | 41 | ||
40 | #define S5PV310_PA_CMU (0x10030000) | 42 | #define S5PV310_PA_CMU (0x10030000) |
41 | 43 | ||
42 | #define S5PV310_PA_WATCHDOG (0x10060000) | 44 | #define S5PV310_PA_WATCHDOG (0x10060000) |
45 | #define S5PV310_PA_RTC (0x10070000) | ||
43 | 46 | ||
44 | #define S5PV310_PA_COMBINER (0x10448000) | 47 | #define S5PV310_PA_COMBINER (0x10448000) |
45 | 48 | ||
@@ -55,6 +58,8 @@ | |||
55 | 58 | ||
56 | #define S5PV310_PA_HSMMC(x) (0x12510000 + ((x) * 0x10000)) | 59 | #define S5PV310_PA_HSMMC(x) (0x12510000 + ((x) * 0x10000)) |
57 | 60 | ||
61 | #define S5PV310_PA_SROMC (0x12570000) | ||
62 | |||
58 | #define S5PV310_PA_UART (0x13800000) | 63 | #define S5PV310_PA_UART (0x13800000) |
59 | 64 | ||
60 | #define S5P_PA_UART(x) (S5PV310_PA_UART + ((x) * S3C_UART_OFFSET)) | 65 | #define S5P_PA_UART(x) (S5PV310_PA_UART + ((x) * S3C_UART_OFFSET)) |
@@ -66,7 +71,7 @@ | |||
66 | 71 | ||
67 | #define S5P_SZ_UART SZ_256 | 72 | #define S5P_SZ_UART SZ_256 |
68 | 73 | ||
69 | #define S5PV310_PA_IIC0 (0x13860000) | 74 | #define S5PV310_PA_IIC(x) (0x13860000 + ((x) * 0x10000)) |
70 | 75 | ||
71 | #define S5PV310_PA_TIMER (0x139D0000) | 76 | #define S5PV310_PA_TIMER (0x139D0000) |
72 | #define S5P_PA_TIMER S5PV310_PA_TIMER | 77 | #define S5P_PA_TIMER S5PV310_PA_TIMER |
@@ -80,7 +85,15 @@ | |||
80 | #define S3C_PA_HSMMC1 S5PV310_PA_HSMMC(1) | 85 | #define S3C_PA_HSMMC1 S5PV310_PA_HSMMC(1) |
81 | #define S3C_PA_HSMMC2 S5PV310_PA_HSMMC(2) | 86 | #define S3C_PA_HSMMC2 S5PV310_PA_HSMMC(2) |
82 | #define S3C_PA_HSMMC3 S5PV310_PA_HSMMC(3) | 87 | #define S3C_PA_HSMMC3 S5PV310_PA_HSMMC(3) |
83 | #define S3C_PA_IIC S5PV310_PA_IIC0 | 88 | #define S3C_PA_IIC S5PV310_PA_IIC(0) |
89 | #define S3C_PA_IIC1 S5PV310_PA_IIC(1) | ||
90 | #define S3C_PA_IIC2 S5PV310_PA_IIC(2) | ||
91 | #define S3C_PA_IIC3 S5PV310_PA_IIC(3) | ||
92 | #define S3C_PA_IIC4 S5PV310_PA_IIC(4) | ||
93 | #define S3C_PA_IIC5 S5PV310_PA_IIC(5) | ||
94 | #define S3C_PA_IIC6 S5PV310_PA_IIC(6) | ||
95 | #define S3C_PA_IIC7 S5PV310_PA_IIC(7) | ||
96 | #define S3C_PA_RTC S5PV310_PA_RTC | ||
84 | #define S3C_PA_WDT S5PV310_PA_WATCHDOG | 97 | #define S3C_PA_WDT S5PV310_PA_WATCHDOG |
85 | 98 | ||
86 | #endif /* __ASM_ARCH_MAP_H */ | 99 | #endif /* __ASM_ARCH_MAP_H */ |
diff --git a/arch/arm/mach-s5pv310/include/mach/regs-clock.h b/arch/arm/mach-s5pv310/include/mach/regs-clock.h index 4013553cd9be..f1028cad9788 100644 --- a/arch/arm/mach-s5pv310/include/mach/regs-clock.h +++ b/arch/arm/mach-s5pv310/include/mach/regs-clock.h | |||
@@ -26,11 +26,23 @@ | |||
26 | 26 | ||
27 | #define S5P_CLKSRC_TOP0 S5P_CLKREG(0x0C210) | 27 | #define S5P_CLKSRC_TOP0 S5P_CLKREG(0x0C210) |
28 | #define S5P_CLKSRC_TOP1 S5P_CLKREG(0x0C214) | 28 | #define S5P_CLKSRC_TOP1 S5P_CLKREG(0x0C214) |
29 | 29 | #define S5P_CLKSRC_CAM S5P_CLKREG(0x0C220) | |
30 | #define S5P_CLKSRC_IMAGE S5P_CLKREG(0x0C230) | ||
31 | #define S5P_CLKSRC_LCD0 S5P_CLKREG(0x0C234) | ||
32 | #define S5P_CLKSRC_LCD1 S5P_CLKREG(0x0C238) | ||
33 | #define S5P_CLKSRC_FSYS S5P_CLKREG(0x0C240) | ||
30 | #define S5P_CLKSRC_PERIL0 S5P_CLKREG(0x0C250) | 34 | #define S5P_CLKSRC_PERIL0 S5P_CLKREG(0x0C250) |
35 | #define S5P_CLKSRC_PERIL1 S5P_CLKREG(0x0C254) | ||
31 | 36 | ||
32 | #define S5P_CLKDIV_TOP S5P_CLKREG(0x0C510) | 37 | #define S5P_CLKDIV_TOP S5P_CLKREG(0x0C510) |
33 | 38 | #define S5P_CLKDIV_CAM S5P_CLKREG(0x0C520) | |
39 | #define S5P_CLKDIV_IMAGE S5P_CLKREG(0x0C530) | ||
40 | #define S5P_CLKDIV_LCD0 S5P_CLKREG(0x0C534) | ||
41 | #define S5P_CLKDIV_LCD1 S5P_CLKREG(0x0C538) | ||
42 | #define S5P_CLKDIV_FSYS0 S5P_CLKREG(0x0C540) | ||
43 | #define S5P_CLKDIV_FSYS1 S5P_CLKREG(0x0C544) | ||
44 | #define S5P_CLKDIV_FSYS2 S5P_CLKREG(0x0C548) | ||
45 | #define S5P_CLKDIV_FSYS3 S5P_CLKREG(0x0C54C) | ||
34 | #define S5P_CLKDIV_PERIL0 S5P_CLKREG(0x0C550) | 46 | #define S5P_CLKDIV_PERIL0 S5P_CLKREG(0x0C550) |
35 | #define S5P_CLKDIV_PERIL1 S5P_CLKREG(0x0C554) | 47 | #define S5P_CLKDIV_PERIL1 S5P_CLKREG(0x0C554) |
36 | #define S5P_CLKDIV_PERIL2 S5P_CLKREG(0x0C558) | 48 | #define S5P_CLKDIV_PERIL2 S5P_CLKREG(0x0C558) |
@@ -38,9 +50,21 @@ | |||
38 | #define S5P_CLKDIV_PERIL4 S5P_CLKREG(0x0C560) | 50 | #define S5P_CLKDIV_PERIL4 S5P_CLKREG(0x0C560) |
39 | #define S5P_CLKDIV_PERIL5 S5P_CLKREG(0x0C564) | 51 | #define S5P_CLKDIV_PERIL5 S5P_CLKREG(0x0C564) |
40 | 52 | ||
53 | #define S5P_CLKSRC_MASK_TOP S5P_CLKREG(0x0C310) | ||
54 | #define S5P_CLKSRC_MASK_CAM S5P_CLKREG(0x0C320) | ||
55 | #define S5P_CLKSRC_MASK_LCD0 S5P_CLKREG(0x0C334) | ||
56 | #define S5P_CLKSRC_MASK_LCD1 S5P_CLKREG(0x0C338) | ||
57 | #define S5P_CLKSRC_MASK_FSYS S5P_CLKREG(0x0C340) | ||
41 | #define S5P_CLKSRC_MASK_PERIL0 S5P_CLKREG(0x0C350) | 58 | #define S5P_CLKSRC_MASK_PERIL0 S5P_CLKREG(0x0C350) |
59 | #define S5P_CLKSRC_MASK_PERIL1 S5P_CLKREG(0x0C354) | ||
42 | 60 | ||
61 | #define S5P_CLKGATE_IP_CAM S5P_CLKREG(0x0C920) | ||
62 | #define S5P_CLKGATE_IP_IMAGE S5P_CLKREG(0x0C930) | ||
63 | #define S5P_CLKGATE_IP_LCD0 S5P_CLKREG(0x0C934) | ||
64 | #define S5P_CLKGATE_IP_LCD1 S5P_CLKREG(0x0C938) | ||
65 | #define S5P_CLKGATE_IP_FSYS S5P_CLKREG(0x0C940) | ||
43 | #define S5P_CLKGATE_IP_PERIL S5P_CLKREG(0x0C950) | 66 | #define S5P_CLKGATE_IP_PERIL S5P_CLKREG(0x0C950) |
67 | #define S5P_CLKGATE_IP_PERIR S5P_CLKREG(0x0C960) | ||
44 | 68 | ||
45 | #define S5P_CLKSRC_CORE S5P_CLKREG(0x10200) | 69 | #define S5P_CLKSRC_CORE S5P_CLKREG(0x10200) |
46 | #define S5P_CLKDIV_CORE0 S5P_CLKREG(0x10500) | 70 | #define S5P_CLKDIV_CORE0 S5P_CLKREG(0x10500) |
@@ -60,4 +84,8 @@ | |||
60 | 84 | ||
61 | #define S5P_CLKGATE_SCLKCPU S5P_CLKREG(0x14800) | 85 | #define S5P_CLKGATE_SCLKCPU S5P_CLKREG(0x14800) |
62 | 86 | ||
87 | /* Compatibility defines */ | ||
88 | |||
89 | #define S5P_EPLL_CON S5P_EPLL_CON0 | ||
90 | |||
63 | #endif /* __ASM_ARCH_REGS_CLOCK_H */ | 91 | #endif /* __ASM_ARCH_REGS_CLOCK_H */ |
diff --git a/arch/arm/mach-s5pv310/include/mach/regs-gpio.h b/arch/arm/mach-s5pv310/include/mach/regs-gpio.h new file mode 100644 index 000000000000..82e9e0c9d452 --- /dev/null +++ b/arch/arm/mach-s5pv310/include/mach/regs-gpio.h | |||
@@ -0,0 +1,42 @@ | |||
1 | /* linux/arch/arm/mach-s5pv310/include/mach/regs-gpio.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * S5PV310 - GPIO (including EINT) register definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_REGS_GPIO_H | ||
14 | #define __ASM_ARCH_REGS_GPIO_H __FILE__ | ||
15 | |||
16 | #include <mach/map.h> | ||
17 | #include <mach/irqs.h> | ||
18 | |||
19 | #define S5PV310_EINT40CON (S5P_VA_GPIO2 + 0xE00) | ||
20 | #define S5P_EINT_CON(x) (S5PV310_EINT40CON + ((x) * 0x4)) | ||
21 | |||
22 | #define S5PV310_EINT40FLTCON0 (S5P_VA_GPIO2 + 0xE80) | ||
23 | #define S5P_EINT_FLTCON(x) (S5PV310_EINT40FLTCON0 + ((x) * 0x4)) | ||
24 | |||
25 | #define S5PV310_EINT40MASK (S5P_VA_GPIO2 + 0xF00) | ||
26 | #define S5P_EINT_MASK(x) (S5PV310_EINT40MASK + ((x) * 0x4)) | ||
27 | |||
28 | #define S5PV310_EINT40PEND (S5P_VA_GPIO2 + 0xF40) | ||
29 | #define S5P_EINT_PEND(x) (S5PV310_EINT40PEND + ((x) * 0x4)) | ||
30 | |||
31 | #define EINT_REG_NR(x) (EINT_OFFSET(x) >> 3) | ||
32 | |||
33 | #define eint_irq_to_bit(irq) (1 << (EINT_OFFSET(irq) & 0x7)) | ||
34 | |||
35 | #define EINT_MODE S3C_GPIO_SFN(0xf) | ||
36 | |||
37 | #define EINT_GPIO_0(x) S5PV310_GPX0(x) | ||
38 | #define EINT_GPIO_1(x) S5PV310_GPX1(x) | ||
39 | #define EINT_GPIO_2(x) S5PV310_GPX2(x) | ||
40 | #define EINT_GPIO_3(x) S5PV310_GPX3(x) | ||
41 | |||
42 | #endif /* __ASM_ARCH_REGS_GPIO_H */ | ||
diff --git a/arch/arm/mach-s5pv310/include/mach/regs-srom.h b/arch/arm/mach-s5pv310/include/mach/regs-srom.h new file mode 100644 index 000000000000..1898b3e10550 --- /dev/null +++ b/arch/arm/mach-s5pv310/include/mach/regs-srom.h | |||
@@ -0,0 +1,50 @@ | |||
1 | /* linux/arch/arm/mach-s5pv310/include/mach/regs-srom.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * S5PV310 - SROMC register definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_REGS_SROM_H | ||
14 | #define __ASM_ARCH_REGS_SROM_H __FILE__ | ||
15 | |||
16 | #include <mach/map.h> | ||
17 | |||
18 | #define S5PV310_SROMREG(x) (S5P_VA_SROMC + (x)) | ||
19 | |||
20 | #define S5PV310_SROM_BW S5PV310_SROMREG(0x0) | ||
21 | #define S5PV310_SROM_BC0 S5PV310_SROMREG(0x4) | ||
22 | #define S5PV310_SROM_BC1 S5PV310_SROMREG(0x8) | ||
23 | #define S5PV310_SROM_BC2 S5PV310_SROMREG(0xc) | ||
24 | #define S5PV310_SROM_BC3 S5PV310_SROMREG(0x10) | ||
25 | |||
26 | /* one register BW holds 4 x 4-bit packed settings for NCS0 - NCS3 */ | ||
27 | |||
28 | #define S5PV310_SROM_BW__DATAWIDTH__SHIFT 0 | ||
29 | #define S5PV310_SROM_BW__ADDRMODE__SHIFT 1 | ||
30 | #define S5PV310_SROM_BW__WAITENABLE__SHIFT 2 | ||
31 | #define S5PV310_SROM_BW__BYTEENABLE__SHIFT 3 | ||
32 | |||
33 | #define S5PV310_SROM_BW__CS_MASK 0xf | ||
34 | |||
35 | #define S5PV310_SROM_BW__NCS0__SHIFT 0 | ||
36 | #define S5PV310_SROM_BW__NCS1__SHIFT 4 | ||
37 | #define S5PV310_SROM_BW__NCS2__SHIFT 8 | ||
38 | #define S5PV310_SROM_BW__NCS3__SHIFT 12 | ||
39 | |||
40 | /* applies to same to BCS0 - BCS3 */ | ||
41 | |||
42 | #define S5PV310_SROM_BCX__PMC__SHIFT 0 | ||
43 | #define S5PV310_SROM_BCX__TACP__SHIFT 4 | ||
44 | #define S5PV310_SROM_BCX__TCAH__SHIFT 8 | ||
45 | #define S5PV310_SROM_BCX__TCOH__SHIFT 12 | ||
46 | #define S5PV310_SROM_BCX__TACC__SHIFT 16 | ||
47 | #define S5PV310_SROM_BCX__TCOS__SHIFT 24 | ||
48 | #define S5PV310_SROM_BCX__TACS__SHIFT 28 | ||
49 | |||
50 | #endif /* __ASM_ARCH_REGS_SROM_H */ | ||
diff --git a/arch/arm/mach-s5pv310/include/mach/vmalloc.h b/arch/arm/mach-s5pv310/include/mach/vmalloc.h index 256f221edf3a..65759fb97581 100644 --- a/arch/arm/mach-s5pv310/include/mach/vmalloc.h +++ b/arch/arm/mach-s5pv310/include/mach/vmalloc.h | |||
@@ -17,6 +17,6 @@ | |||
17 | #ifndef __ASM_ARCH_VMALLOC_H | 17 | #ifndef __ASM_ARCH_VMALLOC_H |
18 | #define __ASM_ARCH_VMALLOC_H __FILE__ | 18 | #define __ASM_ARCH_VMALLOC_H __FILE__ |
19 | 19 | ||
20 | #define VMALLOC_END (0xF0000000UL) | 20 | #define VMALLOC_END 0xF6000000UL |
21 | 21 | ||
22 | #endif /* __ASM_ARCH_VMALLOC_H */ | 22 | #endif /* __ASM_ARCH_VMALLOC_H */ |
diff --git a/arch/arm/mach-s5pv310/irq-combiner.c b/arch/arm/mach-s5pv310/irq-combiner.c index 0f7052164f23..c3f88c3faf6c 100644 --- a/arch/arm/mach-s5pv310/irq-combiner.c +++ b/arch/arm/mach-s5pv310/irq-combiner.c | |||
@@ -66,11 +66,7 @@ static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) | |||
66 | if (status == 0) | 66 | if (status == 0) |
67 | goto out; | 67 | goto out; |
68 | 68 | ||
69 | for (combiner_irq = 0; combiner_irq < 32; combiner_irq++) { | 69 | combiner_irq = __ffs(status); |
70 | if (status & 0x1) | ||
71 | break; | ||
72 | status >>= 1; | ||
73 | } | ||
74 | 70 | ||
75 | cascade_irq = combiner_irq + (chip_data->irq_offset & ~31); | 71 | cascade_irq = combiner_irq + (chip_data->irq_offset & ~31); |
76 | if (unlikely(cascade_irq >= NR_IRQS)) | 72 | if (unlikely(cascade_irq >= NR_IRQS)) |
diff --git a/arch/arm/mach-s5pv310/irq-eint.c b/arch/arm/mach-s5pv310/irq-eint.c new file mode 100644 index 000000000000..5877503e92c3 --- /dev/null +++ b/arch/arm/mach-s5pv310/irq-eint.c | |||
@@ -0,0 +1,228 @@ | |||
1 | /* linux/arch/arm/mach-s5pv310/irq-eint.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * S5PV310 - IRQ EINT support | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/interrupt.h> | ||
15 | #include <linux/irq.h> | ||
16 | #include <linux/io.h> | ||
17 | #include <linux/sysdev.h> | ||
18 | #include <linux/gpio.h> | ||
19 | |||
20 | #include <plat/pm.h> | ||
21 | #include <plat/cpu.h> | ||
22 | #include <plat/gpio-cfg.h> | ||
23 | |||
24 | #include <mach/regs-gpio.h> | ||
25 | |||
26 | static DEFINE_SPINLOCK(eint_lock); | ||
27 | |||
28 | static unsigned int eint0_15_data[16]; | ||
29 | |||
30 | static unsigned int s5pv310_get_irq_nr(unsigned int number) | ||
31 | { | ||
32 | u32 ret = 0; | ||
33 | |||
34 | switch (number) { | ||
35 | case 0 ... 3: | ||
36 | ret = (number + IRQ_EINT0); | ||
37 | break; | ||
38 | case 4 ... 7: | ||
39 | ret = (number + (IRQ_EINT4 - 4)); | ||
40 | break; | ||
41 | case 8 ... 15: | ||
42 | ret = (number + (IRQ_EINT8 - 8)); | ||
43 | break; | ||
44 | default: | ||
45 | printk(KERN_ERR "number available : %d\n", number); | ||
46 | } | ||
47 | |||
48 | return ret; | ||
49 | } | ||
50 | |||
51 | static inline void s5pv310_irq_eint_mask(unsigned int irq) | ||
52 | { | ||
53 | u32 mask; | ||
54 | |||
55 | spin_lock(&eint_lock); | ||
56 | mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(irq))); | ||
57 | mask |= eint_irq_to_bit(irq); | ||
58 | __raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(irq))); | ||
59 | spin_unlock(&eint_lock); | ||
60 | } | ||
61 | |||
62 | static void s5pv310_irq_eint_unmask(unsigned int irq) | ||
63 | { | ||
64 | u32 mask; | ||
65 | |||
66 | spin_lock(&eint_lock); | ||
67 | mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(irq))); | ||
68 | mask &= ~(eint_irq_to_bit(irq)); | ||
69 | __raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(irq))); | ||
70 | spin_unlock(&eint_lock); | ||
71 | } | ||
72 | |||
73 | static inline void s5pv310_irq_eint_ack(unsigned int irq) | ||
74 | { | ||
75 | __raw_writel(eint_irq_to_bit(irq), S5P_EINT_PEND(EINT_REG_NR(irq))); | ||
76 | } | ||
77 | |||
78 | static void s5pv310_irq_eint_maskack(unsigned int irq) | ||
79 | { | ||
80 | s5pv310_irq_eint_mask(irq); | ||
81 | s5pv310_irq_eint_ack(irq); | ||
82 | } | ||
83 | |||
84 | static int s5pv310_irq_eint_set_type(unsigned int irq, unsigned int type) | ||
85 | { | ||
86 | int offs = EINT_OFFSET(irq); | ||
87 | int shift; | ||
88 | u32 ctrl, mask; | ||
89 | u32 newvalue = 0; | ||
90 | |||
91 | switch (type) { | ||
92 | case IRQ_TYPE_EDGE_RISING: | ||
93 | newvalue = S5P_IRQ_TYPE_EDGE_RISING; | ||
94 | break; | ||
95 | |||
96 | case IRQ_TYPE_EDGE_FALLING: | ||
97 | newvalue = S5P_IRQ_TYPE_EDGE_FALLING; | ||
98 | break; | ||
99 | |||
100 | case IRQ_TYPE_EDGE_BOTH: | ||
101 | newvalue = S5P_IRQ_TYPE_EDGE_BOTH; | ||
102 | break; | ||
103 | |||
104 | case IRQ_TYPE_LEVEL_LOW: | ||
105 | newvalue = S5P_IRQ_TYPE_LEVEL_LOW; | ||
106 | break; | ||
107 | |||
108 | case IRQ_TYPE_LEVEL_HIGH: | ||
109 | newvalue = S5P_IRQ_TYPE_LEVEL_HIGH; | ||
110 | break; | ||
111 | |||
112 | default: | ||
113 | printk(KERN_ERR "No such irq type %d", type); | ||
114 | return -EINVAL; | ||
115 | } | ||
116 | |||
117 | shift = (offs & 0x7) * 4; | ||
118 | mask = 0x7 << shift; | ||
119 | |||
120 | spin_lock(&eint_lock); | ||
121 | ctrl = __raw_readl(S5P_EINT_CON(EINT_REG_NR(irq))); | ||
122 | ctrl &= ~mask; | ||
123 | ctrl |= newvalue << shift; | ||
124 | __raw_writel(ctrl, S5P_EINT_CON(EINT_REG_NR(irq))); | ||
125 | spin_unlock(&eint_lock); | ||
126 | |||
127 | switch (offs) { | ||
128 | case 0 ... 7: | ||
129 | s3c_gpio_cfgpin(EINT_GPIO_0(offs & 0x7), EINT_MODE); | ||
130 | break; | ||
131 | case 8 ... 15: | ||
132 | s3c_gpio_cfgpin(EINT_GPIO_1(offs & 0x7), EINT_MODE); | ||
133 | break; | ||
134 | case 16 ... 23: | ||
135 | s3c_gpio_cfgpin(EINT_GPIO_2(offs & 0x7), EINT_MODE); | ||
136 | break; | ||
137 | case 24 ... 31: | ||
138 | s3c_gpio_cfgpin(EINT_GPIO_3(offs & 0x7), EINT_MODE); | ||
139 | break; | ||
140 | default: | ||
141 | printk(KERN_ERR "No such irq number %d", offs); | ||
142 | } | ||
143 | |||
144 | return 0; | ||
145 | } | ||
146 | |||
147 | static struct irq_chip s5pv310_irq_eint = { | ||
148 | .name = "s5pv310-eint", | ||
149 | .mask = s5pv310_irq_eint_mask, | ||
150 | .unmask = s5pv310_irq_eint_unmask, | ||
151 | .mask_ack = s5pv310_irq_eint_maskack, | ||
152 | .ack = s5pv310_irq_eint_ack, | ||
153 | .set_type = s5pv310_irq_eint_set_type, | ||
154 | #ifdef CONFIG_PM | ||
155 | .set_wake = s3c_irqext_wake, | ||
156 | #endif | ||
157 | }; | ||
158 | |||
159 | /* s5pv310_irq_demux_eint | ||
160 | * | ||
161 | * This function demuxes the IRQ from from EINTs 16 to 31. | ||
162 | * It is designed to be inlined into the specific handler | ||
163 | * s5p_irq_demux_eintX_Y. | ||
164 | * | ||
165 | * Each EINT pend/mask registers handle eight of them. | ||
166 | */ | ||
167 | static inline void s5pv310_irq_demux_eint(unsigned int start) | ||
168 | { | ||
169 | unsigned int irq; | ||
170 | |||
171 | u32 status = __raw_readl(S5P_EINT_PEND(EINT_REG_NR(start))); | ||
172 | u32 mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(start))); | ||
173 | |||
174 | status &= ~mask; | ||
175 | status &= 0xff; | ||
176 | |||
177 | while (status) { | ||
178 | irq = fls(status) - 1; | ||
179 | generic_handle_irq(irq + start); | ||
180 | status &= ~(1 << irq); | ||
181 | } | ||
182 | } | ||
183 | |||
184 | static void s5pv310_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc) | ||
185 | { | ||
186 | s5pv310_irq_demux_eint(IRQ_EINT(16)); | ||
187 | s5pv310_irq_demux_eint(IRQ_EINT(24)); | ||
188 | } | ||
189 | |||
190 | static void s5pv310_irq_eint0_15(unsigned int irq, struct irq_desc *desc) | ||
191 | { | ||
192 | u32 *irq_data = get_irq_data(irq); | ||
193 | struct irq_chip *chip = get_irq_chip(irq); | ||
194 | |||
195 | chip->mask(irq); | ||
196 | |||
197 | if (chip->ack) | ||
198 | chip->ack(irq); | ||
199 | |||
200 | generic_handle_irq(*irq_data); | ||
201 | |||
202 | chip->unmask(irq); | ||
203 | } | ||
204 | |||
205 | int __init s5pv310_init_irq_eint(void) | ||
206 | { | ||
207 | int irq; | ||
208 | |||
209 | for (irq = 0 ; irq <= 31 ; irq++) { | ||
210 | set_irq_chip(IRQ_EINT(irq), &s5pv310_irq_eint); | ||
211 | set_irq_handler(IRQ_EINT(irq), handle_level_irq); | ||
212 | set_irq_flags(IRQ_EINT(irq), IRQF_VALID); | ||
213 | } | ||
214 | |||
215 | set_irq_chained_handler(IRQ_EINT16_31, s5pv310_irq_demux_eint16_31); | ||
216 | |||
217 | for (irq = 0 ; irq <= 15 ; irq++) { | ||
218 | eint0_15_data[irq] = IRQ_EINT(irq); | ||
219 | |||
220 | set_irq_data(s5pv310_get_irq_nr(irq), &eint0_15_data[irq]); | ||
221 | set_irq_chained_handler(s5pv310_get_irq_nr(irq), | ||
222 | s5pv310_irq_eint0_15); | ||
223 | } | ||
224 | |||
225 | return 0; | ||
226 | } | ||
227 | |||
228 | arch_initcall(s5pv310_init_irq_eint); | ||
diff --git a/arch/arm/mach-s5pv310/mach-smdkc210.c b/arch/arm/mach-s5pv310/mach-smdkc210.c new file mode 100644 index 000000000000..2b8d4fc52d7c --- /dev/null +++ b/arch/arm/mach-s5pv310/mach-smdkc210.c | |||
@@ -0,0 +1,202 @@ | |||
1 | /* linux/arch/arm/mach-s5pv310/mach-smdkc210.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/serial_core.h> | ||
12 | #include <linux/gpio.h> | ||
13 | #include <linux/mmc/host.h> | ||
14 | #include <linux/platform_device.h> | ||
15 | #include <linux/smsc911x.h> | ||
16 | #include <linux/io.h> | ||
17 | |||
18 | #include <asm/mach/arch.h> | ||
19 | #include <asm/mach-types.h> | ||
20 | |||
21 | #include <plat/regs-serial.h> | ||
22 | #include <plat/s5pv310.h> | ||
23 | #include <plat/cpu.h> | ||
24 | #include <plat/devs.h> | ||
25 | #include <plat/sdhci.h> | ||
26 | |||
27 | #include <mach/map.h> | ||
28 | #include <mach/regs-srom.h> | ||
29 | |||
30 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | ||
31 | #define SMDKC210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | ||
32 | S3C2410_UCON_RXILEVEL | \ | ||
33 | S3C2410_UCON_TXIRQMODE | \ | ||
34 | S3C2410_UCON_RXIRQMODE | \ | ||
35 | S3C2410_UCON_RXFIFO_TOI | \ | ||
36 | S3C2443_UCON_RXERR_IRQEN) | ||
37 | |||
38 | #define SMDKC210_ULCON_DEFAULT S3C2410_LCON_CS8 | ||
39 | |||
40 | #define SMDKC210_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \ | ||
41 | S5PV210_UFCON_TXTRIG4 | \ | ||
42 | S5PV210_UFCON_RXTRIG4) | ||
43 | |||
44 | static struct s3c2410_uartcfg smdkc210_uartcfgs[] __initdata = { | ||
45 | [0] = { | ||
46 | .hwport = 0, | ||
47 | .flags = 0, | ||
48 | .ucon = SMDKC210_UCON_DEFAULT, | ||
49 | .ulcon = SMDKC210_ULCON_DEFAULT, | ||
50 | .ufcon = SMDKC210_UFCON_DEFAULT, | ||
51 | }, | ||
52 | [1] = { | ||
53 | .hwport = 1, | ||
54 | .flags = 0, | ||
55 | .ucon = SMDKC210_UCON_DEFAULT, | ||
56 | .ulcon = SMDKC210_ULCON_DEFAULT, | ||
57 | .ufcon = SMDKC210_UFCON_DEFAULT, | ||
58 | }, | ||
59 | [2] = { | ||
60 | .hwport = 2, | ||
61 | .flags = 0, | ||
62 | .ucon = SMDKC210_UCON_DEFAULT, | ||
63 | .ulcon = SMDKC210_ULCON_DEFAULT, | ||
64 | .ufcon = SMDKC210_UFCON_DEFAULT, | ||
65 | }, | ||
66 | [3] = { | ||
67 | .hwport = 3, | ||
68 | .flags = 0, | ||
69 | .ucon = SMDKC210_UCON_DEFAULT, | ||
70 | .ulcon = SMDKC210_ULCON_DEFAULT, | ||
71 | .ufcon = SMDKC210_UFCON_DEFAULT, | ||
72 | }, | ||
73 | }; | ||
74 | |||
75 | static struct s3c_sdhci_platdata smdkc210_hsmmc0_pdata __initdata = { | ||
76 | .cd_type = S3C_SDHCI_CD_GPIO, | ||
77 | .ext_cd_gpio = S5PV310_GPK0(2), | ||
78 | .ext_cd_gpio_invert = 1, | ||
79 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
80 | #ifdef CONFIG_S5PV310_SDHCI_CH0_8BIT | ||
81 | .max_width = 8, | ||
82 | .host_caps = MMC_CAP_8_BIT_DATA, | ||
83 | #endif | ||
84 | }; | ||
85 | |||
86 | static struct s3c_sdhci_platdata smdkc210_hsmmc1_pdata __initdata = { | ||
87 | .cd_type = S3C_SDHCI_CD_GPIO, | ||
88 | .ext_cd_gpio = S5PV310_GPK0(2), | ||
89 | .ext_cd_gpio_invert = 1, | ||
90 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
91 | }; | ||
92 | |||
93 | static struct s3c_sdhci_platdata smdkc210_hsmmc2_pdata __initdata = { | ||
94 | .cd_type = S3C_SDHCI_CD_GPIO, | ||
95 | .ext_cd_gpio = S5PV310_GPK2(2), | ||
96 | .ext_cd_gpio_invert = 1, | ||
97 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
98 | #ifdef CONFIG_S5PV310_SDHCI_CH2_8BIT | ||
99 | .max_width = 8, | ||
100 | .host_caps = MMC_CAP_8_BIT_DATA, | ||
101 | #endif | ||
102 | }; | ||
103 | |||
104 | static struct s3c_sdhci_platdata smdkc210_hsmmc3_pdata __initdata = { | ||
105 | .cd_type = S3C_SDHCI_CD_GPIO, | ||
106 | .ext_cd_gpio = S5PV310_GPK2(2), | ||
107 | .ext_cd_gpio_invert = 1, | ||
108 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
109 | }; | ||
110 | |||
111 | static struct resource smdkc210_smsc911x_resources[] = { | ||
112 | [0] = { | ||
113 | .start = S5PV310_PA_SROM_BANK(1), | ||
114 | .end = S5PV310_PA_SROM_BANK(1) + SZ_64K - 1, | ||
115 | .flags = IORESOURCE_MEM, | ||
116 | }, | ||
117 | [1] = { | ||
118 | .start = IRQ_EINT(5), | ||
119 | .end = IRQ_EINT(5), | ||
120 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, | ||
121 | }, | ||
122 | }; | ||
123 | |||
124 | static struct smsc911x_platform_config smsc9215_config = { | ||
125 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH, | ||
126 | .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, | ||
127 | .flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY, | ||
128 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
129 | .mac = {0x00, 0x80, 0x00, 0x23, 0x45, 0x67}, | ||
130 | }; | ||
131 | |||
132 | static struct platform_device smdkc210_smsc911x = { | ||
133 | .name = "smsc911x", | ||
134 | .id = -1, | ||
135 | .num_resources = ARRAY_SIZE(smdkc210_smsc911x_resources), | ||
136 | .resource = smdkc210_smsc911x_resources, | ||
137 | .dev = { | ||
138 | .platform_data = &smsc9215_config, | ||
139 | }, | ||
140 | }; | ||
141 | |||
142 | static struct platform_device *smdkc210_devices[] __initdata = { | ||
143 | &s3c_device_hsmmc0, | ||
144 | &s3c_device_hsmmc1, | ||
145 | &s3c_device_hsmmc2, | ||
146 | &s3c_device_hsmmc3, | ||
147 | &s3c_device_rtc, | ||
148 | &s3c_device_wdt, | ||
149 | &smdkc210_smsc911x, | ||
150 | }; | ||
151 | |||
152 | static void __init smdkc210_smsc911x_init(void) | ||
153 | { | ||
154 | u32 cs1; | ||
155 | |||
156 | /* configure nCS1 width to 16 bits */ | ||
157 | cs1 = __raw_readl(S5PV310_SROM_BW) & | ||
158 | ~(S5PV310_SROM_BW__CS_MASK << | ||
159 | S5PV310_SROM_BW__NCS1__SHIFT); | ||
160 | cs1 |= ((1 << S5PV310_SROM_BW__DATAWIDTH__SHIFT) | | ||
161 | (1 << S5PV310_SROM_BW__WAITENABLE__SHIFT) | | ||
162 | (1 << S5PV310_SROM_BW__BYTEENABLE__SHIFT)) << | ||
163 | S5PV310_SROM_BW__NCS1__SHIFT; | ||
164 | __raw_writel(cs1, S5PV310_SROM_BW); | ||
165 | |||
166 | /* set timing for nCS1 suitable for ethernet chip */ | ||
167 | __raw_writel((0x1 << S5PV310_SROM_BCX__PMC__SHIFT) | | ||
168 | (0x9 << S5PV310_SROM_BCX__TACP__SHIFT) | | ||
169 | (0xc << S5PV310_SROM_BCX__TCAH__SHIFT) | | ||
170 | (0x1 << S5PV310_SROM_BCX__TCOH__SHIFT) | | ||
171 | (0x6 << S5PV310_SROM_BCX__TACC__SHIFT) | | ||
172 | (0x1 << S5PV310_SROM_BCX__TCOS__SHIFT) | | ||
173 | (0x1 << S5PV310_SROM_BCX__TACS__SHIFT), S5PV310_SROM_BC1); | ||
174 | } | ||
175 | |||
176 | static void __init smdkc210_map_io(void) | ||
177 | { | ||
178 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | ||
179 | s3c24xx_init_clocks(24000000); | ||
180 | s3c24xx_init_uarts(smdkc210_uartcfgs, ARRAY_SIZE(smdkc210_uartcfgs)); | ||
181 | } | ||
182 | |||
183 | static void __init smdkc210_machine_init(void) | ||
184 | { | ||
185 | smdkc210_smsc911x_init(); | ||
186 | |||
187 | s3c_sdhci0_set_platdata(&smdkc210_hsmmc0_pdata); | ||
188 | s3c_sdhci1_set_platdata(&smdkc210_hsmmc1_pdata); | ||
189 | s3c_sdhci2_set_platdata(&smdkc210_hsmmc2_pdata); | ||
190 | s3c_sdhci3_set_platdata(&smdkc210_hsmmc3_pdata); | ||
191 | |||
192 | platform_add_devices(smdkc210_devices, ARRAY_SIZE(smdkc210_devices)); | ||
193 | } | ||
194 | |||
195 | MACHINE_START(SMDKC210, "SMDKC210") | ||
196 | /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ | ||
197 | .boot_params = S5P_PA_SDRAM + 0x100, | ||
198 | .init_irq = s5pv310_init_irq, | ||
199 | .map_io = smdkc210_map_io, | ||
200 | .init_machine = smdkc210_machine_init, | ||
201 | .timer = &s5pv310_timer, | ||
202 | MACHINE_END | ||
diff --git a/arch/arm/mach-s5pv310/mach-smdkv310.c b/arch/arm/mach-s5pv310/mach-smdkv310.c index 46215a14b3bb..35826d66632c 100644 --- a/arch/arm/mach-s5pv310/mach-smdkv310.c +++ b/arch/arm/mach-s5pv310/mach-smdkv310.c | |||
@@ -9,16 +9,23 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/serial_core.h> | 11 | #include <linux/serial_core.h> |
12 | #include <linux/gpio.h> | ||
13 | #include <linux/mmc/host.h> | ||
14 | #include <linux/platform_device.h> | ||
15 | #include <linux/smsc911x.h> | ||
16 | #include <linux/io.h> | ||
12 | 17 | ||
13 | #include <asm/mach/arch.h> | 18 | #include <asm/mach/arch.h> |
14 | #include <asm/mach-types.h> | 19 | #include <asm/mach-types.h> |
15 | #include <asm/hardware/cache-l2x0.h> | ||
16 | 20 | ||
17 | #include <plat/regs-serial.h> | 21 | #include <plat/regs-serial.h> |
18 | #include <plat/s5pv310.h> | 22 | #include <plat/s5pv310.h> |
19 | #include <plat/cpu.h> | 23 | #include <plat/cpu.h> |
24 | #include <plat/devs.h> | ||
25 | #include <plat/sdhci.h> | ||
20 | 26 | ||
21 | #include <mach/map.h> | 27 | #include <mach/map.h> |
28 | #include <mach/regs-srom.h> | ||
22 | 29 | ||
23 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 30 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
24 | #define SMDKV310_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 31 | #define SMDKV310_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
@@ -65,6 +72,107 @@ static struct s3c2410_uartcfg smdkv310_uartcfgs[] __initdata = { | |||
65 | }, | 72 | }, |
66 | }; | 73 | }; |
67 | 74 | ||
75 | static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = { | ||
76 | .cd_type = S3C_SDHCI_CD_GPIO, | ||
77 | .ext_cd_gpio = S5PV310_GPK0(2), | ||
78 | .ext_cd_gpio_invert = 1, | ||
79 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
80 | #ifdef CONFIG_S5PV310_SDHCI_CH0_8BIT | ||
81 | .max_width = 8, | ||
82 | .host_caps = MMC_CAP_8_BIT_DATA, | ||
83 | #endif | ||
84 | }; | ||
85 | |||
86 | static struct s3c_sdhci_platdata smdkv310_hsmmc1_pdata __initdata = { | ||
87 | .cd_type = S3C_SDHCI_CD_GPIO, | ||
88 | .ext_cd_gpio = S5PV310_GPK0(2), | ||
89 | .ext_cd_gpio_invert = 1, | ||
90 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
91 | }; | ||
92 | |||
93 | static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = { | ||
94 | .cd_type = S3C_SDHCI_CD_GPIO, | ||
95 | .ext_cd_gpio = S5PV310_GPK2(2), | ||
96 | .ext_cd_gpio_invert = 1, | ||
97 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
98 | #ifdef CONFIG_S5PV310_SDHCI_CH2_8BIT | ||
99 | .max_width = 8, | ||
100 | .host_caps = MMC_CAP_8_BIT_DATA, | ||
101 | #endif | ||
102 | }; | ||
103 | |||
104 | static struct s3c_sdhci_platdata smdkv310_hsmmc3_pdata __initdata = { | ||
105 | .cd_type = S3C_SDHCI_CD_GPIO, | ||
106 | .ext_cd_gpio = S5PV310_GPK2(2), | ||
107 | .ext_cd_gpio_invert = 1, | ||
108 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
109 | }; | ||
110 | |||
111 | static struct resource smdkv310_smsc911x_resources[] = { | ||
112 | [0] = { | ||
113 | .start = S5PV310_PA_SROM_BANK(1), | ||
114 | .end = S5PV310_PA_SROM_BANK(1) + SZ_64K - 1, | ||
115 | .flags = IORESOURCE_MEM, | ||
116 | }, | ||
117 | [1] = { | ||
118 | .start = IRQ_EINT(5), | ||
119 | .end = IRQ_EINT(5), | ||
120 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, | ||
121 | }, | ||
122 | }; | ||
123 | |||
124 | static struct smsc911x_platform_config smsc9215_config = { | ||
125 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH, | ||
126 | .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, | ||
127 | .flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY, | ||
128 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
129 | .mac = {0x00, 0x80, 0x00, 0x23, 0x45, 0x67}, | ||
130 | }; | ||
131 | |||
132 | static struct platform_device smdkv310_smsc911x = { | ||
133 | .name = "smsc911x", | ||
134 | .id = -1, | ||
135 | .num_resources = ARRAY_SIZE(smdkv310_smsc911x_resources), | ||
136 | .resource = smdkv310_smsc911x_resources, | ||
137 | .dev = { | ||
138 | .platform_data = &smsc9215_config, | ||
139 | }, | ||
140 | }; | ||
141 | |||
142 | static struct platform_device *smdkv310_devices[] __initdata = { | ||
143 | &s3c_device_hsmmc0, | ||
144 | &s3c_device_hsmmc1, | ||
145 | &s3c_device_hsmmc2, | ||
146 | &s3c_device_hsmmc3, | ||
147 | &s3c_device_rtc, | ||
148 | &s3c_device_wdt, | ||
149 | &smdkv310_smsc911x, | ||
150 | }; | ||
151 | |||
152 | static void __init smdkv310_smsc911x_init(void) | ||
153 | { | ||
154 | u32 cs1; | ||
155 | |||
156 | /* configure nCS1 width to 16 bits */ | ||
157 | cs1 = __raw_readl(S5PV310_SROM_BW) & | ||
158 | ~(S5PV310_SROM_BW__CS_MASK << | ||
159 | S5PV310_SROM_BW__NCS1__SHIFT); | ||
160 | cs1 |= ((1 << S5PV310_SROM_BW__DATAWIDTH__SHIFT) | | ||
161 | (1 << S5PV310_SROM_BW__WAITENABLE__SHIFT) | | ||
162 | (1 << S5PV310_SROM_BW__BYTEENABLE__SHIFT)) << | ||
163 | S5PV310_SROM_BW__NCS1__SHIFT; | ||
164 | __raw_writel(cs1, S5PV310_SROM_BW); | ||
165 | |||
166 | /* set timing for nCS1 suitable for ethernet chip */ | ||
167 | __raw_writel((0x1 << S5PV310_SROM_BCX__PMC__SHIFT) | | ||
168 | (0x9 << S5PV310_SROM_BCX__TACP__SHIFT) | | ||
169 | (0xc << S5PV310_SROM_BCX__TCAH__SHIFT) | | ||
170 | (0x1 << S5PV310_SROM_BCX__TCOH__SHIFT) | | ||
171 | (0x6 << S5PV310_SROM_BCX__TACC__SHIFT) | | ||
172 | (0x1 << S5PV310_SROM_BCX__TCOS__SHIFT) | | ||
173 | (0x1 << S5PV310_SROM_BCX__TACS__SHIFT), S5PV310_SROM_BC1); | ||
174 | } | ||
175 | |||
68 | static void __init smdkv310_map_io(void) | 176 | static void __init smdkv310_map_io(void) |
69 | { | 177 | { |
70 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 178 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); |
@@ -74,9 +182,14 @@ static void __init smdkv310_map_io(void) | |||
74 | 182 | ||
75 | static void __init smdkv310_machine_init(void) | 183 | static void __init smdkv310_machine_init(void) |
76 | { | 184 | { |
77 | #ifdef CONFIG_CACHE_L2X0 | 185 | smdkv310_smsc911x_init(); |
78 | l2x0_init(S5P_VA_L2CC, 1 << 28, 0xffffffff); | 186 | |
79 | #endif | 187 | s3c_sdhci0_set_platdata(&smdkv310_hsmmc0_pdata); |
188 | s3c_sdhci1_set_platdata(&smdkv310_hsmmc1_pdata); | ||
189 | s3c_sdhci2_set_platdata(&smdkv310_hsmmc2_pdata); | ||
190 | s3c_sdhci3_set_platdata(&smdkv310_hsmmc3_pdata); | ||
191 | |||
192 | platform_add_devices(smdkv310_devices, ARRAY_SIZE(smdkv310_devices)); | ||
80 | } | 193 | } |
81 | 194 | ||
82 | MACHINE_START(SMDKV310, "SMDKV310") | 195 | MACHINE_START(SMDKV310, "SMDKV310") |
diff --git a/arch/arm/mach-s5pv310/mach-universal_c210.c b/arch/arm/mach-s5pv310/mach-universal_c210.c index d7c2ec770f88..16d8fc00cafd 100644 --- a/arch/arm/mach-s5pv310/mach-universal_c210.c +++ b/arch/arm/mach-s5pv310/mach-universal_c210.c | |||
@@ -7,15 +7,20 @@ | |||
7 | * published by the Free Software Foundation. | 7 | * published by the Free Software Foundation. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/platform_device.h> | ||
10 | #include <linux/serial_core.h> | 11 | #include <linux/serial_core.h> |
12 | #include <linux/input.h> | ||
13 | #include <linux/i2c.h> | ||
14 | #include <linux/gpio_keys.h> | ||
15 | #include <linux/gpio.h> | ||
11 | 16 | ||
12 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
13 | #include <asm/mach-types.h> | 18 | #include <asm/mach-types.h> |
14 | #include <asm/hardware/cache-l2x0.h> | ||
15 | 19 | ||
16 | #include <plat/regs-serial.h> | 20 | #include <plat/regs-serial.h> |
17 | #include <plat/s5pv310.h> | 21 | #include <plat/s5pv310.h> |
18 | #include <plat/cpu.h> | 22 | #include <plat/cpu.h> |
23 | #include <plat/devs.h> | ||
19 | 24 | ||
20 | #include <mach/map.h> | 25 | #include <mach/map.h> |
21 | 26 | ||
@@ -60,6 +65,72 @@ static struct s3c2410_uartcfg universal_uartcfgs[] __initdata = { | |||
60 | }, | 65 | }, |
61 | }; | 66 | }; |
62 | 67 | ||
68 | static struct gpio_keys_button universal_gpio_keys_tables[] = { | ||
69 | { | ||
70 | .code = KEY_VOLUMEUP, | ||
71 | .gpio = S5PV310_GPX2(0), /* XEINT16 */ | ||
72 | .desc = "gpio-keys: KEY_VOLUMEUP", | ||
73 | .type = EV_KEY, | ||
74 | .active_low = 1, | ||
75 | .debounce_interval = 1, | ||
76 | }, { | ||
77 | .code = KEY_VOLUMEDOWN, | ||
78 | .gpio = S5PV310_GPX2(1), /* XEINT17 */ | ||
79 | .desc = "gpio-keys: KEY_VOLUMEDOWN", | ||
80 | .type = EV_KEY, | ||
81 | .active_low = 1, | ||
82 | .debounce_interval = 1, | ||
83 | }, { | ||
84 | .code = KEY_CONFIG, | ||
85 | .gpio = S5PV310_GPX2(2), /* XEINT18 */ | ||
86 | .desc = "gpio-keys: KEY_CONFIG", | ||
87 | .type = EV_KEY, | ||
88 | .active_low = 1, | ||
89 | .debounce_interval = 1, | ||
90 | }, { | ||
91 | .code = KEY_CAMERA, | ||
92 | .gpio = S5PV310_GPX2(3), /* XEINT19 */ | ||
93 | .desc = "gpio-keys: KEY_CAMERA", | ||
94 | .type = EV_KEY, | ||
95 | .active_low = 1, | ||
96 | .debounce_interval = 1, | ||
97 | }, { | ||
98 | .code = KEY_OK, | ||
99 | .gpio = S5PV310_GPX3(5), /* XEINT29 */ | ||
100 | .desc = "gpio-keys: KEY_OK", | ||
101 | .type = EV_KEY, | ||
102 | .active_low = 1, | ||
103 | .debounce_interval = 1, | ||
104 | }, | ||
105 | }; | ||
106 | |||
107 | static struct gpio_keys_platform_data universal_gpio_keys_data = { | ||
108 | .buttons = universal_gpio_keys_tables, | ||
109 | .nbuttons = ARRAY_SIZE(universal_gpio_keys_tables), | ||
110 | }; | ||
111 | |||
112 | static struct platform_device universal_gpio_keys = { | ||
113 | .name = "gpio-keys", | ||
114 | .dev = { | ||
115 | .platform_data = &universal_gpio_keys_data, | ||
116 | }, | ||
117 | }; | ||
118 | |||
119 | /* I2C0 */ | ||
120 | static struct i2c_board_info i2c0_devs[] __initdata = { | ||
121 | /* Camera, To be updated */ | ||
122 | }; | ||
123 | |||
124 | /* I2C1 */ | ||
125 | static struct i2c_board_info i2c1_devs[] __initdata = { | ||
126 | /* Gyro, To be updated */ | ||
127 | }; | ||
128 | |||
129 | static struct platform_device *universal_devices[] __initdata = { | ||
130 | &universal_gpio_keys, | ||
131 | &s5p_device_onenand, | ||
132 | }; | ||
133 | |||
63 | static void __init universal_map_io(void) | 134 | static void __init universal_map_io(void) |
64 | { | 135 | { |
65 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 136 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); |
@@ -69,9 +140,11 @@ static void __init universal_map_io(void) | |||
69 | 140 | ||
70 | static void __init universal_machine_init(void) | 141 | static void __init universal_machine_init(void) |
71 | { | 142 | { |
72 | #ifdef CONFIG_CACHE_L2X0 | 143 | i2c_register_board_info(0, i2c0_devs, ARRAY_SIZE(i2c0_devs)); |
73 | l2x0_init(S5P_VA_L2CC, 1 << 28, 0xffffffff); | 144 | i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs)); |
74 | #endif | 145 | |
146 | /* Last */ | ||
147 | platform_add_devices(universal_devices, ARRAY_SIZE(universal_devices)); | ||
75 | } | 148 | } |
76 | 149 | ||
77 | MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210") | 150 | MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210") |
diff --git a/arch/arm/mach-s5pv310/setup-i2c0.c b/arch/arm/mach-s5pv310/setup-i2c0.c index 436712807383..f47f8f3152ec 100644 --- a/arch/arm/mach-s5pv310/setup-i2c0.c +++ b/arch/arm/mach-s5pv310/setup-i2c0.c | |||
@@ -21,8 +21,6 @@ struct platform_device; /* don't need the contents */ | |||
21 | 21 | ||
22 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) | 22 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) |
23 | { | 23 | { |
24 | s3c_gpio_cfgpin(S5PV310_GPD1(0), S3C_GPIO_SFN(2)); | 24 | s3c_gpio_cfgall_range(S5PV310_GPD1(0), 2, |
25 | s3c_gpio_setpull(S5PV310_GPD1(0), S3C_GPIO_PULL_UP); | 25 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
26 | s3c_gpio_cfgpin(S5PV310_GPD1(1), S3C_GPIO_SFN(2)); | ||
27 | s3c_gpio_setpull(S5PV310_GPD1(1), S3C_GPIO_PULL_UP); | ||
28 | } | 26 | } |
diff --git a/arch/arm/mach-s5pv310/setup-i2c1.c b/arch/arm/mach-s5pv310/setup-i2c1.c index 1ecd5bc35b5a..9d07e4e2f14c 100644 --- a/arch/arm/mach-s5pv310/setup-i2c1.c +++ b/arch/arm/mach-s5pv310/setup-i2c1.c | |||
@@ -18,8 +18,6 @@ struct platform_device; /* don't need the contents */ | |||
18 | 18 | ||
19 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) | 19 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) |
20 | { | 20 | { |
21 | s3c_gpio_cfgpin(S5PV310_GPD1(2), S3C_GPIO_SFN(2)); | 21 | s3c_gpio_cfgall_range(S5PV310_GPD1(2), 2, |
22 | s3c_gpio_setpull(S5PV310_GPD1(2), S3C_GPIO_PULL_UP); | 22 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); |
23 | s3c_gpio_cfgpin(S5PV310_GPD1(3), S3C_GPIO_SFN(2)); | ||
24 | s3c_gpio_setpull(S5PV310_GPD1(3), S3C_GPIO_PULL_UP); | ||
25 | } | 23 | } |
diff --git a/arch/arm/mach-s5pv310/setup-i2c2.c b/arch/arm/mach-s5pv310/setup-i2c2.c index 4c0d8def660a..4163b1233daf 100644 --- a/arch/arm/mach-s5pv310/setup-i2c2.c +++ b/arch/arm/mach-s5pv310/setup-i2c2.c | |||
@@ -18,8 +18,6 @@ struct platform_device; /* don't need the contents */ | |||
18 | 18 | ||
19 | void s3c_i2c2_cfg_gpio(struct platform_device *dev) | 19 | void s3c_i2c2_cfg_gpio(struct platform_device *dev) |
20 | { | 20 | { |
21 | s3c_gpio_cfgpin(S5PV310_GPA0(6), S3C_GPIO_SFN(3)); | 21 | s3c_gpio_cfgall_range(S5PV310_GPA0(6), 2, |
22 | s3c_gpio_setpull(S5PV310_GPA0(6), S3C_GPIO_PULL_UP); | 22 | S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP); |
23 | s3c_gpio_cfgpin(S5PV310_GPA0(7), S3C_GPIO_SFN(3)); | ||
24 | s3c_gpio_setpull(S5PV310_GPA0(7), S3C_GPIO_PULL_UP); | ||
25 | } | 23 | } |
diff --git a/arch/arm/mach-s5pv310/setup-i2c3.c b/arch/arm/mach-s5pv310/setup-i2c3.c new file mode 100644 index 000000000000..180f153d2a20 --- /dev/null +++ b/arch/arm/mach-s5pv310/setup-i2c3.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-s5pv310/setup-i2c3.c | ||
3 | * | ||
4 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
5 | * | ||
6 | * I2C3 GPIO configuration. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | struct platform_device; /* don't need the contents */ | ||
14 | |||
15 | #include <linux/gpio.h> | ||
16 | #include <plat/iic.h> | ||
17 | #include <plat/gpio-cfg.h> | ||
18 | |||
19 | void s3c_i2c3_cfg_gpio(struct platform_device *dev) | ||
20 | { | ||
21 | s3c_gpio_cfgall_range(S5PV310_GPA1(2), 2, | ||
22 | S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP); | ||
23 | } | ||
diff --git a/arch/arm/mach-s5pv310/setup-i2c4.c b/arch/arm/mach-s5pv310/setup-i2c4.c new file mode 100644 index 000000000000..909e8dfc5316 --- /dev/null +++ b/arch/arm/mach-s5pv310/setup-i2c4.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-s5pv310/setup-i2c4.c | ||
3 | * | ||
4 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
5 | * | ||
6 | * I2C4 GPIO configuration. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | struct platform_device; /* don't need the contents */ | ||
14 | |||
15 | #include <linux/gpio.h> | ||
16 | #include <plat/iic.h> | ||
17 | #include <plat/gpio-cfg.h> | ||
18 | |||
19 | void s3c_i2c4_cfg_gpio(struct platform_device *dev) | ||
20 | { | ||
21 | s3c_gpio_cfgall_range(S5PV310_GPB(2), 2, | ||
22 | S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP); | ||
23 | } | ||
diff --git a/arch/arm/mach-s5pv310/setup-i2c5.c b/arch/arm/mach-s5pv310/setup-i2c5.c new file mode 100644 index 000000000000..5d0fa4ac0283 --- /dev/null +++ b/arch/arm/mach-s5pv310/setup-i2c5.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-s5pv310/setup-i2c5.c | ||
3 | * | ||
4 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
5 | * | ||
6 | * I2C5 GPIO configuration. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | struct platform_device; /* don't need the contents */ | ||
14 | |||
15 | #include <linux/gpio.h> | ||
16 | #include <plat/iic.h> | ||
17 | #include <plat/gpio-cfg.h> | ||
18 | |||
19 | void s3c_i2c5_cfg_gpio(struct platform_device *dev) | ||
20 | { | ||
21 | s3c_gpio_cfgall_range(S5PV310_GPB(6), 2, | ||
22 | S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP); | ||
23 | } | ||
diff --git a/arch/arm/mach-s5pv310/setup-i2c6.c b/arch/arm/mach-s5pv310/setup-i2c6.c new file mode 100644 index 000000000000..34aafab92ac4 --- /dev/null +++ b/arch/arm/mach-s5pv310/setup-i2c6.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-s5pv310/setup-i2c6.c | ||
3 | * | ||
4 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
5 | * | ||
6 | * I2C6 GPIO configuration. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | struct platform_device; /* don't need the contents */ | ||
14 | |||
15 | #include <linux/gpio.h> | ||
16 | #include <plat/iic.h> | ||
17 | #include <plat/gpio-cfg.h> | ||
18 | |||
19 | void s3c_i2c6_cfg_gpio(struct platform_device *dev) | ||
20 | { | ||
21 | s3c_gpio_cfgall_range(S5PV310_GPC1(3), 2, | ||
22 | S3C_GPIO_SFN(4), S3C_GPIO_PULL_UP); | ||
23 | } | ||
diff --git a/arch/arm/mach-s5pv310/setup-i2c7.c b/arch/arm/mach-s5pv310/setup-i2c7.c new file mode 100644 index 000000000000..9b25b8d18920 --- /dev/null +++ b/arch/arm/mach-s5pv310/setup-i2c7.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-s5pv310/setup-i2c7.c | ||
3 | * | ||
4 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
5 | * | ||
6 | * I2C7 GPIO configuration. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | struct platform_device; /* don't need the contents */ | ||
14 | |||
15 | #include <linux/gpio.h> | ||
16 | #include <plat/iic.h> | ||
17 | #include <plat/gpio-cfg.h> | ||
18 | |||
19 | void s3c_i2c7_cfg_gpio(struct platform_device *dev) | ||
20 | { | ||
21 | s3c_gpio_cfgall_range(S5PV310_GPD0(2), 2, | ||
22 | S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP); | ||
23 | } | ||
diff --git a/arch/arm/mach-s5pv310/setup-sdhci-gpio.c b/arch/arm/mach-s5pv310/setup-sdhci-gpio.c new file mode 100644 index 000000000000..86d38cc49135 --- /dev/null +++ b/arch/arm/mach-s5pv310/setup-sdhci-gpio.c | |||
@@ -0,0 +1,152 @@ | |||
1 | /* linux/arch/arm/mach-s5pv310/setup-sdhci-gpio.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5PV310 - Helper functions for setting up SDHCI device(s) GPIO (HSMMC) | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/gpio.h> | ||
19 | #include <linux/mmc/host.h> | ||
20 | #include <linux/mmc/card.h> | ||
21 | |||
22 | #include <plat/gpio-cfg.h> | ||
23 | #include <plat/regs-sdhci.h> | ||
24 | #include <plat/sdhci.h> | ||
25 | |||
26 | void s5pv310_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | ||
27 | { | ||
28 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | ||
29 | unsigned int gpio; | ||
30 | |||
31 | /* Set all the necessary GPK0[0:1] pins to special-function 2 */ | ||
32 | for (gpio = S5PV310_GPK0(0); gpio < S5PV310_GPK0(2); gpio++) { | ||
33 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
34 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
35 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
36 | } | ||
37 | |||
38 | switch (width) { | ||
39 | case 8: | ||
40 | for (gpio = S5PV310_GPK1(3); gpio <= S5PV310_GPK1(6); gpio++) { | ||
41 | /* Data pin GPK1[3:6] to special-funtion 3 */ | ||
42 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
43 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | ||
44 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
45 | } | ||
46 | case 4: | ||
47 | for (gpio = S5PV310_GPK0(3); gpio <= S5PV310_GPK0(6); gpio++) { | ||
48 | /* Data pin GPK0[3:6] to special-funtion 2 */ | ||
49 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
50 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | ||
51 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
52 | } | ||
53 | default: | ||
54 | break; | ||
55 | } | ||
56 | |||
57 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | ||
58 | s3c_gpio_cfgpin(S5PV310_GPK0(2), S3C_GPIO_SFN(2)); | ||
59 | s3c_gpio_setpull(S5PV310_GPK0(2), S3C_GPIO_PULL_UP); | ||
60 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
61 | } | ||
62 | } | ||
63 | |||
64 | void s5pv310_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) | ||
65 | { | ||
66 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | ||
67 | unsigned int gpio; | ||
68 | |||
69 | /* Set all the necessary GPK1[0:1] pins to special-function 2 */ | ||
70 | for (gpio = S5PV310_GPK1(0); gpio < S5PV310_GPK1(2); gpio++) { | ||
71 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
72 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
73 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
74 | } | ||
75 | |||
76 | for (gpio = S5PV310_GPK1(3); gpio <= S5PV310_GPK1(6); gpio++) { | ||
77 | /* Data pin GPK1[3:6] to special-function 2 */ | ||
78 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
79 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | ||
80 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
81 | } | ||
82 | |||
83 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | ||
84 | s3c_gpio_cfgpin(S5PV310_GPK1(2), S3C_GPIO_SFN(2)); | ||
85 | s3c_gpio_setpull(S5PV310_GPK1(2), S3C_GPIO_PULL_UP); | ||
86 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
87 | } | ||
88 | } | ||
89 | |||
90 | void s5pv310_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width) | ||
91 | { | ||
92 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | ||
93 | unsigned int gpio; | ||
94 | |||
95 | /* Set all the necessary GPK2[0:1] pins to special-function 2 */ | ||
96 | for (gpio = S5PV310_GPK2(0); gpio < S5PV310_GPK2(2); gpio++) { | ||
97 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
98 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
99 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
100 | } | ||
101 | |||
102 | switch (width) { | ||
103 | case 8: | ||
104 | for (gpio = S5PV310_GPK3(3); gpio <= S5PV310_GPK3(6); gpio++) { | ||
105 | /* Data pin GPK3[3:6] to special-function 3 */ | ||
106 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | ||
107 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | ||
108 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
109 | } | ||
110 | case 4: | ||
111 | for (gpio = S5PV310_GPK2(3); gpio <= S5PV310_GPK2(6); gpio++) { | ||
112 | /* Data pin GPK2[3:6] to special-function 2 */ | ||
113 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
114 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | ||
115 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
116 | } | ||
117 | default: | ||
118 | break; | ||
119 | } | ||
120 | |||
121 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | ||
122 | s3c_gpio_cfgpin(S5PV310_GPK2(2), S3C_GPIO_SFN(2)); | ||
123 | s3c_gpio_setpull(S5PV310_GPK2(2), S3C_GPIO_PULL_UP); | ||
124 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
125 | } | ||
126 | } | ||
127 | |||
128 | void s5pv310_setup_sdhci3_cfg_gpio(struct platform_device *dev, int width) | ||
129 | { | ||
130 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | ||
131 | unsigned int gpio; | ||
132 | |||
133 | /* Set all the necessary GPK3[0:1] pins to special-function 2 */ | ||
134 | for (gpio = S5PV310_GPK3(0); gpio < S5PV310_GPK3(2); gpio++) { | ||
135 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
136 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
137 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
138 | } | ||
139 | |||
140 | for (gpio = S5PV310_GPK3(3); gpio <= S5PV310_GPK3(6); gpio++) { | ||
141 | /* Data pin GPK3[3:6] to special-function 2 */ | ||
142 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | ||
143 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | ||
144 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
145 | } | ||
146 | |||
147 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | ||
148 | s3c_gpio_cfgpin(S5PV310_GPK3(2), S3C_GPIO_SFN(2)); | ||
149 | s3c_gpio_setpull(S5PV310_GPK3(2), S3C_GPIO_PULL_UP); | ||
150 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | ||
151 | } | ||
152 | } | ||
diff --git a/arch/arm/mach-s5pv310/setup-sdhci.c b/arch/arm/mach-s5pv310/setup-sdhci.c new file mode 100644 index 000000000000..db8358fc4662 --- /dev/null +++ b/arch/arm/mach-s5pv310/setup-sdhci.c | |||
@@ -0,0 +1,69 @@ | |||
1 | /* linux/arch/arm/mach-s5pv310/setup-sdhci.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5PV310 - Helper functions for settign up SDHCI device(s) (HSMMC) | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/io.h> | ||
18 | |||
19 | #include <linux/mmc/card.h> | ||
20 | #include <linux/mmc/host.h> | ||
21 | |||
22 | #include <plat/regs-sdhci.h> | ||
23 | |||
24 | /* clock sources for the mmc bus clock, order as for the ctrl2[5..4] */ | ||
25 | |||
26 | char *s5pv310_hsmmc_clksrcs[4] = { | ||
27 | [0] = NULL, | ||
28 | [1] = NULL, | ||
29 | [2] = "sclk_mmc", /* mmc_bus */ | ||
30 | [3] = NULL, | ||
31 | }; | ||
32 | |||
33 | void s5pv310_setup_sdhci_cfg_card(struct platform_device *dev, void __iomem *r, | ||
34 | struct mmc_ios *ios, struct mmc_card *card) | ||
35 | { | ||
36 | u32 ctrl2, ctrl3; | ||
37 | |||
38 | /* don't need to alter anything acording to card-type */ | ||
39 | |||
40 | ctrl2 = readl(r + S3C_SDHCI_CONTROL2); | ||
41 | |||
42 | /* select base clock source to HCLK */ | ||
43 | |||
44 | ctrl2 &= S3C_SDHCI_CTRL2_SELBASECLK_MASK; | ||
45 | |||
46 | /* | ||
47 | * clear async mode, enable conflict mask, rx feedback ctrl, SD | ||
48 | * clk hold and no use debounce count | ||
49 | */ | ||
50 | |||
51 | ctrl2 |= (S3C64XX_SDHCI_CTRL2_ENSTAASYNCCLR | | ||
52 | S3C64XX_SDHCI_CTRL2_ENCMDCNFMSK | | ||
53 | S3C_SDHCI_CTRL2_ENFBCLKRX | | ||
54 | S3C_SDHCI_CTRL2_DFCNT_NONE | | ||
55 | S3C_SDHCI_CTRL2_ENCLKOUTHOLD); | ||
56 | |||
57 | /* Tx and Rx feedback clock delay control */ | ||
58 | |||
59 | if (ios->clock < 25 * 1000000) | ||
60 | ctrl3 = (S3C_SDHCI_CTRL3_FCSEL3 | | ||
61 | S3C_SDHCI_CTRL3_FCSEL2 | | ||
62 | S3C_SDHCI_CTRL3_FCSEL1 | | ||
63 | S3C_SDHCI_CTRL3_FCSEL0); | ||
64 | else | ||
65 | ctrl3 = (S3C_SDHCI_CTRL3_FCSEL1 | S3C_SDHCI_CTRL3_FCSEL0); | ||
66 | |||
67 | writel(ctrl2, r + S3C_SDHCI_CONTROL2); | ||
68 | writel(ctrl3, r + S3C_SDHCI_CONTROL3); | ||
69 | } | ||
diff --git a/arch/arm/plat-s3c24xx/common-smdk.c b/arch/arm/plat-s3c24xx/common-smdk.c index 7b44d0c592b5..bcc43f346272 100644 --- a/arch/arm/plat-s3c24xx/common-smdk.c +++ b/arch/arm/plat-s3c24xx/common-smdk.c | |||
@@ -147,7 +147,7 @@ static struct mtd_partition smdk_default_nand_part[] = { | |||
147 | [7] = { | 147 | [7] = { |
148 | .name = "S3C2410 flash partition 7", | 148 | .name = "S3C2410 flash partition 7", |
149 | .offset = SZ_1M * 48, | 149 | .offset = SZ_1M * 48, |
150 | .size = SZ_16M, | 150 | .size = MTDPART_SIZ_FULL, |
151 | } | 151 | } |
152 | }; | 152 | }; |
153 | 153 | ||
diff --git a/arch/arm/plat-s3c24xx/gpiolib.c b/arch/arm/plat-s3c24xx/gpiolib.c index 4c0896f2572d..243b6411050d 100644 --- a/arch/arm/plat-s3c24xx/gpiolib.c +++ b/arch/arm/plat-s3c24xx/gpiolib.c | |||
@@ -74,11 +74,6 @@ static int s3c24xx_gpiolib_bankf_toirq(struct gpio_chip *chip, unsigned offset) | |||
74 | return -EINVAL; | 74 | return -EINVAL; |
75 | } | 75 | } |
76 | 76 | ||
77 | static int s3c24xx_gpiolib_bankg_toirq(struct gpio_chip *chip, unsigned offset) | ||
78 | { | ||
79 | return IRQ_EINT8 + offset; | ||
80 | } | ||
81 | |||
82 | static struct s3c_gpio_cfg s3c24xx_gpiocfg_banka = { | 77 | static struct s3c_gpio_cfg s3c24xx_gpiocfg_banka = { |
83 | .set_config = s3c_gpio_setcfg_s3c24xx_a, | 78 | .set_config = s3c_gpio_setcfg_s3c24xx_a, |
84 | .get_config = s3c_gpio_getcfg_s3c24xx_a, | 79 | .get_config = s3c_gpio_getcfg_s3c24xx_a, |
@@ -157,12 +152,13 @@ struct s3c_gpio_chip s3c24xx_gpios[] = { | |||
157 | [6] = { | 152 | [6] = { |
158 | .base = S3C2410_GPGCON, | 153 | .base = S3C2410_GPGCON, |
159 | .pm = __gpio_pm(&s3c_gpio_pm_2bit), | 154 | .pm = __gpio_pm(&s3c_gpio_pm_2bit), |
155 | .irq_base = IRQ_EINT8, | ||
160 | .chip = { | 156 | .chip = { |
161 | .base = S3C2410_GPG(0), | 157 | .base = S3C2410_GPG(0), |
162 | .owner = THIS_MODULE, | 158 | .owner = THIS_MODULE, |
163 | .label = "GPIOG", | 159 | .label = "GPIOG", |
164 | .ngpio = 16, | 160 | .ngpio = 16, |
165 | .to_irq = s3c24xx_gpiolib_bankg_toirq, | 161 | .to_irq = samsung_gpiolib_to_irq, |
166 | }, | 162 | }, |
167 | }, { | 163 | }, { |
168 | .base = S3C2410_GPHCON, | 164 | .base = S3C2410_GPHCON, |
diff --git a/arch/arm/plat-s5p/Kconfig b/arch/arm/plat-s5p/Kconfig index 25960966af7c..65dbfa8e0a86 100644 --- a/arch/arm/plat-s5p/Kconfig +++ b/arch/arm/plat-s5p/Kconfig | |||
@@ -32,6 +32,11 @@ config S5P_EXT_INT | |||
32 | Use the external interrupts (other than GPIO interrupts.) | 32 | Use the external interrupts (other than GPIO interrupts.) |
33 | Note: Do not choose this for S5P6440 and S5P6450. | 33 | Note: Do not choose this for S5P6440 and S5P6450. |
34 | 34 | ||
35 | config S5P_GPIO_INT | ||
36 | bool | ||
37 | help | ||
38 | Common code for the GPIO interrupts (other than external interrupts.) | ||
39 | |||
35 | config S5P_DEV_FIMC0 | 40 | config S5P_DEV_FIMC0 |
36 | bool | 41 | bool |
37 | help | 42 | help |
diff --git a/arch/arm/plat-s5p/Makefile b/arch/arm/plat-s5p/Makefile index f3e917e27da8..de65238a7aef 100644 --- a/arch/arm/plat-s5p/Makefile +++ b/arch/arm/plat-s5p/Makefile | |||
@@ -18,6 +18,9 @@ obj-y += cpu.o | |||
18 | obj-y += clock.o | 18 | obj-y += clock.o |
19 | obj-y += irq.o | 19 | obj-y += irq.o |
20 | obj-$(CONFIG_S5P_EXT_INT) += irq-eint.o | 20 | obj-$(CONFIG_S5P_EXT_INT) += irq-eint.o |
21 | obj-$(CONFIG_S5P_GPIO_INT) += irq-gpioint.o | ||
22 | obj-$(CONFIG_PM) += pm.o | ||
23 | obj-$(CONFIG_PM) += irq-pm.o | ||
21 | 24 | ||
22 | # devices | 25 | # devices |
23 | 26 | ||
diff --git a/arch/arm/plat-s5p/clock.c b/arch/arm/plat-s5p/clock.c index 8aaf4e6b60c3..8d081d968c58 100644 --- a/arch/arm/plat-s5p/clock.c +++ b/arch/arm/plat-s5p/clock.c | |||
@@ -21,6 +21,8 @@ | |||
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <asm/div64.h> | 22 | #include <asm/div64.h> |
23 | 23 | ||
24 | #include <mach/regs-clock.h> | ||
25 | |||
24 | #include <plat/clock.h> | 26 | #include <plat/clock.h> |
25 | #include <plat/clock-clksrc.h> | 27 | #include <plat/clock-clksrc.h> |
26 | #include <plat/s5p-clock.h> | 28 | #include <plat/s5p-clock.h> |
@@ -88,14 +90,6 @@ struct clk clk_fout_vpll = { | |||
88 | .ctrlbit = (1 << 31), | 90 | .ctrlbit = (1 << 31), |
89 | }; | 91 | }; |
90 | 92 | ||
91 | /* ARM clock */ | ||
92 | struct clk clk_arm = { | ||
93 | .name = "armclk", | ||
94 | .id = -1, | ||
95 | .rate = 0, | ||
96 | .ctrlbit = 0, | ||
97 | }; | ||
98 | |||
99 | /* Possible clock sources for APLL Mux */ | 93 | /* Possible clock sources for APLL Mux */ |
100 | static struct clk *clk_src_apll_list[] = { | 94 | static struct clk *clk_src_apll_list[] = { |
101 | [0] = &clk_fin_apll, | 95 | [0] = &clk_fin_apll, |
@@ -156,6 +150,24 @@ int s5p_gatectrl(void __iomem *reg, struct clk *clk, int enable) | |||
156 | return 0; | 150 | return 0; |
157 | } | 151 | } |
158 | 152 | ||
153 | int s5p_epll_enable(struct clk *clk, int enable) | ||
154 | { | ||
155 | unsigned int ctrlbit = clk->ctrlbit; | ||
156 | unsigned int epll_con = __raw_readl(S5P_EPLL_CON) & ~ctrlbit; | ||
157 | |||
158 | if (enable) | ||
159 | __raw_writel(epll_con | ctrlbit, S5P_EPLL_CON); | ||
160 | else | ||
161 | __raw_writel(epll_con, S5P_EPLL_CON); | ||
162 | |||
163 | return 0; | ||
164 | } | ||
165 | |||
166 | unsigned long s5p_epll_get_rate(struct clk *clk) | ||
167 | { | ||
168 | return clk->rate; | ||
169 | } | ||
170 | |||
159 | static struct clk *s5p_clks[] __initdata = { | 171 | static struct clk *s5p_clks[] __initdata = { |
160 | &clk_ext_xtal_mux, | 172 | &clk_ext_xtal_mux, |
161 | &clk_48m, | 173 | &clk_48m, |
@@ -165,7 +177,6 @@ static struct clk *s5p_clks[] __initdata = { | |||
165 | &clk_fout_epll, | 177 | &clk_fout_epll, |
166 | &clk_fout_dpll, | 178 | &clk_fout_dpll, |
167 | &clk_fout_vpll, | 179 | &clk_fout_vpll, |
168 | &clk_arm, | ||
169 | &clk_vpll, | 180 | &clk_vpll, |
170 | &clk_xusbxti, | 181 | &clk_xusbxti, |
171 | }; | 182 | }; |
diff --git a/arch/arm/plat-s5p/include/plat/irqs.h b/arch/arm/plat-s5p/include/plat/irqs.h index 3fb3a3a17465..ba9121c60a2a 100644 --- a/arch/arm/plat-s5p/include/plat/irqs.h +++ b/arch/arm/plat-s5p/include/plat/irqs.h | |||
@@ -94,4 +94,22 @@ | |||
94 | ((irq) - S5P_EINT_BASE1) : \ | 94 | ((irq) - S5P_EINT_BASE1) : \ |
95 | ((irq) + 16 - S5P_EINT_BASE2)) | 95 | ((irq) + 16 - S5P_EINT_BASE2)) |
96 | 96 | ||
97 | #define IRQ_EINT_BIT(x) EINT_OFFSET(x) | ||
98 | |||
99 | /* Typically only a few gpio chips require gpio interrupt support. | ||
100 | To avoid memory waste irq descriptors are allocated only for | ||
101 | S5P_GPIOINT_GROUP_COUNT chips, each with total number of | ||
102 | S5P_GPIOINT_GROUP_SIZE pins/irqs. Each GPIOINT group can be assiged | ||
103 | to any gpio chip with the s5p_register_gpio_interrupt() function */ | ||
104 | #define S5P_GPIOINT_GROUP_COUNT 4 | ||
105 | #define S5P_GPIOINT_GROUP_SIZE 8 | ||
106 | #define S5P_GPIOINT_COUNT (S5P_GPIOINT_GROUP_COUNT * S5P_GPIOINT_GROUP_SIZE) | ||
107 | |||
108 | /* IRQ types common for all s5p platforms */ | ||
109 | #define S5P_IRQ_TYPE_LEVEL_LOW (0x00) | ||
110 | #define S5P_IRQ_TYPE_LEVEL_HIGH (0x01) | ||
111 | #define S5P_IRQ_TYPE_EDGE_FALLING (0x02) | ||
112 | #define S5P_IRQ_TYPE_EDGE_RISING (0x03) | ||
113 | #define S5P_IRQ_TYPE_EDGE_BOTH (0x04) | ||
114 | |||
97 | #endif /* __ASM_PLAT_S5P_IRQS_H */ | 115 | #endif /* __ASM_PLAT_S5P_IRQS_H */ |
diff --git a/arch/arm/plat-s5p/include/plat/map-s5p.h b/arch/arm/plat-s5p/include/plat/map-s5p.h index c4ff88bf6477..fef353d44513 100644 --- a/arch/arm/plat-s5p/include/plat/map-s5p.h +++ b/arch/arm/plat-s5p/include/plat/map-s5p.h | |||
@@ -13,24 +13,38 @@ | |||
13 | #ifndef __ASM_PLAT_MAP_S5P_H | 13 | #ifndef __ASM_PLAT_MAP_S5P_H |
14 | #define __ASM_PLAT_MAP_S5P_H __FILE__ | 14 | #define __ASM_PLAT_MAP_S5P_H __FILE__ |
15 | 15 | ||
16 | #define S5P_VA_CHIPID S3C_ADDR(0x00700000) | 16 | #define S5P_VA_CHIPID S3C_ADDR(0x02000000) |
17 | #define S5P_VA_GPIO S3C_ADDR(0x00500000) | 17 | #define S5P_VA_CMU S3C_ADDR(0x02100000) |
18 | #define S5P_VA_SYSTIMER S3C_ADDR(0x01200000) | 18 | #define S5P_VA_GPIO S3C_ADDR(0x02200000) |
19 | #define S5P_VA_SROMC S3C_ADDR(0x01100000) | 19 | #define S5P_VA_GPIO1 S5P_VA_GPIO |
20 | #define S5P_VA_SYSRAM S3C_ADDR(0x01180000) | 20 | #define S5P_VA_GPIO2 S3C_ADDR(0x02240000) |
21 | 21 | #define S5P_VA_GPIO3 S3C_ADDR(0x02280000) | |
22 | #define S5P_VA_COMBINER_BASE S3C_ADDR(0x00600000) | 22 | |
23 | #define S5P_VA_SYSRAM S3C_ADDR(0x02400000) | ||
24 | #define S5P_VA_DMC0 S3C_ADDR(0x02440000) | ||
25 | #define S5P_VA_DMC1 S3C_ADDR(0x02480000) | ||
26 | #define S5P_VA_SROMC S3C_ADDR(0x024C0000) | ||
27 | |||
28 | #define S5P_VA_SYSTIMER S3C_ADDR(0x02500000) | ||
29 | #define S5P_VA_L2CC S3C_ADDR(0x02600000) | ||
30 | |||
31 | #define S5P_VA_COMBINER_BASE S3C_ADDR(0x02700000) | ||
23 | #define S5P_VA_COMBINER(x) (S5P_VA_COMBINER_BASE + ((x) >> 2) * 0x10) | 32 | #define S5P_VA_COMBINER(x) (S5P_VA_COMBINER_BASE + ((x) >> 2) * 0x10) |
24 | 33 | ||
25 | #define S5P_VA_COREPERI_BASE S3C_ADDR(0x00800000) | 34 | #define S5P_VA_COREPERI_BASE S3C_ADDR(0x02800000) |
26 | #define S5P_VA_COREPERI(x) (S5P_VA_COREPERI_BASE + (x)) | 35 | #define S5P_VA_COREPERI(x) (S5P_VA_COREPERI_BASE + (x)) |
27 | #define S5P_VA_SCU S5P_VA_COREPERI(0x0) | 36 | #define S5P_VA_SCU S5P_VA_COREPERI(0x0) |
28 | #define S5P_VA_GIC_CPU S5P_VA_COREPERI(0x100) | 37 | #define S5P_VA_GIC_CPU S5P_VA_COREPERI(0x100) |
29 | #define S5P_VA_TWD S5P_VA_COREPERI(0x600) | 38 | #define S5P_VA_TWD S5P_VA_COREPERI(0x600) |
30 | #define S5P_VA_GIC_DIST S5P_VA_COREPERI(0x1000) | 39 | #define S5P_VA_GIC_DIST S5P_VA_COREPERI(0x1000) |
31 | 40 | ||
32 | #define S5P_VA_L2CC S3C_ADDR(0x00900000) | 41 | #define S3C_VA_USB_HSPHY S3C_ADDR(0x02900000) |
33 | #define S5P_VA_CMU S3C_ADDR(0x00920000) | 42 | |
43 | #define VA_VIC(x) (S3C_VA_IRQ + ((x) * 0x10000)) | ||
44 | #define VA_VIC0 VA_VIC(0) | ||
45 | #define VA_VIC1 VA_VIC(1) | ||
46 | #define VA_VIC2 VA_VIC(2) | ||
47 | #define VA_VIC3 VA_VIC(3) | ||
34 | 48 | ||
35 | #define S5P_VA_UART(x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET)) | 49 | #define S5P_VA_UART(x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET)) |
36 | #define S5P_VA_UART0 S5P_VA_UART(0) | 50 | #define S5P_VA_UART0 S5P_VA_UART(0) |
@@ -42,10 +56,4 @@ | |||
42 | #define S3C_UART_OFFSET (0x400) | 56 | #define S3C_UART_OFFSET (0x400) |
43 | #endif | 57 | #endif |
44 | 58 | ||
45 | #define VA_VIC(x) (S3C_VA_IRQ + ((x) * 0x10000)) | ||
46 | #define VA_VIC0 VA_VIC(0) | ||
47 | #define VA_VIC1 VA_VIC(1) | ||
48 | #define VA_VIC2 VA_VIC(2) | ||
49 | #define VA_VIC3 VA_VIC(3) | ||
50 | |||
51 | #endif /* __ASM_PLAT_MAP_S5P_H */ | 59 | #endif /* __ASM_PLAT_MAP_S5P_H */ |
diff --git a/arch/arm/plat-s5p/include/plat/s5p-clock.h b/arch/arm/plat-s5p/include/plat/s5p-clock.h index 17036c898409..2b6dcff8ab2b 100644 --- a/arch/arm/plat-s5p/include/plat/s5p-clock.h +++ b/arch/arm/plat-s5p/include/plat/s5p-clock.h | |||
@@ -43,4 +43,8 @@ extern struct clksrc_sources clk_src_dpll; | |||
43 | 43 | ||
44 | extern int s5p_gatectrl(void __iomem *reg, struct clk *clk, int enable); | 44 | extern int s5p_gatectrl(void __iomem *reg, struct clk *clk, int enable); |
45 | 45 | ||
46 | /* Common EPLL operations for S5P platform */ | ||
47 | extern int s5p_epll_enable(struct clk *clk, int enable); | ||
48 | extern unsigned long s5p_epll_get_rate(struct clk *clk); | ||
49 | |||
46 | #endif /* __ASM_PLAT_S5P_CLOCK_H */ | 50 | #endif /* __ASM_PLAT_S5P_CLOCK_H */ |
diff --git a/arch/arm/plat-s5p/irq-eint.c b/arch/arm/plat-s5p/irq-eint.c index f36cd3327025..752f1a645f9d 100644 --- a/arch/arm/plat-s5p/irq-eint.c +++ b/arch/arm/plat-s5p/irq-eint.c | |||
@@ -67,23 +67,23 @@ static int s5p_irq_eint_set_type(unsigned int irq, unsigned int type) | |||
67 | 67 | ||
68 | switch (type) { | 68 | switch (type) { |
69 | case IRQ_TYPE_EDGE_RISING: | 69 | case IRQ_TYPE_EDGE_RISING: |
70 | newvalue = S5P_EXTINT_RISEEDGE; | 70 | newvalue = S5P_IRQ_TYPE_EDGE_RISING; |
71 | break; | 71 | break; |
72 | 72 | ||
73 | case IRQ_TYPE_EDGE_FALLING: | 73 | case IRQ_TYPE_EDGE_FALLING: |
74 | newvalue = S5P_EXTINT_FALLEDGE; | 74 | newvalue = S5P_IRQ_TYPE_EDGE_FALLING; |
75 | break; | 75 | break; |
76 | 76 | ||
77 | case IRQ_TYPE_EDGE_BOTH: | 77 | case IRQ_TYPE_EDGE_BOTH: |
78 | newvalue = S5P_EXTINT_BOTHEDGE; | 78 | newvalue = S5P_IRQ_TYPE_EDGE_BOTH; |
79 | break; | 79 | break; |
80 | 80 | ||
81 | case IRQ_TYPE_LEVEL_LOW: | 81 | case IRQ_TYPE_LEVEL_LOW: |
82 | newvalue = S5P_EXTINT_LOWLEV; | 82 | newvalue = S5P_IRQ_TYPE_LEVEL_LOW; |
83 | break; | 83 | break; |
84 | 84 | ||
85 | case IRQ_TYPE_LEVEL_HIGH: | 85 | case IRQ_TYPE_LEVEL_HIGH: |
86 | newvalue = S5P_EXTINT_HILEV; | 86 | newvalue = S5P_IRQ_TYPE_LEVEL_HIGH; |
87 | break; | 87 | break; |
88 | 88 | ||
89 | default: | 89 | default: |
diff --git a/arch/arm/plat-s5p/irq-gpioint.c b/arch/arm/plat-s5p/irq-gpioint.c new file mode 100644 index 000000000000..0e5dc8cbf5e3 --- /dev/null +++ b/arch/arm/plat-s5p/irq-gpioint.c | |||
@@ -0,0 +1,237 @@ | |||
1 | /* linux/arch/arm/plat-s5p/irq-gpioint.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * Author: Kyungmin Park <kyungmin.park@samsung.com> | ||
5 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
6 | * Author: Marek Szyprowski <m.szyprowski@samsung.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | * | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/interrupt.h> | ||
17 | #include <linux/irq.h> | ||
18 | #include <linux/io.h> | ||
19 | #include <linux/gpio.h> | ||
20 | |||
21 | #include <mach/map.h> | ||
22 | #include <plat/gpio-core.h> | ||
23 | #include <plat/gpio-cfg.h> | ||
24 | |||
25 | #define S5P_GPIOREG(x) (S5P_VA_GPIO + (x)) | ||
26 | |||
27 | #define GPIOINT_CON_OFFSET 0x700 | ||
28 | #define GPIOINT_MASK_OFFSET 0x900 | ||
29 | #define GPIOINT_PEND_OFFSET 0xA00 | ||
30 | |||
31 | static struct s3c_gpio_chip *irq_chips[S5P_GPIOINT_GROUP_MAXNR]; | ||
32 | |||
33 | static int s5p_gpioint_get_group(unsigned int irq) | ||
34 | { | ||
35 | struct gpio_chip *chip = get_irq_data(irq); | ||
36 | struct s3c_gpio_chip *s3c_chip = container_of(chip, | ||
37 | struct s3c_gpio_chip, chip); | ||
38 | int group; | ||
39 | |||
40 | for (group = 0; group < S5P_GPIOINT_GROUP_MAXNR; group++) | ||
41 | if (s3c_chip == irq_chips[group]) | ||
42 | break; | ||
43 | |||
44 | return group; | ||
45 | } | ||
46 | |||
47 | static int s5p_gpioint_get_offset(unsigned int irq) | ||
48 | { | ||
49 | struct gpio_chip *chip = get_irq_data(irq); | ||
50 | struct s3c_gpio_chip *s3c_chip = container_of(chip, | ||
51 | struct s3c_gpio_chip, chip); | ||
52 | |||
53 | return irq - s3c_chip->irq_base; | ||
54 | } | ||
55 | |||
56 | static void s5p_gpioint_ack(unsigned int irq) | ||
57 | { | ||
58 | int group, offset, pend_offset; | ||
59 | unsigned int value; | ||
60 | |||
61 | group = s5p_gpioint_get_group(irq); | ||
62 | offset = s5p_gpioint_get_offset(irq); | ||
63 | pend_offset = group << 2; | ||
64 | |||
65 | value = __raw_readl(S5P_GPIOREG(GPIOINT_PEND_OFFSET) + pend_offset); | ||
66 | value |= 1 << offset; | ||
67 | __raw_writel(value, S5P_GPIOREG(GPIOINT_PEND_OFFSET) + pend_offset); | ||
68 | } | ||
69 | |||
70 | static void s5p_gpioint_mask(unsigned int irq) | ||
71 | { | ||
72 | int group, offset, mask_offset; | ||
73 | unsigned int value; | ||
74 | |||
75 | group = s5p_gpioint_get_group(irq); | ||
76 | offset = s5p_gpioint_get_offset(irq); | ||
77 | mask_offset = group << 2; | ||
78 | |||
79 | value = __raw_readl(S5P_GPIOREG(GPIOINT_MASK_OFFSET) + mask_offset); | ||
80 | value |= 1 << offset; | ||
81 | __raw_writel(value, S5P_GPIOREG(GPIOINT_MASK_OFFSET) + mask_offset); | ||
82 | } | ||
83 | |||
84 | static void s5p_gpioint_unmask(unsigned int irq) | ||
85 | { | ||
86 | int group, offset, mask_offset; | ||
87 | unsigned int value; | ||
88 | |||
89 | group = s5p_gpioint_get_group(irq); | ||
90 | offset = s5p_gpioint_get_offset(irq); | ||
91 | mask_offset = group << 2; | ||
92 | |||
93 | value = __raw_readl(S5P_GPIOREG(GPIOINT_MASK_OFFSET) + mask_offset); | ||
94 | value &= ~(1 << offset); | ||
95 | __raw_writel(value, S5P_GPIOREG(GPIOINT_MASK_OFFSET) + mask_offset); | ||
96 | } | ||
97 | |||
98 | static void s5p_gpioint_mask_ack(unsigned int irq) | ||
99 | { | ||
100 | s5p_gpioint_mask(irq); | ||
101 | s5p_gpioint_ack(irq); | ||
102 | } | ||
103 | |||
104 | static int s5p_gpioint_set_type(unsigned int irq, unsigned int type) | ||
105 | { | ||
106 | int group, offset, con_offset; | ||
107 | unsigned int value; | ||
108 | |||
109 | group = s5p_gpioint_get_group(irq); | ||
110 | offset = s5p_gpioint_get_offset(irq); | ||
111 | con_offset = group << 2; | ||
112 | |||
113 | switch (type) { | ||
114 | case IRQ_TYPE_EDGE_RISING: | ||
115 | type = S5P_IRQ_TYPE_EDGE_RISING; | ||
116 | break; | ||
117 | case IRQ_TYPE_EDGE_FALLING: | ||
118 | type = S5P_IRQ_TYPE_EDGE_FALLING; | ||
119 | break; | ||
120 | case IRQ_TYPE_EDGE_BOTH: | ||
121 | type = S5P_IRQ_TYPE_EDGE_BOTH; | ||
122 | break; | ||
123 | case IRQ_TYPE_LEVEL_HIGH: | ||
124 | type = S5P_IRQ_TYPE_LEVEL_HIGH; | ||
125 | break; | ||
126 | case IRQ_TYPE_LEVEL_LOW: | ||
127 | type = S5P_IRQ_TYPE_LEVEL_LOW; | ||
128 | break; | ||
129 | case IRQ_TYPE_NONE: | ||
130 | default: | ||
131 | printk(KERN_WARNING "No irq type\n"); | ||
132 | return -EINVAL; | ||
133 | } | ||
134 | |||
135 | value = __raw_readl(S5P_GPIOREG(GPIOINT_CON_OFFSET) + con_offset); | ||
136 | value &= ~(0x7 << (offset * 0x4)); | ||
137 | value |= (type << (offset * 0x4)); | ||
138 | __raw_writel(value, S5P_GPIOREG(GPIOINT_CON_OFFSET) + con_offset); | ||
139 | |||
140 | return 0; | ||
141 | } | ||
142 | |||
143 | struct irq_chip s5p_gpioint = { | ||
144 | .name = "s5p_gpioint", | ||
145 | .ack = s5p_gpioint_ack, | ||
146 | .mask = s5p_gpioint_mask, | ||
147 | .mask_ack = s5p_gpioint_mask_ack, | ||
148 | .unmask = s5p_gpioint_unmask, | ||
149 | .set_type = s5p_gpioint_set_type, | ||
150 | }; | ||
151 | |||
152 | static void s5p_gpioint_handler(unsigned int irq, struct irq_desc *desc) | ||
153 | { | ||
154 | int group, offset, pend_offset, mask_offset; | ||
155 | int real_irq; | ||
156 | unsigned int pend, mask; | ||
157 | |||
158 | for (group = 0; group < S5P_GPIOINT_GROUP_MAXNR; group++) { | ||
159 | pend_offset = group << 2; | ||
160 | pend = __raw_readl(S5P_GPIOREG(GPIOINT_PEND_OFFSET) + | ||
161 | pend_offset); | ||
162 | if (!pend) | ||
163 | continue; | ||
164 | |||
165 | mask_offset = group << 2; | ||
166 | mask = __raw_readl(S5P_GPIOREG(GPIOINT_MASK_OFFSET) + | ||
167 | mask_offset); | ||
168 | pend &= ~mask; | ||
169 | |||
170 | for (offset = 0; offset < 8; offset++) { | ||
171 | if (pend & (1 << offset)) { | ||
172 | struct s3c_gpio_chip *chip = irq_chips[group]; | ||
173 | if (chip) { | ||
174 | real_irq = chip->irq_base + offset; | ||
175 | generic_handle_irq(real_irq); | ||
176 | } | ||
177 | } | ||
178 | } | ||
179 | } | ||
180 | } | ||
181 | |||
182 | static __init int s5p_gpioint_add(struct s3c_gpio_chip *chip) | ||
183 | { | ||
184 | static int used_gpioint_groups = 0; | ||
185 | static bool handler_registered = 0; | ||
186 | int irq, group = chip->group; | ||
187 | int i; | ||
188 | |||
189 | if (used_gpioint_groups >= S5P_GPIOINT_GROUP_COUNT) | ||
190 | return -ENOMEM; | ||
191 | |||
192 | chip->irq_base = S5P_GPIOINT_BASE + | ||
193 | used_gpioint_groups * S5P_GPIOINT_GROUP_SIZE; | ||
194 | used_gpioint_groups++; | ||
195 | |||
196 | if (!handler_registered) { | ||
197 | set_irq_chained_handler(IRQ_GPIOINT, s5p_gpioint_handler); | ||
198 | handler_registered = 1; | ||
199 | } | ||
200 | |||
201 | irq_chips[group] = chip; | ||
202 | for (i = 0; i < chip->chip.ngpio; i++) { | ||
203 | irq = chip->irq_base + i; | ||
204 | set_irq_chip(irq, &s5p_gpioint); | ||
205 | set_irq_data(irq, &chip->chip); | ||
206 | set_irq_handler(irq, handle_level_irq); | ||
207 | set_irq_flags(irq, IRQF_VALID); | ||
208 | } | ||
209 | return 0; | ||
210 | } | ||
211 | |||
212 | int __init s5p_register_gpio_interrupt(int pin) | ||
213 | { | ||
214 | struct s3c_gpio_chip *my_chip = s3c_gpiolib_getchip(pin); | ||
215 | int offset, group; | ||
216 | int ret; | ||
217 | |||
218 | if (!my_chip) | ||
219 | return -EINVAL; | ||
220 | |||
221 | offset = pin - my_chip->chip.base; | ||
222 | group = my_chip->group; | ||
223 | |||
224 | /* check if the group has been already registered */ | ||
225 | if (my_chip->irq_base) | ||
226 | return my_chip->irq_base + offset; | ||
227 | |||
228 | /* register gpio group */ | ||
229 | ret = s5p_gpioint_add(my_chip); | ||
230 | if (ret == 0) { | ||
231 | my_chip->chip.to_irq = samsung_gpiolib_to_irq; | ||
232 | printk(KERN_INFO "Registered interrupt support for gpio group %d.\n", | ||
233 | group); | ||
234 | return my_chip->irq_base + offset; | ||
235 | } | ||
236 | return ret; | ||
237 | } | ||
diff --git a/arch/arm/plat-s5p/irq-pm.c b/arch/arm/plat-s5p/irq-pm.c new file mode 100644 index 000000000000..dc33b9ecda45 --- /dev/null +++ b/arch/arm/plat-s5p/irq-pm.c | |||
@@ -0,0 +1,93 @@ | |||
1 | /* linux/arch/arm/plat-s5p/irq-pm.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * Based on arch/arm/plat-s3c24xx/irq-pm.c, | ||
7 | * Copyright (c) 2003,2004 Simtec Electronics | ||
8 | * Ben Dooks <ben@simtec.co.uk> | ||
9 | * http://armlinux.simtec.co.uk/ | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License version 2 as | ||
13 | * published by the Free Software Foundation. | ||
14 | */ | ||
15 | |||
16 | #include <linux/init.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/interrupt.h> | ||
19 | #include <linux/sysdev.h> | ||
20 | |||
21 | #include <plat/cpu.h> | ||
22 | #include <plat/irqs.h> | ||
23 | #include <plat/pm.h> | ||
24 | #include <mach/map.h> | ||
25 | |||
26 | #include <mach/regs-gpio.h> | ||
27 | #include <mach/regs-irq.h> | ||
28 | |||
29 | /* state for IRQs over sleep */ | ||
30 | |||
31 | /* default is to allow for EINT0..EINT31, and IRQ_RTC_TIC, IRQ_RTC_ALARM, | ||
32 | * as wakeup sources | ||
33 | * | ||
34 | * set bit to 1 in allow bitfield to enable the wakeup settings on it | ||
35 | */ | ||
36 | |||
37 | unsigned long s3c_irqwake_intallow = 0x00000006L; | ||
38 | unsigned long s3c_irqwake_eintallow = 0xffffffffL; | ||
39 | |||
40 | int s3c_irq_wake(unsigned int irqno, unsigned int state) | ||
41 | { | ||
42 | unsigned long irqbit; | ||
43 | |||
44 | switch (irqno) { | ||
45 | case IRQ_RTC_TIC: | ||
46 | case IRQ_RTC_ALARM: | ||
47 | irqbit = 1 << (irqno + 1 - IRQ_RTC_ALARM); | ||
48 | if (!state) | ||
49 | s3c_irqwake_intmask |= irqbit; | ||
50 | else | ||
51 | s3c_irqwake_intmask &= ~irqbit; | ||
52 | break; | ||
53 | default: | ||
54 | return -ENOENT; | ||
55 | } | ||
56 | return 0; | ||
57 | } | ||
58 | |||
59 | static struct sleep_save eint_save[] = { | ||
60 | SAVE_ITEM(S5P_EINT_CON(0)), | ||
61 | SAVE_ITEM(S5P_EINT_CON(1)), | ||
62 | SAVE_ITEM(S5P_EINT_CON(2)), | ||
63 | SAVE_ITEM(S5P_EINT_CON(3)), | ||
64 | |||
65 | SAVE_ITEM(S5P_EINT_FLTCON(0)), | ||
66 | SAVE_ITEM(S5P_EINT_FLTCON(1)), | ||
67 | SAVE_ITEM(S5P_EINT_FLTCON(2)), | ||
68 | SAVE_ITEM(S5P_EINT_FLTCON(3)), | ||
69 | SAVE_ITEM(S5P_EINT_FLTCON(4)), | ||
70 | SAVE_ITEM(S5P_EINT_FLTCON(5)), | ||
71 | SAVE_ITEM(S5P_EINT_FLTCON(6)), | ||
72 | SAVE_ITEM(S5P_EINT_FLTCON(7)), | ||
73 | |||
74 | SAVE_ITEM(S5P_EINT_MASK(0)), | ||
75 | SAVE_ITEM(S5P_EINT_MASK(1)), | ||
76 | SAVE_ITEM(S5P_EINT_MASK(2)), | ||
77 | SAVE_ITEM(S5P_EINT_MASK(3)), | ||
78 | }; | ||
79 | |||
80 | int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state) | ||
81 | { | ||
82 | s3c_pm_do_save(eint_save, ARRAY_SIZE(eint_save)); | ||
83 | |||
84 | return 0; | ||
85 | } | ||
86 | |||
87 | int s3c24xx_irq_resume(struct sys_device *dev) | ||
88 | { | ||
89 | s3c_pm_do_restore(eint_save, ARRAY_SIZE(eint_save)); | ||
90 | |||
91 | return 0; | ||
92 | } | ||
93 | |||
diff --git a/arch/arm/plat-s5p/pm.c b/arch/arm/plat-s5p/pm.c new file mode 100644 index 000000000000..d592b6304b48 --- /dev/null +++ b/arch/arm/plat-s5p/pm.c | |||
@@ -0,0 +1,52 @@ | |||
1 | /* linux/arch/arm/plat-s5p/pm.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * S5P Power Manager (Suspend-To-RAM) support | ||
7 | * | ||
8 | * Based on arch/arm/plat-s3c24xx/pm.c | ||
9 | * Copyright (c) 2004,2006 Simtec Electronics | ||
10 | * Ben Dooks <ben@simtec.co.uk> | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License version 2 as | ||
14 | * published by the Free Software Foundation. | ||
15 | */ | ||
16 | |||
17 | #include <linux/suspend.h> | ||
18 | #include <plat/pm.h> | ||
19 | |||
20 | #define PFX "s5p pm: " | ||
21 | |||
22 | /* s3c_pm_check_resume_pin | ||
23 | * | ||
24 | * check to see if the pin is configured correctly for sleep mode, and | ||
25 | * make any necessary adjustments if it is not | ||
26 | */ | ||
27 | |||
28 | static void s3c_pm_check_resume_pin(unsigned int pin, unsigned int irqoffs) | ||
29 | { | ||
30 | /* nothing here yet */ | ||
31 | } | ||
32 | |||
33 | /* s3c_pm_configure_extint | ||
34 | * | ||
35 | * configure all external interrupt pins | ||
36 | */ | ||
37 | |||
38 | void s3c_pm_configure_extint(void) | ||
39 | { | ||
40 | /* nothing here yet */ | ||
41 | } | ||
42 | |||
43 | void s3c_pm_restore_core(void) | ||
44 | { | ||
45 | /* nothing here yet */ | ||
46 | } | ||
47 | |||
48 | void s3c_pm_save_core(void) | ||
49 | { | ||
50 | /* nothing here yet */ | ||
51 | } | ||
52 | |||
diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig index 7c0bde781167..dcd6eff4ee53 100644 --- a/arch/arm/plat-samsung/Kconfig +++ b/arch/arm/plat-samsung/Kconfig | |||
@@ -180,6 +180,31 @@ config S3C_DEV_I2C2 | |||
180 | help | 180 | help |
181 | Compile in platform device definitions for I2C channel 2 | 181 | Compile in platform device definitions for I2C channel 2 |
182 | 182 | ||
183 | config S3C_DEV_I2C3 | ||
184 | bool | ||
185 | help | ||
186 | Compile in platform device definition for I2C controller 3 | ||
187 | |||
188 | config S3C_DEV_I2C4 | ||
189 | bool | ||
190 | help | ||
191 | Compile in platform device definition for I2C controller 4 | ||
192 | |||
193 | config S3C_DEV_I2C5 | ||
194 | bool | ||
195 | help | ||
196 | Compile in platform device definition for I2C controller 5 | ||
197 | |||
198 | config S3C_DEV_I2C6 | ||
199 | bool | ||
200 | help | ||
201 | Compile in platform device definition for I2C controller 6 | ||
202 | |||
203 | config S3C_DEV_I2C7 | ||
204 | bool | ||
205 | help | ||
206 | Compile in platform device definition for I2C controller 7 | ||
207 | |||
183 | config S3C_DEV_FB | 208 | config S3C_DEV_FB |
184 | bool | 209 | bool |
185 | help | 210 | help |
diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-samsung/Makefile index 4d8ff923207a..afcce474af8e 100644 --- a/arch/arm/plat-samsung/Makefile +++ b/arch/arm/plat-samsung/Makefile | |||
@@ -40,6 +40,11 @@ obj-$(CONFIG_S3C_DEV_HWMON) += dev-hwmon.o | |||
40 | obj-y += dev-i2c0.o | 40 | obj-y += dev-i2c0.o |
41 | obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o | 41 | obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o |
42 | obj-$(CONFIG_S3C_DEV_I2C2) += dev-i2c2.o | 42 | obj-$(CONFIG_S3C_DEV_I2C2) += dev-i2c2.o |
43 | obj-$(CONFIG_S3C_DEV_I2C3) += dev-i2c3.o | ||
44 | obj-$(CONFIG_S3C_DEV_I2C4) += dev-i2c4.o | ||
45 | obj-$(CONFIG_S3C_DEV_I2C5) += dev-i2c5.o | ||
46 | obj-$(CONFIG_S3C_DEV_I2C6) += dev-i2c6.o | ||
47 | obj-$(CONFIG_S3C_DEV_I2C7) += dev-i2c7.o | ||
43 | obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o | 48 | obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o |
44 | obj-y += dev-uart.o | 49 | obj-y += dev-uart.o |
45 | obj-$(CONFIG_S3C_DEV_USB_HOST) += dev-usb.o | 50 | obj-$(CONFIG_S3C_DEV_USB_HOST) += dev-usb.o |
diff --git a/arch/arm/plat-samsung/dev-hsmmc.c b/arch/arm/plat-samsung/dev-hsmmc.c index 9d2be0941410..db7a65c7f127 100644 --- a/arch/arm/plat-samsung/dev-hsmmc.c +++ b/arch/arm/plat-samsung/dev-hsmmc.c | |||
@@ -41,6 +41,7 @@ struct s3c_sdhci_platdata s3c_hsmmc0_def_platdata = { | |||
41 | .max_width = 4, | 41 | .max_width = 4, |
42 | .host_caps = (MMC_CAP_4_BIT_DATA | | 42 | .host_caps = (MMC_CAP_4_BIT_DATA | |
43 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), | 43 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), |
44 | .clk_type = S3C_SDHCI_CLK_DIV_INTERNAL, | ||
44 | }; | 45 | }; |
45 | 46 | ||
46 | struct platform_device s3c_device_hsmmc0 = { | 47 | struct platform_device s3c_device_hsmmc0 = { |
@@ -59,17 +60,20 @@ void s3c_sdhci0_set_platdata(struct s3c_sdhci_platdata *pd) | |||
59 | { | 60 | { |
60 | struct s3c_sdhci_platdata *set = &s3c_hsmmc0_def_platdata; | 61 | struct s3c_sdhci_platdata *set = &s3c_hsmmc0_def_platdata; |
61 | 62 | ||
62 | set->max_width = pd->max_width; | ||
63 | set->cd_type = pd->cd_type; | 63 | set->cd_type = pd->cd_type; |
64 | set->ext_cd_init = pd->ext_cd_init; | 64 | set->ext_cd_init = pd->ext_cd_init; |
65 | set->ext_cd_cleanup = pd->ext_cd_cleanup; | 65 | set->ext_cd_cleanup = pd->ext_cd_cleanup; |
66 | set->ext_cd_gpio = pd->ext_cd_gpio; | 66 | set->ext_cd_gpio = pd->ext_cd_gpio; |
67 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; | 67 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; |
68 | 68 | ||
69 | if (pd->max_width) | ||
70 | set->max_width = pd->max_width; | ||
69 | if (pd->cfg_gpio) | 71 | if (pd->cfg_gpio) |
70 | set->cfg_gpio = pd->cfg_gpio; | 72 | set->cfg_gpio = pd->cfg_gpio; |
71 | if (pd->cfg_card) | 73 | if (pd->cfg_card) |
72 | set->cfg_card = pd->cfg_card; | 74 | set->cfg_card = pd->cfg_card; |
73 | if (pd->host_caps) | 75 | if (pd->host_caps) |
74 | set->host_caps = pd->host_caps; | 76 | set->host_caps |= pd->host_caps; |
77 | if (pd->clk_type) | ||
78 | set->clk_type = pd->clk_type; | ||
75 | } | 79 | } |
diff --git a/arch/arm/plat-samsung/dev-hsmmc1.c b/arch/arm/plat-samsung/dev-hsmmc1.c index a6c8295840af..2497321f08d7 100644 --- a/arch/arm/plat-samsung/dev-hsmmc1.c +++ b/arch/arm/plat-samsung/dev-hsmmc1.c | |||
@@ -41,6 +41,7 @@ struct s3c_sdhci_platdata s3c_hsmmc1_def_platdata = { | |||
41 | .max_width = 4, | 41 | .max_width = 4, |
42 | .host_caps = (MMC_CAP_4_BIT_DATA | | 42 | .host_caps = (MMC_CAP_4_BIT_DATA | |
43 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), | 43 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), |
44 | .clk_type = S3C_SDHCI_CLK_DIV_INTERNAL, | ||
44 | }; | 45 | }; |
45 | 46 | ||
46 | struct platform_device s3c_device_hsmmc1 = { | 47 | struct platform_device s3c_device_hsmmc1 = { |
@@ -59,17 +60,20 @@ void s3c_sdhci1_set_platdata(struct s3c_sdhci_platdata *pd) | |||
59 | { | 60 | { |
60 | struct s3c_sdhci_platdata *set = &s3c_hsmmc1_def_platdata; | 61 | struct s3c_sdhci_platdata *set = &s3c_hsmmc1_def_platdata; |
61 | 62 | ||
62 | set->max_width = pd->max_width; | ||
63 | set->cd_type = pd->cd_type; | 63 | set->cd_type = pd->cd_type; |
64 | set->ext_cd_init = pd->ext_cd_init; | 64 | set->ext_cd_init = pd->ext_cd_init; |
65 | set->ext_cd_cleanup = pd->ext_cd_cleanup; | 65 | set->ext_cd_cleanup = pd->ext_cd_cleanup; |
66 | set->ext_cd_gpio = pd->ext_cd_gpio; | 66 | set->ext_cd_gpio = pd->ext_cd_gpio; |
67 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; | 67 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; |
68 | 68 | ||
69 | if (pd->max_width) | ||
70 | set->max_width = pd->max_width; | ||
69 | if (pd->cfg_gpio) | 71 | if (pd->cfg_gpio) |
70 | set->cfg_gpio = pd->cfg_gpio; | 72 | set->cfg_gpio = pd->cfg_gpio; |
71 | if (pd->cfg_card) | 73 | if (pd->cfg_card) |
72 | set->cfg_card = pd->cfg_card; | 74 | set->cfg_card = pd->cfg_card; |
73 | if (pd->host_caps) | 75 | if (pd->host_caps) |
74 | set->host_caps = pd->host_caps; | 76 | set->host_caps |= pd->host_caps; |
77 | if (pd->clk_type) | ||
78 | set->clk_type = pd->clk_type; | ||
75 | } | 79 | } |
diff --git a/arch/arm/plat-samsung/dev-hsmmc2.c b/arch/arm/plat-samsung/dev-hsmmc2.c index cb0d7143381a..f60aedba417c 100644 --- a/arch/arm/plat-samsung/dev-hsmmc2.c +++ b/arch/arm/plat-samsung/dev-hsmmc2.c | |||
@@ -42,6 +42,7 @@ struct s3c_sdhci_platdata s3c_hsmmc2_def_platdata = { | |||
42 | .max_width = 4, | 42 | .max_width = 4, |
43 | .host_caps = (MMC_CAP_4_BIT_DATA | | 43 | .host_caps = (MMC_CAP_4_BIT_DATA | |
44 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), | 44 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), |
45 | .clk_type = S3C_SDHCI_CLK_DIV_INTERNAL, | ||
45 | }; | 46 | }; |
46 | 47 | ||
47 | struct platform_device s3c_device_hsmmc2 = { | 48 | struct platform_device s3c_device_hsmmc2 = { |
@@ -60,17 +61,20 @@ void s3c_sdhci2_set_platdata(struct s3c_sdhci_platdata *pd) | |||
60 | { | 61 | { |
61 | struct s3c_sdhci_platdata *set = &s3c_hsmmc2_def_platdata; | 62 | struct s3c_sdhci_platdata *set = &s3c_hsmmc2_def_platdata; |
62 | 63 | ||
63 | set->max_width = pd->max_width; | ||
64 | set->cd_type = pd->cd_type; | 64 | set->cd_type = pd->cd_type; |
65 | set->ext_cd_init = pd->ext_cd_init; | 65 | set->ext_cd_init = pd->ext_cd_init; |
66 | set->ext_cd_cleanup = pd->ext_cd_cleanup; | 66 | set->ext_cd_cleanup = pd->ext_cd_cleanup; |
67 | set->ext_cd_gpio = pd->ext_cd_gpio; | 67 | set->ext_cd_gpio = pd->ext_cd_gpio; |
68 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; | 68 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; |
69 | 69 | ||
70 | if (pd->max_width) | ||
71 | set->max_width = pd->max_width; | ||
70 | if (pd->cfg_gpio) | 72 | if (pd->cfg_gpio) |
71 | set->cfg_gpio = pd->cfg_gpio; | 73 | set->cfg_gpio = pd->cfg_gpio; |
72 | if (pd->cfg_card) | 74 | if (pd->cfg_card) |
73 | set->cfg_card = pd->cfg_card; | 75 | set->cfg_card = pd->cfg_card; |
74 | if (pd->host_caps) | 76 | if (pd->host_caps) |
75 | set->host_caps = pd->host_caps; | 77 | set->host_caps |= pd->host_caps; |
78 | if (pd->clk_type) | ||
79 | set->clk_type = pd->clk_type; | ||
76 | } | 80 | } |
diff --git a/arch/arm/plat-samsung/dev-hsmmc3.c b/arch/arm/plat-samsung/dev-hsmmc3.c index 85aaf0f2842f..ede776f20e62 100644 --- a/arch/arm/plat-samsung/dev-hsmmc3.c +++ b/arch/arm/plat-samsung/dev-hsmmc3.c | |||
@@ -33,8 +33,8 @@ static struct resource s3c_hsmmc3_resource[] = { | |||
33 | .flags = IORESOURCE_MEM, | 33 | .flags = IORESOURCE_MEM, |
34 | }, | 34 | }, |
35 | [1] = { | 35 | [1] = { |
36 | .start = IRQ_MMC3, | 36 | .start = IRQ_HSMMC3, |
37 | .end = IRQ_MMC3, | 37 | .end = IRQ_HSMMC3, |
38 | .flags = IORESOURCE_IRQ, | 38 | .flags = IORESOURCE_IRQ, |
39 | } | 39 | } |
40 | }; | 40 | }; |
@@ -45,6 +45,7 @@ struct s3c_sdhci_platdata s3c_hsmmc3_def_platdata = { | |||
45 | .max_width = 4, | 45 | .max_width = 4, |
46 | .host_caps = (MMC_CAP_4_BIT_DATA | | 46 | .host_caps = (MMC_CAP_4_BIT_DATA | |
47 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), | 47 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), |
48 | .clk_type = S3C_SDHCI_CLK_DIV_INTERNAL, | ||
48 | }; | 49 | }; |
49 | 50 | ||
50 | struct platform_device s3c_device_hsmmc3 = { | 51 | struct platform_device s3c_device_hsmmc3 = { |
@@ -63,15 +64,20 @@ void s3c_sdhci3_set_platdata(struct s3c_sdhci_platdata *pd) | |||
63 | { | 64 | { |
64 | struct s3c_sdhci_platdata *set = &s3c_hsmmc3_def_platdata; | 65 | struct s3c_sdhci_platdata *set = &s3c_hsmmc3_def_platdata; |
65 | 66 | ||
66 | set->max_width = pd->max_width; | ||
67 | set->cd_type = pd->cd_type; | 67 | set->cd_type = pd->cd_type; |
68 | set->ext_cd_init = pd->ext_cd_init; | 68 | set->ext_cd_init = pd->ext_cd_init; |
69 | set->ext_cd_cleanup = pd->ext_cd_cleanup; | 69 | set->ext_cd_cleanup = pd->ext_cd_cleanup; |
70 | set->ext_cd_gpio = pd->ext_cd_gpio; | 70 | set->ext_cd_gpio = pd->ext_cd_gpio; |
71 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; | 71 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; |
72 | 72 | ||
73 | if (pd->max_width) | ||
74 | set->max_width = pd->max_width; | ||
73 | if (pd->cfg_gpio) | 75 | if (pd->cfg_gpio) |
74 | set->cfg_gpio = pd->cfg_gpio; | 76 | set->cfg_gpio = pd->cfg_gpio; |
75 | if (pd->cfg_card) | 77 | if (pd->cfg_card) |
76 | set->cfg_card = pd->cfg_card; | 78 | set->cfg_card = pd->cfg_card; |
79 | if (pd->host_caps) | ||
80 | set->host_caps |= pd->host_caps; | ||
81 | if (pd->clk_type) | ||
82 | set->clk_type = pd->clk_type; | ||
77 | } | 83 | } |
diff --git a/arch/arm/plat-samsung/dev-i2c2.c b/arch/arm/plat-samsung/dev-i2c2.c index 07036dee09e7..ff4ba69b6830 100644 --- a/arch/arm/plat-samsung/dev-i2c2.c +++ b/arch/arm/plat-samsung/dev-i2c2.c | |||
@@ -32,8 +32,8 @@ static struct resource s3c_i2c_resource[] = { | |||
32 | .flags = IORESOURCE_MEM, | 32 | .flags = IORESOURCE_MEM, |
33 | }, | 33 | }, |
34 | [1] = { | 34 | [1] = { |
35 | .start = IRQ_CAN0, | 35 | .start = IRQ_IIC2, |
36 | .end = IRQ_CAN0, | 36 | .end = IRQ_IIC2, |
37 | .flags = IORESOURCE_IRQ, | 37 | .flags = IORESOURCE_IRQ, |
38 | }, | 38 | }, |
39 | }; | 39 | }; |
diff --git a/arch/arm/plat-samsung/dev-i2c3.c b/arch/arm/plat-samsung/dev-i2c3.c new file mode 100644 index 000000000000..8586a10014b7 --- /dev/null +++ b/arch/arm/plat-samsung/dev-i2c3.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* linux/arch/arm/plat-samsung/dev-i2c3.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P series device definition for i2c device 3 | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/gfp.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/irqs.h> | ||
19 | #include <mach/map.h> | ||
20 | |||
21 | #include <plat/regs-iic.h> | ||
22 | #include <plat/iic.h> | ||
23 | #include <plat/devs.h> | ||
24 | #include <plat/cpu.h> | ||
25 | |||
26 | static struct resource s3c_i2c_resource[] = { | ||
27 | [0] = { | ||
28 | .start = S3C_PA_IIC3, | ||
29 | .end = S3C_PA_IIC3 + SZ_4K - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | [1] = { | ||
33 | .start = IRQ_IIC3, | ||
34 | .end = IRQ_IIC3, | ||
35 | .flags = IORESOURCE_IRQ, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | struct platform_device s3c_device_i2c3 = { | ||
40 | .name = "s3c2440-i2c", | ||
41 | .id = 3, | ||
42 | .num_resources = ARRAY_SIZE(s3c_i2c_resource), | ||
43 | .resource = s3c_i2c_resource, | ||
44 | }; | ||
45 | |||
46 | static struct s3c2410_platform_i2c default_i2c_data3 __initdata = { | ||
47 | .flags = 0, | ||
48 | .bus_num = 3, | ||
49 | .slave_addr = 0x10, | ||
50 | .frequency = 100*1000, | ||
51 | .sda_delay = 100, | ||
52 | }; | ||
53 | |||
54 | void __init s3c_i2c3_set_platdata(struct s3c2410_platform_i2c *pd) | ||
55 | { | ||
56 | struct s3c2410_platform_i2c *npd; | ||
57 | |||
58 | if (!pd) | ||
59 | pd = &default_i2c_data3; | ||
60 | |||
61 | npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); | ||
62 | if (!npd) | ||
63 | printk(KERN_ERR "%s: no memory for platform data\n", __func__); | ||
64 | else if (!npd->cfg_gpio) | ||
65 | npd->cfg_gpio = s3c_i2c3_cfg_gpio; | ||
66 | |||
67 | s3c_device_i2c3.dev.platform_data = npd; | ||
68 | } | ||
diff --git a/arch/arm/plat-samsung/dev-i2c4.c b/arch/arm/plat-samsung/dev-i2c4.c new file mode 100644 index 000000000000..df2159e2daa6 --- /dev/null +++ b/arch/arm/plat-samsung/dev-i2c4.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* linux/arch/arm/plat-samsung/dev-i2c4.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P series device definition for i2c device 3 | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/gfp.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/irqs.h> | ||
19 | #include <mach/map.h> | ||
20 | |||
21 | #include <plat/regs-iic.h> | ||
22 | #include <plat/iic.h> | ||
23 | #include <plat/devs.h> | ||
24 | #include <plat/cpu.h> | ||
25 | |||
26 | static struct resource s3c_i2c_resource[] = { | ||
27 | [0] = { | ||
28 | .start = S3C_PA_IIC4, | ||
29 | .end = S3C_PA_IIC4 + SZ_4K - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | [1] = { | ||
33 | .start = IRQ_IIC4, | ||
34 | .end = IRQ_IIC4, | ||
35 | .flags = IORESOURCE_IRQ, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | struct platform_device s3c_device_i2c4 = { | ||
40 | .name = "s3c2440-i2c", | ||
41 | .id = 4, | ||
42 | .num_resources = ARRAY_SIZE(s3c_i2c_resource), | ||
43 | .resource = s3c_i2c_resource, | ||
44 | }; | ||
45 | |||
46 | static struct s3c2410_platform_i2c default_i2c_data4 __initdata = { | ||
47 | .flags = 0, | ||
48 | .bus_num = 4, | ||
49 | .slave_addr = 0x10, | ||
50 | .frequency = 100*1000, | ||
51 | .sda_delay = 100, | ||
52 | }; | ||
53 | |||
54 | void __init s3c_i2c4_set_platdata(struct s3c2410_platform_i2c *pd) | ||
55 | { | ||
56 | struct s3c2410_platform_i2c *npd; | ||
57 | |||
58 | if (!pd) | ||
59 | pd = &default_i2c_data4; | ||
60 | |||
61 | npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); | ||
62 | if (!npd) | ||
63 | printk(KERN_ERR "%s: no memory for platform data\n", __func__); | ||
64 | else if (!npd->cfg_gpio) | ||
65 | npd->cfg_gpio = s3c_i2c4_cfg_gpio; | ||
66 | |||
67 | s3c_device_i2c4.dev.platform_data = npd; | ||
68 | } | ||
diff --git a/arch/arm/plat-samsung/dev-i2c5.c b/arch/arm/plat-samsung/dev-i2c5.c new file mode 100644 index 000000000000..0499c2c3877b --- /dev/null +++ b/arch/arm/plat-samsung/dev-i2c5.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* linux/arch/arm/plat-samsung/dev-i2c3.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P series device definition for i2c device 3 | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/gfp.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/irqs.h> | ||
19 | #include <mach/map.h> | ||
20 | |||
21 | #include <plat/regs-iic.h> | ||
22 | #include <plat/iic.h> | ||
23 | #include <plat/devs.h> | ||
24 | #include <plat/cpu.h> | ||
25 | |||
26 | static struct resource s3c_i2c_resource[] = { | ||
27 | [0] = { | ||
28 | .start = S3C_PA_IIC5, | ||
29 | .end = S3C_PA_IIC5 + SZ_4K - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | [1] = { | ||
33 | .start = IRQ_IIC5, | ||
34 | .end = IRQ_IIC5, | ||
35 | .flags = IORESOURCE_IRQ, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | struct platform_device s3c_device_i2c5 = { | ||
40 | .name = "s3c2440-i2c", | ||
41 | .id = 5, | ||
42 | .num_resources = ARRAY_SIZE(s3c_i2c_resource), | ||
43 | .resource = s3c_i2c_resource, | ||
44 | }; | ||
45 | |||
46 | static struct s3c2410_platform_i2c default_i2c_data5 __initdata = { | ||
47 | .flags = 0, | ||
48 | .bus_num = 5, | ||
49 | .slave_addr = 0x10, | ||
50 | .frequency = 100*1000, | ||
51 | .sda_delay = 100, | ||
52 | }; | ||
53 | |||
54 | void __init s3c_i2c5_set_platdata(struct s3c2410_platform_i2c *pd) | ||
55 | { | ||
56 | struct s3c2410_platform_i2c *npd; | ||
57 | |||
58 | if (!pd) | ||
59 | pd = &default_i2c_data5; | ||
60 | |||
61 | npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); | ||
62 | if (!npd) | ||
63 | printk(KERN_ERR "%s: no memory for platform data\n", __func__); | ||
64 | else if (!npd->cfg_gpio) | ||
65 | npd->cfg_gpio = s3c_i2c5_cfg_gpio; | ||
66 | |||
67 | s3c_device_i2c5.dev.platform_data = npd; | ||
68 | } | ||
diff --git a/arch/arm/plat-samsung/dev-i2c6.c b/arch/arm/plat-samsung/dev-i2c6.c new file mode 100644 index 000000000000..4083108908a8 --- /dev/null +++ b/arch/arm/plat-samsung/dev-i2c6.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* linux/arch/arm/plat-samsung/dev-i2c6.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P series device definition for i2c device 6 | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/gfp.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/irqs.h> | ||
19 | #include <mach/map.h> | ||
20 | |||
21 | #include <plat/regs-iic.h> | ||
22 | #include <plat/iic.h> | ||
23 | #include <plat/devs.h> | ||
24 | #include <plat/cpu.h> | ||
25 | |||
26 | static struct resource s3c_i2c_resource[] = { | ||
27 | [0] = { | ||
28 | .start = S3C_PA_IIC6, | ||
29 | .end = S3C_PA_IIC6 + SZ_4K - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | [1] = { | ||
33 | .start = IRQ_IIC6, | ||
34 | .end = IRQ_IIC6, | ||
35 | .flags = IORESOURCE_IRQ, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | struct platform_device s3c_device_i2c6 = { | ||
40 | .name = "s3c2440-i2c", | ||
41 | .id = 6, | ||
42 | .num_resources = ARRAY_SIZE(s3c_i2c_resource), | ||
43 | .resource = s3c_i2c_resource, | ||
44 | }; | ||
45 | |||
46 | static struct s3c2410_platform_i2c default_i2c_data6 __initdata = { | ||
47 | .flags = 0, | ||
48 | .bus_num = 6, | ||
49 | .slave_addr = 0x10, | ||
50 | .frequency = 100*1000, | ||
51 | .sda_delay = 100, | ||
52 | }; | ||
53 | |||
54 | void __init s3c_i2c6_set_platdata(struct s3c2410_platform_i2c *pd) | ||
55 | { | ||
56 | struct s3c2410_platform_i2c *npd; | ||
57 | |||
58 | if (!pd) | ||
59 | pd = &default_i2c_data6; | ||
60 | |||
61 | npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); | ||
62 | if (!npd) | ||
63 | printk(KERN_ERR "%s: no memory for platform data\n", __func__); | ||
64 | else if (!npd->cfg_gpio) | ||
65 | npd->cfg_gpio = s3c_i2c6_cfg_gpio; | ||
66 | |||
67 | s3c_device_i2c6.dev.platform_data = npd; | ||
68 | } | ||
diff --git a/arch/arm/plat-samsung/dev-i2c7.c b/arch/arm/plat-samsung/dev-i2c7.c new file mode 100644 index 000000000000..1182451d7dce --- /dev/null +++ b/arch/arm/plat-samsung/dev-i2c7.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* linux/arch/arm/plat-samsung/dev-i2c7.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P series device definition for i2c device 7 | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/gfp.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/irqs.h> | ||
19 | #include <mach/map.h> | ||
20 | |||
21 | #include <plat/regs-iic.h> | ||
22 | #include <plat/iic.h> | ||
23 | #include <plat/devs.h> | ||
24 | #include <plat/cpu.h> | ||
25 | |||
26 | static struct resource s3c_i2c_resource[] = { | ||
27 | [0] = { | ||
28 | .start = S3C_PA_IIC7, | ||
29 | .end = S3C_PA_IIC7 + SZ_4K - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | [1] = { | ||
33 | .start = IRQ_IIC7, | ||
34 | .end = IRQ_IIC7, | ||
35 | .flags = IORESOURCE_IRQ, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | struct platform_device s3c_device_i2c7 = { | ||
40 | .name = "s3c2440-i2c", | ||
41 | .id = 7, | ||
42 | .num_resources = ARRAY_SIZE(s3c_i2c_resource), | ||
43 | .resource = s3c_i2c_resource, | ||
44 | }; | ||
45 | |||
46 | static struct s3c2410_platform_i2c default_i2c_data7 __initdata = { | ||
47 | .flags = 0, | ||
48 | .bus_num = 7, | ||
49 | .slave_addr = 0x10, | ||
50 | .frequency = 100*1000, | ||
51 | .sda_delay = 100, | ||
52 | }; | ||
53 | |||
54 | void __init s3c_i2c7_set_platdata(struct s3c2410_platform_i2c *pd) | ||
55 | { | ||
56 | struct s3c2410_platform_i2c *npd; | ||
57 | |||
58 | if (!pd) | ||
59 | pd = &default_i2c_data7; | ||
60 | |||
61 | npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); | ||
62 | if (!npd) | ||
63 | printk(KERN_ERR "%s: no memory for platform data\n", __func__); | ||
64 | else if (!npd->cfg_gpio) | ||
65 | npd->cfg_gpio = s3c_i2c7_cfg_gpio; | ||
66 | |||
67 | s3c_device_i2c7.dev.platform_data = npd; | ||
68 | } | ||
diff --git a/arch/arm/plat-samsung/gpio-config.c b/arch/arm/plat-samsung/gpio-config.c index e3d41eaed1ff..b732b773b9af 100644 --- a/arch/arm/plat-samsung/gpio-config.c +++ b/arch/arm/plat-samsung/gpio-config.c | |||
@@ -41,6 +41,37 @@ int s3c_gpio_cfgpin(unsigned int pin, unsigned int config) | |||
41 | } | 41 | } |
42 | EXPORT_SYMBOL(s3c_gpio_cfgpin); | 42 | EXPORT_SYMBOL(s3c_gpio_cfgpin); |
43 | 43 | ||
44 | int s3c_gpio_cfgpin_range(unsigned int start, unsigned int nr, | ||
45 | unsigned int cfg) | ||
46 | { | ||
47 | int ret; | ||
48 | |||
49 | for (; nr > 0; nr--, start++) { | ||
50 | ret = s3c_gpio_cfgpin(start, cfg); | ||
51 | if (ret != 0) | ||
52 | return ret; | ||
53 | } | ||
54 | |||
55 | return 0; | ||
56 | } | ||
57 | EXPORT_SYMBOL_GPL(s3c_gpio_cfgpin_range); | ||
58 | |||
59 | int s3c_gpio_cfgall_range(unsigned int start, unsigned int nr, | ||
60 | unsigned int cfg, s3c_gpio_pull_t pull) | ||
61 | { | ||
62 | int ret; | ||
63 | |||
64 | for (; nr > 0; nr--, start++) { | ||
65 | s3c_gpio_setpull(start, pull); | ||
66 | ret = s3c_gpio_cfgpin(start, cfg); | ||
67 | if (ret != 0) | ||
68 | return ret; | ||
69 | } | ||
70 | |||
71 | return 0; | ||
72 | } | ||
73 | EXPORT_SYMBOL_GPL(s3c_gpio_cfgall_range); | ||
74 | |||
44 | unsigned s3c_gpio_getcfg(unsigned int pin) | 75 | unsigned s3c_gpio_getcfg(unsigned int pin) |
45 | { | 76 | { |
46 | struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin); | 77 | struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin); |
@@ -80,6 +111,25 @@ int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull) | |||
80 | } | 111 | } |
81 | EXPORT_SYMBOL(s3c_gpio_setpull); | 112 | EXPORT_SYMBOL(s3c_gpio_setpull); |
82 | 113 | ||
114 | s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin) | ||
115 | { | ||
116 | struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin); | ||
117 | unsigned long flags; | ||
118 | int offset; | ||
119 | u32 pup = 0; | ||
120 | |||
121 | if (chip) { | ||
122 | offset = pin - chip->chip.base; | ||
123 | |||
124 | s3c_gpio_lock(chip, flags); | ||
125 | pup = s3c_gpio_do_getpull(chip, offset); | ||
126 | s3c_gpio_unlock(chip, flags); | ||
127 | } | ||
128 | |||
129 | return (__force s3c_gpio_pull_t)pup; | ||
130 | } | ||
131 | EXPORT_SYMBOL(s3c_gpio_getpull); | ||
132 | |||
83 | #ifdef CONFIG_S3C_GPIO_CFG_S3C24XX | 133 | #ifdef CONFIG_S3C_GPIO_CFG_S3C24XX |
84 | int s3c_gpio_setcfg_s3c24xx_a(struct s3c_gpio_chip *chip, | 134 | int s3c_gpio_setcfg_s3c24xx_a(struct s3c_gpio_chip *chip, |
85 | unsigned int off, unsigned int cfg) | 135 | unsigned int off, unsigned int cfg) |
diff --git a/arch/arm/plat-samsung/gpio.c b/arch/arm/plat-samsung/gpio.c index b83a83351cea..7743c4b8b2fb 100644 --- a/arch/arm/plat-samsung/gpio.c +++ b/arch/arm/plat-samsung/gpio.c | |||
@@ -157,3 +157,11 @@ __init void s3c_gpiolib_add(struct s3c_gpio_chip *chip) | |||
157 | if (ret >= 0) | 157 | if (ret >= 0) |
158 | s3c_gpiolib_track(chip); | 158 | s3c_gpiolib_track(chip); |
159 | } | 159 | } |
160 | |||
161 | int samsung_gpiolib_to_irq(struct gpio_chip *chip, unsigned int offset) | ||
162 | { | ||
163 | struct s3c_gpio_chip *s3c_chip = container_of(chip, | ||
164 | struct s3c_gpio_chip, chip); | ||
165 | |||
166 | return s3c_chip->irq_base + offset; | ||
167 | } | ||
diff --git a/arch/arm/plat-samsung/include/plat/audio.h b/arch/arm/plat-samsung/include/plat/audio.h index e32f9edfd4b7..7712ff6336f4 100644 --- a/arch/arm/plat-samsung/include/plat/audio.h +++ b/arch/arm/plat-samsung/include/plat/audio.h | |||
@@ -16,6 +16,15 @@ | |||
16 | #define S3C64XX_AC97_GPE 1 | 16 | #define S3C64XX_AC97_GPE 1 |
17 | extern void s3c64xx_ac97_setup_gpio(int); | 17 | extern void s3c64xx_ac97_setup_gpio(int); |
18 | 18 | ||
19 | /* | ||
20 | * The machine init code calls s5p*_spdif_setup_gpio with | ||
21 | * one of these defines in order to select appropriate bank | ||
22 | * of GPIO for S/PDIF pins | ||
23 | */ | ||
24 | #define S5PC100_SPDIF_GPD 0 | ||
25 | #define S5PC100_SPDIF_GPG3 1 | ||
26 | extern void s5pc100_spdif_setup_gpio(int); | ||
27 | |||
19 | /** | 28 | /** |
20 | * struct s3c_audio_pdata - common platform data for audio device drivers | 29 | * struct s3c_audio_pdata - common platform data for audio device drivers |
21 | * @cfg_gpio: Callback function to setup mux'ed pins in I2S/PCM/AC97 mode | 30 | * @cfg_gpio: Callback function to setup mux'ed pins in I2S/PCM/AC97 mode |
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h index c8b94279bad1..2d82a6cb1444 100644 --- a/arch/arm/plat-samsung/include/plat/devs.h +++ b/arch/arm/plat-samsung/include/plat/devs.h | |||
@@ -48,6 +48,11 @@ extern struct platform_device s3c_device_wdt; | |||
48 | extern struct platform_device s3c_device_i2c0; | 48 | extern struct platform_device s3c_device_i2c0; |
49 | extern struct platform_device s3c_device_i2c1; | 49 | extern struct platform_device s3c_device_i2c1; |
50 | extern struct platform_device s3c_device_i2c2; | 50 | extern struct platform_device s3c_device_i2c2; |
51 | extern struct platform_device s3c_device_i2c3; | ||
52 | extern struct platform_device s3c_device_i2c4; | ||
53 | extern struct platform_device s3c_device_i2c5; | ||
54 | extern struct platform_device s3c_device_i2c6; | ||
55 | extern struct platform_device s3c_device_i2c7; | ||
51 | extern struct platform_device s3c_device_rtc; | 56 | extern struct platform_device s3c_device_rtc; |
52 | extern struct platform_device s3c_device_adc; | 57 | extern struct platform_device s3c_device_adc; |
53 | extern struct platform_device s3c_device_sdi; | 58 | extern struct platform_device s3c_device_sdi; |
@@ -89,6 +94,7 @@ extern struct platform_device s5pv210_device_pcm2; | |||
89 | extern struct platform_device s5pv210_device_iis0; | 94 | extern struct platform_device s5pv210_device_iis0; |
90 | extern struct platform_device s5pv210_device_iis1; | 95 | extern struct platform_device s5pv210_device_iis1; |
91 | extern struct platform_device s5pv210_device_iis2; | 96 | extern struct platform_device s5pv210_device_iis2; |
97 | extern struct platform_device s5pv210_device_spdif; | ||
92 | 98 | ||
93 | extern struct platform_device s5p6442_device_pcm0; | 99 | extern struct platform_device s5p6442_device_pcm0; |
94 | extern struct platform_device s5p6442_device_pcm1; | 100 | extern struct platform_device s5p6442_device_pcm1; |
@@ -108,6 +114,7 @@ extern struct platform_device s5pc100_device_pcm1; | |||
108 | extern struct platform_device s5pc100_device_iis0; | 114 | extern struct platform_device s5pc100_device_iis0; |
109 | extern struct platform_device s5pc100_device_iis1; | 115 | extern struct platform_device s5pc100_device_iis1; |
110 | extern struct platform_device s5pc100_device_iis2; | 116 | extern struct platform_device s5pc100_device_iis2; |
117 | extern struct platform_device s5pc100_device_spdif; | ||
111 | 118 | ||
112 | extern struct platform_device samsung_device_keypad; | 119 | extern struct platform_device samsung_device_keypad; |
113 | 120 | ||
diff --git a/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h b/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h index 3e21c75feefa..8fd65d8b5863 100644 --- a/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h +++ b/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h | |||
@@ -42,6 +42,12 @@ static inline int s3c_gpio_do_setpull(struct s3c_gpio_chip *chip, | |||
42 | return (chip->config->set_pull)(chip, off, pull); | 42 | return (chip->config->set_pull)(chip, off, pull); |
43 | } | 43 | } |
44 | 44 | ||
45 | static inline s3c_gpio_pull_t s3c_gpio_do_getpull(struct s3c_gpio_chip *chip, | ||
46 | unsigned int off) | ||
47 | { | ||
48 | return chip->config->get_pull(chip, off); | ||
49 | } | ||
50 | |||
45 | /** | 51 | /** |
46 | * s3c_gpio_setcfg_s3c24xx - S3C24XX style GPIO configuration. | 52 | * s3c_gpio_setcfg_s3c24xx - S3C24XX style GPIO configuration. |
47 | * @chip: The gpio chip that is being configured. | 53 | * @chip: The gpio chip that is being configured. |
diff --git a/arch/arm/plat-samsung/include/plat/gpio-cfg.h b/arch/arm/plat-samsung/include/plat/gpio-cfg.h index 1c6b92947c5d..e4b5cf126fa9 100644 --- a/arch/arm/plat-samsung/include/plat/gpio-cfg.h +++ b/arch/arm/plat-samsung/include/plat/gpio-cfg.h | |||
@@ -108,6 +108,19 @@ extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to); | |||
108 | */ | 108 | */ |
109 | extern unsigned s3c_gpio_getcfg(unsigned int pin); | 109 | extern unsigned s3c_gpio_getcfg(unsigned int pin); |
110 | 110 | ||
111 | /** | ||
112 | * s3c_gpio_cfgpin_range() - Change the GPIO function for configuring pin range | ||
113 | * @start: The pin number to start at | ||
114 | * @nr: The number of pins to configure from @start. | ||
115 | * @cfg: The configuration for the pin's function | ||
116 | * | ||
117 | * Call s3c_gpio_cfgpin() for the @nr pins starting at @start. | ||
118 | * | ||
119 | * @sa s3c_gpio_cfgpin. | ||
120 | */ | ||
121 | extern int s3c_gpio_cfgpin_range(unsigned int start, unsigned int nr, | ||
122 | unsigned int cfg); | ||
123 | |||
111 | /* Define values for the pull-{up,down} available for each gpio pin. | 124 | /* Define values for the pull-{up,down} available for each gpio pin. |
112 | * | 125 | * |
113 | * These values control the state of the weak pull-{up,down} resistors | 126 | * These values control the state of the weak pull-{up,down} resistors |
@@ -140,6 +153,31 @@ extern int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull); | |||
140 | */ | 153 | */ |
141 | extern s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin); | 154 | extern s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin); |
142 | 155 | ||
156 | /* configure `all` aspects of an gpio */ | ||
157 | |||
158 | /** | ||
159 | * s3c_gpio_cfgall_range() - configure range of gpio functtion and pull. | ||
160 | * @start: The gpio number to start at. | ||
161 | * @nr: The number of gpio to configure from @start. | ||
162 | * @cfg: The configuration to use | ||
163 | * @pull: The pull setting to use. | ||
164 | * | ||
165 | * Run s3c_gpio_cfgpin() and s3c_gpio_setpull() over the gpio range starting | ||
166 | * @gpio and running for @size. | ||
167 | * | ||
168 | * @sa s3c_gpio_cfgpin | ||
169 | * @sa s3c_gpio_setpull | ||
170 | * @sa s3c_gpio_cfgpin_range | ||
171 | */ | ||
172 | extern int s3c_gpio_cfgall_range(unsigned int start, unsigned int nr, | ||
173 | unsigned int cfg, s3c_gpio_pull_t pull); | ||
174 | |||
175 | static inline int s3c_gpio_cfgrange_nopull(unsigned int pin, unsigned int size, | ||
176 | unsigned int cfg) | ||
177 | { | ||
178 | return s3c_gpio_cfgall_range(pin, size, cfg, S3C_GPIO_PULL_NONE); | ||
179 | } | ||
180 | |||
143 | /* Define values for the drvstr available for each gpio pin. | 181 | /* Define values for the drvstr available for each gpio pin. |
144 | * | 182 | * |
145 | * These values control the value of the output signal driver strength, | 183 | * These values control the value of the output signal driver strength, |
@@ -169,4 +207,22 @@ extern s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin); | |||
169 | */ | 207 | */ |
170 | extern int s5p_gpio_set_drvstr(unsigned int pin, s5p_gpio_drvstr_t drvstr); | 208 | extern int s5p_gpio_set_drvstr(unsigned int pin, s5p_gpio_drvstr_t drvstr); |
171 | 209 | ||
210 | /** | ||
211 | * s5p_register_gpio_interrupt() - register interrupt support for a gpio group | ||
212 | * @pin: The pin number from the group to be registered | ||
213 | * | ||
214 | * This function registers gpio interrupt support for the group that the | ||
215 | * specified pin belongs to. | ||
216 | * | ||
217 | * The total number of gpio pins is quite large ob s5p series. Registering | ||
218 | * irq support for all of them would be a resource waste. Because of that the | ||
219 | * interrupt support for standard gpio pins is registered dynamically. | ||
220 | * | ||
221 | * It will return the irq number of the interrupt that has been registered | ||
222 | * or -ENOMEM if no more gpio interrupts can be registered. It is allowed | ||
223 | * to call this function more than once for the same gpio group (the group | ||
224 | * will be registered only once). | ||
225 | */ | ||
226 | extern int s5p_register_gpio_interrupt(int pin); | ||
227 | |||
172 | #endif /* __PLAT_GPIO_CFG_H */ | 228 | #endif /* __PLAT_GPIO_CFG_H */ |
diff --git a/arch/arm/plat-samsung/include/plat/gpio-core.h b/arch/arm/plat-samsung/include/plat/gpio-core.h index e358c7da8480..13a22b8861ef 100644 --- a/arch/arm/plat-samsung/include/plat/gpio-core.h +++ b/arch/arm/plat-samsung/include/plat/gpio-core.h | |||
@@ -43,6 +43,8 @@ struct s3c_gpio_cfg; | |||
43 | * struct s3c_gpio_chip - wrapper for specific implementation of gpio | 43 | * struct s3c_gpio_chip - wrapper for specific implementation of gpio |
44 | * @chip: The chip structure to be exported via gpiolib. | 44 | * @chip: The chip structure to be exported via gpiolib. |
45 | * @base: The base pointer to the gpio configuration registers. | 45 | * @base: The base pointer to the gpio configuration registers. |
46 | * @group: The group register number for gpio interrupt support. | ||
47 | * @irq_base: The base irq number. | ||
46 | * @config: special function and pull-resistor control information. | 48 | * @config: special function and pull-resistor control information. |
47 | * @lock: Lock for exclusive access to this gpio bank. | 49 | * @lock: Lock for exclusive access to this gpio bank. |
48 | * @pm_save: Save information for suspend/resume support. | 50 | * @pm_save: Save information for suspend/resume support. |
@@ -63,6 +65,8 @@ struct s3c_gpio_chip { | |||
63 | struct s3c_gpio_cfg *config; | 65 | struct s3c_gpio_cfg *config; |
64 | struct s3c_gpio_pm *pm; | 66 | struct s3c_gpio_pm *pm; |
65 | void __iomem *base; | 67 | void __iomem *base; |
68 | int irq_base; | ||
69 | int group; | ||
66 | spinlock_t lock; | 70 | spinlock_t lock; |
67 | #ifdef CONFIG_PM | 71 | #ifdef CONFIG_PM |
68 | u32 pm_save[4]; | 72 | u32 pm_save[4]; |
@@ -118,6 +122,17 @@ extern void samsung_gpiolib_add_4bit2_chips(struct s3c_gpio_chip *chip, | |||
118 | extern void samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip); | 122 | extern void samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip); |
119 | extern void samsung_gpiolib_add_4bit2(struct s3c_gpio_chip *chip); | 123 | extern void samsung_gpiolib_add_4bit2(struct s3c_gpio_chip *chip); |
120 | 124 | ||
125 | |||
126 | /** | ||
127 | * samsung_gpiolib_to_irq - convert gpio pin to irq number | ||
128 | * @chip: The gpio chip that the pin belongs to. | ||
129 | * @offset: The offset of the pin in the chip. | ||
130 | * | ||
131 | * This helper returns the irq number calculated from the chip->irq_base and | ||
132 | * the provided offset. | ||
133 | */ | ||
134 | extern int samsung_gpiolib_to_irq(struct gpio_chip *chip, unsigned int offset); | ||
135 | |||
121 | /* exported for core SoC support to change */ | 136 | /* exported for core SoC support to change */ |
122 | extern struct s3c_gpio_cfg s3c24xx_gpiocfg_default; | 137 | extern struct s3c_gpio_cfg s3c24xx_gpiocfg_default; |
123 | 138 | ||
diff --git a/arch/arm/plat-samsung/include/plat/iic.h b/arch/arm/plat-samsung/include/plat/iic.h index 133308bf595d..1543da8f85c1 100644 --- a/arch/arm/plat-samsung/include/plat/iic.h +++ b/arch/arm/plat-samsung/include/plat/iic.h | |||
@@ -55,10 +55,20 @@ struct s3c2410_platform_i2c { | |||
55 | extern void s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *i2c); | 55 | extern void s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *i2c); |
56 | extern void s3c_i2c1_set_platdata(struct s3c2410_platform_i2c *i2c); | 56 | extern void s3c_i2c1_set_platdata(struct s3c2410_platform_i2c *i2c); |
57 | extern void s3c_i2c2_set_platdata(struct s3c2410_platform_i2c *i2c); | 57 | extern void s3c_i2c2_set_platdata(struct s3c2410_platform_i2c *i2c); |
58 | extern void s3c_i2c3_set_platdata(struct s3c2410_platform_i2c *i2c); | ||
59 | extern void s3c_i2c4_set_platdata(struct s3c2410_platform_i2c *i2c); | ||
60 | extern void s3c_i2c5_set_platdata(struct s3c2410_platform_i2c *i2c); | ||
61 | extern void s3c_i2c6_set_platdata(struct s3c2410_platform_i2c *i2c); | ||
62 | extern void s3c_i2c7_set_platdata(struct s3c2410_platform_i2c *i2c); | ||
58 | 63 | ||
59 | /* defined by architecture to configure gpio */ | 64 | /* defined by architecture to configure gpio */ |
60 | extern void s3c_i2c0_cfg_gpio(struct platform_device *dev); | 65 | extern void s3c_i2c0_cfg_gpio(struct platform_device *dev); |
61 | extern void s3c_i2c1_cfg_gpio(struct platform_device *dev); | 66 | extern void s3c_i2c1_cfg_gpio(struct platform_device *dev); |
62 | extern void s3c_i2c2_cfg_gpio(struct platform_device *dev); | 67 | extern void s3c_i2c2_cfg_gpio(struct platform_device *dev); |
68 | extern void s3c_i2c3_cfg_gpio(struct platform_device *dev); | ||
69 | extern void s3c_i2c4_cfg_gpio(struct platform_device *dev); | ||
70 | extern void s3c_i2c5_cfg_gpio(struct platform_device *dev); | ||
71 | extern void s3c_i2c6_cfg_gpio(struct platform_device *dev); | ||
72 | extern void s3c_i2c7_cfg_gpio(struct platform_device *dev); | ||
63 | 73 | ||
64 | #endif /* __ASM_ARCH_IIC_H */ | 74 | #endif /* __ASM_ARCH_IIC_H */ |
diff --git a/arch/arm/plat-samsung/include/plat/map-base.h b/arch/arm/plat-samsung/include/plat/map-base.h index 250be311c85b..3ffac4d2e4f0 100644 --- a/arch/arm/plat-samsung/include/plat/map-base.h +++ b/arch/arm/plat-samsung/include/plat/map-base.h | |||
@@ -14,7 +14,7 @@ | |||
14 | #ifndef __ASM_PLAT_MAP_H | 14 | #ifndef __ASM_PLAT_MAP_H |
15 | #define __ASM_PLAT_MAP_H __FILE__ | 15 | #define __ASM_PLAT_MAP_H __FILE__ |
16 | 16 | ||
17 | /* Fit all our registers in at 0xF4000000 upwards, trying to use as | 17 | /* Fit all our registers in at 0xF6000000 upwards, trying to use as |
18 | * little of the VA space as possible so vmalloc and friends have a | 18 | * little of the VA space as possible so vmalloc and friends have a |
19 | * better chance of getting memory. | 19 | * better chance of getting memory. |
20 | * | 20 | * |
@@ -22,7 +22,7 @@ | |||
22 | * an single MOVS instruction (ie, only 8 bits of set data) | 22 | * an single MOVS instruction (ie, only 8 bits of set data) |
23 | */ | 23 | */ |
24 | 24 | ||
25 | #define S3C_ADDR_BASE (0xF4000000) | 25 | #define S3C_ADDR_BASE 0xF6000000 |
26 | 26 | ||
27 | #ifndef __ASSEMBLY__ | 27 | #ifndef __ASSEMBLY__ |
28 | #define S3C_ADDR(x) ((void __iomem __force *)S3C_ADDR_BASE + (x)) | 28 | #define S3C_ADDR(x) ((void __iomem __force *)S3C_ADDR_BASE + (x)) |
diff --git a/arch/arm/plat-samsung/include/plat/nand-core.h b/arch/arm/plat-samsung/include/plat/nand-core.h new file mode 100644 index 000000000000..6de20789a95e --- /dev/null +++ b/arch/arm/plat-samsung/include/plat/nand-core.h | |||
@@ -0,0 +1,28 @@ | |||
1 | /* arch/arm/plat-samsung/include/plat/nand-core.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S3C - Nand Controller core functions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_NAND_CORE_H | ||
14 | #define __ASM_ARCH_NAND_CORE_H __FILE__ | ||
15 | |||
16 | /* These functions are only for use with the core support code, such as | ||
17 | * the cpu specific initialisation code | ||
18 | */ | ||
19 | |||
20 | /* re-define device name depending on support. */ | ||
21 | static inline void s3c_nand_setname(char *name) | ||
22 | { | ||
23 | #ifdef CONFIG_S3C_DEV_NAND | ||
24 | s3c_device_nand.name = name; | ||
25 | #endif | ||
26 | } | ||
27 | |||
28 | #endif /* __ASM_ARCH_NAND_CORE_H */ | ||
diff --git a/arch/arm/plat-samsung/include/plat/sdhci.h b/arch/arm/plat-samsung/include/plat/sdhci.h index 30844c263d03..85853f8c4c5d 100644 --- a/arch/arm/plat-samsung/include/plat/sdhci.h +++ b/arch/arm/plat-samsung/include/plat/sdhci.h | |||
@@ -28,11 +28,17 @@ enum cd_types { | |||
28 | S3C_SDHCI_CD_PERMANENT, /* no CD line, card permanently wired to host */ | 28 | S3C_SDHCI_CD_PERMANENT, /* no CD line, card permanently wired to host */ |
29 | }; | 29 | }; |
30 | 30 | ||
31 | enum clk_types { | ||
32 | S3C_SDHCI_CLK_DIV_INTERNAL, /* use mmc internal clock divider */ | ||
33 | S3C_SDHCI_CLK_DIV_EXTERNAL, /* use external clock divider */ | ||
34 | }; | ||
35 | |||
31 | /** | 36 | /** |
32 | * struct s3c_sdhci_platdata() - Platform device data for Samsung SDHCI | 37 | * struct s3c_sdhci_platdata() - Platform device data for Samsung SDHCI |
33 | * @max_width: The maximum number of data bits supported. | 38 | * @max_width: The maximum number of data bits supported. |
34 | * @host_caps: Standard MMC host capabilities bit field. | 39 | * @host_caps: Standard MMC host capabilities bit field. |
35 | * @cd_type: Type of Card Detection method (see cd_types enum above) | 40 | * @cd_type: Type of Card Detection method (see cd_types enum above) |
41 | * @clk_type: Type of clock divider method (see clk_types enum above) | ||
36 | * @ext_cd_init: Initialize external card detect subsystem. Called on | 42 | * @ext_cd_init: Initialize external card detect subsystem. Called on |
37 | * sdhci-s3c driver probe when cd_type == S3C_SDHCI_CD_EXTERNAL. | 43 | * sdhci-s3c driver probe when cd_type == S3C_SDHCI_CD_EXTERNAL. |
38 | * notify_func argument is a callback to the sdhci-s3c driver | 44 | * notify_func argument is a callback to the sdhci-s3c driver |
@@ -59,6 +65,7 @@ struct s3c_sdhci_platdata { | |||
59 | unsigned int max_width; | 65 | unsigned int max_width; |
60 | unsigned int host_caps; | 66 | unsigned int host_caps; |
61 | enum cd_types cd_type; | 67 | enum cd_types cd_type; |
68 | enum clk_types clk_type; | ||
62 | 69 | ||
63 | char **clocks; /* set of clock sources */ | 70 | char **clocks; /* set of clock sources */ |
64 | 71 | ||
@@ -110,6 +117,10 @@ extern void s5pv210_setup_sdhci0_cfg_gpio(struct platform_device *, int w); | |||
110 | extern void s5pv210_setup_sdhci1_cfg_gpio(struct platform_device *, int w); | 117 | extern void s5pv210_setup_sdhci1_cfg_gpio(struct platform_device *, int w); |
111 | extern void s5pv210_setup_sdhci2_cfg_gpio(struct platform_device *, int w); | 118 | extern void s5pv210_setup_sdhci2_cfg_gpio(struct platform_device *, int w); |
112 | extern void s5pv210_setup_sdhci3_cfg_gpio(struct platform_device *, int w); | 119 | extern void s5pv210_setup_sdhci3_cfg_gpio(struct platform_device *, int w); |
120 | extern void s5pv310_setup_sdhci0_cfg_gpio(struct platform_device *, int w); | ||
121 | extern void s5pv310_setup_sdhci1_cfg_gpio(struct platform_device *, int w); | ||
122 | extern void s5pv310_setup_sdhci2_cfg_gpio(struct platform_device *, int w); | ||
123 | extern void s5pv310_setup_sdhci3_cfg_gpio(struct platform_device *, int w); | ||
113 | 124 | ||
114 | /* S3C64XX SDHCI setup */ | 125 | /* S3C64XX SDHCI setup */ |
115 | 126 | ||
@@ -288,4 +299,57 @@ static inline void s5pv210_default_sdhci3(void) { } | |||
288 | 299 | ||
289 | #endif /* CONFIG_S5PV210_SETUP_SDHCI */ | 300 | #endif /* CONFIG_S5PV210_SETUP_SDHCI */ |
290 | 301 | ||
302 | /* S5PV310 SDHCI setup */ | ||
303 | #ifdef CONFIG_S5PV310_SETUP_SDHCI | ||
304 | extern char *s5pv310_hsmmc_clksrcs[4]; | ||
305 | |||
306 | extern void s5pv310_setup_sdhci_cfg_card(struct platform_device *dev, | ||
307 | void __iomem *r, | ||
308 | struct mmc_ios *ios, | ||
309 | struct mmc_card *card); | ||
310 | |||
311 | static inline void s5pv310_default_sdhci0(void) | ||
312 | { | ||
313 | #ifdef CONFIG_S3C_DEV_HSMMC | ||
314 | s3c_hsmmc0_def_platdata.clocks = s5pv310_hsmmc_clksrcs; | ||
315 | s3c_hsmmc0_def_platdata.cfg_gpio = s5pv310_setup_sdhci0_cfg_gpio; | ||
316 | s3c_hsmmc0_def_platdata.cfg_card = s5pv310_setup_sdhci_cfg_card; | ||
317 | #endif | ||
318 | } | ||
319 | |||
320 | static inline void s5pv310_default_sdhci1(void) | ||
321 | { | ||
322 | #ifdef CONFIG_S3C_DEV_HSMMC1 | ||
323 | s3c_hsmmc1_def_platdata.clocks = s5pv310_hsmmc_clksrcs; | ||
324 | s3c_hsmmc1_def_platdata.cfg_gpio = s5pv310_setup_sdhci1_cfg_gpio; | ||
325 | s3c_hsmmc1_def_platdata.cfg_card = s5pv310_setup_sdhci_cfg_card; | ||
326 | #endif | ||
327 | } | ||
328 | |||
329 | static inline void s5pv310_default_sdhci2(void) | ||
330 | { | ||
331 | #ifdef CONFIG_S3C_DEV_HSMMC2 | ||
332 | s3c_hsmmc2_def_platdata.clocks = s5pv310_hsmmc_clksrcs; | ||
333 | s3c_hsmmc2_def_platdata.cfg_gpio = s5pv310_setup_sdhci2_cfg_gpio; | ||
334 | s3c_hsmmc2_def_platdata.cfg_card = s5pv310_setup_sdhci_cfg_card; | ||
335 | #endif | ||
336 | } | ||
337 | |||
338 | static inline void s5pv310_default_sdhci3(void) | ||
339 | { | ||
340 | #ifdef CONFIG_S3C_DEV_HSMMC3 | ||
341 | s3c_hsmmc3_def_platdata.clocks = s5pv310_hsmmc_clksrcs; | ||
342 | s3c_hsmmc3_def_platdata.cfg_gpio = s5pv310_setup_sdhci3_cfg_gpio; | ||
343 | s3c_hsmmc3_def_platdata.cfg_card = s5pv310_setup_sdhci_cfg_card; | ||
344 | #endif | ||
345 | } | ||
346 | |||
347 | #else | ||
348 | static inline void s5pv310_default_sdhci0(void) { } | ||
349 | static inline void s5pv310_default_sdhci1(void) { } | ||
350 | static inline void s5pv310_default_sdhci2(void) { } | ||
351 | static inline void s5pv310_default_sdhci3(void) { } | ||
352 | |||
353 | #endif /* CONFIG_S5PV310_SETUP_SDHCI */ | ||
354 | |||
291 | #endif /* __PLAT_S3C_SDHCI_H */ | 355 | #endif /* __PLAT_S3C_SDHCI_H */ |
diff --git a/arch/arm/plat-samsung/pm-gpio.c b/arch/arm/plat-samsung/pm-gpio.c index 7df03f87fbfa..96528200eb79 100644 --- a/arch/arm/plat-samsung/pm-gpio.c +++ b/arch/arm/plat-samsung/pm-gpio.c | |||
@@ -192,7 +192,7 @@ struct s3c_gpio_pm s3c_gpio_pm_2bit = { | |||
192 | .resume = s3c_gpio_pm_2bit_resume, | 192 | .resume = s3c_gpio_pm_2bit_resume, |
193 | }; | 193 | }; |
194 | 194 | ||
195 | #ifdef CONFIG_ARCH_S3C64XX | 195 | #if defined(CONFIG_ARCH_S3C64XX) || defined(CONFIG_PLAT_S5P) |
196 | static void s3c_gpio_pm_4bit_save(struct s3c_gpio_chip *chip) | 196 | static void s3c_gpio_pm_4bit_save(struct s3c_gpio_chip *chip) |
197 | { | 197 | { |
198 | chip->pm_save[1] = __raw_readl(chip->base + OFFS_CON); | 198 | chip->pm_save[1] = __raw_readl(chip->base + OFFS_CON); |
@@ -302,7 +302,7 @@ struct s3c_gpio_pm s3c_gpio_pm_4bit = { | |||
302 | .save = s3c_gpio_pm_4bit_save, | 302 | .save = s3c_gpio_pm_4bit_save, |
303 | .resume = s3c_gpio_pm_4bit_resume, | 303 | .resume = s3c_gpio_pm_4bit_resume, |
304 | }; | 304 | }; |
305 | #endif /* CONFIG_ARCH_S3C64XX */ | 305 | #endif /* CONFIG_ARCH_S3C64XX || CONFIG_PLAT_S5P */ |
306 | 306 | ||
307 | /** | 307 | /** |
308 | * s3c_pm_save_gpio() - save gpio chip data for suspend | 308 | * s3c_pm_save_gpio() - save gpio chip data for suspend |
diff --git a/arch/arm/plat-samsung/s3c-pl330.c b/arch/arm/plat-samsung/s3c-pl330.c index a91305a60aed..b4ff8d74ac40 100644 --- a/arch/arm/plat-samsung/s3c-pl330.c +++ b/arch/arm/plat-samsung/s3c-pl330.c | |||
@@ -15,6 +15,8 @@ | |||
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/clk.h> | ||
19 | #include <linux/err.h> | ||
18 | 20 | ||
19 | #include <asm/hardware/pl330.h> | 21 | #include <asm/hardware/pl330.h> |
20 | 22 | ||
@@ -27,6 +29,7 @@ | |||
27 | * @node: To attach to the global list of DMACs. | 29 | * @node: To attach to the global list of DMACs. |
28 | * @pi: PL330 configuration info for the DMAC. | 30 | * @pi: PL330 configuration info for the DMAC. |
29 | * @kmcache: Pool to quickly allocate xfers for all channels in the dmac. | 31 | * @kmcache: Pool to quickly allocate xfers for all channels in the dmac. |
32 | * @clk: Pointer of DMAC operation clock. | ||
30 | */ | 33 | */ |
31 | struct s3c_pl330_dmac { | 34 | struct s3c_pl330_dmac { |
32 | unsigned busy_chan; | 35 | unsigned busy_chan; |
@@ -34,6 +37,7 @@ struct s3c_pl330_dmac { | |||
34 | struct list_head node; | 37 | struct list_head node; |
35 | struct pl330_info *pi; | 38 | struct pl330_info *pi; |
36 | struct kmem_cache *kmcache; | 39 | struct kmem_cache *kmcache; |
40 | struct clk *clk; | ||
37 | }; | 41 | }; |
38 | 42 | ||
39 | /** | 43 | /** |
@@ -1072,16 +1076,25 @@ static int pl330_probe(struct platform_device *pdev) | |||
1072 | if (ret) | 1076 | if (ret) |
1073 | goto probe_err4; | 1077 | goto probe_err4; |
1074 | 1078 | ||
1075 | ret = pl330_add(pl330_info); | ||
1076 | if (ret) | ||
1077 | goto probe_err5; | ||
1078 | |||
1079 | /* Allocate a new DMAC */ | 1079 | /* Allocate a new DMAC */ |
1080 | s3c_pl330_dmac = kmalloc(sizeof(*s3c_pl330_dmac), GFP_KERNEL); | 1080 | s3c_pl330_dmac = kmalloc(sizeof(*s3c_pl330_dmac), GFP_KERNEL); |
1081 | if (!s3c_pl330_dmac) { | 1081 | if (!s3c_pl330_dmac) { |
1082 | ret = -ENOMEM; | 1082 | ret = -ENOMEM; |
1083 | goto probe_err5; | ||
1084 | } | ||
1085 | |||
1086 | /* Get operation clock and enable it */ | ||
1087 | s3c_pl330_dmac->clk = clk_get(&pdev->dev, "pdma"); | ||
1088 | if (IS_ERR(s3c_pl330_dmac->clk)) { | ||
1089 | dev_err(&pdev->dev, "Cannot get operation clock.\n"); | ||
1090 | ret = -EINVAL; | ||
1083 | goto probe_err6; | 1091 | goto probe_err6; |
1084 | } | 1092 | } |
1093 | clk_enable(s3c_pl330_dmac->clk); | ||
1094 | |||
1095 | ret = pl330_add(pl330_info); | ||
1096 | if (ret) | ||
1097 | goto probe_err7; | ||
1085 | 1098 | ||
1086 | /* Hook the info */ | 1099 | /* Hook the info */ |
1087 | s3c_pl330_dmac->pi = pl330_info; | 1100 | s3c_pl330_dmac->pi = pl330_info; |
@@ -1094,7 +1107,7 @@ static int pl330_probe(struct platform_device *pdev) | |||
1094 | 1107 | ||
1095 | if (!s3c_pl330_dmac->kmcache) { | 1108 | if (!s3c_pl330_dmac->kmcache) { |
1096 | ret = -ENOMEM; | 1109 | ret = -ENOMEM; |
1097 | goto probe_err7; | 1110 | goto probe_err8; |
1098 | } | 1111 | } |
1099 | 1112 | ||
1100 | /* Get the list of peripherals */ | 1113 | /* Get the list of peripherals */ |
@@ -1120,10 +1133,13 @@ static int pl330_probe(struct platform_device *pdev) | |||
1120 | 1133 | ||
1121 | return 0; | 1134 | return 0; |
1122 | 1135 | ||
1136 | probe_err8: | ||
1137 | pl330_del(pl330_info); | ||
1123 | probe_err7: | 1138 | probe_err7: |
1124 | kfree(s3c_pl330_dmac); | 1139 | clk_disable(s3c_pl330_dmac->clk); |
1140 | clk_put(s3c_pl330_dmac->clk); | ||
1125 | probe_err6: | 1141 | probe_err6: |
1126 | pl330_del(pl330_info); | 1142 | kfree(s3c_pl330_dmac); |
1127 | probe_err5: | 1143 | probe_err5: |
1128 | free_irq(irq, pl330_info); | 1144 | free_irq(irq, pl330_info); |
1129 | probe_err4: | 1145 | probe_err4: |
@@ -1188,6 +1204,10 @@ static int pl330_remove(struct platform_device *pdev) | |||
1188 | } | 1204 | } |
1189 | } | 1205 | } |
1190 | 1206 | ||
1207 | /* Disable operation clock */ | ||
1208 | clk_disable(dmac->clk); | ||
1209 | clk_put(dmac->clk); | ||
1210 | |||
1191 | /* Remove the DMAC */ | 1211 | /* Remove the DMAC */ |
1192 | list_del(&dmac->node); | 1212 | list_del(&dmac->node); |
1193 | kfree(dmac); | 1213 | kfree(dmac); |