| /* | |
| * This file is subject to the terms and conditions of the GNU General Public | |
| * License. See the file "COPYING" in the main directory of this archive | |
| * for more details. | |
| * | |
| * Copyright (c) 2005 Stanislaw Skowronek <skylark@linux-mips.org> | |
| */ | |
| #ifndef _LINUX_IOC3_H | |
| #define _LINUX_IOC3_H | |
| #include <asm/sn/ioc3.h> | |
| #define IOC3_MAX_SUBMODULES 32 | |
| #define IOC3_CLASS_NONE 0 | |
| #define IOC3_CLASS_BASE_IP27 1 | |
| #define IOC3_CLASS_BASE_IP30 2 | |
| #define IOC3_CLASS_MENET_123 3 | |
| #define IOC3_CLASS_MENET_4 4 | |
| #define IOC3_CLASS_CADDUO 5 | |
| #define IOC3_CLASS_SERIAL 6 | |
| /* One of these per IOC3 */ | |
| struct ioc3_driver_data { | |
| struct list_head list; | |
| int id; /* IOC3 sequence number */ | |
| /* PCI mapping */ | |
| unsigned long pma; /* physical address */ | |
| struct ioc3 __iomem *vma; /* pointer to registers */ | |
| struct pci_dev *pdev; /* PCI device */ | |
| /* IRQ stuff */ | |
| int dual_irq; /* set if separate IRQs are used */ | |
| int irq_io, irq_eth; /* IRQ numbers */ | |
| /* GPIO magic */ | |
| spinlock_t gpio_lock; | |
| unsigned int gpdr_shadow; | |
| /* NIC identifiers */ | |
| char nic_part[32]; | |
| char nic_serial[16]; | |
| char nic_mac[6]; | |
| /* submodule set */ | |
| int class; | |
| void *data[IOC3_MAX_SUBMODULES]; /* for submodule use */ | |
| int active[IOC3_MAX_SUBMODULES]; /* set if probe succeeds */ | |
| /* is_ir_lock must be held while | |
| * modifying sio_ie values, so | |
| * we can be sure that sio_ie is | |
| * not changing when we read it | |
| * along with sio_ir. | |
| */ | |
| spinlock_t ir_lock; /* SIO_IE[SC] mod lock */ | |
| }; | |
| /* One per submodule */ | |
| struct ioc3_submodule { | |
| char *name; /* descriptive submodule name */ | |
| struct module *owner; /* owning kernel module */ | |
| int ethernet; /* set for ethernet drivers */ | |
| int (*probe) (struct ioc3_submodule *, struct ioc3_driver_data *); | |
| int (*remove) (struct ioc3_submodule *, struct ioc3_driver_data *); | |
| int id; /* assigned by IOC3, index for the "data" array */ | |
| /* IRQ stuff */ | |
| unsigned int irq_mask; /* IOC3 IRQ mask, leave clear for Ethernet */ | |
| int reset_mask; /* non-zero if you want the ioc3.c module to reset interrupts */ | |
| int (*intr) (struct ioc3_submodule *, struct ioc3_driver_data *, unsigned int); | |
| /* private submodule data */ | |
| void *data; /* assigned by submodule */ | |
| }; | |
| /********************************** | |
| * Functions needed by submodules * | |
| **********************************/ | |
| #define IOC3_W_IES 0 | |
| #define IOC3_W_IEC 1 | |
| /* registers a submodule for all existing and future IOC3 chips */ | |
| extern int ioc3_register_submodule(struct ioc3_submodule *); | |
| /* unregisters a submodule */ | |
| extern void ioc3_unregister_submodule(struct ioc3_submodule *); | |
| /* enables IRQs indicated by irq_mask for a specified IOC3 chip */ | |
| extern void ioc3_enable(struct ioc3_submodule *, struct ioc3_driver_data *, unsigned int); | |
| /* ackowledges specified IRQs */ | |
| extern void ioc3_ack(struct ioc3_submodule *, struct ioc3_driver_data *, unsigned int); | |
| /* disables IRQs indicated by irq_mask for a specified IOC3 chip */ | |
| extern void ioc3_disable(struct ioc3_submodule *, struct ioc3_driver_data *, unsigned int); | |
| /* atomically sets GPCR bits */ | |
| extern void ioc3_gpcr_set(struct ioc3_driver_data *, unsigned int); | |
| /* general ireg writer */ | |
| extern void ioc3_write_ireg(struct ioc3_driver_data *idd, uint32_t value, int reg); | |
| #endif |