@@ -186,33 +186,52 @@ static int tqmx86_board_id_to_clk_rate(struct device *dev, u8 board_id)
186
186
}
187
187
}
188
188
189
- static int tqmx86_probe (struct platform_device * pdev )
189
+ static int tqmx86_setup_irq (struct device * dev , const char * label , u8 irq ,
190
+ void __iomem * io_base , u8 reg_shift )
190
191
{
191
- u8 board_id , sauc , rev , i2c_det , io_ext_int_val ;
192
- struct device * dev = & pdev -> dev ;
193
- u8 gpio_irq_cfg , readback ;
194
- const char * board_name ;
195
- void __iomem * io_base ;
196
- int err ;
192
+ u8 val , readback ;
193
+ int irq_cfg ;
197
194
198
- switch (gpio_irq ) {
195
+ switch (irq ) {
199
196
case 0 :
200
- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_NONE ;
197
+ irq_cfg = TQMX86_REG_IO_EXT_INT_NONE ;
201
198
break ;
202
199
case 7 :
203
- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_7 ;
200
+ irq_cfg = TQMX86_REG_IO_EXT_INT_7 ;
204
201
break ;
205
202
case 9 :
206
- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_9 ;
203
+ irq_cfg = TQMX86_REG_IO_EXT_INT_9 ;
207
204
break ;
208
205
case 12 :
209
- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_12 ;
206
+ irq_cfg = TQMX86_REG_IO_EXT_INT_12 ;
210
207
break ;
211
208
default :
212
- pr_err ( "tqmx86: Invalid GPIO IRQ (%d)\n" , gpio_irq );
209
+ dev_err ( dev , "invalid %s IRQ (%d)\n" , label , irq );
213
210
return - EINVAL ;
214
211
}
215
212
213
+ val = ioread8 (io_base + TQMX86_REG_IO_EXT_INT );
214
+ val &= ~(TQMX86_REG_IO_EXT_INT_MASK << reg_shift );
215
+ val |= (irq_cfg & TQMX86_REG_IO_EXT_INT_MASK ) << reg_shift ;
216
+
217
+ iowrite8 (val , io_base + TQMX86_REG_IO_EXT_INT );
218
+ readback = ioread8 (io_base + TQMX86_REG_IO_EXT_INT );
219
+ if (readback != val ) {
220
+ dev_warn (dev , "%s interrupts not supported\n" , label );
221
+ return - EINVAL ;
222
+ }
223
+
224
+ return 0 ;
225
+ }
226
+
227
+ static int tqmx86_probe (struct platform_device * pdev )
228
+ {
229
+ u8 board_id , sauc , rev , i2c_det ;
230
+ struct device * dev = & pdev -> dev ;
231
+ const char * board_name ;
232
+ void __iomem * io_base ;
233
+ int err ;
234
+
216
235
io_base = devm_ioport_map (dev , TQMX86_IOBASE , TQMX86_IOSIZE );
217
236
if (!io_base )
218
237
return - ENOMEM ;
@@ -233,15 +252,11 @@ static int tqmx86_probe(struct platform_device *pdev)
233
252
*/
234
253
i2c_det = inb (TQMX86_REG_I2C_DETECT );
235
254
236
- if (gpio_irq_cfg ) {
237
- io_ext_int_val =
238
- gpio_irq_cfg << TQMX86_REG_IO_EXT_INT_GPIO_SHIFT ;
239
- iowrite8 (io_ext_int_val , io_base + TQMX86_REG_IO_EXT_INT );
240
- readback = ioread8 (io_base + TQMX86_REG_IO_EXT_INT );
241
- if (readback != io_ext_int_val ) {
242
- dev_warn (dev , "GPIO interrupts not supported.\n" );
243
- return - EINVAL ;
244
- }
255
+ if (gpio_irq ) {
256
+ err = tqmx86_setup_irq (dev , "GPIO" , gpio_irq , io_base ,
257
+ TQMX86_REG_IO_EXT_INT_GPIO_SHIFT );
258
+ if (err )
259
+ return err ;
245
260
246
261
/* Assumes the IRQ resource is first. */
247
262
tqmx_gpio_resources [0 ].start = gpio_irq ;
0 commit comments