Lines Matching +full:capture +full:- +full:channels

1 // SPDX-License-Identifier: GPL-2.0-only
3 // tegra210_dmic.c - Tegra210 DMIC driver
26 /* Below enables all filters - DCR, LP and SC */
47 regcache_cache_only(dmic->regmap, true); in tegra210_dmic_runtime_suspend()
48 regcache_mark_dirty(dmic->regmap); in tegra210_dmic_runtime_suspend()
50 clk_disable_unprepare(dmic->clk_dmic); in tegra210_dmic_runtime_suspend()
60 err = clk_prepare_enable(dmic->clk_dmic); in tegra210_dmic_runtime_resume()
66 regcache_cache_only(dmic->regmap, false); in tegra210_dmic_runtime_resume()
67 regcache_sync(dmic->regmap); in tegra210_dmic_runtime_resume()
77 unsigned int srate, clk_rate, channels; in tegra210_dmic_hw_params() local
84 channels = params_channels(params); in tegra210_dmic_hw_params()
86 cif_conf.audio_ch = channels; in tegra210_dmic_hw_params()
88 switch (dmic->ch_select) { in tegra210_dmic_hw_params()
97 dev_err(dai->dev, "invalid DMIC client channels\n"); in tegra210_dmic_hw_params()
98 return -EINVAL; in tegra210_dmic_hw_params()
107 clk_rate = (DMIC_OSR_FACTOR << dmic->osr_val) * srate; in tegra210_dmic_hw_params()
109 err = clk_set_rate(dmic->clk_dmic, clk_rate); in tegra210_dmic_hw_params()
111 dev_err(dai->dev, "can't set DMIC clock rate %u, err: %d\n", in tegra210_dmic_hw_params()
116 regmap_update_bits(dmic->regmap, in tegra210_dmic_hw_params()
124 (dmic->lrsel << LRSEL_POL_SHIFT) | in tegra210_dmic_hw_params()
125 (dmic->osr_val << OSR_SHIFT) | in tegra210_dmic_hw_params()
126 ((dmic->ch_select + 1) << CH_SEL_SHIFT)); in tegra210_dmic_hw_params()
132 if (dmic->boost_gain) in tegra210_dmic_hw_params()
133 gain_q23 = div_u64(gain_q23 * dmic->boost_gain, 100); in tegra210_dmic_hw_params()
135 regmap_write(dmic->regmap, TEGRA210_DMIC_LP_FILTER_GAIN, in tegra210_dmic_hw_params()
146 dev_err(dai->dev, "unsupported format!\n"); in tegra210_dmic_hw_params()
147 return -EOPNOTSUPP; in tegra210_dmic_hw_params()
151 cif_conf.mono_conv = dmic->mono_to_stereo; in tegra210_dmic_hw_params()
152 cif_conf.stereo_conv = dmic->stereo_to_mono; in tegra210_dmic_hw_params()
154 tegra_set_cif(dmic->regmap, TEGRA210_DMIC_TX_CIF_CTRL, &cif_conf); in tegra210_dmic_hw_params()
165 if (strstr(kcontrol->id.name, "Boost Gain Volume")) in tegra210_dmic_get_control()
166 ucontrol->value.integer.value[0] = dmic->boost_gain; in tegra210_dmic_get_control()
167 else if (strstr(kcontrol->id.name, "Channel Select")) in tegra210_dmic_get_control()
168 ucontrol->value.integer.value[0] = dmic->ch_select; in tegra210_dmic_get_control()
169 else if (strstr(kcontrol->id.name, "Mono To Stereo")) in tegra210_dmic_get_control()
170 ucontrol->value.integer.value[0] = dmic->mono_to_stereo; in tegra210_dmic_get_control()
171 else if (strstr(kcontrol->id.name, "Stereo To Mono")) in tegra210_dmic_get_control()
172 ucontrol->value.integer.value[0] = dmic->stereo_to_mono; in tegra210_dmic_get_control()
173 else if (strstr(kcontrol->id.name, "OSR Value")) in tegra210_dmic_get_control()
174 ucontrol->value.integer.value[0] = dmic->osr_val; in tegra210_dmic_get_control()
175 else if (strstr(kcontrol->id.name, "LR Polarity Select")) in tegra210_dmic_get_control()
176 ucontrol->value.integer.value[0] = dmic->lrsel; in tegra210_dmic_get_control()
186 int value = ucontrol->value.integer.value[0]; in tegra210_dmic_put_control()
188 if (strstr(kcontrol->id.name, "Boost Gain Volume")) in tegra210_dmic_put_control()
189 dmic->boost_gain = value; in tegra210_dmic_put_control()
190 else if (strstr(kcontrol->id.name, "Channel Select")) in tegra210_dmic_put_control()
191 dmic->ch_select = ucontrol->value.integer.value[0]; in tegra210_dmic_put_control()
192 else if (strstr(kcontrol->id.name, "Mono To Stereo")) in tegra210_dmic_put_control()
193 dmic->mono_to_stereo = value; in tegra210_dmic_put_control()
194 else if (strstr(kcontrol->id.name, "Stereo To Mono")) in tegra210_dmic_put_control()
195 dmic->stereo_to_mono = value; in tegra210_dmic_put_control()
196 else if (strstr(kcontrol->id.name, "OSR Value")) in tegra210_dmic_put_control()
197 dmic->osr_val = value; in tegra210_dmic_put_control()
198 else if (strstr(kcontrol->id.name, "LR Polarity Select")) in tegra210_dmic_put_control()
199 dmic->lrsel = value; in tegra210_dmic_put_control()
210 .name = "DMIC-CIF",
211 .capture = {
212 .stream_name = "CIF-Capture",
221 .name = "DMIC-DAP",
222 .capture = {
223 .stream_name = "DAP-Capture",
241 { "XBAR-RX", NULL, "XBAR-Capture" },
242 { "XBAR-Capture", NULL, "CIF-Capture" },
243 { "CIF-Capture", NULL, "TX" },
244 { "TX", NULL, "DAP-Capture" },
245 { "DAP-Capture", NULL, "MIC" },
374 struct device *dev = &pdev->dev; in tegra210_dmic_probe()
381 return -ENOMEM; in tegra210_dmic_probe()
383 dmic->osr_val = DMIC_OSR_64; in tegra210_dmic_probe()
384 dmic->ch_select = DMIC_CH_SELECT_STEREO; in tegra210_dmic_probe()
385 dmic->lrsel = DMIC_LRSEL_LEFT; in tegra210_dmic_probe()
386 dmic->boost_gain = 0; in tegra210_dmic_probe()
387 dmic->stereo_to_mono = 0; /* "CH0" */ in tegra210_dmic_probe()
391 dmic->clk_dmic = devm_clk_get(dev, "dmic"); in tegra210_dmic_probe()
392 if (IS_ERR(dmic->clk_dmic)) { in tegra210_dmic_probe()
394 return PTR_ERR(dmic->clk_dmic); in tegra210_dmic_probe()
401 dmic->regmap = devm_regmap_init_mmio(dev, regs, in tegra210_dmic_probe()
403 if (IS_ERR(dmic->regmap)) { in tegra210_dmic_probe()
405 return PTR_ERR(dmic->regmap); in tegra210_dmic_probe()
408 regcache_cache_only(dmic->regmap, true); in tegra210_dmic_probe()
425 pm_runtime_disable(&pdev->dev); in tegra210_dmic_remove()
438 { .compatible = "nvidia,tegra210-dmic" },
445 .name = "tegra210-dmic",