2008-05-02 13:21:40 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2005-2008 Atmel Corporation
|
|
|
|
*
|
2013-07-08 07:37:19 +00:00
|
|
|
* SPDX-License-Identifier: GPL-2.0+
|
2008-05-02 13:21:40 +00:00
|
|
|
*/
|
|
|
|
#include <common.h>
|
|
|
|
|
|
|
|
#include <asm/io.h>
|
|
|
|
|
|
|
|
#include <asm/arch/clk.h>
|
2010-11-04 23:15:30 +00:00
|
|
|
#include <asm/arch/hardware.h>
|
2008-08-31 16:05:32 +00:00
|
|
|
#include <asm/arch/portmux.h>
|
2008-05-02 13:21:40 +00:00
|
|
|
|
|
|
|
#include "sm.h"
|
|
|
|
|
|
|
|
void clk_init(void)
|
|
|
|
{
|
|
|
|
uint32_t cksel;
|
|
|
|
|
|
|
|
/* in case of soft resets, disable watchdog */
|
|
|
|
sm_writel(WDT_CTRL, SM_BF(KEY, 0x55));
|
|
|
|
sm_writel(WDT_CTRL, SM_BF(KEY, 0xaa));
|
|
|
|
|
|
|
|
#ifdef CONFIG_PLL
|
|
|
|
/* Initialize the PLL */
|
2008-10-16 13:01:15 +00:00
|
|
|
sm_writel(PM_PLL0, (SM_BF(PLLCOUNT, CONFIG_SYS_PLL0_SUPPRESS_CYCLES)
|
|
|
|
| SM_BF(PLLMUL, CONFIG_SYS_PLL0_MUL - 1)
|
|
|
|
| SM_BF(PLLDIV, CONFIG_SYS_PLL0_DIV - 1)
|
|
|
|
| SM_BF(PLLOPT, CONFIG_SYS_PLL0_OPT)
|
2008-05-02 13:21:40 +00:00
|
|
|
| SM_BF(PLLOSC, 0)
|
|
|
|
| SM_BIT(PLLEN)));
|
|
|
|
|
|
|
|
/* Wait for lock */
|
|
|
|
while (!(sm_readl(PM_ISR) & SM_BIT(LOCK0))) ;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Set up clocks for the CPU and all peripheral buses */
|
|
|
|
cksel = 0;
|
2008-10-16 13:01:15 +00:00
|
|
|
if (CONFIG_SYS_CLKDIV_CPU)
|
|
|
|
cksel |= SM_BIT(CPUDIV) | SM_BF(CPUSEL, CONFIG_SYS_CLKDIV_CPU - 1);
|
|
|
|
if (CONFIG_SYS_CLKDIV_HSB)
|
|
|
|
cksel |= SM_BIT(HSBDIV) | SM_BF(HSBSEL, CONFIG_SYS_CLKDIV_HSB - 1);
|
|
|
|
if (CONFIG_SYS_CLKDIV_PBA)
|
|
|
|
cksel |= SM_BIT(PBADIV) | SM_BF(PBASEL, CONFIG_SYS_CLKDIV_PBA - 1);
|
|
|
|
if (CONFIG_SYS_CLKDIV_PBB)
|
|
|
|
cksel |= SM_BIT(PBBDIV) | SM_BF(PBBSEL, CONFIG_SYS_CLKDIV_PBB - 1);
|
2008-05-02 13:21:40 +00:00
|
|
|
sm_writel(PM_CKSEL, cksel);
|
|
|
|
|
|
|
|
#ifdef CONFIG_PLL
|
|
|
|
/* Use PLL0 as main clock */
|
|
|
|
sm_writel(PM_MCCTRL, SM_BIT(PLLSEL));
|
2009-07-21 10:11:37 +00:00
|
|
|
|
|
|
|
#ifdef CONFIG_LCD
|
|
|
|
/* Set up pixel clock for the LCDC */
|
|
|
|
sm_writel(PM_GCCTRL(7), SM_BIT(PLLSEL) | SM_BIT(CEN));
|
|
|
|
#endif
|
2008-05-02 13:21:40 +00:00
|
|
|
#endif
|
|
|
|
}
|
2008-08-31 16:05:32 +00:00
|
|
|
|
|
|
|
unsigned long __gclk_set_rate(unsigned int id, enum gclk_parent parent,
|
|
|
|
unsigned long rate, unsigned long parent_rate)
|
|
|
|
{
|
|
|
|
unsigned long divider;
|
|
|
|
|
|
|
|
if (rate == 0 || parent_rate == 0) {
|
|
|
|
sm_writel(PM_GCCTRL(id), 0);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
divider = (parent_rate + rate / 2) / rate;
|
|
|
|
if (divider <= 1) {
|
|
|
|
sm_writel(PM_GCCTRL(id), parent | SM_BIT(CEN));
|
|
|
|
rate = parent_rate;
|
|
|
|
} else {
|
linux/kernel.h: sync min, max, min3, max3 macros with Linux
U-Boot has never cared about the type when we get max/min of two
values, but Linux Kernel does. This commit gets min, max, min3, max3
macros synced with the kernel introducing type checks.
Many of references of those macros must be fixed to suppress warnings.
We have two options:
- Use min, max, min3, max3 only when the arguments have the same type
(or add casts to the arguments)
- Use min_t/max_t instead with the appropriate type for the first
argument
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
Acked-by: Pavel Machek <pavel@denx.de>
Acked-by: Lukasz Majewski <l.majewski@samsung.com>
Tested-by: Lukasz Majewski <l.majewski@samsung.com>
[trini: Fixup arch/blackfin/lib/string.c]
Signed-off-by: Tom Rini <trini@ti.com>
2014-11-06 18:03:31 +00:00
|
|
|
divider = min(255UL, divider / 2 - 1);
|
2008-08-31 16:05:32 +00:00
|
|
|
sm_writel(PM_GCCTRL(id), parent | SM_BIT(CEN) | SM_BIT(DIVEN)
|
|
|
|
| SM_BF(DIV, divider));
|
|
|
|
rate = parent_rate / (2 * (divider + 1));
|
|
|
|
}
|
|
|
|
|
|
|
|
return rate;
|
|
|
|
}
|