diff options
author | Florian Vaussard <florian.vaussard@epfl.ch> | 2013-06-18 09:17:58 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2013-06-19 04:19:40 -0400 |
commit | b0fc1da4d0359d3cce8f12e0f014aed0704ae202 (patch) | |
tree | 321bd393b7f3d685d43fbef87c8a381a13514113 /drivers/mfd | |
parent | f58cb407632ecf0ec01627b8a61852d5585b573d (diff) |
mfd: twl4030-power: Start transition to DT
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>
Diffstat (limited to 'drivers/mfd')
-rw-r--r-- | drivers/mfd/twl4030-power.c | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c index d36622d0f98a..5b2848280f4b 100644 --- a/drivers/mfd/twl4030-power.c +++ b/drivers/mfd/twl4030-power.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/pm.h> | 28 | #include <linux/pm.h> |
29 | #include <linux/i2c/twl.h> | 29 | #include <linux/i2c/twl.h> |
30 | #include <linux/platform_device.h> | 30 | #include <linux/platform_device.h> |
31 | #include <linux/of.h> | ||
31 | 32 | ||
32 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
33 | 34 | ||
@@ -540,12 +541,30 @@ void twl4030_power_off(void) | |||
540 | pr_err("TWL4030 Unable to power off\n"); | 541 | pr_err("TWL4030 Unable to power off\n"); |
541 | } | 542 | } |
542 | 543 | ||
544 | static bool twl4030_power_use_poweroff(struct twl4030_power_data *pdata, | ||
545 | struct device_node *node) | ||
546 | { | ||
547 | if (pdata && pdata->use_poweroff) | ||
548 | return true; | ||
549 | |||
550 | if (of_property_read_bool(node, "ti,use_poweroff")) | ||
551 | return true; | ||
552 | |||
553 | return false; | ||
554 | } | ||
555 | |||
543 | int twl4030_power_probe(struct platform_device *pdev) | 556 | int twl4030_power_probe(struct platform_device *pdev) |
544 | { | 557 | { |
545 | struct twl4030_power_data *pdata = pdev->dev.platform_data; | 558 | struct twl4030_power_data *pdata = pdev->dev.platform_data; |
559 | struct device_node *node = pdev->dev.of_node; | ||
546 | int err = 0; | 560 | int err = 0; |
547 | u8 val; | 561 | u8 val; |
548 | 562 | ||
563 | if (!pdata && !node) { | ||
564 | dev_err(&pdev->dev, "Platform data is missing\n"); | ||
565 | return -EINVAL; | ||
566 | } | ||
567 | |||
549 | err = twl_i2c_write_u8(TWL_MODULE_PM_MASTER, TWL4030_PM_MASTER_KEY_CFG1, | 568 | err = twl_i2c_write_u8(TWL_MODULE_PM_MASTER, TWL4030_PM_MASTER_KEY_CFG1, |
550 | TWL4030_PM_MASTER_PROTECT_KEY); | 569 | TWL4030_PM_MASTER_PROTECT_KEY); |
551 | if (err) | 570 | if (err) |
@@ -556,15 +575,18 @@ int twl4030_power_probe(struct platform_device *pdev) | |||
556 | if (err) | 575 | if (err) |
557 | goto unlock; | 576 | goto unlock; |
558 | 577 | ||
559 | err = twl4030_power_configure_scripts(pdata); | 578 | if (pdata) { |
560 | if (err) | 579 | /* TODO: convert to device tree */ |
561 | goto load; | 580 | err = twl4030_power_configure_scripts(pdata); |
562 | err = twl4030_power_configure_resources(pdata); | 581 | if (err) |
563 | if (err) | 582 | goto load; |
564 | goto resource; | 583 | err = twl4030_power_configure_resources(pdata); |
584 | if (err) | ||
585 | goto resource; | ||
586 | } | ||
565 | 587 | ||
566 | /* Board has to be wired properly to use this feature */ | 588 | /* Board has to be wired properly to use this feature */ |
567 | if (pdata->use_poweroff && !pm_power_off) { | 589 | if (twl4030_power_use_poweroff(pdata, node) && !pm_power_off) { |
568 | /* Default for SEQ_OFFSYNC is set, lets ensure this */ | 590 | /* Default for SEQ_OFFSYNC is set, lets ensure this */ |
569 | err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &val, | 591 | err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &val, |
570 | TWL4030_PM_MASTER_CFG_P123_TRANSITION); | 592 | TWL4030_PM_MASTER_CFG_P123_TRANSITION); |
@@ -610,10 +632,19 @@ static int twl4030_power_remove(struct platform_device *pdev) | |||
610 | return 0; | 632 | return 0; |
611 | } | 633 | } |
612 | 634 | ||
635 | #ifdef CONFIG_OF | ||
636 | static const struct of_device_id twl4030_power_of_match[] = { | ||
637 | {.compatible = "ti,twl4030-power", }, | ||
638 | { }, | ||
639 | }; | ||
640 | MODULE_DEVICE_TABLE(of, twl4030_power_of_match); | ||
641 | #endif | ||
642 | |||
613 | static struct platform_driver twl4030_power_driver = { | 643 | static struct platform_driver twl4030_power_driver = { |
614 | .driver = { | 644 | .driver = { |
615 | .name = "twl4030_power", | 645 | .name = "twl4030_power", |
616 | .owner = THIS_MODULE, | 646 | .owner = THIS_MODULE, |
647 | .of_match_table = of_match_ptr(twl4030_power_of_match), | ||
617 | }, | 648 | }, |
618 | .probe = twl4030_power_probe, | 649 | .probe = twl4030_power_probe, |
619 | .remove = twl4030_power_remove, | 650 | .remove = twl4030_power_remove, |