Lines Matching full:pcm3168a
3 * PCM3168A codec driver
22 #include "pcm3168a.h"
278 static int pcm3168a_reset(struct pcm3168a_priv *pcm3168a) in pcm3168a_reset() argument
282 ret = regmap_write(pcm3168a->regmap, PCM3168A_RST_SMODE, 0); in pcm3168a_reset()
287 msleep(DIV_ROUND_UP(3846 * 1000, pcm3168a->sysclk)); in pcm3168a_reset()
289 return regmap_write(pcm3168a->regmap, PCM3168A_RST_SMODE, in pcm3168a_reset()
296 struct pcm3168a_priv *pcm3168a = snd_soc_component_get_drvdata(component); in pcm3168a_mute() local
298 regmap_write(pcm3168a->regmap, PCM3168A_DAC_MUTE, mute ? 0xff : 0); in pcm3168a_mute()
306 struct pcm3168a_priv *pcm3168a = snd_soc_component_get_drvdata(dai->component); in pcm3168a_set_dai_sysclk() local
319 ret = clk_set_rate(pcm3168a->scki, freq); in pcm3168a_set_dai_sysclk()
323 pcm3168a->sysclk = freq; in pcm3168a_set_dai_sysclk()
331 struct pcm3168a_priv *pcm3168a = snd_soc_component_get_drvdata(component); in pcm3168a_update_fixup_pcm_stream() local
335 if (pcm3168a->io_params[dai->id].fmt == PCM3168A_FMT_RIGHT_J) { in pcm3168a_update_fixup_pcm_stream()
343 if (pcm3168a->io_params[dai->id].tdm_slots != 2) in pcm3168a_update_fixup_pcm_stream()
359 struct pcm3168a_priv *pcm3168a = snd_soc_component_get_drvdata(component); in pcm3168a_set_dai_fmt() local
413 pcm3168a->io_params[dai->id].master_mode = master_mode; in pcm3168a_set_dai_fmt()
414 pcm3168a->io_params[dai->id].fmt = fmt; in pcm3168a_set_dai_fmt()
416 regmap_update_bits(pcm3168a->regmap, reg, mask, fmt << shift); in pcm3168a_set_dai_fmt()
428 struct pcm3168a_priv *pcm3168a = snd_soc_component_get_drvdata(component); in pcm3168a_set_tdm_slot() local
429 struct pcm3168a_io_params *io_params = &pcm3168a->io_params[dai->id]; in pcm3168a_set_tdm_slot()
463 struct pcm3168a_priv *pcm3168a = snd_soc_component_get_drvdata(component); in pcm3168a_hw_params() local
464 struct pcm3168a_io_params *io_params = &pcm3168a->io_params[dai->id]; in pcm3168a_hw_params()
473 ratio = pcm3168a->sysclk / rate; in pcm3168a_hw_params()
534 * If pcm3168a->tdm_slots is not set or set to more than 2 (8/6 usually) in pcm3168a_hw_params()
536 * If pcm3168a->tdm_slots is set to 2 then DIN1/2/3/4 and DOUT1/2/3 is in pcm3168a_hw_params()
561 regmap_update_bits(pcm3168a->regmap, reg, mask, val); in pcm3168a_hw_params()
571 regmap_update_bits(pcm3168a->regmap, reg, mask, fmt << shift); in pcm3168a_hw_params()
587 .name = "pcm3168a-dac",
599 .name = "pcm3168a-adc",
708 struct pcm3168a_priv *pcm3168a; in pcm3168a_probe() local
711 pcm3168a = devm_kzalloc(dev, sizeof(*pcm3168a), GFP_KERNEL); in pcm3168a_probe()
712 if (pcm3168a == NULL) in pcm3168a_probe()
715 dev_set_drvdata(dev, pcm3168a); in pcm3168a_probe()
719 * as the same reset line might be connected to multiple pcm3168a codec in pcm3168a_probe()
725 pcm3168a->gpio_rst = devm_gpiod_get_optional(dev, "reset", in pcm3168a_probe()
728 if (IS_ERR(pcm3168a->gpio_rst)) { in pcm3168a_probe()
729 ret = PTR_ERR(pcm3168a->gpio_rst); in pcm3168a_probe()
736 pcm3168a->scki = devm_clk_get(dev, "scki"); in pcm3168a_probe()
737 if (IS_ERR(pcm3168a->scki)) { in pcm3168a_probe()
738 ret = PTR_ERR(pcm3168a->scki); in pcm3168a_probe()
744 ret = clk_prepare_enable(pcm3168a->scki); in pcm3168a_probe()
750 pcm3168a->sysclk = clk_get_rate(pcm3168a->scki); in pcm3168a_probe()
752 for (i = 0; i < ARRAY_SIZE(pcm3168a->supplies); i++) in pcm3168a_probe()
753 pcm3168a->supplies[i].supply = pcm3168a_supply_names[i]; in pcm3168a_probe()
756 ARRAY_SIZE(pcm3168a->supplies), pcm3168a->supplies); in pcm3168a_probe()
763 ret = regulator_bulk_enable(ARRAY_SIZE(pcm3168a->supplies), in pcm3168a_probe()
764 pcm3168a->supplies); in pcm3168a_probe()
770 pcm3168a->regmap = regmap; in pcm3168a_probe()
771 if (IS_ERR(pcm3168a->regmap)) { in pcm3168a_probe()
772 ret = PTR_ERR(pcm3168a->regmap); in pcm3168a_probe()
777 if (pcm3168a->gpio_rst) { in pcm3168a_probe()
782 msleep(DIV_ROUND_UP(3846 * 1000, pcm3168a->sysclk)); in pcm3168a_probe()
784 ret = pcm3168a_reset(pcm3168a); in pcm3168a_probe()
795 memcpy(pcm3168a->dai_drv, pcm3168a_dais, sizeof(pcm3168a->dai_drv)); in pcm3168a_probe()
797 pcm3168a->dai_drv, in pcm3168a_probe()
798 ARRAY_SIZE(pcm3168a->dai_drv)); in pcm3168a_probe()
807 regulator_bulk_disable(ARRAY_SIZE(pcm3168a->supplies), in pcm3168a_probe()
808 pcm3168a->supplies); in pcm3168a_probe()
810 clk_disable_unprepare(pcm3168a->scki); in pcm3168a_probe()
818 struct pcm3168a_priv *pcm3168a = dev_get_drvdata(dev); in pcm3168a_disable() local
820 regulator_bulk_disable(ARRAY_SIZE(pcm3168a->supplies), in pcm3168a_disable()
821 pcm3168a->supplies); in pcm3168a_disable()
822 clk_disable_unprepare(pcm3168a->scki); in pcm3168a_disable()
827 struct pcm3168a_priv *pcm3168a = dev_get_drvdata(dev); in pcm3168a_remove() local
835 gpiod_set_value_cansleep(pcm3168a->gpio_rst, 1); in pcm3168a_remove()
846 struct pcm3168a_priv *pcm3168a = dev_get_drvdata(dev); in pcm3168a_rt_resume() local
849 ret = clk_prepare_enable(pcm3168a->scki); in pcm3168a_rt_resume()
855 ret = regulator_bulk_enable(ARRAY_SIZE(pcm3168a->supplies), in pcm3168a_rt_resume()
856 pcm3168a->supplies); in pcm3168a_rt_resume()
862 ret = pcm3168a_reset(pcm3168a); in pcm3168a_rt_resume()
868 regcache_cache_only(pcm3168a->regmap, false); in pcm3168a_rt_resume()
870 regcache_mark_dirty(pcm3168a->regmap); in pcm3168a_rt_resume()
872 ret = regcache_sync(pcm3168a->regmap); in pcm3168a_rt_resume()
881 regulator_bulk_disable(ARRAY_SIZE(pcm3168a->supplies), in pcm3168a_rt_resume()
882 pcm3168a->supplies); in pcm3168a_rt_resume()
884 clk_disable_unprepare(pcm3168a->scki); in pcm3168a_rt_resume()
891 struct pcm3168a_priv *pcm3168a = dev_get_drvdata(dev); in pcm3168a_rt_suspend() local
893 regcache_cache_only(pcm3168a->regmap, true); in pcm3168a_rt_suspend()
906 MODULE_DESCRIPTION("PCM3168A codec driver");