aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorGrant Likely <grant.likely@linaro.org>2014-08-11 09:03:08 -0400
committerGrant Likely <grant.likely@linaro.org>2014-08-11 09:03:08 -0400
commitb775e642bf958a02210ac4d4edd1a1b7067c49fa (patch)
treea3425ead7b2738e6a05249a3c3667d1069782330 /drivers
parent32147e9a8ea54f2ec9914edeede8a9d9dc02e886 (diff)
parentccdb8ed3b3c739fe99a6f2f474f7ffad3203485d (diff)
Merge branch 'devicetree/next-console' into devicetree/next
Diffstat (limited to 'drivers')
-rw-r--r--drivers/cpufreq/pmac64-cpufreq.c3
-rw-r--r--drivers/edac/cell_edac.c3
-rw-r--r--drivers/of/base.c28
-rw-r--r--drivers/pci/hotplug/rpaphp_core.c4
-rw-r--r--drivers/tty/ehv_bytechan.c43
-rw-r--r--drivers/tty/hvc/hvc_opal.c15
-rw-r--r--drivers/tty/hvc/hvc_vio.c29
-rw-r--r--drivers/tty/serial/pmac_zilog.c9
-rw-r--r--drivers/tty/serial/serial_core.c3
9 files changed, 44 insertions, 93 deletions
diff --git a/drivers/cpufreq/pmac64-cpufreq.c b/drivers/cpufreq/pmac64-cpufreq.c
index 8bc422977b5b..4ff86878727f 100644
--- a/drivers/cpufreq/pmac64-cpufreq.c
+++ b/drivers/cpufreq/pmac64-cpufreq.c
@@ -499,8 +499,7 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpunode)
499 } 499 }
500 500
501 /* Lookup the i2c hwclock */ 501 /* Lookup the i2c hwclock */
502 for (hwclock = NULL; 502 for_each_node_by_name(hwclock, "i2c-hwclock") {
503 (hwclock = of_find_node_by_name(hwclock, "i2c-hwclock")) != NULL;){
504 const char *loc = of_get_property(hwclock, 503 const char *loc = of_get_property(hwclock,
505 "hwctrl-location", NULL); 504 "hwctrl-location", NULL);
506 if (loc == NULL) 505 if (loc == NULL)
diff --git a/drivers/edac/cell_edac.c b/drivers/edac/cell_edac.c
index 374b57fc596d..a12c8552f6a6 100644
--- a/drivers/edac/cell_edac.c
+++ b/drivers/edac/cell_edac.c
@@ -134,8 +134,7 @@ static void cell_edac_init_csrows(struct mem_ctl_info *mci)
134 int j; 134 int j;
135 u32 nr_pages; 135 u32 nr_pages;
136 136
137 for (np = NULL; 137 for_each_node_by_name(np, "memory") {
138 (np = of_find_node_by_name(np, "memory")) != NULL;) {
139 struct resource r; 138 struct resource r;
140 139
141 /* We "know" that the Cell firmware only creates one entry 140 /* We "know" that the Cell firmware only creates one entry
diff --git a/drivers/of/base.c b/drivers/of/base.c
index b9864806e9b8..e4f95ba0a3eb 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -17,6 +17,7 @@
17 * as published by the Free Software Foundation; either version 17 * as published by the Free Software Foundation; either version
18 * 2 of the License, or (at your option) any later version. 18 * 2 of the License, or (at your option) any later version.
19 */ 19 */
20#include <linux/console.h>
20#include <linux/ctype.h> 21#include <linux/ctype.h>
21#include <linux/cpu.h> 22#include <linux/cpu.h>
22#include <linux/module.h> 23#include <linux/module.h>
@@ -35,7 +36,7 @@ struct device_node *of_allnodes;
35EXPORT_SYMBOL(of_allnodes); 36EXPORT_SYMBOL(of_allnodes);
36struct device_node *of_chosen; 37struct device_node *of_chosen;
37struct device_node *of_aliases; 38struct device_node *of_aliases;
38static struct device_node *of_stdout; 39struct device_node *of_stdout;
39 40
40static struct kset *of_kset; 41static struct kset *of_kset;
41 42
@@ -2062,9 +2063,12 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
2062 of_chosen = of_find_node_by_path("/chosen@0"); 2063 of_chosen = of_find_node_by_path("/chosen@0");
2063 2064
2064 if (of_chosen) { 2065 if (of_chosen) {
2066 /* linux,stdout-path and /aliases/stdout are for legacy compatibility */
2065 const char *name = of_get_property(of_chosen, "stdout-path", NULL); 2067 const char *name = of_get_property(of_chosen, "stdout-path", NULL);
2066 if (!name) 2068 if (!name)
2067 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);
2068 if (name) 2072 if (name)
2069 of_stdout = of_find_node_by_path(name); 2073 of_stdout = of_find_node_by_path(name);
2070 } 2074 }
@@ -2180,20 +2184,22 @@ const char *of_prop_next_string(struct property *prop, const char *cur)
2180EXPORT_SYMBOL_GPL(of_prop_next_string); 2184EXPORT_SYMBOL_GPL(of_prop_next_string);
2181 2185
2182/** 2186/**
2183 * of_device_is_stdout_path - check if a device node matches the 2187 * of_console_check() - Test and setup console for DT setup
2184 * linux,stdout-path property 2188 * @dn - Pointer to device node
2185 * 2189 * @name - Name to use for preferred console without index. ex. "ttyS"
2186 * Check if this device node matches the linux,stdout-path property 2190 * @index - Index to use for preferred console.
2187 * in the chosen node. return true if yes, false otherwise. 2191 *
2192 * Check if the given device node matches the stdout-path property in the
2193 * /chosen node. If it does then register it as the preferred console and return
2194 * TRUE. Otherwise return FALSE.
2188 */ 2195 */
2189int of_device_is_stdout_path(struct device_node *dn) 2196bool of_console_check(struct device_node *dn, char *name, int index)
2190{ 2197{
2191 if (!of_stdout) 2198 if (!dn || dn != of_stdout || console_set_on_cmdline)
2192 return false; 2199 return false;
2193 2200 return add_preferred_console(name, index, NULL);
2194 return of_stdout == dn;
2195} 2201}
2196EXPORT_SYMBOL_GPL(of_device_is_stdout_path); 2202EXPORT_SYMBOL_GPL(of_console_check);
2197 2203
2198/** 2204/**
2199 * of_find_next_cache_node - Find a node's subsidiary cache 2205 * of_find_next_cache_node - Find a node's subsidiary cache
diff --git a/drivers/pci/hotplug/rpaphp_core.c b/drivers/pci/hotplug/rpaphp_core.c
index 93aa29f6d39c..f2945fa73d4f 100644
--- a/drivers/pci/hotplug/rpaphp_core.c
+++ b/drivers/pci/hotplug/rpaphp_core.c
@@ -375,11 +375,11 @@ static void __exit cleanup_slots(void)
375 375
376static int __init rpaphp_init(void) 376static int __init rpaphp_init(void)
377{ 377{
378 struct device_node *dn = NULL; 378 struct device_node *dn;
379 379
380 info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); 380 info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
381 381
382 while ((dn = of_find_node_by_name(dn, "pci"))) 382 for_each_node_by_name(dn, "pci")
383 rpaphp_add_slot(dn); 383 rpaphp_add_slot(dn);
384 384
385 return 0; 385 return 0;
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 */
114static int find_console_handle(void) 112static 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
343void __init hvc_opal_init_early(void) 343void __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
405void __init hvc_vio_init_early(void) 405void __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);
465out:
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
diff --git a/drivers/tty/serial/pmac_zilog.c b/drivers/tty/serial/pmac_zilog.c
index 8193635103ee..01e180bc6b5d 100644
--- a/drivers/tty/serial/pmac_zilog.c
+++ b/drivers/tty/serial/pmac_zilog.c
@@ -1650,8 +1650,7 @@ static int __init pmz_probe(void)
1650 /* 1650 /*
1651 * Find all escc chips in the system 1651 * Find all escc chips in the system
1652 */ 1652 */
1653 node_p = of_find_node_by_name(NULL, "escc"); 1653 for_each_node_by_name(node_p, "escc") {
1654 while (node_p) {
1655 /* 1654 /*
1656 * First get channel A/B node pointers 1655 * First get channel A/B node pointers
1657 * 1656 *
@@ -1669,7 +1668,7 @@ static int __init pmz_probe(void)
1669 of_node_put(node_b); 1668 of_node_put(node_b);
1670 printk(KERN_ERR "pmac_zilog: missing node %c for escc %s\n", 1669 printk(KERN_ERR "pmac_zilog: missing node %c for escc %s\n",
1671 (!node_a) ? 'a' : 'b', node_p->full_name); 1670 (!node_a) ? 'a' : 'b', node_p->full_name);
1672 goto next; 1671 continue;
1673 } 1672 }
1674 1673
1675 /* 1674 /*
@@ -1696,11 +1695,9 @@ static int __init pmz_probe(void)
1696 of_node_put(node_b); 1695 of_node_put(node_b);
1697 memset(&pmz_ports[count], 0, sizeof(struct uart_pmac_port)); 1696 memset(&pmz_ports[count], 0, sizeof(struct uart_pmac_port));
1698 memset(&pmz_ports[count+1], 0, sizeof(struct uart_pmac_port)); 1697 memset(&pmz_ports[count+1], 0, sizeof(struct uart_pmac_port));
1699 goto next; 1698 continue;
1700 } 1699 }
1701 count += 2; 1700 count += 2;
1702next:
1703 node_p = of_find_node_by_name(node_p, "escc");
1704 } 1701 }
1705 pmz_ports_count = count; 1702 pmz_ports_count = count;
1706 1703
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index fbf6c5ad222f..3ce68f962c92 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -26,6 +26,7 @@
26#include <linux/slab.h> 26#include <linux/slab.h>
27#include <linux/init.h> 27#include <linux/init.h>
28#include <linux/console.h> 28#include <linux/console.h>
29#include <linux/of.h>
29#include <linux/proc_fs.h> 30#include <linux/proc_fs.h>
30#include <linux/seq_file.h> 31#include <linux/seq_file.h>
31#include <linux/device.h> 32#include <linux/device.h>
@@ -2615,6 +2616,8 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
2615 spin_lock_init(&uport->lock); 2616 spin_lock_init(&uport->lock);
2616 lockdep_set_class(&uport->lock, &port_lock_key); 2617 lockdep_set_class(&uport->lock, &port_lock_key);
2617 } 2618 }
2619 if (uport->cons && uport->dev)
2620 of_console_check(uport->dev->of_node, uport->cons->name, uport->line);
2618 2621
2619 uart_configure_port(drv, state, uport); 2622 uart_configure_port(drv, state, uport);
2620 2623