Merge branch 'next-s5pv210' into for-next
[pandora-kernel.git] / arch / arm / plat-samsung / include / plat / sdhci.h
1 /* linux/arch/arm/plat-s3c/include/plat/sdhci.h
2  *
3  * Copyright 2008 Openmoko, Inc.
4  * Copyright 2008 Simtec Electronics
5  *      http://armlinux.simtec.co.uk/
6  *      Ben Dooks <ben@simtec.co.uk>
7  *
8  * S3C Platform - SDHCI (HSMMC) platform data definitions
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 #ifndef __PLAT_S3C_SDHCI_H
16 #define __PLAT_S3C_SDHCI_H __FILE__
17
18 struct platform_device;
19 struct mmc_host;
20 struct mmc_card;
21 struct mmc_ios;
22
23 /**
24  * struct s3c_sdhci_platdata() - Platform device data for Samsung SDHCI
25  * @max_width: The maximum number of data bits supported.
26  * @host_caps: Standard MMC host capabilities bit field.
27  * @cfg_gpio: Configure the GPIO for a specific card bit-width
28  * @cfg_card: Configure the interface for a specific card and speed. This
29  *            is necessary the controllers and/or GPIO blocks require the
30  *            changing of driver-strength and other controls dependant on
31  *            the card and speed of operation.
32  *
33  * Initialisation data specific to either the machine or the platform
34  * for the device driver to use or call-back when configuring gpio or
35  * card speed information.
36 */
37 struct s3c_sdhci_platdata {
38         unsigned int    max_width;
39         unsigned int    host_caps;
40
41         char            **clocks;       /* set of clock sources */
42
43         void    (*cfg_gpio)(struct platform_device *dev, int width);
44         void    (*cfg_card)(struct platform_device *dev,
45                             void __iomem *regbase,
46                             struct mmc_ios *ios,
47                             struct mmc_card *card);
48 };
49
50 /**
51  * s3c_sdhci0_set_platdata - Set platform data for S3C SDHCI device.
52  * @pd: Platform data to register to device.
53  *
54  * Register the given platform data for use withe S3C SDHCI device.
55  * The call will copy the platform data, so the board definitions can
56  * make the structure itself __initdata.
57  */
58 extern void s3c_sdhci0_set_platdata(struct s3c_sdhci_platdata *pd);
59 extern void s3c_sdhci1_set_platdata(struct s3c_sdhci_platdata *pd);
60 extern void s3c_sdhci2_set_platdata(struct s3c_sdhci_platdata *pd);
61
62 /* Default platform data, exported so that per-cpu initialisation can
63  * set the correct one when there are more than one cpu type selected.
64 */
65
66 extern struct s3c_sdhci_platdata s3c_hsmmc0_def_platdata;
67 extern struct s3c_sdhci_platdata s3c_hsmmc1_def_platdata;
68 extern struct s3c_sdhci_platdata s3c_hsmmc2_def_platdata;
69
70 /* Helper function availablity */
71
72 extern void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
73 extern void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
74 extern void s5pc100_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
75 extern void s5pc100_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
76 extern void s5pc100_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
77 extern void s3c64xx_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
78 extern void s5pv210_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
79 extern void s5pv210_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
80 extern void s5pv210_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
81 extern void s5pv210_setup_sdhci3_cfg_gpio(struct platform_device *, int w);
82
83 /* S3C6400 SDHCI setup */
84
85 #ifdef CONFIG_S3C64XX_SETUP_SDHCI
86 extern char *s3c64xx_hsmmc_clksrcs[4];
87
88 #ifdef CONFIG_S3C_DEV_HSMMC
89 extern void s3c6400_setup_sdhci_cfg_card(struct platform_device *dev,
90                                          void __iomem *r,
91                                          struct mmc_ios *ios,
92                                          struct mmc_card *card);
93
94 static inline void s3c6400_default_sdhci0(void)
95 {
96         s3c_hsmmc0_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
97         s3c_hsmmc0_def_platdata.cfg_gpio = s3c64xx_setup_sdhci0_cfg_gpio;
98         s3c_hsmmc0_def_platdata.cfg_card = s3c6400_setup_sdhci_cfg_card;
99 }
100
101 #else
102 static inline void s3c6400_default_sdhci0(void) { }
103 #endif  /* CONFIG_S3C_DEV_HSMMC */
104
105 #ifdef CONFIG_S3C_DEV_HSMMC1
106 static inline void s3c6400_default_sdhci1(void)
107 {
108         s3c_hsmmc1_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
109         s3c_hsmmc1_def_platdata.cfg_gpio = s3c64xx_setup_sdhci1_cfg_gpio;
110         s3c_hsmmc1_def_platdata.cfg_card = s3c6400_setup_sdhci_cfg_card;
111 }
112 #else
113 static inline void s3c6400_default_sdhci1(void) { }
114 #endif /* CONFIG_S3C_DEV_HSMMC1 */
115
116 #ifdef CONFIG_S3C_DEV_HSMMC2
117 static inline void s3c6400_default_sdhci2(void)
118 {
119         s3c_hsmmc2_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
120         s3c_hsmmc2_def_platdata.cfg_gpio = s3c64xx_setup_sdhci2_cfg_gpio;
121         s3c_hsmmc2_def_platdata.cfg_card = s3c6400_setup_sdhci_cfg_card;
122 }
123 #else
124 static inline void s3c6400_default_sdhci2(void) { }
125 #endif /* CONFIG_S3C_DEV_HSMMC2 */
126
127 /* S3C6410 SDHCI setup */
128
129 extern void s3c6410_setup_sdhci_cfg_card(struct platform_device *dev,
130                                          void __iomem *r,
131                                          struct mmc_ios *ios,
132                                          struct mmc_card *card);
133
134 #ifdef CONFIG_S3C_DEV_HSMMC
135 static inline void s3c6410_default_sdhci0(void)
136 {
137         s3c_hsmmc0_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
138         s3c_hsmmc0_def_platdata.cfg_gpio = s3c64xx_setup_sdhci0_cfg_gpio;
139         s3c_hsmmc0_def_platdata.cfg_card = s3c6410_setup_sdhci_cfg_card;
140 }
141 #else
142 static inline void s3c6410_default_sdhci0(void) { }
143 #endif /* CONFIG_S3C_DEV_HSMMC */
144
145 #ifdef CONFIG_S3C_DEV_HSMMC1
146 static inline void s3c6410_default_sdhci1(void)
147 {
148         s3c_hsmmc1_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
149         s3c_hsmmc1_def_platdata.cfg_gpio = s3c64xx_setup_sdhci1_cfg_gpio;
150         s3c_hsmmc1_def_platdata.cfg_card = s3c6410_setup_sdhci_cfg_card;
151 }
152 #else
153 static inline void s3c6410_default_sdhci1(void) { }
154 #endif /* CONFIG_S3C_DEV_HSMMC1 */
155
156 #ifdef CONFIG_S3C_DEV_HSMMC2
157 static inline void s3c6410_default_sdhci2(void)
158 {
159         s3c_hsmmc2_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
160         s3c_hsmmc2_def_platdata.cfg_gpio = s3c64xx_setup_sdhci2_cfg_gpio;
161         s3c_hsmmc2_def_platdata.cfg_card = s3c6410_setup_sdhci_cfg_card;
162 }
163 #else
164 static inline void s3c6410_default_sdhci2(void) { }
165 #endif /* CONFIG_S3C_DEV_HSMMC2 */
166
167 #else
168 static inline void s3c6410_default_sdhci0(void) { }
169 static inline void s3c6410_default_sdhci1(void) { }
170 static inline void s3c6410_default_sdhci2(void) { }
171 static inline void s3c6400_default_sdhci0(void) { }
172 static inline void s3c6400_default_sdhci1(void) { }
173 static inline void s3c6400_default_sdhci2(void) { }
174
175 #endif /* CONFIG_S3C64XX_SETUP_SDHCI */
176
177 /* S5PC100 SDHCI setup */
178
179 #ifdef CONFIG_S5PC100_SETUP_SDHCI
180 extern char *s5pc100_hsmmc_clksrcs[4];
181
182 extern void s5pc100_setup_sdhci0_cfg_card(struct platform_device *dev,
183                                            void __iomem *r,
184                                            struct mmc_ios *ios,
185                                            struct mmc_card *card);
186
187 #ifdef CONFIG_S3C_DEV_HSMMC
188 static inline void s5pc100_default_sdhci0(void)
189 {
190         s3c_hsmmc0_def_platdata.clocks = s5pc100_hsmmc_clksrcs;
191         s3c_hsmmc0_def_platdata.cfg_gpio = s5pc100_setup_sdhci0_cfg_gpio;
192         s3c_hsmmc0_def_platdata.cfg_card = s5pc100_setup_sdhci0_cfg_card;
193 }
194 #else
195 static inline void s5pc100_default_sdhci0(void) { }
196 #endif /* CONFIG_S3C_DEV_HSMMC */
197
198 #ifdef CONFIG_S3C_DEV_HSMMC1
199 static inline void s5pc100_default_sdhci1(void)
200 {
201         s3c_hsmmc1_def_platdata.clocks = s5pc100_hsmmc_clksrcs;
202         s3c_hsmmc1_def_platdata.cfg_gpio = s5pc100_setup_sdhci1_cfg_gpio;
203         s3c_hsmmc1_def_platdata.cfg_card = s5pc100_setup_sdhci0_cfg_card;
204 }
205 #else
206 static inline void s5pc100_default_sdhci1(void) { }
207 #endif /* CONFIG_S3C_DEV_HSMMC1 */
208
209 #ifdef CONFIG_S3C_DEV_HSMMC2
210 static inline void s5pc100_default_sdhci2(void)
211 {
212         s3c_hsmmc2_def_platdata.clocks = s5pc100_hsmmc_clksrcs;
213         s3c_hsmmc2_def_platdata.cfg_gpio = s5pc100_setup_sdhci2_cfg_gpio;
214         s3c_hsmmc2_def_platdata.cfg_card = s5pc100_setup_sdhci0_cfg_card;
215 }
216 #else
217 static inline void s5pc100_default_sdhci2(void) { }
218 #endif /* CONFIG_S3C_DEV_HSMMC1 */
219
220
221 #else
222 static inline void s5pc100_default_sdhci0(void) { }
223 static inline void s5pc100_default_sdhci1(void) { }
224 static inline void s5pc100_default_sdhci2(void) { }
225 #endif /* CONFIG_S5PC100_SETUP_SDHCI */
226
227
228 /* S5PC110 SDHCI setup */
229 #ifdef CONFIG_S5PV210_SETUP_SDHCI
230 extern char *s5pv210_hsmmc_clksrcs[4];
231
232 extern void s5pv210_setup_sdhci_cfg_card(struct platform_device *dev,
233                                            void __iomem *r,
234                                            struct mmc_ios *ios,
235                                            struct mmc_card *card);
236
237 #ifdef CONFIG_S3C_DEV_HSMMC
238 static inline void s5pv210_default_sdhci0(void)
239 {
240         s3c_hsmmc0_def_platdata.clocks = s5pv210_hsmmc_clksrcs;
241         s3c_hsmmc0_def_platdata.cfg_gpio = s5pv210_setup_sdhci0_cfg_gpio;
242         s3c_hsmmc0_def_platdata.cfg_card = s5pv210_setup_sdhci_cfg_card;
243 }
244 #else
245 static inline void s5pv210_default_sdhci0(void) { }
246 #endif /* CONFIG_S3C_DEV_HSMMC */
247
248 #ifdef CONFIG_S3C_DEV_HSMMC1
249 static inline void s5pv210_default_sdhci1(void)
250 {
251         s3c_hsmmc1_def_platdata.clocks = s5pv210_hsmmc_clksrcs;
252         s3c_hsmmc1_def_platdata.cfg_gpio = s5pv210_setup_sdhci1_cfg_gpio;
253         s3c_hsmmc1_def_platdata.cfg_card = s5pv210_setup_sdhci_cfg_card;
254 }
255 #else
256 static inline void s5pv210_default_sdhci1(void) { }
257 #endif /* CONFIG_S3C_DEV_HSMMC1 */
258
259 #ifdef CONFIG_S3C_DEV_HSMMC2
260 static inline void s5pv210_default_sdhci2(void)
261 {
262         s3c_hsmmc2_def_platdata.clocks = s5pv210_hsmmc_clksrcs;
263         s3c_hsmmc2_def_platdata.cfg_gpio = s5pv210_setup_sdhci2_cfg_gpio;
264         s3c_hsmmc2_def_platdata.cfg_card = s5pv210_setup_sdhci_cfg_card;
265 }
266 #else
267 static inline void s5pv210_default_sdhci2(void) { }
268 #endif /* CONFIG_S3C_DEV_HSMMC2 */
269
270 #ifdef CONFIG_S3C_DEV_HSMMC3
271 static inline void s5pv210_default_sdhci3(void)
272 {
273         s3c_hsmmc3_def_platdata.clocks = s5pv210_hsmmc_clksrcs;
274         s3c_hsmmc3_def_platdata.cfg_gpio = s5pv210_setup_sdhci3_cfg_gpio;
275         s3c_hsmmc3_def_platdata.cfg_card = s5pv210_setup_sdhci_cfg_card;
276 }
277 #else
278 static inline void s5pv210_default_sdhci3(void) { }
279 #endif /* CONFIG_S3C_DEV_HSMMC3 */
280
281 #else
282 static inline void s5pv210_default_sdhci0(void) { }
283 static inline void s5pv210_default_sdhci1(void) { }
284 static inline void s5pv210_default_sdhci2(void) { }
285 static inline void s5pv210_default_sdhci3(void) { }
286 #endif /* CONFIG_S5PC100_SETUP_SDHCI */
287
288
289
290
291 #endif /* __PLAT_S3C_SDHCI_H */