X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/8c72b797b421258e17ad6f7afcbc2ab9105e8dc8..38d9c42391c335db7e9d6b6f263c75e7ea45ca76:/target/linux/ar7-2.6/files/arch/mips/ar7/vlynq.c diff --git a/target/linux/ar7-2.6/files/arch/mips/ar7/vlynq.c b/target/linux/ar7-2.6/files/arch/mips/ar7/vlynq.c index 80cb836d9..5856ece1d 100644 --- a/target/linux/ar7-2.6/files/arch/mips/ar7/vlynq.c +++ b/target/linux/ar7-2.6/files/arch/mips/ar7/vlynq.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #define PER_DEVICE_IRQS 32 @@ -117,7 +118,7 @@ static void vlynq_irq_unmask(unsigned int irq) BUG_ON(!dev); virq = irq - dev->irq_start; val = dev->remote->int_device[virq >> 2]; - val |= VINT_ENABLE << VINT_OFFSET(virq); + val |= (VINT_ENABLE | virq) << VINT_OFFSET(virq); dev->remote->int_device[virq >> 2] = val; } @@ -196,10 +197,11 @@ static irqreturn_t vlynq_irq(int irq, void *dev_id) } static struct irq_chip vlynq_irq_chip = { + .typename = "VLYNQ", .name = "vlynq", .unmask = vlynq_irq_unmask, .mask = vlynq_irq_mask, - .set_type = vlynq_irq_type, + .set_type = vlynq_irq_type, }; static int vlynq_setup_irq(struct vlynq_device *dev) @@ -235,7 +237,7 @@ static int vlynq_setup_irq(struct vlynq_device *dev) dev->remote->int_device[i >> 2] = 0; } - if (request_irq(dev->irq, vlynq_irq, SA_SHIRQ, "AR7 VLYNQ", dev)) { + if (request_irq(dev->irq, vlynq_irq, SA_SHIRQ, "vlynq", dev)) { printk("%s: request_irq failed\n", dev->dev.bus_id); return -EAGAIN; } @@ -287,7 +289,7 @@ EXPORT_SYMBOL(vlynq_unregister_driver); int vlynq_device_enable(struct vlynq_device *dev) { - u32 val; + u32 div; int result; struct plat_vlynq_ops *ops = dev->dev.platform_data; @@ -298,15 +300,24 @@ int vlynq_device_enable(struct vlynq_device *dev) dev->local->control = 0; dev->remote->control = 0; + div = ar7_dsp_freq() / 62500000; + if(ar7_dsp_freq() / div != 62500000) + { + printk(KERN_WARNING + "VLYNQ: Adjusted requested frequency %d to %d\n", + 62500000, ar7_dsp_freq() / div); + } + + printk("VLYNQ: Setting clock to %d (clock divider %u)\n", ar7_dsp_freq() / div, div); + dev->local->control = VLYNQ_CTRL_CLOCK_DIV((div - 1)) | + VLYNQ_CTRL_CLOCK_INT; +/* + dev->local->control = VLYNQ_CTRL_CLOCK_INT; +*/ if (vlynq_linked(dev)) return vlynq_setup_irq(dev); - for (val = 0; val < 8; val++) { - dev->local->control = VLYNQ_CTRL_CLOCK_DIV(val) | - VLYNQ_CTRL_CLOCK_INT; - if (vlynq_linked(dev)) - return vlynq_setup_irq(dev); - } + return -ENODEV; } void vlynq_device_disable(struct vlynq_device *dev)