[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: Vitaly Bordug <vbordug@ru.mvista.com> Signed-off-by: Kumar Gala <kumar.gala@freescale.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
fa71f0e0f5
commit
88adfe70c6
@@ -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)
|
|||||||
|
|
||||||
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;
|
|||||||
/* 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[];
|
||||||
|
Reference in New Issue
Block a user