Lines Matching +full:codec +full:- +full:irq
1 // SPDX-License-Identifier: GPL-2.0-only
3 * skl.c - Implementation of ASoC Intel SKL HD Audio driver
5 * Copyright (C) 2014-2015 Intel Corp
23 #include <sound/soc-acpi.h>
24 #include <sound/soc-acpi-intel-match.h>
29 #include <sound/intel-nhlt.h>
30 #include <sound/intel-dsp-config.h>
32 #include "skl-sst-dsp.h"
33 #include "skl-sst-ipc.h"
61 * Clear bits 0-2 of PCI register TCSEL (at offset 0x44) in skl_init_pci()
67 dev_dbg(bus->dev, "Clearing TCSEL\n"); in skl_init_pci()
68 skl_update_pci_byte(skl->pci, AZX_PCIREG_TCSEL, 0x07, 0); in skl_init_pci()
83 * skl_enable_miscbdcge - enable/dsiable CGCTL.MISCBDCGE bits
134 skl_enable_miscbdcge(bus->dev, false); in skl_init_chip()
137 /* Reset stream-to-link mapping */ in skl_init_chip()
138 list_for_each_entry(hlink, &bus->hlink_list, list) in skl_init_chip()
139 writel(0, hlink->ml_addr + AZX_REG_ML_LOSIDV); in skl_init_chip()
141 skl_enable_miscbdcge(bus->dev, true); in skl_init_chip()
156 while ((reg & AZX_REG_VS_D0I3C_CIP) && --timeout) { in skl_update_d0i3c()
163 dev_err(bus->dev, "Before D0I3C update: D0I3C CIP timeout\n"); in skl_update_d0i3c()
177 while ((reg & AZX_REG_VS_D0I3C_CIP) && --timeout) { in skl_update_d0i3c()
184 dev_err(bus->dev, "After D0I3C update: D0I3C CIP timeout\n"); in skl_update_d0i3c()
188 dev_dbg(bus->dev, "D0I3C register = 0x%x\n", in skl_update_d0i3c()
193 * skl_dum_set - set DUM bit in EM2 register
194 * @bus: HD-audio core bus
203 skl_enable_miscbdcge(bus->dev, false); in skl_dum_set()
205 skl_enable_miscbdcge(bus->dev, true); in skl_dum_set()
211 /* called from IRQ */
214 snd_pcm_period_elapsed(hstr->substream); in skl_stream_update()
217 static irqreturn_t skl_interrupt(int irq, void *dev_id) in skl_interrupt() argument
222 if (!pm_runtime_active(bus->dev)) in skl_interrupt()
225 spin_lock(&bus->reg_lock); in skl_interrupt()
229 spin_unlock(&bus->reg_lock); in skl_interrupt()
241 spin_unlock(&bus->reg_lock); in skl_interrupt()
246 static irqreturn_t skl_threaded_handler(int irq, void *dev_id) in skl_threaded_handler() argument
263 ret = request_threaded_irq(skl->pci->irq, skl_interrupt, in skl_acquire_irq()
268 dev_err(bus->dev, in skl_acquire_irq()
269 "unable to grab IRQ %d, disabling device\n", in skl_acquire_irq()
270 skl->pci->irq); in skl_acquire_irq()
274 bus->irq = skl->pci->irq; in skl_acquire_irq()
275 pci_intx(skl->pci, 1); in skl_acquire_irq()
293 struct pci_dev *pci = to_pci_dev(bus->dev); in _skl_suspend()
305 skl_enable_miscbdcge(bus->dev, false); in _skl_suspend()
307 skl_enable_miscbdcge(bus->dev, true); in _skl_suspend()
340 if (skl->supend_active) { in skl_suspend()
344 if (bus->cmd_dma_state) in skl_suspend()
347 enable_irq_wake(bus->irq); in skl_suspend()
353 skl->fw_loaded = false; in skl_suspend()
371 if (skl->supend_active) { in skl_resume()
374 disable_irq_wake(bus->irq); in skl_resume()
380 list_for_each_entry(hlink, &bus->hlink_list, list) { in skl_resume()
381 if (hlink->ref_count) in skl_resume()
386 if (bus->cmd_dma_state) in skl_resume()
402 dev_dbg(bus->dev, "in %s\n", __func__); in skl_runtime_suspend()
412 dev_dbg(bus->dev, "in %s\n", __func__); in skl_runtime_resume()
431 skl->init_done = 0; /* to be sure */ in skl_free()
435 if (bus->irq >= 0) in skl_free()
436 free_irq(bus->irq, (void *)bus); in skl_free()
441 if (bus->remap_addr) in skl_free()
442 iounmap(bus->remap_addr); in skl_free()
444 pci_release_regions(skl->pci); in skl_free()
445 pci_disable_device(skl->pci); in skl_free()
483 mach->fw_filename = machines->fw_filename; in skl_find_hda_machine()
496 dev_dbg(bus->dev, "No matching I2S machine driver found\n"); in skl_find_machine()
499 dev_err(bus->dev, "No matching machine driver found\n"); in skl_find_machine()
500 return -ENODEV; in skl_find_machine()
504 skl->mach = mach; in skl_find_machine()
505 skl->fw_name = mach->fw_filename; in skl_find_machine()
506 pdata = mach->pdata; in skl_find_machine()
509 skl->use_tplg_pcm = pdata->use_tplg_pcm; in skl_find_machine()
510 mach->mach_params.dmic_num = in skl_find_machine()
511 intel_nhlt_get_dmic_geo(&skl->pci->dev, in skl_find_machine()
512 skl->nhlt); in skl_find_machine()
520 struct snd_soc_acpi_mach *mach = skl->mach; in skl_machine_device_register()
525 pdev = platform_device_alloc(mach->drv_name, -1); in skl_machine_device_register()
527 dev_err(bus->dev, "platform device alloc failed\n"); in skl_machine_device_register()
528 return -EIO; in skl_machine_device_register()
531 mach->mach_params.platform = dev_name(bus->dev); in skl_machine_device_register()
532 mach->mach_params.codec_mask = bus->codec_mask; in skl_machine_device_register()
536 dev_err(bus->dev, "failed to add machine device platform data\n"); in skl_machine_device_register()
543 dev_err(bus->dev, "failed to add machine device\n"); in skl_machine_device_register()
545 return -EIO; in skl_machine_device_register()
549 skl->i2s_dev = pdev; in skl_machine_device_register()
556 if (skl->i2s_dev) in skl_machine_device_unregister()
557 platform_device_unregister(skl->i2s_dev); in skl_machine_device_unregister()
567 pdev = platform_device_alloc("dmic-codec", -1); in skl_dmic_device_register()
569 dev_err(bus->dev, "failed to allocate dmic device\n"); in skl_dmic_device_register()
570 return -ENOMEM; in skl_dmic_device_register()
575 dev_err(bus->dev, "failed to add dmic device: %d\n", ret); in skl_dmic_device_register()
579 skl->dmic_dev = pdev; in skl_dmic_device_register()
586 if (skl->dmic_dev) in skl_dmic_device_unregister()
587 platform_device_unregister(skl->dmic_dev); in skl_dmic_device_unregister()
627 if (!skl->nhlt) in skl_clock_device_register()
630 clk_pdata = devm_kzalloc(&skl->pci->dev, sizeof(*clk_pdata), in skl_clock_device_register()
633 return -ENOMEM; in skl_clock_device_register()
635 init_skl_xtal_rate(skl->pci->device); in skl_clock_device_register()
637 clk_pdata->parent_clks = skl_clk_src; in skl_clock_device_register()
638 clk_pdata->ssp_clks = skl_ssp_clks; in skl_clock_device_register()
639 clk_pdata->num_clks = ARRAY_SIZE(skl_ssp_clks); in skl_clock_device_register()
642 skl_get_clks(skl, clk_pdata->ssp_clks); in skl_clock_device_register()
643 clk_pdata->pvt_data = skl; in skl_clock_device_register()
646 pdevinfo.parent = &skl->pci->dev; in skl_clock_device_register()
647 pdevinfo.id = -1; in skl_clock_device_register()
648 pdevinfo.name = "skl-ssp-clk"; in skl_clock_device_register()
651 skl->clk_dev = platform_device_register_full(&pdevinfo); in skl_clock_device_register()
652 return PTR_ERR_OR_ZERO(skl->clk_dev); in skl_clock_device_register()
657 if (skl->clk_dev) in skl_clock_device_unregister()
658 platform_device_unregister(skl->clk_dev); in skl_clock_device_unregister()
666 * load the legacy codec driver
668 static void load_codec_module(struct hda_codec *codec) in load_codec_module() argument
674 snd_hdac_codec_modalias(&codec->core, modalias, sizeof(modalias)); in load_codec_module()
676 dev_dbg(&codec->core.dev, "loading %s codec module\n", mod); in load_codec_module()
685 struct hda_codec *codec; in skl_codec_device_init() local
688 codec = snd_hda_codec_device_init(to_hda_bus(bus), addr, "ehdaudio%dD%d", bus->idx, addr); in skl_codec_device_init()
689 if (IS_ERR(codec)) { in skl_codec_device_init()
690 dev_err(bus->dev, "device init failed for hdac device\n"); in skl_codec_device_init()
691 return codec; in skl_codec_device_init()
694 codec->core.type = HDA_DEV_ASOC; in skl_codec_device_init()
696 ret = snd_hdac_device_register(&codec->core); in skl_codec_device_init()
698 dev_err(bus->dev, "failed to register hdac device\n"); in skl_codec_device_init()
699 put_device(&codec->core.dev); in skl_codec_device_init()
703 return codec; in skl_codec_device_init()
707 * Probe the given codec address
713 unsigned int res = -1; in probe_codec()
718 struct hda_codec *codec; in probe_codec() local
720 mutex_lock(&bus->cmd_mutex); in probe_codec()
723 mutex_unlock(&bus->cmd_mutex); in probe_codec()
724 if (res == -1) in probe_codec()
725 return -EIO; in probe_codec()
726 dev_dbg(bus->dev, "codec #%d probed OK: %x\n", addr, res); in probe_codec()
729 hda_codec = devm_kzalloc(&skl->pci->dev, sizeof(*hda_codec), in probe_codec()
732 return -ENOMEM; in probe_codec()
734 codec = skl_codec_device_init(bus, addr); in probe_codec()
735 if (IS_ERR(codec)) in probe_codec()
736 return PTR_ERR(codec); in probe_codec()
738 hda_codec->codec = codec; in probe_codec()
739 dev_set_drvdata(&codec->core.dev, hda_codec); in probe_codec()
743 codec->core.type = HDA_DEV_LEGACY; in probe_codec()
744 load_codec_module(hda_codec->codec); in probe_codec()
748 codec = skl_codec_device_init(bus, addr); in probe_codec()
749 return PTR_ERR_OR_ZERO(codec); in probe_codec()
753 /* Codec initialization */
760 /* First try to probe all given codec slots */ in skl_codec_create()
762 if ((bus->codec_mask & (1 << c))) { in skl_codec_create()
765 * Some BIOSen give you wrong codec addresses in skl_codec_create()
768 dev_warn(bus->dev, in skl_codec_create()
769 "Codec #%d probe error; disabling it...\n", c); in skl_codec_create()
770 bus->codec_mask &= ~(1 << c); in skl_codec_create()
772 * More badly, accessing to a non-existing in skl_codec_create()
773 * codec often screws up the controller bus, in skl_codec_create()
791 * The HDMI codec is in GPU so we need to ensure that it is powered in skl_i915_init()
821 dev_err(bus->dev, "Init chip failed with err: %d\n", err); in skl_probe_work()
825 /* codec detection */ in skl_probe_work()
826 if (!bus->codec_mask) in skl_probe_work()
827 dev_info(bus->dev, "no hda codecs found!\n"); in skl_probe_work()
829 /* create codec instances */ in skl_probe_work()
833 err = skl_platform_register(bus->dev); in skl_probe_work()
835 dev_err(bus->dev, "platform register failed: %d\n", err); in skl_probe_work()
841 dev_err(bus->dev, "machine register failed: %d\n", err); in skl_probe_work()
848 list_for_each_entry(hlink, &bus->hlink_list, list) in skl_probe_work()
855 pm_runtime_put_noidle(bus->dev); in skl_probe_work()
856 pm_runtime_allow(bus->dev); in skl_probe_work()
857 skl->init_done = 1; in skl_probe_work()
884 skl = devm_kzalloc(&pci->dev, sizeof(*skl), GFP_KERNEL); in skl_create()
887 return -ENOMEM; in skl_create()
893 INIT_LIST_HEAD(&skl->ppl_list); in skl_create()
894 INIT_LIST_HEAD(&skl->bind_list); in skl_create()
899 snd_hdac_ext_bus_init(bus, &pci->dev, NULL, ext_ops); in skl_create()
900 bus->use_posbuf = 1; in skl_create()
901 skl->pci = pci; in skl_create()
902 INIT_WORK(&skl->probe_work, skl_probe_work); in skl_create()
903 bus->bdl_pos_adj = 0; in skl_create()
905 mutex_init(&hbus->prepare_mutex); in skl_create()
906 hbus->pci = pci; in skl_create()
907 hbus->mixer_assigned = -1; in skl_create()
908 hbus->modelname = "sklbus"; in skl_create()
918 struct pci_dev *pci = skl->pci; in skl_first_init()
927 bus->addr = pci_resource_start(pci, 0); in skl_first_init()
928 bus->remap_addr = pci_ioremap_bar(pci, 0); in skl_first_init()
929 if (bus->remap_addr == NULL) { in skl_first_init()
930 dev_err(bus->dev, "ioremap error\n"); in skl_first_init()
931 return -ENXIO; in skl_first_init()
937 if (!bus->ppcap) { in skl_first_init()
938 dev_err(bus->dev, "bus ppcap not set, HDAudio or DSP not present?\n"); in skl_first_init()
939 return -ENODEV; in skl_first_init()
943 return -EBUSY; in skl_first_init()
946 synchronize_irq(bus->irq); in skl_first_init()
949 dev_dbg(bus->dev, "chipset global capabilities = 0x%x\n", gcap); in skl_first_init()
956 dev_err(bus->dev, "no streams found in GCAP definitions?\n"); in skl_first_init()
957 return -EIO; in skl_first_init()
960 bus->num_streams = cp_streams + pb_streams; in skl_first_init()
963 if (dma_set_mask_and_coherent(bus->dev, DMA_BIT_MASK(64))) in skl_first_init()
964 dma_set_mask_and_coherent(bus->dev, DMA_BIT_MASK(32)); in skl_first_init()
965 dma_set_max_seg_size(bus->dev, UINT_MAX); in skl_first_init()
993 return -ENODEV; in skl_probe()
996 dev_info(&pci->dev, "Module parameter forced binding with HDAudio legacy, aborting probe\n"); in skl_probe()
997 return -ENODEV; in skl_probe()
999 …dev_info(&pci->dev, "Module parameter forced binding with SKL driver, bypassed detection logic\n"); in skl_probe()
1002 dev_err(&pci->dev, "invalid value for skl_pci_binding module parameter, ignored\n"); in skl_probe()
1015 dev_err(bus->dev, "skl_first_init failed with err: %d\n", err); in skl_probe()
1019 skl->pci_id = pci->device; in skl_probe()
1021 device_disable_async_suspend(bus->dev); in skl_probe()
1023 skl->nhlt = intel_nhlt_init(bus->dev); in skl_probe()
1025 if (skl->nhlt == NULL) { in skl_probe()
1027 dev_err(bus->dev, "no nhlt info found\n"); in skl_probe()
1028 err = -ENODEV; in skl_probe()
1031 dev_warn(bus->dev, "no nhlt info found, continuing to try to enable HDAudio codec\n"); in skl_probe()
1037 dev_err(bus->dev, "skl_nhlt_create_sysfs failed with err: %d\n", err); in skl_probe()
1046 dev_err(bus->dev, "skl_clock_device_register failed with err: %d\n", err); in skl_probe()
1051 pci_set_drvdata(skl->pci, bus); in skl_probe()
1054 err = skl_find_machine(skl, (void *)pci_id->driver_data); in skl_probe()
1056 dev_err(bus->dev, "skl_find_machine failed with err: %d\n", err); in skl_probe()
1062 dev_dbg(bus->dev, "error failed to register dsp\n"); in skl_probe()
1065 skl->enable_miscbdcge = skl_enable_miscbdcge; in skl_probe()
1066 skl->clock_power_gating = skl_clock_power_gating; in skl_probe()
1068 if (bus->mlcap) in skl_probe()
1074 dev_err(bus->dev, "skl_dmic_device_register failed with err: %d\n", err); in skl_probe()
1078 schedule_work(&skl->probe_work); in skl_probe()
1087 if (skl->nhlt) in skl_probe()
1088 intel_nhlt_free(skl->nhlt); in skl_probe()
1107 if (!skl->init_done) in skl_shutdown()
1112 skl_dsp_sleep(skl->dsp); in skl_shutdown()
1114 list_for_each_entry(s, &bus->stream_list, list) { in skl_shutdown()
1127 cancel_work_sync(&skl->probe_work); in skl_remove()
1129 pm_runtime_get_noresume(&pci->dev); in skl_remove()
1131 /* codec removal, invoke bus_device_remove */ in skl_remove()
1134 skl_platform_unregister(&pci->dev); in skl_remove()
1140 if (skl->nhlt) in skl_remove()
1141 intel_nhlt_free(skl->nhlt); in skl_remove()