Lines Matching +full:vp +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0-only
3 * cs35l32.c -- CS35L32 ALSA SoC audio driver
26 #include <sound/soc-dapm.h>
29 #include <dt-bindings/sound/cs35l32.h>
37 "VP",
127 SND_SOC_DAPM_INPUT("VP"),
142 {"VPMON ADC", NULL, "VP"},
153 struct snd_soc_component *component = codec_dai->component;
166 return -EINVAL;
174 struct snd_soc_component *component = dai->component;
187 .name = "cs35l32-monitor",
220 return -EINVAL;
271 struct device_node *np = i2c_client->dev.of_node;
274 if (of_property_read_u32(np, "cirrus,sdout-share", &val) >= 0)
275 pdata->sdout_share = val;
277 if (of_property_read_u32(np, "cirrus,boost-manager", &val))
278 val = -1u;
285 pdata->boost_mng = val;
287 case -1u:
289 dev_err(&i2c_client->dev,
290 "Wrong cirrus,boost-manager DT value %d\n", val);
291 pdata->boost_mng = CS35L32_BOOST_MGR_BYPASS;
294 if (of_property_read_u32(np, "cirrus,sdout-datacfg", &val))
295 val = -1u;
301 pdata->sdout_datacfg = val;
303 case -1u:
305 dev_err(&i2c_client->dev,
306 "Wrong cirrus,sdout-datacfg DT value %d\n", val);
307 pdata->sdout_datacfg = CS35L32_DATA_CFG_LR;
310 if (of_property_read_u32(np, "cirrus,battery-threshold", &val))
311 val = -1u;
317 pdata->batt_thresh = val;
319 case -1u:
321 dev_err(&i2c_client->dev,
322 "Wrong cirrus,battery-threshold DT value %d\n", val);
323 pdata->batt_thresh = CS35L32_BATT_THRESH_3_3V;
326 if (of_property_read_u32(np, "cirrus,battery-recovery", &val))
327 val = -1u;
335 pdata->batt_recov = val;
337 case -1u:
339 dev_err(&i2c_client->dev,
340 "Wrong cirrus,battery-recovery DT value %d\n", val);
341 pdata->batt_recov = CS35L32_BATT_RECOV_3_4V;
351 dev_get_platdata(&i2c_client->dev);
355 cs35l32 = devm_kzalloc(&i2c_client->dev, sizeof(*cs35l32), GFP_KERNEL);
357 return -ENOMEM;
361 cs35l32->regmap = devm_regmap_init_i2c(i2c_client, &cs35l32_regmap);
362 if (IS_ERR(cs35l32->regmap)) {
363 ret = PTR_ERR(cs35l32->regmap);
364 dev_err(&i2c_client->dev, "regmap_init() failed: %d\n", ret);
369 cs35l32->pdata = *pdata;
371 pdata = devm_kzalloc(&i2c_client->dev, sizeof(*pdata),
374 return -ENOMEM;
376 if (i2c_client->dev.of_node) {
378 &cs35l32->pdata);
384 for (i = 0; i < ARRAY_SIZE(cs35l32->supplies); i++)
385 cs35l32->supplies[i].supply = cs35l32_supply_names[i];
387 ret = devm_regulator_bulk_get(&i2c_client->dev,
388 ARRAY_SIZE(cs35l32->supplies),
389 cs35l32->supplies);
391 dev_err(&i2c_client->dev,
396 ret = regulator_bulk_enable(ARRAY_SIZE(cs35l32->supplies),
397 cs35l32->supplies);
399 dev_err(&i2c_client->dev,
405 cs35l32->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev,
407 if (IS_ERR(cs35l32->reset_gpio)) {
408 ret = PTR_ERR(cs35l32->reset_gpio);
412 gpiod_set_value_cansleep(cs35l32->reset_gpio, 1);
415 devid = cirrus_read_device_id(cs35l32->regmap, CS35L32_DEVID_AB);
418 dev_err(&i2c_client->dev, "Failed to read device ID: %d\n", ret);
423 ret = -ENODEV;
424 dev_err(&i2c_client->dev,
430 ret = regmap_read(cs35l32->regmap, CS35L32_REV_ID, ®);
432 dev_err(&i2c_client->dev, "Get Revision ID failed\n");
436 ret = regmap_register_patch(cs35l32->regmap, cs35l32_monitor_patch,
439 dev_err(&i2c_client->dev, "Failed to apply errata patch\n");
443 dev_info(&i2c_client->dev,
447 if (cs35l32->pdata.boost_mng)
448 regmap_update_bits(cs35l32->regmap, CS35L32_AUDIO_LED_MNGR,
450 cs35l32->pdata.boost_mng);
453 if (cs35l32->pdata.sdout_share)
454 regmap_update_bits(cs35l32->regmap, CS35L32_ADSP_CTL,
456 cs35l32->pdata.sdout_share << 3);
459 if (cs35l32->pdata.sdout_datacfg)
460 regmap_update_bits(cs35l32->regmap, CS35L32_ADSP_CTL,
462 cs35l32->pdata.sdout_datacfg << 4);
465 if (cs35l32->pdata.batt_recov)
466 regmap_update_bits(cs35l32->regmap, CS35L32_BATT_THRESHOLD,
468 cs35l32->pdata.batt_recov << 1);
471 if (cs35l32->pdata.batt_thresh)
472 regmap_update_bits(cs35l32->regmap, CS35L32_BATT_THRESHOLD,
474 cs35l32->pdata.batt_thresh << 4);
477 regmap_update_bits(cs35l32->regmap, CS35L32_PWRCTL1, CS35L32_PDN_AMP,
481 regmap_read(cs35l32->regmap, CS35L32_INT_STATUS_1, ®);
483 ret = devm_snd_soc_register_component(&i2c_client->dev,
492 gpiod_set_value_cansleep(cs35l32->reset_gpio, 0);
494 regulator_bulk_disable(ARRAY_SIZE(cs35l32->supplies),
495 cs35l32->supplies);
504 gpiod_set_value_cansleep(cs35l32->reset_gpio, 0);
511 regcache_cache_only(cs35l32->regmap, true);
512 regcache_mark_dirty(cs35l32->regmap);
515 gpiod_set_value_cansleep(cs35l32->reset_gpio, 0);
518 regulator_bulk_disable(ARRAY_SIZE(cs35l32->supplies),
519 cs35l32->supplies);
530 ret = regulator_bulk_enable(ARRAY_SIZE(cs35l32->supplies),
531 cs35l32->supplies);
538 gpiod_set_value_cansleep(cs35l32->reset_gpio, 1);
540 regcache_cache_only(cs35l32->regmap, false);
541 regcache_sync(cs35l32->regmap);