diff options
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); |
