|
@@ -27,6 +27,7 @@
|
|
|
|
|
|
#include <plat/dma.h>
|
|
|
#include <plat/mcbsp.h>
|
|
|
+#include <plat/omap_device.h>
|
|
|
|
|
|
/* XXX These "sideways" includes are a sign that something is wrong */
|
|
|
#include "../mach-omap2/cm2xxx_3xxx.h"
|
|
@@ -228,9 +229,19 @@ void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg *config)
|
|
|
EXPORT_SYMBOL(omap_mcbsp_config);
|
|
|
|
|
|
#ifdef CONFIG_ARCH_OMAP3
|
|
|
+static struct omap_device *find_omap_device_by_dev(struct device *dev)
|
|
|
+{
|
|
|
+ struct platform_device *pdev = container_of(dev,
|
|
|
+ struct platform_device, dev);
|
|
|
+ return container_of(pdev, struct omap_device, pdev);
|
|
|
+}
|
|
|
+
|
|
|
static void omap_st_on(struct omap_mcbsp *mcbsp)
|
|
|
{
|
|
|
unsigned int w;
|
|
|
+ struct omap_device *od;
|
|
|
+
|
|
|
+ od = find_omap_device_by_dev(mcbsp->dev);
|
|
|
|
|
|
/*
|
|
|
* Sidetone uses McBSP ICLK - which must not idle when sidetones
|
|
@@ -244,9 +255,6 @@ static void omap_st_on(struct omap_mcbsp *mcbsp)
|
|
|
w = MCBSP_READ(mcbsp, SSELCR);
|
|
|
MCBSP_WRITE(mcbsp, SSELCR, w | SIDETONEEN);
|
|
|
|
|
|
- w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
|
|
|
- MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w & ~(ST_AUTOIDLE));
|
|
|
-
|
|
|
/* Enable Sidetone from Sidetone Core */
|
|
|
w = MCBSP_ST_READ(mcbsp, SSELCR);
|
|
|
MCBSP_ST_WRITE(mcbsp, SSELCR, w | ST_SIDETONEEN);
|
|
@@ -255,13 +263,13 @@ static void omap_st_on(struct omap_mcbsp *mcbsp)
|
|
|
static void omap_st_off(struct omap_mcbsp *mcbsp)
|
|
|
{
|
|
|
unsigned int w;
|
|
|
+ struct omap_device *od;
|
|
|
+
|
|
|
+ od = find_omap_device_by_dev(mcbsp->dev);
|
|
|
|
|
|
w = MCBSP_ST_READ(mcbsp, SSELCR);
|
|
|
MCBSP_ST_WRITE(mcbsp, SSELCR, w & ~(ST_SIDETONEEN));
|
|
|
|
|
|
- w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
|
|
|
- MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w | ST_AUTOIDLE);
|
|
|
-
|
|
|
w = MCBSP_READ(mcbsp, SSELCR);
|
|
|
MCBSP_WRITE(mcbsp, SSELCR, w & ~(SIDETONEEN));
|
|
|
|
|
@@ -273,9 +281,9 @@ static void omap_st_off(struct omap_mcbsp *mcbsp)
|
|
|
static void omap_st_fir_write(struct omap_mcbsp *mcbsp, s16 *fir)
|
|
|
{
|
|
|
u16 val, i;
|
|
|
+ struct omap_device *od;
|
|
|
|
|
|
- val = MCBSP_ST_READ(mcbsp, SYSCONFIG);
|
|
|
- MCBSP_ST_WRITE(mcbsp, SYSCONFIG, val & ~(ST_AUTOIDLE));
|
|
|
+ od = find_omap_device_by_dev(mcbsp->dev);
|
|
|
|
|
|
val = MCBSP_ST_READ(mcbsp, SSELCR);
|
|
|
|
|
@@ -303,9 +311,9 @@ static void omap_st_chgain(struct omap_mcbsp *mcbsp)
|
|
|
{
|
|
|
u16 w;
|
|
|
struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
|
|
|
+ struct omap_device *od;
|
|
|
|
|
|
- w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
|
|
|
- MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w & ~(ST_AUTOIDLE));
|
|
|
+ od = find_omap_device_by_dev(mcbsp->dev);
|
|
|
|
|
|
w = MCBSP_ST_READ(mcbsp, SSELCR);
|
|
|
|
|
@@ -648,48 +656,33 @@ EXPORT_SYMBOL(omap_mcbsp_get_dma_op_mode);
|
|
|
|
|
|
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));
|
|
|
- MCBSP_WRITE(mcbsp, WAKEUPEN, XRDYEN | RRDYEN);
|
|
|
- } else {
|
|
|
- syscon |= SIDLEMODE(0x01);
|
|
|
- }
|
|
|
-
|
|
|
- MCBSP_WRITE(mcbsp, SYSCON, syscon);
|
|
|
+ MCBSP_WRITE(mcbsp, WAKEUPEN, XRDYEN | RRDYEN);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
|
|
MCBSP_WRITE(mcbsp, WAKEUPEN, 0);
|
|
|
}
|