/* * 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