1 // SPDX-License-Identifier: GPL-2.0-only 2 // 3 // Copyright(c) 2021-2022 Intel Corporation. All rights reserved. 4 // 5 // Authors: Cezary Rojewski <cezary.rojewski@intel.com> 6 // Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com> 7 // 8 // Special thanks to: 9 // Krzysztof Hejmowski <krzysztof.hejmowski@intel.com> 10 // Michal Sienkiewicz <michal.sienkiewicz@intel.com> 11 // Filip Proborszcz 12 // 13 // for sharing Intel AudioDSP expertise and helping shape the very 14 // foundation of this driver 15 // 16 17 #include <linux/module.h> 18 #include <linux/pci.h> 19 #include <sound/hda_codec.h> 20 #include <sound/hda_i915.h> 21 #include <sound/hda_register.h> 22 #include <sound/hdaudio.h> 23 #include <sound/hdaudio_ext.h> 24 #include <sound/intel-dsp-config.h> 25 #include <sound/intel-nhlt.h> 26 #include "../../codecs/hda.h" 27 #include "avs.h" 28 #include "cldma.h" 29 30 static u32 pgctl_mask = AZX_PGCTL_LSRMD_MASK; 31 module_param(pgctl_mask, uint, 0444); 32 MODULE_PARM_DESC(pgctl_mask, "PCI PGCTL policy override"); 33 34 static u32 cgctl_mask = AZX_CGCTL_MISCBDCGE_MASK; 35 module_param(cgctl_mask, uint, 0444); 36 MODULE_PARM_DESC(cgctl_mask, "PCI CGCTL policy override"); 37 38 static void 39 avs_hda_update_config_dword(struct hdac_bus *bus, u32 reg, u32 mask, u32 value) 40 { 41 struct pci_dev *pci = to_pci_dev(bus->dev); 42 u32 data; 43 44 pci_read_config_dword(pci, reg, &data); 45 data &= ~mask; 46 data |= (value & mask); 47 pci_write_config_dword(pci, reg, data); 48 } 49 50 void avs_hda_power_gating_enable(struct avs_dev *adev, bool enable) 51 { 52 u32 value = enable ? 0 : pgctl_mask; 53 54 avs_hda_update_config_dword(&adev->base.core, AZX_PCIREG_PGCTL, pgctl_mask, value); 55 } 56 57 static void avs_hdac_clock_gating_enable(struct hdac_bus *bus, bool enable) 58 { 59 u32 value = enable ? cgctl_mask : 0; 60 61 avs_hda_update_config_dword(bus, AZX_PCIREG_CGCTL, cgctl_mask, value); 62 } 63 64 void avs_hda_clock_gating_enable(struct avs_dev *adev, bool enable) 65 { 66 avs_hdac_clock_gating_enable(&adev->base.core, enable); 67 } 68 69 void avs_hda_l1sen_enable(struct avs_dev *adev, bool enable) 70 { 71 u32 value = enable ? AZX_VS_EM2_L1SEN : 0; 72 73 snd_hdac_chip_updatel(&adev->base.core, VS_EM2, AZX_VS_EM2_L1SEN, value); 74 } 75 76 static int avs_hdac_bus_init_streams(struct hdac_bus *bus) 77 { 78 unsigned int cp_streams, pb_streams; 79 unsigned int gcap; 80 81 gcap = snd_hdac_chip_readw(bus, GCAP); 82 cp_streams = (gcap >> 8) & 0x0F; 83 pb_streams = (gcap >> 12) & 0x0F; 84 bus->num_streams = cp_streams + pb_streams; 85 86 snd_hdac_ext_stream_init_all(bus, 0, cp_streams, SNDRV_PCM_STREAM_CAPTURE); 87 snd_hdac_ext_stream_init_all(bus, cp_streams, pb_streams, SNDRV_PCM_STREAM_PLAYBACK); 88 89 return snd_hdac_bus_alloc_stream_pages(bus); 90 } 91 92 static bool avs_hdac_bus_init_chip(struct hdac_bus *bus, bool full_reset) 93 { 94 struct hdac_ext_link *hlink; 95 bool ret; 96 97 avs_hdac_clock_gating_enable(bus, false); 98 ret = snd_hdac_bus_init_chip(bus, full_reset); 99 100 /* Reset stream-to-link mapping */ 101 list_for_each_entry(hlink, &bus->hlink_list, list) 102 writel(0, hlink->ml_addr + AZX_REG_ML_LOSIDV); 103 104 avs_hdac_clock_gating_enable(bus, true); 105 106 /* Set DUM bit to address incorrect position reporting for capture 107 * streams. In order to do so, CTRL needs to be out of reset state 108 */ 109 snd_hdac_chip_updatel(bus, VS_EM2, AZX_VS_EM2_DUM, AZX_VS_EM2_DUM); 110 111 return ret; 112 } 113 114 static int probe_codec(struct hdac_bus *bus, int addr) 115 { 116 struct hda_codec *codec; 117 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) | 118 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID; 119 unsigned int res = -1; 120 int ret; 121 122 mutex_lock(&bus->cmd_mutex); 123 snd_hdac_bus_send_cmd(bus, cmd); 124 snd_hdac_bus_get_response(bus, addr, &res); 125 mutex_unlock(&bus->cmd_mutex); 126 if (res == -1) 127 return -EIO; 128 129 dev_dbg(bus->dev, "codec #%d probed OK: 0x%x\n", addr, res); 130 131 codec = snd_hda_codec_device_init(to_hda_bus(bus), addr, "hdaudioB%dD%d", bus->idx, addr); 132 if (IS_ERR(codec)) { 133 dev_err(bus->dev, "init codec failed: %ld\n", PTR_ERR(codec)); 134 return PTR_ERR(codec); 135 } 136 /* 137 * Allow avs_core suspend by forcing suspended state on all 138 * of its codec child devices. Component interested in 139 * dealing with hda codecs directly takes pm responsibilities 140 */ 141 pm_runtime_set_suspended(hda_codec_dev(codec)); 142 143 /* configure effectively creates new ASoC component */ 144 ret = snd_hda_codec_configure(codec); 145 if (ret < 0) { 146 dev_err(bus->dev, "failed to config codec %d\n", ret); 147 return ret; 148 } 149 150 return 0; 151 } 152 153 static void avs_hdac_bus_probe_codecs(struct hdac_bus *bus) 154 { 155 int c; 156 157 /* First try to probe all given codec slots */ 158 for (c = 0; c < HDA_MAX_CODECS; c++) { 159 if (!(bus->codec_mask & BIT(c))) 160 continue; 161 162 if (!probe_codec(bus, c)) 163 /* success, continue probing */ 164 continue; 165 166 /* 167 * Some BIOSen give you wrong codec addresses 168 * that don't exist 169 */ 170 dev_warn(bus->dev, "Codec #%d probe error; disabling it...\n", c); 171 bus->codec_mask &= ~BIT(c); 172 /* 173 * More badly, accessing to a non-existing 174 * codec often screws up the controller bus, 175 * and disturbs the further communications. 176 * Thus if an error occurs during probing, 177 * better to reset the controller bus to get 178 * back to the sanity state. 179 */ 180 snd_hdac_bus_stop_chip(bus); 181 avs_hdac_bus_init_chip(bus, true); 182 } 183 } 184 185 static void avs_hda_probe_work(struct work_struct *work) 186 { 187 struct avs_dev *adev = container_of(work, struct avs_dev, probe_work); 188 struct hdac_bus *bus = &adev->base.core; 189 struct hdac_ext_link *hlink; 190 int ret; 191 192 pm_runtime_set_active(bus->dev); /* clear runtime_error flag */ 193 194 ret = snd_hdac_i915_init(bus); 195 if (ret < 0) 196 dev_info(bus->dev, "i915 init unsuccessful: %d\n", ret); 197 198 snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, true); 199 avs_hdac_bus_init_chip(bus, true); 200 avs_hdac_bus_probe_codecs(bus); 201 snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false); 202 203 /* with all codecs probed, links can be powered down */ 204 list_for_each_entry(hlink, &bus->hlink_list, list) 205 snd_hdac_ext_bus_link_put(bus, hlink); 206 207 snd_hdac_ext_bus_ppcap_enable(bus, true); 208 snd_hdac_ext_bus_ppcap_int_enable(bus, true); 209 210 ret = avs_dsp_first_boot_firmware(adev); 211 if (ret < 0) 212 return; 213 214 adev->nhlt = intel_nhlt_init(adev->dev); 215 if (!adev->nhlt) 216 dev_info(bus->dev, "platform has no NHLT\n"); 217 avs_debugfs_init(adev); 218 219 avs_register_all_boards(adev); 220 221 /* configure PM */ 222 pm_runtime_set_autosuspend_delay(bus->dev, 2000); 223 pm_runtime_use_autosuspend(bus->dev); 224 pm_runtime_mark_last_busy(bus->dev); 225 pm_runtime_put_autosuspend(bus->dev); 226 pm_runtime_allow(bus->dev); 227 } 228 229 static void hdac_stream_update_pos(struct hdac_stream *stream, u64 buffer_size) 230 { 231 u64 prev_pos, pos, num_bytes; 232 233 div64_u64_rem(stream->curr_pos, buffer_size, &prev_pos); 234 pos = snd_hdac_stream_get_pos_posbuf(stream); 235 236 if (pos < prev_pos) 237 num_bytes = (buffer_size - prev_pos) + pos; 238 else 239 num_bytes = pos - prev_pos; 240 241 stream->curr_pos += num_bytes; 242 } 243 244 /* called from IRQ */ 245 static void hdac_update_stream(struct hdac_bus *bus, struct hdac_stream *stream) 246 { 247 if (stream->substream) { 248 snd_pcm_period_elapsed(stream->substream); 249 } else if (stream->cstream) { 250 u64 buffer_size = stream->cstream->runtime->buffer_size; 251 252 hdac_stream_update_pos(stream, buffer_size); 253 snd_compr_fragment_elapsed(stream->cstream); 254 } 255 } 256 257 static irqreturn_t hdac_bus_irq_handler(int irq, void *context) 258 { 259 struct hdac_bus *bus = context; 260 u32 mask, int_enable; 261 u32 status; 262 int ret = IRQ_NONE; 263 264 if (!pm_runtime_active(bus->dev)) 265 return ret; 266 267 spin_lock(&bus->reg_lock); 268 269 status = snd_hdac_chip_readl(bus, INTSTS); 270 if (status == 0 || status == UINT_MAX) { 271 spin_unlock(&bus->reg_lock); 272 return ret; 273 } 274 275 /* clear rirb int */ 276 status = snd_hdac_chip_readb(bus, RIRBSTS); 277 if (status & RIRB_INT_MASK) { 278 if (status & RIRB_INT_RESPONSE) 279 snd_hdac_bus_update_rirb(bus); 280 snd_hdac_chip_writeb(bus, RIRBSTS, RIRB_INT_MASK); 281 } 282 283 mask = (0x1 << bus->num_streams) - 1; 284 285 status = snd_hdac_chip_readl(bus, INTSTS); 286 status &= mask; 287 if (status) { 288 /* Disable stream interrupts; Re-enable in bottom half */ 289 int_enable = snd_hdac_chip_readl(bus, INTCTL); 290 snd_hdac_chip_writel(bus, INTCTL, (int_enable & (~mask))); 291 ret = IRQ_WAKE_THREAD; 292 } else { 293 ret = IRQ_HANDLED; 294 } 295 296 spin_unlock(&bus->reg_lock); 297 return ret; 298 } 299 300 static irqreturn_t hdac_bus_irq_thread(int irq, void *context) 301 { 302 struct hdac_bus *bus = context; 303 u32 status; 304 u32 int_enable; 305 u32 mask; 306 unsigned long flags; 307 308 status = snd_hdac_chip_readl(bus, INTSTS); 309 310 snd_hdac_bus_handle_stream_irq(bus, status, hdac_update_stream); 311 312 /* Re-enable stream interrupts */ 313 mask = (0x1 << bus->num_streams) - 1; 314 spin_lock_irqsave(&bus->reg_lock, flags); 315 int_enable = snd_hdac_chip_readl(bus, INTCTL); 316 snd_hdac_chip_writel(bus, INTCTL, (int_enable | mask)); 317 spin_unlock_irqrestore(&bus->reg_lock, flags); 318 319 return IRQ_HANDLED; 320 } 321 322 static int avs_hdac_acquire_irq(struct avs_dev *adev) 323 { 324 struct hdac_bus *bus = &adev->base.core; 325 struct pci_dev *pci = to_pci_dev(bus->dev); 326 int ret; 327 328 /* request one and check that we only got one interrupt */ 329 ret = pci_alloc_irq_vectors(pci, 1, 1, PCI_IRQ_MSI | PCI_IRQ_LEGACY); 330 if (ret != 1) { 331 dev_err(adev->dev, "Failed to allocate IRQ vector: %d\n", ret); 332 return ret; 333 } 334 335 ret = pci_request_irq(pci, 0, hdac_bus_irq_handler, hdac_bus_irq_thread, bus, 336 KBUILD_MODNAME); 337 if (ret < 0) { 338 dev_err(adev->dev, "Failed to request stream IRQ handler: %d\n", ret); 339 goto free_vector; 340 } 341 342 ret = pci_request_irq(pci, 0, avs_dsp_irq_handler, avs_dsp_irq_thread, adev, 343 KBUILD_MODNAME); 344 if (ret < 0) { 345 dev_err(adev->dev, "Failed to request IPC IRQ handler: %d\n", ret); 346 goto free_stream_irq; 347 } 348 349 return 0; 350 351 free_stream_irq: 352 pci_free_irq(pci, 0, bus); 353 free_vector: 354 pci_free_irq_vectors(pci); 355 return ret; 356 } 357 358 static int avs_bus_init(struct avs_dev *adev, struct pci_dev *pci, const struct pci_device_id *id) 359 { 360 struct hda_bus *bus = &adev->base; 361 struct avs_ipc *ipc; 362 struct device *dev = &pci->dev; 363 int ret; 364 365 ret = snd_hdac_ext_bus_init(&bus->core, dev, NULL, &soc_hda_ext_bus_ops); 366 if (ret < 0) 367 return ret; 368 369 bus->core.use_posbuf = 1; 370 bus->core.bdl_pos_adj = 0; 371 bus->core.sync_write = 1; 372 bus->pci = pci; 373 bus->mixer_assigned = -1; 374 mutex_init(&bus->prepare_mutex); 375 376 ipc = devm_kzalloc(dev, sizeof(*ipc), GFP_KERNEL); 377 if (!ipc) 378 return -ENOMEM; 379 ret = avs_ipc_init(ipc, dev); 380 if (ret < 0) 381 return ret; 382 383 adev->dev = dev; 384 adev->spec = (const struct avs_spec *)id->driver_data; 385 adev->ipc = ipc; 386 adev->hw_cfg.dsp_cores = hweight_long(AVS_MAIN_CORE_MASK); 387 INIT_WORK(&adev->probe_work, avs_hda_probe_work); 388 INIT_LIST_HEAD(&adev->comp_list); 389 INIT_LIST_HEAD(&adev->path_list); 390 INIT_LIST_HEAD(&adev->fw_list); 391 init_completion(&adev->fw_ready); 392 spin_lock_init(&adev->path_list_lock); 393 mutex_init(&adev->modres_mutex); 394 mutex_init(&adev->comp_list_mutex); 395 mutex_init(&adev->path_mutex); 396 397 return 0; 398 } 399 400 static int avs_pci_probe(struct pci_dev *pci, const struct pci_device_id *id) 401 { 402 struct hdac_bus *bus; 403 struct avs_dev *adev; 404 struct device *dev = &pci->dev; 405 int ret; 406 407 ret = snd_intel_dsp_driver_probe(pci); 408 if (ret != SND_INTEL_DSP_DRIVER_ANY && ret != SND_INTEL_DSP_DRIVER_AVS) 409 return -ENODEV; 410 411 ret = pcim_enable_device(pci); 412 if (ret < 0) 413 return ret; 414 415 adev = devm_kzalloc(dev, sizeof(*adev), GFP_KERNEL); 416 if (!adev) 417 return -ENOMEM; 418 ret = avs_bus_init(adev, pci, id); 419 if (ret < 0) { 420 dev_err(dev, "failed to init avs bus: %d\n", ret); 421 return ret; 422 } 423 424 ret = pci_request_regions(pci, "AVS HDAudio"); 425 if (ret < 0) 426 return ret; 427 428 bus = &adev->base.core; 429 bus->addr = pci_resource_start(pci, 0); 430 bus->remap_addr = pci_ioremap_bar(pci, 0); 431 if (!bus->remap_addr) { 432 dev_err(bus->dev, "ioremap error\n"); 433 ret = -ENXIO; 434 goto err_remap_bar0; 435 } 436 437 adev->dsp_ba = pci_ioremap_bar(pci, 4); 438 if (!adev->dsp_ba) { 439 dev_err(bus->dev, "ioremap error\n"); 440 ret = -ENXIO; 441 goto err_remap_bar4; 442 } 443 444 snd_hdac_bus_parse_capabilities(bus); 445 if (bus->mlcap) 446 snd_hdac_ext_bus_get_ml_capabilities(bus); 447 448 if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64))) 449 dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); 450 dma_set_max_seg_size(dev, UINT_MAX); 451 452 ret = avs_hdac_bus_init_streams(bus); 453 if (ret < 0) { 454 dev_err(dev, "failed to init streams: %d\n", ret); 455 goto err_init_streams; 456 } 457 458 ret = avs_hdac_acquire_irq(adev); 459 if (ret < 0) { 460 dev_err(bus->dev, "failed to acquire irq: %d\n", ret); 461 goto err_acquire_irq; 462 } 463 464 pci_set_master(pci); 465 pci_set_drvdata(pci, bus); 466 device_disable_async_suspend(dev); 467 468 schedule_work(&adev->probe_work); 469 470 return 0; 471 472 err_acquire_irq: 473 snd_hdac_bus_free_stream_pages(bus); 474 snd_hdac_ext_stream_free_all(bus); 475 err_init_streams: 476 iounmap(adev->dsp_ba); 477 err_remap_bar4: 478 iounmap(bus->remap_addr); 479 err_remap_bar0: 480 pci_release_regions(pci); 481 return ret; 482 } 483 484 static void avs_pci_remove(struct pci_dev *pci) 485 { 486 struct hdac_device *hdev, *save; 487 struct hdac_bus *bus = pci_get_drvdata(pci); 488 struct avs_dev *adev = hdac_to_avs(bus); 489 490 cancel_work_sync(&adev->probe_work); 491 avs_ipc_block(adev->ipc); 492 493 avs_unregister_all_boards(adev); 494 495 avs_debugfs_exit(adev); 496 if (adev->nhlt) 497 intel_nhlt_free(adev->nhlt); 498 499 if (avs_platattr_test(adev, CLDMA)) 500 hda_cldma_free(&code_loader); 501 502 snd_hdac_stop_streams_and_chip(bus); 503 avs_dsp_op(adev, int_control, false); 504 snd_hdac_ext_bus_ppcap_int_enable(bus, false); 505 506 /* it is safe to remove all codecs from the system now */ 507 list_for_each_entry_safe(hdev, save, &bus->codec_list, list) 508 snd_hda_codec_unregister(hdac_to_hda_codec(hdev)); 509 510 snd_hdac_bus_free_stream_pages(bus); 511 snd_hdac_ext_stream_free_all(bus); 512 /* reverse ml_capabilities */ 513 snd_hdac_ext_link_free_all(bus); 514 snd_hdac_ext_bus_exit(bus); 515 516 avs_dsp_core_disable(adev, GENMASK(adev->hw_cfg.dsp_cores - 1, 0)); 517 snd_hdac_ext_bus_ppcap_enable(bus, false); 518 519 /* snd_hdac_stop_streams_and_chip does that already? */ 520 snd_hdac_bus_stop_chip(bus); 521 snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false); 522 if (bus->audio_component) 523 snd_hdac_i915_exit(bus); 524 525 avs_module_info_free(adev); 526 pci_free_irq(pci, 0, adev); 527 pci_free_irq(pci, 0, bus); 528 pci_free_irq_vectors(pci); 529 iounmap(bus->remap_addr); 530 iounmap(adev->dsp_ba); 531 pci_release_regions(pci); 532 533 /* Firmware is not needed anymore */ 534 avs_release_firmwares(adev); 535 536 /* pm_runtime_forbid() can rpm_resume() which we do not want */ 537 pm_runtime_disable(&pci->dev); 538 pm_runtime_forbid(&pci->dev); 539 pm_runtime_enable(&pci->dev); 540 pm_runtime_get_noresume(&pci->dev); 541 } 542 543 static int avs_suspend_standby(struct avs_dev *adev) 544 { 545 struct hdac_bus *bus = &adev->base.core; 546 struct pci_dev *pci = adev->base.pci; 547 548 if (bus->cmd_dma_state) 549 snd_hdac_bus_stop_cmd_io(bus); 550 551 snd_hdac_ext_bus_link_power_down_all(bus); 552 553 enable_irq_wake(pci->irq); 554 pci_save_state(pci); 555 556 return 0; 557 } 558 559 static int __maybe_unused avs_suspend_common(struct avs_dev *adev, bool low_power) 560 { 561 struct hdac_bus *bus = &adev->base.core; 562 int ret; 563 564 flush_work(&adev->probe_work); 565 if (low_power && adev->num_lp_paths) 566 return avs_suspend_standby(adev); 567 568 snd_hdac_ext_bus_link_power_down_all(bus); 569 570 ret = avs_ipc_set_dx(adev, AVS_MAIN_CORE_MASK, false); 571 /* 572 * pm_runtime is blocked on DSP failure but system-wide suspend is not. 573 * Do not block entire system from suspending if that's the case. 574 */ 575 if (ret && ret != -EPERM) { 576 dev_err(adev->dev, "set dx failed: %d\n", ret); 577 return AVS_IPC_RET(ret); 578 } 579 580 avs_ipc_block(adev->ipc); 581 avs_dsp_op(adev, int_control, false); 582 snd_hdac_ext_bus_ppcap_int_enable(bus, false); 583 584 ret = avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK); 585 if (ret < 0) { 586 dev_err(adev->dev, "core_mask %ld disable failed: %d\n", AVS_MAIN_CORE_MASK, ret); 587 return ret; 588 } 589 590 snd_hdac_ext_bus_ppcap_enable(bus, false); 591 /* disable LP SRAM retention */ 592 avs_hda_power_gating_enable(adev, false); 593 snd_hdac_bus_stop_chip(bus); 594 /* disable CG when putting controller to reset */ 595 avs_hdac_clock_gating_enable(bus, false); 596 snd_hdac_bus_enter_link_reset(bus); 597 avs_hdac_clock_gating_enable(bus, true); 598 599 snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false); 600 601 return 0; 602 } 603 604 static int avs_resume_standby(struct avs_dev *adev) 605 { 606 struct hdac_bus *bus = &adev->base.core; 607 struct pci_dev *pci = adev->base.pci; 608 609 pci_restore_state(pci); 610 disable_irq_wake(pci->irq); 611 612 snd_hdac_ext_bus_link_power_up_all(bus); 613 614 if (bus->cmd_dma_state) 615 snd_hdac_bus_init_cmd_io(bus); 616 617 return 0; 618 } 619 620 static int __maybe_unused avs_resume_common(struct avs_dev *adev, bool low_power, bool purge) 621 { 622 struct hdac_bus *bus = &adev->base.core; 623 int ret; 624 625 if (low_power && adev->num_lp_paths) 626 return avs_resume_standby(adev); 627 628 snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, true); 629 avs_hdac_bus_init_chip(bus, true); 630 631 snd_hdac_ext_bus_ppcap_enable(bus, true); 632 snd_hdac_ext_bus_ppcap_int_enable(bus, true); 633 634 ret = avs_dsp_boot_firmware(adev, purge); 635 if (ret < 0) { 636 dev_err(adev->dev, "firmware boot failed: %d\n", ret); 637 return ret; 638 } 639 640 return 0; 641 } 642 643 static int __maybe_unused avs_suspend(struct device *dev) 644 { 645 return avs_suspend_common(to_avs_dev(dev), true); 646 } 647 648 static int __maybe_unused avs_resume(struct device *dev) 649 { 650 return avs_resume_common(to_avs_dev(dev), true, true); 651 } 652 653 static int __maybe_unused avs_runtime_suspend(struct device *dev) 654 { 655 return avs_suspend_common(to_avs_dev(dev), true); 656 } 657 658 static int __maybe_unused avs_runtime_resume(struct device *dev) 659 { 660 return avs_resume_common(to_avs_dev(dev), true, false); 661 } 662 663 static int __maybe_unused avs_freeze(struct device *dev) 664 { 665 return avs_suspend_common(to_avs_dev(dev), false); 666 } 667 static int __maybe_unused avs_thaw(struct device *dev) 668 { 669 return avs_resume_common(to_avs_dev(dev), false, true); 670 } 671 672 static int __maybe_unused avs_poweroff(struct device *dev) 673 { 674 return avs_suspend_common(to_avs_dev(dev), false); 675 } 676 677 static int __maybe_unused avs_restore(struct device *dev) 678 { 679 return avs_resume_common(to_avs_dev(dev), false, true); 680 } 681 682 static const struct dev_pm_ops avs_dev_pm = { 683 .suspend = avs_suspend, 684 .resume = avs_resume, 685 .freeze = avs_freeze, 686 .thaw = avs_thaw, 687 .poweroff = avs_poweroff, 688 .restore = avs_restore, 689 SET_RUNTIME_PM_OPS(avs_runtime_suspend, avs_runtime_resume, NULL) 690 }; 691 692 static const struct avs_spec skl_desc = { 693 .name = "skl", 694 .min_fw_version = { 695 .major = 9, 696 .minor = 21, 697 .hotfix = 0, 698 .build = 4732, 699 }, 700 .dsp_ops = &skl_dsp_ops, 701 .core_init_mask = 1, 702 .attributes = AVS_PLATATTR_CLDMA, 703 .sram_base_offset = SKL_ADSP_SRAM_BASE_OFFSET, 704 .sram_window_size = SKL_ADSP_SRAM_WINDOW_SIZE, 705 .rom_status = SKL_ADSP_SRAM_BASE_OFFSET, 706 }; 707 708 static const struct avs_spec apl_desc = { 709 .name = "apl", 710 .min_fw_version = { 711 .major = 9, 712 .minor = 22, 713 .hotfix = 1, 714 .build = 4323, 715 }, 716 .dsp_ops = &apl_dsp_ops, 717 .core_init_mask = 3, 718 .attributes = AVS_PLATATTR_IMR, 719 .sram_base_offset = APL_ADSP_SRAM_BASE_OFFSET, 720 .sram_window_size = APL_ADSP_SRAM_WINDOW_SIZE, 721 .rom_status = APL_ADSP_SRAM_BASE_OFFSET, 722 }; 723 724 static const struct pci_device_id avs_ids[] = { 725 { PCI_VDEVICE(INTEL, 0x9d70), (unsigned long)&skl_desc }, /* SKL */ 726 { PCI_VDEVICE(INTEL, 0xa170), (unsigned long)&skl_desc }, /* SKL-H */ 727 { PCI_VDEVICE(INTEL, 0x9d71), (unsigned long)&skl_desc }, /* KBL */ 728 { PCI_VDEVICE(INTEL, 0xa171), (unsigned long)&skl_desc }, /* KBL-H */ 729 { PCI_VDEVICE(INTEL, 0xa2f0), (unsigned long)&skl_desc }, /* KBL-S */ 730 { PCI_VDEVICE(INTEL, 0xa3f0), (unsigned long)&skl_desc }, /* CML-V */ 731 { PCI_VDEVICE(INTEL, 0x5a98), (unsigned long)&apl_desc }, /* APL */ 732 { PCI_VDEVICE(INTEL, 0x3198), (unsigned long)&apl_desc }, /* GML */ 733 { 0 } 734 }; 735 MODULE_DEVICE_TABLE(pci, avs_ids); 736 737 static struct pci_driver avs_pci_driver = { 738 .name = KBUILD_MODNAME, 739 .id_table = avs_ids, 740 .probe = avs_pci_probe, 741 .remove = avs_pci_remove, 742 .driver = { 743 .pm = &avs_dev_pm, 744 }, 745 }; 746 module_pci_driver(avs_pci_driver); 747 748 MODULE_AUTHOR("Cezary Rojewski <cezary.rojewski@intel.com>"); 749 MODULE_AUTHOR("Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>"); 750 MODULE_DESCRIPTION("Intel cAVS sound driver"); 751 MODULE_LICENSE("GPL"); 752