Lines Matching +full:mux +full:- +full:reg +full:- +full:masks

1 // SPDX-License-Identifier: GPL-2.0
3 // cs35l36.c -- CS35L36 ALSA SoC audio driver
27 #include <sound/soc-dapm.h>
247 static bool cs35l36_readable_reg(struct device *dev, unsigned int reg) in cs35l36_readable_reg() argument
249 switch (reg) { in cs35l36_readable_reg()
389 if (reg >= CS35L36_PAC_PMEM_WORD0 && in cs35l36_readable_reg()
390 reg <= CS35L36_PAC_PMEM_WORD1023) in cs35l36_readable_reg()
397 static bool cs35l36_precious_reg(struct device *dev, unsigned int reg) in cs35l36_precious_reg() argument
399 switch (reg) { in cs35l36_precious_reg()
409 static bool cs35l36_volatile_reg(struct device *dev, unsigned int reg) in cs35l36_volatile_reg() argument
411 switch (reg) { in cs35l36_volatile_reg()
439 if (reg >= CS35L36_PAC_PMEM_WORD0 && in cs35l36_volatile_reg()
440 reg <= CS35L36_PAC_PMEM_WORD1023) in cs35l36_volatile_reg()
447 static DECLARE_TLV_DB_SCALE(dig_vol_tlv, -10200, 25, 0);
464 ucontrol->value.integer.value[0] = cs35l36->ldm_mode_sel; in cs35l36_ldm_sel_get()
476 int val = (ucontrol->value.integer.value[0]) ? CS35L36_NG_AMP_EN_MASK : in cs35l36_ldm_sel_put()
479 cs35l36->ldm_mode_sel = val; in cs35l36_ldm_sel_put()
481 regmap_update_bits(cs35l36->regmap, CS35L36_NG_CFG, in cs35l36_ldm_sel_put()
493 SOC_SINGLE("Amp Gain Zero-Cross Switch", CS35L36_AMP_GAIN_CTRL,
507 snd_soc_dapm_to_component(w->dapm); in cs35l36_main_amp_event()
510 u32 reg; in cs35l36_main_amp_event() local
514 regmap_update_bits(cs35l36->regmap, CS35L36_PWR_CTRL1, in cs35l36_main_amp_event()
520 regmap_read(cs35l36->regmap, CS35L36_INT4_RAW_STATUS, &reg); in cs35l36_main_amp_event()
522 if (WARN_ON_ONCE(reg & CS35L36_PLL_UNLOCK_MASK)) in cs35l36_main_amp_event()
523 dev_crit(cs35l36->dev, "PLL Unlocked\n"); in cs35l36_main_amp_event()
525 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_RX1_SEL, in cs35l36_main_amp_event()
528 regmap_update_bits(cs35l36->regmap, CS35L36_AMP_OUT_MUTE, in cs35l36_main_amp_event()
533 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_RX1_SEL, in cs35l36_main_amp_event()
536 regmap_update_bits(cs35l36->regmap, CS35L36_AMP_OUT_MUTE, in cs35l36_main_amp_event()
541 regmap_update_bits(cs35l36->regmap, CS35L36_PWR_CTRL1, in cs35l36_main_amp_event()
548 dev_dbg(component->dev, "Invalid event = 0x%x\n", event); in cs35l36_main_amp_event()
549 return -EINVAL; in cs35l36_main_amp_event()
559 snd_soc_dapm_to_component(w->dapm); in cs35l36_boost_event()
565 if (!cs35l36->pdata.extern_boost) in cs35l36_boost_event()
566 regmap_update_bits(cs35l36->regmap, CS35L36_PWR_CTRL2, in cs35l36_boost_event()
572 if (!cs35l36->pdata.extern_boost) in cs35l36_boost_event()
573 regmap_update_bits(cs35l36->regmap, CS35L36_PWR_CTRL2, in cs35l36_boost_event()
579 dev_dbg(component->dev, "Invalid event = 0x%x\n", event); in cs35l36_boost_event()
580 return -EINVAL; in cs35l36_boost_event()
595 SOC_DAPM_ENUM("Input Mux", chansel_enum);
655 SND_SOC_DAPM_MUX("Channel Mux", SND_SOC_NOPM, 0, 0, &cs35l36_chan_mux),
745 {"Channel Mux", "RX1", "SDIN"},
746 {"Channel Mux", "RX2", "SDIN"},
747 {"BOOST Enable", "Switch", "Channel Mux"},
749 {"Main AMP", NULL, "Channel Mux"},
758 snd_soc_component_get_drvdata(component_dai->component); in cs35l36_set_dai_fmt()
769 return -EINVAL; in cs35l36_set_dai_fmt()
772 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_TX_PIN_CTRL, in cs35l36_set_dai_fmt()
775 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_RATE_CTRL, in cs35l36_set_dai_fmt()
787 return -EINVAL; in cs35l36_set_dai_fmt()
790 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_TX_PIN_CTRL, in cs35l36_set_dai_fmt()
793 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_RATE_CTRL, in cs35l36_set_dai_fmt()
805 return -EINVAL; in cs35l36_set_dai_fmt()
826 return -EINVAL; in cs35l36_set_dai_fmt()
829 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_RATE_CTRL, in cs35l36_set_dai_fmt()
832 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_TX_PIN_CTRL, in cs35l36_set_dai_fmt()
835 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_FORMAT, in cs35l36_set_dai_fmt()
868 snd_soc_component_get_drvdata(dai->component); in cs35l36_pcm_hw_params()
874 regmap_update_bits(cs35l36->regmap, in cs35l36_pcm_hw_params()
892 return -EINVAL; in cs35l36_pcm_hw_params()
895 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in cs35l36_pcm_hw_params()
896 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_FRAME_CTRL, in cs35l36_pcm_hw_params()
900 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_FRAME_CTRL, in cs35l36_pcm_hw_params()
911 struct snd_soc_component *component = dai->component; in cs35l36_dai_set_sysclk()
920 fs1 = 3 * ((CS35L36_FS_NOM_6MHZ * 4 + freq - 1) / freq) + 4; in cs35l36_dai_set_sysclk()
921 fs2 = 5 * ((CS35L36_FS_NOM_6MHZ * 4 + freq - 1) / freq) + 4; in cs35l36_dai_set_sysclk()
924 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_dai_set_sysclk()
926 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_dai_set_sysclk()
929 regmap_update_bits(cs35l36->regmap, CS35L36_TST_FS_MON0, in cs35l36_dai_set_sysclk()
933 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_dai_set_sysclk()
935 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_dai_set_sysclk()
966 snd_pcm_hw_constraint_list(substream->runtime, 0, in cs35l36_pcm_startup()
981 .name = "cs35l36-pcm",
1012 prev_clksrc = cs35l36->clksrc; in cs35l36_component_set_sysclk()
1016 cs35l36->clksrc = CS35L36_PLLSRC_SCLK; in cs35l36_component_set_sysclk()
1019 cs35l36->clksrc = CS35L36_PLLSRC_LRCLK; in cs35l36_component_set_sysclk()
1022 cs35l36->clksrc = CS35L36_PLLSRC_PDMCLK; in cs35l36_component_set_sysclk()
1025 cs35l36->clksrc = CS35L36_PLLSRC_SELF; in cs35l36_component_set_sysclk()
1028 cs35l36->clksrc = CS35L36_PLLSRC_MCLK; in cs35l36_component_set_sysclk()
1031 return -EINVAL; in cs35l36_component_set_sysclk()
1036 dev_err(component->dev, "Invalid CLK Config Freq: %d\n", freq); in cs35l36_component_set_sysclk()
1037 return -EINVAL; in cs35l36_component_set_sysclk()
1040 regmap_update_bits(cs35l36->regmap, CS35L36_PLL_CLK_CTRL, in cs35l36_component_set_sysclk()
1043 regmap_update_bits(cs35l36->regmap, CS35L36_PLL_CLK_CTRL, in cs35l36_component_set_sysclk()
1045 clk_cfg->clk_cfg << CS35L36_REFCLK_FREQ_SHIFT); in cs35l36_component_set_sysclk()
1046 regmap_update_bits(cs35l36->regmap, CS35L36_PLL_CLK_CTRL, in cs35l36_component_set_sysclk()
1049 regmap_update_bits(cs35l36->regmap, CS35L36_PLL_CLK_CTRL, in cs35l36_component_set_sysclk()
1051 cs35l36->clksrc); in cs35l36_component_set_sysclk()
1052 regmap_update_bits(cs35l36->regmap, CS35L36_PLL_CLK_CTRL, in cs35l36_component_set_sysclk()
1055 regmap_update_bits(cs35l36->regmap, CS35L36_PLL_CLK_CTRL, in cs35l36_component_set_sysclk()
1059 if (cs35l36->rev_id == CS35L36_REV_A0) { in cs35l36_component_set_sysclk()
1060 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_set_sysclk()
1062 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_set_sysclk()
1065 regmap_write(cs35l36->regmap, CS35L36_DCO_CTRL, 0x00036DA8); in cs35l36_component_set_sysclk()
1066 regmap_write(cs35l36->regmap, CS35L36_MISC_CTRL, 0x0100EE0E); in cs35l36_component_set_sysclk()
1068 regmap_update_bits(cs35l36->regmap, CS35L36_PLL_LOOP_PARAMS, in cs35l36_component_set_sysclk()
1072 regmap_update_bits(cs35l36->regmap, CS35L36_PLL_LOOP_PARAMS, in cs35l36_component_set_sysclk()
1074 clk_cfg->fll_igain); in cs35l36_component_set_sysclk()
1076 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_set_sysclk()
1078 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_set_sysclk()
1082 if (cs35l36->clksrc == CS35L36_PLLSRC_PDMCLK) { in cs35l36_component_set_sysclk()
1083 pdm_switch = cs35l36->ldm_mode_sel && in cs35l36_component_set_sysclk()
1087 regmap_update_bits(cs35l36->regmap, CS35L36_NG_CFG, in cs35l36_component_set_sysclk()
1091 regmap_update_bits(cs35l36->regmap, CS35L36_DAC_MSM_CFG, in cs35l36_component_set_sysclk()
1096 regmap_update_bits(cs35l36->regmap, CS35L36_NG_CFG, in cs35l36_component_set_sysclk()
1100 pdm_switch = cs35l36->ldm_mode_sel && in cs35l36_component_set_sysclk()
1104 regmap_update_bits(cs35l36->regmap, CS35L36_NG_CFG, in cs35l36_component_set_sysclk()
1108 regmap_update_bits(cs35l36->regmap, CS35L36_DAC_MSM_CFG, in cs35l36_component_set_sysclk()
1113 regmap_update_bits(cs35l36->regmap, CS35L36_NG_CFG, in cs35l36_component_set_sysclk()
1123 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_COEFF, in cs35l36_boost_inductor()
1125 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_COEFF, in cs35l36_boost_inductor()
1128 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_SW_FREQ, in cs35l36_boost_inductor()
1133 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_SLOPE_LBST, in cs35l36_boost_inductor()
1136 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_SLOPE_LBST, in cs35l36_boost_inductor()
1140 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_SLOPE_LBST, in cs35l36_boost_inductor()
1143 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_SLOPE_LBST, in cs35l36_boost_inductor()
1147 dev_err(cs35l36->dev, "%s Invalid Inductor Value %d uH\n", in cs35l36_boost_inductor()
1149 return -EINVAL; in cs35l36_boost_inductor()
1161 if ((cs35l36->rev_id == CS35L36_REV_A0) && cs35l36->pdata.dcm_mode) { in cs35l36_component_probe()
1162 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_DCM_CTRL, in cs35l36_component_probe()
1166 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_probe()
1168 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_probe()
1171 regmap_update_bits(cs35l36->regmap, CS35L36_BST_TST_MANUAL, in cs35l36_component_probe()
1174 regmap_update_bits(cs35l36->regmap, CS35L36_BST_TST_MANUAL, in cs35l36_component_probe()
1178 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_probe()
1180 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_probe()
1184 if (cs35l36->pdata.amp_pcm_inv) in cs35l36_component_probe()
1185 regmap_update_bits(cs35l36->regmap, CS35L36_AMP_DIG_VOL_CTRL, in cs35l36_component_probe()
1189 if (cs35l36->pdata.multi_amp_mode) in cs35l36_component_probe()
1190 regmap_update_bits(cs35l36->regmap, CS35L36_ASP_TX_PIN_CTRL, in cs35l36_component_probe()
1194 if (cs35l36->pdata.imon_pol_inv) in cs35l36_component_probe()
1195 regmap_update_bits(cs35l36->regmap, CS35L36_VI_SPKMON_FILT, in cs35l36_component_probe()
1198 if (cs35l36->pdata.vmon_pol_inv) in cs35l36_component_probe()
1199 regmap_update_bits(cs35l36->regmap, CS35L36_VI_SPKMON_FILT, in cs35l36_component_probe()
1202 if (cs35l36->pdata.bst_vctl) in cs35l36_component_probe()
1203 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_VCTRL1, in cs35l36_component_probe()
1205 cs35l36->pdata.bst_vctl); in cs35l36_component_probe()
1207 if (cs35l36->pdata.bst_vctl_sel) in cs35l36_component_probe()
1208 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_VCTRL2, in cs35l36_component_probe()
1210 cs35l36->pdata.bst_vctl_sel); in cs35l36_component_probe()
1212 if (cs35l36->pdata.bst_ipk) in cs35l36_component_probe()
1213 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_PEAK_CUR, in cs35l36_component_probe()
1215 cs35l36->pdata.bst_ipk); in cs35l36_component_probe()
1217 if (cs35l36->pdata.boost_ind) { in cs35l36_component_probe()
1218 ret = cs35l36_boost_inductor(cs35l36, cs35l36->pdata.boost_ind); in cs35l36_component_probe()
1220 dev_err(cs35l36->dev, in cs35l36_component_probe()
1226 if (cs35l36->pdata.temp_warn_thld) in cs35l36_component_probe()
1227 regmap_update_bits(cs35l36->regmap, CS35L36_DTEMP_WARN_THLD, in cs35l36_component_probe()
1229 cs35l36->pdata.temp_warn_thld); in cs35l36_component_probe()
1231 if (cs35l36->pdata.irq_drv_sel) in cs35l36_component_probe()
1232 regmap_update_bits(cs35l36->regmap, CS35L36_PAD_INTERFACE, in cs35l36_component_probe()
1234 cs35l36->pdata.irq_drv_sel << in cs35l36_component_probe()
1237 if (cs35l36->pdata.irq_gpio_sel) in cs35l36_component_probe()
1238 regmap_update_bits(cs35l36->regmap, CS35L36_PAD_INTERFACE, in cs35l36_component_probe()
1240 cs35l36->pdata.irq_gpio_sel << in cs35l36_component_probe()
1251 if (cs35l36->chip_version == CS35L36_10V_L36) { in cs35l36_component_probe()
1252 regmap_update_bits(cs35l36->regmap, in cs35l36_component_probe()
1257 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_probe()
1259 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_probe()
1262 regmap_update_bits(cs35l36->regmap, CS35L36_BST_ANA2_TEST, in cs35l36_component_probe()
1266 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_VCTRL2, in cs35l36_component_probe()
1269 regmap_update_bits(cs35l36->regmap, CS35L36_BSTCVRT_VCTRL1, in cs35l36_component_probe()
1272 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_probe()
1274 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_component_probe()
1283 regmap_update_bits(cs35l36->regmap, CS35L36_CTRL_OVRRIDE, in cs35l36_component_probe()
1322 unsigned int masks[4]; in cs35l36_irq() local
1326 regmap_bulk_read(cs35l36->regmap, CS35L36_INT1_STATUS, status, in cs35l36_irq()
1329 regmap_bulk_read(cs35l36->regmap, CS35L36_INT1_MASK, masks, in cs35l36_irq()
1330 ARRAY_SIZE(masks)); in cs35l36_irq()
1333 if (!(status[0] & ~masks[0]) && !(status[1] & ~masks[1]) && in cs35l36_irq()
1334 !(status[2] & ~masks[2]) && !(status[3] & ~masks[3])) { in cs35l36_irq()
1341 * speaker out of Safe-Mode. in cs35l36_irq()
1344 dev_crit(cs35l36->dev, "Amp short error\n"); in cs35l36_irq()
1345 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1347 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1350 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1352 regmap_update_bits(cs35l36->regmap, CS35L36_INT3_STATUS, in cs35l36_irq()
1359 dev_crit(cs35l36->dev, "Over temperature warning\n"); in cs35l36_irq()
1360 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1362 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1365 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1367 regmap_update_bits(cs35l36->regmap, CS35L36_INT1_STATUS, in cs35l36_irq()
1373 dev_crit(cs35l36->dev, "Over temperature error\n"); in cs35l36_irq()
1374 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1376 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1378 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1380 regmap_update_bits(cs35l36->regmap, CS35L36_INT1_STATUS, in cs35l36_irq()
1386 dev_crit(cs35l36->dev, "VBST Over Voltage error\n"); in cs35l36_irq()
1387 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1389 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1391 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1393 regmap_update_bits(cs35l36->regmap, CS35L36_INT1_STATUS, in cs35l36_irq()
1399 dev_crit(cs35l36->dev, "DCM VBST Under Voltage Error\n"); in cs35l36_irq()
1400 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1402 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1405 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1407 regmap_update_bits(cs35l36->regmap, CS35L36_INT1_STATUS, in cs35l36_irq()
1414 dev_crit(cs35l36->dev, "LBST SHORT error!\n"); in cs35l36_irq()
1415 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1417 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1420 regmap_update_bits(cs35l36->regmap, CS35L36_PROTECT_REL_ERR, in cs35l36_irq()
1422 regmap_update_bits(cs35l36->regmap, CS35L36_INT1_STATUS, in cs35l36_irq()
1434 struct device_node *np = i2c_client->dev.of_node; in cs35l36_handle_of_data()
1435 struct cs35l36_vpbr_cfg *vpbr_config = &pdata->vpbr_config; in cs35l36_handle_of_data()
1443 ret = of_property_read_u32(np, "cirrus,boost-ctl-millivolt", &val); in cs35l36_handle_of_data()
1446 dev_err(&i2c_client->dev, in cs35l36_handle_of_data()
1448 return -EINVAL; in cs35l36_handle_of_data()
1450 pdata->bst_vctl = (((val - 2550) / 100) + 1) << 1; in cs35l36_handle_of_data()
1452 dev_err(&i2c_client->dev, in cs35l36_handle_of_data()
1453 "Unable to find required parameter 'cirrus,boost-ctl-millivolt'"); in cs35l36_handle_of_data()
1454 return -EINVAL; in cs35l36_handle_of_data()
1457 ret = of_property_read_u32(np, "cirrus,boost-ctl-select", &val); in cs35l36_handle_of_data()
1459 pdata->bst_vctl_sel = val | CS35L36_VALID_PDATA; in cs35l36_handle_of_data()
1461 ret = of_property_read_u32(np, "cirrus,boost-peak-milliamp", &val); in cs35l36_handle_of_data()
1464 dev_err(&i2c_client->dev, in cs35l36_handle_of_data()
1466 return -EINVAL; in cs35l36_handle_of_data()
1469 pdata->bst_ipk = (val - 1600) / 50; in cs35l36_handle_of_data()
1471 dev_err(&i2c_client->dev, in cs35l36_handle_of_data()
1472 "Unable to find required parameter 'cirrus,boost-peak-milliamp'"); in cs35l36_handle_of_data()
1473 return -EINVAL; in cs35l36_handle_of_data()
1476 pdata->multi_amp_mode = of_property_read_bool(np, in cs35l36_handle_of_data()
1477 "cirrus,multi-amp-mode"); in cs35l36_handle_of_data()
1479 pdata->dcm_mode = of_property_read_bool(np, in cs35l36_handle_of_data()
1480 "cirrus,dcm-mode-enable"); in cs35l36_handle_of_data()
1482 pdata->amp_pcm_inv = of_property_read_bool(np, in cs35l36_handle_of_data()
1483 "cirrus,amp-pcm-inv"); in cs35l36_handle_of_data()
1485 pdata->imon_pol_inv = of_property_read_bool(np, in cs35l36_handle_of_data()
1486 "cirrus,imon-pol-inv"); in cs35l36_handle_of_data()
1488 pdata->vmon_pol_inv = of_property_read_bool(np, in cs35l36_handle_of_data()
1489 "cirrus,vmon-pol-inv"); in cs35l36_handle_of_data()
1491 if (of_property_read_u32(np, "cirrus,temp-warn-threshold", &val) >= 0) in cs35l36_handle_of_data()
1492 pdata->temp_warn_thld = val | CS35L36_VALID_PDATA; in cs35l36_handle_of_data()
1494 if (of_property_read_u32(np, "cirrus,boost-ind-nanohenry", &val) >= 0) { in cs35l36_handle_of_data()
1495 pdata->boost_ind = val; in cs35l36_handle_of_data()
1497 dev_err(&i2c_client->dev, "Inductor not specified.\n"); in cs35l36_handle_of_data()
1498 return -EINVAL; in cs35l36_handle_of_data()
1501 if (of_property_read_u32(np, "cirrus,irq-drive-select", &val) >= 0) in cs35l36_handle_of_data()
1502 pdata->irq_drv_sel = val | CS35L36_VALID_PDATA; in cs35l36_handle_of_data()
1504 if (of_property_read_u32(np, "cirrus,irq-gpio-select", &val) >= 0) in cs35l36_handle_of_data()
1505 pdata->irq_gpio_sel = val | CS35L36_VALID_PDATA; in cs35l36_handle_of_data()
1508 vpbr_node = of_get_child_by_name(np, "cirrus,vpbr-config"); in cs35l36_handle_of_data()
1509 vpbr_config->is_present = vpbr_node ? true : false; in cs35l36_handle_of_data()
1510 if (vpbr_config->is_present) { in cs35l36_handle_of_data()
1511 if (of_property_read_u32(vpbr_node, "cirrus,vpbr-en", in cs35l36_handle_of_data()
1513 vpbr_config->vpbr_en = val; in cs35l36_handle_of_data()
1514 if (of_property_read_u32(vpbr_node, "cirrus,vpbr-thld", in cs35l36_handle_of_data()
1516 vpbr_config->vpbr_thld = val; in cs35l36_handle_of_data()
1517 if (of_property_read_u32(vpbr_node, "cirrus,vpbr-atk-rate", in cs35l36_handle_of_data()
1519 vpbr_config->vpbr_atk_rate = val; in cs35l36_handle_of_data()
1520 if (of_property_read_u32(vpbr_node, "cirrus,vpbr-atk-vol", in cs35l36_handle_of_data()
1522 vpbr_config->vpbr_atk_vol = val; in cs35l36_handle_of_data()
1523 if (of_property_read_u32(vpbr_node, "cirrus,vpbr-max-attn", in cs35l36_handle_of_data()
1525 vpbr_config->vpbr_max_attn = val; in cs35l36_handle_of_data()
1526 if (of_property_read_u32(vpbr_node, "cirrus,vpbr-wait", in cs35l36_handle_of_data()
1528 vpbr_config->vpbr_wait = val; in cs35l36_handle_of_data()
1529 if (of_property_read_u32(vpbr_node, "cirrus,vpbr-rel-rate", in cs35l36_handle_of_data()
1531 vpbr_config->vpbr_rel_rate = val; in cs35l36_handle_of_data()
1532 if (of_property_read_u32(vpbr_node, "cirrus,vpbr-mute-en", in cs35l36_handle_of_data()
1534 vpbr_config->vpbr_mute_en = val; in cs35l36_handle_of_data()
1546 if (cs35l36->rev_id != CS35L36_REV_B0) in cs35l36_pac()
1552 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_pac()
1554 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_pac()
1559 regmap_write(cs35l36->regmap, CS35L36_PAC_CTL1, in cs35l36_pac()
1561 regmap_write(cs35l36->regmap, CS35L36_PAC_CTL3, in cs35l36_pac()
1563 regmap_write(cs35l36->regmap, CS35L36_PAC_PMEM_WORD0, in cs35l36_pac()
1566 regmap_write(cs35l36->regmap, CS35L36_PAC_CTL3, in cs35l36_pac()
1568 regmap_write(cs35l36->regmap, CS35L36_PAC_CTL1, in cs35l36_pac()
1573 ret = regmap_read(cs35l36->regmap, CS35L36_INT4_STATUS, &val); in cs35l36_pac()
1575 dev_err(cs35l36->dev, "Failed to read int4_status %d\n", ret); in cs35l36_pac()
1584 ret = regmap_read(cs35l36->regmap, CS35L36_INT4_STATUS, in cs35l36_pac()
1587 dev_err(cs35l36->dev, "Failed to read int4_status %d\n", in cs35l36_pac()
1593 return -EINVAL; in cs35l36_pac()
1596 regmap_write(cs35l36->regmap, CS35L36_INT4_STATUS, in cs35l36_pac()
1598 regmap_update_bits(cs35l36->regmap, CS35L36_PAC_CTL1, in cs35l36_pac()
1601 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_pac()
1603 regmap_write(cs35l36->regmap, CS35L36_TESTKEY_CTRL, in cs35l36_pac()
1611 struct cs35l36_platform_data *pdata = &cs35l36->pdata; in cs35l36_apply_vpbr_config()
1612 struct cs35l36_vpbr_cfg *vpbr_config = &pdata->vpbr_config; in cs35l36_apply_vpbr_config()
1614 regmap_update_bits(cs35l36->regmap, CS35L36_PWR_CTRL3, in cs35l36_apply_vpbr_config()
1616 vpbr_config->vpbr_en << in cs35l36_apply_vpbr_config()
1618 regmap_update_bits(cs35l36->regmap, CS35L36_VPBR_CFG, in cs35l36_apply_vpbr_config()
1620 vpbr_config->vpbr_thld << in cs35l36_apply_vpbr_config()
1622 regmap_update_bits(cs35l36->regmap, CS35L36_VPBR_CFG, in cs35l36_apply_vpbr_config()
1624 vpbr_config->vpbr_max_attn << in cs35l36_apply_vpbr_config()
1626 regmap_update_bits(cs35l36->regmap, CS35L36_VPBR_CFG, in cs35l36_apply_vpbr_config()
1628 vpbr_config->vpbr_atk_vol << in cs35l36_apply_vpbr_config()
1630 regmap_update_bits(cs35l36->regmap, CS35L36_VPBR_CFG, in cs35l36_apply_vpbr_config()
1632 vpbr_config->vpbr_atk_rate << in cs35l36_apply_vpbr_config()
1634 regmap_update_bits(cs35l36->regmap, CS35L36_VPBR_CFG, in cs35l36_apply_vpbr_config()
1636 vpbr_config->vpbr_wait << in cs35l36_apply_vpbr_config()
1638 regmap_update_bits(cs35l36->regmap, CS35L36_VPBR_CFG, in cs35l36_apply_vpbr_config()
1640 vpbr_config->vpbr_rel_rate << in cs35l36_apply_vpbr_config()
1642 regmap_update_bits(cs35l36->regmap, CS35L36_VPBR_CFG, in cs35l36_apply_vpbr_config()
1644 vpbr_config->vpbr_mute_en << in cs35l36_apply_vpbr_config()
1707 struct device *dev = &i2c_client->dev; in cs35l36_i2c_probe()
1715 return -ENOMEM; in cs35l36_i2c_probe()
1717 cs35l36->dev = dev; in cs35l36_i2c_probe()
1720 cs35l36->regmap = devm_regmap_init_i2c(i2c_client, &cs35l36_regmap); in cs35l36_i2c_probe()
1721 if (IS_ERR(cs35l36->regmap)) { in cs35l36_i2c_probe()
1722 ret = PTR_ERR(cs35l36->regmap); in cs35l36_i2c_probe()
1727 cs35l36->num_supplies = ARRAY_SIZE(cs35l36_supplies); in cs35l36_i2c_probe()
1729 cs35l36->supplies[i].supply = cs35l36_supplies[i]; in cs35l36_i2c_probe()
1731 ret = devm_regulator_bulk_get(dev, cs35l36->num_supplies, in cs35l36_i2c_probe()
1732 cs35l36->supplies); in cs35l36_i2c_probe()
1739 cs35l36->pdata = *pdata; in cs35l36_i2c_probe()
1744 return -ENOMEM; in cs35l36_i2c_probe()
1746 if (i2c_client->dev.of_node) { in cs35l36_i2c_probe()
1753 cs35l36->pdata = *pdata; in cs35l36_i2c_probe()
1756 ret = regulator_bulk_enable(cs35l36->num_supplies, cs35l36->supplies); in cs35l36_i2c_probe()
1763 cs35l36->reset_gpio = devm_gpiod_get_optional(dev, "reset", in cs35l36_i2c_probe()
1765 if (IS_ERR(cs35l36->reset_gpio)) { in cs35l36_i2c_probe()
1766 ret = PTR_ERR(cs35l36->reset_gpio); in cs35l36_i2c_probe()
1767 cs35l36->reset_gpio = NULL; in cs35l36_i2c_probe()
1768 if (ret == -EBUSY) { in cs35l36_i2c_probe()
1776 if (cs35l36->reset_gpio) in cs35l36_i2c_probe()
1777 gpiod_set_value_cansleep(cs35l36->reset_gpio, 1); in cs35l36_i2c_probe()
1782 ret = regmap_read(cs35l36->regmap, CS35L36_SW_RESET, &reg_id); in cs35l36_i2c_probe()
1791 ret = -ENODEV; in cs35l36_i2c_probe()
1795 ret = regmap_read(cs35l36->regmap, CS35L36_REV_ID, &reg_revid); in cs35l36_i2c_probe()
1797 dev_err(&i2c_client->dev, "Get Revision ID failed %d\n", ret); in cs35l36_i2c_probe()
1801 cs35l36->rev_id = reg_revid >> 8; in cs35l36_i2c_probe()
1803 ret = regmap_read(cs35l36->regmap, CS35L36_OTP_MEM30, &l37_id_reg); in cs35l36_i2c_probe()
1805 dev_err(&i2c_client->dev, "Failed to read otp_id Register %d\n", in cs35l36_i2c_probe()
1811 cs35l36->chip_version = CS35L36_12V_L37; in cs35l36_i2c_probe()
1813 cs35l36->chip_version = CS35L36_10V_L36; in cs35l36_i2c_probe()
1815 switch (cs35l36->rev_id) { in cs35l36_i2c_probe()
1817 ret = regmap_register_patch(cs35l36->regmap, in cs35l36_i2c_probe()
1833 ret = regmap_register_patch(cs35l36->regmap, in cs35l36_i2c_probe()
1844 if (pdata->vpbr_config.is_present) in cs35l36_i2c_probe()
1847 irq_d = irq_get_irq_data(i2c_client->irq); in cs35l36_i2c_probe()
1849 dev_err(&i2c_client->dev, "Invalid IRQ: %d\n", i2c_client->irq); in cs35l36_i2c_probe()
1850 ret = -ENODEV; in cs35l36_i2c_probe()
1866 dev_err(cs35l36->dev, "Invalid IRQ polarity: %d\n", irq_pol); in cs35l36_i2c_probe()
1867 ret = -EINVAL; in cs35l36_i2c_probe()
1871 regmap_update_bits(cs35l36->regmap, CS35L36_PAD_INTERFACE, in cs35l36_i2c_probe()
1875 ret = devm_request_threaded_irq(dev, i2c_client->irq, NULL, cs35l36_irq, in cs35l36_i2c_probe()
1883 regmap_update_bits(cs35l36->regmap, CS35L36_PAD_INTERFACE, in cs35l36_i2c_probe()
1886 /* Set interrupt masks for critical errors */ in cs35l36_i2c_probe()
1887 regmap_write(cs35l36->regmap, CS35L36_INT1_MASK, in cs35l36_i2c_probe()
1889 regmap_write(cs35l36->regmap, CS35L36_INT3_MASK, in cs35l36_i2c_probe()
1892 dev_info(&i2c_client->dev, "Cirrus Logic CS35L%d, Revision: %02X\n", in cs35l36_i2c_probe()
1893 cs35l36->chip_version, reg_revid >> 8); in cs35l36_i2c_probe()
1907 gpiod_set_value_cansleep(cs35l36->reset_gpio, 0); in cs35l36_i2c_probe()
1910 regulator_bulk_disable(cs35l36->num_supplies, cs35l36->supplies); in cs35l36_i2c_probe()
1918 /* Reset interrupt masks for device removal */ in cs35l36_i2c_remove()
1919 regmap_write(cs35l36->regmap, CS35L36_INT1_MASK, in cs35l36_i2c_remove()
1921 regmap_write(cs35l36->regmap, CS35L36_INT3_MASK, in cs35l36_i2c_remove()
1924 if (cs35l36->reset_gpio) in cs35l36_i2c_remove()
1925 gpiod_set_value_cansleep(cs35l36->reset_gpio, 0); in cs35l36_i2c_remove()
1927 regulator_bulk_disable(cs35l36->num_supplies, cs35l36->supplies); in cs35l36_i2c_remove()