• Home
  • Raw
  • Download

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()
392 list_for_each_entry(hlink, &bus->hlink_list, list) { in skl_resume()
393 if (!hlink->ref_count) in skl_resume()
397 if (!bus->cmd_dma_state) in skl_resume()
411 dev_dbg(bus->dev, "in %s\n", __func__); in skl_runtime_suspend()
421 dev_dbg(bus->dev, "in %s\n", __func__); in skl_runtime_resume()
440 skl->init_done = 0; /* to be sure */ in skl_free()
444 if (bus->irq >= 0) in skl_free()
445 free_irq(bus->irq, (void *)bus); in skl_free()
450 if (bus->remap_addr) in skl_free()
451 iounmap(bus->remap_addr); in skl_free()
453 pci_release_regions(skl->pci); in skl_free()
454 pci_disable_device(skl->pci); in skl_free()
492 mach->fw_filename = machines->fw_filename; in skl_find_hda_machine()
505 dev_dbg(bus->dev, "No matching I2S machine driver found\n"); in skl_find_machine()
508 dev_err(bus->dev, "No matching machine driver found\n"); in skl_find_machine()
509 return -ENODEV; in skl_find_machine()
513 skl->mach = mach; in skl_find_machine()
514 skl->fw_name = mach->fw_filename; in skl_find_machine()
515 pdata = mach->pdata; in skl_find_machine()
518 skl->use_tplg_pcm = pdata->use_tplg_pcm; in skl_find_machine()
519 mach->mach_params.dmic_num = in skl_find_machine()
520 intel_nhlt_get_dmic_geo(&skl->pci->dev, in skl_find_machine()
521 skl->nhlt); in skl_find_machine()
529 struct snd_soc_acpi_mach *mach = skl->mach; in skl_machine_device_register()
534 pdev = platform_device_alloc(mach->drv_name, -1); in skl_machine_device_register()
536 dev_err(bus->dev, "platform device alloc failed\n"); in skl_machine_device_register()
537 return -EIO; in skl_machine_device_register()
540 mach->mach_params.platform = dev_name(bus->dev); in skl_machine_device_register()
541 mach->mach_params.codec_mask = bus->codec_mask; in skl_machine_device_register()
545 dev_err(bus->dev, "failed to add machine device platform data\n"); in skl_machine_device_register()
552 dev_err(bus->dev, "failed to add machine device\n"); in skl_machine_device_register()
554 return -EIO; in skl_machine_device_register()
558 skl->i2s_dev = pdev; in skl_machine_device_register()
565 if (skl->i2s_dev) in skl_machine_device_unregister()
566 platform_device_unregister(skl->i2s_dev); in skl_machine_device_unregister()
576 pdev = platform_device_alloc("dmic-codec", -1); in skl_dmic_device_register()
578 dev_err(bus->dev, "failed to allocate dmic device\n"); in skl_dmic_device_register()
579 return -ENOMEM; in skl_dmic_device_register()
584 dev_err(bus->dev, "failed to add dmic device: %d\n", ret); in skl_dmic_device_register()
588 skl->dmic_dev = pdev; in skl_dmic_device_register()
595 if (skl->dmic_dev) in skl_dmic_device_unregister()
596 platform_device_unregister(skl->dmic_dev); in skl_dmic_device_unregister()
636 if (!skl->nhlt) in skl_clock_device_register()
639 clk_pdata = devm_kzalloc(&skl->pci->dev, sizeof(*clk_pdata), in skl_clock_device_register()
642 return -ENOMEM; in skl_clock_device_register()
644 init_skl_xtal_rate(skl->pci->device); in skl_clock_device_register()
646 clk_pdata->parent_clks = skl_clk_src; in skl_clock_device_register()
647 clk_pdata->ssp_clks = skl_ssp_clks; in skl_clock_device_register()
648 clk_pdata->num_clks = ARRAY_SIZE(skl_ssp_clks); in skl_clock_device_register()
651 skl_get_clks(skl, clk_pdata->ssp_clks); in skl_clock_device_register()
652 clk_pdata->pvt_data = skl; in skl_clock_device_register()
655 pdevinfo.parent = &skl->pci->dev; in skl_clock_device_register()
656 pdevinfo.id = -1; in skl_clock_device_register()
657 pdevinfo.name = "skl-ssp-clk"; in skl_clock_device_register()
660 skl->clk_dev = platform_device_register_full(&pdevinfo); in skl_clock_device_register()
661 return PTR_ERR_OR_ZERO(skl->clk_dev); in skl_clock_device_register()
666 if (skl->clk_dev) in skl_clock_device_unregister()
667 platform_device_unregister(skl->clk_dev); in skl_clock_device_unregister()
675 * load the legacy codec driver
677 static void load_codec_module(struct hda_codec *codec) in load_codec_module() argument
683 snd_hdac_codec_modalias(&codec->core, modalias, sizeof(modalias)); in load_codec_module()
685 dev_dbg(&codec->core.dev, "loading %s codec module\n", mod); in load_codec_module()
693 * Probe the given codec address
699 unsigned int res = -1; in probe_codec()
707 mutex_lock(&bus->cmd_mutex); in probe_codec()
710 mutex_unlock(&bus->cmd_mutex); in probe_codec()
711 if (res == -1) in probe_codec()
712 return -EIO; in probe_codec()
713 dev_dbg(bus->dev, "codec #%d probed OK: %x\n", addr, res); in probe_codec()
716 hda_codec = devm_kzalloc(&skl->pci->dev, sizeof(*hda_codec), in probe_codec()
719 return -ENOMEM; in probe_codec()
721 hda_codec->codec.bus = skl_to_hbus(skl); in probe_codec()
722 hdev = &hda_codec->codec.core; in probe_codec()
730 hdev->type = HDA_DEV_LEGACY; in probe_codec()
731 load_codec_module(&hda_codec->codec); in probe_codec()
735 hdev = devm_kzalloc(&skl->pci->dev, sizeof(*hdev), GFP_KERNEL); in probe_codec()
737 return -ENOMEM; in probe_codec()
743 /* Codec initialization */
750 /* First try to probe all given codec slots */ in skl_codec_create()
752 if ((bus->codec_mask & (1 << c))) { in skl_codec_create()
755 * Some BIOSen give you wrong codec addresses in skl_codec_create()
758 dev_warn(bus->dev, in skl_codec_create()
759 "Codec #%d probe error; disabling it...\n", c); in skl_codec_create()
760 bus->codec_mask &= ~(1 << c); in skl_codec_create()
762 * More badly, accessing to a non-existing in skl_codec_create()
763 * codec often screws up the controller bus, in skl_codec_create()
781 * The HDMI codec is in GPU so we need to ensure that it is powered in skl_i915_init()
811 dev_err(bus->dev, "Init chip failed with err: %d\n", err); in skl_probe_work()
815 /* codec detection */ in skl_probe_work()
816 if (!bus->codec_mask) in skl_probe_work()
817 dev_info(bus->dev, "no hda codecs found!\n"); in skl_probe_work()
819 /* create codec instances */ in skl_probe_work()
823 err = skl_platform_register(bus->dev); in skl_probe_work()
825 dev_err(bus->dev, "platform register failed: %d\n", err); in skl_probe_work()
831 dev_err(bus->dev, "machine register failed: %d\n", err); in skl_probe_work()
838 list_for_each_entry(hlink, &bus->hlink_list, list) in skl_probe_work()
845 pm_runtime_put_noidle(bus->dev); in skl_probe_work()
846 pm_runtime_allow(bus->dev); in skl_probe_work()
847 skl->init_done = 1; in skl_probe_work()
874 skl = devm_kzalloc(&pci->dev, sizeof(*skl), GFP_KERNEL); in skl_create()
877 return -ENOMEM; in skl_create()
883 INIT_LIST_HEAD(&skl->ppl_list); in skl_create()
884 INIT_LIST_HEAD(&skl->bind_list); in skl_create()
889 snd_hdac_ext_bus_init(bus, &pci->dev, NULL, ext_ops); in skl_create()
890 bus->use_posbuf = 1; in skl_create()
891 skl->pci = pci; in skl_create()
892 INIT_WORK(&skl->probe_work, skl_probe_work); in skl_create()
893 bus->bdl_pos_adj = 0; in skl_create()
895 mutex_init(&hbus->prepare_mutex); in skl_create()
896 hbus->pci = pci; in skl_create()
897 hbus->mixer_assigned = -1; in skl_create()
898 hbus->modelname = "sklbus"; in skl_create()
908 struct pci_dev *pci = skl->pci; in skl_first_init()
917 bus->addr = pci_resource_start(pci, 0); in skl_first_init()
918 bus->remap_addr = pci_ioremap_bar(pci, 0); in skl_first_init()
919 if (bus->remap_addr == NULL) { in skl_first_init()
920 dev_err(bus->dev, "ioremap error\n"); in skl_first_init()
921 return -ENXIO; in skl_first_init()
927 if (!bus->ppcap) { in skl_first_init()
928 dev_err(bus->dev, "bus ppcap not set, HDAudio or DSP not present?\n"); in skl_first_init()
929 return -ENODEV; in skl_first_init()
933 return -EBUSY; in skl_first_init()
936 synchronize_irq(bus->irq); in skl_first_init()
939 dev_dbg(bus->dev, "chipset global capabilities = 0x%x\n", gcap); in skl_first_init()
946 dev_err(bus->dev, "no streams found in GCAP definitions?\n"); in skl_first_init()
947 return -EIO; in skl_first_init()
950 bus->num_streams = cp_streams + pb_streams; in skl_first_init()
953 if (!dma_set_mask(bus->dev, DMA_BIT_MASK(64))) { in skl_first_init()
954 dma_set_coherent_mask(bus->dev, DMA_BIT_MASK(64)); in skl_first_init()
956 dma_set_mask(bus->dev, DMA_BIT_MASK(32)); in skl_first_init()
957 dma_set_coherent_mask(bus->dev, DMA_BIT_MASK(32)); in skl_first_init()
986 return -ENODEV; in skl_probe()
989 dev_info(&pci->dev, "Module parameter forced binding with HDAudio legacy, aborting probe\n"); in skl_probe()
990 return -ENODEV; in skl_probe()
992 …dev_info(&pci->dev, "Module parameter forced binding with SKL driver, bypassed detection logic\n"); in skl_probe()
995 dev_err(&pci->dev, "invalid value for skl_pci_binding module parameter, ignored\n"); in skl_probe()
1008 dev_err(bus->dev, "skl_first_init failed with err: %d\n", err); in skl_probe()
1012 skl->pci_id = pci->device; in skl_probe()
1014 device_disable_async_suspend(bus->dev); in skl_probe()
1016 skl->nhlt = intel_nhlt_init(bus->dev); in skl_probe()
1018 if (skl->nhlt == NULL) { in skl_probe()
1020 dev_err(bus->dev, "no nhlt info found\n"); in skl_probe()
1021 err = -ENODEV; in skl_probe()
1024 dev_warn(bus->dev, "no nhlt info found, continuing to try to enable HDAudio codec\n"); in skl_probe()
1030 dev_err(bus->dev, "skl_nhlt_create_sysfs failed with err: %d\n", err); in skl_probe()
1039 dev_err(bus->dev, "skl_clock_device_register failed with err: %d\n", err); in skl_probe()
1044 pci_set_drvdata(skl->pci, bus); in skl_probe()
1047 err = skl_find_machine(skl, (void *)pci_id->driver_data); in skl_probe()
1049 dev_err(bus->dev, "skl_find_machine failed with err: %d\n", err); in skl_probe()
1055 dev_dbg(bus->dev, "error failed to register dsp\n"); in skl_probe()
1058 skl->enable_miscbdcge = skl_enable_miscbdcge; in skl_probe()
1059 skl->clock_power_gating = skl_clock_power_gating; in skl_probe()
1061 if (bus->mlcap) in skl_probe()
1067 dev_err(bus->dev, "skl_dmic_device_register failed with err: %d\n", err); in skl_probe()
1071 schedule_work(&skl->probe_work); in skl_probe()
1080 if (skl->nhlt) in skl_probe()
1081 intel_nhlt_free(skl->nhlt); in skl_probe()
1100 if (!skl->init_done) in skl_shutdown()
1105 skl_dsp_sleep(skl->dsp); in skl_shutdown()
1107 list_for_each_entry(s, &bus->stream_list, list) { in skl_shutdown()
1120 cancel_work_sync(&skl->probe_work); in skl_remove()
1122 pm_runtime_get_noresume(&pci->dev); in skl_remove()
1124 /* codec removal, invoke bus_device_remove */ in skl_remove()
1127 skl_platform_unregister(&pci->dev); in skl_remove()
1133 if (skl->nhlt) in skl_remove()
1134 intel_nhlt_free(skl->nhlt); in skl_remove()
1136 dev_set_drvdata(&pci->dev, NULL); in skl_remove()
1142 /* Sunrise Point-LP */
1147 /* BXT-P */
1172 /* CML-LP */
1177 /* CML-H */