diff options
Diffstat (limited to 'drivers/parisc')
-rw-r--r-- | drivers/parisc/dino.c | 28 | ||||
-rw-r--r-- | drivers/parisc/eisa.c | 28 | ||||
-rw-r--r-- | drivers/parisc/eisa_eeprom.c | 1 | ||||
-rw-r--r-- | drivers/parisc/gsc.c | 35 | ||||
-rw-r--r-- | drivers/parisc/iosapic.c | 56 | ||||
-rw-r--r-- | drivers/parisc/led.c | 23 | ||||
-rw-r--r-- | drivers/parisc/superio.c | 26 |
7 files changed, 67 insertions, 130 deletions
diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index c542c7bb7454..9383063d2b16 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c @@ -296,10 +296,9 @@ static struct pci_port_ops dino_port_ops = { .outl = dino_out32 }; -static void dino_disable_irq(unsigned int irq) +static void dino_mask_irq(unsigned int irq) { - struct irq_desc *desc = irq_to_desc(irq); - struct dino_device *dino_dev = desc->chip_data; + struct dino_device *dino_dev = get_irq_chip_data(irq); int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); DBG(KERN_WARNING "%s(0x%p, %d)\n", __func__, dino_dev, irq); @@ -309,10 +308,9 @@ static void dino_disable_irq(unsigned int irq) __raw_writel(dino_dev->imr, dino_dev->hba.base_addr+DINO_IMR); } -static void dino_enable_irq(unsigned int irq) +static void dino_unmask_irq(unsigned int irq) { - struct irq_desc *desc = irq_to_desc(irq); - struct dino_device *dino_dev = desc->chip_data; + struct dino_device *dino_dev = get_irq_chip_data(irq); int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); u32 tmp; @@ -347,20 +345,10 @@ static void dino_enable_irq(unsigned int irq) } } -static unsigned int dino_startup_irq(unsigned int irq) -{ - dino_enable_irq(irq); - return 0; -} - static struct irq_chip dino_interrupt_type = { - .name = "GSC-PCI", - .startup = dino_startup_irq, - .shutdown = dino_disable_irq, - .enable = dino_enable_irq, - .disable = dino_disable_irq, - .ack = no_ack_irq, - .end = no_end_irq, + .name = "GSC-PCI", + .unmask = dino_unmask_irq, + .mask = dino_mask_irq, }; @@ -391,7 +379,7 @@ ilr_again: int irq = dino_dev->global_irq[local_irq]; DBG(KERN_DEBUG "%s(%d, %p) mask 0x%x\n", __func__, irq, intr_dev, mask); - __do_IRQ(irq); + generic_handle_irq(irq); mask &= ~(1 << local_irq); } while (mask); diff --git a/drivers/parisc/eisa.c b/drivers/parisc/eisa.c index 46f503fb7fc5..e860038b0b84 100644 --- a/drivers/parisc/eisa.c +++ b/drivers/parisc/eisa.c @@ -144,7 +144,7 @@ static unsigned int eisa_irq_level __read_mostly; /* default to edge triggered * /* called by free irq */ -static void eisa_disable_irq(unsigned int irq) +static void eisa_mask_irq(unsigned int irq) { unsigned long flags; @@ -164,7 +164,7 @@ static void eisa_disable_irq(unsigned int irq) } /* called by request irq */ -static void eisa_enable_irq(unsigned int irq) +static void eisa_unmask_irq(unsigned int irq) { unsigned long flags; EISA_DBG("enable irq %d\n", irq); @@ -182,20 +182,10 @@ static void eisa_enable_irq(unsigned int irq) EISA_DBG("pic1 mask %02x\n", eisa_in8(0xa1)); } -static unsigned int eisa_startup_irq(unsigned int irq) -{ - eisa_enable_irq(irq); - return 0; -} - static struct irq_chip eisa_interrupt_type = { - .name = "EISA", - .startup = eisa_startup_irq, - .shutdown = eisa_disable_irq, - .enable = eisa_enable_irq, - .disable = eisa_disable_irq, - .ack = no_ack_irq, - .end = no_end_irq, + .name = "EISA", + .unmask = eisa_unmask_irq, + .mask = eisa_mask_irq, }; static irqreturn_t eisa_irq(int wax_irq, void *intr_dev) @@ -233,7 +223,7 @@ static irqreturn_t eisa_irq(int wax_irq, void *intr_dev) } spin_unlock_irqrestore(&eisa_irq_lock, flags); - __do_IRQ(irq); + generic_handle_irq(irq); spin_lock_irqsave(&eisa_irq_lock, flags); /* unmask */ @@ -346,10 +336,10 @@ static int __init eisa_probe(struct parisc_device *dev) } /* Reserve IRQ2 */ - irq_to_desc(2)->action = &irq2_action; - + setup_irq(2, &irq2_action); for (i = 0; i < 16; i++) { - irq_to_desc(i)->chip = &eisa_interrupt_type; + set_irq_chip_and_handler(i, &eisa_interrupt_type, + handle_simple_irq); } EISA_bus = 1; diff --git a/drivers/parisc/eisa_eeprom.c b/drivers/parisc/eisa_eeprom.c index cce00ed81f37..af212c6a6158 100644 --- a/drivers/parisc/eisa_eeprom.c +++ b/drivers/parisc/eisa_eeprom.c @@ -24,7 +24,6 @@ #include <linux/kernel.h> #include <linux/miscdevice.h> #include <linux/slab.h> -#include <linux/smp_lock.h> #include <linux/fs.h> #include <asm/io.h> #include <asm/uaccess.h> diff --git a/drivers/parisc/gsc.c b/drivers/parisc/gsc.c index 20a1bce1a031..772b1939ac21 100644 --- a/drivers/parisc/gsc.c +++ b/drivers/parisc/gsc.c @@ -86,7 +86,7 @@ irqreturn_t gsc_asic_intr(int gsc_asic_irq, void *dev) do { int local_irq = __ffs(irr); unsigned int irq = gsc_asic->global_irq[local_irq]; - __do_IRQ(irq); + generic_handle_irq(irq); irr &= ~(1 << local_irq); } while (irr); @@ -105,10 +105,9 @@ int gsc_find_local_irq(unsigned int irq, int *global_irqs, int limit) return NO_IRQ; } -static void gsc_asic_disable_irq(unsigned int irq) +static void gsc_asic_mask_irq(unsigned int irq) { - struct irq_desc *desc = irq_to_desc(irq); - struct gsc_asic *irq_dev = desc->chip_data; + struct gsc_asic *irq_dev = get_irq_chip_data(irq); int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); u32 imr; @@ -121,10 +120,9 @@ static void gsc_asic_disable_irq(unsigned int irq) gsc_writel(imr, irq_dev->hpa + OFFSET_IMR); } -static void gsc_asic_enable_irq(unsigned int irq) +static void gsc_asic_unmask_irq(unsigned int irq) { - struct irq_desc *desc = irq_to_desc(irq); - struct gsc_asic *irq_dev = desc->chip_data; + struct gsc_asic *irq_dev = get_irq_chip_data(irq); int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); u32 imr; @@ -141,33 +139,22 @@ static void gsc_asic_enable_irq(unsigned int irq) */ } -static unsigned int gsc_asic_startup_irq(unsigned int irq) -{ - gsc_asic_enable_irq(irq); - return 0; -} - static struct irq_chip gsc_asic_interrupt_type = { - .name = "GSC-ASIC", - .startup = gsc_asic_startup_irq, - .shutdown = gsc_asic_disable_irq, - .enable = gsc_asic_enable_irq, - .disable = gsc_asic_disable_irq, - .ack = no_ack_irq, - .end = no_end_irq, + .name = "GSC-ASIC", + .unmask = gsc_asic_unmask_irq, + .mask = gsc_asic_mask_irq, }; int gsc_assign_irq(struct irq_chip *type, void *data) { static int irq = GSC_IRQ_BASE; - struct irq_desc *desc; if (irq > GSC_IRQ_MAX) return NO_IRQ; - desc = irq_to_desc(irq); - desc->chip = type; - desc->chip_data = data; + set_irq_chip_and_handler(irq, type, handle_simple_irq); + set_irq_chip_data(irq, data); + return irq++; } diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index c76836727cae..0327894bf235 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c @@ -615,17 +615,10 @@ iosapic_set_irt_data( struct vector_info *vi, u32 *dp0, u32 *dp1) } -static struct vector_info *iosapic_get_vector(unsigned int irq) -{ - struct irq_desc *desc = irq_to_desc(irq); - - return desc->chip_data; -} - -static void iosapic_disable_irq(unsigned int irq) +static void iosapic_mask_irq(unsigned int irq) { unsigned long flags; - struct vector_info *vi = iosapic_get_vector(irq); + struct vector_info *vi = get_irq_chip_data(irq); u32 d0, d1; spin_lock_irqsave(&iosapic_lock, flags); @@ -635,9 +628,9 @@ static void iosapic_disable_irq(unsigned int irq) spin_unlock_irqrestore(&iosapic_lock, flags); } -static void iosapic_enable_irq(unsigned int irq) +static void iosapic_unmask_irq(unsigned int irq) { - struct vector_info *vi = iosapic_get_vector(irq); + struct vector_info *vi = get_irq_chip_data(irq); u32 d0, d1; /* data is initialized by fixup_irq */ @@ -678,34 +671,19 @@ printk("\n"); iosapic_eoi(vi->eoi_addr, vi->eoi_data); } -/* - * PARISC only supports PCI devices below I/O SAPIC. - * PCI only supports level triggered in order to share IRQ lines. - * ergo I/O SAPIC must always issue EOI on parisc. - * - * i386/ia64 support ISA devices and have to deal with - * edge-triggered interrupts too. - */ -static void iosapic_end_irq(unsigned int irq) +static void iosapic_eoi_irq(unsigned int irq) { - struct vector_info *vi = iosapic_get_vector(irq); - DBG(KERN_DEBUG "end_irq(%d): eoi(%p, 0x%x)\n", irq, - vi->eoi_addr, vi->eoi_data); - iosapic_eoi(vi->eoi_addr, vi->eoi_data); - cpu_end_irq(irq); -} + struct vector_info *vi = get_irq_chip_data(irq); -static unsigned int iosapic_startup_irq(unsigned int irq) -{ - iosapic_enable_irq(irq); - return 0; + iosapic_eoi(vi->eoi_addr, vi->eoi_data); + cpu_eoi_irq(irq); } #ifdef CONFIG_SMP static int iosapic_set_affinity_irq(unsigned int irq, const struct cpumask *dest) { - struct vector_info *vi = iosapic_get_vector(irq); + struct vector_info *vi = get_irq_chip_data(irq); u32 d0, d1, dummy_d0; unsigned long flags; int dest_cpu; @@ -730,13 +708,11 @@ static int iosapic_set_affinity_irq(unsigned int irq, #endif static struct irq_chip iosapic_interrupt_type = { - .name = "IO-SAPIC-level", - .startup = iosapic_startup_irq, - .shutdown = iosapic_disable_irq, - .enable = iosapic_enable_irq, - .disable = iosapic_disable_irq, - .ack = cpu_ack_irq, - .end = iosapic_end_irq, + .name = "IO-SAPIC-level", + .unmask = iosapic_unmask_irq, + .mask = iosapic_mask_irq, + .ack = cpu_ack_irq, + .eoi = iosapic_eoi_irq, #ifdef CONFIG_SMP .set_affinity = iosapic_set_affinity_irq, #endif @@ -891,8 +867,8 @@ void *iosapic_register(unsigned long hpa) isi->isi_version = iosapic_rd_version(isi); isi->isi_num_vectors = IOSAPIC_IRDT_MAX_ENTRY(isi->isi_version) + 1; - vip = isi->isi_vector = (struct vector_info *) - kzalloc(sizeof(struct vector_info) * isi->isi_num_vectors, GFP_KERNEL); + vip = isi->isi_vector = kcalloc(isi->isi_num_vectors, + sizeof(struct vector_info), GFP_KERNEL); if (vip == NULL) { kfree(isi); return NULL; diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c index c5c14dd3734f..f2f501e5b6a0 100644 --- a/drivers/parisc/led.c +++ b/drivers/parisc/led.c @@ -64,6 +64,7 @@ static unsigned int led_diskio __read_mostly = 1; static unsigned int led_lanrxtx __read_mostly = 1; static char lcd_text[32] __read_mostly; static char lcd_text_default[32] __read_mostly; +static int lcd_no_led_support __read_mostly = 0; /* KittyHawk doesn't support LED on its LCD */ static struct workqueue_struct *led_wq; @@ -115,7 +116,7 @@ lcd_info __attribute__((aligned(8))) __read_mostly = .lcd_width = 16, .lcd_cmd_reg_addr = KITTYHAWK_LCD_CMD, .lcd_data_reg_addr = KITTYHAWK_LCD_DATA, - .min_cmd_delay = 40, + .min_cmd_delay = 80, .reset_cmd1 = 0x80, .reset_cmd2 = 0xc0, }; @@ -135,6 +136,9 @@ static int start_task(void) /* Display the default text now */ if (led_type == LED_HASLCD) lcd_print( lcd_text_default ); + /* KittyHawk has no LED support on its LCD */ + if (lcd_no_led_support) return 0; + /* Create the work queue and queue the LED task */ led_wq = create_singlethread_workqueue("led_wq"); queue_delayed_work(led_wq, &led_task, 0); @@ -248,9 +252,13 @@ static int __init led_create_procfs(void) proc_pdc_root = proc_mkdir("pdc", 0); if (!proc_pdc_root) return -1; - ent = proc_create_data("led", S_IRUGO|S_IWUSR, proc_pdc_root, - &led_proc_fops, (void *)LED_NOLCD); /* LED */ - if (!ent) return -1; + + if (!lcd_no_led_support) + { + ent = proc_create_data("led", S_IRUGO|S_IWUSR, proc_pdc_root, + &led_proc_fops, (void *)LED_NOLCD); /* LED */ + if (!ent) return -1; + } if (led_type == LED_HASLCD) { @@ -346,8 +354,8 @@ static __inline__ int led_get_net_activity(void) #ifndef CONFIG_NET return 0; #else - static unsigned long rx_total_last, tx_total_last; - unsigned long rx_total, tx_total; + static u64 rx_total_last, tx_total_last; + u64 rx_total, tx_total; struct net_device *dev; int retval; @@ -356,7 +364,7 @@ static __inline__ int led_get_net_activity(void) /* we are running as a workqueue task, so we can use an RCU lookup */ rcu_read_lock(); for_each_netdev_rcu(&init_net, dev) { - const struct net_device_stats *stats; + const struct rtnl_link_stats64 *stats; struct rtnl_link_stats64 temp; struct in_device *in_dev = __in_dev_get_rcu(dev); if (!in_dev || !in_dev->ifa_list) @@ -692,6 +700,7 @@ int __init led_init(void) case 0x58B: /* KittyHawk DC2 100 (K200) */ printk(KERN_INFO "%s: KittyHawk-Machine (hversion 0x%x) found, " "LED detection skipped.\n", __FILE__, CPU_HVERSION); + lcd_no_led_support = 1; goto found; /* use the preinitialized values of lcd_info */ } diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index f7806d81f1e0..28241532c0fd 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c @@ -139,7 +139,7 @@ superio_interrupt(int parent_irq, void *devp) } /* Call the appropriate device's interrupt */ - __do_IRQ(local_irq); + generic_handle_irq(local_irq); /* set EOI - forces a new interrupt if a lower priority device * still needs service. @@ -286,7 +286,7 @@ superio_init(struct pci_dev *pcidev) } DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO, superio_init); -static void superio_disable_irq(unsigned int irq) +static void superio_mask_irq(unsigned int irq) { u8 r8; @@ -303,7 +303,7 @@ static void superio_disable_irq(unsigned int irq) outb (r8,IC_PIC1+1); } -static void superio_enable_irq(unsigned int irq) +static void superio_unmask_irq(unsigned int irq) { u8 r8; @@ -319,20 +319,10 @@ static void superio_enable_irq(unsigned int irq) outb (r8,IC_PIC1+1); } -static unsigned int superio_startup_irq(unsigned int irq) -{ - superio_enable_irq(irq); - return 0; -} - static struct irq_chip superio_interrupt_type = { - .name = SUPERIO, - .startup = superio_startup_irq, - .shutdown = superio_disable_irq, - .enable = superio_enable_irq, - .disable = superio_disable_irq, - .ack = no_ack_irq, - .end = no_end_irq, + .name = SUPERIO, + .unmask = superio_unmask_irq, + .mask = superio_mask_irq, }; #ifdef DEBUG_SUPERIO_INIT @@ -363,9 +353,7 @@ int superio_fixup_irq(struct pci_dev *pcidev) #endif for (i = 0; i < 16; i++) { - struct irq_desc *desc = irq_to_desc(i); - - desc->chip = &superio_interrupt_type; + set_irq_chip_and_handler(i, &superio_interrupt_type, handle_simple_irq); } /* |