@@ -58,6 +58,7 @@ static void init_dma_descriptor(struct acp_dev_data *adata)
58
58
59
59
switch (acp_data -> pci_rev ) {
60
60
case ACP70_PCI_ID :
61
+ case ACP71_PCI_ID :
61
62
acp_dma_desc_base_addr = ACP70_DMA_DESC_BASE_ADDR ;
62
63
acp_dma_desc_max_num_dscr = ACP70_DMA_DESC_MAX_NUM_DSCR ;
63
64
break ;
@@ -97,6 +98,7 @@ static int config_dma_channel(struct acp_dev_data *adata, unsigned int ch,
97
98
98
99
switch (acp_data -> pci_rev ) {
99
100
case ACP70_PCI_ID :
101
+ case ACP71_PCI_ID :
100
102
acp_dma_cntl_0 = ACP70_DMA_CNTL_0 ;
101
103
acp_dma_ch_rst_sts = ACP70_DMA_CH_RST_STS ;
102
104
acp_dma_dscr_err_sts_0 = ACP70_DMA_ERR_STS_0 ;
@@ -336,6 +338,7 @@ int acp_dma_status(struct acp_dev_data *adata, unsigned char ch)
336
338
337
339
switch (adata -> pci_rev ) {
338
340
case ACP70_PCI_ID :
341
+ case ACP71_PCI_ID :
339
342
acp_dma_ch_sts = ACP70_DMA_CH_STS ;
340
343
break ;
341
344
default :
@@ -383,6 +386,69 @@ static int acp_memory_init(struct snd_sof_dev *sdev)
383
386
return 0 ;
384
387
}
385
388
389
+ static void amd_sof_handle_acp70_sdw_wake_event (struct acp_dev_data * adata )
390
+ {
391
+ struct amd_sdw_manager * amd_manager ;
392
+
393
+ if (adata -> acp70_sdw0_wake_event ) {
394
+ amd_manager = dev_get_drvdata (& adata -> sdw -> pdev [0 ]-> dev );
395
+ if (amd_manager )
396
+ pm_request_resume (amd_manager -> dev );
397
+ adata -> acp70_sdw0_wake_event = 0 ;
398
+ }
399
+
400
+ if (adata -> acp70_sdw1_wake_event ) {
401
+ amd_manager = dev_get_drvdata (& adata -> sdw -> pdev [1 ]-> dev );
402
+ if (amd_manager )
403
+ pm_request_resume (amd_manager -> dev );
404
+ adata -> acp70_sdw1_wake_event = 0 ;
405
+ }
406
+ }
407
+
408
+ static int amd_sof_check_and_handle_acp70_sdw_wake_irq (struct snd_sof_dev * sdev )
409
+ {
410
+ const struct sof_amd_acp_desc * desc = get_chip_info (sdev -> pdata );
411
+ struct acp_dev_data * adata = sdev -> pdata -> hw_pdata ;
412
+ u32 ext_intr_stat1 ;
413
+ int irq_flag = 0 ;
414
+ bool sdw_wake_irq = false;
415
+
416
+ ext_intr_stat1 = snd_sof_dsp_read (sdev , ACP_DSP_BAR , desc -> ext_intr_stat1 );
417
+ if (ext_intr_stat1 & ACP70_SDW0_HOST_WAKE_STAT ) {
418
+ snd_sof_dsp_write (sdev , ACP_DSP_BAR , desc -> ext_intr_stat1 ,
419
+ ACP70_SDW0_HOST_WAKE_STAT );
420
+ adata -> acp70_sdw0_wake_event = true;
421
+ sdw_wake_irq = true;
422
+ }
423
+
424
+ if (ext_intr_stat1 & ACP70_SDW1_HOST_WAKE_STAT ) {
425
+ snd_sof_dsp_write (sdev , ACP_DSP_BAR , desc -> ext_intr_stat1 ,
426
+ ACP70_SDW1_HOST_WAKE_STAT );
427
+ adata -> acp70_sdw1_wake_event = true;
428
+ sdw_wake_irq = true;
429
+ }
430
+
431
+ if (ext_intr_stat1 & ACP70_SDW0_PME_STAT ) {
432
+ snd_sof_dsp_write (sdev , ACP_DSP_BAR , ACP70_SW0_WAKE_EN , 0 );
433
+ snd_sof_dsp_write (sdev , ACP_DSP_BAR , desc -> ext_intr_stat1 , ACP70_SDW0_PME_STAT );
434
+ adata -> acp70_sdw0_wake_event = true;
435
+ sdw_wake_irq = true;
436
+ }
437
+
438
+ if (ext_intr_stat1 & ACP70_SDW1_PME_STAT ) {
439
+ snd_sof_dsp_write (sdev , ACP_DSP_BAR , ACP70_SW1_WAKE_EN , 0 );
440
+ snd_sof_dsp_write (sdev , ACP_DSP_BAR , desc -> ext_intr_stat1 , ACP70_SDW1_PME_STAT );
441
+ adata -> acp70_sdw1_wake_event = true;
442
+ sdw_wake_irq = true;
443
+ }
444
+
445
+ if (sdw_wake_irq ) {
446
+ amd_sof_handle_acp70_sdw_wake_event (adata );
447
+ irq_flag = 1 ;
448
+ }
449
+ return irq_flag ;
450
+ }
451
+
386
452
static irqreturn_t acp_irq_thread (int irq , void * context )
387
453
{
388
454
struct snd_sof_dev * sdev = context ;
@@ -415,7 +481,7 @@ static irqreturn_t acp_irq_handler(int irq, void *dev_id)
415
481
struct acp_dev_data * adata = sdev -> pdata -> hw_pdata ;
416
482
unsigned int base = desc -> dsp_intr_base ;
417
483
unsigned int val ;
418
- int irq_flag = 0 ;
484
+ int irq_flag = 0 , wake_irq_flag = 0 ;
419
485
420
486
val = snd_sof_dsp_read (sdev , ACP_DSP_BAR , base + DSP_SW_INTR_STAT_OFFSET );
421
487
if (val & ACP_DSP_TO_HOST_IRQ ) {
@@ -453,8 +519,14 @@ static irqreturn_t acp_irq_handler(int irq, void *dev_id)
453
519
schedule_work (& amd_manager -> amd_sdw_irq_thread );
454
520
irq_flag = 1 ;
455
521
}
522
+ switch (adata -> pci_rev ) {
523
+ case ACP70_PCI_ID :
524
+ case ACP71_PCI_ID :
525
+ wake_irq_flag = amd_sof_check_and_handle_acp70_sdw_wake_irq (sdev );
526
+ break ;
527
+ }
456
528
}
457
- if (irq_flag )
529
+ if (irq_flag || wake_irq_flag )
458
530
return IRQ_HANDLED ;
459
531
else
460
532
return IRQ_NONE ;
@@ -486,6 +558,7 @@ static int acp_power_on(struct snd_sof_dev *sdev)
486
558
acp_pgfsm_cntl_mask = ACP6X_PGFSM_CNTL_POWER_ON_MASK ;
487
559
break ;
488
560
case ACP70_PCI_ID :
561
+ case ACP71_PCI_ID :
489
562
acp_pgfsm_status_mask = ACP70_PGFSM_STATUS_MASK ;
490
563
acp_pgfsm_cntl_mask = ACP70_PGFSM_CNTL_POWER_ON_MASK ;
491
564
break ;
@@ -507,7 +580,6 @@ static int acp_power_on(struct snd_sof_dev *sdev)
507
580
508
581
static int acp_reset (struct snd_sof_dev * sdev )
509
582
{
510
- const struct sof_amd_acp_desc * desc = get_chip_info (sdev -> pdata );
511
583
unsigned int val ;
512
584
int ret ;
513
585
@@ -528,14 +600,6 @@ static int acp_reset(struct snd_sof_dev *sdev)
528
600
if (ret < 0 )
529
601
dev_err (sdev -> dev , "timeout in releasing reset\n" );
530
602
531
- if (desc -> acp_clkmux_sel )
532
- snd_sof_dsp_write (sdev , ACP_DSP_BAR , desc -> acp_clkmux_sel , ACP_CLOCK_ACLK );
533
-
534
- if (desc -> ext_intr_enb )
535
- snd_sof_dsp_write (sdev , ACP_DSP_BAR , desc -> ext_intr_enb , 0x01 );
536
-
537
- if (desc -> ext_intr_cntl )
538
- snd_sof_dsp_write (sdev , ACP_DSP_BAR , desc -> ext_intr_cntl , ACP_ERROR_IRQ_MASK );
539
603
return ret ;
540
604
}
541
605
@@ -566,9 +630,13 @@ static int acp_dsp_reset(struct snd_sof_dev *sdev)
566
630
567
631
static int acp_init (struct snd_sof_dev * sdev )
568
632
{
633
+ const struct sof_amd_acp_desc * desc = get_chip_info (sdev -> pdata );
634
+ struct acp_dev_data * acp_data ;
635
+ unsigned int sdw0_wake_en , sdw1_wake_en ;
569
636
int ret ;
570
637
571
638
/* power on */
639
+ acp_data = sdev -> pdata -> hw_pdata ;
572
640
ret = acp_power_on (sdev );
573
641
if (ret ) {
574
642
dev_err (sdev -> dev , "ACP power on failed\n" );
@@ -577,7 +645,32 @@ static int acp_init(struct snd_sof_dev *sdev)
577
645
578
646
snd_sof_dsp_write (sdev , ACP_DSP_BAR , ACP_CONTROL , 0x01 );
579
647
/* Reset */
580
- return acp_reset (sdev );
648
+ ret = acp_reset (sdev );
649
+ if (ret )
650
+ return ret ;
651
+
652
+ if (desc -> acp_clkmux_sel )
653
+ snd_sof_dsp_write (sdev , ACP_DSP_BAR , desc -> acp_clkmux_sel , ACP_CLOCK_ACLK );
654
+
655
+ if (desc -> ext_intr_enb )
656
+ snd_sof_dsp_write (sdev , ACP_DSP_BAR , desc -> ext_intr_enb , 0x01 );
657
+
658
+ if (desc -> ext_intr_cntl )
659
+ snd_sof_dsp_write (sdev , ACP_DSP_BAR , desc -> ext_intr_cntl , ACP_ERROR_IRQ_MASK );
660
+
661
+ switch (acp_data -> pci_rev ) {
662
+ case ACP70_PCI_ID :
663
+ case ACP71_PCI_ID :
664
+ sdw0_wake_en = snd_sof_dsp_read (sdev , ACP_DSP_BAR , ACP70_SW0_WAKE_EN );
665
+ sdw1_wake_en = snd_sof_dsp_read (sdev , ACP_DSP_BAR , ACP70_SW1_WAKE_EN );
666
+ if (sdw0_wake_en || sdw1_wake_en )
667
+ snd_sof_dsp_update_bits (sdev , ACP_DSP_BAR , ACP70_EXTERNAL_INTR_CNTL1 ,
668
+ ACP70_SDW_HOST_WAKE_MASK , ACP70_SDW_HOST_WAKE_MASK );
669
+
670
+ snd_sof_dsp_write (sdev , ACP_DSP_BAR , ACP70_PME_EN , 1 );
671
+ break ;
672
+ }
673
+ return 0 ;
581
674
}
582
675
583
676
static bool check_acp_sdw_enable_status (struct snd_sof_dev * sdev )
@@ -616,8 +709,12 @@ int amd_sof_acp_suspend(struct snd_sof_dev *sdev, u32 target_state)
616
709
dev_err (sdev -> dev , "ACP Reset failed\n" );
617
710
return ret ;
618
711
}
619
- if (acp_data -> pci_rev == ACP70_PCI_ID )
712
+ switch (acp_data -> pci_rev ) {
713
+ case ACP70_PCI_ID :
714
+ case ACP71_PCI_ID :
620
715
enable = true;
716
+ break ;
717
+ }
621
718
snd_sof_dsp_write (sdev , ACP_DSP_BAR , ACP_CONTROL , enable );
622
719
623
720
return 0 ;
@@ -637,9 +734,15 @@ int amd_sof_acp_resume(struct snd_sof_dev *sdev)
637
734
return ret ;
638
735
}
639
736
return acp_memory_init (sdev );
640
- } else {
641
- return acp_dsp_reset (sdev );
642
737
}
738
+ switch (acp_data -> pci_rev ) {
739
+ case ACP70_PCI_ID :
740
+ case ACP71_PCI_ID :
741
+ snd_sof_dsp_write (sdev , ACP_DSP_BAR , ACP70_PME_EN , 1 );
742
+ break ;
743
+ }
744
+
745
+ return acp_dsp_reset (sdev );
643
746
}
644
747
EXPORT_SYMBOL_NS (amd_sof_acp_resume , "SND_SOC_SOF_AMD_COMMON" );
645
748
0 commit comments