• 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
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()
427 aio->chip->num_wup_aios--; in uniphier_aio_dai_suspend()
428 if (!aio->chip->num_wup_aios) { in uniphier_aio_dai_suspend()
429 reset_control_assert(aio->chip->rst); in uniphier_aio_dai_suspend()
430 clk_disable_unprepare(aio->chip->clk); in uniphier_aio_dai_suspend()
442 if (!aio->chip->active) in uniphier_aio_dai_resume()
445 if (!aio->chip->num_wup_aios) { in uniphier_aio_dai_resume()
446 ret = clk_prepare_enable(aio->chip->clk); in uniphier_aio_dai_resume()
450 ret = reset_control_deassert(aio->chip->rst); in uniphier_aio_dai_resume()
455 aio_iecout_set_enable(aio->chip, true); in uniphier_aio_dai_resume()
456 aio_chip_init(aio->chip); in uniphier_aio_dai_resume()
458 for (i = 0; i < ARRAY_SIZE(aio->sub); i++) { in uniphier_aio_dai_resume()
459 struct uniphier_aio_sub *sub = &aio->sub[i]; in uniphier_aio_dai_resume() local
461 if (!sub->spec || !sub->substream) in uniphier_aio_dai_resume()
464 ret = aio_init(sub); in uniphier_aio_dai_resume()
468 if (!sub->setting) in uniphier_aio_dai_resume()
471 aio_port_reset(sub); in uniphier_aio_dai_resume()
472 aio_src_reset(sub); in uniphier_aio_dai_resume()
474 aio->chip->num_wup_aios++; in uniphier_aio_dai_resume()
479 if (!aio->chip->num_wup_aios) in uniphier_aio_dai_resume()
480 reset_control_assert(aio->chip->rst); in uniphier_aio_dai_resume()
482 if (!aio->chip->num_wup_aios) in uniphier_aio_dai_resume()
483 clk_disable_unprepare(aio->chip->clk); in uniphier_aio_dai_resume()
492 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in uniphier_aio_vol_info()
493 uinfo->count = 1; in uniphier_aio_vol_info()
494 uinfo->value.integer.min = 0; in uniphier_aio_vol_info()
495 uinfo->value.integer.max = AUD_VOL_MAX; in uniphier_aio_vol_info()
505 struct uniphier_aio_sub *sub; in uniphier_aio_vol_get() local
506 int oport_hw = kcontrol->private_value; in uniphier_aio_vol_get()
508 sub = find_volume(chip, oport_hw); in uniphier_aio_vol_get()
509 if (!sub) in uniphier_aio_vol_get()
512 ucontrol->value.integer.value[0] = sub->vol; in uniphier_aio_vol_get()
522 struct uniphier_aio_sub *sub; in uniphier_aio_vol_put() local
523 int oport_hw = kcontrol->private_value; in uniphier_aio_vol_put()
525 sub = find_volume(chip, oport_hw); in uniphier_aio_vol_put()
526 if (!sub) in uniphier_aio_vol_put()
529 if (sub->vol == ucontrol->value.integer.value[0]) in uniphier_aio_vol_put()
531 sub->vol = ucontrol->value.integer.value[0]; in uniphier_aio_vol_put()
533 aio_port_set_volume(sub, sub->vol); in uniphier_aio_vol_put()
596 .name = "uniphier-aio",
604 struct device *dev = &pdev->dev; in uniphier_aio_probe()
609 return -ENOMEM; in uniphier_aio_probe()
611 chip->chip_spec = of_device_get_match_data(dev); in uniphier_aio_probe()
612 if (!chip->chip_spec) in uniphier_aio_probe()
613 return -EINVAL; in uniphier_aio_probe()
615 chip->regmap_sg = syscon_regmap_lookup_by_phandle(dev->of_node, in uniphier_aio_probe()
617 if (IS_ERR(chip->regmap_sg)) { in uniphier_aio_probe()
618 if (PTR_ERR(chip->regmap_sg) == -EPROBE_DEFER) in uniphier_aio_probe()
619 return -EPROBE_DEFER; in uniphier_aio_probe()
620 chip->regmap_sg = NULL; in uniphier_aio_probe()
623 chip->clk = devm_clk_get(dev, "aio"); in uniphier_aio_probe()
624 if (IS_ERR(chip->clk)) in uniphier_aio_probe()
625 return PTR_ERR(chip->clk); in uniphier_aio_probe()
627 chip->rst = devm_reset_control_get_shared(dev, "aio"); in uniphier_aio_probe()
628 if (IS_ERR(chip->rst)) in uniphier_aio_probe()
629 return PTR_ERR(chip->rst); in uniphier_aio_probe()
631 chip->num_aios = chip->chip_spec->num_dais; in uniphier_aio_probe()
632 chip->num_wup_aios = chip->num_aios; in uniphier_aio_probe()
633 chip->aios = devm_kcalloc(dev, in uniphier_aio_probe()
634 chip->num_aios, sizeof(struct uniphier_aio), in uniphier_aio_probe()
636 if (!chip->aios) in uniphier_aio_probe()
637 return -ENOMEM; in uniphier_aio_probe()
639 chip->num_plls = chip->chip_spec->num_plls; in uniphier_aio_probe()
640 chip->plls = devm_kcalloc(dev, in uniphier_aio_probe()
641 chip->num_plls, in uniphier_aio_probe()
644 if (!chip->plls) in uniphier_aio_probe()
645 return -ENOMEM; in uniphier_aio_probe()
646 memcpy(chip->plls, chip->chip_spec->plls, in uniphier_aio_probe()
647 sizeof(struct uniphier_aio_pll) * chip->num_plls); in uniphier_aio_probe()
649 for (i = 0; i < chip->num_aios; i++) { in uniphier_aio_probe()
650 struct uniphier_aio *aio = &chip->aios[i]; in uniphier_aio_probe()
652 aio->chip = chip; in uniphier_aio_probe()
653 aio->fmt = SND_SOC_DAIFMT_I2S; in uniphier_aio_probe()
655 for (j = 0; j < ARRAY_SIZE(aio->sub); j++) { in uniphier_aio_probe()
656 struct uniphier_aio_sub *sub = &aio->sub[j]; in uniphier_aio_probe() local
658 sub->aio = aio; in uniphier_aio_probe()
659 spin_lock_init(&sub->lock); in uniphier_aio_probe()
663 chip->pdev = pdev; in uniphier_aio_probe()
666 ret = clk_prepare_enable(chip->clk); in uniphier_aio_probe()
670 ret = reset_control_deassert(chip->rst); in uniphier_aio_probe()
675 chip->chip_spec->dais, in uniphier_aio_probe()
676 chip->chip_spec->num_dais); in uniphier_aio_probe()
691 reset_control_assert(chip->rst); in uniphier_aio_probe()
694 clk_disable_unprepare(chip->clk); in uniphier_aio_probe()
704 reset_control_assert(chip->rst); in uniphier_aio_remove()
705 clk_disable_unprepare(chip->clk); in uniphier_aio_remove()