162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Freescale SOC support functions 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Author: Scott Wood <scottwood@freescale.com> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (c) 2007 Freescale Semiconductor, Inc. 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "ops.h" 1162306a36Sopenharmony_ci#include "types.h" 1262306a36Sopenharmony_ci#include "fsl-soc.h" 1362306a36Sopenharmony_ci#include "stdio.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic u32 prop_buf[MAX_PROP_LEN / 4]; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ciu32 *fsl_get_immr(void) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci void *soc; 2062306a36Sopenharmony_ci unsigned long ret = 0; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci soc = find_node_by_devtype(NULL, "soc"); 2362306a36Sopenharmony_ci if (soc) { 2462306a36Sopenharmony_ci int size; 2562306a36Sopenharmony_ci u32 naddr; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci size = getprop(soc, "#address-cells", prop_buf, MAX_PROP_LEN); 2862306a36Sopenharmony_ci if (size == 4) 2962306a36Sopenharmony_ci naddr = prop_buf[0]; 3062306a36Sopenharmony_ci else 3162306a36Sopenharmony_ci naddr = 2; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci if (naddr != 1 && naddr != 2) 3462306a36Sopenharmony_ci goto err; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci size = getprop(soc, "ranges", prop_buf, MAX_PROP_LEN); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci if (size < 12) 3962306a36Sopenharmony_ci goto err; 4062306a36Sopenharmony_ci if (prop_buf[0] != 0) 4162306a36Sopenharmony_ci goto err; 4262306a36Sopenharmony_ci if (naddr == 2 && prop_buf[1] != 0) 4362306a36Sopenharmony_ci goto err; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci if (!dt_xlate_addr(soc, prop_buf + naddr, 8, &ret)) 4662306a36Sopenharmony_ci ret = 0; 4762306a36Sopenharmony_ci } 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cierr: 5062306a36Sopenharmony_ci if (!ret) 5162306a36Sopenharmony_ci printf("fsl_get_immr: Failed to find immr base\r\n"); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci return (u32 *)ret; 5462306a36Sopenharmony_ci} 55