Commit 88adfe70 authored by Kumar Gala's avatar Kumar Gala Committed by Linus Torvalds

[PATCH] ppc32: ppc_sys system on chip identification additions

Add the ability to identify an SOC by a name and id.  There are cases in
which the integer identifier is not sufficient to specify a specific SOC.
In these cases we can use a string to further qualify the match.
Signed-off-by: default avatarVitaly Bordug <vbordug@ru.mvista.com>
Signed-off-by: default avatarKumar Gala <kumar.gala@freescale.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent fa71f0e0
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
* Maintainer: Kumar Gala <kumar.gala@freescale.com> * Maintainer: Kumar Gala <kumar.gala@freescale.com>
* *
* Copyright 2005 Freescale Semiconductor Inc. * Copyright 2005 Freescale Semiconductor Inc.
* Copyright 2005 MontaVista, Inc. by Vitaly Bordug <vbordug@ru.mvista.com>
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
...@@ -35,10 +36,59 @@ void __init identify_ppc_sys_by_id(u32 id) ...@@ -35,10 +36,59 @@ void __init identify_ppc_sys_by_id(u32 id)
void __init identify_ppc_sys_by_name(char *name) void __init identify_ppc_sys_by_name(char *name)
{ {
/* TODO */ unsigned int i = 0;
while (ppc_sys_specs[i].ppc_sys_name[0])
{
if (!strcmp(ppc_sys_specs[i].ppc_sys_name, name))
break;
i++;
}
cur_ppc_sys_spec = &ppc_sys_specs[i];
return; return;
} }
static int __init count_sys_specs(void)
{
int i = 0;
while (ppc_sys_specs[i].ppc_sys_name[0])
i++;
return i;
}
static int __init find_chip_by_name_and_id(char *name, u32 id)
{
int ret = -1;
unsigned int i = 0;
unsigned int j = 0;
unsigned int dups = 0;
unsigned char matched[count_sys_specs()];
while (ppc_sys_specs[i].ppc_sys_name[0]) {
if (!strcmp(ppc_sys_specs[i].ppc_sys_name, name))
matched[j++] = i;
i++;
}
if (j != 0) {
for (i = 0; i < j; i++) {
if ((ppc_sys_specs[matched[i]].mask & id) ==
ppc_sys_specs[matched[i]].value) {
ret = matched[i];
dups++;
}
}
ret = (dups == 1) ? ret : (-1 * dups);
}
return ret;
}
void __init identify_ppc_sys_by_name_and_id(char *name, u32 id)
{
int i = find_chip_by_name_and_id(name, id);
BUG_ON(i < 0);
cur_ppc_sys_spec = &ppc_sys_specs[i];
}
/* Update all memory resources by paddr, call before platform_device_register */ /* Update all memory resources by paddr, call before platform_device_register */
void __init void __init
ppc_sys_fixup_mem_resource(struct platform_device *pdev, phys_addr_t paddr) ppc_sys_fixup_mem_resource(struct platform_device *pdev, phys_addr_t paddr)
......
...@@ -52,6 +52,7 @@ extern struct ppc_sys_spec *cur_ppc_sys_spec; ...@@ -52,6 +52,7 @@ extern struct ppc_sys_spec *cur_ppc_sys_spec;
/* determine which specific SOC we are */ /* determine which specific SOC we are */
extern void identify_ppc_sys_by_id(u32 id) __init; extern void identify_ppc_sys_by_id(u32 id) __init;
extern void identify_ppc_sys_by_name(char *name) __init; extern void identify_ppc_sys_by_name(char *name) __init;
extern void identify_ppc_sys_by_name_and_id(char *name, u32 id) __init;
/* describes all devices that may exist in a given family of processors */ /* describes all devices that may exist in a given family of processors */
extern struct platform_device ppc_sys_platform_devices[]; extern struct platform_device ppc_sys_platform_devices[];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment