forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
3.1 KiB
93 lines
3.1 KiB
/* |
|
* 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 <[email protected]> |
|
*/ |
|
|
|
#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
|
|
|