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
261 sub->substream = substream; in uniphier_aio_startup()
262 sub->pass_through = 0; in uniphier_aio_startup()
263 sub->use_mmap = true; in uniphier_aio_startup()
265 ret = aio_init(sub); in uniphier_aio_startup()
276 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aio_shutdown() local
278 sub->substream = NULL; in uniphier_aio_shutdown()
286 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aio_hw_params() local
287 struct device *dev = &aio->chip->pdev->dev; in uniphier_aio_hw_params()
303 return -EINVAL; in uniphier_aio_hw_params()
310 sub->params = *params; in uniphier_aio_hw_params()
311 sub->setting = 1; in uniphier_aio_hw_params()
313 aio_port_reset(sub); in uniphier_aio_hw_params()
314 aio_port_set_volume(sub, sub->vol); in uniphier_aio_hw_params()
315 aio_src_reset(sub); in uniphier_aio_hw_params()
324 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aio_hw_free() local
326 sub->setting = 0; in uniphier_aio_hw_free()
335 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aio_prepare() local
338 ret = aio_port_set_param(sub, sub->pass_through, &sub->params); in uniphier_aio_prepare()
341 ret = aio_src_set_param(sub, &sub->params); in uniphier_aio_prepare()
344 aio_port_set_enable(sub, 1); in uniphier_aio_prepare()
346 ret = aio_if_set_param(sub, sub->pass_through); in uniphier_aio_prepare()
350 if (sub->swm->type == PORT_TYPE_CONV) { in uniphier_aio_prepare()
351 ret = aio_srcif_set_param(sub); in uniphier_aio_prepare()
354 ret = aio_srcch_set_param(sub); in uniphier_aio_prepare()
357 aio_srcch_set_enable(sub, 1); in uniphier_aio_prepare()
391 for (i = 0; i < ARRAY_SIZE(aio->sub); i++) { in uniphier_aio_dai_probe()
392 struct uniphier_aio_sub *sub = &aio->sub[i]; in uniphier_aio_dai_probe() local
395 spec = find_spec(aio, dai->name, i); in uniphier_aio_dai_probe()
399 sub->swm = &spec->swm; in uniphier_aio_dai_probe()
400 sub->spec = spec; in uniphier_aio_dai_probe()
402 sub->vol = AUD_VOL_INIT; in uniphier_aio_dai_probe()
405 aio_iecout_set_enable(aio->chip, true); in uniphier_aio_dai_probe()
406 aio_chip_init(aio->chip); in uniphier_aio_dai_probe()
407 aio->chip->active = 1; in uniphier_aio_dai_probe()
417 aio->chip->active = 0; in uniphier_aio_dai_remove()
430 aio->chip->num_wup_aios--; in uniphier_aio_dai_suspend()
431 if (!aio->chip->num_wup_aios) { in uniphier_aio_dai_suspend()
432 reset_control_assert(aio->chip->rst); in uniphier_aio_dai_suspend()
433 clk_disable_unprepare(aio->chip->clk); in uniphier_aio_dai_suspend()
454 if (!aio->chip->active) in uniphier_aio_dai_resume()
457 if (!aio->chip->num_wup_aios) { in uniphier_aio_dai_resume()
458 ret = clk_prepare_enable(aio->chip->clk); in uniphier_aio_dai_resume()
462 ret = reset_control_deassert(aio->chip->rst); in uniphier_aio_dai_resume()
467 aio_iecout_set_enable(aio->chip, true); in uniphier_aio_dai_resume()
468 aio_chip_init(aio->chip); in uniphier_aio_dai_resume()
470 for (i = 0; i < ARRAY_SIZE(aio->sub); i++) { in uniphier_aio_dai_resume()
471 struct uniphier_aio_sub *sub = &aio->sub[i]; in uniphier_aio_dai_resume() local
473 if (!sub->spec || !sub->substream) in uniphier_aio_dai_resume()
476 ret = aio_init(sub); in uniphier_aio_dai_resume()
480 if (!sub->setting) in uniphier_aio_dai_resume()
483 aio_port_reset(sub); in uniphier_aio_dai_resume()
484 aio_src_reset(sub); in uniphier_aio_dai_resume()
486 aio->chip->num_wup_aios++; in uniphier_aio_dai_resume()
491 if (!aio->chip->num_wup_aios) in uniphier_aio_dai_resume()
492 reset_control_assert(aio->chip->rst); in uniphier_aio_dai_resume()
494 if (!aio->chip->num_wup_aios) in uniphier_aio_dai_resume()
495 clk_disable_unprepare(aio->chip->clk); in uniphier_aio_dai_resume()
513 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in uniphier_aio_vol_info()
514 uinfo->count = 1; in uniphier_aio_vol_info()
515 uinfo->value.integer.min = 0; in uniphier_aio_vol_info()
516 uinfo->value.integer.max = AUD_VOL_MAX; in uniphier_aio_vol_info()
526 struct uniphier_aio_sub *sub; in uniphier_aio_vol_get() local
527 int oport_hw = kcontrol->private_value; in uniphier_aio_vol_get()
529 sub = find_volume(chip, oport_hw); in uniphier_aio_vol_get()
530 if (!sub) in uniphier_aio_vol_get()
533 ucontrol->value.integer.value[0] = sub->vol; in uniphier_aio_vol_get()
543 struct uniphier_aio_sub *sub; in uniphier_aio_vol_put() local
544 int oport_hw = kcontrol->private_value; in uniphier_aio_vol_put()
546 sub = find_volume(chip, oport_hw); in uniphier_aio_vol_put()
547 if (!sub) in uniphier_aio_vol_put()
550 if (sub->vol == ucontrol->value.integer.value[0]) in uniphier_aio_vol_put()
552 sub->vol = ucontrol->value.integer.value[0]; in uniphier_aio_vol_put()
554 aio_port_set_volume(sub, sub->vol); in uniphier_aio_vol_put()
617 .name = "uniphier-aio",
627 struct device *dev = &pdev->dev; in uniphier_aio_probe()
632 return -ENOMEM; in uniphier_aio_probe()
634 chip->chip_spec = of_device_get_match_data(dev); in uniphier_aio_probe()
635 if (!chip->chip_spec) in uniphier_aio_probe()
636 return -EINVAL; in uniphier_aio_probe()
638 chip->regmap_sg = syscon_regmap_lookup_by_phandle(dev->of_node, in uniphier_aio_probe()
640 if (IS_ERR(chip->regmap_sg)) { in uniphier_aio_probe()
641 if (PTR_ERR(chip->regmap_sg) == -EPROBE_DEFER) in uniphier_aio_probe()
642 return -EPROBE_DEFER; in uniphier_aio_probe()
643 chip->regmap_sg = NULL; in uniphier_aio_probe()
646 chip->clk = devm_clk_get(dev, "aio"); in uniphier_aio_probe()
647 if (IS_ERR(chip->clk)) in uniphier_aio_probe()
648 return PTR_ERR(chip->clk); in uniphier_aio_probe()
650 chip->rst = devm_reset_control_get_shared(dev, "aio"); in uniphier_aio_probe()
651 if (IS_ERR(chip->rst)) in uniphier_aio_probe()
652 return PTR_ERR(chip->rst); in uniphier_aio_probe()
654 chip->num_aios = chip->chip_spec->num_dais; in uniphier_aio_probe()
655 chip->num_wup_aios = chip->num_aios; in uniphier_aio_probe()
656 chip->aios = devm_kcalloc(dev, in uniphier_aio_probe()
657 chip->num_aios, sizeof(struct uniphier_aio), in uniphier_aio_probe()
659 if (!chip->aios) in uniphier_aio_probe()
660 return -ENOMEM; in uniphier_aio_probe()
662 chip->num_plls = chip->chip_spec->num_plls; in uniphier_aio_probe()
663 chip->plls = devm_kcalloc(dev, in uniphier_aio_probe()
664 chip->num_plls, in uniphier_aio_probe()
667 if (!chip->plls) in uniphier_aio_probe()
668 return -ENOMEM; in uniphier_aio_probe()
669 memcpy(chip->plls, chip->chip_spec->plls, in uniphier_aio_probe()
670 sizeof(struct uniphier_aio_pll) * chip->num_plls); in uniphier_aio_probe()
672 for (i = 0; i < chip->num_aios; i++) { in uniphier_aio_probe()
673 struct uniphier_aio *aio = &chip->aios[i]; in uniphier_aio_probe()
675 aio->chip = chip; in uniphier_aio_probe()
676 aio->fmt = SND_SOC_DAIFMT_I2S; in uniphier_aio_probe()
678 for (j = 0; j < ARRAY_SIZE(aio->sub); j++) { in uniphier_aio_probe()
679 struct uniphier_aio_sub *sub = &aio->sub[j]; in uniphier_aio_probe() local
681 sub->aio = aio; in uniphier_aio_probe()
682 spin_lock_init(&sub->lock); in uniphier_aio_probe()
686 chip->pdev = pdev; in uniphier_aio_probe()
689 ret = clk_prepare_enable(chip->clk); in uniphier_aio_probe()
693 ret = reset_control_deassert(chip->rst); in uniphier_aio_probe()
698 chip->chip_spec->dais, in uniphier_aio_probe()
699 chip->chip_spec->num_dais); in uniphier_aio_probe()
714 reset_control_assert(chip->rst); in uniphier_aio_probe()
717 clk_disable_unprepare(chip->clk); in uniphier_aio_probe()
727 reset_control_assert(chip->rst); in uniphier_aio_remove()
728 clk_disable_unprepare(chip->clk); in uniphier_aio_remove()