mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	platform/x86: intel_int0002_vgpio: Only implement irq_set_wake on Bay Trail
Commitc3b8e884de("platform/x86: intel_int0002_vgpio: Implement irq_set_wake"), was written to fix some wakeup issues on Bay Trail (BYT) devices. We've received a bug report that this causes a suspend regression on some Cherry Trail (CHT) based devices. To fix the issues this causes on CHT devices, this commit modifies the irq_set_wake support so that we only implement irq_set_wake on BYT devices, Fixes:c3b8e884de("platform/x86: intel_int0002_vgpio: ... irq_set_wake") Reported-and-tested-by: Maxim Mikityanskiy <maxtram95@gmail.com> 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
							
								
									0bbbe97f2f
								
							
						
					
					
						commit
						871f1f2bcb
					
				
					 1 changed files with 26 additions and 6 deletions
				
			
		| 
						 | 
					@ -51,11 +51,14 @@
 | 
				
			||||||
#define GPE0A_STS_PORT			0x420
 | 
					#define GPE0A_STS_PORT			0x420
 | 
				
			||||||
#define GPE0A_EN_PORT			0x428
 | 
					#define GPE0A_EN_PORT			0x428
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ICPU(model)	{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, }
 | 
					#define BAYTRAIL			0x01
 | 
				
			||||||
 | 
					#define CHERRYTRAIL			0x02
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ICPU(model, data) { X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, data }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct x86_cpu_id int0002_cpu_ids[] = {
 | 
					static const struct x86_cpu_id int0002_cpu_ids[] = {
 | 
				
			||||||
	ICPU(INTEL_FAM6_ATOM_SILVERMONT),	/* Valleyview, Bay Trail  */
 | 
						ICPU(INTEL_FAM6_ATOM_SILVERMONT, BAYTRAIL), /* Valleyview, Bay Trail  */
 | 
				
			||||||
	ICPU(INTEL_FAM6_ATOM_AIRMONT),		/* Braswell, Cherry Trail */
 | 
						ICPU(INTEL_FAM6_ATOM_AIRMONT, CHERRYTRAIL), /* Braswell, Cherry Trail */
 | 
				
			||||||
	{}
 | 
						{}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -135,7 +138,7 @@ static irqreturn_t int0002_irq(int irq, void *data)
 | 
				
			||||||
	return IRQ_HANDLED;
 | 
						return IRQ_HANDLED;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct irq_chip int0002_irqchip = {
 | 
					static struct irq_chip int0002_byt_irqchip = {
 | 
				
			||||||
	.name			= DRV_NAME,
 | 
						.name			= DRV_NAME,
 | 
				
			||||||
	.irq_ack		= int0002_irq_ack,
 | 
						.irq_ack		= int0002_irq_ack,
 | 
				
			||||||
	.irq_mask		= int0002_irq_mask,
 | 
						.irq_mask		= int0002_irq_mask,
 | 
				
			||||||
| 
						 | 
					@ -143,10 +146,22 @@ static struct irq_chip int0002_irqchip = {
 | 
				
			||||||
	.irq_set_wake		= int0002_irq_set_wake,
 | 
						.irq_set_wake		= int0002_irq_set_wake,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct irq_chip int0002_cht_irqchip = {
 | 
				
			||||||
 | 
						.name			= DRV_NAME,
 | 
				
			||||||
 | 
						.irq_ack		= int0002_irq_ack,
 | 
				
			||||||
 | 
						.irq_mask		= int0002_irq_mask,
 | 
				
			||||||
 | 
						.irq_unmask		= int0002_irq_unmask,
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * No set_wake, on CHT the IRQ is typically shared with the ACPI SCI
 | 
				
			||||||
 | 
						 * and we don't want to mess with the ACPI SCI irq settings.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int int0002_probe(struct platform_device *pdev)
 | 
					static int int0002_probe(struct platform_device *pdev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct device *dev = &pdev->dev;
 | 
						struct device *dev = &pdev->dev;
 | 
				
			||||||
	const struct x86_cpu_id *cpu_id;
 | 
						const struct x86_cpu_id *cpu_id;
 | 
				
			||||||
 | 
						struct irq_chip *irq_chip;
 | 
				
			||||||
	struct gpio_chip *chip;
 | 
						struct gpio_chip *chip;
 | 
				
			||||||
	int irq, ret;
 | 
						int irq, ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -195,14 +210,19 @@ static int int0002_probe(struct platform_device *pdev)
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = gpiochip_irqchip_add(chip, &int0002_irqchip, 0, handle_edge_irq,
 | 
						if (cpu_id->driver_data == BAYTRAIL)
 | 
				
			||||||
 | 
							irq_chip = &int0002_byt_irqchip;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							irq_chip = &int0002_cht_irqchip;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = gpiochip_irqchip_add(chip, irq_chip, 0, handle_edge_irq,
 | 
				
			||||||
				   IRQ_TYPE_NONE);
 | 
									   IRQ_TYPE_NONE);
 | 
				
			||||||
	if (ret) {
 | 
						if (ret) {
 | 
				
			||||||
		dev_err(dev, "Error adding irqchip: %d\n", ret);
 | 
							dev_err(dev, "Error adding irqchip: %d\n", ret);
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gpiochip_set_chained_irqchip(chip, &int0002_irqchip, irq, NULL);
 | 
						gpiochip_set_chained_irqchip(chip, irq_chip, irq, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue