12896434cSAshish Jangam /* 22896434cSAshish Jangam * Device access for Dialog DA9055 PMICs. 32896434cSAshish Jangam * 42896434cSAshish Jangam * Copyright(c) 2012 Dialog Semiconductor Ltd. 52896434cSAshish Jangam * 62896434cSAshish Jangam * Author: David Dajun Chen <dchen@diasemi.com> 72896434cSAshish Jangam * 82896434cSAshish Jangam * This program is free software; you can redistribute it and/or modify it 92896434cSAshish Jangam * under the terms of the GNU General Public License as published by the 102896434cSAshish Jangam * Free Software Foundation; either version 2 of the License, or (at your 112896434cSAshish Jangam * option) any later version. 122896434cSAshish Jangam */ 132896434cSAshish Jangam 142896434cSAshish Jangam #include <linux/module.h> 152896434cSAshish Jangam #include <linux/device.h> 162896434cSAshish Jangam #include <linux/input.h> 172896434cSAshish Jangam #include <linux/irq.h> 182896434cSAshish Jangam #include <linux/mutex.h> 192896434cSAshish Jangam 202896434cSAshish Jangam #include <linux/mfd/core.h> 212896434cSAshish Jangam #include <linux/mfd/da9055/core.h> 222896434cSAshish Jangam #include <linux/mfd/da9055/pdata.h> 232896434cSAshish Jangam #include <linux/mfd/da9055/reg.h> 242896434cSAshish Jangam 252896434cSAshish Jangam #define DA9055_IRQ_NONKEY_MASK 0x01 262896434cSAshish Jangam #define DA9055_IRQ_ALM_MASK 0x02 272896434cSAshish Jangam #define DA9055_IRQ_TICK_MASK 0x04 282896434cSAshish Jangam #define DA9055_IRQ_ADC_MASK 0x08 292896434cSAshish Jangam #define DA9055_IRQ_BUCK_ILIM_MASK 0x08 302896434cSAshish Jangam 312896434cSAshish Jangam static bool da9055_register_readable(struct device *dev, unsigned int reg) 322896434cSAshish Jangam { 332896434cSAshish Jangam switch (reg) { 342896434cSAshish Jangam case DA9055_REG_STATUS_A: 352896434cSAshish Jangam case DA9055_REG_STATUS_B: 362896434cSAshish Jangam case DA9055_REG_EVENT_A: 372896434cSAshish Jangam case DA9055_REG_EVENT_B: 382896434cSAshish Jangam case DA9055_REG_EVENT_C: 392896434cSAshish Jangam case DA9055_REG_IRQ_MASK_A: 402896434cSAshish Jangam case DA9055_REG_IRQ_MASK_B: 412896434cSAshish Jangam case DA9055_REG_IRQ_MASK_C: 422896434cSAshish Jangam 432896434cSAshish Jangam case DA9055_REG_CONTROL_A: 442896434cSAshish Jangam case DA9055_REG_CONTROL_B: 452896434cSAshish Jangam case DA9055_REG_CONTROL_C: 462896434cSAshish Jangam case DA9055_REG_CONTROL_D: 472896434cSAshish Jangam case DA9055_REG_CONTROL_E: 482896434cSAshish Jangam 492896434cSAshish Jangam case DA9055_REG_ADC_MAN: 502896434cSAshish Jangam case DA9055_REG_ADC_CONT: 512896434cSAshish Jangam case DA9055_REG_VSYS_MON: 522896434cSAshish Jangam case DA9055_REG_ADC_RES_L: 532896434cSAshish Jangam case DA9055_REG_ADC_RES_H: 542896434cSAshish Jangam case DA9055_REG_VSYS_RES: 552896434cSAshish Jangam case DA9055_REG_ADCIN1_RES: 562896434cSAshish Jangam case DA9055_REG_ADCIN2_RES: 572896434cSAshish Jangam case DA9055_REG_ADCIN3_RES: 582896434cSAshish Jangam 592896434cSAshish Jangam case DA9055_REG_COUNT_S: 602896434cSAshish Jangam case DA9055_REG_COUNT_MI: 612896434cSAshish Jangam case DA9055_REG_COUNT_H: 622896434cSAshish Jangam case DA9055_REG_COUNT_D: 632896434cSAshish Jangam case DA9055_REG_COUNT_MO: 642896434cSAshish Jangam case DA9055_REG_COUNT_Y: 652896434cSAshish Jangam case DA9055_REG_ALARM_H: 662896434cSAshish Jangam case DA9055_REG_ALARM_D: 672896434cSAshish Jangam case DA9055_REG_ALARM_MI: 682896434cSAshish Jangam case DA9055_REG_ALARM_MO: 692896434cSAshish Jangam case DA9055_REG_ALARM_Y: 702896434cSAshish Jangam 712896434cSAshish Jangam case DA9055_REG_GPIO0_1: 722896434cSAshish Jangam case DA9055_REG_GPIO2: 732896434cSAshish Jangam case DA9055_REG_GPIO_MODE0_2: 742896434cSAshish Jangam 752896434cSAshish Jangam case DA9055_REG_BCORE_CONT: 762896434cSAshish Jangam case DA9055_REG_BMEM_CONT: 772896434cSAshish Jangam case DA9055_REG_LDO1_CONT: 782896434cSAshish Jangam case DA9055_REG_LDO2_CONT: 792896434cSAshish Jangam case DA9055_REG_LDO3_CONT: 802896434cSAshish Jangam case DA9055_REG_LDO4_CONT: 812896434cSAshish Jangam case DA9055_REG_LDO5_CONT: 822896434cSAshish Jangam case DA9055_REG_LDO6_CONT: 832896434cSAshish Jangam case DA9055_REG_BUCK_LIM: 842896434cSAshish Jangam case DA9055_REG_BCORE_MODE: 852896434cSAshish Jangam case DA9055_REG_VBCORE_A: 862896434cSAshish Jangam case DA9055_REG_VBMEM_A: 872896434cSAshish Jangam case DA9055_REG_VLDO1_A: 882896434cSAshish Jangam case DA9055_REG_VLDO2_A: 892896434cSAshish Jangam case DA9055_REG_VLDO3_A: 902896434cSAshish Jangam case DA9055_REG_VLDO4_A: 912896434cSAshish Jangam case DA9055_REG_VLDO5_A: 922896434cSAshish Jangam case DA9055_REG_VLDO6_A: 932896434cSAshish Jangam case DA9055_REG_VBCORE_B: 942896434cSAshish Jangam case DA9055_REG_VBMEM_B: 952896434cSAshish Jangam case DA9055_REG_VLDO1_B: 962896434cSAshish Jangam case DA9055_REG_VLDO2_B: 972896434cSAshish Jangam case DA9055_REG_VLDO3_B: 982896434cSAshish Jangam case DA9055_REG_VLDO4_B: 992896434cSAshish Jangam case DA9055_REG_VLDO5_B: 1002896434cSAshish Jangam case DA9055_REG_VLDO6_B: 1012896434cSAshish Jangam return true; 1022896434cSAshish Jangam default: 1032896434cSAshish Jangam return false; 1042896434cSAshish Jangam } 1052896434cSAshish Jangam } 1062896434cSAshish Jangam 1072896434cSAshish Jangam static bool da9055_register_writeable(struct device *dev, unsigned int reg) 1082896434cSAshish Jangam { 1092896434cSAshish Jangam switch (reg) { 1102896434cSAshish Jangam case DA9055_REG_STATUS_A: 1112896434cSAshish Jangam case DA9055_REG_STATUS_B: 1122896434cSAshish Jangam case DA9055_REG_EVENT_A: 1132896434cSAshish Jangam case DA9055_REG_EVENT_B: 1142896434cSAshish Jangam case DA9055_REG_EVENT_C: 1152896434cSAshish Jangam case DA9055_REG_IRQ_MASK_A: 1162896434cSAshish Jangam case DA9055_REG_IRQ_MASK_B: 1172896434cSAshish Jangam case DA9055_REG_IRQ_MASK_C: 1182896434cSAshish Jangam 1192896434cSAshish Jangam case DA9055_REG_CONTROL_A: 1202896434cSAshish Jangam case DA9055_REG_CONTROL_B: 1212896434cSAshish Jangam case DA9055_REG_CONTROL_C: 1222896434cSAshish Jangam case DA9055_REG_CONTROL_D: 1232896434cSAshish Jangam case DA9055_REG_CONTROL_E: 1242896434cSAshish Jangam 1252896434cSAshish Jangam case DA9055_REG_ADC_MAN: 1262896434cSAshish Jangam case DA9055_REG_ADC_CONT: 1272896434cSAshish Jangam case DA9055_REG_VSYS_MON: 1282896434cSAshish Jangam case DA9055_REG_ADC_RES_L: 1292896434cSAshish Jangam case DA9055_REG_ADC_RES_H: 1302896434cSAshish Jangam case DA9055_REG_VSYS_RES: 1312896434cSAshish Jangam case DA9055_REG_ADCIN1_RES: 1322896434cSAshish Jangam case DA9055_REG_ADCIN2_RES: 1332896434cSAshish Jangam case DA9055_REG_ADCIN3_RES: 1342896434cSAshish Jangam 1352896434cSAshish Jangam case DA9055_REG_COUNT_S: 1362896434cSAshish Jangam case DA9055_REG_COUNT_MI: 1372896434cSAshish Jangam case DA9055_REG_COUNT_H: 1382896434cSAshish Jangam case DA9055_REG_COUNT_D: 1392896434cSAshish Jangam case DA9055_REG_COUNT_MO: 1402896434cSAshish Jangam case DA9055_REG_COUNT_Y: 1412896434cSAshish Jangam case DA9055_REG_ALARM_H: 1422896434cSAshish Jangam case DA9055_REG_ALARM_D: 1432896434cSAshish Jangam case DA9055_REG_ALARM_MI: 1442896434cSAshish Jangam case DA9055_REG_ALARM_MO: 1452896434cSAshish Jangam case DA9055_REG_ALARM_Y: 1462896434cSAshish Jangam 1472896434cSAshish Jangam case DA9055_REG_GPIO0_1: 1482896434cSAshish Jangam case DA9055_REG_GPIO2: 1492896434cSAshish Jangam case DA9055_REG_GPIO_MODE0_2: 1502896434cSAshish Jangam 1512896434cSAshish Jangam case DA9055_REG_BCORE_CONT: 1522896434cSAshish Jangam case DA9055_REG_BMEM_CONT: 1532896434cSAshish Jangam case DA9055_REG_LDO1_CONT: 1542896434cSAshish Jangam case DA9055_REG_LDO2_CONT: 1552896434cSAshish Jangam case DA9055_REG_LDO3_CONT: 1562896434cSAshish Jangam case DA9055_REG_LDO4_CONT: 1572896434cSAshish Jangam case DA9055_REG_LDO5_CONT: 1582896434cSAshish Jangam case DA9055_REG_LDO6_CONT: 1592896434cSAshish Jangam case DA9055_REG_BUCK_LIM: 1602896434cSAshish Jangam case DA9055_REG_BCORE_MODE: 1612896434cSAshish Jangam case DA9055_REG_VBCORE_A: 1622896434cSAshish Jangam case DA9055_REG_VBMEM_A: 1632896434cSAshish Jangam case DA9055_REG_VLDO1_A: 1642896434cSAshish Jangam case DA9055_REG_VLDO2_A: 1652896434cSAshish Jangam case DA9055_REG_VLDO3_A: 1662896434cSAshish Jangam case DA9055_REG_VLDO4_A: 1672896434cSAshish Jangam case DA9055_REG_VLDO5_A: 1682896434cSAshish Jangam case DA9055_REG_VLDO6_A: 1692896434cSAshish Jangam case DA9055_REG_VBCORE_B: 1702896434cSAshish Jangam case DA9055_REG_VBMEM_B: 1712896434cSAshish Jangam case DA9055_REG_VLDO1_B: 1722896434cSAshish Jangam case DA9055_REG_VLDO2_B: 1732896434cSAshish Jangam case DA9055_REG_VLDO3_B: 1742896434cSAshish Jangam case DA9055_REG_VLDO4_B: 1752896434cSAshish Jangam case DA9055_REG_VLDO5_B: 1762896434cSAshish Jangam case DA9055_REG_VLDO6_B: 1772896434cSAshish Jangam return true; 1782896434cSAshish Jangam default: 1792896434cSAshish Jangam return false; 1802896434cSAshish Jangam } 1812896434cSAshish Jangam } 1822896434cSAshish Jangam 1832896434cSAshish Jangam static bool da9055_register_volatile(struct device *dev, unsigned int reg) 1842896434cSAshish Jangam { 1852896434cSAshish Jangam switch (reg) { 1862896434cSAshish Jangam case DA9055_REG_STATUS_A: 1872896434cSAshish Jangam case DA9055_REG_STATUS_B: 1882896434cSAshish Jangam case DA9055_REG_EVENT_A: 1892896434cSAshish Jangam case DA9055_REG_EVENT_B: 1902896434cSAshish Jangam case DA9055_REG_EVENT_C: 1912896434cSAshish Jangam 1922896434cSAshish Jangam case DA9055_REG_CONTROL_A: 1932896434cSAshish Jangam case DA9055_REG_CONTROL_E: 1942896434cSAshish Jangam 1952896434cSAshish Jangam case DA9055_REG_ADC_MAN: 1962896434cSAshish Jangam case DA9055_REG_ADC_RES_L: 1972896434cSAshish Jangam case DA9055_REG_ADC_RES_H: 1982896434cSAshish Jangam case DA9055_REG_VSYS_RES: 1992896434cSAshish Jangam case DA9055_REG_ADCIN1_RES: 2002896434cSAshish Jangam case DA9055_REG_ADCIN2_RES: 2012896434cSAshish Jangam case DA9055_REG_ADCIN3_RES: 2022896434cSAshish Jangam 2032896434cSAshish Jangam case DA9055_REG_COUNT_S: 2042896434cSAshish Jangam case DA9055_REG_COUNT_MI: 2052896434cSAshish Jangam case DA9055_REG_COUNT_H: 2062896434cSAshish Jangam case DA9055_REG_COUNT_D: 2072896434cSAshish Jangam case DA9055_REG_COUNT_MO: 2082896434cSAshish Jangam case DA9055_REG_COUNT_Y: 2092896434cSAshish Jangam case DA9055_REG_ALARM_MI: 2102896434cSAshish Jangam 2112896434cSAshish Jangam case DA9055_REG_BCORE_CONT: 2122896434cSAshish Jangam case DA9055_REG_BMEM_CONT: 2132896434cSAshish Jangam case DA9055_REG_LDO1_CONT: 2142896434cSAshish Jangam case DA9055_REG_LDO2_CONT: 2152896434cSAshish Jangam case DA9055_REG_LDO3_CONT: 2162896434cSAshish Jangam case DA9055_REG_LDO4_CONT: 2172896434cSAshish Jangam case DA9055_REG_LDO5_CONT: 2182896434cSAshish Jangam case DA9055_REG_LDO6_CONT: 2192896434cSAshish Jangam return true; 2202896434cSAshish Jangam default: 2212896434cSAshish Jangam return false; 2222896434cSAshish Jangam } 2232896434cSAshish Jangam } 2242896434cSAshish Jangam 2252896434cSAshish Jangam static struct regmap_irq da9055_irqs[] = { 2262896434cSAshish Jangam [DA9055_IRQ_NONKEY] = { 2272896434cSAshish Jangam .reg_offset = 0, 2282896434cSAshish Jangam .mask = DA9055_IRQ_NONKEY_MASK, 2292896434cSAshish Jangam }, 2302896434cSAshish Jangam [DA9055_IRQ_ALARM] = { 2312896434cSAshish Jangam .reg_offset = 0, 2322896434cSAshish Jangam .mask = DA9055_IRQ_ALM_MASK, 2332896434cSAshish Jangam }, 2342896434cSAshish Jangam [DA9055_IRQ_TICK] = { 2352896434cSAshish Jangam .reg_offset = 0, 2362896434cSAshish Jangam .mask = DA9055_IRQ_TICK_MASK, 2372896434cSAshish Jangam }, 2382896434cSAshish Jangam [DA9055_IRQ_HWMON] = { 2392896434cSAshish Jangam .reg_offset = 0, 2402896434cSAshish Jangam .mask = DA9055_IRQ_ADC_MASK, 2412896434cSAshish Jangam }, 2422896434cSAshish Jangam [DA9055_IRQ_REGULATOR] = { 2432896434cSAshish Jangam .reg_offset = 1, 2442896434cSAshish Jangam .mask = DA9055_IRQ_BUCK_ILIM_MASK, 2452896434cSAshish Jangam }, 2462896434cSAshish Jangam }; 2472896434cSAshish Jangam 2482896434cSAshish Jangam struct regmap_config da9055_regmap_config = { 2492896434cSAshish Jangam .reg_bits = 8, 2502896434cSAshish Jangam .val_bits = 8, 2512896434cSAshish Jangam 2522896434cSAshish Jangam .cache_type = REGCACHE_RBTREE, 2532896434cSAshish Jangam 2542896434cSAshish Jangam .max_register = DA9055_MAX_REGISTER_CNT, 2552896434cSAshish Jangam .readable_reg = da9055_register_readable, 2562896434cSAshish Jangam .writeable_reg = da9055_register_writeable, 2572896434cSAshish Jangam .volatile_reg = da9055_register_volatile, 2582896434cSAshish Jangam }; 2592896434cSAshish Jangam EXPORT_SYMBOL_GPL(da9055_regmap_config); 2602896434cSAshish Jangam 2612896434cSAshish Jangam static struct resource da9055_onkey_resource = { 2622896434cSAshish Jangam .name = "ONKEY", 2632896434cSAshish Jangam .start = DA9055_IRQ_NONKEY, 2642896434cSAshish Jangam .end = DA9055_IRQ_NONKEY, 2652896434cSAshish Jangam .flags = IORESOURCE_IRQ, 2662896434cSAshish Jangam }; 2672896434cSAshish Jangam 2682896434cSAshish Jangam static struct resource da9055_rtc_resource[] = { 2692896434cSAshish Jangam { 2702896434cSAshish Jangam .name = "ALM", 2712896434cSAshish Jangam .start = DA9055_IRQ_ALARM, 2722896434cSAshish Jangam .end = DA9055_IRQ_ALARM, 2732896434cSAshish Jangam .flags = IORESOURCE_IRQ, 2742896434cSAshish Jangam }, 2752896434cSAshish Jangam { 2762896434cSAshish Jangam .name = "TICK", 2772896434cSAshish Jangam .start = DA9055_IRQ_TICK, 2782896434cSAshish Jangam .end = DA9055_IRQ_TICK, 2792896434cSAshish Jangam .flags = IORESOURCE_IRQ, 2802896434cSAshish Jangam }, 2812896434cSAshish Jangam }; 2822896434cSAshish Jangam 2832896434cSAshish Jangam static struct resource da9055_hwmon_resource = { 2842896434cSAshish Jangam .name = "HWMON", 2852896434cSAshish Jangam .start = DA9055_IRQ_HWMON, 2862896434cSAshish Jangam .end = DA9055_IRQ_HWMON, 2872896434cSAshish Jangam .flags = IORESOURCE_IRQ, 2882896434cSAshish Jangam }; 2892896434cSAshish Jangam 2902896434cSAshish Jangam static struct resource da9055_ld05_6_resource = { 2912896434cSAshish Jangam .name = "REGULATOR", 2922896434cSAshish Jangam .start = DA9055_IRQ_REGULATOR, 2932896434cSAshish Jangam .end = DA9055_IRQ_REGULATOR, 2942896434cSAshish Jangam .flags = IORESOURCE_IRQ, 2952896434cSAshish Jangam }; 2962896434cSAshish Jangam 2972896434cSAshish Jangam static struct mfd_cell da9055_devs[] = { 2982896434cSAshish Jangam { 2992896434cSAshish Jangam .of_compatible = "dialog,da9055-gpio", 3002896434cSAshish Jangam .name = "da9055-gpio", 3012896434cSAshish Jangam }, 3022896434cSAshish Jangam { 3032896434cSAshish Jangam .of_compatible = "dialog,da9055-regulator", 3042896434cSAshish Jangam .name = "da9055-regulator", 3052896434cSAshish Jangam .id = 1, 3062896434cSAshish Jangam }, 3072896434cSAshish Jangam { 3082896434cSAshish Jangam .of_compatible = "dialog,da9055-regulator", 3092896434cSAshish Jangam .name = "da9055-regulator", 3102896434cSAshish Jangam .id = 2, 3112896434cSAshish Jangam }, 3122896434cSAshish Jangam { 3132896434cSAshish Jangam .of_compatible = "dialog,da9055-regulator", 3142896434cSAshish Jangam .name = "da9055-regulator", 3152896434cSAshish Jangam .id = 3, 3162896434cSAshish Jangam }, 3172896434cSAshish Jangam { 3182896434cSAshish Jangam .of_compatible = "dialog,da9055-regulator", 3192896434cSAshish Jangam .name = "da9055-regulator", 3202896434cSAshish Jangam .id = 4, 3212896434cSAshish Jangam }, 3222896434cSAshish Jangam { 3232896434cSAshish Jangam .of_compatible = "dialog,da9055-regulator", 3242896434cSAshish Jangam .name = "da9055-regulator", 3252896434cSAshish Jangam .id = 5, 3262896434cSAshish Jangam }, 3272896434cSAshish Jangam { 3282896434cSAshish Jangam .of_compatible = "dialog,da9055-regulator", 3292896434cSAshish Jangam .name = "da9055-regulator", 3302896434cSAshish Jangam .id = 6, 3312896434cSAshish Jangam }, 3322896434cSAshish Jangam { 3332896434cSAshish Jangam .of_compatible = "dialog,da9055-regulator", 3342896434cSAshish Jangam .name = "da9055-regulator", 3352896434cSAshish Jangam .id = 7, 3362896434cSAshish Jangam .resources = &da9055_ld05_6_resource, 3372896434cSAshish Jangam .num_resources = 1, 3382896434cSAshish Jangam }, 3392896434cSAshish Jangam { 3402896434cSAshish Jangam .of_compatible = "dialog,da9055-regulator", 3412896434cSAshish Jangam .name = "da9055-regulator", 3422896434cSAshish Jangam .resources = &da9055_ld05_6_resource, 3432896434cSAshish Jangam .num_resources = 1, 3442896434cSAshish Jangam .id = 8, 3452896434cSAshish Jangam }, 3462896434cSAshish Jangam { 3472896434cSAshish Jangam .of_compatible = "dialog,da9055-onkey", 3482896434cSAshish Jangam .name = "da9055-onkey", 3492896434cSAshish Jangam .resources = &da9055_onkey_resource, 3502896434cSAshish Jangam .num_resources = 1, 3512896434cSAshish Jangam }, 3522896434cSAshish Jangam { 3532896434cSAshish Jangam .of_compatible = "dialog,da9055-rtc", 3542896434cSAshish Jangam .name = "da9055-rtc", 3552896434cSAshish Jangam .resources = da9055_rtc_resource, 3562896434cSAshish Jangam .num_resources = ARRAY_SIZE(da9055_rtc_resource), 3572896434cSAshish Jangam }, 3582896434cSAshish Jangam { 3592896434cSAshish Jangam .of_compatible = "dialog,da9055-hwmon", 3602896434cSAshish Jangam .name = "da9055-hwmon", 3612896434cSAshish Jangam .resources = &da9055_hwmon_resource, 3622896434cSAshish Jangam .num_resources = 1, 3632896434cSAshish Jangam }, 3642896434cSAshish Jangam { 3652896434cSAshish Jangam .of_compatible = "dialog,da9055-watchdog", 3662896434cSAshish Jangam .name = "da9055-watchdog", 3672896434cSAshish Jangam }, 3682896434cSAshish Jangam }; 3692896434cSAshish Jangam 3702896434cSAshish Jangam static struct regmap_irq_chip da9055_regmap_irq_chip = { 3712896434cSAshish Jangam .name = "da9055_irq", 3722896434cSAshish Jangam .status_base = DA9055_REG_EVENT_A, 3732896434cSAshish Jangam .mask_base = DA9055_REG_IRQ_MASK_A, 3742896434cSAshish Jangam .ack_base = DA9055_REG_EVENT_A, 3752896434cSAshish Jangam .num_regs = 3, 3762896434cSAshish Jangam .irqs = da9055_irqs, 3772896434cSAshish Jangam .num_irqs = ARRAY_SIZE(da9055_irqs), 3782896434cSAshish Jangam }; 3792896434cSAshish Jangam 3802896434cSAshish Jangam int __devinit da9055_device_init(struct da9055 *da9055) 3812896434cSAshish Jangam { 3822896434cSAshish Jangam struct da9055_pdata *pdata = da9055->dev->platform_data; 3832896434cSAshish Jangam int ret; 3842896434cSAshish Jangam 3852896434cSAshish Jangam if (pdata && pdata->init != NULL) 3862896434cSAshish Jangam pdata->init(da9055); 3872896434cSAshish Jangam 3882896434cSAshish Jangam if (!pdata || !pdata->irq_base) 3892896434cSAshish Jangam da9055->irq_base = -1; 3902896434cSAshish Jangam else 3912896434cSAshish Jangam da9055->irq_base = pdata->irq_base; 3922896434cSAshish Jangam 3932896434cSAshish Jangam ret = regmap_add_irq_chip(da9055->regmap, da9055->chip_irq, 3942896434cSAshish Jangam IRQF_TRIGGER_HIGH | IRQF_ONESHOT, 3952896434cSAshish Jangam da9055->irq_base, &da9055_regmap_irq_chip, 3962896434cSAshish Jangam &da9055->irq_data); 3972896434cSAshish Jangam if (ret < 0) 3982896434cSAshish Jangam return ret; 3992896434cSAshish Jangam 4002896434cSAshish Jangam da9055->irq_base = regmap_irq_chip_get_base(da9055->irq_data); 4012896434cSAshish Jangam 4022896434cSAshish Jangam ret = mfd_add_devices(da9055->dev, -1, 4032896434cSAshish Jangam da9055_devs, ARRAY_SIZE(da9055_devs), 4042896434cSAshish Jangam NULL, da9055->irq_base, NULL); 4052896434cSAshish Jangam if (ret) 4062896434cSAshish Jangam goto err; 4072896434cSAshish Jangam 4082896434cSAshish Jangam return 0; 4092896434cSAshish Jangam 4102896434cSAshish Jangam err: 4112896434cSAshish Jangam mfd_remove_devices(da9055->dev); 4122896434cSAshish Jangam return ret; 4132896434cSAshish Jangam } 4142896434cSAshish Jangam 4152896434cSAshish Jangam void __devexit da9055_device_exit(struct da9055 *da9055) 4162896434cSAshish Jangam { 4172896434cSAshish Jangam regmap_del_irq_chip(da9055->chip_irq, da9055->irq_data); 4182896434cSAshish Jangam mfd_remove_devices(da9055->dev); 4192896434cSAshish Jangam } 4202896434cSAshish Jangam 4212896434cSAshish Jangam MODULE_DESCRIPTION("Core support for the DA9055 PMIC"); 4222896434cSAshish Jangam MODULE_LICENSE("GPL"); 4232896434cSAshish Jangam MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>"); 424