From 319e59cdc04acdaaedb29d3f569a5883abb459d2 Mon Sep 17 00:00:00 2001 From: David Collins Date: Fri, 24 Jun 2011 09:08:56 -0700 Subject: [PATCH] mfd: pm8921-core: add mfd cell for pm8921 battery alarm device Add an mfd cell for the PMIC 8921 battery alarm into the pm8921-core. Change-Id: Ia856c88050aa99822e6541311f40417ec63964d4 Signed-off-by: David Collins --- drivers/mfd/pm8921-core.c | 34 +++++++++++++++++++++++++++++++ include/linux/mfd/pm8xxx/pm8921.h | 2 ++ 2 files changed, 36 insertions(+) diff --git a/drivers/mfd/pm8921-core.c b/drivers/mfd/pm8921-core.c index 0bf9ce05bcf..38c85216b7c 100644 --- a/drivers/mfd/pm8921-core.c +++ b/drivers/mfd/pm8921-core.c @@ -31,6 +31,11 @@ #define REG_TEMP_ALARM_CTRL 0x1B #define REG_TEMP_ALARM_PWM 0x9B +#define REG_BATT_ALARM_THRESH 0x023 +#define REG_BATT_ALARM_CTRL1 0x024 +#define REG_BATT_ALARM_CTRL2 0x0AA +#define REG_BATT_ALARM_PWM_CTRL 0x0A3 + #define PM8921_VERSION_MASK 0xFFF0 #define PM8921_VERSION_VALUE 0x06F0 #define PM8921_REVISION_MASK 0x000F @@ -312,6 +317,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", PM8921_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 int __devinit pm8921_add_subdevices(const struct pm8921_platform_data *pdata, struct pm8921 *pmic) @@ -511,6 +537,14 @@ pm8921_add_subdevices(const struct pm8921_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; + } + return 0; bail: if (pmic->irq_chip) { diff --git a/include/linux/mfd/pm8xxx/pm8921.h b/include/linux/mfd/pm8xxx/pm8921.h index ab0ab7e3e7a..c5127501846 100644 --- a/include/linux/mfd/pm8xxx/pm8921.h +++ b/include/linux/mfd/pm8xxx/pm8921.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,7 @@ /* PMIC Interrupts */ #define PM8921_RTC_ALARM_IRQ PM8921_IRQ_BLOCK_BIT(4, 7) +#define PM8921_BATT_ALARM_IRQ PM8921_IRQ_BLOCK_BIT(5, 6) #define PM8921_PWRKEY_REL_IRQ PM8921_IRQ_BLOCK_BIT(6, 2) #define PM8921_PWRKEY_PRESS_IRQ PM8921_IRQ_BLOCK_BIT(6, 3) #define PM8921_KEYPAD_IRQ PM8921_IRQ_BLOCK_BIT(9, 2)