71
71
72
72
/* System */
73
73
#define TC_IDREG 0x0500
74
+ #define SYSSTAT 0x0508
74
75
#define SYSCTRL 0x0510
75
76
#define DP0_AUDSRC_NO_INPUT (0 << 3)
76
77
#define DP0_AUDSRC_I2S_RX (1 << 3)
79
80
#define DP0_VIDSRC_DPI_RX (2 << 0)
80
81
#define DP0_VIDSRC_COLOR_BAR (3 << 0)
81
82
#define GPIOM 0x0540
83
+ #define GPIOC 0x0544
84
+ #define GPIOO 0x0548
82
85
#define GPIOI 0x054c
83
86
#define INTCTL_G 0x0560
84
87
#define INTSTS_G 0x0564
88
+
89
+ #define INT_SYSERR BIT(16)
90
+ #define INT_GPIO_H (x ) (1 << (x == 0 ? 2 : 10))
91
+ #define INT_GPIO_LC (x ) (1 << (x == 0 ? 3 : 11))
92
+
85
93
#define INT_GP0_LCNT 0x0584
86
94
#define INT_GP1_LCNT 0x0588
87
95
@@ -219,6 +227,12 @@ struct tc_data {
219
227
struct gpio_desc * sd_gpio ;
220
228
struct gpio_desc * reset_gpio ;
221
229
struct clk * refclk ;
230
+
231
+ /* do we have IRQ */
232
+ bool have_irq ;
233
+
234
+ /* HPD pin number (0 or 1) or -ENODEV */
235
+ int hpd_pin ;
222
236
};
223
237
224
238
static inline struct tc_data * aux_to_tc (struct drm_dp_aux * a )
@@ -1109,6 +1123,12 @@ static void tc_bridge_enable(struct drm_bridge *bridge)
1109
1123
struct tc_data * tc = bridge_to_tc (bridge );
1110
1124
int ret ;
1111
1125
1126
+ ret = tc_get_display_props (tc );
1127
+ if (ret < 0 ) {
1128
+ dev_err (tc -> dev , "failed to read display props: %d\n" , ret );
1129
+ return ;
1130
+ }
1131
+
1112
1132
ret = tc_main_link_enable (tc );
1113
1133
if (ret < 0 ) {
1114
1134
dev_err (tc -> dev , "main link enable error: %d\n" , ret );
@@ -1221,19 +1241,40 @@ static int tc_connector_get_modes(struct drm_connector *connector)
1221
1241
return count ;
1222
1242
}
1223
1243
1224
- static void tc_connector_set_polling (struct tc_data * tc ,
1225
- struct drm_connector * connector )
1226
- {
1227
- /* TODO: add support for HPD */
1228
- connector -> polled = DRM_CONNECTOR_POLL_CONNECT |
1229
- DRM_CONNECTOR_POLL_DISCONNECT ;
1230
- }
1231
-
1232
1244
static const struct drm_connector_helper_funcs tc_connector_helper_funcs = {
1233
1245
.get_modes = tc_connector_get_modes ,
1234
1246
};
1235
1247
1248
+ static enum drm_connector_status tc_connector_detect (struct drm_connector * connector ,
1249
+ bool force )
1250
+ {
1251
+ struct tc_data * tc = connector_to_tc (connector );
1252
+ bool conn ;
1253
+ u32 val ;
1254
+ int ret ;
1255
+
1256
+ if (tc -> hpd_pin < 0 ) {
1257
+ if (tc -> panel )
1258
+ return connector_status_connected ;
1259
+ else
1260
+ return connector_status_unknown ;
1261
+ }
1262
+
1263
+ tc_read (GPIOI , & val );
1264
+
1265
+ conn = val & BIT (tc -> hpd_pin );
1266
+
1267
+ if (conn )
1268
+ return connector_status_connected ;
1269
+ else
1270
+ return connector_status_disconnected ;
1271
+
1272
+ err :
1273
+ return connector_status_unknown ;
1274
+ }
1275
+
1236
1276
static const struct drm_connector_funcs tc_connector_funcs = {
1277
+ .detect = tc_connector_detect ,
1237
1278
.fill_modes = drm_helper_probe_single_connector_modes ,
1238
1279
.destroy = drm_connector_cleanup ,
1239
1280
.reset = drm_atomic_helper_connector_reset ,
@@ -1248,14 +1289,23 @@ static int tc_bridge_attach(struct drm_bridge *bridge)
1248
1289
struct drm_device * drm = bridge -> dev ;
1249
1290
int ret ;
1250
1291
1251
- /* Create eDP connector */
1292
+ /* Create DP/ eDP connector */
1252
1293
drm_connector_helper_add (& tc -> connector , & tc_connector_helper_funcs );
1253
1294
ret = drm_connector_init (drm , & tc -> connector , & tc_connector_funcs ,
1254
1295
tc -> panel ? DRM_MODE_CONNECTOR_eDP :
1255
1296
DRM_MODE_CONNECTOR_DisplayPort );
1256
1297
if (ret )
1257
1298
return ret ;
1258
1299
1300
+ /* Don't poll if don't have HPD connected */
1301
+ if (tc -> hpd_pin >= 0 ) {
1302
+ if (tc -> have_irq )
1303
+ tc -> connector .polled = DRM_CONNECTOR_POLL_HPD ;
1304
+ else
1305
+ tc -> connector .polled = DRM_CONNECTOR_POLL_CONNECT |
1306
+ DRM_CONNECTOR_POLL_DISCONNECT ;
1307
+ }
1308
+
1259
1309
if (tc -> panel )
1260
1310
drm_panel_attach (tc -> panel , & tc -> connector );
1261
1311
@@ -1322,6 +1372,49 @@ static const struct regmap_config tc_regmap_config = {
1322
1372
.val_format_endian = REGMAP_ENDIAN_LITTLE ,
1323
1373
};
1324
1374
1375
+ static irqreturn_t tc_irq_handler (int irq , void * arg )
1376
+ {
1377
+ struct tc_data * tc = arg ;
1378
+ u32 val ;
1379
+ int r ;
1380
+
1381
+ r = regmap_read (tc -> regmap , INTSTS_G , & val );
1382
+ if (r )
1383
+ return IRQ_NONE ;
1384
+
1385
+ if (!val )
1386
+ return IRQ_NONE ;
1387
+
1388
+ if (val & INT_SYSERR ) {
1389
+ u32 stat = 0 ;
1390
+
1391
+ regmap_read (tc -> regmap , SYSSTAT , & stat );
1392
+
1393
+ dev_err (tc -> dev , "syserr %x\n" , stat );
1394
+ }
1395
+
1396
+ if (tc -> hpd_pin >= 0 && tc -> bridge .dev ) {
1397
+ /*
1398
+ * H is triggered when the GPIO goes high.
1399
+ *
1400
+ * LC is triggered when the GPIO goes low and stays low for
1401
+ * the duration of LCNT
1402
+ */
1403
+ bool h = val & INT_GPIO_H (tc -> hpd_pin );
1404
+ bool lc = val & INT_GPIO_LC (tc -> hpd_pin );
1405
+
1406
+ dev_dbg (tc -> dev , "GPIO%d: %s %s\n" , tc -> hpd_pin ,
1407
+ h ? "H" : "" , lc ? "LC" : "" );
1408
+
1409
+ if (h || lc )
1410
+ drm_kms_helper_hotplug_event (tc -> bridge .dev );
1411
+ }
1412
+
1413
+ regmap_write (tc -> regmap , INTSTS_G , val );
1414
+
1415
+ return IRQ_HANDLED ;
1416
+ }
1417
+
1325
1418
static int tc_probe (struct i2c_client * client , const struct i2c_device_id * id )
1326
1419
{
1327
1420
struct device * dev = & client -> dev ;
@@ -1373,6 +1466,33 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
1373
1466
return ret ;
1374
1467
}
1375
1468
1469
+ ret = of_property_read_u32 (dev -> of_node , "toshiba,hpd-pin" ,
1470
+ & tc -> hpd_pin );
1471
+ if (ret ) {
1472
+ tc -> hpd_pin = - ENODEV ;
1473
+ } else {
1474
+ if (tc -> hpd_pin < 0 || tc -> hpd_pin > 1 ) {
1475
+ dev_err (dev , "failed to parse HPD number\n" );
1476
+ return ret ;
1477
+ }
1478
+ }
1479
+
1480
+ if (client -> irq > 0 ) {
1481
+ /* enable SysErr */
1482
+ regmap_write (tc -> regmap , INTCTL_G , INT_SYSERR );
1483
+
1484
+ ret = devm_request_threaded_irq (dev , client -> irq ,
1485
+ NULL , tc_irq_handler ,
1486
+ IRQF_ONESHOT ,
1487
+ "tc358767-irq" , tc );
1488
+ if (ret ) {
1489
+ dev_err (dev , "failed to register dp interrupt\n" );
1490
+ return ret ;
1491
+ }
1492
+
1493
+ tc -> have_irq = true;
1494
+ }
1495
+
1376
1496
ret = regmap_read (tc -> regmap , TC_IDREG , & tc -> rev );
1377
1497
if (ret ) {
1378
1498
dev_err (tc -> dev , "can not read device ID: %d\n" , ret );
@@ -1386,6 +1506,22 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
1386
1506
1387
1507
tc -> assr = (tc -> rev == 0x6601 ); /* Enable ASSR for eDP panels */
1388
1508
1509
+ if (tc -> hpd_pin >= 0 ) {
1510
+ u32 lcnt_reg = tc -> hpd_pin == 0 ? INT_GP0_LCNT : INT_GP1_LCNT ;
1511
+ u32 h_lc = INT_GPIO_H (tc -> hpd_pin ) | INT_GPIO_LC (tc -> hpd_pin );
1512
+
1513
+ /* Set LCNT to 2ms */
1514
+ regmap_write (tc -> regmap , lcnt_reg ,
1515
+ clk_get_rate (tc -> refclk ) * 2 / 1000 );
1516
+ /* We need the "alternate" mode for HPD */
1517
+ regmap_write (tc -> regmap , GPIOM , BIT (tc -> hpd_pin ));
1518
+
1519
+ if (tc -> have_irq ) {
1520
+ /* enable H & LC */
1521
+ regmap_update_bits (tc -> regmap , INTCTL_G , h_lc , h_lc );
1522
+ }
1523
+ }
1524
+
1389
1525
ret = tc_aux_link_setup (tc );
1390
1526
if (ret )
1391
1527
return ret ;
@@ -1398,22 +1534,13 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
1398
1534
if (ret )
1399
1535
return ret ;
1400
1536
1401
- ret = tc_get_display_props (tc );
1402
- if (ret )
1403
- goto err_unregister_aux ;
1404
-
1405
- tc_connector_set_polling (tc , & tc -> connector );
1406
-
1407
1537
tc -> bridge .funcs = & tc_bridge_funcs ;
1408
1538
tc -> bridge .of_node = dev -> of_node ;
1409
1539
drm_bridge_add (& tc -> bridge );
1410
1540
1411
1541
i2c_set_clientdata (client , tc );
1412
1542
1413
1543
return 0 ;
1414
- err_unregister_aux :
1415
- drm_dp_aux_unregister (& tc -> aux );
1416
- return ret ;
1417
1544
}
1418
1545
1419
1546
static int tc_remove (struct i2c_client * client )
0 commit comments