Initial porting of xenomai on exynos4
authorArnaud Degroote <arnaud.degroote@isae-supaero.fr>
Fri, 23 Jan 2015 15:11:53 +0000 (16:11 +0100)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Fri, 27 Apr 2018 09:22:32 +0000 (11:22 +0200)
Based on patch from kinsamanka

Signed-off-by: Arnaud Degroote <arnaud.degroote@isae-supaero.fr>
[patch taken from https://github.com/adegroote/linux.git
 linux-stable-xenomai-odroid-3.18.y branch, adapted to v4.14
 IPIPE changes (added IRQCHIP_PIPELINE_SAFE flags to irqchips)]
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
drivers/base/regmap/regmap-irq.c
drivers/irqchip/exynos-combiner.c
drivers/pinctrl/samsung/pinctrl-exynos.c
drivers/pinctrl/samsung/pinctrl-samsung.h

index 429ca8ed7e518087bc1ddaebd9f4c8393eb5179e..ceadb18265bfa784e3347e0285c1fc8419ac39b4 100644 (file)
@@ -267,6 +267,7 @@ static const struct irq_chip regmap_irq_chip = {
        .irq_enable             = regmap_irq_enable,
        .irq_set_type           = regmap_irq_set_type,
        .irq_set_wake           = regmap_irq_set_wake,
+       .flags                  = IRQCHIP_PIPELINE_SAFE,
 };
 
 static irqreturn_t regmap_irq_thread(int irq, void *d)
index b78a169c9c83c0fddb0930f80cda1a195c2e12b9..2c5fc74ad69c9edb82eafa01ca9b55143b9cdf84 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/interrupt.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
+#include <linux/ipipe.h>
 
 #define COMBINER_ENABLE_SET    0x0
 #define COMBINER_ENABLE_CLEAR  0x4
@@ -27,7 +28,7 @@
 
 #define IRQ_IN_COMBINER                8
 
-static DEFINE_SPINLOCK(irq_controller_lock);
+static IPIPE_DEFINE_SPINLOCK(irq_controller_lock);
 
 struct combiner_chip_data {
        unsigned int hwirq_offset;
@@ -88,7 +89,7 @@ static void combiner_handle_cascade_irq(struct irq_desc *desc)
        if (unlikely(!cascade_irq))
                handle_bad_irq(desc);
        else
-               generic_handle_irq(cascade_irq);
+               ipipe_handle_demuxed_irq(cascade_irq);
 
  out:
        chained_irq_exit(chip, desc);
index c8d0de7ea16054d616a2aaaa493e6df1386fedd4..4a2aaceef834dbdc1464c3c6ec3838b2def29a80 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/spinlock.h>
 #include <linux/regmap.h>
 #include <linux/err.h>
+#include <linux/ipipe.h>
 #include <linux/soc/samsung/exynos-pmu.h>
 
 #include <dt-bindings/pinctrl/samsung.h>
@@ -216,6 +217,7 @@ static struct exynos_irq_chip exynos_gpio_irq_chip = {
                .irq_set_type = exynos_irq_set_type,
                .irq_request_resources = exynos_irq_request_resources,
                .irq_release_resources = exynos_irq_release_resources,
+               .flags          = IRQCHIP_PIPELINE_SAFE,
        },
        .eint_con = EXYNOS_GPIO_ECON_OFFSET,
        .eint_mask = EXYNOS_GPIO_EMASK_OFFSET,
@@ -258,7 +260,7 @@ static irqreturn_t exynos_eint_gpio_irq(int irq, void *data)
        virq = irq_linear_revmap(bank->irq_domain, pin);
        if (!virq)
                return IRQ_NONE;
-       generic_handle_irq(virq);
+       ipipe_handle_demuxed_irq(virq);
        return IRQ_HANDLED;
 }
 
@@ -361,6 +363,7 @@ static const struct exynos_irq_chip exynos4210_wkup_irq_chip __initconst = {
                .irq_set_wake = exynos_wkup_irq_set_wake,
                .irq_request_resources = exynos_irq_request_resources,
                .irq_release_resources = exynos_irq_release_resources,
+               .flags          = IRQCHIP_PIPELINE_SAFE,
        },
        .eint_con = EXYNOS_WKUP_ECON_OFFSET,
        .eint_mask = EXYNOS_WKUP_EMASK_OFFSET,
@@ -377,6 +380,7 @@ static const struct exynos_irq_chip exynos7_wkup_irq_chip __initconst = {
                .irq_set_wake = exynos_wkup_irq_set_wake,
                .irq_request_resources = exynos_irq_request_resources,
                .irq_release_resources = exynos_irq_release_resources,
+               .flags          = IRQCHIP_PIPELINE_SAFE,
        },
        .eint_con = EXYNOS7_WKUP_ECON_OFFSET,
        .eint_mask = EXYNOS7_WKUP_EMASK_OFFSET,
@@ -403,7 +407,7 @@ static void exynos_irq_eint0_15(struct irq_desc *desc)
        chained_irq_enter(chip, desc);
 
        eint_irq = irq_linear_revmap(bank->irq_domain, eintd->irq);
-       generic_handle_irq(eint_irq);
+       ipipe_handle_demuxed_irq(eint_irq);
 
        chained_irq_exit(chip, desc);
 }
@@ -415,7 +419,7 @@ static inline void exynos_irq_demux_eint(unsigned long pend,
 
        while (pend) {
                irq = fls(pend) - 1;
-               generic_handle_irq(irq_find_mapping(domain, irq));
+               ipipe_handle_demuxed_irq(irq_find_mapping(domain, irq));
                pend &= ~(1 << irq);
        }
 }
index 9af07af6cad627b5e02d4fbd362149e42dd97343..9f2eb54d90c57126af9250307c2520ce79e60414 100644 (file)
@@ -175,7 +175,7 @@ struct samsung_pin_bank {
        struct gpio_chip gpio_chip;
        struct pinctrl_gpio_range grange;
        struct exynos_irq_chip *irq_chip;
-       spinlock_t slock;
+       ipipe_spinlock_t slock;
 
        u32 pm_save[PINCFG_TYPE_NUM + 1]; /* +1 to handle double CON registers*/
 };