[alsa-devel] [PATCH v2 09/13] OMAP: McBSP: use omap_device APIs to modify SYSCONFIG
Peter Ujfalusi
peter.ujfalusi at nokia.com
Tue Feb 1 13:19:03 CET 2011
Hi,
On 01/31/2011 04:50 PM, ext Kishon Vijay Abraham I wrote:
> McBSP2/3 in OMAP3 has sidetone feature which requires autoidle
> to be disabled before starting the sidetone. Also SYSCONFIG
> register has to be set with smart idle or no idle depending on the
> dma op mode (threshold or element sync). For doing these operations
> dynamically at runtime, omap_device APIs are used to modify SYSCONFIG register.
>
> Signed-off-by: Kishon Vijay Abraham I <kishon at ti.com>
> ---
> arch/arm/plat-omap/mcbsp.c | 66 +++++++++++++++++++++++--------------------
> 1 files changed, 35 insertions(+), 31 deletions(-)
>
> diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
...
> static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp)
> {
> + struct omap_device *od;
> +
> + od = find_omap_device_by_dev(mcbsp->dev);
> /*
> * Enable wakup behavior, smart idle and all wakeups
> * REVISIT: some wakeups may be unnecessary
> */
> if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
> - u16 syscon;
> -
> - syscon = MCBSP_READ(mcbsp, SYSCON);
> - syscon &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03));
> -
> - if (mcbsp->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) {
> - syscon |= (ENAWAKEUP | SIDLEMODE(0x02) |
> - CLOCKACTIVITY(0x02));
> + if (mcbsp->dma_op_mode != MCBSP_DMA_MODE_THRESHOLD)
> + omap_device_noidle(od);
> + else
Would it make sense to call here:
omap_device_smartidle(od); ?
What happens, if we configure McBSP to element mode, play a sample,
configure it to threshold?
I think we should explicitly as for smartidle, when we suppose to be in
smartidle.
> MCBSP_WRITE(mcbsp, WAKEUPEN, XRDYEN | RRDYEN);
> - } else {
> - syscon |= SIDLEMODE(0x01);
> - }
> -
> - MCBSP_WRITE(mcbsp, SYSCON, syscon);
> }
> }
>
> static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp)
> {
> + struct omap_device *od;
> +
> + od = find_omap_device_by_dev(mcbsp->dev);
> +
> /*
> * Disable wakup behavior, smart idle and all wakeups
> */
> if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
> - u16 syscon;
> -
> - syscon = MCBSP_READ(mcbsp, SYSCON);
> - syscon &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03));
> /*
> * 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.
> */
> - syscon |= SIDLEMODE(0x02);
> - MCBSP_WRITE(mcbsp, SYSCON, syscon);
> -
> - syscon &= ~(SIDLEMODE(0x03));
> - MCBSP_WRITE(mcbsp, SYSCON, syscon);
> -
> + omap_device_default_idle(od);
> MCBSP_WRITE(mcbsp, WAKEUPEN, 0);
Hrm, it would be better to do it as the comment said:
omap_device_smartidle(od);
omap_device_forceidle(od);
BTW: what is the default_idle in case of McBSP?
--
Péter
More information about the Alsa-devel
mailing list