1010
1111struct gpio_siox_ddata {
1212 struct gpio_chip gchip ;
13- struct irq_chip ichip ;
1413 struct mutex lock ;
1514 u8 setdata [1 ];
1615 u8 getdata [3 ];
@@ -97,9 +96,8 @@ static int gpio_siox_get_data(struct siox_device *sdevice, const u8 buf[])
9796
9897static void gpio_siox_irq_ack (struct irq_data * d )
9998{
100- struct irq_chip * ic = irq_data_get_irq_chip (d );
101- struct gpio_siox_ddata * ddata =
102- container_of (ic , struct gpio_siox_ddata , ichip );
99+ struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
100+ struct gpio_siox_ddata * ddata = gpiochip_get_data (gc );
103101
104102 raw_spin_lock (& ddata -> irqlock );
105103 ddata -> irq_status &= ~(1 << d -> hwirq );
@@ -108,31 +106,30 @@ static void gpio_siox_irq_ack(struct irq_data *d)
108106
109107static void gpio_siox_irq_mask (struct irq_data * d )
110108{
111- struct irq_chip * ic = irq_data_get_irq_chip (d );
112- struct gpio_siox_ddata * ddata =
113- container_of (ic , struct gpio_siox_ddata , ichip );
109+ struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
110+ struct gpio_siox_ddata * ddata = gpiochip_get_data (gc );
114111
115112 raw_spin_lock (& ddata -> irqlock );
116113 ddata -> irq_enable &= ~(1 << d -> hwirq );
117114 raw_spin_unlock (& ddata -> irqlock );
115+ gpiochip_disable_irq (gc , irqd_to_hwirq (d ));
118116}
119117
120118static void gpio_siox_irq_unmask (struct irq_data * d )
121119{
122- struct irq_chip * ic = irq_data_get_irq_chip (d );
123- struct gpio_siox_ddata * ddata =
124- container_of (ic , struct gpio_siox_ddata , ichip );
120+ struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
121+ struct gpio_siox_ddata * ddata = gpiochip_get_data (gc );
125122
123+ gpiochip_enable_irq (gc , irqd_to_hwirq (d ));
126124 raw_spin_lock (& ddata -> irqlock );
127125 ddata -> irq_enable |= 1 << d -> hwirq ;
128126 raw_spin_unlock (& ddata -> irqlock );
129127}
130128
131129static int gpio_siox_irq_set_type (struct irq_data * d , u32 type )
132130{
133- struct irq_chip * ic = irq_data_get_irq_chip (d );
134- struct gpio_siox_ddata * ddata =
135- container_of (ic , struct gpio_siox_ddata , ichip );
131+ struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
132+ struct gpio_siox_ddata * ddata = gpiochip_get_data (gc );
136133
137134 raw_spin_lock (& ddata -> irqlock );
138135 ddata -> irq_type [d -> hwirq ] = type ;
@@ -143,8 +140,7 @@ static int gpio_siox_irq_set_type(struct irq_data *d, u32 type)
143140
144141static int gpio_siox_get (struct gpio_chip * chip , unsigned int offset )
145142{
146- struct gpio_siox_ddata * ddata =
147- container_of (chip , struct gpio_siox_ddata , gchip );
143+ struct gpio_siox_ddata * ddata = gpiochip_get_data (chip );
148144 int ret ;
149145
150146 mutex_lock (& ddata -> lock );
@@ -167,8 +163,7 @@ static int gpio_siox_get(struct gpio_chip *chip, unsigned int offset)
167163static void gpio_siox_set (struct gpio_chip * chip ,
168164 unsigned int offset , int value )
169165{
170- struct gpio_siox_ddata * ddata =
171- container_of (chip , struct gpio_siox_ddata , gchip );
166+ struct gpio_siox_ddata * ddata = gpiochip_get_data (chip );
172167 u8 mask = 1 << (19 - offset );
173168
174169 mutex_lock (& ddata -> lock );
@@ -208,11 +203,22 @@ static int gpio_siox_get_direction(struct gpio_chip *chip, unsigned int offset)
208203 return GPIO_LINE_DIRECTION_OUT ;
209204}
210205
206+ static const struct irq_chip gpio_siox_irq_chip = {
207+ .name = "siox-gpio" ,
208+ .irq_ack = gpio_siox_irq_ack ,
209+ .irq_mask = gpio_siox_irq_mask ,
210+ .irq_unmask = gpio_siox_irq_unmask ,
211+ .irq_set_type = gpio_siox_irq_set_type ,
212+ .flags = IRQCHIP_IMMUTABLE ,
213+ GPIOCHIP_IRQ_RESOURCE_HELPERS ,
214+ };
215+
211216static int gpio_siox_probe (struct siox_device * sdevice )
212217{
213218 struct gpio_siox_ddata * ddata ;
214219 struct gpio_irq_chip * girq ;
215220 struct device * dev = & sdevice -> dev ;
221+ struct gpio_chip * gc ;
216222 int ret ;
217223
218224 ddata = devm_kzalloc (dev , sizeof (* ddata ), GFP_KERNEL );
@@ -224,30 +230,25 @@ static int gpio_siox_probe(struct siox_device *sdevice)
224230 mutex_init (& ddata -> lock );
225231 raw_spin_lock_init (& ddata -> irqlock );
226232
227- ddata -> gchip .base = -1 ;
228- ddata -> gchip .can_sleep = 1 ;
229- ddata -> gchip .parent = dev ;
230- ddata -> gchip .owner = THIS_MODULE ;
231- ddata -> gchip .get = gpio_siox_get ;
232- ddata -> gchip .set = gpio_siox_set ;
233- ddata -> gchip .direction_input = gpio_siox_direction_input ;
234- ddata -> gchip .direction_output = gpio_siox_direction_output ;
235- ddata -> gchip .get_direction = gpio_siox_get_direction ;
236- ddata -> gchip .ngpio = 20 ;
237-
238- ddata -> ichip .name = "siox-gpio" ;
239- ddata -> ichip .irq_ack = gpio_siox_irq_ack ;
240- ddata -> ichip .irq_mask = gpio_siox_irq_mask ;
241- ddata -> ichip .irq_unmask = gpio_siox_irq_unmask ;
242- ddata -> ichip .irq_set_type = gpio_siox_irq_set_type ;
243-
244- girq = & ddata -> gchip .irq ;
245- girq -> chip = & ddata -> ichip ;
233+ gc = & ddata -> gchip ;
234+ gc -> base = -1 ;
235+ gc -> can_sleep = 1 ;
236+ gc -> parent = dev ;
237+ gc -> owner = THIS_MODULE ;
238+ gc -> get = gpio_siox_get ;
239+ gc -> set = gpio_siox_set ;
240+ gc -> direction_input = gpio_siox_direction_input ;
241+ gc -> direction_output = gpio_siox_direction_output ;
242+ gc -> get_direction = gpio_siox_get_direction ;
243+ gc -> ngpio = 20 ;
244+
245+ girq = & gc -> irq ;
246+ gpio_irq_chip_set_chip (girq , & gpio_siox_irq_chip );
246247 girq -> default_type = IRQ_TYPE_NONE ;
247248 girq -> handler = handle_level_irq ;
248249 girq -> threaded = true;
249250
250- ret = devm_gpiochip_add_data (dev , & ddata -> gchip , NULL );
251+ ret = devm_gpiochip_add_data (dev , gc , ddata );
251252 if (ret )
252253 dev_err (dev , "Failed to register gpio chip (%d)\n" , ret );
253254
0 commit comments