@@ -335,6 +335,7 @@ struct dwc3_msm {
335
335
dma_addr_t dummy_gsi_db_dma ;
336
336
u64 * dummy_gevntcnt ;
337
337
dma_addr_t dummy_gevntcnt_dma ;
338
+ bool usb_data_enabled ;
338
339
};
339
340
340
341
#define USB_HSPHY_3P3_VOL_MIN 3050000 /* uV */
@@ -3243,6 +3244,9 @@ static int dwc3_msm_id_notifier(struct notifier_block *nb,
3243
3244
struct dwc3 * dwc = platform_get_drvdata (mdwc -> dwc3 );
3244
3245
enum dwc3_id_state id ;
3245
3246
3247
+ if (!mdwc -> usb_data_enabled )
3248
+ return NOTIFY_DONE ;
3249
+
3246
3250
id = event ? DWC3_ID_GROUND : DWC3_ID_FLOAT ;
3247
3251
3248
3252
dev_dbg (mdwc -> dev , "host:%ld (id:%d) event received\n" , event , id );
@@ -3301,6 +3305,9 @@ static int dwc3_msm_vbus_notifier(struct notifier_block *nb,
3301
3305
struct dwc3_msm * mdwc = container_of (nb , struct dwc3_msm , vbus_nb );
3302
3306
struct dwc3 * dwc = platform_get_drvdata (mdwc -> dwc3 );
3303
3307
3308
+ if (!mdwc -> usb_data_enabled )
3309
+ return NOTIFY_DONE ;
3310
+
3304
3311
dev_dbg (mdwc -> dev , "vbus:%ld event received\n" , event );
3305
3312
3306
3313
if (mdwc -> vbus_active == event )
@@ -3642,9 +3649,35 @@ static ssize_t xhci_link_compliance_store(struct device *dev,
3642
3649
3643
3650
return ret ;
3644
3651
}
3645
-
3646
3652
static DEVICE_ATTR_RW (xhci_link_compliance );
3647
3653
3654
+ static ssize_t usb_data_enabled_show (struct device * dev ,
3655
+ struct device_attribute * attr , char * buf )
3656
+ {
3657
+ struct dwc3_msm * mdwc = dev_get_drvdata (dev );
3658
+
3659
+ return sysfs_emit (buf , "%s\n" ,
3660
+ mdwc -> usb_data_enabled ? "enabled" : "disabled" );
3661
+ }
3662
+
3663
+ static ssize_t usb_data_enabled_store (struct device * dev ,
3664
+ struct device_attribute * attr , const char * buf , size_t count )
3665
+ {
3666
+ struct dwc3_msm * mdwc = dev_get_drvdata (dev );
3667
+
3668
+ if (kstrtobool (buf , & mdwc -> usb_data_enabled ))
3669
+ return - EINVAL ;
3670
+
3671
+ if (!mdwc -> usb_data_enabled ) {
3672
+ mdwc -> vbus_active = false;
3673
+ mdwc -> id_state = DWC3_ID_FLOAT ;
3674
+ dwc3_ext_event_notify (mdwc );
3675
+ }
3676
+
3677
+ return count ;
3678
+ }
3679
+ static DEVICE_ATTR_RW (usb_data_enabled );
3680
+
3648
3681
static int dwc3_msm_probe (struct platform_device * pdev )
3649
3682
{
3650
3683
struct device_node * node = pdev -> dev .of_node , * dwc3_node ;
@@ -4002,10 +4035,13 @@ static int dwc3_msm_probe(struct platform_device *pdev)
4002
4035
dev_info (mdwc -> dev , "charger detection in progress\n" );
4003
4036
}
4004
4037
4038
+ /* set the initial value */
4039
+ mdwc -> usb_data_enabled = true;
4005
4040
device_create_file (& pdev -> dev , & dev_attr_mode );
4006
4041
device_create_file (& pdev -> dev , & dev_attr_speed );
4007
4042
device_create_file (& pdev -> dev , & dev_attr_usb_compliance_mode );
4008
4043
device_create_file (& pdev -> dev , & dev_attr_xhci_link_compliance );
4044
+ device_create_file (& pdev -> dev , & dev_attr_usb_data_enabled );
4009
4045
4010
4046
host_mode = usb_get_dr_mode (& mdwc -> dwc3 -> dev ) == USB_DR_MODE_HOST ;
4011
4047
if (!dwc -> is_drd && host_mode ) {
@@ -4046,6 +4082,8 @@ static int dwc3_msm_remove(struct platform_device *pdev)
4046
4082
4047
4083
device_remove_file (& pdev -> dev , & dev_attr_mode );
4048
4084
device_remove_file (& pdev -> dev , & dev_attr_xhci_link_compliance );
4085
+ device_create_file (& pdev -> dev , & dev_attr_usb_data_enabled );
4086
+
4049
4087
if (mdwc -> usb_psy )
4050
4088
power_supply_put (mdwc -> usb_psy );
4051
4089
0 commit comments