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