diff options
| -rw-r--r-- | arch/arm/mach-s3c6410/Kconfig | 17 | ||||
| -rw-r--r-- | arch/arm/mach-s3c6410/mach-smdk6410.c | 131 |
2 files changed, 148 insertions, 0 deletions
diff --git a/arch/arm/mach-s3c6410/Kconfig b/arch/arm/mach-s3c6410/Kconfig index 1d5010070027..ffa4974efddf 100644 --- a/arch/arm/mach-s3c6410/Kconfig +++ b/arch/arm/mach-s3c6410/Kconfig | |||
| @@ -60,3 +60,20 @@ config SMDK6410_SD_CH1 | |||
| 60 | channels 0 and 1 are the same. | 60 | channels 0 and 1 are the same. |
| 61 | 61 | ||
| 62 | endchoice | 62 | endchoice |
| 63 | |||
| 64 | config SMDK6410_WM1190_EV1 | ||
| 65 | bool "Support Wolfson Microelectronics 1190-EV1 PMIC card" | ||
| 66 | depends on MACH_SMDK6410 | ||
| 67 | select REGULATOR | ||
| 68 | select REGULATOR_WM8350 | ||
| 69 | select MFD_WM8350_I2C | ||
| 70 | select MFD_WM8350_CONFIG_MODE_0 | ||
| 71 | select MFD_WM8350_CONFIG_MODE_3 | ||
| 72 | select MFD_WM8352_CONFIG_MODE_0 | ||
| 73 | help | ||
| 74 | The Wolfson Microelectronics 1190-EV1 is a WM835x based PMIC | ||
| 75 | and audio daughtercard for the Samsung SMDK6410 reference | ||
| 76 | platform. Enabling this option will build support for this | ||
| 77 | module into the kernel. The presence of the module will be | ||
| 78 | detected at runtime so the the resulting kernel can be used | ||
| 79 | with or without the 1190-EV1 fitted. | ||
diff --git a/arch/arm/mach-s3c6410/mach-smdk6410.c b/arch/arm/mach-s3c6410/mach-smdk6410.c index dfd84d00f8d0..466dee0954f4 100644 --- a/arch/arm/mach-s3c6410/mach-smdk6410.c +++ b/arch/arm/mach-s3c6410/mach-smdk6410.c | |||
| @@ -26,6 +26,11 @@ | |||
| 26 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
| 27 | #include <linux/smsc911x.h> | 27 | #include <linux/smsc911x.h> |
| 28 | 28 | ||
| 29 | #ifdef CONFIG_SMDK6410_WM1190_EV1 | ||
| 30 | #include <linux/mfd/wm8350/core.h> | ||
| 31 | #include <linux/mfd/wm8350/pmic.h> | ||
| 32 | #endif | ||
| 33 | |||
| 29 | #include <video/platform_lcd.h> | 34 | #include <video/platform_lcd.h> |
| 30 | 35 | ||
| 31 | #include <asm/mach/arch.h> | 36 | #include <asm/mach/arch.h> |
| @@ -182,9 +187,135 @@ static struct platform_device *smdk6410_devices[] __initdata = { | |||
| 182 | &smdk6410_smsc911x, | 187 | &smdk6410_smsc911x, |
| 183 | }; | 188 | }; |
| 184 | 189 | ||
| 190 | #ifdef CONFIG_SMDK6410_WM1190_EV1 | ||
| 191 | /* S3C64xx internal logic & PLL */ | ||
| 192 | static struct regulator_init_data wm8350_dcdc1_data = { | ||
| 193 | .constraints = { | ||
| 194 | .name = "PVDD_INT/PVDD_PLL", | ||
| 195 | .min_uV = 1200000, | ||
| 196 | .max_uV = 1200000, | ||
| 197 | .always_on = 1, | ||
| 198 | .apply_uV = 1, | ||
| 199 | }, | ||
| 200 | }; | ||
| 201 | |||
| 202 | /* Memory */ | ||
| 203 | static struct regulator_init_data wm8350_dcdc3_data = { | ||
| 204 | .constraints = { | ||
| 205 | .name = "PVDD_MEM", | ||
| 206 | .min_uV = 1800000, | ||
| 207 | .max_uV = 1800000, | ||
| 208 | .always_on = 1, | ||
| 209 | .state_mem = { | ||
| 210 | .uV = 1800000, | ||
| 211 | .mode = REGULATOR_MODE_NORMAL, | ||
| 212 | .enabled = 1, | ||
| 213 | }, | ||
| 214 | .initial_state = PM_SUSPEND_MEM, | ||
| 215 | }, | ||
| 216 | }; | ||
| 217 | |||
| 218 | /* USB, EXT, PCM, ADC/DAC, USB, MMC */ | ||
| 219 | static struct regulator_init_data wm8350_dcdc4_data = { | ||
| 220 | .constraints = { | ||
| 221 | .name = "PVDD_HI/PVDD_EXT/PVDD_SYS/PVCCM2MTV", | ||
| 222 | .min_uV = 3000000, | ||
| 223 | .max_uV = 3000000, | ||
| 224 | .always_on = 1, | ||
| 225 | }, | ||
| 226 | }; | ||
| 227 | |||
| 228 | /* ARM core */ | ||
| 229 | static struct regulator_init_data wm8350_dcdc6_data = { | ||
| 230 | .constraints = { | ||
| 231 | .name = "PVDD_ARM", | ||
| 232 | .min_uV = 1000000, | ||
| 233 | .max_uV = 1300000, | ||
| 234 | .always_on = 1, | ||
| 235 | }, | ||
| 236 | }; | ||
| 237 | |||
| 238 | /* Alive */ | ||
| 239 | static struct regulator_init_data wm8350_ldo1_data = { | ||
| 240 | .constraints = { | ||
| 241 | .name = "PVDD_ALIVE", | ||
| 242 | .min_uV = 1200000, | ||
| 243 | .max_uV = 1200000, | ||
| 244 | .always_on = 1, | ||
| 245 | .apply_uV = 1, | ||
| 246 | }, | ||
| 247 | }; | ||
| 248 | |||
| 249 | /* OTG */ | ||
| 250 | static struct regulator_init_data wm8350_ldo2_data = { | ||
| 251 | .constraints = { | ||
| 252 | .name = "PVDD_OTG", | ||
| 253 | .min_uV = 3300000, | ||
| 254 | .max_uV = 3300000, | ||
| 255 | }, | ||
| 256 | }; | ||
| 257 | |||
| 258 | /* LCD */ | ||
| 259 | static struct regulator_init_data wm8350_ldo3_data = { | ||
| 260 | .constraints = { | ||
| 261 | .name = "PVDD_LCD", | ||
| 262 | .min_uV = 3000000, | ||
| 263 | .max_uV = 3000000, | ||
| 264 | }, | ||
| 265 | }; | ||
| 266 | |||
| 267 | /* OTGi/1190-EV1 HPVDD & AVDD */ | ||
| 268 | static struct regulator_init_data wm8350_ldo4_data = { | ||
| 269 | .constraints = { | ||
| 270 | .name = "PVDD_OTGI/HPVDD/AVDD", | ||
| 271 | .min_uV = 1200000, | ||
| 272 | .max_uV = 1200000, | ||
| 273 | .apply_uV = 1, | ||
| 274 | }, | ||
| 275 | }; | ||
| 276 | |||
| 277 | static struct { | ||
| 278 | int regulator; | ||
| 279 | struct regulator_init_data *initdata; | ||
| 280 | } wm1190_regulators[] = { | ||
| 281 | { WM8350_DCDC_1, &wm8350_dcdc1_data }, | ||
| 282 | { WM8350_DCDC_3, &wm8350_dcdc3_data }, | ||
| 283 | { WM8350_DCDC_4, &wm8350_dcdc4_data }, | ||
| 284 | { WM8350_DCDC_6, &wm8350_dcdc6_data }, | ||
| 285 | { WM8350_LDO_1, &wm8350_ldo1_data }, | ||
| 286 | { WM8350_LDO_2, &wm8350_ldo2_data }, | ||
| 287 | { WM8350_LDO_3, &wm8350_ldo3_data }, | ||
| 288 | { WM8350_LDO_4, &wm8350_ldo4_data }, | ||
| 289 | }; | ||
| 290 | |||
| 291 | static int __init smdk6410_wm8350_init(struct wm8350 *wm8350) | ||
| 292 | { | ||
| 293 | int i; | ||
| 294 | |||
| 295 | /* Instantiate the regulators */ | ||
| 296 | for (i = 0; i < ARRAY_SIZE(wm1190_regulators); i++) | ||
| 297 | wm8350_register_regulator(wm8350, | ||
| 298 | wm1190_regulators[i].regulator, | ||
| 299 | wm1190_regulators[i].initdata); | ||
| 300 | |||
| 301 | return 0; | ||
| 302 | } | ||
| 303 | |||
| 304 | static struct wm8350_platform_data __initdata smdk6410_wm8350_pdata = { | ||
| 305 | .init = smdk6410_wm8350_init, | ||
| 306 | }; | ||
| 307 | #endif | ||
| 308 | |||
| 185 | static struct i2c_board_info i2c_devs0[] __initdata = { | 309 | static struct i2c_board_info i2c_devs0[] __initdata = { |
| 186 | { I2C_BOARD_INFO("24c08", 0x50), }, | 310 | { I2C_BOARD_INFO("24c08", 0x50), }, |
| 187 | { I2C_BOARD_INFO("wm8580", 0x1b), }, | 311 | { I2C_BOARD_INFO("wm8580", 0x1b), }, |
| 312 | |||
| 313 | #ifdef CONFIG_SMDK6410_WM1190_EV1 | ||
| 314 | { I2C_BOARD_INFO("wm8350", 0x1a), | ||
| 315 | .platform_data = &smdk6410_wm8350_pdata, | ||
| 316 | .irq = S3C_EINT(12), | ||
| 317 | }, | ||
| 318 | #endif | ||
| 188 | }; | 319 | }; |
| 189 | 320 | ||
| 190 | static struct i2c_board_info i2c_devs1[] __initdata = { | 321 | static struct i2c_board_info i2c_devs1[] __initdata = { |
