@@ -89,6 +89,9 @@ struct pmic_glink_ucsi {
8989 bool pd_running ;
9090
9191 u8 read_buf [UCSI_BUF_V2_SIZE ];
92+
93+ /* Wakeup timeout in ms; configurable via sysfs wakeup_timeout_ms */
94+ unsigned int wakeup_timeout_ms ;
9295};
9396
9497static int pmic_glink_ucsi_read (struct ucsi * __ucsi , unsigned int offset ,
@@ -339,6 +342,41 @@ static void pmic_glink_ucsi_register(struct work_struct *work)
339342 }
340343}
341344
345+ static ssize_t wakeup_timeout_ms_show (struct device * dev ,
346+ struct device_attribute * attr , char * buf )
347+ {
348+ struct pmic_glink_ucsi * ucsi = dev_get_drvdata (dev );
349+
350+ return sysfs_emit (buf , "%u\n" , READ_ONCE (ucsi -> wakeup_timeout_ms ));
351+ }
352+
353+ static ssize_t wakeup_timeout_ms_store (struct device * dev ,
354+ struct device_attribute * attr ,
355+ const char * buf , size_t count )
356+ {
357+ struct pmic_glink_ucsi * ucsi = dev_get_drvdata (dev );
358+ unsigned int val ;
359+ int ret ;
360+
361+ ret = kstrtouint (buf , 10 , & val );
362+ if (ret )
363+ return ret ;
364+
365+ WRITE_ONCE (ucsi -> wakeup_timeout_ms , val );
366+ return count ;
367+ }
368+
369+ static DEVICE_ATTR_RW (wakeup_timeout_ms );
370+
371+ static struct attribute * pmic_glink_ucsi_attrs [] = {
372+ & dev_attr_wakeup_timeout_ms .attr ,
373+ NULL ,
374+ };
375+
376+ static const struct attribute_group pmic_glink_ucsi_attr_group = {
377+ .attrs = pmic_glink_ucsi_attrs ,
378+ };
379+
342380static void pmic_glink_ucsi_callback (const void * data , size_t len , void * priv )
343381{
344382 struct pmic_glink_ucsi * ucsi = priv ;
@@ -352,7 +390,7 @@ static void pmic_glink_ucsi_callback(const void *data, size_t len, void *priv)
352390 pmic_glink_ucsi_write_ack (ucsi , data , len );
353391 break ;
354392 case UC_UCSI_USBC_NOTIFY_IND :
355- pm_wakeup_event (ucsi -> dev , UCSI_GLINK_WAKEUP_TIMEOUT_MS );
393+ pm_wakeup_event (ucsi -> dev , READ_ONCE ( ucsi -> wakeup_timeout_ms ) );
356394 schedule_work (& ucsi -> notify_work );
357395 break ;
358396 }
@@ -413,6 +451,11 @@ static int pmic_glink_ucsi_probe(struct auxiliary_device *adev,
413451 dev_set_drvdata (dev , ucsi );
414452
415453 device_init_wakeup (dev , true);
454+ ucsi -> wakeup_timeout_ms = UCSI_GLINK_WAKEUP_TIMEOUT_MS ;
455+
456+ ret = devm_device_add_group (dev , & pmic_glink_ucsi_attr_group );
457+ if (ret )
458+ return ret ;
416459
417460 INIT_WORK (& ucsi -> notify_work , pmic_glink_ucsi_notify );
418461 INIT_WORK (& ucsi -> register_work , pmic_glink_ucsi_register );
0 commit comments