@@ -88,7 +88,7 @@ struct gpio_desc *gpio_to_desc(unsigned gpio)
88
88
if (gdev -> chip -> base <= gpio &&
89
89
gdev -> chip -> base + gdev -> chip -> ngpio > gpio ) {
90
90
spin_unlock_irqrestore (& gpio_lock , flags );
91
- return & gdev -> chip -> desc [gpio - gdev -> chip -> base ];
91
+ return & gdev -> descs [gpio - gdev -> chip -> base ];
92
92
}
93
93
}
94
94
@@ -110,7 +110,7 @@ struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip,
110
110
if (hwnum >= chip -> ngpio )
111
111
return ERR_PTR (- EINVAL );
112
112
113
- return & chip -> desc [hwnum ];
113
+ return & chip -> gpiodev -> descs [hwnum ];
114
114
}
115
115
116
116
/**
@@ -120,7 +120,7 @@ struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip,
120
120
*/
121
121
int desc_to_gpio (const struct gpio_desc * desc )
122
122
{
123
- return desc -> chip -> base + (desc - & desc -> chip -> desc [0 ]);
123
+ return desc -> chip -> base + (desc - & desc -> chip -> gpiodev -> descs [0 ]);
124
124
}
125
125
EXPORT_SYMBOL_GPL (desc_to_gpio );
126
126
@@ -277,7 +277,7 @@ static struct gpio_desc *gpio_name_to_desc(const char * const name)
277
277
int i ;
278
278
279
279
for (i = 0 ; i != gdev -> chip -> ngpio ; ++ i ) {
280
- struct gpio_desc * gpio = & gdev -> chip -> desc [i ];
280
+ struct gpio_desc * gpio = & gdev -> descs [i ];
281
281
282
282
if (!gpio -> name || !name )
283
283
continue ;
@@ -320,7 +320,7 @@ static int gpiochip_set_desc_names(struct gpio_chip *gc)
320
320
321
321
/* Then add all names to the GPIO descriptors */
322
322
for (i = 0 ; i != gc -> ngpio ; ++ i )
323
- gc -> desc [i ].name = gc -> names [i ];
323
+ gc -> gpiodev -> descs [i ].name = gc -> names [i ];
324
324
325
325
return 0 ;
326
326
}
@@ -431,7 +431,6 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data)
431
431
int status = 0 ;
432
432
unsigned i ;
433
433
int base = chip -> base ;
434
- struct gpio_desc * descs ;
435
434
struct gpio_device * gdev ;
436
435
437
436
/*
@@ -470,9 +469,9 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data)
470
469
else
471
470
gdev -> owner = THIS_MODULE ;
472
471
473
- /* FIXME: devm_kcalloc() these and move to gpio_device */
474
- descs = kcalloc ( chip -> ngpio , sizeof (descs [0 ]), GFP_KERNEL );
475
- if (!descs ) {
472
+ gdev -> descs = devm_kcalloc (& gdev -> dev , chip -> ngpio ,
473
+ sizeof (gdev -> descs [0 ]), GFP_KERNEL );
474
+ if (!gdev -> descs ) {
476
475
status = - ENOMEM ;
477
476
goto err_free_gdev ;
478
477
}
@@ -483,7 +482,7 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data)
483
482
if (chip -> ngpio == 0 ) {
484
483
chip_err (chip , "tried to insert a GPIO chip with zero lines\n" );
485
484
status = - EINVAL ;
486
- goto err_free_descs ;
485
+ goto err_free_gdev ;
487
486
}
488
487
489
488
spin_lock_irqsave (& gpio_lock , flags );
@@ -493,19 +492,19 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data)
493
492
if (base < 0 ) {
494
493
status = base ;
495
494
spin_unlock_irqrestore (& gpio_lock , flags );
496
- goto err_free_descs ;
495
+ goto err_free_gdev ;
497
496
}
498
497
chip -> base = base ;
499
498
}
500
499
501
500
status = gpiodev_add_to_list (gdev );
502
501
if (status ) {
503
502
spin_unlock_irqrestore (& gpio_lock , flags );
504
- goto err_free_descs ;
503
+ goto err_free_gdev ;
505
504
}
506
505
507
506
for (i = 0 ; i < chip -> ngpio ; i ++ ) {
508
- struct gpio_desc * desc = & descs [i ];
507
+ struct gpio_desc * desc = & gdev -> descs [i ];
509
508
510
509
/* REVISIT: maybe a pointer to gpio_device is better */
511
510
desc -> chip = chip ;
@@ -518,7 +517,6 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data)
518
517
*/
519
518
desc -> flags = !chip -> direction_input ? (1 << FLAG_IS_OUT ) : 0 ;
520
519
}
521
- chip -> desc = descs ;
522
520
523
521
spin_unlock_irqrestore (& gpio_lock , flags );
524
522
@@ -583,9 +581,6 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data)
583
581
spin_lock_irqsave (& gpio_lock , flags );
584
582
list_del (& gdev -> list );
585
583
spin_unlock_irqrestore (& gpio_lock , flags );
586
- chip -> desc = NULL ;
587
- err_free_descs :
588
- kfree (descs );
589
584
err_free_gdev :
590
585
ida_simple_remove (& gpio_ida , gdev -> id );
591
586
kfree (gdev );
@@ -608,7 +603,7 @@ void gpiochip_remove(struct gpio_chip *chip)
608
603
struct gpio_device * gdev = chip -> gpiodev ;
609
604
struct gpio_desc * desc ;
610
605
unsigned long flags ;
611
- unsigned id ;
606
+ unsigned i ;
612
607
bool requested = false;
613
608
614
609
/* Numb the device, cancelling all outstanding operations */
@@ -623,8 +618,8 @@ void gpiochip_remove(struct gpio_chip *chip)
623
618
of_gpiochip_remove (chip );
624
619
625
620
spin_lock_irqsave (& gpio_lock , flags );
626
- for (id = 0 ; id < chip -> ngpio ; id ++ ) {
627
- desc = & chip -> desc [ id ];
621
+ for (i = 0 ; i < chip -> ngpio ; i ++ ) {
622
+ desc = & gdev -> descs [ i ];
628
623
desc -> chip = NULL ;
629
624
if (test_bit (FLAG_REQUESTED , & desc -> flags ))
630
625
requested = true;
@@ -635,10 +630,6 @@ void gpiochip_remove(struct gpio_chip *chip)
635
630
dev_crit (& chip -> gpiodev -> dev ,
636
631
"REMOVING GPIOCHIP WITH GPIOS STILL REQUESTED\n" );
637
632
638
- /* FIXME: need to be moved to gpio_device and held there */
639
- kfree (chip -> desc );
640
- chip -> desc = NULL ;
641
-
642
633
/*
643
634
* The gpiochip side puts its use of the device to rest here:
644
635
* if there are no userspace clients, the chardev and device will
@@ -1250,7 +1241,7 @@ const char *gpiochip_is_requested(struct gpio_chip *chip, unsigned offset)
1250
1241
if (offset >= chip -> ngpio )
1251
1242
return NULL ;
1252
1243
1253
- desc = & chip -> desc [offset ];
1244
+ desc = & chip -> gpiodev -> descs [offset ];
1254
1245
1255
1246
if (test_bit (FLAG_REQUESTED , & desc -> flags ) == 0 )
1256
1247
return NULL ;
@@ -1837,14 +1828,14 @@ int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset)
1837
1828
if (offset >= chip -> ngpio )
1838
1829
return - EINVAL ;
1839
1830
1840
- if (test_bit (FLAG_IS_OUT , & chip -> desc [offset ].flags )) {
1831
+ if (test_bit (FLAG_IS_OUT , & chip -> gpiodev -> descs [offset ].flags )) {
1841
1832
chip_err (chip ,
1842
1833
"%s: tried to flag a GPIO set as output for IRQ\n" ,
1843
1834
__func__ );
1844
1835
return - EIO ;
1845
1836
}
1846
1837
1847
- set_bit (FLAG_USED_AS_IRQ , & chip -> desc [offset ].flags );
1838
+ set_bit (FLAG_USED_AS_IRQ , & chip -> gpiodev -> descs [offset ].flags );
1848
1839
return 0 ;
1849
1840
}
1850
1841
EXPORT_SYMBOL_GPL (gpiochip_lock_as_irq );
@@ -1862,7 +1853,7 @@ void gpiochip_unlock_as_irq(struct gpio_chip *chip, unsigned int offset)
1862
1853
if (offset >= chip -> ngpio )
1863
1854
return ;
1864
1855
1865
- clear_bit (FLAG_USED_AS_IRQ , & chip -> desc [offset ].flags );
1856
+ clear_bit (FLAG_USED_AS_IRQ , & chip -> gpiodev -> descs [offset ].flags );
1866
1857
}
1867
1858
EXPORT_SYMBOL_GPL (gpiochip_unlock_as_irq );
1868
1859
@@ -2549,8 +2540,8 @@ static void gpiochip_free_hogs(struct gpio_chip *chip)
2549
2540
int id ;
2550
2541
2551
2542
for (id = 0 ; id < chip -> ngpio ; id ++ ) {
2552
- if (test_bit (FLAG_IS_HOGGED , & chip -> desc [id ].flags ))
2553
- gpiochip_free_own_desc (& chip -> desc [id ]);
2543
+ if (test_bit (FLAG_IS_HOGGED , & chip -> gpiodev -> descs [id ].flags ))
2544
+ gpiochip_free_own_desc (& chip -> gpiodev -> descs [id ]);
2554
2545
}
2555
2546
}
2556
2547
@@ -2673,7 +2664,7 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip)
2673
2664
{
2674
2665
unsigned i ;
2675
2666
unsigned gpio = chip -> base ;
2676
- struct gpio_desc * gdesc = & chip -> desc [0 ];
2667
+ struct gpio_desc * gdesc = & chip -> gpiodev -> descs [0 ];
2677
2668
int is_out ;
2678
2669
int is_irq ;
2679
2670
0 commit comments