diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/of/base.c | 5 | ||||
| -rw-r--r-- | drivers/tty/ehv_bytechan.c | 43 | ||||
| -rw-r--r-- | drivers/tty/hvc/hvc_opal.c | 15 | ||||
| -rw-r--r-- | drivers/tty/hvc/hvc_vio.c | 29 |
4 files changed, 21 insertions, 71 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c index df9b2bb7bb27..e4f95ba0a3eb 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c | |||
| @@ -36,7 +36,7 @@ struct device_node *of_allnodes; | |||
| 36 | EXPORT_SYMBOL(of_allnodes); | 36 | EXPORT_SYMBOL(of_allnodes); |
| 37 | struct device_node *of_chosen; | 37 | struct device_node *of_chosen; |
| 38 | struct device_node *of_aliases; | 38 | struct device_node *of_aliases; |
| 39 | static struct device_node *of_stdout; | 39 | struct device_node *of_stdout; |
| 40 | 40 | ||
| 41 | static struct kset *of_kset; | 41 | static struct kset *of_kset; |
| 42 | 42 | ||
| @@ -2063,9 +2063,12 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align)) | |||
| 2063 | of_chosen = of_find_node_by_path("/chosen@0"); | 2063 | of_chosen = of_find_node_by_path("/chosen@0"); |
| 2064 | 2064 | ||
| 2065 | if (of_chosen) { | 2065 | if (of_chosen) { |
| 2066 | /* linux,stdout-path and /aliases/stdout are for legacy compatibility */ | ||
| 2066 | const char *name = of_get_property(of_chosen, "stdout-path", NULL); | 2067 | const char *name = of_get_property(of_chosen, "stdout-path", NULL); |
| 2067 | if (!name) | 2068 | if (!name) |
| 2068 | name = of_get_property(of_chosen, "linux,stdout-path", NULL); | 2069 | name = of_get_property(of_chosen, "linux,stdout-path", NULL); |
| 2070 | if (IS_ENABLED(CONFIG_PPC) && !name) | ||
| 2071 | name = of_get_property(of_aliases, "stdout", NULL); | ||
| 2069 | if (name) | 2072 | if (name) |
| 2070 | of_stdout = of_find_node_by_path(name); | 2073 | of_stdout = of_find_node_by_path(name); |
| 2071 | } | 2074 | } |
diff --git a/drivers/tty/ehv_bytechan.c b/drivers/tty/ehv_bytechan.c index 0419b69e270f..4f485e88f60c 100644 --- a/drivers/tty/ehv_bytechan.c +++ b/drivers/tty/ehv_bytechan.c | |||
| @@ -108,55 +108,23 @@ static void disable_tx_interrupt(struct ehv_bc_data *bc) | |||
| 108 | * | 108 | * |
| 109 | * The byte channel to be used for the console is specified via a "stdout" | 109 | * The byte channel to be used for the console is specified via a "stdout" |
| 110 | * property in the /chosen node. | 110 | * property in the /chosen node. |
| 111 | * | ||
| 112 | * For compatible with legacy device trees, we also look for a "stdout" alias. | ||
| 113 | */ | 111 | */ |
| 114 | static int find_console_handle(void) | 112 | static int find_console_handle(void) |
| 115 | { | 113 | { |
| 116 | struct device_node *np, *np2; | 114 | struct device_node *np = of_stdout; |
| 117 | const char *sprop = NULL; | 115 | const char *sprop = NULL; |
| 118 | const uint32_t *iprop; | 116 | const uint32_t *iprop; |
| 119 | 117 | ||
| 120 | np = of_find_node_by_path("/chosen"); | ||
| 121 | if (np) | ||
| 122 | sprop = of_get_property(np, "stdout-path", NULL); | ||
| 123 | |||
| 124 | if (!np || !sprop) { | ||
| 125 | of_node_put(np); | ||
| 126 | np = of_find_node_by_name(NULL, "aliases"); | ||
| 127 | if (np) | ||
| 128 | sprop = of_get_property(np, "stdout", NULL); | ||
| 129 | } | ||
| 130 | |||
| 131 | if (!sprop) { | ||
| 132 | of_node_put(np); | ||
| 133 | return 0; | ||
| 134 | } | ||
| 135 | |||
| 136 | /* We don't care what the aliased node is actually called. We only | 118 | /* We don't care what the aliased node is actually called. We only |
| 137 | * care if it's compatible with "epapr,hv-byte-channel", because that | 119 | * care if it's compatible with "epapr,hv-byte-channel", because that |
| 138 | * indicates that it's a byte channel node. We use a temporary | 120 | * indicates that it's a byte channel node. |
| 139 | * variable, 'np2', because we can't release 'np' until we're done with | ||
| 140 | * 'sprop'. | ||
| 141 | */ | 121 | */ |
| 142 | np2 = of_find_node_by_path(sprop); | 122 | if (!np || !of_device_is_compatible(np, "epapr,hv-byte-channel")) |
| 143 | of_node_put(np); | ||
| 144 | np = np2; | ||
| 145 | if (!np) { | ||
| 146 | pr_warning("ehv-bc: stdout node '%s' does not exist\n", sprop); | ||
| 147 | return 0; | ||
| 148 | } | ||
| 149 | |||
| 150 | /* Is it a byte channel? */ | ||
| 151 | if (!of_device_is_compatible(np, "epapr,hv-byte-channel")) { | ||
| 152 | of_node_put(np); | ||
| 153 | return 0; | 123 | return 0; |
| 154 | } | ||
| 155 | 124 | ||
| 156 | stdout_irq = irq_of_parse_and_map(np, 0); | 125 | stdout_irq = irq_of_parse_and_map(np, 0); |
| 157 | if (stdout_irq == NO_IRQ) { | 126 | if (stdout_irq == NO_IRQ) { |
| 158 | pr_err("ehv-bc: no 'interrupts' property in %s node\n", sprop); | 127 | pr_err("ehv-bc: no 'interrupts' property in %s node\n", np->full_name); |
| 159 | of_node_put(np); | ||
| 160 | return 0; | 128 | return 0; |
| 161 | } | 129 | } |
| 162 | 130 | ||
| @@ -167,12 +135,9 @@ static int find_console_handle(void) | |||
| 167 | if (!iprop) { | 135 | if (!iprop) { |
| 168 | pr_err("ehv-bc: no 'hv-handle' property in %s node\n", | 136 | pr_err("ehv-bc: no 'hv-handle' property in %s node\n", |
| 169 | np->name); | 137 | np->name); |
| 170 | of_node_put(np); | ||
| 171 | return 0; | 138 | return 0; |
| 172 | } | 139 | } |
| 173 | stdout_bc = be32_to_cpu(*iprop); | 140 | stdout_bc = be32_to_cpu(*iprop); |
| 174 | |||
| 175 | of_node_put(np); | ||
| 176 | return 1; | 141 | return 1; |
| 177 | } | 142 | } |
| 178 | 143 | ||
diff --git a/drivers/tty/hvc/hvc_opal.c b/drivers/tty/hvc/hvc_opal.c index a585079b4b38..a2cc5f834c63 100644 --- a/drivers/tty/hvc/hvc_opal.c +++ b/drivers/tty/hvc/hvc_opal.c | |||
| @@ -342,22 +342,13 @@ static void udbg_init_opal_common(void) | |||
| 342 | 342 | ||
| 343 | void __init hvc_opal_init_early(void) | 343 | void __init hvc_opal_init_early(void) |
| 344 | { | 344 | { |
| 345 | struct device_node *stdout_node = NULL; | 345 | struct device_node *stdout_node = of_node_get(of_stdout); |
| 346 | const __be32 *termno; | 346 | const __be32 *termno; |
| 347 | const char *name = NULL; | ||
| 348 | const struct hv_ops *ops; | 347 | const struct hv_ops *ops; |
| 349 | u32 index; | 348 | u32 index; |
| 350 | 349 | ||
| 351 | /* find the boot console from /chosen/stdout */ | 350 | /* If the console wasn't in /chosen, try /ibm,opal */ |
| 352 | if (of_chosen) | 351 | if (!stdout_node) { |
| 353 | name = of_get_property(of_chosen, "linux,stdout-path", NULL); | ||
| 354 | if (name) { | ||
| 355 | stdout_node = of_find_node_by_path(name); | ||
| 356 | if (!stdout_node) { | ||
| 357 | pr_err("hvc_opal: Failed to locate default console!\n"); | ||
| 358 | return; | ||
| 359 | } | ||
| 360 | } else { | ||
| 361 | struct device_node *opal, *np; | 352 | struct device_node *opal, *np; |
| 362 | 353 | ||
| 363 | /* Current OPAL takeover doesn't provide the stdout | 354 | /* Current OPAL takeover doesn't provide the stdout |
diff --git a/drivers/tty/hvc/hvc_vio.c b/drivers/tty/hvc/hvc_vio.c index b594abfbf21e..5618b5fc7500 100644 --- a/drivers/tty/hvc/hvc_vio.c +++ b/drivers/tty/hvc/hvc_vio.c | |||
| @@ -404,42 +404,35 @@ module_exit(hvc_vio_exit); | |||
| 404 | 404 | ||
| 405 | void __init hvc_vio_init_early(void) | 405 | void __init hvc_vio_init_early(void) |
| 406 | { | 406 | { |
| 407 | struct device_node *stdout_node; | ||
| 408 | const __be32 *termno; | 407 | const __be32 *termno; |
| 409 | const char *name; | 408 | const char *name; |
| 410 | const struct hv_ops *ops; | 409 | const struct hv_ops *ops; |
| 411 | 410 | ||
| 412 | /* find the boot console from /chosen/stdout */ | 411 | /* find the boot console from /chosen/stdout */ |
| 413 | if (!of_chosen) | 412 | if (!of_stdout) |
| 414 | return; | 413 | return; |
| 415 | name = of_get_property(of_chosen, "linux,stdout-path", NULL); | 414 | name = of_get_property(of_stdout, "name", NULL); |
| 416 | if (name == NULL) | ||
| 417 | return; | ||
| 418 | stdout_node = of_find_node_by_path(name); | ||
| 419 | if (!stdout_node) | ||
| 420 | return; | ||
| 421 | name = of_get_property(stdout_node, "name", NULL); | ||
| 422 | if (!name) { | 415 | if (!name) { |
| 423 | printk(KERN_WARNING "stdout node missing 'name' property!\n"); | 416 | printk(KERN_WARNING "stdout node missing 'name' property!\n"); |
| 424 | goto out; | 417 | return; |
| 425 | } | 418 | } |
| 426 | 419 | ||
| 427 | /* Check if it's a virtual terminal */ | 420 | /* Check if it's a virtual terminal */ |
| 428 | if (strncmp(name, "vty", 3) != 0) | 421 | if (strncmp(name, "vty", 3) != 0) |
| 429 | goto out; | 422 | return; |
| 430 | termno = of_get_property(stdout_node, "reg", NULL); | 423 | termno = of_get_property(of_stdout, "reg", NULL); |
| 431 | if (termno == NULL) | 424 | if (termno == NULL) |
| 432 | goto out; | 425 | return; |
| 433 | hvterm_priv0.termno = of_read_number(termno, 1); | 426 | hvterm_priv0.termno = of_read_number(termno, 1); |
| 434 | spin_lock_init(&hvterm_priv0.buf_lock); | 427 | spin_lock_init(&hvterm_priv0.buf_lock); |
| 435 | hvterm_privs[0] = &hvterm_priv0; | 428 | hvterm_privs[0] = &hvterm_priv0; |
| 436 | 429 | ||
| 437 | /* Check the protocol */ | 430 | /* Check the protocol */ |
| 438 | if (of_device_is_compatible(stdout_node, "hvterm1")) { | 431 | if (of_device_is_compatible(of_stdout, "hvterm1")) { |
| 439 | hvterm_priv0.proto = HV_PROTOCOL_RAW; | 432 | hvterm_priv0.proto = HV_PROTOCOL_RAW; |
| 440 | ops = &hvterm_raw_ops; | 433 | ops = &hvterm_raw_ops; |
| 441 | } | 434 | } |
| 442 | else if (of_device_is_compatible(stdout_node, "hvterm-protocol")) { | 435 | else if (of_device_is_compatible(of_stdout, "hvterm-protocol")) { |
| 443 | hvterm_priv0.proto = HV_PROTOCOL_HVSI; | 436 | hvterm_priv0.proto = HV_PROTOCOL_HVSI; |
| 444 | ops = &hvterm_hvsi_ops; | 437 | ops = &hvterm_hvsi_ops; |
| 445 | hvsilib_init(&hvterm_priv0.hvsi, hvc_get_chars, hvc_put_chars, | 438 | hvsilib_init(&hvterm_priv0.hvsi, hvc_get_chars, hvc_put_chars, |
| @@ -447,7 +440,7 @@ void __init hvc_vio_init_early(void) | |||
| 447 | /* HVSI, perform the handshake now */ | 440 | /* HVSI, perform the handshake now */ |
| 448 | hvsilib_establish(&hvterm_priv0.hvsi); | 441 | hvsilib_establish(&hvterm_priv0.hvsi); |
| 449 | } else | 442 | } else |
| 450 | goto out; | 443 | return; |
| 451 | udbg_putc = udbg_hvc_putc; | 444 | udbg_putc = udbg_hvc_putc; |
| 452 | udbg_getc = udbg_hvc_getc; | 445 | udbg_getc = udbg_hvc_getc; |
| 453 | udbg_getc_poll = udbg_hvc_getc_poll; | 446 | udbg_getc_poll = udbg_hvc_getc_poll; |
| @@ -456,14 +449,12 @@ void __init hvc_vio_init_early(void) | |||
| 456 | * backend for HVSI, only do udbg | 449 | * backend for HVSI, only do udbg |
| 457 | */ | 450 | */ |
| 458 | if (hvterm_priv0.proto == HV_PROTOCOL_HVSI) | 451 | if (hvterm_priv0.proto == HV_PROTOCOL_HVSI) |
| 459 | goto out; | 452 | return; |
| 460 | #endif | 453 | #endif |
| 461 | /* Check whether the user has requested a different console. */ | 454 | /* Check whether the user has requested a different console. */ |
| 462 | if (!strstr(cmd_line, "console=")) | 455 | if (!strstr(cmd_line, "console=")) |
| 463 | add_preferred_console("hvc", 0, NULL); | 456 | add_preferred_console("hvc", 0, NULL); |
| 464 | hvc_instantiate(0, 0, ops); | 457 | hvc_instantiate(0, 0, ops); |
| 465 | out: | ||
| 466 | of_node_put(stdout_node); | ||
| 467 | } | 458 | } |
| 468 | 459 | ||
| 469 | /* call this from early_init() for a working debug console on | 460 | /* call this from early_init() for a working debug console on |
