uboot/arch/arm/mach-davinci/cpu.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2004 Texas Instruments.
   4 * Copyright (C) 2009 David Brownell
   5 */
   6
   7#include <common.h>
   8#include <init.h>
   9#include <asm/arch/hardware.h>
  10#include <asm/io.h>
  11
  12DECLARE_GLOBAL_DATA_PTR;
  13
  14/* offsets from PLL controller base */
  15#define PLLC_PLLCTL     0x100
  16#define PLLC_PLLM       0x110
  17#define PLLC_PREDIV     0x114
  18#define PLLC_PLLDIV1    0x118
  19#define PLLC_PLLDIV2    0x11c
  20#define PLLC_PLLDIV3    0x120
  21#define PLLC_POSTDIV    0x128
  22#define PLLC_BPDIV      0x12c
  23#define PLLC_PLLDIV4    0x160
  24#define PLLC_PLLDIV5    0x164
  25#define PLLC_PLLDIV6    0x168
  26#define PLLC_PLLDIV7    0x16c
  27#define PLLC_PLLDIV8    0x170
  28#define PLLC_PLLDIV9    0x174
  29
  30unsigned int sysdiv[9] = {
  31        PLLC_PLLDIV1, PLLC_PLLDIV2, PLLC_PLLDIV3, PLLC_PLLDIV4, PLLC_PLLDIV5,
  32        PLLC_PLLDIV6, PLLC_PLLDIV7, PLLC_PLLDIV8, PLLC_PLLDIV9
  33};
  34
  35int clk_get(enum davinci_clk_ids id)
  36{
  37        int pre_div;
  38        int pllm;
  39        int post_div;
  40        int pll_out;
  41        unsigned int pll_base;
  42
  43        pll_out = CONFIG_SYS_OSCIN_FREQ;
  44
  45        if (id == DAVINCI_AUXCLK_CLKID)
  46                goto out;
  47
  48        if ((id >> 16) == 1)
  49                pll_base = (unsigned int)davinci_pllc1_regs;
  50        else
  51                pll_base = (unsigned int)davinci_pllc0_regs;
  52
  53        id &= 0xFFFF;
  54
  55        /*
  56         * Lets keep this simple. Combining operations can result in
  57         * unexpected approximations
  58         */
  59        pre_div = (readl(pll_base + PLLC_PREDIV) &
  60                DAVINCI_PLLC_DIV_MASK) + 1;
  61        pllm = readl(pll_base + PLLC_PLLM) + 1;
  62
  63        pll_out /= pre_div;
  64        pll_out *= pllm;
  65
  66        if (id == DAVINCI_PLLM_CLKID)
  67                goto out;
  68
  69        post_div = (readl(pll_base + PLLC_POSTDIV) &
  70                DAVINCI_PLLC_DIV_MASK) + 1;
  71
  72        pll_out /= post_div;
  73
  74        if (id == DAVINCI_PLLC_CLKID)
  75                goto out;
  76
  77        pll_out /= (readl(pll_base + sysdiv[id - 1]) &
  78                DAVINCI_PLLC_DIV_MASK) + 1;
  79
  80out:
  81        return pll_out;
  82}
  83
  84int set_cpu_clk_info(void)
  85{
  86        gd->bd->bi_arm_freq = clk_get(DAVINCI_ARM_CLKID) / 1000000;
  87        /* DDR PHY uses an x2 input clock */
  88        gd->bd->bi_ddr_freq = cpu_is_da830() ? 0 :
  89                                (clk_get(DAVINCI_DDR_CLKID) / 1000000);
  90        gd->bd->bi_dsp_freq = 0;
  91        return 0;
  92}
  93