[PATCH 3/7] mfd: twl4030-power: Add generic reset configuration

Lee Jones lee.jones at linaro.org
Tue May 20 08:12:05 PDT 2014


> The twl4030 PMIC needs to be configured properly for things like
> warm reset and deeper idle states so the PMIC manages the regulators
> properly based on the hardware triggers from the SoC.
> 
> For example, when rebooting an OMAP3530 at 125 MHz, it hangs.
> With this patch, TWL4030 will be reset when a warm reset occures.
> This way the OMAP3530 does not hang on reboot.
> 
> Let's use this as the default when compatible = "ti,twl4030-power".
> Other more complicated configurations can be added to the driver
> based on other compatible flags.
> 
> Based on earlier patch by Matthias Brugger <matthias.bgg at gmail.com>:
> 
> http://lists.infradead.org/pipermail/linux-arm-kernel/2013-January/144165.html
> 
> And Lesly A M <leslyam at ti.com>:
> 
> https://github.com/openembedded/openembedded/blob/master/recipes/linux/linux-omap-2.6.39/mfd/0010-MFD-TWL4030-power-scripts-for-OMAP3-boards.patch
> 
> For more information about twl4030 configuration for the
> "power scripts" see:
> 
> http://www.omappedia.com/wiki/TWL4030_power_scripts

Do you really want this bumph in the commit log?

> Cc: Matthias Brugger <matthias.bgg at gmail.com>
> Cc: Robert Nelson <robertcnelson at gmail.com>
> Cc: Peter De Schrijver <pdeschrijver at nvidia.com>
> Cc: Samuel Ortiz <sameo at linux.intel.com>
> Cc: Lee Jones <lee.jones at linaro.org>
> Signed-off-by: Tony Lindgren <tony at atomide.com>
> ---
>  .../devicetree/bindings/mfd/twl4030-power.txt      |  7 +-
>  drivers/mfd/twl4030-power.c                        | 99 +++++++++++++++++++---
>  include/linux/i2c/twl.h                            |  3 +
>  3 files changed, 95 insertions(+), 14 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/mfd/twl4030-power.txt b/Documentation/devicetree/bindings/mfd/twl4030-power.txt
> index 8e15ec3..b906116 100644
> --- a/Documentation/devicetree/bindings/mfd/twl4030-power.txt
> +++ b/Documentation/devicetree/bindings/mfd/twl4030-power.txt
> @@ -5,7 +5,12 @@ 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"
> +- compatible : must be one of the following
> +	"ti,twl4030-power"
> +	"ti,twl4030-power-reset"
> +
> +The use of ti,twl4030-power-reset is recommended at least on
> +3530 that needs a special configuration for warm reset to work.
>  
>  Optional properties:
>  - ti,use_poweroff: With this flag, the chip will initiates an ACTIVE-to-OFF or
> diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c
> index c0e4fc3..b61b725 100644
> --- a/drivers/mfd/twl4030-power.c
> +++ b/drivers/mfd/twl4030-power.c
> @@ -29,6 +29,7 @@
>  #include <linux/i2c/twl.h>
>  #include <linux/platform_device.h>
>  #include <linux/of.h>
> +#include <linux/of_device.h>
>  
>  #include <asm/mach-types.h>
>  
> @@ -128,6 +129,30 @@ static u8 res_config_addrs[] = {
>  	[RES_MAIN_REF]	= 0x94,
>  };
>  
> +/*
> + * Usable values for .remap_sleep and .remap_off
> + * Based on table "5.3.3 Resource Operating modes"
> + */
> +enum {
> +	TWL_REMAP_OFF = 0,
> +	TWL_REMAP_SLEEP = 8,
> +	TWL_REMAP_ACTIVE = 9,
> +};
> +
> +#define TWL_RESOURCE_ON(res)						\
> +	{ MSG_SINGULAR(DEV_GRP_NULL, (res), RES_STATE_ACTIVE), 0x02 }

Was ist das? Magic, floating, fluffy numbers.

> +#define TWL_RESOURCE_OFF(res)						\
> +	{ MSG_SINGULAR(DEV_GRP_NULL, (res), RES_STATE_OFF), 0x02 }
> +#define TWL_RESOURCE_RESET(res)						\
> +	{ MSG_SINGULAR(DEV_GRP_NULL, (res), RES_STATE_WRST), 0x02 }
> +#define TWL_RESOURCE_GROUP_RESET(group, type1, type2)			\
> +	{ MSG_BROADCAST(DEV_GRP_NULL, (group), (type1), (type2),	\
> +		RES_STATE_WRST), 0x02 }
> +#define TWL_REMAP_SLEEP(res, devgrp, typ, typ2)				\
> +	{ .resource = (res), .devgroup = (devgrp),			\
> +	  .type = (typ), .type2 = (typ2),				\
> +	  .remap_off = TWL_REMAP_OFF, .remap_sleep = TWL_REMAP_SLEEP, }
> +
>  static int twl4030_write_script_byte(u8 address, u8 byte)
>  {
>  	int err;
> @@ -502,7 +527,8 @@ int twl4030_remove_script(u8 flags)
>  	return err;
>  }
>  
> -static int twl4030_power_configure_scripts(struct twl4030_power_data *pdata)
> +static int
> +twl4030_power_configure_scripts(const struct twl4030_power_data *pdata)

Is this doing anything besides some sneaky clean-up?  If not, it
might be worth mentioning that you're taking advantage of these
changes to conduct such activities.

>  {
>  	int err;
>  	int i;
> @@ -518,7 +544,8 @@ static int twl4030_power_configure_scripts(struct twl4030_power_data *pdata)
>  	return 0;
>  }
>  
> -static int twl4030_power_configure_resources(struct twl4030_power_data *pdata)
> +static int
> +twl4030_power_configure_resources(const struct twl4030_power_data *pdata)

Ditto.

>  {
>  	struct twl4030_resconfig *resconfig = pdata->resource_config;
>  	int err;
> @@ -550,7 +577,7 @@ void twl4030_power_off(void)
>  		pr_err("TWL4030 Unable to power off\n");
>  }
>  
> -static bool twl4030_power_use_poweroff(struct twl4030_power_data *pdata,
> +static bool twl4030_power_use_poweroff(const struct twl4030_power_data *pdata,
>  					struct device_node *node)

Etc.

[...]

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog



More information about the linux-arm-kernel mailing list