[PATCH] ARM: OMAP2+: hwmod: Hook-up am33xx support in omap_hwmod framework

Hiremath, Vaibhav hvaibhav at ti.com
Tue Jul 3 09:08:33 EDT 2012


On Thu, Jun 28, 2012 at 21:14:16, Hiremath, Vaibhav wrote:
> AM33XX PRCM architecture is different that any OMAP family
> of devices, so it is required to have separate implementation
> to handle AM33XX module enable/disable, reset assert/deassert
> functionality.
> This patch adds wrapper api's in omap_hwmod framework to
> access prm/cm for AM33XX family of devices.
> 
> Signed-off-by: Vaibhav Hiremath <hvaibhav at ti.com>
> Cc: Paul Walmsley <paul at pwsan.com>
> Cc: Kevin Hilman <khilman at ti.com>
> Cc: Tony Lindgren <tony at atomide.com>
> ---

Ping !!!

Thanks,
Vaibhav


>  arch/arm/mach-omap2/omap_hwmod.c |  180 ++++++++++++++++++++++++++++++++++++++
>  1 files changed, 180 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
> index 6eedabe..8ecf7c6 100644
> --- a/arch/arm/mach-omap2/omap_hwmod.c
> +++ b/arch/arm/mach-omap2/omap_hwmod.c
> @@ -149,8 +149,10 @@
> 
>  #include "cm2xxx_3xxx.h"
>  #include "cminst44xx.h"
> +#include "cm33xx.h"
>  #include "prm2xxx_3xxx.h"
>  #include "prm44xx.h"
> +#include "prm33xx.h"
>  #include "prminst44xx.h"
>  #include "mux.h"
>  #include "pm.h"
> @@ -825,6 +827,27 @@ static void _omap4_enable_module(struct omap_hwmod *oh)
>  }
> 
>  /**
> + * _am33xx_enable_module - enable CLKCTRL modulemode on AM33XX
> + * @oh: struct omap_hwmod *
> + *
> + * Enables the PRCM module mode related to the hwmod @oh.
> + * No return value.
> + */
> +static void _am33xx_enable_module(struct omap_hwmod *oh)
> +{
> +	if (!oh->clkdm || !oh->prcm.omap4.modulemode)
> +		return;
> +
> +	pr_debug("omap_hwmod: %s: %s: %d\n",
> +		 oh->name, __func__, oh->prcm.omap4.modulemode);
> +
> +	am33xx_cm_module_enable(oh->prcm.omap4.modulemode,
> +				   oh->clkdm->cm_inst,
> +				   oh->clkdm->clkdm_offs,
> +				   oh->prcm.omap4.clkctrl_offs);
> +}
> +
> +/**
>   * _omap4_wait_target_disable - wait for a module to be disabled on OMAP4
>   * @oh: struct omap_hwmod *
>   *
> @@ -851,6 +874,31 @@ static int _omap4_wait_target_disable(struct omap_hwmod *oh)
>  }
> 
>  /**
> + * _am33xx_wait_target_disable - wait for a module to be disabled on AM33XX
> + * @oh: struct omap_hwmod *
> + *
> + * Wait for a module @oh to enter slave idle.  Returns 0 if the module
> + * does not have an IDLEST bit or if the module successfully enters
> + * slave idle; otherwise, pass along the return value of the
> + * appropriate *_cm*_wait_module_idle() function.
> + */
> +static int _am33xx_wait_target_disable(struct omap_hwmod *oh)
> +{
> +	if (!oh)
> +		return -EINVAL;
> +
> +	if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
> +		return 0;
> +
> +	if (oh->flags & HWMOD_NO_IDLEST)
> +		return 0;
> +
> +	return am33xx_cm_wait_module_idle(oh->clkdm->cm_inst,
> +					     oh->clkdm->clkdm_offs,
> +					     oh->prcm.omap4.clkctrl_offs);
> +}
> +
> +/**
>   * _count_mpu_irqs - count the number of MPU IRQ lines associated with @oh
>   * @oh: struct omap_hwmod *oh
>   *
> @@ -1555,6 +1603,37 @@ static int _omap4_disable_module(struct omap_hwmod *oh)
>  }
> 
>  /**
> + * _am33xx_disable_module - enable CLKCTRL modulemode on AM33XX
> + * @oh: struct omap_hwmod *
> + *
> + * Disable the PRCM module mode related to the hwmod @oh.
> + * Return EINVAL if the modulemode is not supported and 0 in case of success.
> + */
> +static int _am33xx_disable_module(struct omap_hwmod *oh)
> +{
> +	int v;
> +
> +	if (!oh->clkdm || !oh->prcm.omap4.modulemode)
> +		return -EINVAL;
> +
> +	pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__);
> +
> +	am33xx_cm_module_disable(oh->clkdm->cm_inst,
> +				    oh->clkdm->clkdm_offs,
> +				    oh->prcm.omap4.clkctrl_offs);
> +
> +	if (_are_any_hardreset_lines_asserted(oh))
> +		return 0;
> +
> +	v = _am33xx_wait_target_disable(oh);
> +	if (v)
> +		pr_warn("omap_hwmod: %s: _wait_target_disable failed\n",
> +			oh->name);
> +
> +	return 0;
> +}
> +
> +/**
>   * _ocp_softreset - reset an omap_hwmod via the OCP_SYSCONFIG bit
>   * @oh: struct omap_hwmod *
>   *
> @@ -2481,6 +2560,33 @@ static int _omap4_wait_target_ready(struct omap_hwmod *oh)
>  }
> 
>  /**
> + * _am33xx_wait_target_ready - wait for a module to leave slave idle
> + * @oh: struct omap_hwmod *
> + *
> + * Wait for a module @oh to leave slave idle.  Returns 0 if the module
> + * does not have an IDLEST bit or if the module successfully leaves
> + * slave idle; otherwise, pass along the return value of the
> + * appropriate *_cm*_wait_module_ready() function.
> + */
> +static int _am33xx_wait_target_ready(struct omap_hwmod *oh)
> +{
> +	if (!oh || !oh->clkdm)
> +		return -EINVAL;
> +
> +	if (oh->flags & HWMOD_NO_IDLEST)
> +		return 0;
> +
> +	if (!_find_mpu_rt_port(oh))
> +		return 0;
> +
> +	/* XXX check module SIDLEMODE, hardreset status */
> +
> +	return am33xx_cm_wait_module_ready(oh->clkdm->cm_inst,
> +					      oh->clkdm->clkdm_offs,
> +					      oh->prcm.omap4.clkctrl_offs);
> +}
> +
> +/**
>   * _omap2_assert_hardreset - call OMAP2 PRM hardreset fn with hwmod args
>   * @oh: struct omap_hwmod * to assert hardreset
>   * @ohri: hardreset line data
> @@ -2611,6 +2717,72 @@ static int _omap4_is_hardreset_asserted(struct omap_hwmod *oh,
>  				oh->prcm.omap4.rstctrl_offs);
>  }
> 
> +/**
> + * _am33xx_assert_hardreset - call AM33XX PRM hardreset fn with hwmod args
> + * @oh: struct omap_hwmod * to assert hardreset
> + * @ohri: hardreset line data
> + *
> + * Call am33xx_prminst_assert_hardreset() with parameters extracted
> + * from the hwmod @oh and the hardreset line data @ohri.  Only
> + * intended for use as an soc_ops function pointer.  Passes along the
> + * return value from am33xx_prminst_assert_hardreset().  XXX This
> + * function is scheduled for removal when the PRM code is moved into
> + * drivers/.
> + */
> +static int _am33xx_assert_hardreset(struct omap_hwmod *oh,
> +				   struct omap_hwmod_rst_info *ohri)
> +
> +{
> +	return am33xx_prm_assert_hardreset(ohri->rst_shift,
> +				oh->clkdm->pwrdm.ptr->prcm_offs,
> +				oh->prcm.omap4.rstctrl_offs);
> +}
> +
> +/**
> + * _am33xx_deassert_hardreset - call AM33XX PRM hardreset fn with hwmod args
> + * @oh: struct omap_hwmod * to deassert hardreset
> + * @ohri: hardreset line data
> + *
> + * Call am33xx_prminst_deassert_hardreset() with parameters extracted
> + * from the hwmod @oh and the hardreset line data @ohri.  Only
> + * intended for use as an soc_ops function pointer.  Passes along the
> + * return value from am33xx_prminst_deassert_hardreset().  XXX This
> + * function is scheduled for removal when the PRM code is moved into
> + * drivers/.
> + */
> +static int _am33xx_deassert_hardreset(struct omap_hwmod *oh,
> +				     struct omap_hwmod_rst_info *ohri)
> +{
> +	if (ohri->st_shift)
> +		pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n",
> +		       oh->name, ohri->name);
> +
> +	return am33xx_prm_deassert_hardreset(ohri->rst_shift,
> +				oh->clkdm->pwrdm.ptr->prcm_offs,
> +				oh->prcm.omap4.rstctrl_offs,
> +				oh->prcm.omap4.rstst_offs);
> +}
> +
> +/**
> + * _am33xx_is_hardreset_asserted - call AM33XX PRM hardreset fn with hwmod args
> + * @oh: struct omap_hwmod * to test hardreset
> + * @ohri: hardreset line data
> + *
> + * Call am33xx_prminst_is_hardreset_asserted() with parameters
> + * extracted from the hwmod @oh and the hardreset line data @ohri.
> + * Only intended for use as an soc_ops function pointer.  Passes along
> + * the return value from am33xx_prminst_is_hardreset_asserted().  XXX
> + * This function is scheduled for removal when the PRM code is moved
> + * into drivers/.
> + */
> +static int _am33xx_is_hardreset_asserted(struct omap_hwmod *oh,
> +					struct omap_hwmod_rst_info *ohri)
> +{
> +	return am33xx_prm_is_hardreset_asserted(ohri->rst_shift,
> +				oh->clkdm->pwrdm.ptr->prcm_offs,
> +				oh->prcm.omap4.rstctrl_offs);
> +}
> +
>  /* Public functions */
> 
>  u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs)
> @@ -3610,6 +3782,14 @@ void __init omap_hwmod_init(void)
>  		soc_ops.deassert_hardreset = _omap4_deassert_hardreset;
>  		soc_ops.is_hardreset_asserted = _omap4_is_hardreset_asserted;
>  		soc_ops.init_clkdm = _init_clkdm;
> +	} else if (soc_is_am33xx()) {
> +		soc_ops.enable_module = _am33xx_enable_module;
> +		soc_ops.disable_module = _am33xx_disable_module;
> +		soc_ops.wait_target_ready = _am33xx_wait_target_ready;
> +		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 {
>  		WARN(1, "omap_hwmod: unknown SoC type\n");
>  	}
> --
> 1.7.0.4
> 
> 




More information about the linux-arm-kernel mailing list