@@ -186,33 +186,52 @@ static int tqmx86_board_id_to_clk_rate(struct device *dev, u8 board_id)
186186 }
187187}
188188
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 )
190191{
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 ;
197194
198- switch (gpio_irq ) {
195+ switch (irq ) {
199196 case 0 :
200- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_NONE ;
197+ irq_cfg = TQMX86_REG_IO_EXT_INT_NONE ;
201198 break ;
202199 case 7 :
203- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_7 ;
200+ irq_cfg = TQMX86_REG_IO_EXT_INT_7 ;
204201 break ;
205202 case 9 :
206- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_9 ;
203+ irq_cfg = TQMX86_REG_IO_EXT_INT_9 ;
207204 break ;
208205 case 12 :
209- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_12 ;
206+ irq_cfg = TQMX86_REG_IO_EXT_INT_12 ;
210207 break ;
211208 default :
212- pr_err ( "tqmx86: Invalid GPIO IRQ (%d)\n" , gpio_irq );
209+ dev_err ( dev , "invalid %s IRQ (%d)\n" , label , irq );
213210 return - EINVAL ;
214211 }
215212
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+
216235 io_base = devm_ioport_map (dev , TQMX86_IOBASE , TQMX86_IOSIZE );
217236 if (!io_base )
218237 return - ENOMEM ;
@@ -233,15 +252,11 @@ static int tqmx86_probe(struct platform_device *pdev)
233252 */
234253 i2c_det = inb (TQMX86_REG_I2C_DETECT );
235254
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 ;
245260
246261 /* Assumes the IRQ resource is first. */
247262 tqmx_gpio_resources [0 ].start = gpio_irq ;
0 commit comments