| /* | 
 |  * devops.c:  Device operations using the PROM. | 
 |  * | 
 |  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 
 |  */ | 
 | #include <linux/types.h> | 
 | #include <linux/kernel.h> | 
 | #include <linux/sched.h> | 
 |  | 
 | #include <asm/openprom.h> | 
 | #include <asm/oplib.h> | 
 |  | 
 | extern void restore_current(void); | 
 |  | 
 | /* Open the device described by the string 'dstr'.  Returns the handle | 
 |  * to that device used for subsequent operations on that device. | 
 |  * Returns -1 on failure. | 
 |  */ | 
 | int | 
 | prom_devopen(char *dstr) | 
 | { | 
 | 	int handle; | 
 | 	unsigned long flags; | 
 | 	spin_lock_irqsave(&prom_lock, flags); | 
 | 	switch(prom_vers) { | 
 | 	case PROM_V0: | 
 | 		handle = (*(romvec->pv_v0devops.v0_devopen))(dstr); | 
 | 		if(handle == 0) handle = -1; | 
 | 		break; | 
 | 	case PROM_V2: | 
 | 	case PROM_V3: | 
 | 		handle = (*(romvec->pv_v2devops.v2_dev_open))(dstr); | 
 | 		break; | 
 | 	default: | 
 | 		handle = -1; | 
 | 		break; | 
 | 	}; | 
 | 	restore_current(); | 
 | 	spin_unlock_irqrestore(&prom_lock, flags); | 
 |  | 
 | 	return handle; | 
 | } | 
 |  | 
 | /* Close the device described by device handle 'dhandle'. */ | 
 | int | 
 | prom_devclose(int dhandle) | 
 | { | 
 | 	unsigned long flags; | 
 | 	spin_lock_irqsave(&prom_lock, flags); | 
 | 	switch(prom_vers) { | 
 | 	case PROM_V0: | 
 | 		(*(romvec->pv_v0devops.v0_devclose))(dhandle); | 
 | 		break; | 
 | 	case PROM_V2: | 
 | 	case PROM_V3: | 
 | 		(*(romvec->pv_v2devops.v2_dev_close))(dhandle); | 
 | 		break; | 
 | 	default: | 
 | 		break; | 
 | 	}; | 
 | 	restore_current(); | 
 | 	spin_unlock_irqrestore(&prom_lock, flags); | 
 | 	return 0; | 
 | } | 
 |  | 
 | /* Seek to specified location described by 'seekhi' and 'seeklo' | 
 |  * for device 'dhandle'. | 
 |  */ | 
 | void | 
 | prom_seek(int dhandle, unsigned int seekhi, unsigned int seeklo) | 
 | { | 
 | 	unsigned long flags; | 
 | 	spin_lock_irqsave(&prom_lock, flags); | 
 | 	switch(prom_vers) { | 
 | 	case PROM_V0: | 
 | 		(*(romvec->pv_v0devops.v0_seekdev))(dhandle, seekhi, seeklo); | 
 | 		break; | 
 | 	case PROM_V2: | 
 | 	case PROM_V3: | 
 | 		(*(romvec->pv_v2devops.v2_dev_seek))(dhandle, seekhi, seeklo); | 
 | 		break; | 
 | 	default: | 
 | 		break; | 
 | 	}; | 
 | 	restore_current(); | 
 | 	spin_unlock_irqrestore(&prom_lock, flags); | 
 |  | 
 | 	return; | 
 | } |