|
|
1.1 root 1: /*
2: * Creation Date: <2002/10/03 20:55:02 samuel>
3: * Time-stamp: <2002/10/29 13:00:23 samuel>
4: *
5: * <prom.c>
6: *
7: * oftree interface
8: *
9: * Copyright (C) 2002, 2003 Samuel Rydh ([email protected])
10: *
11: * This program is free software; you can redistribute it and/or
12: * modify it under the terms of the GNU General Public License
13: * as published by the Free Software Foundation
14: *
15: */
16:
17: #include "config.h"
18: #include "osi_calls.h"
19: #include "mol/prom.h"
20:
21: /* OSI_PromClose (free linux side device tree) */
22: int
23: prom_close( void )
24: {
25: return OSI_PromIface( kPromClose, 0 );
26: }
27:
28: /* ret: 0 no more peers, -1 if error */
29: mol_phandle_t
30: prom_peer( mol_phandle_t phandle )
31: {
32: return OSI_PromIface( kPromPeer, phandle );
33: }
34:
35: /* ret: 0 no child, -1 if error */
36: mol_phandle_t
37: prom_child( mol_phandle_t phandle )
38: {
39: return OSI_PromIface( kPromChild, phandle );
40: }
41:
42: /* ret: 0 if root node, -1 if error */
43: mol_phandle_t
44: prom_parent( mol_phandle_t phandle )
45: {
46: return OSI_PromIface( kPromParent, phandle );
47: }
48:
49: /* ret: -1 error */
50: int
51: prom_package_to_path( mol_phandle_t phandle, char *buf, long buflen )
52: {
53: return OSI_PromIface2( kPromPackageToPath, phandle, (int)buf, buflen );
54: }
55:
56: /* ret: -1 error */
57: int
58: prom_get_prop_len( mol_phandle_t phandle, const char *name )
59: {
60: return OSI_PromIface1( kPromGetPropLen, phandle, (int)name );
61: }
62:
63: /* ret: prop len or -1 if error */
64: int
65: prom_get_prop( mol_phandle_t phandle, const char *name, char *buf, long buflen )
66: {
67: return OSI_PromIface3( kPromGetProp, phandle, (int)name, (int)buf, buflen );
68: }
69:
70: /* ret: prop len or -1 if error */
71: int
72: prom_get_prop_by_path( const char *path, const char *name, char *buf, long buflen )
73: {
74: mol_phandle_t ph = prom_find_device(path);
75: return (ph != -1)? prom_get_prop( ph, name, buf, buflen) : -1;
76: }
77:
78: /* ret: -1 error, 0 last prop, 1 otherwise */
79: int
80: prom_next_prop( mol_phandle_t phandle, const char *prev, char *buf )
81: {
82: return OSI_PromIface2( kPromNextProp, phandle, (int)prev, (int)buf );
83: }
84:
85: /* ret: -1 if error */
86: int
87: prom_set_prop( mol_phandle_t phandle, const char *name, char *buf, long buflen )
88: {
89: return OSI_PromIface3( kPromSetProp, phandle, (int)name, (int)buf, buflen );
90: }
91:
92: /* ret: -1 if error */
93: mol_phandle_t
94: prom_create_node( const char *path )
95: {
96: return OSI_PromPathIface( kPromCreateNode, path );
97: }
98:
99: /* ret: -1 if not found */
100: mol_phandle_t
101: prom_find_device( const char *path )
102: {
103: mol_phandle_t ph;
104: char buf2[256], ch, *p;
105:
106: if( !path )
107: return -1;
108:
109: if( (ph=OSI_PromPathIface( kPromFindDevice, path )) != -1 )
110: return ph;
111: else if( path[0] == '/' )
112: return -1;
113:
114: /* might be an alias */
115: if( !(p=strpbrk(path, "@:/")) )
116: p = (char*)path + strlen(path);
117:
118: ch = *p;
119: *p = 0;
120: if( (ph=prom_get_prop(prom_find_device("/aliases"), path, buf2, sizeof(buf2))) == -1 )
121: return -1;
122: *p = ch;
123: strncat( buf2, p, sizeof(buf2) );
124:
125: if( buf2[0] != '/' ) {
126: printk("Error: aliases must be absolute!\n");
127: return -1;
128: }
129: ph = OSI_PromPathIface( kPromFindDevice, buf2 );
130: return ph;
131: }
132:
133:
134:
135: /************************************************************************/
136: /* search the tree for nodes with matching device_type */
137: /************************************************************************/
138:
139: static mol_phandle_t
140: prom_find_device_type_( mol_phandle_t ph, const char *type, int *icount, int index )
141: {
142: char buf[64];
143: int ph2;
144:
145: if( ph == -1 || !ph )
146: return -1;
147: if( prom_get_prop( ph, "device_type", buf, sizeof(buf)) > 0 )
148: if( !strcmp(buf, type) )
149: if( (*icount)++ == index )
150: return ph;
151: if( (ph2=prom_find_device_type_( prom_peer(ph), type, icount, index )) != -1 )
152: return ph2;
153: if( (ph2=prom_find_device_type_( prom_child(ph), type, icount, index )) != -1 )
154: return ph2;
155: return -1;
156: }
157:
158: mol_phandle_t
159: prom_find_device_type( const char *type, int index )
160: {
161: int count = 0;
162: return prom_find_device_type_( prom_peer(0), type, &count, index );
163: }
164:
165:
166: /************************************************************************/
167: /* device tree tweaking */
168: /************************************************************************/
169:
170: /* -1 if error */
171: int
172: prom_change_phandle( mol_phandle_t old_ph, mol_phandle_t new_ph )
173: {
174: return OSI_PromIface1( kPromChangePHandle, old_ph, (int)new_ph );
175: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.