95
88
return __raw_readl(dmic->io_base + reg);
99
static void omap_dmic_reg_dump(struct omap_dmic *dmic)
101
dev_dbg(dmic->dev, "***********************\n");
102
dev_dbg(dmic->dev, "DMIC_IRQSTATUS_RAW: 0x%04x\n",
103
omap_dmic_read(dmic, DMIC_IRQSTATUS_RAW));
104
dev_dbg(dmic->dev, "DMIC_IRQSTATUS: 0x%04x\n",
105
omap_dmic_read(dmic, DMIC_IRQSTATUS));
106
dev_dbg(dmic->dev, "DMIC_IRQENABLE_SET: 0x%04x\n",
107
omap_dmic_read(dmic, DMIC_IRQENABLE_SET));
108
dev_dbg(dmic->dev, "DMIC_IRQENABLE_CLR: 0x%04x\n",
109
omap_dmic_read(dmic, DMIC_IRQENABLE_CLR));
110
dev_dbg(dmic->dev, "DMIC_IRQWAKE_EN: 0x%04x\n",
111
omap_dmic_read(dmic, DMIC_IRQWAKE_EN));
112
dev_dbg(dmic->dev, "DMIC_DMAENABLE_SET: 0x%04x\n",
113
omap_dmic_read(dmic, DMIC_DMAENABLE_SET));
114
dev_dbg(dmic->dev, "DMIC_DMAENABLE_CLR: 0x%04x\n",
115
omap_dmic_read(dmic, DMIC_DMAENABLE_CLR));
116
dev_dbg(dmic->dev, "DMIC_DMAWAKEEN: 0x%04x\n",
117
omap_dmic_read(dmic, DMIC_DMAWAKEEN));
118
dev_dbg(dmic->dev, "DMIC_CTRL: 0x%04x\n",
119
omap_dmic_read(dmic, DMIC_CTRL));
120
dev_dbg(dmic->dev, "DMIC_DATA: 0x%04x\n",
121
omap_dmic_read(dmic, DMIC_DATA));
122
dev_dbg(dmic->dev, "DMIC_FIFO_CTRL: 0x%04x\n",
123
omap_dmic_read(dmic, DMIC_FIFO_CTRL));
124
dev_dbg(dmic->dev, "DMIC_FIFO_DMIC1R_DATA: 0x%08x\n",
125
omap_dmic_read(dmic, DMIC_FIFO_DMIC1R_DATA));
126
dev_dbg(dmic->dev, "DMIC_FIFO_DMIC1L_DATA: 0x%08x\n",
127
omap_dmic_read(dmic, DMIC_FIFO_DMIC1L_DATA));
128
dev_dbg(dmic->dev, "DMIC_FIFO_DMIC2R_DATA: 0x%08x\n",
129
omap_dmic_read(dmic, DMIC_FIFO_DMIC2R_DATA));
130
dev_dbg(dmic->dev, "DMIC_FIFO_DMIC2L_DATA: 0x%08x\n",
131
omap_dmic_read(dmic, DMIC_FIFO_DMIC2L_DATA));
132
dev_dbg(dmic->dev, "DMIC_FIFO_DMIC3R_DATA: 0x%08x\n",
133
omap_dmic_read(dmic, DMIC_FIFO_DMIC3R_DATA));
134
dev_dbg(dmic->dev, "DMIC_FIFO_DMIC3L_DATA: 0x%08x\n",
135
omap_dmic_read(dmic, DMIC_FIFO_DMIC3L_DATA));
136
dev_dbg(dmic->dev, "***********************\n");
139
static void omap_dmic_reg_dump(struct omap_dmic *dmic) {}
143
* Enables the transfer through the DMIC interface
145
static void omap_dmic_start(struct omap_dmic *dmic, int channels)
147
int ctrl = omap_dmic_read(dmic, DMIC_CTRL);
148
omap_dmic_write(dmic, DMIC_CTRL, ctrl | channels);
152
* Disables the transfer through the DMIC interface
154
static void omap_dmic_stop(struct omap_dmic *dmic, int channels)
156
int ctrl = omap_dmic_read(dmic, DMIC_CTRL);
157
omap_dmic_write(dmic, DMIC_CTRL, ctrl & ~channels);
92
* Enables and disables DMIC channels through the DMIC interface
94
static inline void dmic_set_up_channels(struct omap_dmic *dmic)
96
u32 ctrl = omap_dmic_read(dmic, OMAP_DMIC_CTRL) & ~OMAP_DMIC_UP_ENABLE_MASK;
97
omap_dmic_write(dmic, OMAP_DMIC_CTRL, ctrl | dmic->up_enable);
100
static inline int dmic_is_enabled(struct omap_dmic *dmic)
102
return omap_dmic_read(dmic, OMAP_DMIC_CTRL) & OMAP_DMIC_UP_ENABLE_MASK;
105
static int omap_dmic_set_clkdiv(struct snd_soc_dai *dai,
108
struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
109
int div_sel = -EINVAL;
112
if (div_id != OMAP_DMIC_CLKDIV)
115
switch (dmic->clk_freq) {
125
dev_err(dai->dev, "invalid div_sel (%d) for 19200000Hz", div);
135
dev_err(dai->dev, "invalid div_sel (%d) for 24000000Hz", div);
148
dev_err(dai->dev, "invalid div_sel (%d) for 24576000Hz", div);
158
dev_err(dai->dev, "invalid div_sel (%d) for 12000000Hz", div);
163
dev_err(dai->dev, "invalid freq %d\n", dmic->clk_freq);
168
dev_err(dai->dev, "divider not supported %d\n", div);
172
ctrl = omap_dmic_read(dmic, OMAP_DMIC_CTRL) & ~OMAP_DMIC_CLK_DIV_MASK;
174
omap_dmic_write(dmic, OMAP_DMIC_CTRL,
175
ctrl | (div_sel << OMAP_DMIC_CLK_DIV_SHIFT));
161
181
* Configures DMIC for audio recording.
162
182
* This function should be called before omap_dmic_start.
164
static int omap_dmic_open(struct omap_dmic *dmic)
184
static void omap_dmic_open(struct omap_dmic *dmic)
166
struct omap_dmic_link *link = dmic->link;
169
/* Enable irq request generation */
170
omap_dmic_write(dmic, DMIC_IRQENABLE_SET,
171
link->irq_mask & DMIC_IRQ_MASK);
173
188
/* Configure uplink threshold */
174
if (link->threshold > DMIC_THRES_MAX)
175
link->threshold = DMIC_THRES_MAX;
177
omap_dmic_write(dmic, DMIC_FIFO_CTRL, link->threshold);
179
/* Configure DMA controller */
180
omap_dmic_write(dmic, DMIC_DMAENABLE_SET, DMIC_DMA_ENABLE);
189
omap_dmic_write(dmic, OMAP_DMIC_FIFO_CTRL, 2);
182
191
/* Set dmic out format */
183
ctrl = omap_dmic_read(dmic, DMIC_CTRL)
184
& ~(DMIC_FORMAT | DMIC_POLAR_MASK);
185
omap_dmic_write(dmic, DMIC_CTRL,
186
ctrl | link->format | link->polar);
192
ctrl = omap_dmic_read(dmic, OMAP_DMIC_CTRL)
193
& ~(OMAP_DMIC_FORMAT | OMAP_DMIC_POLAR_MASK);
194
omap_dmic_write(dmic, OMAP_DMIC_CTRL,
195
ctrl | OMAP_DMICOUTFORMAT_LJUST |
196
OMAP_DMIC_POLAR1 | OMAP_DMIC_POLAR2 | OMAP_DMIC_POLAR3);
192
200
* Cleans DMIC uplink configuration.
193
201
* This function should be called when the stream is closed.
195
static int omap_dmic_close(struct omap_dmic *dmic)
203
static void omap_dmic_close(struct omap_dmic *dmic)
197
struct omap_dmic_link *link = dmic->link;
199
/* Disable irq request generation */
200
omap_dmic_write(dmic, DMIC_IRQENABLE_CLR,
201
link->irq_mask & DMIC_IRQ_MASK);
203
205
/* Disable DMA request generation */
204
omap_dmic_write(dmic, DMIC_DMAENABLE_CLR, DMIC_DMA_ENABLE);
209
static irqreturn_t omap_dmic_irq_handler(int irq, void *dev_id)
211
struct omap_dmic *dmic = dev_id;
214
irq_status = omap_dmic_read(dmic, DMIC_IRQSTATUS);
216
/* Acknowledge irq event */
217
omap_dmic_write(dmic, DMIC_IRQSTATUS, irq_status);
218
if (irq_status & DMIC_IRQ_FULL)
219
dev_dbg(dmic->dev, "DMIC FIFO error %x\n", irq_status);
221
if (irq_status & DMIC_IRQ_EMPTY)
222
dev_dbg(dmic->dev, "DMIC FIFO error %x\n", irq_status);
224
if (irq_status & DMIC_IRQ)
225
dev_dbg(dmic->dev, "DMIC write request\n");
206
omap_dmic_write(dmic, OMAP_DMIC_DMAENABLE_CLR, OMAP_DMIC_DMA_ENABLE);
230
210
static int omap_dmic_dai_startup(struct snd_pcm_substream *substream,
231
211
struct snd_soc_dai *dai)
233
213
struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
216
mutex_lock(&dmic->mutex);
236
219
pm_runtime_get_sync(dmic->dev);
221
if (dai->id > OMAP4_LEGACY_DMIC0)
224
omap_dmic_open(dmic);
226
/* legacy and ABE mode are mutually exclusive */
227
if (dai->id > OMAP4_LEGACY_DMIC0 && !dmic->abe_mode) {
236
mutex_unlock(&dmic->mutex);
241
240
static void omap_dmic_dai_shutdown(struct snd_pcm_substream *substream,
252
258
struct snd_soc_dai *dai)
254
260
struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
255
struct omap_dmic_link *link = dmic->link;
261
int channels, rate, div;
259
264
channels = params_channels(params);
265
if (dai->id == OMAP4_LEGACY_DMIC0) {
270
dmic->channels = channels;
273
dev_err(dmic->dev, "invalid number of legacy channels\n");
278
dev_err(dmic->dev, "invalid number of ABE channels\n");
283
rate = params_rate(params);
266
dev_err(dmic->dev, "invalid number of channels\n");
292
dev_err(dmic->dev, "rate %d not supported\n", rate);
270
omap_dmic_dai_dma_params.packet_size = link->threshold * link->channels;
296
/* packet size is threshold * channels */
297
omap_dmic_dai_dma_params.packet_size = 2 * channels;
271
298
snd_soc_dai_set_dma_data(dai, substream, &omap_dmic_dai_dma_params);
273
if (dmic->active == 1)
274
ret = omap_dmic_open(dmic);
279
static int omap_dmic_dai_hw_free(struct snd_pcm_substream *substream,
303
static void dmic_config_up_channels(struct omap_dmic *dmic, int dai_id,
308
case OMAP4_LEGACY_DMIC0:
309
switch (dmic->channels) {
311
dmic->up_enable = OMAP_DMIC_UP1_ENABLE | OMAP_DMIC_UP2_ENABLE
312
| OMAP_DMIC_UP3_ENABLE;
315
dmic->up_enable = OMAP_DMIC_UP1_ENABLE | OMAP_DMIC_UP2_ENABLE;
318
dmic->up_enable = OMAP_DMIC_UP1_ENABLE;
324
case OMAP4_ABE_DMIC0:
325
case OMAP4_ABE_DMIC1:
326
case OMAP4_ABE_DMIC2:
328
* ABE expects all the DMIC interfaces to be
329
* enabled, so enabling them when at least one
330
* DMIC DAI is running
333
dmic->up_enable |= OMAP_DMIC_UP1_ENABLE |
334
OMAP_DMIC_UP2_ENABLE |
335
OMAP_DMIC_UP3_ENABLE;
342
case OMAP4_LEGACY_DMIC0:
345
case OMAP4_ABE_DMIC0:
346
case OMAP4_ABE_DMIC1:
347
case OMAP4_ABE_DMIC2:
349
* Disable all DMIC interfaces only when
350
* all DAIs are stopped
361
static int omap_dmic_dai_prepare(struct snd_pcm_substream *substream,
280
362
struct snd_soc_dai *dai)
282
364
struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
283
struct omap_dmic_link *link = dmic->link;
286
if (dmic->active == 1) {
287
ret = omap_dmic_close(dmic);
366
/* Configure DMA controller */
367
omap_dmic_write(dmic, OMAP_DMIC_DMAENABLE_SET, OMAP_DMIC_DMA_ENABLE);
294
372
static int omap_dmic_dai_trigger(struct snd_pcm_substream *substream,
295
373
int cmd, struct snd_soc_dai *dai)
297
375
struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
298
int dmic_id = 1 << dai->id;
300
omap_dmic_reg_dump(dmic);
303
378
case SNDRV_PCM_TRIGGER_START:
304
omap_dmic_start(dmic, dmic_id);
306
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
308
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
380
dmic_config_up_channels(dmic, dai->id, 1);
381
dmic_set_up_channels(dmic);
310
383
case SNDRV_PCM_TRIGGER_STOP:
311
omap_dmic_stop(dmic, dmic_id);
385
dmic_config_up_channels(dmic, dai->id, 0);
386
dmic_set_up_channels(dmic);
398
static int omap_dmic_set_clkdiv(struct snd_soc_dai *dai,
401
struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
402
int ctrl, div_sel = -EINVAL;
404
if (div_id != OMAP_DMIC_CLKDIV)
407
switch (dmic->clk_freq) {
429
dev_err(dai->dev, "invalid freq %d\n", dmic->clk_freq);
434
dev_err(dai->dev, "divider not supported %d\n", div);
438
ctrl = omap_dmic_read(dmic, DMIC_CTRL) & ~DMIC_CLK_DIV_MASK;
439
omap_dmic_write(dmic, DMIC_CTRL,
440
ctrl | (div_sel << DMIC_CLK_DIV_SHIFT));
445
474
static struct snd_soc_dai_ops omap_dmic_dai_ops = {
446
475
.startup = omap_dmic_dai_startup,
447
476
.shutdown = omap_dmic_dai_shutdown,
448
477
.hw_params = omap_dmic_dai_hw_params,
478
.prepare = omap_dmic_dai_prepare,
449
479
.trigger = omap_dmic_dai_trigger,
450
.hw_free = omap_dmic_dai_hw_free,
451
.set_sysclk = omap_dmic_set_dai_sysclk,
452
.set_clkdiv = omap_dmic_set_clkdiv,
455
#if defined(CONFIG_SND_OMAP_SOC_ABE_DSP) || \
456
defined(CONFIG_SND_OMAP_SOC_ABE_DSP_MODULE)
457
static int omap_dmic_abe_dai_trigger(struct snd_pcm_substream *substream,
458
int cmd, struct snd_soc_dai *dai)
460
struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
461
int dmic_id = DMIC_UP1_ENABLE | DMIC_UP2_ENABLE | DMIC_UP3_ENABLE;
463
omap_dmic_reg_dump(dmic);
466
case SNDRV_PCM_TRIGGER_START:
467
if (dmic->active == 1)
468
omap_dmic_start(dmic, dmic_id);
470
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
472
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
474
case SNDRV_PCM_TRIGGER_STOP:
475
if (dmic->active == 1)
476
omap_dmic_stop(dmic, dmic_id);
485
static struct snd_soc_dai_ops omap_dmic_abe_dai_ops = {
486
.startup = omap_dmic_dai_startup,
487
.shutdown = omap_dmic_dai_shutdown,
488
.hw_params = omap_dmic_dai_hw_params,
489
.trigger = omap_dmic_abe_dai_trigger,
490
.hw_free = omap_dmic_dai_hw_free,
491
.set_sysclk = omap_dmic_set_dai_sysclk,
492
.set_clkdiv = omap_dmic_set_clkdiv,
480
.set_sysclk = omap_dmic_set_dai_sysclk,
481
.set_clkdiv = omap_dmic_set_clkdiv,
496
484
static struct snd_soc_dai_driver omap_dmic_dai[] = {
498
486
.name = "omap-dmic-dai-0",
487
.id = OMAP4_LEGACY_DMIC0,
500
489
.channels_min = 2,
502
491
.rates = OMAP_DMIC_RATES,
503
492
.formats = OMAP_DMIC_FORMATS,
505
494
.ops = &omap_dmic_dai_ops,
508
.name = "omap-dmic-dai-1",
512
.rates = OMAP_DMIC_RATES,
513
.formats = OMAP_DMIC_FORMATS,
515
.ops = &omap_dmic_abe_dai_ops,
518
.name = "omap-dmic-dai-2",
522
.rates = OMAP_DMIC_RATES,
523
.formats = OMAP_DMIC_FORMATS,
525
.ops = &omap_dmic_abe_dai_ops,
527
#if defined(CONFIG_SND_OMAP_SOC_ABE_DSP) || \
528
defined(CONFIG_SND_OMAP_SOC_ABE_DSP_MODULE)
530
497
.name = "omap-dmic-abe-dai-0",
498
.id = OMAP4_ABE_DMIC0,
532
500
.channels_min = 2,
533
501
.channels_max = 2,
534
502
.rates = OMAP_DMIC_RATES,
535
503
.formats = OMAP_DMIC_FORMATS,
537
.ops = &omap_dmic_abe_dai_ops,
505
.ops = &omap_dmic_dai_ops,
540
508
.name = "omap-dmic-abe-dai-1",
509
.id = OMAP4_ABE_DMIC1,
542
511
.channels_min = 2,
543
512
.channels_max = 2,
544
513
.rates = OMAP_DMIC_RATES,
545
514
.formats = OMAP_DMIC_FORMATS,
547
.ops = &omap_dmic_abe_dai_ops,
516
.ops = &omap_dmic_dai_ops,
550
519
.name = "omap-dmic-abe-dai-2",
520
.id = OMAP4_ABE_DMIC2,
552
522
.channels_min = 2,
553
523
.channels_max = 2,
554
524
.rates = OMAP_DMIC_RATES,
555
525
.formats = OMAP_DMIC_FORMATS,
557
.ops = &omap_dmic_abe_dai_ops,
527
.ops = &omap_dmic_dai_ops,
562
531
static __devinit int asoc_dmic_probe(struct platform_device *pdev)