1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (c) 2005 Stanislaw Skowronek <skylark@linux-mips.org> 7 */ 8 9 #ifndef _LINUX_IOC3_H 10 #define _LINUX_IOC3_H 11 12 #include <asm/sn/ioc3.h> 13 14 #define IOC3_MAX_SUBMODULES 32 15 16 #define IOC3_CLASS_NONE 0 17 #define IOC3_CLASS_BASE_IP27 1 18 #define IOC3_CLASS_BASE_IP30 2 19 #define IOC3_CLASS_MENET_123 3 20 #define IOC3_CLASS_MENET_4 4 21 #define IOC3_CLASS_CADDUO 5 22 #define IOC3_CLASS_SERIAL 6 23 24 /* One of these per IOC3 */ 25 struct ioc3_driver_data { 26 struct list_head list; 27 int id; /* IOC3 sequence number */ 28 /* PCI mapping */ 29 unsigned long pma; /* physical address */ 30 struct ioc3 __iomem *vma; /* pointer to registers */ 31 struct pci_dev *pdev; /* PCI device */ 32 /* IRQ stuff */ 33 int dual_irq; /* set if separate IRQs are used */ 34 int irq_io, irq_eth; /* IRQ numbers */ 35 /* GPIO magic */ 36 spinlock_t gpio_lock; 37 unsigned int gpdr_shadow; 38 /* NIC identifiers */ 39 char nic_part[32]; 40 char nic_serial[16]; 41 char nic_mac[6]; 42 /* submodule set */ 43 int class; 44 void *data[IOC3_MAX_SUBMODULES]; /* for submodule use */ 45 int active[IOC3_MAX_SUBMODULES]; /* set if probe succeeds */ 46 /* is_ir_lock must be held while 47 * modifying sio_ie values, so 48 * we can be sure that sio_ie is 49 * not changing when we read it 50 * along with sio_ir. 51 */ 52 spinlock_t ir_lock; /* SIO_IE[SC] mod lock */ 53 }; 54 55 /* One per submodule */ 56 struct ioc3_submodule { 57 char *name; /* descriptive submodule name */ 58 struct module *owner; /* owning kernel module */ 59 int ethernet; /* set for ethernet drivers */ 60 int (*probe) (struct ioc3_submodule *, struct ioc3_driver_data *); 61 int (*remove) (struct ioc3_submodule *, struct ioc3_driver_data *); 62 int id; /* assigned by IOC3, index for the "data" array */ 63 /* IRQ stuff */ 64 unsigned int irq_mask; /* IOC3 IRQ mask, leave clear for Ethernet */ 65 int reset_mask; /* non-zero if you want the ioc3.c module to reset interrupts */ 66 int (*intr) (struct ioc3_submodule *, struct ioc3_driver_data *, unsigned int); 67 /* private submodule data */ 68 void *data; /* assigned by submodule */ 69 }; 70 71 /********************************** 72 * Functions needed by submodules * 73 **********************************/ 74 75 #define IOC3_W_IES 0 76 #define IOC3_W_IEC 1 77 78 /* registers a submodule for all existing and future IOC3 chips */ 79 extern int ioc3_register_submodule(struct ioc3_submodule *); 80 /* unregisters a submodule */ 81 extern void ioc3_unregister_submodule(struct ioc3_submodule *); 82 /* enables IRQs indicated by irq_mask for a specified IOC3 chip */ 83 extern void ioc3_enable(struct ioc3_submodule *, struct ioc3_driver_data *, unsigned int); 84 /* ackowledges specified IRQs */ 85 extern void ioc3_ack(struct ioc3_submodule *, struct ioc3_driver_data *, unsigned int); 86 /* disables IRQs indicated by irq_mask for a specified IOC3 chip */ 87 extern void ioc3_disable(struct ioc3_submodule *, struct ioc3_driver_data *, unsigned int); 88 /* atomically sets GPCR bits */ 89 extern void ioc3_gpcr_set(struct ioc3_driver_data *, unsigned int); 90 /* general ireg writer */ 91 extern void ioc3_write_ireg(struct ioc3_driver_data *idd, uint32_t value, int reg); 92 93 #endif 94