94 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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
 |