[PATCH] arm: prima2: move to generic reset controller driver framework

Olof Johansson olof at lixom.net
Sat Jun 1 01:22:39 EDT 2013


Hi,

On Tue, May 28, 2013 at 11:06:26AM +0800, Barry Song wrote:
> this moves to generic IP module reset framework, and make other drivers
> use common device_reset() API.
> 
> Cc: Philipp Zabel <p.zabel at pengutronix.de>
> Signed-off-by: Barry Song <Baohua.Song at csr.com>
> ---
>  arch/arm/boot/dts/atlas6.dtsi |  3 +-
>  arch/arm/boot/dts/marco.dtsi  |  3 +-
>  arch/arm/boot/dts/prima2.dtsi |  3 +-
>  arch/arm/mach-prima2/rstc.c   | 71 ++++++++++++++++++++++++++-----------------
>  4 files changed, 49 insertions(+), 31 deletions(-)
> 
> diff --git a/arch/arm/boot/dts/atlas6.dtsi b/arch/arm/boot/dts/atlas6.dtsi
> index 7d1a279..ffe5203 100644
> --- a/arch/arm/boot/dts/atlas6.dtsi
> +++ b/arch/arm/boot/dts/atlas6.dtsi
> @@ -56,9 +56,10 @@
>  				#clock-cells = <1>;
>  			};
>  
> -			reset-controller at 88010000 {
> +			rstc: reset-controller at 88010000 {
>  				compatible = "sirf,prima2-rstc";
>  				reg = <0x88010000 0x1000>;
> +				#reset-cells = <1>;
>  			};
>  
>  			rsc-controller at 88020000 {
> diff --git a/arch/arm/boot/dts/marco.dtsi b/arch/arm/boot/dts/marco.dtsi
> index 1579c34..0c9647d 100644
> --- a/arch/arm/boot/dts/marco.dtsi
> +++ b/arch/arm/boot/dts/marco.dtsi
> @@ -58,9 +58,10 @@
>  			#size-cells = <1>;
>  			ranges = <0xc2000000 0xc2000000 0x1000000>;
>  
> -			reset-controller at c2000000 {
> +			rstc: reset-controller at c2000000 {
>  				compatible = "sirf,marco-rstc";
>  				reg = <0xc2000000 0x10000>;
> +				#reset-cells = <1>;
>  			};
>  		};
>  
> diff --git a/arch/arm/boot/dts/prima2.dtsi b/arch/arm/boot/dts/prima2.dtsi
> index 3329719..5ecf1f9 100644
> --- a/arch/arm/boot/dts/prima2.dtsi
> +++ b/arch/arm/boot/dts/prima2.dtsi
> @@ -65,9 +65,10 @@
>  				#clock-cells = <1>;
>  			};
>  
> -			reset-controller at 88010000 {
> +			rstc: reset-controller at 88010000 {
>  				compatible = "sirf,prima2-rstc";
>  				reg = <0x88010000 0x1000>;
> +				#reset-cells = <1>;
>  			};
>  
>  			rsc-controller at 88020000 {
> diff --git a/arch/arm/mach-prima2/rstc.c b/arch/arm/mach-prima2/rstc.c
> index 435019c..a4d77eb 100644
> --- a/arch/arm/mach-prima2/rstc.c
> +++ b/arch/arm/mach-prima2/rstc.c
> @@ -13,44 +13,24 @@
>  #include <linux/device.h>
>  #include <linux/of.h>
>  #include <linux/of_address.h>
> +#include <linux/reset-controller.h>
> +
> +#define SIRFSOC_RSTBIT_NUM	64
>  
>  void __iomem *sirfsoc_rstc_base;
>  static DEFINE_MUTEX(rstc_lock);
>  
> -static struct of_device_id rstc_ids[]  = {
> -	{ .compatible = "sirf,prima2-rstc" },
> -	{ .compatible = "sirf,marco-rstc" },
> -	{},
> -};
> -
> -static int __init sirfsoc_of_rstc_init(void)
> -{
> -	struct device_node *np;
> -
> -	np = of_find_matching_node(NULL, rstc_ids);
> -	if (!np)
> -		panic("unable to find compatible rstc node in dtb\n");
> -
> -	sirfsoc_rstc_base = of_iomap(np, 0);
> -	if (!sirfsoc_rstc_base)
> -		panic("unable to map rstc cpu registers\n");
> -
> -	of_node_put(np);
> -
> -	return 0;
> -}
> -early_initcall(sirfsoc_of_rstc_init);
> -
> -int sirfsoc_reset_device(struct device *dev)
> +static int sirfsoc_reset_module(struct reset_controller_dev *rcdev,
> +					unsigned long sw_reset_idx)
>  {
> -	u32 reset_bit;
> +	u32 reset_bit = sw_reset_idx;
>  
> -	if (of_property_read_u32(dev->of_node, "reset-bit", &reset_bit))
> +	if (reset_bit >= SIRFSOC_RSTBIT_NUM)
>  		return -EINVAL;
>  
>  	mutex_lock(&rstc_lock);
>  
> -	if (of_device_is_compatible(dev->of_node, "sirf,prima2-rstc")) {
> +	if (of_device_is_compatible(rcdev->of_node, "sirf,prima2-rstc")) {
>  		/*
>  		 * Writing 1 to this bit resets corresponding block. Writing 0 to this
>  		 * bit de-asserts reset signal of the corresponding block.
> @@ -80,6 +60,41 @@ int sirfsoc_reset_device(struct device *dev)
>  	return 0;
>  }
>  
> +static struct reset_control_ops sirfsoc_rstc_ops = {
> +	.reset = sirfsoc_reset_module,
> +};
> +
> +static struct reset_controller_dev sirfsoc_reset_controller = {
> +	.ops = &sirfsoc_rstc_ops,
> +	.nr_resets = SIRFSOC_RSTBIT_NUM,
> +};
> +
> +static struct of_device_id rstc_ids[]  = {
> +	{ .compatible = "sirf,prima2-rstc" },
> +	{ .compatible = "sirf,marco-rstc" },
> +	{},
> +};
> +
> +static int __init sirfsoc_of_rstc_init(void)
> +{
> +	struct device_node *np = of_find_matching_node(NULL, rstc_ids);
> +	if (!np)
> +		goto out;

Return -ENODEV?

> +	sirfsoc_rstc_base = of_iomap(np, 0);
> +	if (!sirfsoc_rstc_base)
> +		panic("unable to map rstc cpu registers\n");

Is this really panic-worthy? Would it be sufficient to report error and
continue booting?

> +
> +	sirfsoc_reset_controller.of_node = np;
> +
> +	if (IS_ENABLED(CONFIG_RESET_CONTROLLER))
> +		reset_controller_register(&sirfsoc_reset_controller);
> +
> +out:
> +	return 0;
> +}
> +arch_initcall(sirfsoc_of_rstc_init);



More information about the linux-arm-kernel mailing list