ppc32: ppc_sys SOC identification additions
PATCH 1/1 ppc32: ppc_sys SOC identification additions
Kumar,
this is proposed extension of ppc_sys identify functions.
Signed-off-by Vitaly Bordug <[email protected]>
Signature · 2 lines
Sincerely, Vitaly
arch/ppc/syslib/ppc_sys.c +50 -1
@@ -6,6 +6,7 @@* Maintainer: Kumar Gala <[email protected]> * * Copyright 2005 Freescale Semiconductor Inc. +* Copyright 2005 MontaVista, Inc. by Vitaly Bordug <[email protected]> * * 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
@@ -35,10 +36,58 @@ void __init identify_ppc_sys_by_id(u32 ivoid __init identify_ppc_sys_by_name (char *name) { -/* TODO */ +unsigned int i =0 ; +while (strcmp (ppc_sys_specs[i].ppc_sys_name,"" )) { +if (!strcmp (ppc_sys_specs[i].ppc_sys_name, name)) +break ; + i++; + } + cur_ppc_sys_spec = &ppc_sys_specs[i];return ; } +static int __init count_sys_specs (void ) +{ +int i =0 ; +while (strcmp (ppc_sys_specs[i].ppc_sys_name,"" )) + 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 (strcmp (ppc_sys_specs[i].ppc_sys_name,"" )) { +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 */ void __init ppc_sys_fixup_mem_resource (struct platform_device *pdev,phys_addr_t paddr)
include/asm-ppc/ppc_sys.h +2 -1
@@ -51,7 +51,8 @@ extern struct ppc_sys_spec *cur_ppc_sys_/* determine which specific SOC we are */ 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 */ extern struct platform_device ppc_sys_platform_devices[];
Quoted 2 lines · In message <[email protected]> you wrote:
(quoted diff) +1
-0+ while (strcmp(ppc_sys_specs[i].ppc_sys_name, "")) {
...
Quoted 1 line
arch/ppc/syslib/ppc_sys.c +1
-0+while (strcmp (ppc_sys_specs[i].ppc_sys_name,"" ))
...
Review
Quoted 1 line
(quoted diff) +1
-0+ while (strcmp(ppc_sys_specs[i].ppc_sys_name, "")) {
What about:
while (ppc_sys_specs[i].ppc_sys_name[0]) ... ???
Best regards,
Wolfgang Denk
Signature · 4 lines
Software Engineering: Embedded and Realtime Systems, Embedded Linux Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: [email protected] What we anticipate seldom occurs; what we least expect generally happens. - Bengamin Disraeli
Here's the same but without strcmp().
Signed-off-by Vitaly Bordug <[email protected]>
Signature · 2 lines
Sincerely, Vitaly
arch/ppc/syslib/ppc_sys.c +50 -1
@@ -6,6 +6,7 @@* Maintainer: Kumar Gala <[email protected]> * * Copyright 2005 Freescale Semiconductor Inc. +* Copyright 2005 MontaVista, Inc. by Vitaly Bordug <[email protected]> * * 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
@@ -35,10 +36,58 @@ void __init identify_ppc_sys_by_id(u32 ivoid __init identify_ppc_sys_by_name (char *name) { -/* TODO */ +unsigned int i =0 ; +while (strcmp (ppc_sys_specs[i].ppc_sys_name,"" )) { +if (!strcmp (ppc_sys_specs[i].ppc_sys_name, name)) +break ; + i++; + } + cur_ppc_sys_spec = &ppc_sys_specs[i];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 */ void __init ppc_sys_fixup_mem_resource (struct platform_device *pdev,phys_addr_t paddr)
include/asm-ppc/ppc_sys.h +2 -1
@@ -49,7 +49,8 @@ extern struct ppc_sys_spec *cur_ppc_sys_/* determine which specific SOC we are */ 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 */ extern struct platform_device ppc_sys_platform_devices[];