diff options
-rw-r--r-- | arch/arm/mach-s3c2416/Kconfig | 12 | ||||
-rw-r--r-- | arch/arm/mach-s3c2416/Makefile | 4 | ||||
-rw-r--r-- | arch/arm/mach-s3c2416/s3c2416.c | 5 | ||||
-rw-r--r-- | arch/arm/mach-s3c2416/setup-sdhci-gpio.c | 34 | ||||
-rw-r--r-- | arch/arm/mach-s3c2416/setup-sdhci.c | 61 | ||||
-rw-r--r-- | arch/arm/plat-samsung/include/plat/sdhci.h | 35 |
6 files changed, 151 insertions, 0 deletions
diff --git a/arch/arm/mach-s3c2416/Kconfig b/arch/arm/mach-s3c2416/Kconfig index df8d14974c90..69b48a7d1dbd 100644 --- a/arch/arm/mach-s3c2416/Kconfig +++ b/arch/arm/mach-s3c2416/Kconfig | |||
@@ -31,6 +31,17 @@ config S3C2416_PM | |||
31 | help | 31 | help |
32 | Internal config node to apply S3C2416 power management | 32 | Internal config node to apply S3C2416 power management |
33 | 33 | ||
34 | config S3C2416_SETUP_SDHCI | ||
35 | bool | ||
36 | select S3C2416_SETUP_SDHCI_GPIO | ||
37 | help | ||
38 | Internal helper functions for S3C2416 based SDHCI systems | ||
39 | |||
40 | config S3C2416_SETUP_SDHCI_GPIO | ||
41 | bool | ||
42 | help | ||
43 | Common setup code for SDHCI gpio. | ||
44 | |||
34 | menu "S3C2416 Machines" | 45 | menu "S3C2416 Machines" |
35 | 46 | ||
36 | config MACH_SMDK2416 | 47 | config MACH_SMDK2416 |
@@ -42,6 +53,7 @@ config MACH_SMDK2416 | |||
42 | select S3C_DEV_HSMMC1 | 53 | select S3C_DEV_HSMMC1 |
43 | select S3C_DEV_NAND | 54 | select S3C_DEV_NAND |
44 | select S3C_DEV_USB_HOST | 55 | select S3C_DEV_USB_HOST |
56 | select S3C2416_SETUP_SDHCI | ||
45 | select S3C2416_PM if PM | 57 | select S3C2416_PM if PM |
46 | help | 58 | help |
47 | Say Y here if you are using an SMDK2416 | 59 | Say Y here if you are using an SMDK2416 |
diff --git a/arch/arm/mach-s3c2416/Makefile b/arch/arm/mach-s3c2416/Makefile index ef038d62ffdb..7b805b279caf 100644 --- a/arch/arm/mach-s3c2416/Makefile +++ b/arch/arm/mach-s3c2416/Makefile | |||
@@ -14,6 +14,10 @@ obj-$(CONFIG_CPU_S3C2416) += irq.o | |||
14 | obj-$(CONFIG_S3C2416_PM) += pm.o | 14 | obj-$(CONFIG_S3C2416_PM) += pm.o |
15 | #obj-$(CONFIG_S3C2416_DMA) += dma.o | 15 | #obj-$(CONFIG_S3C2416_DMA) += dma.o |
16 | 16 | ||
17 | # Device setup | ||
18 | obj-$(CONFIG_S3C2416_SETUP_SDHCI) += setup-sdhci.o | ||
19 | obj-$(CONFIG_S3C2416_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | ||
20 | |||
17 | # Machine support | 21 | # Machine support |
18 | 22 | ||
19 | obj-$(CONFIG_MACH_SMDK2416) += mach-smdk2416.o | 23 | obj-$(CONFIG_MACH_SMDK2416) += mach-smdk2416.o |
diff --git a/arch/arm/mach-s3c2416/s3c2416.c b/arch/arm/mach-s3c2416/s3c2416.c index 63f39cdc0972..ba7fd8737434 100644 --- a/arch/arm/mach-s3c2416/s3c2416.c +++ b/arch/arm/mach-s3c2416/s3c2416.c | |||
@@ -53,6 +53,7 @@ | |||
53 | #include <plat/s3c2416.h> | 53 | #include <plat/s3c2416.h> |
54 | #include <plat/devs.h> | 54 | #include <plat/devs.h> |
55 | #include <plat/cpu.h> | 55 | #include <plat/cpu.h> |
56 | #include <plat/sdhci.h> | ||
56 | 57 | ||
57 | #include <plat/iic-core.h> | 58 | #include <plat/iic-core.h> |
58 | #include <plat/fb-core.h> | 59 | #include <plat/fb-core.h> |
@@ -115,6 +116,10 @@ void __init s3c2416_map_io(void) | |||
115 | s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_updown; | 116 | s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_updown; |
116 | s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_updown; | 117 | s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_updown; |
117 | 118 | ||
119 | /* initialize device information early */ | ||
120 | s3c2416_default_sdhci0(); | ||
121 | s3c2416_default_sdhci1(); | ||
122 | |||
118 | iotable_init(s3c2416_iodesc, ARRAY_SIZE(s3c2416_iodesc)); | 123 | iotable_init(s3c2416_iodesc, ARRAY_SIZE(s3c2416_iodesc)); |
119 | } | 124 | } |
120 | 125 | ||
diff --git a/arch/arm/mach-s3c2416/setup-sdhci-gpio.c b/arch/arm/mach-s3c2416/setup-sdhci-gpio.c new file mode 100644 index 000000000000..f65cb3ef16ce --- /dev/null +++ b/arch/arm/mach-s3c2416/setup-sdhci-gpio.c | |||
@@ -0,0 +1,34 @@ | |||
1 | /* linux/arch/arm/plat-s3c2416/setup-sdhci-gpio.c | ||
2 | * | ||
3 | * Copyright 2010 Promwad Innovation Company | ||
4 | * Yauhen Kharuzhy <yauhen.kharuzhy@promwad.com> | ||
5 | * | ||
6 | * S3C2416 - Helper functions for setting up SDHCI device(s) GPIO (HSMMC) | ||
7 | * | ||
8 | * Based on mach-s3c64xx/setup-sdhci-gpio.c | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/platform_device.h> | ||
19 | #include <linux/io.h> | ||
20 | #include <linux/gpio.h> | ||
21 | |||
22 | #include <mach/regs-gpio.h> | ||
23 | #include <plat/gpio-cfg.h> | ||
24 | |||
25 | void s3c2416_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | ||
26 | { | ||
27 | s3c_gpio_cfgrange_nopull(S3C2410_GPE(5), 2 + width, S3C_GPIO_SFN(2)); | ||
28 | } | ||
29 | |||
30 | void s3c2416_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) | ||
31 | { | ||
32 | s3c_gpio_cfgrange_nopull(S3C2410_GPL(0), width, S3C_GPIO_SFN(2)); | ||
33 | s3c_gpio_cfgrange_nopull(S3C2410_GPL(8), 2, S3C_GPIO_SFN(2)); | ||
34 | } | ||
diff --git a/arch/arm/mach-s3c2416/setup-sdhci.c b/arch/arm/mach-s3c2416/setup-sdhci.c new file mode 100644 index 000000000000..ed34fad8f2c6 --- /dev/null +++ b/arch/arm/mach-s3c2416/setup-sdhci.c | |||
@@ -0,0 +1,61 @@ | |||
1 | /* linux/arch/arm/mach-s3c2416/setup-sdhci.c | ||
2 | * | ||
3 | * Copyright 2010 Promwad Innovation Company | ||
4 | * Yauhen Kharuzhy <yauhen.kharuzhy@promwad.com> | ||
5 | * | ||
6 | * S3C2416 - Helper functions for settign up SDHCI device(s) (HSMMC) | ||
7 | * | ||
8 | * Based on mach-s3c64xx/setup-sdhci.c | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/platform_device.h> | ||
19 | #include <linux/io.h> | ||
20 | |||
21 | #include <linux/mmc/card.h> | ||
22 | #include <linux/mmc/host.h> | ||
23 | |||
24 | #include <plat/regs-sdhci.h> | ||
25 | #include <plat/sdhci.h> | ||
26 | |||
27 | /* clock sources for the mmc bus clock, order as for the ctrl2[5..4] */ | ||
28 | |||
29 | char *s3c2416_hsmmc_clksrcs[4] = { | ||
30 | [0] = "hsmmc", | ||
31 | [1] = "hsmmc", | ||
32 | [2] = "hsmmc-if", | ||
33 | /* [3] = "48m", - note not successfully used yet */ | ||
34 | }; | ||
35 | |||
36 | void s3c2416_setup_sdhci_cfg_card(struct platform_device *dev, | ||
37 | void __iomem *r, | ||
38 | struct mmc_ios *ios, | ||
39 | struct mmc_card *card) | ||
40 | { | ||
41 | u32 ctrl2, ctrl3; | ||
42 | |||
43 | ctrl2 = __raw_readl(r + S3C_SDHCI_CONTROL2); | ||
44 | ctrl2 &= S3C_SDHCI_CTRL2_SELBASECLK_MASK; | ||
45 | ctrl2 |= (S3C64XX_SDHCI_CTRL2_ENSTAASYNCCLR | | ||
46 | S3C64XX_SDHCI_CTRL2_ENCMDCNFMSK | | ||
47 | S3C_SDHCI_CTRL2_ENFBCLKRX | | ||
48 | S3C_SDHCI_CTRL2_DFCNT_NONE | | ||
49 | S3C_SDHCI_CTRL2_ENCLKOUTHOLD); | ||
50 | |||
51 | if (ios->clock < 25 * 1000000) | ||
52 | ctrl3 = (S3C_SDHCI_CTRL3_FCSEL3 | | ||
53 | S3C_SDHCI_CTRL3_FCSEL2 | | ||
54 | S3C_SDHCI_CTRL3_FCSEL1 | | ||
55 | S3C_SDHCI_CTRL3_FCSEL0); | ||
56 | else | ||
57 | ctrl3 = (S3C_SDHCI_CTRL3_FCSEL1 | S3C_SDHCI_CTRL3_FCSEL0); | ||
58 | |||
59 | __raw_writel(ctrl2, r + S3C_SDHCI_CONTROL2); | ||
60 | __raw_writel(ctrl3, r + S3C_SDHCI_CONTROL3); | ||
61 | } | ||
diff --git a/arch/arm/plat-samsung/include/plat/sdhci.h b/arch/arm/plat-samsung/include/plat/sdhci.h index 85853f8c4c5d..5a41a0b69eec 100644 --- a/arch/arm/plat-samsung/include/plat/sdhci.h +++ b/arch/arm/plat-samsung/include/plat/sdhci.h | |||
@@ -107,6 +107,8 @@ extern struct s3c_sdhci_platdata s3c_hsmmc3_def_platdata; | |||
107 | 107 | ||
108 | /* Helper function availablity */ | 108 | /* Helper function availablity */ |
109 | 109 | ||
110 | extern void s3c2416_setup_sdhci0_cfg_gpio(struct platform_device *, int w); | ||
111 | extern void s3c2416_setup_sdhci1_cfg_gpio(struct platform_device *, int w); | ||
110 | extern void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *, int w); | 112 | extern void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *, int w); |
111 | extern void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *, int w); | 113 | extern void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *, int w); |
112 | extern void s5pc100_setup_sdhci0_cfg_gpio(struct platform_device *, int w); | 114 | extern void s5pc100_setup_sdhci0_cfg_gpio(struct platform_device *, int w); |
@@ -122,6 +124,39 @@ 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); | 124 | 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); | 125 | extern void s5pv310_setup_sdhci3_cfg_gpio(struct platform_device *, int w); |
124 | 126 | ||
127 | /* S3C2416 SDHCI setup */ | ||
128 | |||
129 | #ifdef CONFIG_S3C2416_SETUP_SDHCI | ||
130 | extern char *s3c2416_hsmmc_clksrcs[4]; | ||
131 | |||
132 | extern void s3c2416_setup_sdhci_cfg_card(struct platform_device *dev, | ||
133 | void __iomem *r, | ||
134 | struct mmc_ios *ios, | ||
135 | struct mmc_card *card); | ||
136 | |||
137 | static inline void s3c2416_default_sdhci0(void) | ||
138 | { | ||
139 | #ifdef CONFIG_S3C_DEV_HSMMC | ||
140 | s3c_hsmmc0_def_platdata.clocks = s3c2416_hsmmc_clksrcs; | ||
141 | s3c_hsmmc0_def_platdata.cfg_gpio = s3c2416_setup_sdhci0_cfg_gpio; | ||
142 | s3c_hsmmc0_def_platdata.cfg_card = s3c2416_setup_sdhci_cfg_card; | ||
143 | #endif /* CONFIG_S3C_DEV_HSMMC */ | ||
144 | } | ||
145 | |||
146 | static inline void s3c2416_default_sdhci1(void) | ||
147 | { | ||
148 | #ifdef CONFIG_S3C_DEV_HSMMC1 | ||
149 | s3c_hsmmc1_def_platdata.clocks = s3c2416_hsmmc_clksrcs; | ||
150 | s3c_hsmmc1_def_platdata.cfg_gpio = s3c2416_setup_sdhci1_cfg_gpio; | ||
151 | s3c_hsmmc1_def_platdata.cfg_card = s3c2416_setup_sdhci_cfg_card; | ||
152 | #endif /* CONFIG_S3C_DEV_HSMMC1 */ | ||
153 | } | ||
154 | |||
155 | #else | ||
156 | static inline void s3c2416_default_sdhci0(void) { } | ||
157 | static inline void s3c2416_default_sdhci1(void) { } | ||
158 | |||
159 | #endif /* CONFIG_S3C2416_SETUP_SDHCI */ | ||
125 | /* S3C64XX SDHCI setup */ | 160 | /* S3C64XX SDHCI setup */ |
126 | 161 | ||
127 | #ifdef CONFIG_S3C64XX_SETUP_SDHCI | 162 | #ifdef CONFIG_S3C64XX_SETUP_SDHCI |