On Thursday 08 January 2009 08:40:28 Thomas Dahlmann wrote:
Maybe you want to try this. It should work to place the register init
from udc_probe()
/* udc csr registers base */
dev->csr = dev->virt_addr + UDC_CSR_ADDR;
/* dev registers base */
dev->regs = dev->virt_addr + UDC_DEVCFG_ADDR;
/* ep registers base */spin_lock_init(&dev->lock);
dev->ep_regs = dev->virt_addr + UDC_EPREGS_ADDR;
/* fifo's base */
dev->rxfifo = (u32 __iomem *)(dev->virt_addr + UDC_RXFIFO_ADDR);
dev->txfifo = (u32 __iomem *)(dev->virt_addr + UDC_TXFIFO_ADDR);
just before request_irq(...) to allow the interrupt handler to read the
interrupt status
registers.
I did this. Actually, I also yanked the "spin_lock_init(&dev->lock)" bit before the request_irq() as well, since that field was also obviously needed for the irq routine. (I didn't check for any other necessary but less-obvious fields.) With these changes, the module modprobes just fine.
Alas, the hardware doesn't work. When I try plugging in the other end of the USB cable, absolutely nothing happens. Not even an interrupt: /proc/interrupts for the amd5536udc line stays at zero. Any thoughts on possible ways to tackle this / what could be going wrong / etc?
-- Vadim Lobanov