1010#include <linux/errno.h>
1111#include <linux/gpio/driver.h>
1212#include <linux/init.h>
13+ #include <linux/interrupt.h>
1314#include <linux/io.h>
15+ #include <linux/irq.h>
1416#include <linux/module.h>
1517#include <linux/of_device.h>
1618#include <linux/of_platform.h>
2224
2325#define XGPIO_CHANNEL_OFFSET 0x8
2426
27+ #define XGPIO_GIER_OFFSET 0x11c /* Global Interrupt Enable */
28+ #define XGPIO_GIER_IE BIT(31)
29+ #define XGPIO_IPISR_OFFSET 0x120 /* IP Interrupt Status */
30+ #define XGPIO_IPIER_OFFSET 0x128 /* IP Interrupt Enable */
31+
2532/* Read/Write access to the GPIO registers */
2633#if defined(CONFIG_ARCH_ZYNQ ) || defined(CONFIG_X86 )
2734# define xgpio_readreg (offset ) readl(offset)
3643 * @gc: GPIO chip
3744 * @regs: register block
3845 * @gpio_width: GPIO width for every channel
39- * @gpio_state: GPIO state shadow register
46+ * @gpio_state: GPIO write state shadow register
47+ * @gpio_last_irq_read: GPIO read state register from last interrupt
4048 * @gpio_dir: GPIO direction shadow register
4149 * @gpio_lock: Lock used for synchronization
50+ * @irq: IRQ used by GPIO device
51+ * @irqchip: IRQ chip
52+ * @irq_enable: GPIO IRQ enable/disable bitfield
53+ * @irq_rising_edge: GPIO IRQ rising edge enable/disable bitfield
54+ * @irq_falling_edge: GPIO IRQ falling edge enable/disable bitfield
4255 * @clk: clock resource for this driver
4356 */
4457struct xgpio_instance {
4558 struct gpio_chip gc ;
4659 void __iomem * regs ;
4760 unsigned int gpio_width [2 ];
4861 u32 gpio_state [2 ];
62+ u32 gpio_last_irq_read [2 ];
4963 u32 gpio_dir [2 ];
5064 spinlock_t gpio_lock ; /* For serializing operations */
65+ int irq ;
66+ struct irq_chip irqchip ;
67+ u32 irq_enable [2 ];
68+ u32 irq_rising_edge [2 ];
69+ u32 irq_falling_edge [2 ];
5170 struct clk * clk ;
5271};
5372
@@ -276,6 +295,175 @@ static int xgpio_remove(struct platform_device *pdev)
276295 return 0 ;
277296}
278297
298+ /**
299+ * xgpio_irq_ack - Acknowledge a child GPIO interrupt.
300+ * @irq_data: per IRQ and chip data passed down to chip functions
301+ * This currently does nothing, but irq_ack is unconditionally called by
302+ * handle_edge_irq and therefore must be defined.
303+ */
304+ static void xgpio_irq_ack (struct irq_data * irq_data )
305+ {
306+ }
307+
308+ /**
309+ * xgpio_irq_mask - Write the specified signal of the GPIO device.
310+ * @irq_data: per IRQ and chip data passed down to chip functions
311+ */
312+ static void xgpio_irq_mask (struct irq_data * irq_data )
313+ {
314+ unsigned long flags ;
315+ struct xgpio_instance * chip = irq_data_get_irq_chip_data (irq_data );
316+ int irq_offset = irqd_to_hwirq (irq_data );
317+ int index = xgpio_index (chip , irq_offset );
318+ int offset = xgpio_offset (chip , irq_offset );
319+
320+ spin_lock_irqsave (& chip -> gpio_lock , flags );
321+
322+ chip -> irq_enable [index ] &= ~BIT (offset );
323+
324+ if (!chip -> irq_enable [index ]) {
325+ /* Disable per channel interrupt */
326+ u32 temp = xgpio_readreg (chip -> regs + XGPIO_IPIER_OFFSET );
327+
328+ temp &= ~BIT (index );
329+ xgpio_writereg (chip -> regs + XGPIO_IPIER_OFFSET , temp );
330+ }
331+ spin_unlock_irqrestore (& chip -> gpio_lock , flags );
332+ }
333+
334+ /**
335+ * xgpio_irq_unmask - Write the specified signal of the GPIO device.
336+ * @irq_data: per IRQ and chip data passed down to chip functions
337+ */
338+ static void xgpio_irq_unmask (struct irq_data * irq_data )
339+ {
340+ unsigned long flags ;
341+ struct xgpio_instance * chip = irq_data_get_irq_chip_data (irq_data );
342+ int irq_offset = irqd_to_hwirq (irq_data );
343+ int index = xgpio_index (chip , irq_offset );
344+ int offset = xgpio_offset (chip , irq_offset );
345+ u32 old_enable = chip -> irq_enable [index ];
346+
347+ spin_lock_irqsave (& chip -> gpio_lock , flags );
348+
349+ chip -> irq_enable [index ] |= BIT (offset );
350+
351+ if (!old_enable ) {
352+ /* Clear any existing per-channel interrupts */
353+ u32 val = xgpio_readreg (chip -> regs + XGPIO_IPISR_OFFSET ) &
354+ BIT (index );
355+
356+ if (val )
357+ xgpio_writereg (chip -> regs + XGPIO_IPISR_OFFSET , val );
358+
359+ /* Update GPIO IRQ read data before enabling interrupt*/
360+ val = xgpio_readreg (chip -> regs + XGPIO_DATA_OFFSET +
361+ index * XGPIO_CHANNEL_OFFSET );
362+ chip -> gpio_last_irq_read [index ] = val ;
363+
364+ /* Enable per channel interrupt */
365+ val = xgpio_readreg (chip -> regs + XGPIO_IPIER_OFFSET );
366+ val |= BIT (index );
367+ xgpio_writereg (chip -> regs + XGPIO_IPIER_OFFSET , val );
368+ }
369+
370+ spin_unlock_irqrestore (& chip -> gpio_lock , flags );
371+ }
372+
373+ /**
374+ * xgpio_set_irq_type - Write the specified signal of the GPIO device.
375+ * @irq_data: Per IRQ and chip data passed down to chip functions
376+ * @type: Interrupt type that is to be set for the gpio pin
377+ *
378+ * Return:
379+ * 0 if interrupt type is supported otherwise -EINVAL
380+ */
381+ static int xgpio_set_irq_type (struct irq_data * irq_data , unsigned int type )
382+ {
383+ struct xgpio_instance * chip = irq_data_get_irq_chip_data (irq_data );
384+ int irq_offset = irqd_to_hwirq (irq_data );
385+ int index = xgpio_index (chip , irq_offset );
386+ int offset = xgpio_offset (chip , irq_offset );
387+
388+ /*
389+ * The Xilinx GPIO hardware provides a single interrupt status
390+ * indication for any state change in a given GPIO channel (bank).
391+ * Therefore, only rising edge or falling edge triggers are
392+ * supported.
393+ */
394+ switch (type & IRQ_TYPE_SENSE_MASK ) {
395+ case IRQ_TYPE_EDGE_BOTH :
396+ chip -> irq_rising_edge [index ] |= BIT (offset );
397+ chip -> irq_falling_edge [index ] |= BIT (offset );
398+ break ;
399+ case IRQ_TYPE_EDGE_RISING :
400+ chip -> irq_rising_edge [index ] |= BIT (offset );
401+ chip -> irq_falling_edge [index ] &= ~BIT (offset );
402+ break ;
403+ case IRQ_TYPE_EDGE_FALLING :
404+ chip -> irq_rising_edge [index ] &= ~BIT (offset );
405+ chip -> irq_falling_edge [index ] |= BIT (offset );
406+ break ;
407+ default :
408+ return - EINVAL ;
409+ }
410+
411+ irq_set_handler_locked (irq_data , handle_edge_irq );
412+ return 0 ;
413+ }
414+
415+ /**
416+ * xgpio_irqhandler - Gpio interrupt service routine
417+ * @desc: Pointer to interrupt description
418+ */
419+ static void xgpio_irqhandler (struct irq_desc * desc )
420+ {
421+ struct xgpio_instance * chip = irq_desc_get_handler_data (desc );
422+ struct irq_chip * irqchip = irq_desc_get_chip (desc );
423+ u32 num_channels = chip -> gpio_width [1 ] ? 2 : 1 ;
424+ u32 offset = 0 , index ;
425+ u32 status = xgpio_readreg (chip -> regs + XGPIO_IPISR_OFFSET );
426+
427+ xgpio_writereg (chip -> regs + XGPIO_IPISR_OFFSET , status );
428+
429+ chained_irq_enter (irqchip , desc );
430+ for (index = 0 ; index < num_channels ; index ++ ) {
431+ if ((status & BIT (index ))) {
432+ unsigned long rising_events , falling_events , all_events ;
433+ unsigned long flags ;
434+ u32 data , bit ;
435+ unsigned int irq ;
436+
437+ spin_lock_irqsave (& chip -> gpio_lock , flags );
438+ data = xgpio_readreg (chip -> regs + XGPIO_DATA_OFFSET +
439+ index * XGPIO_CHANNEL_OFFSET );
440+ rising_events = data &
441+ ~chip -> gpio_last_irq_read [index ] &
442+ chip -> irq_enable [index ] &
443+ chip -> irq_rising_edge [index ];
444+ falling_events = ~data &
445+ chip -> gpio_last_irq_read [index ] &
446+ chip -> irq_enable [index ] &
447+ chip -> irq_falling_edge [index ];
448+ dev_dbg (chip -> gc .parent ,
449+ "IRQ chan %u rising 0x%lx falling 0x%lx\n" ,
450+ index , rising_events , falling_events );
451+ all_events = rising_events | falling_events ;
452+ chip -> gpio_last_irq_read [index ] = data ;
453+ spin_unlock_irqrestore (& chip -> gpio_lock , flags );
454+
455+ for_each_set_bit (bit , & all_events , 32 ) {
456+ irq = irq_find_mapping (chip -> gc .irq .domain ,
457+ offset + bit );
458+ generic_handle_irq (irq );
459+ }
460+ }
461+ offset += chip -> gpio_width [index ];
462+ }
463+
464+ chained_irq_exit (irqchip , desc );
465+ }
466+
279467/**
280468 * xgpio_of_probe - Probe method for the GPIO device.
281469 * @pdev: pointer to the platform device
@@ -289,7 +477,10 @@ static int xgpio_probe(struct platform_device *pdev)
289477 struct xgpio_instance * chip ;
290478 int status = 0 ;
291479 struct device_node * np = pdev -> dev .of_node ;
292- u32 is_dual ;
480+ u32 is_dual = 0 ;
481+ u32 cells = 2 ;
482+ struct gpio_irq_chip * girq ;
483+ u32 temp ;
293484
294485 chip = devm_kzalloc (& pdev -> dev , sizeof (* chip ), GFP_KERNEL );
295486 if (!chip )
@@ -305,6 +496,15 @@ static int xgpio_probe(struct platform_device *pdev)
305496 if (of_property_read_u32 (np , "xlnx,tri-default" , & chip -> gpio_dir [0 ]))
306497 chip -> gpio_dir [0 ] = 0xFFFFFFFF ;
307498
499+ /* Update cells with gpio-cells value */
500+ if (of_property_read_u32 (np , "#gpio-cells" , & cells ))
501+ dev_dbg (& pdev -> dev , "Missing gpio-cells property\n" );
502+
503+ if (cells != 2 ) {
504+ dev_err (& pdev -> dev , "#gpio-cells mismatch\n" );
505+ return - EINVAL ;
506+ }
507+
308508 /*
309509 * Check device node and parent device node for device width
310510 * and assume default width of 32
@@ -343,6 +543,7 @@ static int xgpio_probe(struct platform_device *pdev)
343543 chip -> gc .parent = & pdev -> dev ;
344544 chip -> gc .direction_input = xgpio_dir_in ;
345545 chip -> gc .direction_output = xgpio_dir_out ;
546+ chip -> gc .of_gpio_n_cells = cells ;
346547 chip -> gc .get = xgpio_get ;
347548 chip -> gc .set = xgpio_set ;
348549 chip -> gc .set_multiple = xgpio_set_multiple ;
@@ -367,14 +568,51 @@ static int xgpio_probe(struct platform_device *pdev)
367568
368569 xgpio_save_regs (chip );
369570
571+ chip -> irq = platform_get_irq_optional (pdev , 0 );
572+ if (chip -> irq <= 0 )
573+ goto skip_irq ;
574+
575+ chip -> irqchip .name = "gpio-xilinx" ;
576+ chip -> irqchip .irq_ack = xgpio_irq_ack ;
577+ chip -> irqchip .irq_mask = xgpio_irq_mask ;
578+ chip -> irqchip .irq_unmask = xgpio_irq_unmask ;
579+ chip -> irqchip .irq_set_type = xgpio_set_irq_type ;
580+
581+ /* Disable per-channel interrupts */
582+ xgpio_writereg (chip -> regs + XGPIO_IPIER_OFFSET , 0 );
583+ /* Clear any existing per-channel interrupts */
584+ temp = xgpio_readreg (chip -> regs + XGPIO_IPISR_OFFSET );
585+ xgpio_writereg (chip -> regs + XGPIO_IPISR_OFFSET , temp );
586+ /* Enable global interrupts */
587+ xgpio_writereg (chip -> regs + XGPIO_GIER_OFFSET , XGPIO_GIER_IE );
588+
589+ girq = & chip -> gc .irq ;
590+ girq -> chip = & chip -> irqchip ;
591+ girq -> parent_handler = xgpio_irqhandler ;
592+ girq -> num_parents = 1 ;
593+ girq -> parents = devm_kcalloc (& pdev -> dev , 1 ,
594+ sizeof (* girq -> parents ),
595+ GFP_KERNEL );
596+ if (!girq -> parents ) {
597+ status = - ENOMEM ;
598+ goto err_unprepare_clk ;
599+ }
600+ girq -> parents [0 ] = chip -> irq ;
601+ girq -> default_type = IRQ_TYPE_NONE ;
602+ girq -> handler = handle_bad_irq ;
603+
604+ skip_irq :
370605 status = devm_gpiochip_add_data (& pdev -> dev , & chip -> gc , chip );
371606 if (status ) {
372607 dev_err (& pdev -> dev , "failed to add GPIO chip\n" );
373- clk_disable_unprepare (chip -> clk );
374- return status ;
608+ goto err_unprepare_clk ;
375609 }
376610
377611 return 0 ;
612+
613+ err_unprepare_clk :
614+ clk_disable_unprepare (chip -> clk );
615+ return status ;
378616}
379617
380618static const struct of_device_id xgpio_of_match [] = {
0 commit comments