diff options
| -rw-r--r-- | arch/sparc/include/asm/openprom.h | 2 | ||||
| -rw-r--r-- | arch/sparc/include/asm/oplib_32.h | 35 | ||||
| -rw-r--r-- | arch/sparc/include/asm/oplib_64.h | 46 | ||||
| -rw-r--r-- | arch/sparc/kernel/leon_kernel.c | 4 | ||||
| -rw-r--r-- | arch/sparc/prom/Makefile | 1 | ||||
| -rw-r--r-- | arch/sparc/prom/console_32.c | 65 | ||||
| -rw-r--r-- | arch/sparc/prom/console_64.c | 81 | ||||
| -rw-r--r-- | arch/sparc/prom/devops_32.c | 87 | ||||
| -rw-r--r-- | arch/sparc/prom/devops_64.c | 67 | ||||
| -rw-r--r-- | arch/sparc/prom/misc_64.c | 16 | ||||
| -rw-r--r-- | arch/sparc/prom/printf.c | 35 | ||||
| -rw-r--r-- | arch/sparc/prom/tree_32.c | 16 | ||||
| -rw-r--r-- | arch/sparc/prom/tree_64.c | 18 |
13 files changed, 64 insertions, 409 deletions
diff --git a/arch/sparc/include/asm/openprom.h b/arch/sparc/include/asm/openprom.h index 81cd43432dc0..47eaafad15ce 100644 --- a/arch/sparc/include/asm/openprom.h +++ b/arch/sparc/include/asm/openprom.h | |||
| @@ -39,7 +39,7 @@ struct linux_dev_v2_funcs { | |||
| 39 | int (*v2_dev_open)(char *devpath); | 39 | int (*v2_dev_open)(char *devpath); |
| 40 | void (*v2_dev_close)(int d); | 40 | void (*v2_dev_close)(int d); |
| 41 | int (*v2_dev_read)(int d, char *buf, int nbytes); | 41 | int (*v2_dev_read)(int d, char *buf, int nbytes); |
| 42 | int (*v2_dev_write)(int d, char *buf, int nbytes); | 42 | int (*v2_dev_write)(int d, const char *buf, int nbytes); |
| 43 | int (*v2_dev_seek)(int d, int hi, int lo); | 43 | int (*v2_dev_seek)(int d, int hi, int lo); |
| 44 | 44 | ||
| 45 | /* Never issued (multistage load support) */ | 45 | /* Never issued (multistage load support) */ |
diff --git a/arch/sparc/include/asm/oplib_32.h b/arch/sparc/include/asm/oplib_32.h index 51296a6f5005..9e5c64084b86 100644 --- a/arch/sparc/include/asm/oplib_32.h +++ b/arch/sparc/include/asm/oplib_32.h | |||
| @@ -60,25 +60,6 @@ extern char *prom_getbootargs(void); | |||
| 60 | extern char *prom_mapio(char *virt_hint, int io_space, unsigned int phys_addr, unsigned int num_bytes); | 60 | extern char *prom_mapio(char *virt_hint, int io_space, unsigned int phys_addr, unsigned int num_bytes); |
| 61 | extern void prom_unmapio(char *virt_addr, unsigned int num_bytes); | 61 | extern void prom_unmapio(char *virt_addr, unsigned int num_bytes); |
| 62 | 62 | ||
| 63 | /* Device operations. */ | ||
| 64 | |||
| 65 | /* Open the device described by the passed string. Note, that the format | ||
| 66 | * of the string is different on V0 vs. V2->higher proms. The caller must | ||
| 67 | * know what he/she is doing! Returns the device descriptor, an int. | ||
| 68 | */ | ||
| 69 | extern int prom_devopen(char *device_string); | ||
| 70 | |||
| 71 | /* Close a previously opened device described by the passed integer | ||
| 72 | * descriptor. | ||
| 73 | */ | ||
| 74 | extern int prom_devclose(int device_handle); | ||
| 75 | |||
| 76 | /* Do a seek operation on the device described by the passed integer | ||
| 77 | * descriptor. | ||
| 78 | */ | ||
| 79 | extern void prom_seek(int device_handle, unsigned int seek_hival, | ||
| 80 | unsigned int seek_lowval); | ||
| 81 | |||
| 82 | /* Miscellaneous routines, don't really fit in any category per se. */ | 63 | /* Miscellaneous routines, don't really fit in any category per se. */ |
| 83 | 64 | ||
| 84 | /* Reboot the machine with the command line passed. */ | 65 | /* Reboot the machine with the command line passed. */ |
| @@ -121,19 +102,8 @@ extern int prom_getrev(void); | |||
| 121 | /* Get the prom firmware revision. */ | 102 | /* Get the prom firmware revision. */ |
| 122 | extern int prom_getprev(void); | 103 | extern int prom_getprev(void); |
| 123 | 104 | ||
| 124 | /* Character operations to/from the console.... */ | 105 | /* Write a buffer of characters to the console. */ |
| 125 | 106 | extern void prom_console_write_buf(const char *buf, int len); | |
| 126 | /* Non-blocking get character from console. */ | ||
| 127 | extern int prom_nbgetchar(void); | ||
| 128 | |||
| 129 | /* Non-blocking put character to console. */ | ||
| 130 | extern int prom_nbputchar(char character); | ||
| 131 | |||
| 132 | /* Blocking get character from console. */ | ||
| 133 | extern char prom_getchar(void); | ||
| 134 | |||
| 135 | /* Blocking put character to console. */ | ||
| 136 | extern void prom_putchar(char character); | ||
| 137 | 107 | ||
| 138 | /* Prom's internal routines, don't use in kernel/boot code. */ | 108 | /* Prom's internal routines, don't use in kernel/boot code. */ |
| 139 | extern void prom_printf(const char *fmt, ...); | 109 | extern void prom_printf(const char *fmt, ...); |
| @@ -238,7 +208,6 @@ extern int prom_node_has_property(phandle node, char *property); | |||
| 238 | extern int prom_setprop(phandle node, const char *prop_name, char *prop_value, | 208 | extern int prom_setprop(phandle node, const char *prop_name, char *prop_value, |
| 239 | int value_size); | 209 | int value_size); |
| 240 | 210 | ||
| 241 | extern phandle prom_pathtoinode(char *path); | ||
| 242 | extern phandle prom_inst2pkg(int); | 211 | extern phandle prom_inst2pkg(int); |
| 243 | 212 | ||
| 244 | /* Dorking with Bus ranges... */ | 213 | /* Dorking with Bus ranges... */ |
diff --git a/arch/sparc/include/asm/oplib_64.h b/arch/sparc/include/asm/oplib_64.h index c9cc078e3e31..8cd0df34e82b 100644 --- a/arch/sparc/include/asm/oplib_64.h +++ b/arch/sparc/include/asm/oplib_64.h | |||
| @@ -67,27 +67,6 @@ extern void prom_init(void *cif_handler, void *cif_stack); | |||
| 67 | /* Boot argument acquisition, returns the boot command line string. */ | 67 | /* Boot argument acquisition, returns the boot command line string. */ |
| 68 | extern char *prom_getbootargs(void); | 68 | extern char *prom_getbootargs(void); |
| 69 | 69 | ||
| 70 | /* Device utilities. */ | ||
| 71 | |||
| 72 | /* Device operations. */ | ||
| 73 | |||
| 74 | /* Open the device described by the passed string. Note, that the format | ||
| 75 | * of the string is different on V0 vs. V2->higher proms. The caller must | ||
| 76 | * know what he/she is doing! Returns the device descriptor, an int. | ||
| 77 | */ | ||
| 78 | extern int prom_devopen(const char *device_string); | ||
| 79 | |||
| 80 | /* Close a previously opened device described by the passed integer | ||
| 81 | * descriptor. | ||
| 82 | */ | ||
| 83 | extern int prom_devclose(int device_handle); | ||
| 84 | |||
| 85 | /* Do a seek operation on the device described by the passed integer | ||
| 86 | * descriptor. | ||
| 87 | */ | ||
| 88 | extern void prom_seek(int device_handle, unsigned int seek_hival, | ||
| 89 | unsigned int seek_lowval); | ||
| 90 | |||
| 91 | /* Miscellaneous routines, don't really fit in any category per se. */ | 70 | /* Miscellaneous routines, don't really fit in any category per se. */ |
| 92 | 71 | ||
| 93 | /* Reboot the machine with the command line passed. */ | 72 | /* Reboot the machine with the command line passed. */ |
| @@ -109,33 +88,14 @@ extern void prom_halt(void) __attribute__ ((noreturn)); | |||
| 109 | /* Halt and power-off the machine. */ | 88 | /* Halt and power-off the machine. */ |
| 110 | extern void prom_halt_power_off(void) __attribute__ ((noreturn)); | 89 | extern void prom_halt_power_off(void) __attribute__ ((noreturn)); |
| 111 | 90 | ||
| 112 | /* Set the PROM 'sync' callback function to the passed function pointer. | ||
| 113 | * When the user gives the 'sync' command at the prom prompt while the | ||
| 114 | * kernel is still active, the prom will call this routine. | ||
| 115 | * | ||
| 116 | */ | ||
| 117 | typedef int (*callback_func_t)(long *cmd); | ||
| 118 | extern void prom_setcallback(callback_func_t func_ptr); | ||
| 119 | |||
| 120 | /* Acquire the IDPROM of the root node in the prom device tree. This | 91 | /* Acquire the IDPROM of the root node in the prom device tree. This |
| 121 | * gets passed a buffer where you would like it stuffed. The return value | 92 | * gets passed a buffer where you would like it stuffed. The return value |
| 122 | * is the format type of this idprom or 0xff on error. | 93 | * is the format type of this idprom or 0xff on error. |
| 123 | */ | 94 | */ |
| 124 | extern unsigned char prom_get_idprom(char *idp_buffer, int idpbuf_size); | 95 | extern unsigned char prom_get_idprom(char *idp_buffer, int idpbuf_size); |
| 125 | 96 | ||
| 126 | /* Character operations to/from the console.... */ | 97 | /* Write a buffer of characters to the console. */ |
| 127 | 98 | extern void prom_console_write_buf(const char *buf, int len); | |
| 128 | /* Non-blocking get character from console. */ | ||
| 129 | extern int prom_nbgetchar(void); | ||
| 130 | |||
| 131 | /* Non-blocking put character to console. */ | ||
| 132 | extern int prom_nbputchar(char character); | ||
| 133 | |||
| 134 | /* Blocking get character from console. */ | ||
| 135 | extern char prom_getchar(void); | ||
| 136 | |||
| 137 | /* Blocking put character to console. */ | ||
| 138 | extern void prom_putchar(char character); | ||
| 139 | 99 | ||
| 140 | /* Prom's internal routines, don't use in kernel/boot code. */ | 100 | /* Prom's internal routines, don't use in kernel/boot code. */ |
| 141 | extern void prom_printf(const char *fmt, ...); | 101 | extern void prom_printf(const char *fmt, ...); |
| @@ -279,9 +239,7 @@ extern phandle prom_finddevice(const char *name); | |||
| 279 | extern int prom_setprop(phandle node, const char *prop_name, char *prop_value, | 239 | extern int prom_setprop(phandle node, const char *prop_name, char *prop_value, |
| 280 | int value_size); | 240 | int value_size); |
| 281 | 241 | ||
| 282 | extern phandle prom_pathtoinode(const char *path); | ||
| 283 | extern phandle prom_inst2pkg(int); | 242 | extern phandle prom_inst2pkg(int); |
| 284 | extern int prom_service_exists(const char *service_name); | ||
| 285 | extern void prom_sun4v_guest_soft_state(void); | 243 | extern void prom_sun4v_guest_soft_state(void); |
| 286 | 244 | ||
| 287 | extern int prom_ihandle2path(int handle, char *buffer, int bufsize); | 245 | extern int prom_ihandle2path(int handle, char *buffer, int bufsize); |
diff --git a/arch/sparc/kernel/leon_kernel.c b/arch/sparc/kernel/leon_kernel.c index 2d51527d810f..f01c42661ee5 100644 --- a/arch/sparc/kernel/leon_kernel.c +++ b/arch/sparc/kernel/leon_kernel.c | |||
| @@ -114,7 +114,7 @@ void __init leon_init_timers(irq_handler_t counter_fn) | |||
| 114 | if (leon3_gptimer_regs && leon3_irqctrl_regs) { | 114 | if (leon3_gptimer_regs && leon3_irqctrl_regs) { |
| 115 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].val, 0); | 115 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].val, 0); |
| 116 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].rld, | 116 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].rld, |
| 117 | (((1000000 / 100) - 1))); | 117 | (((1000000 / HZ) - 1))); |
| 118 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].ctrl, 0); | 118 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].ctrl, 0); |
| 119 | 119 | ||
| 120 | #ifdef CONFIG_SMP | 120 | #ifdef CONFIG_SMP |
| @@ -128,7 +128,7 @@ void __init leon_init_timers(irq_handler_t counter_fn) | |||
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].val, 0); | 130 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].val, 0); |
| 131 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].rld, (((1000000/100) - 1))); | 131 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].rld, (((1000000/HZ) - 1))); |
| 132 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].ctrl, 0); | 132 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].ctrl, 0); |
| 133 | # endif | 133 | # endif |
| 134 | 134 | ||
diff --git a/arch/sparc/prom/Makefile b/arch/sparc/prom/Makefile index 1b8c073adb44..816c0fa12dc0 100644 --- a/arch/sparc/prom/Makefile +++ b/arch/sparc/prom/Makefile | |||
| @@ -6,7 +6,6 @@ ccflags := -Werror | |||
| 6 | 6 | ||
| 7 | lib-y := bootstr_$(BITS).o | 7 | lib-y := bootstr_$(BITS).o |
| 8 | lib-$(CONFIG_SPARC32) += devmap.o | 8 | lib-$(CONFIG_SPARC32) += devmap.o |
| 9 | lib-y += devops_$(BITS).o | ||
| 10 | lib-y += init_$(BITS).o | 9 | lib-y += init_$(BITS).o |
| 11 | lib-$(CONFIG_SPARC32) += memory.o | 10 | lib-$(CONFIG_SPARC32) += memory.o |
| 12 | lib-y += misc_$(BITS).o | 11 | lib-y += misc_$(BITS).o |
diff --git a/arch/sparc/prom/console_32.c b/arch/sparc/prom/console_32.c index 5340264b78f5..48863108a44c 100644 --- a/arch/sparc/prom/console_32.c +++ b/arch/sparc/prom/console_32.c | |||
| @@ -16,63 +16,26 @@ | |||
| 16 | 16 | ||
| 17 | extern void restore_current(void); | 17 | extern void restore_current(void); |
| 18 | 18 | ||
| 19 | /* Non blocking get character from console input device, returns -1 | ||
| 20 | * if no input was taken. This can be used for polling. | ||
| 21 | */ | ||
| 22 | int | ||
| 23 | prom_nbgetchar(void) | ||
| 24 | { | ||
| 25 | static char inc; | ||
| 26 | int i = -1; | ||
| 27 | unsigned long flags; | ||
| 28 | |||
| 29 | spin_lock_irqsave(&prom_lock, flags); | ||
| 30 | switch(prom_vers) { | ||
| 31 | case PROM_V0: | ||
| 32 | i = (*(romvec->pv_nbgetchar))(); | ||
| 33 | break; | ||
| 34 | case PROM_V2: | ||
| 35 | case PROM_V3: | ||
| 36 | if( (*(romvec->pv_v2devops).v2_dev_read)(*romvec->pv_v2bootargs.fd_stdin , &inc, 0x1) == 1) { | ||
| 37 | i = inc; | ||
| 38 | } else { | ||
| 39 | i = -1; | ||
| 40 | } | ||
| 41 | break; | ||
| 42 | default: | ||
| 43 | i = -1; | ||
| 44 | break; | ||
| 45 | }; | ||
| 46 | restore_current(); | ||
| 47 | spin_unlock_irqrestore(&prom_lock, flags); | ||
| 48 | return i; /* Ugh, we could spin forever on unsupported proms ;( */ | ||
| 49 | } | ||
| 50 | |||
| 51 | /* Non blocking put character to console device, returns -1 if | 19 | /* Non blocking put character to console device, returns -1 if |
| 52 | * unsuccessful. | 20 | * unsuccessful. |
| 53 | */ | 21 | */ |
| 54 | int | 22 | static int prom_nbputchar(const char *buf) |
| 55 | prom_nbputchar(char c) | ||
| 56 | { | 23 | { |
| 57 | static char outc; | ||
| 58 | unsigned long flags; | 24 | unsigned long flags; |
| 59 | int i = -1; | 25 | int i = -1; |
| 60 | 26 | ||
| 61 | spin_lock_irqsave(&prom_lock, flags); | 27 | spin_lock_irqsave(&prom_lock, flags); |
| 62 | switch(prom_vers) { | 28 | switch(prom_vers) { |
| 63 | case PROM_V0: | 29 | case PROM_V0: |
| 64 | i = (*(romvec->pv_nbputchar))(c); | 30 | i = (*(romvec->pv_nbputchar))(*buf); |
| 65 | break; | 31 | break; |
| 66 | case PROM_V2: | 32 | case PROM_V2: |
| 67 | case PROM_V3: | 33 | case PROM_V3: |
| 68 | outc = c; | 34 | if ((*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, |
| 69 | if( (*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, &outc, 0x1) == 1) | 35 | buf, 0x1) == 1) |
| 70 | i = 0; | 36 | i = 0; |
| 71 | else | ||
| 72 | i = -1; | ||
| 73 | break; | 37 | break; |
| 74 | default: | 38 | default: |
| 75 | i = -1; | ||
| 76 | break; | 39 | break; |
| 77 | }; | 40 | }; |
| 78 | restore_current(); | 41 | restore_current(); |
| @@ -80,18 +43,14 @@ prom_nbputchar(char c) | |||
| 80 | return i; /* Ugh, we could spin forever on unsupported proms ;( */ | 43 | return i; /* Ugh, we could spin forever on unsupported proms ;( */ |
| 81 | } | 44 | } |
| 82 | 45 | ||
| 83 | /* Blocking version of get character routine above. */ | 46 | void prom_console_write_buf(const char *buf, int len) |
| 84 | char | ||
| 85 | prom_getchar(void) | ||
| 86 | { | 47 | { |
| 87 | int character; | 48 | while (len) { |
| 88 | while((character = prom_nbgetchar()) == -1) ; | 49 | int n = prom_nbputchar(buf); |
| 89 | return (char) character; | 50 | if (n) |
| 51 | continue; | ||
| 52 | len--; | ||
| 53 | buf++; | ||
| 54 | } | ||
| 90 | } | 55 | } |
| 91 | 56 | ||
| 92 | /* Blocking version of put character routine above. */ | ||
| 93 | void | ||
| 94 | prom_putchar(char c) | ||
| 95 | { | ||
| 96 | while(prom_nbputchar(c) == -1) ; | ||
| 97 | } | ||
diff --git a/arch/sparc/prom/console_64.c b/arch/sparc/prom/console_64.c index 10322dc2f557..ed39e75828bd 100644 --- a/arch/sparc/prom/console_64.c +++ b/arch/sparc/prom/console_64.c | |||
| @@ -15,85 +15,34 @@ | |||
| 15 | 15 | ||
| 16 | extern int prom_stdin, prom_stdout; | 16 | extern int prom_stdin, prom_stdout; |
| 17 | 17 | ||
| 18 | /* Non blocking get character from console input device, returns -1 | 18 | static int __prom_console_write_buf(const char *buf, int len) |
| 19 | * if no input was taken. This can be used for polling. | ||
| 20 | */ | ||
| 21 | inline int | ||
| 22 | prom_nbgetchar(void) | ||
| 23 | { | ||
| 24 | unsigned long args[7]; | ||
| 25 | char inc; | ||
| 26 | |||
| 27 | args[0] = (unsigned long) "read"; | ||
| 28 | args[1] = 3; | ||
| 29 | args[2] = 1; | ||
| 30 | args[3] = (unsigned int) prom_stdin; | ||
| 31 | args[4] = (unsigned long) &inc; | ||
| 32 | args[5] = 1; | ||
| 33 | args[6] = (unsigned long) -1; | ||
| 34 | |||
| 35 | p1275_cmd_direct(args); | ||
| 36 | |||
| 37 | if (args[6] == 1) | ||
| 38 | return inc; | ||
| 39 | return -1; | ||
| 40 | } | ||
| 41 | |||
| 42 | /* Non blocking put character to console device, returns -1 if | ||
| 43 | * unsuccessful. | ||
| 44 | */ | ||
| 45 | inline int | ||
| 46 | prom_nbputchar(char c) | ||
| 47 | { | 19 | { |
| 48 | unsigned long args[7]; | 20 | unsigned long args[7]; |
| 49 | char outc; | 21 | int ret; |
| 50 | |||
| 51 | outc = c; | ||
| 52 | 22 | ||
| 53 | args[0] = (unsigned long) "write"; | 23 | args[0] = (unsigned long) "write"; |
| 54 | args[1] = 3; | 24 | args[1] = 3; |
| 55 | args[2] = 1; | 25 | args[2] = 1; |
| 56 | args[3] = (unsigned int) prom_stdout; | 26 | args[3] = (unsigned int) prom_stdout; |
| 57 | args[4] = (unsigned long) &outc; | 27 | args[4] = (unsigned long) buf; |
| 58 | args[5] = 1; | 28 | args[5] = (unsigned int) len; |
| 59 | args[6] = (unsigned long) -1; | 29 | args[6] = (unsigned long) -1; |
| 60 | 30 | ||
| 61 | p1275_cmd_direct(args); | 31 | p1275_cmd_direct(args); |
| 62 | 32 | ||
| 63 | if (args[6] == 1) | 33 | ret = (int) args[6]; |
| 64 | return 0; | 34 | if (ret < 0) |
| 65 | else | ||
| 66 | return -1; | 35 | return -1; |
| 36 | return ret; | ||
| 67 | } | 37 | } |
| 68 | 38 | ||
| 69 | /* Blocking version of get character routine above. */ | 39 | void prom_console_write_buf(const char *buf, int len) |
| 70 | char | ||
| 71 | prom_getchar(void) | ||
| 72 | { | ||
| 73 | int character; | ||
| 74 | while((character = prom_nbgetchar()) == -1) ; | ||
| 75 | return (char) character; | ||
| 76 | } | ||
| 77 | |||
| 78 | /* Blocking version of put character routine above. */ | ||
| 79 | void | ||
| 80 | prom_putchar(char c) | ||
| 81 | { | 40 | { |
| 82 | prom_nbputchar(c); | 41 | while (len) { |
| 83 | } | 42 | int n = __prom_console_write_buf(buf, len); |
| 84 | 43 | if (n < 0) | |
| 85 | void | 44 | continue; |
| 86 | prom_puts(const char *s, int len) | 45 | len -= n; |
| 87 | { | 46 | buf += len; |
| 88 | unsigned long args[7]; | 47 | } |
| 89 | |||
| 90 | args[0] = (unsigned long) "write"; | ||
| 91 | args[1] = 3; | ||
| 92 | args[2] = 1; | ||
| 93 | args[3] = (unsigned int) prom_stdout; | ||
| 94 | args[4] = (unsigned long) s; | ||
| 95 | args[5] = len; | ||
| 96 | args[6] = (unsigned long) -1; | ||
| 97 | |||
| 98 | p1275_cmd_direct(args); | ||
| 99 | } | 48 | } |
diff --git a/arch/sparc/prom/devops_32.c b/arch/sparc/prom/devops_32.c deleted file mode 100644 index 9c5d4687242a..000000000000 --- a/arch/sparc/prom/devops_32.c +++ /dev/null | |||
| @@ -1,87 +0,0 @@ | |||
| 1 | /* | ||
| 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 | |||
| 13 | extern 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 | */ | ||
| 19 | int | ||
| 20 | prom_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'. */ | ||
| 45 | int | ||
| 46 | prom_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 | */ | ||
| 69 | void | ||
| 70 | prom_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 | } | ||
diff --git a/arch/sparc/prom/devops_64.c b/arch/sparc/prom/devops_64.c deleted file mode 100644 index a017119e7ef1..000000000000 --- a/arch/sparc/prom/devops_64.c +++ /dev/null | |||
| @@ -1,67 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * devops.c: Device operations using the PROM. | ||
| 3 | * | ||
| 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
| 5 | * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | ||
| 6 | */ | ||
| 7 | #include <linux/types.h> | ||
| 8 | #include <linux/kernel.h> | ||
| 9 | #include <linux/sched.h> | ||
| 10 | |||
| 11 | #include <asm/openprom.h> | ||
| 12 | #include <asm/oplib.h> | ||
| 13 | |||
| 14 | /* Open the device described by the string 'dstr'. Returns the handle | ||
| 15 | * to that device used for subsequent operations on that device. | ||
| 16 | * Returns 0 on failure. | ||
| 17 | */ | ||
| 18 | int | ||
| 19 | prom_devopen(const char *dstr) | ||
| 20 | { | ||
| 21 | unsigned long args[5]; | ||
| 22 | |||
| 23 | args[0] = (unsigned long) "open"; | ||
| 24 | args[1] = 1; | ||
| 25 | args[2] = 1; | ||
| 26 | args[3] = (unsigned long) dstr; | ||
| 27 | args[4] = (unsigned long) -1; | ||
| 28 | |||
| 29 | p1275_cmd_direct(args); | ||
| 30 | |||
| 31 | return (int) args[4]; | ||
| 32 | } | ||
| 33 | |||
| 34 | /* Close the device described by device handle 'dhandle'. */ | ||
| 35 | int | ||
| 36 | prom_devclose(int dhandle) | ||
| 37 | { | ||
| 38 | unsigned long args[4]; | ||
| 39 | |||
| 40 | args[0] = (unsigned long) "close"; | ||
| 41 | args[1] = 1; | ||
| 42 | args[2] = 0; | ||
| 43 | args[3] = (unsigned int) dhandle; | ||
| 44 | |||
| 45 | p1275_cmd_direct(args); | ||
| 46 | |||
| 47 | return 0; | ||
| 48 | } | ||
| 49 | |||
| 50 | /* Seek to specified location described by 'seekhi' and 'seeklo' | ||
| 51 | * for device 'dhandle'. | ||
| 52 | */ | ||
| 53 | void | ||
| 54 | prom_seek(int dhandle, unsigned int seekhi, unsigned int seeklo) | ||
| 55 | { | ||
| 56 | unsigned long args[7]; | ||
| 57 | |||
| 58 | args[0] = (unsigned long) "seek"; | ||
| 59 | args[1] = 3; | ||
| 60 | args[2] = 1; | ||
| 61 | args[3] = (unsigned int) dhandle; | ||
| 62 | args[4] = seekhi; | ||
| 63 | args[5] = seeklo; | ||
| 64 | args[6] = (unsigned long) -1; | ||
| 65 | |||
| 66 | p1275_cmd_direct(args); | ||
| 67 | } | ||
diff --git a/arch/sparc/prom/misc_64.c b/arch/sparc/prom/misc_64.c index d24bc44e361e..e4f31d4d3715 100644 --- a/arch/sparc/prom/misc_64.c +++ b/arch/sparc/prom/misc_64.c | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | #include <asm/system.h> | 18 | #include <asm/system.h> |
| 19 | #include <asm/ldc.h> | 19 | #include <asm/ldc.h> |
| 20 | 20 | ||
| 21 | int prom_service_exists(const char *service_name) | 21 | static int prom_service_exists(const char *service_name) |
| 22 | { | 22 | { |
| 23 | unsigned long args[5]; | 23 | unsigned long args[5]; |
| 24 | 24 | ||
| @@ -150,20 +150,6 @@ void prom_halt_power_off(void) | |||
| 150 | prom_halt(); | 150 | prom_halt(); |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | /* Set prom sync handler to call function 'funcp'. */ | ||
| 154 | void prom_setcallback(callback_func_t funcp) | ||
| 155 | { | ||
| 156 | unsigned long args[5]; | ||
| 157 | if (!funcp) | ||
| 158 | return; | ||
| 159 | args[0] = (unsigned long) "set-callback"; | ||
| 160 | args[1] = 1; | ||
| 161 | args[2] = 1; | ||
| 162 | args[3] = (unsigned long) funcp; | ||
| 163 | args[4] = (unsigned long) -1; | ||
| 164 | p1275_cmd_direct(args); | ||
| 165 | } | ||
| 166 | |||
| 167 | /* Get the idprom and stuff it into buffer 'idbuf'. Returns the | 153 | /* Get the idprom and stuff it into buffer 'idbuf'. Returns the |
| 168 | * format type. 'num_bytes' is the number of bytes that your idbuf | 154 | * format type. 'num_bytes' is the number of bytes that your idbuf |
| 169 | * has space for. Returns 0xff on error. | 155 | * has space for. Returns 0xff on error. |
diff --git a/arch/sparc/prom/printf.c b/arch/sparc/prom/printf.c index ca869266b9f3..d9682f06b3b0 100644 --- a/arch/sparc/prom/printf.c +++ b/arch/sparc/prom/printf.c | |||
| @@ -15,22 +15,45 @@ | |||
| 15 | 15 | ||
| 16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
| 17 | #include <linux/compiler.h> | 17 | #include <linux/compiler.h> |
| 18 | #include <linux/spinlock.h> | ||
| 18 | 19 | ||
| 19 | #include <asm/openprom.h> | 20 | #include <asm/openprom.h> |
| 20 | #include <asm/oplib.h> | 21 | #include <asm/oplib.h> |
| 21 | 22 | ||
| 23 | #define CONSOLE_WRITE_BUF_SIZE 1024 | ||
| 24 | |||
| 22 | static char ppbuf[1024]; | 25 | static char ppbuf[1024]; |
| 26 | static char console_write_buf[CONSOLE_WRITE_BUF_SIZE]; | ||
| 27 | static DEFINE_RAW_SPINLOCK(console_write_lock); | ||
| 23 | 28 | ||
| 24 | void notrace prom_write(const char *buf, unsigned int n) | 29 | void notrace prom_write(const char *buf, unsigned int n) |
| 25 | { | 30 | { |
| 26 | char ch; | 31 | unsigned int dest_len; |
| 32 | unsigned long flags; | ||
| 33 | char *dest; | ||
| 34 | |||
| 35 | dest = console_write_buf; | ||
| 36 | raw_spin_lock_irqsave(&console_write_lock, flags); | ||
| 27 | 37 | ||
| 28 | while (n != 0) { | 38 | dest_len = 0; |
| 29 | --n; | 39 | while (n-- != 0) { |
| 30 | if ((ch = *buf++) == '\n') | 40 | char ch = *buf++; |
| 31 | prom_putchar('\r'); | 41 | if (ch == '\n') { |
| 32 | prom_putchar(ch); | 42 | *dest++ = '\r'; |
| 43 | dest_len++; | ||
| 44 | } | ||
| 45 | *dest++ = ch; | ||
| 46 | dest_len++; | ||
| 47 | if (dest_len >= CONSOLE_WRITE_BUF_SIZE - 1) { | ||
| 48 | prom_console_write_buf(console_write_buf, dest_len); | ||
| 49 | dest = console_write_buf; | ||
| 50 | dest_len = 0; | ||
| 51 | } | ||
| 33 | } | 52 | } |
| 53 | if (dest_len) | ||
| 54 | prom_console_write_buf(console_write_buf, dest_len); | ||
| 55 | |||
| 56 | raw_spin_unlock_irqrestore(&console_write_lock, flags); | ||
| 34 | } | 57 | } |
| 35 | 58 | ||
| 36 | void notrace prom_printf(const char *fmt, ...) | 59 | void notrace prom_printf(const char *fmt, ...) |
diff --git a/arch/sparc/prom/tree_32.c b/arch/sparc/prom/tree_32.c index 63e08e149774..535e2e69ac1d 100644 --- a/arch/sparc/prom/tree_32.c +++ b/arch/sparc/prom/tree_32.c | |||
| @@ -342,19 +342,3 @@ phandle prom_inst2pkg(int inst) | |||
| 342 | if (node == -1) return 0; | 342 | if (node == -1) return 0; |
| 343 | return node; | 343 | return node; |
| 344 | } | 344 | } |
| 345 | |||
| 346 | /* Return 'node' assigned to a particular prom 'path' | ||
| 347 | * FIXME: Should work for v0 as well | ||
| 348 | */ | ||
| 349 | phandle prom_pathtoinode(char *path) | ||
| 350 | { | ||
| 351 | phandle node; | ||
| 352 | int inst; | ||
| 353 | |||
| 354 | inst = prom_devopen (path); | ||
| 355 | if (inst == -1) return 0; | ||
| 356 | node = prom_inst2pkg (inst); | ||
| 357 | prom_devclose (inst); | ||
| 358 | if (node == -1) return 0; | ||
| 359 | return node; | ||
| 360 | } | ||
diff --git a/arch/sparc/prom/tree_64.c b/arch/sparc/prom/tree_64.c index 691be68932f8..d93660048376 100644 --- a/arch/sparc/prom/tree_64.c +++ b/arch/sparc/prom/tree_64.c | |||
| @@ -374,24 +374,6 @@ inline phandle prom_inst2pkg(int inst) | |||
| 374 | return node; | 374 | return node; |
| 375 | } | 375 | } |
| 376 | 376 | ||
| 377 | /* Return 'node' assigned to a particular prom 'path' | ||
| 378 | * FIXME: Should work for v0 as well | ||
| 379 | */ | ||
| 380 | phandle prom_pathtoinode(const char *path) | ||
| 381 | { | ||
| 382 | phandle node; | ||
| 383 | int inst; | ||
| 384 | |||
| 385 | inst = prom_devopen (path); | ||
| 386 | if (inst == 0) | ||
| 387 | return 0; | ||
| 388 | node = prom_inst2pkg(inst); | ||
| 389 | prom_devclose(inst); | ||
| 390 | if (node == -1) | ||
| 391 | return 0; | ||
| 392 | return node; | ||
| 393 | } | ||
| 394 | |||
| 395 | int prom_ihandle2path(int handle, char *buffer, int bufsize) | 377 | int prom_ihandle2path(int handle, char *buffer, int bufsize) |
| 396 | { | 378 | { |
| 397 | unsigned long args[7]; | 379 | unsigned long args[7]; |
