1 // SPDX-License-Identifier: GPL-2.0 2 // 3 // Speyside modules for Cragganmore - board data probing 4 // 5 // Copyright 2011 Wolfson Microelectronics plc 6 // Mark Brown <broonie@opensource.wolfsonmicro.com> 7 8 #include <linux/export.h> 9 #include <linux/interrupt.h> 10 #include <linux/i2c.h> 11 #include <linux/spi/spi.h> 12 #include <linux/gpio/machine.h> 13 14 #include <linux/mfd/wm831x/irq.h> 15 #include <linux/mfd/wm831x/gpio.h> 16 #include <linux/mfd/wm8994/pdata.h> 17 #include <linux/mfd/arizona/pdata.h> 18 19 #include <linux/regulator/machine.h> 20 21 #include <sound/wm0010.h> 22 #include <sound/wm2200.h> 23 #include <sound/wm5100.h> 24 #include <sound/wm8996.h> 25 #include <sound/wm8962.h> 26 #include <sound/wm9081.h> 27 28 #include <linux/platform_data/spi-s3c64xx.h> 29 30 #include "cpu.h" 31 #include <mach/irqs.h> 32 33 #include "crag6410.h" 34 35 static struct s3c64xx_spi_csinfo wm0010_spi_csinfo = { 36 .line = S3C64XX_GPC(3), 37 }; 38 39 static struct wm0010_pdata wm0010_pdata = { 40 .gpio_reset = S3C64XX_GPN(6), 41 .reset_active_high = 1, /* Active high for Glenfarclas Rev 2 */ 42 }; 43 44 static struct spi_board_info wm1253_devs[] = { 45 [0] = { 46 .modalias = "wm0010", 47 .max_speed_hz = 26 * 1000 * 1000, 48 .bus_num = 0, 49 .chip_select = 0, 50 .mode = SPI_MODE_0, 51 .irq = S3C_EINT(4), 52 .controller_data = &wm0010_spi_csinfo, 53 .platform_data = &wm0010_pdata, 54 }, 55 }; 56 57 static struct spi_board_info balblair_devs[] = { 58 [0] = { 59 .modalias = "wm0010", 60 .max_speed_hz = 26 * 1000 * 1000, 61 .bus_num = 0, 62 .chip_select = 0, 63 .mode = SPI_MODE_0, 64 .irq = S3C_EINT(4), 65 .controller_data = &wm0010_spi_csinfo, 66 .platform_data = &wm0010_pdata, 67 }, 68 }; 69 70 static struct wm5100_pdata wm5100_pdata = { 71 .ldo_ena = S3C64XX_GPN(7), 72 .irq_flags = IRQF_TRIGGER_HIGH, 73 .gpio_base = CODEC_GPIO_BASE, 74 75 .in_mode = { 76 WM5100_IN_DIFF, 77 WM5100_IN_DIFF, 78 WM5100_IN_DIFF, 79 WM5100_IN_SE, 80 }, 81 82 .hp_pol = CODEC_GPIO_BASE + 3, 83 .jack_modes = { 84 { WM5100_MICDET_MICBIAS3, 0, 0 }, 85 { WM5100_MICDET_MICBIAS2, 1, 1 }, 86 }, 87 88 .gpio_defaults = { 89 0, 90 0, 91 0, 92 0, 93 0x2, /* IRQ: CMOS output */ 94 0x3, /* CLKOUT: CMOS output */ 95 }, 96 }; 97 98 static struct wm8996_retune_mobile_config wm8996_retune[] = { 99 { 100 .name = "Sub LPF", 101 .rate = 48000, 102 .regs = { 103 0x6318, 0x6300, 0x1000, 0x0000, 0x0004, 0x2000, 0xF000, 104 0x0000, 0x0004, 0x2000, 0xF000, 0x0000, 0x0004, 0x2000, 105 0xF000, 0x0000, 0x0004, 0x1000, 0x0800, 0x4000 106 }, 107 }, 108 { 109 .name = "Sub HPF", 110 .rate = 48000, 111 .regs = { 112 0x000A, 0x6300, 0x1000, 0x0000, 0x0004, 0x2000, 0xF000, 113 0x0000, 0x0004, 0x2000, 0xF000, 0x0000, 0x0004, 0x2000, 114 0xF000, 0x0000, 0x0004, 0x1000, 0x0800, 0x4000 115 }, 116 }, 117 }; 118 119 static struct wm8996_pdata wm8996_pdata __initdata = { 120 .ldo_ena = S3C64XX_GPN(7), 121 .gpio_base = CODEC_GPIO_BASE, 122 .micdet_def = 1, 123 .inl_mode = WM8996_DIFFERRENTIAL_1, 124 .inr_mode = WM8996_DIFFERRENTIAL_1, 125 126 .irq_flags = IRQF_TRIGGER_RISING, 127 128 .gpio_default = { 129 0x8001, /* GPIO1 == ADCLRCLK1 */ 130 0x8001, /* GPIO2 == ADCLRCLK2, input due to CPU */ 131 0x0141, /* GPIO3 == HP_SEL */ 132 0x0002, /* GPIO4 == IRQ */ 133 0x020e, /* GPIO5 == CLKOUT */ 134 }, 135 136 .retune_mobile_cfgs = wm8996_retune, 137 .num_retune_mobile_cfgs = ARRAY_SIZE(wm8996_retune), 138 }; 139 140 static struct wm8962_pdata wm8962_pdata __initdata = { 141 .gpio_init = { 142 0, 143 WM8962_GPIO_FN_OPCLK, 144 WM8962_GPIO_FN_DMICCLK, 145 0, 146 0x8000 | WM8962_GPIO_FN_DMICDAT, 147 WM8962_GPIO_FN_IRQ, /* Open drain mode */ 148 }, 149 .in4_dc_measure = true, 150 }; 151 152 static struct wm9081_pdata wm9081_pdata __initdata = { 153 .irq_high = false, 154 .irq_cmos = false, 155 }; 156 157 static const struct i2c_board_info wm1254_devs[] = { 158 { I2C_BOARD_INFO("wm8996", 0x1a), 159 .platform_data = &wm8996_pdata, 160 .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2, 161 }, 162 { I2C_BOARD_INFO("wm9081", 0x6c), 163 .platform_data = &wm9081_pdata, }, 164 }; 165 166 static const struct i2c_board_info wm1255_devs[] = { 167 { I2C_BOARD_INFO("wm5100", 0x1a), 168 .platform_data = &wm5100_pdata, 169 .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2, 170 }, 171 { I2C_BOARD_INFO("wm9081", 0x6c), 172 .platform_data = &wm9081_pdata, }, 173 }; 174 175 static const struct i2c_board_info wm1259_devs[] = { 176 { I2C_BOARD_INFO("wm8962", 0x1a), 177 .platform_data = &wm8962_pdata, 178 .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2, 179 }, 180 }; 181 182 static struct regulator_init_data wm8994_ldo1 = { 183 .supply_regulator = "WALLVDD", 184 }; 185 186 static struct regulator_init_data wm8994_ldo2 = { 187 .supply_regulator = "WALLVDD", 188 }; 189 190 static struct wm8994_pdata wm8994_pdata = { 191 .gpio_base = CODEC_GPIO_BASE, 192 .micb2_delay = 150, 193 .gpio_defaults = { 194 0x3, /* IRQ out, active high, CMOS */ 195 }, 196 .ldo = { 197 { .init_data = &wm8994_ldo1, }, 198 { .init_data = &wm8994_ldo2, }, 199 }, 200 }; 201 202 static const struct i2c_board_info wm1277_devs[] = { 203 { I2C_BOARD_INFO("wm8958", 0x1a), /* WM8958 is the superset */ 204 .platform_data = &wm8994_pdata, 205 .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2, 206 .dev_name = "wm8958", 207 }, 208 }; 209 210 static struct gpiod_lookup_table wm8994_gpiod_table = { 211 .dev_id = "i2c-wm8958", /* I2C device name */ 212 .table = { 213 GPIO_LOOKUP("GPION", 6, 214 "wlf,ldo1ena", GPIO_ACTIVE_HIGH), 215 GPIO_LOOKUP("GPION", 4, 216 "wlf,ldo2ena", GPIO_ACTIVE_HIGH), 217 { }, 218 }, 219 }; 220 221 static struct arizona_pdata wm5102_reva_pdata = { 222 .gpio_base = CODEC_GPIO_BASE, 223 .irq_flags = IRQF_TRIGGER_HIGH, 224 .micd_pol_gpio = CODEC_GPIO_BASE + 4, 225 .micd_rate = 6, 226 .gpio_defaults = { 227 [2] = 0x10000, /* AIF3TXLRCLK */ 228 [3] = 0x4, /* OPCLK */ 229 }, 230 }; 231 232 static struct s3c64xx_spi_csinfo codec_spi_csinfo = { 233 .line = S3C64XX_GPN(5), 234 }; 235 236 static struct spi_board_info wm5102_reva_spi_devs[] = { 237 [0] = { 238 .modalias = "wm5102", 239 .max_speed_hz = 10 * 1000 * 1000, 240 .bus_num = 0, 241 .chip_select = 1, 242 .mode = SPI_MODE_0, 243 .irq = GLENFARCLAS_PMIC_IRQ_BASE + 244 WM831X_IRQ_GPIO_2, 245 .controller_data = &codec_spi_csinfo, 246 .platform_data = &wm5102_reva_pdata, 247 }, 248 }; 249 250 static struct gpiod_lookup_table wm5102_reva_gpiod_table = { 251 .dev_id = "spi0.1", /* SPI device name */ 252 .table = { 253 GPIO_LOOKUP("GPION", 7, 254 "wlf,ldoena", GPIO_ACTIVE_HIGH), 255 { }, 256 }, 257 }; 258 259 static struct arizona_pdata wm5102_pdata = { 260 .gpio_base = CODEC_GPIO_BASE, 261 .irq_flags = IRQF_TRIGGER_HIGH, 262 .micd_pol_gpio = CODEC_GPIO_BASE + 2, 263 .gpio_defaults = { 264 [2] = 0x10000, /* AIF3TXLRCLK */ 265 [3] = 0x4, /* OPCLK */ 266 }, 267 }; 268 269 static struct spi_board_info wm5102_spi_devs[] = { 270 [0] = { 271 .modalias = "wm5102", 272 .max_speed_hz = 10 * 1000 * 1000, 273 .bus_num = 0, 274 .chip_select = 1, 275 .mode = SPI_MODE_0, 276 .irq = GLENFARCLAS_PMIC_IRQ_BASE + 277 WM831X_IRQ_GPIO_2, 278 .controller_data = &codec_spi_csinfo, 279 .platform_data = &wm5102_pdata, 280 }, 281 }; 282 283 static struct gpiod_lookup_table wm5102_gpiod_table = { 284 .dev_id = "spi0.1", /* SPI device name */ 285 .table = { 286 GPIO_LOOKUP("GPION", 7, 287 "wlf,ldo1ena", GPIO_ACTIVE_HIGH), 288 { }, 289 }, 290 }; 291 292 static struct spi_board_info wm5110_spi_devs[] = { 293 [0] = { 294 .modalias = "wm5110", 295 .max_speed_hz = 10 * 1000 * 1000, 296 .bus_num = 0, 297 .chip_select = 1, 298 .mode = SPI_MODE_0, 299 .irq = GLENFARCLAS_PMIC_IRQ_BASE + 300 WM831X_IRQ_GPIO_2, 301 .controller_data = &codec_spi_csinfo, 302 .platform_data = &wm5102_reva_pdata, 303 }, 304 }; 305 306 static const struct i2c_board_info wm6230_i2c_devs[] = { 307 { I2C_BOARD_INFO("wm9081", 0x6c), 308 .platform_data = &wm9081_pdata, }, 309 }; 310 311 static struct wm2200_pdata wm2200_pdata = { 312 .ldo_ena = S3C64XX_GPN(7), 313 .gpio_defaults = { 314 [2] = 0x0005, /* GPIO3 24.576MHz output clock */ 315 }, 316 }; 317 318 static const struct i2c_board_info wm2200_i2c[] = { 319 { I2C_BOARD_INFO("wm2200", 0x3a), 320 .platform_data = &wm2200_pdata, }, 321 }; 322 323 static const struct { 324 u8 id; 325 u8 rev; 326 const char *name; 327 const struct i2c_board_info *i2c_devs; 328 int num_i2c_devs; 329 const struct spi_board_info *spi_devs; 330 int num_spi_devs; 331 332 struct gpiod_lookup_table *gpiod_table; 333 } gf_mods[] = { 334 { .id = 0x01, .rev = 0xff, .name = "1250-EV1 Springbank" }, 335 { .id = 0x02, .rev = 0xff, .name = "1251-EV1 Jura" }, 336 { .id = 0x03, .rev = 0xff, .name = "1252-EV1 Glenlivet" }, 337 { .id = 0x06, .rev = 0xff, .name = "WM8997-6721-CS96-EV1 Lapraoig" }, 338 { .id = 0x07, .rev = 0xff, .name = "WM5110-6271 Deanston", 339 .spi_devs = wm5110_spi_devs, 340 .num_spi_devs = ARRAY_SIZE(wm5110_spi_devs) }, 341 { .id = 0x08, .rev = 0xff, .name = "WM8903-6102 Tamdhu" }, 342 { .id = 0x09, .rev = 0xff, .name = "WM1811A-6305 Adelphi" }, 343 { .id = 0x0a, .rev = 0xff, .name = "WM8996-6272 Blackadder" }, 344 { .id = 0x0b, .rev = 0xff, .name = "WM8994-6235 Benromach" }, 345 { .id = 0x11, .rev = 0xff, .name = "6249-EV2 Glenfarclas", }, 346 { .id = 0x14, .rev = 0xff, .name = "6271-EV1 Lochnagar" }, 347 { .id = 0x15, .rev = 0xff, .name = "6320-EV1 Bells", 348 .i2c_devs = wm6230_i2c_devs, 349 .num_i2c_devs = ARRAY_SIZE(wm6230_i2c_devs) }, 350 { .id = 0x21, .rev = 0xff, .name = "1275-EV1 Mortlach" }, 351 { .id = 0x25, .rev = 0xff, .name = "1274-EV1 Glencadam" }, 352 { .id = 0x31, .rev = 0xff, .name = "1253-EV1 Tomatin", 353 .spi_devs = wm1253_devs, .num_spi_devs = ARRAY_SIZE(wm1253_devs) }, 354 { .id = 0x32, .rev = 0xff, .name = "XXXX-EV1 Caol Illa" }, 355 { .id = 0x33, .rev = 0xff, .name = "XXXX-EV1 Oban" }, 356 { .id = 0x34, .rev = 0xff, .name = "WM0010-6320-CS42 Balblair", 357 .spi_devs = balblair_devs, 358 .num_spi_devs = ARRAY_SIZE(balblair_devs) }, 359 { .id = 0x39, .rev = 0xff, .name = "1254-EV1 Dallas Dhu", 360 .i2c_devs = wm1254_devs, .num_i2c_devs = ARRAY_SIZE(wm1254_devs) }, 361 { .id = 0x3a, .rev = 0xff, .name = "1259-EV1 Tobermory", 362 .i2c_devs = wm1259_devs, .num_i2c_devs = ARRAY_SIZE(wm1259_devs) }, 363 { .id = 0x3b, .rev = 0xff, .name = "1255-EV1 Kilchoman", 364 .i2c_devs = wm1255_devs, .num_i2c_devs = ARRAY_SIZE(wm1255_devs) }, 365 { .id = 0x3c, .rev = 0xff, .name = "1273-EV1 Longmorn" }, 366 { .id = 0x3d, .rev = 0xff, .name = "1277-EV1 Littlemill", 367 .i2c_devs = wm1277_devs, .num_i2c_devs = ARRAY_SIZE(wm1277_devs), 368 .gpiod_table = &wm8994_gpiod_table }, 369 { .id = 0x3e, .rev = 0, .name = "WM5102-6271-EV1-CS127 Amrut", 370 .spi_devs = wm5102_reva_spi_devs, 371 .num_spi_devs = ARRAY_SIZE(wm5102_reva_spi_devs), 372 .gpiod_table = &wm5102_reva_gpiod_table }, 373 { .id = 0x3e, .rev = -1, .name = "WM5102-6271-EV1-CS127 Amrut", 374 .spi_devs = wm5102_spi_devs, 375 .num_spi_devs = ARRAY_SIZE(wm5102_spi_devs), 376 .gpiod_table = &wm5102_gpiod_table }, 377 { .id = 0x3f, .rev = -1, .name = "WM2200-6271-CS90-M-REV1", 378 .i2c_devs = wm2200_i2c, .num_i2c_devs = ARRAY_SIZE(wm2200_i2c) }, 379 }; 380 381 static int wlf_gf_module_probe(struct i2c_client *i2c) 382 { 383 int ret, i, j, id, rev; 384 385 ret = i2c_smbus_read_byte_data(i2c, 0); 386 if (ret < 0) { 387 dev_err(&i2c->dev, "Failed to read ID: %d\n", ret); 388 return ret; 389 } 390 391 id = (ret & 0xfe) >> 2; 392 rev = ret & 0x3; 393 for (i = 0; i < ARRAY_SIZE(gf_mods); i++) 394 if (id == gf_mods[i].id && (gf_mods[i].rev == 0xff || 395 rev == gf_mods[i].rev)) 396 break; 397 398 gpiod_add_lookup_table(&wm5102_reva_gpiod_table); 399 gpiod_add_lookup_table(&wm5102_gpiod_table); 400 gpiod_add_lookup_table(&wm8994_gpiod_table); 401 402 if (i < ARRAY_SIZE(gf_mods)) { 403 dev_info(&i2c->dev, "%s revision %d\n", 404 gf_mods[i].name, rev + 1); 405 406 for (j = 0; j < gf_mods[i].num_i2c_devs; j++) { 407 if (IS_ERR(i2c_new_client_device(i2c->adapter, 408 &(gf_mods[i].i2c_devs[j])))) 409 dev_err(&i2c->dev, "Failed to register\n"); 410 } 411 412 spi_register_board_info(gf_mods[i].spi_devs, 413 gf_mods[i].num_spi_devs); 414 415 if (gf_mods[i].gpiod_table) 416 gpiod_add_lookup_table(gf_mods[i].gpiod_table); 417 } else { 418 dev_warn(&i2c->dev, "Unknown module ID 0x%x revision %d\n", 419 id, rev + 1); 420 } 421 422 return 0; 423 } 424 425 static const struct i2c_device_id wlf_gf_module_id[] = { 426 { "wlf-gf-module", 0 }, 427 { } 428 }; 429 430 static struct i2c_driver wlf_gf_module_driver = { 431 .driver = { 432 .name = "wlf-gf-module" 433 }, 434 .probe_new = wlf_gf_module_probe, 435 .id_table = wlf_gf_module_id, 436 }; 437 438 static int __init wlf_gf_module_register(void) 439 { 440 if (!soc_is_s3c64xx()) 441 return 0; 442 443 return i2c_add_driver(&wlf_gf_module_driver); 444 } 445 device_initcall(wlf_gf_module_register); 446