Author: skra
Date: Thu May  5 13:31:19 2016
New Revision: 299117
URL: https://svnweb.freebsd.org/changeset/base/299117

Log:
  INTRNG - redefine struct intr_map_data to avoid headers pollution. Each
  struct associated with some type defined in enum intr_map_data_type
  must have struct intr_map_data on the top of its own definition now.
  When such structs are used, correct type and size must be filled in.
  
  There are three such structs defined in sys/intr.h now. Their
  definitions should be moved to corresponding headers by follow-up
  commits.
  
  While this change was propagated to all INTRNG like PICs,
  pic_map_intr() method implementations were corrected on some places.
  For this specific method, it's ensured by a caller that the 'data'
  argument passed to this method is never NULL. Also, the return error
  values were standardized there.

Modified:
  head/sys/arm/allwinner/a10/a10_intc.c
  head/sys/arm/allwinner/aw_nmi.c
  head/sys/arm/arm/gic.c
  head/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
  head/sys/arm/broadcom/bcm2835/bcm2835_intr.c
  head/sys/arm/broadcom/bcm2835/bcm2836.c
  head/sys/arm/freescale/imx/imx_gpio.c
  head/sys/arm/mv/mpic.c
  head/sys/arm/nvidia/tegra_gpio.c
  head/sys/arm/ti/aintc.c
  head/sys/arm/ti/ti_gpio.c
  head/sys/kern/subr_intr.c
  head/sys/mips/mediatek/mtk_gpio_v1.c
  head/sys/mips/mediatek/mtk_gpio_v2.c
  head/sys/mips/mediatek/mtk_intr_gic.c
  head/sys/mips/mediatek/mtk_intr_v1.c
  head/sys/mips/mediatek/mtk_intr_v2.c
  head/sys/mips/mips/mips_pic.c
  head/sys/sys/intr.h

Modified: head/sys/arm/allwinner/a10/a10_intc.c
==============================================================================
--- head/sys/arm/allwinner/a10/a10_intc.c       Thu May  5 13:23:38 2016        
(r299116)
+++ head/sys/arm/allwinner/a10/a10_intc.c       Thu May  5 13:31:19 2016        
(r299117)
@@ -298,14 +298,18 @@ static int
 a10_intr_map_intr(device_t dev, struct intr_map_data *data,
     struct intr_irqsrc **isrcp)
 {
+       struct intr_map_data_fdt *daf;
        struct a10_aintc_softc *sc;
 
-       if (data->type != INTR_MAP_DATA_FDT || data->fdt.ncells != 1 ||
-           data->fdt.cells[0] >= A10_INTR_MAX_NIRQS)
+       if (data->type != INTR_MAP_DATA_FDT)
+               return (ENOTSUP);
+
+       daf = (struct intr_map_data_fdt *)data;
+       if (daf->ncells != 1 || daf->cells[0] >= A10_INTR_MAX_NIRQS)
                return (EINVAL);
 
        sc = device_get_softc(dev);
-       *isrcp = &sc->isrcs[data->fdt.cells[0]].isrc;
+       *isrcp = &sc->isrcs[daf->cells[0]].isrc;
        return (0);
 }
 

Modified: head/sys/arm/allwinner/aw_nmi.c
==============================================================================
--- head/sys/arm/allwinner/aw_nmi.c     Thu May  5 13:23:38 2016        
(r299116)
+++ head/sys/arm/allwinner/aw_nmi.c     Thu May  5 13:31:19 2016        
(r299117)
@@ -188,16 +188,18 @@ static int
 aw_nmi_map_intr(device_t dev, struct intr_map_data *data,
     struct intr_irqsrc **isrcp)
 {
+       struct intr_map_data_fdt *daf;
        struct aw_nmi_softc *sc;
        int error;
        u_int irq;
 
-       sc = device_get_softc(dev);
        if (data->type != INTR_MAP_DATA_FDT)
                return (ENOTSUP);
 
-       error = aw_nmi_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq,
-           NULL, NULL);
+       sc = device_get_softc(dev);
+       daf = (struct intr_map_data_fdt *)data;
+
+       error = aw_nmi_map_fdt(dev, daf->ncells, daf->cells, &irq, NULL, NULL);
        if (error == 0)
                *isrcp = &sc->intr.isrc;
 
@@ -208,6 +210,7 @@ static int
 aw_nmi_setup_intr(device_t dev, struct intr_irqsrc *isrc,
     struct resource *res, struct intr_map_data *data)
 {
+       struct intr_map_data_fdt *daf;
        struct aw_nmi_softc *sc;
        struct aw_nmi_intr *nmi_intr;
        int error, icfg;
@@ -215,14 +218,15 @@ aw_nmi_setup_intr(device_t dev, struct i
        enum intr_trigger trig;
        enum intr_polarity pol;
 
-       sc = device_get_softc(dev);
-       nmi_intr = (struct aw_nmi_intr *)isrc;
-
        /* Get config for interrupt. */
        if (data == NULL || data->type != INTR_MAP_DATA_FDT)
                return (ENOTSUP);
-       error = aw_nmi_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq,
-           &pol, &trig);
+
+       sc = device_get_softc(dev);
+       nmi_intr = (struct aw_nmi_intr *)isrc;
+       daf = (struct intr_map_data_fdt *)data;
+
+       error = aw_nmi_map_fdt(dev, daf->ncells, daf->cells, &irq, &pol, &trig);
        if (error != 0)
                return (error);
        if (nmi_intr->irq != irq)

Modified: head/sys/arm/arm/gic.c
==============================================================================
--- head/sys/arm/arm/gic.c      Thu May  5 13:23:38 2016        (r299116)
+++ head/sys/arm/arm/gic.c      Thu May  5 13:31:19 2016        (r299117)
@@ -1006,18 +1006,22 @@ gic_map_intr(device_t dev, struct intr_m
        enum intr_polarity pol;
        enum intr_trigger trig;
        struct arm_gic_softc *sc;
+#ifdef FDT
+       struct intr_map_data_fdt *daf;
+#endif
 
        sc = device_get_softc(dev);
        switch (data->type) {
 #ifdef FDT
        case INTR_MAP_DATA_FDT:
-               if (gic_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq,
-                   &pol, &trig) != 0)
+               daf = (struct intr_map_data_fdt *)data;
+               if (gic_map_fdt(dev, daf->ncells, daf->cells, &irq, &pol,
+                   &trig) != 0)
                        return (EINVAL);
                break;
 #endif
        default:
-               return (EINVAL);
+               return (ENOTSUP);
        }
 
        if (irq >= sc->nirqs)

Modified: head/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_gpio.c        Thu May  5 13:23:38 
2016        (r299116)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_gpio.c        Thu May  5 13:31:19 
2016        (r299117)
@@ -1078,14 +1078,16 @@ bcm_gpio_pic_map_intr(device_t dev, stru
 {
        int error;
        u_int irq;
+       struct intr_map_data_fdt *daf;
        struct bcm_gpio_softc *sc;
 
        if (data->type != INTR_MAP_DATA_FDT)
                return (ENOTSUP);
 
        sc = device_get_softc(dev);
-       error = bcm_gpio_pic_map_fdt(sc, data->fdt.ncells, data->fdt.cells,
-           &irq, NULL);
+       daf = (struct intr_map_data_fdt *)data;
+
+       error = bcm_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq, NULL);
        if (error == 0)
                *isrcp = &sc->sc_isrcs[irq].bgi_isrc;
        return (error);
@@ -1127,15 +1129,17 @@ bcm_gpio_pic_setup_intr(device_t dev, st
        uint32_t bank, reg;
        struct bcm_gpio_softc *sc;
        struct bcm_gpio_irqsrc *bgi;
+       struct intr_map_data_fdt *daf;
 
        if (data == NULL || data->type != INTR_MAP_DATA_FDT)
                return (ENOTSUP);
 
        sc = device_get_softc(dev);
        bgi = (struct bcm_gpio_irqsrc *)isrc;
+       daf = (struct intr_map_data_fdt *)data;
 
        /* Get and check config for an interrupt. */
-       if (bcm_gpio_pic_map_fdt(sc, data->fdt.ncells, data->fdt.cells, &irq,
+       if (bcm_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq,
            &reg) != 0 || bgi->bgi_irq != irq)
                return (EINVAL);
 

Modified: head/sys/arm/broadcom/bcm2835/bcm2835_intr.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_intr.c        Thu May  5 13:23:38 
2016        (r299116)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_intr.c        Thu May  5 13:31:19 
2016        (r299117)
@@ -268,14 +268,17 @@ bcm_intc_map_intr(device_t dev, struct i
     struct intr_irqsrc **isrcp)
 {
        u_int irq;
+       struct intr_map_data_fdt *daf;
        struct bcm_intc_softc *sc;
 
        if (data->type != INTR_MAP_DATA_FDT)
                return (ENOTSUP);
-       if (data->fdt.ncells == 1)
-               irq = data->fdt.cells[0];
-       else if (data->fdt.ncells == 2)
-               irq = data->fdt.cells[0] * 32 + data->fdt.cells[1];
+
+       daf = (struct intr_map_data_fdt *)data;
+       if (daf->ncells == 1)
+               irq = daf->cells[0];
+       else if (daf->ncells == 2)
+               irq = daf->cells[0] * 32 + daf->cells[1];
        else
                return (EINVAL);
 

Modified: head/sys/arm/broadcom/bcm2835/bcm2836.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2836.c     Thu May  5 13:23:38 2016        
(r299116)
+++ head/sys/arm/broadcom/bcm2835/bcm2836.c     Thu May  5 13:31:19 2016        
(r299117)
@@ -461,15 +461,18 @@ static int
 bcm_lintc_map_intr(device_t dev, struct intr_map_data *data,
     struct intr_irqsrc **isrcp)
 {
+       struct intr_map_data_fdt *daf;
        struct bcm_lintc_softc *sc;
 
        if (data->type != INTR_MAP_DATA_FDT)
                return (ENOTSUP);
-       if (data->fdt.ncells != 1 || data->fdt.cells[0] >= BCM_LINTC_NIRQS)
+
+       daf = (struct intr_map_data_fdt *)data;
+       if (daf->ncells != 1 || daf->cells[0] >= BCM_LINTC_NIRQS)
                return (EINVAL);
 
        sc = device_get_softc(dev);
-       *isrcp = &sc->bls_isrcs[data->fdt.cells[0]].bli_isrc;
+       *isrcp = &sc->bls_isrcs[daf->cells[0]].bli_isrc;
        return (0);
 }
 

Modified: head/sys/arm/freescale/imx/imx_gpio.c
==============================================================================
--- head/sys/arm/freescale/imx/imx_gpio.c       Thu May  5 13:23:38 2016        
(r299116)
+++ head/sys/arm/freescale/imx/imx_gpio.c       Thu May  5 13:31:19 2016        
(r299117)
@@ -225,13 +225,15 @@ gpio_pic_map_intr(device_t dev, struct i
 {
        int error;
        u_int irq;
+       struct intr_map_data_fdt *daf;
        struct imx51_gpio_softc *sc;
 
        if (data->type != INTR_MAP_DATA_FDT)
                return (ENOTSUP);
 
-       error = gpio_pic_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq,
-           NULL, NULL);
+       daf = (struct intr_map_data_fdt *)data;
+       error = gpio_pic_map_fdt(dev, daf->ncells, daf->cells, &irq, NULL,
+           NULL);
        if (error == 0) {
                sc = device_get_softc(dev);
                *isrcp = &sc->gpio_pic_irqsrc[irq].gi_isrc;
@@ -265,6 +267,7 @@ static int
 gpio_pic_setup_intr(device_t dev, struct intr_irqsrc *isrc,
     struct resource *res, struct intr_map_data *data)
 {
+       struct intr_map_data_fdt *daf;
        struct imx51_gpio_softc *sc;
        struct gpio_irqsrc *gi;
        int error, icfg;
@@ -278,8 +281,9 @@ gpio_pic_setup_intr(device_t dev, struct
        /* Get config for interrupt. */
        if (data == NULL || data->type != INTR_MAP_DATA_FDT)
                return (ENOTSUP);
-       error = gpio_pic_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq,
-           &pol, &trig);
+       daf = (struct intr_map_data_fdt *)data;
+       error = gpio_pic_map_fdt(dev, daf->ncells, daf->cells, &irq, &pol,
+           &trig);
        if (error != 0)
                return (error);
        if (gi->gi_irq != irq)

Modified: head/sys/arm/mv/mpic.c
==============================================================================
--- head/sys/arm/mv/mpic.c      Thu May  5 13:23:38 2016        (r299116)
+++ head/sys/arm/mv/mpic.c      Thu May  5 13:31:19 2016        (r299117)
@@ -339,15 +339,19 @@ static int
 mpic_map_intr(device_t dev, struct intr_map_data *data,
     struct intr_irqsrc **isrcp)
 {
+       struct intr_map_data_fdt *daf;
        struct mv_mpic_softc *sc;
 
+       if (data->type != INTR_MAP_DATA_FDT)
+               return (ENOTSUP);
+
        sc = device_get_softc(dev);
+       daf = (struct intr_map_data_fdt *)data;
 
-       if (data->type != INTR_MAP_DATA_FDT || data->fdt.ncells !=1 ||
-           data->fdt.cells[0] >= sc->nirqs)
+       if (daf->ncells !=1 || daf->cells[0] >= sc->nirqs)
                return (EINVAL);
 
-       *isrcp = &sc->mpic_isrcs[data->fdt.cells[0]].mmi_isrc;
+       *isrcp = &sc->mpic_isrcs[daf->cells[0]].mmi_isrc;
        return (0);
 }
 

Modified: head/sys/arm/nvidia/tegra_gpio.c
==============================================================================
--- head/sys/arm/nvidia/tegra_gpio.c    Thu May  5 13:23:38 2016        
(r299116)
+++ head/sys/arm/nvidia/tegra_gpio.c    Thu May  5 13:31:19 2016        
(r299117)
@@ -579,14 +579,19 @@ tegra_gpio_pic_map_intr(device_t dev, st
 
        sc = device_get_softc(dev);
 
-       if (data->type == INTR_MAP_DATA_FDT)
-               rv = tegra_gpio_pic_map_fdt(sc, data->fdt.ncells,
-                   data->fdt.cells, &irq, NULL);
-       else if (data->type == INTR_MAP_DATA_GPIO)
-               rv = tegra_gpio_pic_map_gpio(sc, data->gpio.gpio_pin_num,
-                  data->gpio.gpio_pin_flags, data->gpio.gpio_intr_mode,
-                      &irq, NULL);
-       else
+       if (data->type == INTR_MAP_DATA_FDT) {
+               struct intr_map_data_fdt *daf;
+
+               daf = (struct intr_map_data_fdt *)data;
+               rv = tegra_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq,
+                   NULL);
+       } else if (data->type == INTR_MAP_DATA_GPIO) {
+               struct intr_map_data_gpio *dag;
+
+               dag = (struct intr_map_data_gpio *)data;
+               rv = tegra_gpio_pic_map_gpio(sc, dag->gpio_pin_num,
+                  dag->gpio_pin_flags, dag->gpio_intr_mode, &irq, NULL);
+       } else
                return (ENOTSUP);
 
        if (rv == 0)
@@ -648,14 +653,19 @@ tegra_gpio_pic_setup_intr(device_t dev, 
                return (ENOTSUP);
 
        /* Get and check config for an interrupt. */
-       if (data->type == INTR_MAP_DATA_FDT)
-               rv = tegra_gpio_pic_map_fdt(sc, data->fdt.ncells,
-                   data->fdt.cells, &irq, &cfgreg);
-       else if (data->type == INTR_MAP_DATA_GPIO)
-               rv = tegra_gpio_pic_map_gpio(sc, data->gpio.gpio_pin_num,
-                  data->gpio.gpio_pin_flags, data->gpio.gpio_intr_mode,
-                      &irq, &cfgreg);
-       else
+       if (data->type == INTR_MAP_DATA_FDT) {
+               struct intr_map_data_fdt *daf;
+
+               daf = (struct intr_map_data_fdt *)data;
+               rv = tegra_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq,
+                   &cfgreg);
+       } else if (data->type == INTR_MAP_DATA_GPIO) {
+               struct intr_map_data_gpio *dag;
+
+               dag = (struct intr_map_data_gpio *)data;
+               rv = tegra_gpio_pic_map_gpio(sc, dag->gpio_pin_num,
+                  dag->gpio_pin_flags, dag->gpio_intr_mode, &irq, &cfgreg);
+       } else
                return (ENOTSUP);
        if (rv != 0)
                return (EINVAL);

Modified: head/sys/arm/ti/aintc.c
==============================================================================
--- head/sys/arm/ti/aintc.c     Thu May  5 13:23:38 2016        (r299116)
+++ head/sys/arm/ti/aintc.c     Thu May  5 13:31:19 2016        (r299117)
@@ -178,14 +178,18 @@ static int
 ti_aintc_map_intr(device_t dev, struct intr_map_data *data,
     struct intr_irqsrc **isrcp)
 {
+       struct intr_map_data_fdt *daf;
        struct ti_aintc_softc *sc;
 
-       if (data->type != INTR_MAP_DATA_FDT || data->fdt.ncells != 1 ||
-           data->fdt.cells[0] >= INTC_NIRQS)
+       if (data->type != INTR_MAP_DATA_FDT)
+               return (ENOTSUP);
+
+       daf = (struct intr_map_data_fdt *)data;
+       if (daf->ncells != 1 || daf->cells[0] >= INTC_NIRQS)
                return (EINVAL);
 
        sc = device_get_softc(dev);
-       *isrcp = &sc->aintc_isrcs[data->fdt.cells[0]].tai_isrc;
+       *isrcp = &sc->aintc_isrcs[daf->cells[0]].tai_isrc;
        return (0);
 }
 

Modified: head/sys/arm/ti/ti_gpio.c
==============================================================================
--- head/sys/arm/ti/ti_gpio.c   Thu May  5 13:23:38 2016        (r299116)
+++ head/sys/arm/ti/ti_gpio.c   Thu May  5 13:31:19 2016        (r299117)
@@ -979,13 +979,15 @@ ti_gpio_pic_map_intr(device_t dev, struc
        int error;
        u_int irq;
        struct ti_gpio_softc *sc;
+       struct intr_map_data_fdt *daf;
 
        if (data->type != INTR_MAP_DATA_FDT)
                return (ENOTSUP);
 
        sc = device_get_softc(dev);
-       error = ti_gpio_pic_map_fdt(sc, data->fdt.ncells, data->fdt.cells, &irq,
-           NULL);
+       daf = (struct intr_map_data_fdt *)data;
+
+       error = ti_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq, NULL);
        if (error == 0)
                *isrcp = &sc->sc_isrcs[irq].tgi_isrc;
        return (error);
@@ -1027,15 +1029,17 @@ ti_gpio_pic_setup_intr(device_t dev, str
        uint32_t cfgreg;
        struct ti_gpio_softc *sc;
        struct ti_gpio_irqsrc *tgi;
+       struct intr_map_data_fdt *daf;
 
        if (data == NULL || data->type != INTR_MAP_DATA_FDT)
                return (ENOTSUP);
 
        sc = device_get_softc(dev);
        tgi = (struct ti_gpio_irqsrc *)isrc;
+       daf = (struct intr_map_data_fdt *)data;
 
        /* Get and check config for an interrupt. */
-       if (ti_gpio_pic_map_fdt(sc, data->fdt.ncells, data->fdt.cells, &irq,
+       if (ti_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq,
            &cfgreg) != 0 || tgi->tgi_irq != irq)
                return (EINVAL);
 

Modified: head/sys/kern/subr_intr.c
==============================================================================
--- head/sys/kern/subr_intr.c   Thu May  5 13:23:38 2016        (r299116)
+++ head/sys/kern/subr_intr.c   Thu May  5 13:31:19 2016        (r299117)
@@ -128,7 +128,7 @@ struct intr_dev_data {
        device_t                idd_dev;
        intptr_t                idd_xref;
        u_int                   idd_irq;
-       struct intr_map_data    idd_data;
+       struct intr_map_data *  idd_data;
        struct intr_irqsrc *    idd_isrc;
 };
 
@@ -495,8 +495,10 @@ static struct intr_dev_data *
 intr_ddata_alloc(u_int extsize)
 {
        struct intr_dev_data *ddata;
+       size_t size;
 
-       ddata = malloc(sizeof(*ddata) + extsize, M_INTRNG, M_WAITOK | M_ZERO);
+       size = sizeof(*ddata);
+       ddata = malloc(size + extsize, M_INTRNG, M_WAITOK | M_ZERO);
 
        mtx_lock(&isrc_table_lock);
        if (intr_ddata_first_unused >= nitems(intr_ddata_tab)) {
@@ -507,6 +509,9 @@ intr_ddata_alloc(u_int extsize)
        intr_ddata_tab[intr_ddata_first_unused] = ddata;
        ddata->idd_irq = IRQ_DDATA_BASE + intr_ddata_first_unused++;
        mtx_unlock(&isrc_table_lock);
+
+       ddata->idd_data = (struct intr_map_data *)((uintptr_t)ddata + size);
+       ddata->idd_data->size = size;
        return (ddata);
 }
 
@@ -534,13 +539,13 @@ intr_ddata_lookup(u_int irq, struct intr
        ddata = intr_ddata_tab[irq];
        if (ddata->idd_isrc == NULL) {
                error = intr_map_irq(ddata->idd_dev, ddata->idd_xref,
-                   &ddata->idd_data, &irq);
+                   ddata->idd_data, &irq);
                if (error != 0)
                        return (NULL);
                ddata->idd_isrc = isrc_lookup(irq);
        }
        if (datap != NULL)
-               *datap = &ddata->idd_data;
+               *datap = ddata->idd_data;
        return (ddata->idd_isrc);
 }
 
@@ -554,17 +559,21 @@ u_int
 intr_acpi_map_irq(device_t dev, u_int irq, enum intr_polarity pol,
     enum intr_trigger trig)
 {
+       struct intr_map_data_acpi *daa;
        struct intr_dev_data *ddata;
 
-       ddata = intr_ddata_alloc(0);
+       ddata = intr_ddata_alloc(sizeof(struct intr_map_data_acpi));
        if (ddata == NULL)
                return (INTR_IRQ_INVALID);      /* no space left */
 
        ddata->idd_dev = dev;
-       ddata->idd_data.type = INTR_MAP_DATA_ACPI;
-       ddata->idd_data.acpi.irq = irq;
-       ddata->idd_data.acpi.pol = pol;
-       ddata->idd_data.acpi.trig = trig;
+       ddata->idd_data->type = INTR_MAP_DATA_ACPI;
+
+       daa = (struct intr_map_data_acpi *)ddata->idd_data;
+       daa->irq = irq;
+       daa->pol = pol;
+       daa->trig = trig;
+
        return (ddata->idd_irq);
 }
 #endif
@@ -577,19 +586,21 @@ intr_acpi_map_irq(device_t dev, u_int ir
 u_int
 intr_fdt_map_irq(phandle_t node, pcell_t *cells, u_int ncells)
 {
+       size_t cellsize;
        struct intr_dev_data *ddata;
-       u_int cellsize;
+       struct intr_map_data_fdt *daf;
 
        cellsize = ncells * sizeof(*cells);
-       ddata = intr_ddata_alloc(cellsize);
+       ddata = intr_ddata_alloc(sizeof(struct intr_map_data_fdt) + cellsize);
        if (ddata == NULL)
                return (INTR_IRQ_INVALID);      /* no space left */
 
        ddata->idd_xref = (intptr_t)node;
-       ddata->idd_data.type = INTR_MAP_DATA_FDT;
-       ddata->idd_data.fdt.ncells = ncells;
-       ddata->idd_data.fdt.cells = (pcell_t *)(ddata + 1);
-       memcpy(ddata->idd_data.fdt.cells, cells, cellsize);
+       ddata->idd_data->type = INTR_MAP_DATA_FDT;
+
+       daf = (struct intr_map_data_fdt *)ddata->idd_data;
+       daf->ncells = ncells;
+       memcpy(daf->cells, cells, cellsize);
        return (ddata->idd_irq);
 }
 #endif
@@ -602,16 +613,19 @@ u_int
 intr_gpio_map_irq(device_t dev, u_int pin_num, u_int pin_flags, u_int 
intr_mode)
 {
        struct intr_dev_data *ddata;
+       struct intr_map_data_gpio *dag;
 
-       ddata = intr_ddata_alloc(0);
+       ddata = intr_ddata_alloc(sizeof(struct intr_map_data_gpio));
        if (ddata == NULL)
                return (INTR_IRQ_INVALID);      /* no space left */
 
        ddata->idd_dev = dev;
-       ddata->idd_data.type = INTR_MAP_DATA_GPIO;
-       ddata->idd_data.gpio.gpio_pin_num = pin_num;
-       ddata->idd_data.gpio.gpio_pin_flags = pin_flags;
-       ddata->idd_data.gpio.gpio_intr_mode = intr_mode;
+       ddata->idd_data->type = INTR_MAP_DATA_GPIO;
+
+       dag = (struct intr_map_data_gpio *)ddata->idd_data;
+       dag->gpio_pin_num = pin_num;
+       dag->gpio_pin_flags = pin_flags;
+       dag->gpio_intr_mode = intr_mode;
        return (ddata->idd_irq);
 }
 

Modified: head/sys/mips/mediatek/mtk_gpio_v1.c
==============================================================================
--- head/sys/mips/mediatek/mtk_gpio_v1.c        Thu May  5 13:23:38 2016        
(r299116)
+++ head/sys/mips/mediatek/mtk_gpio_v1.c        Thu May  5 13:31:19 2016        
(r299117)
@@ -514,15 +514,19 @@ static int
 mtk_gpio_pic_map_intr(device_t dev, struct intr_map_data *data,
     struct intr_irqsrc **isrcp)
 {
+       struct intr_map_data_fdt *daf;
        struct mtk_gpio_softc *sc;
 
+       if (data->type != INTR_MAP_DATA_FDT)
+               return (ENOTSUP);
+
        sc = device_get_softc(dev);
+       daf = (struct intr_map_data_fdt *)data;
 
-       if (data == NULL || data->type != INTR_MAP_DATA_FDT ||
-           data->fdt.ncells != 1 || data->fdt.cells[0] >= sc->num_pins)
+       if (daf->ncells != 1 || daf->cells[0] >= sc->num_pins)
                return (EINVAL);
 
-       *isrcp = PIC_INTR_ISRC(sc, data->fdt.cells[0]);
+       *isrcp = PIC_INTR_ISRC(sc, daf->cells[0]);
        return (0);
 }
 

Modified: head/sys/mips/mediatek/mtk_gpio_v2.c
==============================================================================
--- head/sys/mips/mediatek/mtk_gpio_v2.c        Thu May  5 13:23:38 2016        
(r299116)
+++ head/sys/mips/mediatek/mtk_gpio_v2.c        Thu May  5 13:31:19 2016        
(r299117)
@@ -511,15 +511,19 @@ static int
 mtk_gpio_pic_map_intr(device_t dev, struct intr_map_data *data,
     struct intr_irqsrc **isrcp)
 {
+       struct intr_map_data_fdt *daf;
        struct mtk_gpio_softc *sc;
 
+       if (data->type != INTR_MAP_DATA_FDT)
+               return (ENOTSUP);
+
        sc = device_get_softc(dev);
+       daf = (struct intr_map_data_fdt *)data;
 
-       if (data == NULL || data->type != INTR_MAP_DATA_FDT ||
-           data->fdt.ncells != 1 || data->fdt.cells[0] >= sc->num_pins)
+       if (daf->ncells != 1 || daf->cells[0] >= sc->num_pins)
                return (EINVAL);
 
-       *isrcp = PIC_INTR_ISRC(sc, data->fdt.cells[0]);
+       *isrcp = PIC_INTR_ISRC(sc, daf->cells[0]);
        return (0);
 }
 

Modified: head/sys/mips/mediatek/mtk_intr_gic.c
==============================================================================
--- head/sys/mips/mediatek/mtk_intr_gic.c       Thu May  5 13:23:38 2016        
(r299116)
+++ head/sys/mips/mediatek/mtk_intr_gic.c       Thu May  5 13:31:19 2016        
(r299117)
@@ -265,18 +265,22 @@ mtk_gic_map_intr(device_t dev, struct in
     struct intr_irqsrc **isrcp)
 {
 #ifdef FDT
+       struct intr_map_data_fdt *daf;
        struct mtk_gic_softc *sc;
 
+       if (data->type != INTR_MAP_DATA_FDT)
+               return (ENOTSUP);
+
        sc = device_get_softc(dev);
+       daf = (struct intr_map_data_fdt *)data;
 
-       if (data == NULL || data->type != INTR_MAP_DATA_FDT ||
-           data->fdt.ncells != 3 || data->fdt.cells[1] >= sc->nirqs)
+       if (daf->ncells != 3 || daf->cells[1] >= sc->nirqs)
                return (EINVAL);
 
-       *isrcp = GIC_INTR_ISRC(sc, data->fdt.cells[1]);
+       *isrcp = GIC_INTR_ISRC(sc, daf->cells[1]);
        return (0);
 #else
-       return (EINVAL);
+       return (ENOTSUP);
 #endif
 }
 

Modified: head/sys/mips/mediatek/mtk_intr_v1.c
==============================================================================
--- head/sys/mips/mediatek/mtk_intr_v1.c        Thu May  5 13:23:38 2016        
(r299116)
+++ head/sys/mips/mediatek/mtk_intr_v1.c        Thu May  5 13:31:19 2016        
(r299117)
@@ -275,18 +275,22 @@ mtk_pic_map_intr(device_t dev, struct in
     struct intr_irqsrc **isrcp)
 {
 #ifdef FDT
+       struct intr_map_data_fdt *daf;
        struct mtk_pic_softc *sc;
 
+       if (data->type != INTR_MAP_DATA_FDT)
+               return (ENOTSUP);
+
        sc = device_get_softc(dev);
+       daf = (struct intr_map_data_fdt *)data;
 
-       if (data == NULL || data->type != INTR_MAP_DATA_FDT ||
-           data->fdt.ncells != 1 || data->fdt.cells[0] >= sc->nirqs)
+       if (daf->ncells != 1 || daf->cells[0] >= sc->nirqs)
                return (EINVAL);
 
-       *isrcp = PIC_INTR_ISRC(sc, data->fdt.cells[0]);
+       *isrcp = PIC_INTR_ISRC(sc, daf->cells[0]);
        return (0);
 #else
-       return (EINVAL);
+       return (ENOTSUP);
 #endif
 }
 

Modified: head/sys/mips/mediatek/mtk_intr_v2.c
==============================================================================
--- head/sys/mips/mediatek/mtk_intr_v2.c        Thu May  5 13:23:38 2016        
(r299116)
+++ head/sys/mips/mediatek/mtk_intr_v2.c        Thu May  5 13:31:19 2016        
(r299117)
@@ -270,18 +270,22 @@ mtk_pic_map_intr(device_t dev, struct in
     struct intr_irqsrc **isrcp)
 {
 #ifdef FDT
+       struct intr_map_data_fdt *daf;
        struct mtk_pic_softc *sc;
 
+       if (data->type != INTR_MAP_DATA_FDT)
+               return (ENOTSUP);
+
        sc = device_get_softc(dev);
+       daf = (struct intr_map_data_fdt *)data;
 
-       if (data == NULL || data->type != INTR_MAP_DATA_FDT ||
-           data->fdt.ncells != 1 || data->fdt.cells[0] >= sc->nirqs)
+       if (daf->ncells != 1 || daf->cells[0] >= sc->nirqs)
                return (EINVAL);
 
-       *isrcp = PIC_INTR_ISRC(sc, data->fdt.cells[0]);
+       *isrcp = PIC_INTR_ISRC(sc, daf->cells[0]);
        return (0);
 #else
-       return (EINVAL);
+       return (ENOTSUP);
 #endif
 }
 

Modified: head/sys/mips/mips/mips_pic.c
==============================================================================
--- head/sys/mips/mips/mips_pic.c       Thu May  5 13:23:38 2016        
(r299116)
+++ head/sys/mips/mips/mips_pic.c       Thu May  5 13:31:19 2016        
(r299117)
@@ -305,18 +305,22 @@ mips_pic_map_intr(device_t dev, struct i
     struct intr_irqsrc **isrcp)
 {
 #ifdef FDT
+       struct intr_map_data_fdt *daf;
        struct mips_pic_softc *sc;
 
+       if (data->type != INTR_MAP_DATA_FDT)
+               return (ENOTSUP);
+
        sc = device_get_softc(dev);
+       daf = (struct intr_map_data_fdt *)data;
 
-       if (data == NULL || data->type != INTR_MAP_DATA_FDT ||
-           data->fdt.ncells != 1 || data->fdt.cells[0] >= sc->nirqs)
+       if (daf->ncells != 1 || daf->cells[0] >= sc->nirqs)
                return (EINVAL);
 
-       *isrcp = PIC_INTR_ISRC(sc, data->fdt.cells[0]);
+       *isrcp = PIC_INTR_ISRC(sc, daf->cells[0]);
        return (0);
 #else
-       return (EINVAL);
+       return (ENOTSUP);
 #endif
 }
 

Modified: head/sys/sys/intr.h
==============================================================================
--- head/sys/sys/intr.h Thu May  5 13:23:38 2016        (r299116)
+++ head/sys/sys/intr.h Thu May  5 13:31:19 2016        (r299117)
@@ -40,8 +40,14 @@ enum intr_map_data_type {
        INTR_MAP_DATA_GPIO,
 };
 
+struct intr_map_data {
+       enum intr_map_data_type type;
+       size_t                  size;
+};
+
 #ifdef DEV_ACPI
 struct intr_map_data_acpi {
+       struct intr_map_data    hdr;
        u_int                   irq;
        enum intr_polarity      pol;
        enum intr_trigger       trig;
@@ -49,30 +55,19 @@ struct intr_map_data_acpi {
 #endif
 #ifdef FDT
 struct intr_map_data_fdt {
-       u_int   ncells;
-       pcell_t *cells;
+       struct intr_map_data    hdr;
+       u_int                   ncells;
+       pcell_t                 cells[0];
 };
 #endif
 
 struct intr_map_data_gpio {
+       struct intr_map_data    hdr;
        u_int                   gpio_pin_num;
        u_int                   gpio_pin_flags;
        u_int                   gpio_intr_mode;
 };
 
-struct intr_map_data {
-       enum intr_map_data_type type;
-       union {
-#ifdef DEV_ACPI
-               struct intr_map_data_acpi       acpi;
-#endif
-#ifdef FDT
-               struct intr_map_data_fdt        fdt;
-#endif
-               struct intr_map_data_gpio       gpio;
-       };
-};
-
 #ifdef notyet
 #define        INTR_SOLO       INTR_MD1
 typedef int intr_irq_filter_t(void *arg, struct trapframe *tf);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to