xref: /openbmc/linux/drivers/mfd/da9055-core.c (revision 2896434c)
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