@@ -296,18 +296,69 @@ static ssize_t kb_wake_angle_store(struct device *dev,
296
296
return count ;
297
297
}
298
298
299
+ static ssize_t usbpdmuxinfo_show (struct device * dev ,
300
+ struct device_attribute * attr ,
301
+ char * buf )
302
+ {
303
+ struct cros_ec_dev * ec = to_cros_ec_dev (dev );
304
+ ssize_t count = 0 ;
305
+ struct ec_response_usb_pd_ports resp_pd_ports ;
306
+ int ret ;
307
+ int i ;
308
+
309
+ ret = cros_ec_cmd (ec -> ec_dev , 0 , EC_CMD_USB_PD_PORTS , NULL , 0 ,
310
+ & resp_pd_ports , sizeof (resp_pd_ports ));
311
+ if (ret < 0 )
312
+ return - EIO ;
313
+
314
+ for (i = 0 ; i < resp_pd_ports .num_ports ; i ++ ) {
315
+ struct ec_response_usb_pd_mux_info resp_mux ;
316
+ struct ec_params_usb_pd_mux_info req = {
317
+ .port = i ,
318
+ };
319
+
320
+ ret = cros_ec_cmd (ec -> ec_dev , 0 , EC_CMD_USB_PD_MUX_INFO ,
321
+ & req , sizeof (req ), & resp_mux , sizeof (resp_mux ));
322
+
323
+ if (ret >= 0 ) {
324
+ count += sysfs_emit_at (buf , count , "Port %d:" , i );
325
+ count += sysfs_emit_at (buf , count , " USB=%d" ,
326
+ !!(resp_mux .flags & USB_PD_MUX_USB_ENABLED ));
327
+ count += sysfs_emit_at (buf , count , " DP=%d" ,
328
+ !!(resp_mux .flags & USB_PD_MUX_DP_ENABLED ));
329
+ count += sysfs_emit_at (buf , count , " POLARITY=%s" ,
330
+ (resp_mux .flags & USB_PD_MUX_POLARITY_INVERTED ) ?
331
+ "INVERTED" : "NORMAL" );
332
+ count += sysfs_emit_at (buf , count , " HPD_IRQ=%d" ,
333
+ !!(resp_mux .flags & USB_PD_MUX_HPD_IRQ ));
334
+ count += sysfs_emit_at (buf , count , " HPD_LVL=%d" ,
335
+ !!(resp_mux .flags & USB_PD_MUX_HPD_LVL ));
336
+ count += sysfs_emit_at (buf , count , " SAFE=%d" ,
337
+ !!(resp_mux .flags & USB_PD_MUX_SAFE_MODE ));
338
+ count += sysfs_emit_at (buf , count , " TBT=%d" ,
339
+ !!(resp_mux .flags & USB_PD_MUX_TBT_COMPAT_ENABLED ));
340
+ count += sysfs_emit_at (buf , count , " USB4=%d\n" ,
341
+ !!(resp_mux .flags & USB_PD_MUX_USB4_ENABLED ));
342
+ }
343
+ }
344
+
345
+ return count ? : - EIO ;
346
+ }
347
+
299
348
/* Module initialization */
300
349
301
350
static DEVICE_ATTR_RW (reboot );
302
351
static DEVICE_ATTR_RO (version );
303
352
static DEVICE_ATTR_RO (flashinfo );
304
353
static DEVICE_ATTR_RW (kb_wake_angle );
354
+ static DEVICE_ATTR_RO (usbpdmuxinfo );
305
355
306
356
static struct attribute * __ec_attrs [] = {
307
357
& dev_attr_kb_wake_angle .attr ,
308
358
& dev_attr_reboot .attr ,
309
359
& dev_attr_version .attr ,
310
360
& dev_attr_flashinfo .attr ,
361
+ & dev_attr_usbpdmuxinfo .attr ,
311
362
NULL ,
312
363
};
313
364
@@ -320,6 +371,13 @@ static umode_t cros_ec_ctrl_visible(struct kobject *kobj,
320
371
if (a == & dev_attr_kb_wake_angle .attr && !ec -> has_kb_wake_angle )
321
372
return 0 ;
322
373
374
+ if (a == & dev_attr_usbpdmuxinfo .attr ) {
375
+ struct cros_ec_platform * ec_platform = dev_get_platdata (ec -> dev );
376
+
377
+ if (strcmp (ec_platform -> ec_name , CROS_EC_DEV_NAME ))
378
+ return 0 ;
379
+ }
380
+
323
381
return a -> mode ;
324
382
}
325
383
0 commit comments