66
77#include <linux/clk.h>
88#include <linux/gpio/driver.h>
9+ #include <linux/gpio/generic.h>
910#include <linux/init.h>
1011#include <linux/interrupt.h>
1112#include <linux/io.h>
3839struct spacemit_gpio ;
3940
4041struct spacemit_gpio_bank {
41- struct gpio_chip gc ;
42+ struct gpio_generic_chip chip ;
4243 struct spacemit_gpio * sg ;
4344 void __iomem * base ;
4445 u32 irq_mask ;
@@ -72,7 +73,7 @@ static irqreturn_t spacemit_gpio_irq_handler(int irq, void *dev_id)
7273 return IRQ_NONE ;
7374
7475 for_each_set_bit (n , & pending , BITS_PER_LONG )
75- handle_nested_irq (irq_find_mapping (gb -> gc .irq .domain , n ));
76+ handle_nested_irq (irq_find_mapping (gb -> chip . gc .irq .domain , n ));
7677
7778 return IRQ_HANDLED ;
7879}
@@ -143,7 +144,7 @@ static void spacemit_gpio_irq_print_chip(struct irq_data *data, struct seq_file
143144{
144145 struct spacemit_gpio_bank * gb = irq_data_get_irq_chip_data (data );
145146
146- seq_printf (p , "%s-%d" , dev_name (gb -> gc .parent ), spacemit_gpio_bank_index (gb ));
147+ seq_printf (p , "%s-%d" , dev_name (gb -> chip . gc .parent ), spacemit_gpio_bank_index (gb ));
147148}
148149
149150static struct irq_chip spacemit_gpio_chip = {
@@ -165,15 +166,16 @@ static bool spacemit_of_node_instance_match(struct gpio_chip *gc, unsigned int i
165166 if (i >= SPACEMIT_NR_BANKS )
166167 return false;
167168
168- return (gc == & sg -> sgb [i ].gc );
169+ return (gc == & sg -> sgb [i ].chip . gc );
169170}
170171
171172static int spacemit_gpio_add_bank (struct spacemit_gpio * sg ,
172173 void __iomem * regs ,
173174 int index , int irq )
174175{
175176 struct spacemit_gpio_bank * gb = & sg -> sgb [index ];
176- struct gpio_chip * gc = & gb -> gc ;
177+ struct gpio_generic_chip_config config ;
178+ struct gpio_chip * gc = & gb -> chip .gc ;
177179 struct device * dev = sg -> dev ;
178180 struct gpio_irq_chip * girq ;
179181 void __iomem * dat , * set , * clr , * dirin , * dirout ;
@@ -187,9 +189,19 @@ static int spacemit_gpio_add_bank(struct spacemit_gpio *sg,
187189 dirin = gb -> base + SPACEMIT_GCDR ;
188190 dirout = gb -> base + SPACEMIT_GSDR ;
189191
192+ config = (struct gpio_generic_chip_config ) {
193+ .dev = dev ,
194+ .sz = 4 ,
195+ .dat = dat ,
196+ .set = set ,
197+ .clr = clr ,
198+ .dirout = dirout ,
199+ .dirin = dirin ,
200+ .flags = BGPIOF_UNREADABLE_REG_SET | BGPIOF_UNREADABLE_REG_DIR ,
201+ };
202+
190203 /* This registers 32 GPIO lines per bank */
191- ret = bgpio_init (gc , dev , 4 , dat , set , clr , dirout , dirin ,
192- BGPIOF_UNREADABLE_REG_SET | BGPIOF_UNREADABLE_REG_DIR );
204+ ret = gpio_generic_chip_init (& gb -> chip , & config );
193205 if (ret )
194206 return dev_err_probe (dev , ret , "failed to init gpio chip\n" );
195207
@@ -221,7 +233,7 @@ static int spacemit_gpio_add_bank(struct spacemit_gpio *sg,
221233 ret = devm_request_threaded_irq (dev , irq , NULL ,
222234 spacemit_gpio_irq_handler ,
223235 IRQF_ONESHOT | IRQF_SHARED ,
224- gb -> gc .label , gb );
236+ gb -> chip . gc .label , gb );
225237 if (ret < 0 )
226238 return dev_err_probe (dev , ret , "failed to register IRQ\n" );
227239
0 commit comments