mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-26 00:21:17 +00:00
Merge branch 'devicetree/next-console' into devicetree/next
This commit is contained in:
commit
b775e642bf
17 changed files with 63 additions and 118 deletions
|
@ -15,6 +15,10 @@
|
||||||
i2c0 = &i2c0;
|
i2c0 = &i2c0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
chosen {
|
||||||
|
stdout-path = &uart0;
|
||||||
|
};
|
||||||
|
|
||||||
memory {
|
memory {
|
||||||
reg = <0x0 0x08000000>;
|
reg = <0x0 0x08000000>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -2805,25 +2805,20 @@ set_initial_features(void)
|
||||||
/* Enable GMAC for now for PCI probing. It will be disabled
|
/* Enable GMAC for now for PCI probing. It will be disabled
|
||||||
* later on after PCI probe
|
* later on after PCI probe
|
||||||
*/
|
*/
|
||||||
np = of_find_node_by_name(NULL, "ethernet");
|
for_each_node_by_name(np, "ethernet")
|
||||||
while(np) {
|
|
||||||
if (of_device_is_compatible(np, "K2-GMAC"))
|
if (of_device_is_compatible(np, "K2-GMAC"))
|
||||||
g5_gmac_enable(np, 0, 1);
|
g5_gmac_enable(np, 0, 1);
|
||||||
np = of_find_node_by_name(np, "ethernet");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enable FW before PCI probe. Will be disabled later on
|
/* Enable FW before PCI probe. Will be disabled later on
|
||||||
* Note: We should have a batter way to check that we are
|
* Note: We should have a batter way to check that we are
|
||||||
* dealing with uninorth internal cell and not a PCI cell
|
* dealing with uninorth internal cell and not a PCI cell
|
||||||
* on the external PCI. The code below works though.
|
* on the external PCI. The code below works though.
|
||||||
*/
|
*/
|
||||||
np = of_find_node_by_name(NULL, "firewire");
|
for_each_node_by_name(np, "firewire") {
|
||||||
while(np) {
|
|
||||||
if (of_device_is_compatible(np, "pci106b,5811")) {
|
if (of_device_is_compatible(np, "pci106b,5811")) {
|
||||||
macio_chips[0].flags |= MACIO_FLAG_FW_SUPPORTED;
|
macio_chips[0].flags |= MACIO_FLAG_FW_SUPPORTED;
|
||||||
g5_fw_enable(np, 0, 1);
|
g5_fw_enable(np, 0, 1);
|
||||||
}
|
}
|
||||||
np = of_find_node_by_name(np, "firewire");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else /* CONFIG_POWER4 */
|
#else /* CONFIG_POWER4 */
|
||||||
|
@ -2834,13 +2829,11 @@ set_initial_features(void)
|
||||||
/* Enable GMAC for now for PCI probing. It will be disabled
|
/* Enable GMAC for now for PCI probing. It will be disabled
|
||||||
* later on after PCI probe
|
* later on after PCI probe
|
||||||
*/
|
*/
|
||||||
np = of_find_node_by_name(NULL, "ethernet");
|
for_each_node_by_name(np, "ethernet") {
|
||||||
while(np) {
|
|
||||||
if (np->parent
|
if (np->parent
|
||||||
&& of_device_is_compatible(np->parent, "uni-north")
|
&& of_device_is_compatible(np->parent, "uni-north")
|
||||||
&& of_device_is_compatible(np, "gmac"))
|
&& of_device_is_compatible(np, "gmac"))
|
||||||
core99_gmac_enable(np, 0, 1);
|
core99_gmac_enable(np, 0, 1);
|
||||||
np = of_find_node_by_name(np, "ethernet");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable FW before PCI probe. Will be disabled later on
|
/* Enable FW before PCI probe. Will be disabled later on
|
||||||
|
@ -2848,8 +2841,7 @@ set_initial_features(void)
|
||||||
* dealing with uninorth internal cell and not a PCI cell
|
* dealing with uninorth internal cell and not a PCI cell
|
||||||
* on the external PCI. The code below works though.
|
* on the external PCI. The code below works though.
|
||||||
*/
|
*/
|
||||||
np = of_find_node_by_name(NULL, "firewire");
|
for_each_node_by_name(np, "firewire") {
|
||||||
while(np) {
|
|
||||||
if (np->parent
|
if (np->parent
|
||||||
&& of_device_is_compatible(np->parent, "uni-north")
|
&& of_device_is_compatible(np->parent, "uni-north")
|
||||||
&& (of_device_is_compatible(np, "pci106b,18") ||
|
&& (of_device_is_compatible(np, "pci106b,18") ||
|
||||||
|
@ -2858,18 +2850,16 @@ set_initial_features(void)
|
||||||
macio_chips[0].flags |= MACIO_FLAG_FW_SUPPORTED;
|
macio_chips[0].flags |= MACIO_FLAG_FW_SUPPORTED;
|
||||||
core99_firewire_enable(np, 0, 1);
|
core99_firewire_enable(np, 0, 1);
|
||||||
}
|
}
|
||||||
np = of_find_node_by_name(np, "firewire");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable ATA-100 before PCI probe. */
|
/* Enable ATA-100 before PCI probe. */
|
||||||
np = of_find_node_by_name(NULL, "ata-6");
|
np = of_find_node_by_name(NULL, "ata-6");
|
||||||
while(np) {
|
for_each_node_by_name(np, "ata-6") {
|
||||||
if (np->parent
|
if (np->parent
|
||||||
&& of_device_is_compatible(np->parent, "uni-north")
|
&& of_device_is_compatible(np->parent, "uni-north")
|
||||||
&& of_device_is_compatible(np, "kauai-ata")) {
|
&& of_device_is_compatible(np, "kauai-ata")) {
|
||||||
core99_ata100_enable(np, 1);
|
core99_ata100_enable(np, 1);
|
||||||
}
|
}
|
||||||
np = of_find_node_by_name(np, "ata-6");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Switch airport off */
|
/* Switch airport off */
|
||||||
|
|
|
@ -698,7 +698,7 @@ static void __init fixup_nec_usb2(void)
|
||||||
{
|
{
|
||||||
struct device_node *nec;
|
struct device_node *nec;
|
||||||
|
|
||||||
for (nec = NULL; (nec = of_find_node_by_name(nec, "usb")) != NULL;) {
|
for_each_node_by_name(nec, "usb") {
|
||||||
struct pci_controller *hose;
|
struct pci_controller *hose;
|
||||||
u32 data;
|
u32 data;
|
||||||
const u32 *prop;
|
const u32 *prop;
|
||||||
|
|
|
@ -577,7 +577,7 @@ static void __init smp_core99_setup_i2c_hwsync(int ncpus)
|
||||||
int ok;
|
int ok;
|
||||||
|
|
||||||
/* Look for the clock chip */
|
/* Look for the clock chip */
|
||||||
while ((cc = of_find_node_by_name(cc, "i2c-hwclock")) != NULL) {
|
for_each_node_by_name(cc, "i2c-hwclock") {
|
||||||
p = of_get_parent(cc);
|
p = of_get_parent(cc);
|
||||||
ok = p && of_device_is_compatible(p, "uni-n-i2c");
|
ok = p && of_device_is_compatible(p, "uni-n-i2c");
|
||||||
of_node_put(p);
|
of_node_put(p);
|
||||||
|
|
|
@ -191,7 +191,7 @@ int __init udbg_adb_init(int force_btext)
|
||||||
* of type "adb". If not, we return a failure, but we keep the
|
* of type "adb". If not, we return a failure, but we keep the
|
||||||
* bext output set for now
|
* bext output set for now
|
||||||
*/
|
*/
|
||||||
for (np = NULL; (np = of_find_node_by_name(np, "keyboard")) != NULL;) {
|
for_each_node_by_name(np, "keyboard") {
|
||||||
struct device_node *parent = of_get_parent(np);
|
struct device_node *parent = of_get_parent(np);
|
||||||
int found = (parent && strcmp(parent->type, "adb") == 0);
|
int found = (parent && strcmp(parent->type, "adb") == 0);
|
||||||
of_node_put(parent);
|
of_node_put(parent);
|
||||||
|
|
|
@ -232,8 +232,7 @@ static void __init pseries_discover_pic(void)
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
const char *typep;
|
const char *typep;
|
||||||
|
|
||||||
for (np = NULL; (np = of_find_node_by_name(np,
|
for_each_node_by_name(np, "interrupt-controller") {
|
||||||
"interrupt-controller"));) {
|
|
||||||
typep = of_get_property(np, "compatible", NULL);
|
typep = of_get_property(np, "compatible", NULL);
|
||||||
if (strstr(typep, "open-pic")) {
|
if (strstr(typep, "open-pic")) {
|
||||||
pSeries_mpic_node = of_node_get(np);
|
pSeries_mpic_node = of_node_get(np);
|
||||||
|
|
|
@ -499,8 +499,7 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpunode)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lookup the i2c hwclock */
|
/* Lookup the i2c hwclock */
|
||||||
for (hwclock = NULL;
|
for_each_node_by_name(hwclock, "i2c-hwclock") {
|
||||||
(hwclock = of_find_node_by_name(hwclock, "i2c-hwclock")) != NULL;){
|
|
||||||
const char *loc = of_get_property(hwclock,
|
const char *loc = of_get_property(hwclock,
|
||||||
"hwctrl-location", NULL);
|
"hwctrl-location", NULL);
|
||||||
if (loc == NULL)
|
if (loc == NULL)
|
||||||
|
|
|
@ -134,8 +134,7 @@ static void cell_edac_init_csrows(struct mem_ctl_info *mci)
|
||||||
int j;
|
int j;
|
||||||
u32 nr_pages;
|
u32 nr_pages;
|
||||||
|
|
||||||
for (np = NULL;
|
for_each_node_by_name(np, "memory") {
|
||||||
(np = of_find_node_by_name(np, "memory")) != NULL;) {
|
|
||||||
struct resource r;
|
struct resource r;
|
||||||
|
|
||||||
/* We "know" that the Cell firmware only creates one entry
|
/* We "know" that the Cell firmware only creates one entry
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
* as published by the Free Software Foundation; either version
|
* as published by the Free Software Foundation; either version
|
||||||
* 2 of the License, or (at your option) any later version.
|
* 2 of the License, or (at your option) any later version.
|
||||||
*/
|
*/
|
||||||
|
#include <linux/console.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
#include <linux/cpu.h>
|
#include <linux/cpu.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -35,7 +36,7 @@ struct device_node *of_allnodes;
|
||||||
EXPORT_SYMBOL(of_allnodes);
|
EXPORT_SYMBOL(of_allnodes);
|
||||||
struct device_node *of_chosen;
|
struct device_node *of_chosen;
|
||||||
struct device_node *of_aliases;
|
struct device_node *of_aliases;
|
||||||
static struct device_node *of_stdout;
|
struct device_node *of_stdout;
|
||||||
|
|
||||||
static struct kset *of_kset;
|
static struct kset *of_kset;
|
||||||
|
|
||||||
|
@ -2062,9 +2063,12 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
|
||||||
of_chosen = of_find_node_by_path("/chosen@0");
|
of_chosen = of_find_node_by_path("/chosen@0");
|
||||||
|
|
||||||
if (of_chosen) {
|
if (of_chosen) {
|
||||||
|
/* linux,stdout-path and /aliases/stdout are for legacy compatibility */
|
||||||
const char *name = of_get_property(of_chosen, "stdout-path", NULL);
|
const char *name = of_get_property(of_chosen, "stdout-path", NULL);
|
||||||
if (!name)
|
if (!name)
|
||||||
name = of_get_property(of_chosen, "linux,stdout-path", NULL);
|
name = of_get_property(of_chosen, "linux,stdout-path", NULL);
|
||||||
|
if (IS_ENABLED(CONFIG_PPC) && !name)
|
||||||
|
name = of_get_property(of_aliases, "stdout", NULL);
|
||||||
if (name)
|
if (name)
|
||||||
of_stdout = of_find_node_by_path(name);
|
of_stdout = of_find_node_by_path(name);
|
||||||
}
|
}
|
||||||
|
@ -2180,20 +2184,22 @@ const char *of_prop_next_string(struct property *prop, const char *cur)
|
||||||
EXPORT_SYMBOL_GPL(of_prop_next_string);
|
EXPORT_SYMBOL_GPL(of_prop_next_string);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* of_device_is_stdout_path - check if a device node matches the
|
* of_console_check() - Test and setup console for DT setup
|
||||||
* linux,stdout-path property
|
* @dn - Pointer to device node
|
||||||
|
* @name - Name to use for preferred console without index. ex. "ttyS"
|
||||||
|
* @index - Index to use for preferred console.
|
||||||
*
|
*
|
||||||
* Check if this device node matches the linux,stdout-path property
|
* Check if the given device node matches the stdout-path property in the
|
||||||
* in the chosen node. return true if yes, false otherwise.
|
* /chosen node. If it does then register it as the preferred console and return
|
||||||
|
* TRUE. Otherwise return FALSE.
|
||||||
*/
|
*/
|
||||||
int of_device_is_stdout_path(struct device_node *dn)
|
bool of_console_check(struct device_node *dn, char *name, int index)
|
||||||
{
|
{
|
||||||
if (!of_stdout)
|
if (!dn || dn != of_stdout || console_set_on_cmdline)
|
||||||
return false;
|
return false;
|
||||||
|
return add_preferred_console(name, index, NULL);
|
||||||
return of_stdout == dn;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(of_device_is_stdout_path);
|
EXPORT_SYMBOL_GPL(of_console_check);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* of_find_next_cache_node - Find a node's subsidiary cache
|
* of_find_next_cache_node - Find a node's subsidiary cache
|
||||||
|
|
|
@ -375,11 +375,11 @@ static void __exit cleanup_slots(void)
|
||||||
|
|
||||||
static int __init rpaphp_init(void)
|
static int __init rpaphp_init(void)
|
||||||
{
|
{
|
||||||
struct device_node *dn = NULL;
|
struct device_node *dn;
|
||||||
|
|
||||||
info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
|
info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
|
||||||
|
|
||||||
while ((dn = of_find_node_by_name(dn, "pci")))
|
for_each_node_by_name(dn, "pci")
|
||||||
rpaphp_add_slot(dn);
|
rpaphp_add_slot(dn);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -108,55 +108,23 @@ static void disable_tx_interrupt(struct ehv_bc_data *bc)
|
||||||
*
|
*
|
||||||
* The byte channel to be used for the console is specified via a "stdout"
|
* The byte channel to be used for the console is specified via a "stdout"
|
||||||
* property in the /chosen node.
|
* property in the /chosen node.
|
||||||
*
|
|
||||||
* For compatible with legacy device trees, we also look for a "stdout" alias.
|
|
||||||
*/
|
*/
|
||||||
static int find_console_handle(void)
|
static int find_console_handle(void)
|
||||||
{
|
{
|
||||||
struct device_node *np, *np2;
|
struct device_node *np = of_stdout;
|
||||||
const char *sprop = NULL;
|
const char *sprop = NULL;
|
||||||
const uint32_t *iprop;
|
const uint32_t *iprop;
|
||||||
|
|
||||||
np = of_find_node_by_path("/chosen");
|
|
||||||
if (np)
|
|
||||||
sprop = of_get_property(np, "stdout-path", NULL);
|
|
||||||
|
|
||||||
if (!np || !sprop) {
|
|
||||||
of_node_put(np);
|
|
||||||
np = of_find_node_by_name(NULL, "aliases");
|
|
||||||
if (np)
|
|
||||||
sprop = of_get_property(np, "stdout", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sprop) {
|
|
||||||
of_node_put(np);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We don't care what the aliased node is actually called. We only
|
/* We don't care what the aliased node is actually called. We only
|
||||||
* care if it's compatible with "epapr,hv-byte-channel", because that
|
* care if it's compatible with "epapr,hv-byte-channel", because that
|
||||||
* indicates that it's a byte channel node. We use a temporary
|
* indicates that it's a byte channel node.
|
||||||
* variable, 'np2', because we can't release 'np' until we're done with
|
|
||||||
* 'sprop'.
|
|
||||||
*/
|
*/
|
||||||
np2 = of_find_node_by_path(sprop);
|
if (!np || !of_device_is_compatible(np, "epapr,hv-byte-channel"))
|
||||||
of_node_put(np);
|
|
||||||
np = np2;
|
|
||||||
if (!np) {
|
|
||||||
pr_warning("ehv-bc: stdout node '%s' does not exist\n", sprop);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
/* Is it a byte channel? */
|
|
||||||
if (!of_device_is_compatible(np, "epapr,hv-byte-channel")) {
|
|
||||||
of_node_put(np);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
stdout_irq = irq_of_parse_and_map(np, 0);
|
stdout_irq = irq_of_parse_and_map(np, 0);
|
||||||
if (stdout_irq == NO_IRQ) {
|
if (stdout_irq == NO_IRQ) {
|
||||||
pr_err("ehv-bc: no 'interrupts' property in %s node\n", sprop);
|
pr_err("ehv-bc: no 'interrupts' property in %s node\n", np->full_name);
|
||||||
of_node_put(np);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,12 +135,9 @@ static int find_console_handle(void)
|
||||||
if (!iprop) {
|
if (!iprop) {
|
||||||
pr_err("ehv-bc: no 'hv-handle' property in %s node\n",
|
pr_err("ehv-bc: no 'hv-handle' property in %s node\n",
|
||||||
np->name);
|
np->name);
|
||||||
of_node_put(np);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
stdout_bc = be32_to_cpu(*iprop);
|
stdout_bc = be32_to_cpu(*iprop);
|
||||||
|
|
||||||
of_node_put(np);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -342,22 +342,13 @@ static void udbg_init_opal_common(void)
|
||||||
|
|
||||||
void __init hvc_opal_init_early(void)
|
void __init hvc_opal_init_early(void)
|
||||||
{
|
{
|
||||||
struct device_node *stdout_node = NULL;
|
struct device_node *stdout_node = of_node_get(of_stdout);
|
||||||
const __be32 *termno;
|
const __be32 *termno;
|
||||||
const char *name = NULL;
|
|
||||||
const struct hv_ops *ops;
|
const struct hv_ops *ops;
|
||||||
u32 index;
|
u32 index;
|
||||||
|
|
||||||
/* find the boot console from /chosen/stdout */
|
/* If the console wasn't in /chosen, try /ibm,opal */
|
||||||
if (of_chosen)
|
if (!stdout_node) {
|
||||||
name = of_get_property(of_chosen, "linux,stdout-path", NULL);
|
|
||||||
if (name) {
|
|
||||||
stdout_node = of_find_node_by_path(name);
|
|
||||||
if (!stdout_node) {
|
|
||||||
pr_err("hvc_opal: Failed to locate default console!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
struct device_node *opal, *np;
|
struct device_node *opal, *np;
|
||||||
|
|
||||||
/* Current OPAL takeover doesn't provide the stdout
|
/* Current OPAL takeover doesn't provide the stdout
|
||||||
|
|
|
@ -404,42 +404,35 @@ module_exit(hvc_vio_exit);
|
||||||
|
|
||||||
void __init hvc_vio_init_early(void)
|
void __init hvc_vio_init_early(void)
|
||||||
{
|
{
|
||||||
struct device_node *stdout_node;
|
|
||||||
const __be32 *termno;
|
const __be32 *termno;
|
||||||
const char *name;
|
const char *name;
|
||||||
const struct hv_ops *ops;
|
const struct hv_ops *ops;
|
||||||
|
|
||||||
/* find the boot console from /chosen/stdout */
|
/* find the boot console from /chosen/stdout */
|
||||||
if (!of_chosen)
|
if (!of_stdout)
|
||||||
return;
|
return;
|
||||||
name = of_get_property(of_chosen, "linux,stdout-path", NULL);
|
name = of_get_property(of_stdout, "name", NULL);
|
||||||
if (name == NULL)
|
|
||||||
return;
|
|
||||||
stdout_node = of_find_node_by_path(name);
|
|
||||||
if (!stdout_node)
|
|
||||||
return;
|
|
||||||
name = of_get_property(stdout_node, "name", NULL);
|
|
||||||
if (!name) {
|
if (!name) {
|
||||||
printk(KERN_WARNING "stdout node missing 'name' property!\n");
|
printk(KERN_WARNING "stdout node missing 'name' property!\n");
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if it's a virtual terminal */
|
/* Check if it's a virtual terminal */
|
||||||
if (strncmp(name, "vty", 3) != 0)
|
if (strncmp(name, "vty", 3) != 0)
|
||||||
goto out;
|
return;
|
||||||
termno = of_get_property(stdout_node, "reg", NULL);
|
termno = of_get_property(of_stdout, "reg", NULL);
|
||||||
if (termno == NULL)
|
if (termno == NULL)
|
||||||
goto out;
|
return;
|
||||||
hvterm_priv0.termno = of_read_number(termno, 1);
|
hvterm_priv0.termno = of_read_number(termno, 1);
|
||||||
spin_lock_init(&hvterm_priv0.buf_lock);
|
spin_lock_init(&hvterm_priv0.buf_lock);
|
||||||
hvterm_privs[0] = &hvterm_priv0;
|
hvterm_privs[0] = &hvterm_priv0;
|
||||||
|
|
||||||
/* Check the protocol */
|
/* Check the protocol */
|
||||||
if (of_device_is_compatible(stdout_node, "hvterm1")) {
|
if (of_device_is_compatible(of_stdout, "hvterm1")) {
|
||||||
hvterm_priv0.proto = HV_PROTOCOL_RAW;
|
hvterm_priv0.proto = HV_PROTOCOL_RAW;
|
||||||
ops = &hvterm_raw_ops;
|
ops = &hvterm_raw_ops;
|
||||||
}
|
}
|
||||||
else if (of_device_is_compatible(stdout_node, "hvterm-protocol")) {
|
else if (of_device_is_compatible(of_stdout, "hvterm-protocol")) {
|
||||||
hvterm_priv0.proto = HV_PROTOCOL_HVSI;
|
hvterm_priv0.proto = HV_PROTOCOL_HVSI;
|
||||||
ops = &hvterm_hvsi_ops;
|
ops = &hvterm_hvsi_ops;
|
||||||
hvsilib_init(&hvterm_priv0.hvsi, hvc_get_chars, hvc_put_chars,
|
hvsilib_init(&hvterm_priv0.hvsi, hvc_get_chars, hvc_put_chars,
|
||||||
|
@ -447,7 +440,7 @@ void __init hvc_vio_init_early(void)
|
||||||
/* HVSI, perform the handshake now */
|
/* HVSI, perform the handshake now */
|
||||||
hvsilib_establish(&hvterm_priv0.hvsi);
|
hvsilib_establish(&hvterm_priv0.hvsi);
|
||||||
} else
|
} else
|
||||||
goto out;
|
return;
|
||||||
udbg_putc = udbg_hvc_putc;
|
udbg_putc = udbg_hvc_putc;
|
||||||
udbg_getc = udbg_hvc_getc;
|
udbg_getc = udbg_hvc_getc;
|
||||||
udbg_getc_poll = udbg_hvc_getc_poll;
|
udbg_getc_poll = udbg_hvc_getc_poll;
|
||||||
|
@ -456,14 +449,12 @@ void __init hvc_vio_init_early(void)
|
||||||
* backend for HVSI, only do udbg
|
* backend for HVSI, only do udbg
|
||||||
*/
|
*/
|
||||||
if (hvterm_priv0.proto == HV_PROTOCOL_HVSI)
|
if (hvterm_priv0.proto == HV_PROTOCOL_HVSI)
|
||||||
goto out;
|
return;
|
||||||
#endif
|
#endif
|
||||||
/* Check whether the user has requested a different console. */
|
/* Check whether the user has requested a different console. */
|
||||||
if (!strstr(cmd_line, "console="))
|
if (!strstr(cmd_line, "console="))
|
||||||
add_preferred_console("hvc", 0, NULL);
|
add_preferred_console("hvc", 0, NULL);
|
||||||
hvc_instantiate(0, 0, ops);
|
hvc_instantiate(0, 0, ops);
|
||||||
out:
|
|
||||||
of_node_put(stdout_node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* call this from early_init() for a working debug console on
|
/* call this from early_init() for a working debug console on
|
||||||
|
|
|
@ -1650,8 +1650,7 @@ static int __init pmz_probe(void)
|
||||||
/*
|
/*
|
||||||
* Find all escc chips in the system
|
* Find all escc chips in the system
|
||||||
*/
|
*/
|
||||||
node_p = of_find_node_by_name(NULL, "escc");
|
for_each_node_by_name(node_p, "escc") {
|
||||||
while (node_p) {
|
|
||||||
/*
|
/*
|
||||||
* First get channel A/B node pointers
|
* First get channel A/B node pointers
|
||||||
*
|
*
|
||||||
|
@ -1669,7 +1668,7 @@ static int __init pmz_probe(void)
|
||||||
of_node_put(node_b);
|
of_node_put(node_b);
|
||||||
printk(KERN_ERR "pmac_zilog: missing node %c for escc %s\n",
|
printk(KERN_ERR "pmac_zilog: missing node %c for escc %s\n",
|
||||||
(!node_a) ? 'a' : 'b', node_p->full_name);
|
(!node_a) ? 'a' : 'b', node_p->full_name);
|
||||||
goto next;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1696,11 +1695,9 @@ static int __init pmz_probe(void)
|
||||||
of_node_put(node_b);
|
of_node_put(node_b);
|
||||||
memset(&pmz_ports[count], 0, sizeof(struct uart_pmac_port));
|
memset(&pmz_ports[count], 0, sizeof(struct uart_pmac_port));
|
||||||
memset(&pmz_ports[count+1], 0, sizeof(struct uart_pmac_port));
|
memset(&pmz_ports[count+1], 0, sizeof(struct uart_pmac_port));
|
||||||
goto next;
|
continue;
|
||||||
}
|
}
|
||||||
count += 2;
|
count += 2;
|
||||||
next:
|
|
||||||
node_p = of_find_node_by_name(node_p, "escc");
|
|
||||||
}
|
}
|
||||||
pmz_ports_count = count;
|
pmz_ports_count = count;
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
|
#include <linux/of.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
@ -2615,6 +2616,8 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
|
||||||
spin_lock_init(&uport->lock);
|
spin_lock_init(&uport->lock);
|
||||||
lockdep_set_class(&uport->lock, &port_lock_key);
|
lockdep_set_class(&uport->lock, &port_lock_key);
|
||||||
}
|
}
|
||||||
|
if (uport->cons && uport->dev)
|
||||||
|
of_console_check(uport->dev->of_node, uport->cons->name, uport->line);
|
||||||
|
|
||||||
uart_configure_port(drv, state, uport);
|
uart_configure_port(drv, state, uport);
|
||||||
|
|
||||||
|
|
|
@ -113,6 +113,7 @@ static inline void of_node_put(struct device_node *node) { }
|
||||||
extern struct device_node *of_allnodes;
|
extern struct device_node *of_allnodes;
|
||||||
extern struct device_node *of_chosen;
|
extern struct device_node *of_chosen;
|
||||||
extern struct device_node *of_aliases;
|
extern struct device_node *of_aliases;
|
||||||
|
extern struct device_node *of_stdout;
|
||||||
extern raw_spinlock_t devtree_lock;
|
extern raw_spinlock_t devtree_lock;
|
||||||
|
|
||||||
static inline bool of_have_populated_dt(void)
|
static inline bool of_have_populated_dt(void)
|
||||||
|
@ -352,7 +353,7 @@ const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur,
|
||||||
*/
|
*/
|
||||||
const char *of_prop_next_string(struct property *prop, const char *cur);
|
const char *of_prop_next_string(struct property *prop, const char *cur);
|
||||||
|
|
||||||
int of_device_is_stdout_path(struct device_node *dn);
|
bool of_console_check(struct device_node *dn, char *name, int index);
|
||||||
|
|
||||||
#else /* CONFIG_OF */
|
#else /* CONFIG_OF */
|
||||||
|
|
||||||
|
@ -564,9 +565,9 @@ static inline int of_machine_is_compatible(const char *compat)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int of_device_is_stdout_path(struct device_node *dn)
|
static inline bool of_console_check(const struct device_node *dn, const char *name, int index)
|
||||||
{
|
{
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline const __be32 *of_prop_next_u32(struct property *prop,
|
static inline const __be32 *of_prop_next_u32(struct property *prop,
|
||||||
|
|
|
@ -992,9 +992,9 @@ static int snd_pmac_detect(struct snd_pmac *chip)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (!sound) {
|
if (!sound) {
|
||||||
sound = of_find_node_by_name(NULL, "sound");
|
for_each_node_by_name(sound, "sound")
|
||||||
while (sound && sound->parent != chip->node)
|
if (sound->parent == chip->node)
|
||||||
sound = of_find_node_by_name(sound, "sound");
|
break;
|
||||||
}
|
}
|
||||||
if (! sound) {
|
if (! sound) {
|
||||||
of_node_put(chip->node);
|
of_node_put(chip->node);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue