// SPDX-License-Identifier: GPL-2.0 /* * arch/arm/cpu/armv7/rmobile/cpu_info-rcar.c * * Copyright (C) 2013,2014 Renesas Electronics Corporation */ #include #include #define PRR_MASK 0x7fff #define R8A7796_REV_1_0 0x5200 #define R8A7796_REV_1_1 0x5210 static u32 rmobile_get_prr(void); u32 rmobile_get_cpu_type(void) { return (rmobile_get_prr() & 0x00007F00) >> 8; } u32 rmobile_get_cpu_rev_integer(void) { const u32 prr = rmobile_get_prr(); if ((prr & PRR_MASK) == R8A7796_REV_1_1) return 1; else return ((prr & 0x000000F0) >> 4) + 1; } u32 rmobile_get_cpu_rev_fraction(void) { const u32 prr = rmobile_get_prr(); if ((prr & PRR_MASK) == R8A7796_REV_1_1) return 1; else return prr & 0x0000000F; } #if !CONFIG_IS_ENABLED(DM) || !CONFIG_IS_ENABLED(SYSCON) static u32 rmobile_get_prr(void) { /* * On RCar/RMobile Gen2 and older systems, the PRR is always * located at the address below. On newer systems, the PRR * may be located at different address, but that information * is obtained from DT. This code will be removed when all * of the older systems get converted to DM and OF control. */ return readl(0xFF000044); } #else #include #include #include struct renesas_prr_priv { fdt_addr_t regs; }; enum { PRR_RCAR, }; static u32 rmobile_get_prr(void) { struct regmap *map; map = syscon_get_regmap_by_driver_data(PRR_RCAR); if (!map) { printf("PRR regmap failed!\n"); hang(); } return readl(map->base); } static const struct udevice_id renesas_prr_ids[] = { { .compatible = "renesas,prr", .data = PRR_RCAR }, { } }; U_BOOT_DRIVER(renesas_prr) = { .name = "renesas_prr", .id = UCLASS_SYSCON, .of_match = renesas_prr_ids, .flags = DM_FLAG_PRE_RELOC, }; #endif