@@ -125,8 +125,13 @@ static int cdx_unregister_device(struct device *dev,
125
125
{
126
126
struct cdx_device * cdx_dev = to_cdx_device (dev );
127
127
128
- kfree (cdx_dev -> driver_override );
129
- cdx_dev -> driver_override = NULL ;
128
+ if (cdx_dev -> is_bus ) {
129
+ device_for_each_child (dev , NULL , cdx_unregister_device );
130
+ } else {
131
+ kfree (cdx_dev -> driver_override );
132
+ cdx_dev -> driver_override = NULL ;
133
+ }
134
+
130
135
/*
131
136
* Do not free cdx_dev here as it would be freed in
132
137
* cdx_device_release() called from within put_device().
@@ -201,6 +206,9 @@ static int cdx_bus_match(struct device *dev, struct device_driver *drv)
201
206
const struct cdx_device_id * found_id = NULL ;
202
207
const struct cdx_device_id * ids ;
203
208
209
+ if (cdx_dev -> is_bus )
210
+ return false;
211
+
204
212
ids = cdx_drv -> match_id_table ;
205
213
206
214
/* When driver_override is set, only bind to the matching driver */
@@ -265,10 +273,11 @@ static int cdx_dma_configure(struct device *dev)
265
273
{
266
274
struct cdx_driver * cdx_drv = to_cdx_driver (dev -> driver );
267
275
struct cdx_device * cdx_dev = to_cdx_device (dev );
276
+ struct cdx_controller * cdx = cdx_dev -> cdx ;
268
277
u32 input_id = cdx_dev -> req_id ;
269
278
int ret ;
270
279
271
- ret = of_dma_configure_id (dev , dev -> parent -> of_node , 0 , & input_id );
280
+ ret = of_dma_configure_id (dev , cdx -> dev -> of_node , 0 , & input_id );
272
281
if (ret && ret != - EPROBE_DEFER ) {
273
282
dev_err (dev , "of_dma_configure_id() failed\n" );
274
283
return ret ;
@@ -374,6 +383,18 @@ static ssize_t driver_override_show(struct device *dev,
374
383
}
375
384
static DEVICE_ATTR_RW (driver_override );
376
385
386
+ static umode_t cdx_dev_attrs_are_visible (struct kobject * kobj , struct attribute * a , int n )
387
+ {
388
+ struct device * dev = kobj_to_dev (kobj );
389
+ struct cdx_device * cdx_dev ;
390
+
391
+ cdx_dev = to_cdx_device (dev );
392
+ if (!cdx_dev -> is_bus )
393
+ return a -> mode ;
394
+
395
+ return 0 ;
396
+ }
397
+
377
398
static struct attribute * cdx_dev_attrs [] = {
378
399
& dev_attr_remove .attr ,
379
400
& dev_attr_reset .attr ,
@@ -382,7 +403,16 @@ static struct attribute *cdx_dev_attrs[] = {
382
403
& dev_attr_driver_override .attr ,
383
404
NULL ,
384
405
};
385
- ATTRIBUTE_GROUPS (cdx_dev );
406
+
407
+ static const struct attribute_group cdx_dev_group = {
408
+ .attrs = cdx_dev_attrs ,
409
+ .is_visible = cdx_dev_attrs_are_visible ,
410
+ };
411
+
412
+ static const struct attribute_group * cdx_dev_groups [] = {
413
+ & cdx_dev_group ,
414
+ NULL ,
415
+ };
386
416
387
417
static ssize_t rescan_store (const struct bus_type * bus ,
388
418
const char * buf , size_t count )
@@ -479,7 +509,6 @@ static void cdx_device_release(struct device *dev)
479
509
int cdx_device_add (struct cdx_dev_params * dev_params )
480
510
{
481
511
struct cdx_controller * cdx = dev_params -> cdx ;
482
- struct device * parent = cdx -> dev ;
483
512
struct cdx_device * cdx_dev ;
484
513
int ret ;
485
514
@@ -503,7 +532,7 @@ int cdx_device_add(struct cdx_dev_params *dev_params)
503
532
504
533
/* Initialize generic device */
505
534
device_initialize (& cdx_dev -> dev );
506
- cdx_dev -> dev .parent = parent ;
535
+ cdx_dev -> dev .parent = dev_params -> parent ;
507
536
cdx_dev -> dev .bus = & cdx_bus_type ;
508
537
cdx_dev -> dev .dma_mask = & cdx_dev -> dma_mask ;
509
538
cdx_dev -> dev .release = cdx_device_release ;
@@ -532,6 +561,42 @@ int cdx_device_add(struct cdx_dev_params *dev_params)
532
561
}
533
562
EXPORT_SYMBOL_NS_GPL (cdx_device_add , CDX_BUS_CONTROLLER );
534
563
564
+ struct device * cdx_bus_add (struct cdx_controller * cdx , u8 bus_num )
565
+ {
566
+ struct cdx_device * cdx_dev ;
567
+ int ret ;
568
+
569
+ cdx_dev = kzalloc (sizeof (* cdx_dev ), GFP_KERNEL );
570
+ if (!cdx_dev )
571
+ return NULL ;
572
+
573
+ device_initialize (& cdx_dev -> dev );
574
+ cdx_dev -> cdx = cdx ;
575
+
576
+ cdx_dev -> dev .parent = cdx -> dev ;
577
+ cdx_dev -> dev .bus = & cdx_bus_type ;
578
+ cdx_dev -> dev .release = cdx_device_release ;
579
+ cdx_dev -> is_bus = true;
580
+ cdx_dev -> bus_num = bus_num ;
581
+
582
+ dev_set_name (& cdx_dev -> dev , "cdx-%02x" ,
583
+ ((cdx -> id << CDX_CONTROLLER_ID_SHIFT ) | (bus_num & CDX_BUS_NUM_MASK )));
584
+
585
+ ret = device_add (& cdx_dev -> dev );
586
+ if (ret ) {
587
+ dev_err (& cdx_dev -> dev , "cdx bus device add failed: %d\n" , ret );
588
+ goto device_add_fail ;
589
+ }
590
+
591
+ return & cdx_dev -> dev ;
592
+
593
+ device_add_fail :
594
+ put_device (& cdx_dev -> dev );
595
+
596
+ return NULL ;
597
+ }
598
+ EXPORT_SYMBOL_NS_GPL (cdx_bus_add , CDX_BUS_CONTROLLER );
599
+
535
600
int cdx_register_controller (struct cdx_controller * cdx )
536
601
{
537
602
int ret ;
0 commit comments