1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * arch/arm/cpu/armv7/rmobile/cpu_info-rcar.c 4 * 5 * Copyright (C) 2013,2014 Renesas Electronics Corporation 6 */ 7 #include <common.h> 8 #include <asm/io.h> 9 10 #define PRR_MASK 0x7fff 11 #define R8A7796_REV_1_0 0x5200 12 #define R8A7796_REV_1_1 0x5210 13 14 static u32 rmobile_get_prr(void); 15 16 u32 rmobile_get_cpu_type(void) 17 { 18 return (rmobile_get_prr() & 0x00007F00) >> 8; 19 } 20 21 u32 rmobile_get_cpu_rev_integer(void) 22 { 23 const u32 prr = rmobile_get_prr(); 24 25 if ((prr & PRR_MASK) == R8A7796_REV_1_1) 26 return 1; 27 else 28 return ((prr & 0x000000F0) >> 4) + 1; 29 } 30 31 u32 rmobile_get_cpu_rev_fraction(void) 32 { 33 const u32 prr = rmobile_get_prr(); 34 35 if ((prr & PRR_MASK) == R8A7796_REV_1_1) 36 return 1; 37 else 38 return prr & 0x0000000F; 39 } 40 41 #if !CONFIG_IS_ENABLED(DM) || !CONFIG_IS_ENABLED(SYSCON) 42 static u32 rmobile_get_prr(void) 43 { 44 /* 45 * On RCar/RMobile Gen2 and older systems, the PRR is always 46 * located at the address below. On newer systems, the PRR 47 * may be located at different address, but that information 48 * is obtained from DT. This code will be removed when all 49 * of the older systems get converted to DM and OF control. 50 */ 51 return readl(0xFF000044); 52 } 53 #else 54 55 #include <dm.h> 56 #include <syscon.h> 57 #include <regmap.h> 58 59 struct renesas_prr_priv { 60 fdt_addr_t regs; 61 }; 62 63 enum { 64 PRR_RCAR, 65 }; 66 67 static u32 rmobile_get_prr(void) 68 { 69 struct regmap *map; 70 71 map = syscon_get_regmap_by_driver_data(PRR_RCAR); 72 if (!map) { 73 printf("PRR regmap failed!\n"); 74 hang(); 75 } 76 77 return readl(map->ranges[0].start); 78 } 79 80 static const struct udevice_id renesas_prr_ids[] = { 81 { .compatible = "renesas,prr", .data = PRR_RCAR }, 82 { } 83 }; 84 85 U_BOOT_DRIVER(renesas_prr) = { 86 .name = "renesas_prr", 87 .id = UCLASS_SYSCON, 88 .of_match = renesas_prr_ids, 89 .flags = DM_FLAG_PRE_RELOC, 90 }; 91 #endif 92