diff options
Diffstat (limited to 'drivers/platform/x86/intel_int0002_vgpio.c')
| -rw-r--r-- | drivers/platform/x86/intel_int0002_vgpio.c | 26 | 
1 files changed, 19 insertions, 7 deletions
diff --git a/drivers/platform/x86/intel_int0002_vgpio.c b/drivers/platform/x86/intel_int0002_vgpio.c index d9542c661ddc..af233b7b77f2 100644 --- a/drivers/platform/x86/intel_int0002_vgpio.c +++ b/drivers/platform/x86/intel_int0002_vgpio.c @@ -122,7 +122,7 @@ static irqreturn_t int0002_irq(int irq, void *data)  	generic_handle_irq(irq_find_mapping(chip->irq.domain,  					    GPE0A_PME_B0_VIRT_GPIO_PIN)); -	pm_system_wakeup(); +	pm_wakeup_hard_event(chip->parent);  	return IRQ_HANDLED;  } @@ -144,6 +144,7 @@ static struct irq_chip int0002_cht_irqchip = {  	 * 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.  	 */ +	.flags			= IRQCHIP_SKIP_SET_WAKE,  };  static const struct x86_cpu_id int0002_cpu_ids[] = { @@ -152,6 +153,13 @@ static const struct x86_cpu_id int0002_cpu_ids[] = {  	{}  }; +static void int0002_init_irq_valid_mask(struct gpio_chip *chip, +					unsigned long *valid_mask, +					unsigned int ngpios) +{ +	bitmap_clear(valid_mask, 0, GPE0A_PME_B0_VIRT_GPIO_PIN); +} +  static int int0002_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev; @@ -166,10 +174,8 @@ static int int0002_probe(struct platform_device *pdev)  		return -ENODEV;  	irq = platform_get_irq(pdev, 0); -	if (irq < 0) { -		dev_err(dev, "Error getting IRQ: %d\n", irq); +	if (irq < 0)  		return irq; -	}  	chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);  	if (!chip) @@ -184,7 +190,7 @@ static int int0002_probe(struct platform_device *pdev)  	chip->direction_output = int0002_gpio_direction_output;  	chip->base = -1;  	chip->ngpio = GPE0A_PME_B0_VIRT_GPIO_PIN + 1; -	chip->irq.need_valid_mask = true; +	chip->irq.init_valid_mask = int0002_init_irq_valid_mask;  	ret = devm_gpiochip_add_data(&pdev->dev, chip, NULL);  	if (ret) { @@ -192,8 +198,6 @@ static int int0002_probe(struct platform_device *pdev)  		return ret;  	} -	bitmap_clear(chip->irq.valid_mask, 0, GPE0A_PME_B0_VIRT_GPIO_PIN); -  	/*  	 * We manually request the irq here instead of passing a flow-handler  	 * to gpiochip_set_chained_irqchip, because the irq is shared. @@ -216,6 +220,13 @@ static int int0002_probe(struct platform_device *pdev)  	gpiochip_set_chained_irqchip(chip, irq_chip, irq, NULL); +	device_init_wakeup(dev, true); +	return 0; +} + +static int int0002_remove(struct platform_device *pdev) +{ +	device_init_wakeup(&pdev->dev, false);  	return 0;  } @@ -231,6 +242,7 @@ static struct platform_driver int0002_driver = {  		.acpi_match_table	= int0002_acpi_ids,  	},  	.probe	= int0002_probe, +	.remove	= int0002_remove,  };  module_platform_driver(int0002_driver);  |