Lines Matching refs:wm5100

3  * wm5100.c  --  WM5100 ALSA SoC Audio driver
31 #include <sound/wm5100.h>
33 #include "wm5100.h"
123 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
135 if ((wm5100->sysclk % rate) == 0) {
139 if (!wm5100->sr_ref[i] && sr_free == -1) {
149 wm5100->sr_ref[i]++;
151 rate, i, wm5100->sr_ref[i]);
162 wm5100->sr_ref[sr_free]++;
172 rate, wm5100->sysclk, wm5100->asyncclk);
179 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
192 if (!wm5100->sr_ref[i])
200 wm5100->sr_ref[i]--;
202 rate, wm5100->sr_ref[i]);
209 static int wm5100_reset(struct wm5100_priv *wm5100)
211 if (wm5100->reset) {
212 gpiod_set_value_cansleep(wm5100->reset, 1);
213 gpiod_set_value_cansleep(wm5100->reset, 0);
217 return regmap_write(wm5100->regmap, WM5100_SOFTWARE_RESET, 0);
739 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
743 if (wm5100->out_ena[0]) {
748 wm5100->out_ena[0] = false;
758 if (wm5100->out_ena[1]) {
763 wm5100->out_ena[1] = false;
779 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
783 wm5100->out_ena[0] = true;
786 wm5100->out_ena[0] = true;
795 static void wm5100_log_status3(struct wm5100_priv *wm5100, int val)
798 dev_crit(wm5100->dev, "Speaker shutdown warning\n");
800 dev_crit(wm5100->dev, "Speaker shutdown\n");
802 dev_crit(wm5100->dev, "SYSCLK underclocked\n");
804 dev_crit(wm5100->dev, "ASYNCCLK underclocked\n");
807 static void wm5100_log_status4(struct wm5100_priv *wm5100, int val)
810 dev_err(wm5100->dev, "AIF3 configuration error\n");
812 dev_err(wm5100->dev, "AIF2 configuration error\n");
814 dev_err(wm5100->dev, "AIF1 configuration error\n");
816 dev_err(wm5100->dev, "Control interface error\n");
818 dev_err(wm5100->dev, "ISRC2 underclocked\n");
820 dev_err(wm5100->dev, "ISRC1 underclocked\n");
822 dev_err(wm5100->dev, "FX underclocked\n");
824 dev_err(wm5100->dev, "AIF3 underclocked\n");
826 dev_err(wm5100->dev, "AIF2 underclocked\n");
828 dev_err(wm5100->dev, "AIF1 underclocked\n");
830 dev_err(wm5100->dev, "ASRC underclocked\n");
832 dev_err(wm5100->dev, "DAC underclocked\n");
834 dev_err(wm5100->dev, "ADC underclocked\n");
836 dev_err(wm5100->dev, "Mixer underclocked\n");
844 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
851 wm5100_log_status3(wm5100, ret);
854 wm5100_log_status4(wm5100, ret);
1403 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
1404 bool async = wm5100->aif_async[dai->id];
1428 aif_rate = wm5100->sysclk;
1434 aif_rate = wm5100->asyncclk;
1482 wm5100->aif_symmetric[dai->id])
1512 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
1519 rate_store = &wm5100->sysclk;
1523 rate_store = &wm5100->asyncclk;
1546 wm5100->aif_async[clk_id - 1] = false;
1549 wm5100->aif_async[clk_id - 1] = true;
1761 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
1769 fll = &wm5100->fll[0];
1774 fll = &wm5100->fll[1];
1889 .name = "wm5100-aif1",
1908 .name = "wm5100-aif2",
1928 .name = "wm5100-aif3",
1973 static void wm5100_set_detect_mode(struct wm5100_priv *wm5100, int the_mode)
1975 struct wm5100_jack_mode *mode = &wm5100->pdata.jack_modes[the_mode];
1977 if (WARN_ON(the_mode >= ARRAY_SIZE(wm5100->pdata.jack_modes)))
1980 gpiod_set_value_cansleep(wm5100->hp_pol, mode->hp_pol);
1981 regmap_update_bits(wm5100->regmap, WM5100_ACCESSORY_DETECT_MODE_1,
1986 regmap_update_bits(wm5100->regmap, WM5100_MISC_CONTROL,
1990 wm5100->jack_mode = the_mode;
1992 dev_dbg(wm5100->dev, "Set microphone polarity to %d\n",
1993 wm5100->jack_mode);
1996 static void wm5100_report_headphone(struct wm5100_priv *wm5100)
1998 dev_dbg(wm5100->dev, "Headphone detected\n");
1999 wm5100->jack_detecting = false;
2000 snd_soc_jack_report(wm5100->jack, SND_JACK_HEADPHONE,
2004 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2009 static void wm5100_micd_irq(struct wm5100_priv *wm5100)
2014 ret = regmap_read(wm5100->regmap, WM5100_MIC_DETECT_3, &val);
2016 dev_err(wm5100->dev, "Failed to read microphone status: %d\n",
2021 dev_dbg(wm5100->dev, "Microphone event: %x\n", val);
2024 dev_warn(wm5100->dev, "Microphone detection state invalid\n");
2030 dev_dbg(wm5100->dev, "Jack removal detected\n");
2031 wm5100->jack_mic = false;
2032 wm5100->jack_detecting = true;
2033 wm5100->jack_flips = 0;
2034 snd_soc_jack_report(wm5100->jack, 0,
2038 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2049 if (wm5100->jack_detecting) {
2050 dev_dbg(wm5100->dev, "Microphone detected\n");
2051 wm5100->jack_mic = true;
2052 wm5100->jack_detecting = false;
2053 snd_soc_jack_report(wm5100->jack,
2059 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2063 dev_dbg(wm5100->dev, "Mic button up\n");
2064 snd_soc_jack_report(wm5100->jack, 0, SND_JACK_BTN_0);
2076 if (wm5100->jack_detecting && (val & 0x3f8)) {
2077 wm5100->jack_flips++;
2079 if (wm5100->jack_flips > 1)
2080 wm5100_report_headphone(wm5100);
2082 wm5100_set_detect_mode(wm5100, !wm5100->jack_mode);
2091 if (wm5100->jack_mic) {
2092 dev_dbg(wm5100->dev, "Mic button detected\n");
2093 snd_soc_jack_report(wm5100->jack, SND_JACK_BTN_0,
2095 } else if (wm5100->jack_detecting) {
2096 wm5100_report_headphone(wm5100);
2103 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
2107 wm5100->jack = jack;
2108 wm5100->jack_detecting = true;
2109 wm5100->jack_flips = 0;
2111 wm5100_set_detect_mode(wm5100, 0);
2147 wm5100->jack = NULL;
2156 struct wm5100_priv *wm5100 = data;
2161 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_3, &irq_val);
2163 dev_err(wm5100->dev, "Failed to read IRQ status 3: %d\n",
2168 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_3_MASK,
2171 dev_err(wm5100->dev, "Failed to read IRQ mask 3: %d\n",
2178 regmap_write(wm5100->regmap, WM5100_INTERRUPT_STATUS_3, irq_val);
2183 wm5100_log_status3(wm5100, irq_val);
2186 dev_dbg(wm5100->dev, "FLL1 locked\n");
2187 complete(&wm5100->fll[0].lock);
2190 dev_dbg(wm5100->dev, "FLL2 locked\n");
2191 complete(&wm5100->fll[1].lock);
2195 wm5100_micd_irq(wm5100);
2197 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_4, &irq_val);
2199 dev_err(wm5100->dev, "Failed to read IRQ status 4: %d\n",
2204 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_4_MASK,
2207 dev_err(wm5100->dev, "Failed to read IRQ mask 4: %d\n",
2217 regmap_write(wm5100->regmap, WM5100_INTERRUPT_STATUS_4, irq_val);
2219 wm5100_log_status4(wm5100, irq_val);
2241 struct wm5100_priv *wm5100 = gpiochip_get_data(chip);
2243 regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2250 struct wm5100_priv *wm5100 = gpiochip_get_data(chip);
2255 ret = regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2266 struct wm5100_priv *wm5100 = gpiochip_get_data(chip);
2270 ret = regmap_read(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset, &reg);
2279 struct wm5100_priv *wm5100 = gpiochip_get_data(chip);
2281 return regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2288 .label = "wm5100",
2299 struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2302 wm5100->gpio_chip = wm5100_template_chip;
2303 wm5100->gpio_chip.ngpio = 6;
2304 wm5100->gpio_chip.parent = &i2c->dev;
2305 wm5100->gpio_chip.base = -1;
2307 ret = gpiochip_add_data(&wm5100->gpio_chip, wm5100);
2314 struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2316 gpiochip_remove(&wm5100->gpio_chip);
2332 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
2335 wm5100->component = component;
2351 wm5100->hp_pol = devm_gpiod_get_optional(&i2c->dev, "hp-pol",
2353 if (IS_ERR(wm5100->hp_pol)) {
2354 ret = PTR_ERR(wm5100->hp_pol);
2400 struct wm5100_priv *wm5100;
2404 wm5100 = devm_kzalloc(&i2c->dev, sizeof(struct wm5100_priv),
2406 if (wm5100 == NULL)
2409 wm5100->dev = &i2c->dev;
2411 wm5100->regmap = devm_regmap_init_i2c(i2c, &wm5100_regmap);
2412 if (IS_ERR(wm5100->regmap)) {
2413 ret = PTR_ERR(wm5100->regmap);
2419 for (i = 0; i < ARRAY_SIZE(wm5100->fll); i++)
2420 init_completion(&wm5100->fll[i].lock);
2423 wm5100->pdata = *pdata;
2425 i2c_set_clientdata(i2c, wm5100);
2427 for (i = 0; i < ARRAY_SIZE(wm5100->core_supplies); i++)
2428 wm5100->core_supplies[i].supply = wm5100_core_supply_names[i];
2431 ARRAY_SIZE(wm5100->core_supplies),
2432 wm5100->core_supplies);
2439 ret = regulator_bulk_enable(ARRAY_SIZE(wm5100->core_supplies),
2440 wm5100->core_supplies);
2447 wm5100->ldo_ena = devm_gpiod_get_optional(&i2c->dev, "wlf,ldo1ena",
2449 if (IS_ERR(wm5100->ldo_ena)) {
2450 ret = PTR_ERR(wm5100->ldo_ena);
2454 if (wm5100->ldo_ena) {
2455 gpiod_set_consumer_name(wm5100->ldo_ena, "WM5100 LDOENA");
2459 wm5100->reset = devm_gpiod_get_optional(&i2c->dev, "reset",
2461 if (IS_ERR(wm5100->reset)) {
2462 ret = PTR_ERR(wm5100->reset);
2466 gpiod_set_consumer_name(wm5100->reset, "WM5100 /RESET");
2468 ret = regmap_read(wm5100->regmap, WM5100_SOFTWARE_RESET, &reg);
2484 ret = regmap_read(wm5100->regmap, WM5100_DEVICE_REVISION, &reg);
2489 wm5100->rev = reg & WM5100_DEVICE_REVISION_MASK;
2491 dev_info(&i2c->dev, "revision %c\n", wm5100->rev + 'A');
2493 ret = wm5100_reset(wm5100);
2499 switch (wm5100->rev) {
2501 ret = regmap_register_patch(wm5100->regmap,
2517 for (i = 0; i < ARRAY_SIZE(wm5100->pdata.gpio_defaults); i++) {
2518 if (!wm5100->pdata.gpio_defaults[i])
2521 regmap_write(wm5100->regmap, WM5100_GPIO_CTRL_1 + i,
2522 wm5100->pdata.gpio_defaults[i]);
2525 for (i = 0; i < ARRAY_SIZE(wm5100->pdata.in_mode); i++) {
2526 regmap_update_bits(wm5100->regmap, wm5100_mic_ctrl_reg[i],
2529 (wm5100->pdata.in_mode[i] <<
2531 (wm5100->pdata.dmic_sup[i] <<
2536 if (wm5100->pdata.irq_flags)
2537 irq_flags = wm5100->pdata.irq_flags;
2546 "wm5100", wm5100);
2549 irq_flags, "wm5100",
2550 wm5100);
2557 regmap_update_bits(wm5100->regmap,
2568 regmap_update_bits(wm5100->regmap,
2604 free_irq(i2c->irq, wm5100);
2606 gpiod_set_value_cansleep(wm5100->reset, 1);
2608 gpiod_set_value_cansleep(wm5100->ldo_ena, 0);
2610 regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies),
2611 wm5100->core_supplies);
2618 struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2622 free_irq(i2c->irq, wm5100);
2624 gpiod_set_value_cansleep(wm5100->reset, 1);
2625 gpiod_set_value_cansleep(wm5100->ldo_ena, 0);
2631 struct wm5100_priv *wm5100 = dev_get_drvdata(dev);
2633 regcache_cache_only(wm5100->regmap, true);
2634 regcache_mark_dirty(wm5100->regmap);
2635 gpiod_set_value_cansleep(wm5100->ldo_ena, 0);
2636 regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies),
2637 wm5100->core_supplies);
2644 struct wm5100_priv *wm5100 = dev_get_drvdata(dev);
2647 ret = regulator_bulk_enable(ARRAY_SIZE(wm5100->core_supplies),
2648 wm5100->core_supplies);
2655 if (wm5100->ldo_ena) {
2656 gpiod_set_value_cansleep(wm5100->ldo_ena, 1);
2660 regcache_cache_only(wm5100->regmap, false);
2661 regcache_sync(wm5100->regmap);
2673 { "wm5100" },
2680 .name = "wm5100",