1/* $Id: devops.c,v 1.1.1.1 2007/08/03 18:52:18 Exp $
2 * devops.c:  Device operations using the PROM.
3 *
4 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
5 */
6#include <linux/types.h>
7#include <linux/kernel.h>
8#include <linux/sched.h>
9
10#include <asm/openprom.h>
11#include <asm/oplib.h>
12
13extern void restore_current(void);
14
15/* Open the device described by the string 'dstr'.  Returns the handle
16 * to that device used for subsequent operations on that device.
17 * Returns -1 on failure.
18 */
19int
20prom_devopen(char *dstr)
21{
22	int handle;
23	unsigned long flags;
24	spin_lock_irqsave(&prom_lock, flags);
25	switch(prom_vers) {
26	case PROM_V0:
27		handle = (*(romvec->pv_v0devops.v0_devopen))(dstr);
28		if(handle == 0) handle = -1;
29		break;
30	case PROM_V2:
31	case PROM_V3:
32		handle = (*(romvec->pv_v2devops.v2_dev_open))(dstr);
33		break;
34	default:
35		handle = -1;
36		break;
37	};
38	restore_current();
39	spin_unlock_irqrestore(&prom_lock, flags);
40
41	return handle;
42}
43
44/* Close the device described by device handle 'dhandle'. */
45int
46prom_devclose(int dhandle)
47{
48	unsigned long flags;
49	spin_lock_irqsave(&prom_lock, flags);
50	switch(prom_vers) {
51	case PROM_V0:
52		(*(romvec->pv_v0devops.v0_devclose))(dhandle);
53		break;
54	case PROM_V2:
55	case PROM_V3:
56		(*(romvec->pv_v2devops.v2_dev_close))(dhandle);
57		break;
58	default:
59		break;
60	};
61	restore_current();
62	spin_unlock_irqrestore(&prom_lock, flags);
63	return 0;
64}
65
66/* Seek to specified location described by 'seekhi' and 'seeklo'
67 * for device 'dhandle'.
68 */
69void
70prom_seek(int dhandle, unsigned int seekhi, unsigned int seeklo)
71{
72	unsigned long flags;
73	spin_lock_irqsave(&prom_lock, flags);
74	switch(prom_vers) {
75	case PROM_V0:
76		(*(romvec->pv_v0devops.v0_seekdev))(dhandle, seekhi, seeklo);
77		break;
78	case PROM_V2:
79	case PROM_V3:
80		(*(romvec->pv_v2devops.v2_dev_seek))(dhandle, seekhi, seeklo);
81		break;
82	default:
83		break;
84	};
85	restore_current();
86	spin_unlock_irqrestore(&prom_lock, flags);
87
88	return;
89}
90