Commit 37b0d1de authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/home/rmk/linux-2.6-arm

* master.kernel.org:/home/rmk/linux-2.6-arm:
  [ARM] Fix Integrator and Versatile interrupt initialisation
  [ARM] 3546/1: PATCH: subtle lost interrupts bug on i.MX
  [ARM] 3547/1: PXA-OHCI: Allow platforms to specify a power budget
  [ARM] Fix Neponset IRQ handling
parents d374c1c1 56f1319e
...@@ -127,7 +127,7 @@ static void ...@@ -127,7 +127,7 @@ static void
imx_gpio_ack_irq(unsigned int irq) imx_gpio_ack_irq(unsigned int irq)
{ {
DEBUG_IRQ("%s: irq %d\n", __FUNCTION__, irq); DEBUG_IRQ("%s: irq %d\n", __FUNCTION__, irq);
ISR(IRQ_TO_REG(irq)) |= 1 << ((irq - IRQ_GPIOA(0)) % 32); ISR(IRQ_TO_REG(irq)) = 1 << ((irq - IRQ_GPIOA(0)) % 32);
} }
static void static void
......
...@@ -232,8 +232,6 @@ static void __init intcp_init_irq(void) ...@@ -232,8 +232,6 @@ static void __init intcp_init_irq(void)
for (i = IRQ_PIC_START; i <= IRQ_PIC_END; i++) { for (i = IRQ_PIC_START; i <= IRQ_PIC_END; i++) {
if (i == 11) if (i == 11)
i = 22; i = 22;
if (i == IRQ_CP_CPPLDINT)
i++;
if (i == 29) if (i == 29)
break; break;
set_irq_chip(i, &pic_chip); set_irq_chip(i, &pic_chip);
...@@ -259,8 +257,7 @@ static void __init intcp_init_irq(void) ...@@ -259,8 +257,7 @@ static void __init intcp_init_irq(void)
set_irq_flags(i, IRQF_VALID | IRQF_PROBE); set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
} }
set_irq_handler(IRQ_CP_CPPLDINT, sic_handle_irq); set_irq_chained_handler(IRQ_CP_CPPLDINT, sic_handle_irq);
pic_unmask_irq(IRQ_CP_CPPLDINT);
} }
/* /*
......
...@@ -371,6 +371,7 @@ static int spitz_ohci_init(struct device *dev) ...@@ -371,6 +371,7 @@ static int spitz_ohci_init(struct device *dev)
static struct pxaohci_platform_data spitz_ohci_platform_data = { static struct pxaohci_platform_data spitz_ohci_platform_data = {
.port_mode = PMM_NPS_MODE, .port_mode = PMM_NPS_MODE,
.init = spitz_ohci_init, .init = spitz_ohci_init,
.power_budget = 150,
}; };
......
...@@ -59,6 +59,14 @@ neponset_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *reg ...@@ -59,6 +59,14 @@ neponset_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *reg
if (irr & (IRR_ETHERNET | IRR_USAR)) { if (irr & (IRR_ETHERNET | IRR_USAR)) {
desc->chip->mask(irq); desc->chip->mask(irq);
/*
* Ack the interrupt now to prevent re-entering
* this neponset handler. Again, this is safe
* since we'll check the IRR register prior to
* leaving.
*/
desc->chip->ack(irq);
if (irr & IRR_ETHERNET) { if (irr & IRR_ETHERNET) {
d = irq_desc + IRQ_NEPONSET_SMC9196; d = irq_desc + IRQ_NEPONSET_SMC9196;
desc_handle_irq(IRQ_NEPONSET_SMC9196, d, regs); desc_handle_irq(IRQ_NEPONSET_SMC9196, d, regs);
......
...@@ -112,10 +112,9 @@ void __init versatile_init_irq(void) ...@@ -112,10 +112,9 @@ void __init versatile_init_irq(void)
{ {
unsigned int i; unsigned int i;
vic_init(VA_VIC_BASE, IRQ_VIC_START, ~(1 << 31)); vic_init(VA_VIC_BASE, IRQ_VIC_START, ~0);
set_irq_handler(IRQ_VICSOURCE31, sic_handle_irq); set_irq_chained_handler(IRQ_VICSOURCE31, sic_handle_irq);
enable_irq(IRQ_VICSOURCE31);
/* Do second interrupt controller */ /* Do second interrupt controller */
writel(~0, VA_SIC_BASE + SIC_IRQ_ENABLE_CLEAR); writel(~0, VA_SIC_BASE + SIC_IRQ_ENABLE_CLEAR);
......
...@@ -185,6 +185,9 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device ...@@ -185,6 +185,9 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device
/* Select Power Management Mode */ /* Select Power Management Mode */
pxa27x_ohci_select_pmm(inf->port_mode); pxa27x_ohci_select_pmm(inf->port_mode);
if (inf->power_budget)
hcd->power_budget = inf->power_budget;
ohci_hcd_init(hcd_to_ohci(hcd)); ohci_hcd_init(hcd_to_ohci(hcd));
retval = usb_add_hcd(hcd, pdev->resource[1].start, SA_INTERRUPT); retval = usb_add_hcd(hcd, pdev->resource[1].start, SA_INTERRUPT);
......
...@@ -11,6 +11,8 @@ struct pxaohci_platform_data { ...@@ -11,6 +11,8 @@ struct pxaohci_platform_data {
#define PMM_NPS_MODE 1 #define PMM_NPS_MODE 1
#define PMM_GLOBAL_MODE 2 #define PMM_GLOBAL_MODE 2
#define PMM_PERPORT_MODE 3 #define PMM_PERPORT_MODE 3
int power_budget;
}; };
extern void pxa_set_ohci_info(struct pxaohci_platform_data *info); extern void pxa_set_ohci_info(struct pxaohci_platform_data *info);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment