]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/boot/oflib.c
Merge branch 'for-jens' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/linux...
[karo-tx-linux.git] / arch / powerpc / boot / oflib.c
index 3b0c9458504fe81b794ed4a5050f40dd62076963..46c98a47d9493a7ae54940070cb7ceb0cc716a59 100644 (file)
@@ -27,11 +27,17 @@ struct prom_args {
        __be32 args[10];        /* Input/output arguments. */
 };
 
+#ifdef __powerpc64__
+extern int prom(void *);
+#else
 static int (*prom) (void *);
+#endif
 
 void of_init(void *promptr)
 {
+#ifndef __powerpc64__
        prom = (int (*)(void *))promptr;
+#endif
 }
 
 #define ADDR(x)                (u32)(unsigned long)(x)
@@ -42,22 +48,22 @@ int of_call_prom(const char *service, int nargs, int nret, ...)
        struct prom_args args;
        va_list list;
 
-       args.service = ADDR(service);
-       args.nargs = nargs;
-       args.nret = nret;
+       args.service = cpu_to_be32(ADDR(service));
+       args.nargs = cpu_to_be32(nargs);
+       args.nret = cpu_to_be32(nret);
 
        va_start(list, nret);
        for (i = 0; i < nargs; i++)
-               args.args[i] = va_arg(list, prom_arg_t);
+               args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
        va_end(list);
 
        for (i = 0; i < nret; i++)
                args.args[nargs+i] = 0;
 
        if (prom(&args) < 0)
-               return -1;
+               return PROM_ERROR;
 
-       return (nret > 0)? args.args[nargs]: 0;
+       return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
 }
 
 static int of_call_prom_ret(const char *service, int nargs, int nret,
@@ -67,26 +73,26 @@ static int of_call_prom_ret(const char *service, int nargs, int nret,
        struct prom_args args;
        va_list list;
 
-       args.service = ADDR(service);
-       args.nargs = nargs;
-       args.nret = nret;
+       args.service = cpu_to_be32(ADDR(service));
+       args.nargs = cpu_to_be32(nargs);
+       args.nret = cpu_to_be32(nret);
 
        va_start(list, rets);
        for (i = 0; i < nargs; i++)
-               args.args[i] = va_arg(list, prom_arg_t);
+               args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
        va_end(list);
 
        for (i = 0; i < nret; i++)
                args.args[nargs+i] = 0;
 
        if (prom(&args) < 0)
-               return -1;
+               return PROM_ERROR;
 
-       if (rets != (void *) 0)
+       if (rets != NULL)
                for (i = 1; i < nret; ++i)
-                       rets[i-1] = args.args[nargs+i];
+                       rets[i-1] = be32_to_cpu(args.args[nargs+i]);
 
-       return (nret > 0)? args.args[nargs]: 0;
+       return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
 }
 
 /* returns true if s2 is a prefix of s1 */
@@ -106,7 +112,7 @@ static int string_match(const char *s1, const char *s2)
  */
 static int need_map = -1;
 static ihandle chosen_mmu;
-static phandle memory;
+static ihandle memory;
 
 static int check_of_version(void)
 {
@@ -135,10 +141,10 @@ static int check_of_version(void)
                printf("no mmu\n");
                return 0;
        }
-       memory = (ihandle) of_call_prom("open", 1, 1, "/memory");
-       if (memory == (ihandle) -1) {
-               memory = (ihandle) of_call_prom("open", 1, 1, "/memory@0");
-               if (memory == (ihandle) -1) {
+       memory = of_call_prom("open", 1, 1, "/memory");
+       if (memory == PROM_ERROR) {
+               memory = of_call_prom("open", 1, 1, "/memory@0");
+               if (memory == PROM_ERROR) {
                        printf("no memory node\n");
                        return 0;
                }
@@ -147,7 +153,8 @@ static int check_of_version(void)
        return 1;
 }
 
-void *of_claim(unsigned long virt, unsigned long size, unsigned long align)
+unsigned int of_claim(unsigned long virt, unsigned long size,
+                     unsigned long align)
 {
        int ret;
        prom_arg_t result;
@@ -155,32 +162,32 @@ void *of_claim(unsigned long virt, unsigned long size, unsigned long align)
        if (need_map < 0)
                need_map = check_of_version();
        if (align || !need_map)
-               return (void *) of_call_prom("claim", 3, 1, virt, size, align);
+               return of_call_prom("claim", 3, 1, virt, size, align);
 
        ret = of_call_prom_ret("call-method", 5, 2, &result, "claim", memory,
                               align, size, virt);
        if (ret != 0 || result == -1)
-               return (void *) -1;
+               return  -1;
        ret = of_call_prom_ret("call-method", 5, 2, &result, "claim", chosen_mmu,
                               align, size, virt);
        /* 0x12 == coherent + read/write */
        ret = of_call_prom("call-method", 6, 1, "map", chosen_mmu,
                           0x12, size, virt, virt);
-       return (void *) virt;
+       return virt;
 }
 
 void *of_vmlinux_alloc(unsigned long size)
 {
        unsigned long start = (unsigned long)_start, end = (unsigned long)_end;
-       void *addr;
+       unsigned long addr;
        void *p;
 
        /* With some older POWER4 firmware we need to claim the area the kernel
         * will reside in.  Newer firmwares don't need this so we just ignore
         * the return value.
         */
-       addr = of_claim(start, end - start, 0);
-       printf("Trying to claim from 0x%lx to 0x%lx (0x%lx) got %p\r\n",
+       addr = (unsigned long) of_claim(start, end - start, 0);
+       printf("Trying to claim from 0x%lx to 0x%lx (0x%lx) got %lx\r\n",
               start, end, end - start, addr);
 
        p = malloc(size);
@@ -200,7 +207,7 @@ void of_exit(void)
  */
 void *of_finddevice(const char *name)
 {
-       return (phandle) of_call_prom("finddevice", 1, 1, name);
+       return (void *) (unsigned long) of_call_prom("finddevice", 1, 1, name);
 }
 
 int of_getprop(const void *phandle, const char *name, void *buf,