summaryrefslogtreecommitdiffstats
path: root/drivers/char/hvc_console.c
diff options
context:
space:
mode:
authorMilton Miller <miltonm@bga.com>2005-07-08 02:56:17 +0200
committerLinus Torvalds <torvalds@g5.osdl.org>2005-07-08 03:23:38 +0200
commit6f24808eeb54eed5994128a863cd25c40f36cfac (patch)
tree19a4567d9e9d6b2b7f8d7be84068d6e734495b59 /drivers/char/hvc_console.c
parent[PATCH] hvc_console: Rearrange code (diff)
downloadlinux-6f24808eeb54eed5994128a863cd25c40f36cfac.tar.xz
linux-6f24808eeb54eed5994128a863cd25c40f36cfac.zip
[PATCH] hvc_console: Match vio and console devices using vterm numbers
Use the vterm numbers to match the vio devices being probed with the indices already allocated via the console initcall function hvc_find_vtys. The old code required hvc_find_vtys to "guess" the matching devices the vio subsystem would find and its probe order. Signed-off-by: Milton Miller <miltonm@bga.com> Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/char/hvc_console.c')
-rw-r--r--drivers/char/hvc_console.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c
index f0a1456a597e..4b776f4eb467 100644
--- a/drivers/char/hvc_console.c
+++ b/drivers/char/hvc_console.c
@@ -102,10 +102,11 @@ static struct list_head hvc_structs = LIST_HEAD_INIT(hvc_structs);
static DEFINE_SPINLOCK(hvc_structs_lock);
/*
- * This value is used to associate a tty->index value to a hvc_struct based
- * upon order of exposure via hvc_probe().
+ * This value is used to assign a tty->index value to a hvc_struct based
+ * upon order of exposure via hvc_probe(), when we can not match it to
+ * a console canidate registered with hvc_instantiate().
*/
-static int hvc_count = -1;
+static int last_hvc = -1;
/*
* Do not call this function with either the hvc_strucst_lock or the hvc_struct
@@ -224,9 +225,10 @@ static int __init hvc_console_init(void)
console_initcall(hvc_console_init);
/*
- * hvc_instantiate() is an early console discovery method which locates consoles
- * prior to the vio subsystem discovering them. Hotplugged vty adapters do NOT
- * get an hvc_instantiate() callback since the appear after early console init.
+ * hvc_instantiate() is an early console discovery method which locates
+ * consoles * prior to the vio subsystem discovering them. Hotplugged
+ * vty adapters do NOT get an hvc_instantiate() callback since they
+ * appear after early console init.
*/
int hvc_instantiate(uint32_t vtermno, int index)
{
@@ -237,6 +239,11 @@ int hvc_instantiate(uint32_t vtermno, int index)
return -1;
vtermnos[index] = vtermno;
+
+ /* reserve all indices upto and including this index */
+ if (last_hvc < index)
+ last_hvc = index;
+
return 0;
}
@@ -697,6 +704,7 @@ static int __devinit hvc_probe(
const struct vio_device_id *id)
{
struct hvc_struct *hp;
+ int i;
/* probed with invalid parameters. */
if (!dev || !id)
@@ -717,7 +725,21 @@ static int __devinit hvc_probe(
spin_lock_init(&hp->lock);
spin_lock(&hvc_structs_lock);
- hp->index = ++hvc_count;
+
+ /*
+ * find index to use:
+ * see if this vterm id matches one registered for console.
+ */
+ for (i=0; i < MAX_NR_HVC_CONSOLES; i++)
+ if (vtermnos[i] == hp->vtermno)
+ break;
+
+ /* no matching slot, just use a counter */
+ if (i >= MAX_NR_HVC_CONSOLES)
+ i = ++last_hvc;
+
+ hp->index = i;
+
list_add_tail(&(hp->next), &hvc_structs);
spin_unlock(&hvc_structs_lock);