11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Interrupt management for most GSC and related devices. 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (c) Copyright 1999 Alex deVries for The Puffin Group 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (c) Copyright 1999 Grant Grundler for Hewlett-Packard 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (c) Copyright 1999 Matthew Wilcox 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (c) Copyright 2000 Helge Deller 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (c) Copyright 2001 Matthew Wilcox for Hewlett-Packard 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License as published by 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the Free Software Foundation; either version 2 of the License, or 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (at your option) any later version. 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bitops.h> 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h> 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h> 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h> 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h> 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/hardware.h> 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h> 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "gsc.h" 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEBUG 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef DEBUG 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEBPRINTK printk 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEBPRINTK(x,...) 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint gsc_alloc_irq(struct gsc_irq *i) 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int irq = txn_alloc_irq(GSC_EIM_WIDTH); 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (irq < 0) { 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("cannot get irq\n"); 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return irq; 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds i->txn_addr = txn_alloc_addr(irq); 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds i->txn_data = txn_alloc_data(irq); 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds i->irq = irq; 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return irq; 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint gsc_claim_irq(struct gsc_irq *i, int irq) 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int c = irq; 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irq += CPU_IRQ_BASE; /* virtualize the IRQ first */ 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irq = txn_claim_irq(irq); 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (irq < 0) { 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("cannot claim irq %d\n", c); 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return irq; 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds i->txn_addr = txn_alloc_addr(irq); 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds i->txn_data = txn_alloc_data(irq); 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds i->irq = irq; 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return irq; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(gsc_alloc_irq); 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(gsc_claim_irq); 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Common interrupt demultiplexer used by Asp, Lasi & Wax. */ 757d12e780e003f93433d49ce78cfedf4b4c52adc5David Howellsirqreturn_t gsc_asic_intr(int gsc_asic_irq, void *dev) 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long irr; 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct gsc_asic *gsc_asic = dev; 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irr = gsc_readl(gsc_asic->hpa + OFFSET_IRR); 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (irr == 0) 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return IRQ_NONE; 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DEBPRINTK("%s intr, mask=0x%x\n", gsc_asic->name, irr); 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds do { 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int local_irq = __ffs(irr); 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int irq = gsc_asic->global_irq[local_irq]; 89ba20085c20f1c9e8af546dea6ad0efa421bdef32Kyle McMartin generic_handle_irq(irq); 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irr &= ~(1 << local_irq); 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } while (irr); 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return IRQ_HANDLED; 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint gsc_find_local_irq(unsigned int irq, int *global_irqs, int limit) 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int local_irq; 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (local_irq = 0; local_irq < limit; local_irq++) { 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (global_irqs[local_irq] == irq) 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return local_irq; 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return NO_IRQ; 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1084c4231ea2f794d73bbb50b8d84e00c66a012a607Thomas Gleixnerstatic void gsc_asic_mask_irq(struct irq_data *d) 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1104c4231ea2f794d73bbb50b8d84e00c66a012a607Thomas Gleixner struct gsc_asic *irq_dev = irq_data_get_irq_chip_data(d); 1114c4231ea2f794d73bbb50b8d84e00c66a012a607Thomas Gleixner int local_irq = gsc_find_local_irq(d->irq, irq_dev->global_irq, 32); 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 imr; 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1144c4231ea2f794d73bbb50b8d84e00c66a012a607Thomas Gleixner DEBPRINTK(KERN_DEBUG "%s(%d) %s: IMR 0x%x\n", __func__, d->irq, 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irq_dev->name, imr); 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Disable the IRQ line by clearing the bit in the IMR */ 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds imr = gsc_readl(irq_dev->hpa + OFFSET_IMR); 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds imr &= ~(1 << local_irq); 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds gsc_writel(imr, irq_dev->hpa + OFFSET_IMR); 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1234c4231ea2f794d73bbb50b8d84e00c66a012a607Thomas Gleixnerstatic void gsc_asic_unmask_irq(struct irq_data *d) 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1254c4231ea2f794d73bbb50b8d84e00c66a012a607Thomas Gleixner struct gsc_asic *irq_dev = irq_data_get_irq_chip_data(d); 1264c4231ea2f794d73bbb50b8d84e00c66a012a607Thomas Gleixner int local_irq = gsc_find_local_irq(d->irq, irq_dev->global_irq, 32); 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 imr; 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1294c4231ea2f794d73bbb50b8d84e00c66a012a607Thomas Gleixner DEBPRINTK(KERN_DEBUG "%s(%d) %s: IMR 0x%x\n", __func__, d->irq, 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irq_dev->name, imr); 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Enable the IRQ line by setting the bit in the IMR */ 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds imr = gsc_readl(irq_dev->hpa + OFFSET_IMR); 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds imr |= 1 << local_irq; 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds gsc_writel(imr, irq_dev->hpa + OFFSET_IMR); 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FIXME: read IPR to make sure the IRQ isn't already pending. 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If so, we need to read IRR and manually call do_irq(). 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 142dfe07565021959f0f646e9e775810c1bfbe0f6d6Thomas Gleixnerstatic struct irq_chip gsc_asic_interrupt_type = { 1434c4231ea2f794d73bbb50b8d84e00c66a012a607Thomas Gleixner .name = "GSC-ASIC", 1444c4231ea2f794d73bbb50b8d84e00c66a012a607Thomas Gleixner .irq_unmask = gsc_asic_unmask_irq, 1454c4231ea2f794d73bbb50b8d84e00c66a012a607Thomas Gleixner .irq_mask = gsc_asic_mask_irq, 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 148dfe07565021959f0f646e9e775810c1bfbe0f6d6Thomas Gleixnerint gsc_assign_irq(struct irq_chip *type, void *data) 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static int irq = GSC_IRQ_BASE; 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (irq > GSC_IRQ_MAX) 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return NO_IRQ; 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 155e2f571d294cc5f944539088bed46abae375b75f6Thomas Gleixner irq_set_chip_and_handler(irq, type, handle_simple_irq); 156e2f571d294cc5f944539088bed46abae375b75f6Thomas Gleixner irq_set_chip_data(irq, data); 157ba20085c20f1c9e8af546dea6ad0efa421bdef32Kyle McMartin 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return irq++; 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp) 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int irq = asic->global_irq[local_irq]; 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (irq <= 0) { 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irq = gsc_assign_irq(&gsc_asic_interrupt_type, asic); 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (irq == NO_IRQ) 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds asic->global_irq[local_irq] = irq; 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *irqp = irq; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 175bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomleystruct gsc_fixup_struct { 176bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley void (*choose_irq)(struct parisc_device *, void *); 177bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley void *ctrl; 178bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley}; 179bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley 180bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomleystatic int gsc_fixup_irqs_callback(struct device *dev, void *data) 1815658374766d9e0249bd04e9d62bdb8456b916b64Matthew Wilcox{ 182bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley struct parisc_device *padev = to_parisc_device(dev); 183bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley struct gsc_fixup_struct *gf = data; 184bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley 185bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley /* work-around for 715/64 and others which have parent 186bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley at path [5] and children at path [5/0/x] */ 187bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley if (padev->id.hw_type == HPHW_FAULTY) 188bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley gsc_fixup_irqs(padev, gf->ctrl, gf->choose_irq); 189bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley gf->choose_irq(padev, gf->ctrl); 190bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley 191bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley return 0; 1925658374766d9e0249bd04e9d62bdb8456b916b64Matthew Wilcox} 1935658374766d9e0249bd04e9d62bdb8456b916b64Matthew Wilcox 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid gsc_fixup_irqs(struct parisc_device *parent, void *ctrl, 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void (*choose_irq)(struct parisc_device *, void *)) 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 197bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley struct gsc_fixup_struct data = { 198bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley .choose_irq = choose_irq, 199bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley .ctrl = ctrl, 200bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley }; 201bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley 202bfe4f4f800ccbb499a1120735016a20d3feacd4fJames Bottomley device_for_each_child(&parent->dev, &data, gsc_fixup_irqs_callback); 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic) 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct resource *res; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds gsc_asic->gsc = parent; 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Initialise local irq -> global irq mapping */ 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < 32; i++) { 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds gsc_asic->global_irq[i] = NO_IRQ; 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* allocate resource region */ 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds res = request_mem_region(gsc_asic->hpa, 0x100000, gsc_asic->name); 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (res) { 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds res->flags = IORESOURCE_MEM; /* do not mark it busy ! */ 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 0 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_WARNING "%s IRQ %d EIM 0x%x", gsc_asic->name, 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds parent->irq, gsc_asic->eim); 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (gsc_readl(gsc_asic->hpa + OFFSET_IMR)) 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(" IMR is non-zero! (0x%x)", 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds gsc_readl(gsc_asic->hpa + OFFSET_IMR)); 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("\n"); 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct parisc_driver lasi_driver; 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct parisc_driver asp_driver; 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct parisc_driver wax_driver; 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init gsc_init(void) 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_GSC_LASI 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds register_parisc_driver(&lasi_driver); 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds register_parisc_driver(&asp_driver); 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_GSC_WAX 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds register_parisc_driver(&wax_driver); 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 249