diff --git a/drivers/mfd/pm8038-core.c b/drivers/mfd/pm8038-core.c index 9815f6e8a00..48bc92d6345 100644 --- a/drivers/mfd/pm8038-core.c +++ b/drivers/mfd/pm8038-core.c @@ -33,6 +33,11 @@ #define REG_RTC_BASE 0x11D #define REG_IRQ_BASE 0x1BB +#define REG_BATT_ALARM_THRESH 0x023 +#define REG_BATT_ALARM_CTRL1 0x024 +#define REG_BATT_ALARM_CTRL2 0x021 +#define REG_BATT_ALARM_PWM_CTRL 0x020 + #define REG_SPK_BASE 0x253 #define REG_SPK_REGISTERS 6 @@ -336,6 +341,27 @@ static struct mfd_cell thermal_alarm_cell __devinitdata = { .pdata_size = sizeof(struct pm8xxx_tm_core_data), }; +static const struct resource batt_alarm_cell_resources[] __devinitconst = { + SINGLE_IRQ_RESOURCE("pm8921_batt_alarm_irq", PM8038_BATT_ALARM_IRQ), +}; + +static struct pm8xxx_batt_alarm_core_data batt_alarm_cdata = { + .irq_name = "pm8921_batt_alarm_irq", + .reg_addr_threshold = REG_BATT_ALARM_THRESH, + .reg_addr_ctrl1 = REG_BATT_ALARM_CTRL1, + .reg_addr_ctrl2 = REG_BATT_ALARM_CTRL2, + .reg_addr_pwm_ctrl = REG_BATT_ALARM_PWM_CTRL, +}; + +static struct mfd_cell batt_alarm_cell __devinitdata = { + .name = PM8XXX_BATT_ALARM_DEV_NAME, + .id = -1, + .resources = batt_alarm_cell_resources, + .num_resources = ARRAY_SIZE(batt_alarm_cell_resources), + .platform_data = &batt_alarm_cdata, + .pdata_size = sizeof(struct pm8xxx_batt_alarm_core_data), +}; + static const struct resource ccadc_cell_resources[] __devinitconst = { SINGLE_IRQ_RESOURCE("PM8921_BMS_CCADC_EOC", PM8921_BMS_CCADC_EOC), }; @@ -661,6 +687,13 @@ pm8038_add_subdevices(const struct pm8038_platform_data *pdata, goto bail; } + ret = mfd_add_devices(pmic->dev, 0, &batt_alarm_cell, 1, NULL, + irq_base); + if (ret) { + pr_err("Failed to add battery alarm subdevice ret=%d\n", ret); + goto bail; + } + if (pdata->ccadc_pdata) { ccadc_cell.platform_data = pdata->ccadc_pdata; ccadc_cell.pdata_size = diff --git a/include/linux/mfd/pm8xxx/pm8038.h b/include/linux/mfd/pm8xxx/pm8038.h index 682abc8daea..574dab672fd 100644 --- a/include/linux/mfd/pm8xxx/pm8038.h +++ b/include/linux/mfd/pm8xxx/pm8038.h @@ -54,6 +54,7 @@ /* PMIC Interrupts */ #define PM8038_RTC_ALARM_IRQ PM8038_IRQ_BLOCK_BIT(4, 7) +#define PM8038_BATT_ALARM_IRQ PM8921_IRQ_BLOCK_BIT(5, 6) #define PM8038_PWRKEY_REL_IRQ PM8038_IRQ_BLOCK_BIT(6, 2) #define PM8038_PWRKEY_PRESS_IRQ PM8038_IRQ_BLOCK_BIT(6, 3) #define PM8038_KEYPAD_IRQ PM8038_IRQ_BLOCK_BIT(9, 2)