svn commit: r299117 - in head/sys: arm/allwinner arm/allwinner/a10 arm/arm arm/broadcom/bcm2835 arm/freescale/imx arm/mv arm/nvidia arm/ti kern mips/mediatek mips/mips sys
Svatopluk Kraus
skra at FreeBSD.org
Thu May 5 13:31:22 UTC 2016
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,
®) != 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);
More information about the svn-src-all
mailing list