uboot/arch/arm/cpu/armv7/am33xx/sys_info.c
<<
>>
Prefs
   1/*
   2 * sys_info.c
   3 *
   4 * System information functions
   5 *
   6 * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
   7 *
   8 * Derived from Beagle Board and 3430 SDP code by
   9 *      Richard Woodruff <r-woodruff2@ti.com>
  10 *      Syed Mohammed Khasim <khasim@ti.com>
  11 *
  12 * SPDX-License-Identifier:     GPL-2.0+
  13 */
  14
  15#include <common.h>
  16#include <asm/io.h>
  17#include <asm/arch/sys_proto.h>
  18#include <asm/arch/cpu.h>
  19#include <asm/arch/clock.h>
  20#include <power/tps65910.h>
  21
  22struct ctrl_stat *cstat = (struct ctrl_stat *)CTRL_BASE;
  23
  24/**
  25 * get_cpu_rev(void) - extract rev info
  26 */
  27u32 get_cpu_rev(void)
  28{
  29        u32 id;
  30        u32 rev;
  31
  32        id = readl(DEVICE_ID);
  33        rev = (id >> 28) & 0xff;
  34
  35        return rev;
  36}
  37
  38/**
  39 * get_cpu_type(void) - extract cpu info
  40 */
  41u32 get_cpu_type(void)
  42{
  43        u32 id = 0;
  44        u32 partnum;
  45
  46        id = readl(DEVICE_ID);
  47        partnum = (id >> 12) & 0xffff;
  48
  49        return partnum;
  50}
  51
  52/**
  53 * get_board_rev() - setup to pass kernel board revision information
  54 * returns:(bit[0-3] sub version, higher bit[7-4] is higher version)
  55 */
  56u32 get_board_rev(void)
  57{
  58        return BOARD_REV_ID;
  59}
  60
  61/**
  62 * get_device_type(): tell if GP/HS/EMU/TST
  63 */
  64u32 get_device_type(void)
  65{
  66        int mode;
  67        mode = readl(&cstat->statusreg) & (DEVICE_MASK);
  68        return mode >>= 8;
  69}
  70
  71/**
  72 * get_sysboot_value(void) - return SYS_BOOT[4:0]
  73 */
  74u32 get_sysboot_value(void)
  75{
  76        int mode;
  77        mode = readl(&cstat->statusreg) & (SYSBOOT_MASK);
  78        return mode;
  79}
  80
  81#ifdef CONFIG_DISPLAY_CPUINFO
  82/**
  83 * Print CPU information
  84 */
  85int print_cpuinfo(void)
  86{
  87        char *cpu_s, *sec_s;
  88
  89        switch (get_cpu_type()) {
  90        case AM335X:
  91                cpu_s = "AM335X";
  92                break;
  93        case TI81XX:
  94                cpu_s = "TI81XX";
  95                break;
  96        default:
  97                cpu_s = "Unknown cpu type";
  98                break;
  99        }
 100
 101        switch (get_device_type()) {
 102        case TST_DEVICE:
 103                sec_s = "TST";
 104                break;
 105        case EMU_DEVICE:
 106                sec_s = "EMU";
 107                break;
 108        case HS_DEVICE:
 109                sec_s = "HS";
 110                break;
 111        case GP_DEVICE:
 112                sec_s = "GP";
 113                break;
 114        default:
 115                sec_s = "?";
 116        }
 117
 118        printf("%s-%s rev %d\n", cpu_s, sec_s, get_cpu_rev());
 119
 120        return 0;
 121}
 122#endif  /* CONFIG_DISPLAY_CPUINFO */
 123
 124#ifdef CONFIG_AM33XX
 125int am335x_get_efuse_mpu_max_freq(struct ctrl_dev *cdev)
 126{
 127        int sil_rev;
 128
 129        sil_rev = readl(&cdev->deviceid) >> 28;
 130
 131        if (sil_rev == 1)
 132                /* PG 2.0, efuse may not be set. */
 133                return MPUPLL_M_800;
 134        else if (sil_rev >= 2) {
 135                /* Check what the efuse says our max speed is. */
 136                int efuse_arm_mpu_max_freq;
 137                efuse_arm_mpu_max_freq = readl(&cdev->efuse_sma);
 138                switch ((efuse_arm_mpu_max_freq & DEVICE_ID_MASK)) {
 139                case AM335X_ZCZ_1000:
 140                        return MPUPLL_M_1000;
 141                case AM335X_ZCZ_800:
 142                        return MPUPLL_M_800;
 143                case AM335X_ZCZ_720:
 144                        return MPUPLL_M_720;
 145                case AM335X_ZCZ_600:
 146                case AM335X_ZCE_600:
 147                        return MPUPLL_M_600;
 148                case AM335X_ZCZ_300:
 149                case AM335X_ZCE_300:
 150                        return MPUPLL_M_300;
 151                }
 152        }
 153
 154        /* PG 1.0 or otherwise unknown, use the PG1.0 max */
 155        return MPUPLL_M_720;
 156}
 157
 158int am335x_get_tps65910_mpu_vdd(int sil_rev, int frequency)
 159{
 160        /* For PG2.1 and later, we have one set of values. */
 161        if (sil_rev >= 2) {
 162                switch (frequency) {
 163                case MPUPLL_M_1000:
 164                        return TPS65910_OP_REG_SEL_1_3_2_5;
 165                case MPUPLL_M_800:
 166                        return TPS65910_OP_REG_SEL_1_2_6;
 167                case MPUPLL_M_720:
 168                        return TPS65910_OP_REG_SEL_1_2_0;
 169                case MPUPLL_M_600:
 170                case MPUPLL_M_300:
 171                        return TPS65910_OP_REG_SEL_1_1_3;
 172                }
 173        }
 174
 175        /* Default to PG1.0/PG2.0 values. */
 176        return TPS65910_OP_REG_SEL_1_1_3;
 177}
 178#endif
 179