| From foo@baz Thu Mar 22 14:57:32 CET 2018 |
| From: Hans de Goede <hdegoede@redhat.com> |
| Date: Sat, 18 Mar 2017 14:45:49 +0100 |
| Subject: rtc: cmos: Do not assume irq 8 for rtc when there are no legacy irqs |
| |
| From: Hans de Goede <hdegoede@redhat.com> |
| |
| |
| [ Upstream commit a1e23a42f1bdc00e32fc4869caef12e4e6272f26 ] |
| |
| On some systems (e.g. Intel Bay Trail systems) the legacy PIC is not |
| used, in this case virq 8 will be a random irq, rather then hw_irq 8 |
| from the PIC. |
| |
| Requesting virq 8 in this case will not help us to get alarm irqs and |
| may cause problems for other drivers which actually do need virq 8, |
| for example on an Asus Transformer T100TA this leads to: |
| |
| [ 28.745155] genirq: Flags mismatch irq 8. 00000088 (mmc0) vs. 00000080 (rtc0) |
| <snip oops> |
| [ 28.753700] mmc0: Failed to request IRQ 8: -16 |
| [ 28.975934] sdhci-acpi: probe of 80860F14:01 failed with error -16 |
| |
| This commit fixes this by making the rtc-cmos driver continue |
| without using an irq rather then claiming irq 8 when no irq is |
| specified in the pnp-info and there are no legacy-irqs. |
| |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/rtc/rtc-cmos.c | 17 +++++++++++++---- |
| 1 file changed, 13 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/rtc/rtc-cmos.c |
| +++ b/drivers/rtc/rtc-cmos.c |
| @@ -41,6 +41,9 @@ |
| #include <linux/pm.h> |
| #include <linux/of.h> |
| #include <linux/of_platform.h> |
| +#ifdef CONFIG_X86 |
| +#include <asm/i8259.h> |
| +#endif |
| |
| /* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */ |
| #include <asm-generic/rtc.h> |
| @@ -1058,17 +1061,23 @@ static int cmos_pnp_probe(struct pnp_dev |
| { |
| cmos_wake_setup(&pnp->dev); |
| |
| - if (pnp_port_start(pnp, 0) == 0x70 && !pnp_irq_valid(pnp, 0)) |
| + if (pnp_port_start(pnp, 0) == 0x70 && !pnp_irq_valid(pnp, 0)) { |
| + unsigned int irq = 0; |
| +#ifdef CONFIG_X86 |
| /* Some machines contain a PNP entry for the RTC, but |
| * don't define the IRQ. It should always be safe to |
| - * hardcode it in these cases |
| + * hardcode it on systems with a legacy PIC. |
| */ |
| + if (nr_legacy_irqs()) |
| + irq = 8; |
| +#endif |
| return cmos_do_probe(&pnp->dev, |
| - pnp_get_resource(pnp, IORESOURCE_IO, 0), 8); |
| - else |
| + pnp_get_resource(pnp, IORESOURCE_IO, 0), irq); |
| + } else { |
| return cmos_do_probe(&pnp->dev, |
| pnp_get_resource(pnp, IORESOURCE_IO, 0), |
| pnp_irq(pnp, 0)); |
| + } |
| } |
| |
| static void __exit cmos_pnp_remove(struct pnp_dev *pnp) |