Re: [PATCH] yenta: irq-routing for TI bridges

Russell King
2004-02-24T00:01:14Z

On Tue, Feb 24, 2004 at 12:33:31AM +0100, Daniel Ritz wrote:
> this patch should fix up wrongly initialized TI bridges. in a safe way
> (hopefully).

Unfortunately not.

This is a working setup:

DCR = 6162
MUX = fba97543

Changing MUX from those values _breaks_. Let's see what the code does.

> + /* check IRQ routing to see if 16bit cards would work */
> + irqmux = irqmux_old = config_readl(socket, TI122X_IRQMUX);
> + devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
> + printk(KERN_INFO "Yenta TI: irqmux %08x, devctl %02x\n", irqmux, devctl);
> +
> +#if 1
> + /* serialized interrupts: MFUNC3 must be IRQSER */
> + if (devctl & TI113X_DCR_IMODE_SERIAL)
> + irqmux = (irqmux & ~0xf000) | 0x1000;
> +#endif

DCR doesn't have bit 2 set, so we don't change this (which is fine.)

>
> +#if 1
> + /* if we have all serial: probe, fall back to parallel PCI */
> + if ((devctl & TI113X_DCR_IMODE_MASK) == TI12XX_DCR_IMODE_ALL_SERIAL) {

Not true, so this is skipped (which again is fine.)

> + /* write down if changed, probe */
> + if (irqmux_old != irqmux) {
> + printk(KERN_INFO "Yenta TI: changing to %08x", irqmux);
> config_writel(socket, TI122X_IRQMUX, irqmux);
> + }
> +
> + probe_mask = yenta_probe_irq(socket, isa_interrupts);
> + if (!probe_mask) {
> + /* no chance to have all serial working -> PCI */
> + printk(KERN_INFO "Yenta TI: serial interrupts not working -> PCI\n");
> + devctl &= ~TI113X_DCR_IMODE_MASK;
> config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
> }
> }
> #endif
>
> + /* parallel PCI interrupts: MFUNC0 must be INTA */
> + if ((devctl & TI113X_DCR_IMODE_MASK) != TI12XX_DCR_IMODE_ALL_SERIAL) {

Ok, this is true.

> + u32 sysctl;
> + irqmux = (irqmux & ~0x0f) | 0x02;

Whoops, we've just taken out IRQ3 as a routed ISA IRQ.

> +
> + /* route INTB depending on INTRTIE */
> + switch (socket->dev->device) {
> + /* there are more... */
> + case PCI_DEVICE_ID_TI_1220:
> + case PCI_DEVICE_ID_TI_1221:
> + case PCI_DEVICE_ID_TI_1225:
> + case PCI_DEVICE_ID_TI_1420:
> + case PCI_DEVICE_ID_TI_1450:
> + //case PCI_DEVICE_ID_TI_1451:
> + case PCI_DEVICE_ID_TI_1520:
> + sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL);
> + if (!(sysctl & TI122X_SCR_INTRTIE))
> + irqmux = (irqmux & ~0xf0) | 0x20;

Whoops, just taken out IRQ4 as a routed ISA IRQ.

> +
> + default:
> + break;
> + }
> + }
> +
> + if (irqmux_old != irqmux) {
> + printk(KERN_INFO "Yenta TI: changing to %08x", irqmux);
> + config_writel(socket, TI122X_IRQMUX, irqmux);
> + }

Net result - not good and probably not acceptable.

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/
2.6 Serial core