diff options
Diffstat (limited to 'drivers/mfd/max8907.c')
-rw-r--r-- | drivers/mfd/max8907.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/mfd/max8907.c b/drivers/mfd/max8907.c index 6497c98..2303641 100644 --- a/drivers/mfd/max8907.c +++ b/drivers/mfd/max8907.c @@ -176,11 +176,26 @@ static const struct regmap_irq_chip max8907_rtc_irq_chip = { .num_irqs = ARRAY_SIZE(max8907_rtc_irqs), }; +struct max8907 *max8907_pm_off; +static void max8907_power_off(void) +{ + regmap_update_bits(max8907_pm_off->regmap_gen, MAX8907_REG_RESET_CNFG, + MAX8907_MASK_POWER_OFF, MAX8907_MASK_POWER_OFF); +} + static __devinit int max8907_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct max8907 *max8907; int ret; + struct max8907_platform_data *pdata = dev_get_platdata(&i2c->dev); + bool pm_off = false; + + if (pdata) + pm_off = pdata->pm_off; + else if (i2c->dev.of_node) + pm_off = of_property_read_bool(i2c->dev.of_node, + "maxim,system-power-controller"); max8907 = devm_kzalloc(&i2c->dev, sizeof(struct max8907), GFP_KERNEL); if (!max8907) { @@ -251,6 +266,11 @@ static __devinit int max8907_i2c_probe(struct i2c_client *i2c, goto err_add_devices; } + if (pm_off && !pm_power_off) { + max8907_pm_off = max8907; + pm_power_off = max8907_power_off; + } + return 0; err_add_devices: |