@@ -1319,6 +1319,169 @@ static struct exynos_hdmi_display_ops display_ops = {
1319
1319
.power_on = hdmi_display_power_on ,
1320
1320
};
1321
1321
1322
+ static void hdmi_set_acr (u32 freq , u8 * acr )
1323
+ {
1324
+ u32 n , cts ;
1325
+
1326
+ switch (freq ) {
1327
+ case 32000 :
1328
+ n = 4096 ;
1329
+ cts = 27000 ;
1330
+ break ;
1331
+ case 44100 :
1332
+ n = 6272 ;
1333
+ cts = 30000 ;
1334
+ break ;
1335
+ case 88200 :
1336
+ n = 12544 ;
1337
+ cts = 30000 ;
1338
+ break ;
1339
+ case 176400 :
1340
+ n = 25088 ;
1341
+ cts = 30000 ;
1342
+ break ;
1343
+ case 48000 :
1344
+ n = 6144 ;
1345
+ cts = 27000 ;
1346
+ break ;
1347
+ case 96000 :
1348
+ n = 12288 ;
1349
+ cts = 27000 ;
1350
+ break ;
1351
+ case 192000 :
1352
+ n = 24576 ;
1353
+ cts = 27000 ;
1354
+ break ;
1355
+ default :
1356
+ n = 0 ;
1357
+ cts = 0 ;
1358
+ break ;
1359
+ }
1360
+
1361
+ acr [1 ] = cts >> 16 ;
1362
+ acr [2 ] = cts >> 8 & 0xff ;
1363
+ acr [3 ] = cts & 0xff ;
1364
+
1365
+ acr [4 ] = n >> 16 ;
1366
+ acr [5 ] = n >> 8 & 0xff ;
1367
+ acr [6 ] = n & 0xff ;
1368
+ }
1369
+
1370
+ static void hdmi_reg_acr (struct hdmi_context * hdata , u8 * acr )
1371
+ {
1372
+ hdmi_reg_writeb (hdata , HDMI_ACR_N0 , acr [6 ]);
1373
+ hdmi_reg_writeb (hdata , HDMI_ACR_N1 , acr [5 ]);
1374
+ hdmi_reg_writeb (hdata , HDMI_ACR_N2 , acr [4 ]);
1375
+ hdmi_reg_writeb (hdata , HDMI_ACR_MCTS0 , acr [3 ]);
1376
+ hdmi_reg_writeb (hdata , HDMI_ACR_MCTS1 , acr [2 ]);
1377
+ hdmi_reg_writeb (hdata , HDMI_ACR_MCTS2 , acr [1 ]);
1378
+ hdmi_reg_writeb (hdata , HDMI_ACR_CTS0 , acr [3 ]);
1379
+ hdmi_reg_writeb (hdata , HDMI_ACR_CTS1 , acr [2 ]);
1380
+ hdmi_reg_writeb (hdata , HDMI_ACR_CTS2 , acr [1 ]);
1381
+
1382
+ if (hdata -> is_v13 )
1383
+ hdmi_reg_writeb (hdata , HDMI_V13_ACR_CON , 4 );
1384
+ else
1385
+ hdmi_reg_writeb (hdata , HDMI_ACR_CON , 4 );
1386
+ }
1387
+
1388
+ static void hdmi_audio_init (struct hdmi_context * hdata )
1389
+ {
1390
+ u32 sample_rate , bits_per_sample , frame_size_code ;
1391
+ u32 data_num , bit_ch , sample_frq ;
1392
+ u32 val ;
1393
+ u8 acr [7 ];
1394
+
1395
+ sample_rate = 44100 ;
1396
+ bits_per_sample = 16 ;
1397
+ frame_size_code = 0 ;
1398
+
1399
+ switch (bits_per_sample ) {
1400
+ case 20 :
1401
+ data_num = 2 ;
1402
+ bit_ch = 1 ;
1403
+ break ;
1404
+ case 24 :
1405
+ data_num = 3 ;
1406
+ bit_ch = 1 ;
1407
+ break ;
1408
+ default :
1409
+ data_num = 1 ;
1410
+ bit_ch = 0 ;
1411
+ break ;
1412
+ }
1413
+
1414
+ hdmi_set_acr (sample_rate , acr );
1415
+ hdmi_reg_acr (hdata , acr );
1416
+
1417
+ hdmi_reg_writeb (hdata , HDMI_I2S_MUX_CON , HDMI_I2S_IN_DISABLE
1418
+ | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
1419
+ | HDMI_I2S_MUX_ENABLE );
1420
+
1421
+ hdmi_reg_writeb (hdata , HDMI_I2S_MUX_CH , HDMI_I2S_CH0_EN
1422
+ | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN );
1423
+
1424
+ hdmi_reg_writeb (hdata , HDMI_I2S_MUX_CUV , HDMI_I2S_CUV_RL_EN );
1425
+
1426
+ sample_frq = (sample_rate == 44100 ) ? 0 :
1427
+ (sample_rate == 48000 ) ? 2 :
1428
+ (sample_rate == 32000 ) ? 3 :
1429
+ (sample_rate == 96000 ) ? 0xa : 0x0 ;
1430
+
1431
+ hdmi_reg_writeb (hdata , HDMI_I2S_CLK_CON , HDMI_I2S_CLK_DIS );
1432
+ hdmi_reg_writeb (hdata , HDMI_I2S_CLK_CON , HDMI_I2S_CLK_EN );
1433
+
1434
+ val = hdmi_reg_read (hdata , HDMI_I2S_DSD_CON ) | 0x01 ;
1435
+ hdmi_reg_writeb (hdata , HDMI_I2S_DSD_CON , val );
1436
+
1437
+ /* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
1438
+ hdmi_reg_writeb (hdata , HDMI_I2S_PIN_SEL_0 , HDMI_I2S_SEL_SCLK (5 )
1439
+ | HDMI_I2S_SEL_LRCK (6 ));
1440
+ hdmi_reg_writeb (hdata , HDMI_I2S_PIN_SEL_1 , HDMI_I2S_SEL_SDATA1 (1 )
1441
+ | HDMI_I2S_SEL_SDATA2 (4 ));
1442
+ hdmi_reg_writeb (hdata , HDMI_I2S_PIN_SEL_2 , HDMI_I2S_SEL_SDATA3 (1 )
1443
+ | HDMI_I2S_SEL_SDATA2 (2 ));
1444
+ hdmi_reg_writeb (hdata , HDMI_I2S_PIN_SEL_3 , HDMI_I2S_SEL_DSD (0 ));
1445
+
1446
+ /* I2S_CON_1 & 2 */
1447
+ hdmi_reg_writeb (hdata , HDMI_I2S_CON_1 , HDMI_I2S_SCLK_FALLING_EDGE
1448
+ | HDMI_I2S_L_CH_LOW_POL );
1449
+ hdmi_reg_writeb (hdata , HDMI_I2S_CON_2 , HDMI_I2S_MSB_FIRST_MODE
1450
+ | HDMI_I2S_SET_BIT_CH (bit_ch )
1451
+ | HDMI_I2S_SET_SDATA_BIT (data_num )
1452
+ | HDMI_I2S_BASIC_FORMAT );
1453
+
1454
+ /* Configure register related to CUV information */
1455
+ hdmi_reg_writeb (hdata , HDMI_I2S_CH_ST_0 , HDMI_I2S_CH_STATUS_MODE_0
1456
+ | HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH
1457
+ | HDMI_I2S_COPYRIGHT
1458
+ | HDMI_I2S_LINEAR_PCM
1459
+ | HDMI_I2S_CONSUMER_FORMAT );
1460
+ hdmi_reg_writeb (hdata , HDMI_I2S_CH_ST_1 , HDMI_I2S_CD_PLAYER );
1461
+ hdmi_reg_writeb (hdata , HDMI_I2S_CH_ST_2 , HDMI_I2S_SET_SOURCE_NUM (0 ));
1462
+ hdmi_reg_writeb (hdata , HDMI_I2S_CH_ST_3 , HDMI_I2S_CLK_ACCUR_LEVEL_2
1463
+ | HDMI_I2S_SET_SMP_FREQ (sample_frq ));
1464
+ hdmi_reg_writeb (hdata , HDMI_I2S_CH_ST_4 ,
1465
+ HDMI_I2S_ORG_SMP_FREQ_44_1
1466
+ | HDMI_I2S_WORD_LEN_MAX24_24BITS
1467
+ | HDMI_I2S_WORD_LEN_MAX_24BITS );
1468
+
1469
+ hdmi_reg_writeb (hdata , HDMI_I2S_CH_ST_CON , HDMI_I2S_CH_STATUS_RELOAD );
1470
+ }
1471
+
1472
+ static void hdmi_audio_control (struct hdmi_context * hdata , bool onoff )
1473
+ {
1474
+ u32 mod ;
1475
+
1476
+ mod = hdmi_reg_read (hdata , HDMI_MODE_SEL );
1477
+ if (mod & HDMI_DVI_MODE_EN )
1478
+ return ;
1479
+
1480
+ hdmi_reg_writeb (hdata , HDMI_AUI_CON , onoff ? 2 : 0 );
1481
+ hdmi_reg_writemask (hdata , HDMI_CON_0 , onoff ?
1482
+ HDMI_ASP_EN : HDMI_ASP_DIS , HDMI_ASP_MASK );
1483
+ }
1484
+
1322
1485
static void hdmi_conf_reset (struct hdmi_context * hdata )
1323
1486
{
1324
1487
u32 reg ;
@@ -1737,9 +1900,11 @@ static void hdmi_conf_apply(struct hdmi_context *hdata)
1737
1900
1738
1901
hdmi_conf_reset (hdata );
1739
1902
hdmi_conf_init (hdata );
1903
+ hdmi_audio_init (hdata );
1740
1904
1741
1905
/* setting core registers */
1742
1906
hdmi_timing_apply (hdata );
1907
+ hdmi_audio_control (hdata , true);
1743
1908
1744
1909
hdmi_regs_dump (hdata , "start" );
1745
1910
}
@@ -1825,6 +1990,7 @@ static void hdmi_disable(void *ctx)
1825
1990
DRM_DEBUG_KMS ("[%d] %s\n" , __LINE__ , __func__ );
1826
1991
1827
1992
if (hdata -> enabled ) {
1993
+ hdmi_audio_control (hdata , false);
1828
1994
hdmiphy_conf_reset (hdata );
1829
1995
hdmi_conf_reset (hdata );
1830
1996
}
@@ -1983,6 +2149,7 @@ static void hdmi_resource_poweron(struct hdmi_context *hdata)
1983
2149
hdmiphy_conf_reset (hdata );
1984
2150
hdmi_conf_reset (hdata );
1985
2151
hdmi_conf_init (hdata );
2152
+ hdmi_audio_init (hdata );
1986
2153
}
1987
2154
1988
2155
static void hdmi_resource_poweroff (struct hdmi_context * hdata )
0 commit comments