Skip to content

Commit

Permalink
mfd: twl4030-power: Start transition to DT
Browse files Browse the repository at this point in the history
Support for loading twl4030-power module via devicetree.
For now, when booting with a DT, only the poweroff callback
feature is supported through the ti,use_poweroff property.

Signed-off-by: Florian Vaussard <florian.vaussard@epfl.ch>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
  • Loading branch information
Florian Vaussard authored and Samuel Ortiz committed Jun 19, 2013
1 parent f58cb40 commit b0fc1da
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 7 deletions.
28 changes: 28 additions & 0 deletions Documentation/devicetree/bindings/mfd/twl4030-power.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
Texas Instruments TWL family (twl4030) reset and power management module

The power management module inside the TWL family provides several facilities
to control the power resources, including power scripts. For now, the
binding only supports the complete shutdown of the system after poweroff.

Required properties:
- compatible : must be "ti,twl4030-power"

Optional properties:
- ti,use_poweroff: With this flag, the chip will initiates an ACTIVE-to-OFF or
SLEEP-to-OFF transition when the system poweroffs.

Example:
&i2c1 {
clock-frequency = <2600000>;

twl: twl@48 {
reg = <0x48>;
interrupts = <7>; /* SYS_NIRQ cascaded to intc */
interrupt-parent = <&intc>;

twl_power: power {
compatible = "ti,twl4030-power";
ti,use_poweroff;
};
};
};
45 changes: 38 additions & 7 deletions drivers/mfd/twl4030-power.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <linux/pm.h>
#include <linux/i2c/twl.h>
#include <linux/platform_device.h>
#include <linux/of.h>

#include <asm/mach-types.h>

Expand Down Expand Up @@ -540,12 +541,30 @@ void twl4030_power_off(void)
pr_err("TWL4030 Unable to power off\n");
}

static bool twl4030_power_use_poweroff(struct twl4030_power_data *pdata,
struct device_node *node)
{
if (pdata && pdata->use_poweroff)
return true;

if (of_property_read_bool(node, "ti,use_poweroff"))
return true;

return false;
}

int twl4030_power_probe(struct platform_device *pdev)
{
struct twl4030_power_data *pdata = pdev->dev.platform_data;
struct device_node *node = pdev->dev.of_node;
int err = 0;
u8 val;

if (!pdata && !node) {
dev_err(&pdev->dev, "Platform data is missing\n");
return -EINVAL;
}

err = twl_i2c_write_u8(TWL_MODULE_PM_MASTER, TWL4030_PM_MASTER_KEY_CFG1,
TWL4030_PM_MASTER_PROTECT_KEY);
if (err)
Expand All @@ -556,15 +575,18 @@ int twl4030_power_probe(struct platform_device *pdev)
if (err)
goto unlock;

err = twl4030_power_configure_scripts(pdata);
if (err)
goto load;
err = twl4030_power_configure_resources(pdata);
if (err)
goto resource;
if (pdata) {
/* TODO: convert to device tree */
err = twl4030_power_configure_scripts(pdata);
if (err)
goto load;
err = twl4030_power_configure_resources(pdata);
if (err)
goto resource;
}

/* Board has to be wired properly to use this feature */
if (pdata->use_poweroff && !pm_power_off) {
if (twl4030_power_use_poweroff(pdata, node) && !pm_power_off) {
/* Default for SEQ_OFFSYNC is set, lets ensure this */
err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &val,
TWL4030_PM_MASTER_CFG_P123_TRANSITION);
Expand Down Expand Up @@ -610,10 +632,19 @@ static int twl4030_power_remove(struct platform_device *pdev)
return 0;
}

#ifdef CONFIG_OF
static const struct of_device_id twl4030_power_of_match[] = {
{.compatible = "ti,twl4030-power", },
{ },
};
MODULE_DEVICE_TABLE(of, twl4030_power_of_match);
#endif

static struct platform_driver twl4030_power_driver = {
.driver = {
.name = "twl4030_power",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(twl4030_power_of_match),
},
.probe = twl4030_power_probe,
.remove = twl4030_power_remove,
Expand Down

0 comments on commit b0fc1da

Please sign in to comment.