Subject: [PATCH] ARM: OMAP2+: PRM: Fix am437x module reset

From: [email-masked] (Tony Lindgren)
Date: Mon, 4 May 2015 10:19:26 -0700

* Dave Gerlach <[email-masked]> [150501 12:28]:
> When moving to using the OMAP4+ PRM driver on am437x, we switched
> to using all omap4 ops for module reset management. However, reset
> register layout on am437x is more similar to am335x than omap4 because
> of the the need for an st_shift for the *_RST bits in certain *_RSTST
> registers, like WKUP_PROC_LRST in the PRCM_RM_WKUP_RSTST. Without this
> we cannot bring the Wakeup M3 IP out of reset.
> 
> Because of this, we must use the am33xx prm ops for the hardreset
> functionality while continuing to use all other omap4 ops. To accomplish
> this we split out the common portion of omap44xx_prm_init and add an
> am437x_prm_init to register the prm_ll_data struct specific to am437x.
> 
> Signed-off-by: Dave Gerlach <[email-masked]>
> Signed-off-by: Suman Anna <[email-masked]>
> ---
>  arch/arm/mach-omap2/omap_hwmod.c   |  6 +++---
>  arch/arm/mach-omap2/prm33xx.c      | 14 +++++++-------
>  arch/arm/mach-omap2/prm33xx.h      |  7 +++++++
>  arch/arm/mach-omap2/prm44xx.c      | 32 +++++++++++++++++++++++++++++++-
>  arch/arm/mach-omap2/prm44xx_54xx.h |  1 +
>  arch/arm/mach-omap2/prm_common.c   |  2 +-
>  6 files changed, 50 insertions(+), 12 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
> index 982380b..4b13882 100644
> --- a/arch/arm/mach-omap2/omap_hwmod.c
> +++ b/arch/arm/mach-omap2/omap_hwmod.c
> @@ -3924,9 +3924,9 @@ void __init omap_hwmod_init(void)
>  		soc_ops.enable_module = _omap4_enable_module;
>  		soc_ops.disable_module = _omap4_disable_module;
>  		soc_ops.wait_target_ready = _omap4_wait_target_ready;
> -		soc_ops.assert_hardreset = _omap4_assert_hardreset;
> -		soc_ops.deassert_hardreset = _omap4_deassert_hardreset;
> -		soc_ops.is_hardreset_asserted = _omap4_is_hardreset_asserted;
> +		soc_ops.assert_hardreset = _am33xx_assert_hardreset;
> +		soc_ops.deassert_hardreset = _am33xx_deassert_hardreset;
> +		soc_ops.is_hardreset_asserted = _am33xx_is_hardreset_asserted;
>  		soc_ops.init_clkdm = _init_clkdm;
>  	} else if (cpu_is_ti816x() || soc_is_am33xx()) {
>  		soc_ops.enable_module = _omap4_enable_module;

Can't the above just become then:

		...
	} else if (cpu_is_omap44xx() || soc_is_omap54xx() || soc_is_dra7xx()) {
		...
	} else if (cpu_is_ti816x() || soc_is_am33xx() || soc_is_am43xx()) {
		...
	}

> --- a/arch/arm/mach-omap2/prm44xx.c
> +++ b/arch/arm/mach-omap2/prm44xx.c
> @@ -24,6 +24,7 @@
>  #include "iomap.h"
>  #include "common.h"
>  #include "vp.h"
> +#include "prm33xx.h"
>  #include "prm44xx.h"
>  #include "prm-regbits-44xx.h"
>  #include "prcm44xx.h"
> @@ -705,7 +706,7 @@ static struct prm_ll_data omap44xx_prm_ll_data = {
>  
>  static const struct omap_prcm_init_data *prm_init_data;
>  
> -int __init omap44xx_prm_init(const struct omap_prcm_init_data *data)
> +static void omap44xx_prm_init_common(const struct omap_prcm_init_data *data)
>  {
>  	omap_prm_base_init();
>  
> @@ -718,7 +719,11 @@ int __init omap44xx_prm_init(const struct omap_prcm_init_data *data)
>  		prm_features |= PRM_HAS_VOLTAGE;
>  
>  	omap4_prminst_set_prm_dev_inst(data->device_inst_offset);
> +}
>  
> +int __init omap44xx_prm_init(const struct omap_prcm_init_data *data)
> +{
> +	omap44xx_prm_init_common(data);
>  	return prm_register(&omap44xx_prm_ll_data);
>  }
>  
> @@ -762,3 +767,28 @@ static void __exit omap44xx_prm_exit(void)
>  	prm_unregister(&omap44xx_prm_ll_data);
>  }
>  __exitcall(omap44xx_prm_exit);
> +
> +#ifdef CONFIG_SOC_AM43XX
> +static struct prm_ll_data am43xx_prm_ll_data = {
> +	.read_reset_sources = &omap44xx_prm_read_reset_sources,
> +	.was_any_context_lost_old = &omap44xx_prm_was_any_context_lost_old,
> +	.clear_context_loss_flags_old = &omap44xx_prm_clear_context_loss_flags_old,
> +	.late_init = &omap44xx_prm_late_init,
> +	.assert_hardreset	= am33xx_prm_assert_hardreset,
> +	.deassert_hardreset	= am33xx_prm_deassert_hardreset,
> +	.is_hardreset_asserted	= am33xx_prm_is_hardreset_asserted,
> +	.reset_system		= omap4_prminst_global_warm_sw_reset,
> +};
> +
> +int __init am43xx_prm_init(const struct omap_prcm_init_data *data)
> +{
> +	omap44xx_prm_init_common(data);
> +	return prm_register(&am43xx_prm_ll_data);
> +}
> +
> +static void __exit am43xx_prm_exit(void)
> +{
> +	prm_unregister(&am43xx_prm_ll_data);
> +}
> +__exitcall(am43xx_prm_exit);

I think you can similarly just move this to use prm33xx.c instead of
prm44xx.c and keep the functions static that way?

Regards,

Tony