|
@@ -5,24 +5,14 @@
|
|
|
#include "audio/audio.h"
|
|
|
#include "i2s.h"
|
|
|
|
|
|
-static void ark_i2s_poweron(struct ark_i2s_data *i2s)
|
|
|
-{
|
|
|
- uint32_t val;
|
|
|
-
|
|
|
- val = readl(i2s->base + I2S_SACR0);
|
|
|
- val &= ~(SACR0_VREF_PD | SACR0_DAC_PD);
|
|
|
- val |= SACR0_SDRADC_POWEN;
|
|
|
- writel(val, i2s->base + I2S_SACR0);
|
|
|
-}
|
|
|
-
|
|
|
int ark_i2s_startup(struct ark_i2s_data *i2s, int stream)
|
|
|
{
|
|
|
unsigned int val;
|
|
|
|
|
|
/* reset */
|
|
|
- writel(SACR0_RST, i2s->base + I2S_SACR0);
|
|
|
+ /* writel(SACR0_RST, i2s->base + I2S_SACR0);
|
|
|
udelay(1);
|
|
|
- writel(0, i2s->base + I2S_SACR0);
|
|
|
+ writel(0, i2s->base + I2S_SACR0); */
|
|
|
|
|
|
if (stream == AUDIO_STREAM_REPLAY) {
|
|
|
writel(SACR1_DREC, i2s->base + I2S_SACR1);
|
|
@@ -31,9 +21,13 @@ int ark_i2s_startup(struct ark_i2s_data *i2s, int stream)
|
|
|
writel(0x7f, i2s->base + I2S_SAICR);
|
|
|
writel(0, i2s->base + I2S_SAICR);
|
|
|
|
|
|
- val = SACR0_DATA_SEL | SACR0_TFTH(15) | SACR0_TDMAEN | SACR0_ENB;
|
|
|
+ val = SACR0_TLFIRST | SACR0_CH_LOCK | SACR0_TFTH(15) | SACR0_TDMAEN | SACR0_ENB;
|
|
|
if (i2s->master)
|
|
|
val |= SACR0_BCKD | SACR0_SYNCD;
|
|
|
+ if (i2s->channels == 1)
|
|
|
+ val |= SACR0_MOLO_MODE;
|
|
|
+ if (i2s->samplebits == 32)
|
|
|
+ val |= SACR0_32BIT_MODE;
|
|
|
writel(val, i2s->base + I2S_SACR0);
|
|
|
|
|
|
} else if(stream == AUDIO_STREAM_RECORD) {
|
|
@@ -50,25 +44,15 @@ int ark_i2s_startup(struct ark_i2s_data *i2s, int stream)
|
|
|
writel(0x7f, i2s->base + I2S_SAICR);
|
|
|
writel(0, i2s->base + I2S_SAICR);
|
|
|
|
|
|
- val = SACR0_SDRADC_POWEN | SACR0_DATA_SEL | SACR0_SARADC_DIS |
|
|
|
- SACR0_RFTH(16) | SACR0_RDMAEN | SACR0_ENB;
|
|
|
+ val = SACR0_RLFIRST | SACR0_CH_LOCK | SACR0_RFTH(16) | SACR0_RDMAEN | SACR0_ENB;
|
|
|
if (i2s->master)
|
|
|
val |= SACR0_BCKD | SACR0_SYNCD;
|
|
|
- if (i2s->extdata) {
|
|
|
- val &= ~SACR0_DATA_SEL;
|
|
|
- val |= SACR0_MIC_LINE_SEL | SACR0_DAC_PD | SACR0_VREF_PD;
|
|
|
- }
|
|
|
writel(val, i2s->base + I2S_SACR0);
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-void ark_i2s_set_volume(struct ark_i2s_data *i2s, int lvol, int rvol)
|
|
|
-{
|
|
|
- writel(DACR0_LVOL(lvol) | DACR0_RVOL(rvol), i2s->base + I2S_DACR0);
|
|
|
-}
|
|
|
-
|
|
|
int ark_i2s_set_rate(struct ark_i2s_data *i2s, unsigned int rate)
|
|
|
{
|
|
|
u32 step = 256 * 2, modulo;
|
|
@@ -86,6 +70,48 @@ int ark_i2s_set_rate(struct ark_i2s_data *i2s, unsigned int rate)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int ark_i2s_set_channels(struct ark_i2s_data *i2s, int channels)
|
|
|
+{
|
|
|
+ unsigned int val;
|
|
|
+
|
|
|
+ if (channels != 1 && channels != 2) {
|
|
|
+ printf("Unsupported i2s channels %d.\n", channels);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ val = readl(i2s->base + I2S_SACR0);
|
|
|
+ if (channels == 1)
|
|
|
+ val |= SACR0_MOLO_MODE;
|
|
|
+ else
|
|
|
+ val &= ~SACR0_MOLO_MODE;
|
|
|
+ writel(val, i2s->base + I2S_SACR0);
|
|
|
+
|
|
|
+ i2s->channels = channels;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int ark_i2s_set_samplebits(struct ark_i2s_data *i2s, int bits)
|
|
|
+{
|
|
|
+ unsigned int val;
|
|
|
+
|
|
|
+ if (bits != 16 && bits != 32) {
|
|
|
+ printf("Unsupported i2s samplebits %d.\n", bits);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ val = readl(i2s->base + I2S_SACR0);
|
|
|
+ if (bits == 32)
|
|
|
+ val |= SACR0_32BIT_MODE;
|
|
|
+ else
|
|
|
+ val &= ~SACR0_32BIT_MODE;
|
|
|
+ writel(val, i2s->base + I2S_SACR0);
|
|
|
+
|
|
|
+ i2s->samplebits = bits;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
void ark_i2s_stop(struct ark_i2s_data *i2s, int stream)
|
|
|
{
|
|
|
if (stream == AUDIO_STREAM_REPLAY)
|
|
@@ -118,9 +144,7 @@ int ark_i2s_init(struct ark_i2s_data *i2s)
|
|
|
|
|
|
sys_soft_reset(softreset_i2s);
|
|
|
|
|
|
- request_irq(I2S_IRQn, 0, i2s_interrupt_handler, i2s);
|
|
|
-
|
|
|
- ark_i2s_poweron(i2s);
|
|
|
+ //request_irq(I2S_IRQn, 0, i2s_interrupt_handler, i2s);
|
|
|
|
|
|
return 0;
|
|
|
}
|