@@ -124,9 +124,12 @@ static int cdx_unregister_device(struct device *dev,
124124 void * data )
125125{
126126 struct cdx_device * cdx_dev = to_cdx_device (dev );
127+ struct cdx_controller * cdx = cdx_dev -> cdx ;
127128
128129 if (cdx_dev -> is_bus ) {
129130 device_for_each_child (dev , NULL , cdx_unregister_device );
131+ if (cdx_dev -> enabled && cdx -> ops -> bus_disable )
132+ cdx -> ops -> bus_disable (cdx , cdx_dev -> bus_num );
130133 } else {
131134 kfree (cdx_dev -> driver_override );
132135 cdx_dev -> driver_override = NULL ;
@@ -383,6 +386,41 @@ static ssize_t driver_override_show(struct device *dev,
383386}
384387static DEVICE_ATTR_RW (driver_override );
385388
389+ static ssize_t enable_store (struct device * dev , struct device_attribute * attr ,
390+ const char * buf , size_t count )
391+ {
392+ struct cdx_device * cdx_dev = to_cdx_device (dev );
393+ struct cdx_controller * cdx = cdx_dev -> cdx ;
394+ bool enable ;
395+ int ret ;
396+
397+ if (kstrtobool (buf , & enable ) < 0 )
398+ return - EINVAL ;
399+
400+ if (enable == cdx_dev -> enabled )
401+ return count ;
402+
403+ if (enable && cdx -> ops -> bus_enable )
404+ ret = cdx -> ops -> bus_enable (cdx , cdx_dev -> bus_num );
405+ else if (!enable && cdx -> ops -> bus_disable )
406+ ret = cdx -> ops -> bus_disable (cdx , cdx_dev -> bus_num );
407+ else
408+ ret = - EOPNOTSUPP ;
409+
410+ if (!ret )
411+ cdx_dev -> enabled = enable ;
412+
413+ return ret < 0 ? ret : count ;
414+ }
415+
416+ static ssize_t enable_show (struct device * dev , struct device_attribute * attr , char * buf )
417+ {
418+ struct cdx_device * cdx_dev = to_cdx_device (dev );
419+
420+ return sysfs_emit (buf , "%u\n" , cdx_dev -> enabled );
421+ }
422+ static DEVICE_ATTR_RW (enable );
423+
386424static umode_t cdx_dev_attrs_are_visible (struct kobject * kobj , struct attribute * a , int n )
387425{
388426 struct device * dev = kobj_to_dev (kobj );
@@ -395,6 +433,18 @@ static umode_t cdx_dev_attrs_are_visible(struct kobject *kobj, struct attribute
395433 return 0 ;
396434}
397435
436+ static umode_t cdx_bus_attrs_are_visible (struct kobject * kobj , struct attribute * a , int n )
437+ {
438+ struct device * dev = kobj_to_dev (kobj );
439+ struct cdx_device * cdx_dev ;
440+
441+ cdx_dev = to_cdx_device (dev );
442+ if (cdx_dev -> is_bus )
443+ return a -> mode ;
444+
445+ return 0 ;
446+ }
447+
398448static struct attribute * cdx_dev_attrs [] = {
399449 & dev_attr_remove .attr ,
400450 & dev_attr_reset .attr ,
@@ -409,8 +459,19 @@ static const struct attribute_group cdx_dev_group = {
409459 .is_visible = cdx_dev_attrs_are_visible ,
410460};
411461
462+ static struct attribute * cdx_bus_dev_attrs [] = {
463+ & dev_attr_enable .attr ,
464+ NULL ,
465+ };
466+
467+ static const struct attribute_group cdx_bus_dev_group = {
468+ .attrs = cdx_bus_dev_attrs ,
469+ .is_visible = cdx_bus_attrs_are_visible ,
470+ };
471+
412472static const struct attribute_group * cdx_dev_groups [] = {
413473 & cdx_dev_group ,
474+ & cdx_bus_dev_group ,
414475 NULL ,
415476};
416477
@@ -588,8 +649,19 @@ struct device *cdx_bus_add(struct cdx_controller *cdx, u8 bus_num)
588649 goto device_add_fail ;
589650 }
590651
652+ if (cdx -> ops -> bus_enable ) {
653+ ret = cdx -> ops -> bus_enable (cdx , bus_num );
654+ if (ret && ret != - EALREADY ) {
655+ dev_err (cdx -> dev , "cdx bus enable failed: %d\n" , ret );
656+ goto bus_enable_fail ;
657+ }
658+ }
659+
660+ cdx_dev -> enabled = true;
591661 return & cdx_dev -> dev ;
592662
663+ bus_enable_fail :
664+ device_del (& cdx_dev -> dev );
593665device_add_fail :
594666 put_device (& cdx_dev -> dev );
595667
0 commit comments