Commit 9582fdcb authored by Stephen Warren's avatar Stephen Warren Committed by Samuel Ortiz

mfd: max8907: Add power off control

Add DT property "maxim,system-power-controller" to indicate whether the
PMIC is in charge of controlling the system power. If this is set, the
driver will provide the pm_power_off() function.
Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 48a364b7
...@@ -16,6 +16,10 @@ Required properties: ...@@ -16,6 +16,10 @@ Required properties:
property, with valid values listed below. The content of each sub-node property, with valid values listed below. The content of each sub-node
is defined by the standard binding for regulators; see regulator.txt. is defined by the standard binding for regulators; see regulator.txt.
Optional properties:
- maxim,system-power-controller: Boolean property indicating that the PMIC
controls the overall system power.
Valid regulator-compatible values are: Valid regulator-compatible values are:
sd1, sd2, sd3, ldo1, ldo2, ldo3, ldo4, ldo5, ldo6, ldo7, ldo8, ldo9, ldo10, sd1, sd2, sd3, ldo1, ldo2, ldo3, ldo4, ldo5, ldo6, ldo7, ldo8, ldo9, ldo10,
...@@ -29,6 +33,8 @@ Example: ...@@ -29,6 +33,8 @@ Example:
reg = <0x3c>; reg = <0x3c>;
interrupts = <0 86 0x4>; interrupts = <0 86 0x4>;
maxim,system-power-controller;
mbatt-supply = <&some_reg>; mbatt-supply = <&some_reg>;
in-v1-supply = <&mbatt_reg>; in-v1-supply = <&mbatt_reg>;
... ...
......
...@@ -176,11 +176,26 @@ static const struct regmap_irq_chip max8907_rtc_irq_chip = { ...@@ -176,11 +176,26 @@ static const struct regmap_irq_chip max8907_rtc_irq_chip = {
.num_irqs = ARRAY_SIZE(max8907_rtc_irqs), .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, static __devinit int max8907_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct max8907 *max8907; struct max8907 *max8907;
int ret; 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); max8907 = devm_kzalloc(&i2c->dev, sizeof(struct max8907), GFP_KERNEL);
if (!max8907) { if (!max8907) {
...@@ -251,6 +266,11 @@ static __devinit int max8907_i2c_probe(struct i2c_client *i2c, ...@@ -251,6 +266,11 @@ static __devinit int max8907_i2c_probe(struct i2c_client *i2c,
goto err_add_devices; goto err_add_devices;
} }
if (pm_off && !pm_power_off) {
max8907_pm_off = max8907;
pm_power_off = max8907_power_off;
}
return 0; return 0;
err_add_devices: err_add_devices:
......
...@@ -167,6 +167,7 @@ ...@@ -167,6 +167,7 @@
#define MAX8907_MASK_OUT5V_VINEN 0x10 #define MAX8907_MASK_OUT5V_VINEN 0x10
#define MAX8907_MASK_OUT5V_ENSRC 0x0E #define MAX8907_MASK_OUT5V_ENSRC 0x0E
#define MAX8907_MASK_OUT5V_EN 0x01 #define MAX8907_MASK_OUT5V_EN 0x01
#define MAX8907_MASK_POWER_OFF 0x40
/* Regulator IDs */ /* Regulator IDs */
#define MAX8907_MBATT 0 #define MAX8907_MBATT 0
...@@ -231,6 +232,7 @@ enum { ...@@ -231,6 +232,7 @@ enum {
struct max8907_platform_data { struct max8907_platform_data {
struct regulator_init_data *init_data[MAX8907_NUM_REGULATORS]; struct regulator_init_data *init_data[MAX8907_NUM_REGULATORS];
bool pm_off;
}; };
struct regmap_irq_chips_data; struct regmap_irq_chips_data;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment