@@ -58,6 +58,7 @@ static void init_dma_descriptor(struct acp_dev_data *adata)
5858
5959 switch (acp_data -> pci_rev ) {
6060 case ACP70_PCI_ID :
61+ case ACP71_PCI_ID :
6162 acp_dma_desc_base_addr = ACP70_DMA_DESC_BASE_ADDR ;
6263 acp_dma_desc_max_num_dscr = ACP70_DMA_DESC_MAX_NUM_DSCR ;
6364 break ;
@@ -97,6 +98,7 @@ static int config_dma_channel(struct acp_dev_data *adata, unsigned int ch,
9798
9899 switch (acp_data -> pci_rev ) {
99100 case ACP70_PCI_ID :
101+ case ACP71_PCI_ID :
100102 acp_dma_cntl_0 = ACP70_DMA_CNTL_0 ;
101103 acp_dma_ch_rst_sts = ACP70_DMA_CH_RST_STS ;
102104 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)
336338
337339 switch (adata -> pci_rev ) {
338340 case ACP70_PCI_ID :
341+ case ACP71_PCI_ID :
339342 acp_dma_ch_sts = ACP70_DMA_CH_STS ;
340343 break ;
341344 default :
@@ -383,6 +386,69 @@ static int acp_memory_init(struct snd_sof_dev *sdev)
383386 return 0 ;
384387}
385388
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+
386452static irqreturn_t acp_irq_thread (int irq , void * context )
387453{
388454 struct snd_sof_dev * sdev = context ;
@@ -415,7 +481,7 @@ static irqreturn_t acp_irq_handler(int irq, void *dev_id)
415481 struct acp_dev_data * adata = sdev -> pdata -> hw_pdata ;
416482 unsigned int base = desc -> dsp_intr_base ;
417483 unsigned int val ;
418- int irq_flag = 0 ;
484+ int irq_flag = 0 , wake_irq_flag = 0 ;
419485
420486 val = snd_sof_dsp_read (sdev , ACP_DSP_BAR , base + DSP_SW_INTR_STAT_OFFSET );
421487 if (val & ACP_DSP_TO_HOST_IRQ ) {
@@ -453,8 +519,14 @@ static irqreturn_t acp_irq_handler(int irq, void *dev_id)
453519 schedule_work (& amd_manager -> amd_sdw_irq_thread );
454520 irq_flag = 1 ;
455521 }
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+ }
456528 }
457- if (irq_flag )
529+ if (irq_flag || wake_irq_flag )
458530 return IRQ_HANDLED ;
459531 else
460532 return IRQ_NONE ;
@@ -486,6 +558,7 @@ static int acp_power_on(struct snd_sof_dev *sdev)
486558 acp_pgfsm_cntl_mask = ACP6X_PGFSM_CNTL_POWER_ON_MASK ;
487559 break ;
488560 case ACP70_PCI_ID :
561+ case ACP71_PCI_ID :
489562 acp_pgfsm_status_mask = ACP70_PGFSM_STATUS_MASK ;
490563 acp_pgfsm_cntl_mask = ACP70_PGFSM_CNTL_POWER_ON_MASK ;
491564 break ;
@@ -507,7 +580,6 @@ static int acp_power_on(struct snd_sof_dev *sdev)
507580
508581static int acp_reset (struct snd_sof_dev * sdev )
509582{
510- const struct sof_amd_acp_desc * desc = get_chip_info (sdev -> pdata );
511583 unsigned int val ;
512584 int ret ;
513585
@@ -528,14 +600,6 @@ static int acp_reset(struct snd_sof_dev *sdev)
528600 if (ret < 0 )
529601 dev_err (sdev -> dev , "timeout in releasing reset\n" );
530602
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 );
539603 return ret ;
540604}
541605
@@ -566,9 +630,13 @@ static int acp_dsp_reset(struct snd_sof_dev *sdev)
566630
567631static int acp_init (struct snd_sof_dev * sdev )
568632{
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 ;
569636 int ret ;
570637
571638 /* power on */
639+ acp_data = sdev -> pdata -> hw_pdata ;
572640 ret = acp_power_on (sdev );
573641 if (ret ) {
574642 dev_err (sdev -> dev , "ACP power on failed\n" );
@@ -577,7 +645,32 @@ static int acp_init(struct snd_sof_dev *sdev)
577645
578646 snd_sof_dsp_write (sdev , ACP_DSP_BAR , ACP_CONTROL , 0x01 );
579647 /* 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 ;
581674}
582675
583676static 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)
616709 dev_err (sdev -> dev , "ACP Reset failed\n" );
617710 return ret ;
618711 }
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 :
620715 enable = true;
716+ break ;
717+ }
621718 snd_sof_dsp_write (sdev , ACP_DSP_BAR , ACP_CONTROL , enable );
622719
623720 return 0 ;
@@ -637,9 +734,15 @@ int amd_sof_acp_resume(struct snd_sof_dev *sdev)
637734 return ret ;
638735 }
639736 return acp_memory_init (sdev );
640- } else {
641- return acp_dsp_reset (sdev );
642737 }
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 );
643746}
644747EXPORT_SYMBOL_NS (amd_sof_acp_resume , "SND_SOC_SOF_AMD_COMMON" );
645748
0 commit comments