|  | /* | 
|  | * Freescale SOC support functions | 
|  | * | 
|  | * Author: Scott Wood <scottwood@freescale.com> | 
|  | * | 
|  | * Copyright (c) 2007 Freescale Semiconductor, Inc. | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify it | 
|  | * under the terms of the GNU General Public License version 2 as published | 
|  | * by the Free Software Foundation. | 
|  | */ | 
|  |  | 
|  | #include "ops.h" | 
|  | #include "types.h" | 
|  | #include "fsl-soc.h" | 
|  | #include "stdio.h" | 
|  |  | 
|  | static u32 prop_buf[MAX_PROP_LEN / 4]; | 
|  |  | 
|  | u32 *fsl_get_immr(void) | 
|  | { | 
|  | void *soc; | 
|  | unsigned long ret = 0; | 
|  |  | 
|  | soc = find_node_by_devtype(NULL, "soc"); | 
|  | if (soc) { | 
|  | int size; | 
|  | u32 naddr; | 
|  |  | 
|  | size = getprop(soc, "#address-cells", prop_buf, MAX_PROP_LEN); | 
|  | if (size == 4) | 
|  | naddr = prop_buf[0]; | 
|  | else | 
|  | naddr = 2; | 
|  |  | 
|  | if (naddr != 1 && naddr != 2) | 
|  | goto err; | 
|  |  | 
|  | size = getprop(soc, "ranges", prop_buf, MAX_PROP_LEN); | 
|  |  | 
|  | if (size < 12) | 
|  | goto err; | 
|  | if (prop_buf[0] != 0) | 
|  | goto err; | 
|  | if (naddr == 2 && prop_buf[1] != 0) | 
|  | goto err; | 
|  |  | 
|  | if (!dt_xlate_addr(soc, prop_buf + naddr, 8, &ret)) | 
|  | ret = 0; | 
|  | } | 
|  |  | 
|  | err: | 
|  | if (!ret) | 
|  | printf("fsl_get_immr: Failed to find immr base\r\n"); | 
|  |  | 
|  | return (u32 *)ret; | 
|  | } |