blob: b0bdf16549d541e4cedb6bdc5527c11542b9cbd1 [file] [log] [blame]
Kukjin Kim3db3ae52011-02-14 16:22:36 +09001/* linux/arch/arm/plat-samsung/include/plat/sdhci.h
2 *
3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com
Ben Dooks5cc7fd82008-10-31 16:14:38 +00005 *
6 * Copyright 2008 Openmoko, Inc.
7 * Copyright 2008 Simtec Electronics
8 * http://armlinux.simtec.co.uk/
9 * Ben Dooks <ben@simtec.co.uk>
10 *
11 * S3C Platform - SDHCI (HSMMC) platform data definitions
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#ifndef __PLAT_S3C_SDHCI_H
19#define __PLAT_S3C_SDHCI_H __FILE__
20
21struct platform_device;
22struct mmc_host;
23struct mmc_card;
24struct mmc_ios;
25
Marek Szyprowski19206b12010-07-23 09:27:18 +090026enum cd_types {
27 S3C_SDHCI_CD_INTERNAL, /* use mmc internal CD line */
28 S3C_SDHCI_CD_EXTERNAL, /* use external callback */
29 S3C_SDHCI_CD_GPIO, /* use external gpio pin for CD line */
30 S3C_SDHCI_CD_NONE, /* no CD line, use polling to detect card */
31 S3C_SDHCI_CD_PERMANENT, /* no CD line, card permanently wired to host */
32};
33
Jeongbae Seo28c80aa2010-10-08 18:03:27 +090034enum clk_types {
35 S3C_SDHCI_CLK_DIV_INTERNAL, /* use mmc internal clock divider */
36 S3C_SDHCI_CLK_DIV_EXTERNAL, /* use external clock divider */
37};
38
Ben Dooks5cc7fd82008-10-31 16:14:38 +000039/**
40 * struct s3c_sdhci_platdata() - Platform device data for Samsung SDHCI
41 * @max_width: The maximum number of data bits supported.
42 * @host_caps: Standard MMC host capabilities bit field.
Marek Szyprowski19206b12010-07-23 09:27:18 +090043 * @cd_type: Type of Card Detection method (see cd_types enum above)
Jeongbae Seo28c80aa2010-10-08 18:03:27 +090044 * @clk_type: Type of clock divider method (see clk_types enum above)
Marek Szyprowski19206b12010-07-23 09:27:18 +090045 * @ext_cd_init: Initialize external card detect subsystem. Called on
46 * sdhci-s3c driver probe when cd_type == S3C_SDHCI_CD_EXTERNAL.
47 * notify_func argument is a callback to the sdhci-s3c driver
48 * that triggers the card detection event. Callback arguments:
49 * dev is pointer to platform device of the host controller,
50 * state is new state of the card (0 - removed, 1 - inserted).
51 * @ext_cd_cleanup: Cleanup external card detect subsystem. Called on
52 * sdhci-s3c driver remove when cd_type == S3C_SDHCI_CD_EXTERNAL.
53 * notify_func argument is the same callback as for ext_cd_init.
54 * @ext_cd_gpio: gpio pin used for external CD line, valid only if
55 * cd_type == S3C_SDHCI_CD_GPIO
56 * @ext_cd_gpio_invert: invert values for external CD gpio line
Ben Dooks5cc7fd82008-10-31 16:14:38 +000057 * @cfg_gpio: Configure the GPIO for a specific card bit-width
58 * @cfg_card: Configure the interface for a specific card and speed. This
59 * is necessary the controllers and/or GPIO blocks require the
60 * changing of driver-strength and other controls dependant on
61 * the card and speed of operation.
62 *
63 * Initialisation data specific to either the machine or the platform
64 * for the device driver to use or call-back when configuring gpio or
65 * card speed information.
66*/
67struct s3c_sdhci_platdata {
68 unsigned int max_width;
69 unsigned int host_caps;
Marek Szyprowski19206b12010-07-23 09:27:18 +090070 enum cd_types cd_type;
Jeongbae Seo28c80aa2010-10-08 18:03:27 +090071 enum clk_types clk_type;
Ben Dooks5cc7fd82008-10-31 16:14:38 +000072
73 char **clocks; /* set of clock sources */
74
Marek Szyprowski19206b12010-07-23 09:27:18 +090075 int ext_cd_gpio;
76 bool ext_cd_gpio_invert;
77 int (*ext_cd_init)(void (*notify_func)(struct platform_device *,
78 int state));
79 int (*ext_cd_cleanup)(void (*notify_func)(struct platform_device *,
80 int state));
81
Ben Dooks5cc7fd82008-10-31 16:14:38 +000082 void (*cfg_gpio)(struct platform_device *dev, int width);
83 void (*cfg_card)(struct platform_device *dev,
84 void __iomem *regbase,
85 struct mmc_ios *ios,
86 struct mmc_card *card);
87};
88
89/**
90 * s3c_sdhci0_set_platdata - Set platform data for S3C SDHCI device.
91 * @pd: Platform data to register to device.
92 *
93 * Register the given platform data for use withe S3C SDHCI device.
94 * The call will copy the platform data, so the board definitions can
95 * make the structure itself __initdata.
96 */
97extern void s3c_sdhci0_set_platdata(struct s3c_sdhci_platdata *pd);
Ben Dooksa2205cd2008-10-31 16:14:39 +000098extern void s3c_sdhci1_set_platdata(struct s3c_sdhci_platdata *pd);
Kyungmin Park86cd4f52009-11-17 08:41:23 +010099extern void s3c_sdhci2_set_platdata(struct s3c_sdhci_platdata *pd);
Hyuk Leeb3c674b2010-06-10 15:22:16 +0900100extern void s3c_sdhci3_set_platdata(struct s3c_sdhci_platdata *pd);
Ben Dooks5cc7fd82008-10-31 16:14:38 +0000101
102/* Default platform data, exported so that per-cpu initialisation can
103 * set the correct one when there are more than one cpu type selected.
104*/
105
Ben Dooksa2205cd2008-10-31 16:14:39 +0000106extern struct s3c_sdhci_platdata s3c_hsmmc0_def_platdata;
107extern struct s3c_sdhci_platdata s3c_hsmmc1_def_platdata;
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100108extern struct s3c_sdhci_platdata s3c_hsmmc2_def_platdata;
Hyuk Leeb3c674b2010-06-10 15:22:16 +0900109extern struct s3c_sdhci_platdata s3c_hsmmc3_def_platdata;
Ben Dooks5cc7fd82008-10-31 16:14:38 +0000110
111/* Helper function availablity */
112
Yauhen Kharuzhyc29cfa62010-12-17 14:42:09 +0900113extern void s3c2416_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
114extern void s3c2416_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
Ben Dooks4faf68672009-03-25 11:01:24 +0000115extern void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
116extern void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100117extern void s5pc100_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
118extern void s5pc100_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
119extern void s5pc100_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
Maurus Cuelenaere92b118f2009-11-23 13:34:46 +0100120extern void s3c64xx_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200121extern void s5pv210_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
122extern void s5pv210_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
123extern void s5pv210_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
Hyuk Lee976a62f2010-06-14 10:18:56 +0900124extern void s5pv210_setup_sdhci3_cfg_gpio(struct platform_device *, int w);
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900125extern void exynos4_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
126extern void exynos4_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
127extern void exynos4_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
128extern void exynos4_setup_sdhci3_cfg_gpio(struct platform_device *, int w);
Ben Dooks4faf68672009-03-25 11:01:24 +0000129
Yauhen Kharuzhyc29cfa62010-12-17 14:42:09 +0900130/* S3C2416 SDHCI setup */
131
132#ifdef CONFIG_S3C2416_SETUP_SDHCI
133extern char *s3c2416_hsmmc_clksrcs[4];
134
135extern void s3c2416_setup_sdhci_cfg_card(struct platform_device *dev,
136 void __iomem *r,
137 struct mmc_ios *ios,
138 struct mmc_card *card);
139
140static inline void s3c2416_default_sdhci0(void)
141{
142#ifdef CONFIG_S3C_DEV_HSMMC
143 s3c_hsmmc0_def_platdata.clocks = s3c2416_hsmmc_clksrcs;
144 s3c_hsmmc0_def_platdata.cfg_gpio = s3c2416_setup_sdhci0_cfg_gpio;
145 s3c_hsmmc0_def_platdata.cfg_card = s3c2416_setup_sdhci_cfg_card;
146#endif /* CONFIG_S3C_DEV_HSMMC */
147}
148
149static inline void s3c2416_default_sdhci1(void)
150{
151#ifdef CONFIG_S3C_DEV_HSMMC1
152 s3c_hsmmc1_def_platdata.clocks = s3c2416_hsmmc_clksrcs;
153 s3c_hsmmc1_def_platdata.cfg_gpio = s3c2416_setup_sdhci1_cfg_gpio;
154 s3c_hsmmc1_def_platdata.cfg_card = s3c2416_setup_sdhci_cfg_card;
155#endif /* CONFIG_S3C_DEV_HSMMC1 */
156}
157
158#else
159static inline void s3c2416_default_sdhci0(void) { }
160static inline void s3c2416_default_sdhci1(void) { }
161
162#endif /* CONFIG_S3C2416_SETUP_SDHCI */
Kukjin Kim88eb7152010-07-29 22:18:45 +0900163/* S3C64XX SDHCI setup */
Ben Dooks4faf68672009-03-25 11:01:24 +0000164
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900165#ifdef CONFIG_S3C64XX_SETUP_SDHCI
166extern char *s3c64xx_hsmmc_clksrcs[4];
Ben Dooks4faf68672009-03-25 11:01:24 +0000167
Ben Dooks4faf68672009-03-25 11:01:24 +0000168extern void s3c6400_setup_sdhci_cfg_card(struct platform_device *dev,
169 void __iomem *r,
170 struct mmc_ios *ios,
171 struct mmc_card *card);
172
173static inline void s3c6400_default_sdhci0(void)
174{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900175#ifdef CONFIG_S3C_DEV_HSMMC
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900176 s3c_hsmmc0_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
Ben Dooks4faf68672009-03-25 11:01:24 +0000177 s3c_hsmmc0_def_platdata.cfg_gpio = s3c64xx_setup_sdhci0_cfg_gpio;
178 s3c_hsmmc0_def_platdata.cfg_card = s3c6400_setup_sdhci_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900179#endif
Ben Dooks4faf68672009-03-25 11:01:24 +0000180}
181
Ben Dooks4faf68672009-03-25 11:01:24 +0000182static inline void s3c6400_default_sdhci1(void)
183{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900184#ifdef CONFIG_S3C_DEV_HSMMC1
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900185 s3c_hsmmc1_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
Ben Dooks4faf68672009-03-25 11:01:24 +0000186 s3c_hsmmc1_def_platdata.cfg_gpio = s3c64xx_setup_sdhci1_cfg_gpio;
187 s3c_hsmmc1_def_platdata.cfg_card = s3c6400_setup_sdhci_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900188#endif
Ben Dooks4faf68672009-03-25 11:01:24 +0000189}
Ben Dooks4faf68672009-03-25 11:01:24 +0000190
Maurus Cuelenaere92b118f2009-11-23 13:34:46 +0100191static inline void s3c6400_default_sdhci2(void)
192{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900193#ifdef CONFIG_S3C_DEV_HSMMC2
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900194 s3c_hsmmc2_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
Maurus Cuelenaere92b118f2009-11-23 13:34:46 +0100195 s3c_hsmmc2_def_platdata.cfg_gpio = s3c64xx_setup_sdhci2_cfg_gpio;
196 s3c_hsmmc2_def_platdata.cfg_card = s3c6400_setup_sdhci_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900197#endif
Maurus Cuelenaere92b118f2009-11-23 13:34:46 +0100198}
Ben Dooks4faf68672009-03-25 11:01:24 +0000199
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900200extern void s3c6410_setup_sdhci_cfg_card(struct platform_device *dev,
201 void __iomem *r,
202 struct mmc_ios *ios,
203 struct mmc_card *card);
Ben Dooks5cc7fd82008-10-31 16:14:38 +0000204
205static inline void s3c6410_default_sdhci0(void)
206{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900207#ifdef CONFIG_S3C_DEV_HSMMC
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900208 s3c_hsmmc0_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
Ben Dooks4faf68672009-03-25 11:01:24 +0000209 s3c_hsmmc0_def_platdata.cfg_gpio = s3c64xx_setup_sdhci0_cfg_gpio;
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900210 s3c_hsmmc0_def_platdata.cfg_card = s3c6410_setup_sdhci_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900211#endif
Ben Dooks5cc7fd82008-10-31 16:14:38 +0000212}
Ben Dooksa2205cd2008-10-31 16:14:39 +0000213
214static inline void s3c6410_default_sdhci1(void)
215{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900216#ifdef CONFIG_S3C_DEV_HSMMC1
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900217 s3c_hsmmc1_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
Ben Dooks4faf68672009-03-25 11:01:24 +0000218 s3c_hsmmc1_def_platdata.cfg_gpio = s3c64xx_setup_sdhci1_cfg_gpio;
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900219 s3c_hsmmc1_def_platdata.cfg_card = s3c6410_setup_sdhci_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900220#endif
Ben Dooksa2205cd2008-10-31 16:14:39 +0000221}
Ben Dooks713e9de2008-10-31 16:29:19 +0000222
Maurus Cuelenaere92b118f2009-11-23 13:34:46 +0100223static inline void s3c6410_default_sdhci2(void)
224{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900225#ifdef CONFIG_S3C_DEV_HSMMC2
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900226 s3c_hsmmc2_def_platdata.clocks = s3c64xx_hsmmc_clksrcs;
Maurus Cuelenaere92b118f2009-11-23 13:34:46 +0100227 s3c_hsmmc2_def_platdata.cfg_gpio = s3c64xx_setup_sdhci2_cfg_gpio;
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900228 s3c_hsmmc2_def_platdata.cfg_card = s3c6410_setup_sdhci_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900229#endif
Maurus Cuelenaere92b118f2009-11-23 13:34:46 +0100230}
Maurus Cuelenaere92b118f2009-11-23 13:34:46 +0100231
Ben Dooks713e9de2008-10-31 16:29:19 +0000232#else
Ben Dooks5cc7fd82008-10-31 16:14:38 +0000233static inline void s3c6410_default_sdhci0(void) { }
Ben Dooksa2205cd2008-10-31 16:14:39 +0000234static inline void s3c6410_default_sdhci1(void) { }
Marek Szyprowski6b34f492010-06-22 15:45:26 +0900235static inline void s3c6410_default_sdhci2(void) { }
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900236static inline void s3c6400_default_sdhci0(void) { }
237static inline void s3c6400_default_sdhci1(void) { }
Marek Szyprowski6b34f492010-06-22 15:45:26 +0900238static inline void s3c6400_default_sdhci2(void) { }
Ben Dooks2f6c2ac2010-01-26 10:38:52 +0900239
240#endif /* CONFIG_S3C64XX_SETUP_SDHCI */
Ben Dooks5cc7fd82008-10-31 16:14:38 +0000241
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100242/* S5PC100 SDHCI setup */
243
244#ifdef CONFIG_S5PC100_SETUP_SDHCI
245extern char *s5pc100_hsmmc_clksrcs[4];
246
247extern void s5pc100_setup_sdhci0_cfg_card(struct platform_device *dev,
248 void __iomem *r,
249 struct mmc_ios *ios,
250 struct mmc_card *card);
251
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100252static inline void s5pc100_default_sdhci0(void)
253{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900254#ifdef CONFIG_S3C_DEV_HSMMC
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100255 s3c_hsmmc0_def_platdata.clocks = s5pc100_hsmmc_clksrcs;
256 s3c_hsmmc0_def_platdata.cfg_gpio = s5pc100_setup_sdhci0_cfg_gpio;
257 s3c_hsmmc0_def_platdata.cfg_card = s5pc100_setup_sdhci0_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900258#endif
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100259}
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100260
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100261static inline void s5pc100_default_sdhci1(void)
262{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900263#ifdef CONFIG_S3C_DEV_HSMMC1
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100264 s3c_hsmmc1_def_platdata.clocks = s5pc100_hsmmc_clksrcs;
265 s3c_hsmmc1_def_platdata.cfg_gpio = s5pc100_setup_sdhci1_cfg_gpio;
266 s3c_hsmmc1_def_platdata.cfg_card = s5pc100_setup_sdhci0_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900267#endif
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100268}
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100269
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100270static inline void s5pc100_default_sdhci2(void)
271{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900272#ifdef CONFIG_S3C_DEV_HSMMC2
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100273 s3c_hsmmc2_def_platdata.clocks = s5pc100_hsmmc_clksrcs;
274 s3c_hsmmc2_def_platdata.cfg_gpio = s5pc100_setup_sdhci2_cfg_gpio;
275 s3c_hsmmc2_def_platdata.cfg_card = s5pc100_setup_sdhci0_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900276#endif
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100277}
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100278
279#else
280static inline void s5pc100_default_sdhci0(void) { }
281static inline void s5pc100_default_sdhci1(void) { }
282static inline void s5pc100_default_sdhci2(void) { }
Kukjin Kim88eb7152010-07-29 22:18:45 +0900283
Kyungmin Park86cd4f52009-11-17 08:41:23 +0100284#endif /* CONFIG_S5PC100_SETUP_SDHCI */
285
Kukjin Kim88eb7152010-07-29 22:18:45 +0900286/* S5PV210 SDHCI setup */
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200287
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200288#ifdef CONFIG_S5PV210_SETUP_SDHCI
289extern char *s5pv210_hsmmc_clksrcs[4];
290
291extern void s5pv210_setup_sdhci_cfg_card(struct platform_device *dev,
292 void __iomem *r,
293 struct mmc_ios *ios,
294 struct mmc_card *card);
295
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200296static inline void s5pv210_default_sdhci0(void)
297{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900298#ifdef CONFIG_S3C_DEV_HSMMC
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200299 s3c_hsmmc0_def_platdata.clocks = s5pv210_hsmmc_clksrcs;
300 s3c_hsmmc0_def_platdata.cfg_gpio = s5pv210_setup_sdhci0_cfg_gpio;
301 s3c_hsmmc0_def_platdata.cfg_card = s5pv210_setup_sdhci_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900302#endif
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200303}
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200304
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200305static inline void s5pv210_default_sdhci1(void)
306{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900307#ifdef CONFIG_S3C_DEV_HSMMC1
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200308 s3c_hsmmc1_def_platdata.clocks = s5pv210_hsmmc_clksrcs;
309 s3c_hsmmc1_def_platdata.cfg_gpio = s5pv210_setup_sdhci1_cfg_gpio;
310 s3c_hsmmc1_def_platdata.cfg_card = s5pv210_setup_sdhci_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900311#endif
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200312}
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200313
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200314static inline void s5pv210_default_sdhci2(void)
315{
Kukjin Kim88eb7152010-07-29 22:18:45 +0900316#ifdef CONFIG_S3C_DEV_HSMMC2
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200317 s3c_hsmmc2_def_platdata.clocks = s5pv210_hsmmc_clksrcs;
318 s3c_hsmmc2_def_platdata.cfg_gpio = s5pv210_setup_sdhci2_cfg_gpio;
319 s3c_hsmmc2_def_platdata.cfg_card = s5pv210_setup_sdhci_cfg_card;
Kukjin Kim88eb7152010-07-29 22:18:45 +0900320#endif
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200321}
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200322
Hyuk Lee976a62f2010-06-14 10:18:56 +0900323static inline void s5pv210_default_sdhci3(void)
324{
Kukjin Kimd61bd772010-08-06 21:49:18 +0900325#ifdef CONFIG_S3C_DEV_HSMMC3
Hyuk Lee976a62f2010-06-14 10:18:56 +0900326 s3c_hsmmc3_def_platdata.clocks = s5pv210_hsmmc_clksrcs;
327 s3c_hsmmc3_def_platdata.cfg_gpio = s5pv210_setup_sdhci3_cfg_gpio;
328 s3c_hsmmc3_def_platdata.cfg_card = s5pv210_setup_sdhci_cfg_card;
Kukjin Kimd61bd772010-08-06 21:49:18 +0900329#endif
Hyuk Lee976a62f2010-06-14 10:18:56 +0900330}
Hyuk Lee976a62f2010-06-14 10:18:56 +0900331
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200332#else
333static inline void s5pv210_default_sdhci0(void) { }
334static inline void s5pv210_default_sdhci1(void) { }
335static inline void s5pv210_default_sdhci2(void) { }
Hyuk Lee976a62f2010-06-14 10:18:56 +0900336static inline void s5pv210_default_sdhci3(void) { }
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200337
Kukjin Kim88eb7152010-07-29 22:18:45 +0900338#endif /* CONFIG_S5PV210_SETUP_SDHCI */
Marek Szyprowskie6f66a92010-05-20 08:13:07 +0200339
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900340/* EXYNOS4 SDHCI setup */
341#ifdef CONFIG_EXYNOS4_SETUP_SDHCI
342extern char *exynos4_hsmmc_clksrcs[4];
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900343
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900344extern void exynos4_setup_sdhci_cfg_card(struct platform_device *dev,
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900345 void __iomem *r,
346 struct mmc_ios *ios,
347 struct mmc_card *card);
348
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900349static inline void exynos4_default_sdhci0(void)
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900350{
351#ifdef CONFIG_S3C_DEV_HSMMC
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900352 s3c_hsmmc0_def_platdata.clocks = exynos4_hsmmc_clksrcs;
353 s3c_hsmmc0_def_platdata.cfg_gpio = exynos4_setup_sdhci0_cfg_gpio;
354 s3c_hsmmc0_def_platdata.cfg_card = exynos4_setup_sdhci_cfg_card;
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900355#endif
356}
357
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900358static inline void exynos4_default_sdhci1(void)
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900359{
360#ifdef CONFIG_S3C_DEV_HSMMC1
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900361 s3c_hsmmc1_def_platdata.clocks = exynos4_hsmmc_clksrcs;
362 s3c_hsmmc1_def_platdata.cfg_gpio = exynos4_setup_sdhci1_cfg_gpio;
363 s3c_hsmmc1_def_platdata.cfg_card = exynos4_setup_sdhci_cfg_card;
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900364#endif
365}
366
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900367static inline void exynos4_default_sdhci2(void)
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900368{
369#ifdef CONFIG_S3C_DEV_HSMMC2
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900370 s3c_hsmmc2_def_platdata.clocks = exynos4_hsmmc_clksrcs;
371 s3c_hsmmc2_def_platdata.cfg_gpio = exynos4_setup_sdhci2_cfg_gpio;
372 s3c_hsmmc2_def_platdata.cfg_card = exynos4_setup_sdhci_cfg_card;
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900373#endif
374}
375
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900376static inline void exynos4_default_sdhci3(void)
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900377{
378#ifdef CONFIG_S3C_DEV_HSMMC3
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900379 s3c_hsmmc3_def_platdata.clocks = exynos4_hsmmc_clksrcs;
380 s3c_hsmmc3_def_platdata.cfg_gpio = exynos4_setup_sdhci3_cfg_gpio;
381 s3c_hsmmc3_def_platdata.cfg_card = exynos4_setup_sdhci_cfg_card;
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900382#endif
383}
384
385#else
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900386static inline void exynos4_default_sdhci0(void) { }
387static inline void exynos4_default_sdhci1(void) { }
388static inline void exynos4_default_sdhci2(void) { }
389static inline void exynos4_default_sdhci3(void) { }
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900390
Kukjin Kim3db3ae52011-02-14 16:22:36 +0900391#endif /* CONFIG_EXYNOS4_SETUP_SDHCI */
Hyuk Lee1036c3a2010-10-05 19:07:41 +0900392
Ben Dooks5cc7fd82008-10-31 16:14:38 +0000393#endif /* __PLAT_S3C_SDHCI_H */