Lines Matching defs:wm5100
3 * wm5100.c -- WM5100 ALSA SoC Audio driver
31 #include <sound/wm5100.h>
33 #include "wm5100.h"
120 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
132 if ((wm5100->sysclk % rate) == 0) {
136 if (!wm5100->sr_ref[i] && sr_free == -1) {
146 wm5100->sr_ref[i]++;
148 rate, i, wm5100->sr_ref[i]);
159 wm5100->sr_ref[sr_free]++;
169 rate, wm5100->sysclk, wm5100->asyncclk);
176 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
189 if (!wm5100->sr_ref[i])
197 wm5100->sr_ref[i]--;
199 rate, wm5100->sr_ref[i]);
206 static int wm5100_reset(struct wm5100_priv *wm5100)
208 if (wm5100->pdata.reset) {
209 gpio_set_value_cansleep(wm5100->pdata.reset, 0);
210 gpio_set_value_cansleep(wm5100->pdata.reset, 1);
214 return regmap_write(wm5100->regmap, WM5100_SOFTWARE_RESET, 0);
736 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
740 if (wm5100->out_ena[0]) {
745 wm5100->out_ena[0] = false;
755 if (wm5100->out_ena[1]) {
760 wm5100->out_ena[1] = false;
776 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
780 wm5100->out_ena[0] = true;
783 wm5100->out_ena[0] = true;
792 static void wm5100_log_status3(struct wm5100_priv *wm5100, int val)
795 dev_crit(wm5100->dev, "Speaker shutdown warning\n");
797 dev_crit(wm5100->dev, "Speaker shutdown\n");
799 dev_crit(wm5100->dev, "SYSCLK underclocked\n");
801 dev_crit(wm5100->dev, "ASYNCCLK underclocked\n");
804 static void wm5100_log_status4(struct wm5100_priv *wm5100, int val)
807 dev_err(wm5100->dev, "AIF3 configuration error\n");
809 dev_err(wm5100->dev, "AIF2 configuration error\n");
811 dev_err(wm5100->dev, "AIF1 configuration error\n");
813 dev_err(wm5100->dev, "Control interface error\n");
815 dev_err(wm5100->dev, "ISRC2 underclocked\n");
817 dev_err(wm5100->dev, "ISRC1 underclocked\n");
819 dev_err(wm5100->dev, "FX underclocked\n");
821 dev_err(wm5100->dev, "AIF3 underclocked\n");
823 dev_err(wm5100->dev, "AIF2 underclocked\n");
825 dev_err(wm5100->dev, "AIF1 underclocked\n");
827 dev_err(wm5100->dev, "ASRC underclocked\n");
829 dev_err(wm5100->dev, "DAC underclocked\n");
831 dev_err(wm5100->dev, "ADC underclocked\n");
833 dev_err(wm5100->dev, "Mixer underclocked\n");
841 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
848 wm5100_log_status3(wm5100, ret);
851 wm5100_log_status4(wm5100, ret);
1400 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
1401 bool async = wm5100->aif_async[dai->id];
1425 aif_rate = wm5100->sysclk;
1431 aif_rate = wm5100->asyncclk;
1479 wm5100->aif_symmetric[dai->id])
1509 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
1516 rate_store = &wm5100->sysclk;
1520 rate_store = &wm5100->asyncclk;
1543 wm5100->aif_async[clk_id - 1] = false;
1546 wm5100->aif_async[clk_id - 1] = true;
1758 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
1766 fll = &wm5100->fll[0];
1771 fll = &wm5100->fll[1];
1886 .name = "wm5100-aif1",
1905 .name = "wm5100-aif2",
1925 .name = "wm5100-aif3",
1970 static void wm5100_set_detect_mode(struct wm5100_priv *wm5100, int the_mode)
1972 struct wm5100_jack_mode *mode = &wm5100->pdata.jack_modes[the_mode];
1974 if (WARN_ON(the_mode >= ARRAY_SIZE(wm5100->pdata.jack_modes)))
1977 gpio_set_value_cansleep(wm5100->pdata.hp_pol, mode->hp_pol);
1978 regmap_update_bits(wm5100->regmap, WM5100_ACCESSORY_DETECT_MODE_1,
1983 regmap_update_bits(wm5100->regmap, WM5100_MISC_CONTROL,
1987 wm5100->jack_mode = the_mode;
1989 dev_dbg(wm5100->dev, "Set microphone polarity to %d\n",
1990 wm5100->jack_mode);
1993 static void wm5100_report_headphone(struct wm5100_priv *wm5100)
1995 dev_dbg(wm5100->dev, "Headphone detected\n");
1996 wm5100->jack_detecting = false;
1997 snd_soc_jack_report(wm5100->jack, SND_JACK_HEADPHONE,
2001 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2006 static void wm5100_micd_irq(struct wm5100_priv *wm5100)
2011 ret = regmap_read(wm5100->regmap, WM5100_MIC_DETECT_3, &val);
2013 dev_err(wm5100->dev, "Failed to read microphone status: %d\n",
2018 dev_dbg(wm5100->dev, "Microphone event: %x\n", val);
2021 dev_warn(wm5100->dev, "Microphone detection state invalid\n");
2027 dev_dbg(wm5100->dev, "Jack removal detected\n");
2028 wm5100->jack_mic = false;
2029 wm5100->jack_detecting = true;
2030 wm5100->jack_flips = 0;
2031 snd_soc_jack_report(wm5100->jack, 0,
2035 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2046 if (wm5100->jack_detecting) {
2047 dev_dbg(wm5100->dev, "Microphone detected\n");
2048 wm5100->jack_mic = true;
2049 wm5100->jack_detecting = false;
2050 snd_soc_jack_report(wm5100->jack,
2056 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2060 dev_dbg(wm5100->dev, "Mic button up\n");
2061 snd_soc_jack_report(wm5100->jack, 0, SND_JACK_BTN_0);
2073 if (wm5100->jack_detecting && (val & 0x3f8)) {
2074 wm5100->jack_flips++;
2076 if (wm5100->jack_flips > 1)
2077 wm5100_report_headphone(wm5100);
2079 wm5100_set_detect_mode(wm5100, !wm5100->jack_mode);
2088 if (wm5100->jack_mic) {
2089 dev_dbg(wm5100->dev, "Mic button detected\n");
2090 snd_soc_jack_report(wm5100->jack, SND_JACK_BTN_0,
2092 } else if (wm5100->jack_detecting) {
2093 wm5100_report_headphone(wm5100);
2100 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
2104 wm5100->jack = jack;
2105 wm5100->jack_detecting = true;
2106 wm5100->jack_flips = 0;
2108 wm5100_set_detect_mode(wm5100, 0);
2144 wm5100->jack = NULL;
2153 struct wm5100_priv *wm5100 = data;
2158 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_3, &irq_val);
2160 dev_err(wm5100->dev, "Failed to read IRQ status 3: %d\n",
2165 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_3_MASK,
2168 dev_err(wm5100->dev, "Failed to read IRQ mask 3: %d\n",
2175 regmap_write(wm5100->regmap, WM5100_INTERRUPT_STATUS_3, irq_val);
2180 wm5100_log_status3(wm5100, irq_val);
2183 dev_dbg(wm5100->dev, "FLL1 locked\n");
2184 complete(&wm5100->fll[0].lock);
2187 dev_dbg(wm5100->dev, "FLL2 locked\n");
2188 complete(&wm5100->fll[1].lock);
2192 wm5100_micd_irq(wm5100);
2194 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_4, &irq_val);
2196 dev_err(wm5100->dev, "Failed to read IRQ status 4: %d\n",
2201 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_4_MASK,
2204 dev_err(wm5100->dev, "Failed to read IRQ mask 4: %d\n",
2214 regmap_write(wm5100->regmap, WM5100_INTERRUPT_STATUS_4, irq_val);
2216 wm5100_log_status4(wm5100, irq_val);
2238 struct wm5100_priv *wm5100 = gpiochip_get_data(chip);
2240 regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2247 struct wm5100_priv *wm5100 = gpiochip_get_data(chip);
2252 ret = regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2263 struct wm5100_priv *wm5100 = gpiochip_get_data(chip);
2267 ret = regmap_read(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset, ®);
2276 struct wm5100_priv *wm5100 = gpiochip_get_data(chip);
2278 return regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2285 .label = "wm5100",
2296 struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2299 wm5100->gpio_chip = wm5100_template_chip;
2300 wm5100->gpio_chip.ngpio = 6;
2301 wm5100->gpio_chip.parent = &i2c->dev;
2303 if (wm5100->pdata.gpio_base)
2304 wm5100->gpio_chip.base = wm5100->pdata.gpio_base;
2306 wm5100->gpio_chip.base = -1;
2308 ret = gpiochip_add_data(&wm5100->gpio_chip, wm5100);
2315 struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2317 gpiochip_remove(&wm5100->gpio_chip);
2333 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
2336 wm5100->component = component;
2352 if (wm5100->pdata.hp_pol) {
2353 ret = gpio_request_one(wm5100->pdata.hp_pol,
2357 wm5100->pdata.hp_pol, ret);
2371 struct wm5100_priv *wm5100 = snd_soc_component_get_drvdata(component);
2373 if (wm5100->pdata.hp_pol) {
2374 gpio_free(wm5100->pdata.hp_pol);
2418 struct wm5100_priv *wm5100;
2422 wm5100 = devm_kzalloc(&i2c->dev, sizeof(struct wm5100_priv),
2424 if (wm5100 == NULL)
2427 wm5100->dev = &i2c->dev;
2429 wm5100->regmap = devm_regmap_init_i2c(i2c, &wm5100_regmap);
2430 if (IS_ERR(wm5100->regmap)) {
2431 ret = PTR_ERR(wm5100->regmap);
2437 for (i = 0; i < ARRAY_SIZE(wm5100->fll); i++)
2438 init_completion(&wm5100->fll[i].lock);
2441 wm5100->pdata = *pdata;
2443 i2c_set_clientdata(i2c, wm5100);
2445 for (i = 0; i < ARRAY_SIZE(wm5100->core_supplies); i++)
2446 wm5100->core_supplies[i].supply = wm5100_core_supply_names[i];
2449 ARRAY_SIZE(wm5100->core_supplies),
2450 wm5100->core_supplies);
2457 ret = regulator_bulk_enable(ARRAY_SIZE(wm5100->core_supplies),
2458 wm5100->core_supplies);
2465 if (wm5100->pdata.ldo_ena) {
2466 ret = gpio_request_one(wm5100->pdata.ldo_ena,
2470 wm5100->pdata.ldo_ena, ret);
2476 if (wm5100->pdata.reset) {
2477 ret = gpio_request_one(wm5100->pdata.reset,
2481 wm5100->pdata.reset, ret);
2486 ret = regmap_read(wm5100->regmap, WM5100_SOFTWARE_RESET, ®);
2502 ret = regmap_read(wm5100->regmap, WM5100_DEVICE_REVISION, ®);
2507 wm5100->rev = reg & WM5100_DEVICE_REVISION_MASK;
2509 dev_info(&i2c->dev, "revision %c\n", wm5100->rev + 'A');
2511 ret = wm5100_reset(wm5100);
2517 switch (wm5100->rev) {
2519 ret = regmap_register_patch(wm5100->regmap,
2535 for (i = 0; i < ARRAY_SIZE(wm5100->pdata.gpio_defaults); i++) {
2536 if (!wm5100->pdata.gpio_defaults[i])
2539 regmap_write(wm5100->regmap, WM5100_GPIO_CTRL_1 + i,
2540 wm5100->pdata.gpio_defaults[i]);
2543 for (i = 0; i < ARRAY_SIZE(wm5100->pdata.in_mode); i++) {
2544 regmap_update_bits(wm5100->regmap, wm5100_mic_ctrl_reg[i],
2547 (wm5100->pdata.in_mode[i] <<
2549 (wm5100->pdata.dmic_sup[i] <<
2554 if (wm5100->pdata.irq_flags)
2555 irq_flags = wm5100->pdata.irq_flags;
2564 "wm5100", wm5100);
2567 irq_flags, "wm5100",
2568 wm5100);
2575 regmap_update_bits(wm5100->regmap,
2586 regmap_update_bits(wm5100->regmap,
2622 free_irq(i2c->irq, wm5100);
2624 if (wm5100->pdata.reset) {
2625 gpio_set_value_cansleep(wm5100->pdata.reset, 0);
2626 gpio_free(wm5100->pdata.reset);
2629 if (wm5100->pdata.ldo_ena) {
2630 gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0);
2631 gpio_free(wm5100->pdata.ldo_ena);
2634 regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies),
2635 wm5100->core_supplies);
2642 struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2646 free_irq(i2c->irq, wm5100);
2648 if (wm5100->pdata.reset) {
2649 gpio_set_value_cansleep(wm5100->pdata.reset, 0);
2650 gpio_free(wm5100->pdata.reset);
2652 if (wm5100->pdata.ldo_ena) {
2653 gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0);
2654 gpio_free(wm5100->pdata.ldo_ena);
2663 struct wm5100_priv *wm5100 = dev_get_drvdata(dev);
2665 regcache_cache_only(wm5100->regmap, true);
2666 regcache_mark_dirty(wm5100->regmap);
2667 if (wm5100->pdata.ldo_ena)
2668 gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0);
2669 regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies),
2670 wm5100->core_supplies);
2677 struct wm5100_priv *wm5100 = dev_get_drvdata(dev);
2680 ret = regulator_bulk_enable(ARRAY_SIZE(wm5100->core_supplies),
2681 wm5100->core_supplies);
2688 if (wm5100->pdata.ldo_ena) {
2689 gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 1);
2693 regcache_cache_only(wm5100->regmap, false);
2694 regcache_sync(wm5100->regmap);
2706 { "wm5100", 0 },
2713 .name = "wm5100",