mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	platform/x86: intel_int0002_vgpio: Implement irq_set_wake
We were relying on the interrupt being shared with the ACPI SCI and the ACPI core calling irq_set_wake. But that does not always happen on Bay Trail devices, so we should do it ourselves. This fixes wake from USB not working on various Bay Trail devices. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
This commit is contained in:
		
							parent
							
								
									96402de65a
								
							
						
					
					
						commit
						c3b8e884de
					
				
					 1 changed files with 16 additions and 0 deletions
				
			
		| 
						 | 
					@ -106,6 +106,21 @@ static void int0002_irq_mask(struct irq_data *data)
 | 
				
			||||||
	outl(gpe_en_reg, GPE0A_EN_PORT);
 | 
						outl(gpe_en_reg, GPE0A_EN_PORT);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int int0002_irq_set_wake(struct irq_data *data, unsigned int on)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
 | 
				
			||||||
 | 
						struct platform_device *pdev = to_platform_device(chip->parent);
 | 
				
			||||||
 | 
						int irq = platform_get_irq(pdev, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Propagate to parent irq */
 | 
				
			||||||
 | 
						if (on)
 | 
				
			||||||
 | 
							enable_irq_wake(irq);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							disable_irq_wake(irq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static irqreturn_t int0002_irq(int irq, void *data)
 | 
					static irqreturn_t int0002_irq(int irq, void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct gpio_chip *chip = data;
 | 
						struct gpio_chip *chip = data;
 | 
				
			||||||
| 
						 | 
					@ -128,6 +143,7 @@ static struct irq_chip int0002_irqchip = {
 | 
				
			||||||
	.irq_ack		= int0002_irq_ack,
 | 
						.irq_ack		= int0002_irq_ack,
 | 
				
			||||||
	.irq_mask		= int0002_irq_mask,
 | 
						.irq_mask		= int0002_irq_mask,
 | 
				
			||||||
	.irq_unmask		= int0002_irq_unmask,
 | 
						.irq_unmask		= int0002_irq_unmask,
 | 
				
			||||||
 | 
						.irq_set_wake		= int0002_irq_set_wake,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int int0002_probe(struct platform_device *pdev)
 | 
					static int int0002_probe(struct platform_device *pdev)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue