1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * MFD core driver for Intel Broxton Whiskey Cove PMIC 4 * 5 * Copyright (C) 2015 Intel Corporation. All rights reserved. 6 */ 7 8 #include <linux/acpi.h> 9 #include <linux/delay.h> 10 #include <linux/err.h> 11 #include <linux/interrupt.h> 12 #include <linux/kernel.h> 13 #include <linux/mfd/core.h> 14 #include <linux/mfd/intel_soc_pmic.h> 15 #include <linux/mfd/intel_soc_pmic_bxtwc.h> 16 #include <linux/module.h> 17 18 #include <asm/intel_pmc_ipc.h> 19 20 /* PMIC device registers */ 21 #define REG_ADDR_MASK 0xFF00 22 #define REG_ADDR_SHIFT 8 23 #define REG_OFFSET_MASK 0xFF 24 25 /* Interrupt Status Registers */ 26 #define BXTWC_IRQLVL1 0x4E02 27 28 #define BXTWC_PWRBTNIRQ 0x4E03 29 #define BXTWC_THRM0IRQ 0x4E04 30 #define BXTWC_THRM1IRQ 0x4E05 31 #define BXTWC_THRM2IRQ 0x4E06 32 #define BXTWC_BCUIRQ 0x4E07 33 #define BXTWC_ADCIRQ 0x4E08 34 #define BXTWC_CHGR0IRQ 0x4E09 35 #define BXTWC_CHGR1IRQ 0x4E0A 36 #define BXTWC_GPIOIRQ0 0x4E0B 37 #define BXTWC_GPIOIRQ1 0x4E0C 38 #define BXTWC_CRITIRQ 0x4E0D 39 #define BXTWC_TMUIRQ 0x4FB6 40 41 /* Interrupt MASK Registers */ 42 #define BXTWC_MIRQLVL1 0x4E0E 43 #define BXTWC_MIRQLVL1_MCHGR BIT(5) 44 45 #define BXTWC_MPWRBTNIRQ 0x4E0F 46 #define BXTWC_MTHRM0IRQ 0x4E12 47 #define BXTWC_MTHRM1IRQ 0x4E13 48 #define BXTWC_MTHRM2IRQ 0x4E14 49 #define BXTWC_MBCUIRQ 0x4E15 50 #define BXTWC_MADCIRQ 0x4E16 51 #define BXTWC_MCHGR0IRQ 0x4E17 52 #define BXTWC_MCHGR1IRQ 0x4E18 53 #define BXTWC_MGPIO0IRQ 0x4E19 54 #define BXTWC_MGPIO1IRQ 0x4E1A 55 #define BXTWC_MCRITIRQ 0x4E1B 56 #define BXTWC_MTMUIRQ 0x4FB7 57 58 /* Whiskey Cove PMIC share same ACPI ID between different platforms */ 59 #define BROXTON_PMIC_WC_HRV 4 60 61 enum bxtwc_irqs { 62 BXTWC_PWRBTN_LVL1_IRQ = 0, 63 BXTWC_TMU_LVL1_IRQ, 64 BXTWC_THRM_LVL1_IRQ, 65 BXTWC_BCU_LVL1_IRQ, 66 BXTWC_ADC_LVL1_IRQ, 67 BXTWC_CHGR_LVL1_IRQ, 68 BXTWC_GPIO_LVL1_IRQ, 69 BXTWC_CRIT_LVL1_IRQ, 70 }; 71 72 enum bxtwc_irqs_pwrbtn { 73 BXTWC_PWRBTN_IRQ = 0, 74 BXTWC_UIBTN_IRQ, 75 }; 76 77 enum bxtwc_irqs_bcu { 78 BXTWC_BCU_IRQ = 0, 79 }; 80 81 enum bxtwc_irqs_adc { 82 BXTWC_ADC_IRQ = 0, 83 }; 84 85 enum bxtwc_irqs_chgr { 86 BXTWC_USBC_IRQ = 0, 87 BXTWC_CHGR0_IRQ, 88 BXTWC_CHGR1_IRQ, 89 }; 90 91 enum bxtwc_irqs_tmu { 92 BXTWC_TMU_IRQ = 0, 93 }; 94 95 enum bxtwc_irqs_crit { 96 BXTWC_CRIT_IRQ = 0, 97 }; 98 99 static const struct regmap_irq bxtwc_regmap_irqs[] = { 100 REGMAP_IRQ_REG(BXTWC_PWRBTN_LVL1_IRQ, 0, BIT(0)), 101 REGMAP_IRQ_REG(BXTWC_TMU_LVL1_IRQ, 0, BIT(1)), 102 REGMAP_IRQ_REG(BXTWC_THRM_LVL1_IRQ, 0, BIT(2)), 103 REGMAP_IRQ_REG(BXTWC_BCU_LVL1_IRQ, 0, BIT(3)), 104 REGMAP_IRQ_REG(BXTWC_ADC_LVL1_IRQ, 0, BIT(4)), 105 REGMAP_IRQ_REG(BXTWC_CHGR_LVL1_IRQ, 0, BIT(5)), 106 REGMAP_IRQ_REG(BXTWC_GPIO_LVL1_IRQ, 0, BIT(6)), 107 REGMAP_IRQ_REG(BXTWC_CRIT_LVL1_IRQ, 0, BIT(7)), 108 }; 109 110 static const struct regmap_irq bxtwc_regmap_irqs_pwrbtn[] = { 111 REGMAP_IRQ_REG(BXTWC_PWRBTN_IRQ, 0, 0x01), 112 }; 113 114 static const struct regmap_irq bxtwc_regmap_irqs_bcu[] = { 115 REGMAP_IRQ_REG(BXTWC_BCU_IRQ, 0, 0x1f), 116 }; 117 118 static const struct regmap_irq bxtwc_regmap_irqs_adc[] = { 119 REGMAP_IRQ_REG(BXTWC_ADC_IRQ, 0, 0xff), 120 }; 121 122 static const struct regmap_irq bxtwc_regmap_irqs_chgr[] = { 123 REGMAP_IRQ_REG(BXTWC_USBC_IRQ, 0, 0x20), 124 REGMAP_IRQ_REG(BXTWC_CHGR0_IRQ, 0, 0x1f), 125 REGMAP_IRQ_REG(BXTWC_CHGR1_IRQ, 1, 0x1f), 126 }; 127 128 static const struct regmap_irq bxtwc_regmap_irqs_tmu[] = { 129 REGMAP_IRQ_REG(BXTWC_TMU_IRQ, 0, 0x06), 130 }; 131 132 static const struct regmap_irq bxtwc_regmap_irqs_crit[] = { 133 REGMAP_IRQ_REG(BXTWC_CRIT_IRQ, 0, 0x03), 134 }; 135 136 static struct regmap_irq_chip bxtwc_regmap_irq_chip = { 137 .name = "bxtwc_irq_chip", 138 .status_base = BXTWC_IRQLVL1, 139 .mask_base = BXTWC_MIRQLVL1, 140 .irqs = bxtwc_regmap_irqs, 141 .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs), 142 .num_regs = 1, 143 }; 144 145 static struct regmap_irq_chip bxtwc_regmap_irq_chip_pwrbtn = { 146 .name = "bxtwc_irq_chip_pwrbtn", 147 .status_base = BXTWC_PWRBTNIRQ, 148 .mask_base = BXTWC_MPWRBTNIRQ, 149 .irqs = bxtwc_regmap_irqs_pwrbtn, 150 .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs_pwrbtn), 151 .num_regs = 1, 152 }; 153 154 static struct regmap_irq_chip bxtwc_regmap_irq_chip_tmu = { 155 .name = "bxtwc_irq_chip_tmu", 156 .status_base = BXTWC_TMUIRQ, 157 .mask_base = BXTWC_MTMUIRQ, 158 .irqs = bxtwc_regmap_irqs_tmu, 159 .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs_tmu), 160 .num_regs = 1, 161 }; 162 163 static struct regmap_irq_chip bxtwc_regmap_irq_chip_bcu = { 164 .name = "bxtwc_irq_chip_bcu", 165 .status_base = BXTWC_BCUIRQ, 166 .mask_base = BXTWC_MBCUIRQ, 167 .irqs = bxtwc_regmap_irqs_bcu, 168 .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs_bcu), 169 .num_regs = 1, 170 }; 171 172 static struct regmap_irq_chip bxtwc_regmap_irq_chip_adc = { 173 .name = "bxtwc_irq_chip_adc", 174 .status_base = BXTWC_ADCIRQ, 175 .mask_base = BXTWC_MADCIRQ, 176 .irqs = bxtwc_regmap_irqs_adc, 177 .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs_adc), 178 .num_regs = 1, 179 }; 180 181 static struct regmap_irq_chip bxtwc_regmap_irq_chip_chgr = { 182 .name = "bxtwc_irq_chip_chgr", 183 .status_base = BXTWC_CHGR0IRQ, 184 .mask_base = BXTWC_MCHGR0IRQ, 185 .irqs = bxtwc_regmap_irqs_chgr, 186 .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs_chgr), 187 .num_regs = 2, 188 }; 189 190 static struct regmap_irq_chip bxtwc_regmap_irq_chip_crit = { 191 .name = "bxtwc_irq_chip_crit", 192 .status_base = BXTWC_CRITIRQ, 193 .mask_base = BXTWC_MCRITIRQ, 194 .irqs = bxtwc_regmap_irqs_crit, 195 .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs_crit), 196 .num_regs = 1, 197 }; 198 199 static struct resource gpio_resources[] = { 200 DEFINE_RES_IRQ_NAMED(BXTWC_GPIO_LVL1_IRQ, "GPIO"), 201 }; 202 203 static struct resource adc_resources[] = { 204 DEFINE_RES_IRQ_NAMED(BXTWC_ADC_IRQ, "ADC"), 205 }; 206 207 static struct resource usbc_resources[] = { 208 DEFINE_RES_IRQ(BXTWC_USBC_IRQ), 209 }; 210 211 static struct resource charger_resources[] = { 212 DEFINE_RES_IRQ_NAMED(BXTWC_CHGR0_IRQ, "CHARGER"), 213 DEFINE_RES_IRQ_NAMED(BXTWC_CHGR1_IRQ, "CHARGER1"), 214 }; 215 216 static struct resource thermal_resources[] = { 217 DEFINE_RES_IRQ(BXTWC_THRM_LVL1_IRQ), 218 }; 219 220 static struct resource bcu_resources[] = { 221 DEFINE_RES_IRQ_NAMED(BXTWC_BCU_IRQ, "BCU"), 222 }; 223 224 static struct resource tmu_resources[] = { 225 DEFINE_RES_IRQ_NAMED(BXTWC_TMU_IRQ, "TMU"), 226 }; 227 228 static struct mfd_cell bxt_wc_dev[] = { 229 { 230 .name = "bxt_wcove_gpadc", 231 .num_resources = ARRAY_SIZE(adc_resources), 232 .resources = adc_resources, 233 }, 234 { 235 .name = "bxt_wcove_thermal", 236 .num_resources = ARRAY_SIZE(thermal_resources), 237 .resources = thermal_resources, 238 }, 239 { 240 .name = "bxt_wcove_usbc", 241 .num_resources = ARRAY_SIZE(usbc_resources), 242 .resources = usbc_resources, 243 }, 244 { 245 .name = "bxt_wcove_ext_charger", 246 .num_resources = ARRAY_SIZE(charger_resources), 247 .resources = charger_resources, 248 }, 249 { 250 .name = "bxt_wcove_bcu", 251 .num_resources = ARRAY_SIZE(bcu_resources), 252 .resources = bcu_resources, 253 }, 254 { 255 .name = "bxt_wcove_tmu", 256 .num_resources = ARRAY_SIZE(tmu_resources), 257 .resources = tmu_resources, 258 }, 259 260 { 261 .name = "bxt_wcove_gpio", 262 .num_resources = ARRAY_SIZE(gpio_resources), 263 .resources = gpio_resources, 264 }, 265 { 266 .name = "bxt_wcove_region", 267 }, 268 }; 269 270 static int regmap_ipc_byte_reg_read(void *context, unsigned int reg, 271 unsigned int *val) 272 { 273 int ret; 274 int i2c_addr; 275 u8 ipc_in[2]; 276 u8 ipc_out[4]; 277 struct intel_soc_pmic *pmic = context; 278 279 if (!pmic) 280 return -EINVAL; 281 282 if (reg & REG_ADDR_MASK) 283 i2c_addr = (reg & REG_ADDR_MASK) >> REG_ADDR_SHIFT; 284 else 285 i2c_addr = BXTWC_DEVICE1_ADDR; 286 287 reg &= REG_OFFSET_MASK; 288 289 ipc_in[0] = reg; 290 ipc_in[1] = i2c_addr; 291 ret = intel_pmc_ipc_command(PMC_IPC_PMIC_ACCESS, 292 PMC_IPC_PMIC_ACCESS_READ, 293 ipc_in, sizeof(ipc_in), (u32 *)ipc_out, 1); 294 if (ret) { 295 dev_err(pmic->dev, "Failed to read from PMIC\n"); 296 return ret; 297 } 298 *val = ipc_out[0]; 299 300 return 0; 301 } 302 303 static int regmap_ipc_byte_reg_write(void *context, unsigned int reg, 304 unsigned int val) 305 { 306 int ret; 307 int i2c_addr; 308 u8 ipc_in[3]; 309 struct intel_soc_pmic *pmic = context; 310 311 if (!pmic) 312 return -EINVAL; 313 314 if (reg & REG_ADDR_MASK) 315 i2c_addr = (reg & REG_ADDR_MASK) >> REG_ADDR_SHIFT; 316 else 317 i2c_addr = BXTWC_DEVICE1_ADDR; 318 319 reg &= REG_OFFSET_MASK; 320 321 ipc_in[0] = reg; 322 ipc_in[1] = i2c_addr; 323 ipc_in[2] = val; 324 ret = intel_pmc_ipc_command(PMC_IPC_PMIC_ACCESS, 325 PMC_IPC_PMIC_ACCESS_WRITE, 326 ipc_in, sizeof(ipc_in), NULL, 0); 327 if (ret) { 328 dev_err(pmic->dev, "Failed to write to PMIC\n"); 329 return ret; 330 } 331 332 return 0; 333 } 334 335 /* sysfs interfaces to r/w PMIC registers, required by initial script */ 336 static unsigned long bxtwc_reg_addr; 337 static ssize_t bxtwc_reg_show(struct device *dev, 338 struct device_attribute *attr, char *buf) 339 { 340 return sprintf(buf, "0x%lx\n", bxtwc_reg_addr); 341 } 342 343 static ssize_t bxtwc_reg_store(struct device *dev, 344 struct device_attribute *attr, const char *buf, size_t count) 345 { 346 if (kstrtoul(buf, 0, &bxtwc_reg_addr)) { 347 dev_err(dev, "Invalid register address\n"); 348 return -EINVAL; 349 } 350 return (ssize_t)count; 351 } 352 353 static ssize_t bxtwc_val_show(struct device *dev, 354 struct device_attribute *attr, char *buf) 355 { 356 int ret; 357 unsigned int val; 358 struct intel_soc_pmic *pmic = dev_get_drvdata(dev); 359 360 ret = regmap_read(pmic->regmap, bxtwc_reg_addr, &val); 361 if (ret < 0) { 362 dev_err(dev, "Failed to read 0x%lx\n", bxtwc_reg_addr); 363 return -EIO; 364 } 365 366 return sprintf(buf, "0x%02x\n", val); 367 } 368 369 static ssize_t bxtwc_val_store(struct device *dev, 370 struct device_attribute *attr, const char *buf, size_t count) 371 { 372 int ret; 373 unsigned int val; 374 struct intel_soc_pmic *pmic = dev_get_drvdata(dev); 375 376 ret = kstrtouint(buf, 0, &val); 377 if (ret) 378 return ret; 379 380 ret = regmap_write(pmic->regmap, bxtwc_reg_addr, val); 381 if (ret) { 382 dev_err(dev, "Failed to write value 0x%02x to address 0x%lx", 383 val, bxtwc_reg_addr); 384 return -EIO; 385 } 386 return count; 387 } 388 389 static DEVICE_ATTR(addr, S_IWUSR | S_IRUSR, bxtwc_reg_show, bxtwc_reg_store); 390 static DEVICE_ATTR(val, S_IWUSR | S_IRUSR, bxtwc_val_show, bxtwc_val_store); 391 static struct attribute *bxtwc_attrs[] = { 392 &dev_attr_addr.attr, 393 &dev_attr_val.attr, 394 NULL 395 }; 396 397 static const struct attribute_group bxtwc_group = { 398 .attrs = bxtwc_attrs, 399 }; 400 401 static const struct regmap_config bxtwc_regmap_config = { 402 .reg_bits = 16, 403 .val_bits = 8, 404 .reg_write = regmap_ipc_byte_reg_write, 405 .reg_read = regmap_ipc_byte_reg_read, 406 }; 407 408 static int bxtwc_add_chained_irq_chip(struct intel_soc_pmic *pmic, 409 struct regmap_irq_chip_data *pdata, 410 int pirq, int irq_flags, 411 const struct regmap_irq_chip *chip, 412 struct regmap_irq_chip_data **data) 413 { 414 int irq; 415 416 irq = regmap_irq_get_virq(pdata, pirq); 417 if (irq < 0) { 418 dev_err(pmic->dev, 419 "Failed to get parent vIRQ(%d) for chip %s, ret:%d\n", 420 pirq, chip->name, irq); 421 return irq; 422 } 423 424 return devm_regmap_add_irq_chip(pmic->dev, pmic->regmap, irq, irq_flags, 425 0, chip, data); 426 } 427 428 static int bxtwc_probe(struct platform_device *pdev) 429 { 430 int ret; 431 acpi_handle handle; 432 acpi_status status; 433 unsigned long long hrv; 434 struct intel_soc_pmic *pmic; 435 436 handle = ACPI_HANDLE(&pdev->dev); 437 status = acpi_evaluate_integer(handle, "_HRV", NULL, &hrv); 438 if (ACPI_FAILURE(status)) { 439 dev_err(&pdev->dev, "Failed to get PMIC hardware revision\n"); 440 return -ENODEV; 441 } 442 if (hrv != BROXTON_PMIC_WC_HRV) { 443 dev_err(&pdev->dev, "Invalid PMIC hardware revision: %llu\n", 444 hrv); 445 return -ENODEV; 446 } 447 448 pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL); 449 if (!pmic) 450 return -ENOMEM; 451 452 ret = platform_get_irq(pdev, 0); 453 if (ret < 0) { 454 dev_err(&pdev->dev, "Invalid IRQ\n"); 455 return ret; 456 } 457 pmic->irq = ret; 458 459 dev_set_drvdata(&pdev->dev, pmic); 460 pmic->dev = &pdev->dev; 461 462 pmic->regmap = devm_regmap_init(&pdev->dev, NULL, pmic, 463 &bxtwc_regmap_config); 464 if (IS_ERR(pmic->regmap)) { 465 ret = PTR_ERR(pmic->regmap); 466 dev_err(&pdev->dev, "Failed to initialise regmap: %d\n", ret); 467 return ret; 468 } 469 470 ret = devm_regmap_add_irq_chip(&pdev->dev, pmic->regmap, pmic->irq, 471 IRQF_ONESHOT | IRQF_SHARED, 472 0, &bxtwc_regmap_irq_chip, 473 &pmic->irq_chip_data); 474 if (ret) { 475 dev_err(&pdev->dev, "Failed to add IRQ chip\n"); 476 return ret; 477 } 478 479 ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data, 480 BXTWC_PWRBTN_LVL1_IRQ, 481 IRQF_ONESHOT, 482 &bxtwc_regmap_irq_chip_pwrbtn, 483 &pmic->irq_chip_data_pwrbtn); 484 if (ret) { 485 dev_err(&pdev->dev, "Failed to add PWRBTN IRQ chip\n"); 486 return ret; 487 } 488 489 ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data, 490 BXTWC_TMU_LVL1_IRQ, 491 IRQF_ONESHOT, 492 &bxtwc_regmap_irq_chip_tmu, 493 &pmic->irq_chip_data_tmu); 494 if (ret) { 495 dev_err(&pdev->dev, "Failed to add TMU IRQ chip\n"); 496 return ret; 497 } 498 499 /* Add chained IRQ handler for BCU IRQs */ 500 ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data, 501 BXTWC_BCU_LVL1_IRQ, 502 IRQF_ONESHOT, 503 &bxtwc_regmap_irq_chip_bcu, 504 &pmic->irq_chip_data_bcu); 505 506 507 if (ret) { 508 dev_err(&pdev->dev, "Failed to add BUC IRQ chip\n"); 509 return ret; 510 } 511 512 /* Add chained IRQ handler for ADC IRQs */ 513 ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data, 514 BXTWC_ADC_LVL1_IRQ, 515 IRQF_ONESHOT, 516 &bxtwc_regmap_irq_chip_adc, 517 &pmic->irq_chip_data_adc); 518 519 520 if (ret) { 521 dev_err(&pdev->dev, "Failed to add ADC IRQ chip\n"); 522 return ret; 523 } 524 525 /* Add chained IRQ handler for CHGR IRQs */ 526 ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data, 527 BXTWC_CHGR_LVL1_IRQ, 528 IRQF_ONESHOT, 529 &bxtwc_regmap_irq_chip_chgr, 530 &pmic->irq_chip_data_chgr); 531 532 533 if (ret) { 534 dev_err(&pdev->dev, "Failed to add CHGR IRQ chip\n"); 535 return ret; 536 } 537 538 /* Add chained IRQ handler for CRIT IRQs */ 539 ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data, 540 BXTWC_CRIT_LVL1_IRQ, 541 IRQF_ONESHOT, 542 &bxtwc_regmap_irq_chip_crit, 543 &pmic->irq_chip_data_crit); 544 545 546 if (ret) { 547 dev_err(&pdev->dev, "Failed to add CRIT IRQ chip\n"); 548 return ret; 549 } 550 551 ret = devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_NONE, bxt_wc_dev, 552 ARRAY_SIZE(bxt_wc_dev), NULL, 0, NULL); 553 if (ret) { 554 dev_err(&pdev->dev, "Failed to add devices\n"); 555 return ret; 556 } 557 558 ret = sysfs_create_group(&pdev->dev.kobj, &bxtwc_group); 559 if (ret) { 560 dev_err(&pdev->dev, "Failed to create sysfs group %d\n", ret); 561 return ret; 562 } 563 564 /* 565 * There is known hw bug. Upon reset BIT 5 of register 566 * BXTWC_CHGR_LVL1_IRQ is 0 which is the expected value. However, 567 * later it's set to 1(masked) automatically by hardware. So we 568 * have the software workaround here to unmaksed it in order to let 569 * charger interrutp work. 570 */ 571 regmap_update_bits(pmic->regmap, BXTWC_MIRQLVL1, 572 BXTWC_MIRQLVL1_MCHGR, 0); 573 574 return 0; 575 } 576 577 static int bxtwc_remove(struct platform_device *pdev) 578 { 579 sysfs_remove_group(&pdev->dev.kobj, &bxtwc_group); 580 581 return 0; 582 } 583 584 static void bxtwc_shutdown(struct platform_device *pdev) 585 { 586 struct intel_soc_pmic *pmic = dev_get_drvdata(&pdev->dev); 587 588 disable_irq(pmic->irq); 589 } 590 591 #ifdef CONFIG_PM_SLEEP 592 static int bxtwc_suspend(struct device *dev) 593 { 594 struct intel_soc_pmic *pmic = dev_get_drvdata(dev); 595 596 disable_irq(pmic->irq); 597 598 return 0; 599 } 600 601 static int bxtwc_resume(struct device *dev) 602 { 603 struct intel_soc_pmic *pmic = dev_get_drvdata(dev); 604 605 enable_irq(pmic->irq); 606 return 0; 607 } 608 #endif 609 static SIMPLE_DEV_PM_OPS(bxtwc_pm_ops, bxtwc_suspend, bxtwc_resume); 610 611 static const struct acpi_device_id bxtwc_acpi_ids[] = { 612 { "INT34D3", }, 613 { } 614 }; 615 MODULE_DEVICE_TABLE(acpi, bxtwc_acpi_ids); 616 617 static struct platform_driver bxtwc_driver = { 618 .probe = bxtwc_probe, 619 .remove = bxtwc_remove, 620 .shutdown = bxtwc_shutdown, 621 .driver = { 622 .name = "BXTWC PMIC", 623 .pm = &bxtwc_pm_ops, 624 .acpi_match_table = ACPI_PTR(bxtwc_acpi_ids), 625 }, 626 }; 627 628 module_platform_driver(bxtwc_driver); 629 630 MODULE_LICENSE("GPL v2"); 631 MODULE_AUTHOR("Qipeng Zha<qipeng.zha@intel.com>"); 632