Lines Matching +full:12 +full:bit +full:- +full:clkdiv +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Author: Lars-Peter Clausen <lars@metafoo.de>
94 #define ADAU1701_SERICTL_INV_BCLK BIT(3)
95 #define ADAU1701_SERICTL_INV_LRCLK BIT(4)
100 #define ADAU1707_CLKDIV_UNSET (-1U)
116 u8 pin_config[12];
192 size = adau1701_register_size(&client->dev, reg); in adau1701_reg_write()
194 return -EINVAL; in adau1701_reg_write()
199 for (i = size + 1; i >= 2; --i) { in adau1701_reg_write()
210 return -EIO; in adau1701_reg_write()
223 size = adau1701_register_size(&client->dev, reg); in adau1701_reg_read()
225 return -EINVAL; in adau1701_reg_read()
230 msgs[0].addr = client->addr; in adau1701_reg_read()
235 msgs[1].addr = client->addr; in adau1701_reg_read()
240 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in adau1701_reg_read()
244 return -EIO; in adau1701_reg_read()
259 struct i2c_client *client = to_i2c_client(sigmadsp->dev); in adau1701_safeload()
266 ret = regmap_read(adau1701->regmap, ADAU1701_DSPCTRL, &val); in adau1701_safeload()
281 return -EIO; in adau1701_safeload()
289 return -EIO; in adau1701_safeload()
292 return regmap_update_bits(adau1701->regmap, ADAU1701_DSPCTRL, in adau1701_safeload()
300 static int adau1701_reset(struct snd_soc_component *component, unsigned int clkdiv, in adau1701_reset() argument
306 sigmadsp_reset(adau1701->sigmadsp); in adau1701_reset()
308 if (clkdiv != ADAU1707_CLKDIV_UNSET && in adau1701_reset()
309 gpio_is_valid(adau1701->gpio_pll_mode[0]) && in adau1701_reset()
310 gpio_is_valid(adau1701->gpio_pll_mode[1])) { in adau1701_reset()
311 switch (clkdiv) { in adau1701_reset()
313 gpio_set_value_cansleep(adau1701->gpio_pll_mode[0], 0); in adau1701_reset()
314 gpio_set_value_cansleep(adau1701->gpio_pll_mode[1], 0); in adau1701_reset()
317 gpio_set_value_cansleep(adau1701->gpio_pll_mode[0], 0); in adau1701_reset()
318 gpio_set_value_cansleep(adau1701->gpio_pll_mode[1], 1); in adau1701_reset()
321 gpio_set_value_cansleep(adau1701->gpio_pll_mode[0], 1); in adau1701_reset()
322 gpio_set_value_cansleep(adau1701->gpio_pll_mode[1], 0); in adau1701_reset()
326 gpio_set_value_cansleep(adau1701->gpio_pll_mode[0], 1); in adau1701_reset()
327 gpio_set_value_cansleep(adau1701->gpio_pll_mode[1], 1); in adau1701_reset()
332 adau1701->pll_clkdiv = clkdiv; in adau1701_reset()
334 if (gpio_is_valid(adau1701->gpio_nreset)) { in adau1701_reset()
335 gpio_set_value_cansleep(adau1701->gpio_nreset, 0); in adau1701_reset()
338 gpio_set_value_cansleep(adau1701->gpio_nreset, 1); in adau1701_reset()
339 /* power-up time may be as long as 85ms */ in adau1701_reset()
347 if (clkdiv != ADAU1707_CLKDIV_UNSET) { in adau1701_reset()
348 ret = sigmadsp_setup(adau1701->sigmadsp, rate); in adau1701_reset()
350 dev_warn(component->dev, "Failed to load firmware\n"); in adau1701_reset()
355 regmap_write(adau1701->regmap, ADAU1701_DACSET, ADAU1701_DACSET_DACINIT); in adau1701_reset()
356 regmap_write(adau1701->regmap, ADAU1701_DSPCTRL, ADAU1701_DSPCTRL_CR); in adau1701_reset()
358 regcache_mark_dirty(adau1701->regmap); in adau1701_reset()
359 regcache_sync(adau1701->regmap); in adau1701_reset()
382 return -EINVAL; in adau1701_set_capture_pcm_format()
385 if (adau1701->dai_fmt == SND_SOC_DAIFMT_RIGHT_J) { in adau1701_set_capture_pcm_format()
400 regmap_update_bits(adau1701->regmap, ADAU1701_SEROCTL, mask, val); in adau1701_set_capture_pcm_format()
411 if (adau1701->dai_fmt != SND_SOC_DAIFMT_RIGHT_J) in adau1701_set_playback_pcm_format()
425 return -EINVAL; in adau1701_set_playback_pcm_format()
428 regmap_update_bits(adau1701->regmap, ADAU1701_SERICTL, in adau1701_set_playback_pcm_format()
437 struct snd_soc_component *component = dai->component; in adau1701_hw_params()
439 unsigned int clkdiv = adau1701->sysclk / params_rate(params); in adau1701_hw_params() local
445 * mode GPIO settings, and a full reset cycle, including a new in adau1701_hw_params()
448 if (clkdiv != adau1701->pll_clkdiv) { in adau1701_hw_params()
449 ret = adau1701_reset(component, clkdiv, params_rate(params)); in adau1701_hw_params()
465 return -EINVAL; in adau1701_hw_params()
468 regmap_update_bits(adau1701->regmap, ADAU1701_DSPCTRL, in adau1701_hw_params()
471 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in adau1701_hw_params()
480 struct snd_soc_component *component = codec_dai->component; in adau1701_set_dai_fmt()
487 /* master, 64-bits per sample, 1 frame per sample */ in adau1701_set_dai_fmt()
494 return -EINVAL; in adau1701_set_dai_fmt()
516 return -EINVAL; in adau1701_set_dai_fmt()
533 return -EINVAL; in adau1701_set_dai_fmt()
541 adau1701->dai_fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK; in adau1701_set_dai_fmt()
543 regmap_write(adau1701->regmap, ADAU1701_SERICTL, serictl); in adau1701_set_dai_fmt()
544 regmap_update_bits(adau1701->regmap, ADAU1701_SEROCTL, in adau1701_set_dai_fmt()
563 regmap_update_bits(adau1701->regmap, in adau1701_set_bias_level()
568 regmap_update_bits(adau1701->regmap, in adau1701_set_bias_level()
578 struct snd_soc_component *component = dai->component; in adau1701_mute_stream()
588 regmap_update_bits(adau1701->regmap, ADAU1701_DSPCTRL, mask, val); in adau1701_mute_stream()
607 return -EINVAL; in adau1701_set_sysclk()
610 regmap_update_bits(adau1701->regmap, ADAU1701_OSCIPOW, in adau1701_set_sysclk()
612 adau1701->sysclk = freq; in adau1701_set_sysclk()
620 struct adau1701 *adau1701 = snd_soc_component_get_drvdata(dai->component); in adau1701_startup()
622 return sigmadsp_restrict_params(adau1701->sigmadsp, substream); in adau1701_startup()
673 ret = sigmadsp_attach(adau1701->sigmadsp, component); in adau1701_probe()
677 ret = regulator_bulk_enable(ARRAY_SIZE(adau1701->supplies), in adau1701_probe()
678 adau1701->supplies); in adau1701_probe()
680 dev_err(component->dev, "Failed to enable regulators: %d\n", ret); in adau1701_probe()
688 * mode parameters. in adau1701_probe()
690 adau1701->pll_clkdiv = ADAU1707_CLKDIV_UNSET; in adau1701_probe()
692 /* initalize with pre-configured pll mode settings */ in adau1701_probe()
693 ret = adau1701_reset(component, adau1701->pll_clkdiv, 0); in adau1701_probe()
700 val |= adau1701->pin_config[i] << (i * 4); in adau1701_probe()
702 regmap_write(adau1701->regmap, ADAU1701_PINCONF_0, val); in adau1701_probe()
706 val |= adau1701->pin_config[i + 6] << (i * 4); in adau1701_probe()
708 regmap_write(adau1701->regmap, ADAU1701_PINCONF_1, val); in adau1701_probe()
714 regulator_bulk_disable(ARRAY_SIZE(adau1701->supplies), adau1701->supplies); in adau1701_probe()
722 if (gpio_is_valid(adau1701->gpio_nreset)) in adau1701_remove()
723 gpio_set_value_cansleep(adau1701->gpio_nreset, 0); in adau1701_remove()
725 regulator_bulk_disable(ARRAY_SIZE(adau1701->supplies), adau1701->supplies); in adau1701_remove()
733 regulator_bulk_disable(ARRAY_SIZE(adau1701->supplies), in adau1701_suspend()
734 adau1701->supplies); in adau1701_suspend()
744 ret = regulator_bulk_enable(ARRAY_SIZE(adau1701->supplies), in adau1701_resume()
745 adau1701->supplies); in adau1701_resume()
747 dev_err(component->dev, "Failed to enable regulators: %d\n", ret); in adau1701_resume()
751 return adau1701_reset(component, adau1701->pll_clkdiv, 0); in adau1701_resume()
790 struct device *dev = &client->dev; in adau1701_i2c_probe()
791 int gpio_nreset = -EINVAL; in adau1701_i2c_probe()
792 int gpio_pll_mode[2] = { -EINVAL, -EINVAL }; in adau1701_i2c_probe()
797 return -ENOMEM; in adau1701_i2c_probe()
800 adau1701->supplies[i].supply = supply_names[i]; in adau1701_i2c_probe()
802 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(adau1701->supplies), in adau1701_i2c_probe()
803 adau1701->supplies); in adau1701_i2c_probe()
809 ret = regulator_bulk_enable(ARRAY_SIZE(adau1701->supplies), in adau1701_i2c_probe()
810 adau1701->supplies); in adau1701_i2c_probe()
816 adau1701->client = client; in adau1701_i2c_probe()
817 adau1701->regmap = devm_regmap_init(dev, NULL, client, in adau1701_i2c_probe()
819 if (IS_ERR(adau1701->regmap)) { in adau1701_i2c_probe()
820 ret = PTR_ERR(adau1701->regmap); in adau1701_i2c_probe()
825 if (dev->of_node) { in adau1701_i2c_probe()
826 gpio_nreset = of_get_named_gpio(dev->of_node, "reset-gpio", 0); in adau1701_i2c_probe()
827 if (gpio_nreset < 0 && gpio_nreset != -ENOENT) { in adau1701_i2c_probe()
832 gpio_pll_mode[0] = of_get_named_gpio(dev->of_node, in adau1701_i2c_probe()
833 "adi,pll-mode-gpios", 0); in adau1701_i2c_probe()
834 if (gpio_pll_mode[0] < 0 && gpio_pll_mode[0] != -ENOENT) { in adau1701_i2c_probe()
839 gpio_pll_mode[1] = of_get_named_gpio(dev->of_node, in adau1701_i2c_probe()
840 "adi,pll-mode-gpios", 1); in adau1701_i2c_probe()
841 if (gpio_pll_mode[1] < 0 && gpio_pll_mode[1] != -ENOENT) { in adau1701_i2c_probe()
846 of_property_read_u32(dev->of_node, "adi,pll-clkdiv", in adau1701_i2c_probe()
847 &adau1701->pll_clkdiv); in adau1701_i2c_probe()
849 of_property_read_u8_array(dev->of_node, "adi,pin-config", in adau1701_i2c_probe()
850 adau1701->pin_config, in adau1701_i2c_probe()
851 ARRAY_SIZE(adau1701->pin_config)); in adau1701_i2c_probe()
865 "ADAU1701 PLL mode 0"); in adau1701_i2c_probe()
871 "ADAU1701 PLL mode 1"); in adau1701_i2c_probe()
876 adau1701->gpio_nreset = gpio_nreset; in adau1701_i2c_probe()
877 adau1701->gpio_pll_mode[0] = gpio_pll_mode[0]; in adau1701_i2c_probe()
878 adau1701->gpio_pll_mode[1] = gpio_pll_mode[1]; in adau1701_i2c_probe()
882 adau1701->sigmadsp = devm_sigmadsp_init_i2c(client, in adau1701_i2c_probe()
884 if (IS_ERR(adau1701->sigmadsp)) { in adau1701_i2c_probe()
885 ret = PTR_ERR(adau1701->sigmadsp); in adau1701_i2c_probe()
889 ret = devm_snd_soc_register_component(&client->dev, in adau1701_i2c_probe()
895 regulator_bulk_disable(ARRAY_SIZE(adau1701->supplies), adau1701->supplies); in adau1701_i2c_probe()
921 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");