|  | /* | 
|  | * 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); | 
|  | } |