Commit 1a645884 authored by Jarkko Nikula's avatar Jarkko Nikula Committed by Tony Lindgren

ARM: OMAP: mcbsp: Make wakeup control generic

Currently wakeup control code is compiled only when CONFIG_ARCH_OMAP3 is
set even it should be available for CONFIG_ARCH_OMAP4 only builds also.

Fix this by making wakeup control generic so that it is executed whenever
new feature flag has_wakeup in platform data is set. Currently flag is set
for McBSP config types 3 and 4.

Remove also old comments about idle mode settings and HW bug workarounds
that were not updated during hwmod conversion.
Signed-off-by: default avatarJarkko Nikula <jarkko.nikula@bitmer.com>
Acked-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
Tested-by: default avatarJanusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent cdc71514
...@@ -141,6 +141,9 @@ static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused) ...@@ -141,6 +141,9 @@ static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused)
pdata->buffer_size = 0x80; pdata->buffer_size = 0x80;
} }
if (oh->class->rev >= MCBSP_CONFIG_TYPE3)
pdata->has_wakeup = true;
oh_device[0] = oh; oh_device[0] = oh;
if (oh->dev_attr) { if (oh->dev_attr) {
......
...@@ -317,6 +317,9 @@ struct omap_mcbsp_platform_data { ...@@ -317,6 +317,9 @@ struct omap_mcbsp_platform_data {
u16 buffer_size; u16 buffer_size;
u8 reg_size; u8 reg_size;
u8 reg_step; u8 reg_step;
/* McBSP platform and instance specific features */
bool has_wakeup; /* Wakeup capability */
}; };
struct omap_mcbsp_st_data { struct omap_mcbsp_st_data {
......
...@@ -659,35 +659,7 @@ int omap_mcbsp_get_dma_op_mode(unsigned int id) ...@@ -659,35 +659,7 @@ int omap_mcbsp_get_dma_op_mode(unsigned int id)
} }
EXPORT_SYMBOL(omap_mcbsp_get_dma_op_mode); EXPORT_SYMBOL(omap_mcbsp_get_dma_op_mode);
static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp)
{
/*
* Enable wakup behavior, smart idle and all wakeups
* REVISIT: some wakeups may be unnecessary
*/
if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
MCBSP_WRITE(mcbsp, WAKEUPEN, XRDYEN | RRDYEN);
}
}
static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp)
{
/*
* Disable wakup behavior, smart idle and all wakeups
*/
if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
/*
* HW bug workaround - If no_idle mode is taken, we need to
* go to smart_idle before going to always_idle, or the
* device will not hit retention anymore.
*/
MCBSP_WRITE(mcbsp, WAKEUPEN, 0);
}
}
#else #else
static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp) {}
static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp) {}
static inline void omap_st_start(struct omap_mcbsp *mcbsp) {} static inline void omap_st_start(struct omap_mcbsp *mcbsp) {}
static inline void omap_st_stop(struct omap_mcbsp *mcbsp) {} static inline void omap_st_stop(struct omap_mcbsp *mcbsp) {}
#endif #endif
...@@ -726,8 +698,9 @@ int omap_mcbsp_request(unsigned int id) ...@@ -726,8 +698,9 @@ int omap_mcbsp_request(unsigned int id)
pm_runtime_get_sync(mcbsp->dev); pm_runtime_get_sync(mcbsp->dev);
/* Do procedure specific to omap34xx arch, if applicable */ /* Enable wakeup behavior */
omap34xx_mcbsp_request(mcbsp); if (mcbsp->pdata->has_wakeup)
MCBSP_WRITE(mcbsp, WAKEUPEN, XRDYEN | RRDYEN);
/* /*
* Make sure that transmitter, receiver and sample-rate generator are * Make sure that transmitter, receiver and sample-rate generator are
...@@ -764,8 +737,9 @@ int omap_mcbsp_request(unsigned int id) ...@@ -764,8 +737,9 @@ int omap_mcbsp_request(unsigned int id)
if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free) if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
mcbsp->pdata->ops->free(id); mcbsp->pdata->ops->free(id);
/* Do procedure specific to omap34xx arch, if applicable */ /* Disable wakeup behavior */
omap34xx_mcbsp_free(mcbsp); if (mcbsp->pdata->has_wakeup)
MCBSP_WRITE(mcbsp, WAKEUPEN, 0);
pm_runtime_put_sync(mcbsp->dev); pm_runtime_put_sync(mcbsp->dev);
...@@ -794,8 +768,9 @@ void omap_mcbsp_free(unsigned int id) ...@@ -794,8 +768,9 @@ void omap_mcbsp_free(unsigned int id)
if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free) if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
mcbsp->pdata->ops->free(id); mcbsp->pdata->ops->free(id);
/* Do procedure specific to omap34xx arch, if applicable */ /* Disable wakeup behavior */
omap34xx_mcbsp_free(mcbsp); if (mcbsp->pdata->has_wakeup)
MCBSP_WRITE(mcbsp, WAKEUPEN, 0);
pm_runtime_put_sync(mcbsp->dev); pm_runtime_put_sync(mcbsp->dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment