@@ -200,3 +200,26 @@ int __init omap1_mcbsp_init(void)
}
arch_initcall(omap1_mcbsp_init);
+
+/* if adding more, put larger first */
+#if defined(CONFIG_ARCH_OMAP16XX)
+static u16 omap_mcbsp_cache[OMAP16XX_MCBSP_PDATA_SZ][OMAP_MCBSP_REG_COUNT];
+#elif defined(CONFIG_ARCH_OMAP15XX)
+static u16 omap_mcbsp_cache[OMAP15XX_MCBSP_PDATA_SZ][OMAP_MCBSP_REG_COUNT];
+#elif defined(CONFIG_ARCH_OMAP7XX)
+static u16 omap_mcbsp_cache[OMAP7XX_MCBSP_PDATA_SZ][OMAP_MCBSP_REG_COUNT];
+#else
+#define omap_mcbsp_cache NULL
+#endif
+
+void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val)
+{
+ omap_mcbsp_cache[mcbsp->id][reg / sizeof(u16)] = (u16)val;
+ __raw_writew((u16)val, mcbsp->io_base + reg);
+}
+
+int omap_mcbsp_read(struct omap_mcbsp *mcbsp, u16 reg, bool from_cache)
+{
+ return !from_cache ? __raw_readw(mcbsp->io_base + reg) :
+ omap_mcbsp_cache[mcbsp->id][reg / sizeof(u16)];
+}
@@ -241,3 +241,40 @@ static int __init omap2_mcbsp_init(void)
return omap_mcbsp_init();
}
arch_initcall(omap2_mcbsp_init);
+
+/* if adding more, put larger first */
+#if defined(CONFIG_ARCH_OMAP34XX)
+static u32 omap_mcbsp_cache[OMAP34XX_MCBSP_PDATA_SZ][OMAP_MCBSP_REG_COUNT];
+#elif defined(CONFIG_ARCH_OMAP2430)
+static u32 omap_mcbsp_cache[OMAP2430_MCBSP_PDATA_SZ][OMAP_MCBSP_REG_COUNT];
+#elif defined(CONFIG_ARCH_OMAP44XX)
+static u32 omap_mcbsp_cache[OMAP44XX_MCBSP_PDATA_SZ][OMAP_MCBSP_REG_COUNT];
+#elif defined(CONFIG_ARCH_OMAP2420)
+static u16 omap_mcbsp_cache[OMAP2420_MCBSP_PDATA_SZ][OMAP_MCBSP_REG_COUNT];
+#else
+#define omap_mcbsp_cache NULL
+#endif
+
+void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val)
+{
+ if (cpu_is_omap2420()) {
+ omap_mcbsp_cache[mcbsp->id][reg / sizeof(*omap_mcbsp_cache)] \
+ = (u16)val;
+ __raw_writew((u16)val, mcbsp->io_base + reg);
+ } else {
+ omap_mcbsp_cache[mcbsp->id][reg / sizeof(u32)] = val;
+ __raw_writel(val, mcbsp->io_base + reg);
+ }
+}
+
+int omap_mcbsp_read(struct omap_mcbsp *mcbsp, u16 reg, bool from_cache)
+{
+ if (cpu_is_omap2420()) {
+ return !from_cache ? __raw_readw(mcbsp->io_base + reg) :
+ (u16)omap_mcbsp_cache[mcbsp->id][reg /
+ sizeof(*omap_mcbsp_cache)];
+ } else {
+ return !from_cache ? __raw_readl(mcbsp->io_base + reg) :
+ omap_mcbsp_cache[mcbsp->id][reg / sizeof(u32)];
+ }
+}
@@ -92,6 +92,8 @@
#define OMAP_MCBSP_REG_XCERG 0x3A
#define OMAP_MCBSP_REG_XCERH 0x3C
+#define OMAP_MCBSP_REG_COUNT (OMAP_MCBSP_REG_XCERH / OMAP_MCBSP_REG_DRR1 + 1)
+
/* Dummy defines, these are not available on omap1 */
#define OMAP_MCBSP_REG_XCCR 0x00
#define OMAP_MCBSP_REG_RCCR 0x00
@@ -148,6 +150,8 @@
#define OMAP_MCBSP_REG_XCCR 0xAC
#define OMAP_MCBSP_REG_RCCR 0xB0
+#define OMAP_MCBSP_REG_COUNT (OMAP_MCBSP_REG_RCCR / OMAP_MCBSP_REG_DRR1 + 1)
+
#define AUDIO_MCBSP_DATAWRITE (OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DXR1)
#define AUDIO_MCBSP_DATAREAD (OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DRR1)
@@ -460,3 +464,6 @@ int omap_mcbsp_pollwrite(unsigned int id
int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type);
#endif
+
+extern int omap_mcbsp_read(struct omap_mcbsp *mcbsp, u16 reg, bool from_cache);
+extern void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val);
@@ -30,26 +30,12 @@
struct omap_mcbsp **mcbsp_ptr;
int omap_mcbsp_count;
-void omap_mcbsp_write(void __iomem *io_base, u16 reg, u32 val)
-{
- if (cpu_class_is_omap1() || cpu_is_omap2420())
- __raw_writew((u16)val, io_base + reg);
- else
- __raw_writel(val, io_base + reg);
-}
-
-int omap_mcbsp_read(void __iomem *io_base, u16 reg)
-{
- if (cpu_class_is_omap1() || cpu_is_omap2420())
- return __raw_readw(io_base + reg);
- else
- return __raw_readl(io_base + reg);
-}
-
#define MCBSP_READ(mcbsp, reg) \
- omap_mcbsp_read(mcbsp->io_base, OMAP_MCBSP_REG_##reg)
+ omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 0)
#define MCBSP_WRITE(mcbsp, reg, val) \
- omap_mcbsp_write(mcbsp->io_base, OMAP_MCBSP_REG_##reg, val)
+ omap_mcbsp_write(mcbsp, OMAP_MCBSP_REG_##reg, val)
+#define MCBSP_READ_CACHE(mcbsp, reg) \
+ omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 1)
#define omap_mcbsp_check_valid_id(id) (id < omap_mcbsp_count)
#define id_to_mcbsp_ptr(id) mcbsp_ptr[id];