• Home
  • Raw
  • Download

Lines Matching +full:spk +full:- +full:shutdown

1 // SPDX-License-Identifier: GPL-2.0
3 * rt1011.c -- rt1011 ALSA SoC amplifier component driver
27 #include <sound/soc-dapm.h>
685 regmap_multi_reg_write(rt1011->regmap, in rt1011_reg_init()
1044 ucontrol->value.integer.value[0] = rt1011->recv_spk_mode; in rt1011_recv_spk_mode_get()
1057 if (ucontrol->value.integer.value[0] == rt1011->recv_spk_mode) in rt1011_recv_spk_mode_put()
1061 rt1011->recv_spk_mode = ucontrol->value.integer.value[0]; in rt1011_recv_spk_mode_put()
1063 if (rt1011->recv_spk_mode) { in rt1011_recv_spk_mode_put()
1125 (struct rt1011_bq_drc_params *)ucontrol->value.integer.value; in rt1011_bq_drc_coeff_get()
1128 if (strstr(ucontrol->id.name, "AdvanceMode Initial Set")) in rt1011_bq_drc_coeff_get()
1130 else if (strstr(ucontrol->id.name, "AdvanceMode SEP BQ Coeff")) in rt1011_bq_drc_coeff_get()
1132 else if (strstr(ucontrol->id.name, "AdvanceMode EQ BQ Coeff")) in rt1011_bq_drc_coeff_get()
1134 else if (strstr(ucontrol->id.name, "AdvanceMode BQ UI Coeff")) in rt1011_bq_drc_coeff_get()
1136 else if (strstr(ucontrol->id.name, "AdvanceMode SmartBoost Coeff")) in rt1011_bq_drc_coeff_get()
1139 return -EINVAL; in rt1011_bq_drc_coeff_get()
1142 ucontrol->id.name, mode_idx); in rt1011_bq_drc_coeff_get()
1143 bq_drc_info = rt1011->bq_drc_params[mode_idx]; in rt1011_bq_drc_coeff_get()
1162 (struct rt1011_bq_drc_params *)ucontrol->value.integer.value; in rt1011_bq_drc_coeff_put()
1165 if (strstr(ucontrol->id.name, "AdvanceMode Initial Set")) in rt1011_bq_drc_coeff_put()
1167 else if (strstr(ucontrol->id.name, "AdvanceMode SEP BQ Coeff")) in rt1011_bq_drc_coeff_put()
1169 else if (strstr(ucontrol->id.name, "AdvanceMode EQ BQ Coeff")) in rt1011_bq_drc_coeff_put()
1171 else if (strstr(ucontrol->id.name, "AdvanceMode BQ UI Coeff")) in rt1011_bq_drc_coeff_put()
1173 else if (strstr(ucontrol->id.name, "AdvanceMode SmartBoost Coeff")) in rt1011_bq_drc_coeff_put()
1176 return -EINVAL; in rt1011_bq_drc_coeff_put()
1178 bq_drc_info = rt1011->bq_drc_params[mode_idx]; in rt1011_bq_drc_coeff_put()
1183 ucontrol->id.name, mode_idx); in rt1011_bq_drc_coeff_put()
1204 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in rt1011_bq_drc_info()
1205 uinfo->count = 128; in rt1011_bq_drc_info()
1206 uinfo->value.integer.max = 0x17ffffff; in rt1011_bq_drc_info()
1224 ucontrol->value.integer.value[0] = rt1011->cali_done; in rt1011_r0_cali_get()
1235 rt1011->cali_done = 0; in rt1011_r0_cali_put()
1237 ucontrol->value.integer.value[0]) in rt1011_r0_cali_put()
1245 if (!rt1011->r0_reg) in rt1011_r0_load()
1246 return -EINVAL; in rt1011_r0_load()
1249 regmap_write(rt1011->regmap, RT1011_INIT_RECIPROCAL_REG_24_16, in rt1011_r0_load()
1250 ((rt1011->r0_reg>>16) & 0x1ff)); in rt1011_r0_load()
1251 regmap_write(rt1011->regmap, RT1011_INIT_RECIPROCAL_REG_15_0, in rt1011_r0_load()
1252 (rt1011->r0_reg & 0xffff)); in rt1011_r0_load()
1253 regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_4, 0x4080); in rt1011_r0_load()
1264 ucontrol->value.integer.value[0] = rt1011->r0_reg; in rt1011_r0_load_mode_get()
1277 if (ucontrol->value.integer.value[0] == rt1011->r0_reg) in rt1011_r0_load_mode_put()
1280 if (ucontrol->value.integer.value[0] == 0) in rt1011_r0_load_mode_put()
1281 return -EINVAL; in rt1011_r0_load_mode_put()
1283 dev = regmap_get_device(rt1011->regmap); in rt1011_r0_load_mode_put()
1285 rt1011->r0_reg = ucontrol->value.integer.value[0]; in rt1011_r0_load_mode_put()
1288 r0_integer = format / rt1011->r0_reg / 128; in rt1011_r0_load_mode_put()
1289 r0_factor = ((format / rt1011->r0_reg * 100) / 128) in rt1011_r0_load_mode_put()
1290 - (r0_integer * 100); in rt1011_r0_load_mode_put()
1292 r0_integer, r0_factor, rt1011->r0_reg); in rt1011_r0_load_mode_put()
1294 if (rt1011->r0_reg) in rt1011_r0_load_mode_put()
1304 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in rt1011_r0_load_info()
1305 uinfo->count = 1; in rt1011_r0_load_info()
1306 uinfo->value.integer.max = 0x1ffffff; in rt1011_r0_load_info()
1338 SOC_SINGLE_EXT("RECV SPK Mode", SND_SOC_NOPM, 0, 1, 0,
1362 snd_soc_dapm_to_component(source->dapm); in rt1011_is_sys_clk_from_pll()
1365 if (rt1011->sysclk_src == RT1011_FS_SYS_PRE_S_PLL1) in rt1011_is_sys_clk_from_pll()
1375 snd_soc_dapm_to_component(w->dapm); in rt1011_dac_event()
1413 SND_SOC_DAPM_SUPPLY("ISENSE SPK", RT1011_POWER_1,
1415 SND_SOC_DAPM_SUPPLY("VSENSE SPK", RT1011_POWER_1,
1480 { "DAC", NULL, "ISENSE SPK" },
1481 { "DAC", NULL, "VSENSE SPK" },
1516 return -EINVAL; in rt1011_get_clk_info()
1523 return -EINVAL; in rt1011_get_clk_info()
1529 struct snd_soc_component *component = dai->component; in rt1011_hw_params()
1534 rt1011->lrck = params_rate(params); in rt1011_hw_params()
1535 pre_div = rt1011_get_clk_info(rt1011->sysclk, rt1011->lrck); in rt1011_hw_params()
1537 dev_warn(component->dev, "Force using PLL "); in rt1011_hw_params()
1539 rt1011->lrck * 64, rt1011->lrck * 256); in rt1011_hw_params()
1541 rt1011->lrck * 256, SND_SOC_CLOCK_IN); in rt1011_hw_params()
1546 dev_err(component->dev, "Unsupported frame size: %d\n", in rt1011_hw_params()
1548 return -EINVAL; in rt1011_hw_params()
1552 rt1011->bclk = rt1011->lrck * (32 << bclk_ms); in rt1011_hw_params()
1554 dev_dbg(component->dev, "bclk_ms is %d and pre_div is %d for iis %d\n", in rt1011_hw_params()
1555 bclk_ms, pre_div, dai->id); in rt1011_hw_params()
1557 dev_dbg(component->dev, "lrck is %dHz and pre_div is %d for iis %d\n", in rt1011_hw_params()
1558 rt1011->lrck, pre_div, dai->id); in rt1011_hw_params()
1592 return -EINVAL; in rt1011_hw_params()
1595 switch (dai->id) { in rt1011_hw_params()
1608 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt1011_hw_params()
1609 return -EINVAL; in rt1011_hw_params()
1620 struct snd_soc_component *component = dai->component; in rt1011_set_dai_fmt()
1632 ret = -EINVAL; in rt1011_set_dai_fmt()
1643 ret = -EINVAL; in rt1011_set_dai_fmt()
1660 ret = -EINVAL; in rt1011_set_dai_fmt()
1664 switch (dai->id) { in rt1011_set_dai_fmt()
1675 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt1011_set_dai_fmt()
1676 ret = -EINVAL; in rt1011_set_dai_fmt()
1690 if (freq == rt1011->sysclk && clk_id == rt1011->sysclk_src) in rt1011_set_component_sysclk()
1713 dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); in rt1011_set_component_sysclk()
1714 return -EINVAL; in rt1011_set_component_sysclk()
1718 rt1011->sysclk = freq; in rt1011_set_component_sysclk()
1719 rt1011->sysclk_src = clk_id; in rt1011_set_component_sysclk()
1721 dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n", in rt1011_set_component_sysclk()
1735 if (source == rt1011->pll_src && freq_in == rt1011->pll_in && in rt1011_set_component_pll()
1736 freq_out == rt1011->pll_out) in rt1011_set_component_pll()
1740 dev_dbg(component->dev, "PLL disabled\n"); in rt1011_set_component_pll()
1742 rt1011->pll_in = 0; in rt1011_set_component_pll()
1743 rt1011->pll_out = 0; in rt1011_set_component_pll()
1769 dev_err(component->dev, "Unknown PLL Source %d\n", source); in rt1011_set_component_pll()
1770 return -EINVAL; in rt1011_set_component_pll()
1775 dev_err(component->dev, "Unsupported input clock %d\n", in rt1011_set_component_pll()
1780 dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", in rt1011_set_component_pll()
1790 rt1011->pll_in = freq_in; in rt1011_set_component_pll()
1791 rt1011->pll_out = freq_out; in rt1011_set_component_pll()
1792 rt1011->pll_src = source; in rt1011_set_component_pll()
1800 struct snd_soc_component *component = dai->component; in rt1011_set_tdm_slot()
1826 ret = -EINVAL; in rt1011_set_tdm_slot()
1846 ret = -EINVAL; in rt1011_set_tdm_slot()
1853 ret = -EINVAL; in rt1011_set_tdm_slot()
1854 dev_err(component->dev, "too many rx slots or zero slot\n"); in rt1011_set_tdm_slot()
1885 ((first_bit-1) << RT1011_TDM_I2S_TX_L_DAC1_1_SFT) | in rt1011_set_tdm_slot()
1889 ret = -EINVAL; in rt1011_set_tdm_slot()
1896 ret = -EINVAL; in rt1011_set_tdm_slot()
1897 dev_err(component->dev, "too many tx slots or zero slot\n"); in rt1011_set_tdm_slot()
1903 if (last_bit - first_bit > 1) { in rt1011_set_tdm_slot()
1904 ret = -EINVAL; in rt1011_set_tdm_slot()
1905 dev_err(component->dev, "tx slot location error\n"); in rt1011_set_tdm_slot()
1959 ret = -EINVAL; in rt1011_set_tdm_slot()
1960 dev_dbg(component->dev, in rt1011_set_tdm_slot()
1977 ret = -EINVAL; in rt1011_set_tdm_slot()
1978 dev_dbg(component->dev, in rt1011_set_tdm_slot()
2009 rt1011->component = component; in rt1011_probe()
2011 schedule_work(&rt1011->cali_work); in rt1011_probe()
2013 rt1011->bq_drc_params = devm_kcalloc(component->dev, in rt1011_probe()
2016 if (!rt1011->bq_drc_params) in rt1011_probe()
2017 return -ENOMEM; in rt1011_probe()
2020 rt1011->bq_drc_params[i] = devm_kcalloc(component->dev, in rt1011_probe()
2023 if (!rt1011->bq_drc_params[i]) in rt1011_probe()
2024 return -ENOMEM; in rt1011_probe()
2034 cancel_work_sync(&rt1011->cali_work); in rt1011_remove()
2035 rt1011_reset(rt1011->regmap); in rt1011_remove()
2043 regcache_cache_only(rt1011->regmap, true); in rt1011_suspend()
2044 regcache_mark_dirty(rt1011->regmap); in rt1011_suspend()
2053 regcache_cache_only(rt1011->regmap, false); in rt1011_resume()
2054 regcache_sync(rt1011->regmap); in rt1011_resume()
2101 .name = "rt1011-aif",
2173 struct device *dev = regmap_get_device(rt1011->regmap); in rt1011_calibrate()
2175 snd_soc_component_get_dapm(rt1011->component); in rt1011_calibrate()
2179 regcache_cache_bypass(rt1011->regmap, true); in rt1011_calibrate()
2181 regmap_write(rt1011->regmap, RT1011_RESET, 0x0000); in rt1011_calibrate()
2182 regmap_write(rt1011->regmap, RT1011_SYSTEM_RESET_3, 0x740f); in rt1011_calibrate()
2183 regmap_write(rt1011->regmap, RT1011_SYSTEM_RESET_3, 0x770f); in rt1011_calibrate()
2186 regmap_write(rt1011->regmap, RT1011_CLK_2, 0x9400); in rt1011_calibrate()
2187 regmap_write(rt1011->regmap, RT1011_PLL_1, 0x0800); in rt1011_calibrate()
2188 regmap_write(rt1011->regmap, RT1011_PLL_2, 0x0020); in rt1011_calibrate()
2189 regmap_write(rt1011->regmap, RT1011_CLK_DET, 0x0800); in rt1011_calibrate()
2192 regmap_write(rt1011->regmap, RT1011_ADC_SET_5, 0x0a20); in rt1011_calibrate()
2193 regmap_write(rt1011->regmap, RT1011_DAC_SET_2, 0xe232); in rt1011_calibrate()
2194 regmap_write(rt1011->regmap, RT1011_ADC_SET_4, 0xc000); in rt1011_calibrate()
2197 regmap_write(rt1011->regmap, RT1011_SPK_PRO_DC_DET_1, 0xb00c); in rt1011_calibrate()
2198 regmap_write(rt1011->regmap, RT1011_SPK_PRO_DC_DET_2, 0xcccc); in rt1011_calibrate()
2201 regmap_write(rt1011->regmap, RT1011_POWER_1, 0xe0e0); in rt1011_calibrate()
2202 regmap_write(rt1011->regmap, RT1011_POWER_3, 0x5003); in rt1011_calibrate()
2203 regmap_write(rt1011->regmap, RT1011_POWER_9, 0xa860); in rt1011_calibrate()
2204 regmap_write(rt1011->regmap, RT1011_DAC_SET_2, 0xa032); in rt1011_calibrate()
2207 regmap_write(rt1011->regmap, RT1011_POWER_2, 0x0007); in rt1011_calibrate()
2208 regmap_write(rt1011->regmap, RT1011_POWER_3, 0x5ff7); in rt1011_calibrate()
2209 regmap_write(rt1011->regmap, RT1011_A_TEMP_SEN, 0x7f44); in rt1011_calibrate()
2210 regmap_write(rt1011->regmap, RT1011_A_TIMING_1, 0x4054); in rt1011_calibrate()
2211 regmap_write(rt1011->regmap, RT1011_BAT_GAIN_1, 0x309c); in rt1011_calibrate()
2214 regmap_write(rt1011->regmap, RT1011_DC_CALIB_CLASSD_3, 0xcb00); in rt1011_calibrate()
2215 regmap_write(rt1011->regmap, RT1011_BOOST_CON_1, 0xe080); in rt1011_calibrate()
2216 regmap_write(rt1011->regmap, RT1011_POWER_4, 0x16f2); in rt1011_calibrate()
2217 regmap_write(rt1011->regmap, RT1011_POWER_6, 0x36ad); in rt1011_calibrate()
2220 regmap_write(rt1011->regmap, RT1011_MIXER_1, 0x3f1d); in rt1011_calibrate()
2223 regmap_write(rt1011->regmap, RT1011_EFUSE_CONTROL_1, 0x0d0a); in rt1011_calibrate()
2226 regmap_read(rt1011->regmap, RT1011_EFUSE_ADC_OFFSET_18_16, &value); in rt1011_calibrate()
2228 regmap_read(rt1011->regmap, RT1011_EFUSE_ADC_OFFSET_15_0, &value); in rt1011_calibrate()
2231 regmap_read(rt1011->regmap, RT1011_EFUSE_DAC_OFFSET_G0_20_16, &value); in rt1011_calibrate()
2233 regmap_read(rt1011->regmap, RT1011_EFUSE_DAC_OFFSET_G0_15_0, &value); in rt1011_calibrate()
2236 regmap_read(rt1011->regmap, RT1011_EFUSE_DAC_OFFSET_G1_20_16, &value); in rt1011_calibrate()
2238 regmap_read(rt1011->regmap, RT1011_EFUSE_DAC_OFFSET_G1_15_0, &value); in rt1011_calibrate()
2243 regmap_read(rt1011->regmap, RT1011_EFUSE_MATCH_DONE, &value); in rt1011_calibrate()
2245 rt1011->pack_id = 1; in rt1011_calibrate()
2249 if (rt1011->pack_id) in rt1011_calibrate()
2250 regmap_write(rt1011->regmap, RT1011_ADC_SET_1, 0x292c); in rt1011_calibrate()
2252 regmap_write(rt1011->regmap, RT1011_ADC_SET_1, 0x2925); in rt1011_calibrate()
2255 regmap_write(rt1011->regmap, RT1011_CLASS_D_POS, 0x010e); in rt1011_calibrate()
2256 regmap_write(rt1011->regmap, in rt1011_calibrate()
2260 regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_0, 0x8000); in rt1011_calibrate()
2261 regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_7, 0xf000); in rt1011_calibrate()
2262 regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_4, 0x4040); in rt1011_calibrate()
2263 regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_0, 0xc000); in rt1011_calibrate()
2264 regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_6, 0x07c2); in rt1011_calibrate()
2269 regmap_read(rt1011->regmap, in rt1011_calibrate()
2272 regmap_read(rt1011->regmap, in rt1011_calibrate()
2286 ret = -EAGAIN; in rt1011_calibrate()
2291 - (r0_integer * 100); in rt1011_calibrate()
2292 rt1011->r0_reg = r0[0]; in rt1011_calibrate()
2293 rt1011->cali_done = 1; in rt1011_calibrate()
2300 regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_0, 0x0000); in rt1011_calibrate()
2302 regmap_write(rt1011->regmap, RT1011_POWER_9, 0xa840); in rt1011_calibrate()
2303 regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_6, 0x0702); in rt1011_calibrate()
2304 regmap_write(rt1011->regmap, RT1011_MIXER_1, 0xffdd); in rt1011_calibrate()
2305 regmap_write(rt1011->regmap, RT1011_CLASSD_INTERNAL_SET_1, 0x0701); in rt1011_calibrate()
2306 regmap_write(rt1011->regmap, RT1011_DAC_SET_3, 0xe004); in rt1011_calibrate()
2307 regmap_write(rt1011->regmap, RT1011_A_TEMP_SEN, 0x7f40); in rt1011_calibrate()
2308 regmap_write(rt1011->regmap, RT1011_POWER_1, 0x0000); in rt1011_calibrate()
2309 regmap_write(rt1011->regmap, RT1011_POWER_2, 0x0000); in rt1011_calibrate()
2310 regmap_write(rt1011->regmap, RT1011_POWER_3, 0x0002); in rt1011_calibrate()
2311 regmap_write(rt1011->regmap, RT1011_POWER_4, 0x00f2); in rt1011_calibrate()
2313 regmap_write(rt1011->regmap, RT1011_RESET, 0x0000); in rt1011_calibrate()
2317 regmap_write(rt1011->regmap, in rt1011_calibrate()
2320 regmap_write(rt1011->regmap, in rt1011_calibrate()
2323 regmap_write(rt1011->regmap, in rt1011_calibrate()
2328 regcache_cache_bypass(rt1011->regmap, false); in rt1011_calibrate()
2329 regcache_mark_dirty(rt1011->regmap); in rt1011_calibrate()
2330 regcache_sync(rt1011->regmap); in rt1011_calibrate()
2340 struct snd_soc_component *component = rt1011->component; in rt1011_calibration_work()
2343 if (rt1011->r0_calib) in rt1011_calibration_work()
2353 rt1011->cali_done = 0; in rt1011_calibration_work()
2359 if (rt1011->temperature_calib <= 0xff && in rt1011_calibration_work()
2360 rt1011->temperature_calib > 0) { in rt1011_calibration_work()
2363 (rt1011->temperature_calib << 2)); in rt1011_calibration_work()
2366 if (rt1011->r0_calib) { in rt1011_calibration_work()
2367 rt1011->r0_reg = rt1011->r0_calib; in rt1011_calibration_work()
2370 r0_integer = format / rt1011->r0_reg / 128; in rt1011_calibration_work()
2371 r0_factor = ((format / rt1011->r0_reg * 100) / 128) in rt1011_calibration_work()
2372 - (r0_integer * 100); in rt1011_calibration_work()
2373 dev_info(component->dev, "DP r0 resistance about %d.%02d ohm, reg=0x%X\n", in rt1011_calibration_work()
2374 r0_integer, r0_factor, rt1011->r0_reg); in rt1011_calibration_work()
2379 if (rt1011->pack_id) in rt1011_calibration_work()
2388 &rt1011->temperature_calib); in rt1011_parse_dp()
2390 &rt1011->r0_calib); in rt1011_parse_dp()
2393 __func__, rt1011->r0_calib, rt1011->temperature_calib); in rt1011_parse_dp()
2405 rt1011 = devm_kzalloc(&i2c->dev, sizeof(struct rt1011_priv), in rt1011_i2c_probe()
2408 return -ENOMEM; in rt1011_i2c_probe()
2412 rt1011_parse_dp(rt1011, &i2c->dev); in rt1011_i2c_probe()
2414 rt1011->regmap = devm_regmap_init_i2c(i2c, &rt1011_regmap); in rt1011_i2c_probe()
2415 if (IS_ERR(rt1011->regmap)) { in rt1011_i2c_probe()
2416 ret = PTR_ERR(rt1011->regmap); in rt1011_i2c_probe()
2417 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", in rt1011_i2c_probe()
2422 regmap_read(rt1011->regmap, RT1011_DEVICE_ID, &val); in rt1011_i2c_probe()
2424 dev_err(&i2c->dev, in rt1011_i2c_probe()
2426 return -ENODEV; in rt1011_i2c_probe()
2429 INIT_WORK(&rt1011->cali_work, rt1011_calibration_work); in rt1011_i2c_probe()
2431 return devm_snd_soc_register_component(&i2c->dev, in rt1011_i2c_probe()
2441 rt1011_reset(rt1011->regmap); in rt1011_i2c_shutdown()
2451 .shutdown = rt1011_i2c_shutdown,