* Dave Gerlach <d-gerlach@xxxxxx> [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 <d-gerlach@xxxxxx> > Signed-off-by: Suman Anna <s-anna@xxxxxx> > --- > 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 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html