• Home
  • Raw
  • Download

Lines Matching +full:sub +full:- +full:device

1 // SPDX-License-Identifier: GPL-2.0
5 // Copyright (c) 2016-2018 Socionext Inc.
25 struct device *dev = &chip->pdev->dev; in is_valid_pll()
27 if (pll_id < 0 || chip->num_plls <= pll_id) { in is_valid_pll()
32 return chip->plls[pll_id].enable; in is_valid_pll()
36 * find_volume - find volume supported HW port by HW port number
40 * Find AIO device from device list by HW port number. Volume feature is
51 for (i = 0; i < chip->num_aios; i++) { in find_volume()
52 struct uniphier_aio_sub *sub = &chip->aios[i].sub[0]; in find_volume() local
54 if (!sub->swm) in find_volume()
57 if (sub->swm->oport.hw == oport_hw) in find_volume()
58 return sub; in find_volume()
68 spec->swm.dir != PORT_DIR_OUTPUT) { in match_spec()
73 spec->swm.dir != PORT_DIR_INPUT) { in match_spec()
77 if (spec->name && strcmp(spec->name, name) == 0) in match_spec()
80 if (spec->gname && strcmp(spec->gname, name) == 0) in match_spec()
87 * find_spec - find HW specification info by name
88 * @aio: the AIO device pointer
89 * @name: name of device
92 * Find hardware specification information from list by device name. This
96 * in each drivers (see: aio-i2s.c).
105 const struct uniphier_aio_chip_spec *chip_spec = aio->chip->chip_spec; in find_spec()
108 for (i = 0; i < chip_spec->num_specs; i++) { in find_spec()
109 const struct uniphier_aio_spec *spec = &chip_spec->specs[i]; in find_spec()
119 * find_divider - find clock divider by frequency
120 * @aio: the AIO device pointer
135 if (!is_valid_pll(aio->chip, pll_id)) in find_divider()
136 return -EINVAL; in find_divider()
138 pll = &aio->chip->plls[pll_id]; in find_divider()
140 if (pll->freq * mul[i] / div[i] == freq) in find_divider()
143 return -ENOTSUPP; in find_divider()
150 struct device *dev = &aio->chip->pdev->dev; in uniphier_aio_set_sysclk()
156 return -ENOTSUPP; in uniphier_aio_set_sysclk()
191 return -EINVAL; in uniphier_aio_set_sysclk()
195 for (pll_id = 0; pll_id < aio->chip->num_plls; pll_id++) { in uniphier_aio_set_sysclk()
198 aio->plldiv = div_id; in uniphier_aio_set_sysclk()
202 if (pll_id == aio->chip->num_plls) { in uniphier_aio_set_sysclk()
205 return -EINVAL; in uniphier_aio_set_sysclk()
210 aio->pll_out = pll_id; in uniphier_aio_set_sysclk()
212 aio->pll_in = pll_id; in uniphier_aio_set_sysclk()
224 if (!is_valid_pll(aio->chip, pll_id)) in uniphier_aio_set_pll()
225 return -EINVAL; in uniphier_aio_set_pll()
227 ret = aio_chip_set_pll(aio->chip, pll_id, freq_out); in uniphier_aio_set_pll()
237 struct device *dev = &aio->chip->pdev->dev; in uniphier_aio_set_fmt()
243 aio->fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK; in uniphier_aio_set_fmt()
248 return -EINVAL; in uniphier_aio_set_fmt()
258 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aio_startup() local
260 sub->substream = substream; in uniphier_aio_startup()
261 sub->pass_through = 0; in uniphier_aio_startup()
262 sub->use_mmap = true; in uniphier_aio_startup()
264 return aio_init(sub); in uniphier_aio_startup()
271 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aio_shutdown() local
273 sub->substream = NULL; in uniphier_aio_shutdown()
281 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aio_hw_params() local
282 struct device *dev = &aio->chip->pdev->dev; in uniphier_aio_hw_params()
298 return -EINVAL; in uniphier_aio_hw_params()
305 sub->params = *params; in uniphier_aio_hw_params()
306 sub->setting = 1; in uniphier_aio_hw_params()
308 aio_port_reset(sub); in uniphier_aio_hw_params()
309 aio_port_set_volume(sub, sub->vol); in uniphier_aio_hw_params()
310 aio_src_reset(sub); in uniphier_aio_hw_params()
319 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aio_hw_free() local
321 sub->setting = 0; in uniphier_aio_hw_free()
330 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aio_prepare() local
333 ret = aio_port_set_param(sub, sub->pass_through, &sub->params); in uniphier_aio_prepare()
336 ret = aio_src_set_param(sub, &sub->params); in uniphier_aio_prepare()
339 aio_port_set_enable(sub, 1); in uniphier_aio_prepare()
341 ret = aio_if_set_param(sub, sub->pass_through); in uniphier_aio_prepare()
345 if (sub->swm->type == PORT_TYPE_CONV) { in uniphier_aio_prepare()
346 ret = aio_srcif_set_param(sub); in uniphier_aio_prepare()
349 ret = aio_srcch_set_param(sub); in uniphier_aio_prepare()
352 aio_srcch_set_enable(sub, 1); in uniphier_aio_prepare()
363 for (i = 0; i < ARRAY_SIZE(aio->sub); i++) { in uniphier_aio_dai_probe()
364 struct uniphier_aio_sub *sub = &aio->sub[i]; in uniphier_aio_dai_probe() local
367 spec = find_spec(aio, dai->name, i); in uniphier_aio_dai_probe()
371 sub->swm = &spec->swm; in uniphier_aio_dai_probe()
372 sub->spec = spec; in uniphier_aio_dai_probe()
374 sub->vol = AUD_VOL_INIT; in uniphier_aio_dai_probe()
377 aio_iecout_set_enable(aio->chip, true); in uniphier_aio_dai_probe()
378 aio_chip_init(aio->chip); in uniphier_aio_dai_probe()
379 aio->chip->active = 1; in uniphier_aio_dai_probe()
388 aio->chip->active = 0; in uniphier_aio_dai_remove()
532 aio->chip->num_wup_aios--; in uniphier_aio_dai_suspend()
533 if (!aio->chip->num_wup_aios) { in uniphier_aio_dai_suspend()
534 reset_control_assert(aio->chip->rst); in uniphier_aio_dai_suspend()
535 clk_disable_unprepare(aio->chip->clk); in uniphier_aio_dai_suspend()
556 if (!aio->chip->active) in uniphier_aio_dai_resume()
559 if (!aio->chip->num_wup_aios) { in uniphier_aio_dai_resume()
560 ret = clk_prepare_enable(aio->chip->clk); in uniphier_aio_dai_resume()
564 ret = reset_control_deassert(aio->chip->rst); in uniphier_aio_dai_resume()
569 aio_iecout_set_enable(aio->chip, true); in uniphier_aio_dai_resume()
570 aio_chip_init(aio->chip); in uniphier_aio_dai_resume()
572 for (i = 0; i < ARRAY_SIZE(aio->sub); i++) { in uniphier_aio_dai_resume()
573 struct uniphier_aio_sub *sub = &aio->sub[i]; in uniphier_aio_dai_resume() local
575 if (!sub->spec || !sub->substream) in uniphier_aio_dai_resume()
578 ret = aio_init(sub); in uniphier_aio_dai_resume()
582 if (!sub->setting) in uniphier_aio_dai_resume()
585 aio_port_reset(sub); in uniphier_aio_dai_resume()
586 aio_src_reset(sub); in uniphier_aio_dai_resume()
588 aio->chip->num_wup_aios++; in uniphier_aio_dai_resume()
593 if (!aio->chip->num_wup_aios) in uniphier_aio_dai_resume()
594 reset_control_assert(aio->chip->rst); in uniphier_aio_dai_resume()
596 if (!aio->chip->num_wup_aios) in uniphier_aio_dai_resume()
597 clk_disable_unprepare(aio->chip->clk); in uniphier_aio_dai_resume()
615 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in uniphier_aio_vol_info()
616 uinfo->count = 1; in uniphier_aio_vol_info()
617 uinfo->value.integer.min = 0; in uniphier_aio_vol_info()
618 uinfo->value.integer.max = AUD_VOL_MAX; in uniphier_aio_vol_info()
628 struct uniphier_aio_sub *sub; in uniphier_aio_vol_get() local
629 int oport_hw = kcontrol->private_value; in uniphier_aio_vol_get()
631 sub = find_volume(chip, oport_hw); in uniphier_aio_vol_get()
632 if (!sub) in uniphier_aio_vol_get()
635 ucontrol->value.integer.value[0] = sub->vol; in uniphier_aio_vol_get()
645 struct uniphier_aio_sub *sub; in uniphier_aio_vol_put() local
646 int oport_hw = kcontrol->private_value; in uniphier_aio_vol_put()
648 sub = find_volume(chip, oport_hw); in uniphier_aio_vol_put()
649 if (!sub) in uniphier_aio_vol_put()
652 if (sub->vol == ucontrol->value.integer.value[0]) in uniphier_aio_vol_put()
654 sub->vol = ucontrol->value.integer.value[0]; in uniphier_aio_vol_put()
656 aio_port_set_volume(sub, sub->vol); in uniphier_aio_vol_put()
719 .name = "uniphier-aio",
729 struct device *dev = &pdev->dev; in uniphier_aio_probe()
734 return -ENOMEM; in uniphier_aio_probe()
736 chip->chip_spec = of_device_get_match_data(dev); in uniphier_aio_probe()
737 if (!chip->chip_spec) in uniphier_aio_probe()
738 return -EINVAL; in uniphier_aio_probe()
740 chip->regmap_sg = syscon_regmap_lookup_by_phandle(dev->of_node, in uniphier_aio_probe()
742 if (IS_ERR(chip->regmap_sg)) { in uniphier_aio_probe()
743 if (PTR_ERR(chip->regmap_sg) == -EPROBE_DEFER) in uniphier_aio_probe()
744 return -EPROBE_DEFER; in uniphier_aio_probe()
745 chip->regmap_sg = NULL; in uniphier_aio_probe()
748 chip->clk = devm_clk_get(dev, "aio"); in uniphier_aio_probe()
749 if (IS_ERR(chip->clk)) in uniphier_aio_probe()
750 return PTR_ERR(chip->clk); in uniphier_aio_probe()
752 chip->rst = devm_reset_control_get_shared(dev, "aio"); in uniphier_aio_probe()
753 if (IS_ERR(chip->rst)) in uniphier_aio_probe()
754 return PTR_ERR(chip->rst); in uniphier_aio_probe()
756 chip->num_aios = chip->chip_spec->num_dais; in uniphier_aio_probe()
757 chip->num_wup_aios = chip->num_aios; in uniphier_aio_probe()
758 chip->aios = devm_kcalloc(dev, in uniphier_aio_probe()
759 chip->num_aios, sizeof(struct uniphier_aio), in uniphier_aio_probe()
761 if (!chip->aios) in uniphier_aio_probe()
762 return -ENOMEM; in uniphier_aio_probe()
764 chip->num_plls = chip->chip_spec->num_plls; in uniphier_aio_probe()
765 chip->plls = devm_kcalloc(dev, in uniphier_aio_probe()
766 chip->num_plls, in uniphier_aio_probe()
769 if (!chip->plls) in uniphier_aio_probe()
770 return -ENOMEM; in uniphier_aio_probe()
771 memcpy(chip->plls, chip->chip_spec->plls, in uniphier_aio_probe()
772 sizeof(struct uniphier_aio_pll) * chip->num_plls); in uniphier_aio_probe()
774 for (i = 0; i < chip->num_aios; i++) { in uniphier_aio_probe()
775 struct uniphier_aio *aio = &chip->aios[i]; in uniphier_aio_probe()
777 aio->chip = chip; in uniphier_aio_probe()
778 aio->fmt = SND_SOC_DAIFMT_I2S; in uniphier_aio_probe()
780 for (j = 0; j < ARRAY_SIZE(aio->sub); j++) { in uniphier_aio_probe()
781 struct uniphier_aio_sub *sub = &aio->sub[j]; in uniphier_aio_probe() local
783 sub->aio = aio; in uniphier_aio_probe()
784 spin_lock_init(&sub->lock); in uniphier_aio_probe()
788 chip->pdev = pdev; in uniphier_aio_probe()
791 ret = clk_prepare_enable(chip->clk); in uniphier_aio_probe()
795 ret = reset_control_deassert(chip->rst); in uniphier_aio_probe()
800 chip->chip_spec->dais, in uniphier_aio_probe()
801 chip->chip_spec->num_dais); in uniphier_aio_probe()
816 reset_control_assert(chip->rst); in uniphier_aio_probe()
819 clk_disable_unprepare(chip->clk); in uniphier_aio_probe()
829 reset_control_assert(chip->rst); in uniphier_aio_remove()
830 clk_disable_unprepare(chip->clk); in uniphier_aio_remove()