Ben Dooks | 5cc7fd8 | 2008-10-31 16:14:38 +0000 | [diff] [blame] | 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); |
Ben Dooks | a2205cd | 2008-10-31 16:14:39 +0000 | [diff] [blame] | 59 | extern void s3c_sdhci1_set_platdata(struct s3c_sdhci_platdata *pd); |
Kyungmin Park | 86cd4f5 | 2009-11-17 08:41:23 +0100 | [diff] [blame] | 60 | extern void s3c_sdhci2_set_platdata(struct s3c_sdhci_platdata *pd); |
Ben Dooks | 5cc7fd8 | 2008-10-31 16:14:38 +0000 | [diff] [blame] | 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 | |
Ben Dooks | a2205cd | 2008-10-31 16:14:39 +0000 | [diff] [blame] | 66 | extern struct s3c_sdhci_platdata s3c_hsmmc0_def_platdata; |
| 67 | extern struct s3c_sdhci_platdata s3c_hsmmc1_def_platdata; |
Kyungmin Park | 86cd4f5 | 2009-11-17 08:41:23 +0100 | [diff] [blame] | 68 | extern struct s3c_sdhci_platdata s3c_hsmmc2_def_platdata; |
Ben Dooks | 5cc7fd8 | 2008-10-31 16:14:38 +0000 | [diff] [blame] | 69 | |
| 70 | /* Helper function availablity */ |
| 71 | |
Ben Dooks | 4faf6867 | 2009-03-25 11:01:24 +0000 | [diff] [blame] | 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); |
Kyungmin Park | 86cd4f5 | 2009-11-17 08:41:23 +0100 | [diff] [blame] | 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); |
Maurus Cuelenaere | 92b118f | 2009-11-23 13:34:46 +0100 | [diff] [blame] | 77 | extern void s3c64xx_setup_sdhci2_cfg_gpio(struct platform_device *, int w); |
Marek Szyprowski | e6f66a9 | 2010-05-20 08:13:07 +0200 | [diff] [blame] | 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); |
Hyuk Lee | 976a62f | 2010-06-14 10:18:56 +0900 | [diff] [blame^] | 81 | extern void s5pv210_setup_sdhci3_cfg_gpio(struct platform_device *, int w); |
Ben Dooks | 4faf6867 | 2009-03-25 11:01:24 +0000 | [diff] [blame] | 82 | |
| 83 | /* S3C6400 SDHCI setup */ |
| 84 | |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 85 | #ifdef CONFIG_S3C64XX_SETUP_SDHCI |
| 86 | extern char *s3c64xx_hsmmc_clksrcs[4]; |
Ben Dooks | 4faf6867 | 2009-03-25 11:01:24 +0000 | [diff] [blame] | 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 | { |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 96 | s3c_hsmmc0_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; |
Ben Dooks | 4faf6867 | 2009-03-25 11:01:24 +0000 | [diff] [blame] | 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 | { |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 108 | s3c_hsmmc1_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; |
Ben Dooks | 4faf6867 | 2009-03-25 11:01:24 +0000 | [diff] [blame] | 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 | |
Maurus Cuelenaere | 92b118f | 2009-11-23 13:34:46 +0100 | [diff] [blame] | 116 | #ifdef CONFIG_S3C_DEV_HSMMC2 |
| 117 | static inline void s3c6400_default_sdhci2(void) |
| 118 | { |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 119 | s3c_hsmmc2_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; |
Maurus Cuelenaere | 92b118f | 2009-11-23 13:34:46 +0100 | [diff] [blame] | 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 | |
Ben Dooks | 4faf6867 | 2009-03-25 11:01:24 +0000 | [diff] [blame] | 127 | /* S3C6410 SDHCI setup */ |
| 128 | |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 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); |
Ben Dooks | 5cc7fd8 | 2008-10-31 16:14:38 +0000 | [diff] [blame] | 133 | |
Ben Dooks | 713e9de | 2008-10-31 16:29:19 +0000 | [diff] [blame] | 134 | #ifdef CONFIG_S3C_DEV_HSMMC |
Ben Dooks | 5cc7fd8 | 2008-10-31 16:14:38 +0000 | [diff] [blame] | 135 | static inline void s3c6410_default_sdhci0(void) |
| 136 | { |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 137 | s3c_hsmmc0_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; |
Ben Dooks | 4faf6867 | 2009-03-25 11:01:24 +0000 | [diff] [blame] | 138 | s3c_hsmmc0_def_platdata.cfg_gpio = s3c64xx_setup_sdhci0_cfg_gpio; |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 139 | s3c_hsmmc0_def_platdata.cfg_card = s3c6410_setup_sdhci_cfg_card; |
Ben Dooks | 5cc7fd8 | 2008-10-31 16:14:38 +0000 | [diff] [blame] | 140 | } |
Ben Dooks | 713e9de | 2008-10-31 16:29:19 +0000 | [diff] [blame] | 141 | #else |
| 142 | static inline void s3c6410_default_sdhci0(void) { } |
| 143 | #endif /* CONFIG_S3C_DEV_HSMMC */ |
Ben Dooks | a2205cd | 2008-10-31 16:14:39 +0000 | [diff] [blame] | 144 | |
Ben Dooks | 713e9de | 2008-10-31 16:29:19 +0000 | [diff] [blame] | 145 | #ifdef CONFIG_S3C_DEV_HSMMC1 |
Ben Dooks | a2205cd | 2008-10-31 16:14:39 +0000 | [diff] [blame] | 146 | static inline void s3c6410_default_sdhci1(void) |
| 147 | { |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 148 | s3c_hsmmc1_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; |
Ben Dooks | 4faf6867 | 2009-03-25 11:01:24 +0000 | [diff] [blame] | 149 | s3c_hsmmc1_def_platdata.cfg_gpio = s3c64xx_setup_sdhci1_cfg_gpio; |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 150 | s3c_hsmmc1_def_platdata.cfg_card = s3c6410_setup_sdhci_cfg_card; |
Ben Dooks | a2205cd | 2008-10-31 16:14:39 +0000 | [diff] [blame] | 151 | } |
Ben Dooks | 5cc7fd8 | 2008-10-31 16:14:38 +0000 | [diff] [blame] | 152 | #else |
Ben Dooks | 713e9de | 2008-10-31 16:29:19 +0000 | [diff] [blame] | 153 | static inline void s3c6410_default_sdhci1(void) { } |
| 154 | #endif /* CONFIG_S3C_DEV_HSMMC1 */ |
| 155 | |
Maurus Cuelenaere | 92b118f | 2009-11-23 13:34:46 +0100 | [diff] [blame] | 156 | #ifdef CONFIG_S3C_DEV_HSMMC2 |
| 157 | static inline void s3c6410_default_sdhci2(void) |
| 158 | { |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 159 | s3c_hsmmc2_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; |
Maurus Cuelenaere | 92b118f | 2009-11-23 13:34:46 +0100 | [diff] [blame] | 160 | s3c_hsmmc2_def_platdata.cfg_gpio = s3c64xx_setup_sdhci2_cfg_gpio; |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 161 | s3c_hsmmc2_def_platdata.cfg_card = s3c6410_setup_sdhci_cfg_card; |
Maurus Cuelenaere | 92b118f | 2009-11-23 13:34:46 +0100 | [diff] [blame] | 162 | } |
| 163 | #else |
| 164 | static inline void s3c6410_default_sdhci2(void) { } |
| 165 | #endif /* CONFIG_S3C_DEV_HSMMC2 */ |
| 166 | |
Ben Dooks | 713e9de | 2008-10-31 16:29:19 +0000 | [diff] [blame] | 167 | #else |
Ben Dooks | 5cc7fd8 | 2008-10-31 16:14:38 +0000 | [diff] [blame] | 168 | static inline void s3c6410_default_sdhci0(void) { } |
Ben Dooks | a2205cd | 2008-10-31 16:14:39 +0000 | [diff] [blame] | 169 | static inline void s3c6410_default_sdhci1(void) { } |
Marek Szyprowski | 6b34f49 | 2010-06-22 15:45:26 +0900 | [diff] [blame] | 170 | static inline void s3c6410_default_sdhci2(void) { } |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 171 | static inline void s3c6400_default_sdhci0(void) { } |
| 172 | static inline void s3c6400_default_sdhci1(void) { } |
Marek Szyprowski | 6b34f49 | 2010-06-22 15:45:26 +0900 | [diff] [blame] | 173 | static inline void s3c6400_default_sdhci2(void) { } |
Ben Dooks | 2f6c2ac | 2010-01-26 10:38:52 +0900 | [diff] [blame] | 174 | |
| 175 | #endif /* CONFIG_S3C64XX_SETUP_SDHCI */ |
Ben Dooks | 5cc7fd8 | 2008-10-31 16:14:38 +0000 | [diff] [blame] | 176 | |
Kyungmin Park | 86cd4f5 | 2009-11-17 08:41:23 +0100 | [diff] [blame] | 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 | |
Marek Szyprowski | e6f66a9 | 2010-05-20 08:13:07 +0200 | [diff] [blame] | 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 |
Hyuk Lee | f50b8bc | 2010-06-10 12:40:39 +0900 | [diff] [blame] | 245 | static inline void s5pv210_default_sdhci0(void) { } |
Marek Szyprowski | e6f66a9 | 2010-05-20 08:13:07 +0200 | [diff] [blame] | 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 | |
Hyuk Lee | 976a62f | 2010-06-14 10:18:56 +0900 | [diff] [blame^] | 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 | |
Marek Szyprowski | e6f66a9 | 2010-05-20 08:13:07 +0200 | [diff] [blame] | 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) { } |
Hyuk Lee | 976a62f | 2010-06-14 10:18:56 +0900 | [diff] [blame^] | 285 | static inline void s5pv210_default_sdhci3(void) { } |
Marek Szyprowski | e6f66a9 | 2010-05-20 08:13:07 +0200 | [diff] [blame] | 286 | #endif /* CONFIG_S5PC100_SETUP_SDHCI */ |
| 287 | |
| 288 | |
| 289 | |
| 290 | |
Ben Dooks | 5cc7fd8 | 2008-10-31 16:14:38 +0000 | [diff] [blame] | 291 | #endif /* __PLAT_S3C_SDHCI_H */ |