Make use of the ax88796 platform data interupt status hook in the m68k Amiga XSurf100 driver. The XSurf100 interrupt is shared with other Amiga hardware interrupts so ei_interrupt would otherwise get called a lot without need. Signed-off-by: Michael Karcher <kernel@xxxxxxxxxxxxxxxxxxxxxxxxxxxx> Signed-off-by: Michael Schmitz <schmitzmic@xxxxxxxxx> --- drivers/net/ethernet/8390/xsurf100.c | 42 +++++++++++++++++++++++++++------ 1 files changed, 34 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/8390/xsurf100.c b/drivers/net/ethernet/8390/xsurf100.c index 3c34b04..f1b1f62 100644 --- a/drivers/net/ethernet/8390/xsurf100.c +++ b/drivers/net/ethernet/8390/xsurf100.c @@ -7,27 +7,49 @@ #define ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF100 ZORRO_ID(INDIVIDUAL_COMPUTERS, 0x64, 0) -#define XS1000_8390_BASE 0x800 +#define XS100_IRQSTATUS_BASE 0x40 +#define XS100_8390_BASE 0x800 + +struct xsurf100_ax_plat_data { + struct ax_plat_data ax; + void *base_regs; +}; + +static int is_xsurf100_network_irq(struct platform_device *pdev) +{ + struct xsurf100_ax_plat_data *xs100 = dev_get_platdata(&pdev->dev); + return (readw(xs100->base_regs + XS100_IRQSTATUS_BASE) & 0xaaaa) != 0; +} static int xsurf100_probe(struct zorro_dev *zdev, const struct zorro_device_id *ent) { struct platform_device *pdev; - struct ax_plat_data ax88796_data; + struct xsurf100_ax_plat_data ax88796_data; struct resource res[2] = { DEFINE_RES_IRQ(IRQ_AMIGA_PORTS), - DEFINE_RES_IO(zdev->resource.start + XS1000_8390_BASE, 4 * 0x20) + DEFINE_RES_IO(zdev->resource.start + XS100_8390_BASE, 4 * 0x20) }; int reg; u32 reg_offsets[32]; + if (!request_mem_region(zdev->resource.start, 0x100, zdev->name)) + { + dev_err(&zdev->dev, "cannot reserve X-Surf 100 control registers\n"); + return -ENXIO; + } + for (reg = 0; reg < 0x20; reg++) reg_offsets[reg] = 4; - ax88796_data.flags = AXFLG_HAS_EEPROM; - ax88796_data.wordlength = 2; - ax88796_data.dcr_val = 0x48; - ax88796_data.rcr_val = 0x40; - ax88796_data.reg_offsets = reg_offsets; + memset(&ax88796_data, 0, sizeof ax88796_data); + ax88796_data.ax.flags = AXFLG_HAS_EEPROM; + ax88796_data.ax.wordlength = 2; + ax88796_data.ax.dcr_val = 0x48; + ax88796_data.ax.rcr_val = 0x40; + ax88796_data.ax.reg_offsets = reg_offsets; + ax88796_data.ax.check_irq = is_xsurf100_network_irq; + ax88796_data.base_regs = ioremap(zdev->resource.start, 0x100); + // TODO: xsurf100 specific accelerated data exchange @@ -44,8 +66,12 @@ static int xsurf100_probe(struct zorro_dev *zdev, const struct zorro_device_id * static void xsurf100_remove(struct zorro_dev *zdev) { struct platform_device *pdev; + struct xsurf100_ax_plat_data *xs100; pdev = zorro_get_drvdata(zdev); + xs100 = dev_get_platdata(&pdev->dev); + iounmap(xs100->base_regs); + release_mem_region(zdev->resource.start, 0x100); platform_device_unregister(pdev); } -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-m68k" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html