diff options
author | Grant Likely <grant.likely@linaro.org> | 2014-08-11 09:03:08 -0400 |
---|---|---|
committer | Grant Likely <grant.likely@linaro.org> | 2014-08-11 09:03:08 -0400 |
commit | b775e642bf958a02210ac4d4edd1a1b7067c49fa (patch) | |
tree | a3425ead7b2738e6a05249a3c3667d1069782330 /drivers | |
parent | 32147e9a8ea54f2ec9914edeede8a9d9dc02e886 (diff) | |
parent | ccdb8ed3b3c739fe99a6f2f474f7ffad3203485d (diff) |
Merge branch 'devicetree/next-console' into devicetree/next
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/cpufreq/pmac64-cpufreq.c | 3 | ||||
-rw-r--r-- | drivers/edac/cell_edac.c | 3 | ||||
-rw-r--r-- | drivers/of/base.c | 28 | ||||
-rw-r--r-- | drivers/pci/hotplug/rpaphp_core.c | 4 | ||||
-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 | ||||
-rw-r--r-- | drivers/tty/serial/pmac_zilog.c | 9 | ||||
-rw-r--r-- | drivers/tty/serial/serial_core.c | 3 |
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; | |||
35 | EXPORT_SYMBOL(of_allnodes); | 36 | EXPORT_SYMBOL(of_allnodes); |
36 | struct device_node *of_chosen; | 37 | struct device_node *of_chosen; |
37 | struct device_node *of_aliases; | 38 | struct device_node *of_aliases; |
38 | static struct device_node *of_stdout; | 39 | struct device_node *of_stdout; |
39 | 40 | ||
40 | static struct kset *of_kset; | 41 | static 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) | |||
2180 | EXPORT_SYMBOL_GPL(of_prop_next_string); | 2184 | EXPORT_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 | */ |
2189 | int of_device_is_stdout_path(struct device_node *dn) | 2196 | bool 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 | } |
2196 | EXPORT_SYMBOL_GPL(of_device_is_stdout_path); | 2202 | EXPORT_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 | ||
376 | static int __init rpaphp_init(void) | 376 | static 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 | */ |
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 |
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; |
1702 | next: | ||
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 | ||