Lines Matching refs:dmic
63 static inline void omap_dmic_write(struct omap_dmic *dmic, u16 reg, u32 val) in omap_dmic_write() argument
65 writel_relaxed(val, dmic->io_base + reg); in omap_dmic_write()
68 static inline int omap_dmic_read(struct omap_dmic *dmic, u16 reg) in omap_dmic_read() argument
70 return readl_relaxed(dmic->io_base + reg); in omap_dmic_read()
73 static inline void omap_dmic_start(struct omap_dmic *dmic) in omap_dmic_start() argument
75 u32 ctrl = omap_dmic_read(dmic, OMAP_DMIC_CTRL_REG); in omap_dmic_start()
78 omap_dmic_write(dmic, OMAP_DMIC_DMAENABLE_SET_REG, in omap_dmic_start()
81 omap_dmic_write(dmic, OMAP_DMIC_CTRL_REG, ctrl | dmic->ch_enabled); in omap_dmic_start()
84 static inline void omap_dmic_stop(struct omap_dmic *dmic) in omap_dmic_stop() argument
86 u32 ctrl = omap_dmic_read(dmic, OMAP_DMIC_CTRL_REG); in omap_dmic_stop()
87 omap_dmic_write(dmic, OMAP_DMIC_CTRL_REG, in omap_dmic_stop()
91 omap_dmic_write(dmic, OMAP_DMIC_DMAENABLE_CLR_REG, in omap_dmic_stop()
96 static inline int dmic_is_enabled(struct omap_dmic *dmic) in dmic_is_enabled() argument
98 return omap_dmic_read(dmic, OMAP_DMIC_CTRL_REG) & in dmic_is_enabled()
105 struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); in omap_dmic_dai_startup() local
108 mutex_lock(&dmic->mutex); in omap_dmic_dai_startup()
111 dmic->active = 1; in omap_dmic_dai_startup()
115 mutex_unlock(&dmic->mutex); in omap_dmic_dai_startup()
123 struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); in omap_dmic_dai_shutdown() local
125 mutex_lock(&dmic->mutex); in omap_dmic_dai_shutdown()
128 dmic->active = 0; in omap_dmic_dai_shutdown()
130 mutex_unlock(&dmic->mutex); in omap_dmic_dai_shutdown()
133 static int omap_dmic_select_divider(struct omap_dmic *dmic, int sample_rate) in omap_dmic_select_divider() argument
142 if (dmic->fclk_freq == 19200000 && dmic->out_freq == 3840000) in omap_dmic_select_divider()
145 dev_err(dmic->dev, in omap_dmic_select_divider()
151 switch (dmic->out_freq) { in omap_dmic_select_divider()
153 if (dmic->fclk_freq != 24576000) in omap_dmic_select_divider()
158 switch (dmic->fclk_freq) { in omap_dmic_select_divider()
173 if (dmic->fclk_freq != 24576000) in omap_dmic_select_divider()
178 if (dmic->fclk_freq != 19200000) in omap_dmic_select_divider()
183 dev_err(dmic->dev, "invalid out frequency: %dHz\n", in omap_dmic_select_divider()
184 dmic->out_freq); in omap_dmic_select_divider()
191 dev_err(dmic->dev, "invalid out frequency %dHz for %dHz input\n", in omap_dmic_select_divider()
192 dmic->out_freq, dmic->fclk_freq); in omap_dmic_select_divider()
200 struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); in omap_dmic_dai_hw_params() local
204 dmic->clk_div = omap_dmic_select_divider(dmic, params_rate(params)); in omap_dmic_dai_hw_params()
205 if (dmic->clk_div < 0) { in omap_dmic_dai_hw_params()
206 dev_err(dmic->dev, "no valid divider for %dHz from %dHz\n", in omap_dmic_dai_hw_params()
207 dmic->out_freq, dmic->fclk_freq); in omap_dmic_dai_hw_params()
211 dmic->ch_enabled = 0; in omap_dmic_dai_hw_params()
215 dmic->ch_enabled |= OMAP_DMIC_UP3_ENABLE; in omap_dmic_dai_hw_params()
217 dmic->ch_enabled |= OMAP_DMIC_UP2_ENABLE; in omap_dmic_dai_hw_params()
219 dmic->ch_enabled |= OMAP_DMIC_UP1_ENABLE; in omap_dmic_dai_hw_params()
222 dev_err(dmic->dev, "invalid number of legacy channels\n"); in omap_dmic_dai_hw_params()
228 dma_data->maxburst = dmic->threshold * channels; in omap_dmic_dai_hw_params()
236 struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); in omap_dmic_dai_prepare() local
240 omap_dmic_write(dmic, OMAP_DMIC_FIFO_CTRL_REG, dmic->threshold); in omap_dmic_dai_prepare()
242 ctrl = omap_dmic_read(dmic, OMAP_DMIC_CTRL_REG); in omap_dmic_dai_prepare()
251 ctrl |= OMAP_DMIC_CLK_DIV(dmic->clk_div); in omap_dmic_dai_prepare()
253 omap_dmic_write(dmic, OMAP_DMIC_CTRL_REG, ctrl); in omap_dmic_dai_prepare()
255 omap_dmic_write(dmic, OMAP_DMIC_CTRL_REG, in omap_dmic_dai_prepare()
265 struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); in omap_dmic_dai_trigger() local
269 omap_dmic_start(dmic); in omap_dmic_dai_trigger()
272 omap_dmic_stop(dmic); in omap_dmic_dai_trigger()
281 static int omap_dmic_select_fclk(struct omap_dmic *dmic, int clk_id, in omap_dmic_select_fclk() argument
295 dev_err(dmic->dev, "invalid input frequency: %dHz\n", freq); in omap_dmic_select_fclk()
296 dmic->fclk_freq = 0; in omap_dmic_select_fclk()
300 if (dmic->sysclk == clk_id) { in omap_dmic_select_fclk()
301 dmic->fclk_freq = freq; in omap_dmic_select_fclk()
306 if (dmic->active && dmic_is_enabled(dmic)) { in omap_dmic_select_fclk()
307 dev_err(dmic->dev, "can't re-parent when DMIC active\n"); in omap_dmic_select_fclk()
322 dev_err(dmic->dev, "fclk clk_id (%d) not supported\n", clk_id); in omap_dmic_select_fclk()
326 parent_clk = clk_get(dmic->dev, parent_clk_name); in omap_dmic_select_fclk()
328 dev_err(dmic->dev, "can't get %s\n", parent_clk_name); in omap_dmic_select_fclk()
332 mutex_lock(&dmic->mutex); in omap_dmic_select_fclk()
333 if (dmic->active) { in omap_dmic_select_fclk()
335 pm_runtime_put_sync(dmic->dev); in omap_dmic_select_fclk()
336 ret = clk_set_parent(dmic->fclk, parent_clk); in omap_dmic_select_fclk()
337 pm_runtime_get_sync(dmic->dev); in omap_dmic_select_fclk()
339 ret = clk_set_parent(dmic->fclk, parent_clk); in omap_dmic_select_fclk()
341 mutex_unlock(&dmic->mutex); in omap_dmic_select_fclk()
344 dev_err(dmic->dev, "re-parent failed\n"); in omap_dmic_select_fclk()
348 dmic->sysclk = clk_id; in omap_dmic_select_fclk()
349 dmic->fclk_freq = freq; in omap_dmic_select_fclk()
357 static int omap_dmic_select_outclk(struct omap_dmic *dmic, int clk_id, in omap_dmic_select_outclk() argument
363 dev_err(dmic->dev, "output clk_id (%d) not supported\n", in omap_dmic_select_outclk()
373 dmic->out_freq = freq; in omap_dmic_select_outclk()
376 dev_err(dmic->dev, "invalid out frequency: %dHz\n", freq); in omap_dmic_select_outclk()
377 dmic->out_freq = 0; in omap_dmic_select_outclk()
387 struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); in omap_dmic_set_dai_sysclk() local
390 return omap_dmic_select_fclk(dmic, clk_id, freq); in omap_dmic_set_dai_sysclk()
392 return omap_dmic_select_outclk(dmic, clk_id, freq); in omap_dmic_set_dai_sysclk()
394 dev_err(dmic->dev, "invalid clock direction (%d)\n", dir); in omap_dmic_set_dai_sysclk()
409 struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); in omap_dmic_probe() local
411 pm_runtime_enable(dmic->dev); in omap_dmic_probe()
414 pm_runtime_get_sync(dmic->dev); in omap_dmic_probe()
415 omap_dmic_write(dmic, OMAP_DMIC_CTRL_REG, 0x00); in omap_dmic_probe()
416 pm_runtime_put_sync(dmic->dev); in omap_dmic_probe()
419 dmic->threshold = OMAP_DMIC_THRES_MAX - 3; in omap_dmic_probe()
421 snd_soc_dai_init_dma_data(dai, NULL, &dmic->dma_data); in omap_dmic_probe()
428 struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); in omap_dmic_remove() local
430 pm_runtime_disable(dmic->dev); in omap_dmic_remove()
455 struct omap_dmic *dmic; in asoc_dmic_probe() local
459 dmic = devm_kzalloc(&pdev->dev, sizeof(struct omap_dmic), GFP_KERNEL); in asoc_dmic_probe()
460 if (!dmic) in asoc_dmic_probe()
463 platform_set_drvdata(pdev, dmic); in asoc_dmic_probe()
464 dmic->dev = &pdev->dev; in asoc_dmic_probe()
465 dmic->sysclk = OMAP_DMIC_SYSCLK_SYNC_MUX_CLKS; in asoc_dmic_probe()
467 mutex_init(&dmic->mutex); in asoc_dmic_probe()
469 dmic->fclk = devm_clk_get(dmic->dev, "fck"); in asoc_dmic_probe()
470 if (IS_ERR(dmic->fclk)) { in asoc_dmic_probe()
471 dev_err(dmic->dev, "cant get fck\n"); in asoc_dmic_probe()
477 dev_err(dmic->dev, "invalid dma memory resource\n"); in asoc_dmic_probe()
480 dmic->dma_data.addr = res->start + OMAP_DMIC_DATA_REG; in asoc_dmic_probe()
482 dmic->dma_data.filter_data = "up_link"; in asoc_dmic_probe()
485 dmic->io_base = devm_ioremap_resource(&pdev->dev, res); in asoc_dmic_probe()
486 if (IS_ERR(dmic->io_base)) in asoc_dmic_probe()
487 return PTR_ERR(dmic->io_base); in asoc_dmic_probe()