aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2019-02-03 04:42:33 -0500
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>2019-02-05 13:28:54 -0500
commit871f1f2bcb01d205472ddac70d38e8b08e902f15 (patch)
tree935e7c8c6113aa0a2223cb97f88c60fca3f585af
parent0bbbe97f2f851138891148a99400109da956c694 (diff)
platform/x86: intel_int0002_vgpio: Only implement irq_set_wake on Bay Trail
Commit c3b8e884defa ("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: c3b8e884defa ("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>
-rw-r--r--drivers/platform/x86/intel_int0002_vgpio.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/drivers/platform/x86/intel_int0002_vgpio.c b/drivers/platform/x86/intel_int0002_vgpio.c
index 4b8f7305fc8a..1694a9aec77c 100644
--- a/drivers/platform/x86/intel_int0002_vgpio.c
+++ b/drivers/platform/x86/intel_int0002_vgpio.c
@@ -51,11 +51,14 @@
51#define GPE0A_STS_PORT 0x420 51#define GPE0A_STS_PORT 0x420
52#define GPE0A_EN_PORT 0x428 52#define GPE0A_EN_PORT 0x428
53 53
54#define ICPU(model) { X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, } 54#define BAYTRAIL 0x01
55#define CHERRYTRAIL 0x02
56
57#define ICPU(model, data) { X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, data }
55 58
56static const struct x86_cpu_id int0002_cpu_ids[] = { 59static const struct x86_cpu_id int0002_cpu_ids[] = {
57 ICPU(INTEL_FAM6_ATOM_SILVERMONT), /* Valleyview, Bay Trail */ 60 ICPU(INTEL_FAM6_ATOM_SILVERMONT, BAYTRAIL), /* Valleyview, Bay Trail */
58 ICPU(INTEL_FAM6_ATOM_AIRMONT), /* Braswell, Cherry Trail */ 61 ICPU(INTEL_FAM6_ATOM_AIRMONT, CHERRYTRAIL), /* Braswell, Cherry Trail */
59 {} 62 {}
60}; 63};
61 64
@@ -135,7 +138,7 @@ static irqreturn_t int0002_irq(int irq, void *data)
135 return IRQ_HANDLED; 138 return IRQ_HANDLED;
136} 139}
137 140
138static struct irq_chip int0002_irqchip = { 141static struct irq_chip int0002_byt_irqchip = {
139 .name = DRV_NAME, 142 .name = DRV_NAME,
140 .irq_ack = int0002_irq_ack, 143 .irq_ack = int0002_irq_ack,
141 .irq_mask = int0002_irq_mask, 144 .irq_mask = int0002_irq_mask,
@@ -143,10 +146,22 @@ static struct irq_chip int0002_irqchip = {
143 .irq_set_wake = int0002_irq_set_wake, 146 .irq_set_wake = int0002_irq_set_wake,
144}; 147};
145 148
149static struct irq_chip int0002_cht_irqchip = {
150 .name = DRV_NAME,
151 .irq_ack = int0002_irq_ack,
152 .irq_mask = int0002_irq_mask,
153 .irq_unmask = int0002_irq_unmask,
154 /*
155 * No set_wake, on CHT the IRQ is typically shared with the ACPI SCI
156 * and we don't want to mess with the ACPI SCI irq settings.
157 */
158};
159
146static int int0002_probe(struct platform_device *pdev) 160static int int0002_probe(struct platform_device *pdev)
147{ 161{
148 struct device *dev = &pdev->dev; 162 struct device *dev = &pdev->dev;
149 const struct x86_cpu_id *cpu_id; 163 const struct x86_cpu_id *cpu_id;
164 struct irq_chip *irq_chip;
150 struct gpio_chip *chip; 165 struct gpio_chip *chip;
151 int irq, ret; 166 int irq, ret;
152 167
@@ -195,14 +210,19 @@ static int int0002_probe(struct platform_device *pdev)
195 return ret; 210 return ret;
196 } 211 }
197 212
198 ret = gpiochip_irqchip_add(chip, &int0002_irqchip, 0, handle_edge_irq, 213 if (cpu_id->driver_data == BAYTRAIL)
214 irq_chip = &int0002_byt_irqchip;
215 else
216 irq_chip = &int0002_cht_irqchip;
217
218 ret = gpiochip_irqchip_add(chip, irq_chip, 0, handle_edge_irq,
199 IRQ_TYPE_NONE); 219 IRQ_TYPE_NONE);
200 if (ret) { 220 if (ret) {
201 dev_err(dev, "Error adding irqchip: %d\n", ret); 221 dev_err(dev, "Error adding irqchip: %d\n", ret);
202 return ret; 222 return ret;
203 } 223 }
204 224
205 gpiochip_set_chained_irqchip(chip, &int0002_irqchip, irq, NULL); 225 gpiochip_set_chained_irqchip(chip, irq_chip, irq, NULL);
206 226
207 return 0; 227 return 0;
208} 228}