@@ -175,7 +175,43 @@ static struct at24_platform_data eeprom_info = {
.context = (void *)0x7f00,
};
-static struct snd_platform_data dm365_evm_snd_data;
+static int dm365_snd_dma_event_mux(int device, int enable, int playback)
+{
+ static int tx_dma_mux = 0;
+ static int rx_dma_mux = 0;
+
+ if (!enable) {
+ if (playback)
+ tx_dma_mux = 0;
+ else
+ rx_dma_mux = 0;
+ return 0;
+ }
+
+ if (playback) {
+ if (tx_dma_mux == 1)
+ return -EBUSY;
+ if (device == 0)
+ davinci_cfg_reg(DM365_EVT2_ASP_TX);
+ else
+ davinci_cfg_reg(DM365_EVT2_VC_TX);
+ tx_dma_mux = 1;
+ } else {
+ if (rx_dma_mux == 1)
+ return -EBUSY;
+ if (device == 0)
+ davinci_cfg_reg(DM365_EVT3_ASP_RX);
+ else
+ davinci_cfg_reg(DM365_EVT3_VC_RX);
+ rx_dma_mux = 1;
+ }
+
+ return 0;
+}
+
+static struct snd_platform_data dm365_evm_snd_data = {
+ .dma_event_mux = &dm365_snd_dma_event_mux,
+};
static struct i2c_board_info i2c_info[] = {
{
@@ -513,6 +549,7 @@ static __init void dm365_evm_init(void)
evm_init_cpld();
dm365_init_asp(&dm365_evm_snd_data);
+ dm365_init_vc(&dm365_evm_snd_data);
dm365_init_rtc();
#ifdef CONFIG_KEYBOARD_DAVINCI
@@ -455,7 +455,7 @@ static struct davinci_clk dm365_clks[] = {
CLK(NULL, "timer3", &timer3_clk),
CLK(NULL, "usb", &usb_clk),
CLK("davinci_emac.1", NULL, &emac_clk),
- CLK("voice_codec", NULL, &voicecodec_clk),
+ CLK("davinci_voicecodec", NULL, &voicecodec_clk),
CLK("davinci-asp.0", NULL, &asp0_clk),
CLK(NULL, "rto", &rto_clk),
CLK(NULL, "mjcp", &mjcp_clk),
@@ -604,6 +604,8 @@ INT_CFG(DM365, INT_IMX1_DISABLE, 24, 1, 0, false)
INT_CFG(DM365, INT_NSF_ENABLE, 25, 1, 1, false)
INT_CFG(DM365, INT_NSF_DISABLE, 25, 1, 0, false)
+EVT_CFG(DM365, EVT2_VC_TX, 0, 1, 1, false)
+EVT_CFG(DM365, EVT3_VC_RX, 1, 1, 1, false)
EVT_CFG(DM365, EVT2_ASP_TX, 0, 1, 0, false)
EVT_CFG(DM365, EVT3_ASP_RX, 1, 1, 0, false)
#endif
@@ -835,6 +837,31 @@ static struct platform_device dm365_asp_device = {
.resource = dm365_asp_resources,
};
+static struct resource dm365_vc_resources[] = {
+ {
+ .start = DAVINCI_DM365_VC_BASE,
+ .end = DAVINCI_DM365_VC_BASE + SZ_1K - 1,
+ .flags = IORESOURCE_MEM,
+ },
+ {
+ .start = DAVINCI_DMA_VC_TX,
+ .end = DAVINCI_DMA_VC_TX,
+ .flags = IORESOURCE_DMA,
+ },
+ {
+ .start = DAVINCI_DMA_VC_RX,
+ .end = DAVINCI_DMA_VC_RX,
+ .flags = IORESOURCE_DMA,
+ },
+};
+
+static struct platform_device dm365_vc_device = {
+ .name = "davinci_voicecodec",
+ .id = -1,
+ .num_resources = ARRAY_SIZE(dm365_vc_resources),
+ .resource = dm365_vc_resources,
+};
+
static struct resource dm365_rtc_resources[] = {
{
.start = DM365_RTC_BASE,
@@ -985,12 +1012,16 @@ void __init dm365_init_asp(struct snd_platform_data *pdata)
davinci_cfg_reg(DM365_MCBSP0_BDR);
davinci_cfg_reg(DM365_MCBSP0_R);
davinci_cfg_reg(DM365_MCBSP0_BFSR);
- davinci_cfg_reg(DM365_EVT2_ASP_TX);
- davinci_cfg_reg(DM365_EVT3_ASP_RX);
dm365_asp_device.dev.platform_data = pdata;
platform_device_register(&dm365_asp_device);
}
+void __init dm365_init_vc(struct snd_platform_data *pdata)
+{
+ dm365_vc_device.dev.platform_data = pdata;
+ platform_device_register(&dm365_vc_device);
+}
+
void __init dm365_init_ks(struct davinci_ks_platform_data *pdata)
{
davinci_cfg_reg(DM365_KEYSCAN);
@@ -50,6 +50,7 @@
#define DAVINCI_ASP1_TX_INT IRQ_MBXINT
struct snd_platform_data {
+ int (*dma_event_mux)(int, int, int);
u32 tx_dma_offset;
u32 rx_dma_offset;
enum dma_event_q eventq_no; /* event queue number */
@@ -31,8 +31,13 @@
#define DM365_RTC_BASE (0x01C69000)
+#define DAVINCI_DM365_VC_BASE (0x01D0C000)
+#define DAVINCI_DMA_VC_TX 2
+#define DAVINCI_DMA_VC_RX 3
+
void __init dm365_init(void);
void __init dm365_init_asp(struct snd_platform_data *pdata);
+void __init dm365_init_vc(struct snd_platform_data *pdata);
void __init dm365_init_ks(struct davinci_ks_platform_data *pdata);
void __init dm365_init_rtc(void);
@@ -325,6 +325,8 @@ enum davinci_dm365_index {
DM365_INT_NSF_DISABLE,
/* EDMA event muxing */
+ DM365_EVT2_VC_TX,
+ DM365_EVT3_VC_RX,
DM365_EVT2_ASP_TX,
DM365_EVT3_ASP_RX,
DM365_EVT26_MMC0_RX,