@@ -1459,6 +1459,67 @@ static void wsa_macro_mclk_enable(struct wsa_macro *wsa, bool mclk_enable)
1459
1459
}
1460
1460
}
1461
1461
1462
+ static void wsa_macro_enable_disable_vi_sense (struct snd_soc_component * component , bool enable ,
1463
+ u32 tx_reg0 , u32 tx_reg1 , u32 val )
1464
+ {
1465
+ if (enable ) {
1466
+ /* Enable V&I sensing */
1467
+ snd_soc_component_update_bits (component , tx_reg0 ,
1468
+ CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1469
+ CDC_WSA_TX_SPKR_PROT_RESET );
1470
+ snd_soc_component_update_bits (component , tx_reg1 ,
1471
+ CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1472
+ CDC_WSA_TX_SPKR_PROT_RESET );
1473
+ snd_soc_component_update_bits (component , tx_reg0 ,
1474
+ CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK ,
1475
+ val );
1476
+ snd_soc_component_update_bits (component , tx_reg1 ,
1477
+ CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK ,
1478
+ val );
1479
+ snd_soc_component_update_bits (component , tx_reg0 ,
1480
+ CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK ,
1481
+ CDC_WSA_TX_SPKR_PROT_CLK_ENABLE );
1482
+ snd_soc_component_update_bits (component , tx_reg1 ,
1483
+ CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK ,
1484
+ CDC_WSA_TX_SPKR_PROT_CLK_ENABLE );
1485
+ snd_soc_component_update_bits (component , tx_reg0 ,
1486
+ CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1487
+ CDC_WSA_TX_SPKR_PROT_NO_RESET );
1488
+ snd_soc_component_update_bits (component , tx_reg1 ,
1489
+ CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1490
+ CDC_WSA_TX_SPKR_PROT_NO_RESET );
1491
+ } else {
1492
+ snd_soc_component_update_bits (component , tx_reg0 ,
1493
+ CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1494
+ CDC_WSA_TX_SPKR_PROT_RESET );
1495
+ snd_soc_component_update_bits (component , tx_reg1 ,
1496
+ CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1497
+ CDC_WSA_TX_SPKR_PROT_RESET );
1498
+ snd_soc_component_update_bits (component , tx_reg0 ,
1499
+ CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK ,
1500
+ CDC_WSA_TX_SPKR_PROT_CLK_DISABLE );
1501
+ snd_soc_component_update_bits (component , tx_reg1 ,
1502
+ CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK ,
1503
+ CDC_WSA_TX_SPKR_PROT_CLK_DISABLE );
1504
+ }
1505
+ }
1506
+
1507
+ static void wsa_macro_enable_disable_vi_feedback (struct snd_soc_component * component ,
1508
+ bool enable , u32 rate )
1509
+ {
1510
+ struct wsa_macro * wsa = snd_soc_component_get_drvdata (component );
1511
+
1512
+ if (test_bit (WSA_MACRO_TX0 , & wsa -> active_ch_mask [WSA_MACRO_AIF_VI ]))
1513
+ wsa_macro_enable_disable_vi_sense (component , enable ,
1514
+ CDC_WSA_TX0_SPKR_PROT_PATH_CTL ,
1515
+ CDC_WSA_TX1_SPKR_PROT_PATH_CTL , rate );
1516
+
1517
+ if (test_bit (WSA_MACRO_TX1 , & wsa -> active_ch_mask [WSA_MACRO_AIF_VI ]))
1518
+ wsa_macro_enable_disable_vi_sense (component , enable ,
1519
+ CDC_WSA_TX2_SPKR_PROT_PATH_CTL ,
1520
+ CDC_WSA_TX3_SPKR_PROT_PATH_CTL , rate );
1521
+ }
1522
+
1462
1523
static int wsa_macro_mclk_event (struct snd_soc_dapm_widget * w ,
1463
1524
struct snd_kcontrol * kcontrol , int event )
1464
1525
{
@@ -1475,7 +1536,6 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w,
1475
1536
{
1476
1537
struct snd_soc_component * component = snd_soc_dapm_to_component (w -> dapm );
1477
1538
struct wsa_macro * wsa = snd_soc_component_get_drvdata (component );
1478
- u32 tx_reg0 , tx_reg1 ;
1479
1539
u32 rate_val ;
1480
1540
1481
1541
switch (wsa -> pcm_rate_vi ) {
@@ -1499,56 +1559,14 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w,
1499
1559
break ;
1500
1560
}
1501
1561
1502
- if (test_bit (WSA_MACRO_TX0 , & wsa -> active_ch_mask [WSA_MACRO_AIF_VI ])) {
1503
- tx_reg0 = CDC_WSA_TX0_SPKR_PROT_PATH_CTL ;
1504
- tx_reg1 = CDC_WSA_TX1_SPKR_PROT_PATH_CTL ;
1505
- } else if (test_bit (WSA_MACRO_TX1 , & wsa -> active_ch_mask [WSA_MACRO_AIF_VI ])) {
1506
- tx_reg0 = CDC_WSA_TX2_SPKR_PROT_PATH_CTL ;
1507
- tx_reg1 = CDC_WSA_TX3_SPKR_PROT_PATH_CTL ;
1508
- }
1509
-
1510
1562
switch (event ) {
1511
1563
case SND_SOC_DAPM_POST_PMU :
1512
1564
/* Enable V&I sensing */
1513
- snd_soc_component_update_bits (component , tx_reg0 ,
1514
- CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1515
- CDC_WSA_TX_SPKR_PROT_RESET );
1516
- snd_soc_component_update_bits (component , tx_reg1 ,
1517
- CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1518
- CDC_WSA_TX_SPKR_PROT_RESET );
1519
- snd_soc_component_update_bits (component , tx_reg0 ,
1520
- CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK ,
1521
- rate_val );
1522
- snd_soc_component_update_bits (component , tx_reg1 ,
1523
- CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK ,
1524
- rate_val );
1525
- snd_soc_component_update_bits (component , tx_reg0 ,
1526
- CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK ,
1527
- CDC_WSA_TX_SPKR_PROT_CLK_ENABLE );
1528
- snd_soc_component_update_bits (component , tx_reg1 ,
1529
- CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK ,
1530
- CDC_WSA_TX_SPKR_PROT_CLK_ENABLE );
1531
- snd_soc_component_update_bits (component , tx_reg0 ,
1532
- CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1533
- CDC_WSA_TX_SPKR_PROT_NO_RESET );
1534
- snd_soc_component_update_bits (component , tx_reg1 ,
1535
- CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1536
- CDC_WSA_TX_SPKR_PROT_NO_RESET );
1565
+ wsa_macro_enable_disable_vi_feedback (component , true, rate_val );
1537
1566
break ;
1538
1567
case SND_SOC_DAPM_POST_PMD :
1539
1568
/* Disable V&I sensing */
1540
- snd_soc_component_update_bits (component , tx_reg0 ,
1541
- CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1542
- CDC_WSA_TX_SPKR_PROT_RESET );
1543
- snd_soc_component_update_bits (component , tx_reg1 ,
1544
- CDC_WSA_TX_SPKR_PROT_RESET_MASK ,
1545
- CDC_WSA_TX_SPKR_PROT_RESET );
1546
- snd_soc_component_update_bits (component , tx_reg0 ,
1547
- CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK ,
1548
- CDC_WSA_TX_SPKR_PROT_CLK_DISABLE );
1549
- snd_soc_component_update_bits (component , tx_reg1 ,
1550
- CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK ,
1551
- CDC_WSA_TX_SPKR_PROT_CLK_DISABLE );
1569
+ wsa_macro_enable_disable_vi_feedback (component , false, rate_val );
1552
1570
break ;
1553
1571
}
1554
1572
0 commit comments