33
44#include <linux/bitops.h>
55#include <linux/gpio/driver.h>
6+ #include <linux/gpio/generic.h>
67#include <linux/of.h>
78#include <linux/module.h>
89#include <linux/irqdomain.h>
@@ -37,7 +38,7 @@ enum gio_reg_index {
3738struct brcmstb_gpio_bank {
3839 struct list_head node ;
3940 int id ;
40- struct gpio_chip gc ;
41+ struct gpio_generic_chip chip ;
4142 struct brcmstb_gpio_priv * parent_priv ;
4243 u32 width ;
4344 u32 wake_active ;
@@ -72,46 +73,45 @@ __brcmstb_gpio_get_active_irqs(struct brcmstb_gpio_bank *bank)
7273{
7374 void __iomem * reg_base = bank -> parent_priv -> reg_base ;
7475
75- return bank -> gc . read_reg ( reg_base + GIO_STAT (bank -> id )) &
76- bank -> gc . read_reg ( reg_base + GIO_MASK (bank -> id ));
76+ return gpio_generic_read_reg ( & bank -> chip , reg_base + GIO_STAT (bank -> id )) &
77+ gpio_generic_read_reg ( & bank -> chip , reg_base + GIO_MASK (bank -> id ));
7778}
7879
7980static unsigned long
8081brcmstb_gpio_get_active_irqs (struct brcmstb_gpio_bank * bank )
8182{
8283 unsigned long status ;
83- unsigned long flags ;
8484
85- raw_spin_lock_irqsave (& bank -> gc .bgpio_lock , flags );
85+ guard (gpio_generic_lock_irqsave )(& bank -> chip );
86+
8687 status = __brcmstb_gpio_get_active_irqs (bank );
87- raw_spin_unlock_irqrestore (& bank -> gc .bgpio_lock , flags );
8888
8989 return status ;
9090}
9191
9292static int brcmstb_gpio_hwirq_to_offset (irq_hw_number_t hwirq ,
9393 struct brcmstb_gpio_bank * bank )
9494{
95- return hwirq - bank -> gc .offset ;
95+ return hwirq - bank -> chip . gc .offset ;
9696}
9797
9898static void brcmstb_gpio_set_imask (struct brcmstb_gpio_bank * bank ,
9999 unsigned int hwirq , bool enable )
100100{
101- struct gpio_chip * gc = & bank -> gc ;
102101 struct brcmstb_gpio_priv * priv = bank -> parent_priv ;
103102 u32 mask = BIT (brcmstb_gpio_hwirq_to_offset (hwirq , bank ));
104103 u32 imask ;
105- unsigned long flags ;
106104
107- raw_spin_lock_irqsave (& gc -> bgpio_lock , flags );
108- imask = gc -> read_reg (priv -> reg_base + GIO_MASK (bank -> id ));
105+ guard (gpio_generic_lock_irqsave )(& bank -> chip );
106+
107+ imask = gpio_generic_read_reg (& bank -> chip ,
108+ priv -> reg_base + GIO_MASK (bank -> id ));
109109 if (enable )
110110 imask |= mask ;
111111 else
112112 imask &= ~mask ;
113- gc -> write_reg ( priv -> reg_base + GIO_MASK ( bank -> id ), imask );
114- raw_spin_unlock_irqrestore ( & gc -> bgpio_lock , flags );
113+ gpio_generic_write_reg ( & bank -> chip ,
114+ priv -> reg_base + GIO_MASK ( bank -> id ), imask );
115115}
116116
117117static int brcmstb_gpio_to_irq (struct gpio_chip * gc , unsigned offset )
@@ -150,7 +150,8 @@ static void brcmstb_gpio_irq_ack(struct irq_data *d)
150150 struct brcmstb_gpio_priv * priv = bank -> parent_priv ;
151151 u32 mask = BIT (brcmstb_gpio_hwirq_to_offset (d -> hwirq , bank ));
152152
153- gc -> write_reg (priv -> reg_base + GIO_STAT (bank -> id ), mask );
153+ gpio_generic_write_reg (& bank -> chip ,
154+ priv -> reg_base + GIO_STAT (bank -> id ), mask );
154155}
155156
156157static int brcmstb_gpio_irq_set_type (struct irq_data * d , unsigned int type )
@@ -162,7 +163,6 @@ static int brcmstb_gpio_irq_set_type(struct irq_data *d, unsigned int type)
162163 u32 edge_insensitive , iedge_insensitive ;
163164 u32 edge_config , iedge_config ;
164165 u32 level , ilevel ;
165- unsigned long flags ;
166166
167167 switch (type ) {
168168 case IRQ_TYPE_LEVEL_LOW :
@@ -194,23 +194,25 @@ static int brcmstb_gpio_irq_set_type(struct irq_data *d, unsigned int type)
194194 return - EINVAL ;
195195 }
196196
197- raw_spin_lock_irqsave (& bank -> gc .bgpio_lock , flags );
198-
199- iedge_config = bank -> gc .read_reg (priv -> reg_base +
200- GIO_EC (bank -> id )) & ~mask ;
201- iedge_insensitive = bank -> gc .read_reg (priv -> reg_base +
202- GIO_EI (bank -> id )) & ~mask ;
203- ilevel = bank -> gc .read_reg (priv -> reg_base +
204- GIO_LEVEL (bank -> id )) & ~mask ;
205-
206- bank -> gc .write_reg (priv -> reg_base + GIO_EC (bank -> id ),
207- iedge_config | edge_config );
208- bank -> gc .write_reg (priv -> reg_base + GIO_EI (bank -> id ),
209- iedge_insensitive | edge_insensitive );
210- bank -> gc .write_reg (priv -> reg_base + GIO_LEVEL (bank -> id ),
211- ilevel | level );
197+ guard (gpio_generic_lock_irqsave )(& bank -> chip );
198+
199+ iedge_config = gpio_generic_read_reg (& bank -> chip ,
200+ priv -> reg_base + GIO_EC (bank -> id )) & ~mask ;
201+ iedge_insensitive = gpio_generic_read_reg (& bank -> chip ,
202+ priv -> reg_base + GIO_EI (bank -> id )) & ~mask ;
203+ ilevel = gpio_generic_read_reg (& bank -> chip ,
204+ priv -> reg_base + GIO_LEVEL (bank -> id )) & ~mask ;
205+
206+ gpio_generic_write_reg (& bank -> chip ,
207+ priv -> reg_base + GIO_EC (bank -> id ),
208+ iedge_config | edge_config );
209+ gpio_generic_write_reg (& bank -> chip ,
210+ priv -> reg_base + GIO_EI (bank -> id ),
211+ iedge_insensitive | edge_insensitive );
212+ gpio_generic_write_reg (& bank -> chip ,
213+ priv -> reg_base + GIO_LEVEL (bank -> id ),
214+ ilevel | level );
212215
213- raw_spin_unlock_irqrestore (& bank -> gc .bgpio_lock , flags );
214216 return 0 ;
215217}
216218
@@ -263,7 +265,7 @@ static void brcmstb_gpio_irq_bank_handler(struct brcmstb_gpio_bank *bank)
263265{
264266 struct brcmstb_gpio_priv * priv = bank -> parent_priv ;
265267 struct irq_domain * domain = priv -> irq_domain ;
266- int hwbase = bank -> gc .offset ;
268+ int hwbase = bank -> chip . gc .offset ;
267269 unsigned long status ;
268270
269271 while ((status = brcmstb_gpio_get_active_irqs (bank ))) {
@@ -303,7 +305,7 @@ static struct brcmstb_gpio_bank *brcmstb_gpio_hwirq_to_bank(
303305
304306 /* banks are in descending order */
305307 list_for_each_entry_reverse (bank , & priv -> bank_list , node ) {
306- i += bank -> gc .ngpio ;
308+ i += bank -> chip . gc .ngpio ;
307309 if (hwirq < i )
308310 return bank ;
309311 }
@@ -332,7 +334,7 @@ static int brcmstb_gpio_irq_map(struct irq_domain *d, unsigned int irq,
332334
333335 dev_dbg (& pdev -> dev , "Mapping irq %d for gpio line %d (bank %d)\n" ,
334336 irq , (int )hwirq , bank -> id );
335- ret = irq_set_chip_data (irq , & bank -> gc );
337+ ret = irq_set_chip_data (irq , & bank -> chip . gc );
336338 if (ret < 0 )
337339 return ret ;
338340 irq_set_lockdep_class (irq , & brcmstb_gpio_irq_lock_class ,
@@ -394,7 +396,7 @@ static void brcmstb_gpio_remove(struct platform_device *pdev)
394396 * more important to actually perform all of the steps.
395397 */
396398 list_for_each_entry (bank , & priv -> bank_list , node )
397- gpiochip_remove (& bank -> gc );
399+ gpiochip_remove (& bank -> chip . gc );
398400}
399401
400402static int brcmstb_gpio_of_xlate (struct gpio_chip * gc ,
@@ -412,7 +414,7 @@ static int brcmstb_gpio_of_xlate(struct gpio_chip *gc,
412414 if (WARN_ON (gpiospec -> args_count < gc -> of_gpio_n_cells ))
413415 return - EINVAL ;
414416
415- offset = gpiospec -> args [0 ] - bank -> gc .offset ;
417+ offset = gpiospec -> args [0 ] - bank -> chip . gc .offset ;
416418 if (offset >= gc -> ngpio || offset < 0 )
417419 return - EINVAL ;
418420
@@ -493,28 +495,24 @@ static int brcmstb_gpio_irq_setup(struct platform_device *pdev,
493495static void brcmstb_gpio_bank_save (struct brcmstb_gpio_priv * priv ,
494496 struct brcmstb_gpio_bank * bank )
495497{
496- struct gpio_chip * gc = & bank -> gc ;
497498 unsigned int i ;
498499
499500 for (i = 0 ; i < GIO_REG_STAT ; i ++ )
500- bank -> saved_regs [i ] = gc -> read_reg ( priv -> reg_base +
501- GIO_BANK_OFF (bank -> id , i ));
501+ bank -> saved_regs [i ] = gpio_generic_read_reg ( & bank -> chip ,
502+ priv -> reg_base + GIO_BANK_OFF (bank -> id , i ));
502503}
503504
504505static void brcmstb_gpio_quiesce (struct device * dev , bool save )
505506{
506507 struct brcmstb_gpio_priv * priv = dev_get_drvdata (dev );
507508 struct brcmstb_gpio_bank * bank ;
508- struct gpio_chip * gc ;
509509 u32 imask ;
510510
511511 /* disable non-wake interrupt */
512512 if (priv -> parent_irq >= 0 )
513513 disable_irq (priv -> parent_irq );
514514
515515 list_for_each_entry (bank , & priv -> bank_list , node ) {
516- gc = & bank -> gc ;
517-
518516 if (save )
519517 brcmstb_gpio_bank_save (priv , bank );
520518
@@ -523,8 +521,9 @@ static void brcmstb_gpio_quiesce(struct device *dev, bool save)
523521 imask = bank -> wake_active ;
524522 else
525523 imask = 0 ;
526- gc -> write_reg (priv -> reg_base + GIO_MASK (bank -> id ),
527- imask );
524+ gpio_generic_write_reg (& bank -> chip ,
525+ priv -> reg_base + GIO_MASK (bank -> id ),
526+ imask );
528527 }
529528}
530529
@@ -538,12 +537,12 @@ static void brcmstb_gpio_shutdown(struct platform_device *pdev)
538537static void brcmstb_gpio_bank_restore (struct brcmstb_gpio_priv * priv ,
539538 struct brcmstb_gpio_bank * bank )
540539{
541- struct gpio_chip * gc = & bank -> gc ;
542540 unsigned int i ;
543541
544542 for (i = 0 ; i < GIO_REG_STAT ; i ++ )
545- gc -> write_reg (priv -> reg_base + GIO_BANK_OFF (bank -> id , i ),
546- bank -> saved_regs [i ]);
543+ gpio_generic_write_reg (& bank -> chip ,
544+ priv -> reg_base + GIO_BANK_OFF (bank -> id , i ),
545+ bank -> saved_regs [i ]);
547546}
548547
549548static int brcmstb_gpio_suspend (struct device * dev )
@@ -585,6 +584,7 @@ static const struct dev_pm_ops brcmstb_gpio_pm_ops = {
585584
586585static int brcmstb_gpio_probe (struct platform_device * pdev )
587586{
587+ struct gpio_generic_chip_config config ;
588588 struct device * dev = & pdev -> dev ;
589589 struct device_node * np = dev -> of_node ;
590590 void __iomem * reg_base ;
@@ -665,17 +665,24 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
665665 bank -> width = bank_width ;
666666 }
667667
668+ gc = & bank -> chip .gc ;
669+
668670 /*
669671 * Regs are 4 bytes wide, have data reg, no set/clear regs,
670672 * and direction bits have 0 = output and 1 = input
671673 */
672- gc = & bank -> gc ;
673- err = bgpio_init (gc , dev , 4 ,
674- reg_base + GIO_DATA (bank -> id ),
675- NULL , NULL , NULL ,
676- reg_base + GIO_IODIR (bank -> id ), flags );
674+
675+ config = (struct gpio_generic_chip_config ) {
676+ .dev = dev ,
677+ .sz = 4 ,
678+ .dat = reg_base + GIO_DATA (bank -> id ),
679+ .dirin = reg_base + GIO_IODIR (bank -> id ),
680+ .flags = flags ,
681+ };
682+
683+ err = gpio_generic_chip_init (& bank -> chip , & config );
677684 if (err ) {
678- dev_err (dev , "bgpio_init() failed\n" );
685+ dev_err (dev , "failed to initialize generic GPIO chip \n" );
679686 goto fail ;
680687 }
681688
@@ -700,7 +707,8 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
700707 * be retained from S5 cold boot
701708 */
702709 need_wakeup_event |= !!__brcmstb_gpio_get_active_irqs (bank );
703- gc -> write_reg (reg_base + GIO_MASK (bank -> id ), 0 );
710+ gpio_generic_write_reg (& bank -> chip ,
711+ reg_base + GIO_MASK (bank -> id ), 0 );
704712
705713 err = gpiochip_add_data (gc , bank );
706714 if (err ) {
0 commit comments