[ARM] 4443/1: OSIRIS: Add watchdog device to machine devices
[linux-2.6] / arch / ppc / boot / of1275 / call_prom.c
1 /*
2  * Copyright (C) 1996-2005 Paul Mackerras.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version
7  * 2 of the License, or (at your option) any later version.
8  */
9
10 #include "of1275.h"
11 #include <stdarg.h>
12
13 int call_prom(const char *service, int nargs, int nret, ...)
14 {
15         int i;
16         struct prom_args {
17                 const char *service;
18                 int nargs;
19                 int nret;
20                 unsigned int args[12];
21         } args;
22         va_list list;
23
24         args.service = service;
25         args.nargs = nargs;
26         args.nret = nret;
27
28         va_start(list, nret);
29         for (i = 0; i < nargs; i++)
30                 args.args[i] = va_arg(list, unsigned int);
31         va_end(list);
32
33         for (i = 0; i < nret; i++)
34                 args.args[nargs+i] = 0;
35
36         if (of_prom_entry(&args) < 0)
37                 return -1;
38
39         return (nret > 0)? args.args[nargs]: 0;
40 }
41
42 int call_prom_ret(const char *service, int nargs, int nret,
43                   unsigned int *rets, ...)
44 {
45         int i;
46         struct prom_args {
47                 const char *service;
48                 int nargs;
49                 int nret;
50                 unsigned int args[12];
51         } args;
52         va_list list;
53
54         args.service = service;
55         args.nargs = nargs;
56         args.nret = nret;
57
58         va_start(list, rets);
59         for (i = 0; i < nargs; i++)
60                 args.args[i] = va_arg(list, unsigned int);
61         va_end(list);
62
63         for (i = 0; i < nret; i++)
64                 args.args[nargs+i] = 0;
65
66         if (of_prom_entry(&args) < 0)
67                 return -1;
68
69         if (rets != (void *) 0)
70                 for (i = 1; i < nret; ++i)
71                         rets[i-1] = args.args[nargs+i];
72
73         return (nret > 0)? args.args[nargs]: 0;
74 }