@@ -63,11 +63,13 @@ static inline int __davinci_direction(struct gpio_chip *chip,
6363 unsigned offset , bool out , int value )
6464{
6565 struct davinci_gpio_controller * d = gpiochip_get_data (chip );
66- struct davinci_gpio_regs __iomem * g = d -> regs ;
66+ struct davinci_gpio_regs __iomem * g ;
6767 unsigned long flags ;
6868 u32 temp ;
69- u32 mask = 1 << offset ;
69+ int bank = offset / 32 ;
70+ u32 mask = __gpio_mask (offset );
7071
72+ g = d -> regs [bank ];
7173 spin_lock_irqsave (& d -> lock , flags );
7274 temp = readl_relaxed (& g -> dir );
7375 if (out ) {
@@ -103,9 +105,12 @@ davinci_direction_out(struct gpio_chip *chip, unsigned offset, int value)
103105static int davinci_gpio_get (struct gpio_chip * chip , unsigned offset )
104106{
105107 struct davinci_gpio_controller * d = gpiochip_get_data (chip );
106- struct davinci_gpio_regs __iomem * g = d -> regs ;
108+ struct davinci_gpio_regs __iomem * g ;
109+ int bank = offset / 32 ;
107110
108- return !!((1 << offset ) & readl_relaxed (& g -> in_data ));
111+ g = d -> regs [bank ];
112+
113+ return !!(__gpio_mask (offset ) & readl_relaxed (& g -> in_data ));
109114}
110115
111116/*
@@ -115,9 +120,13 @@ static void
115120davinci_gpio_set (struct gpio_chip * chip , unsigned offset , int value )
116121{
117122 struct davinci_gpio_controller * d = gpiochip_get_data (chip );
118- struct davinci_gpio_regs __iomem * g = d -> regs ;
123+ struct davinci_gpio_regs __iomem * g ;
124+ int bank = offset / 32 ;
119125
120- writel_relaxed ((1 << offset ), value ? & g -> set_data : & g -> clr_data );
126+ g = d -> regs [bank ];
127+
128+ writel_relaxed (__gpio_mask (offset ),
129+ value ? & g -> set_data : & g -> clr_data );
121130}
122131
123132static struct davinci_gpio_platform_data *
@@ -165,7 +174,7 @@ static int davinci_gpio_of_xlate(struct gpio_chip *gc,
165174 if (gpiospec -> args [0 ] > pdata -> ngpio )
166175 return - EINVAL ;
167176
168- if (gc != & chips [ gpiospec -> args [ 0 ] / 32 ]. chip )
177+ if (gc != & chips -> chip )
169178 return - EINVAL ;
170179
171180 if (flags )
@@ -177,11 +186,11 @@ static int davinci_gpio_of_xlate(struct gpio_chip *gc,
177186
178187static int davinci_gpio_probe (struct platform_device * pdev )
179188{
180- int i , base ;
189+ static int ctrl_num ;
190+ int gpio , bank ;
181191 unsigned ngpio , nbank ;
182192 struct davinci_gpio_controller * chips ;
183193 struct davinci_gpio_platform_data * pdata ;
184- struct davinci_gpio_regs __iomem * regs ;
185194 struct device * dev = & pdev -> dev ;
186195 struct resource * res ;
187196 char label [MAX_LABEL_SIZE ];
@@ -220,38 +229,30 @@ static int davinci_gpio_probe(struct platform_device *pdev)
220229 if (IS_ERR (gpio_base ))
221230 return PTR_ERR (gpio_base );
222231
223- for (i = 0 , base = 0 ; base < ngpio ; i ++ , base += 32 ) {
224- snprintf (label , MAX_LABEL_SIZE , "davinci_gpio.%d" , i );
225- chips [i ].chip .label = devm_kstrdup (dev , label , GFP_KERNEL );
226- if (!chips [i ].chip .label )
232+ snprintf (label , MAX_LABEL_SIZE , "davinci_gpio.%d" , ctrl_num ++ );
233+ chips -> chip .label = devm_kstrdup (dev , label , GFP_KERNEL );
234+ if (!chips -> chip .label )
227235 return - ENOMEM ;
228236
229- chips [ i ]. chip .direction_input = davinci_direction_in ;
230- chips [ i ]. chip .get = davinci_gpio_get ;
231- chips [ i ]. chip .direction_output = davinci_direction_out ;
232- chips [ i ]. chip .set = davinci_gpio_set ;
237+ chips -> chip .direction_input = davinci_direction_in ;
238+ chips -> chip .get = davinci_gpio_get ;
239+ chips -> chip .direction_output = davinci_direction_out ;
240+ chips -> chip .set = davinci_gpio_set ;
233241
234- chips [i ].chip .base = base ;
235- chips [i ].chip .ngpio = ngpio - base ;
236- if (chips [i ].chip .ngpio > 32 )
237- chips [i ].chip .ngpio = 32 ;
242+ chips -> chip .ngpio = ngpio ;
238243
239244#ifdef CONFIG_OF_GPIO
240- chips [ i ]. chip .of_gpio_n_cells = 2 ;
241- chips [ i ]. chip .of_xlate = davinci_gpio_of_xlate ;
242- chips [ i ]. chip .parent = dev ;
243- chips [ i ]. chip .of_node = dev -> of_node ;
245+ chips -> chip .of_gpio_n_cells = 2 ;
246+ chips -> chip .of_xlate = davinci_gpio_of_xlate ;
247+ chips -> chip .parent = dev ;
248+ chips -> chip .of_node = dev -> of_node ;
244249#endif
245- spin_lock_init (& chips [i ].lock );
246-
247- regs = gpio_base + offset_array [i ];
248- if (!regs )
249- return - ENXIO ;
250- chips [i ].regs = regs ;
250+ spin_lock_init (& chips -> lock );
251251
252- gpiochip_add_data ( & chips [ i ]. chip , & chips [ i ]);
253- }
252+ for ( gpio = 0 , bank = 0 ; gpio < ngpio ; gpio += 32 , bank ++ )
253+ chips -> regs [ bank ] = gpio_base + offset_array [ bank ];
254254
255+ gpiochip_add_data (& chips -> chip , chips );
255256 platform_set_drvdata (pdev , chips );
256257 davinci_gpio_irq_setup (pdev );
257258 return 0 ;
@@ -312,23 +313,27 @@ static struct irq_chip gpio_irqchip = {
312313
313314static void gpio_irq_handler (struct irq_desc * desc )
314315{
315- unsigned int irq = irq_desc_get_irq (desc );
316316 struct davinci_gpio_regs __iomem * g ;
317317 u32 mask = 0xffff ;
318+ int bank_num ;
318319 struct davinci_gpio_controller * d ;
320+ struct davinci_gpio_irq_data * irqdata ;
319321
320- d = (struct davinci_gpio_controller * )irq_desc_get_handler_data (desc );
321- g = (struct davinci_gpio_regs __iomem * )d -> regs ;
322+ irqdata = (struct davinci_gpio_irq_data * )irq_desc_get_handler_data (desc );
323+ bank_num = irqdata -> bank_num ;
324+ g = irqdata -> regs ;
325+ d = irqdata -> chip ;
322326
323327 /* we only care about one bank */
324- if (irq & 1 )
328+ if (( bank_num % 2 ) == 1 )
325329 mask <<= 16 ;
326330
327331 /* temporarily mask (level sensitive) parent IRQ */
328332 chained_irq_enter (irq_desc_get_chip (desc ), desc );
329333 while (1 ) {
330334 u32 status ;
331335 int bit ;
336+ irq_hw_number_t hw_irq ;
332337
333338 /* ack any irqs */
334339 status = readl_relaxed (& g -> intstat ) & mask ;
@@ -341,9 +346,13 @@ static void gpio_irq_handler(struct irq_desc *desc)
341346 while (status ) {
342347 bit = __ffs (status );
343348 status &= ~BIT (bit );
349+ /* Max number of gpios per controller is 144 so
350+ * hw_irq will be in [0..143]
351+ */
352+ hw_irq = (bank_num / 2 ) * 32 + bit ;
353+
344354 generic_handle_irq (
345- irq_find_mapping (d -> irq_domain ,
346- d -> chip .base + bit ));
355+ irq_find_mapping (d -> irq_domain , hw_irq ));
347356 }
348357 }
349358 chained_irq_exit (irq_desc_get_chip (desc ), desc );
@@ -355,7 +364,7 @@ static int gpio_to_irq_banked(struct gpio_chip *chip, unsigned offset)
355364 struct davinci_gpio_controller * d = gpiochip_get_data (chip );
356365
357366 if (d -> irq_domain )
358- return irq_create_mapping (d -> irq_domain , d -> chip . base + offset );
367+ return irq_create_mapping (d -> irq_domain , offset );
359368 else
360369 return - ENXIO ;
361370}
@@ -369,7 +378,7 @@ static int gpio_to_irq_unbanked(struct gpio_chip *chip, unsigned offset)
369378 * can provide direct-mapped IRQs to AINTC (up to 32 GPIOs).
370379 */
371380 if (offset < d -> gpio_unbanked )
372- return d -> gpio_irq + offset ;
381+ return d -> base_irq + offset ;
373382 else
374383 return - ENODEV ;
375384}
@@ -382,7 +391,7 @@ static int gpio_irq_type_unbanked(struct irq_data *data, unsigned trigger)
382391
383392 d = (struct davinci_gpio_controller * )irq_data_get_irq_handler_data (data );
384393 g = (struct davinci_gpio_regs __iomem * )d -> regs ;
385- mask = __gpio_mask (data -> irq - d -> gpio_irq );
394+ mask = __gpio_mask (data -> irq - d -> base_irq );
386395
387396 if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING ))
388397 return - EINVAL ;
@@ -401,7 +410,7 @@ davinci_gpio_irq_map(struct irq_domain *d, unsigned int irq,
401410{
402411 struct davinci_gpio_controller * chips =
403412 (struct davinci_gpio_controller * )d -> host_data ;
404- struct davinci_gpio_regs __iomem * g = chips [hw / 32 ]. regs ;
413+ struct davinci_gpio_regs __iomem * g = chips -> regs [hw / 32 ];
405414
406415 irq_set_chip_and_handler_name (irq , & gpio_irqchip , handle_simple_irq ,
407416 "davinci_gpio" );
@@ -459,6 +468,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
459468 struct irq_domain * irq_domain = NULL ;
460469 const struct of_device_id * match ;
461470 struct irq_chip * irq_chip ;
471+ struct davinci_gpio_irq_data * irqdata ;
462472 gpio_get_irq_chip_cb_t gpio_get_irq_chip ;
463473
464474 /*
@@ -514,10 +524,8 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
514524 * IRQs, while the others use banked IRQs, would need some setup
515525 * tweaks to recognize hardware which can do that.
516526 */
517- for (gpio = 0 , bank = 0 ; gpio < ngpio ; bank ++ , gpio += 32 ) {
518- chips [bank ].chip .to_irq = gpio_to_irq_banked ;
519- chips [bank ].irq_domain = irq_domain ;
520- }
527+ chips -> chip .to_irq = gpio_to_irq_banked ;
528+ chips -> irq_domain = irq_domain ;
521529
522530 /*
523531 * AINTC can handle direct/unbanked IRQs for GPIOs, with the GPIO
@@ -526,9 +534,9 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
526534 */
527535 if (pdata -> gpio_unbanked ) {
528536 /* pass "bank 0" GPIO IRQs to AINTC */
529- chips [ 0 ]. chip .to_irq = gpio_to_irq_unbanked ;
530- chips [ 0 ]. gpio_irq = bank_irq ;
531- chips [ 0 ]. gpio_unbanked = pdata -> gpio_unbanked ;
537+ chips -> chip .to_irq = gpio_to_irq_unbanked ;
538+ chips -> base_irq = bank_irq ;
539+ chips -> gpio_unbanked = pdata -> gpio_unbanked ;
532540 binten = GENMASK (pdata -> gpio_unbanked / 16 , 0 );
533541
534542 /* AINTC handles mask/unmask; GPIO handles triggering */
@@ -538,14 +546,14 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
538546 irq_chip -> irq_set_type = gpio_irq_type_unbanked ;
539547
540548 /* default trigger: both edges */
541- g = chips [0 ]. regs ;
549+ g = chips -> regs [0 ];
542550 writel_relaxed (~0 , & g -> set_falling );
543551 writel_relaxed (~0 , & g -> set_rising );
544552
545553 /* set the direct IRQs up to use that irqchip */
546554 for (gpio = 0 ; gpio < pdata -> gpio_unbanked ; gpio ++ , irq ++ ) {
547555 irq_set_chip (irq , irq_chip );
548- irq_set_handler_data (irq , & chips [ gpio / 32 ] );
556+ irq_set_handler_data (irq , chips );
549557 irq_set_status_flags (irq , IRQ_TYPE_EDGE_BOTH );
550558 }
551559
@@ -561,7 +569,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
561569 * There are register sets for 32 GPIOs. 2 banks of 16
562570 * GPIOs are covered by each set of registers hence divide by 2
563571 */
564- g = chips [bank / 2 ]. regs ;
572+ g = chips -> regs [bank / 2 ];
565573 writel_relaxed (~0 , & g -> clr_falling );
566574 writel_relaxed (~0 , & g -> clr_rising );
567575
@@ -570,8 +578,19 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)
570578 * gpio irqs. Pass the irq bank's corresponding controller to
571579 * the chained irq handler.
572580 */
581+ irqdata = devm_kzalloc (& pdev -> dev ,
582+ sizeof (struct
583+ davinci_gpio_irq_data ),
584+ GFP_KERNEL );
585+ if (!irqdata )
586+ return - ENOMEM ;
587+
588+ irqdata -> regs = g ;
589+ irqdata -> bank_num = bank ;
590+ irqdata -> chip = chips ;
591+
573592 irq_set_chained_handler_and_data (bank_irq , gpio_irq_handler ,
574- & chips [ gpio / 32 ] );
593+ irqdata );
575594
576595 binten |= BIT (bank );
577596 }
0 commit comments