Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 004c15a6 authored by Bill Huang's avatar Bill Huang Committed by Samuel Ortiz
Browse files

mfd: dt: tps6586x: Add power off control



Add DT property "ti,system-power-controller" telling whether or not this
pmic is in charge of controlling the system power, so the power off
routine can be hooked up to system call "pm_power_off".

Based on the work by:
Dan Willemsen <dwillemsen@nvidia.com>

Signed-off-by: default avatarBill Huang <bilhuang@nvidia.com>
Tested-by: default avatarStephen Warren <swarren@wwwdotorg.org>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 80633f05
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,10 @@ Required properties:
- vinldo678-supply: The input supply for the LDO6, LDO7 and LDO8
- vinldo678-supply: The input supply for the LDO6, LDO7 and LDO8
- vinldo9-supply: The input supply for the LDO9
- vinldo9-supply: The input supply for the LDO9


Optional properties:
- ti,system-power-controller: Telling whether or not this pmic is controlling
  the system power.

Each regulator is defined using the standard binding for regulators.
Each regulator is defined using the standard binding for regulators.


Example:
Example:
@@ -30,6 +34,8 @@ Example:
		#gpio-cells = <2>;
		#gpio-cells = <2>;
		gpio-controller;
		gpio-controller;


		ti,system-power-controller;

		sm0-supply = <&some_reg>;
		sm0-supply = <&some_reg>;
		sm1-supply = <&some_reg>;
		sm1-supply = <&some_reg>;
		sm2-supply = <&some_reg>;
		sm2-supply = <&some_reg>;
+19 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,10 @@
#include <linux/mfd/core.h>
#include <linux/mfd/core.h>
#include <linux/mfd/tps6586x.h>
#include <linux/mfd/tps6586x.h>


#define TPS6586X_SUPPLYENE	0x14
#define EXITSLREQ_BIT		BIT(1)
#define SLEEP_MODE_BIT		BIT(3)

/* interrupt control registers */
/* interrupt control registers */
#define TPS6586X_INT_ACK1	0xb5
#define TPS6586X_INT_ACK1	0xb5
#define TPS6586X_INT_ACK2	0xb6
#define TPS6586X_INT_ACK2	0xb6
@@ -409,6 +413,7 @@ static struct tps6586x_platform_data *tps6586x_parse_dt(struct i2c_client *clien
	pdata->subdevs = devs;
	pdata->subdevs = devs;
	pdata->gpio_base = -1;
	pdata->gpio_base = -1;
	pdata->irq_base = -1;
	pdata->irq_base = -1;
	pdata->pm_off = of_property_read_bool(np, "ti,system-power-controller");


	return pdata;
	return pdata;
}
}
@@ -441,6 +446,15 @@ static const struct regmap_config tps6586x_regmap_config = {
	.cache_type = REGCACHE_RBTREE,
	.cache_type = REGCACHE_RBTREE,
};
};


static struct device *tps6586x_dev;
static void tps6586x_power_off(void)
{
	if (tps6586x_clr_bits(tps6586x_dev, TPS6586X_SUPPLYENE, EXITSLREQ_BIT))
		return;

	tps6586x_set_bits(tps6586x_dev, TPS6586X_SUPPLYENE, SLEEP_MODE_BIT);
}

static int __devinit tps6586x_i2c_probe(struct i2c_client *client,
static int __devinit tps6586x_i2c_probe(struct i2c_client *client,
					const struct i2c_device_id *id)
					const struct i2c_device_id *id)
{
{
@@ -506,6 +520,11 @@ static int __devinit tps6586x_i2c_probe(struct i2c_client *client,
		goto err_add_devs;
		goto err_add_devs;
	}
	}


	if (pdata->pm_off && !pm_power_off) {
		tps6586x_dev = &client->dev;
		pm_power_off = tps6586x_power_off;
	}

	return 0;
	return 0;


err_add_devs:
err_add_devs:
+1 −0
Original line number Original line Diff line number Diff line
@@ -77,6 +77,7 @@ struct tps6586x_platform_data {


	int gpio_base;
	int gpio_base;
	int irq_base;
	int irq_base;
	bool pm_off;
};
};


/*
/*