From: Jarkko Nikula <jhnikula@gmail.com>
To: linux-omap@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org,
Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>,
Peter Ujfalusi <peter.ujfalusi@ti.com>,
Jarkko Nikula <jhnikula@gmail.com>, Paul Wamsley <paul@pwsan.com>
Subject: [RFC 10/12] omap: mcbsp: Move sidetone clock management to mach-omap2/mcbsp.c
Date: Fri, 1 Jul 2011 11:52:34 +0300 [thread overview]
Message-ID: <1309510356-27147-11-git-send-email-jhnikula@gmail.com> (raw)
In-Reply-To: <1309510356-27147-1-git-send-email-jhnikula@gmail.com>
Active sidetone requires that McBSP interface clock doesn't idle and there
is no mechanism in hwmod to turn autoidling on/off in runtime. McBSP2 and 3
in OMAP34xx share their interface clock with McBSP sidetone module and
that interface clock must be active when the sidetone is operating.
Sidetone has its own autoidle bit which should keep the interface clock
active but it is broken. Putting the McBSP core to no-idle mode when the
sidetone is active is no good either since it results to higher power
consumption when using the threshold based DMA transfers.
For making the McBSP code more generic, move this sidetone clock management
with fixme comments to mach-omap2/mcbsp.c and pass pointer to it via
platform data.
Signed-off-by: Jarkko Nikula <jhnikula@gmail.com>
Cc: Paul Wamsley <paul@pwsan.com>
---
arch/arm/mach-omap2/mcbsp.c | 26 ++++++++++++++++++++++++++
arch/arm/plat-omap/include/plat/mcbsp.h | 1 +
arch/arm/plat-omap/mcbsp.c | 18 ++++--------------
3 files changed, 31 insertions(+), 14 deletions(-)
diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c
index 1408156..88ee00f 100644
--- a/arch/arm/mach-omap2/mcbsp.c
+++ b/arch/arm/mach-omap2/mcbsp.c
@@ -27,6 +27,13 @@
#include "control.h"
+/*
+ * FIXME: Find a mechanism to enable/disable runtime the McBSP ICLK autoidle.
+ * Sidetone needs non-gated ICLK and sidetone autoidle is broken.
+ */
+#include "cm2xxx_3xxx.h"
+#include "cm-regbits-34xx.h"
+
/* McBSP internal signal muxing functions */
void omap2_mcbsp1_mux_clkr_src(u8 mux)
@@ -102,6 +109,24 @@ int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id)
}
EXPORT_SYMBOL(omap2_mcbsp_set_clks_src);
+static int omap3_enable_st_clock(unsigned int id, bool enable)
+{
+ unsigned int w;
+
+ /*
+ * Sidetone uses McBSP ICLK - which must not idle when sidetones
+ * are enabled or sidetones start sounding ugly.
+ */
+ w = omap2_cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE);
+ if (enable)
+ w &= ~(1 << (id - 2));
+ else
+ w |= 1 << (id - 2);
+ omap2_cm_write_mod_reg(w, OMAP3430_PER_MOD, CM_AUTOIDLE);
+
+ return 0;
+}
+
struct omap_device_pm_latency omap2_mcbsp_latency[] = {
{
.deactivate_func = omap_device_idle_hwmods,
@@ -149,6 +174,7 @@ static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused)
if (oh->dev_attr) {
oh_device[1] = omap_hwmod_lookup((
(struct omap_mcbsp_dev_attr *)(oh->dev_attr))->sidetone);
+ pdata->enable_st_clock = omap3_enable_st_clock;
count++;
}
od = omap_device_build_ss(name, id, oh_device, count, pdata,
diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h
index 31b24c9..2a7e8d5 100644
--- a/arch/arm/plat-omap/include/plat/mcbsp.h
+++ b/arch/arm/plat-omap/include/plat/mcbsp.h
@@ -317,6 +317,7 @@ struct omap_mcbsp_platform_data {
#ifdef CONFIG_ARCH_OMAP3
/* Sidetone block for McBSP 2 and 3 */
unsigned long phys_base_st;
+ int (*enable_st_clock)(unsigned int, bool);
#endif
u16 buffer_size;
unsigned int mcbsp_config_type;
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index 202292a..1a7cfb3 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -26,10 +26,6 @@
#include <plat/mcbsp.h>
#include <linux/pm_runtime.h>
-/* XXX These "sideways" includes are a sign that something is wrong */
-#include "../mach-omap2/cm2xxx_3xxx.h"
-#include "../mach-omap2/cm-regbits-34xx.h"
-
struct omap_mcbsp **mcbsp_ptr;
int omap_mcbsp_count, omap_mcbsp_cache_size;
@@ -267,13 +263,8 @@ static void omap_st_on(struct omap_mcbsp *mcbsp)
{
unsigned int w;
- /*
- * Sidetone uses McBSP ICLK - which must not idle when sidetones
- * are enabled or sidetones start sounding ugly.
- */
- w = omap2_cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE);
- w &= ~(1 << (mcbsp->id - 2));
- omap2_cm_write_mod_reg(w, OMAP3430_PER_MOD, CM_AUTOIDLE);
+ if (mcbsp->pdata->enable_st_clock)
+ mcbsp->pdata->enable_st_clock(mcbsp->id, 1);
/* Enable McBSP Sidetone */
w = MCBSP_READ(mcbsp, SSELCR);
@@ -294,9 +285,8 @@ static void omap_st_off(struct omap_mcbsp *mcbsp)
w = MCBSP_READ(mcbsp, SSELCR);
MCBSP_WRITE(mcbsp, SSELCR, w & ~(SIDETONEEN));
- w = omap2_cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE);
- w |= 1 << (mcbsp->id - 2);
- omap2_cm_write_mod_reg(w, OMAP3430_PER_MOD, CM_AUTOIDLE);
+ if (mcbsp->pdata->enable_st_clock)
+ mcbsp->pdata->enable_st_clock(mcbsp->id, 0);
}
static void omap_st_fir_write(struct omap_mcbsp *mcbsp, s16 *fir)
--
1.7.0.4
next prev parent reply other threads:[~2011-07-01 8:53 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-01 8:52 [RFC 0/12] McBSP cleanup and generalization Jarkko Nikula
2011-07-01 8:52 ` [RFC 01/12] ASoC: OMAP: McBSP: fix build breakage on OMAP1 Jarkko Nikula
2011-07-01 8:52 ` [RFC 02/12] omap: mcbsp: Remove rx_/tx_word_length variables Jarkko Nikula
2011-07-07 19:08 ` Tony Lindgren
2011-07-01 8:52 ` [RFC 03/12] omap: mcbsp: Remove port number enums Jarkko Nikula
2011-07-01 8:52 ` [RFC 04/12] omap: mcbsp: Merge OMAP1 and OMAP2+ McBSP register definitions Jarkko Nikula
2011-07-03 23:08 ` Janusz Krzysztofik
2011-07-01 8:52 ` [RFC 05/12] omap: mcbsp: Move out omap_mcbsp_register_board_cfg from plat-omap/devices.c Jarkko Nikula
2011-07-01 8:52 ` [RFC 06/12] omap: mcbsp: Implement generic register and cache access Jarkko Nikula
2011-07-01 8:52 ` [RFC 07/12] omap: mcbsp: Get rid of remaining is_omap tests Jarkko Nikula
2011-07-01 11:11 ` Varadarajan, Charulatha
2011-07-01 14:05 ` Jarkko Nikula
2011-07-01 8:52 ` [RFC 08/12] omap: mcbsp: Remove omap device API Jarkko Nikula
2011-07-01 8:52 ` [RFC 09/12] omap: mcbsp: Move OMAP3+ wakeup enable/disable to omap_mcbsp_request/_free Jarkko Nikula
2011-07-01 8:52 ` Jarkko Nikula [this message]
2011-07-01 9:23 ` [RFC 10/12] omap: mcbsp: Move sidetone clock management to mach-omap2/mcbsp.c Paul Walmsley
2011-07-01 9:26 ` Cousson, Benoit
2011-07-01 9:34 ` Paul Walmsley
2011-07-01 10:34 ` ABRAHAM, KISHON VIJAY
2011-07-01 13:36 ` Jarkko Nikula
2011-07-01 8:52 ` [RFC 11/12] omap: mcbsp: Remove conditional compilation for OMAP3 Jarkko Nikula
2011-07-01 11:00 ` Varadarajan, Charulatha
2011-07-01 13:47 ` Jarkko Nikula
2011-07-01 8:52 ` [RFC 12/12] omap: mcbsp: Reorganize DMA operating mode and sidetone init/exit code Jarkko Nikula
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1309510356-27147-11-git-send-email-jhnikula@gmail.com \
--to=jhnikula@gmail.com \
--cc=jkrzyszt@tis.icnet.pl \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
--cc=paul@pwsan.com \
--cc=peter.ujfalusi@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox