From 03b5f50cad67958721df385c5c2c8099d6be3522 Mon Sep 17 00:00:00 2001 From: Jang JeongHoon Date: Wed, 9 May 2018 14:50:58 +0900 Subject: [PATCH] [COMMON] clk: samsung: Removed redundant files. Change-Id: I50a7e09efb0c69c97a762c40f648b536af123baa Signed-off-by: Jang JeongHoon --- drivers/clk/samsung/samsung/Kconfig | 47 - drivers/clk/samsung/samsung/Makefile | 32 - drivers/clk/samsung/samsung/clk-cpu.c | 483 -- drivers/clk/samsung/samsung/clk-cpu.h | 75 - .../clk/samsung/samsung/clk-exynos-audss.c | 298 - .../clk/samsung/samsung/clk-exynos-clkout.c | 165 - drivers/clk/samsung/samsung/clk-exynos3250.c | 1101 ---- drivers/clk/samsung/samsung/clk-exynos4.c | 1573 ----- drivers/clk/samsung/samsung/clk-exynos4415.c | 1022 ---- drivers/clk/samsung/samsung/clk-exynos5250.c | 868 --- drivers/clk/samsung/samsung/clk-exynos5260.c | 1843 ------ drivers/clk/samsung/samsung/clk-exynos5260.h | 459 -- drivers/clk/samsung/samsung/clk-exynos5410.c | 280 - drivers/clk/samsung/samsung/clk-exynos5420.c | 1464 ----- drivers/clk/samsung/samsung/clk-exynos5433.c | 5409 ----------------- drivers/clk/samsung/samsung/clk-exynos5440.c | 159 - drivers/clk/samsung/samsung/clk-exynos7.c | 1315 ---- drivers/clk/samsung/samsung/clk-exynos8895.c | 694 --- drivers/clk/samsung/samsung/clk-exynos9610.c | 378 -- drivers/clk/samsung/samsung/clk-exynos9810.c | 557 -- .../clk/samsung/samsung/clk-exynos9810_evt0.c | 559 -- drivers/clk/samsung/samsung/clk-pll.c | 1375 ----- drivers/clk/samsung/samsung/clk-pll.h | 110 - .../clk/samsung/samsung/clk-s3c2410-dclk.c | 443 -- drivers/clk/samsung/samsung/clk-s3c2410.c | 485 -- drivers/clk/samsung/samsung/clk-s3c2412.c | 301 - drivers/clk/samsung/samsung/clk-s3c2443.c | 483 -- drivers/clk/samsung/samsung/clk-s3c64xx.c | 537 -- .../clk/samsung/samsung/clk-s5pv210-audss.c | 215 - drivers/clk/samsung/samsung/clk-s5pv210.c | 854 --- drivers/clk/samsung/samsung/clk.c | 425 -- drivers/clk/samsung/samsung/clk.h | 416 -- drivers/clk/samsung/samsung/composite.c | 1750 ------ drivers/clk/samsung/samsung/composite.h | 535 -- 34 files changed, 26710 deletions(-) delete mode 100644 drivers/clk/samsung/samsung/Kconfig delete mode 100644 drivers/clk/samsung/samsung/Makefile delete mode 100644 drivers/clk/samsung/samsung/clk-cpu.c delete mode 100644 drivers/clk/samsung/samsung/clk-cpu.h delete mode 100644 drivers/clk/samsung/samsung/clk-exynos-audss.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos-clkout.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos3250.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos4.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos4415.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos5250.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos5260.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos5260.h delete mode 100644 drivers/clk/samsung/samsung/clk-exynos5410.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos5420.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos5433.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos5440.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos7.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos8895.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos9610.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos9810.c delete mode 100644 drivers/clk/samsung/samsung/clk-exynos9810_evt0.c delete mode 100644 drivers/clk/samsung/samsung/clk-pll.c delete mode 100644 drivers/clk/samsung/samsung/clk-pll.h delete mode 100644 drivers/clk/samsung/samsung/clk-s3c2410-dclk.c delete mode 100644 drivers/clk/samsung/samsung/clk-s3c2410.c delete mode 100644 drivers/clk/samsung/samsung/clk-s3c2412.c delete mode 100644 drivers/clk/samsung/samsung/clk-s3c2443.c delete mode 100644 drivers/clk/samsung/samsung/clk-s3c64xx.c delete mode 100644 drivers/clk/samsung/samsung/clk-s5pv210-audss.c delete mode 100644 drivers/clk/samsung/samsung/clk-s5pv210.c delete mode 100644 drivers/clk/samsung/samsung/clk.c delete mode 100644 drivers/clk/samsung/samsung/clk.h delete mode 100644 drivers/clk/samsung/samsung/composite.c delete mode 100644 drivers/clk/samsung/samsung/composite.h diff --git a/drivers/clk/samsung/samsung/Kconfig b/drivers/clk/samsung/samsung/Kconfig deleted file mode 100644 index dc14633a4a06..000000000000 --- a/drivers/clk/samsung/samsung/Kconfig +++ /dev/null @@ -1,47 +0,0 @@ -# Recent Exynos platforms should just select COMMON_CLK_SAMSUNG: -config COMMON_CLK_SAMSUNG - bool "Samsung Exynos clock controller support" if COMPILE_TEST - # Clocks on ARM64 SoCs (e.g. Exynos5433, Exynos7) are chosen by - # EXYNOS_ARM64_COMMON_CLK to avoid building them on ARMv7: - select EXYNOS_ARM64_COMMON_CLK if ARM64 && ARCH_EXYNOS - -config COMPOSITE_CLK_SAMSUNG - bool - default y - depends on ARCH_EXYNOS9 || ARCH_EXYNOS8 || ARCH_EXYNOS7 - -config EXYNOS_ARM64_COMMON_CLK - bool "Samsung Exynos ARMv8-family clock controller support" if COMPILE_TEST - depends on COMMON_CLK_SAMSUNG - -config EXYNOS_AUDSS_CLK_CON - tristate "Samsung Exynos AUDSS clock controller support" - depends on COMMON_CLK_SAMSUNG - default y if ARCH_EXYNOS - help - Support for the Audio Subsystem CLKCON clock controller present - on some Exynos SoC variants. Choose M or Y here if you want to - use audio devices such as I2S, PCM, etc. - -# For S3C24XX platforms, select following symbols: -config S3C2410_COMMON_CLK - bool "Samsung S3C2410 clock controller support" if COMPILE_TEST - select COMMON_CLK_SAMSUNG - help - Build the s3c2410 clock driver based on the common clock framework. - -config S3C2410_COMMON_DCLK - bool - select COMMON_CLK_SAMSUNG - select REGMAP_MMIO - help - Temporary symbol to build the dclk driver based on the common clock - framework. - -config S3C2412_COMMON_CLK - bool "Samsung S3C2412 clock controller support" if COMPILE_TEST - select COMMON_CLK_SAMSUNG - -config S3C2443_COMMON_CLK - bool "Samsung S3C2443 clock controller support" if COMPILE_TEST - select COMMON_CLK_SAMSUNG diff --git a/drivers/clk/samsung/samsung/Makefile b/drivers/clk/samsung/samsung/Makefile deleted file mode 100644 index d4cc48edba99..000000000000 --- a/drivers/clk/samsung/samsung/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -# -# Samsung Clock specific Makefile -# - -obj-$(CONFIG_SOC_EXYNOS3250) += clk-exynos3250.o -obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4.o -obj-$(CONFIG_SOC_EXYNOS4415) += clk-exynos4415.o -obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o -obj-$(CONFIG_SOC_EXYNOS5260) += clk-exynos5260.o -obj-$(CONFIG_SOC_EXYNOS5410) += clk-exynos5410.o -obj-$(CONFIG_SOC_EXYNOS5420) += clk-exynos5420.o -obj-$(CONFIG_SOC_EXYNOS5440) += clk-exynos5440.o -obj-$(CONFIG_EXYNOS_AUDSS_CLK_CON) += clk-exynos-audss.o -ifeq ($(CONFIG_COMPOSITE_CLK_SAMSUNG), y) - obj-y += composite.o - obj-$(CONFIG_SOC_EXYNOS8890) += clk-exynos8890.o - obj-$(CONFIG_SOC_EXYNOS8895) += clk-exynos8895.o - obj-$(CONFIG_SOC_EXYNOS9810_EVT1) += clk-exynos9810.o - obj-$(CONFIG_SOC_EXYNOS9810_EVT0) += clk-exynos9810_evt0.o - obj-$(CONFIG_SOC_EXYNOS9610) += clk-exynos9610.o -else - obj-$(CONFIG_COMMON_CLK) += clk.o clk-pll.o clk-cpu.o -obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) += clk-exynos5433.o -obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) += clk-exynos7.o -endif -obj-$(CONFIG_ARCH_EXYNOS) += clk-exynos-clkout.o -obj-$(CONFIG_S3C2410_COMMON_CLK)+= clk-s3c2410.o -obj-$(CONFIG_S3C2410_COMMON_DCLK)+= clk-s3c2410-dclk.o -obj-$(CONFIG_S3C2412_COMMON_CLK)+= clk-s3c2412.o -obj-$(CONFIG_S3C2443_COMMON_CLK)+= clk-s3c2443.o -obj-$(CONFIG_ARCH_S3C64XX) += clk-s3c64xx.o -obj-$(CONFIG_ARCH_S5PV210) += clk-s5pv210.o clk-s5pv210-audss.o diff --git a/drivers/clk/samsung/samsung/clk-cpu.c b/drivers/clk/samsung/samsung/clk-cpu.c deleted file mode 100644 index 8bf7e805fd34..000000000000 --- a/drivers/clk/samsung/samsung/clk-cpu.c +++ /dev/null @@ -1,483 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * Author: Thomas Abraham - * - * Copyright (c) 2015 Samsung Electronics Co., Ltd. - * Bartlomiej Zolnierkiewicz - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This file contains the utility function to register CPU clock for Samsung - * Exynos platforms. A CPU clock is defined as a clock supplied to a CPU or a - * group of CPUs. The CPU clock is typically derived from a hierarchy of clock - * blocks which includes mux and divider blocks. There are a number of other - * auxiliary clocks supplied to the CPU domain such as the debug blocks and AXI - * clock for CPU domain. The rates of these auxiliary clocks are related to the - * CPU clock rate and this relation is usually specified in the hardware manual - * of the SoC or supplied after the SoC characterization. - * - * The below implementation of the CPU clock allows the rate changes of the CPU - * clock and the corresponding rate changes of the auxillary clocks of the CPU - * domain. The platform clock driver provides a clock register configuration - * for each configurable rate which is then used to program the clock hardware - * registers to acheive a fast co-oridinated rate change for all the CPU domain - * clocks. - * - * On a rate change request for the CPU clock, the rate change is propagated - * upto the PLL supplying the clock to the CPU domain clock blocks. While the - * CPU domain PLL is reconfigured, the CPU domain clocks are driven using an - * alternate clock source. If required, the alternate clock source is divided - * down in order to keep the output clock rate within the previous OPP limits. -*/ - -#include -#include -#include -#include -#include "clk-cpu.h" - -#define E4210_SRC_CPU 0x0 -#define E4210_STAT_CPU 0x200 -#define E4210_DIV_CPU0 0x300 -#define E4210_DIV_CPU1 0x304 -#define E4210_DIV_STAT_CPU0 0x400 -#define E4210_DIV_STAT_CPU1 0x404 - -#define E5433_MUX_SEL2 0x008 -#define E5433_MUX_STAT2 0x208 -#define E5433_DIV_CPU0 0x400 -#define E5433_DIV_CPU1 0x404 -#define E5433_DIV_STAT_CPU0 0x500 -#define E5433_DIV_STAT_CPU1 0x504 - -#define E4210_DIV0_RATIO0_MASK 0x7 -#define E4210_DIV1_HPM_MASK (0x7 << 4) -#define E4210_DIV1_COPY_MASK (0x7 << 0) -#define E4210_MUX_HPM_MASK (1 << 20) -#define E4210_DIV0_ATB_SHIFT 16 -#define E4210_DIV0_ATB_MASK (DIV_MASK << E4210_DIV0_ATB_SHIFT) - -#define MAX_DIV 8 -#define DIV_MASK 7 -#define DIV_MASK_ALL 0xffffffff -#define MUX_MASK 7 - -/* - * Helper function to wait until divider(s) have stabilized after the divider - * value has changed. - */ -static void wait_until_divider_stable(void __iomem *div_reg, unsigned long mask) -{ - unsigned long timeout = jiffies + msecs_to_jiffies(10); - - do { - if (!(readl(div_reg) & mask)) - return; - } while (time_before(jiffies, timeout)); - - if (!(readl(div_reg) & mask)) - return; - - pr_err("%s: timeout in divider stablization\n", __func__); -} - -/* - * Helper function to wait until mux has stabilized after the mux selection - * value was changed. - */ -static void wait_until_mux_stable(void __iomem *mux_reg, u32 mux_pos, - unsigned long mux_value) -{ - unsigned long timeout = jiffies + msecs_to_jiffies(10); - - do { - if (((readl(mux_reg) >> mux_pos) & MUX_MASK) == mux_value) - return; - } while (time_before(jiffies, timeout)); - - if (((readl(mux_reg) >> mux_pos) & MUX_MASK) == mux_value) - return; - - pr_err("%s: re-parenting mux timed-out\n", __func__); -} - -/* common round rate callback useable for all types of CPU clocks */ -static long exynos_cpuclk_round_rate(struct clk_hw *hw, - unsigned long drate, unsigned long *prate) -{ - struct clk_hw *parent = clk_hw_get_parent(hw); - *prate = clk_hw_round_rate(parent, drate); - return *prate; -} - -/* common recalc rate callback useable for all types of CPU clocks */ -static unsigned long exynos_cpuclk_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - /* - * The CPU clock output (armclk) rate is the same as its parent - * rate. Although there exist certain dividers inside the CPU - * clock block that could be used to divide the parent clock, - * the driver does not make use of them currently, except during - * frequency transitions. - */ - return parent_rate; -} - -static const struct clk_ops exynos_cpuclk_clk_ops = { - .recalc_rate = exynos_cpuclk_recalc_rate, - .round_rate = exynos_cpuclk_round_rate, -}; - -/* - * Helper function to set the 'safe' dividers for the CPU clock. The parameters - * div and mask contain the divider value and the register bit mask of the - * dividers to be programmed. - */ -static void exynos_set_safe_div(void __iomem *base, unsigned long div, - unsigned long mask) -{ - unsigned long div0; - - div0 = readl(base + E4210_DIV_CPU0); - div0 = (div0 & ~mask) | (div & mask); - writel(div0, base + E4210_DIV_CPU0); - wait_until_divider_stable(base + E4210_DIV_STAT_CPU0, mask); -} - -/* handler for pre-rate change notification from parent clock */ -static int exynos_cpuclk_pre_rate_change(struct clk_notifier_data *ndata, - struct exynos_cpuclk *cpuclk, void __iomem *base) -{ - const struct exynos_cpuclk_cfg_data *cfg_data = cpuclk->cfg; - unsigned long alt_prate = clk_get_rate(cpuclk->alt_parent); - unsigned long alt_div = 0, alt_div_mask = DIV_MASK; - unsigned long div0, div1 = 0, mux_reg; - unsigned long flags; - - /* find out the divider values to use for clock data */ - while ((cfg_data->prate * 1000) != ndata->new_rate) { - if (cfg_data->prate == 0) - return -EINVAL; - cfg_data++; - } - - spin_lock_irqsave(cpuclk->lock, flags); - - /* - * For the selected PLL clock frequency, get the pre-defined divider - * values. If the clock for sclk_hpm is not sourced from apll, then - * the values for DIV_COPY and DIV_HPM dividers need not be set. - */ - div0 = cfg_data->div0; - if (cpuclk->flags & CLK_CPU_HAS_DIV1) { - div1 = cfg_data->div1; - if (readl(base + E4210_SRC_CPU) & E4210_MUX_HPM_MASK) - div1 = readl(base + E4210_DIV_CPU1) & - (E4210_DIV1_HPM_MASK | E4210_DIV1_COPY_MASK); - } - - /* - * If the old parent clock speed is less than the clock speed of - * the alternate parent, then it should be ensured that at no point - * the armclk speed is more than the old_prate until the dividers are - * set. Also workaround the issue of the dividers being set to lower - * values before the parent clock speed is set to new lower speed - * (this can result in too high speed of armclk output clocks). - */ - if (alt_prate > ndata->old_rate || ndata->old_rate > ndata->new_rate) { - unsigned long tmp_rate = min(ndata->old_rate, ndata->new_rate); - - alt_div = DIV_ROUND_UP(alt_prate, tmp_rate) - 1; - WARN_ON(alt_div >= MAX_DIV); - - if (cpuclk->flags & CLK_CPU_NEEDS_DEBUG_ALT_DIV) { - /* - * In Exynos4210, ATB clock parent is also mout_core. So - * ATB clock also needs to be mantained at safe speed. - */ - alt_div |= E4210_DIV0_ATB_MASK; - alt_div_mask |= E4210_DIV0_ATB_MASK; - } - exynos_set_safe_div(base, alt_div, alt_div_mask); - div0 |= alt_div; - } - - /* select sclk_mpll as the alternate parent */ - mux_reg = readl(base + E4210_SRC_CPU); - writel(mux_reg | (1 << 16), base + E4210_SRC_CPU); - wait_until_mux_stable(base + E4210_STAT_CPU, 16, 2); - - /* alternate parent is active now. set the dividers */ - writel(div0, base + E4210_DIV_CPU0); - wait_until_divider_stable(base + E4210_DIV_STAT_CPU0, DIV_MASK_ALL); - - if (cpuclk->flags & CLK_CPU_HAS_DIV1) { - writel(div1, base + E4210_DIV_CPU1); - wait_until_divider_stable(base + E4210_DIV_STAT_CPU1, - DIV_MASK_ALL); - } - - spin_unlock_irqrestore(cpuclk->lock, flags); - return 0; -} - -/* handler for post-rate change notification from parent clock */ -static int exynos_cpuclk_post_rate_change(struct clk_notifier_data *ndata, - struct exynos_cpuclk *cpuclk, void __iomem *base) -{ - const struct exynos_cpuclk_cfg_data *cfg_data = cpuclk->cfg; - unsigned long div = 0, div_mask = DIV_MASK; - unsigned long mux_reg; - unsigned long flags; - - /* find out the divider values to use for clock data */ - if (cpuclk->flags & CLK_CPU_NEEDS_DEBUG_ALT_DIV) { - while ((cfg_data->prate * 1000) != ndata->new_rate) { - if (cfg_data->prate == 0) - return -EINVAL; - cfg_data++; - } - } - - spin_lock_irqsave(cpuclk->lock, flags); - - /* select mout_apll as the alternate parent */ - mux_reg = readl(base + E4210_SRC_CPU); - writel(mux_reg & ~(1 << 16), base + E4210_SRC_CPU); - wait_until_mux_stable(base + E4210_STAT_CPU, 16, 1); - - if (cpuclk->flags & CLK_CPU_NEEDS_DEBUG_ALT_DIV) { - div |= (cfg_data->div0 & E4210_DIV0_ATB_MASK); - div_mask |= E4210_DIV0_ATB_MASK; - } - - exynos_set_safe_div(base, div, div_mask); - spin_unlock_irqrestore(cpuclk->lock, flags); - return 0; -} - -/* - * Helper function to set the 'safe' dividers for the CPU clock. The parameters - * div and mask contain the divider value and the register bit mask of the - * dividers to be programmed. - */ -static void exynos5433_set_safe_div(void __iomem *base, unsigned long div, - unsigned long mask) -{ - unsigned long div0; - - div0 = readl(base + E5433_DIV_CPU0); - div0 = (div0 & ~mask) | (div & mask); - writel(div0, base + E5433_DIV_CPU0); - wait_until_divider_stable(base + E5433_DIV_STAT_CPU0, mask); -} - -/* handler for pre-rate change notification from parent clock */ -static int exynos5433_cpuclk_pre_rate_change(struct clk_notifier_data *ndata, - struct exynos_cpuclk *cpuclk, void __iomem *base) -{ - const struct exynos_cpuclk_cfg_data *cfg_data = cpuclk->cfg; - unsigned long alt_prate = clk_get_rate(cpuclk->alt_parent); - unsigned long alt_div = 0, alt_div_mask = DIV_MASK; - unsigned long div0, div1 = 0, mux_reg; - unsigned long flags; - - /* find out the divider values to use for clock data */ - while ((cfg_data->prate * 1000) != ndata->new_rate) { - if (cfg_data->prate == 0) - return -EINVAL; - cfg_data++; - } - - spin_lock_irqsave(cpuclk->lock, flags); - - /* - * For the selected PLL clock frequency, get the pre-defined divider - * values. - */ - div0 = cfg_data->div0; - div1 = cfg_data->div1; - - /* - * If the old parent clock speed is less than the clock speed of - * the alternate parent, then it should be ensured that at no point - * the armclk speed is more than the old_prate until the dividers are - * set. Also workaround the issue of the dividers being set to lower - * values before the parent clock speed is set to new lower speed - * (this can result in too high speed of armclk output clocks). - */ - if (alt_prate > ndata->old_rate || ndata->old_rate > ndata->new_rate) { - unsigned long tmp_rate = min(ndata->old_rate, ndata->new_rate); - - alt_div = DIV_ROUND_UP(alt_prate, tmp_rate) - 1; - WARN_ON(alt_div >= MAX_DIV); - - exynos5433_set_safe_div(base, alt_div, alt_div_mask); - div0 |= alt_div; - } - - /* select the alternate parent */ - mux_reg = readl(base + E5433_MUX_SEL2); - writel(mux_reg | 1, base + E5433_MUX_SEL2); - wait_until_mux_stable(base + E5433_MUX_STAT2, 0, 2); - - /* alternate parent is active now. set the dividers */ - writel(div0, base + E5433_DIV_CPU0); - wait_until_divider_stable(base + E5433_DIV_STAT_CPU0, DIV_MASK_ALL); - - writel(div1, base + E5433_DIV_CPU1); - wait_until_divider_stable(base + E5433_DIV_STAT_CPU1, DIV_MASK_ALL); - - spin_unlock_irqrestore(cpuclk->lock, flags); - return 0; -} - -/* handler for post-rate change notification from parent clock */ -static int exynos5433_cpuclk_post_rate_change(struct clk_notifier_data *ndata, - struct exynos_cpuclk *cpuclk, void __iomem *base) -{ - unsigned long div = 0, div_mask = DIV_MASK; - unsigned long mux_reg; - unsigned long flags; - - spin_lock_irqsave(cpuclk->lock, flags); - - /* select apll as the alternate parent */ - mux_reg = readl(base + E5433_MUX_SEL2); - writel(mux_reg & ~1, base + E5433_MUX_SEL2); - wait_until_mux_stable(base + E5433_MUX_STAT2, 0, 1); - - exynos5433_set_safe_div(base, div, div_mask); - spin_unlock_irqrestore(cpuclk->lock, flags); - return 0; -} - -/* - * This notifier function is called for the pre-rate and post-rate change - * notifications of the parent clock of cpuclk. - */ -static int exynos_cpuclk_notifier_cb(struct notifier_block *nb, - unsigned long event, void *data) -{ - struct clk_notifier_data *ndata = data; - struct exynos_cpuclk *cpuclk; - void __iomem *base; - int err = 0; - - cpuclk = container_of(nb, struct exynos_cpuclk, clk_nb); - base = cpuclk->ctrl_base; - - if (event == PRE_RATE_CHANGE) - err = exynos_cpuclk_pre_rate_change(ndata, cpuclk, base); - else if (event == POST_RATE_CHANGE) - err = exynos_cpuclk_post_rate_change(ndata, cpuclk, base); - - return notifier_from_errno(err); -} - -/* - * This notifier function is called for the pre-rate and post-rate change - * notifications of the parent clock of cpuclk. - */ -static int exynos5433_cpuclk_notifier_cb(struct notifier_block *nb, - unsigned long event, void *data) -{ - struct clk_notifier_data *ndata = data; - struct exynos_cpuclk *cpuclk; - void __iomem *base; - int err = 0; - - cpuclk = container_of(nb, struct exynos_cpuclk, clk_nb); - base = cpuclk->ctrl_base; - - if (event == PRE_RATE_CHANGE) - err = exynos5433_cpuclk_pre_rate_change(ndata, cpuclk, base); - else if (event == POST_RATE_CHANGE) - err = exynos5433_cpuclk_post_rate_change(ndata, cpuclk, base); - - return notifier_from_errno(err); -} - -/* helper function to register a CPU clock */ -int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx, - unsigned int lookup_id, const char *name, const char *parent, - const char *alt_parent, unsigned long offset, - const struct exynos_cpuclk_cfg_data *cfg, - unsigned long num_cfgs, unsigned long flags) -{ - struct exynos_cpuclk *cpuclk; - struct clk_init_data init; - struct clk *clk; - int ret = 0; - - cpuclk = kzalloc(sizeof(*cpuclk), GFP_KERNEL); - if (!cpuclk) - return -ENOMEM; - - init.name = name; - init.flags = CLK_SET_RATE_PARENT; - init.parent_names = &parent; - init.num_parents = 1; - init.ops = &exynos_cpuclk_clk_ops; - - cpuclk->hw.init = &init; - cpuclk->ctrl_base = ctx->reg_base + offset; - cpuclk->lock = &ctx->lock; - cpuclk->flags = flags; - if (flags & CLK_CPU_HAS_E5433_REGS_LAYOUT) - cpuclk->clk_nb.notifier_call = exynos5433_cpuclk_notifier_cb; - else - cpuclk->clk_nb.notifier_call = exynos_cpuclk_notifier_cb; - - cpuclk->alt_parent = __clk_lookup(alt_parent); - if (!cpuclk->alt_parent) { - pr_err("%s: could not lookup alternate parent %s\n", - __func__, alt_parent); - ret = -EINVAL; - goto free_cpuclk; - } - - clk = __clk_lookup(parent); - if (!clk) { - pr_err("%s: could not lookup parent clock %s\n", - __func__, parent); - ret = -EINVAL; - goto free_cpuclk; - } - - ret = clk_notifier_register(clk, &cpuclk->clk_nb); - if (ret) { - pr_err("%s: failed to register clock notifier for %s\n", - __func__, name); - goto free_cpuclk; - } - - cpuclk->cfg = kmemdup(cfg, sizeof(*cfg) * num_cfgs, GFP_KERNEL); - if (!cpuclk->cfg) { - pr_err("%s: could not allocate memory for cpuclk data\n", - __func__); - ret = -ENOMEM; - goto unregister_clk_nb; - } - - clk = clk_register(NULL, &cpuclk->hw); - if (IS_ERR(clk)) { - pr_err("%s: could not register cpuclk %s\n", __func__, name); - ret = PTR_ERR(clk); - goto free_cpuclk_data; - } - - samsung_clk_add_lookup(ctx, clk, lookup_id); - return 0; - -free_cpuclk_data: - kfree(cpuclk->cfg); -unregister_clk_nb: - clk_notifier_unregister(__clk_lookup(parent), &cpuclk->clk_nb); -free_cpuclk: - kfree(cpuclk); - return ret; -} diff --git a/drivers/clk/samsung/samsung/clk-cpu.h b/drivers/clk/samsung/samsung/clk-cpu.h deleted file mode 100644 index d4b6b517fe1b..000000000000 --- a/drivers/clk/samsung/samsung/clk-cpu.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for all PLL's in Samsung platforms -*/ - -#ifndef __SAMSUNG_CLK_CPU_H -#define __SAMSUNG_CLK_CPU_H - -#include "clk.h" - -/** - * struct exynos_cpuclk_data: config data to setup cpu clocks. - * @prate: frequency of the primary parent clock (in KHz). - * @div0: value to be programmed in the div_cpu0 register. - * @div1: value to be programmed in the div_cpu1 register. - * - * This structure holds the divider configuration data for dividers in the CPU - * clock domain. The parent frequency at which these divider values are valid is - * specified in @prate. The @prate is the frequency of the primary parent clock. - * For CPU clock domains that do not have a DIV1 register, the @div1 member - * value is not used. - */ -struct exynos_cpuclk_cfg_data { - unsigned long prate; - unsigned long div0; - unsigned long div1; -}; - -/** - * struct exynos_cpuclk: information about clock supplied to a CPU core. - * @hw: handle between CCF and CPU clock. - * @alt_parent: alternate parent clock to use when switching the speed - * of the primary parent clock. - * @ctrl_base: base address of the clock controller. - * @lock: cpu clock domain register access lock. - * @cfg: cpu clock rate configuration data. - * @num_cfgs: number of array elements in @cfg array. - * @clk_nb: clock notifier registered for changes in clock speed of the - * primary parent clock. - * @flags: configuration flags for the CPU clock. - * - * This structure holds information required for programming the CPU clock for - * various clock speeds. - */ -struct exynos_cpuclk { - struct clk_hw hw; - struct clk *alt_parent; - void __iomem *ctrl_base; - spinlock_t *lock; - const struct exynos_cpuclk_cfg_data *cfg; - const unsigned long num_cfgs; - struct notifier_block clk_nb; - unsigned long flags; - -/* The CPU clock registers have DIV1 configuration register */ -#define CLK_CPU_HAS_DIV1 (1 << 0) -/* When ALT parent is active, debug clocks need safe divider values */ -#define CLK_CPU_NEEDS_DEBUG_ALT_DIV (1 << 1) -/* The CPU clock registers have Exynos5433-compatible layout */ -#define CLK_CPU_HAS_E5433_REGS_LAYOUT (1 << 2) -}; - -extern int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx, - unsigned int lookup_id, const char *name, - const char *parent, const char *alt_parent, - unsigned long offset, - const struct exynos_cpuclk_cfg_data *cfg, - unsigned long num_cfgs, unsigned long flags); - -#endif /* __SAMSUNG_CLK_CPU_H */ diff --git a/drivers/clk/samsung/samsung/clk-exynos-audss.c b/drivers/clk/samsung/samsung/clk-exynos-audss.c deleted file mode 100644 index 17e68a724945..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos-audss.c +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Author: Padmavathi Venna - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Audio Subsystem Clock Controller. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -static DEFINE_SPINLOCK(lock); -static struct clk **clk_table; -static void __iomem *reg_base; -static struct clk_onecell_data clk_data; -/* - * On Exynos5420 this will be a clock which has to be enabled before any - * access to audss registers. Typically a child of EPLL. - * - * On other platforms this will be -ENODEV. - */ -static struct clk *epll; - -#define ASS_CLK_SRC 0x0 -#define ASS_CLK_DIV 0x4 -#define ASS_CLK_GATE 0x8 - -#ifdef CONFIG_PM_SLEEP -static unsigned long reg_save[][2] = { - { ASS_CLK_SRC, 0 }, - { ASS_CLK_DIV, 0 }, - { ASS_CLK_GATE, 0 }, -}; - -static int exynos_audss_clk_suspend(void) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(reg_save); i++) - reg_save[i][1] = readl(reg_base + reg_save[i][0]); - - return 0; -} - -static void exynos_audss_clk_resume(void) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(reg_save); i++) - writel(reg_save[i][1], reg_base + reg_save[i][0]); -} - -static struct syscore_ops exynos_audss_clk_syscore_ops = { - .suspend = exynos_audss_clk_suspend, - .resume = exynos_audss_clk_resume, -}; -#endif /* CONFIG_PM_SLEEP */ - -struct exynos_audss_clk_drvdata { - unsigned int has_adma_clk:1; - unsigned int has_mst_clk:1; - unsigned int enable_epll:1; - unsigned int num_clks; -}; - -static const struct exynos_audss_clk_drvdata exynos4210_drvdata = { - .num_clks = EXYNOS_AUDSS_MAX_CLKS - 1, -}; - -static const struct exynos_audss_clk_drvdata exynos5410_drvdata = { - .num_clks = EXYNOS_AUDSS_MAX_CLKS - 1, - .has_mst_clk = 1, -}; - -static const struct exynos_audss_clk_drvdata exynos5420_drvdata = { - .num_clks = EXYNOS_AUDSS_MAX_CLKS, - .has_adma_clk = 1, - .enable_epll = 1, -}; - -static const struct of_device_id exynos_audss_clk_of_match[] = { - { - .compatible = "samsung,exynos4210-audss-clock", - .data = &exynos4210_drvdata, - }, { - .compatible = "samsung,exynos5250-audss-clock", - .data = &exynos4210_drvdata, - }, { - .compatible = "samsung,exynos5410-audss-clock", - .data = &exynos5410_drvdata, - }, { - .compatible = "samsung,exynos5420-audss-clock", - .data = &exynos5420_drvdata, - }, - { }, -}; -MODULE_DEVICE_TABLE(of, exynos_audss_clk_of_match); - -static void exynos_audss_clk_teardown(void) -{ - int i; - - for (i = EXYNOS_MOUT_AUDSS; i < EXYNOS_DOUT_SRP; i++) { - if (!IS_ERR(clk_table[i])) - clk_unregister_mux(clk_table[i]); - } - - for (; i < EXYNOS_SRP_CLK; i++) { - if (!IS_ERR(clk_table[i])) - clk_unregister_divider(clk_table[i]); - } - - for (; i < clk_data.clk_num; i++) { - if (!IS_ERR(clk_table[i])) - clk_unregister_gate(clk_table[i]); - } -} - -/* register exynos_audss clocks */ -static int exynos_audss_clk_probe(struct platform_device *pdev) -{ - const char *mout_audss_p[] = {"fin_pll", "fout_epll"}; - const char *mout_i2s_p[] = {"mout_audss", "cdclk0", "sclk_audio0"}; - const char *sclk_pcm_p = "sclk_pcm0"; - struct clk *pll_ref, *pll_in, *cdclk, *sclk_audio, *sclk_pcm_in; - const struct exynos_audss_clk_drvdata *variant; - struct resource *res; - int i, ret = 0; - - variant = of_device_get_match_data(&pdev->dev); - if (!variant) - return -EINVAL; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - reg_base = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(reg_base)) { - dev_err(&pdev->dev, "failed to map audss registers\n"); - return PTR_ERR(reg_base); - } - - epll = ERR_PTR(-ENODEV); - - clk_table = devm_kzalloc(&pdev->dev, - sizeof(struct clk *) * EXYNOS_AUDSS_MAX_CLKS, - GFP_KERNEL); - if (!clk_table) - return -ENOMEM; - - clk_data.clks = clk_table; - clk_data.clk_num = variant->num_clks; - - pll_ref = devm_clk_get(&pdev->dev, "pll_ref"); - pll_in = devm_clk_get(&pdev->dev, "pll_in"); - if (!IS_ERR(pll_ref)) - mout_audss_p[0] = __clk_get_name(pll_ref); - if (!IS_ERR(pll_in)) { - mout_audss_p[1] = __clk_get_name(pll_in); - - if (variant->enable_epll) { - epll = pll_in; - - ret = clk_prepare_enable(epll); - if (ret) { - dev_err(&pdev->dev, - "failed to prepare the epll clock\n"); - return ret; - } - } - } - clk_table[EXYNOS_MOUT_AUDSS] = clk_register_mux(NULL, "mout_audss", - mout_audss_p, ARRAY_SIZE(mout_audss_p), - CLK_SET_RATE_NO_REPARENT, - reg_base + ASS_CLK_SRC, 0, 1, 0, &lock); - - cdclk = devm_clk_get(&pdev->dev, "cdclk"); - sclk_audio = devm_clk_get(&pdev->dev, "sclk_audio"); - if (!IS_ERR(cdclk)) - mout_i2s_p[1] = __clk_get_name(cdclk); - if (!IS_ERR(sclk_audio)) - mout_i2s_p[2] = __clk_get_name(sclk_audio); - clk_table[EXYNOS_MOUT_I2S] = clk_register_mux(NULL, "mout_i2s", - mout_i2s_p, ARRAY_SIZE(mout_i2s_p), - CLK_SET_RATE_NO_REPARENT, - reg_base + ASS_CLK_SRC, 2, 2, 0, &lock); - - clk_table[EXYNOS_DOUT_SRP] = clk_register_divider(NULL, "dout_srp", - "mout_audss", 0, reg_base + ASS_CLK_DIV, 0, 4, - 0, &lock); - - clk_table[EXYNOS_DOUT_AUD_BUS] = clk_register_divider(NULL, - "dout_aud_bus", "dout_srp", 0, - reg_base + ASS_CLK_DIV, 4, 4, 0, &lock); - - clk_table[EXYNOS_DOUT_I2S] = clk_register_divider(NULL, "dout_i2s", - "mout_i2s", 0, reg_base + ASS_CLK_DIV, 8, 4, 0, - &lock); - - clk_table[EXYNOS_SRP_CLK] = clk_register_gate(NULL, "srp_clk", - "dout_srp", CLK_SET_RATE_PARENT, - reg_base + ASS_CLK_GATE, 0, 0, &lock); - - clk_table[EXYNOS_I2S_BUS] = clk_register_gate(NULL, "i2s_bus", - "dout_aud_bus", CLK_SET_RATE_PARENT, - reg_base + ASS_CLK_GATE, 2, 0, &lock); - - clk_table[EXYNOS_SCLK_I2S] = clk_register_gate(NULL, "sclk_i2s", - "dout_i2s", CLK_SET_RATE_PARENT, - reg_base + ASS_CLK_GATE, 3, 0, &lock); - - clk_table[EXYNOS_PCM_BUS] = clk_register_gate(NULL, "pcm_bus", - "sclk_pcm", CLK_SET_RATE_PARENT, - reg_base + ASS_CLK_GATE, 4, 0, &lock); - - sclk_pcm_in = devm_clk_get(&pdev->dev, "sclk_pcm_in"); - if (!IS_ERR(sclk_pcm_in)) - sclk_pcm_p = __clk_get_name(sclk_pcm_in); - clk_table[EXYNOS_SCLK_PCM] = clk_register_gate(NULL, "sclk_pcm", - sclk_pcm_p, CLK_SET_RATE_PARENT, - reg_base + ASS_CLK_GATE, 5, 0, &lock); - - if (variant->has_adma_clk) { - clk_table[EXYNOS_ADMA] = clk_register_gate(NULL, "adma", - "dout_srp", CLK_SET_RATE_PARENT, - reg_base + ASS_CLK_GATE, 9, 0, &lock); - } - - for (i = 0; i < clk_data.clk_num; i++) { - if (IS_ERR(clk_table[i])) { - dev_err(&pdev->dev, "failed to register clock %d\n", i); - ret = PTR_ERR(clk_table[i]); - goto unregister; - } - } - - ret = of_clk_add_provider(pdev->dev.of_node, of_clk_src_onecell_get, - &clk_data); - if (ret) { - dev_err(&pdev->dev, "failed to add clock provider\n"); - goto unregister; - } - -#ifdef CONFIG_PM_SLEEP - register_syscore_ops(&exynos_audss_clk_syscore_ops); -#endif - return 0; - -unregister: - exynos_audss_clk_teardown(); - - if (!IS_ERR(epll)) - clk_disable_unprepare(epll); - - return ret; -} - -static int exynos_audss_clk_remove(struct platform_device *pdev) -{ -#ifdef CONFIG_PM_SLEEP - unregister_syscore_ops(&exynos_audss_clk_syscore_ops); -#endif - - of_clk_del_provider(pdev->dev.of_node); - - exynos_audss_clk_teardown(); - - if (!IS_ERR(epll)) - clk_disable_unprepare(epll); - - return 0; -} - -static struct platform_driver exynos_audss_clk_driver = { - .driver = { - .name = "exynos-audss-clk", - .of_match_table = exynos_audss_clk_of_match, - }, - .probe = exynos_audss_clk_probe, - .remove = exynos_audss_clk_remove, -}; - -module_platform_driver(exynos_audss_clk_driver); - -MODULE_AUTHOR("Padmavathi Venna "); -MODULE_DESCRIPTION("Exynos Audio Subsystem Clock Controller"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:exynos-audss-clk"); diff --git a/drivers/clk/samsung/samsung/clk-exynos-clkout.c b/drivers/clk/samsung/samsung/clk-exynos-clkout.c deleted file mode 100644 index 6c6afb87b4ce..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos-clkout.c +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * Author: Tomasz Figa - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Clock driver for Exynos clock output - */ - -#include -#include -#include -#include -#include -#include - -#define EXYNOS_CLKOUT_NR_CLKS 1 -#define EXYNOS_CLKOUT_PARENTS 32 - -#define EXYNOS_PMU_DEBUG_REG 0xa00 -#define EXYNOS_CLKOUT_DISABLE_SHIFT 0 -#define EXYNOS_CLKOUT_MUX_SHIFT 8 -#define EXYNOS4_CLKOUT_MUX_MASK 0xf -#define EXYNOS5_CLKOUT_MUX_MASK 0x1f - -struct exynos_clkout { - struct clk_gate gate; - struct clk_mux mux; - spinlock_t slock; - struct clk_onecell_data data; - struct clk *clk_table[EXYNOS_CLKOUT_NR_CLKS]; - void __iomem *reg; - u32 pmu_debug_save; -}; - -static struct exynos_clkout *clkout; - -static int exynos_clkout_suspend(void) -{ - clkout->pmu_debug_save = readl(clkout->reg + EXYNOS_PMU_DEBUG_REG); - - return 0; -} - -static void exynos_clkout_resume(void) -{ - writel(clkout->pmu_debug_save, clkout->reg + EXYNOS_PMU_DEBUG_REG); -} - -static struct syscore_ops exynos_clkout_syscore_ops = { - .suspend = exynos_clkout_suspend, - .resume = exynos_clkout_resume, -}; - -static void __init exynos_clkout_init(struct device_node *node, u32 mux_mask) -{ - const char *parent_names[EXYNOS_CLKOUT_PARENTS]; - struct clk *parents[EXYNOS_CLKOUT_PARENTS]; - int parent_count; - int ret; - int i; - - clkout = kzalloc(sizeof(*clkout), GFP_KERNEL); - if (!clkout) - return; - - spin_lock_init(&clkout->slock); - - parent_count = 0; - for (i = 0; i < EXYNOS_CLKOUT_PARENTS; ++i) { - char name[] = "clkoutXX"; - - snprintf(name, sizeof(name), "clkout%d", i); - parents[i] = of_clk_get_by_name(node, name); - if (IS_ERR(parents[i])) { - parent_names[i] = "none"; - continue; - } - - parent_names[i] = __clk_get_name(parents[i]); - parent_count = i + 1; - } - - if (!parent_count) - goto free_clkout; - - clkout->reg = of_iomap(node, 0); - if (!clkout->reg) - goto clks_put; - - clkout->gate.reg = clkout->reg + EXYNOS_PMU_DEBUG_REG; - clkout->gate.bit_idx = EXYNOS_CLKOUT_DISABLE_SHIFT; - clkout->gate.flags = CLK_GATE_SET_TO_DISABLE; - clkout->gate.lock = &clkout->slock; - - clkout->mux.reg = clkout->reg + EXYNOS_PMU_DEBUG_REG; - clkout->mux.mask = mux_mask; - clkout->mux.shift = EXYNOS_CLKOUT_MUX_SHIFT; - clkout->mux.lock = &clkout->slock; - - clkout->clk_table[0] = clk_register_composite(NULL, "clkout", - parent_names, parent_count, &clkout->mux.hw, - &clk_mux_ops, NULL, NULL, &clkout->gate.hw, - &clk_gate_ops, CLK_SET_RATE_PARENT - | CLK_SET_RATE_NO_REPARENT); - if (IS_ERR(clkout->clk_table[0])) - goto err_unmap; - - clkout->data.clks = clkout->clk_table; - clkout->data.clk_num = EXYNOS_CLKOUT_NR_CLKS; - ret = of_clk_add_provider(node, of_clk_src_onecell_get, &clkout->data); - if (ret) - goto err_clk_unreg; - - register_syscore_ops(&exynos_clkout_syscore_ops); - - return; - -err_clk_unreg: - clk_unregister(clkout->clk_table[0]); -err_unmap: - iounmap(clkout->reg); -clks_put: - for (i = 0; i < EXYNOS_CLKOUT_PARENTS; ++i) - if (!IS_ERR(parents[i])) - clk_put(parents[i]); -free_clkout: - kfree(clkout); - - pr_err("%s: failed to register clkout clock\n", __func__); -} - -/* - * We use CLK_OF_DECLARE_DRIVER initialization method to avoid setting - * the OF_POPULATED flag on the pmu device tree node, so later the - * Exynos PMU platform device can be properly probed with PMU driver. - */ - -static void __init exynos4_clkout_init(struct device_node *node) -{ - exynos_clkout_init(node, EXYNOS4_CLKOUT_MUX_MASK); -} -CLK_OF_DECLARE_DRIVER(exynos4210_clkout, "samsung,exynos4210-pmu", - exynos4_clkout_init); -CLK_OF_DECLARE_DRIVER(exynos4212_clkout, "samsung,exynos4212-pmu", - exynos4_clkout_init); -CLK_OF_DECLARE_DRIVER(exynos4412_clkout, "samsung,exynos4412-pmu", - exynos4_clkout_init); -CLK_OF_DECLARE_DRIVER(exynos3250_clkout, "samsung,exynos3250-pmu", - exynos4_clkout_init); - -static void __init exynos5_clkout_init(struct device_node *node) -{ - exynos_clkout_init(node, EXYNOS5_CLKOUT_MUX_MASK); -} -CLK_OF_DECLARE_DRIVER(exynos5250_clkout, "samsung,exynos5250-pmu", - exynos5_clkout_init); -CLK_OF_DECLARE_DRIVER(exynos5410_clkout, "samsung,exynos5410-pmu", - exynos5_clkout_init); -CLK_OF_DECLARE_DRIVER(exynos5420_clkout, "samsung,exynos5420-pmu", - exynos5_clkout_init); -CLK_OF_DECLARE_DRIVER(exynos5433_clkout, "samsung,exynos5433-pmu", - exynos5_clkout_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos3250.c b/drivers/clk/samsung/samsung/clk-exynos3250.c deleted file mode 100644 index 1b81e283f605..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos3250.c +++ /dev/null @@ -1,1101 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos3250 SoC. - */ - -#include -#include -#include -#include -#include - -#include - -#include "clk.h" -#include "clk-cpu.h" -#include "clk-pll.h" - -#define SRC_LEFTBUS 0x4200 -#define DIV_LEFTBUS 0x4500 -#define GATE_IP_LEFTBUS 0x4800 -#define SRC_RIGHTBUS 0x8200 -#define DIV_RIGHTBUS 0x8500 -#define GATE_IP_RIGHTBUS 0x8800 -#define GATE_IP_PERIR 0x8960 -#define MPLL_LOCK 0xc010 -#define MPLL_CON0 0xc110 -#define VPLL_LOCK 0xc020 -#define VPLL_CON0 0xc120 -#define UPLL_LOCK 0xc030 -#define UPLL_CON0 0xc130 -#define SRC_TOP0 0xc210 -#define SRC_TOP1 0xc214 -#define SRC_CAM 0xc220 -#define SRC_MFC 0xc228 -#define SRC_G3D 0xc22c -#define SRC_LCD 0xc234 -#define SRC_ISP 0xc238 -#define SRC_FSYS 0xc240 -#define SRC_PERIL0 0xc250 -#define SRC_PERIL1 0xc254 -#define SRC_MASK_TOP 0xc310 -#define SRC_MASK_CAM 0xc320 -#define SRC_MASK_LCD 0xc334 -#define SRC_MASK_ISP 0xc338 -#define SRC_MASK_FSYS 0xc340 -#define SRC_MASK_PERIL0 0xc350 -#define SRC_MASK_PERIL1 0xc354 -#define DIV_TOP 0xc510 -#define DIV_CAM 0xc520 -#define DIV_MFC 0xc528 -#define DIV_G3D 0xc52c -#define DIV_LCD 0xc534 -#define DIV_ISP 0xc538 -#define DIV_FSYS0 0xc540 -#define DIV_FSYS1 0xc544 -#define DIV_FSYS2 0xc548 -#define DIV_PERIL0 0xc550 -#define DIV_PERIL1 0xc554 -#define DIV_PERIL3 0xc55c -#define DIV_PERIL4 0xc560 -#define DIV_PERIL5 0xc564 -#define DIV_CAM1 0xc568 -#define CLKDIV2_RATIO 0xc580 -#define GATE_SCLK_CAM 0xc820 -#define GATE_SCLK_MFC 0xc828 -#define GATE_SCLK_G3D 0xc82c -#define GATE_SCLK_LCD 0xc834 -#define GATE_SCLK_ISP_TOP 0xc838 -#define GATE_SCLK_FSYS 0xc840 -#define GATE_SCLK_PERIL 0xc850 -#define GATE_IP_CAM 0xc920 -#define GATE_IP_MFC 0xc928 -#define GATE_IP_G3D 0xc92c -#define GATE_IP_LCD 0xc934 -#define GATE_IP_ISP 0xc938 -#define GATE_IP_FSYS 0xc940 -#define GATE_IP_PERIL 0xc950 -#define GATE_BLOCK 0xc970 -#define APLL_LOCK 0x14000 -#define APLL_CON0 0x14100 -#define SRC_CPU 0x14200 -#define DIV_CPU0 0x14500 -#define DIV_CPU1 0x14504 -#define PWR_CTRL1 0x15020 -#define PWR_CTRL2 0x15024 - -/* Below definitions are used for PWR_CTRL settings */ -#define PWR_CTRL1_CORE2_DOWN_RATIO(x) (((x) & 0x7) << 28) -#define PWR_CTRL1_CORE1_DOWN_RATIO(x) (((x) & 0x7) << 16) -#define PWR_CTRL1_DIV2_DOWN_EN (1 << 9) -#define PWR_CTRL1_DIV1_DOWN_EN (1 << 8) -#define PWR_CTRL1_USE_CORE3_WFE (1 << 7) -#define PWR_CTRL1_USE_CORE2_WFE (1 << 6) -#define PWR_CTRL1_USE_CORE1_WFE (1 << 5) -#define PWR_CTRL1_USE_CORE0_WFE (1 << 4) -#define PWR_CTRL1_USE_CORE3_WFI (1 << 3) -#define PWR_CTRL1_USE_CORE2_WFI (1 << 2) -#define PWR_CTRL1_USE_CORE1_WFI (1 << 1) -#define PWR_CTRL1_USE_CORE0_WFI (1 << 0) - -static const unsigned long exynos3250_cmu_clk_regs[] __initconst = { - SRC_LEFTBUS, - DIV_LEFTBUS, - GATE_IP_LEFTBUS, - SRC_RIGHTBUS, - DIV_RIGHTBUS, - GATE_IP_RIGHTBUS, - GATE_IP_PERIR, - MPLL_LOCK, - MPLL_CON0, - VPLL_LOCK, - VPLL_CON0, - UPLL_LOCK, - UPLL_CON0, - SRC_TOP0, - SRC_TOP1, - SRC_CAM, - SRC_MFC, - SRC_G3D, - SRC_LCD, - SRC_ISP, - SRC_FSYS, - SRC_PERIL0, - SRC_PERIL1, - SRC_MASK_TOP, - SRC_MASK_CAM, - SRC_MASK_LCD, - SRC_MASK_ISP, - SRC_MASK_FSYS, - SRC_MASK_PERIL0, - SRC_MASK_PERIL1, - DIV_TOP, - DIV_CAM, - DIV_MFC, - DIV_G3D, - DIV_LCD, - DIV_ISP, - DIV_FSYS0, - DIV_FSYS1, - DIV_FSYS2, - DIV_PERIL0, - DIV_PERIL1, - DIV_PERIL3, - DIV_PERIL4, - DIV_PERIL5, - DIV_CAM1, - CLKDIV2_RATIO, - GATE_SCLK_CAM, - GATE_SCLK_MFC, - GATE_SCLK_G3D, - GATE_SCLK_LCD, - GATE_SCLK_ISP_TOP, - GATE_SCLK_FSYS, - GATE_SCLK_PERIL, - GATE_IP_CAM, - GATE_IP_MFC, - GATE_IP_G3D, - GATE_IP_LCD, - GATE_IP_ISP, - GATE_IP_FSYS, - GATE_IP_PERIL, - GATE_BLOCK, - APLL_LOCK, - SRC_CPU, - DIV_CPU0, - DIV_CPU1, - PWR_CTRL1, - PWR_CTRL2, -}; - -/* list of all parent clock list */ -PNAME(mout_vpllsrc_p) = { "fin_pll", }; - -PNAME(mout_apll_p) = { "fin_pll", "fout_apll", }; -PNAME(mout_mpll_p) = { "fin_pll", "fout_mpll", }; -PNAME(mout_vpll_p) = { "fin_pll", "fout_vpll", }; -PNAME(mout_upll_p) = { "fin_pll", "fout_upll", }; - -PNAME(mout_mpll_user_p) = { "fin_pll", "div_mpll_pre", }; -PNAME(mout_epll_user_p) = { "fin_pll", "mout_epll", }; -PNAME(mout_core_p) = { "mout_apll", "mout_mpll_user_c", }; -PNAME(mout_hpm_p) = { "mout_apll", "mout_mpll_user_c", }; - -PNAME(mout_ebi_p) = { "div_aclk_200", "div_aclk_160", }; -PNAME(mout_ebi_1_p) = { "mout_ebi", "mout_vpll", }; - -PNAME(mout_gdl_p) = { "mout_mpll_user_l", }; -PNAME(mout_gdr_p) = { "mout_mpll_user_r", }; - -PNAME(mout_aclk_400_mcuisp_sub_p) - = { "fin_pll", "div_aclk_400_mcuisp", }; -PNAME(mout_aclk_266_0_p) = { "div_mpll_pre", "mout_vpll", }; -PNAME(mout_aclk_266_1_p) = { "mout_epll_user", }; -PNAME(mout_aclk_266_p) = { "mout_aclk_266_0", "mout_aclk_266_1", }; -PNAME(mout_aclk_266_sub_p) = { "fin_pll", "div_aclk_266", }; - -PNAME(group_div_mpll_pre_p) = { "div_mpll_pre", }; -PNAME(group_epll_vpll_p) = { "mout_epll_user", "mout_vpll" }; -PNAME(group_sclk_p) = { "xxti", "xusbxti", - "none", "none", - "none", "none", "div_mpll_pre", - "mout_epll_user", "mout_vpll", }; -PNAME(group_sclk_audio_p) = { "audiocdclk", "none", - "none", "none", - "xxti", "xusbxti", - "div_mpll_pre", "mout_epll_user", - "mout_vpll", }; -PNAME(group_sclk_cam_blk_p) = { "xxti", "xusbxti", - "none", "none", "none", - "none", "div_mpll_pre", - "mout_epll_user", "mout_vpll", - "none", "none", "none", - "div_cam_blk_320", }; -PNAME(group_sclk_fimd0_p) = { "xxti", "xusbxti", - "m_bitclkhsdiv4_2l", "none", - "none", "none", "div_mpll_pre", - "mout_epll_user", "mout_vpll", - "none", "none", "none", - "div_lcd_blk_145", }; - -PNAME(mout_mfc_p) = { "mout_mfc_0", "mout_mfc_1" }; -PNAME(mout_g3d_p) = { "mout_g3d_0", "mout_g3d_1" }; - -static const struct samsung_fixed_factor_clock fixed_factor_clks[] __initconst = { - FFACTOR(0, "sclk_mpll_1600", "mout_mpll", 1, 1, 0), - FFACTOR(0, "sclk_mpll_mif", "mout_mpll", 1, 2, 0), - FFACTOR(0, "sclk_bpll", "fout_bpll", 1, 2, 0), - FFACTOR(0, "div_cam_blk_320", "sclk_mpll_1600", 1, 5, 0), - FFACTOR(0, "div_lcd_blk_145", "sclk_mpll_1600", 1, 11, 0), - - /* HACK: fin_pll hardcoded to xusbxti until detection is implemented. */ - FFACTOR(CLK_FIN_PLL, "fin_pll", "xusbxti", 1, 1, 0), -}; - -static const struct samsung_mux_clock mux_clks[] __initconst = { - /* - * NOTE: Following table is sorted by register address in ascending - * order and then bitfield shift in descending order, as it is done - * in the User's Manual. When adding new entries, please make sure - * that the order is preserved, to avoid merge conflicts and make - * further work with defined data easier. - */ - - /* SRC_LEFTBUS */ - MUX(CLK_MOUT_MPLL_USER_L, "mout_mpll_user_l", mout_mpll_user_p, - SRC_LEFTBUS, 4, 1), - MUX(CLK_MOUT_GDL, "mout_gdl", mout_gdl_p, SRC_LEFTBUS, 0, 1), - - /* SRC_RIGHTBUS */ - MUX(CLK_MOUT_MPLL_USER_R, "mout_mpll_user_r", mout_mpll_user_p, - SRC_RIGHTBUS, 4, 1), - MUX(CLK_MOUT_GDR, "mout_gdr", mout_gdr_p, SRC_RIGHTBUS, 0, 1), - - /* SRC_TOP0 */ - MUX(CLK_MOUT_EBI, "mout_ebi", mout_ebi_p, SRC_TOP0, 28, 1), - MUX(CLK_MOUT_ACLK_200, "mout_aclk_200", group_div_mpll_pre_p,SRC_TOP0, 24, 1), - MUX(CLK_MOUT_ACLK_160, "mout_aclk_160", group_div_mpll_pre_p, SRC_TOP0, 20, 1), - MUX(CLK_MOUT_ACLK_100, "mout_aclk_100", group_div_mpll_pre_p, SRC_TOP0, 16, 1), - MUX(CLK_MOUT_ACLK_266_1, "mout_aclk_266_1", mout_aclk_266_1_p, SRC_TOP0, 14, 1), - MUX(CLK_MOUT_ACLK_266_0, "mout_aclk_266_0", mout_aclk_266_0_p, SRC_TOP0, 13, 1), - MUX(CLK_MOUT_ACLK_266, "mout_aclk_266", mout_aclk_266_p, SRC_TOP0, 12, 1), - MUX(CLK_MOUT_VPLL, "mout_vpll", mout_vpll_p, SRC_TOP0, 8, 1), - MUX(CLK_MOUT_EPLL_USER, "mout_epll_user", mout_epll_user_p, SRC_TOP0, 4, 1), - MUX(CLK_MOUT_EBI_1, "mout_ebi_1", mout_ebi_1_p, SRC_TOP0, 0, 1), - - /* SRC_TOP1 */ - MUX(CLK_MOUT_UPLL, "mout_upll", mout_upll_p, SRC_TOP1, 28, 1), - MUX(CLK_MOUT_ACLK_400_MCUISP_SUB, "mout_aclk_400_mcuisp_sub", mout_aclk_400_mcuisp_sub_p, - SRC_TOP1, 24, 1), - MUX(CLK_MOUT_ACLK_266_SUB, "mout_aclk_266_sub", mout_aclk_266_sub_p, SRC_TOP1, 20, 1), - MUX(CLK_MOUT_MPLL, "mout_mpll", mout_mpll_p, SRC_TOP1, 12, 1), - MUX(CLK_MOUT_ACLK_400_MCUISP, "mout_aclk_400_mcuisp", group_div_mpll_pre_p, SRC_TOP1, 8, 1), - MUX(CLK_MOUT_VPLLSRC, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP1, 0, 1), - - /* SRC_CAM */ - MUX(CLK_MOUT_CAM1, "mout_cam1", group_sclk_p, SRC_CAM, 20, 4), - MUX(CLK_MOUT_CAM_BLK, "mout_cam_blk", group_sclk_cam_blk_p, SRC_CAM, 0, 4), - - /* SRC_MFC */ - MUX(CLK_MOUT_MFC, "mout_mfc", mout_mfc_p, SRC_MFC, 8, 1), - MUX(CLK_MOUT_MFC_1, "mout_mfc_1", group_epll_vpll_p, SRC_MFC, 4, 1), - MUX(CLK_MOUT_MFC_0, "mout_mfc_0", group_div_mpll_pre_p, SRC_MFC, 0, 1), - - /* SRC_G3D */ - MUX(CLK_MOUT_G3D, "mout_g3d", mout_g3d_p, SRC_G3D, 8, 1), - MUX(CLK_MOUT_G3D_1, "mout_g3d_1", group_epll_vpll_p, SRC_G3D, 4, 1), - MUX(CLK_MOUT_G3D_0, "mout_g3d_0", group_div_mpll_pre_p, SRC_G3D, 0, 1), - - /* SRC_LCD */ - MUX(CLK_MOUT_MIPI0, "mout_mipi0", group_sclk_p, SRC_LCD, 12, 4), - MUX(CLK_MOUT_FIMD0, "mout_fimd0", group_sclk_fimd0_p, SRC_LCD, 0, 4), - - /* SRC_ISP */ - MUX(CLK_MOUT_UART_ISP, "mout_uart_isp", group_sclk_p, SRC_ISP, 12, 4), - MUX(CLK_MOUT_SPI1_ISP, "mout_spi1_isp", group_sclk_p, SRC_ISP, 8, 4), - MUX(CLK_MOUT_SPI0_ISP, "mout_spi0_isp", group_sclk_p, SRC_ISP, 4, 4), - - /* SRC_FSYS */ - MUX(CLK_MOUT_TSADC, "mout_tsadc", group_sclk_p, SRC_FSYS, 28, 4), - MUX(CLK_MOUT_MMC2, "mout_mmc2", group_sclk_p, SRC_FSYS, 8, 4), - MUX(CLK_MOUT_MMC1, "mout_mmc1", group_sclk_p, SRC_FSYS, 4, 4), - MUX(CLK_MOUT_MMC0, "mout_mmc0", group_sclk_p, SRC_FSYS, 0, 4), - - /* SRC_PERIL0 */ - MUX(CLK_MOUT_UART2, "mout_uart2", group_sclk_p, SRC_PERIL0, 8, 4), - MUX(CLK_MOUT_UART1, "mout_uart1", group_sclk_p, SRC_PERIL0, 4, 4), - MUX(CLK_MOUT_UART0, "mout_uart0", group_sclk_p, SRC_PERIL0, 0, 4), - - /* SRC_PERIL1 */ - MUX(CLK_MOUT_SPI1, "mout_spi1", group_sclk_p, SRC_PERIL1, 20, 4), - MUX(CLK_MOUT_SPI0, "mout_spi0", group_sclk_p, SRC_PERIL1, 16, 4), - MUX(CLK_MOUT_AUDIO, "mout_audio", group_sclk_audio_p, SRC_PERIL1, 4, 4), - - /* SRC_CPU */ - MUX(CLK_MOUT_MPLL_USER_C, "mout_mpll_user_c", mout_mpll_user_p, - SRC_CPU, 24, 1), - MUX(CLK_MOUT_HPM, "mout_hpm", mout_hpm_p, SRC_CPU, 20, 1), - MUX_F(CLK_MOUT_CORE, "mout_core", mout_core_p, SRC_CPU, 16, 1, - CLK_SET_RATE_PARENT, 0), - MUX_F(CLK_MOUT_APLL, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, - CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_div_clock div_clks[] __initconst = { - /* - * NOTE: Following table is sorted by register address in ascending - * order and then bitfield shift in descending order, as it is done - * in the User's Manual. When adding new entries, please make sure - * that the order is preserved, to avoid merge conflicts and make - * further work with defined data easier. - */ - - /* DIV_LEFTBUS */ - DIV(CLK_DIV_GPL, "div_gpl", "div_gdl", DIV_LEFTBUS, 4, 3), - DIV(CLK_DIV_GDL, "div_gdl", "mout_gdl", DIV_LEFTBUS, 0, 4), - - /* DIV_RIGHTBUS */ - DIV(CLK_DIV_GPR, "div_gpr", "div_gdr", DIV_RIGHTBUS, 4, 3), - DIV(CLK_DIV_GDR, "div_gdr", "mout_gdr", DIV_RIGHTBUS, 0, 4), - - /* DIV_TOP */ - DIV(CLK_DIV_MPLL_PRE, "div_mpll_pre", "sclk_mpll_mif", DIV_TOP, 28, 2), - DIV(CLK_DIV_ACLK_400_MCUISP, "div_aclk_400_mcuisp", - "mout_aclk_400_mcuisp", DIV_TOP, 24, 3), - DIV(CLK_DIV_EBI, "div_ebi", "mout_ebi_1", DIV_TOP, 16, 3), - DIV(CLK_DIV_ACLK_200, "div_aclk_200", "mout_aclk_200", DIV_TOP, 12, 3), - DIV(CLK_DIV_ACLK_160, "div_aclk_160", "mout_aclk_160", DIV_TOP, 8, 3), - DIV(CLK_DIV_ACLK_100, "div_aclk_100", "mout_aclk_100", DIV_TOP, 4, 4), - DIV(CLK_DIV_ACLK_266, "div_aclk_266", "mout_aclk_266", DIV_TOP, 0, 3), - - /* DIV_CAM */ - DIV(CLK_DIV_CAM1, "div_cam1", "mout_cam1", DIV_CAM, 20, 4), - DIV(CLK_DIV_CAM_BLK, "div_cam_blk", "mout_cam_blk", DIV_CAM, 0, 4), - - /* DIV_MFC */ - DIV(CLK_DIV_MFC, "div_mfc", "mout_mfc", DIV_MFC, 0, 4), - - /* DIV_G3D */ - DIV(CLK_DIV_G3D, "div_g3d", "mout_g3d", DIV_G3D, 0, 4), - - /* DIV_LCD */ - DIV_F(CLK_DIV_MIPI0_PRE, "div_mipi0_pre", "div_mipi0", DIV_LCD, 20, 4, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_MIPI0, "div_mipi0", "mout_mipi0", DIV_LCD, 16, 4), - DIV(CLK_DIV_FIMD0, "div_fimd0", "mout_fimd0", DIV_LCD, 0, 4), - - /* DIV_ISP */ - DIV(CLK_DIV_UART_ISP, "div_uart_isp", "mout_uart_isp", DIV_ISP, 28, 4), - DIV_F(CLK_DIV_SPI1_ISP_PRE, "div_spi1_isp_pre", "div_spi1_isp", - DIV_ISP, 20, 8, CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_SPI1_ISP, "div_spi1_isp", "mout_spi1_isp", DIV_ISP, 16, 4), - DIV_F(CLK_DIV_SPI0_ISP_PRE, "div_spi0_isp_pre", "div_spi0_isp", - DIV_ISP, 8, 8, CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_SPI0_ISP, "div_spi0_isp", "mout_spi0_isp", DIV_ISP, 4, 4), - - /* DIV_FSYS0 */ - DIV_F(CLK_DIV_TSADC_PRE, "div_tsadc_pre", "div_tsadc", DIV_FSYS0, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_TSADC, "div_tsadc", "mout_tsadc", DIV_FSYS0, 0, 4), - - /* DIV_FSYS1 */ - DIV_F(CLK_DIV_MMC1_PRE, "div_mmc1_pre", "div_mmc1", DIV_FSYS1, 24, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_MMC1, "div_mmc1", "mout_mmc1", DIV_FSYS1, 16, 4), - DIV_F(CLK_DIV_MMC0_PRE, "div_mmc0_pre", "div_mmc0", DIV_FSYS1, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_MMC0, "div_mmc0", "mout_mmc0", DIV_FSYS1, 0, 4), - - /* DIV_FSYS2 */ - DIV_F(CLK_DIV_MMC2_PRE, "div_mmc2_pre", "div_mmc2", DIV_FSYS2, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_MMC2, "div_mmc2", "mout_mmc2", DIV_FSYS2, 0, 4), - - /* DIV_PERIL0 */ - DIV(CLK_DIV_UART2, "div_uart2", "mout_uart2", DIV_PERIL0, 8, 4), - DIV(CLK_DIV_UART1, "div_uart1", "mout_uart1", DIV_PERIL0, 4, 4), - DIV(CLK_DIV_UART0, "div_uart0", "mout_uart0", DIV_PERIL0, 0, 4), - - /* DIV_PERIL1 */ - DIV_F(CLK_DIV_SPI1_PRE, "div_spi1_pre", "div_spi1", DIV_PERIL1, 24, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_SPI1, "div_spi1", "mout_spi1", DIV_PERIL1, 16, 4), - DIV_F(CLK_DIV_SPI0_PRE, "div_spi0_pre", "div_spi0", DIV_PERIL1, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_SPI0, "div_spi0", "mout_spi0", DIV_PERIL1, 0, 4), - - /* DIV_PERIL4 */ - DIV(CLK_DIV_PCM, "div_pcm", "div_audio", DIV_PERIL4, 20, 8), - DIV(CLK_DIV_AUDIO, "div_audio", "mout_audio", DIV_PERIL4, 16, 4), - - /* DIV_PERIL5 */ - DIV(CLK_DIV_I2S, "div_i2s", "div_audio", DIV_PERIL5, 8, 6), - - /* DIV_CPU0 */ - DIV(CLK_DIV_CORE2, "div_core2", "div_core", DIV_CPU0, 28, 3), - DIV(CLK_DIV_APLL, "div_apll", "mout_apll", DIV_CPU0, 24, 3), - DIV(CLK_DIV_PCLK_DBG, "div_pclk_dbg", "div_core2", DIV_CPU0, 20, 3), - DIV(CLK_DIV_ATB, "div_atb", "div_core2", DIV_CPU0, 16, 3), - DIV(CLK_DIV_COREM, "div_corem", "div_core2", DIV_CPU0, 4, 3), - DIV(CLK_DIV_CORE, "div_core", "mout_core", DIV_CPU0, 0, 3), - - /* DIV_CPU1 */ - DIV(CLK_DIV_HPM, "div_hpm", "div_copy", DIV_CPU1, 4, 3), - DIV(CLK_DIV_COPY, "div_copy", "mout_hpm", DIV_CPU1, 0, 3), -}; - -static const struct samsung_gate_clock gate_clks[] __initconst = { - /* - * NOTE: Following table is sorted by register address in ascending - * order and then bitfield shift in descending order, as it is done - * in the User's Manual. When adding new entries, please make sure - * that the order is preserved, to avoid merge conflicts and make - * further work with defined data easier. - */ - - /* GATE_IP_LEFTBUS */ - GATE(CLK_ASYNC_G3D, "async_g3d", "div_aclk_100", GATE_IP_LEFTBUS, 6, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNC_MFCL, "async_mfcl", "div_aclk_100", GATE_IP_LEFTBUS, 4, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMULEFT, "ppmuleft", "div_aclk_100", GATE_IP_LEFTBUS, 1, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_GPIO_LEFT, "gpio_left", "div_aclk_100", GATE_IP_LEFTBUS, 0, - CLK_IGNORE_UNUSED, 0), - - /* GATE_IP_RIGHTBUS */ - GATE(CLK_ASYNC_ISPMX, "async_ispmx", "div_aclk_100", - GATE_IP_RIGHTBUS, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNC_FSYSD, "async_fsysd", "div_aclk_100", - GATE_IP_RIGHTBUS, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNC_LCD0X, "async_lcd0x", "div_aclk_100", - GATE_IP_RIGHTBUS, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNC_CAMX, "async_camx", "div_aclk_100", GATE_IP_RIGHTBUS, 2, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMURIGHT, "ppmuright", "div_aclk_100", GATE_IP_RIGHTBUS, 1, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_GPIO_RIGHT, "gpio_right", "div_aclk_100", GATE_IP_RIGHTBUS, 0, - CLK_IGNORE_UNUSED, 0), - - /* GATE_IP_PERIR */ - GATE(CLK_MONOCNT, "monocnt", "div_aclk_100", GATE_IP_PERIR, 22, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC6, "tzpc6", "div_aclk_100", GATE_IP_PERIR, 21, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PROVISIONKEY1, "provisionkey1", "div_aclk_100", - GATE_IP_PERIR, 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PROVISIONKEY0, "provisionkey0", "div_aclk_100", - GATE_IP_PERIR, 19, CLK_IGNORE_UNUSED, 0), - GATE(CLK_CMU_ISPPART, "cmu_isppart", "div_aclk_100", GATE_IP_PERIR, 18, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TMU_APBIF, "tmu_apbif", "div_aclk_100", - GATE_IP_PERIR, 17, 0, 0), - GATE(CLK_KEYIF, "keyif", "div_aclk_100", GATE_IP_PERIR, 16, 0, 0), - GATE(CLK_RTC, "rtc", "div_aclk_100", GATE_IP_PERIR, 15, 0, 0), - GATE(CLK_WDT, "wdt", "div_aclk_100", GATE_IP_PERIR, 14, 0, 0), - GATE(CLK_MCT, "mct", "div_aclk_100", GATE_IP_PERIR, 13, 0, 0), - GATE(CLK_SECKEY, "seckey", "div_aclk_100", GATE_IP_PERIR, 12, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC5, "tzpc5", "div_aclk_100", GATE_IP_PERIR, 10, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC4, "tzpc4", "div_aclk_100", GATE_IP_PERIR, 9, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC3, "tzpc3", "div_aclk_100", GATE_IP_PERIR, 8, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC2, "tzpc2", "div_aclk_100", GATE_IP_PERIR, 7, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC1, "tzpc1", "div_aclk_100", GATE_IP_PERIR, 6, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC0, "tzpc0", "div_aclk_100", GATE_IP_PERIR, 5, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_CMU_COREPART, "cmu_corepart", "div_aclk_100", GATE_IP_PERIR, 4, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_CMU_TOPPART, "cmu_toppart", "div_aclk_100", GATE_IP_PERIR, 3, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PMU_APBIF, "pmu_apbif", "div_aclk_100", GATE_IP_PERIR, 2, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_SYSREG, "sysreg", "div_aclk_100", GATE_IP_PERIR, 1, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_CHIP_ID, "chip_id", "div_aclk_100", GATE_IP_PERIR, 0, - CLK_IGNORE_UNUSED, 0), - - /* GATE_SCLK_CAM */ - GATE(CLK_SCLK_JPEG, "sclk_jpeg", "div_cam_blk", - GATE_SCLK_CAM, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_M2MSCALER, "sclk_m2mscaler", "div_cam_blk", - GATE_SCLK_CAM, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_GSCALER1, "sclk_gscaler1", "div_cam_blk", - GATE_SCLK_CAM, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_GSCALER0, "sclk_gscaler0", "div_cam_blk", - GATE_SCLK_CAM, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_MFC */ - GATE(CLK_SCLK_MFC, "sclk_mfc", "div_mfc", - GATE_SCLK_MFC, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_G3D */ - GATE(CLK_SCLK_G3D, "sclk_g3d", "div_g3d", - GATE_SCLK_G3D, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_LCD */ - GATE(CLK_SCLK_MIPIDPHY2L, "sclk_mipidphy2l", "div_mipi0", - GATE_SCLK_LCD, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MIPI0, "sclk_mipi0", "div_mipi0_pre", - GATE_SCLK_LCD, 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_FIMD0, "sclk_fimd0", "div_fimd0", - GATE_SCLK_LCD, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_ISP_TOP */ - GATE(CLK_SCLK_CAM1, "sclk_cam1", "div_cam1", - GATE_SCLK_ISP_TOP, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART_ISP, "sclk_uart_isp", "div_uart_isp", - GATE_SCLK_ISP_TOP, 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI1_ISP, "sclk_spi1_isp", "div_spi1_isp", - GATE_SCLK_ISP_TOP, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI0_ISP, "sclk_spi0_isp", "div_spi0_isp", - GATE_SCLK_ISP_TOP, 1, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_FSYS */ - GATE(CLK_SCLK_UPLL, "sclk_upll", "mout_upll", GATE_SCLK_FSYS, 10, 0, 0), - GATE(CLK_SCLK_TSADC, "sclk_tsadc", "div_tsadc_pre", - GATE_SCLK_FSYS, 9, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_EBI, "sclk_ebi", "div_ebi", - GATE_SCLK_FSYS, 6, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC2, "sclk_mmc2", "div_mmc2_pre", - GATE_SCLK_FSYS, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC1, "sclk_mmc1", "div_mmc1_pre", - GATE_SCLK_FSYS, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC0, "sclk_mmc0", "div_mmc0_pre", - GATE_SCLK_FSYS, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_PERIL */ - GATE(CLK_SCLK_I2S, "sclk_i2s", "div_i2s", - GATE_SCLK_PERIL, 18, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PCM, "sclk_pcm", "div_pcm", - GATE_SCLK_PERIL, 16, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI1, "sclk_spi1", "div_spi1_pre", - GATE_SCLK_PERIL, 7, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI0, "sclk_spi0", "div_spi0_pre", - GATE_SCLK_PERIL, 6, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_UART2, "sclk_uart2", "div_uart2", - GATE_SCLK_PERIL, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART1, "sclk_uart1", "div_uart1", - GATE_SCLK_PERIL, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART0, "sclk_uart0", "div_uart0", - GATE_SCLK_PERIL, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_IP_CAM */ - GATE(CLK_QEJPEG, "qejpeg", "div_cam_blk_320", GATE_IP_CAM, 19, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PIXELASYNCM1, "pixelasyncm1", "div_cam_blk_320", - GATE_IP_CAM, 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PIXELASYNCM0, "pixelasyncm0", "div_cam_blk_320", - GATE_IP_CAM, 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMUCAMIF, "ppmucamif", "div_cam_blk_320", - GATE_IP_CAM, 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_QEM2MSCALER, "qem2mscaler", "div_cam_blk_320", - GATE_IP_CAM, 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_QEGSCALER1, "qegscaler1", "div_cam_blk_320", - GATE_IP_CAM, 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_QEGSCALER0, "qegscaler0", "div_cam_blk_320", - GATE_IP_CAM, 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMUJPEG, "smmujpeg", "div_cam_blk_320", - GATE_IP_CAM, 11, 0, 0), - GATE(CLK_SMMUM2M2SCALER, "smmum2m2scaler", "div_cam_blk_320", - GATE_IP_CAM, 9, 0, 0), - GATE(CLK_SMMUGSCALER1, "smmugscaler1", "div_cam_blk_320", - GATE_IP_CAM, 8, 0, 0), - GATE(CLK_SMMUGSCALER0, "smmugscaler0", "div_cam_blk_320", - GATE_IP_CAM, 7, 0, 0), - GATE(CLK_JPEG, "jpeg", "div_cam_blk_320", GATE_IP_CAM, 6, 0, 0), - GATE(CLK_M2MSCALER, "m2mscaler", "div_cam_blk_320", - GATE_IP_CAM, 2, 0, 0), - GATE(CLK_GSCALER1, "gscaler1", "div_cam_blk_320", GATE_IP_CAM, 1, 0, 0), - GATE(CLK_GSCALER0, "gscaler0", "div_cam_blk_320", GATE_IP_CAM, 0, 0, 0), - - /* GATE_IP_MFC */ - GATE(CLK_QEMFC, "qemfc", "div_aclk_200", GATE_IP_MFC, 5, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMUMFC_L, "ppmumfc_l", "div_aclk_200", GATE_IP_MFC, 3, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMUMFC_L, "smmumfc_l", "div_aclk_200", GATE_IP_MFC, 1, 0, 0), - GATE(CLK_MFC, "mfc", "div_aclk_200", GATE_IP_MFC, 0, 0, 0), - - /* GATE_IP_G3D */ - GATE(CLK_SMMUG3D, "smmug3d", "div_aclk_200", GATE_IP_G3D, 3, 0, 0), - GATE(CLK_QEG3D, "qeg3d", "div_aclk_200", GATE_IP_G3D, 2, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMUG3D, "ppmug3d", "div_aclk_200", GATE_IP_G3D, 1, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_G3D, "g3d", "div_aclk_200", GATE_IP_G3D, 0, 0, 0), - - /* GATE_IP_LCD */ - GATE(CLK_QE_CH1_LCD, "qe_ch1_lcd", "div_aclk_160", GATE_IP_LCD, 7, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_QE_CH0_LCD, "qe_ch0_lcd", "div_aclk_160", GATE_IP_LCD, 6, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMULCD0, "ppmulcd0", "div_aclk_160", GATE_IP_LCD, 5, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMUFIMD0, "smmufimd0", "div_aclk_160", GATE_IP_LCD, 4, 0, 0), - GATE(CLK_DSIM0, "dsim0", "div_aclk_160", GATE_IP_LCD, 3, 0, 0), - GATE(CLK_SMIES, "smies", "div_aclk_160", GATE_IP_LCD, 2, 0, 0), - GATE(CLK_FIMD0, "fimd0", "div_aclk_160", GATE_IP_LCD, 0, 0, 0), - - /* GATE_IP_ISP */ - GATE(CLK_CAM1, "cam1", "mout_aclk_266_sub", GATE_IP_ISP, 5, 0, 0), - GATE(CLK_UART_ISP_TOP, "uart_isp_top", "mout_aclk_266_sub", - GATE_IP_ISP, 3, 0, 0), - GATE(CLK_SPI1_ISP_TOP, "spi1_isp_top", "mout_aclk_266_sub", - GATE_IP_ISP, 2, 0, 0), - GATE(CLK_SPI0_ISP_TOP, "spi0_isp_top", "mout_aclk_266_sub", - GATE_IP_ISP, 1, 0, 0), - - /* GATE_IP_FSYS */ - GATE(CLK_TSADC, "tsadc", "div_aclk_200", GATE_IP_FSYS, 20, 0, 0), - GATE(CLK_PPMUFILE, "ppmufile", "div_aclk_200", GATE_IP_FSYS, 17, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_USBOTG, "usbotg", "div_aclk_200", GATE_IP_FSYS, 13, 0, 0), - GATE(CLK_USBHOST, "usbhost", "div_aclk_200", GATE_IP_FSYS, 12, 0, 0), - GATE(CLK_SROMC, "sromc", "div_aclk_200", GATE_IP_FSYS, 11, 0, 0), - GATE(CLK_SDMMC2, "sdmmc2", "div_aclk_200", GATE_IP_FSYS, 7, 0, 0), - GATE(CLK_SDMMC1, "sdmmc1", "div_aclk_200", GATE_IP_FSYS, 6, 0, 0), - GATE(CLK_SDMMC0, "sdmmc0", "div_aclk_200", GATE_IP_FSYS, 5, 0, 0), - GATE(CLK_PDMA1, "pdma1", "div_aclk_200", GATE_IP_FSYS, 1, 0, 0), - GATE(CLK_PDMA0, "pdma0", "div_aclk_200", GATE_IP_FSYS, 0, 0, 0), - - /* GATE_IP_PERIL */ - GATE(CLK_PWM, "pwm", "div_aclk_100", GATE_IP_PERIL, 24, 0, 0), - GATE(CLK_PCM, "pcm", "div_aclk_100", GATE_IP_PERIL, 23, 0, 0), - GATE(CLK_I2S, "i2s", "div_aclk_100", GATE_IP_PERIL, 21, 0, 0), - GATE(CLK_SPI1, "spi1", "div_aclk_100", GATE_IP_PERIL, 17, 0, 0), - GATE(CLK_SPI0, "spi0", "div_aclk_100", GATE_IP_PERIL, 16, 0, 0), - GATE(CLK_I2C7, "i2c7", "div_aclk_100", GATE_IP_PERIL, 13, 0, 0), - GATE(CLK_I2C6, "i2c6", "div_aclk_100", GATE_IP_PERIL, 12, 0, 0), - GATE(CLK_I2C5, "i2c5", "div_aclk_100", GATE_IP_PERIL, 11, 0, 0), - GATE(CLK_I2C4, "i2c4", "div_aclk_100", GATE_IP_PERIL, 10, 0, 0), - GATE(CLK_I2C3, "i2c3", "div_aclk_100", GATE_IP_PERIL, 9, 0, 0), - GATE(CLK_I2C2, "i2c2", "div_aclk_100", GATE_IP_PERIL, 8, 0, 0), - GATE(CLK_I2C1, "i2c1", "div_aclk_100", GATE_IP_PERIL, 7, 0, 0), - GATE(CLK_I2C0, "i2c0", "div_aclk_100", GATE_IP_PERIL, 6, 0, 0), - GATE(CLK_UART2, "uart2", "div_aclk_100", GATE_IP_PERIL, 2, 0, 0), - GATE(CLK_UART1, "uart1", "div_aclk_100", GATE_IP_PERIL, 1, 0, 0), - GATE(CLK_UART0, "uart0", "div_aclk_100", GATE_IP_PERIL, 0, 0, 0), -}; - -/* APLL & MPLL & BPLL & UPLL */ -static const struct samsung_pll_rate_table exynos3250_pll_rates[] __initconst = { - PLL_35XX_RATE(1200000000, 400, 4, 1), - PLL_35XX_RATE(1100000000, 275, 3, 1), - PLL_35XX_RATE(1066000000, 533, 6, 1), - PLL_35XX_RATE(1000000000, 250, 3, 1), - PLL_35XX_RATE( 960000000, 320, 4, 1), - PLL_35XX_RATE( 900000000, 300, 4, 1), - PLL_35XX_RATE( 850000000, 425, 6, 1), - PLL_35XX_RATE( 800000000, 200, 3, 1), - PLL_35XX_RATE( 700000000, 175, 3, 1), - PLL_35XX_RATE( 667000000, 667, 12, 1), - PLL_35XX_RATE( 600000000, 400, 4, 2), - PLL_35XX_RATE( 533000000, 533, 6, 2), - PLL_35XX_RATE( 520000000, 260, 3, 2), - PLL_35XX_RATE( 500000000, 250, 3, 2), - PLL_35XX_RATE( 400000000, 200, 3, 2), - PLL_35XX_RATE( 200000000, 200, 3, 3), - PLL_35XX_RATE( 100000000, 200, 3, 4), - { /* sentinel */ } -}; - -/* EPLL */ -static const struct samsung_pll_rate_table exynos3250_epll_rates[] __initconst = { - PLL_36XX_RATE(800000000, 200, 3, 1, 0), - PLL_36XX_RATE(288000000, 96, 2, 2, 0), - PLL_36XX_RATE(192000000, 128, 2, 3, 0), - PLL_36XX_RATE(144000000, 96, 2, 3, 0), - PLL_36XX_RATE( 96000000, 128, 2, 4, 0), - PLL_36XX_RATE( 84000000, 112, 2, 4, 0), - PLL_36XX_RATE( 80000004, 106, 2, 4, 43691), - PLL_36XX_RATE( 73728000, 98, 2, 4, 19923), - PLL_36XX_RATE( 67737598, 270, 3, 5, 62285), - PLL_36XX_RATE( 65535999, 174, 2, 5, 49982), - PLL_36XX_RATE( 50000000, 200, 3, 5, 0), - PLL_36XX_RATE( 49152002, 131, 2, 5, 4719), - PLL_36XX_RATE( 48000000, 128, 2, 5, 0), - PLL_36XX_RATE( 45158401, 180, 3, 5, 41524), - { /* sentinel */ } -}; - -/* VPLL */ -static const struct samsung_pll_rate_table exynos3250_vpll_rates[] __initconst = { - PLL_36XX_RATE(600000000, 100, 2, 1, 0), - PLL_36XX_RATE(533000000, 266, 3, 2, 32768), - PLL_36XX_RATE(519230987, 173, 2, 2, 5046), - PLL_36XX_RATE(500000000, 250, 3, 2, 0), - PLL_36XX_RATE(445500000, 148, 2, 2, 32768), - PLL_36XX_RATE(445055007, 148, 2, 2, 23047), - PLL_36XX_RATE(400000000, 200, 3, 2, 0), - PLL_36XX_RATE(371250000, 123, 2, 2, 49152), - PLL_36XX_RATE(370878997, 185, 3, 2, 28803), - PLL_36XX_RATE(340000000, 170, 3, 2, 0), - PLL_36XX_RATE(335000015, 111, 2, 2, 43691), - PLL_36XX_RATE(333000000, 111, 2, 2, 0), - PLL_36XX_RATE(330000000, 110, 2, 2, 0), - PLL_36XX_RATE(320000015, 106, 2, 2, 43691), - PLL_36XX_RATE(300000000, 100, 2, 2, 0), - PLL_36XX_RATE(275000000, 275, 3, 3, 0), - PLL_36XX_RATE(222750000, 148, 2, 3, 32768), - PLL_36XX_RATE(222528007, 148, 2, 3, 23069), - PLL_36XX_RATE(160000000, 160, 3, 3, 0), - PLL_36XX_RATE(148500000, 99, 2, 3, 0), - PLL_36XX_RATE(148352005, 98, 2, 3, 59070), - PLL_36XX_RATE(108000000, 144, 2, 4, 0), - PLL_36XX_RATE( 74250000, 99, 2, 4, 0), - PLL_36XX_RATE( 74176002, 98, 3, 4, 59070), - PLL_36XX_RATE( 54054000, 216, 3, 5, 14156), - PLL_36XX_RATE( 54000000, 144, 2, 5, 0), - { /* sentinel */ } -}; - -static const struct samsung_pll_clock exynos3250_plls[] __initconst = { - PLL(pll_35xx, CLK_FOUT_APLL, "fout_apll", "fin_pll", - APLL_LOCK, APLL_CON0, exynos3250_pll_rates), - PLL(pll_35xx, CLK_FOUT_MPLL, "fout_mpll", "fin_pll", - MPLL_LOCK, MPLL_CON0, exynos3250_pll_rates), - PLL(pll_36xx, CLK_FOUT_VPLL, "fout_vpll", "fin_pll", - VPLL_LOCK, VPLL_CON0, exynos3250_vpll_rates), - PLL(pll_35xx, CLK_FOUT_UPLL, "fout_upll", "fin_pll", - UPLL_LOCK, UPLL_CON0, exynos3250_pll_rates), -}; - -static void __init exynos3_core_down_clock(void __iomem *reg_base) -{ - unsigned int tmp; - - /* - * Enable arm clock down (in idle) and set arm divider - * ratios in WFI/WFE state. - */ - tmp = (PWR_CTRL1_CORE2_DOWN_RATIO(7) | PWR_CTRL1_CORE1_DOWN_RATIO(7) | - PWR_CTRL1_DIV2_DOWN_EN | PWR_CTRL1_DIV1_DOWN_EN | - PWR_CTRL1_USE_CORE1_WFE | PWR_CTRL1_USE_CORE0_WFE | - PWR_CTRL1_USE_CORE1_WFI | PWR_CTRL1_USE_CORE0_WFI); - __raw_writel(tmp, reg_base + PWR_CTRL1); - - /* - * Disable the clock up feature on Exynos4x12, in case it was - * enabled by bootloader. - */ - __raw_writel(0x0, reg_base + PWR_CTRL2); -} - -static const struct samsung_cmu_info cmu_info __initconst = { - .pll_clks = exynos3250_plls, - .nr_pll_clks = ARRAY_SIZE(exynos3250_plls), - .mux_clks = mux_clks, - .nr_mux_clks = ARRAY_SIZE(mux_clks), - .div_clks = div_clks, - .nr_div_clks = ARRAY_SIZE(div_clks), - .gate_clks = gate_clks, - .nr_gate_clks = ARRAY_SIZE(gate_clks), - .fixed_factor_clks = fixed_factor_clks, - .nr_fixed_factor_clks = ARRAY_SIZE(fixed_factor_clks), - .nr_clk_ids = CLK_NR_CLKS, - .clk_regs = exynos3250_cmu_clk_regs, - .nr_clk_regs = ARRAY_SIZE(exynos3250_cmu_clk_regs), -}; - -#define E3250_CPU_DIV0(apll, pclk_dbg, atb, corem) \ - (((apll) << 24) | ((pclk_dbg) << 20) | ((atb) << 16) | \ - ((corem) << 4)) -#define E3250_CPU_DIV1(hpm, copy) \ - (((hpm) << 4) | ((copy) << 0)) - -static const struct exynos_cpuclk_cfg_data e3250_armclk_d[] __initconst = { - { 1000000, E3250_CPU_DIV0(1, 7, 4, 1), E3250_CPU_DIV1(7, 7), }, - { 900000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), }, - { 800000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), }, - { 700000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), }, - { 600000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), }, - { 500000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), }, - { 400000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), }, - { 300000, E3250_CPU_DIV0(1, 5, 3, 1), E3250_CPU_DIV1(7, 7), }, - { 200000, E3250_CPU_DIV0(1, 3, 3, 1), E3250_CPU_DIV1(7, 7), }, - { 100000, E3250_CPU_DIV0(1, 1, 1, 1), E3250_CPU_DIV1(7, 7), }, - { 0 }, -}; - -static void __init exynos3250_cmu_init(struct device_node *np) -{ - struct samsung_clk_provider *ctx; - - ctx = samsung_cmu_register_one(np, &cmu_info); - if (!ctx) - return; - - exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk", - mout_core_p[0], mout_core_p[1], 0x14200, - e3250_armclk_d, ARRAY_SIZE(e3250_armclk_d), - CLK_CPU_HAS_DIV1); - - exynos3_core_down_clock(ctx->reg_base); -} -CLK_OF_DECLARE(exynos3250_cmu, "samsung,exynos3250-cmu", exynos3250_cmu_init); - -/* - * CMU DMC - */ - -#define BPLL_LOCK 0x0118 -#define BPLL_CON0 0x0218 -#define BPLL_CON1 0x021c -#define BPLL_CON2 0x0220 -#define SRC_DMC 0x0300 -#define DIV_DMC1 0x0504 -#define GATE_BUS_DMC0 0x0700 -#define GATE_BUS_DMC1 0x0704 -#define GATE_BUS_DMC2 0x0708 -#define GATE_BUS_DMC3 0x070c -#define GATE_SCLK_DMC 0x0800 -#define GATE_IP_DMC0 0x0900 -#define GATE_IP_DMC1 0x0904 -#define EPLL_LOCK 0x1110 -#define EPLL_CON0 0x1114 -#define EPLL_CON1 0x1118 -#define EPLL_CON2 0x111c -#define SRC_EPLL 0x1120 - -static const unsigned long exynos3250_cmu_dmc_clk_regs[] __initconst = { - BPLL_LOCK, - BPLL_CON0, - BPLL_CON1, - BPLL_CON2, - SRC_DMC, - DIV_DMC1, - GATE_BUS_DMC0, - GATE_BUS_DMC1, - GATE_BUS_DMC2, - GATE_BUS_DMC3, - GATE_SCLK_DMC, - GATE_IP_DMC0, - GATE_IP_DMC1, - EPLL_LOCK, - EPLL_CON0, - EPLL_CON1, - EPLL_CON2, - SRC_EPLL, -}; - -PNAME(mout_epll_p) = { "fin_pll", "fout_epll", }; -PNAME(mout_bpll_p) = { "fin_pll", "fout_bpll", }; -PNAME(mout_mpll_mif_p) = { "fin_pll", "sclk_mpll_mif", }; -PNAME(mout_dphy_p) = { "mout_mpll_mif", "mout_bpll", }; - -static const struct samsung_mux_clock dmc_mux_clks[] __initconst = { - /* - * NOTE: Following table is sorted by register address in ascending - * order and then bitfield shift in descending order, as it is done - * in the User's Manual. When adding new entries, please make sure - * that the order is preserved, to avoid merge conflicts and make - * further work with defined data easier. - */ - - /* SRC_DMC */ - MUX(CLK_MOUT_MPLL_MIF, "mout_mpll_mif", mout_mpll_mif_p, SRC_DMC, 12, 1), - MUX(CLK_MOUT_BPLL, "mout_bpll", mout_bpll_p, SRC_DMC, 10, 1), - MUX(CLK_MOUT_DPHY, "mout_dphy", mout_dphy_p, SRC_DMC, 8, 1), - MUX(CLK_MOUT_DMC_BUS, "mout_dmc_bus", mout_dphy_p, SRC_DMC, 4, 1), - - /* SRC_EPLL */ - MUX(CLK_MOUT_EPLL, "mout_epll", mout_epll_p, SRC_EPLL, 4, 1), -}; - -static const struct samsung_div_clock dmc_div_clks[] __initconst = { - /* - * NOTE: Following table is sorted by register address in ascending - * order and then bitfield shift in descending order, as it is done - * in the User's Manual. When adding new entries, please make sure - * that the order is preserved, to avoid merge conflicts and make - * further work with defined data easier. - */ - - /* DIV_DMC1 */ - DIV(CLK_DIV_DMC, "div_dmc", "div_dmc_pre", DIV_DMC1, 27, 3), - DIV(CLK_DIV_DPHY, "div_dphy", "mout_dphy", DIV_DMC1, 23, 3), - DIV(CLK_DIV_DMC_PRE, "div_dmc_pre", "mout_dmc_bus", DIV_DMC1, 19, 2), - DIV(CLK_DIV_DMCP, "div_dmcp", "div_dmcd", DIV_DMC1, 15, 3), - DIV(CLK_DIV_DMCD, "div_dmcd", "div_dmc", DIV_DMC1, 11, 3), -}; - -static const struct samsung_pll_clock exynos3250_dmc_plls[] __initconst = { - PLL(pll_35xx, CLK_FOUT_BPLL, "fout_bpll", "fin_pll", - BPLL_LOCK, BPLL_CON0, exynos3250_pll_rates), - PLL(pll_36xx, CLK_FOUT_EPLL, "fout_epll", "fin_pll", - EPLL_LOCK, EPLL_CON0, exynos3250_epll_rates), -}; - -static const struct samsung_cmu_info dmc_cmu_info __initconst = { - .pll_clks = exynos3250_dmc_plls, - .nr_pll_clks = ARRAY_SIZE(exynos3250_dmc_plls), - .mux_clks = dmc_mux_clks, - .nr_mux_clks = ARRAY_SIZE(dmc_mux_clks), - .div_clks = dmc_div_clks, - .nr_div_clks = ARRAY_SIZE(dmc_div_clks), - .nr_clk_ids = NR_CLKS_DMC, - .clk_regs = exynos3250_cmu_dmc_clk_regs, - .nr_clk_regs = ARRAY_SIZE(exynos3250_cmu_dmc_clk_regs), -}; - -static void __init exynos3250_cmu_dmc_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &dmc_cmu_info); -} -CLK_OF_DECLARE(exynos3250_cmu_dmc, "samsung,exynos3250-cmu-dmc", - exynos3250_cmu_dmc_init); - - -/* - * CMU ISP - */ - -#define DIV_ISP0 0x300 -#define DIV_ISP1 0x304 -#define GATE_IP_ISP0 0x800 -#define GATE_IP_ISP1 0x804 -#define GATE_SCLK_ISP 0x900 - -static const struct samsung_div_clock isp_div_clks[] __initconst = { - /* - * NOTE: Following table is sorted by register address in ascending - * order and then bitfield shift in descending order, as it is done - * in the User's Manual. When adding new entries, please make sure - * that the order is preserved, to avoid merge conflicts and make - * further work with defined data easier. - */ - /* DIV_ISP0 */ - DIV(CLK_DIV_ISP1, "div_isp1", "mout_aclk_266_sub", DIV_ISP0, 4, 3), - DIV(CLK_DIV_ISP0, "div_isp0", "mout_aclk_266_sub", DIV_ISP0, 0, 3), - - /* DIV_ISP1 */ - DIV(CLK_DIV_MCUISP1, "div_mcuisp1", "mout_aclk_400_mcuisp_sub", - DIV_ISP1, 8, 3), - DIV(CLK_DIV_MCUISP0, "div_mcuisp0", "mout_aclk_400_mcuisp_sub", - DIV_ISP1, 4, 3), - DIV(CLK_DIV_MPWM, "div_mpwm", "div_isp1", DIV_ISP1, 0, 3), -}; - -static const struct samsung_gate_clock isp_gate_clks[] __initconst = { - /* - * NOTE: Following table is sorted by register address in ascending - * order and then bitfield shift in descending order, as it is done - * in the User's Manual. When adding new entries, please make sure - * that the order is preserved, to avoid merge conflicts and make - * further work with defined data easier. - */ - - /* GATE_IP_ISP0 */ - GATE(CLK_UART_ISP, "uart_isp", "uart_isp_top", - GATE_IP_ISP0, 31, CLK_IGNORE_UNUSED, 0), - GATE(CLK_WDT_ISP, "wdt_isp", "mout_aclk_266_sub", - GATE_IP_ISP0, 30, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PWM_ISP, "pwm_isp", "mout_aclk_266_sub", - GATE_IP_ISP0, 28, CLK_IGNORE_UNUSED, 0), - GATE(CLK_I2C1_ISP, "i2c1_isp", "mout_aclk_266_sub", - GATE_IP_ISP0, 26, CLK_IGNORE_UNUSED, 0), - GATE(CLK_I2C0_ISP, "i2c0_isp", "mout_aclk_266_sub", - GATE_IP_ISP0, 25, CLK_IGNORE_UNUSED, 0), - GATE(CLK_MPWM_ISP, "mpwm_isp", "mout_aclk_266_sub", - GATE_IP_ISP0, 24, CLK_IGNORE_UNUSED, 0), - GATE(CLK_MCUCTL_ISP, "mcuctl_isp", "mout_aclk_266_sub", - GATE_IP_ISP0, 23, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMUISPX, "ppmuispx", "mout_aclk_266_sub", - GATE_IP_ISP0, 21, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMUISPMX, "ppmuispmx", "mout_aclk_266_sub", - GATE_IP_ISP0, 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_QE_LITE1, "qe_lite1", "mout_aclk_266_sub", - GATE_IP_ISP0, 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_QE_LITE0, "qe_lite0", "mout_aclk_266_sub", - GATE_IP_ISP0, 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_QE_FD, "qe_fd", "mout_aclk_266_sub", - GATE_IP_ISP0, 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_QE_DRC, "qe_drc", "mout_aclk_266_sub", - GATE_IP_ISP0, 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_QE_ISP, "qe_isp", "mout_aclk_266_sub", - GATE_IP_ISP0, 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_CSIS1, "csis1", "mout_aclk_266_sub", - GATE_IP_ISP0, 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMU_LITE1, "smmu_lite1", "mout_aclk_266_sub", - GATE_IP_ISP0, 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMU_LITE0, "smmu_lite0", "mout_aclk_266_sub", - GATE_IP_ISP0, 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMU_FD, "smmu_fd", "mout_aclk_266_sub", - GATE_IP_ISP0, 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMU_DRC, "smmu_drc", "mout_aclk_266_sub", - GATE_IP_ISP0, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMU_ISP, "smmu_isp", "mout_aclk_266_sub", - GATE_IP_ISP0, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_GICISP, "gicisp", "mout_aclk_266_sub", - GATE_IP_ISP0, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_CSIS0, "csis0", "mout_aclk_266_sub", - GATE_IP_ISP0, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_MCUISP, "mcuisp", "mout_aclk_266_sub", - GATE_IP_ISP0, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_LITE1, "lite1", "mout_aclk_266_sub", - GATE_IP_ISP0, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_LITE0, "lite0", "mout_aclk_266_sub", - GATE_IP_ISP0, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_FD, "fd", "mout_aclk_266_sub", - GATE_IP_ISP0, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_DRC, "drc", "mout_aclk_266_sub", - GATE_IP_ISP0, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ISP, "isp", "mout_aclk_266_sub", - GATE_IP_ISP0, 0, CLK_IGNORE_UNUSED, 0), - - /* GATE_IP_ISP1 */ - GATE(CLK_QE_ISPCX, "qe_ispcx", "uart_isp_top", - GATE_IP_ISP0, 21, CLK_IGNORE_UNUSED, 0), - GATE(CLK_QE_SCALERP, "qe_scalerp", "uart_isp_top", - GATE_IP_ISP0, 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_QE_SCALERC, "qe_scalerc", "uart_isp_top", - GATE_IP_ISP0, 19, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMU_SCALERP, "smmu_scalerp", "uart_isp_top", - GATE_IP_ISP0, 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMU_SCALERC, "smmu_scalerc", "uart_isp_top", - GATE_IP_ISP0, 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCALERP, "scalerp", "uart_isp_top", - GATE_IP_ISP0, 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCALERC, "scalerc", "uart_isp_top", - GATE_IP_ISP0, 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SPI1_ISP, "spi1_isp", "uart_isp_top", - GATE_IP_ISP0, 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SPI0_ISP, "spi0_isp", "uart_isp_top", - GATE_IP_ISP0, 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMU_ISPCX, "smmu_ispcx", "uart_isp_top", - GATE_IP_ISP0, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNCAXIM, "asyncaxim", "uart_isp_top", - GATE_IP_ISP0, 0, CLK_IGNORE_UNUSED, 0), - - /* GATE_SCLK_ISP */ - GATE(CLK_SCLK_MPWM_ISP, "sclk_mpwm_isp", "div_mpwm", - GATE_SCLK_ISP, 0, CLK_IGNORE_UNUSED, 0), -}; - -static const struct samsung_cmu_info isp_cmu_info __initconst = { - .div_clks = isp_div_clks, - .nr_div_clks = ARRAY_SIZE(isp_div_clks), - .gate_clks = isp_gate_clks, - .nr_gate_clks = ARRAY_SIZE(isp_gate_clks), - .nr_clk_ids = NR_CLKS_ISP, -}; - -static int __init exynos3250_cmu_isp_probe(struct platform_device *pdev) -{ - struct device_node *np = pdev->dev.of_node; - - samsung_cmu_register_one(np, &isp_cmu_info); - return 0; -} - -static const struct of_device_id exynos3250_cmu_isp_of_match[] __initconst = { - { .compatible = "samsung,exynos3250-cmu-isp", }, - { /* sentinel */ } -}; - -static struct platform_driver exynos3250_cmu_isp_driver __initdata = { - .driver = { - .name = "exynos3250-cmu-isp", - .suppress_bind_attrs = true, - .of_match_table = exynos3250_cmu_isp_of_match, - }, -}; - -static int __init exynos3250_cmu_platform_init(void) -{ - return platform_driver_probe(&exynos3250_cmu_isp_driver, - exynos3250_cmu_isp_probe); -} -subsys_initcall(exynos3250_cmu_platform_init); - diff --git a/drivers/clk/samsung/samsung/clk-exynos4.c b/drivers/clk/samsung/samsung/clk-exynos4.c deleted file mode 100644 index faab9b31baf5..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos4.c +++ /dev/null @@ -1,1573 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Copyright (c) 2013 Linaro Ltd. - * Author: Thomas Abraham - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for all Exynos4 SoCs. -*/ - -#include -#include -#include -#include -#include -#include -#include - -#include "clk.h" -#include "clk-cpu.h" - -/* Exynos4 clock controller register offsets */ -#define SRC_LEFTBUS 0x4200 -#define DIV_LEFTBUS 0x4500 -#define GATE_IP_LEFTBUS 0x4800 -#define E4X12_GATE_IP_IMAGE 0x4930 -#define CLKOUT_CMU_LEFTBUS 0x4a00 -#define SRC_RIGHTBUS 0x8200 -#define DIV_RIGHTBUS 0x8500 -#define GATE_IP_RIGHTBUS 0x8800 -#define E4X12_GATE_IP_PERIR 0x8960 -#define CLKOUT_CMU_RIGHTBUS 0x8a00 -#define EPLL_LOCK 0xc010 -#define VPLL_LOCK 0xc020 -#define EPLL_CON0 0xc110 -#define EPLL_CON1 0xc114 -#define EPLL_CON2 0xc118 -#define VPLL_CON0 0xc120 -#define VPLL_CON1 0xc124 -#define VPLL_CON2 0xc128 -#define SRC_TOP0 0xc210 -#define SRC_TOP1 0xc214 -#define SRC_CAM 0xc220 -#define SRC_TV 0xc224 -#define SRC_MFC 0xc228 -#define SRC_G3D 0xc22c -#define E4210_SRC_IMAGE 0xc230 -#define SRC_LCD0 0xc234 -#define E4210_SRC_LCD1 0xc238 -#define E4X12_SRC_ISP 0xc238 -#define SRC_MAUDIO 0xc23c -#define SRC_FSYS 0xc240 -#define SRC_PERIL0 0xc250 -#define SRC_PERIL1 0xc254 -#define E4X12_SRC_CAM1 0xc258 -#define SRC_MASK_TOP 0xc310 -#define SRC_MASK_CAM 0xc320 -#define SRC_MASK_TV 0xc324 -#define SRC_MASK_LCD0 0xc334 -#define E4210_SRC_MASK_LCD1 0xc338 -#define E4X12_SRC_MASK_ISP 0xc338 -#define SRC_MASK_MAUDIO 0xc33c -#define SRC_MASK_FSYS 0xc340 -#define SRC_MASK_PERIL0 0xc350 -#define SRC_MASK_PERIL1 0xc354 -#define DIV_TOP 0xc510 -#define DIV_CAM 0xc520 -#define DIV_TV 0xc524 -#define DIV_MFC 0xc528 -#define DIV_G3D 0xc52c -#define DIV_IMAGE 0xc530 -#define DIV_LCD0 0xc534 -#define E4210_DIV_LCD1 0xc538 -#define E4X12_DIV_ISP 0xc538 -#define DIV_MAUDIO 0xc53c -#define DIV_FSYS0 0xc540 -#define DIV_FSYS1 0xc544 -#define DIV_FSYS2 0xc548 -#define DIV_FSYS3 0xc54c -#define DIV_PERIL0 0xc550 -#define DIV_PERIL1 0xc554 -#define DIV_PERIL2 0xc558 -#define DIV_PERIL3 0xc55c -#define DIV_PERIL4 0xc560 -#define DIV_PERIL5 0xc564 -#define E4X12_DIV_CAM1 0xc568 -#define E4X12_GATE_BUS_FSYS1 0xc744 -#define GATE_SCLK_CAM 0xc820 -#define GATE_IP_CAM 0xc920 -#define GATE_IP_TV 0xc924 -#define GATE_IP_MFC 0xc928 -#define GATE_IP_G3D 0xc92c -#define E4210_GATE_IP_IMAGE 0xc930 -#define GATE_IP_LCD0 0xc934 -#define E4210_GATE_IP_LCD1 0xc938 -#define E4X12_GATE_IP_ISP 0xc938 -#define E4X12_GATE_IP_MAUDIO 0xc93c -#define GATE_IP_FSYS 0xc940 -#define GATE_IP_GPS 0xc94c -#define GATE_IP_PERIL 0xc950 -#define E4210_GATE_IP_PERIR 0xc960 -#define GATE_BLOCK 0xc970 -#define CLKOUT_CMU_TOP 0xca00 -#define E4X12_MPLL_LOCK 0x10008 -#define E4X12_MPLL_CON0 0x10108 -#define SRC_DMC 0x10200 -#define SRC_MASK_DMC 0x10300 -#define DIV_DMC0 0x10500 -#define DIV_DMC1 0x10504 -#define GATE_IP_DMC 0x10900 -#define CLKOUT_CMU_DMC 0x10a00 -#define APLL_LOCK 0x14000 -#define E4210_MPLL_LOCK 0x14008 -#define APLL_CON0 0x14100 -#define E4210_MPLL_CON0 0x14108 -#define SRC_CPU 0x14200 -#define DIV_CPU0 0x14500 -#define DIV_CPU1 0x14504 -#define GATE_SCLK_CPU 0x14800 -#define GATE_IP_CPU 0x14900 -#define CLKOUT_CMU_CPU 0x14a00 -#define PWR_CTRL1 0x15020 -#define E4X12_PWR_CTRL2 0x15024 -#define E4X12_DIV_ISP0 0x18300 -#define E4X12_DIV_ISP1 0x18304 -#define E4X12_GATE_ISP0 0x18800 -#define E4X12_GATE_ISP1 0x18804 - -/* Below definitions are used for PWR_CTRL settings */ -#define PWR_CTRL1_CORE2_DOWN_RATIO(x) (((x) & 0x7) << 28) -#define PWR_CTRL1_CORE1_DOWN_RATIO(x) (((x) & 0x7) << 16) -#define PWR_CTRL1_DIV2_DOWN_EN (1 << 9) -#define PWR_CTRL1_DIV1_DOWN_EN (1 << 8) -#define PWR_CTRL1_USE_CORE3_WFE (1 << 7) -#define PWR_CTRL1_USE_CORE2_WFE (1 << 6) -#define PWR_CTRL1_USE_CORE1_WFE (1 << 5) -#define PWR_CTRL1_USE_CORE0_WFE (1 << 4) -#define PWR_CTRL1_USE_CORE3_WFI (1 << 3) -#define PWR_CTRL1_USE_CORE2_WFI (1 << 2) -#define PWR_CTRL1_USE_CORE1_WFI (1 << 1) -#define PWR_CTRL1_USE_CORE0_WFI (1 << 0) - -/* the exynos4 soc type */ -enum exynos4_soc { - EXYNOS4210, - EXYNOS4X12, -}; - -/* list of PLLs to be registered */ -enum exynos4_plls { - apll, mpll, epll, vpll, - nr_plls /* number of PLLs */ -}; - -static void __iomem *reg_base; -static enum exynos4_soc exynos4_soc; - -/* - * Support for CMU save/restore across system suspends - */ -#ifdef CONFIG_PM_SLEEP -static struct samsung_clk_reg_dump *exynos4_save_common; -static struct samsung_clk_reg_dump *exynos4_save_soc; -static struct samsung_clk_reg_dump *exynos4_save_pll; - -/* - * list of controller registers to be saved and restored during a - * suspend/resume cycle. - */ -static const unsigned long exynos4210_clk_save[] __initconst = { - E4210_SRC_IMAGE, - E4210_SRC_LCD1, - E4210_SRC_MASK_LCD1, - E4210_DIV_LCD1, - E4210_GATE_IP_IMAGE, - E4210_GATE_IP_LCD1, - E4210_GATE_IP_PERIR, - E4210_MPLL_CON0, - PWR_CTRL1, -}; - -static const unsigned long exynos4x12_clk_save[] __initconst = { - E4X12_GATE_IP_IMAGE, - E4X12_GATE_IP_PERIR, - E4X12_SRC_CAM1, - E4X12_DIV_ISP, - E4X12_DIV_CAM1, - E4X12_MPLL_CON0, - PWR_CTRL1, - E4X12_PWR_CTRL2, -}; - -static const unsigned long exynos4_clk_pll_regs[] __initconst = { - EPLL_LOCK, - VPLL_LOCK, - EPLL_CON0, - EPLL_CON1, - EPLL_CON2, - VPLL_CON0, - VPLL_CON1, - VPLL_CON2, -}; - -static const unsigned long exynos4_clk_regs[] __initconst = { - SRC_LEFTBUS, - DIV_LEFTBUS, - GATE_IP_LEFTBUS, - SRC_RIGHTBUS, - DIV_RIGHTBUS, - GATE_IP_RIGHTBUS, - SRC_TOP0, - SRC_TOP1, - SRC_CAM, - SRC_TV, - SRC_MFC, - SRC_G3D, - SRC_LCD0, - SRC_MAUDIO, - SRC_FSYS, - SRC_PERIL0, - SRC_PERIL1, - SRC_MASK_TOP, - SRC_MASK_CAM, - SRC_MASK_TV, - SRC_MASK_LCD0, - SRC_MASK_MAUDIO, - SRC_MASK_FSYS, - SRC_MASK_PERIL0, - SRC_MASK_PERIL1, - DIV_TOP, - DIV_CAM, - DIV_TV, - DIV_MFC, - DIV_G3D, - DIV_IMAGE, - DIV_LCD0, - DIV_MAUDIO, - DIV_FSYS0, - DIV_FSYS1, - DIV_FSYS2, - DIV_FSYS3, - DIV_PERIL0, - DIV_PERIL1, - DIV_PERIL2, - DIV_PERIL3, - DIV_PERIL4, - DIV_PERIL5, - GATE_SCLK_CAM, - GATE_IP_CAM, - GATE_IP_TV, - GATE_IP_MFC, - GATE_IP_G3D, - GATE_IP_LCD0, - GATE_IP_FSYS, - GATE_IP_GPS, - GATE_IP_PERIL, - GATE_BLOCK, - SRC_MASK_DMC, - SRC_DMC, - DIV_DMC0, - DIV_DMC1, - GATE_IP_DMC, - APLL_CON0, - SRC_CPU, - DIV_CPU0, - DIV_CPU1, - GATE_SCLK_CPU, - GATE_IP_CPU, - CLKOUT_CMU_LEFTBUS, - CLKOUT_CMU_RIGHTBUS, - CLKOUT_CMU_TOP, - CLKOUT_CMU_DMC, - CLKOUT_CMU_CPU, -}; - -static const struct samsung_clk_reg_dump src_mask_suspend[] = { - { .offset = SRC_MASK_TOP, .value = 0x00000001, }, - { .offset = SRC_MASK_CAM, .value = 0x11111111, }, - { .offset = SRC_MASK_TV, .value = 0x00000111, }, - { .offset = SRC_MASK_LCD0, .value = 0x00001111, }, - { .offset = SRC_MASK_MAUDIO, .value = 0x00000001, }, - { .offset = SRC_MASK_FSYS, .value = 0x01011111, }, - { .offset = SRC_MASK_PERIL0, .value = 0x01111111, }, - { .offset = SRC_MASK_PERIL1, .value = 0x01110111, }, - { .offset = SRC_MASK_DMC, .value = 0x00010000, }, -}; - -static const struct samsung_clk_reg_dump src_mask_suspend_e4210[] = { - { .offset = E4210_SRC_MASK_LCD1, .value = 0x00001111, }, -}; - -#define PLL_ENABLED (1 << 31) -#define PLL_LOCKED (1 << 29) - -static void exynos4_clk_wait_for_pll(u32 reg) -{ - u32 pll_con; - - pll_con = readl(reg_base + reg); - if (!(pll_con & PLL_ENABLED)) - return; - - while (!(pll_con & PLL_LOCKED)) { - cpu_relax(); - pll_con = readl(reg_base + reg); - } -} - -static int exynos4_clk_suspend(void) -{ - samsung_clk_save(reg_base, exynos4_save_common, - ARRAY_SIZE(exynos4_clk_regs)); - samsung_clk_save(reg_base, exynos4_save_pll, - ARRAY_SIZE(exynos4_clk_pll_regs)); - - if (exynos4_soc == EXYNOS4210) { - samsung_clk_save(reg_base, exynos4_save_soc, - ARRAY_SIZE(exynos4210_clk_save)); - samsung_clk_restore(reg_base, src_mask_suspend_e4210, - ARRAY_SIZE(src_mask_suspend_e4210)); - } else { - samsung_clk_save(reg_base, exynos4_save_soc, - ARRAY_SIZE(exynos4x12_clk_save)); - } - - samsung_clk_restore(reg_base, src_mask_suspend, - ARRAY_SIZE(src_mask_suspend)); - - return 0; -} - -static void exynos4_clk_resume(void) -{ - samsung_clk_restore(reg_base, exynos4_save_pll, - ARRAY_SIZE(exynos4_clk_pll_regs)); - - exynos4_clk_wait_for_pll(EPLL_CON0); - exynos4_clk_wait_for_pll(VPLL_CON0); - - samsung_clk_restore(reg_base, exynos4_save_common, - ARRAY_SIZE(exynos4_clk_regs)); - - if (exynos4_soc == EXYNOS4210) - samsung_clk_restore(reg_base, exynos4_save_soc, - ARRAY_SIZE(exynos4210_clk_save)); - else - samsung_clk_restore(reg_base, exynos4_save_soc, - ARRAY_SIZE(exynos4x12_clk_save)); -} - -static struct syscore_ops exynos4_clk_syscore_ops = { - .suspend = exynos4_clk_suspend, - .resume = exynos4_clk_resume, -}; - -static void __init exynos4_clk_sleep_init(void) -{ - exynos4_save_common = samsung_clk_alloc_reg_dump(exynos4_clk_regs, - ARRAY_SIZE(exynos4_clk_regs)); - if (!exynos4_save_common) - goto err_warn; - - if (exynos4_soc == EXYNOS4210) - exynos4_save_soc = samsung_clk_alloc_reg_dump( - exynos4210_clk_save, - ARRAY_SIZE(exynos4210_clk_save)); - else - exynos4_save_soc = samsung_clk_alloc_reg_dump( - exynos4x12_clk_save, - ARRAY_SIZE(exynos4x12_clk_save)); - if (!exynos4_save_soc) - goto err_common; - - exynos4_save_pll = samsung_clk_alloc_reg_dump(exynos4_clk_pll_regs, - ARRAY_SIZE(exynos4_clk_pll_regs)); - if (!exynos4_save_pll) - goto err_soc; - - register_syscore_ops(&exynos4_clk_syscore_ops); - return; - -err_soc: - kfree(exynos4_save_soc); -err_common: - kfree(exynos4_save_common); -err_warn: - pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", - __func__); -} -#else -static void __init exynos4_clk_sleep_init(void) {} -#endif - -/* list of all parent clock list */ -PNAME(mout_apll_p) = { "fin_pll", "fout_apll", }; -PNAME(mout_mpll_p) = { "fin_pll", "fout_mpll", }; -PNAME(mout_epll_p) = { "fin_pll", "fout_epll", }; -PNAME(mout_vpllsrc_p) = { "fin_pll", "sclk_hdmi24m", }; -PNAME(mout_vpll_p) = { "fin_pll", "fout_vpll", }; -PNAME(sclk_evpll_p) = { "sclk_epll", "sclk_vpll", }; -PNAME(mout_mfc_p) = { "mout_mfc0", "mout_mfc1", }; -PNAME(mout_g3d_p) = { "mout_g3d0", "mout_g3d1", }; -PNAME(mout_g2d_p) = { "mout_g2d0", "mout_g2d1", }; -PNAME(mout_hdmi_p) = { "sclk_pixel", "sclk_hdmiphy", }; -PNAME(mout_jpeg_p) = { "mout_jpeg0", "mout_jpeg1", }; -PNAME(mout_spdif_p) = { "sclk_audio0", "sclk_audio1", "sclk_audio2", - "spdif_extclk", }; -PNAME(mout_onenand_p) = {"aclk133", "aclk160", }; -PNAME(mout_onenand1_p) = {"mout_onenand", "sclk_vpll", }; - -/* Exynos 4210-specific parent groups */ -PNAME(sclk_vpll_p4210) = { "mout_vpllsrc", "fout_vpll", }; -PNAME(mout_core_p4210) = { "mout_apll", "sclk_mpll", }; -PNAME(sclk_ampll_p4210) = { "sclk_mpll", "sclk_apll", }; -PNAME(group1_p4210) = { "xxti", "xusbxti", "sclk_hdmi24m", - "sclk_usbphy0", "none", "sclk_hdmiphy", - "sclk_mpll", "sclk_epll", "sclk_vpll", }; -PNAME(mout_audio0_p4210) = { "cdclk0", "none", "sclk_hdmi24m", - "sclk_usbphy0", "xxti", "xusbxti", "sclk_mpll", - "sclk_epll", "sclk_vpll" }; -PNAME(mout_audio1_p4210) = { "cdclk1", "none", "sclk_hdmi24m", - "sclk_usbphy0", "xxti", "xusbxti", "sclk_mpll", - "sclk_epll", "sclk_vpll", }; -PNAME(mout_audio2_p4210) = { "cdclk2", "none", "sclk_hdmi24m", - "sclk_usbphy0", "xxti", "xusbxti", "sclk_mpll", - "sclk_epll", "sclk_vpll", }; -PNAME(mout_mixer_p4210) = { "sclk_dac", "sclk_hdmi", }; -PNAME(mout_dac_p4210) = { "sclk_vpll", "sclk_hdmiphy", }; -PNAME(mout_pwi_p4210) = { "xxti", "xusbxti", "sclk_hdmi24m", "sclk_usbphy0", - "sclk_usbphy1", "sclk_hdmiphy", "none", - "sclk_epll", "sclk_vpll" }; -PNAME(clkout_left_p4210) = { "sclk_mpll_div_2", "sclk_apll_div_2", - "div_gdl", "div_gpl" }; -PNAME(clkout_right_p4210) = { "sclk_mpll_div_2", "sclk_apll_div_2", - "div_gdr", "div_gpr" }; -PNAME(clkout_top_p4210) = { "fout_epll", "fout_vpll", "sclk_hdmi24m", - "sclk_usbphy0", "sclk_usbphy1", "sclk_hdmiphy", - "cdclk0", "cdclk1", "cdclk2", "spdif_extclk", - "aclk160", "aclk133", "aclk200", "aclk100", - "sclk_mfc", "sclk_g3d", "sclk_g2d", - "cam_a_pclk", "cam_b_pclk", "s_rxbyteclkhs0_2l", - "s_rxbyteclkhs0_4l" }; -PNAME(clkout_dmc_p4210) = { "div_dmcd", "div_dmcp", "div_acp_pclk", "div_dmc", - "div_dphy", "none", "div_pwi" }; -PNAME(clkout_cpu_p4210) = { "fout_apll_div_2", "none", "fout_mpll_div_2", - "none", "arm_clk_div_2", "div_corem0", - "div_corem1", "div_corem0", "div_atb", - "div_periph", "div_pclk_dbg", "div_hpm" }; - -/* Exynos 4x12-specific parent groups */ -PNAME(mout_mpll_user_p4x12) = { "fin_pll", "sclk_mpll", }; -PNAME(mout_core_p4x12) = { "mout_apll", "mout_mpll_user_c", }; -PNAME(mout_gdl_p4x12) = { "mout_mpll_user_l", "sclk_apll", }; -PNAME(mout_gdr_p4x12) = { "mout_mpll_user_r", "sclk_apll", }; -PNAME(sclk_ampll_p4x12) = { "mout_mpll_user_t", "sclk_apll", }; -PNAME(group1_p4x12) = { "xxti", "xusbxti", "sclk_hdmi24m", "sclk_usbphy0", - "none", "sclk_hdmiphy", "mout_mpll_user_t", - "sclk_epll", "sclk_vpll", }; -PNAME(mout_audio0_p4x12) = { "cdclk0", "none", "sclk_hdmi24m", - "sclk_usbphy0", "xxti", "xusbxti", - "mout_mpll_user_t", "sclk_epll", "sclk_vpll" }; -PNAME(mout_audio1_p4x12) = { "cdclk1", "none", "sclk_hdmi24m", - "sclk_usbphy0", "xxti", "xusbxti", - "mout_mpll_user_t", "sclk_epll", "sclk_vpll", }; -PNAME(mout_audio2_p4x12) = { "cdclk2", "none", "sclk_hdmi24m", - "sclk_usbphy0", "xxti", "xusbxti", - "mout_mpll_user_t", "sclk_epll", "sclk_vpll", }; -PNAME(aclk_p4412) = { "mout_mpll_user_t", "sclk_apll", }; -PNAME(mout_user_aclk400_mcuisp_p4x12) = {"fin_pll", "div_aclk400_mcuisp", }; -PNAME(mout_user_aclk200_p4x12) = {"fin_pll", "div_aclk200", }; -PNAME(mout_user_aclk266_gps_p4x12) = {"fin_pll", "div_aclk266_gps", }; -PNAME(mout_pwi_p4x12) = { "xxti", "xusbxti", "sclk_hdmi24m", "sclk_usbphy0", - "none", "sclk_hdmiphy", "sclk_mpll", - "sclk_epll", "sclk_vpll" }; -PNAME(clkout_left_p4x12) = { "sclk_mpll_user_l_div_2", "sclk_apll_div_2", - "div_gdl", "div_gpl" }; -PNAME(clkout_right_p4x12) = { "sclk_mpll_user_r_div_2", "sclk_apll_div_2", - "div_gdr", "div_gpr" }; -PNAME(clkout_top_p4x12) = { "fout_epll", "fout_vpll", "sclk_hdmi24m", - "sclk_usbphy0", "none", "sclk_hdmiphy", - "cdclk0", "cdclk1", "cdclk2", "spdif_extclk", - "aclk160", "aclk133", "aclk200", "aclk100", - "sclk_mfc", "sclk_g3d", "aclk400_mcuisp", - "cam_a_pclk", "cam_b_pclk", "s_rxbyteclkhs0_2l", - "s_rxbyteclkhs0_4l", "rx_half_byte_clk_csis0", - "rx_half_byte_clk_csis1", "div_jpeg", - "sclk_pwm_isp", "sclk_spi0_isp", - "sclk_spi1_isp", "sclk_uart_isp", - "sclk_mipihsi", "sclk_hdmi", "sclk_fimd0", - "sclk_pcm0" }; -PNAME(clkout_dmc_p4x12) = { "div_dmcd", "div_dmcp", "aclk_acp", "div_acp_pclk", - "div_dmc", "div_dphy", "fout_mpll_div_2", - "div_pwi", "none", "div_c2c", "div_c2c_aclk" }; -PNAME(clkout_cpu_p4x12) = { "fout_apll_div_2", "none", "none", "none", - "arm_clk_div_2", "div_corem0", "div_corem1", - "div_cores", "div_atb", "div_periph", - "div_pclk_dbg", "div_hpm" }; - -/* fixed rate clocks generated outside the soc */ -static struct samsung_fixed_rate_clock exynos4_fixed_rate_ext_clks[] __initdata = { - FRATE(CLK_XXTI, "xxti", NULL, 0, 0), - FRATE(CLK_XUSBXTI, "xusbxti", NULL, 0, 0), -}; - -/* fixed rate clocks generated inside the soc */ -static const struct samsung_fixed_rate_clock exynos4_fixed_rate_clks[] __initconst = { - FRATE(0, "sclk_hdmi24m", NULL, 0, 24000000), - FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", "hdmi", 0, 27000000), - FRATE(0, "sclk_usbphy0", NULL, 0, 48000000), -}; - -static const struct samsung_fixed_rate_clock exynos4210_fixed_rate_clks[] __initconst = { - FRATE(0, "sclk_usbphy1", NULL, 0, 48000000), -}; - -static const struct samsung_fixed_factor_clock exynos4_fixed_factor_clks[] __initconst = { - FFACTOR(0, "sclk_apll_div_2", "sclk_apll", 1, 2, 0), - FFACTOR(0, "fout_mpll_div_2", "fout_mpll", 1, 2, 0), - FFACTOR(0, "fout_apll_div_2", "fout_apll", 1, 2, 0), - FFACTOR(0, "arm_clk_div_2", "div_core2", 1, 2, 0), -}; - -static const struct samsung_fixed_factor_clock exynos4210_fixed_factor_clks[] __initconst = { - FFACTOR(0, "sclk_mpll_div_2", "sclk_mpll", 1, 2, 0), -}; - -static const struct samsung_fixed_factor_clock exynos4x12_fixed_factor_clks[] __initconst = { - FFACTOR(0, "sclk_mpll_user_l_div_2", "mout_mpll_user_l", 1, 2, 0), - FFACTOR(0, "sclk_mpll_user_r_div_2", "mout_mpll_user_r", 1, 2, 0), - FFACTOR(0, "sclk_mpll_user_t_div_2", "mout_mpll_user_t", 1, 2, 0), - FFACTOR(0, "sclk_mpll_user_c_div_2", "mout_mpll_user_c", 1, 2, 0), -}; - -/* list of mux clocks supported in all exynos4 soc's */ -static const struct samsung_mux_clock exynos4_mux_clks[] __initconst = { - MUX_FA(CLK_MOUT_APLL, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, - CLK_SET_RATE_PARENT | CLK_RECALC_NEW_RATES, 0, - "mout_apll"), - MUX(CLK_MOUT_HDMI, "mout_hdmi", mout_hdmi_p, SRC_TV, 0, 1), - MUX(0, "mout_mfc1", sclk_evpll_p, SRC_MFC, 4, 1), - MUX(0, "mout_mfc", mout_mfc_p, SRC_MFC, 8, 1), - MUX_F(CLK_MOUT_G3D1, "mout_g3d1", sclk_evpll_p, SRC_G3D, 4, 1, - CLK_SET_RATE_PARENT, 0), - MUX_F(CLK_MOUT_G3D, "mout_g3d", mout_g3d_p, SRC_G3D, 8, 1, - CLK_SET_RATE_PARENT, 0), - MUX(0, "mout_spdif", mout_spdif_p, SRC_PERIL1, 8, 2), - MUX(0, "mout_onenand1", mout_onenand1_p, SRC_TOP0, 0, 1), - MUX(CLK_SCLK_EPLL, "sclk_epll", mout_epll_p, SRC_TOP0, 4, 1), - MUX(0, "mout_onenand", mout_onenand_p, SRC_TOP0, 28, 1), - - MUX(0, "mout_dmc_bus", sclk_ampll_p4210, SRC_DMC, 4, 1), - MUX(0, "mout_dphy", sclk_ampll_p4210, SRC_DMC, 8, 1), -}; - -/* list of mux clocks supported in exynos4210 soc */ -static const struct samsung_mux_clock exynos4210_mux_early[] __initconst = { - MUX(0, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP1, 0, 1), -}; - -static const struct samsung_mux_clock exynos4210_mux_clks[] __initconst = { - MUX(0, "mout_gdl", sclk_ampll_p4210, SRC_LEFTBUS, 0, 1), - MUX(0, "mout_clkout_leftbus", clkout_left_p4210, - CLKOUT_CMU_LEFTBUS, 0, 5), - - MUX(0, "mout_gdr", sclk_ampll_p4210, SRC_RIGHTBUS, 0, 1), - MUX(0, "mout_clkout_rightbus", clkout_right_p4210, - CLKOUT_CMU_RIGHTBUS, 0, 5), - - MUX(0, "mout_aclk200", sclk_ampll_p4210, SRC_TOP0, 12, 1), - MUX(0, "mout_aclk100", sclk_ampll_p4210, SRC_TOP0, 16, 1), - MUX(0, "mout_aclk160", sclk_ampll_p4210, SRC_TOP0, 20, 1), - MUX(0, "mout_aclk133", sclk_ampll_p4210, SRC_TOP0, 24, 1), - MUX(CLK_MOUT_MIXER, "mout_mixer", mout_mixer_p4210, SRC_TV, 4, 1), - MUX(0, "mout_dac", mout_dac_p4210, SRC_TV, 8, 1), - MUX(0, "mout_g2d0", sclk_ampll_p4210, E4210_SRC_IMAGE, 0, 1), - MUX(0, "mout_g2d1", sclk_evpll_p, E4210_SRC_IMAGE, 4, 1), - MUX(0, "mout_g2d", mout_g2d_p, E4210_SRC_IMAGE, 8, 1), - MUX(0, "mout_fimd1", group1_p4210, E4210_SRC_LCD1, 0, 4), - MUX(0, "mout_mipi1", group1_p4210, E4210_SRC_LCD1, 12, 4), - MUX(CLK_SCLK_MPLL, "sclk_mpll", mout_mpll_p, SRC_CPU, 8, 1), - MUX(CLK_MOUT_CORE, "mout_core", mout_core_p4210, SRC_CPU, 16, 1), - MUX(0, "mout_hpm", mout_core_p4210, SRC_CPU, 20, 1), - MUX(CLK_SCLK_VPLL, "sclk_vpll", sclk_vpll_p4210, SRC_TOP0, 8, 1), - MUX(CLK_MOUT_FIMC0, "mout_fimc0", group1_p4210, SRC_CAM, 0, 4), - MUX(CLK_MOUT_FIMC1, "mout_fimc1", group1_p4210, SRC_CAM, 4, 4), - MUX(CLK_MOUT_FIMC2, "mout_fimc2", group1_p4210, SRC_CAM, 8, 4), - MUX(CLK_MOUT_FIMC3, "mout_fimc3", group1_p4210, SRC_CAM, 12, 4), - MUX(CLK_MOUT_CAM0, "mout_cam0", group1_p4210, SRC_CAM, 16, 4), - MUX(CLK_MOUT_CAM1, "mout_cam1", group1_p4210, SRC_CAM, 20, 4), - MUX(CLK_MOUT_CSIS0, "mout_csis0", group1_p4210, SRC_CAM, 24, 4), - MUX(CLK_MOUT_CSIS1, "mout_csis1", group1_p4210, SRC_CAM, 28, 4), - MUX(0, "mout_mfc0", sclk_ampll_p4210, SRC_MFC, 0, 1), - MUX_F(CLK_MOUT_G3D0, "mout_g3d0", sclk_ampll_p4210, SRC_G3D, 0, 1, - CLK_SET_RATE_PARENT, 0), - MUX(0, "mout_fimd0", group1_p4210, SRC_LCD0, 0, 4), - MUX(0, "mout_mipi0", group1_p4210, SRC_LCD0, 12, 4), - MUX(0, "mout_audio0", mout_audio0_p4210, SRC_MAUDIO, 0, 4), - MUX(0, "mout_mmc0", group1_p4210, SRC_FSYS, 0, 4), - MUX(0, "mout_mmc1", group1_p4210, SRC_FSYS, 4, 4), - MUX(0, "mout_mmc2", group1_p4210, SRC_FSYS, 8, 4), - MUX(0, "mout_mmc3", group1_p4210, SRC_FSYS, 12, 4), - MUX(0, "mout_mmc4", group1_p4210, SRC_FSYS, 16, 4), - MUX(0, "mout_sata", sclk_ampll_p4210, SRC_FSYS, 24, 1), - MUX(0, "mout_uart0", group1_p4210, SRC_PERIL0, 0, 4), - MUX(0, "mout_uart1", group1_p4210, SRC_PERIL0, 4, 4), - MUX(0, "mout_uart2", group1_p4210, SRC_PERIL0, 8, 4), - MUX(0, "mout_uart3", group1_p4210, SRC_PERIL0, 12, 4), - MUX(0, "mout_uart4", group1_p4210, SRC_PERIL0, 16, 4), - MUX(0, "mout_audio1", mout_audio1_p4210, SRC_PERIL1, 0, 4), - MUX(0, "mout_audio2", mout_audio2_p4210, SRC_PERIL1, 4, 4), - MUX(0, "mout_spi0", group1_p4210, SRC_PERIL1, 16, 4), - MUX(0, "mout_spi1", group1_p4210, SRC_PERIL1, 20, 4), - MUX(0, "mout_spi2", group1_p4210, SRC_PERIL1, 24, 4), - MUX(0, "mout_clkout_top", clkout_top_p4210, CLKOUT_CMU_TOP, 0, 5), - - MUX(0, "mout_pwi", mout_pwi_p4210, SRC_DMC, 16, 4), - MUX(0, "mout_clkout_dmc", clkout_dmc_p4210, CLKOUT_CMU_DMC, 0, 5), - - MUX(0, "mout_clkout_cpu", clkout_cpu_p4210, CLKOUT_CMU_CPU, 0, 5), -}; - -/* list of mux clocks supported in exynos4x12 soc */ -static const struct samsung_mux_clock exynos4x12_mux_clks[] __initconst = { - MUX(0, "mout_mpll_user_l", mout_mpll_p, SRC_LEFTBUS, 4, 1), - MUX(0, "mout_gdl", mout_gdl_p4x12, SRC_LEFTBUS, 0, 1), - MUX(0, "mout_clkout_leftbus", clkout_left_p4x12, - CLKOUT_CMU_LEFTBUS, 0, 5), - - MUX(0, "mout_mpll_user_r", mout_mpll_p, SRC_RIGHTBUS, 4, 1), - MUX(0, "mout_gdr", mout_gdr_p4x12, SRC_RIGHTBUS, 0, 1), - MUX(0, "mout_clkout_rightbus", clkout_right_p4x12, - CLKOUT_CMU_RIGHTBUS, 0, 5), - - MUX(CLK_MOUT_MPLL_USER_C, "mout_mpll_user_c", mout_mpll_user_p4x12, - SRC_CPU, 24, 1), - MUX(0, "mout_clkout_cpu", clkout_cpu_p4x12, CLKOUT_CMU_CPU, 0, 5), - - MUX(0, "mout_aclk266_gps", aclk_p4412, SRC_TOP1, 4, 1), - MUX(0, "mout_aclk400_mcuisp", aclk_p4412, SRC_TOP1, 8, 1), - MUX(CLK_MOUT_MPLL_USER_T, "mout_mpll_user_t", mout_mpll_user_p4x12, - SRC_TOP1, 12, 1), - MUX(0, "mout_user_aclk266_gps", mout_user_aclk266_gps_p4x12, - SRC_TOP1, 16, 1), - MUX(CLK_ACLK200, "aclk200", mout_user_aclk200_p4x12, SRC_TOP1, 20, 1), - MUX(CLK_ACLK400_MCUISP, "aclk400_mcuisp", - mout_user_aclk400_mcuisp_p4x12, SRC_TOP1, 24, 1), - MUX(0, "mout_aclk200", aclk_p4412, SRC_TOP0, 12, 1), - MUX(0, "mout_aclk100", aclk_p4412, SRC_TOP0, 16, 1), - MUX(0, "mout_aclk160", aclk_p4412, SRC_TOP0, 20, 1), - MUX(0, "mout_aclk133", aclk_p4412, SRC_TOP0, 24, 1), - MUX(0, "mout_mdnie0", group1_p4x12, SRC_LCD0, 4, 4), - MUX(0, "mout_mdnie_pwm0", group1_p4x12, SRC_LCD0, 8, 4), - MUX(0, "mout_sata", sclk_ampll_p4x12, SRC_FSYS, 24, 1), - MUX(0, "mout_jpeg0", sclk_ampll_p4x12, E4X12_SRC_CAM1, 0, 1), - MUX(0, "mout_jpeg1", sclk_evpll_p, E4X12_SRC_CAM1, 4, 1), - MUX(0, "mout_jpeg", mout_jpeg_p, E4X12_SRC_CAM1, 8, 1), - MUX(CLK_SCLK_MPLL, "sclk_mpll", mout_mpll_p, SRC_DMC, 12, 1), - MUX(CLK_SCLK_VPLL, "sclk_vpll", mout_vpll_p, SRC_TOP0, 8, 1), - MUX(CLK_MOUT_CORE, "mout_core", mout_core_p4x12, SRC_CPU, 16, 1), - MUX(0, "mout_hpm", mout_core_p4x12, SRC_CPU, 20, 1), - MUX(CLK_MOUT_FIMC0, "mout_fimc0", group1_p4x12, SRC_CAM, 0, 4), - MUX(CLK_MOUT_FIMC1, "mout_fimc1", group1_p4x12, SRC_CAM, 4, 4), - MUX(CLK_MOUT_FIMC2, "mout_fimc2", group1_p4x12, SRC_CAM, 8, 4), - MUX(CLK_MOUT_FIMC3, "mout_fimc3", group1_p4x12, SRC_CAM, 12, 4), - MUX(CLK_MOUT_CAM0, "mout_cam0", group1_p4x12, SRC_CAM, 16, 4), - MUX(CLK_MOUT_CAM1, "mout_cam1", group1_p4x12, SRC_CAM, 20, 4), - MUX(CLK_MOUT_CSIS0, "mout_csis0", group1_p4x12, SRC_CAM, 24, 4), - MUX(CLK_MOUT_CSIS1, "mout_csis1", group1_p4x12, SRC_CAM, 28, 4), - MUX(0, "mout_mfc0", sclk_ampll_p4x12, SRC_MFC, 0, 1), - MUX_F(CLK_MOUT_G3D0, "mout_g3d0", sclk_ampll_p4x12, SRC_G3D, 0, 1, - CLK_SET_RATE_PARENT, 0), - MUX(0, "mout_fimd0", group1_p4x12, SRC_LCD0, 0, 4), - MUX(0, "mout_mipi0", group1_p4x12, SRC_LCD0, 12, 4), - MUX(0, "mout_audio0", mout_audio0_p4x12, SRC_MAUDIO, 0, 4), - MUX(0, "mout_mmc0", group1_p4x12, SRC_FSYS, 0, 4), - MUX(0, "mout_mmc1", group1_p4x12, SRC_FSYS, 4, 4), - MUX(0, "mout_mmc2", group1_p4x12, SRC_FSYS, 8, 4), - MUX(0, "mout_mmc3", group1_p4x12, SRC_FSYS, 12, 4), - MUX(0, "mout_mmc4", group1_p4x12, SRC_FSYS, 16, 4), - MUX(0, "mout_mipihsi", aclk_p4412, SRC_FSYS, 24, 1), - MUX(0, "mout_uart0", group1_p4x12, SRC_PERIL0, 0, 4), - MUX(0, "mout_uart1", group1_p4x12, SRC_PERIL0, 4, 4), - MUX(0, "mout_uart2", group1_p4x12, SRC_PERIL0, 8, 4), - MUX(0, "mout_uart3", group1_p4x12, SRC_PERIL0, 12, 4), - MUX(0, "mout_uart4", group1_p4x12, SRC_PERIL0, 16, 4), - MUX(0, "mout_audio1", mout_audio1_p4x12, SRC_PERIL1, 0, 4), - MUX(0, "mout_audio2", mout_audio2_p4x12, SRC_PERIL1, 4, 4), - MUX(0, "mout_spi0", group1_p4x12, SRC_PERIL1, 16, 4), - MUX(0, "mout_spi1", group1_p4x12, SRC_PERIL1, 20, 4), - MUX(0, "mout_spi2", group1_p4x12, SRC_PERIL1, 24, 4), - MUX(0, "mout_pwm_isp", group1_p4x12, E4X12_SRC_ISP, 0, 4), - MUX(0, "mout_spi0_isp", group1_p4x12, E4X12_SRC_ISP, 4, 4), - MUX(0, "mout_spi1_isp", group1_p4x12, E4X12_SRC_ISP, 8, 4), - MUX(0, "mout_uart_isp", group1_p4x12, E4X12_SRC_ISP, 12, 4), - MUX(0, "mout_clkout_top", clkout_top_p4x12, CLKOUT_CMU_TOP, 0, 5), - - MUX(0, "mout_c2c", sclk_ampll_p4210, SRC_DMC, 0, 1), - MUX(0, "mout_pwi", mout_pwi_p4x12, SRC_DMC, 16, 4), - MUX(0, "mout_g2d0", sclk_ampll_p4210, SRC_DMC, 20, 1), - MUX(0, "mout_g2d1", sclk_evpll_p, SRC_DMC, 24, 1), - MUX(0, "mout_g2d", mout_g2d_p, SRC_DMC, 28, 1), - MUX(0, "mout_clkout_dmc", clkout_dmc_p4x12, CLKOUT_CMU_DMC, 0, 5), -}; - -/* list of divider clocks supported in all exynos4 soc's */ -static const struct samsung_div_clock exynos4_div_clks[] __initconst = { - DIV(CLK_DIV_GDL, "div_gdl", "mout_gdl", DIV_LEFTBUS, 0, 3), - DIV(0, "div_gpl", "div_gdl", DIV_LEFTBUS, 4, 3), - DIV(0, "div_clkout_leftbus", "mout_clkout_leftbus", - CLKOUT_CMU_LEFTBUS, 8, 6), - - DIV(CLK_DIV_GDR, "div_gdr", "mout_gdr", DIV_RIGHTBUS, 0, 3), - DIV(0, "div_gpr", "div_gdr", DIV_RIGHTBUS, 4, 3), - DIV(0, "div_clkout_rightbus", "mout_clkout_rightbus", - CLKOUT_CMU_RIGHTBUS, 8, 6), - - DIV(0, "div_core", "mout_core", DIV_CPU0, 0, 3), - DIV(0, "div_corem0", "div_core2", DIV_CPU0, 4, 3), - DIV(0, "div_corem1", "div_core2", DIV_CPU0, 8, 3), - DIV(0, "div_periph", "div_core2", DIV_CPU0, 12, 3), - DIV(0, "div_atb", "mout_core", DIV_CPU0, 16, 3), - DIV(0, "div_pclk_dbg", "div_atb", DIV_CPU0, 20, 3), - DIV(CLK_ARM_CLK, "div_core2", "div_core", DIV_CPU0, 28, 3), - DIV(0, "div_copy", "mout_hpm", DIV_CPU1, 0, 3), - DIV(0, "div_hpm", "div_copy", DIV_CPU1, 4, 3), - DIV(0, "div_clkout_cpu", "mout_clkout_cpu", CLKOUT_CMU_CPU, 8, 6), - - DIV(0, "div_fimc0", "mout_fimc0", DIV_CAM, 0, 4), - DIV(0, "div_fimc1", "mout_fimc1", DIV_CAM, 4, 4), - DIV(0, "div_fimc2", "mout_fimc2", DIV_CAM, 8, 4), - DIV(0, "div_fimc3", "mout_fimc3", DIV_CAM, 12, 4), - DIV(0, "div_cam0", "mout_cam0", DIV_CAM, 16, 4), - DIV(0, "div_cam1", "mout_cam1", DIV_CAM, 20, 4), - DIV(0, "div_csis0", "mout_csis0", DIV_CAM, 24, 4), - DIV(0, "div_csis1", "mout_csis1", DIV_CAM, 28, 4), - DIV(CLK_SCLK_MFC, "sclk_mfc", "mout_mfc", DIV_MFC, 0, 4), - DIV(CLK_SCLK_G3D, "sclk_g3d", "mout_g3d", DIV_G3D, 0, 4), - DIV(0, "div_fimd0", "mout_fimd0", DIV_LCD0, 0, 4), - DIV(0, "div_mipi0", "mout_mipi0", DIV_LCD0, 16, 4), - DIV(0, "div_audio0", "mout_audio0", DIV_MAUDIO, 0, 4), - DIV(CLK_SCLK_PCM0, "sclk_pcm0", "sclk_audio0", DIV_MAUDIO, 4, 8), - DIV(0, "div_mmc0", "mout_mmc0", DIV_FSYS1, 0, 4), - DIV(0, "div_mmc1", "mout_mmc1", DIV_FSYS1, 16, 4), - DIV(0, "div_mmc2", "mout_mmc2", DIV_FSYS2, 0, 4), - DIV(0, "div_mmc3", "mout_mmc3", DIV_FSYS2, 16, 4), - DIV(CLK_SCLK_PIXEL, "sclk_pixel", "sclk_vpll", DIV_TV, 0, 4), - DIV(CLK_ACLK100, "aclk100", "mout_aclk100", DIV_TOP, 4, 4), - DIV(CLK_ACLK160, "aclk160", "mout_aclk160", DIV_TOP, 8, 3), - DIV(CLK_ACLK133, "aclk133", "mout_aclk133", DIV_TOP, 12, 3), - DIV(0, "div_onenand", "mout_onenand1", DIV_TOP, 16, 3), - DIV(CLK_SCLK_SLIMBUS, "sclk_slimbus", "sclk_epll", DIV_PERIL3, 4, 4), - DIV(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_audio1", DIV_PERIL4, 4, 8), - DIV(CLK_SCLK_PCM2, "sclk_pcm2", "sclk_audio2", DIV_PERIL4, 20, 8), - DIV(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_audio1", DIV_PERIL5, 0, 6), - DIV(CLK_SCLK_I2S2, "sclk_i2s2", "sclk_audio2", DIV_PERIL5, 8, 6), - DIV(0, "div_mmc4", "mout_mmc4", DIV_FSYS3, 0, 4), - DIV_F(0, "div_mmc_pre4", "div_mmc4", DIV_FSYS3, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV(0, "div_uart0", "mout_uart0", DIV_PERIL0, 0, 4), - DIV(0, "div_uart1", "mout_uart1", DIV_PERIL0, 4, 4), - DIV(0, "div_uart2", "mout_uart2", DIV_PERIL0, 8, 4), - DIV(0, "div_uart3", "mout_uart3", DIV_PERIL0, 12, 4), - DIV(0, "div_uart4", "mout_uart4", DIV_PERIL0, 16, 4), - DIV(0, "div_spi0", "mout_spi0", DIV_PERIL1, 0, 4), - DIV(0, "div_spi_pre0", "div_spi0", DIV_PERIL1, 8, 8), - DIV(0, "div_spi1", "mout_spi1", DIV_PERIL1, 16, 4), - DIV(0, "div_spi_pre1", "div_spi1", DIV_PERIL1, 24, 8), - DIV(0, "div_spi2", "mout_spi2", DIV_PERIL2, 0, 4), - DIV(0, "div_spi_pre2", "div_spi2", DIV_PERIL2, 8, 8), - DIV(0, "div_audio1", "mout_audio1", DIV_PERIL4, 0, 4), - DIV(0, "div_audio2", "mout_audio2", DIV_PERIL4, 16, 4), - DIV(CLK_SCLK_APLL, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), - DIV_F(0, "div_mipi_pre0", "div_mipi0", DIV_LCD0, 20, 4, - CLK_SET_RATE_PARENT, 0), - DIV_F(0, "div_mmc_pre0", "div_mmc0", DIV_FSYS1, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV_F(0, "div_mmc_pre1", "div_mmc1", DIV_FSYS1, 24, 8, - CLK_SET_RATE_PARENT, 0), - DIV_F(0, "div_mmc_pre2", "div_mmc2", DIV_FSYS2, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV_F(0, "div_mmc_pre3", "div_mmc3", DIV_FSYS2, 24, 8, - CLK_SET_RATE_PARENT, 0), - DIV(0, "div_clkout_top", "mout_clkout_top", CLKOUT_CMU_TOP, 8, 6), - - DIV(CLK_DIV_ACP, "div_acp", "mout_dmc_bus", DIV_DMC0, 0, 3), - DIV(0, "div_acp_pclk", "div_acp", DIV_DMC0, 4, 3), - DIV(0, "div_dphy", "mout_dphy", DIV_DMC0, 8, 3), - DIV(CLK_DIV_DMC, "div_dmc", "mout_dmc_bus", DIV_DMC0, 12, 3), - DIV(0, "div_dmcd", "div_dmc", DIV_DMC0, 16, 3), - DIV(0, "div_dmcp", "div_dmcd", DIV_DMC0, 20, 3), - DIV(0, "div_pwi", "mout_pwi", DIV_DMC1, 8, 4), - DIV(0, "div_clkout_dmc", "mout_clkout_dmc", CLKOUT_CMU_DMC, 8, 6), -}; - -/* list of divider clocks supported in exynos4210 soc */ -static const struct samsung_div_clock exynos4210_div_clks[] __initconst = { - DIV(CLK_ACLK200, "aclk200", "mout_aclk200", DIV_TOP, 0, 3), - DIV(CLK_SCLK_FIMG2D, "sclk_fimg2d", "mout_g2d", DIV_IMAGE, 0, 4), - DIV(0, "div_fimd1", "mout_fimd1", E4210_DIV_LCD1, 0, 4), - DIV(0, "div_mipi1", "mout_mipi1", E4210_DIV_LCD1, 16, 4), - DIV(0, "div_sata", "mout_sata", DIV_FSYS0, 20, 4), - DIV_F(0, "div_mipi_pre1", "div_mipi1", E4210_DIV_LCD1, 20, 4, - CLK_SET_RATE_PARENT, 0), -}; - -/* list of divider clocks supported in exynos4x12 soc */ -static const struct samsung_div_clock exynos4x12_div_clks[] __initconst = { - DIV(0, "div_mdnie0", "mout_mdnie0", DIV_LCD0, 4, 4), - DIV(0, "div_mdnie_pwm0", "mout_mdnie_pwm0", DIV_LCD0, 8, 4), - DIV(0, "div_mdnie_pwm_pre0", "div_mdnie_pwm0", DIV_LCD0, 12, 4), - DIV(0, "div_mipihsi", "mout_mipihsi", DIV_FSYS0, 20, 4), - DIV(0, "div_jpeg", "mout_jpeg", E4X12_DIV_CAM1, 0, 4), - DIV(CLK_DIV_ACLK200, "div_aclk200", "mout_aclk200", DIV_TOP, 0, 3), - DIV(0, "div_aclk266_gps", "mout_aclk266_gps", DIV_TOP, 20, 3), - DIV(CLK_DIV_ACLK400_MCUISP, "div_aclk400_mcuisp", "mout_aclk400_mcuisp", - DIV_TOP, 24, 3), - DIV(0, "div_pwm_isp", "mout_pwm_isp", E4X12_DIV_ISP, 0, 4), - DIV(0, "div_spi0_isp", "mout_spi0_isp", E4X12_DIV_ISP, 4, 4), - DIV(0, "div_spi0_isp_pre", "div_spi0_isp", E4X12_DIV_ISP, 8, 8), - DIV(0, "div_spi1_isp", "mout_spi1_isp", E4X12_DIV_ISP, 16, 4), - DIV(0, "div_spi1_isp_pre", "div_spi1_isp", E4X12_DIV_ISP, 20, 8), - DIV(0, "div_uart_isp", "mout_uart_isp", E4X12_DIV_ISP, 28, 4), - DIV_F(CLK_DIV_ISP0, "div_isp0", "aclk200", E4X12_DIV_ISP0, 0, 3, - CLK_GET_RATE_NOCACHE, 0), - DIV_F(CLK_DIV_ISP1, "div_isp1", "aclk200", E4X12_DIV_ISP0, 4, 3, - CLK_GET_RATE_NOCACHE, 0), - DIV(0, "div_mpwm", "div_isp1", E4X12_DIV_ISP1, 0, 3), - DIV_F(CLK_DIV_MCUISP0, "div_mcuisp0", "aclk400_mcuisp", E4X12_DIV_ISP1, - 4, 3, CLK_GET_RATE_NOCACHE, 0), - DIV_F(CLK_DIV_MCUISP1, "div_mcuisp1", "div_mcuisp0", E4X12_DIV_ISP1, - 8, 3, CLK_GET_RATE_NOCACHE, 0), - DIV(CLK_SCLK_FIMG2D, "sclk_fimg2d", "mout_g2d", DIV_DMC1, 0, 4), - DIV(CLK_DIV_C2C, "div_c2c", "mout_c2c", DIV_DMC1, 4, 3), - DIV(0, "div_c2c_aclk", "div_c2c", DIV_DMC1, 12, 3), -}; - -/* list of gate clocks supported in all exynos4 soc's */ -static const struct samsung_gate_clock exynos4_gate_clks[] __initconst = { - /* - * After all Exynos4 based platforms are migrated to use device tree, - * the device name and clock alias names specified below for some - * of the clocks can be removed. - */ - GATE(CLK_PPMULEFT, "ppmuleft", "aclk200", GATE_IP_LEFTBUS, 1, 0, 0), - GATE(CLK_PPMURIGHT, "ppmuright", "aclk200", GATE_IP_RIGHTBUS, 1, 0, 0), - GATE(CLK_SCLK_HDMI, "sclk_hdmi", "mout_hdmi", SRC_MASK_TV, 0, 0, 0), - GATE(CLK_SCLK_SPDIF, "sclk_spdif", "mout_spdif", SRC_MASK_PERIL1, 8, 0, - 0), - GATE(CLK_JPEG, "jpeg", "aclk160", GATE_IP_CAM, 6, 0, 0), - GATE(CLK_MIE0, "mie0", "aclk160", GATE_IP_LCD0, 1, 0, 0), - GATE(CLK_DSIM0, "dsim0", "aclk160", GATE_IP_LCD0, 3, 0, 0), - GATE(CLK_FIMD1, "fimd1", "aclk160", E4210_GATE_IP_LCD1, 0, 0, 0), - GATE(CLK_MIE1, "mie1", "aclk160", E4210_GATE_IP_LCD1, 1, 0, 0), - GATE(CLK_DSIM1, "dsim1", "aclk160", E4210_GATE_IP_LCD1, 3, 0, 0), - GATE(CLK_SMMU_FIMD1, "smmu_fimd1", "aclk160", E4210_GATE_IP_LCD1, 4, 0, - 0), - GATE(CLK_TSI, "tsi", "aclk133", GATE_IP_FSYS, 4, 0, 0), - GATE(CLK_SROMC, "sromc", "aclk133", GATE_IP_FSYS, 11, 0, 0), - GATE(CLK_G3D, "g3d", "aclk200", GATE_IP_G3D, 0, 0, 0), - GATE(CLK_PPMUG3D, "ppmug3d", "aclk200", GATE_IP_G3D, 1, 0, 0), - GATE(CLK_USB_DEVICE, "usb_device", "aclk133", GATE_IP_FSYS, 13, 0, 0), - GATE(CLK_ONENAND, "onenand", "aclk133", GATE_IP_FSYS, 15, 0, 0), - GATE(CLK_NFCON, "nfcon", "aclk133", GATE_IP_FSYS, 16, 0, 0), - GATE(CLK_GPS, "gps", "aclk133", GATE_IP_GPS, 0, 0, 0), - GATE(CLK_SMMU_GPS, "smmu_gps", "aclk133", GATE_IP_GPS, 1, 0, 0), - GATE(CLK_PPMUGPS, "ppmugps", "aclk200", GATE_IP_GPS, 2, 0, 0), - GATE(CLK_SLIMBUS, "slimbus", "aclk100", GATE_IP_PERIL, 25, 0, 0), - GATE(CLK_SCLK_CAM0, "sclk_cam0", "div_cam0", GATE_SCLK_CAM, 4, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_CAM1, "sclk_cam1", "div_cam1", GATE_SCLK_CAM, 5, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MIPI0, "sclk_mipi0", "div_mipi_pre0", - SRC_MASK_LCD0, 12, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_AUDIO0, "sclk_audio0", "div_audio0", SRC_MASK_MAUDIO, 0, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_AUDIO1, "sclk_audio1", "div_audio1", SRC_MASK_PERIL1, 0, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_VP, "vp", "aclk160", GATE_IP_TV, 0, 0, 0), - GATE(CLK_MIXER, "mixer", "aclk160", GATE_IP_TV, 1, 0, 0), - GATE(CLK_HDMI, "hdmi", "aclk160", GATE_IP_TV, 3, 0, 0), - GATE(CLK_PWM, "pwm", "aclk100", GATE_IP_PERIL, 24, 0, 0), - GATE(CLK_SDMMC4, "sdmmc4", "aclk133", GATE_IP_FSYS, 9, 0, 0), - GATE(CLK_USB_HOST, "usb_host", "aclk133", GATE_IP_FSYS, 12, 0, 0), - GATE(CLK_SCLK_FIMC0, "sclk_fimc0", "div_fimc0", SRC_MASK_CAM, 0, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_FIMC1, "sclk_fimc1", "div_fimc1", SRC_MASK_CAM, 4, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_FIMC2, "sclk_fimc2", "div_fimc2", SRC_MASK_CAM, 8, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_FIMC3, "sclk_fimc3", "div_fimc3", SRC_MASK_CAM, 12, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_CSIS0, "sclk_csis0", "div_csis0", SRC_MASK_CAM, 24, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_CSIS1, "sclk_csis1", "div_csis1", SRC_MASK_CAM, 28, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_FIMD0, "sclk_fimd0", "div_fimd0", SRC_MASK_LCD0, 0, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC0, "sclk_mmc0", "div_mmc_pre0", SRC_MASK_FSYS, 0, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC1, "sclk_mmc1", "div_mmc_pre1", SRC_MASK_FSYS, 4, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC2, "sclk_mmc2", "div_mmc_pre2", SRC_MASK_FSYS, 8, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC3, "sclk_mmc3", "div_mmc_pre3", SRC_MASK_FSYS, 12, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC4, "sclk_mmc4", "div_mmc_pre4", SRC_MASK_FSYS, 16, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART0, "uclk0", "div_uart0", SRC_MASK_PERIL0, 0, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART1, "uclk1", "div_uart1", SRC_MASK_PERIL0, 4, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART2, "uclk2", "div_uart2", SRC_MASK_PERIL0, 8, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART3, "uclk3", "div_uart3", SRC_MASK_PERIL0, 12, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART4, "uclk4", "div_uart4", SRC_MASK_PERIL0, 16, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_AUDIO2, "sclk_audio2", "div_audio2", SRC_MASK_PERIL1, 4, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI0, "sclk_spi0", "div_spi_pre0", SRC_MASK_PERIL1, 16, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI1, "sclk_spi1", "div_spi_pre1", SRC_MASK_PERIL1, 20, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI2, "sclk_spi2", "div_spi_pre2", SRC_MASK_PERIL1, 24, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_FIMC0, "fimc0", "aclk160", GATE_IP_CAM, 0, - 0, 0), - GATE(CLK_FIMC1, "fimc1", "aclk160", GATE_IP_CAM, 1, - 0, 0), - GATE(CLK_FIMC2, "fimc2", "aclk160", GATE_IP_CAM, 2, - 0, 0), - GATE(CLK_FIMC3, "fimc3", "aclk160", GATE_IP_CAM, 3, - 0, 0), - GATE(CLK_CSIS0, "csis0", "aclk160", GATE_IP_CAM, 4, - 0, 0), - GATE(CLK_CSIS1, "csis1", "aclk160", GATE_IP_CAM, 5, - 0, 0), - GATE(CLK_SMMU_FIMC0, "smmu_fimc0", "aclk160", GATE_IP_CAM, 7, - 0, 0), - GATE(CLK_SMMU_FIMC1, "smmu_fimc1", "aclk160", GATE_IP_CAM, 8, - 0, 0), - GATE(CLK_SMMU_FIMC2, "smmu_fimc2", "aclk160", GATE_IP_CAM, 9, - 0, 0), - GATE(CLK_SMMU_FIMC3, "smmu_fimc3", "aclk160", GATE_IP_CAM, 10, - 0, 0), - GATE(CLK_SMMU_JPEG, "smmu_jpeg", "aclk160", GATE_IP_CAM, 11, - 0, 0), - GATE(CLK_PPMUCAMIF, "ppmucamif", "aclk160", GATE_IP_CAM, 16, 0, 0), - GATE(CLK_PIXELASYNCM0, "pxl_async0", "aclk160", GATE_IP_CAM, 17, 0, 0), - GATE(CLK_PIXELASYNCM1, "pxl_async1", "aclk160", GATE_IP_CAM, 18, 0, 0), - GATE(CLK_SMMU_TV, "smmu_tv", "aclk160", GATE_IP_TV, 4, - 0, 0), - GATE(CLK_PPMUTV, "ppmutv", "aclk160", GATE_IP_TV, 5, 0, 0), - GATE(CLK_MFC, "mfc", "aclk100", GATE_IP_MFC, 0, 0, 0), - GATE(CLK_SMMU_MFCL, "smmu_mfcl", "aclk100", GATE_IP_MFC, 1, - 0, 0), - GATE(CLK_SMMU_MFCR, "smmu_mfcr", "aclk100", GATE_IP_MFC, 2, - 0, 0), - GATE(CLK_PPMUMFC_L, "ppmumfc_l", "aclk100", GATE_IP_MFC, 3, 0, 0), - GATE(CLK_PPMUMFC_R, "ppmumfc_r", "aclk100", GATE_IP_MFC, 4, 0, 0), - GATE(CLK_FIMD0, "fimd0", "aclk160", GATE_IP_LCD0, 0, - 0, 0), - GATE(CLK_SMMU_FIMD0, "smmu_fimd0", "aclk160", GATE_IP_LCD0, 4, - 0, 0), - GATE(CLK_PPMULCD0, "ppmulcd0", "aclk160", GATE_IP_LCD0, 5, 0, 0), - GATE(CLK_PDMA0, "pdma0", "aclk133", GATE_IP_FSYS, 0, - 0, 0), - GATE(CLK_PDMA1, "pdma1", "aclk133", GATE_IP_FSYS, 1, - 0, 0), - GATE(CLK_SDMMC0, "sdmmc0", "aclk133", GATE_IP_FSYS, 5, - 0, 0), - GATE(CLK_SDMMC1, "sdmmc1", "aclk133", GATE_IP_FSYS, 6, - 0, 0), - GATE(CLK_SDMMC2, "sdmmc2", "aclk133", GATE_IP_FSYS, 7, - 0, 0), - GATE(CLK_SDMMC3, "sdmmc3", "aclk133", GATE_IP_FSYS, 8, - 0, 0), - GATE(CLK_PPMUFILE, "ppmufile", "aclk133", GATE_IP_FSYS, 17, 0, 0), - GATE(CLK_UART0, "uart0", "aclk100", GATE_IP_PERIL, 0, - 0, 0), - GATE(CLK_UART1, "uart1", "aclk100", GATE_IP_PERIL, 1, - 0, 0), - GATE(CLK_UART2, "uart2", "aclk100", GATE_IP_PERIL, 2, - 0, 0), - GATE(CLK_UART3, "uart3", "aclk100", GATE_IP_PERIL, 3, - 0, 0), - GATE(CLK_UART4, "uart4", "aclk100", GATE_IP_PERIL, 4, - 0, 0), - GATE(CLK_I2C0, "i2c0", "aclk100", GATE_IP_PERIL, 6, - 0, 0), - GATE(CLK_I2C1, "i2c1", "aclk100", GATE_IP_PERIL, 7, - 0, 0), - GATE(CLK_I2C2, "i2c2", "aclk100", GATE_IP_PERIL, 8, - 0, 0), - GATE(CLK_I2C3, "i2c3", "aclk100", GATE_IP_PERIL, 9, - 0, 0), - GATE(CLK_I2C4, "i2c4", "aclk100", GATE_IP_PERIL, 10, - 0, 0), - GATE(CLK_I2C5, "i2c5", "aclk100", GATE_IP_PERIL, 11, - 0, 0), - GATE(CLK_I2C6, "i2c6", "aclk100", GATE_IP_PERIL, 12, - 0, 0), - GATE(CLK_I2C7, "i2c7", "aclk100", GATE_IP_PERIL, 13, - 0, 0), - GATE(CLK_I2C_HDMI, "i2c-hdmi", "aclk100", GATE_IP_PERIL, 14, - 0, 0), - GATE(CLK_SPI0, "spi0", "aclk100", GATE_IP_PERIL, 16, - 0, 0), - GATE(CLK_SPI1, "spi1", "aclk100", GATE_IP_PERIL, 17, - 0, 0), - GATE(CLK_SPI2, "spi2", "aclk100", GATE_IP_PERIL, 18, - 0, 0), - GATE(CLK_I2S1, "i2s1", "aclk100", GATE_IP_PERIL, 20, - 0, 0), - GATE(CLK_I2S2, "i2s2", "aclk100", GATE_IP_PERIL, 21, - 0, 0), - GATE(CLK_PCM1, "pcm1", "aclk100", GATE_IP_PERIL, 22, - 0, 0), - GATE(CLK_PCM2, "pcm2", "aclk100", GATE_IP_PERIL, 23, - 0, 0), - GATE(CLK_SPDIF, "spdif", "aclk100", GATE_IP_PERIL, 26, - 0, 0), - GATE(CLK_AC97, "ac97", "aclk100", GATE_IP_PERIL, 27, - 0, 0), - GATE(CLK_SSS, "sss", "aclk133", GATE_IP_DMC, 4, 0, 0), - GATE(CLK_PPMUDMC0, "ppmudmc0", "aclk133", GATE_IP_DMC, 8, 0, 0), - GATE(CLK_PPMUDMC1, "ppmudmc1", "aclk133", GATE_IP_DMC, 9, 0, 0), - GATE(CLK_PPMUCPU, "ppmucpu", "aclk133", GATE_IP_DMC, 10, 0, 0), - GATE(CLK_PPMUACP, "ppmuacp", "aclk133", GATE_IP_DMC, 16, 0, 0), - - GATE(CLK_OUT_LEFTBUS, "clkout_leftbus", "div_clkout_leftbus", - CLKOUT_CMU_LEFTBUS, 16, CLK_SET_RATE_PARENT, 0), - GATE(CLK_OUT_RIGHTBUS, "clkout_rightbus", "div_clkout_rightbus", - CLKOUT_CMU_RIGHTBUS, 16, CLK_SET_RATE_PARENT, 0), - GATE(CLK_OUT_TOP, "clkout_top", "div_clkout_top", - CLKOUT_CMU_TOP, 16, CLK_SET_RATE_PARENT, 0), - GATE(CLK_OUT_DMC, "clkout_dmc", "div_clkout_dmc", - CLKOUT_CMU_DMC, 16, CLK_SET_RATE_PARENT, 0), - GATE(CLK_OUT_CPU, "clkout_cpu", "div_clkout_cpu", - CLKOUT_CMU_CPU, 16, CLK_SET_RATE_PARENT, 0), -}; - -/* list of gate clocks supported in exynos4210 soc */ -static const struct samsung_gate_clock exynos4210_gate_clks[] __initconst = { - GATE(CLK_TVENC, "tvenc", "aclk160", GATE_IP_TV, 2, 0, 0), - GATE(CLK_G2D, "g2d", "aclk200", E4210_GATE_IP_IMAGE, 0, 0, 0), - GATE(CLK_ROTATOR, "rotator", "aclk200", E4210_GATE_IP_IMAGE, 1, 0, 0), - GATE(CLK_MDMA, "mdma", "aclk200", E4210_GATE_IP_IMAGE, 2, 0, 0), - GATE(CLK_SMMU_G2D, "smmu_g2d", "aclk200", E4210_GATE_IP_IMAGE, 3, 0, 0), - GATE(CLK_SMMU_MDMA, "smmu_mdma", "aclk200", E4210_GATE_IP_IMAGE, 5, 0, - 0), - GATE(CLK_PPMUIMAGE, "ppmuimage", "aclk200", E4210_GATE_IP_IMAGE, 9, 0, - 0), - GATE(CLK_PPMULCD1, "ppmulcd1", "aclk160", E4210_GATE_IP_LCD1, 5, 0, 0), - GATE(CLK_PCIE_PHY, "pcie_phy", "aclk133", GATE_IP_FSYS, 2, 0, 0), - GATE(CLK_SATA_PHY, "sata_phy", "aclk133", GATE_IP_FSYS, 3, 0, 0), - GATE(CLK_SATA, "sata", "aclk133", GATE_IP_FSYS, 10, 0, 0), - GATE(CLK_PCIE, "pcie", "aclk133", GATE_IP_FSYS, 14, 0, 0), - GATE(CLK_SMMU_PCIE, "smmu_pcie", "aclk133", GATE_IP_FSYS, 18, 0, 0), - GATE(CLK_MODEMIF, "modemif", "aclk100", GATE_IP_PERIL, 28, 0, 0), - GATE(CLK_CHIPID, "chipid", "aclk100", E4210_GATE_IP_PERIR, 0, 0, 0), - GATE(CLK_SYSREG, "sysreg", "aclk100", E4210_GATE_IP_PERIR, 0, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk100", E4210_GATE_IP_PERIR, 11, 0, - 0), - GATE(CLK_SMMU_ROTATOR, "smmu_rotator", "aclk200", - E4210_GATE_IP_IMAGE, 4, 0, 0), - GATE(CLK_SCLK_MIPI1, "sclk_mipi1", "div_mipi_pre1", - E4210_SRC_MASK_LCD1, 12, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SATA, "sclk_sata", "div_sata", - SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MIXER, "sclk_mixer", "mout_mixer", SRC_MASK_TV, 4, 0, 0), - GATE(CLK_SCLK_DAC, "sclk_dac", "mout_dac", SRC_MASK_TV, 8, 0, 0), - GATE(CLK_TSADC, "tsadc", "aclk100", GATE_IP_PERIL, 15, - 0, 0), - GATE(CLK_MCT, "mct", "aclk100", E4210_GATE_IP_PERIR, 13, - 0, 0), - GATE(CLK_WDT, "watchdog", "aclk100", E4210_GATE_IP_PERIR, 14, - 0, 0), - GATE(CLK_RTC, "rtc", "aclk100", E4210_GATE_IP_PERIR, 15, - 0, 0), - GATE(CLK_KEYIF, "keyif", "aclk100", E4210_GATE_IP_PERIR, 16, - 0, 0), - GATE(CLK_SCLK_FIMD1, "sclk_fimd1", "div_fimd1", E4210_SRC_MASK_LCD1, 0, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_TMU_APBIF, "tmu_apbif", "aclk100", E4210_GATE_IP_PERIR, 17, 0, - 0), -}; - -/* list of gate clocks supported in exynos4x12 soc */ -static const struct samsung_gate_clock exynos4x12_gate_clks[] __initconst = { - GATE(CLK_AUDSS, "audss", "sclk_epll", E4X12_GATE_IP_MAUDIO, 0, 0, 0), - GATE(CLK_MDNIE0, "mdnie0", "aclk160", GATE_IP_LCD0, 2, 0, 0), - GATE(CLK_ROTATOR, "rotator", "aclk200", E4X12_GATE_IP_IMAGE, 1, 0, 0), - GATE(CLK_MDMA, "mdma", "aclk200", E4X12_GATE_IP_IMAGE, 2, 0, 0), - GATE(CLK_SMMU_MDMA, "smmu_mdma", "aclk200", E4X12_GATE_IP_IMAGE, 5, 0, - 0), - GATE(CLK_PPMUIMAGE, "ppmuimage", "aclk200", E4X12_GATE_IP_IMAGE, 9, 0, - 0), - GATE(CLK_TSADC, "tsadc", "aclk133", E4X12_GATE_BUS_FSYS1, 16, 0, 0), - GATE(CLK_MIPI_HSI, "mipi_hsi", "aclk133", GATE_IP_FSYS, 10, 0, 0), - GATE(CLK_CHIPID, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, 0, 0), - GATE(CLK_SYSREG, "sysreg", "aclk100", E4X12_GATE_IP_PERIR, 1, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk100", E4X12_GATE_IP_PERIR, 11, 0, - 0), - GATE(CLK_SCLK_MDNIE0, "sclk_mdnie0", "div_mdnie0", - SRC_MASK_LCD0, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MDNIE_PWM0, "sclk_mdnie_pwm0", "div_mdnie_pwm_pre0", - SRC_MASK_LCD0, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MIPIHSI, "sclk_mipihsi", "div_mipihsi", - SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SMMU_ROTATOR, "smmu_rotator", "aclk200", - E4X12_GATE_IP_IMAGE, 4, 0, 0), - GATE(CLK_MCT, "mct", "aclk100", E4X12_GATE_IP_PERIR, 13, - 0, 0), - GATE(CLK_RTC, "rtc", "aclk100", E4X12_GATE_IP_PERIR, 15, - 0, 0), - GATE(CLK_KEYIF, "keyif", "aclk100", E4X12_GATE_IP_PERIR, 16, 0, 0), - GATE(CLK_PWM_ISP_SCLK, "pwm_isp_sclk", "div_pwm_isp", - E4X12_GATE_IP_ISP, 0, 0, 0), - GATE(CLK_SPI0_ISP_SCLK, "spi0_isp_sclk", "div_spi0_isp_pre", - E4X12_GATE_IP_ISP, 1, 0, 0), - GATE(CLK_SPI1_ISP_SCLK, "spi1_isp_sclk", "div_spi1_isp_pre", - E4X12_GATE_IP_ISP, 2, 0, 0), - GATE(CLK_UART_ISP_SCLK, "uart_isp_sclk", "div_uart_isp", - E4X12_GATE_IP_ISP, 3, 0, 0), - GATE(CLK_WDT, "watchdog", "aclk100", E4X12_GATE_IP_PERIR, 14, 0, 0), - GATE(CLK_PCM0, "pcm0", "aclk100", E4X12_GATE_IP_MAUDIO, 2, - 0, 0), - GATE(CLK_I2S0, "i2s0", "aclk100", E4X12_GATE_IP_MAUDIO, 3, - 0, 0), - GATE(CLK_FIMC_ISP, "isp", "aclk200", E4X12_GATE_ISP0, 0, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_FIMC_DRC, "drc", "aclk200", E4X12_GATE_ISP0, 1, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_FIMC_FD, "fd", "aclk200", E4X12_GATE_ISP0, 2, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_FIMC_LITE0, "lite0", "aclk200", E4X12_GATE_ISP0, 3, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_FIMC_LITE1, "lite1", "aclk200", E4X12_GATE_ISP0, 4, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_MCUISP, "mcuisp", "aclk200", E4X12_GATE_ISP0, 5, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_GICISP, "gicisp", "aclk200", E4X12_GATE_ISP0, 7, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_SMMU_ISP, "smmu_isp", "aclk200", E4X12_GATE_ISP0, 8, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_SMMU_DRC, "smmu_drc", "aclk200", E4X12_GATE_ISP0, 9, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_SMMU_FD, "smmu_fd", "aclk200", E4X12_GATE_ISP0, 10, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_SMMU_LITE0, "smmu_lite0", "aclk200", E4X12_GATE_ISP0, 11, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_SMMU_LITE1, "smmu_lite1", "aclk200", E4X12_GATE_ISP0, 12, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_PPMUISPMX, "ppmuispmx", "aclk200", E4X12_GATE_ISP0, 20, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_PPMUISPX, "ppmuispx", "aclk200", E4X12_GATE_ISP0, 21, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_MCUCTL_ISP, "mcuctl_isp", "aclk200", E4X12_GATE_ISP0, 23, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_MPWM_ISP, "mpwm_isp", "aclk200", E4X12_GATE_ISP0, 24, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_I2C0_ISP, "i2c0_isp", "aclk200", E4X12_GATE_ISP0, 25, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_I2C1_ISP, "i2c1_isp", "aclk200", E4X12_GATE_ISP0, 26, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_MTCADC_ISP, "mtcadc_isp", "aclk200", E4X12_GATE_ISP0, 27, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_PWM_ISP, "pwm_isp", "aclk200", E4X12_GATE_ISP0, 28, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_WDT_ISP, "wdt_isp", "aclk200", E4X12_GATE_ISP0, 30, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_UART_ISP, "uart_isp", "aclk200", E4X12_GATE_ISP0, 31, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_ASYNCAXIM, "asyncaxim", "aclk200", E4X12_GATE_ISP1, 0, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_SMMU_ISPCX, "smmu_ispcx", "aclk200", E4X12_GATE_ISP1, 4, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_SPI0_ISP, "spi0_isp", "aclk200", E4X12_GATE_ISP1, 12, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_SPI1_ISP, "spi1_isp", "aclk200", E4X12_GATE_ISP1, 13, - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), - GATE(CLK_G2D, "g2d", "aclk200", GATE_IP_DMC, 23, 0, 0), - GATE(CLK_SMMU_G2D, "smmu_g2d", "aclk200", GATE_IP_DMC, 24, 0, 0), - GATE(CLK_TMU_APBIF, "tmu_apbif", "aclk100", E4X12_GATE_IP_PERIR, 17, 0, - 0), -}; - -static const struct samsung_clock_alias exynos4_aliases[] __initconst = { - ALIAS(CLK_MOUT_CORE, NULL, "moutcore"), - ALIAS(CLK_ARM_CLK, NULL, "armclk"), - ALIAS(CLK_SCLK_APLL, NULL, "mout_apll"), -}; - -static const struct samsung_clock_alias exynos4210_aliases[] __initconst = { - ALIAS(CLK_SCLK_MPLL, NULL, "mout_mpll"), -}; - -static const struct samsung_clock_alias exynos4x12_aliases[] __initconst = { - ALIAS(CLK_MOUT_MPLL_USER_C, NULL, "mout_mpll"), -}; - -/* - * The parent of the fin_pll clock is selected by the XOM[0] bit. This bit - * resides in chipid register space, outside of the clock controller memory - * mapped space. So to determine the parent of fin_pll clock, the chipid - * controller is first remapped and the value of XOM[0] bit is read to - * determine the parent clock. - */ -static unsigned long __init exynos4_get_xom(void) -{ - unsigned long xom = 0; - void __iomem *chipid_base; - struct device_node *np; - - np = of_find_compatible_node(NULL, NULL, "samsung,exynos4210-chipid"); - if (np) { - chipid_base = of_iomap(np, 0); - - if (chipid_base) - xom = readl(chipid_base + 8); - - iounmap(chipid_base); - } - - return xom; -} - -static void __init exynos4_clk_register_finpll(struct samsung_clk_provider *ctx) -{ - struct samsung_fixed_rate_clock fclk; - struct clk *clk; - unsigned long finpll_f = 24000000; - char *parent_name; - unsigned int xom = exynos4_get_xom(); - - parent_name = xom & 1 ? "xusbxti" : "xxti"; - clk = clk_get(NULL, parent_name); - if (IS_ERR(clk)) { - pr_err("%s: failed to lookup parent clock %s, assuming " - "fin_pll clock frequency is 24MHz\n", __func__, - parent_name); - } else { - finpll_f = clk_get_rate(clk); - } - - fclk.id = CLK_FIN_PLL; - fclk.name = "fin_pll"; - fclk.parent_name = NULL; - fclk.flags = 0; - fclk.fixed_rate = finpll_f; - samsung_clk_register_fixed_rate(ctx, &fclk, 1); - -} - -static const struct of_device_id ext_clk_match[] __initconst = { - { .compatible = "samsung,clock-xxti", .data = (void *)0, }, - { .compatible = "samsung,clock-xusbxti", .data = (void *)1, }, - {}, -}; - -/* PLLs PMS values */ -static const struct samsung_pll_rate_table exynos4210_apll_rates[] __initconst = { - PLL_45XX_RATE(1200000000, 150, 3, 1, 28), - PLL_45XX_RATE(1000000000, 250, 6, 1, 28), - PLL_45XX_RATE( 800000000, 200, 6, 1, 28), - PLL_45XX_RATE( 666857142, 389, 14, 1, 13), - PLL_45XX_RATE( 600000000, 100, 4, 1, 13), - PLL_45XX_RATE( 533000000, 533, 24, 1, 5), - PLL_45XX_RATE( 500000000, 250, 6, 2, 28), - PLL_45XX_RATE( 400000000, 200, 6, 2, 28), - PLL_45XX_RATE( 200000000, 200, 6, 3, 28), - { /* sentinel */ } -}; - -static const struct samsung_pll_rate_table exynos4210_epll_rates[] __initconst = { - PLL_4600_RATE(192000000, 48, 3, 1, 0, 0), - PLL_4600_RATE(180633605, 45, 3, 1, 10381, 0), - PLL_4600_RATE(180000000, 45, 3, 1, 0, 0), - PLL_4600_RATE( 73727996, 73, 3, 3, 47710, 1), - PLL_4600_RATE( 67737602, 90, 4, 3, 20762, 1), - PLL_4600_RATE( 49151992, 49, 3, 3, 9961, 0), - PLL_4600_RATE( 45158401, 45, 3, 3, 10381, 0), - { /* sentinel */ } -}; - -static const struct samsung_pll_rate_table exynos4210_vpll_rates[] __initconst = { - PLL_4650_RATE(360000000, 44, 3, 0, 1024, 0, 14, 0), - PLL_4650_RATE(324000000, 53, 2, 1, 1024, 1, 1, 1), - PLL_4650_RATE(259617187, 63, 3, 1, 1950, 0, 20, 1), - PLL_4650_RATE(110000000, 53, 3, 2, 2048, 0, 17, 0), - PLL_4650_RATE( 55360351, 53, 3, 3, 2417, 0, 17, 0), - { /* sentinel */ } -}; - -static const struct samsung_pll_rate_table exynos4x12_apll_rates[] __initconst = { - PLL_35XX_RATE(1500000000, 250, 4, 0), - PLL_35XX_RATE(1400000000, 175, 3, 0), - PLL_35XX_RATE(1300000000, 325, 6, 0), - PLL_35XX_RATE(1200000000, 200, 4, 0), - PLL_35XX_RATE(1100000000, 275, 6, 0), - PLL_35XX_RATE(1000000000, 125, 3, 0), - PLL_35XX_RATE( 900000000, 150, 4, 0), - PLL_35XX_RATE( 800000000, 100, 3, 0), - PLL_35XX_RATE( 700000000, 175, 3, 1), - PLL_35XX_RATE( 600000000, 200, 4, 1), - PLL_35XX_RATE( 500000000, 125, 3, 1), - PLL_35XX_RATE( 400000000, 100, 3, 1), - PLL_35XX_RATE( 300000000, 200, 4, 2), - PLL_35XX_RATE( 200000000, 100, 3, 2), - { /* sentinel */ } -}; - -static const struct samsung_pll_rate_table exynos4x12_epll_rates[] __initconst = { - PLL_36XX_RATE(192000000, 48, 3, 1, 0), - PLL_36XX_RATE(180633605, 45, 3, 1, 10381), - PLL_36XX_RATE(180000000, 45, 3, 1, 0), - PLL_36XX_RATE( 73727996, 73, 3, 3, 47710), - PLL_36XX_RATE( 67737602, 90, 4, 3, 20762), - PLL_36XX_RATE( 49151992, 49, 3, 3, 9961), - PLL_36XX_RATE( 45158401, 45, 3, 3, 10381), - { /* sentinel */ } -}; - -static const struct samsung_pll_rate_table exynos4x12_vpll_rates[] __initconst = { - PLL_36XX_RATE(533000000, 133, 3, 1, 16384), - PLL_36XX_RATE(440000000, 110, 3, 1, 0), - PLL_36XX_RATE(350000000, 175, 3, 2, 0), - PLL_36XX_RATE(266000000, 133, 3, 2, 0), - PLL_36XX_RATE(160000000, 160, 3, 3, 0), - PLL_36XX_RATE(106031250, 53, 3, 2, 1024), - PLL_36XX_RATE( 53015625, 53, 3, 3, 1024), - { /* sentinel */ } -}; - -static struct samsung_pll_clock exynos4210_plls[nr_plls] __initdata = { - [apll] = PLL_A(pll_4508, CLK_FOUT_APLL, "fout_apll", "fin_pll", - APLL_LOCK, APLL_CON0, "fout_apll", NULL), - [mpll] = PLL_A(pll_4508, CLK_FOUT_MPLL, "fout_mpll", "fin_pll", - E4210_MPLL_LOCK, E4210_MPLL_CON0, "fout_mpll", NULL), - [epll] = PLL_A(pll_4600, CLK_FOUT_EPLL, "fout_epll", "fin_pll", - EPLL_LOCK, EPLL_CON0, "fout_epll", NULL), - [vpll] = PLL_A(pll_4650c, CLK_FOUT_VPLL, "fout_vpll", "mout_vpllsrc", - VPLL_LOCK, VPLL_CON0, "fout_vpll", NULL), -}; - -static struct samsung_pll_clock exynos4x12_plls[nr_plls] __initdata = { - [apll] = PLL(pll_35xx, CLK_FOUT_APLL, "fout_apll", "fin_pll", - APLL_LOCK, APLL_CON0, NULL), - [mpll] = PLL(pll_35xx, CLK_FOUT_MPLL, "fout_mpll", "fin_pll", - E4X12_MPLL_LOCK, E4X12_MPLL_CON0, NULL), - [epll] = PLL(pll_36xx, CLK_FOUT_EPLL, "fout_epll", "fin_pll", - EPLL_LOCK, EPLL_CON0, NULL), - [vpll] = PLL(pll_36xx, CLK_FOUT_VPLL, "fout_vpll", "fin_pll", - VPLL_LOCK, VPLL_CON0, NULL), -}; - -static void __init exynos4x12_core_down_clock(void) -{ - unsigned int tmp; - - /* - * Enable arm clock down (in idle) and set arm divider - * ratios in WFI/WFE state. - */ - tmp = (PWR_CTRL1_CORE2_DOWN_RATIO(7) | PWR_CTRL1_CORE1_DOWN_RATIO(7) | - PWR_CTRL1_DIV2_DOWN_EN | PWR_CTRL1_DIV1_DOWN_EN | - PWR_CTRL1_USE_CORE1_WFE | PWR_CTRL1_USE_CORE0_WFE | - PWR_CTRL1_USE_CORE1_WFI | PWR_CTRL1_USE_CORE0_WFI); - /* On Exynos4412 enable it also on core 2 and 3 */ - if (num_possible_cpus() == 4) - tmp |= PWR_CTRL1_USE_CORE3_WFE | PWR_CTRL1_USE_CORE2_WFE | - PWR_CTRL1_USE_CORE3_WFI | PWR_CTRL1_USE_CORE2_WFI; - writel_relaxed(tmp, reg_base + PWR_CTRL1); - - /* - * Disable the clock up feature in case it was enabled by bootloader. - */ - writel_relaxed(0x0, reg_base + E4X12_PWR_CTRL2); -} - -#define E4210_CPU_DIV0(apll, pclk_dbg, atb, periph, corem1, corem0) \ - (((apll) << 24) | ((pclk_dbg) << 20) | ((atb) << 16) | \ - ((periph) << 12) | ((corem1) << 8) | ((corem0) << 4)) -#define E4210_CPU_DIV1(hpm, copy) \ - (((hpm) << 4) | ((copy) << 0)) - -static const struct exynos_cpuclk_cfg_data e4210_armclk_d[] __initconst = { - { 1200000, E4210_CPU_DIV0(7, 1, 4, 3, 7, 3), E4210_CPU_DIV1(0, 5), }, - { 1000000, E4210_CPU_DIV0(7, 1, 4, 3, 7, 3), E4210_CPU_DIV1(0, 4), }, - { 800000, E4210_CPU_DIV0(7, 1, 3, 3, 7, 3), E4210_CPU_DIV1(0, 3), }, - { 500000, E4210_CPU_DIV0(7, 1, 3, 3, 7, 3), E4210_CPU_DIV1(0, 3), }, - { 400000, E4210_CPU_DIV0(7, 1, 3, 3, 7, 3), E4210_CPU_DIV1(0, 3), }, - { 200000, E4210_CPU_DIV0(0, 1, 1, 1, 3, 1), E4210_CPU_DIV1(0, 3), }, - { 0 }, -}; - -static const struct exynos_cpuclk_cfg_data e4212_armclk_d[] __initconst = { - { 1500000, E4210_CPU_DIV0(2, 1, 6, 0, 7, 3), E4210_CPU_DIV1(2, 6), }, - { 1400000, E4210_CPU_DIV0(2, 1, 6, 0, 7, 3), E4210_CPU_DIV1(2, 6), }, - { 1300000, E4210_CPU_DIV0(2, 1, 5, 0, 7, 3), E4210_CPU_DIV1(2, 5), }, - { 1200000, E4210_CPU_DIV0(2, 1, 5, 0, 7, 3), E4210_CPU_DIV1(2, 5), }, - { 1100000, E4210_CPU_DIV0(2, 1, 4, 0, 6, 3), E4210_CPU_DIV1(2, 4), }, - { 1000000, E4210_CPU_DIV0(1, 1, 4, 0, 5, 2), E4210_CPU_DIV1(2, 4), }, - { 900000, E4210_CPU_DIV0(1, 1, 3, 0, 5, 2), E4210_CPU_DIV1(2, 3), }, - { 800000, E4210_CPU_DIV0(1, 1, 3, 0, 5, 2), E4210_CPU_DIV1(2, 3), }, - { 700000, E4210_CPU_DIV0(1, 1, 3, 0, 4, 2), E4210_CPU_DIV1(2, 3), }, - { 600000, E4210_CPU_DIV0(1, 1, 3, 0, 4, 2), E4210_CPU_DIV1(2, 3), }, - { 500000, E4210_CPU_DIV0(1, 1, 3, 0, 4, 2), E4210_CPU_DIV1(2, 3), }, - { 400000, E4210_CPU_DIV0(1, 1, 3, 0, 4, 2), E4210_CPU_DIV1(2, 3), }, - { 300000, E4210_CPU_DIV0(1, 1, 2, 0, 4, 2), E4210_CPU_DIV1(2, 3), }, - { 200000, E4210_CPU_DIV0(1, 1, 1, 0, 3, 1), E4210_CPU_DIV1(2, 3), }, - { 0 }, -}; - -#define E4412_CPU_DIV1(cores, hpm, copy) \ - (((cores) << 8) | ((hpm) << 4) | ((copy) << 0)) - -static const struct exynos_cpuclk_cfg_data e4412_armclk_d[] __initconst = { - { 1500000, E4210_CPU_DIV0(2, 1, 6, 0, 7, 3), E4412_CPU_DIV1(7, 0, 6), }, - { 1400000, E4210_CPU_DIV0(2, 1, 6, 0, 7, 3), E4412_CPU_DIV1(6, 0, 6), }, - { 1300000, E4210_CPU_DIV0(2, 1, 5, 0, 7, 3), E4412_CPU_DIV1(6, 0, 5), }, - { 1200000, E4210_CPU_DIV0(2, 1, 5, 0, 7, 3), E4412_CPU_DIV1(5, 0, 5), }, - { 1100000, E4210_CPU_DIV0(2, 1, 4, 0, 6, 3), E4412_CPU_DIV1(5, 0, 4), }, - { 1000000, E4210_CPU_DIV0(1, 1, 4, 0, 5, 2), E4412_CPU_DIV1(4, 0, 4), }, - { 900000, E4210_CPU_DIV0(1, 1, 3, 0, 5, 2), E4412_CPU_DIV1(4, 0, 3), }, - { 800000, E4210_CPU_DIV0(1, 1, 3, 0, 5, 2), E4412_CPU_DIV1(3, 0, 3), }, - { 700000, E4210_CPU_DIV0(1, 1, 3, 0, 4, 2), E4412_CPU_DIV1(3, 0, 3), }, - { 600000, E4210_CPU_DIV0(1, 1, 3, 0, 4, 2), E4412_CPU_DIV1(2, 0, 3), }, - { 500000, E4210_CPU_DIV0(1, 1, 3, 0, 4, 2), E4412_CPU_DIV1(2, 0, 3), }, - { 400000, E4210_CPU_DIV0(1, 1, 3, 0, 4, 2), E4412_CPU_DIV1(1, 0, 3), }, - { 300000, E4210_CPU_DIV0(1, 1, 2, 0, 4, 2), E4412_CPU_DIV1(1, 0, 3), }, - { 200000, E4210_CPU_DIV0(1, 1, 1, 0, 3, 1), E4412_CPU_DIV1(0, 0, 3), }, - { 0 }, -}; - -/* register exynos4 clocks */ -static void __init exynos4_clk_init(struct device_node *np, - enum exynos4_soc soc) -{ - struct samsung_clk_provider *ctx; - exynos4_soc = soc; - - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - - ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); - - samsung_clk_of_register_fixed_ext(ctx, exynos4_fixed_rate_ext_clks, - ARRAY_SIZE(exynos4_fixed_rate_ext_clks), - ext_clk_match); - - exynos4_clk_register_finpll(ctx); - - if (exynos4_soc == EXYNOS4210) { - samsung_clk_register_mux(ctx, exynos4210_mux_early, - ARRAY_SIZE(exynos4210_mux_early)); - - if (_get_rate("fin_pll") == 24000000) { - exynos4210_plls[apll].rate_table = - exynos4210_apll_rates; - exynos4210_plls[epll].rate_table = - exynos4210_epll_rates; - } - - if (_get_rate("mout_vpllsrc") == 24000000) - exynos4210_plls[vpll].rate_table = - exynos4210_vpll_rates; - - samsung_clk_register_pll(ctx, exynos4210_plls, - ARRAY_SIZE(exynos4210_plls), reg_base); - } else { - if (_get_rate("fin_pll") == 24000000) { - exynos4x12_plls[apll].rate_table = - exynos4x12_apll_rates; - exynos4x12_plls[epll].rate_table = - exynos4x12_epll_rates; - exynos4x12_plls[vpll].rate_table = - exynos4x12_vpll_rates; - } - - samsung_clk_register_pll(ctx, exynos4x12_plls, - ARRAY_SIZE(exynos4x12_plls), reg_base); - } - - samsung_clk_register_fixed_rate(ctx, exynos4_fixed_rate_clks, - ARRAY_SIZE(exynos4_fixed_rate_clks)); - samsung_clk_register_mux(ctx, exynos4_mux_clks, - ARRAY_SIZE(exynos4_mux_clks)); - samsung_clk_register_div(ctx, exynos4_div_clks, - ARRAY_SIZE(exynos4_div_clks)); - samsung_clk_register_gate(ctx, exynos4_gate_clks, - ARRAY_SIZE(exynos4_gate_clks)); - samsung_clk_register_fixed_factor(ctx, exynos4_fixed_factor_clks, - ARRAY_SIZE(exynos4_fixed_factor_clks)); - - if (exynos4_soc == EXYNOS4210) { - samsung_clk_register_fixed_rate(ctx, exynos4210_fixed_rate_clks, - ARRAY_SIZE(exynos4210_fixed_rate_clks)); - samsung_clk_register_mux(ctx, exynos4210_mux_clks, - ARRAY_SIZE(exynos4210_mux_clks)); - samsung_clk_register_div(ctx, exynos4210_div_clks, - ARRAY_SIZE(exynos4210_div_clks)); - samsung_clk_register_gate(ctx, exynos4210_gate_clks, - ARRAY_SIZE(exynos4210_gate_clks)); - samsung_clk_register_alias(ctx, exynos4210_aliases, - ARRAY_SIZE(exynos4210_aliases)); - samsung_clk_register_fixed_factor(ctx, - exynos4210_fixed_factor_clks, - ARRAY_SIZE(exynos4210_fixed_factor_clks)); - exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk", - mout_core_p4210[0], mout_core_p4210[1], 0x14200, - e4210_armclk_d, ARRAY_SIZE(e4210_armclk_d), - CLK_CPU_NEEDS_DEBUG_ALT_DIV | CLK_CPU_HAS_DIV1); - } else { - samsung_clk_register_mux(ctx, exynos4x12_mux_clks, - ARRAY_SIZE(exynos4x12_mux_clks)); - samsung_clk_register_div(ctx, exynos4x12_div_clks, - ARRAY_SIZE(exynos4x12_div_clks)); - samsung_clk_register_gate(ctx, exynos4x12_gate_clks, - ARRAY_SIZE(exynos4x12_gate_clks)); - samsung_clk_register_alias(ctx, exynos4x12_aliases, - ARRAY_SIZE(exynos4x12_aliases)); - samsung_clk_register_fixed_factor(ctx, - exynos4x12_fixed_factor_clks, - ARRAY_SIZE(exynos4x12_fixed_factor_clks)); - if (of_machine_is_compatible("samsung,exynos4412")) { - exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk", - mout_core_p4x12[0], mout_core_p4x12[1], 0x14200, - e4412_armclk_d, ARRAY_SIZE(e4412_armclk_d), - CLK_CPU_NEEDS_DEBUG_ALT_DIV | CLK_CPU_HAS_DIV1); - } else { - exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk", - mout_core_p4x12[0], mout_core_p4x12[1], 0x14200, - e4212_armclk_d, ARRAY_SIZE(e4212_armclk_d), - CLK_CPU_NEEDS_DEBUG_ALT_DIV | CLK_CPU_HAS_DIV1); - } - } - - samsung_clk_register_alias(ctx, exynos4_aliases, - ARRAY_SIZE(exynos4_aliases)); - - if (soc == EXYNOS4X12) - exynos4x12_core_down_clock(); - exynos4_clk_sleep_init(); - - samsung_clk_of_add_provider(np, ctx); - - pr_info("%s clocks: sclk_apll = %ld, sclk_mpll = %ld\n" - "\tsclk_epll = %ld, sclk_vpll = %ld, arm_clk = %ld\n", - exynos4_soc == EXYNOS4210 ? "Exynos4210" : "Exynos4x12", - _get_rate("sclk_apll"), _get_rate("sclk_mpll"), - _get_rate("sclk_epll"), _get_rate("sclk_vpll"), - _get_rate("div_core2")); -} - - -static void __init exynos4210_clk_init(struct device_node *np) -{ - exynos4_clk_init(np, EXYNOS4210); -} -CLK_OF_DECLARE(exynos4210_clk, "samsung,exynos4210-clock", exynos4210_clk_init); - -static void __init exynos4412_clk_init(struct device_node *np) -{ - exynos4_clk_init(np, EXYNOS4X12); -} -CLK_OF_DECLARE(exynos4412_clk, "samsung,exynos4412-clock", exynos4412_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos4415.c b/drivers/clk/samsung/samsung/clk-exynos4415.c deleted file mode 100644 index 6c9063159717..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos4415.c +++ /dev/null @@ -1,1022 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * Author: Chanwoo Choi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos4415 SoC. - */ - -#include -#include -#include -#include -#include - -#include - -#include "clk.h" -#include "clk-pll.h" - -#define SRC_LEFTBUS 0x4200 -#define DIV_LEFTBUS 0x4500 -#define GATE_IP_LEFTBUS 0x4800 -#define GATE_IP_IMAGE 0x4930 -#define SRC_RIGHTBUS 0x8200 -#define DIV_RIGHTBUS 0x8500 -#define GATE_IP_RIGHTBUS 0x8800 -#define GATE_IP_PERIR 0x8960 -#define EPLL_LOCK 0xc010 -#define G3D_PLL_LOCK 0xc020 -#define DISP_PLL_LOCK 0xc030 -#define ISP_PLL_LOCK 0xc040 -#define EPLL_CON0 0xc110 -#define EPLL_CON1 0xc114 -#define EPLL_CON2 0xc118 -#define G3D_PLL_CON0 0xc120 -#define G3D_PLL_CON1 0xc124 -#define G3D_PLL_CON2 0xc128 -#define ISP_PLL_CON0 0xc130 -#define ISP_PLL_CON1 0xc134 -#define ISP_PLL_CON2 0xc138 -#define DISP_PLL_CON0 0xc140 -#define DISP_PLL_CON1 0xc144 -#define DISP_PLL_CON2 0xc148 -#define SRC_TOP0 0xc210 -#define SRC_TOP1 0xc214 -#define SRC_CAM 0xc220 -#define SRC_TV 0xc224 -#define SRC_MFC 0xc228 -#define SRC_G3D 0xc22c -#define SRC_LCD 0xc234 -#define SRC_ISP 0xc238 -#define SRC_MAUDIO 0xc23c -#define SRC_FSYS 0xc240 -#define SRC_PERIL0 0xc250 -#define SRC_PERIL1 0xc254 -#define SRC_CAM1 0xc258 -#define SRC_TOP_ISP0 0xc25c -#define SRC_TOP_ISP1 0xc260 -#define SRC_MASK_TOP 0xc310 -#define SRC_MASK_CAM 0xc320 -#define SRC_MASK_TV 0xc324 -#define SRC_MASK_LCD 0xc334 -#define SRC_MASK_ISP 0xc338 -#define SRC_MASK_MAUDIO 0xc33c -#define SRC_MASK_FSYS 0xc340 -#define SRC_MASK_PERIL0 0xc350 -#define SRC_MASK_PERIL1 0xc354 -#define DIV_TOP 0xc510 -#define DIV_CAM 0xc520 -#define DIV_TV 0xc524 -#define DIV_MFC 0xc528 -#define DIV_G3D 0xc52c -#define DIV_LCD 0xc534 -#define DIV_ISP 0xc538 -#define DIV_MAUDIO 0xc53c -#define DIV_FSYS0 0xc540 -#define DIV_FSYS1 0xc544 -#define DIV_FSYS2 0xc548 -#define DIV_PERIL0 0xc550 -#define DIV_PERIL1 0xc554 -#define DIV_PERIL2 0xc558 -#define DIV_PERIL3 0xc55c -#define DIV_PERIL4 0xc560 -#define DIV_PERIL5 0xc564 -#define DIV_CAM1 0xc568 -#define DIV_TOP_ISP1 0xc56c -#define DIV_TOP_ISP0 0xc570 -#define CLKDIV2_RATIO 0xc580 -#define GATE_SCLK_CAM 0xc820 -#define GATE_SCLK_TV 0xc824 -#define GATE_SCLK_MFC 0xc828 -#define GATE_SCLK_G3D 0xc82c -#define GATE_SCLK_LCD 0xc834 -#define GATE_SCLK_MAUDIO 0xc83c -#define GATE_SCLK_FSYS 0xc840 -#define GATE_SCLK_PERIL 0xc850 -#define GATE_IP_CAM 0xc920 -#define GATE_IP_TV 0xc924 -#define GATE_IP_MFC 0xc928 -#define GATE_IP_G3D 0xc92c -#define GATE_IP_LCD 0xc934 -#define GATE_IP_FSYS 0xc940 -#define GATE_IP_PERIL 0xc950 -#define GATE_BLOCK 0xc970 -#define APLL_LOCK 0x14000 -#define APLL_CON0 0x14100 -#define SRC_CPU 0x14200 -#define DIV_CPU0 0x14500 -#define DIV_CPU1 0x14504 - -static const unsigned long exynos4415_cmu_clk_regs[] __initconst = { - SRC_LEFTBUS, - DIV_LEFTBUS, - GATE_IP_LEFTBUS, - GATE_IP_IMAGE, - SRC_RIGHTBUS, - DIV_RIGHTBUS, - GATE_IP_RIGHTBUS, - GATE_IP_PERIR, - EPLL_LOCK, - G3D_PLL_LOCK, - DISP_PLL_LOCK, - ISP_PLL_LOCK, - EPLL_CON0, - EPLL_CON1, - EPLL_CON2, - G3D_PLL_CON0, - G3D_PLL_CON1, - G3D_PLL_CON2, - ISP_PLL_CON0, - ISP_PLL_CON1, - ISP_PLL_CON2, - DISP_PLL_CON0, - DISP_PLL_CON1, - DISP_PLL_CON2, - SRC_TOP0, - SRC_TOP1, - SRC_CAM, - SRC_TV, - SRC_MFC, - SRC_G3D, - SRC_LCD, - SRC_ISP, - SRC_MAUDIO, - SRC_FSYS, - SRC_PERIL0, - SRC_PERIL1, - SRC_CAM1, - SRC_TOP_ISP0, - SRC_TOP_ISP1, - SRC_MASK_TOP, - SRC_MASK_CAM, - SRC_MASK_TV, - SRC_MASK_LCD, - SRC_MASK_ISP, - SRC_MASK_MAUDIO, - SRC_MASK_FSYS, - SRC_MASK_PERIL0, - SRC_MASK_PERIL1, - DIV_TOP, - DIV_CAM, - DIV_TV, - DIV_MFC, - DIV_G3D, - DIV_LCD, - DIV_ISP, - DIV_MAUDIO, - DIV_FSYS0, - DIV_FSYS1, - DIV_FSYS2, - DIV_PERIL0, - DIV_PERIL1, - DIV_PERIL2, - DIV_PERIL3, - DIV_PERIL4, - DIV_PERIL5, - DIV_CAM1, - DIV_TOP_ISP1, - DIV_TOP_ISP0, - CLKDIV2_RATIO, - GATE_SCLK_CAM, - GATE_SCLK_TV, - GATE_SCLK_MFC, - GATE_SCLK_G3D, - GATE_SCLK_LCD, - GATE_SCLK_MAUDIO, - GATE_SCLK_FSYS, - GATE_SCLK_PERIL, - GATE_IP_CAM, - GATE_IP_TV, - GATE_IP_MFC, - GATE_IP_G3D, - GATE_IP_LCD, - GATE_IP_FSYS, - GATE_IP_PERIL, - GATE_BLOCK, - APLL_LOCK, - APLL_CON0, - SRC_CPU, - DIV_CPU0, - DIV_CPU1, -}; - -/* list of all parent clock list */ -PNAME(mout_g3d_pllsrc_p) = { "fin_pll", }; - -PNAME(mout_apll_p) = { "fin_pll", "fout_apll", }; -PNAME(mout_g3d_pll_p) = { "fin_pll", "fout_g3d_pll", }; -PNAME(mout_isp_pll_p) = { "fin_pll", "fout_isp_pll", }; -PNAME(mout_disp_pll_p) = { "fin_pll", "fout_disp_pll", }; - -PNAME(mout_mpll_user_p) = { "fin_pll", "div_mpll_pre", }; -PNAME(mout_epll_p) = { "fin_pll", "fout_epll", }; -PNAME(mout_core_p) = { "mout_apll", "mout_mpll_user_c", }; -PNAME(mout_hpm_p) = { "mout_apll", "mout_mpll_user_c", }; - -PNAME(mout_ebi_p) = { "div_aclk_200", "div_aclk_160", }; -PNAME(mout_ebi_1_p) = { "mout_ebi", "mout_g3d_pll", }; - -PNAME(mout_gdl_p) = { "mout_mpll_user_l", }; -PNAME(mout_gdr_p) = { "mout_mpll_user_r", }; - -PNAME(mout_aclk_266_p) = { "mout_mpll_user_t", "mout_g3d_pll", }; - -PNAME(group_epll_g3dpll_p) = { "mout_epll", "mout_g3d_pll" }; -PNAME(group_sclk_p) = { "xxti", "xusbxti", - "none", "mout_isp_pll", - "none", "none", "div_mpll_pre", - "mout_epll", "mout_g3d_pll", }; -PNAME(group_spdif_p) = { "mout_audio0", "mout_audio1", - "mout_audio2", "spdif_extclk", }; -PNAME(group_sclk_audio2_p) = { "audiocdclk2", "none", - "none", "mout_isp_pll", - "mout_disp_pll", "xusbxti", - "div_mpll_pre", "mout_epll", - "mout_g3d_pll", }; -PNAME(group_sclk_audio1_p) = { "audiocdclk1", "none", - "none", "mout_isp_pll", - "mout_disp_pll", "xusbxti", - "div_mpll_pre", "mout_epll", - "mout_g3d_pll", }; -PNAME(group_sclk_audio0_p) = { "audiocdclk0", "none", - "none", "mout_isp_pll", - "mout_disp_pll", "xusbxti", - "div_mpll_pre", "mout_epll", - "mout_g3d_pll", }; -PNAME(group_fimc_lclk_p) = { "xxti", "xusbxti", - "none", "mout_isp_pll", - "none", "mout_disp_pll", - "mout_mpll_user_t", "mout_epll", - "mout_g3d_pll", }; -PNAME(group_sclk_fimd0_p) = { "xxti", "xusbxti", - "m_bitclkhsdiv4_4l", "mout_isp_pll", - "mout_disp_pll", "sclk_hdmiphy", - "div_mpll_pre", "mout_epll", - "mout_g3d_pll", }; -PNAME(mout_hdmi_p) = { "sclk_pixel", "sclk_hdmiphy" }; -PNAME(mout_mfc_p) = { "mout_mfc_0", "mout_mfc_1" }; -PNAME(mout_g3d_p) = { "mout_g3d_0", "mout_g3d_1" }; -PNAME(mout_jpeg_p) = { "mout_jpeg_0", "mout_jpeg_1" }; -PNAME(mout_jpeg1_p) = { "mout_epll", "mout_g3d_pll" }; -PNAME(group_aclk_isp0_300_p) = { "mout_isp_pll", "div_mpll_pre" }; -PNAME(group_aclk_isp0_400_user_p) = { "fin_pll", "div_aclk_400_mcuisp" }; -PNAME(group_aclk_isp0_300_user_p) = { "fin_pll", "mout_aclk_isp0_300" }; -PNAME(group_aclk_isp1_300_user_p) = { "fin_pll", "mout_aclk_isp1_300" }; -PNAME(group_mout_mpll_user_t_p) = { "mout_mpll_user_t" }; - -static const struct samsung_fixed_factor_clock exynos4415_fixed_factor_clks[] __initconst = { - /* HACK: fin_pll hardcoded to xusbxti until detection is implemented. */ - FFACTOR(CLK_FIN_PLL, "fin_pll", "xusbxti", 1, 1, 0), -}; - -static const struct samsung_fixed_rate_clock exynos4415_fixed_rate_clks[] __initconst = { - FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", NULL, 0, 27000000), -}; - -static const struct samsung_mux_clock exynos4415_mux_clks[] __initconst = { - /* - * NOTE: Following table is sorted by register address in ascending - * order and then bitfield shift in descending order, as it is done - * in the User's Manual. When adding new entries, please make sure - * that the order is preserved, to avoid merge conflicts and make - * further work with defined data easier. - */ - - /* SRC_LEFTBUS */ - MUX(CLK_MOUT_MPLL_USER_L, "mout_mpll_user_l", mout_mpll_user_p, - SRC_LEFTBUS, 4, 1), - MUX(CLK_MOUT_GDL, "mout_gdl", mout_gdl_p, SRC_LEFTBUS, 0, 1), - - /* SRC_RIGHTBUS */ - MUX(CLK_MOUT_MPLL_USER_R, "mout_mpll_user_r", mout_mpll_user_p, - SRC_RIGHTBUS, 4, 1), - MUX(CLK_MOUT_GDR, "mout_gdr", mout_gdr_p, SRC_RIGHTBUS, 0, 1), - - /* SRC_TOP0 */ - MUX(CLK_MOUT_EBI, "mout_ebi", mout_ebi_p, SRC_TOP0, 28, 1), - MUX(CLK_MOUT_ACLK_200, "mout_aclk_200", group_mout_mpll_user_t_p, - SRC_TOP0, 24, 1), - MUX(CLK_MOUT_ACLK_160, "mout_aclk_160", group_mout_mpll_user_t_p, - SRC_TOP0, 20, 1), - MUX(CLK_MOUT_ACLK_100, "mout_aclk_100", group_mout_mpll_user_t_p, - SRC_TOP0, 16, 1), - MUX(CLK_MOUT_ACLK_266, "mout_aclk_266", mout_aclk_266_p, - SRC_TOP0, 12, 1), - MUX(CLK_MOUT_G3D_PLL, "mout_g3d_pll", mout_g3d_pll_p, - SRC_TOP0, 8, 1), - MUX(CLK_MOUT_EPLL, "mout_epll", mout_epll_p, SRC_TOP0, 4, 1), - MUX(CLK_MOUT_EBI_1, "mout_ebi_1", mout_ebi_1_p, SRC_TOP0, 0, 1), - - /* SRC_TOP1 */ - MUX(CLK_MOUT_ISP_PLL, "mout_isp_pll", mout_isp_pll_p, - SRC_TOP1, 28, 1), - MUX(CLK_MOUT_DISP_PLL, "mout_disp_pll", mout_disp_pll_p, - SRC_TOP1, 16, 1), - MUX(CLK_MOUT_MPLL_USER_T, "mout_mpll_user_t", mout_mpll_user_p, - SRC_TOP1, 12, 1), - MUX(CLK_MOUT_ACLK_400_MCUISP, "mout_aclk_400_mcuisp", - group_mout_mpll_user_t_p, SRC_TOP1, 8, 1), - MUX(CLK_MOUT_G3D_PLLSRC, "mout_g3d_pllsrc", mout_g3d_pllsrc_p, - SRC_TOP1, 0, 1), - - /* SRC_CAM */ - MUX(CLK_MOUT_CSIS1, "mout_csis1", group_fimc_lclk_p, SRC_CAM, 28, 4), - MUX(CLK_MOUT_CSIS0, "mout_csis0", group_fimc_lclk_p, SRC_CAM, 24, 4), - MUX(CLK_MOUT_CAM1, "mout_cam1", group_fimc_lclk_p, SRC_CAM, 20, 4), - MUX(CLK_MOUT_FIMC3_LCLK, "mout_fimc3_lclk", group_fimc_lclk_p, SRC_CAM, - 12, 4), - MUX(CLK_MOUT_FIMC2_LCLK, "mout_fimc2_lclk", group_fimc_lclk_p, SRC_CAM, - 8, 4), - MUX(CLK_MOUT_FIMC1_LCLK, "mout_fimc1_lclk", group_fimc_lclk_p, SRC_CAM, - 4, 4), - MUX(CLK_MOUT_FIMC0_LCLK, "mout_fimc0_lclk", group_fimc_lclk_p, SRC_CAM, - 0, 4), - - /* SRC_TV */ - MUX(CLK_MOUT_HDMI, "mout_hdmi", mout_hdmi_p, SRC_TV, 0, 1), - - /* SRC_MFC */ - MUX(CLK_MOUT_MFC, "mout_mfc", mout_mfc_p, SRC_MFC, 8, 1), - MUX(CLK_MOUT_MFC_1, "mout_mfc_1", group_epll_g3dpll_p, SRC_MFC, 4, 1), - MUX(CLK_MOUT_MFC_0, "mout_mfc_0", group_mout_mpll_user_t_p, SRC_MFC, 0, - 1), - - /* SRC_G3D */ - MUX(CLK_MOUT_G3D, "mout_g3d", mout_g3d_p, SRC_G3D, 8, 1), - MUX(CLK_MOUT_G3D_1, "mout_g3d_1", group_epll_g3dpll_p, SRC_G3D, 4, 1), - MUX(CLK_MOUT_G3D_0, "mout_g3d_0", group_mout_mpll_user_t_p, SRC_G3D, 0, - 1), - - /* SRC_LCD */ - MUX(CLK_MOUT_MIPI0, "mout_mipi0", group_fimc_lclk_p, SRC_LCD, 12, 4), - MUX(CLK_MOUT_FIMD0, "mout_fimd0", group_sclk_fimd0_p, SRC_LCD, 0, 4), - - /* SRC_ISP */ - MUX(CLK_MOUT_TSADC_ISP, "mout_tsadc_isp", group_fimc_lclk_p, SRC_ISP, - 16, 4), - MUX(CLK_MOUT_UART_ISP, "mout_uart_isp", group_fimc_lclk_p, SRC_ISP, - 12, 4), - MUX(CLK_MOUT_SPI1_ISP, "mout_spi1_isp", group_fimc_lclk_p, SRC_ISP, - 8, 4), - MUX(CLK_MOUT_SPI0_ISP, "mout_spi0_isp", group_fimc_lclk_p, SRC_ISP, - 4, 4), - MUX(CLK_MOUT_PWM_ISP, "mout_pwm_isp", group_fimc_lclk_p, SRC_ISP, - 0, 4), - - /* SRC_MAUDIO */ - MUX(CLK_MOUT_AUDIO0, "mout_audio0", group_sclk_audio0_p, SRC_MAUDIO, - 0, 4), - - /* SRC_FSYS */ - MUX(CLK_MOUT_TSADC, "mout_tsadc", group_sclk_p, SRC_FSYS, 28, 4), - MUX(CLK_MOUT_MMC2, "mout_mmc2", group_sclk_p, SRC_FSYS, 8, 4), - MUX(CLK_MOUT_MMC1, "mout_mmc1", group_sclk_p, SRC_FSYS, 4, 4), - MUX(CLK_MOUT_MMC0, "mout_mmc0", group_sclk_p, SRC_FSYS, 0, 4), - - /* SRC_PERIL0 */ - MUX(CLK_MOUT_UART3, "mout_uart3", group_sclk_p, SRC_PERIL0, 12, 4), - MUX(CLK_MOUT_UART2, "mout_uart2", group_sclk_p, SRC_PERIL0, 8, 4), - MUX(CLK_MOUT_UART1, "mout_uart1", group_sclk_p, SRC_PERIL0, 4, 4), - MUX(CLK_MOUT_UART0, "mout_uart0", group_sclk_p, SRC_PERIL0, 0, 4), - - /* SRC_PERIL1 */ - MUX(CLK_MOUT_SPI2, "mout_spi2", group_sclk_p, SRC_PERIL1, 24, 4), - MUX(CLK_MOUT_SPI1, "mout_spi1", group_sclk_p, SRC_PERIL1, 20, 4), - MUX(CLK_MOUT_SPI0, "mout_spi0", group_sclk_p, SRC_PERIL1, 16, 4), - MUX(CLK_MOUT_SPDIF, "mout_spdif", group_spdif_p, SRC_PERIL1, 8, 4), - MUX(CLK_MOUT_AUDIO2, "mout_audio2", group_sclk_audio2_p, SRC_PERIL1, - 4, 4), - MUX(CLK_MOUT_AUDIO1, "mout_audio1", group_sclk_audio1_p, SRC_PERIL1, - 0, 4), - - /* SRC_CPU */ - MUX(CLK_MOUT_MPLL_USER_C, "mout_mpll_user_c", mout_mpll_user_p, - SRC_CPU, 24, 1), - MUX(CLK_MOUT_HPM, "mout_hpm", mout_hpm_p, SRC_CPU, 20, 1), - MUX_F(CLK_MOUT_CORE, "mout_core", mout_core_p, SRC_CPU, 16, 1, 0, - CLK_MUX_READ_ONLY), - MUX_F(CLK_MOUT_APLL, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, - CLK_SET_RATE_PARENT, 0), - - /* SRC_CAM1 */ - MUX(CLK_MOUT_PXLASYNC_CSIS1_FIMC, "mout_pxlasync_csis1", - group_fimc_lclk_p, SRC_CAM1, 20, 1), - MUX(CLK_MOUT_PXLASYNC_CSIS0_FIMC, "mout_pxlasync_csis0", - group_fimc_lclk_p, SRC_CAM1, 16, 1), - MUX(CLK_MOUT_JPEG, "mout_jpeg", mout_jpeg_p, SRC_CAM1, 8, 1), - MUX(CLK_MOUT_JPEG1, "mout_jpeg_1", mout_jpeg1_p, SRC_CAM1, 4, 1), - MUX(CLK_MOUT_JPEG0, "mout_jpeg_0", group_mout_mpll_user_t_p, SRC_CAM1, - 0, 1), - - /* SRC_TOP_ISP0 */ - MUX(CLK_MOUT_ACLK_ISP0_300, "mout_aclk_isp0_300", - group_aclk_isp0_300_p, SRC_TOP_ISP0, 8, 1), - MUX(CLK_MOUT_ACLK_ISP0_400, "mout_aclk_isp0_400_user", - group_aclk_isp0_400_user_p, SRC_TOP_ISP0, 4, 1), - MUX(CLK_MOUT_ACLK_ISP0_300_USER, "mout_aclk_isp0_300_user", - group_aclk_isp0_300_user_p, SRC_TOP_ISP0, 0, 1), - - /* SRC_TOP_ISP1 */ - MUX(CLK_MOUT_ACLK_ISP1_300, "mout_aclk_isp1_300", - group_aclk_isp0_300_p, SRC_TOP_ISP1, 4, 1), - MUX(CLK_MOUT_ACLK_ISP1_300_USER, "mout_aclk_isp1_300_user", - group_aclk_isp1_300_user_p, SRC_TOP_ISP1, 0, 1), -}; - -static const struct samsung_div_clock exynos4415_div_clks[] __initconst = { - /* - * NOTE: Following table is sorted by register address in ascending - * order and then bitfield shift in descending order, as it is done - * in the User's Manual. When adding new entries, please make sure - * that the order is preserved, to avoid merge conflicts and make - * further work with defined data easier. - */ - - /* DIV_LEFTBUS */ - DIV(CLK_DIV_GPL, "div_gpl", "div_gdl", DIV_LEFTBUS, 4, 3), - DIV(CLK_DIV_GDL, "div_gdl", "mout_gdl", DIV_LEFTBUS, 0, 4), - - /* DIV_RIGHTBUS */ - DIV(CLK_DIV_GPR, "div_gpr", "div_gdr", DIV_RIGHTBUS, 4, 3), - DIV(CLK_DIV_GDR, "div_gdr", "mout_gdr", DIV_RIGHTBUS, 0, 4), - - /* DIV_TOP */ - DIV(CLK_DIV_ACLK_400_MCUISP, "div_aclk_400_mcuisp", - "mout_aclk_400_mcuisp", DIV_TOP, 24, 3), - DIV(CLK_DIV_EBI, "div_ebi", "mout_ebi_1", DIV_TOP, 16, 3), - DIV(CLK_DIV_ACLK_200, "div_aclk_200", "mout_aclk_200", DIV_TOP, 12, 3), - DIV(CLK_DIV_ACLK_160, "div_aclk_160", "mout_aclk_160", DIV_TOP, 8, 3), - DIV(CLK_DIV_ACLK_100, "div_aclk_100", "mout_aclk_100", DIV_TOP, 4, 4), - DIV(CLK_DIV_ACLK_266, "div_aclk_266", "mout_aclk_266", DIV_TOP, 0, 3), - - /* DIV_CAM */ - DIV(CLK_DIV_CSIS1, "div_csis1", "mout_csis1", DIV_CAM, 28, 4), - DIV(CLK_DIV_CSIS0, "div_csis0", "mout_csis0", DIV_CAM, 24, 4), - DIV(CLK_DIV_CAM1, "div_cam1", "mout_cam1", DIV_CAM, 20, 4), - DIV(CLK_DIV_FIMC3_LCLK, "div_fimc3_lclk", "mout_fimc3_lclk", DIV_CAM, - 12, 4), - DIV(CLK_DIV_FIMC2_LCLK, "div_fimc2_lclk", "mout_fimc2_lclk", DIV_CAM, - 8, 4), - DIV(CLK_DIV_FIMC1_LCLK, "div_fimc1_lclk", "mout_fimc1_lclk", DIV_CAM, - 4, 4), - DIV(CLK_DIV_FIMC0_LCLK, "div_fimc0_lclk", "mout_fimc0_lclk", DIV_CAM, - 0, 4), - - /* DIV_TV */ - DIV(CLK_DIV_TV_BLK, "div_tv_blk", "mout_g3d_pll", DIV_TV, 0, 4), - - /* DIV_MFC */ - DIV(CLK_DIV_MFC, "div_mfc", "mout_mfc", DIV_MFC, 0, 4), - - /* DIV_G3D */ - DIV(CLK_DIV_G3D, "div_g3d", "mout_g3d", DIV_G3D, 0, 4), - - /* DIV_LCD */ - DIV_F(CLK_DIV_MIPI0_PRE, "div_mipi0_pre", "div_mipi0", DIV_LCD, 20, 4, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_MIPI0, "div_mipi0", "mout_mipi0", DIV_LCD, 16, 4), - DIV(CLK_DIV_FIMD0, "div_fimd0", "mout_fimd0", DIV_LCD, 0, 4), - - /* DIV_ISP */ - DIV(CLK_DIV_UART_ISP, "div_uart_isp", "mout_uart_isp", DIV_ISP, 28, 4), - DIV_F(CLK_DIV_SPI1_ISP_PRE, "div_spi1_isp_pre", "div_spi1_isp", - DIV_ISP, 20, 8, CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_SPI1_ISP, "div_spi1_isp", "mout_spi1_isp", DIV_ISP, 16, 4), - DIV_F(CLK_DIV_SPI0_ISP_PRE, "div_spi0_isp_pre", "div_spi0_isp", - DIV_ISP, 8, 8, CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_SPI0_ISP, "div_spi0_isp", "mout_spi0_isp", DIV_ISP, 4, 4), - DIV(CLK_DIV_PWM_ISP, "div_pwm_isp", "mout_pwm_isp", DIV_ISP, 0, 4), - - /* DIV_MAUDIO */ - DIV(CLK_DIV_PCM0, "div_pcm0", "div_audio0", DIV_MAUDIO, 4, 8), - DIV(CLK_DIV_AUDIO0, "div_audio0", "mout_audio0", DIV_MAUDIO, 0, 4), - - /* DIV_FSYS0 */ - DIV_F(CLK_DIV_TSADC_PRE, "div_tsadc_pre", "div_tsadc", DIV_FSYS0, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_TSADC, "div_tsadc", "mout_tsadc", DIV_FSYS0, 0, 4), - - /* DIV_FSYS1 */ - DIV_F(CLK_DIV_MMC1_PRE, "div_mmc1_pre", "div_mmc1", DIV_FSYS1, 24, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_MMC1, "div_mmc1", "mout_mmc1", DIV_FSYS1, 16, 4), - DIV_F(CLK_DIV_MMC0_PRE, "div_mmc0_pre", "div_mmc0", DIV_FSYS1, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_MMC0, "div_mmc0", "mout_mmc0", DIV_FSYS1, 0, 4), - - /* DIV_FSYS2 */ - DIV_F(CLK_DIV_MMC2_PRE, "div_mmc2_pre", "div_mmc2", DIV_FSYS2, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV_F(CLK_DIV_MMC2_PRE, "div_mmc2", "mout_mmc2", DIV_FSYS2, 0, 4, - CLK_SET_RATE_PARENT, 0), - - /* DIV_PERIL0 */ - DIV(CLK_DIV_UART3, "div_uart3", "mout_uart3", DIV_PERIL0, 12, 4), - DIV(CLK_DIV_UART2, "div_uart2", "mout_uart2", DIV_PERIL0, 8, 4), - DIV(CLK_DIV_UART1, "div_uart1", "mout_uart1", DIV_PERIL0, 4, 4), - DIV(CLK_DIV_UART0, "div_uart0", "mout_uart0", DIV_PERIL0, 0, 4), - - /* DIV_PERIL1 */ - DIV_F(CLK_DIV_SPI1_PRE, "div_spi1_pre", "div_spi1", DIV_PERIL1, 24, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_SPI1, "div_spi1", "mout_spi1", DIV_PERIL1, 16, 4), - DIV_F(CLK_DIV_SPI0_PRE, "div_spi0_pre", "div_spi0", DIV_PERIL1, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_SPI0, "div_spi0", "mout_spi0", DIV_PERIL1, 0, 4), - - /* DIV_PERIL2 */ - DIV_F(CLK_DIV_SPI2_PRE, "div_spi2_pre", "div_spi2", DIV_PERIL2, 8, 8, - CLK_SET_RATE_PARENT, 0), - DIV(CLK_DIV_SPI2, "div_spi2", "mout_spi2", DIV_PERIL2, 0, 4), - - /* DIV_PERIL4 */ - DIV(CLK_DIV_PCM2, "div_pcm2", "div_audio2", DIV_PERIL4, 20, 8), - DIV(CLK_DIV_AUDIO2, "div_audio2", "mout_audio2", DIV_PERIL4, 16, 4), - DIV(CLK_DIV_PCM1, "div_pcm1", "div_audio1", DIV_PERIL4, 20, 8), - DIV(CLK_DIV_AUDIO1, "div_audio1", "mout_audio1", DIV_PERIL4, 0, 4), - - /* DIV_PERIL5 */ - DIV(CLK_DIV_I2S1, "div_i2s1", "div_audio1", DIV_PERIL5, 0, 6), - - /* DIV_CAM1 */ - DIV(CLK_DIV_PXLASYNC_CSIS1_FIMC, "div_pxlasync_csis1_fimc", - "mout_pxlasync_csis1", DIV_CAM1, 24, 4), - DIV(CLK_DIV_PXLASYNC_CSIS0_FIMC, "div_pxlasync_csis0_fimc", - "mout_pxlasync_csis0", DIV_CAM1, 20, 4), - DIV(CLK_DIV_JPEG, "div_jpeg", "mout_jpeg", DIV_CAM1, 0, 4), - - /* DIV_CPU0 */ - DIV(CLK_DIV_CORE2, "div_core2", "div_core", DIV_CPU0, 28, 3), - DIV_F(CLK_DIV_APLL, "div_apll", "mout_apll", DIV_CPU0, 24, 3, - CLK_GET_RATE_NOCACHE, CLK_DIVIDER_READ_ONLY), - DIV(CLK_DIV_PCLK_DBG, "div_pclk_dbg", "div_core2", DIV_CPU0, 20, 3), - DIV(CLK_DIV_ATB, "div_atb", "div_core2", DIV_CPU0, 16, 3), - DIV(CLK_DIV_PERIPH, "div_periph", "div_core2", DIV_CPU0, 12, 3), - DIV(CLK_DIV_COREM1, "div_corem1", "div_core2", DIV_CPU0, 8, 3), - DIV(CLK_DIV_COREM0, "div_corem0", "div_core2", DIV_CPU0, 4, 3), - DIV_F(CLK_DIV_CORE, "div_core", "mout_core", DIV_CPU0, 0, 3, - CLK_GET_RATE_NOCACHE, CLK_DIVIDER_READ_ONLY), - - /* DIV_CPU1 */ - DIV(CLK_DIV_HPM, "div_hpm", "div_copy", DIV_CPU1, 4, 3), - DIV(CLK_DIV_COPY, "div_copy", "mout_hpm", DIV_CPU1, 0, 3), -}; - -static const struct samsung_gate_clock exynos4415_gate_clks[] __initconst = { - /* - * NOTE: Following table is sorted by register address in ascending - * order and then bitfield shift in descending order, as it is done - * in the User's Manual. When adding new entries, please make sure - * that the order is preserved, to avoid merge conflicts and make - * further work with defined data easier. - */ - - /* GATE_IP_LEFTBUS */ - GATE(CLK_ASYNC_G3D, "async_g3d", "div_aclk_100", GATE_IP_LEFTBUS, 6, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNC_MFCL, "async_mfcl", "div_aclk_100", GATE_IP_LEFTBUS, 4, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNC_TVX, "async_tvx", "div_aclk_100", GATE_IP_LEFTBUS, 3, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMULEFT, "ppmuleft", "div_aclk_100", GATE_IP_LEFTBUS, 1, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_GPIO_LEFT, "gpio_left", "div_aclk_100", GATE_IP_LEFTBUS, 0, - CLK_IGNORE_UNUSED, 0), - - /* GATE_IP_IMAGE */ - GATE(CLK_PPMUIMAGE, "ppmuimage", "div_aclk_100", GATE_IP_IMAGE, - 9, 0, 0), - GATE(CLK_QEMDMA2, "qe_mdma2", "div_aclk_100", GATE_IP_IMAGE, - 8, 0, 0), - GATE(CLK_QEROTATOR, "qe_rotator", "div_aclk_100", GATE_IP_IMAGE, - 7, 0, 0), - GATE(CLK_SMMUMDMA2, "smmu_mdam2", "div_aclk_100", GATE_IP_IMAGE, - 5, 0, 0), - GATE(CLK_SMMUROTATOR, "smmu_rotator", "div_aclk_100", GATE_IP_IMAGE, - 4, 0, 0), - GATE(CLK_MDMA2, "mdma2", "div_aclk_100", GATE_IP_IMAGE, 2, 0, 0), - GATE(CLK_ROTATOR, "rotator", "div_aclk_100", GATE_IP_IMAGE, 1, 0, 0), - - /* GATE_IP_RIGHTBUS */ - GATE(CLK_ASYNC_ISPMX, "async_ispmx", "div_aclk_100", - GATE_IP_RIGHTBUS, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNC_MAUDIOX, "async_maudiox", "div_aclk_100", - GATE_IP_RIGHTBUS, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNC_MFCR, "async_mfcr", "div_aclk_100", - GATE_IP_RIGHTBUS, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNC_FSYSD, "async_fsysd", "div_aclk_100", - GATE_IP_RIGHTBUS, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNC_LCD0X, "async_lcd0x", "div_aclk_100", - GATE_IP_RIGHTBUS, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ASYNC_CAMX, "async_camx", "div_aclk_100", - GATE_IP_RIGHTBUS, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMURIGHT, "ppmuright", "div_aclk_100", - GATE_IP_RIGHTBUS, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_GPIO_RIGHT, "gpio_right", "div_aclk_100", - GATE_IP_RIGHTBUS, 0, CLK_IGNORE_UNUSED, 0), - - /* GATE_IP_PERIR */ - GATE(CLK_ANTIRBK_APBIF, "antirbk_apbif", "div_aclk_100", - GATE_IP_PERIR, 24, CLK_IGNORE_UNUSED, 0), - GATE(CLK_EFUSE_WRITER_APBIF, "efuse_writer_apbif", "div_aclk_100", - GATE_IP_PERIR, 23, CLK_IGNORE_UNUSED, 0), - GATE(CLK_MONOCNT, "monocnt", "div_aclk_100", GATE_IP_PERIR, 22, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC6, "tzpc6", "div_aclk_100", GATE_IP_PERIR, 21, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PROVISIONKEY1, "provisionkey1", "div_aclk_100", - GATE_IP_PERIR, 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PROVISIONKEY0, "provisionkey0", "div_aclk_100", - GATE_IP_PERIR, 19, CLK_IGNORE_UNUSED, 0), - GATE(CLK_CMU_ISPPART, "cmu_isppart", "div_aclk_100", GATE_IP_PERIR, 18, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TMU_APBIF, "tmu_apbif", "div_aclk_100", - GATE_IP_PERIR, 17, 0, 0), - GATE(CLK_KEYIF, "keyif", "div_aclk_100", GATE_IP_PERIR, 16, 0, 0), - GATE(CLK_RTC, "rtc", "div_aclk_100", GATE_IP_PERIR, 15, 0, 0), - GATE(CLK_WDT, "wdt", "div_aclk_100", GATE_IP_PERIR, 14, 0, 0), - GATE(CLK_MCT, "mct", "div_aclk_100", GATE_IP_PERIR, 13, 0, 0), - GATE(CLK_SECKEY, "seckey", "div_aclk_100", GATE_IP_PERIR, 12, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_HDMI_CEC, "hdmi_cec", "div_aclk_100", GATE_IP_PERIR, 11, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC5, "tzpc5", "div_aclk_100", GATE_IP_PERIR, 10, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC4, "tzpc4", "div_aclk_100", GATE_IP_PERIR, 9, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC3, "tzpc3", "div_aclk_100", GATE_IP_PERIR, 8, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC2, "tzpc2", "div_aclk_100", GATE_IP_PERIR, 7, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC1, "tzpc1", "div_aclk_100", GATE_IP_PERIR, 6, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC0, "tzpc0", "div_aclk_100", GATE_IP_PERIR, 5, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_CMU_COREPART, "cmu_corepart", "div_aclk_100", GATE_IP_PERIR, 4, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_CMU_TOPPART, "cmu_toppart", "div_aclk_100", GATE_IP_PERIR, 3, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PMU_APBIF, "pmu_apbif", "div_aclk_100", GATE_IP_PERIR, 2, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_SYSREG, "sysreg", "div_aclk_100", GATE_IP_PERIR, 1, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_CHIP_ID, "chip_id", "div_aclk_100", GATE_IP_PERIR, 0, - CLK_IGNORE_UNUSED, 0), - - /* GATE_SCLK_CAM - non-completed */ - GATE(CLK_SCLK_PXLAYSNC_CSIS1_FIMC, "sclk_pxlasync_csis1_fimc", - "div_pxlasync_csis1_fimc", GATE_SCLK_CAM, 11, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PXLAYSNC_CSIS0_FIMC, "sclk_pxlasync_csis0_fimc", - "div_pxlasync_csis0_fimc", GATE_SCLK_CAM, - 10, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_JPEG, "sclk_jpeg", "div_jpeg", - GATE_SCLK_CAM, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_CSIS1, "sclk_csis1", "div_csis1", - GATE_SCLK_CAM, 7, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_CSIS0, "sclk_csis0", "div_csis0", - GATE_SCLK_CAM, 6, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_CAM1, "sclk_cam1", "div_cam1", - GATE_SCLK_CAM, 5, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_FIMC3_LCLK, "sclk_fimc3_lclk", "div_fimc3_lclk", - GATE_SCLK_CAM, 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_FIMC2_LCLK, "sclk_fimc2_lclk", "div_fimc2_lclk", - GATE_SCLK_CAM, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_FIMC1_LCLK, "sclk_fimc1_lclk", "div_fimc1_lclk", - GATE_SCLK_CAM, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_FIMC0_LCLK, "sclk_fimc0_lclk", "div_fimc0_lclk", - GATE_SCLK_CAM, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_TV */ - GATE(CLK_SCLK_PIXEL, "sclk_pixel", "div_tv_blk", - GATE_SCLK_TV, 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_HDMI, "sclk_hdmi", "mout_hdmi", - GATE_SCLK_TV, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MIXER, "sclk_mixer", "div_tv_blk", - GATE_SCLK_TV, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_MFC */ - GATE(CLK_SCLK_MFC, "sclk_mfc", "div_mfc", - GATE_SCLK_MFC, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_G3D */ - GATE(CLK_SCLK_G3D, "sclk_g3d", "div_g3d", - GATE_SCLK_G3D, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_LCD */ - GATE(CLK_SCLK_MIPIDPHY4L, "sclk_mipidphy4l", "div_mipi0", - GATE_SCLK_LCD, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MIPI0, "sclk_mipi0", "div_mipi0_pre", - GATE_SCLK_LCD, 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MDNIE0, "sclk_mdnie0", "div_fimd0", - GATE_SCLK_LCD, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_FIMD0, "sclk_fimd0", "div_fimd0", - GATE_SCLK_LCD, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_MAUDIO */ - GATE(CLK_SCLK_PCM0, "sclk_pcm0", "div_pcm0", - GATE_SCLK_MAUDIO, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_AUDIO0, "sclk_audio0", "div_audio0", - GATE_SCLK_MAUDIO, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_FSYS */ - GATE(CLK_SCLK_TSADC, "sclk_tsadc", "div_tsadc_pre", - GATE_SCLK_FSYS, 9, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_EBI, "sclk_ebi", "div_ebi", - GATE_SCLK_FSYS, 6, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC2, "sclk_mmc2", "div_mmc2_pre", - GATE_SCLK_FSYS, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC1, "sclk_mmc1", "div_mmc1_pre", - GATE_SCLK_FSYS, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC0, "sclk_mmc0", "div_mmc0_pre", - GATE_SCLK_FSYS, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_SCLK_PERIL */ - GATE(CLK_SCLK_I2S, "sclk_i2s1", "div_i2s1", - GATE_SCLK_PERIL, 18, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PCM2, "sclk_pcm2", "div_pcm2", - GATE_SCLK_PERIL, 16, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PCM1, "sclk_pcm1", "div_pcm1", - GATE_SCLK_PERIL, 15, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_AUDIO2, "sclk_audio2", "div_audio2", - GATE_SCLK_PERIL, 14, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_AUDIO1, "sclk_audio1", "div_audio1", - GATE_SCLK_PERIL, 13, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPDIF, "sclk_spdif", "mout_spdif", - GATE_SCLK_PERIL, 10, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI2, "sclk_spi2", "div_spi2_pre", - GATE_SCLK_PERIL, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI1, "sclk_spi1", "div_spi1_pre", - GATE_SCLK_PERIL, 7, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI0, "sclk_spi0", "div_spi0_pre", - GATE_SCLK_PERIL, 6, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART3, "sclk_uart3", "div_uart3", - GATE_SCLK_PERIL, 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART2, "sclk_uart2", "div_uart2", - GATE_SCLK_PERIL, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART1, "sclk_uart1", "div_uart1", - GATE_SCLK_PERIL, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART0, "sclk_uart0", "div_uart0", - GATE_SCLK_PERIL, 0, CLK_SET_RATE_PARENT, 0), - - /* GATE_IP_CAM */ - GATE(CLK_SMMUFIMC_LITE2, "smmufimc_lite2", "div_aclk_160", GATE_IP_CAM, - 22, CLK_IGNORE_UNUSED, 0), - GATE(CLK_FIMC_LITE2, "fimc_lite2", "div_aclk_160", GATE_IP_CAM, - 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PIXELASYNCM1, "pixelasyncm1", "div_aclk_160", GATE_IP_CAM, - 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PIXELASYNCM0, "pixelasyncm0", "div_aclk_160", GATE_IP_CAM, - 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMUCAMIF, "ppmucamif", "div_aclk_160", GATE_IP_CAM, - 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMUJPEG, "smmujpeg", "div_aclk_160", GATE_IP_CAM, 11, 0, 0), - GATE(CLK_SMMUFIMC3, "smmufimc3", "div_aclk_160", GATE_IP_CAM, 10, 0, 0), - GATE(CLK_SMMUFIMC2, "smmufimc2", "div_aclk_160", GATE_IP_CAM, 9, 0, 0), - GATE(CLK_SMMUFIMC1, "smmufimc1", "div_aclk_160", GATE_IP_CAM, 8, 0, 0), - GATE(CLK_SMMUFIMC0, "smmufimc0", "div_aclk_160", GATE_IP_CAM, 7, 0, 0), - GATE(CLK_JPEG, "jpeg", "div_aclk_160", GATE_IP_CAM, 6, 0, 0), - GATE(CLK_CSIS1, "csis1", "div_aclk_160", GATE_IP_CAM, 5, 0, 0), - GATE(CLK_CSIS0, "csis0", "div_aclk_160", GATE_IP_CAM, 4, 0, 0), - GATE(CLK_FIMC3, "fimc3", "div_aclk_160", GATE_IP_CAM, 3, 0, 0), - GATE(CLK_FIMC2, "fimc2", "div_aclk_160", GATE_IP_CAM, 2, 0, 0), - GATE(CLK_FIMC1, "fimc1", "div_aclk_160", GATE_IP_CAM, 1, 0, 0), - GATE(CLK_FIMC0, "fimc0", "div_aclk_160", GATE_IP_CAM, 0, 0, 0), - - /* GATE_IP_TV */ - GATE(CLK_PPMUTV, "ppmutv", "div_aclk_100", GATE_IP_TV, 5, 0, 0), - GATE(CLK_SMMUTV, "smmutv", "div_aclk_100", GATE_IP_TV, 4, 0, 0), - GATE(CLK_HDMI, "hdmi", "div_aclk_100", GATE_IP_TV, 3, 0, 0), - GATE(CLK_MIXER, "mixer", "div_aclk_100", GATE_IP_TV, 1, 0, 0), - GATE(CLK_VP, "vp", "div_aclk_100", GATE_IP_TV, 0, 0, 0), - - /* GATE_IP_MFC */ - GATE(CLK_PPMUMFC_R, "ppmumfc_r", "div_aclk_200", GATE_IP_MFC, 4, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PPMUMFC_L, "ppmumfc_l", "div_aclk_200", GATE_IP_MFC, 3, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMUMFC_R, "smmumfc_r", "div_aclk_200", GATE_IP_MFC, 2, 0, 0), - GATE(CLK_SMMUMFC_L, "smmumfc_l", "div_aclk_200", GATE_IP_MFC, 1, 0, 0), - GATE(CLK_MFC, "mfc", "div_aclk_200", GATE_IP_MFC, 0, 0, 0), - - /* GATE_IP_G3D */ - GATE(CLK_PPMUG3D, "ppmug3d", "div_aclk_200", GATE_IP_G3D, 1, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_G3D, "g3d", "div_aclk_200", GATE_IP_G3D, 0, 0, 0), - - /* GATE_IP_LCD */ - GATE(CLK_PPMULCD0, "ppmulcd0", "div_aclk_160", GATE_IP_LCD, 5, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_SMMUFIMD0, "smmufimd0", "div_aclk_160", GATE_IP_LCD, 4, 0, 0), - GATE(CLK_DSIM0, "dsim0", "div_aclk_160", GATE_IP_LCD, 3, 0, 0), - GATE(CLK_SMIES, "smies", "div_aclk_160", GATE_IP_LCD, 2, 0, 0), - GATE(CLK_MIE0, "mie0", "div_aclk_160", GATE_IP_LCD, 1, 0, 0), - GATE(CLK_FIMD0, "fimd0", "div_aclk_160", GATE_IP_LCD, 0, 0, 0), - - /* GATE_IP_FSYS */ - GATE(CLK_TSADC, "tsadc", "div_aclk_200", GATE_IP_FSYS, 20, 0, 0), - GATE(CLK_PPMUFILE, "ppmufile", "div_aclk_200", GATE_IP_FSYS, 17, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_NFCON, "nfcon", "div_aclk_200", GATE_IP_FSYS, 16, 0, 0), - GATE(CLK_USBDEVICE, "usbdevice", "div_aclk_200", GATE_IP_FSYS, 13, - 0, 0), - GATE(CLK_USBHOST, "usbhost", "div_aclk_200", GATE_IP_FSYS, 12, 0, 0), - GATE(CLK_SROMC, "sromc", "div_aclk_200", GATE_IP_FSYS, 11, 0, 0), - GATE(CLK_SDMMC2, "sdmmc2", "div_aclk_200", GATE_IP_FSYS, 7, 0, 0), - GATE(CLK_SDMMC1, "sdmmc1", "div_aclk_200", GATE_IP_FSYS, 6, 0, 0), - GATE(CLK_SDMMC0, "sdmmc0", "div_aclk_200", GATE_IP_FSYS, 5, 0, 0), - GATE(CLK_PDMA1, "pdma1", "div_aclk_200", GATE_IP_FSYS, 1, 0, 0), - GATE(CLK_PDMA0, "pdma0", "div_aclk_200", GATE_IP_FSYS, 0, 0, 0), - - /* GATE_IP_PERIL */ - GATE(CLK_SPDIF, "spdif", "div_aclk_100", GATE_IP_PERIL, 26, 0, 0), - GATE(CLK_PWM, "pwm", "div_aclk_100", GATE_IP_PERIL, 24, 0, 0), - GATE(CLK_PCM2, "pcm2", "div_aclk_100", GATE_IP_PERIL, 23, 0, 0), - GATE(CLK_PCM1, "pcm1", "div_aclk_100", GATE_IP_PERIL, 22, 0, 0), - GATE(CLK_I2S1, "i2s1", "div_aclk_100", GATE_IP_PERIL, 20, 0, 0), - GATE(CLK_SPI2, "spi2", "div_aclk_100", GATE_IP_PERIL, 18, 0, 0), - GATE(CLK_SPI1, "spi1", "div_aclk_100", GATE_IP_PERIL, 17, 0, 0), - GATE(CLK_SPI0, "spi0", "div_aclk_100", GATE_IP_PERIL, 16, 0, 0), - GATE(CLK_I2CHDMI, "i2chdmi", "div_aclk_100", GATE_IP_PERIL, 14, 0, 0), - GATE(CLK_I2C7, "i2c7", "div_aclk_100", GATE_IP_PERIL, 13, 0, 0), - GATE(CLK_I2C6, "i2c6", "div_aclk_100", GATE_IP_PERIL, 12, 0, 0), - GATE(CLK_I2C5, "i2c5", "div_aclk_100", GATE_IP_PERIL, 11, 0, 0), - GATE(CLK_I2C4, "i2c4", "div_aclk_100", GATE_IP_PERIL, 10, 0, 0), - GATE(CLK_I2C3, "i2c3", "div_aclk_100", GATE_IP_PERIL, 9, 0, 0), - GATE(CLK_I2C2, "i2c2", "div_aclk_100", GATE_IP_PERIL, 8, 0, 0), - GATE(CLK_I2C1, "i2c1", "div_aclk_100", GATE_IP_PERIL, 7, 0, 0), - GATE(CLK_I2C0, "i2c0", "div_aclk_100", GATE_IP_PERIL, 6, 0, 0), - GATE(CLK_UART3, "uart3", "div_aclk_100", GATE_IP_PERIL, 3, 0, 0), - GATE(CLK_UART2, "uart2", "div_aclk_100", GATE_IP_PERIL, 2, 0, 0), - GATE(CLK_UART1, "uart1", "div_aclk_100", GATE_IP_PERIL, 1, 0, 0), - GATE(CLK_UART0, "uart0", "div_aclk_100", GATE_IP_PERIL, 0, 0, 0), -}; - -/* - * APLL & MPLL & BPLL & ISP_PLL & DISP_PLL & G3D_PLL - */ -static const struct samsung_pll_rate_table exynos4415_pll_rates[] __initconst = { - PLL_35XX_RATE(1600000000, 400, 3, 1), - PLL_35XX_RATE(1500000000, 250, 2, 1), - PLL_35XX_RATE(1400000000, 175, 3, 0), - PLL_35XX_RATE(1300000000, 325, 3, 1), - PLL_35XX_RATE(1200000000, 400, 4, 1), - PLL_35XX_RATE(1100000000, 275, 3, 1), - PLL_35XX_RATE(1066000000, 533, 6, 1), - PLL_35XX_RATE(1000000000, 250, 3, 1), - PLL_35XX_RATE(960000000, 320, 4, 1), - PLL_35XX_RATE(900000000, 300, 4, 1), - PLL_35XX_RATE(850000000, 425, 6, 1), - PLL_35XX_RATE(800000000, 200, 3, 1), - PLL_35XX_RATE(700000000, 175, 3, 1), - PLL_35XX_RATE(667000000, 667, 12, 1), - PLL_35XX_RATE(600000000, 400, 4, 2), - PLL_35XX_RATE(550000000, 275, 3, 2), - PLL_35XX_RATE(533000000, 533, 6, 2), - PLL_35XX_RATE(520000000, 260, 3, 2), - PLL_35XX_RATE(500000000, 250, 3, 2), - PLL_35XX_RATE(440000000, 220, 3, 2), - PLL_35XX_RATE(400000000, 200, 3, 2), - PLL_35XX_RATE(350000000, 175, 3, 2), - PLL_35XX_RATE(300000000, 300, 3, 3), - PLL_35XX_RATE(266000000, 266, 3, 3), - PLL_35XX_RATE(200000000, 200, 3, 3), - PLL_35XX_RATE(160000000, 160, 3, 3), - PLL_35XX_RATE(100000000, 200, 3, 4), - { /* sentinel */ } -}; - -/* EPLL */ -static const struct samsung_pll_rate_table exynos4415_epll_rates[] __initconst = { - PLL_36XX_RATE(800000000, 200, 3, 1, 0), - PLL_36XX_RATE(288000000, 96, 2, 2, 0), - PLL_36XX_RATE(192000000, 128, 2, 3, 0), - PLL_36XX_RATE(144000000, 96, 2, 3, 0), - PLL_36XX_RATE(96000000, 128, 2, 4, 0), - PLL_36XX_RATE(84000000, 112, 2, 4, 0), - PLL_36XX_RATE(80750011, 107, 2, 4, 43691), - PLL_36XX_RATE(73728004, 98, 2, 4, 19923), - PLL_36XX_RATE(67987602, 271, 3, 5, 62285), - PLL_36XX_RATE(65911004, 175, 2, 5, 49982), - PLL_36XX_RATE(50000000, 200, 3, 5, 0), - PLL_36XX_RATE(49152003, 131, 2, 5, 4719), - PLL_36XX_RATE(48000000, 128, 2, 5, 0), - PLL_36XX_RATE(45250000, 181, 3, 5, 0), - { /* sentinel */ } -}; - -static const struct samsung_pll_clock exynos4415_plls[] __initconst = { - PLL(pll_35xx, CLK_FOUT_APLL, "fout_apll", "fin_pll", - APLL_LOCK, APLL_CON0, exynos4415_pll_rates), - PLL(pll_36xx, CLK_FOUT_EPLL, "fout_epll", "fin_pll", - EPLL_LOCK, EPLL_CON0, exynos4415_epll_rates), - PLL(pll_35xx, CLK_FOUT_G3D_PLL, "fout_g3d_pll", "mout_g3d_pllsrc", - G3D_PLL_LOCK, G3D_PLL_CON0, exynos4415_pll_rates), - PLL(pll_35xx, CLK_FOUT_ISP_PLL, "fout_isp_pll", "fin_pll", - ISP_PLL_LOCK, ISP_PLL_CON0, exynos4415_pll_rates), - PLL(pll_35xx, CLK_FOUT_DISP_PLL, "fout_disp_pll", - "fin_pll", DISP_PLL_LOCK, DISP_PLL_CON0, exynos4415_pll_rates), -}; - -static const struct samsung_cmu_info cmu_info __initconst = { - .pll_clks = exynos4415_plls, - .nr_pll_clks = ARRAY_SIZE(exynos4415_plls), - .mux_clks = exynos4415_mux_clks, - .nr_mux_clks = ARRAY_SIZE(exynos4415_mux_clks), - .div_clks = exynos4415_div_clks, - .nr_div_clks = ARRAY_SIZE(exynos4415_div_clks), - .gate_clks = exynos4415_gate_clks, - .nr_gate_clks = ARRAY_SIZE(exynos4415_gate_clks), - .fixed_clks = exynos4415_fixed_rate_clks, - .nr_fixed_clks = ARRAY_SIZE(exynos4415_fixed_rate_clks), - .fixed_factor_clks = exynos4415_fixed_factor_clks, - .nr_fixed_factor_clks = ARRAY_SIZE(exynos4415_fixed_factor_clks), - .nr_clk_ids = CLK_NR_CLKS, - .clk_regs = exynos4415_cmu_clk_regs, - .nr_clk_regs = ARRAY_SIZE(exynos4415_cmu_clk_regs), -}; - -static void __init exynos4415_cmu_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &cmu_info); -} -CLK_OF_DECLARE(exynos4415_cmu, "samsung,exynos4415-cmu", exynos4415_cmu_init); - -/* - * CMU DMC - */ - -#define MPLL_LOCK 0x008 -#define MPLL_CON0 0x108 -#define MPLL_CON1 0x10c -#define MPLL_CON2 0x110 -#define BPLL_LOCK 0x118 -#define BPLL_CON0 0x218 -#define BPLL_CON1 0x21c -#define BPLL_CON2 0x220 -#define SRC_DMC 0x300 -#define DIV_DMC1 0x504 - -static const unsigned long exynos4415_cmu_dmc_clk_regs[] __initconst = { - MPLL_LOCK, - MPLL_CON0, - MPLL_CON1, - MPLL_CON2, - BPLL_LOCK, - BPLL_CON0, - BPLL_CON1, - BPLL_CON2, - SRC_DMC, - DIV_DMC1, -}; - -PNAME(mout_mpll_p) = { "fin_pll", "fout_mpll", }; -PNAME(mout_bpll_p) = { "fin_pll", "fout_bpll", }; -PNAME(mbpll_p) = { "mout_mpll", "mout_bpll", }; - -static const struct samsung_mux_clock exynos4415_dmc_mux_clks[] __initconst = { - MUX(CLK_DMC_MOUT_MPLL, "mout_mpll", mout_mpll_p, SRC_DMC, 12, 1), - MUX(CLK_DMC_MOUT_BPLL, "mout_bpll", mout_bpll_p, SRC_DMC, 10, 1), - MUX(CLK_DMC_MOUT_DPHY, "mout_dphy", mbpll_p, SRC_DMC, 8, 1), - MUX(CLK_DMC_MOUT_DMC_BUS, "mout_dmc_bus", mbpll_p, SRC_DMC, 4, 1), -}; - -static const struct samsung_div_clock exynos4415_dmc_div_clks[] __initconst = { - DIV(CLK_DMC_DIV_DMC, "div_dmc", "div_dmc_pre", DIV_DMC1, 27, 3), - DIV(CLK_DMC_DIV_DPHY, "div_dphy", "mout_dphy", DIV_DMC1, 23, 3), - DIV(CLK_DMC_DIV_DMC_PRE, "div_dmc_pre", "mout_dmc_bus", - DIV_DMC1, 19, 2), - DIV(CLK_DMC_DIV_DMCP, "div_dmcp", "div_dmcd", DIV_DMC1, 15, 3), - DIV(CLK_DMC_DIV_DMCD, "div_dmcd", "div_dmc", DIV_DMC1, 11, 3), - DIV(CLK_DMC_DIV_MPLL_PRE, "div_mpll_pre", "mout_mpll", DIV_DMC1, 8, 2), -}; - -static const struct samsung_pll_clock exynos4415_dmc_plls[] __initconst = { - PLL(pll_35xx, CLK_DMC_FOUT_MPLL, "fout_mpll", "fin_pll", - MPLL_LOCK, MPLL_CON0, exynos4415_pll_rates), - PLL(pll_35xx, CLK_DMC_FOUT_BPLL, "fout_bpll", "fin_pll", - BPLL_LOCK, BPLL_CON0, exynos4415_pll_rates), -}; - -static const struct samsung_cmu_info cmu_dmc_info __initconst = { - .pll_clks = exynos4415_dmc_plls, - .nr_pll_clks = ARRAY_SIZE(exynos4415_dmc_plls), - .mux_clks = exynos4415_dmc_mux_clks, - .nr_mux_clks = ARRAY_SIZE(exynos4415_dmc_mux_clks), - .div_clks = exynos4415_dmc_div_clks, - .nr_div_clks = ARRAY_SIZE(exynos4415_dmc_div_clks), - .nr_clk_ids = NR_CLKS_DMC, - .clk_regs = exynos4415_cmu_dmc_clk_regs, - .nr_clk_regs = ARRAY_SIZE(exynos4415_cmu_dmc_clk_regs), -}; - -static void __init exynos4415_cmu_dmc_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &cmu_dmc_info); -} -CLK_OF_DECLARE(exynos4415_cmu_dmc, "samsung,exynos4415-cmu-dmc", - exynos4415_cmu_dmc_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos5250.c b/drivers/clk/samsung/samsung/clk-exynos5250.c deleted file mode 100644 index 27a227d6620c..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos5250.c +++ /dev/null @@ -1,868 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Copyright (c) 2013 Linaro Ltd. - * Author: Thomas Abraham - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos5250 SoC. -*/ - -#include -#include -#include -#include -#include - -#include "clk.h" -#include "clk-cpu.h" - -#define APLL_LOCK 0x0 -#define APLL_CON0 0x100 -#define SRC_CPU 0x200 -#define DIV_CPU0 0x500 -#define PWR_CTRL1 0x1020 -#define PWR_CTRL2 0x1024 -#define MPLL_LOCK 0x4000 -#define MPLL_CON0 0x4100 -#define SRC_CORE1 0x4204 -#define GATE_IP_ACP 0x8800 -#define GATE_IP_ISP0 0xc800 -#define GATE_IP_ISP1 0xc804 -#define CPLL_LOCK 0x10020 -#define EPLL_LOCK 0x10030 -#define VPLL_LOCK 0x10040 -#define GPLL_LOCK 0x10050 -#define CPLL_CON0 0x10120 -#define EPLL_CON0 0x10130 -#define VPLL_CON0 0x10140 -#define GPLL_CON0 0x10150 -#define SRC_TOP0 0x10210 -#define SRC_TOP1 0x10214 -#define SRC_TOP2 0x10218 -#define SRC_TOP3 0x1021c -#define SRC_GSCL 0x10220 -#define SRC_DISP1_0 0x1022c -#define SRC_MAU 0x10240 -#define SRC_FSYS 0x10244 -#define SRC_GEN 0x10248 -#define SRC_PERIC0 0x10250 -#define SRC_PERIC1 0x10254 -#define SRC_MASK_GSCL 0x10320 -#define SRC_MASK_DISP1_0 0x1032c -#define SRC_MASK_MAU 0x10334 -#define SRC_MASK_FSYS 0x10340 -#define SRC_MASK_GEN 0x10344 -#define SRC_MASK_PERIC0 0x10350 -#define SRC_MASK_PERIC1 0x10354 -#define DIV_TOP0 0x10510 -#define DIV_TOP1 0x10514 -#define DIV_GSCL 0x10520 -#define DIV_DISP1_0 0x1052c -#define DIV_GEN 0x1053c -#define DIV_MAU 0x10544 -#define DIV_FSYS0 0x10548 -#define DIV_FSYS1 0x1054c -#define DIV_FSYS2 0x10550 -#define DIV_PERIC0 0x10558 -#define DIV_PERIC1 0x1055c -#define DIV_PERIC2 0x10560 -#define DIV_PERIC3 0x10564 -#define DIV_PERIC4 0x10568 -#define DIV_PERIC5 0x1056c -#define GATE_IP_GSCL 0x10920 -#define GATE_IP_DISP1 0x10928 -#define GATE_IP_MFC 0x1092c -#define GATE_IP_G3D 0x10930 -#define GATE_IP_GEN 0x10934 -#define GATE_IP_FSYS 0x10944 -#define GATE_IP_PERIC 0x10950 -#define GATE_IP_PERIS 0x10960 -#define BPLL_LOCK 0x20010 -#define BPLL_CON0 0x20110 -#define SRC_CDREX 0x20200 -#define PLL_DIV2_SEL 0x20a24 - -/*Below definitions are used for PWR_CTRL settings*/ -#define PWR_CTRL1_CORE2_DOWN_RATIO (7 << 28) -#define PWR_CTRL1_CORE1_DOWN_RATIO (7 << 16) -#define PWR_CTRL1_DIV2_DOWN_EN (1 << 9) -#define PWR_CTRL1_DIV1_DOWN_EN (1 << 8) -#define PWR_CTRL1_USE_CORE1_WFE (1 << 5) -#define PWR_CTRL1_USE_CORE0_WFE (1 << 4) -#define PWR_CTRL1_USE_CORE1_WFI (1 << 1) -#define PWR_CTRL1_USE_CORE0_WFI (1 << 0) - -#define PWR_CTRL2_DIV2_UP_EN (1 << 25) -#define PWR_CTRL2_DIV1_UP_EN (1 << 24) -#define PWR_CTRL2_DUR_STANDBY2_VAL (1 << 16) -#define PWR_CTRL2_DUR_STANDBY1_VAL (1 << 8) -#define PWR_CTRL2_CORE2_UP_RATIO (1 << 4) -#define PWR_CTRL2_CORE1_UP_RATIO (1 << 0) - -/* list of PLLs to be registered */ -enum exynos5250_plls { - apll, mpll, cpll, epll, vpll, gpll, bpll, - nr_plls /* number of PLLs */ -}; - -static void __iomem *reg_base; - -#ifdef CONFIG_PM_SLEEP -static struct samsung_clk_reg_dump *exynos5250_save; - -/* - * list of controller registers to be saved and restored during a - * suspend/resume cycle. - */ -static const unsigned long exynos5250_clk_regs[] __initconst = { - SRC_CPU, - DIV_CPU0, - PWR_CTRL1, - PWR_CTRL2, - SRC_CORE1, - SRC_TOP0, - SRC_TOP1, - SRC_TOP2, - SRC_TOP3, - SRC_GSCL, - SRC_DISP1_0, - SRC_MAU, - SRC_FSYS, - SRC_GEN, - SRC_PERIC0, - SRC_PERIC1, - SRC_MASK_GSCL, - SRC_MASK_DISP1_0, - SRC_MASK_MAU, - SRC_MASK_FSYS, - SRC_MASK_GEN, - SRC_MASK_PERIC0, - SRC_MASK_PERIC1, - DIV_TOP0, - DIV_TOP1, - DIV_GSCL, - DIV_DISP1_0, - DIV_GEN, - DIV_MAU, - DIV_FSYS0, - DIV_FSYS1, - DIV_FSYS2, - DIV_PERIC0, - DIV_PERIC1, - DIV_PERIC2, - DIV_PERIC3, - DIV_PERIC4, - DIV_PERIC5, - GATE_IP_GSCL, - GATE_IP_MFC, - GATE_IP_G3D, - GATE_IP_GEN, - GATE_IP_FSYS, - GATE_IP_PERIC, - GATE_IP_PERIS, - SRC_CDREX, - PLL_DIV2_SEL, - GATE_IP_DISP1, - GATE_IP_ACP, - GATE_IP_ISP0, - GATE_IP_ISP1, -}; - -static int exynos5250_clk_suspend(void) -{ - samsung_clk_save(reg_base, exynos5250_save, - ARRAY_SIZE(exynos5250_clk_regs)); - - return 0; -} - -static void exynos5250_clk_resume(void) -{ - samsung_clk_restore(reg_base, exynos5250_save, - ARRAY_SIZE(exynos5250_clk_regs)); -} - -static struct syscore_ops exynos5250_clk_syscore_ops = { - .suspend = exynos5250_clk_suspend, - .resume = exynos5250_clk_resume, -}; - -static void __init exynos5250_clk_sleep_init(void) -{ - exynos5250_save = samsung_clk_alloc_reg_dump(exynos5250_clk_regs, - ARRAY_SIZE(exynos5250_clk_regs)); - if (!exynos5250_save) { - pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", - __func__); - return; - } - - register_syscore_ops(&exynos5250_clk_syscore_ops); -} -#else -static void __init exynos5250_clk_sleep_init(void) {} -#endif - -/* list of all parent clock list */ -PNAME(mout_apll_p) = { "fin_pll", "fout_apll", }; -PNAME(mout_cpu_p) = { "mout_apll", "mout_mpll", }; -PNAME(mout_mpll_fout_p) = { "fout_mplldiv2", "fout_mpll" }; -PNAME(mout_mpll_p) = { "fin_pll", "mout_mpll_fout" }; -PNAME(mout_bpll_fout_p) = { "fout_bplldiv2", "fout_bpll" }; -PNAME(mout_bpll_p) = { "fin_pll", "mout_bpll_fout" }; -PNAME(mout_vpllsrc_p) = { "fin_pll", "sclk_hdmi27m" }; -PNAME(mout_vpll_p) = { "mout_vpllsrc", "fout_vpll" }; -PNAME(mout_cpll_p) = { "fin_pll", "fout_cpll" }; -PNAME(mout_epll_p) = { "fin_pll", "fout_epll" }; -PNAME(mout_gpll_p) = { "fin_pll", "fout_gpll" }; -PNAME(mout_mpll_user_p) = { "fin_pll", "mout_mpll" }; -PNAME(mout_bpll_user_p) = { "fin_pll", "mout_bpll" }; -PNAME(mout_aclk166_p) = { "mout_cpll", "mout_mpll_user" }; -PNAME(mout_aclk200_p) = { "mout_mpll_user", "mout_bpll_user" }; -PNAME(mout_aclk300_p) = { "mout_aclk300_disp1_mid", - "mout_aclk300_disp1_mid1" }; -PNAME(mout_aclk400_p) = { "mout_aclk400_g3d_mid", "mout_gpll" }; -PNAME(mout_aclk200_sub_p) = { "fin_pll", "div_aclk200" }; -PNAME(mout_aclk266_sub_p) = { "fin_pll", "div_aclk266" }; -PNAME(mout_aclk300_sub_p) = { "fin_pll", "div_aclk300_disp" }; -PNAME(mout_aclk300_disp1_mid1_p) = { "mout_vpll", "mout_cpll" }; -PNAME(mout_aclk333_sub_p) = { "fin_pll", "div_aclk333" }; -PNAME(mout_aclk400_isp_sub_p) = { "fin_pll", "div_aclk400_isp" }; -PNAME(mout_hdmi_p) = { "div_hdmi_pixel", "sclk_hdmiphy" }; -PNAME(mout_usb3_p) = { "mout_mpll_user", "mout_cpll" }; -PNAME(mout_group1_p) = { "fin_pll", "fin_pll", "sclk_hdmi27m", - "sclk_dptxphy", "sclk_uhostphy", "sclk_hdmiphy", - "mout_mpll_user", "mout_epll", "mout_vpll", - "mout_cpll", "none", "none", - "none", "none", "none", - "none" }; -PNAME(mout_audio0_p) = { "cdclk0", "fin_pll", "sclk_hdmi27m", "sclk_dptxphy", - "sclk_uhostphy", "fin_pll", - "mout_mpll_user", "mout_epll", "mout_vpll", - "mout_cpll", "none", "none", - "none", "none", "none", - "none" }; -PNAME(mout_audio1_p) = { "cdclk1", "fin_pll", "sclk_hdmi27m", "sclk_dptxphy", - "sclk_uhostphy", "fin_pll", - "mout_mpll_user", "mout_epll", "mout_vpll", - "mout_cpll", "none", "none", - "none", "none", "none", - "none" }; -PNAME(mout_audio2_p) = { "cdclk2", "fin_pll", "sclk_hdmi27m", "sclk_dptxphy", - "sclk_uhostphy", "fin_pll", - "mout_mpll_user", "mout_epll", "mout_vpll", - "mout_cpll", "none", "none", - "none", "none", "none", - "none" }; -PNAME(mout_spdif_p) = { "sclk_audio0", "sclk_audio1", "sclk_audio2", - "spdif_extclk" }; - -/* fixed rate clocks generated outside the soc */ -static struct samsung_fixed_rate_clock exynos5250_fixed_rate_ext_clks[] __initdata = { - FRATE(CLK_FIN_PLL, "fin_pll", NULL, 0, 0), -}; - -/* fixed rate clocks generated inside the soc */ -static const struct samsung_fixed_rate_clock exynos5250_fixed_rate_clks[] __initconst = { - FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", NULL, 0, 24000000), - FRATE(0, "sclk_hdmi27m", NULL, 0, 27000000), - FRATE(0, "sclk_dptxphy", NULL, 0, 24000000), - FRATE(0, "sclk_uhostphy", NULL, 0, 48000000), -}; - -static const struct samsung_fixed_factor_clock exynos5250_fixed_factor_clks[] __initconst = { - FFACTOR(0, "fout_mplldiv2", "fout_mpll", 1, 2, 0), - FFACTOR(0, "fout_bplldiv2", "fout_bpll", 1, 2, 0), -}; - -static const struct samsung_mux_clock exynos5250_pll_pmux_clks[] __initconst = { - MUX(0, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP2, 0, 1), -}; - -static const struct samsung_mux_clock exynos5250_mux_clks[] __initconst = { - /* - * NOTE: Following table is sorted by (clock domain, register address, - * bitfield shift) triplet in ascending order. When adding new entries, - * please make sure that the order is kept, to avoid merge conflicts - * and make further work with defined data easier. - */ - - /* - * CMU_CPU - */ - MUX_FA(0, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, - CLK_SET_RATE_PARENT, 0, "mout_apll"), - MUX_A(0, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1, "mout_cpu"), - - /* - * CMU_CORE - */ - MUX_A(0, "mout_mpll", mout_mpll_p, SRC_CORE1, 8, 1, "mout_mpll"), - - /* - * CMU_TOP - */ - MUX(0, "mout_aclk166", mout_aclk166_p, SRC_TOP0, 8, 1), - MUX(0, "mout_aclk200", mout_aclk200_p, SRC_TOP0, 12, 1), - MUX(0, "mout_aclk300_disp1_mid", mout_aclk200_p, SRC_TOP0, 14, 1), - MUX(0, "mout_aclk300", mout_aclk300_p, SRC_TOP0, 15, 1), - MUX(0, "mout_aclk333", mout_aclk166_p, SRC_TOP0, 16, 1), - MUX(0, "mout_aclk400_g3d_mid", mout_aclk200_p, SRC_TOP0, 20, 1), - - MUX(0, "mout_aclk300_disp1_mid1", mout_aclk300_disp1_mid1_p, SRC_TOP1, - 8, 1), - MUX(0, "mout_aclk400_isp", mout_aclk200_p, SRC_TOP1, 24, 1), - MUX(0, "mout_aclk400_g3d", mout_aclk400_p, SRC_TOP1, 28, 1), - - MUX(0, "mout_cpll", mout_cpll_p, SRC_TOP2, 8, 1), - MUX(0, "mout_epll", mout_epll_p, SRC_TOP2, 12, 1), - MUX(0, "mout_vpll", mout_vpll_p, SRC_TOP2, 16, 1), - MUX(0, "mout_mpll_user", mout_mpll_user_p, SRC_TOP2, 20, 1), - MUX(0, "mout_bpll_user", mout_bpll_user_p, SRC_TOP2, 24, 1), - MUX(CLK_MOUT_GPLL, "mout_gpll", mout_gpll_p, SRC_TOP2, 28, 1), - - MUX(CLK_MOUT_ACLK200_DISP1_SUB, "mout_aclk200_disp1_sub", - mout_aclk200_sub_p, SRC_TOP3, 4, 1), - MUX(CLK_MOUT_ACLK300_DISP1_SUB, "mout_aclk300_disp1_sub", - mout_aclk300_sub_p, SRC_TOP3, 6, 1), - MUX(0, "mout_aclk266_gscl_sub", mout_aclk266_sub_p, SRC_TOP3, 8, 1), - MUX(0, "mout_aclk_266_isp_sub", mout_aclk266_sub_p, SRC_TOP3, 16, 1), - MUX(0, "mout_aclk_400_isp_sub", mout_aclk400_isp_sub_p, - SRC_TOP3, 20, 1), - MUX(0, "mout_aclk333_sub", mout_aclk333_sub_p, SRC_TOP3, 24, 1), - - MUX(0, "mout_cam_bayer", mout_group1_p, SRC_GSCL, 12, 4), - MUX(0, "mout_cam0", mout_group1_p, SRC_GSCL, 16, 4), - MUX(0, "mout_cam1", mout_group1_p, SRC_GSCL, 20, 4), - MUX(0, "mout_gscl_wa", mout_group1_p, SRC_GSCL, 24, 4), - MUX(0, "mout_gscl_wb", mout_group1_p, SRC_GSCL, 28, 4), - - MUX(0, "mout_fimd1", mout_group1_p, SRC_DISP1_0, 0, 4), - MUX(0, "mout_mipi1", mout_group1_p, SRC_DISP1_0, 12, 4), - MUX(0, "mout_dp", mout_group1_p, SRC_DISP1_0, 16, 4), - MUX(CLK_MOUT_HDMI, "mout_hdmi", mout_hdmi_p, SRC_DISP1_0, 20, 1), - - MUX(0, "mout_audio0", mout_audio0_p, SRC_MAU, 0, 4), - - MUX(0, "mout_mmc0", mout_group1_p, SRC_FSYS, 0, 4), - MUX(0, "mout_mmc1", mout_group1_p, SRC_FSYS, 4, 4), - MUX(0, "mout_mmc2", mout_group1_p, SRC_FSYS, 8, 4), - MUX(0, "mout_mmc3", mout_group1_p, SRC_FSYS, 12, 4), - MUX(0, "mout_sata", mout_aclk200_p, SRC_FSYS, 24, 1), - MUX(0, "mout_usb3", mout_usb3_p, SRC_FSYS, 28, 1), - - MUX(0, "mout_jpeg", mout_group1_p, SRC_GEN, 0, 4), - - MUX(0, "mout_uart0", mout_group1_p, SRC_PERIC0, 0, 4), - MUX(0, "mout_uart1", mout_group1_p, SRC_PERIC0, 4, 4), - MUX(0, "mout_uart2", mout_group1_p, SRC_PERIC0, 8, 4), - MUX(0, "mout_uart3", mout_group1_p, SRC_PERIC0, 12, 4), - MUX(0, "mout_pwm", mout_group1_p, SRC_PERIC0, 24, 4), - - MUX(0, "mout_audio1", mout_audio1_p, SRC_PERIC1, 0, 4), - MUX(0, "mout_audio2", mout_audio2_p, SRC_PERIC1, 4, 4), - MUX(0, "mout_spdif", mout_spdif_p, SRC_PERIC1, 8, 2), - MUX(0, "mout_spi0", mout_group1_p, SRC_PERIC1, 16, 4), - MUX(0, "mout_spi1", mout_group1_p, SRC_PERIC1, 20, 4), - MUX(0, "mout_spi2", mout_group1_p, SRC_PERIC1, 24, 4), - - /* - * CMU_CDREX - */ - MUX(0, "mout_bpll", mout_bpll_p, SRC_CDREX, 0, 1), - - MUX(0, "mout_mpll_fout", mout_mpll_fout_p, PLL_DIV2_SEL, 4, 1), - MUX(0, "mout_bpll_fout", mout_bpll_fout_p, PLL_DIV2_SEL, 0, 1), -}; - -static const struct samsung_div_clock exynos5250_div_clks[] __initconst = { - /* - * NOTE: Following table is sorted by (clock domain, register address, - * bitfield shift) triplet in ascending order. When adding new entries, - * please make sure that the order is kept, to avoid merge conflicts - * and make further work with defined data easier. - */ - - /* - * CMU_CPU - */ - DIV(0, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), - DIV(0, "div_apll", "mout_apll", DIV_CPU0, 24, 3), - DIV_A(0, "div_arm2", "div_arm", DIV_CPU0, 28, 3, "armclk"), - - /* - * CMU_TOP - */ - DIV(0, "div_aclk66", "div_aclk66_pre", DIV_TOP0, 0, 3), - DIV(0, "div_aclk166", "mout_aclk166", DIV_TOP0, 8, 3), - DIV(0, "div_aclk200", "mout_aclk200", DIV_TOP0, 12, 3), - DIV(0, "div_aclk266", "mout_mpll_user", DIV_TOP0, 16, 3), - DIV(0, "div_aclk333", "mout_aclk333", DIV_TOP0, 20, 3), - DIV(0, "div_aclk400_g3d", "mout_aclk400_g3d", DIV_TOP0, - 24, 3), - DIV(0, "div_aclk300_disp", "mout_aclk300", DIV_TOP0, 28, 3), - - DIV(0, "div_aclk400_isp", "mout_aclk400_isp", DIV_TOP1, 20, 3), - DIV(0, "div_aclk66_pre", "mout_mpll_user", DIV_TOP1, 24, 3), - - DIV(0, "div_cam_bayer", "mout_cam_bayer", DIV_GSCL, 12, 4), - DIV(0, "div_cam0", "mout_cam0", DIV_GSCL, 16, 4), - DIV(0, "div_cam1", "mout_cam1", DIV_GSCL, 20, 4), - DIV(0, "div_gscl_wa", "mout_gscl_wa", DIV_GSCL, 24, 4), - DIV(0, "div_gscl_wb", "mout_gscl_wb", DIV_GSCL, 28, 4), - - DIV(0, "div_fimd1", "mout_fimd1", DIV_DISP1_0, 0, 4), - DIV(0, "div_mipi1", "mout_mipi1", DIV_DISP1_0, 16, 4), - DIV_F(0, "div_mipi1_pre", "div_mipi1", - DIV_DISP1_0, 20, 4, CLK_SET_RATE_PARENT, 0), - DIV(0, "div_dp", "mout_dp", DIV_DISP1_0, 24, 4), - DIV(CLK_SCLK_PIXEL, "div_hdmi_pixel", "mout_vpll", DIV_DISP1_0, 28, 4), - - DIV(0, "div_jpeg", "mout_jpeg", DIV_GEN, 4, 4), - - DIV(0, "div_audio0", "mout_audio0", DIV_MAU, 0, 4), - DIV(CLK_DIV_PCM0, "div_pcm0", "sclk_audio0", DIV_MAU, 4, 8), - - DIV(0, "div_sata", "mout_sata", DIV_FSYS0, 20, 4), - DIV(0, "div_usb3", "mout_usb3", DIV_FSYS0, 24, 4), - - DIV(0, "div_mmc0", "mout_mmc0", DIV_FSYS1, 0, 4), - DIV_F(0, "div_mmc_pre0", "div_mmc0", - DIV_FSYS1, 8, 8, CLK_SET_RATE_PARENT, 0), - DIV(0, "div_mmc1", "mout_mmc1", DIV_FSYS1, 16, 4), - DIV_F(0, "div_mmc_pre1", "div_mmc1", - DIV_FSYS1, 24, 8, CLK_SET_RATE_PARENT, 0), - - DIV(0, "div_mmc2", "mout_mmc2", DIV_FSYS2, 0, 4), - DIV_F(0, "div_mmc_pre2", "div_mmc2", - DIV_FSYS2, 8, 8, CLK_SET_RATE_PARENT, 0), - DIV(0, "div_mmc3", "mout_mmc3", DIV_FSYS2, 16, 4), - DIV_F(0, "div_mmc_pre3", "div_mmc3", - DIV_FSYS2, 24, 8, CLK_SET_RATE_PARENT, 0), - - DIV(0, "div_uart0", "mout_uart0", DIV_PERIC0, 0, 4), - DIV(0, "div_uart1", "mout_uart1", DIV_PERIC0, 4, 4), - DIV(0, "div_uart2", "mout_uart2", DIV_PERIC0, 8, 4), - DIV(0, "div_uart3", "mout_uart3", DIV_PERIC0, 12, 4), - - DIV(0, "div_spi0", "mout_spi0", DIV_PERIC1, 0, 4), - DIV_F(0, "div_spi_pre0", "div_spi0", - DIV_PERIC1, 8, 8, CLK_SET_RATE_PARENT, 0), - DIV(0, "div_spi1", "mout_spi1", DIV_PERIC1, 16, 4), - DIV_F(0, "div_spi_pre1", "div_spi1", - DIV_PERIC1, 24, 8, CLK_SET_RATE_PARENT, 0), - - DIV(0, "div_spi2", "mout_spi2", DIV_PERIC2, 0, 4), - DIV_F(0, "div_spi_pre2", "div_spi2", - DIV_PERIC2, 8, 8, CLK_SET_RATE_PARENT, 0), - - DIV(0, "div_pwm", "mout_pwm", DIV_PERIC3, 0, 4), - - DIV(0, "div_audio1", "mout_audio1", DIV_PERIC4, 0, 4), - DIV(0, "div_pcm1", "sclk_audio1", DIV_PERIC4, 4, 8), - DIV(0, "div_audio2", "mout_audio2", DIV_PERIC4, 16, 4), - DIV(0, "div_pcm2", "sclk_audio2", DIV_PERIC4, 20, 8), - - DIV(CLK_DIV_I2S1, "div_i2s1", "sclk_audio1", DIV_PERIC5, 0, 6), - DIV(CLK_DIV_I2S2, "div_i2s2", "sclk_audio2", DIV_PERIC5, 8, 6), -}; - -static const struct samsung_gate_clock exynos5250_gate_clks[] __initconst = { - /* - * NOTE: Following table is sorted by (clock domain, register address, - * bitfield shift) triplet in ascending order. When adding new entries, - * please make sure that the order is kept, to avoid merge conflicts - * and make further work with defined data easier. - */ - - /* - * CMU_ACP - */ - GATE(CLK_MDMA0, "mdma0", "div_aclk266", GATE_IP_ACP, 1, 0, 0), - GATE(CLK_SSS, "sss", "div_aclk266", GATE_IP_ACP, 2, 0, 0), - GATE(CLK_G2D, "g2d", "div_aclk200", GATE_IP_ACP, 3, 0, 0), - GATE(CLK_SMMU_MDMA0, "smmu_mdma0", "div_aclk266", GATE_IP_ACP, 5, 0, 0), - - /* - * CMU_TOP - */ - GATE(CLK_SCLK_CAM_BAYER, "sclk_cam_bayer", "div_cam_bayer", - SRC_MASK_GSCL, 12, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_CAM0, "sclk_cam0", "div_cam0", - SRC_MASK_GSCL, 16, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_CAM1, "sclk_cam1", "div_cam1", - SRC_MASK_GSCL, 20, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_GSCL_WA, "sclk_gscl_wa", "div_gscl_wa", - SRC_MASK_GSCL, 24, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_GSCL_WB, "sclk_gscl_wb", "div_gscl_wb", - SRC_MASK_GSCL, 28, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_FIMD1, "sclk_fimd1", "div_fimd1", - SRC_MASK_DISP1_0, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MIPI1, "sclk_mipi1", "div_mipi1", - SRC_MASK_DISP1_0, 12, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_DP, "sclk_dp", "div_dp", - SRC_MASK_DISP1_0, 16, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_HDMI, "sclk_hdmi", "mout_hdmi", - SRC_MASK_DISP1_0, 20, 0, 0), - - GATE(CLK_SCLK_AUDIO0, "sclk_audio0", "div_audio0", - SRC_MASK_MAU, 0, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_MMC0, "sclk_mmc0", "div_mmc_pre0", - SRC_MASK_FSYS, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC1, "sclk_mmc1", "div_mmc_pre1", - SRC_MASK_FSYS, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC2, "sclk_mmc2", "div_mmc_pre2", - SRC_MASK_FSYS, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC3, "sclk_mmc3", "div_mmc_pre3", - SRC_MASK_FSYS, 12, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SATA, "sclk_sata", "div_sata", - SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_USB3, "sclk_usb3", "div_usb3", - SRC_MASK_FSYS, 28, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_JPEG, "sclk_jpeg", "div_jpeg", - SRC_MASK_GEN, 0, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_UART0, "sclk_uart0", "div_uart0", - SRC_MASK_PERIC0, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART1, "sclk_uart1", "div_uart1", - SRC_MASK_PERIC0, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART2, "sclk_uart2", "div_uart2", - SRC_MASK_PERIC0, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART3, "sclk_uart3", "div_uart3", - SRC_MASK_PERIC0, 12, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PWM, "sclk_pwm", "div_pwm", - SRC_MASK_PERIC0, 24, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_AUDIO1, "sclk_audio1", "div_audio1", - SRC_MASK_PERIC1, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_AUDIO2, "sclk_audio2", "div_audio2", - SRC_MASK_PERIC1, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPDIF, "sclk_spdif", "mout_spdif", - SRC_MASK_PERIC1, 4, 0, 0), - GATE(CLK_SCLK_SPI0, "sclk_spi0", "div_spi_pre0", - SRC_MASK_PERIC1, 16, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI1, "sclk_spi1", "div_spi_pre1", - SRC_MASK_PERIC1, 20, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI2, "sclk_spi2", "div_spi_pre2", - SRC_MASK_PERIC1, 24, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_GSCL0, "gscl0", "mout_aclk266_gscl_sub", GATE_IP_GSCL, 0, 0, - 0), - GATE(CLK_GSCL1, "gscl1", "mout_aclk266_gscl_sub", GATE_IP_GSCL, 1, 0, - 0), - GATE(CLK_GSCL2, "gscl2", "mout_aclk266_gscl_sub", GATE_IP_GSCL, 2, 0, - 0), - GATE(CLK_GSCL3, "gscl3", "mout_aclk266_gscl_sub", GATE_IP_GSCL, 3, 0, - 0), - GATE(CLK_GSCL_WA, "gscl_wa", "div_gscl_wa", GATE_IP_GSCL, 5, 0, 0), - GATE(CLK_GSCL_WB, "gscl_wb", "div_gscl_wb", GATE_IP_GSCL, 6, 0, 0), - GATE(CLK_SMMU_GSCL0, "smmu_gscl0", "mout_aclk266_gscl_sub", - GATE_IP_GSCL, 7, 0, 0), - GATE(CLK_SMMU_GSCL1, "smmu_gscl1", "mout_aclk266_gscl_sub", - GATE_IP_GSCL, 8, 0, 0), - GATE(CLK_SMMU_GSCL2, "smmu_gscl2", "mout_aclk266_gscl_sub", - GATE_IP_GSCL, 9, 0, 0), - GATE(CLK_SMMU_GSCL3, "smmu_gscl3", "mout_aclk266_gscl_sub", - GATE_IP_GSCL, 10, 0, 0), - - GATE(CLK_FIMD1, "fimd1", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 0, 0, - 0), - GATE(CLK_MIE1, "mie1", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 1, 0, - 0), - GATE(CLK_DSIM0, "dsim0", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 3, 0, - 0), - GATE(CLK_DP, "dp", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 4, 0, 0), - GATE(CLK_MIXER, "mixer", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 5, 0, - 0), - GATE(CLK_HDMI, "hdmi", "mout_aclk200_disp1_sub", GATE_IP_DISP1, 6, 0, - 0), - - GATE(CLK_MFC, "mfc", "mout_aclk333_sub", GATE_IP_MFC, 0, 0, 0), - GATE(CLK_SMMU_MFCR, "smmu_mfcr", "mout_aclk333_sub", GATE_IP_MFC, 1, 0, - 0), - GATE(CLK_SMMU_MFCL, "smmu_mfcl", "mout_aclk333_sub", GATE_IP_MFC, 2, 0, - 0), - GATE(CLK_G3D, "g3d", "div_aclk400_g3d", GATE_IP_G3D, 0, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_ROTATOR, "rotator", "div_aclk266", GATE_IP_GEN, 1, 0, 0), - GATE(CLK_JPEG, "jpeg", "div_aclk166", GATE_IP_GEN, 2, 0, 0), - GATE(CLK_MDMA1, "mdma1", "div_aclk266", GATE_IP_GEN, 4, 0, 0), - GATE(CLK_SMMU_ROTATOR, "smmu_rotator", "div_aclk266", GATE_IP_GEN, 6, 0, - 0), - GATE(CLK_SMMU_JPEG, "smmu_jpeg", "div_aclk166", GATE_IP_GEN, 7, 0, 0), - GATE(CLK_SMMU_MDMA1, "smmu_mdma1", "div_aclk266", GATE_IP_GEN, 9, 0, 0), - - GATE(CLK_PDMA0, "pdma0", "div_aclk200", GATE_IP_FSYS, 1, 0, 0), - GATE(CLK_PDMA1, "pdma1", "div_aclk200", GATE_IP_FSYS, 2, 0, 0), - GATE(CLK_SATA, "sata", "div_aclk200", GATE_IP_FSYS, 6, 0, 0), - GATE(CLK_USBOTG, "usbotg", "div_aclk200", GATE_IP_FSYS, 7, 0, 0), - GATE(CLK_MIPI_HSI, "mipi_hsi", "div_aclk200", GATE_IP_FSYS, 8, 0, 0), - GATE(CLK_SDMMC0, "sdmmc0", "div_aclk200", GATE_IP_FSYS, 12, 0, 0), - GATE(CLK_SDMMC1, "sdmmc1", "div_aclk200", GATE_IP_FSYS, 13, 0, 0), - GATE(CLK_SDMMC2, "sdmmc2", "div_aclk200", GATE_IP_FSYS, 14, 0, 0), - GATE(CLK_SDMMC3, "sdmmc3", "div_aclk200", GATE_IP_FSYS, 15, 0, 0), - GATE(CLK_SROMC, "sromc", "div_aclk200", GATE_IP_FSYS, 17, 0, 0), - GATE(CLK_USB2, "usb2", "div_aclk200", GATE_IP_FSYS, 18, 0, 0), - GATE(CLK_USB3, "usb3", "div_aclk200", GATE_IP_FSYS, 19, 0, 0), - GATE(CLK_SATA_PHYCTRL, "sata_phyctrl", "div_aclk200", - GATE_IP_FSYS, 24, 0, 0), - GATE(CLK_SATA_PHYI2C, "sata_phyi2c", "div_aclk200", GATE_IP_FSYS, 25, 0, - 0), - - GATE(CLK_UART0, "uart0", "div_aclk66", GATE_IP_PERIC, 0, 0, 0), - GATE(CLK_UART1, "uart1", "div_aclk66", GATE_IP_PERIC, 1, 0, 0), - GATE(CLK_UART2, "uart2", "div_aclk66", GATE_IP_PERIC, 2, 0, 0), - GATE(CLK_UART3, "uart3", "div_aclk66", GATE_IP_PERIC, 3, 0, 0), - GATE(CLK_UART4, "uart4", "div_aclk66", GATE_IP_PERIC, 4, 0, 0), - GATE(CLK_I2C0, "i2c0", "div_aclk66", GATE_IP_PERIC, 6, 0, 0), - GATE(CLK_I2C1, "i2c1", "div_aclk66", GATE_IP_PERIC, 7, 0, 0), - GATE(CLK_I2C2, "i2c2", "div_aclk66", GATE_IP_PERIC, 8, 0, 0), - GATE(CLK_I2C3, "i2c3", "div_aclk66", GATE_IP_PERIC, 9, 0, 0), - GATE(CLK_I2C4, "i2c4", "div_aclk66", GATE_IP_PERIC, 10, 0, 0), - GATE(CLK_I2C5, "i2c5", "div_aclk66", GATE_IP_PERIC, 11, 0, 0), - GATE(CLK_I2C6, "i2c6", "div_aclk66", GATE_IP_PERIC, 12, 0, 0), - GATE(CLK_I2C7, "i2c7", "div_aclk66", GATE_IP_PERIC, 13, 0, 0), - GATE(CLK_I2C_HDMI, "i2c_hdmi", "div_aclk66", GATE_IP_PERIC, 14, 0, 0), - GATE(CLK_ADC, "adc", "div_aclk66", GATE_IP_PERIC, 15, 0, 0), - GATE(CLK_SPI0, "spi0", "div_aclk66", GATE_IP_PERIC, 16, 0, 0), - GATE(CLK_SPI1, "spi1", "div_aclk66", GATE_IP_PERIC, 17, 0, 0), - GATE(CLK_SPI2, "spi2", "div_aclk66", GATE_IP_PERIC, 18, 0, 0), - GATE(CLK_I2S1, "i2s1", "div_aclk66", GATE_IP_PERIC, 20, 0, 0), - GATE(CLK_I2S2, "i2s2", "div_aclk66", GATE_IP_PERIC, 21, 0, 0), - GATE(CLK_PCM1, "pcm1", "div_aclk66", GATE_IP_PERIC, 22, 0, 0), - GATE(CLK_PCM2, "pcm2", "div_aclk66", GATE_IP_PERIC, 23, 0, 0), - GATE(CLK_PWM, "pwm", "div_aclk66", GATE_IP_PERIC, 24, 0, 0), - GATE(CLK_SPDIF, "spdif", "div_aclk66", GATE_IP_PERIC, 26, 0, 0), - GATE(CLK_AC97, "ac97", "div_aclk66", GATE_IP_PERIC, 27, 0, 0), - GATE(CLK_HSI2C0, "hsi2c0", "div_aclk66", GATE_IP_PERIC, 28, 0, 0), - GATE(CLK_HSI2C1, "hsi2c1", "div_aclk66", GATE_IP_PERIC, 29, 0, 0), - GATE(CLK_HSI2C2, "hsi2c2", "div_aclk66", GATE_IP_PERIC, 30, 0, 0), - GATE(CLK_HSI2C3, "hsi2c3", "div_aclk66", GATE_IP_PERIC, 31, 0, 0), - - GATE(CLK_CHIPID, "chipid", "div_aclk66", GATE_IP_PERIS, 0, 0, 0), - GATE(CLK_SYSREG, "sysreg", "div_aclk66", - GATE_IP_PERIS, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PMU, "pmu", "div_aclk66", GATE_IP_PERIS, 2, CLK_IGNORE_UNUSED, - 0), - GATE(CLK_CMU_TOP, "cmu_top", "div_aclk66", - GATE_IP_PERIS, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_CMU_CORE, "cmu_core", "div_aclk66", - GATE_IP_PERIS, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_CMU_MEM, "cmu_mem", "div_aclk66", - GATE_IP_PERIS, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC0, "tzpc0", "div_aclk66", GATE_IP_PERIS, 6, 0, 0), - GATE(CLK_TZPC1, "tzpc1", "div_aclk66", GATE_IP_PERIS, 7, 0, 0), - GATE(CLK_TZPC2, "tzpc2", "div_aclk66", GATE_IP_PERIS, 8, 0, 0), - GATE(CLK_TZPC3, "tzpc3", "div_aclk66", GATE_IP_PERIS, 9, 0, 0), - GATE(CLK_TZPC4, "tzpc4", "div_aclk66", GATE_IP_PERIS, 10, 0, 0), - GATE(CLK_TZPC5, "tzpc5", "div_aclk66", GATE_IP_PERIS, 11, 0, 0), - GATE(CLK_TZPC6, "tzpc6", "div_aclk66", GATE_IP_PERIS, 12, 0, 0), - GATE(CLK_TZPC7, "tzpc7", "div_aclk66", GATE_IP_PERIS, 13, 0, 0), - GATE(CLK_TZPC8, "tzpc8", "div_aclk66", GATE_IP_PERIS, 14, 0, 0), - GATE(CLK_TZPC9, "tzpc9", "div_aclk66", GATE_IP_PERIS, 15, 0, 0), - GATE(CLK_HDMI_CEC, "hdmi_cec", "div_aclk66", GATE_IP_PERIS, 16, 0, 0), - GATE(CLK_MCT, "mct", "div_aclk66", GATE_IP_PERIS, 18, 0, 0), - GATE(CLK_WDT, "wdt", "div_aclk66", GATE_IP_PERIS, 19, 0, 0), - GATE(CLK_RTC, "rtc", "div_aclk66", GATE_IP_PERIS, 20, 0, 0), - GATE(CLK_TMU, "tmu", "div_aclk66", GATE_IP_PERIS, 21, 0, 0), - GATE(CLK_SMMU_TV, "smmu_tv", "mout_aclk200_disp1_sub", - GATE_IP_DISP1, 9, 0, 0), - GATE(CLK_SMMU_FIMD1, "smmu_fimd1", "mout_aclk200_disp1_sub", - GATE_IP_DISP1, 8, 0, 0), - GATE(CLK_SMMU_2D, "smmu_2d", "div_aclk200", GATE_IP_ACP, 7, 0, 0), - GATE(CLK_SMMU_FIMC_ISP, "smmu_fimc_isp", "mout_aclk_266_isp_sub", - GATE_IP_ISP0, 8, 0, 0), - GATE(CLK_SMMU_FIMC_DRC, "smmu_fimc_drc", "mout_aclk_266_isp_sub", - GATE_IP_ISP0, 9, 0, 0), - GATE(CLK_SMMU_FIMC_FD, "smmu_fimc_fd", "mout_aclk_266_isp_sub", - GATE_IP_ISP0, 10, 0, 0), - GATE(CLK_SMMU_FIMC_SCC, "smmu_fimc_scc", "mout_aclk_266_isp_sub", - GATE_IP_ISP0, 11, 0, 0), - GATE(CLK_SMMU_FIMC_SCP, "smmu_fimc_scp", "mout_aclk_266_isp_sub", - GATE_IP_ISP0, 12, 0, 0), - GATE(CLK_SMMU_FIMC_MCU, "smmu_fimc_mcu", "mout_aclk_400_isp_sub", - GATE_IP_ISP0, 13, 0, 0), - GATE(CLK_SMMU_FIMC_ODC, "smmu_fimc_odc", "mout_aclk_266_isp_sub", - GATE_IP_ISP1, 4, 0, 0), - GATE(CLK_SMMU_FIMC_DIS0, "smmu_fimc_dis0", "mout_aclk_266_isp_sub", - GATE_IP_ISP1, 5, 0, 0), - GATE(CLK_SMMU_FIMC_DIS1, "smmu_fimc_dis1", "mout_aclk_266_isp_sub", - GATE_IP_ISP1, 6, 0, 0), - GATE(CLK_SMMU_FIMC_3DNR, "smmu_fimc_3dnr", "mout_aclk_266_isp_sub", - GATE_IP_ISP1, 7, 0, 0), -}; - -static const struct samsung_pll_rate_table vpll_24mhz_tbl[] __initconst = { - /* sorted in descending order */ - /* PLL_36XX_RATE(rate, m, p, s, k) */ - PLL_36XX_RATE(266000000, 266, 3, 3, 0), - /* Not in UM, but need for eDP on snow */ - PLL_36XX_RATE(70500000, 94, 2, 4, 0), - { }, -}; - -static const struct samsung_pll_rate_table epll_24mhz_tbl[] __initconst = { - /* sorted in descending order */ - /* PLL_36XX_RATE(rate, m, p, s, k) */ - PLL_36XX_RATE(192000000, 64, 2, 2, 0), - PLL_36XX_RATE(180633600, 90, 3, 2, 20762), - PLL_36XX_RATE(180000000, 90, 3, 2, 0), - PLL_36XX_RATE(73728000, 98, 2, 4, 19923), - PLL_36XX_RATE(67737600, 90, 2, 4, 20762), - PLL_36XX_RATE(49152000, 98, 3, 4, 19923), - PLL_36XX_RATE(45158400, 90, 3, 4, 20762), - PLL_36XX_RATE(32768000, 131, 3, 5, 4719), - { }, -}; - -static const struct samsung_pll_rate_table apll_24mhz_tbl[] __initconst = { - /* sorted in descending order */ - /* PLL_35XX_RATE(rate, m, p, s) */ - PLL_35XX_RATE(1700000000, 425, 6, 0), - PLL_35XX_RATE(1600000000, 200, 3, 0), - PLL_35XX_RATE(1500000000, 250, 4, 0), - PLL_35XX_RATE(1400000000, 175, 3, 0), - PLL_35XX_RATE(1300000000, 325, 6, 0), - PLL_35XX_RATE(1200000000, 200, 4, 0), - PLL_35XX_RATE(1100000000, 275, 6, 0), - PLL_35XX_RATE(1000000000, 125, 3, 0), - PLL_35XX_RATE(900000000, 150, 4, 0), - PLL_35XX_RATE(800000000, 100, 3, 0), - PLL_35XX_RATE(700000000, 175, 3, 1), - PLL_35XX_RATE(600000000, 200, 4, 1), - PLL_35XX_RATE(500000000, 125, 3, 1), - PLL_35XX_RATE(400000000, 100, 3, 1), - PLL_35XX_RATE(300000000, 200, 4, 2), - PLL_35XX_RATE(200000000, 100, 3, 2), -}; - -static struct samsung_pll_clock exynos5250_plls[nr_plls] __initdata = { - [apll] = PLL_A(pll_35xx, CLK_FOUT_APLL, "fout_apll", "fin_pll", - APLL_LOCK, APLL_CON0, "fout_apll", NULL), - [mpll] = PLL_A(pll_35xx, CLK_FOUT_MPLL, "fout_mpll", "fin_pll", - MPLL_LOCK, MPLL_CON0, "fout_mpll", NULL), - [bpll] = PLL(pll_35xx, CLK_FOUT_BPLL, "fout_bpll", "fin_pll", BPLL_LOCK, - BPLL_CON0, NULL), - [gpll] = PLL(pll_35xx, CLK_FOUT_GPLL, "fout_gpll", "fin_pll", GPLL_LOCK, - GPLL_CON0, NULL), - [cpll] = PLL(pll_35xx, CLK_FOUT_CPLL, "fout_cpll", "fin_pll", CPLL_LOCK, - CPLL_CON0, NULL), - [epll] = PLL(pll_36xx, CLK_FOUT_EPLL, "fout_epll", "fin_pll", EPLL_LOCK, - EPLL_CON0, NULL), - [vpll] = PLL(pll_36xx, CLK_FOUT_VPLL, "fout_vpll", "mout_vpllsrc", - VPLL_LOCK, VPLL_CON0, NULL), -}; - -#define E5250_CPU_DIV0(apll, pclk_dbg, atb, periph, acp, cpud) \ - ((((apll) << 24) | ((pclk_dbg) << 20) | ((atb) << 16) | \ - ((periph) << 12) | ((acp) << 8) | ((cpud) << 4))) -#define E5250_CPU_DIV1(hpm, copy) \ - (((hpm) << 4) | (copy)) - -static const struct exynos_cpuclk_cfg_data exynos5250_armclk_d[] __initconst = { - { 1700000, E5250_CPU_DIV0(5, 3, 7, 7, 7, 3), E5250_CPU_DIV1(2, 0), }, - { 1600000, E5250_CPU_DIV0(4, 1, 7, 7, 7, 3), E5250_CPU_DIV1(2, 0), }, - { 1500000, E5250_CPU_DIV0(4, 1, 7, 7, 7, 2), E5250_CPU_DIV1(2, 0), }, - { 1400000, E5250_CPU_DIV0(4, 1, 6, 7, 7, 2), E5250_CPU_DIV1(2, 0), }, - { 1300000, E5250_CPU_DIV0(3, 1, 6, 7, 7, 2), E5250_CPU_DIV1(2, 0), }, - { 1200000, E5250_CPU_DIV0(3, 1, 5, 7, 7, 2), E5250_CPU_DIV1(2, 0), }, - { 1100000, E5250_CPU_DIV0(3, 1, 5, 7, 7, 3), E5250_CPU_DIV1(2, 0), }, - { 1000000, E5250_CPU_DIV0(2, 1, 4, 7, 7, 1), E5250_CPU_DIV1(2, 0), }, - { 900000, E5250_CPU_DIV0(2, 1, 4, 7, 7, 1), E5250_CPU_DIV1(2, 0), }, - { 800000, E5250_CPU_DIV0(2, 1, 4, 7, 7, 1), E5250_CPU_DIV1(2, 0), }, - { 700000, E5250_CPU_DIV0(1, 1, 3, 7, 7, 1), E5250_CPU_DIV1(2, 0), }, - { 600000, E5250_CPU_DIV0(1, 1, 3, 7, 7, 1), E5250_CPU_DIV1(2, 0), }, - { 500000, E5250_CPU_DIV0(1, 1, 2, 7, 7, 1), E5250_CPU_DIV1(2, 0), }, - { 400000, E5250_CPU_DIV0(1, 1, 2, 7, 7, 1), E5250_CPU_DIV1(2, 0), }, - { 300000, E5250_CPU_DIV0(1, 1, 1, 7, 7, 1), E5250_CPU_DIV1(2, 0), }, - { 200000, E5250_CPU_DIV0(1, 1, 1, 7, 7, 1), E5250_CPU_DIV1(2, 0), }, - { 0 }, -}; - -static const struct of_device_id ext_clk_match[] __initconst = { - { .compatible = "samsung,clock-xxti", .data = (void *)0, }, - { }, -}; - -/* register exynox5250 clocks */ -static void __init exynos5250_clk_init(struct device_node *np) -{ - struct samsung_clk_provider *ctx; - unsigned int tmp; - - if (np) { - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - } else { - panic("%s: unable to determine soc\n", __func__); - } - - ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); - - samsung_clk_of_register_fixed_ext(ctx, exynos5250_fixed_rate_ext_clks, - ARRAY_SIZE(exynos5250_fixed_rate_ext_clks), - ext_clk_match); - samsung_clk_register_mux(ctx, exynos5250_pll_pmux_clks, - ARRAY_SIZE(exynos5250_pll_pmux_clks)); - - if (_get_rate("fin_pll") == 24 * MHZ) { - exynos5250_plls[epll].rate_table = epll_24mhz_tbl; - exynos5250_plls[apll].rate_table = apll_24mhz_tbl; - } - - if (_get_rate("mout_vpllsrc") == 24 * MHZ) - exynos5250_plls[vpll].rate_table = vpll_24mhz_tbl; - - samsung_clk_register_pll(ctx, exynos5250_plls, - ARRAY_SIZE(exynos5250_plls), - reg_base); - samsung_clk_register_fixed_rate(ctx, exynos5250_fixed_rate_clks, - ARRAY_SIZE(exynos5250_fixed_rate_clks)); - samsung_clk_register_fixed_factor(ctx, exynos5250_fixed_factor_clks, - ARRAY_SIZE(exynos5250_fixed_factor_clks)); - samsung_clk_register_mux(ctx, exynos5250_mux_clks, - ARRAY_SIZE(exynos5250_mux_clks)); - samsung_clk_register_div(ctx, exynos5250_div_clks, - ARRAY_SIZE(exynos5250_div_clks)); - samsung_clk_register_gate(ctx, exynos5250_gate_clks, - ARRAY_SIZE(exynos5250_gate_clks)); - exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk", - mout_cpu_p[0], mout_cpu_p[1], 0x200, - exynos5250_armclk_d, ARRAY_SIZE(exynos5250_armclk_d), - CLK_CPU_HAS_DIV1); - - /* - * Enable arm clock down (in idle) and set arm divider - * ratios in WFI/WFE state. - */ - tmp = (PWR_CTRL1_CORE2_DOWN_RATIO | PWR_CTRL1_CORE1_DOWN_RATIO | - PWR_CTRL1_DIV2_DOWN_EN | PWR_CTRL1_DIV1_DOWN_EN | - PWR_CTRL1_USE_CORE1_WFE | PWR_CTRL1_USE_CORE0_WFE | - PWR_CTRL1_USE_CORE1_WFI | PWR_CTRL1_USE_CORE0_WFI); - __raw_writel(tmp, reg_base + PWR_CTRL1); - - /* - * Enable arm clock up (on exiting idle). Set arm divider - * ratios when not in idle along with the standby duration - * ratios. - */ - tmp = (PWR_CTRL2_DIV2_UP_EN | PWR_CTRL2_DIV1_UP_EN | - PWR_CTRL2_DUR_STANDBY2_VAL | PWR_CTRL2_DUR_STANDBY1_VAL | - PWR_CTRL2_CORE2_UP_RATIO | PWR_CTRL2_CORE1_UP_RATIO); - __raw_writel(tmp, reg_base + PWR_CTRL2); - - exynos5250_clk_sleep_init(); - - samsung_clk_of_add_provider(np, ctx); - - pr_info("Exynos5250: clock setup completed, armclk=%ld\n", - _get_rate("div_arm2")); -} -CLK_OF_DECLARE(exynos5250_clk, "samsung,exynos5250-clock", exynos5250_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos5260.c b/drivers/clk/samsung/samsung/clk-exynos5260.c deleted file mode 100644 index fd1d9bfc151b..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos5260.c +++ /dev/null @@ -1,1843 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * Author: Rahul Sharma - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos5260 SoC. - */ - -#include -#include - -#include "clk-exynos5260.h" -#include "clk.h" -#include "clk-pll.h" - -#include - -/* - * Applicable for all 2550 Type PLLS for Exynos5260, listed below - * DISP_PLL, EGL_PLL, KFC_PLL, MEM_PLL, BUS_PLL, MEDIA_PLL, G3D_PLL. - */ -static const struct samsung_pll_rate_table pll2550_24mhz_tbl[] __initconst = { - PLL_35XX_RATE(1700000000, 425, 6, 0), - PLL_35XX_RATE(1600000000, 200, 3, 0), - PLL_35XX_RATE(1500000000, 250, 4, 0), - PLL_35XX_RATE(1400000000, 175, 3, 0), - PLL_35XX_RATE(1300000000, 325, 6, 0), - PLL_35XX_RATE(1200000000, 400, 4, 1), - PLL_35XX_RATE(1100000000, 275, 3, 1), - PLL_35XX_RATE(1000000000, 250, 3, 1), - PLL_35XX_RATE(933000000, 311, 4, 1), - PLL_35XX_RATE(900000000, 300, 4, 1), - PLL_35XX_RATE(800000000, 200, 3, 1), - PLL_35XX_RATE(733000000, 733, 12, 1), - PLL_35XX_RATE(700000000, 175, 3, 1), - PLL_35XX_RATE(667000000, 667, 12, 1), - PLL_35XX_RATE(633000000, 211, 4, 1), - PLL_35XX_RATE(620000000, 310, 3, 2), - PLL_35XX_RATE(600000000, 400, 4, 2), - PLL_35XX_RATE(543000000, 362, 4, 2), - PLL_35XX_RATE(533000000, 533, 6, 2), - PLL_35XX_RATE(500000000, 250, 3, 2), - PLL_35XX_RATE(450000000, 300, 4, 2), - PLL_35XX_RATE(400000000, 200, 3, 2), - PLL_35XX_RATE(350000000, 175, 3, 2), - PLL_35XX_RATE(300000000, 400, 4, 3), - PLL_35XX_RATE(266000000, 266, 3, 3), - PLL_35XX_RATE(200000000, 200, 3, 3), - PLL_35XX_RATE(160000000, 160, 3, 3), -}; - -/* - * Applicable for 2650 Type PLL for AUD_PLL. - */ -static const struct samsung_pll_rate_table pll2650_24mhz_tbl[] __initconst = { - PLL_36XX_RATE(1600000000, 200, 3, 0, 0), - PLL_36XX_RATE(1200000000, 100, 2, 0, 0), - PLL_36XX_RATE(1000000000, 250, 3, 1, 0), - PLL_36XX_RATE(800000000, 200, 3, 1, 0), - PLL_36XX_RATE(600000000, 100, 2, 1, 0), - PLL_36XX_RATE(532000000, 266, 3, 2, 0), - PLL_36XX_RATE(480000000, 160, 2, 2, 0), - PLL_36XX_RATE(432000000, 144, 2, 2, 0), - PLL_36XX_RATE(400000000, 200, 3, 2, 0), - PLL_36XX_RATE(394073130, 459, 7, 2, 49282), - PLL_36XX_RATE(333000000, 111, 2, 2, 0), - PLL_36XX_RATE(300000000, 100, 2, 2, 0), - PLL_36XX_RATE(266000000, 266, 3, 3, 0), - PLL_36XX_RATE(200000000, 200, 3, 3, 0), - PLL_36XX_RATE(166000000, 166, 3, 3, 0), - PLL_36XX_RATE(133000000, 266, 3, 4, 0), - PLL_36XX_RATE(100000000, 200, 3, 4, 0), - PLL_36XX_RATE(66000000, 176, 2, 5, 0), -}; - -/* CMU_AUD */ - -static const unsigned long aud_clk_regs[] __initconst = { - MUX_SEL_AUD, - DIV_AUD0, - DIV_AUD1, - EN_ACLK_AUD, - EN_PCLK_AUD, - EN_SCLK_AUD, - EN_IP_AUD, -}; - -PNAME(mout_aud_pll_user_p) = {"fin_pll", "fout_aud_pll"}; -PNAME(mout_sclk_aud_i2s_p) = {"mout_aud_pll_user", "ioclk_i2s_cdclk"}; -PNAME(mout_sclk_aud_pcm_p) = {"mout_aud_pll_user", "ioclk_pcm_extclk"}; - -static const struct samsung_mux_clock aud_mux_clks[] __initconst = { - MUX(AUD_MOUT_AUD_PLL_USER, "mout_aud_pll_user", mout_aud_pll_user_p, - MUX_SEL_AUD, 0, 1), - MUX(AUD_MOUT_SCLK_AUD_I2S, "mout_sclk_aud_i2s", mout_sclk_aud_i2s_p, - MUX_SEL_AUD, 4, 1), - MUX(AUD_MOUT_SCLK_AUD_PCM, "mout_sclk_aud_pcm", mout_sclk_aud_pcm_p, - MUX_SEL_AUD, 8, 1), -}; - -static const struct samsung_div_clock aud_div_clks[] __initconst = { - DIV(AUD_DOUT_ACLK_AUD_131, "dout_aclk_aud_131", "mout_aud_pll_user", - DIV_AUD0, 0, 4), - - DIV(AUD_DOUT_SCLK_AUD_I2S, "dout_sclk_aud_i2s", "mout_sclk_aud_i2s", - DIV_AUD1, 0, 4), - DIV(AUD_DOUT_SCLK_AUD_PCM, "dout_sclk_aud_pcm", "mout_sclk_aud_pcm", - DIV_AUD1, 4, 8), - DIV(AUD_DOUT_SCLK_AUD_UART, "dout_sclk_aud_uart", "mout_aud_pll_user", - DIV_AUD1, 12, 4), -}; - -static const struct samsung_gate_clock aud_gate_clks[] __initconst = { - GATE(AUD_SCLK_I2S, "sclk_aud_i2s", "dout_sclk_aud_i2s", - EN_SCLK_AUD, 0, CLK_SET_RATE_PARENT, 0), - GATE(AUD_SCLK_PCM, "sclk_aud_pcm", "dout_sclk_aud_pcm", - EN_SCLK_AUD, 1, CLK_SET_RATE_PARENT, 0), - GATE(AUD_SCLK_AUD_UART, "sclk_aud_uart", "dout_sclk_aud_uart", - EN_SCLK_AUD, 2, CLK_SET_RATE_PARENT, 0), - - GATE(AUD_CLK_SRAMC, "clk_sramc", "dout_aclk_aud_131", EN_IP_AUD, - 0, 0, 0), - GATE(AUD_CLK_DMAC, "clk_dmac", "dout_aclk_aud_131", - EN_IP_AUD, 1, 0, 0), - GATE(AUD_CLK_I2S, "clk_i2s", "dout_aclk_aud_131", EN_IP_AUD, 2, 0, 0), - GATE(AUD_CLK_PCM, "clk_pcm", "dout_aclk_aud_131", EN_IP_AUD, 3, 0, 0), - GATE(AUD_CLK_AUD_UART, "clk_aud_uart", "dout_aclk_aud_131", - EN_IP_AUD, 4, 0, 0), -}; - -static const struct samsung_cmu_info aud_cmu __initconst = { - .mux_clks = aud_mux_clks, - .nr_mux_clks = ARRAY_SIZE(aud_mux_clks), - .div_clks = aud_div_clks, - .nr_div_clks = ARRAY_SIZE(aud_div_clks), - .gate_clks = aud_gate_clks, - .nr_gate_clks = ARRAY_SIZE(aud_gate_clks), - .nr_clk_ids = AUD_NR_CLK, - .clk_regs = aud_clk_regs, - .nr_clk_regs = ARRAY_SIZE(aud_clk_regs), -}; - -static void __init exynos5260_clk_aud_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &aud_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_aud, "samsung,exynos5260-clock-aud", - exynos5260_clk_aud_init); - - -/* CMU_DISP */ - -static const unsigned long disp_clk_regs[] __initconst = { - MUX_SEL_DISP0, - MUX_SEL_DISP1, - MUX_SEL_DISP2, - MUX_SEL_DISP3, - MUX_SEL_DISP4, - DIV_DISP, - EN_ACLK_DISP, - EN_PCLK_DISP, - EN_SCLK_DISP0, - EN_SCLK_DISP1, - EN_IP_DISP, - EN_IP_DISP_BUS, -}; - -PNAME(mout_phyclk_dptx_phy_ch3_txd_clk_user_p) = {"fin_pll", - "phyclk_dptx_phy_ch3_txd_clk"}; -PNAME(mout_phyclk_dptx_phy_ch2_txd_clk_user_p) = {"fin_pll", - "phyclk_dptx_phy_ch2_txd_clk"}; -PNAME(mout_phyclk_dptx_phy_ch1_txd_clk_user_p) = {"fin_pll", - "phyclk_dptx_phy_ch1_txd_clk"}; -PNAME(mout_phyclk_dptx_phy_ch0_txd_clk_user_p) = {"fin_pll", - "phyclk_dptx_phy_ch0_txd_clk"}; -PNAME(mout_aclk_disp_222_user_p) = {"fin_pll", "dout_aclk_disp_222"}; -PNAME(mout_sclk_disp_pixel_user_p) = {"fin_pll", "dout_sclk_disp_pixel"}; -PNAME(mout_aclk_disp_333_user_p) = {"fin_pll", "dout_aclk_disp_333"}; -PNAME(mout_phyclk_hdmi_phy_tmds_clko_user_p) = {"fin_pll", - "phyclk_hdmi_phy_tmds_clko"}; -PNAME(mout_phyclk_hdmi_phy_ref_clko_user_p) = {"fin_pll", - "phyclk_hdmi_phy_ref_clko"}; -PNAME(mout_phyclk_hdmi_phy_pixel_clko_user_p) = {"fin_pll", - "phyclk_hdmi_phy_pixel_clko"}; -PNAME(mout_phyclk_hdmi_link_o_tmds_clkhi_user_p) = {"fin_pll", - "phyclk_hdmi_link_o_tmds_clkhi"}; -PNAME(mout_phyclk_mipi_dphy_4l_m_txbyte_clkhs_p) = {"fin_pll", - "phyclk_mipi_dphy_4l_m_txbyte_clkhs"}; -PNAME(mout_phyclk_dptx_phy_o_ref_clk_24m_user_p) = {"fin_pll", - "phyclk_dptx_phy_o_ref_clk_24m"}; -PNAME(mout_phyclk_dptx_phy_clk_div2_user_p) = {"fin_pll", - "phyclk_dptx_phy_clk_div2"}; -PNAME(mout_sclk_hdmi_pixel_p) = {"mout_sclk_disp_pixel_user", - "mout_aclk_disp_222_user"}; -PNAME(mout_phyclk_mipi_dphy_4lmrxclk_esc0_user_p) = {"fin_pll", - "phyclk_mipi_dphy_4l_m_rxclkesc0"}; -PNAME(mout_sclk_hdmi_spdif_p) = {"fin_pll", "ioclk_spdif_extclk", - "dout_aclk_peri_aud", "phyclk_hdmi_phy_ref_cko"}; - -static const struct samsung_mux_clock disp_mux_clks[] __initconst = { - MUX(DISP_MOUT_ACLK_DISP_333_USER, "mout_aclk_disp_333_user", - mout_aclk_disp_333_user_p, - MUX_SEL_DISP0, 0, 1), - MUX(DISP_MOUT_SCLK_DISP_PIXEL_USER, "mout_sclk_disp_pixel_user", - mout_sclk_disp_pixel_user_p, - MUX_SEL_DISP0, 4, 1), - MUX(DISP_MOUT_ACLK_DISP_222_USER, "mout_aclk_disp_222_user", - mout_aclk_disp_222_user_p, - MUX_SEL_DISP0, 8, 1), - MUX(DISP_MOUT_PHYCLK_DPTX_PHY_CH0_TXD_CLK_USER, - "mout_phyclk_dptx_phy_ch0_txd_clk_user", - mout_phyclk_dptx_phy_ch0_txd_clk_user_p, - MUX_SEL_DISP0, 16, 1), - MUX(DISP_MOUT_PHYCLK_DPTX_PHY_CH1_TXD_CLK_USER, - "mout_phyclk_dptx_phy_ch1_txd_clk_user", - mout_phyclk_dptx_phy_ch1_txd_clk_user_p, - MUX_SEL_DISP0, 20, 1), - MUX(DISP_MOUT_PHYCLK_DPTX_PHY_CH2_TXD_CLK_USER, - "mout_phyclk_dptx_phy_ch2_txd_clk_user", - mout_phyclk_dptx_phy_ch2_txd_clk_user_p, - MUX_SEL_DISP0, 24, 1), - MUX(DISP_MOUT_PHYCLK_DPTX_PHY_CH3_TXD_CLK_USER, - "mout_phyclk_dptx_phy_ch3_txd_clk_user", - mout_phyclk_dptx_phy_ch3_txd_clk_user_p, - MUX_SEL_DISP0, 28, 1), - - MUX(DISP_MOUT_PHYCLK_DPTX_PHY_CLK_DIV2_USER, - "mout_phyclk_dptx_phy_clk_div2_user", - mout_phyclk_dptx_phy_clk_div2_user_p, - MUX_SEL_DISP1, 0, 1), - MUX(DISP_MOUT_PHYCLK_DPTX_PHY_O_REF_CLK_24M_USER, - "mout_phyclk_dptx_phy_o_ref_clk_24m_user", - mout_phyclk_dptx_phy_o_ref_clk_24m_user_p, - MUX_SEL_DISP1, 4, 1), - MUX(DISP_MOUT_PHYCLK_MIPI_DPHY_4L_M_TXBYTE_CLKHS, - "mout_phyclk_mipi_dphy_4l_m_txbyte_clkhs", - mout_phyclk_mipi_dphy_4l_m_txbyte_clkhs_p, - MUX_SEL_DISP1, 8, 1), - MUX(DISP_MOUT_PHYCLK_HDMI_LINK_O_TMDS_CLKHI_USER, - "mout_phyclk_hdmi_link_o_tmds_clkhi_user", - mout_phyclk_hdmi_link_o_tmds_clkhi_user_p, - MUX_SEL_DISP1, 16, 1), - MUX(DISP_MOUT_HDMI_PHY_PIXEL, - "mout_phyclk_hdmi_phy_pixel_clko_user", - mout_phyclk_hdmi_phy_pixel_clko_user_p, - MUX_SEL_DISP1, 20, 1), - MUX(DISP_MOUT_PHYCLK_HDMI_PHY_REF_CLKO_USER, - "mout_phyclk_hdmi_phy_ref_clko_user", - mout_phyclk_hdmi_phy_ref_clko_user_p, - MUX_SEL_DISP1, 24, 1), - MUX(DISP_MOUT_PHYCLK_HDMI_PHY_TMDS_CLKO_USER, - "mout_phyclk_hdmi_phy_tmds_clko_user", - mout_phyclk_hdmi_phy_tmds_clko_user_p, - MUX_SEL_DISP1, 28, 1), - - MUX(DISP_MOUT_PHYCLK_MIPI_DPHY_4LMRXCLK_ESC0_USER, - "mout_phyclk_mipi_dphy_4lmrxclk_esc0_user", - mout_phyclk_mipi_dphy_4lmrxclk_esc0_user_p, - MUX_SEL_DISP2, 0, 1), - MUX(DISP_MOUT_SCLK_HDMI_PIXEL, "mout_sclk_hdmi_pixel", - mout_sclk_hdmi_pixel_p, - MUX_SEL_DISP2, 4, 1), - - MUX(DISP_MOUT_SCLK_HDMI_SPDIF, "mout_sclk_hdmi_spdif", - mout_sclk_hdmi_spdif_p, - MUX_SEL_DISP4, 4, 2), -}; - -static const struct samsung_div_clock disp_div_clks[] __initconst = { - DIV(DISP_DOUT_PCLK_DISP_111, "dout_pclk_disp_111", - "mout_aclk_disp_222_user", - DIV_DISP, 8, 4), - DIV(DISP_DOUT_SCLK_FIMD1_EXTCLKPLL, "dout_sclk_fimd1_extclkpll", - "mout_sclk_disp_pixel_user", - DIV_DISP, 12, 4), - DIV(DISP_DOUT_SCLK_HDMI_PHY_PIXEL_CLKI, - "dout_sclk_hdmi_phy_pixel_clki", - "mout_sclk_hdmi_pixel", - DIV_DISP, 16, 4), -}; - -static const struct samsung_gate_clock disp_gate_clks[] __initconst = { - GATE(DISP_MOUT_HDMI_PHY_PIXEL_USER, "sclk_hdmi_link_i_pixel", - "mout_phyclk_hdmi_phy_pixel_clko_user", - EN_SCLK_DISP0, 26, CLK_SET_RATE_PARENT, 0), - GATE(DISP_SCLK_PIXEL, "sclk_hdmi_phy_pixel_clki", - "dout_sclk_hdmi_phy_pixel_clki", - EN_SCLK_DISP0, 29, CLK_SET_RATE_PARENT, 0), - - GATE(DISP_CLK_DP, "clk_dptx_link", "mout_aclk_disp_222_user", - EN_IP_DISP, 4, 0, 0), - GATE(DISP_CLK_DPPHY, "clk_dptx_phy", "mout_aclk_disp_222_user", - EN_IP_DISP, 5, 0, 0), - GATE(DISP_CLK_DSIM1, "clk_dsim1", "mout_aclk_disp_222_user", - EN_IP_DISP, 6, 0, 0), - GATE(DISP_CLK_FIMD1, "clk_fimd1", "mout_aclk_disp_222_user", - EN_IP_DISP, 7, 0, 0), - GATE(DISP_CLK_HDMI, "clk_hdmi", "mout_aclk_disp_222_user", - EN_IP_DISP, 8, 0, 0), - GATE(DISP_CLK_HDMIPHY, "clk_hdmiphy", "mout_aclk_disp_222_user", - EN_IP_DISP, 9, 0, 0), - GATE(DISP_CLK_MIPIPHY, "clk_mipi_dphy", "mout_aclk_disp_222_user", - EN_IP_DISP, 10, 0, 0), - GATE(DISP_CLK_MIXER, "clk_mixer", "mout_aclk_disp_222_user", - EN_IP_DISP, 11, 0, 0), - GATE(DISP_CLK_PIXEL_DISP, "clk_pixel_disp", "mout_aclk_disp_222_user", - EN_IP_DISP, 12, CLK_IGNORE_UNUSED, 0), - GATE(DISP_CLK_PIXEL_MIXER, "clk_pixel_mixer", "mout_aclk_disp_222_user", - EN_IP_DISP, 13, CLK_IGNORE_UNUSED, 0), - GATE(DISP_CLK_SMMU_FIMD1M0, "clk_smmu3_fimd1m0", - "mout_aclk_disp_222_user", - EN_IP_DISP, 22, 0, 0), - GATE(DISP_CLK_SMMU_FIMD1M1, "clk_smmu3_fimd1m1", - "mout_aclk_disp_222_user", - EN_IP_DISP, 23, 0, 0), - GATE(DISP_CLK_SMMU_TV, "clk_smmu3_tv", "mout_aclk_disp_222_user", - EN_IP_DISP, 25, 0, 0), -}; - -static const struct samsung_cmu_info disp_cmu __initconst = { - .mux_clks = disp_mux_clks, - .nr_mux_clks = ARRAY_SIZE(disp_mux_clks), - .div_clks = disp_div_clks, - .nr_div_clks = ARRAY_SIZE(disp_div_clks), - .gate_clks = disp_gate_clks, - .nr_gate_clks = ARRAY_SIZE(disp_gate_clks), - .nr_clk_ids = DISP_NR_CLK, - .clk_regs = disp_clk_regs, - .nr_clk_regs = ARRAY_SIZE(disp_clk_regs), -}; - -static void __init exynos5260_clk_disp_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &disp_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_disp, "samsung,exynos5260-clock-disp", - exynos5260_clk_disp_init); - - -/* CMU_EGL */ - -static const unsigned long egl_clk_regs[] __initconst = { - EGL_PLL_LOCK, - EGL_PLL_CON0, - EGL_PLL_CON1, - EGL_PLL_FREQ_DET, - MUX_SEL_EGL, - MUX_ENABLE_EGL, - DIV_EGL, - DIV_EGL_PLL_FDET, - EN_ACLK_EGL, - EN_PCLK_EGL, - EN_SCLK_EGL, -}; - -PNAME(mout_egl_b_p) = {"mout_egl_pll", "dout_bus_pll"}; -PNAME(mout_egl_pll_p) = {"fin_pll", "fout_egl_pll"}; - -static const struct samsung_mux_clock egl_mux_clks[] __initconst = { - MUX(EGL_MOUT_EGL_PLL, "mout_egl_pll", mout_egl_pll_p, - MUX_SEL_EGL, 4, 1), - MUX(EGL_MOUT_EGL_B, "mout_egl_b", mout_egl_b_p, MUX_SEL_EGL, 16, 1), -}; - -static const struct samsung_div_clock egl_div_clks[] __initconst = { - DIV(EGL_DOUT_EGL1, "dout_egl1", "mout_egl_b", DIV_EGL, 0, 3), - DIV(EGL_DOUT_EGL2, "dout_egl2", "dout_egl1", DIV_EGL, 4, 3), - DIV(EGL_DOUT_ACLK_EGL, "dout_aclk_egl", "dout_egl2", DIV_EGL, 8, 3), - DIV(EGL_DOUT_PCLK_EGL, "dout_pclk_egl", "dout_egl_atclk", - DIV_EGL, 12, 3), - DIV(EGL_DOUT_EGL_ATCLK, "dout_egl_atclk", "dout_egl2", DIV_EGL, 16, 3), - DIV(EGL_DOUT_EGL_PCLK_DBG, "dout_egl_pclk_dbg", "dout_egl_atclk", - DIV_EGL, 20, 3), - DIV(EGL_DOUT_EGL_PLL, "dout_egl_pll", "mout_egl_b", DIV_EGL, 24, 3), -}; - -static const struct samsung_pll_clock egl_pll_clks[] __initconst = { - PLL(pll_2550xx, EGL_FOUT_EGL_PLL, "fout_egl_pll", "fin_pll", - EGL_PLL_LOCK, EGL_PLL_CON0, - pll2550_24mhz_tbl), -}; - -static const struct samsung_cmu_info egl_cmu __initconst = { - .pll_clks = egl_pll_clks, - .nr_pll_clks = ARRAY_SIZE(egl_pll_clks), - .mux_clks = egl_mux_clks, - .nr_mux_clks = ARRAY_SIZE(egl_mux_clks), - .div_clks = egl_div_clks, - .nr_div_clks = ARRAY_SIZE(egl_div_clks), - .nr_clk_ids = EGL_NR_CLK, - .clk_regs = egl_clk_regs, - .nr_clk_regs = ARRAY_SIZE(egl_clk_regs), -}; - -static void __init exynos5260_clk_egl_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &egl_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_egl, "samsung,exynos5260-clock-egl", - exynos5260_clk_egl_init); - - -/* CMU_FSYS */ - -static const unsigned long fsys_clk_regs[] __initconst = { - MUX_SEL_FSYS0, - MUX_SEL_FSYS1, - EN_ACLK_FSYS, - EN_ACLK_FSYS_SECURE_RTIC, - EN_ACLK_FSYS_SECURE_SMMU_RTIC, - EN_SCLK_FSYS, - EN_IP_FSYS, - EN_IP_FSYS_SECURE_RTIC, - EN_IP_FSYS_SECURE_SMMU_RTIC, -}; - -PNAME(mout_phyclk_usbhost20_phyclk_user_p) = {"fin_pll", - "phyclk_usbhost20_phy_phyclock"}; -PNAME(mout_phyclk_usbhost20_freeclk_user_p) = {"fin_pll", - "phyclk_usbhost20_phy_freeclk"}; -PNAME(mout_phyclk_usbhost20_clk48mohci_user_p) = {"fin_pll", - "phyclk_usbhost20_phy_clk48mohci"}; -PNAME(mout_phyclk_usbdrd30_pipe_pclk_user_p) = {"fin_pll", - "phyclk_usbdrd30_udrd30_pipe_pclk"}; -PNAME(mout_phyclk_usbdrd30_phyclock_user_p) = {"fin_pll", - "phyclk_usbdrd30_udrd30_phyclock"}; - -static const struct samsung_mux_clock fsys_mux_clks[] __initconst = { - MUX(FSYS_MOUT_PHYCLK_USBDRD30_PHYCLOCK_USER, - "mout_phyclk_usbdrd30_phyclock_user", - mout_phyclk_usbdrd30_phyclock_user_p, - MUX_SEL_FSYS1, 0, 1), - MUX(FSYS_MOUT_PHYCLK_USBDRD30_PIPE_PCLK_USER, - "mout_phyclk_usbdrd30_pipe_pclk_user", - mout_phyclk_usbdrd30_pipe_pclk_user_p, - MUX_SEL_FSYS1, 4, 1), - MUX(FSYS_MOUT_PHYCLK_USBHOST20_CLK48MOHCI_USER, - "mout_phyclk_usbhost20_clk48mohci_user", - mout_phyclk_usbhost20_clk48mohci_user_p, - MUX_SEL_FSYS1, 8, 1), - MUX(FSYS_MOUT_PHYCLK_USBHOST20_FREECLK_USER, - "mout_phyclk_usbhost20_freeclk_user", - mout_phyclk_usbhost20_freeclk_user_p, - MUX_SEL_FSYS1, 12, 1), - MUX(FSYS_MOUT_PHYCLK_USBHOST20_PHYCLK_USER, - "mout_phyclk_usbhost20_phyclk_user", - mout_phyclk_usbhost20_phyclk_user_p, - MUX_SEL_FSYS1, 16, 1), -}; - -static const struct samsung_gate_clock fsys_gate_clks[] __initconst = { - GATE(FSYS_PHYCLK_USBHOST20, "phyclk_usbhost20_phyclock", - "mout_phyclk_usbdrd30_phyclock_user", - EN_SCLK_FSYS, 1, 0, 0), - GATE(FSYS_PHYCLK_USBDRD30, "phyclk_usbdrd30_udrd30_phyclock_g", - "mout_phyclk_usbdrd30_phyclock_user", - EN_SCLK_FSYS, 7, 0, 0), - - GATE(FSYS_CLK_MMC0, "clk_mmc0", "dout_aclk_fsys_200", - EN_IP_FSYS, 6, 0, 0), - GATE(FSYS_CLK_MMC1, "clk_mmc1", "dout_aclk_fsys_200", - EN_IP_FSYS, 7, 0, 0), - GATE(FSYS_CLK_MMC2, "clk_mmc2", "dout_aclk_fsys_200", - EN_IP_FSYS, 8, 0, 0), - GATE(FSYS_CLK_PDMA, "clk_pdma", "dout_aclk_fsys_200", - EN_IP_FSYS, 9, 0, 0), - GATE(FSYS_CLK_SROMC, "clk_sromc", "dout_aclk_fsys_200", - EN_IP_FSYS, 13, 0, 0), - GATE(FSYS_CLK_USBDRD30, "clk_usbdrd30", "dout_aclk_fsys_200", - EN_IP_FSYS, 14, 0, 0), - GATE(FSYS_CLK_USBHOST20, "clk_usbhost20", "dout_aclk_fsys_200", - EN_IP_FSYS, 15, 0, 0), - GATE(FSYS_CLK_USBLINK, "clk_usblink", "dout_aclk_fsys_200", - EN_IP_FSYS, 18, 0, 0), - GATE(FSYS_CLK_TSI, "clk_tsi", "dout_aclk_fsys_200", - EN_IP_FSYS, 20, 0, 0), - - GATE(FSYS_CLK_RTIC, "clk_rtic", "dout_aclk_fsys_200", - EN_IP_FSYS_SECURE_RTIC, 11, 0, 0), - GATE(FSYS_CLK_SMMU_RTIC, "clk_smmu_rtic", "dout_aclk_fsys_200", - EN_IP_FSYS_SECURE_SMMU_RTIC, 12, 0, 0), -}; - -static const struct samsung_cmu_info fsys_cmu __initconst = { - .mux_clks = fsys_mux_clks, - .nr_mux_clks = ARRAY_SIZE(fsys_mux_clks), - .gate_clks = fsys_gate_clks, - .nr_gate_clks = ARRAY_SIZE(fsys_gate_clks), - .nr_clk_ids = FSYS_NR_CLK, - .clk_regs = fsys_clk_regs, - .nr_clk_regs = ARRAY_SIZE(fsys_clk_regs), -}; - -static void __init exynos5260_clk_fsys_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &fsys_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_fsys, "samsung,exynos5260-clock-fsys", - exynos5260_clk_fsys_init); - - -/* CMU_G2D */ - -static const unsigned long g2d_clk_regs[] __initconst = { - MUX_SEL_G2D, - MUX_STAT_G2D, - DIV_G2D, - EN_ACLK_G2D, - EN_ACLK_G2D_SECURE_SSS, - EN_ACLK_G2D_SECURE_SLIM_SSS, - EN_ACLK_G2D_SECURE_SMMU_SLIM_SSS, - EN_ACLK_G2D_SECURE_SMMU_SSS, - EN_ACLK_G2D_SECURE_SMMU_MDMA, - EN_ACLK_G2D_SECURE_SMMU_G2D, - EN_PCLK_G2D, - EN_PCLK_G2D_SECURE_SMMU_SLIM_SSS, - EN_PCLK_G2D_SECURE_SMMU_SSS, - EN_PCLK_G2D_SECURE_SMMU_MDMA, - EN_PCLK_G2D_SECURE_SMMU_G2D, - EN_IP_G2D, - EN_IP_G2D_SECURE_SSS, - EN_IP_G2D_SECURE_SLIM_SSS, - EN_IP_G2D_SECURE_SMMU_SLIM_SSS, - EN_IP_G2D_SECURE_SMMU_SSS, - EN_IP_G2D_SECURE_SMMU_MDMA, - EN_IP_G2D_SECURE_SMMU_G2D, -}; - -PNAME(mout_aclk_g2d_333_user_p) = {"fin_pll", "dout_aclk_g2d_333"}; - -static const struct samsung_mux_clock g2d_mux_clks[] __initconst = { - MUX(G2D_MOUT_ACLK_G2D_333_USER, "mout_aclk_g2d_333_user", - mout_aclk_g2d_333_user_p, - MUX_SEL_G2D, 0, 1), -}; - -static const struct samsung_div_clock g2d_div_clks[] __initconst = { - DIV(G2D_DOUT_PCLK_G2D_83, "dout_pclk_g2d_83", "mout_aclk_g2d_333_user", - DIV_G2D, 0, 3), -}; - -static const struct samsung_gate_clock g2d_gate_clks[] __initconst = { - GATE(G2D_CLK_G2D, "clk_g2d", "mout_aclk_g2d_333_user", - EN_IP_G2D, 4, 0, 0), - GATE(G2D_CLK_JPEG, "clk_jpeg", "mout_aclk_g2d_333_user", - EN_IP_G2D, 5, 0, 0), - GATE(G2D_CLK_MDMA, "clk_mdma", "mout_aclk_g2d_333_user", - EN_IP_G2D, 6, 0, 0), - GATE(G2D_CLK_SMMU3_JPEG, "clk_smmu3_jpeg", "mout_aclk_g2d_333_user", - EN_IP_G2D, 16, 0, 0), - - GATE(G2D_CLK_SSS, "clk_sss", "mout_aclk_g2d_333_user", - EN_IP_G2D_SECURE_SSS, 17, 0, 0), - - GATE(G2D_CLK_SLIM_SSS, "clk_slim_sss", "mout_aclk_g2d_333_user", - EN_IP_G2D_SECURE_SLIM_SSS, 11, 0, 0), - - GATE(G2D_CLK_SMMU_SLIM_SSS, "clk_smmu_slim_sss", - "mout_aclk_g2d_333_user", - EN_IP_G2D_SECURE_SMMU_SLIM_SSS, 13, 0, 0), - - GATE(G2D_CLK_SMMU_SSS, "clk_smmu_sss", "mout_aclk_g2d_333_user", - EN_IP_G2D_SECURE_SMMU_SSS, 14, 0, 0), - - GATE(G2D_CLK_SMMU_MDMA, "clk_smmu_mdma", "mout_aclk_g2d_333_user", - EN_IP_G2D_SECURE_SMMU_MDMA, 12, 0, 0), - - GATE(G2D_CLK_SMMU3_G2D, "clk_smmu3_g2d", "mout_aclk_g2d_333_user", - EN_IP_G2D_SECURE_SMMU_G2D, 15, 0, 0), -}; - -static const struct samsung_cmu_info g2d_cmu __initconst = { - .mux_clks = g2d_mux_clks, - .nr_mux_clks = ARRAY_SIZE(g2d_mux_clks), - .div_clks = g2d_div_clks, - .nr_div_clks = ARRAY_SIZE(g2d_div_clks), - .gate_clks = g2d_gate_clks, - .nr_gate_clks = ARRAY_SIZE(g2d_gate_clks), - .nr_clk_ids = G2D_NR_CLK, - .clk_regs = g2d_clk_regs, - .nr_clk_regs = ARRAY_SIZE(g2d_clk_regs), -}; - -static void __init exynos5260_clk_g2d_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &g2d_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_g2d, "samsung,exynos5260-clock-g2d", - exynos5260_clk_g2d_init); - - -/* CMU_G3D */ - -static const unsigned long g3d_clk_regs[] __initconst = { - G3D_PLL_LOCK, - G3D_PLL_CON0, - G3D_PLL_CON1, - G3D_PLL_FDET, - MUX_SEL_G3D, - DIV_G3D, - DIV_G3D_PLL_FDET, - EN_ACLK_G3D, - EN_PCLK_G3D, - EN_SCLK_G3D, - EN_IP_G3D, -}; - -PNAME(mout_g3d_pll_p) = {"fin_pll", "fout_g3d_pll"}; - -static const struct samsung_mux_clock g3d_mux_clks[] __initconst = { - MUX(G3D_MOUT_G3D_PLL, "mout_g3d_pll", mout_g3d_pll_p, - MUX_SEL_G3D, 0, 1), -}; - -static const struct samsung_div_clock g3d_div_clks[] __initconst = { - DIV(G3D_DOUT_PCLK_G3D, "dout_pclk_g3d", "dout_aclk_g3d", DIV_G3D, 0, 3), - DIV(G3D_DOUT_ACLK_G3D, "dout_aclk_g3d", "mout_g3d_pll", DIV_G3D, 4, 3), -}; - -static const struct samsung_gate_clock g3d_gate_clks[] __initconst = { - GATE(G3D_CLK_G3D, "clk_g3d", "dout_aclk_g3d", EN_IP_G3D, 2, 0, 0), - GATE(G3D_CLK_G3D_HPM, "clk_g3d_hpm", "dout_aclk_g3d", - EN_IP_G3D, 3, 0, 0), -}; - -static const struct samsung_pll_clock g3d_pll_clks[] __initconst = { - PLL(pll_2550, G3D_FOUT_G3D_PLL, "fout_g3d_pll", "fin_pll", - G3D_PLL_LOCK, G3D_PLL_CON0, - pll2550_24mhz_tbl), -}; - -static const struct samsung_cmu_info g3d_cmu __initconst = { - .pll_clks = g3d_pll_clks, - .nr_pll_clks = ARRAY_SIZE(g3d_pll_clks), - .mux_clks = g3d_mux_clks, - .nr_mux_clks = ARRAY_SIZE(g3d_mux_clks), - .div_clks = g3d_div_clks, - .nr_div_clks = ARRAY_SIZE(g3d_div_clks), - .gate_clks = g3d_gate_clks, - .nr_gate_clks = ARRAY_SIZE(g3d_gate_clks), - .nr_clk_ids = G3D_NR_CLK, - .clk_regs = g3d_clk_regs, - .nr_clk_regs = ARRAY_SIZE(g3d_clk_regs), -}; - -static void __init exynos5260_clk_g3d_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &g3d_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_g3d, "samsung,exynos5260-clock-g3d", - exynos5260_clk_g3d_init); - - -/* CMU_GSCL */ - -static const unsigned long gscl_clk_regs[] __initconst = { - MUX_SEL_GSCL, - DIV_GSCL, - EN_ACLK_GSCL, - EN_ACLK_GSCL_FIMC, - EN_ACLK_GSCL_SECURE_SMMU_GSCL0, - EN_ACLK_GSCL_SECURE_SMMU_GSCL1, - EN_ACLK_GSCL_SECURE_SMMU_MSCL0, - EN_ACLK_GSCL_SECURE_SMMU_MSCL1, - EN_PCLK_GSCL, - EN_PCLK_GSCL_FIMC, - EN_PCLK_GSCL_SECURE_SMMU_GSCL0, - EN_PCLK_GSCL_SECURE_SMMU_GSCL1, - EN_PCLK_GSCL_SECURE_SMMU_MSCL0, - EN_PCLK_GSCL_SECURE_SMMU_MSCL1, - EN_SCLK_GSCL, - EN_SCLK_GSCL_FIMC, - EN_IP_GSCL, - EN_IP_GSCL_FIMC, - EN_IP_GSCL_SECURE_SMMU_GSCL0, - EN_IP_GSCL_SECURE_SMMU_GSCL1, - EN_IP_GSCL_SECURE_SMMU_MSCL0, - EN_IP_GSCL_SECURE_SMMU_MSCL1, -}; - -PNAME(mout_aclk_gscl_333_user_p) = {"fin_pll", "dout_aclk_gscl_333"}; -PNAME(mout_aclk_m2m_400_user_p) = {"fin_pll", "dout_aclk_gscl_400"}; -PNAME(mout_aclk_gscl_fimc_user_p) = {"fin_pll", "dout_aclk_gscl_400"}; -PNAME(mout_aclk_csis_p) = {"dout_aclk_csis_200", "mout_aclk_gscl_fimc_user"}; - -static const struct samsung_mux_clock gscl_mux_clks[] __initconst = { - MUX(GSCL_MOUT_ACLK_GSCL_333_USER, "mout_aclk_gscl_333_user", - mout_aclk_gscl_333_user_p, - MUX_SEL_GSCL, 0, 1), - MUX(GSCL_MOUT_ACLK_M2M_400_USER, "mout_aclk_m2m_400_user", - mout_aclk_m2m_400_user_p, - MUX_SEL_GSCL, 4, 1), - MUX(GSCL_MOUT_ACLK_GSCL_FIMC_USER, "mout_aclk_gscl_fimc_user", - mout_aclk_gscl_fimc_user_p, - MUX_SEL_GSCL, 8, 1), - MUX(GSCL_MOUT_ACLK_CSIS, "mout_aclk_csis", mout_aclk_csis_p, - MUX_SEL_GSCL, 24, 1), -}; - -static const struct samsung_div_clock gscl_div_clks[] __initconst = { - DIV(GSCL_DOUT_PCLK_M2M_100, "dout_pclk_m2m_100", - "mout_aclk_m2m_400_user", - DIV_GSCL, 0, 3), - DIV(GSCL_DOUT_ACLK_CSIS_200, "dout_aclk_csis_200", - "mout_aclk_m2m_400_user", - DIV_GSCL, 4, 3), -}; - -static const struct samsung_gate_clock gscl_gate_clks[] __initconst = { - GATE(GSCL_SCLK_CSIS0_WRAP, "sclk_csis0_wrap", "dout_aclk_csis_200", - EN_SCLK_GSCL_FIMC, 0, CLK_SET_RATE_PARENT, 0), - GATE(GSCL_SCLK_CSIS1_WRAP, "sclk_csis1_wrap", "dout_aclk_csis_200", - EN_SCLK_GSCL_FIMC, 1, CLK_SET_RATE_PARENT, 0), - - GATE(GSCL_CLK_GSCL0, "clk_gscl0", "mout_aclk_gscl_333_user", - EN_IP_GSCL, 2, 0, 0), - GATE(GSCL_CLK_GSCL1, "clk_gscl1", "mout_aclk_gscl_333_user", - EN_IP_GSCL, 3, 0, 0), - GATE(GSCL_CLK_MSCL0, "clk_mscl0", "mout_aclk_gscl_333_user", - EN_IP_GSCL, 4, 0, 0), - GATE(GSCL_CLK_MSCL1, "clk_mscl1", "mout_aclk_gscl_333_user", - EN_IP_GSCL, 5, 0, 0), - GATE(GSCL_CLK_PIXEL_GSCL0, "clk_pixel_gscl0", - "mout_aclk_gscl_333_user", - EN_IP_GSCL, 8, 0, 0), - GATE(GSCL_CLK_PIXEL_GSCL1, "clk_pixel_gscl1", - "mout_aclk_gscl_333_user", - EN_IP_GSCL, 9, 0, 0), - - GATE(GSCL_CLK_SMMU3_LITE_A, "clk_smmu3_lite_a", - "mout_aclk_gscl_fimc_user", - EN_IP_GSCL_FIMC, 5, 0, 0), - GATE(GSCL_CLK_SMMU3_LITE_B, "clk_smmu3_lite_b", - "mout_aclk_gscl_fimc_user", - EN_IP_GSCL_FIMC, 6, 0, 0), - GATE(GSCL_CLK_SMMU3_LITE_D, "clk_smmu3_lite_d", - "mout_aclk_gscl_fimc_user", - EN_IP_GSCL_FIMC, 7, 0, 0), - GATE(GSCL_CLK_CSIS0, "clk_csis0", "mout_aclk_gscl_fimc_user", - EN_IP_GSCL_FIMC, 8, 0, 0), - GATE(GSCL_CLK_CSIS1, "clk_csis1", "mout_aclk_gscl_fimc_user", - EN_IP_GSCL_FIMC, 9, 0, 0), - GATE(GSCL_CLK_FIMC_LITE_A, "clk_fimc_lite_a", - "mout_aclk_gscl_fimc_user", - EN_IP_GSCL_FIMC, 10, 0, 0), - GATE(GSCL_CLK_FIMC_LITE_B, "clk_fimc_lite_b", - "mout_aclk_gscl_fimc_user", - EN_IP_GSCL_FIMC, 11, 0, 0), - GATE(GSCL_CLK_FIMC_LITE_D, "clk_fimc_lite_d", - "mout_aclk_gscl_fimc_user", - EN_IP_GSCL_FIMC, 12, 0, 0), - - GATE(GSCL_CLK_SMMU3_GSCL0, "clk_smmu3_gscl0", - "mout_aclk_gscl_333_user", - EN_IP_GSCL_SECURE_SMMU_GSCL0, 17, 0, 0), - GATE(GSCL_CLK_SMMU3_GSCL1, "clk_smmu3_gscl1", "mout_aclk_gscl_333_user", - EN_IP_GSCL_SECURE_SMMU_GSCL1, 18, 0, 0), - GATE(GSCL_CLK_SMMU3_MSCL0, "clk_smmu3_mscl0", - "mout_aclk_m2m_400_user", - EN_IP_GSCL_SECURE_SMMU_MSCL0, 19, 0, 0), - GATE(GSCL_CLK_SMMU3_MSCL1, "clk_smmu3_mscl1", - "mout_aclk_m2m_400_user", - EN_IP_GSCL_SECURE_SMMU_MSCL1, 20, 0, 0), -}; - -static const struct samsung_cmu_info gscl_cmu __initconst = { - .mux_clks = gscl_mux_clks, - .nr_mux_clks = ARRAY_SIZE(gscl_mux_clks), - .div_clks = gscl_div_clks, - .nr_div_clks = ARRAY_SIZE(gscl_div_clks), - .gate_clks = gscl_gate_clks, - .nr_gate_clks = ARRAY_SIZE(gscl_gate_clks), - .nr_clk_ids = GSCL_NR_CLK, - .clk_regs = gscl_clk_regs, - .nr_clk_regs = ARRAY_SIZE(gscl_clk_regs), -}; - -static void __init exynos5260_clk_gscl_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &gscl_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_gscl, "samsung,exynos5260-clock-gscl", - exynos5260_clk_gscl_init); - - -/* CMU_ISP */ - -static const unsigned long isp_clk_regs[] __initconst = { - MUX_SEL_ISP0, - MUX_SEL_ISP1, - DIV_ISP, - EN_ACLK_ISP0, - EN_ACLK_ISP1, - EN_PCLK_ISP0, - EN_PCLK_ISP1, - EN_SCLK_ISP, - EN_IP_ISP0, - EN_IP_ISP1, -}; - -PNAME(mout_isp_400_user_p) = {"fin_pll", "dout_aclk_isp1_400"}; -PNAME(mout_isp_266_user_p) = {"fin_pll", "dout_aclk_isp1_266"}; - -static const struct samsung_mux_clock isp_mux_clks[] __initconst = { - MUX(ISP_MOUT_ISP_266_USER, "mout_isp_266_user", mout_isp_266_user_p, - MUX_SEL_ISP0, 0, 1), - MUX(ISP_MOUT_ISP_400_USER, "mout_isp_400_user", mout_isp_400_user_p, - MUX_SEL_ISP0, 4, 1), -}; - -static const struct samsung_div_clock isp_div_clks[] __initconst = { - DIV(ISP_DOUT_PCLK_ISP_66, "dout_pclk_isp_66", "mout_kfc", - DIV_ISP, 0, 3), - DIV(ISP_DOUT_PCLK_ISP_133, "dout_pclk_isp_133", "mout_kfc", - DIV_ISP, 4, 4), - DIV(ISP_DOUT_CA5_ATCLKIN, "dout_ca5_atclkin", "mout_kfc", - DIV_ISP, 12, 3), - DIV(ISP_DOUT_CA5_PCLKDBG, "dout_ca5_pclkdbg", "mout_kfc", - DIV_ISP, 16, 4), - DIV(ISP_DOUT_SCLK_MPWM, "dout_sclk_mpwm", "mout_kfc", DIV_ISP, 20, 2), -}; - -static const struct samsung_gate_clock isp_gate_clks[] __initconst = { - GATE(ISP_CLK_GIC, "clk_isp_gic", "mout_aclk_isp1_266", - EN_IP_ISP0, 15, 0, 0), - - GATE(ISP_CLK_CA5, "clk_isp_ca5", "mout_aclk_isp1_266", - EN_IP_ISP1, 1, 0, 0), - GATE(ISP_CLK_FIMC_DRC, "clk_isp_fimc_drc", "mout_aclk_isp1_266", - EN_IP_ISP1, 2, 0, 0), - GATE(ISP_CLK_FIMC_FD, "clk_isp_fimc_fd", "mout_aclk_isp1_266", - EN_IP_ISP1, 3, 0, 0), - GATE(ISP_CLK_FIMC, "clk_isp_fimc", "mout_aclk_isp1_266", - EN_IP_ISP1, 4, 0, 0), - GATE(ISP_CLK_FIMC_SCALERC, "clk_isp_fimc_scalerc", - "mout_aclk_isp1_266", - EN_IP_ISP1, 5, 0, 0), - GATE(ISP_CLK_FIMC_SCALERP, "clk_isp_fimc_scalerp", - "mout_aclk_isp1_266", - EN_IP_ISP1, 6, 0, 0), - GATE(ISP_CLK_I2C0, "clk_isp_i2c0", "mout_aclk_isp1_266", - EN_IP_ISP1, 7, 0, 0), - GATE(ISP_CLK_I2C1, "clk_isp_i2c1", "mout_aclk_isp1_266", - EN_IP_ISP1, 8, 0, 0), - GATE(ISP_CLK_MCUCTL, "clk_isp_mcuctl", "mout_aclk_isp1_266", - EN_IP_ISP1, 9, 0, 0), - GATE(ISP_CLK_MPWM, "clk_isp_mpwm", "mout_aclk_isp1_266", - EN_IP_ISP1, 10, 0, 0), - GATE(ISP_CLK_MTCADC, "clk_isp_mtcadc", "mout_aclk_isp1_266", - EN_IP_ISP1, 11, 0, 0), - GATE(ISP_CLK_PWM, "clk_isp_pwm", "mout_aclk_isp1_266", - EN_IP_ISP1, 14, 0, 0), - GATE(ISP_CLK_SMMU_DRC, "clk_smmu_drc", "mout_aclk_isp1_266", - EN_IP_ISP1, 21, 0, 0), - GATE(ISP_CLK_SMMU_FD, "clk_smmu_fd", "mout_aclk_isp1_266", - EN_IP_ISP1, 22, 0, 0), - GATE(ISP_CLK_SMMU_ISP, "clk_smmu_isp", "mout_aclk_isp1_266", - EN_IP_ISP1, 23, 0, 0), - GATE(ISP_CLK_SMMU_ISPCX, "clk_smmu_ispcx", "mout_aclk_isp1_266", - EN_IP_ISP1, 24, 0, 0), - GATE(ISP_CLK_SMMU_SCALERC, "clk_isp_smmu_scalerc", - "mout_aclk_isp1_266", - EN_IP_ISP1, 25, 0, 0), - GATE(ISP_CLK_SMMU_SCALERP, "clk_isp_smmu_scalerp", - "mout_aclk_isp1_266", - EN_IP_ISP1, 26, 0, 0), - GATE(ISP_CLK_SPI0, "clk_isp_spi0", "mout_aclk_isp1_266", - EN_IP_ISP1, 27, 0, 0), - GATE(ISP_CLK_SPI1, "clk_isp_spi1", "mout_aclk_isp1_266", - EN_IP_ISP1, 28, 0, 0), - GATE(ISP_CLK_WDT, "clk_isp_wdt", "mout_aclk_isp1_266", - EN_IP_ISP1, 31, 0, 0), - GATE(ISP_CLK_UART, "clk_isp_uart", "mout_aclk_isp1_266", - EN_IP_ISP1, 30, 0, 0), - - GATE(ISP_SCLK_UART_EXT, "sclk_isp_uart_ext", "fin_pll", - EN_SCLK_ISP, 7, CLK_SET_RATE_PARENT, 0), - GATE(ISP_SCLK_SPI1_EXT, "sclk_isp_spi1_ext", "fin_pll", - EN_SCLK_ISP, 8, CLK_SET_RATE_PARENT, 0), - GATE(ISP_SCLK_SPI0_EXT, "sclk_isp_spi0_ext", "fin_pll", - EN_SCLK_ISP, 9, CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_cmu_info isp_cmu __initconst = { - .mux_clks = isp_mux_clks, - .nr_mux_clks = ARRAY_SIZE(isp_mux_clks), - .div_clks = isp_div_clks, - .nr_div_clks = ARRAY_SIZE(isp_div_clks), - .gate_clks = isp_gate_clks, - .nr_gate_clks = ARRAY_SIZE(isp_gate_clks), - .nr_clk_ids = ISP_NR_CLK, - .clk_regs = isp_clk_regs, - .nr_clk_regs = ARRAY_SIZE(isp_clk_regs), -}; - -static void __init exynos5260_clk_isp_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &isp_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_isp, "samsung,exynos5260-clock-isp", - exynos5260_clk_isp_init); - - -/* CMU_KFC */ - -static const unsigned long kfc_clk_regs[] __initconst = { - KFC_PLL_LOCK, - KFC_PLL_CON0, - KFC_PLL_CON1, - KFC_PLL_FDET, - MUX_SEL_KFC0, - MUX_SEL_KFC2, - DIV_KFC, - DIV_KFC_PLL_FDET, - EN_ACLK_KFC, - EN_PCLK_KFC, - EN_SCLK_KFC, - EN_IP_KFC, -}; - -PNAME(mout_kfc_pll_p) = {"fin_pll", "fout_kfc_pll"}; -PNAME(mout_kfc_p) = {"mout_kfc_pll", "dout_media_pll"}; - -static const struct samsung_mux_clock kfc_mux_clks[] __initconst = { - MUX(KFC_MOUT_KFC_PLL, "mout_kfc_pll", mout_kfc_pll_p, - MUX_SEL_KFC0, 0, 1), - MUX(KFC_MOUT_KFC, "mout_kfc", mout_kfc_p, MUX_SEL_KFC2, 0, 1), -}; - -static const struct samsung_div_clock kfc_div_clks[] __initconst = { - DIV(KFC_DOUT_KFC1, "dout_kfc1", "mout_kfc", DIV_KFC, 0, 3), - DIV(KFC_DOUT_KFC2, "dout_kfc2", "dout_kfc1", DIV_KFC, 4, 3), - DIV(KFC_DOUT_KFC_ATCLK, "dout_kfc_atclk", "dout_kfc2", DIV_KFC, 8, 3), - DIV(KFC_DOUT_KFC_PCLK_DBG, "dout_kfc_pclk_dbg", "dout_kfc2", - DIV_KFC, 12, 3), - DIV(KFC_DOUT_ACLK_KFC, "dout_aclk_kfc", "dout_kfc2", DIV_KFC, 16, 3), - DIV(KFC_DOUT_PCLK_KFC, "dout_pclk_kfc", "dout_kfc2", DIV_KFC, 20, 3), - DIV(KFC_DOUT_KFC_PLL, "dout_kfc_pll", "mout_kfc", DIV_KFC, 24, 3), -}; - -static const struct samsung_pll_clock kfc_pll_clks[] __initconst = { - PLL(pll_2550xx, KFC_FOUT_KFC_PLL, "fout_kfc_pll", "fin_pll", - KFC_PLL_LOCK, KFC_PLL_CON0, - pll2550_24mhz_tbl), -}; - -static const struct samsung_cmu_info kfc_cmu __initconst = { - .pll_clks = kfc_pll_clks, - .nr_pll_clks = ARRAY_SIZE(kfc_pll_clks), - .mux_clks = kfc_mux_clks, - .nr_mux_clks = ARRAY_SIZE(kfc_mux_clks), - .div_clks = kfc_div_clks, - .nr_div_clks = ARRAY_SIZE(kfc_div_clks), - .nr_clk_ids = KFC_NR_CLK, - .clk_regs = kfc_clk_regs, - .nr_clk_regs = ARRAY_SIZE(kfc_clk_regs), -}; - -static void __init exynos5260_clk_kfc_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &kfc_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_kfc, "samsung,exynos5260-clock-kfc", - exynos5260_clk_kfc_init); - - -/* CMU_MFC */ - -static const unsigned long mfc_clk_regs[] __initconst = { - MUX_SEL_MFC, - DIV_MFC, - EN_ACLK_MFC, - EN_ACLK_SECURE_SMMU2_MFC, - EN_PCLK_MFC, - EN_PCLK_SECURE_SMMU2_MFC, - EN_IP_MFC, - EN_IP_MFC_SECURE_SMMU2_MFC, -}; - -PNAME(mout_aclk_mfc_333_user_p) = {"fin_pll", "dout_aclk_mfc_333"}; - -static const struct samsung_mux_clock mfc_mux_clks[] __initconst = { - MUX(MFC_MOUT_ACLK_MFC_333_USER, "mout_aclk_mfc_333_user", - mout_aclk_mfc_333_user_p, - MUX_SEL_MFC, 0, 1), -}; - -static const struct samsung_div_clock mfc_div_clks[] __initconst = { - DIV(MFC_DOUT_PCLK_MFC_83, "dout_pclk_mfc_83", "mout_aclk_mfc_333_user", - DIV_MFC, 0, 3), -}; - -static const struct samsung_gate_clock mfc_gate_clks[] __initconst = { - GATE(MFC_CLK_MFC, "clk_mfc", "mout_aclk_mfc_333_user", - EN_IP_MFC, 1, 0, 0), - GATE(MFC_CLK_SMMU2_MFCM0, "clk_smmu2_mfcm0", "mout_aclk_mfc_333_user", - EN_IP_MFC_SECURE_SMMU2_MFC, 6, 0, 0), - GATE(MFC_CLK_SMMU2_MFCM1, "clk_smmu2_mfcm1", "mout_aclk_mfc_333_user", - EN_IP_MFC_SECURE_SMMU2_MFC, 7, 0, 0), -}; - -static const struct samsung_cmu_info mfc_cmu __initconst = { - .mux_clks = mfc_mux_clks, - .nr_mux_clks = ARRAY_SIZE(mfc_mux_clks), - .div_clks = mfc_div_clks, - .nr_div_clks = ARRAY_SIZE(mfc_div_clks), - .gate_clks = mfc_gate_clks, - .nr_gate_clks = ARRAY_SIZE(mfc_gate_clks), - .nr_clk_ids = MFC_NR_CLK, - .clk_regs = mfc_clk_regs, - .nr_clk_regs = ARRAY_SIZE(mfc_clk_regs), -}; - -static void __init exynos5260_clk_mfc_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &mfc_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_mfc, "samsung,exynos5260-clock-mfc", - exynos5260_clk_mfc_init); - - -/* CMU_MIF */ - -static const unsigned long mif_clk_regs[] __initconst = { - MEM_PLL_LOCK, - BUS_PLL_LOCK, - MEDIA_PLL_LOCK, - MEM_PLL_CON0, - MEM_PLL_CON1, - MEM_PLL_FDET, - BUS_PLL_CON0, - BUS_PLL_CON1, - BUS_PLL_FDET, - MEDIA_PLL_CON0, - MEDIA_PLL_CON1, - MEDIA_PLL_FDET, - MUX_SEL_MIF, - DIV_MIF, - DIV_MIF_PLL_FDET, - EN_ACLK_MIF, - EN_ACLK_MIF_SECURE_DREX1_TZ, - EN_ACLK_MIF_SECURE_DREX0_TZ, - EN_ACLK_MIF_SECURE_INTMEM, - EN_PCLK_MIF, - EN_PCLK_MIF_SECURE_MONOCNT, - EN_PCLK_MIF_SECURE_RTC_APBIF, - EN_PCLK_MIF_SECURE_DREX1_TZ, - EN_PCLK_MIF_SECURE_DREX0_TZ, - EN_SCLK_MIF, - EN_IP_MIF, - EN_IP_MIF_SECURE_MONOCNT, - EN_IP_MIF_SECURE_RTC_APBIF, - EN_IP_MIF_SECURE_DREX1_TZ, - EN_IP_MIF_SECURE_DREX0_TZ, - EN_IP_MIF_SECURE_INTEMEM, -}; - -PNAME(mout_mem_pll_p) = {"fin_pll", "fout_mem_pll"}; -PNAME(mout_bus_pll_p) = {"fin_pll", "fout_bus_pll"}; -PNAME(mout_media_pll_p) = {"fin_pll", "fout_media_pll"}; -PNAME(mout_mif_drex_p) = {"dout_mem_pll", "dout_bus_pll"}; -PNAME(mout_mif_drex2x_p) = {"dout_mem_pll", "dout_bus_pll"}; -PNAME(mout_clkm_phy_p) = {"mout_mif_drex", "dout_media_pll"}; -PNAME(mout_clk2x_phy_p) = {"mout_mif_drex2x", "dout_media_pll"}; - -static const struct samsung_mux_clock mif_mux_clks[] __initconst = { - MUX(MIF_MOUT_MEM_PLL, "mout_mem_pll", mout_mem_pll_p, - MUX_SEL_MIF, 0, 1), - MUX(MIF_MOUT_BUS_PLL, "mout_bus_pll", mout_bus_pll_p, - MUX_SEL_MIF, 4, 1), - MUX(MIF_MOUT_MEDIA_PLL, "mout_media_pll", mout_media_pll_p, - MUX_SEL_MIF, 8, 1), - MUX(MIF_MOUT_MIF_DREX, "mout_mif_drex", mout_mif_drex_p, - MUX_SEL_MIF, 12, 1), - MUX(MIF_MOUT_CLKM_PHY, "mout_clkm_phy", mout_clkm_phy_p, - MUX_SEL_MIF, 16, 1), - MUX(MIF_MOUT_MIF_DREX2X, "mout_mif_drex2x", mout_mif_drex2x_p, - MUX_SEL_MIF, 20, 1), - MUX(MIF_MOUT_CLK2X_PHY, "mout_clk2x_phy", mout_clk2x_phy_p, - MUX_SEL_MIF, 24, 1), -}; - -static const struct samsung_div_clock mif_div_clks[] __initconst = { - DIV(MIF_DOUT_MEDIA_PLL, "dout_media_pll", "mout_media_pll", - DIV_MIF, 0, 3), - DIV(MIF_DOUT_MEM_PLL, "dout_mem_pll", "mout_mem_pll", - DIV_MIF, 4, 3), - DIV(MIF_DOUT_BUS_PLL, "dout_bus_pll", "mout_bus_pll", - DIV_MIF, 8, 3), - DIV(MIF_DOUT_CLKM_PHY, "dout_clkm_phy", "mout_clkm_phy", - DIV_MIF, 12, 3), - DIV(MIF_DOUT_CLK2X_PHY, "dout_clk2x_phy", "mout_clk2x_phy", - DIV_MIF, 16, 4), - DIV(MIF_DOUT_ACLK_MIF_466, "dout_aclk_mif_466", "dout_clk2x_phy", - DIV_MIF, 20, 3), - DIV(MIF_DOUT_ACLK_BUS_200, "dout_aclk_bus_200", "dout_bus_pll", - DIV_MIF, 24, 3), - DIV(MIF_DOUT_ACLK_BUS_100, "dout_aclk_bus_100", "dout_bus_pll", - DIV_MIF, 28, 4), -}; - -static const struct samsung_gate_clock mif_gate_clks[] __initconst = { - GATE(MIF_CLK_LPDDR3PHY_WRAP0, "clk_lpddr3phy_wrap0", "dout_clk2x_phy", - EN_IP_MIF, 12, CLK_IGNORE_UNUSED, 0), - GATE(MIF_CLK_LPDDR3PHY_WRAP1, "clk_lpddr3phy_wrap1", "dout_clk2x_phy", - EN_IP_MIF, 13, CLK_IGNORE_UNUSED, 0), - - GATE(MIF_CLK_MONOCNT, "clk_monocnt", "dout_aclk_bus_100", - EN_IP_MIF_SECURE_MONOCNT, 22, - CLK_IGNORE_UNUSED, 0), - - GATE(MIF_CLK_MIF_RTC, "clk_mif_rtc", "dout_aclk_bus_100", - EN_IP_MIF_SECURE_RTC_APBIF, 23, - CLK_IGNORE_UNUSED, 0), - - GATE(MIF_CLK_DREX1, "clk_drex1", "dout_aclk_mif_466", - EN_IP_MIF_SECURE_DREX1_TZ, 9, - CLK_IGNORE_UNUSED, 0), - - GATE(MIF_CLK_DREX0, "clk_drex0", "dout_aclk_mif_466", - EN_IP_MIF_SECURE_DREX0_TZ, 9, - CLK_IGNORE_UNUSED, 0), - - GATE(MIF_CLK_INTMEM, "clk_intmem", "dout_aclk_bus_200", - EN_IP_MIF_SECURE_INTEMEM, 11, - CLK_IGNORE_UNUSED, 0), - - GATE(MIF_SCLK_LPDDR3PHY_WRAP_U0, "sclk_lpddr3phy_wrap_u0", - "dout_clkm_phy", EN_SCLK_MIF, 0, - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), - GATE(MIF_SCLK_LPDDR3PHY_WRAP_U1, "sclk_lpddr3phy_wrap_u1", - "dout_clkm_phy", EN_SCLK_MIF, 1, - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_pll_clock mif_pll_clks[] __initconst = { - PLL(pll_2550xx, MIF_FOUT_MEM_PLL, "fout_mem_pll", "fin_pll", - MEM_PLL_LOCK, MEM_PLL_CON0, - pll2550_24mhz_tbl), - PLL(pll_2550xx, MIF_FOUT_BUS_PLL, "fout_bus_pll", "fin_pll", - BUS_PLL_LOCK, BUS_PLL_CON0, - pll2550_24mhz_tbl), - PLL(pll_2550xx, MIF_FOUT_MEDIA_PLL, "fout_media_pll", "fin_pll", - MEDIA_PLL_LOCK, MEDIA_PLL_CON0, - pll2550_24mhz_tbl), -}; - -static const struct samsung_cmu_info mif_cmu __initconst = { - .pll_clks = mif_pll_clks, - .nr_pll_clks = ARRAY_SIZE(mif_pll_clks), - .mux_clks = mif_mux_clks, - .nr_mux_clks = ARRAY_SIZE(mif_mux_clks), - .div_clks = mif_div_clks, - .nr_div_clks = ARRAY_SIZE(mif_div_clks), - .gate_clks = mif_gate_clks, - .nr_gate_clks = ARRAY_SIZE(mif_gate_clks), - .nr_clk_ids = MIF_NR_CLK, - .clk_regs = mif_clk_regs, - .nr_clk_regs = ARRAY_SIZE(mif_clk_regs), -}; - -static void __init exynos5260_clk_mif_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &mif_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_mif, "samsung,exynos5260-clock-mif", - exynos5260_clk_mif_init); - - -/* CMU_PERI */ - -static const unsigned long peri_clk_regs[] __initconst = { - MUX_SEL_PERI, - MUX_SEL_PERI1, - DIV_PERI, - EN_PCLK_PERI0, - EN_PCLK_PERI1, - EN_PCLK_PERI2, - EN_PCLK_PERI3, - EN_PCLK_PERI_SECURE_CHIPID, - EN_PCLK_PERI_SECURE_PROVKEY0, - EN_PCLK_PERI_SECURE_PROVKEY1, - EN_PCLK_PERI_SECURE_SECKEY, - EN_PCLK_PERI_SECURE_ANTIRBKCNT, - EN_PCLK_PERI_SECURE_TOP_RTC, - EN_PCLK_PERI_SECURE_TZPC, - EN_SCLK_PERI, - EN_SCLK_PERI_SECURE_TOP_RTC, - EN_IP_PERI0, - EN_IP_PERI1, - EN_IP_PERI2, - EN_IP_PERI_SECURE_CHIPID, - EN_IP_PERI_SECURE_PROVKEY0, - EN_IP_PERI_SECURE_PROVKEY1, - EN_IP_PERI_SECURE_SECKEY, - EN_IP_PERI_SECURE_ANTIRBKCNT, - EN_IP_PERI_SECURE_TOP_RTC, - EN_IP_PERI_SECURE_TZPC, -}; - -PNAME(mout_sclk_pcm_p) = {"ioclk_pcm_extclk", "fin_pll", "dout_aclk_peri_aud", - "phyclk_hdmi_phy_ref_cko"}; -PNAME(mout_sclk_i2scod_p) = {"ioclk_i2s_cdclk", "fin_pll", "dout_aclk_peri_aud", - "phyclk_hdmi_phy_ref_cko"}; -PNAME(mout_sclk_spdif_p) = {"ioclk_spdif_extclk", "fin_pll", - "dout_aclk_peri_aud", "phyclk_hdmi_phy_ref_cko"}; - -static const struct samsung_mux_clock peri_mux_clks[] __initconst = { - MUX(PERI_MOUT_SCLK_PCM, "mout_sclk_pcm", mout_sclk_pcm_p, - MUX_SEL_PERI1, 4, 2), - MUX(PERI_MOUT_SCLK_I2SCOD, "mout_sclk_i2scod", mout_sclk_i2scod_p, - MUX_SEL_PERI1, 12, 2), - MUX(PERI_MOUT_SCLK_SPDIF, "mout_sclk_spdif", mout_sclk_spdif_p, - MUX_SEL_PERI1, 20, 2), -}; - -static const struct samsung_div_clock peri_div_clks[] __initconst = { - DIV(PERI_DOUT_PCM, "dout_pcm", "mout_sclk_pcm", DIV_PERI, 0, 8), - DIV(PERI_DOUT_I2S, "dout_i2s", "mout_sclk_i2scod", DIV_PERI, 8, 6), -}; - -static const struct samsung_gate_clock peri_gate_clks[] __initconst = { - GATE(PERI_SCLK_PCM1, "sclk_pcm1", "dout_pcm", EN_SCLK_PERI, 0, - CLK_SET_RATE_PARENT, 0), - GATE(PERI_SCLK_I2S, "sclk_i2s", "dout_i2s", EN_SCLK_PERI, 1, - CLK_SET_RATE_PARENT, 0), - GATE(PERI_SCLK_SPDIF, "sclk_spdif", "dout_sclk_peri_spi0_b", - EN_SCLK_PERI, 2, CLK_SET_RATE_PARENT, 0), - GATE(PERI_SCLK_SPI0, "sclk_spi0", "dout_sclk_peri_spi0_b", - EN_SCLK_PERI, 7, CLK_SET_RATE_PARENT, 0), - GATE(PERI_SCLK_SPI1, "sclk_spi1", "dout_sclk_peri_spi1_b", - EN_SCLK_PERI, 8, CLK_SET_RATE_PARENT, 0), - GATE(PERI_SCLK_SPI2, "sclk_spi2", "dout_sclk_peri_spi2_b", - EN_SCLK_PERI, 9, CLK_SET_RATE_PARENT, 0), - GATE(PERI_SCLK_UART0, "sclk_uart0", "dout_sclk_peri_uart0", - EN_SCLK_PERI, 10, CLK_SET_RATE_PARENT, 0), - GATE(PERI_SCLK_UART1, "sclk_uart1", "dout_sclk_peri_uart1", - EN_SCLK_PERI, 11, CLK_SET_RATE_PARENT, 0), - GATE(PERI_SCLK_UART2, "sclk_uart2", "dout_sclk_peri_uart2", - EN_SCLK_PERI, 12, CLK_SET_RATE_PARENT, 0), - - GATE(PERI_CLK_ABB, "clk_abb", "dout_aclk_peri_66", - EN_IP_PERI0, 1, 0, 0), - GATE(PERI_CLK_EFUSE_WRITER, "clk_efuse_writer", "dout_aclk_peri_66", - EN_IP_PERI0, 5, 0, 0), - GATE(PERI_CLK_HDMICEC, "clk_hdmicec", "dout_aclk_peri_66", - EN_IP_PERI0, 6, 0, 0), - GATE(PERI_CLK_I2C10, "clk_i2c10", "dout_aclk_peri_66", - EN_IP_PERI0, 7, 0, 0), - GATE(PERI_CLK_I2C11, "clk_i2c11", "dout_aclk_peri_66", - EN_IP_PERI0, 8, 0, 0), - GATE(PERI_CLK_I2C8, "clk_i2c8", "dout_aclk_peri_66", - EN_IP_PERI0, 9, 0, 0), - GATE(PERI_CLK_I2C9, "clk_i2c9", "dout_aclk_peri_66", - EN_IP_PERI0, 10, 0, 0), - GATE(PERI_CLK_I2C4, "clk_i2c4", "dout_aclk_peri_66", - EN_IP_PERI0, 11, 0, 0), - GATE(PERI_CLK_I2C5, "clk_i2c5", "dout_aclk_peri_66", - EN_IP_PERI0, 12, 0, 0), - GATE(PERI_CLK_I2C6, "clk_i2c6", "dout_aclk_peri_66", - EN_IP_PERI0, 13, 0, 0), - GATE(PERI_CLK_I2C7, "clk_i2c7", "dout_aclk_peri_66", - EN_IP_PERI0, 14, 0, 0), - GATE(PERI_CLK_I2CHDMI, "clk_i2chdmi", "dout_aclk_peri_66", - EN_IP_PERI0, 15, 0, 0), - GATE(PERI_CLK_I2S, "clk_peri_i2s", "dout_aclk_peri_66", - EN_IP_PERI0, 16, 0, 0), - GATE(PERI_CLK_MCT, "clk_mct", "dout_aclk_peri_66", - EN_IP_PERI0, 17, 0, 0), - GATE(PERI_CLK_PCM, "clk_peri_pcm", "dout_aclk_peri_66", - EN_IP_PERI0, 18, 0, 0), - GATE(PERI_CLK_HSIC0, "clk_hsic0", "dout_aclk_peri_66", - EN_IP_PERI0, 20, 0, 0), - GATE(PERI_CLK_HSIC1, "clk_hsic1", "dout_aclk_peri_66", - EN_IP_PERI0, 21, 0, 0), - GATE(PERI_CLK_HSIC2, "clk_hsic2", "dout_aclk_peri_66", - EN_IP_PERI0, 22, 0, 0), - GATE(PERI_CLK_HSIC3, "clk_hsic3", "dout_aclk_peri_66", - EN_IP_PERI0, 23, 0, 0), - GATE(PERI_CLK_WDT_EGL, "clk_wdt_egl", "dout_aclk_peri_66", - EN_IP_PERI0, 24, 0, 0), - GATE(PERI_CLK_WDT_KFC, "clk_wdt_kfc", "dout_aclk_peri_66", - EN_IP_PERI0, 25, 0, 0), - - GATE(PERI_CLK_UART4, "clk_uart4", "dout_aclk_peri_66", - EN_IP_PERI2, 0, 0, 0), - GATE(PERI_CLK_PWM, "clk_pwm", "dout_aclk_peri_66", - EN_IP_PERI2, 3, 0, 0), - GATE(PERI_CLK_SPDIF, "clk_spdif", "dout_aclk_peri_66", - EN_IP_PERI2, 6, 0, 0), - GATE(PERI_CLK_SPI0, "clk_spi0", "dout_aclk_peri_66", - EN_IP_PERI2, 7, 0, 0), - GATE(PERI_CLK_SPI1, "clk_spi1", "dout_aclk_peri_66", - EN_IP_PERI2, 8, 0, 0), - GATE(PERI_CLK_SPI2, "clk_spi2", "dout_aclk_peri_66", - EN_IP_PERI2, 9, 0, 0), - GATE(PERI_CLK_TMU0, "clk_tmu0", "dout_aclk_peri_66", - EN_IP_PERI2, 10, 0, 0), - GATE(PERI_CLK_TMU1, "clk_tmu1", "dout_aclk_peri_66", - EN_IP_PERI2, 11, 0, 0), - GATE(PERI_CLK_TMU2, "clk_tmu2", "dout_aclk_peri_66", - EN_IP_PERI2, 12, 0, 0), - GATE(PERI_CLK_TMU3, "clk_tmu3", "dout_aclk_peri_66", - EN_IP_PERI2, 13, 0, 0), - GATE(PERI_CLK_TMU4, "clk_tmu4", "dout_aclk_peri_66", - EN_IP_PERI2, 14, 0, 0), - GATE(PERI_CLK_ADC, "clk_adc", "dout_aclk_peri_66", - EN_IP_PERI2, 18, 0, 0), - GATE(PERI_CLK_UART0, "clk_uart0", "dout_aclk_peri_66", - EN_IP_PERI2, 19, 0, 0), - GATE(PERI_CLK_UART1, "clk_uart1", "dout_aclk_peri_66", - EN_IP_PERI2, 20, 0, 0), - GATE(PERI_CLK_UART2, "clk_uart2", "dout_aclk_peri_66", - EN_IP_PERI2, 21, 0, 0), - - GATE(PERI_CLK_CHIPID, "clk_chipid", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_CHIPID, 2, 0, 0), - - GATE(PERI_CLK_PROVKEY0, "clk_provkey0", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_PROVKEY0, 1, 0, 0), - - GATE(PERI_CLK_PROVKEY1, "clk_provkey1", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_PROVKEY1, 2, 0, 0), - - GATE(PERI_CLK_SECKEY, "clk_seckey", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_SECKEY, 5, 0, 0), - - GATE(PERI_CLK_TOP_RTC, "clk_top_rtc", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TOP_RTC, 5, 0, 0), - - GATE(PERI_CLK_TZPC0, "clk_tzpc0", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TZPC, 10, 0, 0), - GATE(PERI_CLK_TZPC1, "clk_tzpc1", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TZPC, 11, 0, 0), - GATE(PERI_CLK_TZPC2, "clk_tzpc2", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TZPC, 12, 0, 0), - GATE(PERI_CLK_TZPC3, "clk_tzpc3", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TZPC, 13, 0, 0), - GATE(PERI_CLK_TZPC4, "clk_tzpc4", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TZPC, 14, 0, 0), - GATE(PERI_CLK_TZPC5, "clk_tzpc5", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TZPC, 15, 0, 0), - GATE(PERI_CLK_TZPC6, "clk_tzpc6", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TZPC, 16, 0, 0), - GATE(PERI_CLK_TZPC7, "clk_tzpc7", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TZPC, 17, 0, 0), - GATE(PERI_CLK_TZPC8, "clk_tzpc8", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TZPC, 18, 0, 0), - GATE(PERI_CLK_TZPC9, "clk_tzpc9", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TZPC, 19, 0, 0), - GATE(PERI_CLK_TZPC10, "clk_tzpc10", "dout_aclk_peri_66", - EN_IP_PERI_SECURE_TZPC, 20, 0, 0), -}; - -static const struct samsung_cmu_info peri_cmu __initconst = { - .mux_clks = peri_mux_clks, - .nr_mux_clks = ARRAY_SIZE(peri_mux_clks), - .div_clks = peri_div_clks, - .nr_div_clks = ARRAY_SIZE(peri_div_clks), - .gate_clks = peri_gate_clks, - .nr_gate_clks = ARRAY_SIZE(peri_gate_clks), - .nr_clk_ids = PERI_NR_CLK, - .clk_regs = peri_clk_regs, - .nr_clk_regs = ARRAY_SIZE(peri_clk_regs), -}; - -static void __init exynos5260_clk_peri_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &peri_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_peri, "samsung,exynos5260-clock-peri", - exynos5260_clk_peri_init); - - -/* CMU_TOP */ - -static const unsigned long top_clk_regs[] __initconst = { - DISP_PLL_LOCK, - AUD_PLL_LOCK, - DISP_PLL_CON0, - DISP_PLL_CON1, - DISP_PLL_FDET, - AUD_PLL_CON0, - AUD_PLL_CON1, - AUD_PLL_CON2, - AUD_PLL_FDET, - MUX_SEL_TOP_PLL0, - MUX_SEL_TOP_MFC, - MUX_SEL_TOP_G2D, - MUX_SEL_TOP_GSCL, - MUX_SEL_TOP_ISP10, - MUX_SEL_TOP_ISP11, - MUX_SEL_TOP_DISP0, - MUX_SEL_TOP_DISP1, - MUX_SEL_TOP_BUS, - MUX_SEL_TOP_PERI0, - MUX_SEL_TOP_PERI1, - MUX_SEL_TOP_FSYS, - DIV_TOP_G2D_MFC, - DIV_TOP_GSCL_ISP0, - DIV_TOP_ISP10, - DIV_TOP_ISP11, - DIV_TOP_DISP, - DIV_TOP_BUS, - DIV_TOP_PERI0, - DIV_TOP_PERI1, - DIV_TOP_PERI2, - DIV_TOP_FSYS0, - DIV_TOP_FSYS1, - DIV_TOP_HPM, - DIV_TOP_PLL_FDET, - EN_ACLK_TOP, - EN_SCLK_TOP, - EN_IP_TOP, -}; - -/* fixed rate clocks generated inside the soc */ -static const struct samsung_fixed_rate_clock fixed_rate_clks[] __initconst = { - FRATE(PHYCLK_DPTX_PHY_CH3_TXD_CLK, "phyclk_dptx_phy_ch3_txd_clk", NULL, - 0, 270000000), - FRATE(PHYCLK_DPTX_PHY_CH2_TXD_CLK, "phyclk_dptx_phy_ch2_txd_clk", NULL, - 0, 270000000), - FRATE(PHYCLK_DPTX_PHY_CH1_TXD_CLK, "phyclk_dptx_phy_ch1_txd_clk", NULL, - 0, 270000000), - FRATE(PHYCLK_DPTX_PHY_CH0_TXD_CLK, "phyclk_dptx_phy_ch0_txd_clk", NULL, - 0, 270000000), - FRATE(phyclk_hdmi_phy_tmds_clko, "phyclk_hdmi_phy_tmds_clko", NULL, - 0, 250000000), - FRATE(PHYCLK_HDMI_PHY_PIXEL_CLKO, "phyclk_hdmi_phy_pixel_clko", NULL, - 0, 1660000000), - FRATE(PHYCLK_HDMI_LINK_O_TMDS_CLKHI, "phyclk_hdmi_link_o_tmds_clkhi", - NULL, 0, 125000000), - FRATE(PHYCLK_MIPI_DPHY_4L_M_TXBYTECLKHS, - "phyclk_mipi_dphy_4l_m_txbyte_clkhs" , NULL, - 0, 187500000), - FRATE(PHYCLK_DPTX_PHY_O_REF_CLK_24M, "phyclk_dptx_phy_o_ref_clk_24m", - NULL, 0, 24000000), - FRATE(PHYCLK_DPTX_PHY_CLK_DIV2, "phyclk_dptx_phy_clk_div2", NULL, - 0, 135000000), - FRATE(PHYCLK_MIPI_DPHY_4L_M_RXCLKESC0, - "phyclk_mipi_dphy_4l_m_rxclkesc0", NULL, 0, 20000000), - FRATE(PHYCLK_USBHOST20_PHY_PHYCLOCK, "phyclk_usbhost20_phy_phyclock", - NULL, 0, 60000000), - FRATE(PHYCLK_USBHOST20_PHY_FREECLK, "phyclk_usbhost20_phy_freeclk", - NULL, 0, 60000000), - FRATE(PHYCLK_USBHOST20_PHY_CLK48MOHCI, - "phyclk_usbhost20_phy_clk48mohci", NULL, 0, 48000000), - FRATE(PHYCLK_USBDRD30_UDRD30_PIPE_PCLK, - "phyclk_usbdrd30_udrd30_pipe_pclk", NULL, 0, 125000000), - FRATE(PHYCLK_USBDRD30_UDRD30_PHYCLOCK, - "phyclk_usbdrd30_udrd30_phyclock", NULL, 0, 60000000), -}; - -PNAME(mout_memtop_pll_user_p) = {"fin_pll", "dout_mem_pll"}; -PNAME(mout_bustop_pll_user_p) = {"fin_pll", "dout_bus_pll"}; -PNAME(mout_mediatop_pll_user_p) = {"fin_pll", "dout_media_pll"}; -PNAME(mout_audtop_pll_user_p) = {"fin_pll", "mout_aud_pll"}; -PNAME(mout_aud_pll_p) = {"fin_pll", "fout_aud_pll"}; -PNAME(mout_disp_pll_p) = {"fin_pll", "fout_disp_pll"}; -PNAME(mout_mfc_bustop_333_p) = {"mout_bustop_pll_user", "mout_disp_pll"}; -PNAME(mout_aclk_mfc_333_p) = {"mout_mediatop_pll_user", "mout_mfc_bustop_333"}; -PNAME(mout_g2d_bustop_333_p) = {"mout_bustop_pll_user", "mout_disp_pll"}; -PNAME(mout_aclk_g2d_333_p) = {"mout_mediatop_pll_user", "mout_g2d_bustop_333"}; -PNAME(mout_gscl_bustop_333_p) = {"mout_bustop_pll_user", "mout_disp_pll"}; -PNAME(mout_aclk_gscl_333_p) = {"mout_mediatop_pll_user", - "mout_gscl_bustop_333"}; -PNAME(mout_m2m_mediatop_400_p) = {"mout_mediatop_pll_user", "mout_disp_pll"}; -PNAME(mout_aclk_gscl_400_p) = {"mout_bustop_pll_user", - "mout_m2m_mediatop_400"}; -PNAME(mout_gscl_bustop_fimc_p) = {"mout_bustop_pll_user", "mout_disp_pll"}; -PNAME(mout_aclk_gscl_fimc_p) = {"mout_mediatop_pll_user", - "mout_gscl_bustop_fimc"}; -PNAME(mout_isp1_media_266_p) = {"mout_mediatop_pll_user", - "mout_memtop_pll_user"}; -PNAME(mout_aclk_isp1_266_p) = {"mout_bustop_pll_user", "mout_isp1_media_266"}; -PNAME(mout_isp1_media_400_p) = {"mout_mediatop_pll_user", "mout_disp_pll"}; -PNAME(mout_aclk_isp1_400_p) = {"mout_bustop_pll_user", "mout_isp1_media_400"}; -PNAME(mout_sclk_isp_spi_p) = {"fin_pll", "mout_bustop_pll_user"}; -PNAME(mout_sclk_isp_uart_p) = {"fin_pll", "mout_bustop_pll_user"}; -PNAME(mout_sclk_isp_sensor_p) = {"fin_pll", "mout_bustop_pll_user"}; -PNAME(mout_disp_disp_333_p) = {"mout_disp_pll", "mout_bustop_pll_user"}; -PNAME(mout_aclk_disp_333_p) = {"mout_mediatop_pll_user", "mout_disp_disp_333"}; -PNAME(mout_disp_disp_222_p) = {"mout_disp_pll", "mout_bustop_pll_user"}; -PNAME(mout_aclk_disp_222_p) = {"mout_mediatop_pll_user", "mout_disp_disp_222"}; -PNAME(mout_disp_media_pixel_p) = {"mout_mediatop_pll_user", - "mout_bustop_pll_user"}; -PNAME(mout_sclk_disp_pixel_p) = {"mout_disp_pll", "mout_disp_media_pixel"}; -PNAME(mout_bus_bustop_400_p) = {"mout_bustop_pll_user", "mout_memtop_pll_user"}; -PNAME(mout_bus_bustop_100_p) = {"mout_bustop_pll_user", "mout_memtop_pll_user"}; -PNAME(mout_sclk_peri_spi_clk_p) = {"fin_pll", "mout_bustop_pll_user"}; -PNAME(mout_sclk_peri_uart_uclk_p) = {"fin_pll", "mout_bustop_pll_user"}; -PNAME(mout_sclk_fsys_usb_p) = {"fin_pll", "mout_bustop_pll_user"}; -PNAME(mout_sclk_fsys_mmc_sdclkin_a_p) = {"fin_pll", "mout_bustop_pll_user"}; -PNAME(mout_sclk_fsys_mmc0_sdclkin_b_p) = {"mout_sclk_fsys_mmc0_sdclkin_a", - "mout_mediatop_pll_user"}; -PNAME(mout_sclk_fsys_mmc1_sdclkin_b_p) = {"mout_sclk_fsys_mmc1_sdclkin_a", - "mout_mediatop_pll_user"}; -PNAME(mout_sclk_fsys_mmc2_sdclkin_b_p) = {"mout_sclk_fsys_mmc2_sdclkin_a", - "mout_mediatop_pll_user"}; - -static const struct samsung_mux_clock top_mux_clks[] __initconst = { - MUX(TOP_MOUT_MEDIATOP_PLL_USER, "mout_mediatop_pll_user", - mout_mediatop_pll_user_p, - MUX_SEL_TOP_PLL0, 0, 1), - MUX(TOP_MOUT_MEMTOP_PLL_USER, "mout_memtop_pll_user", - mout_memtop_pll_user_p, - MUX_SEL_TOP_PLL0, 4, 1), - MUX(TOP_MOUT_BUSTOP_PLL_USER, "mout_bustop_pll_user", - mout_bustop_pll_user_p, - MUX_SEL_TOP_PLL0, 8, 1), - MUX(TOP_MOUT_DISP_PLL, "mout_disp_pll", mout_disp_pll_p, - MUX_SEL_TOP_PLL0, 12, 1), - MUX(TOP_MOUT_AUD_PLL, "mout_aud_pll", mout_aud_pll_p, - MUX_SEL_TOP_PLL0, 16, 1), - MUX(TOP_MOUT_AUDTOP_PLL_USER, "mout_audtop_pll_user", - mout_audtop_pll_user_p, - MUX_SEL_TOP_PLL0, 24, 1), - - MUX(TOP_MOUT_DISP_DISP_333, "mout_disp_disp_333", mout_disp_disp_333_p, - MUX_SEL_TOP_DISP0, 0, 1), - MUX(TOP_MOUT_ACLK_DISP_333, "mout_aclk_disp_333", mout_aclk_disp_333_p, - MUX_SEL_TOP_DISP0, 8, 1), - MUX(TOP_MOUT_DISP_DISP_222, "mout_disp_disp_222", mout_disp_disp_222_p, - MUX_SEL_TOP_DISP0, 12, 1), - MUX(TOP_MOUT_ACLK_DISP_222, "mout_aclk_disp_222", mout_aclk_disp_222_p, - MUX_SEL_TOP_DISP0, 20, 1), - - MUX(TOP_MOUT_FIMD1, "mout_sclk_disp_pixel", mout_sclk_disp_pixel_p, - MUX_SEL_TOP_DISP1, 0, 1), - MUX(TOP_MOUT_DISP_MEDIA_PIXEL, "mout_disp_media_pixel", - mout_disp_media_pixel_p, - MUX_SEL_TOP_DISP1, 8, 1), - - MUX(TOP_MOUT_SCLK_PERI_SPI2_CLK, "mout_sclk_peri_spi2_clk", - mout_sclk_peri_spi_clk_p, - MUX_SEL_TOP_PERI1, 0, 1), - MUX(TOP_MOUT_SCLK_PERI_SPI1_CLK, "mout_sclk_peri_spi1_clk", - mout_sclk_peri_spi_clk_p, - MUX_SEL_TOP_PERI1, 4, 1), - MUX(TOP_MOUT_SCLK_PERI_SPI0_CLK, "mout_sclk_peri_spi0_clk", - mout_sclk_peri_spi_clk_p, - MUX_SEL_TOP_PERI1, 8, 1), - MUX(TOP_MOUT_SCLK_PERI_UART1_UCLK, "mout_sclk_peri_uart1_uclk", - mout_sclk_peri_uart_uclk_p, - MUX_SEL_TOP_PERI1, 12, 1), - MUX(TOP_MOUT_SCLK_PERI_UART2_UCLK, "mout_sclk_peri_uart2_uclk", - mout_sclk_peri_uart_uclk_p, - MUX_SEL_TOP_PERI1, 16, 1), - MUX(TOP_MOUT_SCLK_PERI_UART0_UCLK, "mout_sclk_peri_uart0_uclk", - mout_sclk_peri_uart_uclk_p, - MUX_SEL_TOP_PERI1, 20, 1), - - - MUX(TOP_MOUT_BUS1_BUSTOP_400, "mout_bus1_bustop_400", - mout_bus_bustop_400_p, - MUX_SEL_TOP_BUS, 0, 1), - MUX(TOP_MOUT_BUS1_BUSTOP_100, "mout_bus1_bustop_100", - mout_bus_bustop_100_p, - MUX_SEL_TOP_BUS, 4, 1), - MUX(TOP_MOUT_BUS2_BUSTOP_100, "mout_bus2_bustop_100", - mout_bus_bustop_100_p, - MUX_SEL_TOP_BUS, 8, 1), - MUX(TOP_MOUT_BUS2_BUSTOP_400, "mout_bus2_bustop_400", - mout_bus_bustop_400_p, - MUX_SEL_TOP_BUS, 12, 1), - MUX(TOP_MOUT_BUS3_BUSTOP_400, "mout_bus3_bustop_400", - mout_bus_bustop_400_p, - MUX_SEL_TOP_BUS, 16, 1), - MUX(TOP_MOUT_BUS3_BUSTOP_100, "mout_bus3_bustop_100", - mout_bus_bustop_100_p, - MUX_SEL_TOP_BUS, 20, 1), - MUX(TOP_MOUT_BUS4_BUSTOP_400, "mout_bus4_bustop_400", - mout_bus_bustop_400_p, - MUX_SEL_TOP_BUS, 24, 1), - MUX(TOP_MOUT_BUS4_BUSTOP_100, "mout_bus4_bustop_100", - mout_bus_bustop_100_p, - MUX_SEL_TOP_BUS, 28, 1), - - MUX(TOP_MOUT_SCLK_FSYS_USB, "mout_sclk_fsys_usb", - mout_sclk_fsys_usb_p, - MUX_SEL_TOP_FSYS, 0, 1), - MUX(TOP_MOUT_SCLK_FSYS_MMC2_SDCLKIN_A, "mout_sclk_fsys_mmc2_sdclkin_a", - mout_sclk_fsys_mmc_sdclkin_a_p, - MUX_SEL_TOP_FSYS, 4, 1), - MUX(TOP_MOUT_SCLK_FSYS_MMC2_SDCLKIN_B, "mout_sclk_fsys_mmc2_sdclkin_b", - mout_sclk_fsys_mmc2_sdclkin_b_p, - MUX_SEL_TOP_FSYS, 8, 1), - MUX(TOP_MOUT_SCLK_FSYS_MMC1_SDCLKIN_A, "mout_sclk_fsys_mmc1_sdclkin_a", - mout_sclk_fsys_mmc_sdclkin_a_p, - MUX_SEL_TOP_FSYS, 12, 1), - MUX(TOP_MOUT_SCLK_FSYS_MMC1_SDCLKIN_B, "mout_sclk_fsys_mmc1_sdclkin_b", - mout_sclk_fsys_mmc1_sdclkin_b_p, - MUX_SEL_TOP_FSYS, 16, 1), - MUX(TOP_MOUT_SCLK_FSYS_MMC0_SDCLKIN_A, "mout_sclk_fsys_mmc0_sdclkin_a", - mout_sclk_fsys_mmc_sdclkin_a_p, - MUX_SEL_TOP_FSYS, 20, 1), - MUX(TOP_MOUT_SCLK_FSYS_MMC0_SDCLKIN_B, "mout_sclk_fsys_mmc0_sdclkin_b", - mout_sclk_fsys_mmc0_sdclkin_b_p, - MUX_SEL_TOP_FSYS, 24, 1), - - MUX(TOP_MOUT_ISP1_MEDIA_400, "mout_isp1_media_400", - mout_isp1_media_400_p, - MUX_SEL_TOP_ISP10, 4, 1), - MUX(TOP_MOUT_ACLK_ISP1_400, "mout_aclk_isp1_400", mout_aclk_isp1_400_p, - MUX_SEL_TOP_ISP10, 8 , 1), - MUX(TOP_MOUT_ISP1_MEDIA_266, "mout_isp1_media_266", - mout_isp1_media_266_p, - MUX_SEL_TOP_ISP10, 16, 1), - MUX(TOP_MOUT_ACLK_ISP1_266, "mout_aclk_isp1_266", mout_aclk_isp1_266_p, - MUX_SEL_TOP_ISP10, 20, 1), - - MUX(TOP_MOUT_SCLK_ISP1_SPI0, "mout_sclk_isp1_spi0", mout_sclk_isp_spi_p, - MUX_SEL_TOP_ISP11, 4, 1), - MUX(TOP_MOUT_SCLK_ISP1_SPI1, "mout_sclk_isp1_spi1", mout_sclk_isp_spi_p, - MUX_SEL_TOP_ISP11, 8, 1), - MUX(TOP_MOUT_SCLK_ISP1_UART, "mout_sclk_isp1_uart", - mout_sclk_isp_uart_p, - MUX_SEL_TOP_ISP11, 12, 1), - MUX(TOP_MOUT_SCLK_ISP1_SENSOR0, "mout_sclk_isp1_sensor0", - mout_sclk_isp_sensor_p, - MUX_SEL_TOP_ISP11, 16, 1), - MUX(TOP_MOUT_SCLK_ISP1_SENSOR1, "mout_sclk_isp1_sensor1", - mout_sclk_isp_sensor_p, - MUX_SEL_TOP_ISP11, 20, 1), - MUX(TOP_MOUT_SCLK_ISP1_SENSOR2, "mout_sclk_isp1_sensor2", - mout_sclk_isp_sensor_p, - MUX_SEL_TOP_ISP11, 24, 1), - - MUX(TOP_MOUT_MFC_BUSTOP_333, "mout_mfc_bustop_333", - mout_mfc_bustop_333_p, - MUX_SEL_TOP_MFC, 4, 1), - MUX(TOP_MOUT_ACLK_MFC_333, "mout_aclk_mfc_333", mout_aclk_mfc_333_p, - MUX_SEL_TOP_MFC, 8, 1), - - MUX(TOP_MOUT_G2D_BUSTOP_333, "mout_g2d_bustop_333", - mout_g2d_bustop_333_p, - MUX_SEL_TOP_G2D, 4, 1), - MUX(TOP_MOUT_ACLK_G2D_333, "mout_aclk_g2d_333", mout_aclk_g2d_333_p, - MUX_SEL_TOP_G2D, 8, 1), - - MUX(TOP_MOUT_M2M_MEDIATOP_400, "mout_m2m_mediatop_400", - mout_m2m_mediatop_400_p, - MUX_SEL_TOP_GSCL, 0, 1), - MUX(TOP_MOUT_ACLK_GSCL_400, "mout_aclk_gscl_400", - mout_aclk_gscl_400_p, - MUX_SEL_TOP_GSCL, 4, 1), - MUX(TOP_MOUT_GSCL_BUSTOP_333, "mout_gscl_bustop_333", - mout_gscl_bustop_333_p, - MUX_SEL_TOP_GSCL, 8, 1), - MUX(TOP_MOUT_ACLK_GSCL_333, "mout_aclk_gscl_333", - mout_aclk_gscl_333_p, - MUX_SEL_TOP_GSCL, 12, 1), - MUX(TOP_MOUT_GSCL_BUSTOP_FIMC, "mout_gscl_bustop_fimc", - mout_gscl_bustop_fimc_p, - MUX_SEL_TOP_GSCL, 16, 1), - MUX(TOP_MOUT_ACLK_GSCL_FIMC, "mout_aclk_gscl_fimc", - mout_aclk_gscl_fimc_p, - MUX_SEL_TOP_GSCL, 20, 1), -}; - -static const struct samsung_div_clock top_div_clks[] __initconst = { - DIV(TOP_DOUT_ACLK_G2D_333, "dout_aclk_g2d_333", "mout_aclk_g2d_333", - DIV_TOP_G2D_MFC, 0, 3), - DIV(TOP_DOUT_ACLK_MFC_333, "dout_aclk_mfc_333", "mout_aclk_mfc_333", - DIV_TOP_G2D_MFC, 4, 3), - - DIV(TOP_DOUT_ACLK_GSCL_333, "dout_aclk_gscl_333", "mout_aclk_gscl_333", - DIV_TOP_GSCL_ISP0, 0, 3), - DIV(TOP_DOUT_ACLK_GSCL_400, "dout_aclk_gscl_400", "mout_aclk_gscl_400", - DIV_TOP_GSCL_ISP0, 4, 3), - DIV(TOP_DOUT_ACLK_GSCL_FIMC, "dout_aclk_gscl_fimc", - "mout_aclk_gscl_fimc", DIV_TOP_GSCL_ISP0, 8, 3), - DIV(TOP_DOUT_SCLK_ISP1_SENSOR0_A, "dout_sclk_isp1_sensor0_a", - "mout_aclk_gscl_fimc", DIV_TOP_GSCL_ISP0, 16, 4), - DIV(TOP_DOUT_SCLK_ISP1_SENSOR1_A, "dout_sclk_isp1_sensor1_a", - "mout_aclk_gscl_400", DIV_TOP_GSCL_ISP0, 20, 4), - DIV(TOP_DOUT_SCLK_ISP1_SENSOR2_A, "dout_sclk_isp1_sensor2_a", - "mout_aclk_gscl_fimc", DIV_TOP_GSCL_ISP0, 24, 4), - - DIV(TOP_DOUT_ACLK_ISP1_266, "dout_aclk_isp1_266", "mout_aclk_isp1_266", - DIV_TOP_ISP10, 0, 3), - DIV(TOP_DOUT_ACLK_ISP1_400, "dout_aclk_isp1_400", "mout_aclk_isp1_400", - DIV_TOP_ISP10, 4, 3), - DIV(TOP_DOUT_SCLK_ISP1_SPI0_A, "dout_sclk_isp1_spi0_a", - "mout_sclk_isp1_spi0", DIV_TOP_ISP10, 12, 4), - DIV(TOP_DOUT_SCLK_ISP1_SPI0_B, "dout_sclk_isp1_spi0_b", - "dout_sclk_isp1_spi0_a", DIV_TOP_ISP10, 16, 8), - - DIV(TOP_DOUT_SCLK_ISP1_SPI1_A, "dout_sclk_isp1_spi1_a", - "mout_sclk_isp1_spi1", DIV_TOP_ISP11, 0, 4), - DIV(TOP_DOUT_SCLK_ISP1_SPI1_B, "dout_sclk_isp1_spi1_b", - "dout_sclk_isp1_spi1_a", DIV_TOP_ISP11, 4, 8), - DIV(TOP_DOUT_SCLK_ISP1_UART, "dout_sclk_isp1_uart", - "mout_sclk_isp1_uart", DIV_TOP_ISP11, 12, 4), - DIV(TOP_DOUT_SCLK_ISP1_SENSOR0_B, "dout_sclk_isp1_sensor0_b", - "dout_sclk_isp1_sensor0_a", DIV_TOP_ISP11, 16, 4), - DIV(TOP_DOUT_SCLK_ISP1_SENSOR1_B, "dout_sclk_isp1_sensor1_b", - "dout_sclk_isp1_sensor1_a", DIV_TOP_ISP11, 20, 4), - DIV(TOP_DOUT_SCLK_ISP1_SENSOR2_B, "dout_sclk_isp1_sensor2_b", - "dout_sclk_isp1_sensor2_a", DIV_TOP_ISP11, 24, 4), - - DIV(TOP_DOUTTOP__SCLK_HPM_TARGETCLK, "dout_sclk_hpm_targetclk", - "mout_bustop_pll_user", DIV_TOP_HPM, 0, 3), - - DIV(TOP_DOUT_ACLK_DISP_333, "dout_aclk_disp_333", "mout_aclk_disp_333", - DIV_TOP_DISP, 0, 3), - DIV(TOP_DOUT_ACLK_DISP_222, "dout_aclk_disp_222", "mout_aclk_disp_222", - DIV_TOP_DISP, 4, 3), - DIV(TOP_DOUT_SCLK_DISP_PIXEL, "dout_sclk_disp_pixel", - "mout_sclk_disp_pixel", DIV_TOP_DISP, 8, 3), - - DIV(TOP_DOUT_ACLK_BUS1_400, "dout_aclk_bus1_400", - "mout_bus1_bustop_400", DIV_TOP_BUS, 0, 3), - DIV(TOP_DOUT_ACLK_BUS1_100, "dout_aclk_bus1_100", - "mout_bus1_bustop_100", DIV_TOP_BUS, 4, 4), - DIV(TOP_DOUT_ACLK_BUS2_400, "dout_aclk_bus2_400", - "mout_bus2_bustop_400", DIV_TOP_BUS, 8, 3), - DIV(TOP_DOUT_ACLK_BUS2_100, "dout_aclk_bus2_100", - "mout_bus2_bustop_100", DIV_TOP_BUS, 12, 4), - DIV(TOP_DOUT_ACLK_BUS3_400, "dout_aclk_bus3_400", - "mout_bus3_bustop_400", DIV_TOP_BUS, 16, 3), - DIV(TOP_DOUT_ACLK_BUS3_100, "dout_aclk_bus3_100", - "mout_bus3_bustop_100", DIV_TOP_BUS, 20, 4), - DIV(TOP_DOUT_ACLK_BUS4_400, "dout_aclk_bus4_400", - "mout_bus4_bustop_400", DIV_TOP_BUS, 24, 3), - DIV(TOP_DOUT_ACLK_BUS4_100, "dout_aclk_bus4_100", - "mout_bus4_bustop_100", DIV_TOP_BUS, 28, 4), - - DIV(TOP_DOUT_SCLK_PERI_SPI0_A, "dout_sclk_peri_spi0_a", - "mout_sclk_peri_spi0_clk", DIV_TOP_PERI0, 4, 4), - DIV(TOP_DOUT_SCLK_PERI_SPI0_B, "dout_sclk_peri_spi0_b", - "dout_sclk_peri_spi0_a", DIV_TOP_PERI0, 8, 8), - DIV(TOP_DOUT_SCLK_PERI_SPI1_A, "dout_sclk_peri_spi1_a", - "mout_sclk_peri_spi1_clk", DIV_TOP_PERI0, 16, 4), - DIV(TOP_DOUT_SCLK_PERI_SPI1_B, "dout_sclk_peri_spi1_b", - "dout_sclk_peri_spi1_a", DIV_TOP_PERI0, 20, 8), - - DIV(TOP_DOUT_SCLK_PERI_SPI2_A, "dout_sclk_peri_spi2_a", - "mout_sclk_peri_spi2_clk", DIV_TOP_PERI1, 0, 4), - DIV(TOP_DOUT_SCLK_PERI_SPI2_B, "dout_sclk_peri_spi2_b", - "dout_sclk_peri_spi2_a", DIV_TOP_PERI1, 4, 8), - DIV(TOP_DOUT_SCLK_PERI_UART1, "dout_sclk_peri_uart1", - "mout_sclk_peri_uart1_uclk", DIV_TOP_PERI1, 16, 4), - DIV(TOP_DOUT_SCLK_PERI_UART2, "dout_sclk_peri_uart2", - "mout_sclk_peri_uart2_uclk", DIV_TOP_PERI1, 20, 4), - DIV(TOP_DOUT_SCLK_PERI_UART0, "dout_sclk_peri_uart0", - "mout_sclk_peri_uart0_uclk", DIV_TOP_PERI1, 24, 4), - - DIV(TOP_DOUT_ACLK_PERI_66, "dout_aclk_peri_66", "mout_bustop_pll_user", - DIV_TOP_PERI2, 20, 4), - DIV(TOP_DOUT_ACLK_PERI_AUD, "dout_aclk_peri_aud", - "mout_audtop_pll_user", DIV_TOP_PERI2, 24, 3), - - DIV(TOP_DOUT_ACLK_FSYS_200, "dout_aclk_fsys_200", - "mout_bustop_pll_user", DIV_TOP_FSYS0, 0, 3), - DIV(TOP_DOUT_SCLK_FSYS_USBDRD30_SUSPEND_CLK, - "dout_sclk_fsys_usbdrd30_suspend_clk", - "mout_sclk_fsys_usb", DIV_TOP_FSYS0, 4, 4), - DIV(TOP_DOUT_SCLK_FSYS_MMC0_SDCLKIN_A, "dout_sclk_fsys_mmc0_sdclkin_a", - "mout_sclk_fsys_mmc0_sdclkin_b", - DIV_TOP_FSYS0, 12, 4), - DIV(TOP_DOUT_SCLK_FSYS_MMC0_SDCLKIN_B, "dout_sclk_fsys_mmc0_sdclkin_b", - "dout_sclk_fsys_mmc0_sdclkin_a", - DIV_TOP_FSYS0, 16, 8), - - - DIV(TOP_DOUT_SCLK_FSYS_MMC1_SDCLKIN_A, "dout_sclk_fsys_mmc1_sdclkin_a", - "mout_sclk_fsys_mmc1_sdclkin_b", - DIV_TOP_FSYS1, 0, 4), - DIV(TOP_DOUT_SCLK_FSYS_MMC1_SDCLKIN_B, "dout_sclk_fsys_mmc1_sdclkin_b", - "dout_sclk_fsys_mmc1_sdclkin_a", - DIV_TOP_FSYS1, 4, 8), - DIV(TOP_DOUT_SCLK_FSYS_MMC2_SDCLKIN_A, "dout_sclk_fsys_mmc2_sdclkin_a", - "mout_sclk_fsys_mmc2_sdclkin_b", - DIV_TOP_FSYS1, 12, 4), - DIV(TOP_DOUT_SCLK_FSYS_MMC2_SDCLKIN_B, "dout_sclk_fsys_mmc2_sdclkin_b", - "dout_sclk_fsys_mmc2_sdclkin_a", - DIV_TOP_FSYS1, 16, 8), - -}; - -static const struct samsung_gate_clock top_gate_clks[] __initconst = { - GATE(TOP_SCLK_MMC0, "sclk_fsys_mmc0_sdclkin", - "dout_sclk_fsys_mmc0_sdclkin_b", - EN_SCLK_TOP, 7, CLK_SET_RATE_PARENT, 0), - GATE(TOP_SCLK_MMC1, "sclk_fsys_mmc1_sdclkin", - "dout_sclk_fsys_mmc1_sdclkin_b", - EN_SCLK_TOP, 8, CLK_SET_RATE_PARENT, 0), - GATE(TOP_SCLK_MMC2, "sclk_fsys_mmc2_sdclkin", - "dout_sclk_fsys_mmc2_sdclkin_b", - EN_SCLK_TOP, 9, CLK_SET_RATE_PARENT, 0), - GATE(TOP_SCLK_FIMD1, "sclk_disp_pixel", "dout_sclk_disp_pixel", - EN_ACLK_TOP, 10, CLK_IGNORE_UNUSED | - CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_pll_clock top_pll_clks[] __initconst = { - PLL(pll_2550xx, TOP_FOUT_DISP_PLL, "fout_disp_pll", "fin_pll", - DISP_PLL_LOCK, DISP_PLL_CON0, - pll2550_24mhz_tbl), - PLL(pll_2650xx, TOP_FOUT_AUD_PLL, "fout_aud_pll", "fin_pll", - AUD_PLL_LOCK, AUD_PLL_CON0, - pll2650_24mhz_tbl), -}; - -static const struct samsung_cmu_info top_cmu __initconst = { - .pll_clks = top_pll_clks, - .nr_pll_clks = ARRAY_SIZE(top_pll_clks), - .mux_clks = top_mux_clks, - .nr_mux_clks = ARRAY_SIZE(top_mux_clks), - .div_clks = top_div_clks, - .nr_div_clks = ARRAY_SIZE(top_div_clks), - .gate_clks = top_gate_clks, - .nr_gate_clks = ARRAY_SIZE(top_gate_clks), - .fixed_clks = fixed_rate_clks, - .nr_fixed_clks = ARRAY_SIZE(fixed_rate_clks), - .nr_clk_ids = TOP_NR_CLK, - .clk_regs = top_clk_regs, - .nr_clk_regs = ARRAY_SIZE(top_clk_regs), -}; - -static void __init exynos5260_clk_top_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &top_cmu); -} - -CLK_OF_DECLARE(exynos5260_clk_top, "samsung,exynos5260-clock-top", - exynos5260_clk_top_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos5260.h b/drivers/clk/samsung/samsung/clk-exynos5260.h deleted file mode 100644 index d739716d6ea1..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos5260.h +++ /dev/null @@ -1,459 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * Author: Rahul Sharma - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos5260 SoC. - */ - -#ifndef __CLK_EXYNOS5260_H -#define __CLK_EXYNOS5260_H - -/* -*Registers for CMU_AUD -*/ -#define MUX_SEL_AUD 0x0200 -#define MUX_ENABLE_AUD 0x0300 -#define MUX_STAT_AUD 0x0400 -#define MUX_IGNORE_AUD 0x0500 -#define DIV_AUD0 0x0600 -#define DIV_AUD1 0x0604 -#define DIV_STAT_AUD0 0x0700 -#define DIV_STAT_AUD1 0x0704 -#define EN_ACLK_AUD 0x0800 -#define EN_PCLK_AUD 0x0900 -#define EN_SCLK_AUD 0x0a00 -#define EN_IP_AUD 0x0b00 - -/* -*Registers for CMU_DISP -*/ -#define MUX_SEL_DISP0 0x0200 -#define MUX_SEL_DISP1 0x0204 -#define MUX_SEL_DISP2 0x0208 -#define MUX_SEL_DISP3 0x020C -#define MUX_SEL_DISP4 0x0210 -#define MUX_ENABLE_DISP0 0x0300 -#define MUX_ENABLE_DISP1 0x0304 -#define MUX_ENABLE_DISP2 0x0308 -#define MUX_ENABLE_DISP3 0x030c -#define MUX_ENABLE_DISP4 0x0310 -#define MUX_STAT_DISP0 0x0400 -#define MUX_STAT_DISP1 0x0404 -#define MUX_STAT_DISP2 0x0408 -#define MUX_STAT_DISP3 0x040c -#define MUX_STAT_DISP4 0x0410 -#define MUX_IGNORE_DISP0 0x0500 -#define MUX_IGNORE_DISP1 0x0504 -#define MUX_IGNORE_DISP2 0x0508 -#define MUX_IGNORE_DISP3 0x050c -#define MUX_IGNORE_DISP4 0x0510 -#define DIV_DISP 0x0600 -#define DIV_STAT_DISP 0x0700 -#define EN_ACLK_DISP 0x0800 -#define EN_PCLK_DISP 0x0900 -#define EN_SCLK_DISP0 0x0a00 -#define EN_SCLK_DISP1 0x0a04 -#define EN_IP_DISP 0x0b00 -#define EN_IP_DISP_BUS 0x0b04 - - -/* -*Registers for CMU_EGL -*/ -#define EGL_PLL_LOCK 0x0000 -#define EGL_DPLL_LOCK 0x0004 -#define EGL_PLL_CON0 0x0100 -#define EGL_PLL_CON1 0x0104 -#define EGL_PLL_FREQ_DET 0x010c -#define EGL_DPLL_CON0 0x0110 -#define EGL_DPLL_CON1 0x0114 -#define EGL_DPLL_FREQ_DET 0x011c -#define MUX_SEL_EGL 0x0200 -#define MUX_ENABLE_EGL 0x0300 -#define MUX_STAT_EGL 0x0400 -#define DIV_EGL 0x0600 -#define DIV_EGL_PLL_FDET 0x0604 -#define DIV_STAT_EGL 0x0700 -#define DIV_STAT_EGL_PLL_FDET 0x0704 -#define EN_ACLK_EGL 0x0800 -#define EN_PCLK_EGL 0x0900 -#define EN_SCLK_EGL 0x0a00 -#define EN_IP_EGL 0x0b00 -#define CLKOUT_CMU_EGL 0x0c00 -#define CLKOUT_CMU_EGL_DIV_STAT 0x0c04 -#define ARMCLK_STOPCTRL 0x1000 -#define EAGLE_EMA_CTRL 0x1008 -#define EAGLE_EMA_STATUS 0x100c -#define PWR_CTRL 0x1020 -#define PWR_CTRL2 0x1024 -#define CLKSTOP_CTRL 0x1028 -#define INTR_SPREAD_EN 0x1080 -#define INTR_SPREAD_USE_STANDBYWFI 0x1084 -#define INTR_SPREAD_BLOCKING_DURATION 0x1088 -#define CMU_EGL_SPARE0 0x2000 -#define CMU_EGL_SPARE1 0x2004 -#define CMU_EGL_SPARE2 0x2008 -#define CMU_EGL_SPARE3 0x200c -#define CMU_EGL_SPARE4 0x2010 - -/* -*Registers for CMU_FSYS -*/ - -#define MUX_SEL_FSYS0 0x0200 -#define MUX_SEL_FSYS1 0x0204 -#define MUX_ENABLE_FSYS0 0x0300 -#define MUX_ENABLE_FSYS1 0x0304 -#define MUX_STAT_FSYS0 0x0400 -#define MUX_STAT_FSYS1 0x0404 -#define MUX_IGNORE_FSYS0 0x0500 -#define MUX_IGNORE_FSYS1 0x0504 -#define EN_ACLK_FSYS 0x0800 -#define EN_ACLK_FSYS_SECURE_RTIC 0x0804 -#define EN_ACLK_FSYS_SECURE_SMMU_RTIC 0x0808 -#define EN_PCLK_FSYS 0x0900 -#define EN_SCLK_FSYS 0x0a00 -#define EN_IP_FSYS 0x0b00 -#define EN_IP_FSYS_SECURE_RTIC 0x0b04 -#define EN_IP_FSYS_SECURE_SMMU_RTIC 0x0b08 - -/* -*Registers for CMU_G2D -*/ - -#define MUX_SEL_G2D 0x0200 -#define MUX_ENABLE_G2D 0x0300 -#define MUX_STAT_G2D 0x0400 -#define DIV_G2D 0x0600 -#define DIV_STAT_G2D 0x0700 -#define EN_ACLK_G2D 0x0800 -#define EN_ACLK_G2D_SECURE_SSS 0x0804 -#define EN_ACLK_G2D_SECURE_SLIM_SSS 0x0808 -#define EN_ACLK_G2D_SECURE_SMMU_SLIM_SSS 0x080c -#define EN_ACLK_G2D_SECURE_SMMU_SSS 0x0810 -#define EN_ACLK_G2D_SECURE_SMMU_MDMA 0x0814 -#define EN_ACLK_G2D_SECURE_SMMU_G2D 0x0818 -#define EN_PCLK_G2D 0x0900 -#define EN_PCLK_G2D_SECURE_SMMU_SLIM_SSS 0x0904 -#define EN_PCLK_G2D_SECURE_SMMU_SSS 0x0908 -#define EN_PCLK_G2D_SECURE_SMMU_MDMA 0x090c -#define EN_PCLK_G2D_SECURE_SMMU_G2D 0x0910 -#define EN_IP_G2D 0x0b00 -#define EN_IP_G2D_SECURE_SSS 0x0b04 -#define EN_IP_G2D_SECURE_SLIM_SSS 0x0b08 -#define EN_IP_G2D_SECURE_SMMU_SLIM_SSS 0x0b0c -#define EN_IP_G2D_SECURE_SMMU_SSS 0x0b10 -#define EN_IP_G2D_SECURE_SMMU_MDMA 0x0b14 -#define EN_IP_G2D_SECURE_SMMU_G2D 0x0b18 - -/* -*Registers for CMU_G3D -*/ - -#define G3D_PLL_LOCK 0x0000 -#define G3D_PLL_CON0 0x0100 -#define G3D_PLL_CON1 0x0104 -#define G3D_PLL_FDET 0x010c -#define MUX_SEL_G3D 0x0200 -#define MUX_EN_G3D 0x0300 -#define MUX_STAT_G3D 0x0400 -#define MUX_IGNORE_G3D 0x0500 -#define DIV_G3D 0x0600 -#define DIV_G3D_PLL_FDET 0x0604 -#define DIV_STAT_G3D 0x0700 -#define DIV_STAT_G3D_PLL_FDET 0x0704 -#define EN_ACLK_G3D 0x0800 -#define EN_PCLK_G3D 0x0900 -#define EN_SCLK_G3D 0x0a00 -#define EN_IP_G3D 0x0b00 -#define CLKOUT_CMU_G3D 0x0c00 -#define CLKOUT_CMU_G3D_DIV_STAT 0x0c04 -#define G3DCLK_STOPCTRL 0x1000 -#define G3D_EMA_CTRL 0x1008 -#define G3D_EMA_STATUS 0x100c - -/* -*Registers for CMU_GSCL -*/ - -#define MUX_SEL_GSCL 0x0200 -#define MUX_EN_GSCL 0x0300 -#define MUX_STAT_GSCL 0x0400 -#define MUX_IGNORE_GSCL 0x0500 -#define DIV_GSCL 0x0600 -#define DIV_STAT_GSCL 0x0700 -#define EN_ACLK_GSCL 0x0800 -#define EN_ACLK_GSCL_FIMC 0x0804 -#define EN_ACLK_GSCL_SECURE_SMMU_GSCL0 0x0808 -#define EN_ACLK_GSCL_SECURE_SMMU_GSCL1 0x080c -#define EN_ACLK_GSCL_SECURE_SMMU_MSCL0 0x0810 -#define EN_ACLK_GSCL_SECURE_SMMU_MSCL1 0x0814 -#define EN_PCLK_GSCL 0x0900 -#define EN_PCLK_GSCL_FIMC 0x0904 -#define EN_PCLK_GSCL_SECURE_SMMU_GSCL0 0x0908 -#define EN_PCLK_GSCL_SECURE_SMMU_GSCL1 0x090c -#define EN_PCLK_GSCL_SECURE_SMMU_MSCL0 0x0910 -#define EN_PCLK_GSCL_SECURE_SMMU_MSCL1 0x0914 -#define EN_SCLK_GSCL 0x0a00 -#define EN_SCLK_GSCL_FIMC 0x0a04 -#define EN_IP_GSCL 0x0b00 -#define EN_IP_GSCL_FIMC 0x0b04 -#define EN_IP_GSCL_SECURE_SMMU_GSCL0 0x0b08 -#define EN_IP_GSCL_SECURE_SMMU_GSCL1 0x0b0c -#define EN_IP_GSCL_SECURE_SMMU_MSCL0 0x0b10 -#define EN_IP_GSCL_SECURE_SMMU_MSCL1 0x0b14 - -/* -*Registers for CMU_ISP -*/ -#define MUX_SEL_ISP0 0x0200 -#define MUX_SEL_ISP1 0x0204 -#define MUX_ENABLE_ISP0 0x0300 -#define MUX_ENABLE_ISP1 0x0304 -#define MUX_STAT_ISP0 0x0400 -#define MUX_STAT_ISP1 0x0404 -#define MUX_IGNORE_ISP0 0x0500 -#define MUX_IGNORE_ISP1 0x0504 -#define DIV_ISP 0x0600 -#define DIV_STAT_ISP 0x0700 -#define EN_ACLK_ISP0 0x0800 -#define EN_ACLK_ISP1 0x0804 -#define EN_PCLK_ISP0 0x0900 -#define EN_PCLK_ISP1 0x0904 -#define EN_SCLK_ISP 0x0a00 -#define EN_IP_ISP0 0x0b00 -#define EN_IP_ISP1 0x0b04 - -/* -*Registers for CMU_KFC -*/ -#define KFC_PLL_LOCK 0x0000 -#define KFC_PLL_CON0 0x0100 -#define KFC_PLL_CON1 0x0104 -#define KFC_PLL_FDET 0x010c -#define MUX_SEL_KFC0 0x0200 -#define MUX_SEL_KFC2 0x0208 -#define MUX_ENABLE_KFC0 0x0300 -#define MUX_ENABLE_KFC2 0x0308 -#define MUX_STAT_KFC0 0x0400 -#define MUX_STAT_KFC2 0x0408 -#define DIV_KFC 0x0600 -#define DIV_KFC_PLL_FDET 0x0604 -#define DIV_STAT_KFC 0x0700 -#define DIV_STAT_KFC_PLL_FDET 0x0704 -#define EN_ACLK_KFC 0x0800 -#define EN_PCLK_KFC 0x0900 -#define EN_SCLK_KFC 0x0a00 -#define EN_IP_KFC 0x0b00 -#define CLKOUT_CMU_KFC 0x0c00 -#define CLKOUT_CMU_KFC_DIV_STAT 0x0c04 -#define ARMCLK_STOPCTRL_KFC 0x1000 -#define ARM_EMA_CTRL 0x1008 -#define ARM_EMA_STATUS 0x100c -#define PWR_CTRL_KFC 0x1020 -#define PWR_CTRL2_KFC 0x1024 -#define CLKSTOP_CTRL_KFC 0x1028 -#define INTR_SPREAD_ENABLE_KFC 0x1080 -#define INTR_SPREAD_USE_STANDBYWFI_KFC 0x1084 -#define INTR_SPREAD_BLOCKING_DURATION_KFC 0x1088 -#define CMU_KFC_SPARE0 0x2000 -#define CMU_KFC_SPARE1 0x2004 -#define CMU_KFC_SPARE2 0x2008 -#define CMU_KFC_SPARE3 0x200c -#define CMU_KFC_SPARE4 0x2010 - -/* -*Registers for CMU_MFC -*/ -#define MUX_SEL_MFC 0x0200 -#define MUX_ENABLE_MFC 0x0300 -#define MUX_STAT_MFC 0x0400 -#define DIV_MFC 0x0600 -#define DIV_STAT_MFC 0x0700 -#define EN_ACLK_MFC 0x0800 -#define EN_ACLK_SECURE_SMMU2_MFC 0x0804 -#define EN_PCLK_MFC 0x0900 -#define EN_PCLK_SECURE_SMMU2_MFC 0x0904 -#define EN_IP_MFC 0x0b00 -#define EN_IP_MFC_SECURE_SMMU2_MFC 0x0b04 - -/* -*Registers for CMU_MIF -*/ -#define MEM_PLL_LOCK 0x0000 -#define BUS_PLL_LOCK 0x0004 -#define MEDIA_PLL_LOCK 0x0008 -#define MEM_PLL_CON0 0x0100 -#define MEM_PLL_CON1 0x0104 -#define MEM_PLL_FDET 0x010c -#define BUS_PLL_CON0 0x0110 -#define BUS_PLL_CON1 0x0114 -#define BUS_PLL_FDET 0x011c -#define MEDIA_PLL_CON0 0x0120 -#define MEDIA_PLL_CON1 0x0124 -#define MEDIA_PLL_FDET 0x012c -#define MUX_SEL_MIF 0x0200 -#define MUX_ENABLE_MIF 0x0300 -#define MUX_STAT_MIF 0x0400 -#define MUX_IGNORE_MIF 0x0500 -#define DIV_MIF 0x0600 -#define DIV_MIF_PLL_FDET 0x0604 -#define DIV_STAT_MIF 0x0700 -#define DIV_STAT_MIF_PLL_FDET 0x0704 -#define EN_ACLK_MIF 0x0800 -#define EN_ACLK_MIF_SECURE_DREX1_TZ 0x0804 -#define EN_ACLK_MIF_SECURE_DREX0_TZ 0x0808 -#define EN_ACLK_MIF_SECURE_INTMEM 0x080c -#define EN_PCLK_MIF 0x0900 -#define EN_PCLK_MIF_SECURE_MONOCNT 0x0904 -#define EN_PCLK_MIF_SECURE_RTC_APBIF 0x0908 -#define EN_PCLK_MIF_SECURE_DREX1_TZ 0x090c -#define EN_PCLK_MIF_SECURE_DREX0_TZ 0x0910 -#define EN_SCLK_MIF 0x0a00 -#define EN_IP_MIF 0x0b00 -#define EN_IP_MIF_SECURE_MONOCNT 0x0b04 -#define EN_IP_MIF_SECURE_RTC_APBIF 0x0b08 -#define EN_IP_MIF_SECURE_DREX1_TZ 0x0b0c -#define EN_IP_MIF_SECURE_DREX0_TZ 0x0b10 -#define EN_IP_MIF_SECURE_INTEMEM 0x0b14 -#define CLKOUT_CMU_MIF_DIV_STAT 0x0c04 -#define DREX_FREQ_CTRL 0x1000 -#define PAUSE 0x1004 -#define DDRPHY_LOCK_CTRL 0x1008 -#define CLKOUT_CMU_MIF 0xcb00 - -/* -*Registers for CMU_PERI -*/ -#define MUX_SEL_PERI 0x0200 -#define MUX_SEL_PERI1 0x0204 -#define MUX_ENABLE_PERI 0x0300 -#define MUX_ENABLE_PERI1 0x0304 -#define MUX_STAT_PERI 0x0400 -#define MUX_STAT_PERI1 0x0404 -#define MUX_IGNORE_PERI 0x0500 -#define MUX_IGNORE_PERI1 0x0504 -#define DIV_PERI 0x0600 -#define DIV_STAT_PERI 0x0700 -#define EN_PCLK_PERI0 0x0800 -#define EN_PCLK_PERI1 0x0804 -#define EN_PCLK_PERI2 0x0808 -#define EN_PCLK_PERI3 0x080c -#define EN_PCLK_PERI_SECURE_CHIPID 0x0810 -#define EN_PCLK_PERI_SECURE_PROVKEY0 0x0814 -#define EN_PCLK_PERI_SECURE_PROVKEY1 0x0818 -#define EN_PCLK_PERI_SECURE_SECKEY 0x081c -#define EN_PCLK_PERI_SECURE_ANTIRBKCNT 0x0820 -#define EN_PCLK_PERI_SECURE_TOP_RTC 0x0824 -#define EN_PCLK_PERI_SECURE_TZPC 0x0828 -#define EN_SCLK_PERI 0x0a00 -#define EN_SCLK_PERI_SECURE_TOP_RTC 0x0a04 -#define EN_IP_PERI0 0x0b00 -#define EN_IP_PERI1 0x0b04 -#define EN_IP_PERI2 0x0b08 -#define EN_IP_PERI_SECURE_CHIPID 0x0b0c -#define EN_IP_PERI_SECURE_PROVKEY0 0x0b10 -#define EN_IP_PERI_SECURE_PROVKEY1 0x0b14 -#define EN_IP_PERI_SECURE_SECKEY 0x0b18 -#define EN_IP_PERI_SECURE_ANTIRBKCNT 0x0b1c -#define EN_IP_PERI_SECURE_TOP_RTC 0x0b20 -#define EN_IP_PERI_SECURE_TZPC 0x0b24 - -/* -*Registers for CMU_TOP -*/ -#define DISP_PLL_LOCK 0x0000 -#define AUD_PLL_LOCK 0x0004 -#define DISP_PLL_CON0 0x0100 -#define DISP_PLL_CON1 0x0104 -#define DISP_PLL_FDET 0x0108 -#define AUD_PLL_CON0 0x0110 -#define AUD_PLL_CON1 0x0114 -#define AUD_PLL_CON2 0x0118 -#define AUD_PLL_FDET 0x011c -#define MUX_SEL_TOP_PLL0 0x0200 -#define MUX_SEL_TOP_MFC 0x0204 -#define MUX_SEL_TOP_G2D 0x0208 -#define MUX_SEL_TOP_GSCL 0x020c -#define MUX_SEL_TOP_ISP10 0x0214 -#define MUX_SEL_TOP_ISP11 0x0218 -#define MUX_SEL_TOP_DISP0 0x021c -#define MUX_SEL_TOP_DISP1 0x0220 -#define MUX_SEL_TOP_BUS 0x0224 -#define MUX_SEL_TOP_PERI0 0x0228 -#define MUX_SEL_TOP_PERI1 0x022c -#define MUX_SEL_TOP_FSYS 0x0230 -#define MUX_ENABLE_TOP_PLL0 0x0300 -#define MUX_ENABLE_TOP_MFC 0x0304 -#define MUX_ENABLE_TOP_G2D 0x0308 -#define MUX_ENABLE_TOP_GSCL 0x030c -#define MUX_ENABLE_TOP_ISP10 0x0314 -#define MUX_ENABLE_TOP_ISP11 0x0318 -#define MUX_ENABLE_TOP_DISP0 0x031c -#define MUX_ENABLE_TOP_DISP1 0x0320 -#define MUX_ENABLE_TOP_BUS 0x0324 -#define MUX_ENABLE_TOP_PERI0 0x0328 -#define MUX_ENABLE_TOP_PERI1 0x032c -#define MUX_ENABLE_TOP_FSYS 0x0330 -#define MUX_STAT_TOP_PLL0 0x0400 -#define MUX_STAT_TOP_MFC 0x0404 -#define MUX_STAT_TOP_G2D 0x0408 -#define MUX_STAT_TOP_GSCL 0x040c -#define MUX_STAT_TOP_ISP10 0x0414 -#define MUX_STAT_TOP_ISP11 0x0418 -#define MUX_STAT_TOP_DISP0 0x041c -#define MUX_STAT_TOP_DISP1 0x0420 -#define MUX_STAT_TOP_BUS 0x0424 -#define MUX_STAT_TOP_PERI0 0x0428 -#define MUX_STAT_TOP_PERI1 0x042c -#define MUX_STAT_TOP_FSYS 0x0430 -#define MUX_IGNORE_TOP_PLL0 0x0500 -#define MUX_IGNORE_TOP_MFC 0x0504 -#define MUX_IGNORE_TOP_G2D 0x0508 -#define MUX_IGNORE_TOP_GSCL 0x050c -#define MUX_IGNORE_TOP_ISP10 0x0514 -#define MUX_IGNORE_TOP_ISP11 0x0518 -#define MUX_IGNORE_TOP_DISP0 0x051c -#define MUX_IGNORE_TOP_DISP1 0x0520 -#define MUX_IGNORE_TOP_BUS 0x0524 -#define MUX_IGNORE_TOP_PERI0 0x0528 -#define MUX_IGNORE_TOP_PERI1 0x052c -#define MUX_IGNORE_TOP_FSYS 0x0530 -#define DIV_TOP_G2D_MFC 0x0600 -#define DIV_TOP_GSCL_ISP0 0x0604 -#define DIV_TOP_ISP10 0x0608 -#define DIV_TOP_ISP11 0x060c -#define DIV_TOP_DISP 0x0610 -#define DIV_TOP_BUS 0x0614 -#define DIV_TOP_PERI0 0x0618 -#define DIV_TOP_PERI1 0x061c -#define DIV_TOP_PERI2 0x0620 -#define DIV_TOP_FSYS0 0x0624 -#define DIV_TOP_FSYS1 0x0628 -#define DIV_TOP_HPM 0x062c -#define DIV_TOP_PLL_FDET 0x0630 -#define DIV_STAT_TOP_G2D_MFC 0x0700 -#define DIV_STAT_TOP_GSCL_ISP0 0x0704 -#define DIV_STAT_TOP_ISP10 0x0708 -#define DIV_STAT_TOP_ISP11 0x070c -#define DIV_STAT_TOP_DISP 0x0710 -#define DIV_STAT_TOP_BUS 0x0714 -#define DIV_STAT_TOP_PERI0 0x0718 -#define DIV_STAT_TOP_PERI1 0x071c -#define DIV_STAT_TOP_PERI2 0x0720 -#define DIV_STAT_TOP_FSYS0 0x0724 -#define DIV_STAT_TOP_FSYS1 0x0728 -#define DIV_STAT_TOP_HPM 0x072c -#define DIV_STAT_TOP_PLL_FDET 0x0730 -#define EN_ACLK_TOP 0x0800 -#define EN_SCLK_TOP 0x0a00 -#define EN_IP_TOP 0x0b00 -#define CLKOUT_CMU_TOP 0x0c00 -#define CLKOUT_CMU_TOP_DIV_STAT 0x0c04 - -#endif /*__CLK_EXYNOS5260_H */ - diff --git a/drivers/clk/samsung/samsung/clk-exynos5410.c b/drivers/clk/samsung/samsung/clk-exynos5410.c deleted file mode 100644 index fc471a49e8f4..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos5410.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Author: Tarek Dakhran - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos5410 SoC. -*/ - -#include - -#include -#include -#include -#include - -#include "clk.h" - -#define APLL_LOCK 0x0 -#define APLL_CON0 0x100 -#define CPLL_LOCK 0x10020 -#define CPLL_CON0 0x10120 -#define EPLL_LOCK 0x10040 -#define EPLL_CON0 0x10130 -#define MPLL_LOCK 0x4000 -#define MPLL_CON0 0x4100 -#define BPLL_LOCK 0x20010 -#define BPLL_CON0 0x20110 -#define KPLL_LOCK 0x28000 -#define KPLL_CON0 0x28100 - -#define SRC_CPU 0x200 -#define DIV_CPU0 0x500 -#define SRC_CPERI1 0x4204 -#define GATE_IP_G2D 0x8800 -#define DIV_TOP0 0x10510 -#define DIV_TOP1 0x10514 -#define DIV_FSYS0 0x10548 -#define DIV_FSYS1 0x1054c -#define DIV_FSYS2 0x10550 -#define DIV_PERIC0 0x10558 -#define DIV_PERIC3 0x10564 -#define SRC_TOP0 0x10210 -#define SRC_TOP1 0x10214 -#define SRC_TOP2 0x10218 -#define SRC_FSYS 0x10244 -#define SRC_PERIC0 0x10250 -#define SRC_MASK_FSYS 0x10340 -#define SRC_MASK_PERIC0 0x10350 -#define GATE_BUS_FSYS0 0x10740 -#define GATE_TOP_SCLK_FSYS 0x10840 -#define GATE_TOP_SCLK_PERIC 0x10850 -#define GATE_IP_FSYS 0x10944 -#define GATE_IP_PERIC 0x10950 -#define GATE_IP_PERIS 0x10960 -#define SRC_CDREX 0x20200 -#define SRC_KFC 0x28200 -#define DIV_KFC0 0x28500 - -/* list of PLLs */ -enum exynos5410_plls { - apll, cpll, epll, mpll, - bpll, kpll, - nr_plls /* number of PLLs */ -}; - -/* list of all parent clocks */ -PNAME(apll_p) = { "fin_pll", "fout_apll", }; -PNAME(bpll_p) = { "fin_pll", "fout_bpll", }; -PNAME(cpll_p) = { "fin_pll", "fout_cpll" }; -PNAME(epll_p) = { "fin_pll", "fout_epll" }; -PNAME(mpll_p) = { "fin_pll", "fout_mpll", }; -PNAME(kpll_p) = { "fin_pll", "fout_kpll", }; - -PNAME(mout_cpu_p) = { "mout_apll", "sclk_mpll", }; -PNAME(mout_kfc_p) = { "mout_kpll", "sclk_mpll", }; - -PNAME(mpll_user_p) = { "fin_pll", "sclk_mpll", }; -PNAME(bpll_user_p) = { "fin_pll", "sclk_bpll", }; -PNAME(mpll_bpll_p) = { "sclk_mpll_muxed", "sclk_bpll_muxed", }; -PNAME(sclk_mpll_bpll_p) = { "sclk_mpll_bpll", "fin_pll", }; - -PNAME(group2_p) = { "fin_pll", "fin_pll", "none", "none", - "none", "none", "sclk_mpll_bpll", - "none", "none", "sclk_cpll" }; - -static const struct samsung_mux_clock exynos5410_mux_clks[] __initconst = { - MUX(0, "mout_apll", apll_p, SRC_CPU, 0, 1), - MUX(0, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1), - - MUX(0, "mout_kpll", kpll_p, SRC_KFC, 0, 1), - MUX(0, "mout_kfc", mout_kfc_p, SRC_KFC, 16, 1), - - MUX(0, "sclk_mpll", mpll_p, SRC_CPERI1, 8, 1), - MUX(0, "sclk_mpll_muxed", mpll_user_p, SRC_TOP2, 20, 1), - - MUX(0, "sclk_bpll", bpll_p, SRC_CDREX, 0, 1), - MUX(0, "sclk_bpll_muxed", bpll_user_p, SRC_TOP2, 24, 1), - - MUX(0, "sclk_epll", epll_p, SRC_TOP2, 12, 1), - - MUX(0, "sclk_cpll", cpll_p, SRC_TOP2, 8, 1), - - MUX(0, "sclk_mpll_bpll", mpll_bpll_p, SRC_TOP1, 20, 1), - - MUX(0, "mout_mmc0", group2_p, SRC_FSYS, 0, 4), - MUX(0, "mout_mmc1", group2_p, SRC_FSYS, 4, 4), - MUX(0, "mout_mmc2", group2_p, SRC_FSYS, 8, 4), - MUX(0, "mout_usbd300", sclk_mpll_bpll_p, SRC_FSYS, 28, 1), - MUX(0, "mout_usbd301", sclk_mpll_bpll_p, SRC_FSYS, 29, 1), - - MUX(0, "mout_uart0", group2_p, SRC_PERIC0, 0, 4), - MUX(0, "mout_uart1", group2_p, SRC_PERIC0, 4, 4), - MUX(0, "mout_uart2", group2_p, SRC_PERIC0, 8, 4), - MUX(0, "mout_uart3", group2_p, SRC_PERIC0, 12, 4), - MUX(0, "mout_pwm", group2_p, SRC_PERIC0, 24, 4), - - MUX(0, "mout_aclk200", mpll_bpll_p, SRC_TOP0, 12, 1), - MUX(0, "mout_aclk400", mpll_bpll_p, SRC_TOP0, 20, 1), -}; - -static const struct samsung_div_clock exynos5410_div_clks[] __initconst = { - DIV(0, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), - DIV(0, "div_arm2", "div_arm", DIV_CPU0, 28, 3), - - DIV(0, "div_acp", "div_arm2", DIV_CPU0, 8, 3), - DIV(0, "div_cpud", "div_arm2", DIV_CPU0, 4, 3), - DIV(0, "div_atb", "div_arm2", DIV_CPU0, 16, 3), - DIV(0, "pclk_dbg", "div_arm2", DIV_CPU0, 20, 3), - - DIV(0, "div_kfc", "mout_kfc", DIV_KFC0, 0, 3), - DIV(0, "div_aclk", "div_kfc", DIV_KFC0, 4, 3), - DIV(0, "div_pclk", "div_kfc", DIV_KFC0, 20, 3), - - DIV(0, "aclk66_pre", "sclk_mpll_muxed", DIV_TOP1, 24, 3), - DIV(0, "aclk66", "aclk66_pre", DIV_TOP0, 0, 3), - - DIV(0, "dout_usbphy300", "mout_usbd300", DIV_FSYS0, 16, 4), - DIV(0, "dout_usbphy301", "mout_usbd301", DIV_FSYS0, 20, 4), - DIV(0, "dout_usbd300", "mout_usbd300", DIV_FSYS0, 24, 4), - DIV(0, "dout_usbd301", "mout_usbd301", DIV_FSYS0, 28, 4), - - DIV(0, "div_mmc0", "mout_mmc0", DIV_FSYS1, 0, 4), - DIV(0, "div_mmc1", "mout_mmc1", DIV_FSYS1, 16, 4), - DIV(0, "div_mmc2", "mout_mmc2", DIV_FSYS2, 0, 4), - - DIV_F(0, "div_mmc_pre0", "div_mmc0", - DIV_FSYS1, 8, 8, CLK_SET_RATE_PARENT, 0), - DIV_F(0, "div_mmc_pre1", "div_mmc1", - DIV_FSYS1, 24, 8, CLK_SET_RATE_PARENT, 0), - DIV_F(0, "div_mmc_pre2", "div_mmc2", - DIV_FSYS2, 8, 8, CLK_SET_RATE_PARENT, 0), - - DIV(0, "div_uart0", "mout_uart0", DIV_PERIC0, 0, 4), - DIV(0, "div_uart1", "mout_uart1", DIV_PERIC0, 4, 4), - DIV(0, "div_uart2", "mout_uart2", DIV_PERIC0, 8, 4), - DIV(0, "div_uart3", "mout_uart3", DIV_PERIC0, 12, 4), - - DIV(0, "dout_pwm", "mout_pwm", DIV_PERIC3, 0, 4), - - DIV(0, "aclk200", "mout_aclk200", DIV_TOP0, 12, 3), - DIV(0, "aclk266", "mpll_user_p", DIV_TOP0, 16, 3), - DIV(0, "aclk400", "mout_aclk400", DIV_TOP0, 24, 3), -}; - -static const struct samsung_gate_clock exynos5410_gate_clks[] __initconst = { - GATE(CLK_SSS, "sss", "aclk266", GATE_IP_G2D, 2, 0, 0), - GATE(CLK_MCT, "mct", "aclk66", GATE_IP_PERIS, 18, 0, 0), - GATE(CLK_WDT, "wdt", "aclk66", GATE_IP_PERIS, 19, 0, 0), - GATE(CLK_RTC, "rtc", "aclk66", GATE_IP_PERIS, 20, 0, 0), - GATE(CLK_TMU, "tmu", "aclk66", GATE_IP_PERIS, 21, 0, 0), - - GATE(CLK_SCLK_MMC0, "sclk_mmc0", "div_mmc_pre0", - SRC_MASK_FSYS, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC1, "sclk_mmc1", "div_mmc_pre1", - SRC_MASK_FSYS, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC2, "sclk_mmc2", "div_mmc_pre2", - SRC_MASK_FSYS, 8, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_MMC0, "sdmmc0", "aclk200", GATE_BUS_FSYS0, 12, 0, 0), - GATE(CLK_MMC1, "sdmmc1", "aclk200", GATE_BUS_FSYS0, 13, 0, 0), - GATE(CLK_MMC2, "sdmmc2", "aclk200", GATE_BUS_FSYS0, 14, 0, 0), - GATE(CLK_PDMA1, "pdma1", "aclk200", GATE_BUS_FSYS0, 2, 0, 0), - GATE(CLK_PDMA0, "pdma0", "aclk200", GATE_BUS_FSYS0, 1, 0, 0), - - GATE(CLK_SCLK_USBPHY301, "sclk_usbphy301", "dout_usbphy301", - GATE_TOP_SCLK_FSYS, 7, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_USBPHY300, "sclk_usbphy300", "dout_usbphy300", - GATE_TOP_SCLK_FSYS, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_USBD300, "sclk_usbd300", "dout_usbd300", - GATE_TOP_SCLK_FSYS, 9, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_USBD301, "sclk_usbd301", "dout_usbd301", - GATE_TOP_SCLK_FSYS, 10, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_PWM, "sclk_pwm", "dout_pwm", - GATE_TOP_SCLK_PERIC, 11, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_UART0, "uart0", "aclk66", GATE_IP_PERIC, 0, 0, 0), - GATE(CLK_UART1, "uart1", "aclk66", GATE_IP_PERIC, 1, 0, 0), - GATE(CLK_UART2, "uart2", "aclk66", GATE_IP_PERIC, 2, 0, 0), - GATE(CLK_UART3, "uart3", "aclk66", GATE_IP_PERIC, 3, 0, 0), - GATE(CLK_I2C0, "i2c0", "aclk66", GATE_IP_PERIC, 6, 0, 0), - GATE(CLK_I2C1, "i2c1", "aclk66", GATE_IP_PERIC, 7, 0, 0), - GATE(CLK_I2C2, "i2c2", "aclk66", GATE_IP_PERIC, 8, 0, 0), - GATE(CLK_I2C3, "i2c3", "aclk66", GATE_IP_PERIC, 9, 0, 0), - GATE(CLK_USI0, "usi0", "aclk66", GATE_IP_PERIC, 10, 0, 0), - GATE(CLK_USI1, "usi1", "aclk66", GATE_IP_PERIC, 11, 0, 0), - GATE(CLK_USI2, "usi2", "aclk66", GATE_IP_PERIC, 12, 0, 0), - GATE(CLK_USI3, "usi3", "aclk66", GATE_IP_PERIC, 13, 0, 0), - GATE(CLK_PWM, "pwm", "aclk66", GATE_IP_PERIC, 24, 0, 0), - - GATE(CLK_SCLK_UART0, "sclk_uart0", "div_uart0", - SRC_MASK_PERIC0, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART1, "sclk_uart1", "div_uart1", - SRC_MASK_PERIC0, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART2, "sclk_uart2", "div_uart2", - SRC_MASK_PERIC0, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART3, "sclk_uart3", "div_uart3", - SRC_MASK_PERIC0, 12, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_USBH20, "usbh20", "aclk200_fsys", GATE_IP_FSYS, 18, 0, 0), - GATE(CLK_USBD300, "usbd300", "aclk200_fsys", GATE_IP_FSYS, 19, 0, 0), - GATE(CLK_USBD301, "usbd301", "aclk200_fsys", GATE_IP_FSYS, 20, 0, 0), -}; - -static const struct samsung_pll_rate_table exynos5410_pll2550x_24mhz_tbl[] __initconst = { - PLL_36XX_RATE(400000000U, 200, 3, 2, 0), - PLL_36XX_RATE(333000000U, 111, 2, 2, 0), - PLL_36XX_RATE(300000000U, 100, 2, 2, 0), - PLL_36XX_RATE(266000000U, 266, 3, 3, 0), - PLL_36XX_RATE(200000000U, 200, 3, 3, 0), - PLL_36XX_RATE(192000000U, 192, 3, 3, 0), - PLL_36XX_RATE(166000000U, 166, 3, 3, 0), - PLL_36XX_RATE(133000000U, 266, 3, 4, 0), - PLL_36XX_RATE(100000000U, 200, 3, 4, 0), - PLL_36XX_RATE(66000000U, 176, 2, 5, 0), -}; - -static struct samsung_pll_clock exynos5410_plls[nr_plls] __initdata = { - [apll] = PLL(pll_35xx, CLK_FOUT_APLL, "fout_apll", "fin_pll", APLL_LOCK, - APLL_CON0, NULL), - [cpll] = PLL(pll_35xx, CLK_FOUT_CPLL, "fout_cpll", "fin_pll", CPLL_LOCK, - CPLL_CON0, NULL), - [epll] = PLL(pll_2650x, CLK_FOUT_EPLL, "fout_epll", "fin_pll", EPLL_LOCK, - EPLL_CON0, NULL), - [mpll] = PLL(pll_35xx, CLK_FOUT_MPLL, "fout_mpll", "fin_pll", MPLL_LOCK, - MPLL_CON0, NULL), - [bpll] = PLL(pll_35xx, CLK_FOUT_BPLL, "fout_bpll", "fin_pll", BPLL_LOCK, - BPLL_CON0, NULL), - [kpll] = PLL(pll_35xx, CLK_FOUT_KPLL, "fout_kpll", "fin_pll", KPLL_LOCK, - KPLL_CON0, NULL), -}; - -static const struct samsung_cmu_info cmu __initconst = { - .pll_clks = exynos5410_plls, - .nr_pll_clks = ARRAY_SIZE(exynos5410_plls), - .mux_clks = exynos5410_mux_clks, - .nr_mux_clks = ARRAY_SIZE(exynos5410_mux_clks), - .div_clks = exynos5410_div_clks, - .nr_div_clks = ARRAY_SIZE(exynos5410_div_clks), - .gate_clks = exynos5410_gate_clks, - .nr_gate_clks = ARRAY_SIZE(exynos5410_gate_clks), - .nr_clk_ids = CLK_NR_CLKS, -}; - -/* register exynos5410 clocks */ -static void __init exynos5410_clk_init(struct device_node *np) -{ - struct clk *xxti = of_clk_get(np, 0); - - if (!IS_ERR(xxti) && clk_get_rate(xxti) == 24 * MHZ) - exynos5410_plls[epll].rate_table = exynos5410_pll2550x_24mhz_tbl; - - samsung_cmu_register_one(np, &cmu); - - pr_debug("Exynos5410: clock setup completed.\n"); -} -CLK_OF_DECLARE(exynos5410_clk, "samsung,exynos5410-clock", exynos5410_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos5420.c b/drivers/clk/samsung/samsung/clk-exynos5420.c deleted file mode 100644 index 8c8b495cbf0d..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos5420.c +++ /dev/null @@ -1,1464 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Authors: Thomas Abraham - * Chander Kashyap - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos5420 SoC. -*/ - -#include -#include -#include -#include -#include -#include - -#include "clk.h" -#include "clk-cpu.h" - -#define APLL_LOCK 0x0 -#define APLL_CON0 0x100 -#define SRC_CPU 0x200 -#define DIV_CPU0 0x500 -#define DIV_CPU1 0x504 -#define GATE_BUS_CPU 0x700 -#define GATE_SCLK_CPU 0x800 -#define CLKOUT_CMU_CPU 0xa00 -#define SRC_MASK_CPERI 0x4300 -#define GATE_IP_G2D 0x8800 -#define CPLL_LOCK 0x10020 -#define DPLL_LOCK 0x10030 -#define EPLL_LOCK 0x10040 -#define RPLL_LOCK 0x10050 -#define IPLL_LOCK 0x10060 -#define SPLL_LOCK 0x10070 -#define VPLL_LOCK 0x10080 -#define MPLL_LOCK 0x10090 -#define CPLL_CON0 0x10120 -#define DPLL_CON0 0x10128 -#define EPLL_CON0 0x10130 -#define EPLL_CON1 0x10134 -#define EPLL_CON2 0x10138 -#define RPLL_CON0 0x10140 -#define RPLL_CON1 0x10144 -#define RPLL_CON2 0x10148 -#define IPLL_CON0 0x10150 -#define SPLL_CON0 0x10160 -#define VPLL_CON0 0x10170 -#define MPLL_CON0 0x10180 -#define SRC_TOP0 0x10200 -#define SRC_TOP1 0x10204 -#define SRC_TOP2 0x10208 -#define SRC_TOP3 0x1020c -#define SRC_TOP4 0x10210 -#define SRC_TOP5 0x10214 -#define SRC_TOP6 0x10218 -#define SRC_TOP7 0x1021c -#define SRC_TOP8 0x10220 /* 5800 specific */ -#define SRC_TOP9 0x10224 /* 5800 specific */ -#define SRC_DISP10 0x1022c -#define SRC_MAU 0x10240 -#define SRC_FSYS 0x10244 -#define SRC_PERIC0 0x10250 -#define SRC_PERIC1 0x10254 -#define SRC_ISP 0x10270 -#define SRC_CAM 0x10274 /* 5800 specific */ -#define SRC_TOP10 0x10280 -#define SRC_TOP11 0x10284 -#define SRC_TOP12 0x10288 -#define SRC_TOP13 0x1028c /* 5800 specific */ -#define SRC_MASK_TOP0 0x10300 -#define SRC_MASK_TOP1 0x10304 -#define SRC_MASK_TOP2 0x10308 -#define SRC_MASK_TOP7 0x1031c -#define SRC_MASK_DISP10 0x1032c -#define SRC_MASK_MAU 0x10334 -#define SRC_MASK_FSYS 0x10340 -#define SRC_MASK_PERIC0 0x10350 -#define SRC_MASK_PERIC1 0x10354 -#define SRC_MASK_ISP 0x10370 -#define DIV_TOP0 0x10500 -#define DIV_TOP1 0x10504 -#define DIV_TOP2 0x10508 -#define DIV_TOP8 0x10520 /* 5800 specific */ -#define DIV_TOP9 0x10524 /* 5800 specific */ -#define DIV_DISP10 0x1052c -#define DIV_MAU 0x10544 -#define DIV_FSYS0 0x10548 -#define DIV_FSYS1 0x1054c -#define DIV_FSYS2 0x10550 -#define DIV_PERIC0 0x10558 -#define DIV_PERIC1 0x1055c -#define DIV_PERIC2 0x10560 -#define DIV_PERIC3 0x10564 -#define DIV_PERIC4 0x10568 -#define DIV_CAM 0x10574 /* 5800 specific */ -#define SCLK_DIV_ISP0 0x10580 -#define SCLK_DIV_ISP1 0x10584 -#define DIV2_RATIO0 0x10590 -#define DIV4_RATIO 0x105a0 -#define GATE_BUS_TOP 0x10700 -#define GATE_BUS_DISP1 0x10728 -#define GATE_BUS_GEN 0x1073c -#define GATE_BUS_FSYS0 0x10740 -#define GATE_BUS_FSYS2 0x10748 -#define GATE_BUS_PERIC 0x10750 -#define GATE_BUS_PERIC1 0x10754 -#define GATE_BUS_PERIS0 0x10760 -#define GATE_BUS_PERIS1 0x10764 -#define GATE_BUS_NOC 0x10770 -#define GATE_TOP_SCLK_ISP 0x10870 -#define GATE_IP_GSCL0 0x10910 -#define GATE_IP_GSCL1 0x10920 -#define GATE_IP_CAM 0x10924 /* 5800 specific */ -#define GATE_IP_MFC 0x1092c -#define GATE_IP_DISP1 0x10928 -#define GATE_IP_G3D 0x10930 -#define GATE_IP_GEN 0x10934 -#define GATE_IP_FSYS 0x10944 -#define GATE_IP_PERIC 0x10950 -#define GATE_IP_PERIS 0x10960 -#define GATE_IP_MSCL 0x10970 -#define GATE_TOP_SCLK_GSCL 0x10820 -#define GATE_TOP_SCLK_DISP1 0x10828 -#define GATE_TOP_SCLK_MAU 0x1083c -#define GATE_TOP_SCLK_FSYS 0x10840 -#define GATE_TOP_SCLK_PERIC 0x10850 -#define TOP_SPARE2 0x10b08 -#define BPLL_LOCK 0x20010 -#define BPLL_CON0 0x20110 -#define SRC_CDREX 0x20200 -#define DIV_CDREX0 0x20500 -#define DIV_CDREX1 0x20504 -#define KPLL_LOCK 0x28000 -#define KPLL_CON0 0x28100 -#define SRC_KFC 0x28200 -#define DIV_KFC0 0x28500 - -/* Exynos5x SoC type */ -enum exynos5x_soc { - EXYNOS5420, - EXYNOS5800, -}; - -/* list of PLLs */ -enum exynos5x_plls { - apll, cpll, dpll, epll, rpll, ipll, spll, vpll, mpll, - bpll, kpll, - nr_plls /* number of PLLs */ -}; - -static void __iomem *reg_base; -static enum exynos5x_soc exynos5x_soc; - -#ifdef CONFIG_PM_SLEEP -static struct samsung_clk_reg_dump *exynos5x_save; -static struct samsung_clk_reg_dump *exynos5800_save; - -/* - * list of controller registers to be saved and restored during a - * suspend/resume cycle. - */ -static const unsigned long exynos5x_clk_regs[] __initconst = { - SRC_CPU, - DIV_CPU0, - DIV_CPU1, - GATE_BUS_CPU, - GATE_SCLK_CPU, - CLKOUT_CMU_CPU, - EPLL_CON0, - EPLL_CON1, - EPLL_CON2, - RPLL_CON0, - RPLL_CON1, - RPLL_CON2, - SRC_TOP0, - SRC_TOP1, - SRC_TOP2, - SRC_TOP3, - SRC_TOP4, - SRC_TOP5, - SRC_TOP6, - SRC_TOP7, - SRC_DISP10, - SRC_MAU, - SRC_FSYS, - SRC_PERIC0, - SRC_PERIC1, - SRC_TOP10, - SRC_TOP11, - SRC_TOP12, - SRC_MASK_TOP2, - SRC_MASK_TOP7, - SRC_MASK_DISP10, - SRC_MASK_FSYS, - SRC_MASK_PERIC0, - SRC_MASK_PERIC1, - SRC_MASK_TOP0, - SRC_MASK_TOP1, - SRC_MASK_MAU, - SRC_MASK_ISP, - SRC_ISP, - DIV_TOP0, - DIV_TOP1, - DIV_TOP2, - DIV_DISP10, - DIV_MAU, - DIV_FSYS0, - DIV_FSYS1, - DIV_FSYS2, - DIV_PERIC0, - DIV_PERIC1, - DIV_PERIC2, - DIV_PERIC3, - DIV_PERIC4, - SCLK_DIV_ISP0, - SCLK_DIV_ISP1, - DIV2_RATIO0, - DIV4_RATIO, - GATE_BUS_DISP1, - GATE_BUS_TOP, - GATE_BUS_GEN, - GATE_BUS_FSYS0, - GATE_BUS_FSYS2, - GATE_BUS_PERIC, - GATE_BUS_PERIC1, - GATE_BUS_PERIS0, - GATE_BUS_PERIS1, - GATE_BUS_NOC, - GATE_TOP_SCLK_ISP, - GATE_IP_GSCL0, - GATE_IP_GSCL1, - GATE_IP_MFC, - GATE_IP_DISP1, - GATE_IP_G3D, - GATE_IP_GEN, - GATE_IP_FSYS, - GATE_IP_PERIC, - GATE_IP_PERIS, - GATE_IP_MSCL, - GATE_TOP_SCLK_GSCL, - GATE_TOP_SCLK_DISP1, - GATE_TOP_SCLK_MAU, - GATE_TOP_SCLK_FSYS, - GATE_TOP_SCLK_PERIC, - TOP_SPARE2, - SRC_CDREX, - DIV_CDREX0, - DIV_CDREX1, - SRC_KFC, - DIV_KFC0, -}; - -static const unsigned long exynos5800_clk_regs[] __initconst = { - SRC_TOP8, - SRC_TOP9, - SRC_CAM, - SRC_TOP1, - DIV_TOP8, - DIV_TOP9, - DIV_CAM, - GATE_IP_CAM, -}; - -static const struct samsung_clk_reg_dump exynos5420_set_clksrc[] = { - { .offset = SRC_MASK_CPERI, .value = 0xffffffff, }, - { .offset = SRC_MASK_TOP0, .value = 0x11111111, }, - { .offset = SRC_MASK_TOP1, .value = 0x11101111, }, - { .offset = SRC_MASK_TOP2, .value = 0x11111110, }, - { .offset = SRC_MASK_TOP7, .value = 0x00111100, }, - { .offset = SRC_MASK_DISP10, .value = 0x11111110, }, - { .offset = SRC_MASK_MAU, .value = 0x10000000, }, - { .offset = SRC_MASK_FSYS, .value = 0x11111110, }, - { .offset = SRC_MASK_PERIC0, .value = 0x11111110, }, - { .offset = SRC_MASK_PERIC1, .value = 0x11111100, }, - { .offset = SRC_MASK_ISP, .value = 0x11111000, }, - { .offset = GATE_BUS_TOP, .value = 0xffffffff, }, - { .offset = GATE_BUS_DISP1, .value = 0xffffffff, }, - { .offset = GATE_IP_PERIC, .value = 0xffffffff, }, -}; - -static int exynos5420_clk_suspend(void) -{ - samsung_clk_save(reg_base, exynos5x_save, - ARRAY_SIZE(exynos5x_clk_regs)); - - if (exynos5x_soc == EXYNOS5800) - samsung_clk_save(reg_base, exynos5800_save, - ARRAY_SIZE(exynos5800_clk_regs)); - - samsung_clk_restore(reg_base, exynos5420_set_clksrc, - ARRAY_SIZE(exynos5420_set_clksrc)); - - return 0; -} - -static void exynos5420_clk_resume(void) -{ - samsung_clk_restore(reg_base, exynos5x_save, - ARRAY_SIZE(exynos5x_clk_regs)); - - if (exynos5x_soc == EXYNOS5800) - samsung_clk_restore(reg_base, exynos5800_save, - ARRAY_SIZE(exynos5800_clk_regs)); -} - -static struct syscore_ops exynos5420_clk_syscore_ops = { - .suspend = exynos5420_clk_suspend, - .resume = exynos5420_clk_resume, -}; - -static void __init exynos5420_clk_sleep_init(void) -{ - exynos5x_save = samsung_clk_alloc_reg_dump(exynos5x_clk_regs, - ARRAY_SIZE(exynos5x_clk_regs)); - if (!exynos5x_save) { - pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", - __func__); - return; - } - - if (exynos5x_soc == EXYNOS5800) { - exynos5800_save = - samsung_clk_alloc_reg_dump(exynos5800_clk_regs, - ARRAY_SIZE(exynos5800_clk_regs)); - if (!exynos5800_save) - goto err_soc; - } - - register_syscore_ops(&exynos5420_clk_syscore_ops); - return; -err_soc: - kfree(exynos5x_save); - pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", - __func__); - return; -} -#else -static void __init exynos5420_clk_sleep_init(void) {} -#endif - -/* list of all parent clocks */ -PNAME(mout_mspll_cpu_p) = {"mout_sclk_cpll", "mout_sclk_dpll", - "mout_sclk_mpll", "mout_sclk_spll"}; -PNAME(mout_cpu_p) = {"mout_apll" , "mout_mspll_cpu"}; -PNAME(mout_kfc_p) = {"mout_kpll" , "mout_mspll_kfc"}; -PNAME(mout_apll_p) = {"fin_pll", "fout_apll"}; -PNAME(mout_bpll_p) = {"fin_pll", "fout_bpll"}; -PNAME(mout_cpll_p) = {"fin_pll", "fout_cpll"}; -PNAME(mout_dpll_p) = {"fin_pll", "fout_dpll"}; -PNAME(mout_epll_p) = {"fin_pll", "fout_epll"}; -PNAME(mout_ipll_p) = {"fin_pll", "fout_ipll"}; -PNAME(mout_kpll_p) = {"fin_pll", "fout_kpll"}; -PNAME(mout_mpll_p) = {"fin_pll", "fout_mpll"}; -PNAME(mout_rpll_p) = {"fin_pll", "fout_rpll"}; -PNAME(mout_spll_p) = {"fin_pll", "fout_spll"}; -PNAME(mout_vpll_p) = {"fin_pll", "fout_vpll"}; - -PNAME(mout_group1_p) = {"mout_sclk_cpll", "mout_sclk_dpll", - "mout_sclk_mpll"}; -PNAME(mout_group2_p) = {"fin_pll", "mout_sclk_cpll", - "mout_sclk_dpll", "mout_sclk_mpll", "mout_sclk_spll", - "mout_sclk_ipll", "mout_sclk_epll", "mout_sclk_rpll"}; -PNAME(mout_group3_p) = {"mout_sclk_rpll", "mout_sclk_spll"}; -PNAME(mout_group4_p) = {"mout_sclk_ipll", "mout_sclk_dpll", "mout_sclk_mpll"}; -PNAME(mout_group5_p) = {"mout_sclk_vpll", "mout_sclk_dpll"}; - -PNAME(mout_fimd1_final_p) = {"mout_fimd1", "mout_fimd1_opt"}; -PNAME(mout_sw_aclk66_p) = {"dout_aclk66", "mout_sclk_spll"}; -PNAME(mout_user_aclk66_peric_p) = { "fin_pll", "mout_sw_aclk66"}; -PNAME(mout_user_pclk66_gpio_p) = {"mout_sw_aclk66", "ff_sw_aclk66"}; - -PNAME(mout_sw_aclk200_fsys_p) = {"dout_aclk200_fsys", "mout_sclk_spll"}; -PNAME(mout_sw_pclk200_fsys_p) = {"dout_pclk200_fsys", "mout_sclk_spll"}; -PNAME(mout_user_pclk200_fsys_p) = {"fin_pll", "mout_sw_pclk200_fsys"}; -PNAME(mout_user_aclk200_fsys_p) = {"fin_pll", "mout_sw_aclk200_fsys"}; - -PNAME(mout_sw_aclk200_fsys2_p) = {"dout_aclk200_fsys2", "mout_sclk_spll"}; -PNAME(mout_user_aclk200_fsys2_p) = {"fin_pll", "mout_sw_aclk200_fsys2"}; -PNAME(mout_sw_aclk100_noc_p) = {"dout_aclk100_noc", "mout_sclk_spll"}; -PNAME(mout_user_aclk100_noc_p) = {"fin_pll", "mout_sw_aclk100_noc"}; - -PNAME(mout_sw_aclk400_wcore_p) = {"dout_aclk400_wcore", "mout_sclk_spll"}; -PNAME(mout_aclk400_wcore_bpll_p) = {"mout_aclk400_wcore", "sclk_bpll"}; -PNAME(mout_user_aclk400_wcore_p) = {"fin_pll", "mout_sw_aclk400_wcore"}; - -PNAME(mout_sw_aclk400_isp_p) = {"dout_aclk400_isp", "mout_sclk_spll"}; -PNAME(mout_user_aclk400_isp_p) = {"fin_pll", "mout_sw_aclk400_isp"}; - -PNAME(mout_sw_aclk333_432_isp0_p) = {"dout_aclk333_432_isp0", - "mout_sclk_spll"}; -PNAME(mout_user_aclk333_432_isp0_p) = {"fin_pll", "mout_sw_aclk333_432_isp0"}; - -PNAME(mout_sw_aclk333_432_isp_p) = {"dout_aclk333_432_isp", "mout_sclk_spll"}; -PNAME(mout_user_aclk333_432_isp_p) = {"fin_pll", "mout_sw_aclk333_432_isp"}; - -PNAME(mout_sw_aclk200_p) = {"dout_aclk200", "mout_sclk_spll"}; -PNAME(mout_user_aclk200_disp1_p) = {"fin_pll", "mout_sw_aclk200"}; - -PNAME(mout_sw_aclk400_mscl_p) = {"dout_aclk400_mscl", "mout_sclk_spll"}; -PNAME(mout_user_aclk400_mscl_p) = {"fin_pll", "mout_sw_aclk400_mscl"}; - -PNAME(mout_sw_aclk333_p) = {"dout_aclk333", "mout_sclk_spll"}; -PNAME(mout_user_aclk333_p) = {"fin_pll", "mout_sw_aclk333"}; - -PNAME(mout_sw_aclk166_p) = {"dout_aclk166", "mout_sclk_spll"}; -PNAME(mout_user_aclk166_p) = {"fin_pll", "mout_sw_aclk166"}; - -PNAME(mout_sw_aclk266_p) = {"dout_aclk266", "mout_sclk_spll"}; -PNAME(mout_user_aclk266_p) = {"fin_pll", "mout_sw_aclk266"}; -PNAME(mout_user_aclk266_isp_p) = {"fin_pll", "mout_sw_aclk266"}; - -PNAME(mout_sw_aclk333_432_gscl_p) = {"dout_aclk333_432_gscl", "mout_sclk_spll"}; -PNAME(mout_user_aclk333_432_gscl_p) = {"fin_pll", "mout_sw_aclk333_432_gscl"}; - -PNAME(mout_sw_aclk300_gscl_p) = {"dout_aclk300_gscl", "mout_sclk_spll"}; -PNAME(mout_user_aclk300_gscl_p) = {"fin_pll", "mout_sw_aclk300_gscl"}; - -PNAME(mout_sw_aclk300_disp1_p) = {"dout_aclk300_disp1", "mout_sclk_spll"}; -PNAME(mout_sw_aclk400_disp1_p) = {"dout_aclk400_disp1", "mout_sclk_spll"}; -PNAME(mout_user_aclk300_disp1_p) = {"fin_pll", "mout_sw_aclk300_disp1"}; -PNAME(mout_user_aclk400_disp1_p) = {"fin_pll", "mout_sw_aclk400_disp1"}; - -PNAME(mout_sw_aclk300_jpeg_p) = {"dout_aclk300_jpeg", "mout_sclk_spll"}; -PNAME(mout_user_aclk300_jpeg_p) = {"fin_pll", "mout_sw_aclk300_jpeg"}; - -PNAME(mout_sw_aclk_g3d_p) = {"dout_aclk_g3d", "mout_sclk_spll"}; -PNAME(mout_user_aclk_g3d_p) = {"fin_pll", "mout_sw_aclk_g3d"}; - -PNAME(mout_sw_aclk266_g2d_p) = {"dout_aclk266_g2d", "mout_sclk_spll"}; -PNAME(mout_user_aclk266_g2d_p) = {"fin_pll", "mout_sw_aclk266_g2d"}; - -PNAME(mout_sw_aclk333_g2d_p) = {"dout_aclk333_g2d", "mout_sclk_spll"}; -PNAME(mout_user_aclk333_g2d_p) = {"fin_pll", "mout_sw_aclk333_g2d"}; - -PNAME(mout_audio0_p) = {"fin_pll", "cdclk0", "mout_sclk_dpll", - "mout_sclk_mpll", "mout_sclk_spll", "mout_sclk_ipll", - "mout_sclk_epll", "mout_sclk_rpll"}; -PNAME(mout_audio1_p) = {"fin_pll", "cdclk1", "mout_sclk_dpll", - "mout_sclk_mpll", "mout_sclk_spll", "mout_sclk_ipll", - "mout_sclk_epll", "mout_sclk_rpll"}; -PNAME(mout_audio2_p) = {"fin_pll", "cdclk2", "mout_sclk_dpll", - "mout_sclk_mpll", "mout_sclk_spll", "mout_sclk_ipll", - "mout_sclk_epll", "mout_sclk_rpll"}; -PNAME(mout_spdif_p) = {"fin_pll", "dout_audio0", "dout_audio1", - "dout_audio2", "spdif_extclk", "mout_sclk_ipll", - "mout_sclk_epll", "mout_sclk_rpll"}; -PNAME(mout_hdmi_p) = {"dout_hdmi_pixel", "sclk_hdmiphy"}; -PNAME(mout_maudio0_p) = {"fin_pll", "maudio_clk", "mout_sclk_dpll", - "mout_sclk_mpll", "mout_sclk_spll", "mout_sclk_ipll", - "mout_sclk_epll", "mout_sclk_rpll"}; -PNAME(mout_mau_epll_clk_p) = {"mout_sclk_epll", "mout_sclk_dpll", - "mout_sclk_mpll", "mout_sclk_spll"}; -PNAME(mout_mclk_cdrex_p) = {"mout_bpll", "mout_mx_mspll_ccore"}; - -/* List of parents specific to exynos5800 */ -PNAME(mout_epll2_5800_p) = { "mout_sclk_epll", "ff_dout_epll2" }; -PNAME(mout_group1_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", - "mout_sclk_mpll", "ff_dout_spll2" }; -PNAME(mout_group2_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", - "mout_sclk_mpll", "ff_dout_spll2", - "mout_epll2", "mout_sclk_ipll" }; -PNAME(mout_group3_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", - "mout_sclk_mpll", "ff_dout_spll2", - "mout_epll2" }; -PNAME(mout_group5_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", - "mout_sclk_mpll", "mout_sclk_spll" }; -PNAME(mout_group6_5800_p) = { "mout_sclk_ipll", "mout_sclk_dpll", - "mout_sclk_mpll", "ff_dout_spll2" }; -PNAME(mout_group7_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", - "mout_sclk_mpll", "mout_sclk_spll", - "mout_epll2", "mout_sclk_ipll" }; -PNAME(mout_mx_mspll_ccore_p) = {"sclk_bpll", "mout_sclk_dpll", - "mout_sclk_mpll", "ff_dout_spll2", - "mout_sclk_spll", "mout_sclk_epll"}; -PNAME(mout_mau_epll_clk_5800_p) = { "mout_sclk_epll", "mout_sclk_dpll", - "mout_sclk_mpll", - "ff_dout_spll2" }; -PNAME(mout_group8_5800_p) = { "dout_aclk432_scaler", "dout_sclk_sw" }; -PNAME(mout_group9_5800_p) = { "dout_osc_div", "mout_sw_aclk432_scaler" }; -PNAME(mout_group10_5800_p) = { "dout_aclk432_cam", "dout_sclk_sw" }; -PNAME(mout_group11_5800_p) = { "dout_osc_div", "mout_sw_aclk432_cam" }; -PNAME(mout_group12_5800_p) = { "dout_aclkfl1_550_cam", "dout_sclk_sw" }; -PNAME(mout_group13_5800_p) = { "dout_osc_div", "mout_sw_aclkfl1_550_cam" }; -PNAME(mout_group14_5800_p) = { "dout_aclk550_cam", "dout_sclk_sw" }; -PNAME(mout_group15_5800_p) = { "dout_osc_div", "mout_sw_aclk550_cam" }; - -/* fixed rate clocks generated outside the soc */ -static struct samsung_fixed_rate_clock - exynos5x_fixed_rate_ext_clks[] __initdata = { - FRATE(CLK_FIN_PLL, "fin_pll", NULL, 0, 0), -}; - -/* fixed rate clocks generated inside the soc */ -static const struct samsung_fixed_rate_clock exynos5x_fixed_rate_clks[] __initconst = { - FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", NULL, 0, 24000000), - FRATE(0, "sclk_pwi", NULL, 0, 24000000), - FRATE(0, "sclk_usbh20", NULL, 0, 48000000), - FRATE(0, "mphy_refclk_ixtal24", NULL, 0, 48000000), - FRATE(0, "sclk_usbh20_scan_clk", NULL, 0, 480000000), -}; - -static const struct samsung_fixed_factor_clock - exynos5x_fixed_factor_clks[] __initconst = { - FFACTOR(0, "ff_hsic_12m", "fin_pll", 1, 2, 0), - FFACTOR(0, "ff_sw_aclk66", "mout_sw_aclk66", 1, 2, 0), -}; - -static const struct samsung_fixed_factor_clock - exynos5800_fixed_factor_clks[] __initconst = { - FFACTOR(0, "ff_dout_epll2", "mout_sclk_epll", 1, 2, 0), - FFACTOR(0, "ff_dout_spll2", "mout_sclk_spll", 1, 2, 0), -}; - -static const struct samsung_mux_clock exynos5800_mux_clks[] __initconst = { - MUX(0, "mout_aclk400_isp", mout_group3_5800_p, SRC_TOP0, 0, 3), - MUX(0, "mout_aclk400_mscl", mout_group3_5800_p, SRC_TOP0, 4, 3), - MUX(0, "mout_aclk400_wcore", mout_group2_5800_p, SRC_TOP0, 16, 3), - MUX(0, "mout_aclk100_noc", mout_group1_5800_p, SRC_TOP0, 20, 2), - - MUX(0, "mout_aclk333_432_gscl", mout_group6_5800_p, SRC_TOP1, 0, 2), - MUX(0, "mout_aclk333_432_isp", mout_group6_5800_p, SRC_TOP1, 4, 2), - MUX(0, "mout_aclk333_432_isp0", mout_group6_5800_p, SRC_TOP1, 12, 2), - MUX(0, "mout_aclk266", mout_group5_5800_p, SRC_TOP1, 20, 2), - MUX(0, "mout_aclk333", mout_group1_5800_p, SRC_TOP1, 28, 2), - - MUX(0, "mout_aclk400_disp1", mout_group7_5800_p, SRC_TOP2, 4, 3), - MUX(0, "mout_aclk333_g2d", mout_group5_5800_p, SRC_TOP2, 8, 2), - MUX(0, "mout_aclk266_g2d", mout_group5_5800_p, SRC_TOP2, 12, 2), - MUX(0, "mout_aclk300_jpeg", mout_group5_5800_p, SRC_TOP2, 20, 2), - MUX(0, "mout_aclk300_disp1", mout_group5_5800_p, SRC_TOP2, 24, 2), - MUX(0, "mout_aclk300_gscl", mout_group5_5800_p, SRC_TOP2, 28, 2), - - MUX(CLK_MOUT_MX_MSPLL_CCORE, "mout_mx_mspll_ccore", - mout_mx_mspll_ccore_p, SRC_TOP7, 16, 2), - MUX(0, "mout_mau_epll_clk", mout_mau_epll_clk_5800_p, SRC_TOP7, - 20, 2), - MUX(0, "sclk_bpll", mout_bpll_p, SRC_TOP7, 24, 1), - MUX(0, "mout_epll2", mout_epll2_5800_p, SRC_TOP7, 28, 1), - - MUX(0, "mout_aclk550_cam", mout_group3_5800_p, SRC_TOP8, 16, 3), - MUX(0, "mout_aclkfl1_550_cam", mout_group3_5800_p, SRC_TOP8, 20, 3), - MUX(0, "mout_aclk432_cam", mout_group6_5800_p, SRC_TOP8, 24, 2), - MUX(0, "mout_aclk432_scaler", mout_group6_5800_p, SRC_TOP8, 28, 2), - - MUX(0, "mout_user_aclk550_cam", mout_group15_5800_p, - SRC_TOP9, 16, 1), - MUX(0, "mout_user_aclkfl1_550_cam", mout_group13_5800_p, - SRC_TOP9, 20, 1), - MUX(0, "mout_user_aclk432_cam", mout_group11_5800_p, - SRC_TOP9, 24, 1), - MUX(0, "mout_user_aclk432_scaler", mout_group9_5800_p, - SRC_TOP9, 28, 1), - - MUX(0, "mout_sw_aclk550_cam", mout_group14_5800_p, SRC_TOP13, 16, 1), - MUX(0, "mout_sw_aclkfl1_550_cam", mout_group12_5800_p, - SRC_TOP13, 20, 1), - MUX(0, "mout_sw_aclk432_cam", mout_group10_5800_p, - SRC_TOP13, 24, 1), - MUX(0, "mout_sw_aclk432_scaler", mout_group8_5800_p, - SRC_TOP13, 28, 1), - - MUX(0, "mout_fimd1", mout_group2_p, SRC_DISP10, 4, 3), -}; - -static const struct samsung_div_clock exynos5800_div_clks[] __initconst = { - DIV(CLK_DOUT_ACLK400_WCORE, "dout_aclk400_wcore", - "mout_aclk400_wcore", DIV_TOP0, 16, 3), - DIV(0, "dout_aclk550_cam", "mout_aclk550_cam", - DIV_TOP8, 16, 3), - DIV(0, "dout_aclkfl1_550_cam", "mout_aclkfl1_550_cam", - DIV_TOP8, 20, 3), - DIV(0, "dout_aclk432_cam", "mout_aclk432_cam", - DIV_TOP8, 24, 3), - DIV(0, "dout_aclk432_scaler", "mout_aclk432_scaler", - DIV_TOP8, 28, 3), - - DIV(0, "dout_osc_div", "fin_pll", DIV_TOP9, 20, 3), - DIV(0, "dout_sclk_sw", "sclk_spll", DIV_TOP9, 24, 6), -}; - -static const struct samsung_gate_clock exynos5800_gate_clks[] __initconst = { - GATE(CLK_ACLK550_CAM, "aclk550_cam", "mout_user_aclk550_cam", - GATE_BUS_TOP, 24, 0, 0), - GATE(CLK_ACLK432_SCALER, "aclk432_scaler", "mout_user_aclk432_scaler", - GATE_BUS_TOP, 27, 0, 0), -}; - -static const struct samsung_mux_clock exynos5420_mux_clks[] __initconst = { - MUX(0, "sclk_bpll", mout_bpll_p, TOP_SPARE2, 0, 1), - MUX(0, "mout_aclk400_wcore_bpll", mout_aclk400_wcore_bpll_p, - TOP_SPARE2, 4, 1), - - MUX(0, "mout_aclk400_isp", mout_group1_p, SRC_TOP0, 0, 2), - MUX_A(0, "mout_aclk400_mscl", mout_group1_p, - SRC_TOP0, 4, 2, "aclk400_mscl"), - MUX(0, "mout_aclk400_wcore", mout_group1_p, SRC_TOP0, 16, 2), - MUX(0, "mout_aclk100_noc", mout_group1_p, SRC_TOP0, 20, 2), - - MUX(0, "mout_aclk333_432_gscl", mout_group4_p, SRC_TOP1, 0, 2), - MUX(0, "mout_aclk333_432_isp", mout_group4_p, - SRC_TOP1, 4, 2), - MUX(0, "mout_aclk333_432_isp0", mout_group4_p, SRC_TOP1, 12, 2), - MUX(0, "mout_aclk266", mout_group1_p, SRC_TOP1, 20, 2), - MUX(0, "mout_aclk333", mout_group1_p, SRC_TOP1, 28, 2), - - MUX(0, "mout_aclk400_disp1", mout_group1_p, SRC_TOP2, 4, 2), - MUX(0, "mout_aclk333_g2d", mout_group1_p, SRC_TOP2, 8, 2), - MUX(0, "mout_aclk266_g2d", mout_group1_p, SRC_TOP2, 12, 2), - MUX(0, "mout_aclk300_jpeg", mout_group1_p, SRC_TOP2, 20, 2), - MUX(0, "mout_aclk300_disp1", mout_group1_p, SRC_TOP2, 24, 2), - MUX(0, "mout_aclk300_gscl", mout_group1_p, SRC_TOP2, 28, 2), - - MUX(CLK_MOUT_MX_MSPLL_CCORE, "mout_mx_mspll_ccore", - mout_group5_5800_p, SRC_TOP7, 16, 2), - MUX(0, "mout_mau_epll_clk", mout_mau_epll_clk_p, SRC_TOP7, 20, 2), - - MUX(0, "mout_fimd1", mout_group3_p, SRC_DISP10, 4, 1), -}; - -static const struct samsung_div_clock exynos5420_div_clks[] __initconst = { - DIV(CLK_DOUT_ACLK400_WCORE, "dout_aclk400_wcore", - "mout_aclk400_wcore_bpll", DIV_TOP0, 16, 3), -}; - -static const struct samsung_mux_clock exynos5x_mux_clks[] __initconst = { - MUX(0, "mout_user_pclk66_gpio", mout_user_pclk66_gpio_p, - SRC_TOP7, 4, 1), - MUX(0, "mout_mspll_kfc", mout_mspll_cpu_p, SRC_TOP7, 8, 2), - MUX(0, "mout_mspll_cpu", mout_mspll_cpu_p, SRC_TOP7, 12, 2), - - MUX_F(0, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, - CLK_SET_RATE_PARENT | CLK_RECALC_NEW_RATES, 0), - MUX(0, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1), - MUX_F(0, "mout_kpll", mout_kpll_p, SRC_KFC, 0, 1, - CLK_SET_RATE_PARENT | CLK_RECALC_NEW_RATES, 0), - MUX(0, "mout_kfc", mout_kfc_p, SRC_KFC, 16, 1), - - MUX(0, "mout_aclk200", mout_group1_p, SRC_TOP0, 8, 2), - MUX(0, "mout_aclk200_fsys2", mout_group1_p, SRC_TOP0, 12, 2), - MUX(0, "mout_pclk200_fsys", mout_group1_p, SRC_TOP0, 24, 2), - MUX(0, "mout_aclk200_fsys", mout_group1_p, SRC_TOP0, 28, 2), - - MUX(0, "mout_aclk66", mout_group1_p, SRC_TOP1, 8, 2), - MUX(0, "mout_aclk166", mout_group1_p, SRC_TOP1, 24, 2), - - MUX(0, "mout_aclk_g3d", mout_group5_p, SRC_TOP2, 16, 1), - - MUX(0, "mout_user_aclk400_isp", mout_user_aclk400_isp_p, - SRC_TOP3, 0, 1), - MUX(0, "mout_user_aclk400_mscl", mout_user_aclk400_mscl_p, - SRC_TOP3, 4, 1), - MUX(CLK_MOUT_USER_ACLK200_DISP1, "mout_user_aclk200_disp1", - mout_user_aclk200_disp1_p, SRC_TOP3, 8, 1), - MUX(0, "mout_user_aclk200_fsys2", mout_user_aclk200_fsys2_p, - SRC_TOP3, 12, 1), - MUX(0, "mout_user_aclk400_wcore", mout_user_aclk400_wcore_p, - SRC_TOP3, 16, 1), - MUX(0, "mout_user_aclk100_noc", mout_user_aclk100_noc_p, - SRC_TOP3, 20, 1), - MUX(0, "mout_user_pclk200_fsys", mout_user_pclk200_fsys_p, - SRC_TOP3, 24, 1), - MUX(0, "mout_user_aclk200_fsys", mout_user_aclk200_fsys_p, - SRC_TOP3, 28, 1), - - MUX(0, "mout_user_aclk333_432_gscl", mout_user_aclk333_432_gscl_p, - SRC_TOP4, 0, 1), - MUX(0, "mout_user_aclk333_432_isp", mout_user_aclk333_432_isp_p, - SRC_TOP4, 4, 1), - MUX(0, "mout_user_aclk66_peric", mout_user_aclk66_peric_p, - SRC_TOP4, 8, 1), - MUX(0, "mout_user_aclk333_432_isp0", mout_user_aclk333_432_isp0_p, - SRC_TOP4, 12, 1), - MUX(0, "mout_user_aclk266_isp", mout_user_aclk266_isp_p, - SRC_TOP4, 16, 1), - MUX(0, "mout_user_aclk266", mout_user_aclk266_p, SRC_TOP4, 20, 1), - MUX(0, "mout_user_aclk166", mout_user_aclk166_p, SRC_TOP4, 24, 1), - MUX(CLK_MOUT_USER_ACLK333, "mout_user_aclk333", mout_user_aclk333_p, - SRC_TOP4, 28, 1), - - MUX(CLK_MOUT_USER_ACLK400_DISP1, "mout_user_aclk400_disp1", - mout_user_aclk400_disp1_p, SRC_TOP5, 0, 1), - MUX(0, "mout_user_aclk66_psgen", mout_user_aclk66_peric_p, - SRC_TOP5, 4, 1), - MUX(0, "mout_user_aclk333_g2d", mout_user_aclk333_g2d_p, - SRC_TOP5, 8, 1), - MUX(0, "mout_user_aclk266_g2d", mout_user_aclk266_g2d_p, - SRC_TOP5, 12, 1), - MUX(CLK_MOUT_G3D, "mout_user_aclk_g3d", mout_user_aclk_g3d_p, - SRC_TOP5, 16, 1), - MUX(0, "mout_user_aclk300_jpeg", mout_user_aclk300_jpeg_p, - SRC_TOP5, 20, 1), - MUX(CLK_MOUT_USER_ACLK300_DISP1, "mout_user_aclk300_disp1", - mout_user_aclk300_disp1_p, SRC_TOP5, 24, 1), - MUX(CLK_MOUT_USER_ACLK300_GSCL, "mout_user_aclk300_gscl", - mout_user_aclk300_gscl_p, SRC_TOP5, 28, 1), - - MUX(0, "mout_sclk_mpll", mout_mpll_p, SRC_TOP6, 0, 1), - MUX(CLK_MOUT_VPLL, "mout_sclk_vpll", mout_vpll_p, SRC_TOP6, 4, 1), - MUX(0, "mout_sclk_spll", mout_spll_p, SRC_TOP6, 8, 1), - MUX(0, "mout_sclk_ipll", mout_ipll_p, SRC_TOP6, 12, 1), - MUX(0, "mout_sclk_rpll", mout_rpll_p, SRC_TOP6, 16, 1), - MUX(0, "mout_sclk_epll", mout_epll_p, SRC_TOP6, 20, 1), - MUX(0, "mout_sclk_dpll", mout_dpll_p, SRC_TOP6, 24, 1), - MUX(0, "mout_sclk_cpll", mout_cpll_p, SRC_TOP6, 28, 1), - - MUX(0, "mout_sw_aclk400_isp", mout_sw_aclk400_isp_p, - SRC_TOP10, 0, 1), - MUX(0, "mout_sw_aclk400_mscl", mout_sw_aclk400_mscl_p, - SRC_TOP10, 4, 1), - MUX(CLK_MOUT_SW_ACLK200, "mout_sw_aclk200", mout_sw_aclk200_p, - SRC_TOP10, 8, 1), - MUX(0, "mout_sw_aclk200_fsys2", mout_sw_aclk200_fsys2_p, - SRC_TOP10, 12, 1), - MUX(0, "mout_sw_aclk400_wcore", mout_sw_aclk400_wcore_p, - SRC_TOP10, 16, 1), - MUX(0, "mout_sw_aclk100_noc", mout_sw_aclk100_noc_p, - SRC_TOP10, 20, 1), - MUX(0, "mout_sw_pclk200_fsys", mout_sw_pclk200_fsys_p, - SRC_TOP10, 24, 1), - MUX(0, "mout_sw_aclk200_fsys", mout_sw_aclk200_fsys_p, - SRC_TOP10, 28, 1), - - MUX(0, "mout_sw_aclk333_432_gscl", mout_sw_aclk333_432_gscl_p, - SRC_TOP11, 0, 1), - MUX(0, "mout_sw_aclk333_432_isp", mout_sw_aclk333_432_isp_p, - SRC_TOP11, 4, 1), - MUX(0, "mout_sw_aclk66", mout_sw_aclk66_p, SRC_TOP11, 8, 1), - MUX(0, "mout_sw_aclk333_432_isp0", mout_sw_aclk333_432_isp0_p, - SRC_TOP11, 12, 1), - MUX(0, "mout_sw_aclk266", mout_sw_aclk266_p, SRC_TOP11, 20, 1), - MUX(0, "mout_sw_aclk166", mout_sw_aclk166_p, SRC_TOP11, 24, 1), - MUX(CLK_MOUT_SW_ACLK333, "mout_sw_aclk333", mout_sw_aclk333_p, - SRC_TOP11, 28, 1), - - MUX(CLK_MOUT_SW_ACLK400, "mout_sw_aclk400_disp1", - mout_sw_aclk400_disp1_p, SRC_TOP12, 4, 1), - MUX(0, "mout_sw_aclk333_g2d", mout_sw_aclk333_g2d_p, - SRC_TOP12, 8, 1), - MUX(0, "mout_sw_aclk266_g2d", mout_sw_aclk266_g2d_p, - SRC_TOP12, 12, 1), - MUX(0, "mout_sw_aclk_g3d", mout_sw_aclk_g3d_p, SRC_TOP12, 16, 1), - MUX(0, "mout_sw_aclk300_jpeg", mout_sw_aclk300_jpeg_p, - SRC_TOP12, 20, 1), - MUX(CLK_MOUT_SW_ACLK300, "mout_sw_aclk300_disp1", - mout_sw_aclk300_disp1_p, SRC_TOP12, 24, 1), - MUX(CLK_MOUT_SW_ACLK300_GSCL, "mout_sw_aclk300_gscl", - mout_sw_aclk300_gscl_p, SRC_TOP12, 28, 1), - - /* DISP1 Block */ - MUX(0, "mout_mipi1", mout_group2_p, SRC_DISP10, 16, 3), - MUX(0, "mout_dp1", mout_group2_p, SRC_DISP10, 20, 3), - MUX(0, "mout_pixel", mout_group2_p, SRC_DISP10, 24, 3), - MUX(CLK_MOUT_HDMI, "mout_hdmi", mout_hdmi_p, SRC_DISP10, 28, 1), - MUX(0, "mout_fimd1_opt", mout_group2_p, SRC_DISP10, 8, 3), - - MUX(0, "mout_fimd1_final", mout_fimd1_final_p, TOP_SPARE2, 8, 1), - - /* CDREX block */ - MUX_F(CLK_MOUT_MCLK_CDREX, "mout_mclk_cdrex", mout_mclk_cdrex_p, - SRC_CDREX, 4, 1, CLK_SET_RATE_PARENT, 0), - MUX_F(CLK_MOUT_BPLL, "mout_bpll", mout_bpll_p, SRC_CDREX, 0, 1, - CLK_SET_RATE_PARENT, 0), - - /* MAU Block */ - MUX(CLK_MOUT_MAUDIO0, "mout_maudio0", mout_maudio0_p, SRC_MAU, 28, 3), - - /* FSYS Block */ - MUX(0, "mout_usbd301", mout_group2_p, SRC_FSYS, 4, 3), - MUX(0, "mout_mmc0", mout_group2_p, SRC_FSYS, 8, 3), - MUX(0, "mout_mmc1", mout_group2_p, SRC_FSYS, 12, 3), - MUX(0, "mout_mmc2", mout_group2_p, SRC_FSYS, 16, 3), - MUX(0, "mout_usbd300", mout_group2_p, SRC_FSYS, 20, 3), - MUX(0, "mout_unipro", mout_group2_p, SRC_FSYS, 24, 3), - MUX(0, "mout_mphy_refclk", mout_group2_p, SRC_FSYS, 28, 3), - - /* PERIC Block */ - MUX(0, "mout_uart0", mout_group2_p, SRC_PERIC0, 4, 3), - MUX(0, "mout_uart1", mout_group2_p, SRC_PERIC0, 8, 3), - MUX(0, "mout_uart2", mout_group2_p, SRC_PERIC0, 12, 3), - MUX(0, "mout_uart3", mout_group2_p, SRC_PERIC0, 16, 3), - MUX(0, "mout_pwm", mout_group2_p, SRC_PERIC0, 24, 3), - MUX(0, "mout_spdif", mout_spdif_p, SRC_PERIC0, 28, 3), - MUX(0, "mout_audio0", mout_audio0_p, SRC_PERIC1, 8, 3), - MUX(0, "mout_audio1", mout_audio1_p, SRC_PERIC1, 12, 3), - MUX(0, "mout_audio2", mout_audio2_p, SRC_PERIC1, 16, 3), - MUX(0, "mout_spi0", mout_group2_p, SRC_PERIC1, 20, 3), - MUX(0, "mout_spi1", mout_group2_p, SRC_PERIC1, 24, 3), - MUX(0, "mout_spi2", mout_group2_p, SRC_PERIC1, 28, 3), - - /* ISP Block */ - MUX(0, "mout_pwm_isp", mout_group2_p, SRC_ISP, 24, 3), - MUX(0, "mout_uart_isp", mout_group2_p, SRC_ISP, 20, 3), - MUX(0, "mout_spi0_isp", mout_group2_p, SRC_ISP, 12, 3), - MUX(0, "mout_spi1_isp", mout_group2_p, SRC_ISP, 16, 3), - MUX(0, "mout_isp_sensor", mout_group2_p, SRC_ISP, 28, 3), -}; - -static const struct samsung_div_clock exynos5x_div_clks[] __initconst = { - DIV(0, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), - DIV(0, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), - DIV(0, "armclk2", "div_arm", DIV_CPU0, 28, 3), - DIV(0, "div_kfc", "mout_kfc", DIV_KFC0, 0, 3), - DIV(0, "sclk_kpll", "mout_kpll", DIV_KFC0, 24, 3), - - DIV(CLK_DOUT_ACLK400_ISP, "dout_aclk400_isp", "mout_aclk400_isp", - DIV_TOP0, 0, 3), - DIV(CLK_DOUT_ACLK400_MSCL, "dout_aclk400_mscl", "mout_aclk400_mscl", - DIV_TOP0, 4, 3), - DIV(CLK_DOUT_ACLK200, "dout_aclk200", "mout_aclk200", - DIV_TOP0, 8, 3), - DIV(CLK_DOUT_ACLK200_FSYS2, "dout_aclk200_fsys2", "mout_aclk200_fsys2", - DIV_TOP0, 12, 3), - DIV(CLK_DOUT_ACLK100_NOC, "dout_aclk100_noc", "mout_aclk100_noc", - DIV_TOP0, 20, 3), - DIV(CLK_DOUT_PCLK200_FSYS, "dout_pclk200_fsys", "mout_pclk200_fsys", - DIV_TOP0, 24, 3), - DIV(CLK_DOUT_ACLK200_FSYS, "dout_aclk200_fsys", "mout_aclk200_fsys", - DIV_TOP0, 28, 3), - DIV(CLK_DOUT_ACLK333_432_GSCL, "dout_aclk333_432_gscl", - "mout_aclk333_432_gscl", DIV_TOP1, 0, 3), - DIV(CLK_DOUT_ACLK333_432_ISP, "dout_aclk333_432_isp", - "mout_aclk333_432_isp", DIV_TOP1, 4, 3), - DIV(CLK_DOUT_ACLK66, "dout_aclk66", "mout_aclk66", - DIV_TOP1, 8, 6), - DIV(CLK_DOUT_ACLK333_432_ISP0, "dout_aclk333_432_isp0", - "mout_aclk333_432_isp0", DIV_TOP1, 16, 3), - DIV(CLK_DOUT_ACLK266, "dout_aclk266", "mout_aclk266", - DIV_TOP1, 20, 3), - DIV(CLK_DOUT_ACLK166, "dout_aclk166", "mout_aclk166", - DIV_TOP1, 24, 3), - DIV(CLK_DOUT_ACLK333, "dout_aclk333", "mout_aclk333", - DIV_TOP1, 28, 3), - - DIV(CLK_DOUT_ACLK333_G2D, "dout_aclk333_g2d", "mout_aclk333_g2d", - DIV_TOP2, 8, 3), - DIV(CLK_DOUT_ACLK266_G2D, "dout_aclk266_g2d", "mout_aclk266_g2d", - DIV_TOP2, 12, 3), - DIV(CLK_DOUT_ACLK_G3D, "dout_aclk_g3d", "mout_aclk_g3d", DIV_TOP2, - 16, 3), - DIV(CLK_DOUT_ACLK300_JPEG, "dout_aclk300_jpeg", "mout_aclk300_jpeg", - DIV_TOP2, 20, 3), - DIV(CLK_DOUT_ACLK300_DISP1, "dout_aclk300_disp1", - "mout_aclk300_disp1", DIV_TOP2, 24, 3), - DIV(CLK_DOUT_ACLK300_GSCL, "dout_aclk300_gscl", "mout_aclk300_gscl", - DIV_TOP2, 28, 3), - - /* DISP1 Block */ - DIV(0, "dout_fimd1", "mout_fimd1_final", DIV_DISP10, 0, 4), - DIV(0, "dout_mipi1", "mout_mipi1", DIV_DISP10, 16, 8), - DIV(0, "dout_dp1", "mout_dp1", DIV_DISP10, 24, 4), - DIV(CLK_DOUT_PIXEL, "dout_hdmi_pixel", "mout_pixel", DIV_DISP10, 28, 4), - DIV(0, "dout_disp1_blk", "aclk200_disp1", DIV2_RATIO0, 16, 2), - DIV(CLK_DOUT_ACLK400_DISP1, "dout_aclk400_disp1", - "mout_aclk400_disp1", DIV_TOP2, 4, 3), - - /* CDREX Block */ - DIV(CLK_DOUT_PCLK_CDREX, "dout_pclk_cdrex", "dout_aclk_cdrex1", - DIV_CDREX0, 28, 3), - DIV_F(CLK_DOUT_SCLK_CDREX, "dout_sclk_cdrex", "mout_mclk_cdrex", - DIV_CDREX0, 24, 3, CLK_SET_RATE_PARENT, 0), - DIV(CLK_DOUT_ACLK_CDREX1, "dout_aclk_cdrex1", "dout_clk2x_phy0", - DIV_CDREX0, 16, 3), - DIV(CLK_DOUT_CCLK_DREX0, "dout_cclk_drex0", "dout_clk2x_phy0", - DIV_CDREX0, 8, 3), - DIV(CLK_DOUT_CLK2X_PHY0, "dout_clk2x_phy0", "dout_sclk_cdrex", - DIV_CDREX0, 3, 5), - - DIV(CLK_DOUT_PCLK_CORE_MEM, "dout_pclk_core_mem", "mout_mclk_cdrex", - DIV_CDREX1, 8, 3), - - /* Audio Block */ - DIV(0, "dout_maudio0", "mout_maudio0", DIV_MAU, 20, 4), - DIV(0, "dout_maupcm0", "dout_maudio0", DIV_MAU, 24, 8), - - /* USB3.0 */ - DIV(0, "dout_usbphy301", "mout_usbd301", DIV_FSYS0, 12, 4), - DIV(0, "dout_usbphy300", "mout_usbd300", DIV_FSYS0, 16, 4), - DIV(0, "dout_usbd301", "mout_usbd301", DIV_FSYS0, 20, 4), - DIV(0, "dout_usbd300", "mout_usbd300", DIV_FSYS0, 24, 4), - - /* MMC */ - DIV(0, "dout_mmc0", "mout_mmc0", DIV_FSYS1, 0, 10), - DIV(0, "dout_mmc1", "mout_mmc1", DIV_FSYS1, 10, 10), - DIV(0, "dout_mmc2", "mout_mmc2", DIV_FSYS1, 20, 10), - - DIV(0, "dout_unipro", "mout_unipro", DIV_FSYS2, 24, 8), - DIV(0, "dout_mphy_refclk", "mout_mphy_refclk", DIV_FSYS2, 16, 8), - - /* UART and PWM */ - DIV(0, "dout_uart0", "mout_uart0", DIV_PERIC0, 8, 4), - DIV(0, "dout_uart1", "mout_uart1", DIV_PERIC0, 12, 4), - DIV(0, "dout_uart2", "mout_uart2", DIV_PERIC0, 16, 4), - DIV(0, "dout_uart3", "mout_uart3", DIV_PERIC0, 20, 4), - DIV(0, "dout_pwm", "mout_pwm", DIV_PERIC0, 28, 4), - - /* SPI */ - DIV(0, "dout_spi0", "mout_spi0", DIV_PERIC1, 20, 4), - DIV(0, "dout_spi1", "mout_spi1", DIV_PERIC1, 24, 4), - DIV(0, "dout_spi2", "mout_spi2", DIV_PERIC1, 28, 4), - - /* Mfc Block */ - DIV(0, "dout_mfc_blk", "mout_user_aclk333", DIV4_RATIO, 0, 2), - - /* PCM */ - DIV(0, "dout_pcm1", "dout_audio1", DIV_PERIC2, 16, 8), - DIV(0, "dout_pcm2", "dout_audio2", DIV_PERIC2, 24, 8), - - /* Audio - I2S */ - DIV(0, "dout_i2s1", "dout_audio1", DIV_PERIC3, 6, 6), - DIV(0, "dout_i2s2", "dout_audio2", DIV_PERIC3, 12, 6), - DIV(0, "dout_audio0", "mout_audio0", DIV_PERIC3, 20, 4), - DIV(0, "dout_audio1", "mout_audio1", DIV_PERIC3, 24, 4), - DIV(0, "dout_audio2", "mout_audio2", DIV_PERIC3, 28, 4), - - /* SPI Pre-Ratio */ - DIV(0, "dout_spi0_pre", "dout_spi0", DIV_PERIC4, 8, 8), - DIV(0, "dout_spi1_pre", "dout_spi1", DIV_PERIC4, 16, 8), - DIV(0, "dout_spi2_pre", "dout_spi2", DIV_PERIC4, 24, 8), - - /* GSCL Block */ - DIV(0, "dout_gscl_blk_300", "mout_user_aclk300_gscl", - DIV2_RATIO0, 4, 2), - DIV(0, "dout_gscl_blk_333", "aclk333_432_gscl", DIV2_RATIO0, 6, 2), - - /* MSCL Block */ - DIV(0, "dout_mscl_blk", "aclk400_mscl", DIV2_RATIO0, 28, 2), - - /* PSGEN */ - DIV(0, "dout_gen_blk", "mout_user_aclk266", DIV2_RATIO0, 8, 1), - DIV(0, "dout_jpg_blk", "aclk166", DIV2_RATIO0, 20, 1), - - /* ISP Block */ - DIV(0, "dout_isp_sensor0", "mout_isp_sensor", SCLK_DIV_ISP0, 8, 8), - DIV(0, "dout_isp_sensor1", "mout_isp_sensor", SCLK_DIV_ISP0, 16, 8), - DIV(0, "dout_isp_sensor2", "mout_isp_sensor", SCLK_DIV_ISP0, 24, 8), - DIV(0, "dout_pwm_isp", "mout_pwm_isp", SCLK_DIV_ISP1, 28, 4), - DIV(0, "dout_uart_isp", "mout_uart_isp", SCLK_DIV_ISP1, 24, 4), - DIV(0, "dout_spi0_isp", "mout_spi0_isp", SCLK_DIV_ISP1, 16, 4), - DIV(0, "dout_spi1_isp", "mout_spi1_isp", SCLK_DIV_ISP1, 20, 4), - DIV_F(0, "dout_spi0_isp_pre", "dout_spi0_isp", SCLK_DIV_ISP1, 0, 8, - CLK_SET_RATE_PARENT, 0), - DIV_F(0, "dout_spi1_isp_pre", "dout_spi1_isp", SCLK_DIV_ISP1, 8, 8, - CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = { - /* G2D */ - GATE(CLK_MDMA0, "mdma0", "aclk266_g2d", GATE_IP_G2D, 1, 0, 0), - GATE(CLK_SSS, "sss", "aclk266_g2d", GATE_IP_G2D, 2, 0, 0), - GATE(CLK_G2D, "g2d", "aclk333_g2d", GATE_IP_G2D, 3, 0, 0), - GATE(CLK_SMMU_MDMA0, "smmu_mdma0", "aclk266_g2d", GATE_IP_G2D, 5, 0, 0), - GATE(CLK_SMMU_G2D, "smmu_g2d", "aclk333_g2d", GATE_IP_G2D, 7, 0, 0), - - GATE(0, "aclk200_fsys", "mout_user_aclk200_fsys", - GATE_BUS_FSYS0, 9, CLK_IGNORE_UNUSED, 0), - GATE(0, "aclk200_fsys2", "mout_user_aclk200_fsys2", - GATE_BUS_FSYS0, 10, CLK_IGNORE_UNUSED, 0), - - GATE(0, "aclk333_g2d", "mout_user_aclk333_g2d", - GATE_BUS_TOP, 0, CLK_IGNORE_UNUSED, 0), - GATE(0, "aclk266_g2d", "mout_user_aclk266_g2d", - GATE_BUS_TOP, 1, CLK_IGNORE_UNUSED, 0), - GATE(0, "aclk300_jpeg", "mout_user_aclk300_jpeg", - GATE_BUS_TOP, 4, CLK_IGNORE_UNUSED, 0), - GATE(0, "aclk333_432_isp0", "mout_user_aclk333_432_isp0", - GATE_BUS_TOP, 5, 0, 0), - GATE(0, "aclk300_gscl", "mout_user_aclk300_gscl", - GATE_BUS_TOP, 6, CLK_IGNORE_UNUSED, 0), - GATE(0, "aclk333_432_gscl", "mout_user_aclk333_432_gscl", - GATE_BUS_TOP, 7, CLK_IGNORE_UNUSED, 0), - GATE(0, "aclk333_432_isp", "mout_user_aclk333_432_isp", - GATE_BUS_TOP, 8, 0, 0), - GATE(CLK_PCLK66_GPIO, "pclk66_gpio", "mout_user_pclk66_gpio", - GATE_BUS_TOP, 9, CLK_IGNORE_UNUSED, 0), - GATE(0, "aclk66_psgen", "mout_user_aclk66_psgen", - GATE_BUS_TOP, 10, CLK_IGNORE_UNUSED, 0), - GATE(0, "aclk266_isp", "mout_user_aclk266_isp", - GATE_BUS_TOP, 13, 0, 0), - GATE(0, "aclk166", "mout_user_aclk166", - GATE_BUS_TOP, 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK333, "aclk333", "mout_user_aclk333", - GATE_BUS_TOP, 15, CLK_IGNORE_UNUSED, 0), - GATE(0, "aclk400_isp", "mout_user_aclk400_isp", - GATE_BUS_TOP, 16, 0, 0), - GATE(0, "aclk400_mscl", "mout_user_aclk400_mscl", - GATE_BUS_TOP, 17, 0, 0), - GATE(0, "aclk200_disp1", "mout_user_aclk200_disp1", - GATE_BUS_TOP, 18, 0, 0), - GATE(CLK_SCLK_MPHY_IXTAL24, "sclk_mphy_ixtal24", "mphy_refclk_ixtal24", - GATE_BUS_TOP, 28, 0, 0), - GATE(CLK_SCLK_HSIC_12M, "sclk_hsic_12m", "ff_hsic_12m", - GATE_BUS_TOP, 29, 0, 0), - - GATE(0, "aclk300_disp1", "mout_user_aclk300_disp1", - SRC_MASK_TOP2, 24, 0, 0), - - GATE(CLK_MAU_EPLL, "mau_epll", "mout_mau_epll_clk", - SRC_MASK_TOP7, 20, 0, 0), - - /* sclk */ - GATE(CLK_SCLK_UART0, "sclk_uart0", "dout_uart0", - GATE_TOP_SCLK_PERIC, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART1, "sclk_uart1", "dout_uart1", - GATE_TOP_SCLK_PERIC, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART2, "sclk_uart2", "dout_uart2", - GATE_TOP_SCLK_PERIC, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART3, "sclk_uart3", "dout_uart3", - GATE_TOP_SCLK_PERIC, 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI0, "sclk_spi0", "dout_spi0_pre", - GATE_TOP_SCLK_PERIC, 6, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI1, "sclk_spi1", "dout_spi1_pre", - GATE_TOP_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI2, "sclk_spi2", "dout_spi2_pre", - GATE_TOP_SCLK_PERIC, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPDIF, "sclk_spdif", "mout_spdif", - GATE_TOP_SCLK_PERIC, 9, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PWM, "sclk_pwm", "dout_pwm", - GATE_TOP_SCLK_PERIC, 11, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PCM1, "sclk_pcm1", "dout_pcm1", - GATE_TOP_SCLK_PERIC, 15, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PCM2, "sclk_pcm2", "dout_pcm2", - GATE_TOP_SCLK_PERIC, 16, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_I2S1, "sclk_i2s1", "dout_i2s1", - GATE_TOP_SCLK_PERIC, 17, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_I2S2, "sclk_i2s2", "dout_i2s2", - GATE_TOP_SCLK_PERIC, 18, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_MMC0, "sclk_mmc0", "dout_mmc0", - GATE_TOP_SCLK_FSYS, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC1, "sclk_mmc1", "dout_mmc1", - GATE_TOP_SCLK_FSYS, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC2, "sclk_mmc2", "dout_mmc2", - GATE_TOP_SCLK_FSYS, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_USBPHY301, "sclk_usbphy301", "dout_usbphy301", - GATE_TOP_SCLK_FSYS, 7, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_USBPHY300, "sclk_usbphy300", "dout_usbphy300", - GATE_TOP_SCLK_FSYS, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_USBD300, "sclk_usbd300", "dout_usbd300", - GATE_TOP_SCLK_FSYS, 9, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_USBD301, "sclk_usbd301", "dout_usbd301", - GATE_TOP_SCLK_FSYS, 10, CLK_SET_RATE_PARENT, 0), - - /* Display */ - GATE(CLK_SCLK_FIMD1, "sclk_fimd1", "dout_fimd1", - GATE_TOP_SCLK_DISP1, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MIPI1, "sclk_mipi1", "dout_mipi1", - GATE_TOP_SCLK_DISP1, 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_HDMI, "sclk_hdmi", "mout_hdmi", - GATE_TOP_SCLK_DISP1, 9, 0, 0), - GATE(CLK_SCLK_PIXEL, "sclk_pixel", "dout_hdmi_pixel", - GATE_TOP_SCLK_DISP1, 10, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_DP1, "sclk_dp1", "dout_dp1", - GATE_TOP_SCLK_DISP1, 20, CLK_SET_RATE_PARENT, 0), - - /* Maudio Block */ - GATE(CLK_SCLK_MAUDIO0, "sclk_maudio0", "dout_maudio0", - GATE_TOP_SCLK_MAU, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MAUPCM0, "sclk_maupcm0", "dout_maupcm0", - GATE_TOP_SCLK_MAU, 1, CLK_SET_RATE_PARENT, 0), - - /* FSYS Block */ - GATE(CLK_TSI, "tsi", "aclk200_fsys", GATE_BUS_FSYS0, 0, 0, 0), - GATE(CLK_PDMA0, "pdma0", "aclk200_fsys", GATE_BUS_FSYS0, 1, 0, 0), - GATE(CLK_PDMA1, "pdma1", "aclk200_fsys", GATE_BUS_FSYS0, 2, 0, 0), - GATE(CLK_UFS, "ufs", "aclk200_fsys2", GATE_BUS_FSYS0, 3, 0, 0), - GATE(CLK_RTIC, "rtic", "aclk200_fsys", GATE_IP_FSYS, 9, 0, 0), - GATE(CLK_MMC0, "mmc0", "aclk200_fsys2", GATE_IP_FSYS, 12, 0, 0), - GATE(CLK_MMC1, "mmc1", "aclk200_fsys2", GATE_IP_FSYS, 13, 0, 0), - GATE(CLK_MMC2, "mmc2", "aclk200_fsys2", GATE_IP_FSYS, 14, 0, 0), - GATE(CLK_SROMC, "sromc", "aclk200_fsys2", - GATE_IP_FSYS, 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_USBH20, "usbh20", "aclk200_fsys", GATE_IP_FSYS, 18, 0, 0), - GATE(CLK_USBD300, "usbd300", "aclk200_fsys", GATE_IP_FSYS, 19, 0, 0), - GATE(CLK_USBD301, "usbd301", "aclk200_fsys", GATE_IP_FSYS, 20, 0, 0), - GATE(CLK_SCLK_UNIPRO, "sclk_unipro", "dout_unipro", - SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), - - /* PERIC Block */ - GATE(CLK_UART0, "uart0", "mout_user_aclk66_peric", - GATE_IP_PERIC, 0, 0, 0), - GATE(CLK_UART1, "uart1", "mout_user_aclk66_peric", - GATE_IP_PERIC, 1, 0, 0), - GATE(CLK_UART2, "uart2", "mout_user_aclk66_peric", - GATE_IP_PERIC, 2, 0, 0), - GATE(CLK_UART3, "uart3", "mout_user_aclk66_peric", - GATE_IP_PERIC, 3, 0, 0), - GATE(CLK_I2C0, "i2c0", "mout_user_aclk66_peric", - GATE_IP_PERIC, 6, 0, 0), - GATE(CLK_I2C1, "i2c1", "mout_user_aclk66_peric", - GATE_IP_PERIC, 7, 0, 0), - GATE(CLK_I2C2, "i2c2", "mout_user_aclk66_peric", - GATE_IP_PERIC, 8, 0, 0), - GATE(CLK_I2C3, "i2c3", "mout_user_aclk66_peric", - GATE_IP_PERIC, 9, 0, 0), - GATE(CLK_USI0, "usi0", "mout_user_aclk66_peric", - GATE_IP_PERIC, 10, 0, 0), - GATE(CLK_USI1, "usi1", "mout_user_aclk66_peric", - GATE_IP_PERIC, 11, 0, 0), - GATE(CLK_USI2, "usi2", "mout_user_aclk66_peric", - GATE_IP_PERIC, 12, 0, 0), - GATE(CLK_USI3, "usi3", "mout_user_aclk66_peric", - GATE_IP_PERIC, 13, 0, 0), - GATE(CLK_I2C_HDMI, "i2c_hdmi", "mout_user_aclk66_peric", - GATE_IP_PERIC, 14, 0, 0), - GATE(CLK_TSADC, "tsadc", "mout_user_aclk66_peric", - GATE_IP_PERIC, 15, 0, 0), - GATE(CLK_SPI0, "spi0", "mout_user_aclk66_peric", - GATE_IP_PERIC, 16, 0, 0), - GATE(CLK_SPI1, "spi1", "mout_user_aclk66_peric", - GATE_IP_PERIC, 17, 0, 0), - GATE(CLK_SPI2, "spi2", "mout_user_aclk66_peric", - GATE_IP_PERIC, 18, 0, 0), - GATE(CLK_I2S1, "i2s1", "mout_user_aclk66_peric", - GATE_IP_PERIC, 20, 0, 0), - GATE(CLK_I2S2, "i2s2", "mout_user_aclk66_peric", - GATE_IP_PERIC, 21, 0, 0), - GATE(CLK_PCM1, "pcm1", "mout_user_aclk66_peric", - GATE_IP_PERIC, 22, 0, 0), - GATE(CLK_PCM2, "pcm2", "mout_user_aclk66_peric", - GATE_IP_PERIC, 23, 0, 0), - GATE(CLK_PWM, "pwm", "mout_user_aclk66_peric", - GATE_IP_PERIC, 24, 0, 0), - GATE(CLK_SPDIF, "spdif", "mout_user_aclk66_peric", - GATE_IP_PERIC, 26, 0, 0), - GATE(CLK_USI4, "usi4", "mout_user_aclk66_peric", - GATE_IP_PERIC, 28, 0, 0), - GATE(CLK_USI5, "usi5", "mout_user_aclk66_peric", - GATE_IP_PERIC, 30, 0, 0), - GATE(CLK_USI6, "usi6", "mout_user_aclk66_peric", - GATE_IP_PERIC, 31, 0, 0), - - GATE(CLK_KEYIF, "keyif", "mout_user_aclk66_peric", - GATE_BUS_PERIC, 22, 0, 0), - - /* PERIS Block */ - GATE(CLK_CHIPID, "chipid", "aclk66_psgen", - GATE_IP_PERIS, 0, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SYSREG, "sysreg", "aclk66_psgen", - GATE_IP_PERIS, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_TZPC0, "tzpc0", "aclk66_psgen", GATE_IP_PERIS, 6, 0, 0), - GATE(CLK_TZPC1, "tzpc1", "aclk66_psgen", GATE_IP_PERIS, 7, 0, 0), - GATE(CLK_TZPC2, "tzpc2", "aclk66_psgen", GATE_IP_PERIS, 8, 0, 0), - GATE(CLK_TZPC3, "tzpc3", "aclk66_psgen", GATE_IP_PERIS, 9, 0, 0), - GATE(CLK_TZPC4, "tzpc4", "aclk66_psgen", GATE_IP_PERIS, 10, 0, 0), - GATE(CLK_TZPC5, "tzpc5", "aclk66_psgen", GATE_IP_PERIS, 11, 0, 0), - GATE(CLK_TZPC6, "tzpc6", "aclk66_psgen", GATE_IP_PERIS, 12, 0, 0), - GATE(CLK_TZPC7, "tzpc7", "aclk66_psgen", GATE_IP_PERIS, 13, 0, 0), - GATE(CLK_TZPC8, "tzpc8", "aclk66_psgen", GATE_IP_PERIS, 14, 0, 0), - GATE(CLK_TZPC9, "tzpc9", "aclk66_psgen", GATE_IP_PERIS, 15, 0, 0), - GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk66_psgen", GATE_IP_PERIS, 16, 0, 0), - GATE(CLK_MCT, "mct", "aclk66_psgen", GATE_IP_PERIS, 18, 0, 0), - GATE(CLK_WDT, "wdt", "aclk66_psgen", GATE_IP_PERIS, 19, 0, 0), - GATE(CLK_RTC, "rtc", "aclk66_psgen", GATE_IP_PERIS, 20, 0, 0), - GATE(CLK_TMU, "tmu", "aclk66_psgen", GATE_IP_PERIS, 21, 0, 0), - GATE(CLK_TMU_GPU, "tmu_gpu", "aclk66_psgen", GATE_IP_PERIS, 22, 0, 0), - - GATE(CLK_SECKEY, "seckey", "aclk66_psgen", GATE_BUS_PERIS1, 1, 0, 0), - - /* GEN Block */ - GATE(CLK_ROTATOR, "rotator", "mout_user_aclk266", GATE_IP_GEN, 1, 0, 0), - GATE(CLK_JPEG, "jpeg", "aclk300_jpeg", GATE_IP_GEN, 2, 0, 0), - GATE(CLK_JPEG2, "jpeg2", "aclk300_jpeg", GATE_IP_GEN, 3, 0, 0), - GATE(CLK_MDMA1, "mdma1", "mout_user_aclk266", GATE_IP_GEN, 4, 0, 0), - GATE(CLK_TOP_RTC, "top_rtc", "aclk66_psgen", GATE_IP_GEN, 5, 0, 0), - GATE(CLK_SMMU_ROTATOR, "smmu_rotator", "dout_gen_blk", - GATE_IP_GEN, 6, 0, 0), - GATE(CLK_SMMU_JPEG, "smmu_jpeg", "dout_jpg_blk", GATE_IP_GEN, 7, 0, 0), - GATE(CLK_SMMU_MDMA1, "smmu_mdma1", "dout_gen_blk", - GATE_IP_GEN, 9, 0, 0), - - /* GATE_IP_GEN doesn't list gates for smmu_jpeg2 and mc */ - GATE(CLK_SMMU_JPEG2, "smmu_jpeg2", "dout_jpg_blk", - GATE_BUS_GEN, 28, 0, 0), - GATE(CLK_MC, "mc", "aclk66_psgen", GATE_BUS_GEN, 12, 0, 0), - - /* GSCL Block */ - GATE(CLK_SCLK_GSCL_WA, "sclk_gscl_wa", "mout_user_aclk333_432_gscl", - GATE_TOP_SCLK_GSCL, 6, 0, 0), - GATE(CLK_SCLK_GSCL_WB, "sclk_gscl_wb", "mout_user_aclk333_432_gscl", - GATE_TOP_SCLK_GSCL, 7, 0, 0), - - GATE(CLK_GSCL0, "gscl0", "aclk300_gscl", GATE_IP_GSCL0, 0, 0, 0), - GATE(CLK_GSCL1, "gscl1", "aclk300_gscl", GATE_IP_GSCL0, 1, 0, 0), - GATE(CLK_FIMC_3AA, "fimc_3aa", "aclk333_432_gscl", - GATE_IP_GSCL0, 4, 0, 0), - GATE(CLK_FIMC_LITE0, "fimc_lite0", "aclk333_432_gscl", - GATE_IP_GSCL0, 5, 0, 0), - GATE(CLK_FIMC_LITE1, "fimc_lite1", "aclk333_432_gscl", - GATE_IP_GSCL0, 6, 0, 0), - - GATE(CLK_SMMU_3AA, "smmu_3aa", "dout_gscl_blk_333", - GATE_IP_GSCL1, 2, 0, 0), - GATE(CLK_SMMU_FIMCL0, "smmu_fimcl0", "dout_gscl_blk_333", - GATE_IP_GSCL1, 3, 0, 0), - GATE(CLK_SMMU_FIMCL1, "smmu_fimcl1", "dout_gscl_blk_333", - GATE_IP_GSCL1, 4, 0, 0), - GATE(CLK_SMMU_GSCL0, "smmu_gscl0", "dout_gscl_blk_300", - GATE_IP_GSCL1, 6, 0, 0), - GATE(CLK_SMMU_GSCL1, "smmu_gscl1", "dout_gscl_blk_300", - GATE_IP_GSCL1, 7, 0, 0), - GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12, 0, 0), - GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13, 0, 0), - GATE(CLK_SMMU_FIMCL3, "smmu_fimcl3,", "dout_gscl_blk_333", - GATE_IP_GSCL1, 16, 0, 0), - GATE(CLK_FIMC_LITE3, "fimc_lite3", "aclk333_432_gscl", - GATE_IP_GSCL1, 17, 0, 0), - - /* MSCL Block */ - GATE(CLK_MSCL0, "mscl0", "aclk400_mscl", GATE_IP_MSCL, 0, 0, 0), - GATE(CLK_MSCL1, "mscl1", "aclk400_mscl", GATE_IP_MSCL, 1, 0, 0), - GATE(CLK_MSCL2, "mscl2", "aclk400_mscl", GATE_IP_MSCL, 2, 0, 0), - GATE(CLK_SMMU_MSCL0, "smmu_mscl0", "dout_mscl_blk", - GATE_IP_MSCL, 8, 0, 0), - GATE(CLK_SMMU_MSCL1, "smmu_mscl1", "dout_mscl_blk", - GATE_IP_MSCL, 9, 0, 0), - GATE(CLK_SMMU_MSCL2, "smmu_mscl2", "dout_mscl_blk", - GATE_IP_MSCL, 10, 0, 0), - - GATE(CLK_FIMD1, "fimd1", "aclk300_disp1", GATE_IP_DISP1, 0, 0, 0), - GATE(CLK_DSIM1, "dsim1", "aclk200_disp1", GATE_IP_DISP1, 3, 0, 0), - GATE(CLK_DP1, "dp1", "aclk200_disp1", GATE_IP_DISP1, 4, 0, 0), - GATE(CLK_MIXER, "mixer", "aclk200_disp1", GATE_IP_DISP1, 5, 0, 0), - GATE(CLK_HDMI, "hdmi", "aclk200_disp1", GATE_IP_DISP1, 6, 0, 0), - GATE(CLK_SMMU_FIMD1M0, "smmu_fimd1m0", "dout_disp1_blk", - GATE_IP_DISP1, 7, 0, 0), - GATE(CLK_SMMU_FIMD1M1, "smmu_fimd1m1", "dout_disp1_blk", - GATE_IP_DISP1, 8, 0, 0), - GATE(CLK_SMMU_MIXER, "smmu_mixer", "aclk200_disp1", - GATE_IP_DISP1, 9, 0, 0), - - /* ISP */ - GATE(CLK_SCLK_UART_ISP, "sclk_uart_isp", "dout_uart_isp", - GATE_TOP_SCLK_ISP, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI0_ISP, "sclk_spi0_isp", "dout_spi0_isp_pre", - GATE_TOP_SCLK_ISP, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI1_ISP, "sclk_spi1_isp", "dout_spi1_isp_pre", - GATE_TOP_SCLK_ISP, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PWM_ISP, "sclk_pwm_isp", "dout_pwm_isp", - GATE_TOP_SCLK_ISP, 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_ISP_SENSOR0, "sclk_isp_sensor0", "dout_isp_sensor0", - GATE_TOP_SCLK_ISP, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_ISP_SENSOR1, "sclk_isp_sensor1", "dout_isp_sensor1", - GATE_TOP_SCLK_ISP, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_ISP_SENSOR2, "sclk_isp_sensor2", "dout_isp_sensor2", - GATE_TOP_SCLK_ISP, 12, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_MFC, "mfc", "aclk333", GATE_IP_MFC, 0, 0, 0), - GATE(CLK_SMMU_MFCL, "smmu_mfcl", "dout_mfc_blk", GATE_IP_MFC, 1, 0, 0), - GATE(CLK_SMMU_MFCR, "smmu_mfcr", "dout_mfc_blk", GATE_IP_MFC, 2, 0, 0), - - GATE(CLK_G3D, "g3d", "mout_user_aclk_g3d", GATE_IP_G3D, 9, 0, 0), -}; - -static const struct samsung_pll_rate_table exynos5420_pll2550x_24mhz_tbl[] __initconst = { - PLL_35XX_RATE(2000000000, 250, 3, 0), - PLL_35XX_RATE(1900000000, 475, 6, 0), - PLL_35XX_RATE(1800000000, 225, 3, 0), - PLL_35XX_RATE(1700000000, 425, 6, 0), - PLL_35XX_RATE(1600000000, 200, 3, 0), - PLL_35XX_RATE(1500000000, 250, 4, 0), - PLL_35XX_RATE(1400000000, 175, 3, 0), - PLL_35XX_RATE(1300000000, 325, 6, 0), - PLL_35XX_RATE(1200000000, 200, 2, 1), - PLL_35XX_RATE(1100000000, 275, 3, 1), - PLL_35XX_RATE(1000000000, 250, 3, 1), - PLL_35XX_RATE(900000000, 150, 2, 1), - PLL_35XX_RATE(800000000, 200, 3, 1), - PLL_35XX_RATE(700000000, 175, 3, 1), - PLL_35XX_RATE(600000000, 200, 2, 2), - PLL_35XX_RATE(500000000, 250, 3, 2), - PLL_35XX_RATE(400000000, 200, 3, 2), - PLL_35XX_RATE(300000000, 200, 2, 3), - PLL_35XX_RATE(200000000, 200, 3, 3), -}; - -static struct samsung_pll_clock exynos5x_plls[nr_plls] __initdata = { - [apll] = PLL(pll_2550, CLK_FOUT_APLL, "fout_apll", "fin_pll", APLL_LOCK, - APLL_CON0, NULL), - [cpll] = PLL(pll_2550, CLK_FOUT_CPLL, "fout_cpll", "fin_pll", CPLL_LOCK, - CPLL_CON0, NULL), - [dpll] = PLL(pll_2550, CLK_FOUT_DPLL, "fout_dpll", "fin_pll", DPLL_LOCK, - DPLL_CON0, NULL), - [epll] = PLL(pll_2650, CLK_FOUT_EPLL, "fout_epll", "fin_pll", EPLL_LOCK, - EPLL_CON0, NULL), - [rpll] = PLL(pll_2650, CLK_FOUT_RPLL, "fout_rpll", "fin_pll", RPLL_LOCK, - RPLL_CON0, NULL), - [ipll] = PLL(pll_2550, CLK_FOUT_IPLL, "fout_ipll", "fin_pll", IPLL_LOCK, - IPLL_CON0, NULL), - [spll] = PLL(pll_2550, CLK_FOUT_SPLL, "fout_spll", "fin_pll", SPLL_LOCK, - SPLL_CON0, NULL), - [vpll] = PLL(pll_2550, CLK_FOUT_VPLL, "fout_vpll", "fin_pll", VPLL_LOCK, - VPLL_CON0, NULL), - [mpll] = PLL(pll_2550, CLK_FOUT_MPLL, "fout_mpll", "fin_pll", MPLL_LOCK, - MPLL_CON0, NULL), - [bpll] = PLL(pll_2550, CLK_FOUT_BPLL, "fout_bpll", "fin_pll", BPLL_LOCK, - BPLL_CON0, NULL), - [kpll] = PLL(pll_2550, CLK_FOUT_KPLL, "fout_kpll", "fin_pll", KPLL_LOCK, - KPLL_CON0, NULL), -}; - -#define E5420_EGL_DIV0(apll, pclk_dbg, atb, cpud) \ - ((((apll) << 24) | ((pclk_dbg) << 20) | ((atb) << 16) | \ - ((cpud) << 4))) - -static const struct exynos_cpuclk_cfg_data exynos5420_eglclk_d[] __initconst = { - { 1800000, E5420_EGL_DIV0(3, 7, 7, 4), }, - { 1700000, E5420_EGL_DIV0(3, 7, 7, 3), }, - { 1600000, E5420_EGL_DIV0(3, 7, 7, 3), }, - { 1500000, E5420_EGL_DIV0(3, 7, 7, 3), }, - { 1400000, E5420_EGL_DIV0(3, 7, 7, 3), }, - { 1300000, E5420_EGL_DIV0(3, 7, 7, 2), }, - { 1200000, E5420_EGL_DIV0(3, 7, 7, 2), }, - { 1100000, E5420_EGL_DIV0(3, 7, 7, 2), }, - { 1000000, E5420_EGL_DIV0(3, 6, 6, 2), }, - { 900000, E5420_EGL_DIV0(3, 6, 6, 2), }, - { 800000, E5420_EGL_DIV0(3, 5, 5, 2), }, - { 700000, E5420_EGL_DIV0(3, 5, 5, 2), }, - { 600000, E5420_EGL_DIV0(3, 4, 4, 2), }, - { 500000, E5420_EGL_DIV0(3, 3, 3, 2), }, - { 400000, E5420_EGL_DIV0(3, 3, 3, 2), }, - { 300000, E5420_EGL_DIV0(3, 3, 3, 2), }, - { 200000, E5420_EGL_DIV0(3, 3, 3, 2), }, - { 0 }, -}; - -static const struct exynos_cpuclk_cfg_data exynos5800_eglclk_d[] __initconst = { - { 2000000, E5420_EGL_DIV0(3, 7, 7, 4), }, - { 1900000, E5420_EGL_DIV0(3, 7, 7, 4), }, - { 1800000, E5420_EGL_DIV0(3, 7, 7, 4), }, - { 1700000, E5420_EGL_DIV0(3, 7, 7, 3), }, - { 1600000, E5420_EGL_DIV0(3, 7, 7, 3), }, - { 1500000, E5420_EGL_DIV0(3, 7, 7, 3), }, - { 1400000, E5420_EGL_DIV0(3, 7, 7, 3), }, - { 1300000, E5420_EGL_DIV0(3, 7, 7, 2), }, - { 1200000, E5420_EGL_DIV0(3, 7, 7, 2), }, - { 1100000, E5420_EGL_DIV0(3, 7, 7, 2), }, - { 1000000, E5420_EGL_DIV0(3, 7, 6, 2), }, - { 900000, E5420_EGL_DIV0(3, 7, 6, 2), }, - { 800000, E5420_EGL_DIV0(3, 7, 5, 2), }, - { 700000, E5420_EGL_DIV0(3, 7, 5, 2), }, - { 600000, E5420_EGL_DIV0(3, 7, 4, 2), }, - { 500000, E5420_EGL_DIV0(3, 7, 3, 2), }, - { 400000, E5420_EGL_DIV0(3, 7, 3, 2), }, - { 300000, E5420_EGL_DIV0(3, 7, 3, 2), }, - { 200000, E5420_EGL_DIV0(3, 7, 3, 2), }, - { 0 }, -}; - -#define E5420_KFC_DIV(kpll, pclk, aclk) \ - ((((kpll) << 24) | ((pclk) << 20) | ((aclk) << 4))) - -static const struct exynos_cpuclk_cfg_data exynos5420_kfcclk_d[] __initconst = { - { 1400000, E5420_KFC_DIV(3, 5, 3), }, /* for Exynos5800 */ - { 1300000, E5420_KFC_DIV(3, 5, 2), }, - { 1200000, E5420_KFC_DIV(3, 5, 2), }, - { 1100000, E5420_KFC_DIV(3, 5, 2), }, - { 1000000, E5420_KFC_DIV(3, 5, 2), }, - { 900000, E5420_KFC_DIV(3, 5, 2), }, - { 800000, E5420_KFC_DIV(3, 5, 2), }, - { 700000, E5420_KFC_DIV(3, 4, 2), }, - { 600000, E5420_KFC_DIV(3, 4, 2), }, - { 500000, E5420_KFC_DIV(3, 4, 2), }, - { 400000, E5420_KFC_DIV(3, 3, 2), }, - { 300000, E5420_KFC_DIV(3, 3, 2), }, - { 200000, E5420_KFC_DIV(3, 3, 2), }, - { 0 }, -}; - -static const struct of_device_id ext_clk_match[] __initconst = { - { .compatible = "samsung,exynos5420-oscclk", .data = (void *)0, }, - { }, -}; - -/* register exynos5420 clocks */ -static void __init exynos5x_clk_init(struct device_node *np, - enum exynos5x_soc soc) -{ - struct samsung_clk_provider *ctx; - - if (np) { - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - } else { - panic("%s: unable to determine soc\n", __func__); - } - - exynos5x_soc = soc; - - ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); - - samsung_clk_of_register_fixed_ext(ctx, exynos5x_fixed_rate_ext_clks, - ARRAY_SIZE(exynos5x_fixed_rate_ext_clks), - ext_clk_match); - - if (_get_rate("fin_pll") == 24 * MHZ) { - exynos5x_plls[apll].rate_table = exynos5420_pll2550x_24mhz_tbl; - exynos5x_plls[kpll].rate_table = exynos5420_pll2550x_24mhz_tbl; - exynos5x_plls[bpll].rate_table = exynos5420_pll2550x_24mhz_tbl; - } - - samsung_clk_register_pll(ctx, exynos5x_plls, ARRAY_SIZE(exynos5x_plls), - reg_base); - samsung_clk_register_fixed_rate(ctx, exynos5x_fixed_rate_clks, - ARRAY_SIZE(exynos5x_fixed_rate_clks)); - samsung_clk_register_fixed_factor(ctx, exynos5x_fixed_factor_clks, - ARRAY_SIZE(exynos5x_fixed_factor_clks)); - samsung_clk_register_mux(ctx, exynos5x_mux_clks, - ARRAY_SIZE(exynos5x_mux_clks)); - samsung_clk_register_div(ctx, exynos5x_div_clks, - ARRAY_SIZE(exynos5x_div_clks)); - samsung_clk_register_gate(ctx, exynos5x_gate_clks, - ARRAY_SIZE(exynos5x_gate_clks)); - - if (soc == EXYNOS5420) { - samsung_clk_register_mux(ctx, exynos5420_mux_clks, - ARRAY_SIZE(exynos5420_mux_clks)); - samsung_clk_register_div(ctx, exynos5420_div_clks, - ARRAY_SIZE(exynos5420_div_clks)); - } else { - samsung_clk_register_fixed_factor( - ctx, exynos5800_fixed_factor_clks, - ARRAY_SIZE(exynos5800_fixed_factor_clks)); - samsung_clk_register_mux(ctx, exynos5800_mux_clks, - ARRAY_SIZE(exynos5800_mux_clks)); - samsung_clk_register_div(ctx, exynos5800_div_clks, - ARRAY_SIZE(exynos5800_div_clks)); - samsung_clk_register_gate(ctx, exynos5800_gate_clks, - ARRAY_SIZE(exynos5800_gate_clks)); - } - - if (soc == EXYNOS5420) { - exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk", - mout_cpu_p[0], mout_cpu_p[1], 0x200, - exynos5420_eglclk_d, ARRAY_SIZE(exynos5420_eglclk_d), 0); - } else { - exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk", - mout_cpu_p[0], mout_cpu_p[1], 0x200, - exynos5800_eglclk_d, ARRAY_SIZE(exynos5800_eglclk_d), 0); - } - exynos_register_cpu_clock(ctx, CLK_KFC_CLK, "kfcclk", - mout_kfc_p[0], mout_kfc_p[1], 0x28200, - exynos5420_kfcclk_d, ARRAY_SIZE(exynos5420_kfcclk_d), 0); - - exynos5420_clk_sleep_init(); - - samsung_clk_of_add_provider(np, ctx); -} - -static void __init exynos5420_clk_init(struct device_node *np) -{ - exynos5x_clk_init(np, EXYNOS5420); -} -CLK_OF_DECLARE(exynos5420_clk, "samsung,exynos5420-clock", exynos5420_clk_init); - -static void __init exynos5800_clk_init(struct device_node *np) -{ - exynos5x_clk_init(np, EXYNOS5800); -} -CLK_OF_DECLARE(exynos5800_clk, "samsung,exynos5800-clock", exynos5800_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos5433.c b/drivers/clk/samsung/samsung/clk-exynos5433.c deleted file mode 100644 index ea1608682d7f..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos5433.c +++ /dev/null @@ -1,5409 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * Author: Chanwoo Choi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos5443 SoC. - */ - -#include -#include -#include - -#include - -#include "clk.h" -#include "clk-cpu.h" -#include "clk-pll.h" - -/* - * Register offset definitions for CMU_TOP - */ -#define ISP_PLL_LOCK 0x0000 -#define AUD_PLL_LOCK 0x0004 -#define ISP_PLL_CON0 0x0100 -#define ISP_PLL_CON1 0x0104 -#define ISP_PLL_FREQ_DET 0x0108 -#define AUD_PLL_CON0 0x0110 -#define AUD_PLL_CON1 0x0114 -#define AUD_PLL_CON2 0x0118 -#define AUD_PLL_FREQ_DET 0x011c -#define MUX_SEL_TOP0 0x0200 -#define MUX_SEL_TOP1 0x0204 -#define MUX_SEL_TOP2 0x0208 -#define MUX_SEL_TOP3 0x020c -#define MUX_SEL_TOP4 0x0210 -#define MUX_SEL_TOP_MSCL 0x0220 -#define MUX_SEL_TOP_CAM1 0x0224 -#define MUX_SEL_TOP_DISP 0x0228 -#define MUX_SEL_TOP_FSYS0 0x0230 -#define MUX_SEL_TOP_FSYS1 0x0234 -#define MUX_SEL_TOP_PERIC0 0x0238 -#define MUX_SEL_TOP_PERIC1 0x023c -#define MUX_ENABLE_TOP0 0x0300 -#define MUX_ENABLE_TOP1 0x0304 -#define MUX_ENABLE_TOP2 0x0308 -#define MUX_ENABLE_TOP3 0x030c -#define MUX_ENABLE_TOP4 0x0310 -#define MUX_ENABLE_TOP_MSCL 0x0320 -#define MUX_ENABLE_TOP_CAM1 0x0324 -#define MUX_ENABLE_TOP_DISP 0x0328 -#define MUX_ENABLE_TOP_FSYS0 0x0330 -#define MUX_ENABLE_TOP_FSYS1 0x0334 -#define MUX_ENABLE_TOP_PERIC0 0x0338 -#define MUX_ENABLE_TOP_PERIC1 0x033c -#define MUX_STAT_TOP0 0x0400 -#define MUX_STAT_TOP1 0x0404 -#define MUX_STAT_TOP2 0x0408 -#define MUX_STAT_TOP3 0x040c -#define MUX_STAT_TOP4 0x0410 -#define MUX_STAT_TOP_MSCL 0x0420 -#define MUX_STAT_TOP_CAM1 0x0424 -#define MUX_STAT_TOP_FSYS0 0x0430 -#define MUX_STAT_TOP_FSYS1 0x0434 -#define MUX_STAT_TOP_PERIC0 0x0438 -#define MUX_STAT_TOP_PERIC1 0x043c -#define DIV_TOP0 0x0600 -#define DIV_TOP1 0x0604 -#define DIV_TOP2 0x0608 -#define DIV_TOP3 0x060c -#define DIV_TOP4 0x0610 -#define DIV_TOP_MSCL 0x0618 -#define DIV_TOP_CAM10 0x061c -#define DIV_TOP_CAM11 0x0620 -#define DIV_TOP_FSYS0 0x062c -#define DIV_TOP_FSYS1 0x0630 -#define DIV_TOP_FSYS2 0x0634 -#define DIV_TOP_PERIC0 0x0638 -#define DIV_TOP_PERIC1 0x063c -#define DIV_TOP_PERIC2 0x0640 -#define DIV_TOP_PERIC3 0x0644 -#define DIV_TOP_PERIC4 0x0648 -#define DIV_TOP_PLL_FREQ_DET 0x064c -#define DIV_STAT_TOP0 0x0700 -#define DIV_STAT_TOP1 0x0704 -#define DIV_STAT_TOP2 0x0708 -#define DIV_STAT_TOP3 0x070c -#define DIV_STAT_TOP4 0x0710 -#define DIV_STAT_TOP_MSCL 0x0718 -#define DIV_STAT_TOP_CAM10 0x071c -#define DIV_STAT_TOP_CAM11 0x0720 -#define DIV_STAT_TOP_FSYS0 0x072c -#define DIV_STAT_TOP_FSYS1 0x0730 -#define DIV_STAT_TOP_FSYS2 0x0734 -#define DIV_STAT_TOP_PERIC0 0x0738 -#define DIV_STAT_TOP_PERIC1 0x073c -#define DIV_STAT_TOP_PERIC2 0x0740 -#define DIV_STAT_TOP_PERIC3 0x0744 -#define DIV_STAT_TOP_PLL_FREQ_DET 0x074c -#define ENABLE_ACLK_TOP 0x0800 -#define ENABLE_SCLK_TOP 0x0a00 -#define ENABLE_SCLK_TOP_MSCL 0x0a04 -#define ENABLE_SCLK_TOP_CAM1 0x0a08 -#define ENABLE_SCLK_TOP_DISP 0x0a0c -#define ENABLE_SCLK_TOP_FSYS 0x0a10 -#define ENABLE_SCLK_TOP_PERIC 0x0a14 -#define ENABLE_IP_TOP 0x0b00 -#define ENABLE_CMU_TOP 0x0c00 -#define ENABLE_CMU_TOP_DIV_STAT 0x0c04 - -static const unsigned long top_clk_regs[] __initconst = { - ISP_PLL_LOCK, - AUD_PLL_LOCK, - ISP_PLL_CON0, - ISP_PLL_CON1, - ISP_PLL_FREQ_DET, - AUD_PLL_CON0, - AUD_PLL_CON1, - AUD_PLL_CON2, - AUD_PLL_FREQ_DET, - MUX_SEL_TOP0, - MUX_SEL_TOP1, - MUX_SEL_TOP2, - MUX_SEL_TOP3, - MUX_SEL_TOP4, - MUX_SEL_TOP_MSCL, - MUX_SEL_TOP_CAM1, - MUX_SEL_TOP_DISP, - MUX_SEL_TOP_FSYS0, - MUX_SEL_TOP_FSYS1, - MUX_SEL_TOP_PERIC0, - MUX_SEL_TOP_PERIC1, - MUX_ENABLE_TOP0, - MUX_ENABLE_TOP1, - MUX_ENABLE_TOP2, - MUX_ENABLE_TOP3, - MUX_ENABLE_TOP4, - MUX_ENABLE_TOP_MSCL, - MUX_ENABLE_TOP_CAM1, - MUX_ENABLE_TOP_DISP, - MUX_ENABLE_TOP_FSYS0, - MUX_ENABLE_TOP_FSYS1, - MUX_ENABLE_TOP_PERIC0, - MUX_ENABLE_TOP_PERIC1, - DIV_TOP0, - DIV_TOP1, - DIV_TOP2, - DIV_TOP3, - DIV_TOP4, - DIV_TOP_MSCL, - DIV_TOP_CAM10, - DIV_TOP_CAM11, - DIV_TOP_FSYS0, - DIV_TOP_FSYS1, - DIV_TOP_FSYS2, - DIV_TOP_PERIC0, - DIV_TOP_PERIC1, - DIV_TOP_PERIC2, - DIV_TOP_PERIC3, - DIV_TOP_PERIC4, - DIV_TOP_PLL_FREQ_DET, - ENABLE_ACLK_TOP, - ENABLE_SCLK_TOP, - ENABLE_SCLK_TOP_MSCL, - ENABLE_SCLK_TOP_CAM1, - ENABLE_SCLK_TOP_DISP, - ENABLE_SCLK_TOP_FSYS, - ENABLE_SCLK_TOP_PERIC, - ENABLE_IP_TOP, - ENABLE_CMU_TOP, - ENABLE_CMU_TOP_DIV_STAT, -}; - -/* list of all parent clock list */ -PNAME(mout_aud_pll_p) = { "oscclk", "fout_aud_pll", }; -PNAME(mout_isp_pll_p) = { "oscclk", "fout_isp_pll", }; -PNAME(mout_aud_pll_user_p) = { "oscclk", "mout_aud_pll", }; -PNAME(mout_mphy_pll_user_p) = { "oscclk", "sclk_mphy_pll", }; -PNAME(mout_mfc_pll_user_p) = { "oscclk", "sclk_mfc_pll", }; -PNAME(mout_bus_pll_user_p) = { "oscclk", "sclk_bus_pll", }; -PNAME(mout_bus_pll_user_t_p) = { "oscclk", "mout_bus_pll_user", }; -PNAME(mout_mphy_pll_user_t_p) = { "oscclk", "mout_mphy_pll_user", }; - -PNAME(mout_bus_mfc_pll_user_p) = { "mout_bus_pll_user", "mout_mfc_pll_user",}; -PNAME(mout_mfc_bus_pll_user_p) = { "mout_mfc_pll_user", "mout_bus_pll_user",}; -PNAME(mout_aclk_cam1_552_b_p) = { "mout_aclk_cam1_552_a", - "mout_mfc_pll_user", }; -PNAME(mout_aclk_cam1_552_a_p) = { "mout_isp_pll", "mout_bus_pll_user", }; - -PNAME(mout_aclk_mfc_400_c_p) = { "mout_aclk_mfc_400_b", - "mout_mphy_pll_user", }; -PNAME(mout_aclk_mfc_400_b_p) = { "mout_aclk_mfc_400_a", - "mout_bus_pll_user", }; -PNAME(mout_aclk_mfc_400_a_p) = { "mout_mfc_pll_user", "mout_isp_pll", }; - -PNAME(mout_bus_mphy_pll_user_p) = { "mout_bus_pll_user", - "mout_mphy_pll_user", }; -PNAME(mout_aclk_mscl_b_p) = { "mout_aclk_mscl_400_a", - "mout_mphy_pll_user", }; -PNAME(mout_aclk_g2d_400_b_p) = { "mout_aclk_g2d_400_a", - "mout_mphy_pll_user", }; - -PNAME(mout_sclk_jpeg_c_p) = { "mout_sclk_jpeg_b", "mout_mphy_pll_user",}; -PNAME(mout_sclk_jpeg_b_p) = { "mout_sclk_jpeg_a", "mout_mfc_pll_user", }; - -PNAME(mout_sclk_mmc2_b_p) = { "mout_sclk_mmc2_a", "mout_mfc_pll_user",}; -PNAME(mout_sclk_mmc1_b_p) = { "mout_sclk_mmc1_a", "mout_mfc_pll_user",}; -PNAME(mout_sclk_mmc0_d_p) = { "mout_sclk_mmc0_c", "mout_isp_pll", }; -PNAME(mout_sclk_mmc0_c_p) = { "mout_sclk_mmc0_b", "mout_mphy_pll_user",}; -PNAME(mout_sclk_mmc0_b_p) = { "mout_sclk_mmc0_a", "mout_mfc_pll_user", }; - -PNAME(mout_sclk_spdif_p) = { "sclk_audio0", "sclk_audio1", - "oscclk", "ioclk_spdif_extclk", }; -PNAME(mout_sclk_audio1_p) = { "ioclk_audiocdclk1", "oscclk", - "mout_aud_pll_user_t",}; -PNAME(mout_sclk_audio0_p) = { "ioclk_audiocdclk0", "oscclk", - "mout_aud_pll_user_t",}; - -PNAME(mout_sclk_hdmi_spdif_p) = { "sclk_audio1", "ioclk_spdif_extclk", }; - -static const struct samsung_fixed_factor_clock top_fixed_factor_clks[] __initconst = { - FFACTOR(0, "oscclk_efuse_common", "oscclk", 1, 1, 0), -}; - -static const struct samsung_fixed_rate_clock top_fixed_clks[] __initconst = { - /* Xi2s{0|1}CDCLK input clock for I2S/PCM */ - FRATE(0, "ioclk_audiocdclk1", NULL, 0, 100000000), - FRATE(0, "ioclk_audiocdclk0", NULL, 0, 100000000), - /* Xi2s1SDI input clock for SPDIF */ - FRATE(0, "ioclk_spdif_extclk", NULL, 0, 100000000), - /* XspiCLK[4:0] input clock for SPI */ - FRATE(0, "ioclk_spi4_clk_in", NULL, 0, 50000000), - FRATE(0, "ioclk_spi3_clk_in", NULL, 0, 50000000), - FRATE(0, "ioclk_spi2_clk_in", NULL, 0, 50000000), - FRATE(0, "ioclk_spi1_clk_in", NULL, 0, 50000000), - FRATE(0, "ioclk_spi0_clk_in", NULL, 0, 50000000), - /* Xi2s1SCLK input clock for I2S1_BCLK */ - FRATE(0, "ioclk_i2s1_bclk_in", NULL, 0, 12288000), -}; - -static const struct samsung_mux_clock top_mux_clks[] __initconst = { - /* MUX_SEL_TOP0 */ - MUX(CLK_MOUT_AUD_PLL, "mout_aud_pll", mout_aud_pll_p, MUX_SEL_TOP0, - 4, 1), - MUX(CLK_MOUT_ISP_PLL, "mout_isp_pll", mout_isp_pll_p, MUX_SEL_TOP0, - 0, 1), - - /* MUX_SEL_TOP1 */ - MUX(CLK_MOUT_AUD_PLL_USER_T, "mout_aud_pll_user_t", - mout_aud_pll_user_p, MUX_SEL_TOP1, 12, 1), - MUX(CLK_MOUT_MPHY_PLL_USER, "mout_mphy_pll_user", mout_mphy_pll_user_p, - MUX_SEL_TOP1, 8, 1), - MUX(CLK_MOUT_MFC_PLL_USER, "mout_mfc_pll_user", mout_mfc_pll_user_p, - MUX_SEL_TOP1, 4, 1), - MUX(CLK_MOUT_BUS_PLL_USER, "mout_bus_pll_user", mout_bus_pll_user_p, - MUX_SEL_TOP1, 0, 1), - - /* MUX_SEL_TOP2 */ - MUX(CLK_MOUT_ACLK_HEVC_400, "mout_aclk_hevc_400", - mout_bus_mfc_pll_user_p, MUX_SEL_TOP2, 28, 1), - MUX(CLK_MOUT_ACLK_CAM1_333, "mout_aclk_cam1_333", - mout_mfc_bus_pll_user_p, MUX_SEL_TOP2, 16, 1), - MUX(CLK_MOUT_ACLK_CAM1_552_B, "mout_aclk_cam1_552_b", - mout_aclk_cam1_552_b_p, MUX_SEL_TOP2, 12, 1), - MUX(CLK_MOUT_ACLK_CAM1_552_A, "mout_aclk_cam1_552_a", - mout_aclk_cam1_552_a_p, MUX_SEL_TOP2, 8, 1), - MUX(CLK_MOUT_ACLK_ISP_DIS_400, "mout_aclk_isp_dis_400", - mout_bus_mfc_pll_user_p, MUX_SEL_TOP2, 4, 1), - MUX(CLK_MOUT_ACLK_ISP_400, "mout_aclk_isp_400", - mout_bus_mfc_pll_user_p, MUX_SEL_TOP2, 0, 1), - - /* MUX_SEL_TOP3 */ - MUX(CLK_MOUT_ACLK_BUS0_400, "mout_aclk_bus0_400", - mout_bus_mphy_pll_user_p, MUX_SEL_TOP3, 20, 1), - MUX(CLK_MOUT_ACLK_MSCL_400_B, "mout_aclk_mscl_400_b", - mout_aclk_mscl_b_p, MUX_SEL_TOP3, 16, 1), - MUX(CLK_MOUT_ACLK_MSCL_400_A, "mout_aclk_mscl_400_a", - mout_bus_mfc_pll_user_p, MUX_SEL_TOP3, 12, 1), - MUX(CLK_MOUT_ACLK_GSCL_333, "mout_aclk_gscl_333", - mout_mfc_bus_pll_user_p, MUX_SEL_TOP3, 8, 1), - MUX(CLK_MOUT_ACLK_G2D_400_B, "mout_aclk_g2d_400_b", - mout_aclk_g2d_400_b_p, MUX_SEL_TOP3, 4, 1), - MUX(CLK_MOUT_ACLK_G2D_400_A, "mout_aclk_g2d_400_a", - mout_bus_mfc_pll_user_p, MUX_SEL_TOP3, 0, 1), - - /* MUX_SEL_TOP4 */ - MUX(CLK_MOUT_ACLK_MFC_400_C, "mout_aclk_mfc_400_c", - mout_aclk_mfc_400_c_p, MUX_SEL_TOP4, 8, 1), - MUX(CLK_MOUT_ACLK_MFC_400_B, "mout_aclk_mfc_400_b", - mout_aclk_mfc_400_b_p, MUX_SEL_TOP4, 4, 1), - MUX(CLK_MOUT_ACLK_MFC_400_A, "mout_aclk_mfc_400_a", - mout_aclk_mfc_400_a_p, MUX_SEL_TOP4, 0, 1), - - /* MUX_SEL_TOP_MSCL */ - MUX(CLK_MOUT_SCLK_JPEG_C, "mout_sclk_jpeg_c", mout_sclk_jpeg_c_p, - MUX_SEL_TOP_MSCL, 8, 1), - MUX(CLK_MOUT_SCLK_JPEG_B, "mout_sclk_jpeg_b", mout_sclk_jpeg_b_p, - MUX_SEL_TOP_MSCL, 4, 1), - MUX(CLK_MOUT_SCLK_JPEG_A, "mout_sclk_jpeg_a", mout_bus_pll_user_t_p, - MUX_SEL_TOP_MSCL, 0, 1), - - /* MUX_SEL_TOP_CAM1 */ - MUX(CLK_MOUT_SCLK_ISP_SENSOR2, "mout_sclk_isp_sensor2", - mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 24, 1), - MUX(CLK_MOUT_SCLK_ISP_SENSOR1, "mout_sclk_isp_sensor1", - mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 20, 1), - MUX(CLK_MOUT_SCLK_ISP_SENSOR0, "mout_sclk_isp_sensor0", - mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 16, 1), - MUX(CLK_MOUT_SCLK_ISP_UART, "mout_sclk_isp_uart", - mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 8, 1), - MUX(CLK_MOUT_SCLK_ISP_SPI1, "mout_sclk_isp_spi1", - mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 4, 1), - MUX(CLK_MOUT_SCLK_ISP_SPI0, "mout_sclk_isp_spi0", - mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 0, 1), - - /* MUX_SEL_TOP_FSYS0 */ - MUX(CLK_MOUT_SCLK_MMC2_B, "mout_sclk_mmc2_b", mout_sclk_mmc2_b_p, - MUX_SEL_TOP_FSYS0, 28, 1), - MUX(CLK_MOUT_SCLK_MMC2_A, "mout_sclk_mmc2_a", mout_bus_pll_user_t_p, - MUX_SEL_TOP_FSYS0, 24, 1), - MUX(CLK_MOUT_SCLK_MMC1_B, "mout_sclk_mmc1_b", mout_sclk_mmc1_b_p, - MUX_SEL_TOP_FSYS0, 20, 1), - MUX(CLK_MOUT_SCLK_MMC1_A, "mout_sclk_mmc1_a", mout_bus_pll_user_t_p, - MUX_SEL_TOP_FSYS0, 16, 1), - MUX(CLK_MOUT_SCLK_MMC0_D, "mout_sclk_mmc0_d", mout_sclk_mmc0_d_p, - MUX_SEL_TOP_FSYS0, 12, 1), - MUX(CLK_MOUT_SCLK_MMC0_C, "mout_sclk_mmc0_c", mout_sclk_mmc0_c_p, - MUX_SEL_TOP_FSYS0, 8, 1), - MUX(CLK_MOUT_SCLK_MMC0_B, "mout_sclk_mmc0_b", mout_sclk_mmc0_b_p, - MUX_SEL_TOP_FSYS0, 4, 1), - MUX(CLK_MOUT_SCLK_MMC0_A, "mout_sclk_mmc0_a", mout_bus_pll_user_t_p, - MUX_SEL_TOP_FSYS0, 0, 1), - - /* MUX_SEL_TOP_FSYS1 */ - MUX(CLK_MOUT_SCLK_PCIE_100, "mout_sclk_pcie_100", mout_bus_pll_user_t_p, - MUX_SEL_TOP_FSYS1, 12, 1), - MUX(CLK_MOUT_SCLK_UFSUNIPRO, "mout_sclk_ufsunipro", - mout_mphy_pll_user_t_p, MUX_SEL_TOP_FSYS1, 8, 1), - MUX(CLK_MOUT_SCLK_USBHOST30, "mout_sclk_usbhost30", - mout_bus_pll_user_t_p, MUX_SEL_TOP_FSYS1, 4, 1), - MUX(CLK_MOUT_SCLK_USBDRD30, "mout_sclk_usbdrd30", - mout_bus_pll_user_t_p, MUX_SEL_TOP_FSYS1, 0, 1), - - /* MUX_SEL_TOP_PERIC0 */ - MUX(CLK_MOUT_SCLK_SPI4, "mout_sclk_spi4", mout_bus_pll_user_t_p, - MUX_SEL_TOP_PERIC0, 28, 1), - MUX(CLK_MOUT_SCLK_SPI3, "mout_sclk_spi3", mout_bus_pll_user_t_p, - MUX_SEL_TOP_PERIC0, 24, 1), - MUX(CLK_MOUT_SCLK_UART2, "mout_sclk_uart2", mout_bus_pll_user_t_p, - MUX_SEL_TOP_PERIC0, 20, 1), - MUX(CLK_MOUT_SCLK_UART1, "mout_sclk_uart1", mout_bus_pll_user_t_p, - MUX_SEL_TOP_PERIC0, 16, 1), - MUX(CLK_MOUT_SCLK_UART0, "mout_sclk_uart0", mout_bus_pll_user_t_p, - MUX_SEL_TOP_PERIC0, 12, 1), - MUX(CLK_MOUT_SCLK_SPI2, "mout_sclk_spi2", mout_bus_pll_user_t_p, - MUX_SEL_TOP_PERIC0, 8, 1), - MUX(CLK_MOUT_SCLK_SPI1, "mout_sclk_spi1", mout_bus_pll_user_t_p, - MUX_SEL_TOP_PERIC0, 4, 1), - MUX(CLK_MOUT_SCLK_SPI0, "mout_sclk_spi0", mout_bus_pll_user_t_p, - MUX_SEL_TOP_PERIC0, 0, 1), - - /* MUX_SEL_TOP_PERIC1 */ - MUX(CLK_MOUT_SCLK_SLIMBUS, "mout_sclk_slimbus", mout_aud_pll_user_p, - MUX_SEL_TOP_PERIC1, 16, 1), - MUX(CLK_MOUT_SCLK_SPDIF, "mout_sclk_spdif", mout_sclk_spdif_p, - MUX_SEL_TOP_PERIC1, 12, 2), - MUX(CLK_MOUT_SCLK_AUDIO1, "mout_sclk_audio1", mout_sclk_audio1_p, - MUX_SEL_TOP_PERIC1, 4, 2), - MUX(CLK_MOUT_SCLK_AUDIO0, "mout_sclk_audio0", mout_sclk_audio0_p, - MUX_SEL_TOP_PERIC1, 0, 2), - - /* MUX_SEL_TOP_DISP */ - MUX(CLK_MOUT_SCLK_HDMI_SPDIF, "mout_sclk_hdmi_spdif", - mout_sclk_hdmi_spdif_p, MUX_SEL_TOP_DISP, 0, 1), -}; - -static const struct samsung_div_clock top_div_clks[] __initconst = { - /* DIV_TOP0 */ - DIV(CLK_DIV_ACLK_CAM1_333, "div_aclk_cam1_333", "mout_aclk_cam1_333", - DIV_TOP0, 28, 3), - DIV(CLK_DIV_ACLK_CAM1_400, "div_aclk_cam1_400", "mout_bus_pll_user", - DIV_TOP0, 24, 3), - DIV(CLK_DIV_ACLK_CAM1_552, "div_aclk_cam1_552", "mout_aclk_cam1_552_b", - DIV_TOP0, 20, 3), - DIV(CLK_DIV_ACLK_CAM0_333, "div_aclk_cam0_333", "mout_mfc_pll_user", - DIV_TOP0, 16, 3), - DIV(CLK_DIV_ACLK_CAM0_400, "div_aclk_cam0_400", "mout_bus_pll_user", - DIV_TOP0, 12, 3), - DIV(CLK_DIV_ACLK_CAM0_552, "div_aclk_cam0_552", "mout_isp_pll", - DIV_TOP0, 8, 3), - DIV(CLK_DIV_ACLK_ISP_DIS_400, "div_aclk_isp_dis_400", - "mout_aclk_isp_dis_400", DIV_TOP0, 4, 4), - DIV(CLK_DIV_ACLK_ISP_400, "div_aclk_isp_400", - "mout_aclk_isp_400", DIV_TOP0, 0, 4), - - /* DIV_TOP1 */ - DIV(CLK_DIV_ACLK_GSCL_111, "div_aclk_gscl_111", "mout_aclk_gscl_333", - DIV_TOP1, 28, 3), - DIV(CLK_DIV_ACLK_GSCL_333, "div_aclk_gscl_333", "mout_aclk_gscl_333", - DIV_TOP1, 24, 3), - DIV(CLK_DIV_ACLK_HEVC_400, "div_aclk_hevc_400", "mout_aclk_hevc_400", - DIV_TOP1, 20, 3), - DIV(CLK_DIV_ACLK_MFC_400, "div_aclk_mfc_400", "mout_aclk_mfc_400_c", - DIV_TOP1, 12, 3), - DIV(CLK_DIV_ACLK_G2D_266, "div_aclk_g2d_266", "mout_bus_pll_user", - DIV_TOP1, 8, 3), - DIV(CLK_DIV_ACLK_G2D_400, "div_aclk_g2d_400", "mout_aclk_g2d_400_b", - DIV_TOP1, 0, 3), - - /* DIV_TOP2 */ - DIV(CLK_DIV_ACLK_MSCL_400, "div_aclk_mscl_400", "mout_aclk_mscl_400_b", - DIV_TOP2, 4, 3), - DIV(CLK_DIV_ACLK_FSYS_200, "div_aclk_fsys_200", "mout_bus_pll_user", - DIV_TOP2, 0, 3), - - /* DIV_TOP3 */ - DIV(CLK_DIV_ACLK_IMEM_SSSX_266, "div_aclk_imem_sssx_266", - "mout_bus_pll_user", DIV_TOP3, 24, 3), - DIV(CLK_DIV_ACLK_IMEM_200, "div_aclk_imem_200", - "mout_bus_pll_user", DIV_TOP3, 20, 3), - DIV(CLK_DIV_ACLK_IMEM_266, "div_aclk_imem_266", - "mout_bus_pll_user", DIV_TOP3, 16, 3), - DIV(CLK_DIV_ACLK_PERIC_66_B, "div_aclk_peric_66_b", - "div_aclk_peric_66_a", DIV_TOP3, 12, 3), - DIV(CLK_DIV_ACLK_PERIC_66_A, "div_aclk_peric_66_a", - "mout_bus_pll_user", DIV_TOP3, 8, 3), - DIV(CLK_DIV_ACLK_PERIS_66_B, "div_aclk_peris_66_b", - "div_aclk_peris_66_a", DIV_TOP3, 4, 3), - DIV(CLK_DIV_ACLK_PERIS_66_A, "div_aclk_peris_66_a", - "mout_bus_pll_user", DIV_TOP3, 0, 3), - - /* DIV_TOP4 */ - DIV(CLK_DIV_ACLK_G3D_400, "div_aclk_g3d_400", "mout_bus_pll_user", - DIV_TOP4, 8, 3), - DIV(CLK_DIV_ACLK_BUS0_400, "div_aclk_bus0_400", "mout_aclk_bus0_400", - DIV_TOP4, 4, 3), - DIV(CLK_DIV_ACLK_BUS1_400, "div_aclk_bus1_400", "mout_bus_pll_user", - DIV_TOP4, 0, 3), - - /* DIV_TOP_MSCL */ - DIV(CLK_DIV_SCLK_JPEG, "div_sclk_jpeg", "mout_sclk_jpeg_c", - DIV_TOP_MSCL, 0, 4), - - /* DIV_TOP_CAM10 */ - DIV(CLK_DIV_SCLK_ISP_UART, "div_sclk_isp_uart", "mout_sclk_isp_uart", - DIV_TOP_CAM10, 24, 5), - DIV(CLK_DIV_SCLK_ISP_SPI1_B, "div_sclk_isp_spi1_b", - "div_sclk_isp_spi1_a", DIV_TOP_CAM10, 16, 8), - DIV(CLK_DIV_SCLK_ISP_SPI1_A, "div_sclk_isp_spi1_a", - "mout_sclk_isp_spi1", DIV_TOP_CAM10, 12, 4), - DIV(CLK_DIV_SCLK_ISP_SPI0_B, "div_sclk_isp_spi0_b", - "div_sclk_isp_spi0_a", DIV_TOP_CAM10, 4, 8), - DIV(CLK_DIV_SCLK_ISP_SPI0_A, "div_sclk_isp_spi0_a", - "mout_sclk_isp_spi0", DIV_TOP_CAM10, 0, 4), - - /* DIV_TOP_CAM11 */ - DIV(CLK_DIV_SCLK_ISP_SENSOR2_B, "div_sclk_isp_sensor2_b", - "div_sclk_isp_sensor2_a", DIV_TOP_CAM11, 20, 4), - DIV(CLK_DIV_SCLK_ISP_SENSOR2_A, "div_sclk_isp_sensor2_a", - "mout_sclk_isp_sensor2", DIV_TOP_CAM11, 16, 4), - DIV(CLK_DIV_SCLK_ISP_SENSOR1_B, "div_sclk_isp_sensor1_b", - "div_sclk_isp_sensor1_a", DIV_TOP_CAM11, 12, 4), - DIV(CLK_DIV_SCLK_ISP_SENSOR1_A, "div_sclk_isp_sensor1_a", - "mout_sclk_isp_sensor1", DIV_TOP_CAM11, 8, 4), - DIV(CLK_DIV_SCLK_ISP_SENSOR0_B, "div_sclk_isp_sensor0_b", - "div_sclk_isp_sensor0_a", DIV_TOP_CAM11, 4, 4), - DIV(CLK_DIV_SCLK_ISP_SENSOR0_A, "div_sclk_isp_sensor0_a", - "mout_sclk_isp_sensor0", DIV_TOP_CAM11, 0, 4), - - /* DIV_TOP_FSYS0 */ - DIV(CLK_DIV_SCLK_MMC1_B, "div_sclk_mmc1_b", "div_sclk_mmc1_a", - DIV_TOP_FSYS0, 16, 8), - DIV(CLK_DIV_SCLK_MMC1_A, "div_sclk_mmc1_a", "mout_sclk_mmc1_b", - DIV_TOP_FSYS0, 12, 4), - DIV_F(CLK_DIV_SCLK_MMC0_B, "div_sclk_mmc0_b", "div_sclk_mmc0_a", - DIV_TOP_FSYS0, 4, 8, CLK_SET_RATE_PARENT, 0), - DIV_F(CLK_DIV_SCLK_MMC0_A, "div_sclk_mmc0_a", "mout_sclk_mmc0_d", - DIV_TOP_FSYS0, 0, 4, CLK_SET_RATE_PARENT, 0), - - /* DIV_TOP_FSYS1 */ - DIV(CLK_DIV_SCLK_MMC2_B, "div_sclk_mmc2_b", "div_sclk_mmc2_a", - DIV_TOP_FSYS1, 4, 8), - DIV(CLK_DIV_SCLK_MMC2_A, "div_sclk_mmc2_a", "mout_sclk_mmc2_b", - DIV_TOP_FSYS1, 0, 4), - - /* DIV_TOP_FSYS2 */ - DIV(CLK_DIV_SCLK_PCIE_100, "div_sclk_pcie_100", "mout_sclk_pcie_100", - DIV_TOP_FSYS2, 12, 3), - DIV(CLK_DIV_SCLK_USBHOST30, "div_sclk_usbhost30", - "mout_sclk_usbhost30", DIV_TOP_FSYS2, 8, 4), - DIV(CLK_DIV_SCLK_UFSUNIPRO, "div_sclk_ufsunipro", - "mout_sclk_ufsunipro", DIV_TOP_FSYS2, 4, 4), - DIV(CLK_DIV_SCLK_USBDRD30, "div_sclk_usbdrd30", "mout_sclk_usbdrd30", - DIV_TOP_FSYS2, 0, 4), - - /* DIV_TOP_PERIC0 */ - DIV(CLK_DIV_SCLK_SPI1_B, "div_sclk_spi1_b", "div_sclk_spi1_a", - DIV_TOP_PERIC0, 16, 8), - DIV(CLK_DIV_SCLK_SPI1_A, "div_sclk_spi1_a", "mout_sclk_spi1", - DIV_TOP_PERIC0, 12, 4), - DIV(CLK_DIV_SCLK_SPI0_B, "div_sclk_spi0_b", "div_sclk_spi0_a", - DIV_TOP_PERIC0, 4, 8), - DIV(CLK_DIV_SCLK_SPI0_A, "div_sclk_spi0_a", "mout_sclk_spi0", - DIV_TOP_PERIC0, 0, 4), - - /* DIV_TOP_PERIC1 */ - DIV(CLK_DIV_SCLK_SPI2_B, "div_sclk_spi2_b", "div_sclk_spi2_a", - DIV_TOP_PERIC1, 4, 8), - DIV(CLK_DIV_SCLK_SPI2_A, "div_sclk_spi2_a", "mout_sclk_spi2", - DIV_TOP_PERIC1, 0, 4), - - /* DIV_TOP_PERIC2 */ - DIV(CLK_DIV_SCLK_UART2, "div_sclk_uart2", "mout_sclk_uart2", - DIV_TOP_PERIC2, 8, 4), - DIV(CLK_DIV_SCLK_UART1, "div_sclk_uart1", "mout_sclk_uart0", - DIV_TOP_PERIC2, 4, 4), - DIV(CLK_DIV_SCLK_UART0, "div_sclk_uart0", "mout_sclk_uart1", - DIV_TOP_PERIC2, 0, 4), - - /* DIV_TOP_PERIC3 */ - DIV(CLK_DIV_SCLK_I2S1, "div_sclk_i2s1", "sclk_audio1", - DIV_TOP_PERIC3, 16, 6), - DIV(CLK_DIV_SCLK_PCM1, "div_sclk_pcm1", "sclk_audio1", - DIV_TOP_PERIC3, 8, 8), - DIV(CLK_DIV_SCLK_AUDIO1, "div_sclk_audio1", "mout_sclk_audio1", - DIV_TOP_PERIC3, 4, 4), - DIV(CLK_DIV_SCLK_AUDIO0, "div_sclk_audio0", "mout_sclk_audio0", - DIV_TOP_PERIC3, 0, 4), - - /* DIV_TOP_PERIC4 */ - DIV(CLK_DIV_SCLK_SPI4_B, "div_sclk_spi4_b", "div_sclk_spi4_a", - DIV_TOP_PERIC4, 16, 8), - DIV(CLK_DIV_SCLK_SPI4_A, "div_sclk_spi4_a", "mout_sclk_spi4", - DIV_TOP_PERIC4, 12, 4), - DIV(CLK_DIV_SCLK_SPI3_B, "div_sclk_spi3_b", "div_sclk_spi3_a", - DIV_TOP_PERIC4, 4, 8), - DIV(CLK_DIV_SCLK_SPI3_A, "div_sclk_spi3_a", "mout_sclk_spi3", - DIV_TOP_PERIC4, 0, 4), -}; - -static const struct samsung_gate_clock top_gate_clks[] __initconst = { - /* ENABLE_ACLK_TOP */ - GATE(CLK_ACLK_G3D_400, "aclk_g3d_400", "div_aclk_g3d_400", - ENABLE_ACLK_TOP, 30, 0, 0), - GATE(CLK_ACLK_IMEM_SSX_266, "aclk_imem_ssx_266", - "div_aclk_imem_sssx_266", ENABLE_ACLK_TOP, - 29, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BUS0_400, "aclk_bus0_400", "div_aclk_bus0_400", - ENABLE_ACLK_TOP, 26, - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), - GATE(CLK_ACLK_BUS1_400, "aclk_bus1_400", "div_aclk_bus1_400", - ENABLE_ACLK_TOP, 25, - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), - GATE(CLK_ACLK_IMEM_200, "aclk_imem_200", "div_aclk_imem_266", - ENABLE_ACLK_TOP, 24, - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), - GATE(CLK_ACLK_IMEM_266, "aclk_imem_266", "div_aclk_imem_200", - ENABLE_ACLK_TOP, 23, - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), - GATE(CLK_ACLK_PERIC_66, "aclk_peric_66", "div_aclk_peric_66_b", - ENABLE_ACLK_TOP, 22, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_PERIS_66, "aclk_peris_66", "div_aclk_peris_66_b", - ENABLE_ACLK_TOP, 21, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MSCL_400, "aclk_mscl_400", "div_aclk_mscl_400", - ENABLE_ACLK_TOP, 19, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_FSYS_200, "aclk_fsys_200", "div_aclk_fsys_200", - ENABLE_ACLK_TOP, 18, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_GSCL_111, "aclk_gscl_111", "div_aclk_gscl_111", - ENABLE_ACLK_TOP, 15, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_GSCL_333, "aclk_gscl_333", "div_aclk_gscl_333", - ENABLE_ACLK_TOP, 14, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_CAM1_333, "aclk_cam1_333", "div_aclk_cam1_333", - ENABLE_ACLK_TOP, 13, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_CAM1_400, "aclk_cam1_400", "div_aclk_cam1_400", - ENABLE_ACLK_TOP, 12, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_CAM1_552, "aclk_cam1_552", "div_aclk_cam1_552", - ENABLE_ACLK_TOP, 11, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_CAM0_333, "aclk_cam0_333", "div_aclk_cam0_333", - ENABLE_ACLK_TOP, 10, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_CAM0_400, "aclk_cam0_400", "div_aclk_cam0_400", - ENABLE_ACLK_TOP, 9, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_CAM0_552, "aclk_cam0_552", "div_aclk_cam0_552", - ENABLE_ACLK_TOP, 8, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ISP_DIS_400, "aclk_isp_dis_400", "div_aclk_isp_dis_400", - ENABLE_ACLK_TOP, 7, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ISP_400, "aclk_isp_400", "div_aclk_isp_400", - ENABLE_ACLK_TOP, 6, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_HEVC_400, "aclk_hevc_400", "div_aclk_hevc_400", - ENABLE_ACLK_TOP, 5, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MFC_400, "aclk_mfc_400", "div_aclk_mfc_400", - ENABLE_ACLK_TOP, 3, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_G2D_266, "aclk_g2d_266", "div_aclk_g2d_266", - ENABLE_ACLK_TOP, 2, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_G2D_400, "aclk_g2d_400", "div_aclk_g2d_400", - ENABLE_ACLK_TOP, 0, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_TOP_MSCL */ - GATE(CLK_SCLK_JPEG_MSCL, "sclk_jpeg_mscl", "div_sclk_jpeg", - ENABLE_SCLK_TOP_MSCL, 0, 0, 0), - - /* ENABLE_SCLK_TOP_CAM1 */ - GATE(CLK_SCLK_ISP_SENSOR2, "sclk_isp_sensor2", "div_sclk_isp_sensor2_b", - ENABLE_SCLK_TOP_CAM1, 7, 0, 0), - GATE(CLK_SCLK_ISP_SENSOR1, "sclk_isp_sensor1", "div_sclk_isp_sensor1_b", - ENABLE_SCLK_TOP_CAM1, 6, 0, 0), - GATE(CLK_SCLK_ISP_SENSOR0, "sclk_isp_sensor0", "div_sclk_isp_sensor0_b", - ENABLE_SCLK_TOP_CAM1, 5, 0, 0), - GATE(CLK_SCLK_ISP_MCTADC_CAM1, "sclk_isp_mctadc_cam1", "oscclk", - ENABLE_SCLK_TOP_CAM1, 4, 0, 0), - GATE(CLK_SCLK_ISP_UART_CAM1, "sclk_isp_uart_cam1", "div_sclk_isp_uart", - ENABLE_SCLK_TOP_CAM1, 2, 0, 0), - GATE(CLK_SCLK_ISP_SPI1_CAM1, "sclk_isp_spi1_cam1", "div_sclk_isp_spi1_b", - ENABLE_SCLK_TOP_CAM1, 1, 0, 0), - GATE(CLK_SCLK_ISP_SPI0_CAM1, "sclk_isp_spi0_cam1", "div_sclk_isp_spi0_b", - ENABLE_SCLK_TOP_CAM1, 0, 0, 0), - - /* ENABLE_SCLK_TOP_DISP */ - GATE(CLK_SCLK_HDMI_SPDIF_DISP, "sclk_hdmi_spdif_disp", - "mout_sclk_hdmi_spdif", ENABLE_SCLK_TOP_DISP, 0, - CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_TOP_FSYS */ - GATE(CLK_SCLK_PCIE_100_FSYS, "sclk_pcie_100_fsys", "div_sclk_pcie_100", - ENABLE_SCLK_TOP_FSYS, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_MMC2_FSYS, "sclk_mmc2_fsys", "div_sclk_mmc2_b", - ENABLE_SCLK_TOP_FSYS, 6, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC1_FSYS, "sclk_mmc1_fsys", "div_sclk_mmc1_b", - ENABLE_SCLK_TOP_FSYS, 5, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC0_FSYS, "sclk_mmc0_fsys", "div_sclk_mmc0_b", - ENABLE_SCLK_TOP_FSYS, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UFSUNIPRO_FSYS, "sclk_ufsunipro_fsys", - "div_sclk_ufsunipro", ENABLE_SCLK_TOP_FSYS, - 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_USBHOST30_FSYS, "sclk_usbhost30_fsys", - "div_sclk_usbhost30", ENABLE_SCLK_TOP_FSYS, - 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_USBDRD30_FSYS, "sclk_usbdrd30_fsys", - "div_sclk_usbdrd30", ENABLE_SCLK_TOP_FSYS, - 0, CLK_SET_RATE_PARENT, 0), - - /* ENABLE_SCLK_TOP_PERIC */ - GATE(CLK_SCLK_SPI4_PERIC, "sclk_spi4_peric", "div_sclk_spi4_b", - ENABLE_SCLK_TOP_PERIC, 12, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI3_PERIC, "sclk_spi3_peric", "div_sclk_spi3_b", - ENABLE_SCLK_TOP_PERIC, 11, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPDIF_PERIC, "sclk_spdif_peric", "mout_sclk_spdif", - ENABLE_SCLK_TOP_PERIC, 9, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_I2S1_PERIC, "sclk_i2s1_peric", "div_sclk_i2s1", - ENABLE_SCLK_TOP_PERIC, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PCM1_PERIC, "sclk_pcm1_peric", "div_sclk_pcm1", - ENABLE_SCLK_TOP_PERIC, 7, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART2_PERIC, "sclk_uart2_peric", "div_sclk_uart2", - ENABLE_SCLK_TOP_PERIC, 5, CLK_SET_RATE_PARENT | - CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_UART1_PERIC, "sclk_uart1_peric", "div_sclk_uart1", - ENABLE_SCLK_TOP_PERIC, 4, CLK_SET_RATE_PARENT | - CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_UART0_PERIC, "sclk_uart0_peric", "div_sclk_uart0", - ENABLE_SCLK_TOP_PERIC, 3, CLK_SET_RATE_PARENT | - CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_SPI2_PERIC, "sclk_spi2_peric", "div_sclk_spi2_b", - ENABLE_SCLK_TOP_PERIC, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI1_PERIC, "sclk_spi1_peric", "div_sclk_spi1_b", - ENABLE_SCLK_TOP_PERIC, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI0_PERIC, "sclk_spi0_peric", "div_sclk_spi0_b", - ENABLE_SCLK_TOP_PERIC, 0, CLK_SET_RATE_PARENT, 0), - - /* MUX_ENABLE_TOP_PERIC1 */ - GATE(CLK_SCLK_SLIMBUS, "sclk_slimbus", "mout_sclk_slimbus", - MUX_ENABLE_TOP_PERIC1, 16, 0, 0), - GATE(CLK_SCLK_AUDIO1, "sclk_audio1", "div_sclk_audio1", - MUX_ENABLE_TOP_PERIC1, 4, 0, 0), - GATE(CLK_SCLK_AUDIO0, "sclk_audio0", "div_sclk_audio0", - MUX_ENABLE_TOP_PERIC1, 0, 0, 0), -}; - -/* - * ATLAS_PLL & APOLLO_PLL & MEM0_PLL & MEM1_PLL & BUS_PLL & MFC_PLL - * & MPHY_PLL & G3D_PLL & DISP_PLL & ISP_PLL - */ -static const struct samsung_pll_rate_table exynos5443_pll_rates[] __initconst = { - PLL_35XX_RATE(2500000000U, 625, 6, 0), - PLL_35XX_RATE(2400000000U, 500, 5, 0), - PLL_35XX_RATE(2300000000U, 575, 6, 0), - PLL_35XX_RATE(2200000000U, 550, 6, 0), - PLL_35XX_RATE(2100000000U, 350, 4, 0), - PLL_35XX_RATE(2000000000U, 500, 6, 0), - PLL_35XX_RATE(1900000000U, 475, 6, 0), - PLL_35XX_RATE(1800000000U, 375, 5, 0), - PLL_35XX_RATE(1700000000U, 425, 6, 0), - PLL_35XX_RATE(1600000000U, 400, 6, 0), - PLL_35XX_RATE(1500000000U, 250, 4, 0), - PLL_35XX_RATE(1400000000U, 350, 6, 0), - PLL_35XX_RATE(1332000000U, 222, 4, 0), - PLL_35XX_RATE(1300000000U, 325, 6, 0), - PLL_35XX_RATE(1200000000U, 500, 5, 1), - PLL_35XX_RATE(1100000000U, 550, 6, 1), - PLL_35XX_RATE(1086000000U, 362, 4, 1), - PLL_35XX_RATE(1066000000U, 533, 6, 1), - PLL_35XX_RATE(1000000000U, 500, 6, 1), - PLL_35XX_RATE(933000000U, 311, 4, 1), - PLL_35XX_RATE(921000000U, 307, 4, 1), - PLL_35XX_RATE(900000000U, 375, 5, 1), - PLL_35XX_RATE(825000000U, 275, 4, 1), - PLL_35XX_RATE(800000000U, 400, 6, 1), - PLL_35XX_RATE(733000000U, 733, 12, 1), - PLL_35XX_RATE(700000000U, 175, 3, 1), - PLL_35XX_RATE(667000000U, 222, 4, 1), - PLL_35XX_RATE(633000000U, 211, 4, 1), - PLL_35XX_RATE(600000000U, 500, 5, 2), - PLL_35XX_RATE(552000000U, 460, 5, 2), - PLL_35XX_RATE(550000000U, 550, 6, 2), - PLL_35XX_RATE(543000000U, 362, 4, 2), - PLL_35XX_RATE(533000000U, 533, 6, 2), - PLL_35XX_RATE(500000000U, 500, 6, 2), - PLL_35XX_RATE(444000000U, 370, 5, 2), - PLL_35XX_RATE(420000000U, 350, 5, 2), - PLL_35XX_RATE(400000000U, 400, 6, 2), - PLL_35XX_RATE(350000000U, 350, 6, 2), - PLL_35XX_RATE(333000000U, 222, 4, 2), - PLL_35XX_RATE(300000000U, 500, 5, 3), - PLL_35XX_RATE(266000000U, 532, 6, 3), - PLL_35XX_RATE(200000000U, 400, 6, 3), - PLL_35XX_RATE(166000000U, 332, 6, 3), - PLL_35XX_RATE(160000000U, 320, 6, 3), - PLL_35XX_RATE(133000000U, 532, 6, 4), - PLL_35XX_RATE(100000000U, 400, 6, 4), - { /* sentinel */ } -}; - -/* AUD_PLL */ -static const struct samsung_pll_rate_table exynos5443_aud_pll_rates[] __initconst = { - PLL_36XX_RATE(400000000U, 200, 3, 2, 0), - PLL_36XX_RATE(393216000U, 197, 3, 2, -25690), - PLL_36XX_RATE(384000000U, 128, 2, 2, 0), - PLL_36XX_RATE(368640000U, 246, 4, 2, -15729), - PLL_36XX_RATE(361507200U, 181, 3, 2, -16148), - PLL_36XX_RATE(338688000U, 113, 2, 2, -6816), - PLL_36XX_RATE(294912000U, 98, 1, 3, 19923), - PLL_36XX_RATE(288000000U, 96, 1, 3, 0), - PLL_36XX_RATE(252000000U, 84, 1, 3, 0), - { /* sentinel */ } -}; - -static const struct samsung_pll_clock top_pll_clks[] __initconst = { - PLL(pll_35xx, CLK_FOUT_ISP_PLL, "fout_isp_pll", "oscclk", - ISP_PLL_LOCK, ISP_PLL_CON0, exynos5443_pll_rates), - PLL(pll_36xx, CLK_FOUT_AUD_PLL, "fout_aud_pll", "oscclk", - AUD_PLL_LOCK, AUD_PLL_CON0, exynos5443_aud_pll_rates), -}; - -static const struct samsung_cmu_info top_cmu_info __initconst = { - .pll_clks = top_pll_clks, - .nr_pll_clks = ARRAY_SIZE(top_pll_clks), - .mux_clks = top_mux_clks, - .nr_mux_clks = ARRAY_SIZE(top_mux_clks), - .div_clks = top_div_clks, - .nr_div_clks = ARRAY_SIZE(top_div_clks), - .gate_clks = top_gate_clks, - .nr_gate_clks = ARRAY_SIZE(top_gate_clks), - .fixed_clks = top_fixed_clks, - .nr_fixed_clks = ARRAY_SIZE(top_fixed_clks), - .fixed_factor_clks = top_fixed_factor_clks, - .nr_fixed_factor_clks = ARRAY_SIZE(top_fixed_factor_clks), - .nr_clk_ids = TOP_NR_CLK, - .clk_regs = top_clk_regs, - .nr_clk_regs = ARRAY_SIZE(top_clk_regs), -}; - -static void __init exynos5433_cmu_top_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &top_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_top, "samsung,exynos5433-cmu-top", - exynos5433_cmu_top_init); - -/* - * Register offset definitions for CMU_CPIF - */ -#define MPHY_PLL_LOCK 0x0000 -#define MPHY_PLL_CON0 0x0100 -#define MPHY_PLL_CON1 0x0104 -#define MPHY_PLL_FREQ_DET 0x010c -#define MUX_SEL_CPIF0 0x0200 -#define DIV_CPIF 0x0600 -#define ENABLE_SCLK_CPIF 0x0a00 - -static const unsigned long cpif_clk_regs[] __initconst = { - MPHY_PLL_LOCK, - MPHY_PLL_CON0, - MPHY_PLL_CON1, - MPHY_PLL_FREQ_DET, - MUX_SEL_CPIF0, - DIV_CPIF, - ENABLE_SCLK_CPIF, -}; - -/* list of all parent clock list */ -PNAME(mout_mphy_pll_p) = { "oscclk", "fout_mphy_pll", }; - -static const struct samsung_pll_clock cpif_pll_clks[] __initconst = { - PLL(pll_35xx, CLK_FOUT_MPHY_PLL, "fout_mphy_pll", "oscclk", - MPHY_PLL_LOCK, MPHY_PLL_CON0, exynos5443_pll_rates), -}; - -static const struct samsung_mux_clock cpif_mux_clks[] __initconst = { - /* MUX_SEL_CPIF0 */ - MUX(CLK_MOUT_MPHY_PLL, "mout_mphy_pll", mout_mphy_pll_p, MUX_SEL_CPIF0, - 0, 1), -}; - -static const struct samsung_div_clock cpif_div_clks[] __initconst = { - /* DIV_CPIF */ - DIV(CLK_DIV_SCLK_MPHY, "div_sclk_mphy", "mout_mphy_pll", DIV_CPIF, - 0, 6), -}; - -static const struct samsung_gate_clock cpif_gate_clks[] __initconst = { - /* ENABLE_SCLK_CPIF */ - GATE(CLK_SCLK_MPHY_PLL, "sclk_mphy_pll", "mout_mphy_pll", - ENABLE_SCLK_CPIF, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_UFS_MPHY, "sclk_ufs_mphy", "div_sclk_mphy", - ENABLE_SCLK_CPIF, 4, 0, 0), -}; - -static const struct samsung_cmu_info cpif_cmu_info __initconst = { - .pll_clks = cpif_pll_clks, - .nr_pll_clks = ARRAY_SIZE(cpif_pll_clks), - .mux_clks = cpif_mux_clks, - .nr_mux_clks = ARRAY_SIZE(cpif_mux_clks), - .div_clks = cpif_div_clks, - .nr_div_clks = ARRAY_SIZE(cpif_div_clks), - .gate_clks = cpif_gate_clks, - .nr_gate_clks = ARRAY_SIZE(cpif_gate_clks), - .nr_clk_ids = CPIF_NR_CLK, - .clk_regs = cpif_clk_regs, - .nr_clk_regs = ARRAY_SIZE(cpif_clk_regs), -}; - -static void __init exynos5433_cmu_cpif_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &cpif_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_cpif, "samsung,exynos5433-cmu-cpif", - exynos5433_cmu_cpif_init); - -/* - * Register offset definitions for CMU_MIF - */ -#define MEM0_PLL_LOCK 0x0000 -#define MEM1_PLL_LOCK 0x0004 -#define BUS_PLL_LOCK 0x0008 -#define MFC_PLL_LOCK 0x000c -#define MEM0_PLL_CON0 0x0100 -#define MEM0_PLL_CON1 0x0104 -#define MEM0_PLL_FREQ_DET 0x010c -#define MEM1_PLL_CON0 0x0110 -#define MEM1_PLL_CON1 0x0114 -#define MEM1_PLL_FREQ_DET 0x011c -#define BUS_PLL_CON0 0x0120 -#define BUS_PLL_CON1 0x0124 -#define BUS_PLL_FREQ_DET 0x012c -#define MFC_PLL_CON0 0x0130 -#define MFC_PLL_CON1 0x0134 -#define MFC_PLL_FREQ_DET 0x013c -#define MUX_SEL_MIF0 0x0200 -#define MUX_SEL_MIF1 0x0204 -#define MUX_SEL_MIF2 0x0208 -#define MUX_SEL_MIF3 0x020c -#define MUX_SEL_MIF4 0x0210 -#define MUX_SEL_MIF5 0x0214 -#define MUX_SEL_MIF6 0x0218 -#define MUX_SEL_MIF7 0x021c -#define MUX_ENABLE_MIF0 0x0300 -#define MUX_ENABLE_MIF1 0x0304 -#define MUX_ENABLE_MIF2 0x0308 -#define MUX_ENABLE_MIF3 0x030c -#define MUX_ENABLE_MIF4 0x0310 -#define MUX_ENABLE_MIF5 0x0314 -#define MUX_ENABLE_MIF6 0x0318 -#define MUX_ENABLE_MIF7 0x031c -#define MUX_STAT_MIF0 0x0400 -#define MUX_STAT_MIF1 0x0404 -#define MUX_STAT_MIF2 0x0408 -#define MUX_STAT_MIF3 0x040c -#define MUX_STAT_MIF4 0x0410 -#define MUX_STAT_MIF5 0x0414 -#define MUX_STAT_MIF6 0x0418 -#define MUX_STAT_MIF7 0x041c -#define DIV_MIF1 0x0604 -#define DIV_MIF2 0x0608 -#define DIV_MIF3 0x060c -#define DIV_MIF4 0x0610 -#define DIV_MIF5 0x0614 -#define DIV_MIF_PLL_FREQ_DET 0x0618 -#define DIV_STAT_MIF1 0x0704 -#define DIV_STAT_MIF2 0x0708 -#define DIV_STAT_MIF3 0x070c -#define DIV_STAT_MIF4 0x0710 -#define DIV_STAT_MIF5 0x0714 -#define DIV_STAT_MIF_PLL_FREQ_DET 0x0718 -#define ENABLE_ACLK_MIF0 0x0800 -#define ENABLE_ACLK_MIF1 0x0804 -#define ENABLE_ACLK_MIF2 0x0808 -#define ENABLE_ACLK_MIF3 0x080c -#define ENABLE_PCLK_MIF 0x0900 -#define ENABLE_PCLK_MIF_SECURE_DREX0_TZ 0x0904 -#define ENABLE_PCLK_MIF_SECURE_DREX1_TZ 0x0908 -#define ENABLE_PCLK_MIF_SECURE_MONOTONIC_CNT 0x090c -#define ENABLE_PCLK_MIF_SECURE_RTC 0x0910 -#define ENABLE_SCLK_MIF 0x0a00 -#define ENABLE_IP_MIF0 0x0b00 -#define ENABLE_IP_MIF1 0x0b04 -#define ENABLE_IP_MIF2 0x0b08 -#define ENABLE_IP_MIF3 0x0b0c -#define ENABLE_IP_MIF_SECURE_DREX0_TZ 0x0b10 -#define ENABLE_IP_MIF_SECURE_DREX1_TZ 0x0b14 -#define ENABLE_IP_MIF_SECURE_MONOTONIC_CNT 0x0b18 -#define ENABLE_IP_MIF_SECURE_RTC 0x0b1c -#define CLKOUT_CMU_MIF 0x0c00 -#define CLKOUT_CMU_MIF_DIV_STAT 0x0c04 -#define DREX_FREQ_CTRL0 0x1000 -#define DREX_FREQ_CTRL1 0x1004 -#define PAUSE 0x1008 -#define DDRPHY_LOCK_CTRL 0x100c - -static const unsigned long mif_clk_regs[] __initconst = { - MEM0_PLL_LOCK, - MEM1_PLL_LOCK, - BUS_PLL_LOCK, - MFC_PLL_LOCK, - MEM0_PLL_CON0, - MEM0_PLL_CON1, - MEM0_PLL_FREQ_DET, - MEM1_PLL_CON0, - MEM1_PLL_CON1, - MEM1_PLL_FREQ_DET, - BUS_PLL_CON0, - BUS_PLL_CON1, - BUS_PLL_FREQ_DET, - MFC_PLL_CON0, - MFC_PLL_CON1, - MFC_PLL_FREQ_DET, - MUX_SEL_MIF0, - MUX_SEL_MIF1, - MUX_SEL_MIF2, - MUX_SEL_MIF3, - MUX_SEL_MIF4, - MUX_SEL_MIF5, - MUX_SEL_MIF6, - MUX_SEL_MIF7, - MUX_ENABLE_MIF0, - MUX_ENABLE_MIF1, - MUX_ENABLE_MIF2, - MUX_ENABLE_MIF3, - MUX_ENABLE_MIF4, - MUX_ENABLE_MIF5, - MUX_ENABLE_MIF6, - MUX_ENABLE_MIF7, - DIV_MIF1, - DIV_MIF2, - DIV_MIF3, - DIV_MIF4, - DIV_MIF5, - DIV_MIF_PLL_FREQ_DET, - ENABLE_ACLK_MIF0, - ENABLE_ACLK_MIF1, - ENABLE_ACLK_MIF2, - ENABLE_ACLK_MIF3, - ENABLE_PCLK_MIF, - ENABLE_PCLK_MIF_SECURE_DREX0_TZ, - ENABLE_PCLK_MIF_SECURE_DREX1_TZ, - ENABLE_PCLK_MIF_SECURE_MONOTONIC_CNT, - ENABLE_PCLK_MIF_SECURE_RTC, - ENABLE_SCLK_MIF, - ENABLE_IP_MIF0, - ENABLE_IP_MIF1, - ENABLE_IP_MIF2, - ENABLE_IP_MIF3, - ENABLE_IP_MIF_SECURE_DREX0_TZ, - ENABLE_IP_MIF_SECURE_DREX1_TZ, - ENABLE_IP_MIF_SECURE_MONOTONIC_CNT, - ENABLE_IP_MIF_SECURE_RTC, - CLKOUT_CMU_MIF, - CLKOUT_CMU_MIF_DIV_STAT, - DREX_FREQ_CTRL0, - DREX_FREQ_CTRL1, - PAUSE, - DDRPHY_LOCK_CTRL, -}; - -static const struct samsung_pll_clock mif_pll_clks[] __initconst = { - PLL(pll_35xx, CLK_FOUT_MEM0_PLL, "fout_mem0_pll", "oscclk", - MEM0_PLL_LOCK, MEM0_PLL_CON0, exynos5443_pll_rates), - PLL(pll_35xx, CLK_FOUT_MEM1_PLL, "fout_mem1_pll", "oscclk", - MEM1_PLL_LOCK, MEM1_PLL_CON0, exynos5443_pll_rates), - PLL(pll_35xx, CLK_FOUT_BUS_PLL, "fout_bus_pll", "oscclk", - BUS_PLL_LOCK, BUS_PLL_CON0, exynos5443_pll_rates), - PLL(pll_35xx, CLK_FOUT_MFC_PLL, "fout_mfc_pll", "oscclk", - MFC_PLL_LOCK, MFC_PLL_CON0, exynos5443_pll_rates), -}; - -/* list of all parent clock list */ -PNAME(mout_mfc_pll_div2_p) = { "mout_mfc_pll", "dout_mfc_pll", }; -PNAME(mout_bus_pll_div2_p) = { "mout_bus_pll", "dout_bus_pll", }; -PNAME(mout_mem1_pll_div2_p) = { "mout_mem1_pll", "dout_mem1_pll", }; -PNAME(mout_mem0_pll_div2_p) = { "mout_mem0_pll", "dout_mem0_pll", }; -PNAME(mout_mfc_pll_p) = { "oscclk", "fout_mfc_pll", }; -PNAME(mout_bus_pll_p) = { "oscclk", "fout_bus_pll", }; -PNAME(mout_mem1_pll_p) = { "oscclk", "fout_mem1_pll", }; -PNAME(mout_mem0_pll_p) = { "oscclk", "fout_mem0_pll", }; - -PNAME(mout_clk2x_phy_c_p) = { "mout_mem0_pll_div2", "mout_clkm_phy_b", }; -PNAME(mout_clk2x_phy_b_p) = { "mout_bus_pll_div2", "mout_clkm_phy_a", }; -PNAME(mout_clk2x_phy_a_p) = { "mout_bus_pll_div2", "mout_mfc_pll_div2", }; -PNAME(mout_clkm_phy_b_p) = { "mout_mem1_pll_div2", "mout_clkm_phy_a", }; - -PNAME(mout_aclk_mifnm_200_p) = { "mout_mem0_pll_div2", "div_mif_pre", }; -PNAME(mout_aclk_mifnm_400_p) = { "mout_mem1_pll_div2", "mout_bus_pll_div2",}; - -PNAME(mout_aclk_disp_333_b_p) = { "mout_aclk_disp_333_a", - "mout_bus_pll_div2", }; -PNAME(mout_aclk_disp_333_a_p) = { "mout_mfc_pll_div2", "sclk_mphy_pll", }; - -PNAME(mout_sclk_decon_vclk_c_p) = { "mout_sclk_decon_vclk_b", - "sclk_mphy_pll", }; -PNAME(mout_sclk_decon_vclk_b_p) = { "mout_sclk_decon_vclk_a", - "mout_mfc_pll_div2", }; -PNAME(mout_sclk_decon_p) = { "oscclk", "mout_bus_pll_div2", }; -PNAME(mout_sclk_decon_eclk_c_p) = { "mout_sclk_decon_eclk_b", - "sclk_mphy_pll", }; -PNAME(mout_sclk_decon_eclk_b_p) = { "mout_sclk_decon_eclk_a", - "mout_mfc_pll_div2", }; - -PNAME(mout_sclk_decon_tv_eclk_c_p) = { "mout_sclk_decon_tv_eclk_b", - "sclk_mphy_pll", }; -PNAME(mout_sclk_decon_tv_eclk_b_p) = { "mout_sclk_decon_tv_eclk_a", - "mout_mfc_pll_div2", }; -PNAME(mout_sclk_dsd_c_p) = { "mout_sclk_dsd_b", "mout_bus_pll_div2", }; -PNAME(mout_sclk_dsd_b_p) = { "mout_sclk_dsd_a", "sclk_mphy_pll", }; -PNAME(mout_sclk_dsd_a_p) = { "oscclk", "mout_mfc_pll_div2", }; - -PNAME(mout_sclk_dsim0_c_p) = { "mout_sclk_dsim0_b", "sclk_mphy_pll", }; -PNAME(mout_sclk_dsim0_b_p) = { "mout_sclk_dsim0_a", "mout_mfc_pll_div2" }; - -PNAME(mout_sclk_decon_tv_vclk_c_p) = { "mout_sclk_decon_tv_vclk_b", - "sclk_mphy_pll", }; -PNAME(mout_sclk_decon_tv_vclk_b_p) = { "mout_sclk_decon_tv_vclk_a", - "mout_mfc_pll_div2", }; -PNAME(mout_sclk_dsim1_c_p) = { "mout_sclk_dsim1_b", "sclk_mphy_pll", }; -PNAME(mout_sclk_dsim1_b_p) = { "mout_sclk_dsim1_a", "mout_mfc_pll_div2",}; - -static const struct samsung_fixed_factor_clock mif_fixed_factor_clks[] __initconst = { - /* dout_{mfc|bus|mem1|mem0}_pll is half fixed rate from parent mux */ - FFACTOR(CLK_DOUT_MFC_PLL, "dout_mfc_pll", "mout_mfc_pll", 1, 1, 0), - FFACTOR(CLK_DOUT_BUS_PLL, "dout_bus_pll", "mout_bus_pll", 1, 1, 0), - FFACTOR(CLK_DOUT_MEM1_PLL, "dout_mem1_pll", "mout_mem1_pll", 1, 1, 0), - FFACTOR(CLK_DOUT_MEM0_PLL, "dout_mem0_pll", "mout_mem0_pll", 1, 1, 0), -}; - -static const struct samsung_mux_clock mif_mux_clks[] __initconst = { - /* MUX_SEL_MIF0 */ - MUX(CLK_MOUT_MFC_PLL_DIV2, "mout_mfc_pll_div2", mout_mfc_pll_div2_p, - MUX_SEL_MIF0, 28, 1), - MUX(CLK_MOUT_BUS_PLL_DIV2, "mout_bus_pll_div2", mout_bus_pll_div2_p, - MUX_SEL_MIF0, 24, 1), - MUX(CLK_MOUT_MEM1_PLL_DIV2, "mout_mem1_pll_div2", mout_mem1_pll_div2_p, - MUX_SEL_MIF0, 20, 1), - MUX(CLK_MOUT_MEM0_PLL_DIV2, "mout_mem0_pll_div2", mout_mem0_pll_div2_p, - MUX_SEL_MIF0, 16, 1), - MUX(CLK_MOUT_MFC_PLL, "mout_mfc_pll", mout_mfc_pll_p, MUX_SEL_MIF0, - 12, 1), - MUX(CLK_MOUT_BUS_PLL, "mout_bus_pll", mout_bus_pll_p, MUX_SEL_MIF0, - 8, 1), - MUX(CLK_MOUT_MEM1_PLL, "mout_mem1_pll", mout_mem1_pll_p, MUX_SEL_MIF0, - 4, 1), - MUX(CLK_MOUT_MEM0_PLL, "mout_mem0_pll", mout_mem0_pll_p, MUX_SEL_MIF0, - 0, 1), - - /* MUX_SEL_MIF1 */ - MUX(CLK_MOUT_CLK2X_PHY_C, "mout_clk2x_phy_c", mout_clk2x_phy_c_p, - MUX_SEL_MIF1, 24, 1), - MUX(CLK_MOUT_CLK2X_PHY_B, "mout_clk2x_phy_b", mout_clk2x_phy_b_p, - MUX_SEL_MIF1, 20, 1), - MUX(CLK_MOUT_CLK2X_PHY_A, "mout_clk2x_phy_a", mout_clk2x_phy_a_p, - MUX_SEL_MIF1, 16, 1), - MUX(CLK_MOUT_CLKM_PHY_C, "mout_clkm_phy_c", mout_clk2x_phy_c_p, - MUX_SEL_MIF1, 12, 1), - MUX(CLK_MOUT_CLKM_PHY_B, "mout_clkm_phy_b", mout_clkm_phy_b_p, - MUX_SEL_MIF1, 8, 1), - MUX(CLK_MOUT_CLKM_PHY_A, "mout_clkm_phy_a", mout_clk2x_phy_a_p, - MUX_SEL_MIF1, 4, 1), - - /* MUX_SEL_MIF2 */ - MUX(CLK_MOUT_ACLK_MIFNM_200, "mout_aclk_mifnm_200", - mout_aclk_mifnm_200_p, MUX_SEL_MIF2, 8, 1), - MUX(CLK_MOUT_ACLK_MIFNM_400, "mout_aclk_mifnm_400", - mout_aclk_mifnm_400_p, MUX_SEL_MIF2, 0, 1), - - /* MUX_SEL_MIF3 */ - MUX(CLK_MOUT_ACLK_DISP_333_B, "mout_aclk_disp_333_b", - mout_aclk_disp_333_b_p, MUX_SEL_MIF3, 4, 1), - MUX(CLK_MOUT_ACLK_DISP_333_A, "mout_aclk_disp_333_a", - mout_aclk_disp_333_a_p, MUX_SEL_MIF3, 0, 1), - - /* MUX_SEL_MIF4 */ - MUX(CLK_MOUT_SCLK_DECON_VCLK_C, "mout_sclk_decon_vclk_c", - mout_sclk_decon_vclk_c_p, MUX_SEL_MIF4, 24, 1), - MUX(CLK_MOUT_SCLK_DECON_VCLK_B, "mout_sclk_decon_vclk_b", - mout_sclk_decon_vclk_b_p, MUX_SEL_MIF4, 20, 1), - MUX(CLK_MOUT_SCLK_DECON_VCLK_A, "mout_sclk_decon_vclk_a", - mout_sclk_decon_p, MUX_SEL_MIF4, 16, 1), - MUX(CLK_MOUT_SCLK_DECON_ECLK_C, "mout_sclk_decon_eclk_c", - mout_sclk_decon_eclk_c_p, MUX_SEL_MIF4, 8, 1), - MUX(CLK_MOUT_SCLK_DECON_ECLK_B, "mout_sclk_decon_eclk_b", - mout_sclk_decon_eclk_b_p, MUX_SEL_MIF4, 4, 1), - MUX(CLK_MOUT_SCLK_DECON_ECLK_A, "mout_sclk_decon_eclk_a", - mout_sclk_decon_p, MUX_SEL_MIF4, 0, 1), - - /* MUX_SEL_MIF5 */ - MUX(CLK_MOUT_SCLK_DECON_TV_ECLK_C, "mout_sclk_decon_tv_eclk_c", - mout_sclk_decon_tv_eclk_c_p, MUX_SEL_MIF5, 24, 1), - MUX(CLK_MOUT_SCLK_DECON_TV_ECLK_B, "mout_sclk_decon_tv_eclk_b", - mout_sclk_decon_tv_eclk_b_p, MUX_SEL_MIF5, 20, 1), - MUX(CLK_MOUT_SCLK_DECON_TV_ECLK_A, "mout_sclk_decon_tv_eclk_a", - mout_sclk_decon_p, MUX_SEL_MIF5, 16, 1), - MUX(CLK_MOUT_SCLK_DSD_C, "mout_sclk_dsd_c", mout_sclk_dsd_c_p, - MUX_SEL_MIF5, 8, 1), - MUX(CLK_MOUT_SCLK_DSD_B, "mout_sclk_dsd_b", mout_sclk_dsd_b_p, - MUX_SEL_MIF5, 4, 1), - MUX(CLK_MOUT_SCLK_DSD_A, "mout_sclk_dsd_a", mout_sclk_dsd_a_p, - MUX_SEL_MIF5, 0, 1), - - /* MUX_SEL_MIF6 */ - MUX(CLK_MOUT_SCLK_DSIM0_C, "mout_sclk_dsim0_c", mout_sclk_dsim0_c_p, - MUX_SEL_MIF6, 8, 1), - MUX(CLK_MOUT_SCLK_DSIM0_B, "mout_sclk_dsim0_b", mout_sclk_dsim0_b_p, - MUX_SEL_MIF6, 4, 1), - MUX(CLK_MOUT_SCLK_DSIM0_A, "mout_sclk_dsim0_a", mout_sclk_decon_p, - MUX_SEL_MIF6, 0, 1), - - /* MUX_SEL_MIF7 */ - MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_C, "mout_sclk_decon_tv_vclk_c", - mout_sclk_decon_tv_vclk_c_p, MUX_SEL_MIF7, 24, 1), - MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_B, "mout_sclk_decon_tv_vclk_b", - mout_sclk_decon_tv_vclk_b_p, MUX_SEL_MIF7, 20, 1), - MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_A, "mout_sclk_decon_tv_vclk_a", - mout_sclk_decon_p, MUX_SEL_MIF7, 16, 1), - MUX(CLK_MOUT_SCLK_DSIM1_C, "mout_sclk_dsim1_c", mout_sclk_dsim1_c_p, - MUX_SEL_MIF7, 8, 1), - MUX(CLK_MOUT_SCLK_DSIM1_B, "mout_sclk_dsim1_b", mout_sclk_dsim1_b_p, - MUX_SEL_MIF7, 4, 1), - MUX(CLK_MOUT_SCLK_DSIM1_A, "mout_sclk_dsim1_a", mout_sclk_decon_p, - MUX_SEL_MIF7, 0, 1), -}; - -static const struct samsung_div_clock mif_div_clks[] __initconst = { - /* DIV_MIF1 */ - DIV(CLK_DIV_SCLK_HPM_MIF, "div_sclk_hpm_mif", "div_clk2x_phy", - DIV_MIF1, 16, 2), - DIV(CLK_DIV_ACLK_DREX1, "div_aclk_drex1", "div_clk2x_phy", DIV_MIF1, - 12, 2), - DIV(CLK_DIV_ACLK_DREX0, "div_aclk_drex0", "div_clk2x_phy", DIV_MIF1, - 8, 2), - DIV(CLK_DIV_CLK2XPHY, "div_clk2x_phy", "mout_clk2x_phy_c", DIV_MIF1, - 4, 4), - - /* DIV_MIF2 */ - DIV(CLK_DIV_ACLK_MIF_266, "div_aclk_mif_266", "mout_bus_pll_div2", - DIV_MIF2, 20, 3), - DIV(CLK_DIV_ACLK_MIFND_133, "div_aclk_mifnd_133", "div_mif_pre", - DIV_MIF2, 16, 4), - DIV(CLK_DIV_ACLK_MIF_133, "div_aclk_mif_133", "div_mif_pre", - DIV_MIF2, 12, 4), - DIV(CLK_DIV_ACLK_MIFNM_200, "div_aclk_mifnm_200", - "mout_aclk_mifnm_200", DIV_MIF2, 8, 3), - DIV(CLK_DIV_ACLK_MIF_200, "div_aclk_mif_200", "div_aclk_mif_400", - DIV_MIF2, 4, 2), - DIV(CLK_DIV_ACLK_MIF_400, "div_aclk_mif_400", "mout_aclk_mifnm_400", - DIV_MIF2, 0, 3), - - /* DIV_MIF3 */ - DIV(CLK_DIV_ACLK_BUS2_400, "div_aclk_bus2_400", "div_mif_pre", - DIV_MIF3, 16, 4), - DIV(CLK_DIV_ACLK_DISP_333, "div_aclk_disp_333", "mout_aclk_disp_333_b", - DIV_MIF3, 4, 3), - DIV(CLK_DIV_ACLK_CPIF_200, "div_aclk_cpif_200", "mout_aclk_mifnm_200", - DIV_MIF3, 0, 3), - - /* DIV_MIF4 */ - DIV(CLK_DIV_SCLK_DSIM1, "div_sclk_dsim1", "mout_sclk_dsim1_c", - DIV_MIF4, 24, 4), - DIV(CLK_DIV_SCLK_DECON_TV_VCLK, "div_sclk_decon_tv_vclk", - "mout_sclk_decon_tv_vclk_c", DIV_MIF4, 20, 4), - DIV(CLK_DIV_SCLK_DSIM0, "div_sclk_dsim0", "mout_sclk_dsim0_c", - DIV_MIF4, 16, 4), - DIV(CLK_DIV_SCLK_DSD, "div_sclk_dsd", "mout_sclk_dsd_c", - DIV_MIF4, 12, 4), - DIV(CLK_DIV_SCLK_DECON_TV_ECLK, "div_sclk_decon_tv_eclk", - "mout_sclk_decon_tv_eclk_c", DIV_MIF4, 8, 4), - DIV(CLK_DIV_SCLK_DECON_VCLK, "div_sclk_decon_vclk", - "mout_sclk_decon_vclk_c", DIV_MIF4, 4, 4), - DIV(CLK_DIV_SCLK_DECON_ECLK, "div_sclk_decon_eclk", - "mout_sclk_decon_eclk_c", DIV_MIF4, 0, 4), - - /* DIV_MIF5 */ - DIV(CLK_DIV_MIF_PRE, "div_mif_pre", "mout_bus_pll_div2", DIV_MIF5, - 0, 3), -}; - -static const struct samsung_gate_clock mif_gate_clks[] __initconst = { - /* ENABLE_ACLK_MIF0 */ - GATE(CLK_CLK2X_PHY1, "clk2k_phy1", "div_clk2x_phy", ENABLE_ACLK_MIF0, - 19, CLK_IGNORE_UNUSED, 0), - GATE(CLK_CLK2X_PHY0, "clk2x_phy0", "div_clk2x_phy", ENABLE_ACLK_MIF0, - 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_CLKM_PHY1, "clkm_phy1", "mout_clkm_phy_c", ENABLE_ACLK_MIF0, - 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_CLKM_PHY0, "clkm_phy0", "mout_clkm_phy_c", ENABLE_ACLK_MIF0, - 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_RCLK_DREX1, "rclk_drex1", "oscclk", ENABLE_ACLK_MIF0, - 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_RCLK_DREX0, "rclk_drex0", "oscclk", ENABLE_ACLK_MIF0, - 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX1_TZ, "aclk_drex1_tz", "div_aclk_drex1", - ENABLE_ACLK_MIF0, 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX0_TZ, "aclk_drex0_tz", "div_aclk_drex0", - ENABLE_ACLK_MIF0, 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX1_PEREV, "aclk_drex1_perev", "div_aclk_drex1", - ENABLE_ACLK_MIF0, 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX0_PEREV, "aclk_drex0_perev", "div_aclk_drex0", - ENABLE_ACLK_MIF0, 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX1_MEMIF, "aclk_drex1_memif", "div_aclk_drex1", - ENABLE_ACLK_MIF0, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX0_MEMIF, "aclk_drex0_memif", "div_aclk_drex0", - ENABLE_ACLK_MIF0, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX1_SCH, "aclk_drex1_sch", "div_aclk_drex1", - ENABLE_ACLK_MIF0, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX0_SCH, "aclk_drex0_sch", "div_aclk_drex0", - ENABLE_ACLK_MIF0, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX1_BUSIF, "aclk_drex1_busif", "div_aclk_drex1", - ENABLE_ACLK_MIF0, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX0_BUSIF, "aclk_drex0_busif", "div_aclk_drex0", - ENABLE_ACLK_MIF0, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX1_BUSIF_RD, "aclk_drex1_busif_rd", "div_aclk_drex1", - ENABLE_ACLK_MIF0, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX0_BUSIF_RD, "aclk_drex0_busif_rd", "div_aclk_drex0", - ENABLE_ACLK_MIF0, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX1, "aclk_drex1", "div_aclk_drex1", - ENABLE_ACLK_MIF0, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DREX0, "aclk_drex0", "div_aclk_drex0", - ENABLE_ACLK_MIF0, 1, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_ACLK_MIF1 */ - GATE(CLK_ACLK_ASYNCAXIS_MIF_IMEM, "aclk_asyncaxis_mif_imem", - "div_aclk_mif_200", ENABLE_ACLK_MIF1, 28, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_NOC_P_CCI, "aclk_asyncaxis_noc_p_cci", - "div_aclk_mif_200", ENABLE_ACLK_MIF1, - 27, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_NOC_P_CCI, "aclk_asyncaxim_noc_p_cci", - "div_aclk_mif_133", ENABLE_ACLK_MIF1, - 26, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_CP1, "aclk_asyncaxis_cp1", - "div_aclk_mifnm_200", ENABLE_ACLK_MIF1, - 25, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_CP1, "aclk_asyncaxim_cp1", - "div_aclk_drex1", ENABLE_ACLK_MIF1, - 24, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_CP0, "aclk_asyncaxis_cp0", - "div_aclk_mifnm_200", ENABLE_ACLK_MIF1, - 23, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_CP0, "aclk_asyncaxim_cp0", - "div_aclk_drex0", ENABLE_ACLK_MIF1, - 22, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_DREX1_3, "aclk_asyncaxis_drex1_3", - "div_aclk_mif_133", ENABLE_ACLK_MIF1, - 21, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_DREX1_3, "aclk_asyncaxim_drex1_3", - "div_aclk_drex1", ENABLE_ACLK_MIF1, - 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_DREX1_1, "aclk_asyncaxis_drex1_1", - "div_aclk_mif_133", ENABLE_ACLK_MIF1, - 19, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_DREX1_1, "aclk_asyncaxim_drex1_1", - "div_aclk_drex1", ENABLE_ACLK_MIF1, - 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_DREX1_0, "aclk_asyncaxis_drex1_0", - "div_aclk_mif_133", ENABLE_ACLK_MIF1, - 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_DREX1_0, "aclk_asyncaxim_drex1_0", - "div_aclk_drex1", ENABLE_ACLK_MIF1, - 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_DREX0_3, "aclk_asyncaxis_drex0_3", - "div_aclk_mif_133", ENABLE_ACLK_MIF1, - 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_DREX0_3, "aclk_asyncaxim_drex0_3", - "div_aclk_drex0", ENABLE_ACLK_MIF1, - 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_DREX0_1, "aclk_asyncaxis_drex0_1", - "div_aclk_mif_133", ENABLE_ACLK_MIF1, - 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_DREX0_1, "aclk_asyncaxim_drex0_1", - "div_aclk_drex0", ENABLE_ACLK_MIF1, - 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_DREX0_0, "aclk_asyncaxis_drex0_0", - "div_aclk_mif_133", ENABLE_ACLK_MIF1, - 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_DREX0_0, "aclk_asyncaxim_drex0_0", - "div_aclk_drex0", ENABLE_ACLK_MIF1, - 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_MIF2P, "aclk_ahb2apb_mif2p", "div_aclk_mif_133", - ENABLE_ACLK_MIF1, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_MIF1P, "aclk_ahb2apb_mif1p", "div_aclk_mif_133", - ENABLE_ACLK_MIF1, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_MIF0P, "aclk_ahb2apb_mif0p", "div_aclk_mif_133", - ENABLE_ACLK_MIF1, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_IXIU_CCI, "aclk_ixiu_cci", "div_aclk_mif_400", - ENABLE_ACLK_MIF1, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_MIFSFRX, "aclk_xiu_mifsfrx", "div_aclk_mif_200", - ENABLE_ACLK_MIF1, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MIFNP_133, "aclk_mifnp_133", "div_aclk_mif_133", - ENABLE_ACLK_MIF1, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MIFNM_200, "aclk_mifnm_200", "div_aclk_mifnm_200", - ENABLE_ACLK_MIF1, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MIFND_133, "aclk_mifnd_133", "div_aclk_mifnd_133", - ENABLE_ACLK_MIF1, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MIFND_400, "aclk_mifnd_400", "div_aclk_mif_400", - ENABLE_ACLK_MIF1, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_CCI, "aclk_cci", "div_aclk_mif_400", ENABLE_ACLK_MIF1, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_ACLK_MIF2 */ - GATE(CLK_ACLK_MIFND_266, "aclk_mifnd_266", "div_aclk_mif_266", - ENABLE_ACLK_MIF2, 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_PPMU_DREX1S3, "aclk_ppmu_drex1s3", "div_aclk_drex1", - ENABLE_ACLK_MIF2, 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_PPMU_DREX1S1, "aclk_ppmu_drex1s1", "div_aclk_drex1", - ENABLE_ACLK_MIF2, 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_PPMU_DREX1S0, "aclk_ppmu_drex1s0", "div_aclk_drex1", - ENABLE_ACLK_MIF2, 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_PPMU_DREX0S3, "aclk_ppmu_drex0s3", "div_aclk_drex0", - ENABLE_ACLK_MIF2, 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_PPMU_DREX0S1, "aclk_ppmu_drex0s1", "div_aclk_drex0", - ENABLE_ACLK_MIF2, 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_PPMU_DREX0S0, "aclk_ppmu_drex0s0", "div_aclk_drex0", - ENABLE_ACLK_MIF2, 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIDS_CCI_MIFSFRX, "aclk_axids_cci_mifsfrx", - "div_aclk_mif_200", ENABLE_ACLK_MIF2, 7, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXISYNCDNS_CCI, "aclk_axisyncdns_cci", - "div_aclk_mif_400", ENABLE_ACLK_MIF2, - 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXISYNCDN_CCI, "aclk_axisyncdn_cci", "div_aclk_mif_400", - ENABLE_ACLK_MIF2, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXISYNCDN_NOC_D, "aclk_axisyncdn_noc_d", - "div_aclk_mif_200", ENABLE_ACLK_MIF2, - 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBS_MIF_CSSYS, "aclk_asyncapbs_mif_cssys", - "div_aclk_mifnd_133", ENABLE_ACLK_MIF2, 0, 0, 0), - - /* ENABLE_ACLK_MIF3 */ - GATE(CLK_ACLK_BUS2_400, "aclk_bus2_400", "div_aclk_bus2_400", - ENABLE_ACLK_MIF3, 4, - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), - GATE(CLK_ACLK_DISP_333, "aclk_disp_333", "div_aclk_disp_333", - ENABLE_ACLK_MIF3, 1, - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), - GATE(CLK_ACLK_CPIF_200, "aclk_cpif_200", "div_aclk_cpif_200", - ENABLE_ACLK_MIF3, 0, - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), - - /* ENABLE_PCLK_MIF */ - GATE(CLK_PCLK_PPMU_DREX1S3, "pclk_ppmu_drex1s3", "div_aclk_drex1", - ENABLE_PCLK_MIF, 29, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PPMU_DREX1S1, "pclk_ppmu_drex1s1", "div_aclk_drex1", - ENABLE_PCLK_MIF, 28, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PPMU_DREX1S0, "pclk_ppmu_drex1s0", "div_aclk_drex1", - ENABLE_PCLK_MIF, 27, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PPMU_DREX0S3, "pclk_ppmu_drex0s3", "div_aclk_drex0", - ENABLE_PCLK_MIF, 26, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PPMU_DREX0S1, "pclk_ppmu_drex0s1", "div_aclk_drex0", - ENABLE_PCLK_MIF, 25, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PPMU_DREX0S0, "pclk_ppmu_drex0s0", "div_aclk_drex0", - ENABLE_PCLK_MIF, 24, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXI_NOC_P_CCI, "pclk_asyncaxi_noc_p_cci", - "div_aclk_mif_133", ENABLE_PCLK_MIF, 21, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXI_CP1, "pclk_asyncaxi_cp1", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 19, 0, 0), - GATE(CLK_PCLK_ASYNCAXI_CP0, "pclk_asyncaxi_cp0", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 18, 0, 0), - GATE(CLK_PCLK_ASYNCAXI_DREX1_3, "pclk_asyncaxi_drex1_3", - "div_aclk_mif_133", ENABLE_PCLK_MIF, 17, 0, 0), - GATE(CLK_PCLK_ASYNCAXI_DREX1_1, "pclk_asyncaxi_drex1_1", - "div_aclk_mif_133", ENABLE_PCLK_MIF, 16, 0, 0), - GATE(CLK_PCLK_ASYNCAXI_DREX1_0, "pclk_asyncaxi_drex1_0", - "div_aclk_mif_133", ENABLE_PCLK_MIF, 15, 0, 0), - GATE(CLK_PCLK_ASYNCAXI_DREX0_3, "pclk_asyncaxi_drex0_3", - "div_aclk_mif_133", ENABLE_PCLK_MIF, 14, 0, 0), - GATE(CLK_PCLK_ASYNCAXI_DREX0_1, "pclk_asyncaxi_drex0_1", - "div_aclk_mif_133", ENABLE_PCLK_MIF, 13, 0, 0), - GATE(CLK_PCLK_ASYNCAXI_DREX0_0, "pclk_asyncaxi_drex0_0", - "div_aclk_mif_133", ENABLE_PCLK_MIF, 12, 0, 0), - GATE(CLK_PCLK_MIFSRVND_133, "pclk_mifsrvnd_133", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 11, 0, 0), - GATE(CLK_PCLK_PMU_MIF, "pclk_pmu_mif", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_MIF, "pclk_sysreg_mif", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_GPIO_ALIVE, "pclk_gpio_alive", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ABB, "pclk_abb", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 7, 0, 0), - GATE(CLK_PCLK_PMU_APBIF, "pclk_pmu_apbif", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_DDR_PHY1, "pclk_ddr_phy1", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 5, 0, 0), - GATE(CLK_PCLK_DREX1, "pclk_drex1", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_DDR_PHY0, "pclk_ddr_phy0", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 2, 0, 0), - GATE(CLK_PCLK_DREX0, "pclk_drex0", "div_aclk_mif_133", - ENABLE_PCLK_MIF, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_MIF_SECURE_DREX0_TZ */ - GATE(CLK_PCLK_DREX0_TZ, "pclk_drex0_tz", "div_aclk_mif_133", - ENABLE_PCLK_MIF_SECURE_DREX0_TZ, 0, - CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_MIF_SECURE_DREX1_TZ */ - GATE(CLK_PCLK_DREX1_TZ, "pclk_drex1_tz", "div_aclk_mif_133", - ENABLE_PCLK_MIF_SECURE_DREX1_TZ, 0, - CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_MIF_SECURE_MONOTONIC_CNT */ - GATE(CLK_PCLK_MONOTONIC_CNT, "pclk_monotonic_cnt", "div_aclk_mif_133", - ENABLE_PCLK_MIF_SECURE_MONOTONIC_CNT, 0, 0, 0), - - /* ENABLE_PCLK_MIF_SECURE_RTC */ - GATE(CLK_PCLK_RTC, "pclk_rtc", "div_aclk_mif_133", - ENABLE_PCLK_MIF_SECURE_RTC, 0, 0, 0), - - /* ENABLE_SCLK_MIF */ - GATE(CLK_SCLK_DSIM1_DISP, "sclk_dsim1_disp", "div_sclk_dsim1", - ENABLE_SCLK_MIF, 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_DECON_TV_VCLK_DISP, "sclk_decon_tv_vclk_disp", - "div_sclk_decon_tv_vclk", ENABLE_SCLK_MIF, - 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_DSIM0_DISP, "sclk_dsim0_disp", "div_sclk_dsim0", - ENABLE_SCLK_MIF, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_DSD_DISP, "sclk_dsd_disp", "div_sclk_dsd", - ENABLE_SCLK_MIF, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_DECON_TV_ECLK_DISP, "sclk_decon_tv_eclk_disp", - "div_sclk_decon_tv_eclk", ENABLE_SCLK_MIF, - 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_DECON_VCLK_DISP, "sclk_decon_vclk_disp", - "div_sclk_decon_vclk", ENABLE_SCLK_MIF, - 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_DECON_ECLK_DISP, "sclk_decon_eclk_disp", - "div_sclk_decon_eclk", ENABLE_SCLK_MIF, - 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_HPM_MIF, "sclk_hpm_mif", "div_sclk_hpm_mif", - ENABLE_SCLK_MIF, 4, - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MFC_PLL, "sclk_mfc_pll", "mout_mfc_pll_div2", - ENABLE_SCLK_MIF, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_BUS_PLL, "sclk_bus_pll", "mout_bus_pll_div2", - ENABLE_SCLK_MIF, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_BUS_PLL_APOLLO, "sclk_bus_pll_apollo", "sclk_bus_pll", - ENABLE_SCLK_MIF, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_BUS_PLL_ATLAS, "sclk_bus_pll_atlas", "sclk_bus_pll", - ENABLE_SCLK_MIF, 0, CLK_IGNORE_UNUSED, 0), -}; - -static const struct samsung_cmu_info mif_cmu_info __initconst = { - .pll_clks = mif_pll_clks, - .nr_pll_clks = ARRAY_SIZE(mif_pll_clks), - .mux_clks = mif_mux_clks, - .nr_mux_clks = ARRAY_SIZE(mif_mux_clks), - .div_clks = mif_div_clks, - .nr_div_clks = ARRAY_SIZE(mif_div_clks), - .gate_clks = mif_gate_clks, - .nr_gate_clks = ARRAY_SIZE(mif_gate_clks), - .fixed_factor_clks = mif_fixed_factor_clks, - .nr_fixed_factor_clks = ARRAY_SIZE(mif_fixed_factor_clks), - .nr_clk_ids = MIF_NR_CLK, - .clk_regs = mif_clk_regs, - .nr_clk_regs = ARRAY_SIZE(mif_clk_regs), -}; - -static void __init exynos5433_cmu_mif_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &mif_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_mif, "samsung,exynos5433-cmu-mif", - exynos5433_cmu_mif_init); - -/* - * Register offset definitions for CMU_PERIC - */ -#define DIV_PERIC 0x0600 -#define DIV_STAT_PERIC 0x0700 -#define ENABLE_ACLK_PERIC 0x0800 -#define ENABLE_PCLK_PERIC0 0x0900 -#define ENABLE_PCLK_PERIC1 0x0904 -#define ENABLE_SCLK_PERIC 0x0A00 -#define ENABLE_IP_PERIC0 0x0B00 -#define ENABLE_IP_PERIC1 0x0B04 -#define ENABLE_IP_PERIC2 0x0B08 - -static const unsigned long peric_clk_regs[] __initconst = { - DIV_PERIC, - ENABLE_ACLK_PERIC, - ENABLE_PCLK_PERIC0, - ENABLE_PCLK_PERIC1, - ENABLE_SCLK_PERIC, - ENABLE_IP_PERIC0, - ENABLE_IP_PERIC1, - ENABLE_IP_PERIC2, -}; - -static const struct samsung_div_clock peric_div_clks[] __initconst = { - /* DIV_PERIC */ - DIV(CLK_DIV_SCLK_SCI, "div_sclk_sci", "oscclk", DIV_PERIC, 4, 4), - DIV(CLK_DIV_SCLK_SC_IN, "div_sclk_sc_in", "oscclk", DIV_PERIC, 0, 4), -}; - -static const struct samsung_gate_clock peric_gate_clks[] __initconst = { - /* ENABLE_ACLK_PERIC */ - GATE(CLK_ACLK_AHB2APB_PERIC2P, "aclk_ahb2apb_peric2p", "aclk_peric_66", - ENABLE_ACLK_PERIC, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_PERIC1P, "aclk_ahb2apb_peric1p", "aclk_peric_66", - ENABLE_ACLK_PERIC, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_PERIC0P, "aclk_ahb2apb_peric0p", "aclk_peric_66", - ENABLE_ACLK_PERIC, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_PERICNP_66, "aclk_pericnp_66", "aclk_peric_66", - ENABLE_ACLK_PERIC, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_PERIC0 */ - GATE(CLK_PCLK_SCI, "pclk_sci", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 31, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_GPIO_FINGER, "pclk_gpio_finger", "aclk_peric_66", - ENABLE_PCLK_PERIC0, 30, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_GPIO_ESE, "pclk_gpio_ese", "aclk_peric_66", - ENABLE_PCLK_PERIC0, 29, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PWM, "pclk_pwm", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 28, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_SPDIF, "pclk_spdif", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 26, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_PCM1, "pclk_pcm1", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 25, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_I2S1, "pclk_i2s", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 24, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_SPI2, "pclk_spi2", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 23, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_SPI1, "pclk_spi1", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 22, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_SPI0, "pclk_spi0", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 21, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_ADCIF, "pclk_adcif", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 20, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_GPIO_TOUCH, "pclk_gpio_touch", "aclk_peric_66", - ENABLE_PCLK_PERIC0, 19, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_GPIO_NFC, "pclk_gpio_nfc", "aclk_peric_66", - ENABLE_PCLK_PERIC0, 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_GPIO_PERIC, "pclk_gpio_peric", "aclk_peric_66", - ENABLE_PCLK_PERIC0, 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PMU_PERIC, "pclk_pmu_peric", "aclk_peric_66", - ENABLE_PCLK_PERIC0, 16, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_SYSREG_PERIC, "pclk_sysreg_peric", "aclk_peric_66", - ENABLE_PCLK_PERIC0, 15, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_UART2, "pclk_uart2", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 14, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_UART1, "pclk_uart1", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 13, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_UART0, "pclk_uart0", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 12, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C3, "pclk_hsi2c3", "aclk_peric_66", - ENABLE_PCLK_PERIC0, 11, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C2, "pclk_hsi2c2", "aclk_peric_66", - ENABLE_PCLK_PERIC0, 10, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C1, "pclk_hsi2c1", "aclk_peric_66", - ENABLE_PCLK_PERIC0, 9, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C0, "pclk_hsi2c0", "aclk_peric_66", - ENABLE_PCLK_PERIC0, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_I2C7, "pclk_i2c7", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 7, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_I2C6, "pclk_i2c6", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 6, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_I2C5, "pclk_i2c5", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 5, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_I2C4, "pclk_i2c4", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_I2C3, "pclk_i2c3", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_I2C2, "pclk_i2c2", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_I2C1, "pclk_i2c1", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_I2C0, "pclk_i2c0", "aclk_peric_66", ENABLE_PCLK_PERIC0, - 0, CLK_SET_RATE_PARENT, 0), - - /* ENABLE_PCLK_PERIC1 */ - GATE(CLK_PCLK_SPI4, "pclk_spi4", "aclk_peric_66", ENABLE_PCLK_PERIC1, - 9, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_SPI3, "pclk_spi3", "aclk_peric_66", ENABLE_PCLK_PERIC1, - 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C11, "pclk_hsi2c11", "aclk_peric_66", - ENABLE_PCLK_PERIC1, 7, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C10, "pclk_hsi2c10", "aclk_peric_66", - ENABLE_PCLK_PERIC1, 6, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C9, "pclk_hsi2c9", "aclk_peric_66", - ENABLE_PCLK_PERIC1, 5, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C8, "pclk_hsi2c8", "aclk_peric_66", - ENABLE_PCLK_PERIC1, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C7, "pclk_hsi2c7", "aclk_peric_66", - ENABLE_PCLK_PERIC1, 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C6, "pclk_hsi2c6", "aclk_peric_66", - ENABLE_PCLK_PERIC1, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C5, "pclk_hsi2c5", "aclk_peric_66", - ENABLE_PCLK_PERIC1, 1, CLK_SET_RATE_PARENT, 0), - GATE(CLK_PCLK_HSI2C4, "pclk_hsi2c4", "aclk_peric_66", - ENABLE_PCLK_PERIC1, 0, CLK_SET_RATE_PARENT, 0), - - /* ENABLE_SCLK_PERIC */ - GATE(CLK_SCLK_IOCLK_SPI4, "sclk_ioclk_spi4", "ioclk_spi4_clk_in", - ENABLE_SCLK_PERIC, 21, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_IOCLK_SPI3, "sclk_ioclk_spi3", "ioclk_spi3_clk_in", - ENABLE_SCLK_PERIC, 20, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI4, "sclk_spi4", "sclk_spi4_peric", ENABLE_SCLK_PERIC, - 19, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI3, "sclk_spi3", "sclk_spi3_peric", ENABLE_SCLK_PERIC, - 18, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SCI, "sclk_sci", "div_sclk_sci", ENABLE_SCLK_PERIC, - 17, 0, 0), - GATE(CLK_SCLK_SC_IN, "sclk_sc_in", "div_sclk_sc_in", ENABLE_SCLK_PERIC, - 16, 0, 0), - GATE(CLK_SCLK_PWM, "sclk_pwm", "oscclk", ENABLE_SCLK_PERIC, 15, 0, 0), - GATE(CLK_SCLK_IOCLK_SPI2, "sclk_ioclk_spi2", "ioclk_spi2_clk_in", - ENABLE_SCLK_PERIC, 13, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_IOCLK_SPI1, "sclk_ioclk_spi1", "ioclk_spi1_clk_in", - ENABLE_SCLK_PERIC, 12, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_IOCLK_SPI0, "sclk_ioclk_spi0", "ioclk_spi0_clk_in", - ENABLE_SCLK_PERIC, 11, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_IOCLK_I2S1_BCLK, "sclk_ioclk_i2s1_bclk", - "ioclk_i2s1_bclk_in", ENABLE_SCLK_PERIC, 10, - CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPDIF, "sclk_spdif", "sclk_spdif_peric", - ENABLE_SCLK_PERIC, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric", - ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_i2s1_peric", - ENABLE_SCLK_PERIC, 6, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI2, "sclk_spi2", "sclk_spi2_peric", ENABLE_SCLK_PERIC, - 5, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC, - 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI0, "sclk_spi0", "sclk_spi0_peric", ENABLE_SCLK_PERIC, - 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART2, "sclk_uart2", "sclk_uart2_peric", - ENABLE_SCLK_PERIC, 2, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_UART1, "sclk_uart1", "sclk_uart1_peric", - ENABLE_SCLK_PERIC, 1, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_UART0, "sclk_uart0", "sclk_uart0_peric", - ENABLE_SCLK_PERIC, 0, - CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), -}; - -static const struct samsung_cmu_info peric_cmu_info __initconst = { - .div_clks = peric_div_clks, - .nr_div_clks = ARRAY_SIZE(peric_div_clks), - .gate_clks = peric_gate_clks, - .nr_gate_clks = ARRAY_SIZE(peric_gate_clks), - .nr_clk_ids = PERIC_NR_CLK, - .clk_regs = peric_clk_regs, - .nr_clk_regs = ARRAY_SIZE(peric_clk_regs), -}; - -static void __init exynos5433_cmu_peric_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &peric_cmu_info); -} - -CLK_OF_DECLARE(exynos5433_cmu_peric, "samsung,exynos5433-cmu-peric", - exynos5433_cmu_peric_init); - -/* - * Register offset definitions for CMU_PERIS - */ -#define ENABLE_ACLK_PERIS 0x0800 -#define ENABLE_PCLK_PERIS 0x0900 -#define ENABLE_PCLK_PERIS_SECURE_TZPC 0x0904 -#define ENABLE_PCLK_PERIS_SECURE_SECKEY_APBIF 0x0908 -#define ENABLE_PCLK_PERIS_SECURE_CHIPID_APBIF 0x090c -#define ENABLE_PCLK_PERIS_SECURE_TOPRTC 0x0910 -#define ENABLE_PCLK_PERIS_SECURE_CUSTOM_EFUSE_APBIF 0x0914 -#define ENABLE_PCLK_PERIS_SECURE_ANTIRBK_CNT_APBIF 0x0918 -#define ENABLE_PCLK_PERIS_SECURE_OTP_CON_APBIF 0x091c -#define ENABLE_SCLK_PERIS 0x0a00 -#define ENABLE_SCLK_PERIS_SECURE_SECKEY 0x0a04 -#define ENABLE_SCLK_PERIS_SECURE_CHIPID 0x0a08 -#define ENABLE_SCLK_PERIS_SECURE_TOPRTC 0x0a0c -#define ENABLE_SCLK_PERIS_SECURE_CUSTOM_EFUSE 0x0a10 -#define ENABLE_SCLK_PERIS_SECURE_ANTIRBK_CNT 0x0a14 -#define ENABLE_SCLK_PERIS_SECURE_OTP_CON 0x0a18 -#define ENABLE_IP_PERIS0 0x0b00 -#define ENABLE_IP_PERIS1 0x0b04 -#define ENABLE_IP_PERIS_SECURE_TZPC 0x0b08 -#define ENABLE_IP_PERIS_SECURE_SECKEY 0x0b0c -#define ENABLE_IP_PERIS_SECURE_CHIPID 0x0b10 -#define ENABLE_IP_PERIS_SECURE_TOPRTC 0x0b14 -#define ENABLE_IP_PERIS_SECURE_CUSTOM_EFUSE 0x0b18 -#define ENABLE_IP_PERIS_SECURE_ANTIBRK_CNT 0x0b1c -#define ENABLE_IP_PERIS_SECURE_OTP_CON 0x0b20 - -static const unsigned long peris_clk_regs[] __initconst = { - ENABLE_ACLK_PERIS, - ENABLE_PCLK_PERIS, - ENABLE_PCLK_PERIS_SECURE_TZPC, - ENABLE_PCLK_PERIS_SECURE_SECKEY_APBIF, - ENABLE_PCLK_PERIS_SECURE_CHIPID_APBIF, - ENABLE_PCLK_PERIS_SECURE_TOPRTC, - ENABLE_PCLK_PERIS_SECURE_CUSTOM_EFUSE_APBIF, - ENABLE_PCLK_PERIS_SECURE_ANTIRBK_CNT_APBIF, - ENABLE_PCLK_PERIS_SECURE_OTP_CON_APBIF, - ENABLE_SCLK_PERIS, - ENABLE_SCLK_PERIS_SECURE_SECKEY, - ENABLE_SCLK_PERIS_SECURE_CHIPID, - ENABLE_SCLK_PERIS_SECURE_TOPRTC, - ENABLE_SCLK_PERIS_SECURE_CUSTOM_EFUSE, - ENABLE_SCLK_PERIS_SECURE_ANTIRBK_CNT, - ENABLE_SCLK_PERIS_SECURE_OTP_CON, - ENABLE_IP_PERIS0, - ENABLE_IP_PERIS1, - ENABLE_IP_PERIS_SECURE_TZPC, - ENABLE_IP_PERIS_SECURE_SECKEY, - ENABLE_IP_PERIS_SECURE_CHIPID, - ENABLE_IP_PERIS_SECURE_TOPRTC, - ENABLE_IP_PERIS_SECURE_CUSTOM_EFUSE, - ENABLE_IP_PERIS_SECURE_ANTIBRK_CNT, - ENABLE_IP_PERIS_SECURE_OTP_CON, -}; - -static const struct samsung_gate_clock peris_gate_clks[] __initconst = { - /* ENABLE_ACLK_PERIS */ - GATE(CLK_ACLK_AHB2APB_PERIS1P, "aclk_ahb2apb_peris1p", "aclk_peris_66", - ENABLE_ACLK_PERIS, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_PERIS0P, "aclk_ahb2apb_peris0p", "aclk_peris_66", - ENABLE_ACLK_PERIS, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_PERISNP_66, "aclk_perisnp_66", "aclk_peris_66", - ENABLE_ACLK_PERIS, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_PERIS */ - GATE(CLK_PCLK_HPM_APBIF, "pclk_hpm_apbif", "aclk_peris_66", - ENABLE_PCLK_PERIS, 30, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TMU1_APBIF, "pclk_tmu1_apbif", "aclk_peris_66", - ENABLE_PCLK_PERIS, 24, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TMU0_APBIF, "pclk_tmu0_apbif", "aclk_peris_66", - ENABLE_PCLK_PERIS, 23, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PMU_PERIS, "pclk_pmu_peris", "aclk_peris_66", - ENABLE_PCLK_PERIS, 22, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_PERIS, "pclk_sysreg_peris", "aclk_peris_66", - ENABLE_PCLK_PERIS, 21, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_CMU_TOP_APBIF, "pclk_cmu_top_apbif", "aclk_peris_66", - ENABLE_PCLK_PERIS, 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_WDT_APOLLO, "pclk_wdt_apollo", "aclk_peris_66", - ENABLE_PCLK_PERIS, 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_WDT_ATLAS, "pclk_wdt_atlas", "aclk_peris_66", - ENABLE_PCLK_PERIS, 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_MCT, "pclk_mct", "aclk_peris_66", - ENABLE_PCLK_PERIS, 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_HDMI_CEC, "pclk_hdmi_cec", "aclk_peris_66", - ENABLE_PCLK_PERIS, 14, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_PERIS_SECURE_TZPC */ - GATE(CLK_PCLK_TZPC12, "pclk_tzpc12", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC11, "pclk_tzpc11", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC10, "pclk_tzpc10", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC9, "pclk_tzpc9", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC8, "pclk_tzpc8", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC7, "pclk_tzpc7", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC6, "pclk_tzpc6", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC5, "pclk_tzpc5", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC4, "pclk_tzpc4", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC3, "pclk_tzpc3", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC2, "pclk_tzpc2", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC1, "pclk_tzpc1", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_TZPC0, "pclk_tzpc0", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TZPC, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_PERIS_SECURE_SECKEY_APBIF */ - GATE(CLK_PCLK_SECKEY_APBIF, "pclk_seckey_apbif", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_SECKEY_APBIF, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_PERIS_SECURE_CHIPID_APBIF */ - GATE(CLK_PCLK_CHIPID_APBIF, "pclk_chipid_apbif", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_CHIPID_APBIF, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_PERIS_SECURE_TOPRTC */ - GATE(CLK_PCLK_TOPRTC, "pclk_toprtc", "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_TOPRTC, 0, 0, 0), - - /* ENABLE_PCLK_PERIS_SECURE_CUSTOM_EFUSE_APBIF */ - GATE(CLK_PCLK_CUSTOM_EFUSE_APBIF, "pclk_custom_efuse_apbif", - "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_CUSTOM_EFUSE_APBIF, 0, 0, 0), - - /* ENABLE_PCLK_PERIS_SECURE_ANTIRBK_CNT_APBIF */ - GATE(CLK_PCLK_ANTIRBK_CNT_APBIF, "pclk_antirbk_cnt_apbif", - "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_ANTIRBK_CNT_APBIF, 0, 0, 0), - - /* ENABLE_PCLK_PERIS_SECURE_OTP_CON_APBIF */ - GATE(CLK_PCLK_OTP_CON_APBIF, "pclk_otp_con_apbif", - "aclk_peris_66", - ENABLE_PCLK_PERIS_SECURE_OTP_CON_APBIF, 0, 0, 0), - - /* ENABLE_SCLK_PERIS */ - GATE(CLK_SCLK_ASV_TB, "sclk_asv_tb", "oscclk_efuse_common", - ENABLE_SCLK_PERIS, 10, 0, 0), - GATE(CLK_SCLK_TMU1, "sclk_tmu1", "oscclk_efuse_common", - ENABLE_SCLK_PERIS, 4, 0, 0), - GATE(CLK_SCLK_TMU0, "sclk_tmu0", "oscclk_efuse_common", - ENABLE_SCLK_PERIS, 3, 0, 0), - - /* ENABLE_SCLK_PERIS_SECURE_SECKEY */ - GATE(CLK_SCLK_SECKEY, "sclk_seckey", "oscclk_efuse_common", - ENABLE_SCLK_PERIS_SECURE_SECKEY, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_PERIS_SECURE_CHIPID */ - GATE(CLK_SCLK_CHIPID, "sclk_chipid", "oscclk_efuse_common", - ENABLE_SCLK_PERIS_SECURE_CHIPID, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_PERIS_SECURE_TOPRTC */ - GATE(CLK_SCLK_TOPRTC, "sclk_toprtc", "oscclk_efuse_common", - ENABLE_SCLK_PERIS_SECURE_TOPRTC, 0, 0, 0), - - /* ENABLE_SCLK_PERIS_SECURE_CUSTOM_EFUSE */ - GATE(CLK_SCLK_CUSTOM_EFUSE, "sclk_custom_efuse", "oscclk_efuse_common", - ENABLE_SCLK_PERIS_SECURE_CUSTOM_EFUSE, 0, 0, 0), - - /* ENABLE_SCLK_PERIS_SECURE_ANTIRBK_CNT */ - GATE(CLK_SCLK_ANTIRBK_CNT, "sclk_antirbk_cnt", "oscclk_efuse_common", - ENABLE_SCLK_PERIS_SECURE_ANTIRBK_CNT, 0, 0, 0), - - /* ENABLE_SCLK_PERIS_SECURE_OTP_CON */ - GATE(CLK_SCLK_OTP_CON, "sclk_otp_con", "oscclk_efuse_common", - ENABLE_SCLK_PERIS_SECURE_OTP_CON, 0, 0, 0), -}; - -static const struct samsung_cmu_info peris_cmu_info __initconst = { - .gate_clks = peris_gate_clks, - .nr_gate_clks = ARRAY_SIZE(peris_gate_clks), - .nr_clk_ids = PERIS_NR_CLK, - .clk_regs = peris_clk_regs, - .nr_clk_regs = ARRAY_SIZE(peris_clk_regs), -}; - -static void __init exynos5433_cmu_peris_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &peris_cmu_info); -} - -CLK_OF_DECLARE(exynos5433_cmu_peris, "samsung,exynos5433-cmu-peris", - exynos5433_cmu_peris_init); - -/* - * Register offset definitions for CMU_FSYS - */ -#define MUX_SEL_FSYS0 0x0200 -#define MUX_SEL_FSYS1 0x0204 -#define MUX_SEL_FSYS2 0x0208 -#define MUX_SEL_FSYS3 0x020c -#define MUX_SEL_FSYS4 0x0210 -#define MUX_ENABLE_FSYS0 0x0300 -#define MUX_ENABLE_FSYS1 0x0304 -#define MUX_ENABLE_FSYS2 0x0308 -#define MUX_ENABLE_FSYS3 0x030c -#define MUX_ENABLE_FSYS4 0x0310 -#define MUX_STAT_FSYS0 0x0400 -#define MUX_STAT_FSYS1 0x0404 -#define MUX_STAT_FSYS2 0x0408 -#define MUX_STAT_FSYS3 0x040c -#define MUX_STAT_FSYS4 0x0410 -#define MUX_IGNORE_FSYS2 0x0508 -#define MUX_IGNORE_FSYS3 0x050c -#define ENABLE_ACLK_FSYS0 0x0800 -#define ENABLE_ACLK_FSYS1 0x0804 -#define ENABLE_PCLK_FSYS 0x0900 -#define ENABLE_SCLK_FSYS 0x0a00 -#define ENABLE_IP_FSYS0 0x0b00 -#define ENABLE_IP_FSYS1 0x0b04 - -/* list of all parent clock list */ -PNAME(mout_sclk_ufs_mphy_user_p) = { "oscclk", "sclk_ufs_mphy", }; -PNAME(mout_aclk_fsys_200_user_p) = { "oscclk", "div_aclk_fsys_200", }; -PNAME(mout_sclk_pcie_100_user_p) = { "oscclk", "sclk_pcie_100_fsys",}; -PNAME(mout_sclk_ufsunipro_user_p) = { "oscclk", "sclk_ufsunipro_fsys",}; -PNAME(mout_sclk_mmc2_user_p) = { "oscclk", "sclk_mmc2_fsys", }; -PNAME(mout_sclk_mmc1_user_p) = { "oscclk", "sclk_mmc1_fsys", }; -PNAME(mout_sclk_mmc0_user_p) = { "oscclk", "sclk_mmc0_fsys", }; -PNAME(mout_sclk_usbhost30_user_p) = { "oscclk", "sclk_usbhost30_fsys",}; -PNAME(mout_sclk_usbdrd30_user_p) = { "oscclk", "sclk_usbdrd30_fsys", }; - -PNAME(mout_phyclk_usbhost30_uhost30_pipe_pclk_user_p) - = { "oscclk", "phyclk_usbhost30_uhost30_pipe_pclk_phy", }; -PNAME(mout_phyclk_usbhost30_uhost30_phyclock_user_p) - = { "oscclk", "phyclk_usbhost30_uhost30_phyclock_phy", }; -PNAME(mout_phyclk_usbhost20_phy_hsic1_p) - = { "oscclk", "phyclk_usbhost20_phy_hsic1_phy", }; -PNAME(mout_phyclk_usbhost20_phy_clk48mohci_user_p) - = { "oscclk", "phyclk_usbhost20_phy_clk48mohci_phy", }; -PNAME(mout_phyclk_usbhost20_phy_phyclock_user_p) - = { "oscclk", "phyclk_usbhost20_phy_phyclock_phy", }; -PNAME(mout_phyclk_usbhost20_phy_freeclk_user_p) - = { "oscclk", "phyclk_usbhost20_phy_freeclk_phy", }; -PNAME(mout_phyclk_usbdrd30_udrd30_pipe_pclk_p) - = { "oscclk", "phyclk_usbdrd30_udrd30_pipe_pclk_phy", }; -PNAME(mout_phyclk_usbdrd30_udrd30_phyclock_user_p) - = { "oscclk", "phyclk_usbdrd30_udrd30_phyclock_phy", }; -PNAME(mout_phyclk_ufs_rx1_symbol_user_p) - = { "oscclk", "phyclk_ufs_rx1_symbol_phy", }; -PNAME(mout_phyclk_ufs_rx0_symbol_user_p) - = { "oscclk", "phyclk_ufs_rx0_symbol_phy", }; -PNAME(mout_phyclk_ufs_tx1_symbol_user_p) - = { "oscclk", "phyclk_ufs_tx1_symbol_phy", }; -PNAME(mout_phyclk_ufs_tx0_symbol_user_p) - = { "oscclk", "phyclk_ufs_tx0_symbol_phy", }; -PNAME(mout_phyclk_lli_mphy_to_ufs_user_p) - = { "oscclk", "phyclk_lli_mphy_to_ufs_phy", }; -PNAME(mout_sclk_mphy_p) - = { "mout_sclk_ufs_mphy_user", - "mout_phyclk_lli_mphy_to_ufs_user", }; - -static const unsigned long fsys_clk_regs[] __initconst = { - MUX_SEL_FSYS0, - MUX_SEL_FSYS1, - MUX_SEL_FSYS2, - MUX_SEL_FSYS3, - MUX_SEL_FSYS4, - MUX_ENABLE_FSYS0, - MUX_ENABLE_FSYS1, - MUX_ENABLE_FSYS2, - MUX_ENABLE_FSYS3, - MUX_ENABLE_FSYS4, - MUX_IGNORE_FSYS2, - MUX_IGNORE_FSYS3, - ENABLE_ACLK_FSYS0, - ENABLE_ACLK_FSYS1, - ENABLE_PCLK_FSYS, - ENABLE_SCLK_FSYS, - ENABLE_IP_FSYS0, - ENABLE_IP_FSYS1, -}; - -static const struct samsung_fixed_rate_clock fsys_fixed_clks[] __initconst = { - /* PHY clocks from USBDRD30_PHY */ - FRATE(CLK_PHYCLK_USBDRD30_UDRD30_PHYCLOCK_PHY, - "phyclk_usbdrd30_udrd30_phyclock_phy", NULL, - 0, 60000000), - FRATE(CLK_PHYCLK_USBDRD30_UDRD30_PIPE_PCLK_PHY, - "phyclk_usbdrd30_udrd30_pipe_pclk_phy", NULL, - 0, 125000000), - /* PHY clocks from USBHOST30_PHY */ - FRATE(CLK_PHYCLK_USBHOST30_UHOST30_PHYCLOCK_PHY, - "phyclk_usbhost30_uhost30_phyclock_phy", NULL, - 0, 60000000), - FRATE(CLK_PHYCLK_USBHOST30_UHOST30_PIPE_PCLK_PHY, - "phyclk_usbhost30_uhost30_pipe_pclk_phy", NULL, - 0, 125000000), - /* PHY clocks from USBHOST20_PHY */ - FRATE(CLK_PHYCLK_USBHOST20_PHY_FREECLK_PHY, - "phyclk_usbhost20_phy_freeclk_phy", NULL, 0, 60000000), - FRATE(CLK_PHYCLK_USBHOST20_PHY_PHYCLOCK_PHY, - "phyclk_usbhost20_phy_phyclock_phy", NULL, 0, 60000000), - FRATE(CLK_PHYCLK_USBHOST20_PHY_CLK48MOHCI_PHY, - "phyclk_usbhost20_phy_clk48mohci_phy", NULL, - 0, 48000000), - FRATE(CLK_PHYCLK_USBHOST20_PHY_HSIC1_PHY, - "phyclk_usbhost20_phy_hsic1_phy", NULL, 0, - 60000000), - /* PHY clocks from UFS_PHY */ - FRATE(CLK_PHYCLK_UFS_TX0_SYMBOL_PHY, "phyclk_ufs_tx0_symbol_phy", - NULL, 0, 300000000), - FRATE(CLK_PHYCLK_UFS_RX0_SYMBOL_PHY, "phyclk_ufs_rx0_symbol_phy", - NULL, 0, 300000000), - FRATE(CLK_PHYCLK_UFS_TX1_SYMBOL_PHY, "phyclk_ufs_tx1_symbol_phy", - NULL, 0, 300000000), - FRATE(CLK_PHYCLK_UFS_RX1_SYMBOL_PHY, "phyclk_ufs_rx1_symbol_phy", - NULL, 0, 300000000), - /* PHY clocks from LLI_PHY */ - FRATE(CLK_PHYCLK_LLI_MPHY_TO_UFS_PHY, "phyclk_lli_mphy_to_ufs_phy", - NULL, 0, 26000000), -}; - -static const struct samsung_mux_clock fsys_mux_clks[] __initconst = { - /* MUX_SEL_FSYS0 */ - MUX(CLK_MOUT_SCLK_UFS_MPHY_USER, "mout_sclk_ufs_mphy_user", - mout_sclk_ufs_mphy_user_p, MUX_SEL_FSYS0, 4, 1), - MUX(CLK_MOUT_ACLK_FSYS_200_USER, "mout_aclk_fsys_200_user", - mout_aclk_fsys_200_user_p, MUX_SEL_FSYS0, 0, 1), - - /* MUX_SEL_FSYS1 */ - MUX(CLK_MOUT_SCLK_PCIE_100_USER, "mout_sclk_pcie_100_user", - mout_sclk_pcie_100_user_p, MUX_SEL_FSYS1, 28, 1), - MUX(CLK_MOUT_SCLK_UFSUNIPRO_USER, "mout_sclk_ufsunipro_user", - mout_sclk_ufsunipro_user_p, MUX_SEL_FSYS1, 24, 1), - MUX(CLK_MOUT_SCLK_MMC2_USER, "mout_sclk_mmc2_user", - mout_sclk_mmc2_user_p, MUX_SEL_FSYS1, 20, 1), - MUX(CLK_MOUT_SCLK_MMC1_USER, "mout_sclk_mmc1_user", - mout_sclk_mmc1_user_p, MUX_SEL_FSYS1, 16, 1), - MUX(CLK_MOUT_SCLK_MMC0_USER, "mout_sclk_mmc0_user", - mout_sclk_mmc0_user_p, MUX_SEL_FSYS1, 12, 1), - MUX(CLK_MOUT_SCLK_USBHOST30_USER, "mout_sclk_usbhost30_user", - mout_sclk_usbhost30_user_p, MUX_SEL_FSYS1, 4, 1), - MUX(CLK_MOUT_SCLK_USBDRD30_USER, "mout_sclk_usbdrd30_user", - mout_sclk_usbdrd30_user_p, MUX_SEL_FSYS1, 0, 1), - - /* MUX_SEL_FSYS2 */ - MUX(CLK_MOUT_PHYCLK_USBHOST30_UHOST30_PIPE_PCLK_USER, - "mout_phyclk_usbhost30_uhost30_pipe_pclk_user", - mout_phyclk_usbhost30_uhost30_pipe_pclk_user_p, - MUX_SEL_FSYS2, 28, 1), - MUX(CLK_MOUT_PHYCLK_USBHOST30_UHOST30_PHYCLOCK_USER, - "mout_phyclk_usbhost30_uhost30_phyclock_user", - mout_phyclk_usbhost30_uhost30_phyclock_user_p, - MUX_SEL_FSYS2, 24, 1), - MUX(CLK_MOUT_PHYCLK_USBHOST20_PHY_HSIC1_USER, - "mout_phyclk_usbhost20_phy_hsic1", - mout_phyclk_usbhost20_phy_hsic1_p, - MUX_SEL_FSYS2, 20, 1), - MUX(CLK_MOUT_PHYCLK_USBHOST20_PHY_CLK48MOHCI_USER, - "mout_phyclk_usbhost20_phy_clk48mohci_user", - mout_phyclk_usbhost20_phy_clk48mohci_user_p, - MUX_SEL_FSYS2, 16, 1), - MUX(CLK_MOUT_PHYCLK_USBHOST20_PHY_PHYCLOCK_USER, - "mout_phyclk_usbhost20_phy_phyclock_user", - mout_phyclk_usbhost20_phy_phyclock_user_p, - MUX_SEL_FSYS2, 12, 1), - MUX(CLK_MOUT_PHYCLK_USBHOST20_PHY_PHY_FREECLK_USER, - "mout_phyclk_usbhost20_phy_freeclk_user", - mout_phyclk_usbhost20_phy_freeclk_user_p, - MUX_SEL_FSYS2, 8, 1), - MUX(CLK_MOUT_PHYCLK_USBDRD30_UDRD30_PIPE_PCLK_USER, - "mout_phyclk_usbdrd30_udrd30_pipe_pclk_user", - mout_phyclk_usbdrd30_udrd30_pipe_pclk_p, - MUX_SEL_FSYS2, 4, 1), - MUX(CLK_MOUT_PHYCLK_USBDRD30_UDRD30_PHYCLOCK_USER, - "mout_phyclk_usbdrd30_udrd30_phyclock_user", - mout_phyclk_usbdrd30_udrd30_phyclock_user_p, - MUX_SEL_FSYS2, 0, 1), - - /* MUX_SEL_FSYS3 */ - MUX(CLK_MOUT_PHYCLK_UFS_RX1_SYMBOL_USER, - "mout_phyclk_ufs_rx1_symbol_user", - mout_phyclk_ufs_rx1_symbol_user_p, - MUX_SEL_FSYS3, 16, 1), - MUX(CLK_MOUT_PHYCLK_UFS_RX0_SYMBOL_USER, - "mout_phyclk_ufs_rx0_symbol_user", - mout_phyclk_ufs_rx0_symbol_user_p, - MUX_SEL_FSYS3, 12, 1), - MUX(CLK_MOUT_PHYCLK_UFS_TX1_SYMBOL_USER, - "mout_phyclk_ufs_tx1_symbol_user", - mout_phyclk_ufs_tx1_symbol_user_p, - MUX_SEL_FSYS3, 8, 1), - MUX(CLK_MOUT_PHYCLK_UFS_TX0_SYMBOL_USER, - "mout_phyclk_ufs_tx0_symbol_user", - mout_phyclk_ufs_tx0_symbol_user_p, - MUX_SEL_FSYS3, 4, 1), - MUX(CLK_MOUT_PHYCLK_LLI_MPHY_TO_UFS_USER, - "mout_phyclk_lli_mphy_to_ufs_user", - mout_phyclk_lli_mphy_to_ufs_user_p, - MUX_SEL_FSYS3, 0, 1), - - /* MUX_SEL_FSYS4 */ - MUX(CLK_MOUT_SCLK_MPHY, "mout_sclk_mphy", mout_sclk_mphy_p, - MUX_SEL_FSYS4, 0, 1), -}; - -static const struct samsung_gate_clock fsys_gate_clks[] __initconst = { - /* ENABLE_ACLK_FSYS0 */ - GATE(CLK_ACLK_PCIE, "aclk_pcie", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS0, 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_PDMA1, "aclk_pdma1", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS0, 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_TSI, "aclk_tsi", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS0, 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MMC2, "aclk_mmc2", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS0, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MMC1, "aclk_mmc1", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS0, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MMC0, "aclk_mmc0", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS0, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_UFS, "aclk_ufs", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS0, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_USBHOST20, "aclk_usbhost20", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS0, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_USBHOST30, "aclk_usbhost30", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS0, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_USBDRD30, "aclk_usbdrd30", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS0, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_PDMA0, "aclk_pdma0", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS0, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_ACLK_FSYS1 */ - GATE(CLK_ACLK_XIU_FSYSPX, "aclk_xiu_fsyspx", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS1, 27, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB_USBLINKH1, "aclk_ahb_usblinkh1", - "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1, - 26, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_PDMA1, "aclk_smmu_pdma1", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS1, 25, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_PCIE, "aclk_bts_pcie", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS1, 24, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIUS_PDMA1, "aclk_axius_pdma1", - "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1, - 22, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_PDMA0, "aclk_smmu_pdma0", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS1, 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_UFS, "aclk_bts_ufs", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS1, 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_USBHOST30, "aclk_bts_usbhost30", - "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1, - 13, 0, 0), - GATE(CLK_ACLK_BTS_USBDRD30, "aclk_bts_usbdrd30", - "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1, - 12, 0, 0), - GATE(CLK_ACLK_AXIUS_PDMA0, "aclk_axius_pdma0", - "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1, - 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIUS_USBHS, "aclk_axius_usbhs", - "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1, - 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIUS_FSYSSX, "aclk_axius_fsyssx", - "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1, - 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_FSYSP, "aclk_ahb2apb_fsysp", - "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1, - 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2AXI_USBHS, "aclk_ahb2axi_usbhs", - "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1, - 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB_USBLINKH0, "aclk_ahb_usblinkh0", - "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1, - 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB_USBHS, "aclk_ahb_usbhs", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS1, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB_FSYSH, "aclk_ahb_fsysh", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS1, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_FSYSX, "aclk_xiu_fsysx", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS1, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_FSYSSX, "aclk_xiu_fsyssx", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS1, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_FSYSNP_200, "aclk_fsysnp_200", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS1, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_FSYSND_200, "aclk_fsysnd_200", "mout_aclk_fsys_200_user", - ENABLE_ACLK_FSYS1, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_FSYS */ - GATE(CLK_PCLK_PCIE_CTRL, "pclk_pcie_ctrl", "mout_aclk_fsys_200_user", - ENABLE_PCLK_FSYS, 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_PDMA1, "pclk_smmu_pdma1", "mout_aclk_fsys_200_user", - ENABLE_PCLK_FSYS, 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PCIE_PHY, "pclk_pcie_phy", "mout_aclk_fsys_200_user", - ENABLE_PCLK_FSYS, 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_PCIE, "pclk_bts_pcie", "mout_aclk_fsys_200_user", - ENABLE_PCLK_FSYS, 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_PDMA0, "pclk_smmu_pdma0", "mout_aclk_fsys_200_user", - ENABLE_PCLK_FSYS, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_UFS, "pclk_bts_ufs", "mout_aclk_fsys_200_user", - ENABLE_PCLK_FSYS, 5, 0, 0), - GATE(CLK_PCLK_BTS_USBHOST30, "pclk_bts_usbhost30", - "mout_aclk_fsys_200_user", ENABLE_PCLK_FSYS, 4, 0, 0), - GATE(CLK_PCLK_BTS_USBDRD30, "pclk_bts_usbdrd30", - "mout_aclk_fsys_200_user", ENABLE_PCLK_FSYS, 3, 0, 0), - GATE(CLK_PCLK_GPIO_FSYS, "pclk_gpio_fsys", "mout_aclk_fsys_200_user", - ENABLE_PCLK_FSYS, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PMU_FSYS, "pclk_pmu_fsys", "mout_aclk_fsys_200_user", - ENABLE_PCLK_FSYS, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_FSYS, "pclk_sysreg_fsys", - "mout_aclk_fsys_200_user", ENABLE_PCLK_FSYS, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_FSYS */ - GATE(CLK_SCLK_PCIE_100, "sclk_pcie_100", "mout_sclk_pcie_100_user", - ENABLE_SCLK_FSYS, 21, 0, 0), - GATE(CLK_PHYCLK_USBHOST30_UHOST30_PIPE_PCLK, - "phyclk_usbhost30_uhost30_pipe_pclk", - "mout_phyclk_usbhost30_uhost30_pipe_pclk_user", - ENABLE_SCLK_FSYS, 18, 0, 0), - GATE(CLK_PHYCLK_USBHOST30_UHOST30_PHYCLOCK, - "phyclk_usbhost30_uhost30_phyclock", - "mout_phyclk_usbhost30_uhost30_phyclock_user", - ENABLE_SCLK_FSYS, 17, 0, 0), - GATE(CLK_PHYCLK_UFS_RX1_SYMBOL, "phyclk_ufs_rx1_symbol", - "mout_phyclk_ufs_rx1_symbol_user", ENABLE_SCLK_FSYS, - 16, 0, 0), - GATE(CLK_PHYCLK_UFS_RX0_SYMBOL, "phyclk_ufs_rx0_symbol", - "mout_phyclk_ufs_rx0_symbol_user", ENABLE_SCLK_FSYS, - 15, 0, 0), - GATE(CLK_PHYCLK_UFS_TX1_SYMBOL, "phyclk_ufs_tx1_symbol", - "mout_phyclk_ufs_tx1_symbol_user", ENABLE_SCLK_FSYS, - 14, 0, 0), - GATE(CLK_PHYCLK_UFS_TX0_SYMBOL, "phyclk_ufs_tx0_symbol", - "mout_phyclk_ufs_tx0_symbol_user", ENABLE_SCLK_FSYS, - 13, 0, 0), - GATE(CLK_PHYCLK_USBHOST20_PHY_HSIC1, "phyclk_usbhost20_phy_hsic1", - "mout_phyclk_usbhost20_phy_hsic1", ENABLE_SCLK_FSYS, - 12, 0, 0), - GATE(CLK_PHYCLK_USBHOST20_PHY_CLK48MOHCI, - "phyclk_usbhost20_phy_clk48mohci", - "mout_phyclk_usbhost20_phy_clk48mohci_user", - ENABLE_SCLK_FSYS, 11, 0, 0), - GATE(CLK_PHYCLK_USBHOST20_PHY_PHYCLOCK, - "phyclk_usbhost20_phy_phyclock", - "mout_phyclk_usbhost20_phy_phyclock_user", - ENABLE_SCLK_FSYS, 10, 0, 0), - GATE(CLK_PHYCLK_USBHOST20_PHY_FREECLK, - "phyclk_usbhost20_phy_freeclk", - "mout_phyclk_usbhost20_phy_freeclk_user", - ENABLE_SCLK_FSYS, 9, 0, 0), - GATE(CLK_PHYCLK_USBDRD30_UDRD30_PIPE_PCLK, - "phyclk_usbdrd30_udrd30_pipe_pclk", - "mout_phyclk_usbdrd30_udrd30_pipe_pclk_user", - ENABLE_SCLK_FSYS, 8, 0, 0), - GATE(CLK_PHYCLK_USBDRD30_UDRD30_PHYCLOCK, - "phyclk_usbdrd30_udrd30_phyclock", - "mout_phyclk_usbdrd30_udrd30_phyclock_user", - ENABLE_SCLK_FSYS, 7, 0, 0), - GATE(CLK_SCLK_MPHY, "sclk_mphy", "mout_sclk_mphy", - ENABLE_SCLK_FSYS, 6, 0, 0), - GATE(CLK_SCLK_UFSUNIPRO, "sclk_ufsunipro", "mout_sclk_ufsunipro_user", - ENABLE_SCLK_FSYS, 5, 0, 0), - GATE(CLK_SCLK_MMC2, "sclk_mmc2", "mout_sclk_mmc2_user", - ENABLE_SCLK_FSYS, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC1, "sclk_mmc1", "mout_sclk_mmc1_user", - ENABLE_SCLK_FSYS, 3, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC0, "sclk_mmc0", "mout_sclk_mmc0_user", - ENABLE_SCLK_FSYS, 2, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_USBHOST30, "sclk_usbhost30", "mout_sclk_usbhost30_user", - ENABLE_SCLK_FSYS, 1, 0, 0), - GATE(CLK_SCLK_USBDRD30, "sclk_usbdrd30", "mout_sclk_usbdrd30_user", - ENABLE_SCLK_FSYS, 0, 0, 0), - - /* ENABLE_IP_FSYS0 */ - GATE(CLK_PCIE, "pcie", "sclk_pcie_100", ENABLE_IP_FSYS0, 17, 0, 0), - GATE(CLK_PDMA1, "pdma1", "aclk_pdma1", ENABLE_IP_FSYS0, 15, 0, 0), - GATE(CLK_PDMA0, "pdma0", "aclk_pdma0", ENABLE_IP_FSYS0, 0, 0, 0), -}; - -static const struct samsung_cmu_info fsys_cmu_info __initconst = { - .mux_clks = fsys_mux_clks, - .nr_mux_clks = ARRAY_SIZE(fsys_mux_clks), - .gate_clks = fsys_gate_clks, - .nr_gate_clks = ARRAY_SIZE(fsys_gate_clks), - .fixed_clks = fsys_fixed_clks, - .nr_fixed_clks = ARRAY_SIZE(fsys_fixed_clks), - .nr_clk_ids = FSYS_NR_CLK, - .clk_regs = fsys_clk_regs, - .nr_clk_regs = ARRAY_SIZE(fsys_clk_regs), -}; - -static void __init exynos5433_cmu_fsys_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &fsys_cmu_info); -} - -CLK_OF_DECLARE(exynos5433_cmu_fsys, "samsung,exynos5433-cmu-fsys", - exynos5433_cmu_fsys_init); - -/* - * Register offset definitions for CMU_G2D - */ -#define MUX_SEL_G2D0 0x0200 -#define MUX_SEL_ENABLE_G2D0 0x0300 -#define MUX_SEL_STAT_G2D0 0x0400 -#define DIV_G2D 0x0600 -#define DIV_STAT_G2D 0x0700 -#define DIV_ENABLE_ACLK_G2D 0x0800 -#define DIV_ENABLE_ACLK_G2D_SECURE_SMMU_G2D 0x0804 -#define DIV_ENABLE_PCLK_G2D 0x0900 -#define DIV_ENABLE_PCLK_G2D_SECURE_SMMU_G2D 0x0904 -#define DIV_ENABLE_IP_G2D0 0x0b00 -#define DIV_ENABLE_IP_G2D1 0x0b04 -#define DIV_ENABLE_IP_G2D_SECURE_SMMU_G2D 0x0b08 - -static const unsigned long g2d_clk_regs[] __initconst = { - MUX_SEL_G2D0, - MUX_SEL_ENABLE_G2D0, - DIV_G2D, - DIV_ENABLE_ACLK_G2D, - DIV_ENABLE_ACLK_G2D_SECURE_SMMU_G2D, - DIV_ENABLE_PCLK_G2D, - DIV_ENABLE_PCLK_G2D_SECURE_SMMU_G2D, - DIV_ENABLE_IP_G2D0, - DIV_ENABLE_IP_G2D1, - DIV_ENABLE_IP_G2D_SECURE_SMMU_G2D, -}; - -/* list of all parent clock list */ -PNAME(mout_aclk_g2d_266_user_p) = { "oscclk", "aclk_g2d_266", }; -PNAME(mout_aclk_g2d_400_user_p) = { "oscclk", "aclk_g2d_400", }; - -static const struct samsung_mux_clock g2d_mux_clks[] __initconst = { - /* MUX_SEL_G2D0 */ - MUX(CLK_MUX_ACLK_G2D_266_USER, "mout_aclk_g2d_266_user", - mout_aclk_g2d_266_user_p, MUX_SEL_G2D0, 4, 1), - MUX(CLK_MUX_ACLK_G2D_400_USER, "mout_aclk_g2d_400_user", - mout_aclk_g2d_400_user_p, MUX_SEL_G2D0, 0, 1), -}; - -static const struct samsung_div_clock g2d_div_clks[] __initconst = { - /* DIV_G2D */ - DIV(CLK_DIV_PCLK_G2D, "div_pclk_g2d", "mout_aclk_g2d_266_user", - DIV_G2D, 0, 2), -}; - -static const struct samsung_gate_clock g2d_gate_clks[] __initconst = { - /* DIV_ENABLE_ACLK_G2D */ - GATE(CLK_ACLK_SMMU_MDMA1, "aclk_smmu_mdma1", "mout_aclk_g2d_266_user", - DIV_ENABLE_ACLK_G2D, 12, 0, 0), - GATE(CLK_ACLK_BTS_MDMA1, "aclk_bts_mdam1", "mout_aclk_g2d_266_user", - DIV_ENABLE_ACLK_G2D, 11, 0, 0), - GATE(CLK_ACLK_BTS_G2D, "aclk_bts_g2d", "mout_aclk_g2d_400_user", - DIV_ENABLE_ACLK_G2D, 10, 0, 0), - GATE(CLK_ACLK_ALB_G2D, "aclk_alb_g2d", "mout_aclk_g2d_400_user", - DIV_ENABLE_ACLK_G2D, 9, 0, 0), - GATE(CLK_ACLK_AXIUS_G2DX, "aclk_axius_g2dx", "mout_aclk_g2d_400_user", - DIV_ENABLE_ACLK_G2D, 8, 0, 0), - GATE(CLK_ACLK_ASYNCAXI_SYSX, "aclk_asyncaxi_sysx", - "mout_aclk_g2d_400_user", DIV_ENABLE_ACLK_G2D, - 7, 0, 0), - GATE(CLK_ACLK_AHB2APB_G2D1P, "aclk_ahb2apb_g2d1p", "div_pclk_g2d", - DIV_ENABLE_ACLK_G2D, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_G2D0P, "aclk_ahb2apb_g2d0p", "div_pclk_g2d", - DIV_ENABLE_ACLK_G2D, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_G2DX, "aclk_xiu_g2dx", "mout_aclk_g2d_400_user", - DIV_ENABLE_ACLK_G2D, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_G2DNP_133, "aclk_g2dnp_133", "div_pclk_g2d", - DIV_ENABLE_ACLK_G2D, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_G2DND_400, "aclk_g2dnd_400", "mout_aclk_g2d_400_user", - DIV_ENABLE_ACLK_G2D, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MDMA1, "aclk_mdma1", "mout_aclk_g2d_266_user", - DIV_ENABLE_ACLK_G2D, 1, 0, 0), - GATE(CLK_ACLK_G2D, "aclk_g2d", "mout_aclk_g2d_400_user", - DIV_ENABLE_ACLK_G2D, 0, 0, 0), - - /* DIV_ENABLE_ACLK_G2D_SECURE_SMMU_G2D */ - GATE(CLK_ACLK_SMMU_G2D, "aclk_smmu_g2d", "mout_aclk_g2d_400_user", - DIV_ENABLE_ACLK_G2D_SECURE_SMMU_G2D, 0, 0, 0), - - /* DIV_ENABLE_PCLK_G2D */ - GATE(CLK_PCLK_SMMU_MDMA1, "pclk_smmu_mdma1", "div_pclk_g2d", - DIV_ENABLE_PCLK_G2D, 7, 0, 0), - GATE(CLK_PCLK_BTS_MDMA1, "pclk_bts_mdam1", "div_pclk_g2d", - DIV_ENABLE_PCLK_G2D, 6, 0, 0), - GATE(CLK_PCLK_BTS_G2D, "pclk_bts_g2d", "div_pclk_g2d", - DIV_ENABLE_PCLK_G2D, 5, 0, 0), - GATE(CLK_PCLK_ALB_G2D, "pclk_alb_g2d", "div_pclk_g2d", - DIV_ENABLE_PCLK_G2D, 4, 0, 0), - GATE(CLK_PCLK_ASYNCAXI_SYSX, "pclk_asyncaxi_sysx", "div_pclk_g2d", - DIV_ENABLE_PCLK_G2D, 3, 0, 0), - GATE(CLK_PCLK_PMU_G2D, "pclk_pmu_g2d", "div_pclk_g2d", - DIV_ENABLE_PCLK_G2D, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_G2D, "pclk_sysreg_g2d", "div_pclk_g2d", - DIV_ENABLE_PCLK_G2D, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_G2D, "pclk_g2d", "div_pclk_g2d", DIV_ENABLE_PCLK_G2D, - 0, 0, 0), - - /* DIV_ENABLE_PCLK_G2D_SECURE_SMMU_G2D */ - GATE(CLK_PCLK_SMMU_G2D, "pclk_smmu_g2d", "div_pclk_g2d", - DIV_ENABLE_PCLK_G2D_SECURE_SMMU_G2D, 0, 0, 0), -}; - -static const struct samsung_cmu_info g2d_cmu_info __initconst = { - .mux_clks = g2d_mux_clks, - .nr_mux_clks = ARRAY_SIZE(g2d_mux_clks), - .div_clks = g2d_div_clks, - .nr_div_clks = ARRAY_SIZE(g2d_div_clks), - .gate_clks = g2d_gate_clks, - .nr_gate_clks = ARRAY_SIZE(g2d_gate_clks), - .nr_clk_ids = G2D_NR_CLK, - .clk_regs = g2d_clk_regs, - .nr_clk_regs = ARRAY_SIZE(g2d_clk_regs), -}; - -static void __init exynos5433_cmu_g2d_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &g2d_cmu_info); -} - -CLK_OF_DECLARE(exynos5433_cmu_g2d, "samsung,exynos5433-cmu-g2d", - exynos5433_cmu_g2d_init); - -/* - * Register offset definitions for CMU_DISP - */ -#define DISP_PLL_LOCK 0x0000 -#define DISP_PLL_CON0 0x0100 -#define DISP_PLL_CON1 0x0104 -#define DISP_PLL_FREQ_DET 0x0108 -#define MUX_SEL_DISP0 0x0200 -#define MUX_SEL_DISP1 0x0204 -#define MUX_SEL_DISP2 0x0208 -#define MUX_SEL_DISP3 0x020c -#define MUX_SEL_DISP4 0x0210 -#define MUX_ENABLE_DISP0 0x0300 -#define MUX_ENABLE_DISP1 0x0304 -#define MUX_ENABLE_DISP2 0x0308 -#define MUX_ENABLE_DISP3 0x030c -#define MUX_ENABLE_DISP4 0x0310 -#define MUX_STAT_DISP0 0x0400 -#define MUX_STAT_DISP1 0x0404 -#define MUX_STAT_DISP2 0x0408 -#define MUX_STAT_DISP3 0x040c -#define MUX_STAT_DISP4 0x0410 -#define MUX_IGNORE_DISP2 0x0508 -#define DIV_DISP 0x0600 -#define DIV_DISP_PLL_FREQ_DET 0x0604 -#define DIV_STAT_DISP 0x0700 -#define DIV_STAT_DISP_PLL_FREQ_DET 0x0704 -#define ENABLE_ACLK_DISP0 0x0800 -#define ENABLE_ACLK_DISP1 0x0804 -#define ENABLE_PCLK_DISP 0x0900 -#define ENABLE_SCLK_DISP 0x0a00 -#define ENABLE_IP_DISP0 0x0b00 -#define ENABLE_IP_DISP1 0x0b04 -#define CLKOUT_CMU_DISP 0x0c00 -#define CLKOUT_CMU_DISP_DIV_STAT 0x0c04 - -static const unsigned long disp_clk_regs[] __initconst = { - DISP_PLL_LOCK, - DISP_PLL_CON0, - DISP_PLL_CON1, - DISP_PLL_FREQ_DET, - MUX_SEL_DISP0, - MUX_SEL_DISP1, - MUX_SEL_DISP2, - MUX_SEL_DISP3, - MUX_SEL_DISP4, - MUX_ENABLE_DISP0, - MUX_ENABLE_DISP1, - MUX_ENABLE_DISP2, - MUX_ENABLE_DISP3, - MUX_ENABLE_DISP4, - MUX_IGNORE_DISP2, - DIV_DISP, - DIV_DISP_PLL_FREQ_DET, - ENABLE_ACLK_DISP0, - ENABLE_ACLK_DISP1, - ENABLE_PCLK_DISP, - ENABLE_SCLK_DISP, - ENABLE_IP_DISP0, - ENABLE_IP_DISP1, - CLKOUT_CMU_DISP, - CLKOUT_CMU_DISP_DIV_STAT, -}; - -/* list of all parent clock list */ -PNAME(mout_disp_pll_p) = { "oscclk", "fout_disp_pll", }; -PNAME(mout_sclk_dsim1_user_p) = { "oscclk", "sclk_dsim1_disp", }; -PNAME(mout_sclk_dsim0_user_p) = { "oscclk", "sclk_dsim0_disp", }; -PNAME(mout_sclk_dsd_user_p) = { "oscclk", "sclk_dsd_disp", }; -PNAME(mout_sclk_decon_tv_eclk_user_p) = { "oscclk", - "sclk_decon_tv_eclk_disp", }; -PNAME(mout_sclk_decon_vclk_user_p) = { "oscclk", - "sclk_decon_vclk_disp", }; -PNAME(mout_sclk_decon_eclk_user_p) = { "oscclk", - "sclk_decon_eclk_disp", }; -PNAME(mout_sclk_decon_tv_vlkc_user_p) = { "oscclk", - "sclk_decon_tv_vclk_disp", }; -PNAME(mout_aclk_disp_333_user_p) = { "oscclk", "aclk_disp_333", }; - -PNAME(mout_phyclk_mipidphy1_bitclkdiv8_user_p) = { "oscclk", - "phyclk_mipidphy1_bitclkdiv8_phy", }; -PNAME(mout_phyclk_mipidphy1_rxclkesc0_user_p) = { "oscclk", - "phyclk_mipidphy1_rxclkesc0_phy", }; -PNAME(mout_phyclk_mipidphy0_bitclkdiv8_user_p) = { "oscclk", - "phyclk_mipidphy0_bitclkdiv8_phy", }; -PNAME(mout_phyclk_mipidphy0_rxclkesc0_user_p) = { "oscclk", - "phyclk_mipidphy0_rxclkesc0_phy", }; -PNAME(mout_phyclk_hdmiphy_tmds_clko_user_p) = { "oscclk", - "phyclk_hdmiphy_tmds_clko_phy", }; -PNAME(mout_phyclk_hdmiphy_pixel_clko_user_p) = { "oscclk", - "phyclk_hdmiphy_pixel_clko_phy", }; - -PNAME(mout_sclk_dsim0_p) = { "mout_disp_pll", - "mout_sclk_dsim0_user", }; -PNAME(mout_sclk_decon_tv_eclk_p) = { "mout_disp_pll", - "mout_sclk_decon_tv_eclk_user", }; -PNAME(mout_sclk_decon_vclk_p) = { "mout_disp_pll", - "mout_sclk_decon_vclk_user", }; -PNAME(mout_sclk_decon_eclk_p) = { "mout_disp_pll", - "mout_sclk_decon_eclk_user", }; - -PNAME(mout_sclk_dsim1_b_disp_p) = { "mout_sclk_dsim1_a_disp", - "mout_sclk_dsim1_user", }; -PNAME(mout_sclk_decon_tv_vclk_c_disp_p) = { - "mout_phyclk_hdmiphy_pixel_clko_user", - "mout_sclk_decon_tv_vclk_b_disp", }; -PNAME(mout_sclk_decon_tv_vclk_b_disp_p) = { "mout_sclk_decon_tv_vclk_a_disp", - "mout_sclk_decon_tv_vclk_user", }; - -static const struct samsung_pll_clock disp_pll_clks[] __initconst = { - PLL(pll_35xx, CLK_FOUT_DISP_PLL, "fout_disp_pll", "oscclk", - DISP_PLL_LOCK, DISP_PLL_CON0, exynos5443_pll_rates), -}; - -static const struct samsung_fixed_factor_clock disp_fixed_factor_clks[] __initconst = { - /* - * sclk_rgb_{vclk|tv_vclk} is half clock of sclk_decon_{vclk|tv_vclk}. - * The divider has fixed value (2) between sclk_rgb_{vclk|tv_vclk} - * and sclk_decon_{vclk|tv_vclk}. - */ - FFACTOR(CLK_SCLK_RGB_VCLK, "sclk_rgb_vclk", "sclk_decon_vclk", - 1, 2, 0), - FFACTOR(CLK_SCLK_RGB_TV_VCLK, "sclk_rgb_tv_vclk", "sclk_decon_tv_vclk", - 1, 2, 0), -}; - -static const struct samsung_fixed_rate_clock disp_fixed_clks[] __initconst = { - /* PHY clocks from MIPI_DPHY1 */ - FRATE(0, "phyclk_mipidphy1_bitclkdiv8_phy", NULL, 0, 188000000), - FRATE(0, "phyclk_mipidphy1_rxclkesc0_phy", NULL, 0, 100000000), - /* PHY clocks from MIPI_DPHY0 */ - FRATE(0, "phyclk_mipidphy0_bitclkdiv8_phy", NULL, 0, 188000000), - FRATE(0, "phyclk_mipidphy0_rxclkesc0_phy", NULL, 0, 100000000), - /* PHY clocks from HDMI_PHY */ - FRATE(CLK_PHYCLK_HDMIPHY_TMDS_CLKO_PHY, "phyclk_hdmiphy_tmds_clko_phy", - NULL, 0, 300000000), - FRATE(CLK_PHYCLK_HDMIPHY_PIXEL_CLKO_PHY, "phyclk_hdmiphy_pixel_clko_phy", - NULL, 0, 166000000), -}; - -static const struct samsung_mux_clock disp_mux_clks[] __initconst = { - /* MUX_SEL_DISP0 */ - MUX(CLK_MOUT_DISP_PLL, "mout_disp_pll", mout_disp_pll_p, MUX_SEL_DISP0, - 0, 1), - - /* MUX_SEL_DISP1 */ - MUX(CLK_MOUT_SCLK_DSIM1_USER, "mout_sclk_dsim1_user", - mout_sclk_dsim1_user_p, MUX_SEL_DISP1, 28, 1), - MUX(CLK_MOUT_SCLK_DSIM0_USER, "mout_sclk_dsim0_user", - mout_sclk_dsim0_user_p, MUX_SEL_DISP1, 24, 1), - MUX(CLK_MOUT_SCLK_DSD_USER, "mout_sclk_dsd_user", mout_sclk_dsd_user_p, - MUX_SEL_DISP1, 20, 1), - MUX(CLK_MOUT_SCLK_DECON_TV_ECLK_USER, "mout_sclk_decon_tv_eclk_user", - mout_sclk_decon_tv_eclk_user_p, MUX_SEL_DISP1, 16, 1), - MUX(CLK_MOUT_SCLK_DECON_VCLK_USER, "mout_sclk_decon_vclk_user", - mout_sclk_decon_vclk_user_p, MUX_SEL_DISP1, 12, 1), - MUX(CLK_MOUT_SCLK_DECON_ECLK_USER, "mout_sclk_decon_eclk_user", - mout_sclk_decon_eclk_user_p, MUX_SEL_DISP1, 8, 1), - MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_USER, "mout_sclk_decon_tv_vclk_user", - mout_sclk_decon_tv_vlkc_user_p, MUX_SEL_DISP1, 4, 1), - MUX(CLK_MOUT_ACLK_DISP_333_USER, "mout_aclk_disp_333_user", - mout_aclk_disp_333_user_p, MUX_SEL_DISP1, 0, 1), - - /* MUX_SEL_DISP2 */ - MUX(CLK_MOUT_PHYCLK_MIPIDPHY1_BITCLKDIV8_USER, - "mout_phyclk_mipidphy1_bitclkdiv8_user", - mout_phyclk_mipidphy1_bitclkdiv8_user_p, MUX_SEL_DISP2, - 20, 1), - MUX(CLK_MOUT_PHYCLK_MIPIDPHY1_RXCLKESC0_USER, - "mout_phyclk_mipidphy1_rxclkesc0_user", - mout_phyclk_mipidphy1_rxclkesc0_user_p, MUX_SEL_DISP2, - 16, 1), - MUX(CLK_MOUT_PHYCLK_MIPIDPHY0_BITCLKDIV8_USER, - "mout_phyclk_mipidphy0_bitclkdiv8_user", - mout_phyclk_mipidphy0_bitclkdiv8_user_p, MUX_SEL_DISP2, - 12, 1), - MUX(CLK_MOUT_PHYCLK_MIPIDPHY0_RXCLKESC0_USER, - "mout_phyclk_mipidphy0_rxclkesc0_user", - mout_phyclk_mipidphy0_rxclkesc0_user_p, MUX_SEL_DISP2, - 8, 1), - MUX(CLK_MOUT_PHYCLK_HDMIPHY_TMDS_CLKO_USER, - "mout_phyclk_hdmiphy_tmds_clko_user", - mout_phyclk_hdmiphy_tmds_clko_user_p, MUX_SEL_DISP2, - 4, 1), - MUX(CLK_MOUT_PHYCLK_HDMIPHY_PIXEL_CLKO_USER, - "mout_phyclk_hdmiphy_pixel_clko_user", - mout_phyclk_hdmiphy_pixel_clko_user_p, MUX_SEL_DISP2, - 0, 1), - - /* MUX_SEL_DISP3 */ - MUX(CLK_MOUT_SCLK_DSIM0, "mout_sclk_dsim0", mout_sclk_dsim0_p, - MUX_SEL_DISP3, 12, 1), - MUX(CLK_MOUT_SCLK_DECON_TV_ECLK, "mout_sclk_decon_tv_eclk", - mout_sclk_decon_tv_eclk_p, MUX_SEL_DISP3, 8, 1), - MUX(CLK_MOUT_SCLK_DECON_VCLK, "mout_sclk_decon_vclk", - mout_sclk_decon_vclk_p, MUX_SEL_DISP3, 4, 1), - MUX(CLK_MOUT_SCLK_DECON_ECLK, "mout_sclk_decon_eclk", - mout_sclk_decon_eclk_p, MUX_SEL_DISP3, 0, 1), - - /* MUX_SEL_DISP4 */ - MUX(CLK_MOUT_SCLK_DSIM1_B_DISP, "mout_sclk_dsim1_b_disp", - mout_sclk_dsim1_b_disp_p, MUX_SEL_DISP4, 16, 1), - MUX(CLK_MOUT_SCLK_DSIM1_A_DISP, "mout_sclk_dsim1_a_disp", - mout_sclk_dsim0_p, MUX_SEL_DISP4, 12, 1), - MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_C_DISP, - "mout_sclk_decon_tv_vclk_c_disp", - mout_sclk_decon_tv_vclk_c_disp_p, MUX_SEL_DISP4, 8, 1), - MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_B_DISP, - "mout_sclk_decon_tv_vclk_b_disp", - mout_sclk_decon_tv_vclk_b_disp_p, MUX_SEL_DISP4, 4, 1), - MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_A_DISP, - "mout_sclk_decon_tv_vclk_a_disp", - mout_sclk_decon_vclk_p, MUX_SEL_DISP4, 0, 1), -}; - -static const struct samsung_div_clock disp_div_clks[] __initconst = { - /* DIV_DISP */ - DIV(CLK_DIV_SCLK_DSIM1_DISP, "div_sclk_dsim1_disp", - "mout_sclk_dsim1_b_disp", DIV_DISP, 24, 3), - DIV(CLK_DIV_SCLK_DECON_TV_VCLK_DISP, "div_sclk_decon_tv_vclk_disp", - "mout_sclk_decon_tv_vclk_c_disp", DIV_DISP, 20, 3), - DIV(CLK_DIV_SCLK_DSIM0_DISP, "div_sclk_dsim0_disp", "mout_sclk_dsim0", - DIV_DISP, 16, 3), - DIV(CLK_DIV_SCLK_DECON_TV_ECLK_DISP, "div_sclk_decon_tv_eclk_disp", - "mout_sclk_decon_tv_eclk", DIV_DISP, 12, 3), - DIV(CLK_DIV_SCLK_DECON_VCLK_DISP, "div_sclk_decon_vclk_disp", - "mout_sclk_decon_vclk", DIV_DISP, 8, 3), - DIV(CLK_DIV_SCLK_DECON_ECLK_DISP, "div_sclk_decon_eclk_disp", - "mout_sclk_decon_eclk", DIV_DISP, 4, 3), - DIV(CLK_DIV_PCLK_DISP, "div_pclk_disp", "mout_aclk_disp_333_user", - DIV_DISP, 0, 2), -}; - -static const struct samsung_gate_clock disp_gate_clks[] __initconst = { - /* ENABLE_ACLK_DISP0 */ - GATE(CLK_ACLK_DECON_TV, "aclk_decon_tv", "mout_aclk_disp_333_user", - ENABLE_ACLK_DISP0, 2, 0, 0), - GATE(CLK_ACLK_DECON, "aclk_decon", "mout_aclk_disp_333_user", - ENABLE_ACLK_DISP0, 0, 0, 0), - - /* ENABLE_ACLK_DISP1 */ - GATE(CLK_ACLK_SMMU_TV1X, "aclk_smmu_tv1x", "mout_aclk_disp_333_user", - ENABLE_ACLK_DISP1, 25, 0, 0), - GATE(CLK_ACLK_SMMU_TV0X, "aclk_smmu_tv0x", "mout_aclk_disp_333_user", - ENABLE_ACLK_DISP1, 24, 0, 0), - GATE(CLK_ACLK_SMMU_DECON1X, "aclk_smmu_decon1x", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 23, 0, 0), - GATE(CLK_ACLK_SMMU_DECON0X, "aclk_smmu_decon0x", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 22, 0, 0), - GATE(CLK_ACLK_BTS_DECON_TV_M3, "aclk_bts_decon_tv_m3", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 21, 0, 0), - GATE(CLK_ACLK_BTS_DECON_TV_M2, "aclk_bts_decon_tv_m2", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 20, 0, 0), - GATE(CLK_ACLK_BTS_DECON_TV_M1, "aclk_bts_decon_tv_m1", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 19, 0, 0), - GATE(CLK_ACLK_BTS_DECON_TV_M0, "aclk-bts_decon_tv_m0", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 18, 0, 0), - GATE(CLK_ACLK_BTS_DECON_NM4, "aclk_bts_decon_nm4", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 17, 0, 0), - GATE(CLK_ACLK_BTS_DECON_NM3, "aclk_bts_decon_nm3", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 16, 0, 0), - GATE(CLK_ACLK_BTS_DECON_NM2, "aclk_bts_decon_nm2", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 15, 0, 0), - GATE(CLK_ACLK_BTS_DECON_NM1, "aclk_bts_decon_nm1", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 14, 0, 0), - GATE(CLK_ACLK_BTS_DECON_NM0, "aclk_bts_decon_nm0", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 13, 0, 0), - GATE(CLK_ACLK_AHB2APB_DISPSFR2P, "aclk_ahb2apb_dispsfr2p", - "div_pclk_disp", ENABLE_ACLK_DISP1, - 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_DISPSFR1P, "aclk_ahb2apb_dispsfr1p", - "div_pclk_disp", ENABLE_ACLK_DISP1, - 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_DISPSFR0P, "aclk_ahb2apb_dispsfr0p", - "div_pclk_disp", ENABLE_ACLK_DISP1, - 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB_DISPH, "aclk_ahb_disph", "div_pclk_disp", - ENABLE_ACLK_DISP1, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_TV1X, "aclk_xiu_tv1x", "mout_aclk_disp_333_user", - ENABLE_ACLK_DISP1, 7, 0, 0), - GATE(CLK_ACLK_XIU_TV0X, "aclk_xiu_tv0x", "mout_aclk_disp_333_user", - ENABLE_ACLK_DISP1, 6, 0, 0), - GATE(CLK_ACLK_XIU_DECON1X, "aclk_xiu_decon1x", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 5, 0, 0), - GATE(CLK_ACLK_XIU_DECON0X, "aclk_xiu_decon0x", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 4, 0, 0), - GATE(CLK_ACLK_XIU_DISP1X, "aclk_xiu_disp1x", "mout_aclk_disp_333_user", - ENABLE_ACLK_DISP1, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_DISPNP_100, "aclk_xiu_dispnp_100", "div_pclk_disp", - ENABLE_ACLK_DISP1, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DISP1ND_333, "aclk_disp1nd_333", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 1, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_DISP0ND_333, "aclk_disp0nd_333", - "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_DISP */ - GATE(CLK_PCLK_SMMU_TV1X, "pclk_smmu_tv1x", "div_pclk_disp", - ENABLE_PCLK_DISP, 23, 0, 0), - GATE(CLK_PCLK_SMMU_TV0X, "pclk_smmu_tv0x", "div_pclk_disp", - ENABLE_PCLK_DISP, 22, 0, 0), - GATE(CLK_PCLK_SMMU_DECON1X, "pclk_smmu_decon1x", "div_pclk_disp", - ENABLE_PCLK_DISP, 21, 0, 0), - GATE(CLK_PCLK_SMMU_DECON0X, "pclk_smmu_decon0x", "div_pclk_disp", - ENABLE_PCLK_DISP, 20, 0, 0), - GATE(CLK_PCLK_BTS_DECON_TV_M3, "pclk_bts_decon_tv_m3", "div_pclk_disp", - ENABLE_PCLK_DISP, 19, 0, 0), - GATE(CLK_PCLK_BTS_DECON_TV_M2, "pclk_bts_decon_tv_m2", "div_pclk_disp", - ENABLE_PCLK_DISP, 18, 0, 0), - GATE(CLK_PCLK_BTS_DECON_TV_M1, "pclk_bts_decon_tv_m1", "div_pclk_disp", - ENABLE_PCLK_DISP, 17, 0, 0), - GATE(CLK_PCLK_BTS_DECON_TV_M0, "pclk_bts_decon_tv_m0", "div_pclk_disp", - ENABLE_PCLK_DISP, 16, 0, 0), - GATE(CLK_PCLK_BTS_DECONM4, "pclk_bts_deconm4", "div_pclk_disp", - ENABLE_PCLK_DISP, 15, 0, 0), - GATE(CLK_PCLK_BTS_DECONM3, "pclk_bts_deconm3", "div_pclk_disp", - ENABLE_PCLK_DISP, 14, 0, 0), - GATE(CLK_PCLK_BTS_DECONM2, "pclk_bts_deconm2", "div_pclk_disp", - ENABLE_PCLK_DISP, 13, 0, 0), - GATE(CLK_PCLK_BTS_DECONM1, "pclk_bts_deconm1", "div_pclk_disp", - ENABLE_PCLK_DISP, 12, 0, 0), - GATE(CLK_PCLK_BTS_DECONM0, "pclk_bts_deconm0", "div_pclk_disp", - ENABLE_PCLK_DISP, 11, 0, 0), - GATE(CLK_PCLK_MIC1, "pclk_mic1", "div_pclk_disp", - ENABLE_PCLK_DISP, 10, 0, 0), - GATE(CLK_PCLK_PMU_DISP, "pclk_pmu_disp", "div_pclk_disp", - ENABLE_PCLK_DISP, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_DISP, "pclk_sysreg_disp", "div_pclk_disp", - ENABLE_PCLK_DISP, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_HDMIPHY, "pclk_hdmiphy", "div_pclk_disp", - ENABLE_PCLK_DISP, 7, 0, 0), - GATE(CLK_PCLK_HDMI, "pclk_hdmi", "div_pclk_disp", - ENABLE_PCLK_DISP, 6, 0, 0), - GATE(CLK_PCLK_MIC0, "pclk_mic0", "div_pclk_disp", - ENABLE_PCLK_DISP, 5, 0, 0), - GATE(CLK_PCLK_DSIM1, "pclk_dsim1", "div_pclk_disp", - ENABLE_PCLK_DISP, 3, 0, 0), - GATE(CLK_PCLK_DSIM0, "pclk_dsim0", "div_pclk_disp", - ENABLE_PCLK_DISP, 2, 0, 0), - GATE(CLK_PCLK_DECON_TV, "pclk_decon_tv", "div_pclk_disp", - ENABLE_PCLK_DISP, 1, 0, 0), - GATE(CLK_PCLK_DECON, "pclk_decon", "div_pclk_disp", - ENABLE_PCLK_DISP, 0, 0, 0), - - /* ENABLE_SCLK_DISP */ - GATE(CLK_PHYCLK_MIPIDPHY1_BITCLKDIV8, "phyclk_mipidphy1_bitclkdiv8", - "mout_phyclk_mipidphy1_bitclkdiv8_user", - ENABLE_SCLK_DISP, 26, 0, 0), - GATE(CLK_PHYCLK_MIPIDPHY1_RXCLKESC0, "phyclk_mipidphy1_rxclkesc0", - "mout_phyclk_mipidphy1_rxclkesc0_user", - ENABLE_SCLK_DISP, 25, 0, 0), - GATE(CLK_SCLK_RGB_TV_VCLK_TO_DSIM1, "sclk_rgb_tv_vclk_to_dsim1", - "sclk_rgb_tv_vclk", ENABLE_SCLK_DISP, 24, 0, 0), - GATE(CLK_SCLK_RGB_TV_VCLK_TO_MIC1, "sclk_rgb_tv_vclk_to_mic1", - "sclk_rgb_tv_vclk", ENABLE_SCLK_DISP, 23, 0, 0), - GATE(CLK_SCLK_DSIM1, "sclk_dsim1", "div_sclk_dsim1_disp", - ENABLE_SCLK_DISP, 22, 0, 0), - GATE(CLK_SCLK_DECON_TV_VCLK, "sclk_decon_tv_vclk", - "div_sclk_decon_tv_vclk_disp", - ENABLE_SCLK_DISP, 21, 0, 0), - GATE(CLK_PHYCLK_MIPIDPHY0_BITCLKDIV8, "phyclk_mipidphy0_bitclkdiv8", - "mout_phyclk_mipidphy0_bitclkdiv8_user", - ENABLE_SCLK_DISP, 15, 0, 0), - GATE(CLK_PHYCLK_MIPIDPHY0_RXCLKESC0, "phyclk_mipidphy0_rxclkesc0", - "mout_phyclk_mipidphy0_rxclkesc0_user", - ENABLE_SCLK_DISP, 14, 0, 0), - GATE(CLK_PHYCLK_HDMIPHY_TMDS_CLKO, "phyclk_hdmiphy_tmds_clko", - "mout_phyclk_hdmiphy_tmds_clko_user", - ENABLE_SCLK_DISP, 13, 0, 0), - GATE(CLK_PHYCLK_HDMI_PIXEL, "phyclk_hdmi_pixel", - "sclk_rgb_tv_vclk", ENABLE_SCLK_DISP, 12, 0, 0), - GATE(CLK_SCLK_RGB_VCLK_TO_SMIES, "sclk_rgb_vclk_to_smies", - "sclk_rgb_vclk", ENABLE_SCLK_DISP, 11, 0, 0), - GATE(CLK_SCLK_RGB_VCLK_TO_DSIM0, "sclk_rgb_vclk_to_dsim0", - "sclk_rgb_vclk", ENABLE_SCLK_DISP, 9, 0, 0), - GATE(CLK_SCLK_RGB_VCLK_TO_MIC0, "sclk_rgb_vclk_to_mic0", - "sclk_rgb_vclk", ENABLE_SCLK_DISP, 8, 0, 0), - GATE(CLK_SCLK_DSD, "sclk_dsd", "mout_sclk_dsd_user", - ENABLE_SCLK_DISP, 7, 0, 0), - GATE(CLK_SCLK_HDMI_SPDIF, "sclk_hdmi_spdif", "sclk_hdmi_spdif_disp", - ENABLE_SCLK_DISP, 6, 0, 0), - GATE(CLK_SCLK_DSIM0, "sclk_dsim0", "div_sclk_dsim0_disp", - ENABLE_SCLK_DISP, 5, 0, 0), - GATE(CLK_SCLK_DECON_TV_ECLK, "sclk_decon_tv_eclk", - "div_sclk_decon_tv_eclk_disp", - ENABLE_SCLK_DISP, 4, 0, 0), - GATE(CLK_SCLK_DECON_VCLK, "sclk_decon_vclk", - "div_sclk_decon_vclk_disp", ENABLE_SCLK_DISP, 3, 0, 0), - GATE(CLK_SCLK_DECON_ECLK, "sclk_decon_eclk", - "div_sclk_decon_eclk_disp", ENABLE_SCLK_DISP, 2, 0, 0), -}; - -static const struct samsung_cmu_info disp_cmu_info __initconst = { - .pll_clks = disp_pll_clks, - .nr_pll_clks = ARRAY_SIZE(disp_pll_clks), - .mux_clks = disp_mux_clks, - .nr_mux_clks = ARRAY_SIZE(disp_mux_clks), - .div_clks = disp_div_clks, - .nr_div_clks = ARRAY_SIZE(disp_div_clks), - .gate_clks = disp_gate_clks, - .nr_gate_clks = ARRAY_SIZE(disp_gate_clks), - .fixed_clks = disp_fixed_clks, - .nr_fixed_clks = ARRAY_SIZE(disp_fixed_clks), - .fixed_factor_clks = disp_fixed_factor_clks, - .nr_fixed_factor_clks = ARRAY_SIZE(disp_fixed_factor_clks), - .nr_clk_ids = DISP_NR_CLK, - .clk_regs = disp_clk_regs, - .nr_clk_regs = ARRAY_SIZE(disp_clk_regs), -}; - -static void __init exynos5433_cmu_disp_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &disp_cmu_info); -} - -CLK_OF_DECLARE(exynos5433_cmu_disp, "samsung,exynos5433-cmu-disp", - exynos5433_cmu_disp_init); - -/* - * Register offset definitions for CMU_AUD - */ -#define MUX_SEL_AUD0 0x0200 -#define MUX_SEL_AUD1 0x0204 -#define MUX_ENABLE_AUD0 0x0300 -#define MUX_ENABLE_AUD1 0x0304 -#define MUX_STAT_AUD0 0x0400 -#define DIV_AUD0 0x0600 -#define DIV_AUD1 0x0604 -#define DIV_STAT_AUD0 0x0700 -#define DIV_STAT_AUD1 0x0704 -#define ENABLE_ACLK_AUD 0x0800 -#define ENABLE_PCLK_AUD 0x0900 -#define ENABLE_SCLK_AUD0 0x0a00 -#define ENABLE_SCLK_AUD1 0x0a04 -#define ENABLE_IP_AUD0 0x0b00 -#define ENABLE_IP_AUD1 0x0b04 - -static const unsigned long aud_clk_regs[] __initconst = { - MUX_SEL_AUD0, - MUX_SEL_AUD1, - MUX_ENABLE_AUD0, - MUX_ENABLE_AUD1, - DIV_AUD0, - DIV_AUD1, - ENABLE_ACLK_AUD, - ENABLE_PCLK_AUD, - ENABLE_SCLK_AUD0, - ENABLE_SCLK_AUD1, - ENABLE_IP_AUD0, - ENABLE_IP_AUD1, -}; - -/* list of all parent clock list */ -PNAME(mout_aud_pll_user_aud_p) = { "oscclk", "fout_aud_pll", }; -PNAME(mout_sclk_aud_pcm_p) = { "mout_aud_pll_user", "ioclk_audiocdclk0",}; - -static const struct samsung_fixed_rate_clock aud_fixed_clks[] __initconst = { - FRATE(0, "ioclk_jtag_tclk", NULL, 0, 33000000), - FRATE(0, "ioclk_slimbus_clk", NULL, 0, 25000000), - FRATE(0, "ioclk_i2s_bclk", NULL, 0, 50000000), -}; - -static const struct samsung_mux_clock aud_mux_clks[] __initconst = { - /* MUX_SEL_AUD0 */ - MUX(CLK_MOUT_AUD_PLL_USER, "mout_aud_pll_user", - mout_aud_pll_user_aud_p, MUX_SEL_AUD0, 0, 1), - - /* MUX_SEL_AUD1 */ - MUX(CLK_MOUT_SCLK_AUD_PCM, "mout_sclk_aud_pcm", mout_sclk_aud_pcm_p, - MUX_SEL_AUD1, 8, 1), - MUX(CLK_MOUT_SCLK_AUD_I2S, "mout_sclk_aud_i2s", mout_sclk_aud_pcm_p, - MUX_SEL_AUD1, 0, 1), -}; - -static const struct samsung_div_clock aud_div_clks[] __initconst = { - /* DIV_AUD0 */ - DIV(CLK_DIV_ATCLK_AUD, "div_atclk_aud", "div_aud_ca5", DIV_AUD0, - 12, 4), - DIV(CLK_DIV_PCLK_DBG_AUD, "div_pclk_dbg_aud", "div_aud_ca5", DIV_AUD0, - 8, 4), - DIV(CLK_DIV_ACLK_AUD, "div_aclk_aud", "div_aud_ca5", DIV_AUD0, - 4, 4), - DIV(CLK_DIV_AUD_CA5, "div_aud_ca5", "mout_aud_pll_user", DIV_AUD0, - 0, 4), - - /* DIV_AUD1 */ - DIV(CLK_DIV_SCLK_AUD_SLIMBUS, "div_sclk_aud_slimbus", - "mout_aud_pll_user", DIV_AUD1, 16, 5), - DIV(CLK_DIV_SCLK_AUD_UART, "div_sclk_aud_uart", "mout_aud_pll_user", - DIV_AUD1, 12, 4), - DIV(CLK_DIV_SCLK_AUD_PCM, "div_sclk_aud_pcm", "mout_sclk_aud_pcm", - DIV_AUD1, 4, 8), - DIV(CLK_DIV_SCLK_AUD_I2S, "div_sclk_aud_i2s", "mout_sclk_aud_i2s", - DIV_AUD1, 0, 4), -}; - -static const struct samsung_gate_clock aud_gate_clks[] __initconst = { - /* ENABLE_ACLK_AUD */ - GATE(CLK_ACLK_INTR_CTRL, "aclk_intr_ctrl", "div_aclk_aud", - ENABLE_ACLK_AUD, 12, 0, 0), - GATE(CLK_ACLK_SMMU_LPASSX, "aclk_smmu_lpassx", "div_aclk_aud", - ENABLE_ACLK_AUD, 7, 0, 0), - GATE(CLK_ACLK_XIU_LPASSX, "aclk_xiu_lpassx", "div_aclk_aud", - ENABLE_ACLK_AUD, 0, 4, 0), - GATE(CLK_ACLK_AUDNP_133, "aclk_audnp_133", "div_aclk_aud", - ENABLE_ACLK_AUD, 0, 3, 0), - GATE(CLK_ACLK_AUDND_133, "aclk_audnd_133", "div_aclk_aud", - ENABLE_ACLK_AUD, 0, 2, 0), - GATE(CLK_ACLK_SRAMC, "aclk_sramc", "div_aclk_aud", ENABLE_ACLK_AUD, - 0, 1, 0), - GATE(CLK_ACLK_DMAC, "aclk_dmac", "div_aclk_aud", ENABLE_ACLK_AUD, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_AUD */ - GATE(CLK_PCLK_WDT1, "pclk_wdt1", "div_aclk_aud", ENABLE_PCLK_AUD, - 13, 0, 0), - GATE(CLK_PCLK_WDT0, "pclk_wdt0", "div_aclk_aud", ENABLE_PCLK_AUD, - 12, 0, 0), - GATE(CLK_PCLK_SFR1, "pclk_sfr1", "div_aclk_aud", ENABLE_PCLK_AUD, - 11, 0, 0), - GATE(CLK_PCLK_SMMU_LPASSX, "pclk_smmu_lpassx", "div_aclk_aud", - ENABLE_PCLK_AUD, 10, 0, 0), - GATE(CLK_PCLK_GPIO_AUD, "pclk_gpio_aud", "div_aclk_aud", - ENABLE_PCLK_AUD, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PMU_AUD, "pclk_pmu_aud", "div_aclk_aud", - ENABLE_PCLK_AUD, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_AUD, "pclk_sysreg_aud", "div_aclk_aud", - ENABLE_PCLK_AUD, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_AUD_SLIMBUS, "pclk_aud_slimbus", "div_aclk_aud", - ENABLE_PCLK_AUD, 6, 0, 0), - GATE(CLK_PCLK_AUD_UART, "pclk_aud_uart", "div_aclk_aud", - ENABLE_PCLK_AUD, 5, 0, 0), - GATE(CLK_PCLK_AUD_PCM, "pclk_aud_pcm", "div_aclk_aud", - ENABLE_PCLK_AUD, 4, 0, 0), - GATE(CLK_PCLK_AUD_I2S, "pclk_aud_i2s", "div_aclk_aud", - ENABLE_PCLK_AUD, 3, 0, 0), - GATE(CLK_PCLK_TIMER, "pclk_timer", "div_aclk_aud", ENABLE_PCLK_AUD, - 2, 0, 0), - GATE(CLK_PCLK_SFR0_CTRL, "pclk_sfr0_ctrl", "div_aclk_aud", - ENABLE_PCLK_AUD, 0, 0, 0), - - /* ENABLE_SCLK_AUD0 */ - GATE(CLK_ATCLK_AUD, "atclk_aud", "div_atclk_aud", ENABLE_SCLK_AUD0, - 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_DBG_AUD, "pclk_dbg_aud", "div_pclk_dbg_aud", - ENABLE_SCLK_AUD0, 1, 0, 0), - GATE(CLK_SCLK_AUD_CA5, "sclk_aud_ca5", "div_aud_ca5", ENABLE_SCLK_AUD0, - 0, 0, 0), - - /* ENABLE_SCLK_AUD1 */ - GATE(CLK_SCLK_JTAG_TCK, "sclk_jtag_tck", "ioclk_jtag_tclk", - ENABLE_SCLK_AUD1, 6, 0, 0), - GATE(CLK_SCLK_SLIMBUS_CLKIN, "sclk_slimbus_clkin", "ioclk_slimbus_clk", - ENABLE_SCLK_AUD1, 5, 0, 0), - GATE(CLK_SCLK_AUD_SLIMBUS, "sclk_aud_slimbus", "div_sclk_aud_slimbus", - ENABLE_SCLK_AUD1, 4, 0, 0), - GATE(CLK_SCLK_AUD_UART, "sclk_aud_uart", "div_sclk_aud_uart", - ENABLE_SCLK_AUD1, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_AUD_PCM, "sclk_aud_pcm", "div_sclk_aud_pcm", - ENABLE_SCLK_AUD1, 2, 0, 0), - GATE(CLK_SCLK_I2S_BCLK, "sclk_i2s_bclk", "ioclk_i2s_bclk", - ENABLE_SCLK_AUD1, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_AUD_I2S, "sclk_aud_i2s", "div_sclk_aud_i2s", - ENABLE_SCLK_AUD1, 0, CLK_IGNORE_UNUSED, 0), -}; - -static const struct samsung_cmu_info aud_cmu_info __initconst = { - .mux_clks = aud_mux_clks, - .nr_mux_clks = ARRAY_SIZE(aud_mux_clks), - .div_clks = aud_div_clks, - .nr_div_clks = ARRAY_SIZE(aud_div_clks), - .gate_clks = aud_gate_clks, - .nr_gate_clks = ARRAY_SIZE(aud_gate_clks), - .fixed_clks = aud_fixed_clks, - .nr_fixed_clks = ARRAY_SIZE(aud_fixed_clks), - .nr_clk_ids = AUD_NR_CLK, - .clk_regs = aud_clk_regs, - .nr_clk_regs = ARRAY_SIZE(aud_clk_regs), -}; - -static void __init exynos5433_cmu_aud_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &aud_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_aud, "samsung,exynos5433-cmu-aud", - exynos5433_cmu_aud_init); - - -/* - * Register offset definitions for CMU_BUS{0|1|2} - */ -#define DIV_BUS 0x0600 -#define DIV_STAT_BUS 0x0700 -#define ENABLE_ACLK_BUS 0x0800 -#define ENABLE_PCLK_BUS 0x0900 -#define ENABLE_IP_BUS0 0x0b00 -#define ENABLE_IP_BUS1 0x0b04 - -#define MUX_SEL_BUS2 0x0200 /* Only for CMU_BUS2 */ -#define MUX_ENABLE_BUS2 0x0300 /* Only for CMU_BUS2 */ -#define MUX_STAT_BUS2 0x0400 /* Only for CMU_BUS2 */ - -/* list of all parent clock list */ -PNAME(mout_aclk_bus2_400_p) = { "oscclk", "aclk_bus2_400", }; - -#define CMU_BUS_COMMON_CLK_REGS \ - DIV_BUS, \ - ENABLE_ACLK_BUS, \ - ENABLE_PCLK_BUS, \ - ENABLE_IP_BUS0, \ - ENABLE_IP_BUS1 - -static const unsigned long bus01_clk_regs[] __initconst = { - CMU_BUS_COMMON_CLK_REGS, -}; - -static const unsigned long bus2_clk_regs[] __initconst = { - MUX_SEL_BUS2, - MUX_ENABLE_BUS2, - CMU_BUS_COMMON_CLK_REGS, -}; - -static const struct samsung_div_clock bus0_div_clks[] __initconst = { - /* DIV_BUS0 */ - DIV(CLK_DIV_PCLK_BUS_133, "div_pclk_bus0_133", "aclk_bus0_400", - DIV_BUS, 0, 3), -}; - -/* CMU_BUS0 clocks */ -static const struct samsung_gate_clock bus0_gate_clks[] __initconst = { - /* ENABLE_ACLK_BUS0 */ - GATE(CLK_ACLK_AHB2APB_BUSP, "aclk_ahb2apb_bus0p", "div_pclk_bus0_133", - ENABLE_ACLK_BUS, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BUSNP_133, "aclk_bus0np_133", "div_pclk_bus0_133", - ENABLE_ACLK_BUS, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BUSND_400, "aclk_bus0nd_400", "aclk_bus0_400", - ENABLE_ACLK_BUS, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_BUS0 */ - GATE(CLK_PCLK_BUSSRVND_133, "pclk_bus0srvnd_133", "div_pclk_bus0_133", - ENABLE_PCLK_BUS, 2, 0, 0), - GATE(CLK_PCLK_PMU_BUS, "pclk_pmu_bus0", "div_pclk_bus0_133", - ENABLE_PCLK_BUS, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_BUS, "pclk_sysreg_bus0", "div_pclk_bus0_133", - ENABLE_PCLK_BUS, 0, CLK_IGNORE_UNUSED, 0), -}; - -/* CMU_BUS1 clocks */ -static const struct samsung_div_clock bus1_div_clks[] __initconst = { - /* DIV_BUS1 */ - DIV(CLK_DIV_PCLK_BUS_133, "div_pclk_bus1_133", "aclk_bus1_400", - DIV_BUS, 0, 3), -}; - -static const struct samsung_gate_clock bus1_gate_clks[] __initconst = { - /* ENABLE_ACLK_BUS1 */ - GATE(CLK_ACLK_AHB2APB_BUSP, "aclk_ahb2apb_bus1p", "div_pclk_bus1_133", - ENABLE_ACLK_BUS, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BUSNP_133, "aclk_bus1np_133", "div_pclk_bus1_133", - ENABLE_ACLK_BUS, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BUSND_400, "aclk_bus1nd_400", "aclk_bus1_400", - ENABLE_ACLK_BUS, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_BUS1 */ - GATE(CLK_PCLK_BUSSRVND_133, "pclk_bus1srvnd_133", "div_pclk_bus1_133", - ENABLE_PCLK_BUS, 2, 0, 0), - GATE(CLK_PCLK_PMU_BUS, "pclk_pmu_bus1", "div_pclk_bus1_133", - ENABLE_PCLK_BUS, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_BUS, "pclk_sysreg_bus1", "div_pclk_bus1_133", - ENABLE_PCLK_BUS, 0, CLK_IGNORE_UNUSED, 0), -}; - -/* CMU_BUS2 clocks */ -static const struct samsung_mux_clock bus2_mux_clks[] __initconst = { - /* MUX_SEL_BUS2 */ - MUX(CLK_MOUT_ACLK_BUS2_400_USER, "mout_aclk_bus2_400_user", - mout_aclk_bus2_400_p, MUX_SEL_BUS2, 0, 1), -}; - -static const struct samsung_div_clock bus2_div_clks[] __initconst = { - /* DIV_BUS2 */ - DIV(CLK_DIV_PCLK_BUS_133, "div_pclk_bus2_133", - "mout_aclk_bus2_400_user", DIV_BUS, 0, 3), -}; - -static const struct samsung_gate_clock bus2_gate_clks[] __initconst = { - /* ENABLE_ACLK_BUS2 */ - GATE(CLK_ACLK_AHB2APB_BUSP, "aclk_ahb2apb_bus2p", "div_pclk_bus2_133", - ENABLE_ACLK_BUS, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BUSNP_133, "aclk_bus2np_133", "div_pclk_bus2_133", - ENABLE_ACLK_BUS, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BUS2BEND_400, "aclk_bus2bend_400", - "mout_aclk_bus2_400_user", ENABLE_ACLK_BUS, - 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BUS2RTND_400, "aclk_bus2rtnd_400", - "mout_aclk_bus2_400_user", ENABLE_ACLK_BUS, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_BUS2 */ - GATE(CLK_PCLK_BUSSRVND_133, "pclk_bus2srvnd_133", "div_pclk_bus2_133", - ENABLE_PCLK_BUS, 2, 0, 0), - GATE(CLK_PCLK_PMU_BUS, "pclk_pmu_bus2", "div_pclk_bus2_133", - ENABLE_PCLK_BUS, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_BUS, "pclk_sysreg_bus2", "div_pclk_bus2_133", - ENABLE_PCLK_BUS, 0, CLK_IGNORE_UNUSED, 0), -}; - -#define CMU_BUS_INFO_CLKS(id) \ - .div_clks = bus##id##_div_clks, \ - .nr_div_clks = ARRAY_SIZE(bus##id##_div_clks), \ - .gate_clks = bus##id##_gate_clks, \ - .nr_gate_clks = ARRAY_SIZE(bus##id##_gate_clks), \ - .nr_clk_ids = BUSx_NR_CLK - -static const struct samsung_cmu_info bus0_cmu_info __initconst = { - CMU_BUS_INFO_CLKS(0), - .clk_regs = bus01_clk_regs, - .nr_clk_regs = ARRAY_SIZE(bus01_clk_regs), -}; - -static const struct samsung_cmu_info bus1_cmu_info __initconst = { - CMU_BUS_INFO_CLKS(1), - .clk_regs = bus01_clk_regs, - .nr_clk_regs = ARRAY_SIZE(bus01_clk_regs), -}; - -static const struct samsung_cmu_info bus2_cmu_info __initconst = { - CMU_BUS_INFO_CLKS(2), - .mux_clks = bus2_mux_clks, - .nr_mux_clks = ARRAY_SIZE(bus2_mux_clks), - .clk_regs = bus2_clk_regs, - .nr_clk_regs = ARRAY_SIZE(bus2_clk_regs), -}; - -#define exynos5433_cmu_bus_init(id) \ -static void __init exynos5433_cmu_bus##id##_init(struct device_node *np)\ -{ \ - samsung_cmu_register_one(np, &bus##id##_cmu_info); \ -} \ -CLK_OF_DECLARE(exynos5433_cmu_bus##id, \ - "samsung,exynos5433-cmu-bus"#id, \ - exynos5433_cmu_bus##id##_init) - -exynos5433_cmu_bus_init(0); -exynos5433_cmu_bus_init(1); -exynos5433_cmu_bus_init(2); - -/* - * Register offset definitions for CMU_G3D - */ -#define G3D_PLL_LOCK 0x0000 -#define G3D_PLL_CON0 0x0100 -#define G3D_PLL_CON1 0x0104 -#define G3D_PLL_FREQ_DET 0x010c -#define MUX_SEL_G3D 0x0200 -#define MUX_ENABLE_G3D 0x0300 -#define MUX_STAT_G3D 0x0400 -#define DIV_G3D 0x0600 -#define DIV_G3D_PLL_FREQ_DET 0x0604 -#define DIV_STAT_G3D 0x0700 -#define DIV_STAT_G3D_PLL_FREQ_DET 0x0704 -#define ENABLE_ACLK_G3D 0x0800 -#define ENABLE_PCLK_G3D 0x0900 -#define ENABLE_SCLK_G3D 0x0a00 -#define ENABLE_IP_G3D0 0x0b00 -#define ENABLE_IP_G3D1 0x0b04 -#define CLKOUT_CMU_G3D 0x0c00 -#define CLKOUT_CMU_G3D_DIV_STAT 0x0c04 -#define CLK_STOPCTRL 0x1000 - -static const unsigned long g3d_clk_regs[] __initconst = { - G3D_PLL_LOCK, - G3D_PLL_CON0, - G3D_PLL_CON1, - G3D_PLL_FREQ_DET, - MUX_SEL_G3D, - MUX_ENABLE_G3D, - DIV_G3D, - DIV_G3D_PLL_FREQ_DET, - ENABLE_ACLK_G3D, - ENABLE_PCLK_G3D, - ENABLE_SCLK_G3D, - ENABLE_IP_G3D0, - ENABLE_IP_G3D1, - CLKOUT_CMU_G3D, - CLKOUT_CMU_G3D_DIV_STAT, - CLK_STOPCTRL, -}; - -/* list of all parent clock list */ -PNAME(mout_aclk_g3d_400_p) = { "mout_g3d_pll", "aclk_g3d_400", }; -PNAME(mout_g3d_pll_p) = { "oscclk", "fout_g3d_pll", }; - -static const struct samsung_pll_clock g3d_pll_clks[] __initconst = { - PLL(pll_35xx, CLK_FOUT_G3D_PLL, "fout_g3d_pll", "oscclk", - G3D_PLL_LOCK, G3D_PLL_CON0, exynos5443_pll_rates), -}; - -static const struct samsung_mux_clock g3d_mux_clks[] __initconst = { - /* MUX_SEL_G3D */ - MUX_F(CLK_MOUT_ACLK_G3D_400, "mout_aclk_g3d_400", mout_aclk_g3d_400_p, - MUX_SEL_G3D, 8, 1, CLK_SET_RATE_PARENT, 0), - MUX_F(CLK_MOUT_G3D_PLL, "mout_g3d_pll", mout_g3d_pll_p, - MUX_SEL_G3D, 0, 1, CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_div_clock g3d_div_clks[] __initconst = { - /* DIV_G3D */ - DIV(CLK_DIV_SCLK_HPM_G3D, "div_sclk_hpm_g3d", "mout_g3d_pll", DIV_G3D, - 8, 2), - DIV(CLK_DIV_PCLK_G3D, "div_pclk_g3d", "div_aclk_g3d", DIV_G3D, - 4, 3), - DIV_F(CLK_DIV_ACLK_G3D, "div_aclk_g3d", "mout_aclk_g3d_400", DIV_G3D, - 0, 3, CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_gate_clock g3d_gate_clks[] __initconst = { - /* ENABLE_ACLK_G3D */ - GATE(CLK_ACLK_BTS_G3D1, "aclk_bts_g3d1", "div_aclk_g3d", - ENABLE_ACLK_G3D, 7, 0, 0), - GATE(CLK_ACLK_BTS_G3D0, "aclk_bts_g3d0", "div_aclk_g3d", - ENABLE_ACLK_G3D, 6, 0, 0), - GATE(CLK_ACLK_ASYNCAPBS_G3D, "aclk_asyncapbs_g3d", "div_pclk_g3d", - ENABLE_ACLK_G3D, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBM_G3D, "aclk_asyncapbm_g3d", "div_aclk_g3d", - ENABLE_ACLK_G3D, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_G3DP, "aclk_ahb2apb_g3dp", "div_pclk_g3d", - ENABLE_ACLK_G3D, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_G3DNP_150, "aclk_g3dnp_150", "div_pclk_g3d", - ENABLE_ACLK_G3D, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_G3DND_600, "aclk_g3dnd_600", "div_aclk_g3d", - ENABLE_ACLK_G3D, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_G3D, "aclk_g3d", "div_aclk_g3d", - ENABLE_ACLK_G3D, 0, CLK_SET_RATE_PARENT, 0), - - /* ENABLE_PCLK_G3D */ - GATE(CLK_PCLK_BTS_G3D1, "pclk_bts_g3d1", "div_pclk_g3d", - ENABLE_PCLK_G3D, 3, 0, 0), - GATE(CLK_PCLK_BTS_G3D0, "pclk_bts_g3d0", "div_pclk_g3d", - ENABLE_PCLK_G3D, 2, 0, 0), - GATE(CLK_PCLK_PMU_G3D, "pclk_pmu_g3d", "div_pclk_g3d", - ENABLE_PCLK_G3D, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_G3D, "pclk_sysreg_g3d", "div_pclk_g3d", - ENABLE_PCLK_G3D, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_G3D */ - GATE(CLK_SCLK_HPM_G3D, "sclk_hpm_g3d", "div_sclk_hpm_g3d", - ENABLE_SCLK_G3D, 0, 0, 0), -}; - -static const struct samsung_cmu_info g3d_cmu_info __initconst = { - .pll_clks = g3d_pll_clks, - .nr_pll_clks = ARRAY_SIZE(g3d_pll_clks), - .mux_clks = g3d_mux_clks, - .nr_mux_clks = ARRAY_SIZE(g3d_mux_clks), - .div_clks = g3d_div_clks, - .nr_div_clks = ARRAY_SIZE(g3d_div_clks), - .gate_clks = g3d_gate_clks, - .nr_gate_clks = ARRAY_SIZE(g3d_gate_clks), - .nr_clk_ids = G3D_NR_CLK, - .clk_regs = g3d_clk_regs, - .nr_clk_regs = ARRAY_SIZE(g3d_clk_regs), -}; - -static void __init exynos5433_cmu_g3d_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &g3d_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_g3d, "samsung,exynos5433-cmu-g3d", - exynos5433_cmu_g3d_init); - -/* - * Register offset definitions for CMU_GSCL - */ -#define MUX_SEL_GSCL 0x0200 -#define MUX_ENABLE_GSCL 0x0300 -#define MUX_STAT_GSCL 0x0400 -#define ENABLE_ACLK_GSCL 0x0800 -#define ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL0 0x0804 -#define ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL1 0x0808 -#define ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL2 0x080c -#define ENABLE_PCLK_GSCL 0x0900 -#define ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL0 0x0904 -#define ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL1 0x0908 -#define ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL2 0x090c -#define ENABLE_IP_GSCL0 0x0b00 -#define ENABLE_IP_GSCL1 0x0b04 -#define ENABLE_IP_GSCL_SECURE_SMMU_GSCL0 0x0b08 -#define ENABLE_IP_GSCL_SECURE_SMMU_GSCL1 0x0b0c -#define ENABLE_IP_GSCL_SECURE_SMMU_GSCL2 0x0b10 - -static const unsigned long gscl_clk_regs[] __initconst = { - MUX_SEL_GSCL, - MUX_ENABLE_GSCL, - ENABLE_ACLK_GSCL, - ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL0, - ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL1, - ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL2, - ENABLE_PCLK_GSCL, - ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL0, - ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL1, - ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL2, - ENABLE_IP_GSCL0, - ENABLE_IP_GSCL1, - ENABLE_IP_GSCL_SECURE_SMMU_GSCL0, - ENABLE_IP_GSCL_SECURE_SMMU_GSCL1, - ENABLE_IP_GSCL_SECURE_SMMU_GSCL2, -}; - -/* list of all parent clock list */ -PNAME(aclk_gscl_111_user_p) = { "oscclk", "aclk_gscl_111", }; -PNAME(aclk_gscl_333_user_p) = { "oscclk", "aclk_gscl_333", }; - -static const struct samsung_mux_clock gscl_mux_clks[] __initconst = { - /* MUX_SEL_GSCL */ - MUX(CLK_MOUT_ACLK_GSCL_111_USER, "mout_aclk_gscl_111_user", - aclk_gscl_111_user_p, MUX_SEL_GSCL, 4, 1), - MUX(CLK_MOUT_ACLK_GSCL_333_USER, "mout_aclk_gscl_333_user", - aclk_gscl_333_user_p, MUX_SEL_GSCL, 0, 1), -}; - -static const struct samsung_gate_clock gscl_gate_clks[] __initconst = { - /* ENABLE_ACLK_GSCL */ - GATE(CLK_ACLK_BTS_GSCL2, "aclk_bts_gscl2", "mout_aclk_gscl_333_user", - ENABLE_ACLK_GSCL, 11, 0, 0), - GATE(CLK_ACLK_BTS_GSCL1, "aclk_bts_gscl1", "mout_aclk_gscl_333_user", - ENABLE_ACLK_GSCL, 10, 0, 0), - GATE(CLK_ACLK_BTS_GSCL0, "aclk_bts_gscl0", "mout_aclk_gscl_333_user", - ENABLE_ACLK_GSCL, 9, 0, 0), - GATE(CLK_ACLK_AHB2APB_GSCLP, "aclk_ahb2apb_gsclp", - "mout_aclk_gscl_111_user", ENABLE_ACLK_GSCL, - 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_GSCLX, "aclk_xiu_gsclx", "mout_aclk_gscl_333_user", - ENABLE_ACLK_GSCL, 7, 0, 0), - GATE(CLK_ACLK_GSCLNP_111, "aclk_gsclnp_111", "mout_aclk_gscl_111_user", - ENABLE_ACLK_GSCL, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_GSCLRTND_333, "aclk_gsclrtnd_333", - "mout_aclk_gscl_333_user", ENABLE_ACLK_GSCL, 5, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_GSCLBEND_333, "aclk_gsclbend_333", - "mout_aclk_gscl_333_user", ENABLE_ACLK_GSCL, 4, - CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_GSD, "aclk_gsd", "mout_aclk_gscl_333_user", - ENABLE_ACLK_GSCL, 3, 0, 0), - GATE(CLK_ACLK_GSCL2, "aclk_gscl2", "mout_aclk_gscl_333_user", - ENABLE_ACLK_GSCL, 2, 0, 0), - GATE(CLK_ACLK_GSCL1, "aclk_gscl1", "mout_aclk_gscl_333_user", - ENABLE_ACLK_GSCL, 1, 0, 0), - GATE(CLK_ACLK_GSCL0, "aclk_gscl0", "mout_aclk_gscl_333_user", - ENABLE_ACLK_GSCL, 0, 0, 0), - - /* ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL0 */ - GATE(CLK_ACLK_SMMU_GSCL0, "aclk_smmu_gscl0", "mout_aclk_gscl_333_user", - ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL0, 0, 0, 0), - - /* ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL1 */ - GATE(CLK_ACLK_SMMU_GSCL1, "aclk_smmu_gscl1", "mout_aclk_gscl_333_user", - ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL1, 0, 0, 0), - - /* ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL2 */ - GATE(CLK_ACLK_SMMU_GSCL2, "aclk_smmu_gscl2", "mout_aclk_gscl_333_user", - ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL2, 0, 0, 0), - - /* ENABLE_PCLK_GSCL */ - GATE(CLK_PCLK_BTS_GSCL2, "pclk_bts_gscl2", "mout_aclk_gscl_111_user", - ENABLE_PCLK_GSCL, 7, 0, 0), - GATE(CLK_PCLK_BTS_GSCL1, "pclk_bts_gscl1", "mout_aclk_gscl_111_user", - ENABLE_PCLK_GSCL, 6, 0, 0), - GATE(CLK_PCLK_BTS_GSCL0, "pclk_bts_gscl0", "mout_aclk_gscl_111_user", - ENABLE_PCLK_GSCL, 5, 0, 0), - GATE(CLK_PCLK_PMU_GSCL, "pclk_pmu_gscl", "mout_aclk_gscl_111_user", - ENABLE_PCLK_GSCL, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_GSCL, "pclk_sysreg_gscl", - "mout_aclk_gscl_111_user", ENABLE_PCLK_GSCL, - 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_GSCL2, "pclk_gscl2", "mout_aclk_gscl_111_user", - ENABLE_PCLK_GSCL, 2, 0, 0), - GATE(CLK_PCLK_GSCL1, "pclk_gscl1", "mout_aclk_gscl_111_user", - ENABLE_PCLK_GSCL, 1, 0, 0), - GATE(CLK_PCLK_GSCL0, "pclk_gscl0", "mout_aclk_gscl_111_user", - ENABLE_PCLK_GSCL, 0, 0, 0), - - /* ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL0 */ - GATE(CLK_PCLK_SMMU_GSCL0, "pclk_smmu_gscl0", "mout_aclk_gscl_111_user", - ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL0, 0, 0, 0), - - /* ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL1 */ - GATE(CLK_PCLK_SMMU_GSCL1, "pclk_smmu_gscl1", "mout_aclk_gscl_111_user", - ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL1, 0, 0, 0), - - /* ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL2 */ - GATE(CLK_PCLK_SMMU_GSCL2, "pclk_smmu_gscl2", "mout_aclk_gscl_111_user", - ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL2, 0, 0, 0), -}; - -static const struct samsung_cmu_info gscl_cmu_info __initconst = { - .mux_clks = gscl_mux_clks, - .nr_mux_clks = ARRAY_SIZE(gscl_mux_clks), - .gate_clks = gscl_gate_clks, - .nr_gate_clks = ARRAY_SIZE(gscl_gate_clks), - .nr_clk_ids = GSCL_NR_CLK, - .clk_regs = gscl_clk_regs, - .nr_clk_regs = ARRAY_SIZE(gscl_clk_regs), -}; - -static void __init exynos5433_cmu_gscl_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &gscl_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_gscl, "samsung,exynos5433-cmu-gscl", - exynos5433_cmu_gscl_init); - -/* - * Register offset definitions for CMU_APOLLO - */ -#define APOLLO_PLL_LOCK 0x0000 -#define APOLLO_PLL_CON0 0x0100 -#define APOLLO_PLL_CON1 0x0104 -#define APOLLO_PLL_FREQ_DET 0x010c -#define MUX_SEL_APOLLO0 0x0200 -#define MUX_SEL_APOLLO1 0x0204 -#define MUX_SEL_APOLLO2 0x0208 -#define MUX_ENABLE_APOLLO0 0x0300 -#define MUX_ENABLE_APOLLO1 0x0304 -#define MUX_ENABLE_APOLLO2 0x0308 -#define MUX_STAT_APOLLO0 0x0400 -#define MUX_STAT_APOLLO1 0x0404 -#define MUX_STAT_APOLLO2 0x0408 -#define DIV_APOLLO0 0x0600 -#define DIV_APOLLO1 0x0604 -#define DIV_APOLLO_PLL_FREQ_DET 0x0608 -#define DIV_STAT_APOLLO0 0x0700 -#define DIV_STAT_APOLLO1 0x0704 -#define DIV_STAT_APOLLO_PLL_FREQ_DET 0x0708 -#define ENABLE_ACLK_APOLLO 0x0800 -#define ENABLE_PCLK_APOLLO 0x0900 -#define ENABLE_SCLK_APOLLO 0x0a00 -#define ENABLE_IP_APOLLO0 0x0b00 -#define ENABLE_IP_APOLLO1 0x0b04 -#define CLKOUT_CMU_APOLLO 0x0c00 -#define CLKOUT_CMU_APOLLO_DIV_STAT 0x0c04 -#define ARMCLK_STOPCTRL 0x1000 -#define APOLLO_PWR_CTRL 0x1020 -#define APOLLO_PWR_CTRL2 0x1024 -#define APOLLO_INTR_SPREAD_ENABLE 0x1080 -#define APOLLO_INTR_SPREAD_USE_STANDBYWFI 0x1084 -#define APOLLO_INTR_SPREAD_BLOCKING_DURATION 0x1088 - -static const unsigned long apollo_clk_regs[] __initconst = { - APOLLO_PLL_LOCK, - APOLLO_PLL_CON0, - APOLLO_PLL_CON1, - APOLLO_PLL_FREQ_DET, - MUX_SEL_APOLLO0, - MUX_SEL_APOLLO1, - MUX_SEL_APOLLO2, - MUX_ENABLE_APOLLO0, - MUX_ENABLE_APOLLO1, - MUX_ENABLE_APOLLO2, - DIV_APOLLO0, - DIV_APOLLO1, - DIV_APOLLO_PLL_FREQ_DET, - ENABLE_ACLK_APOLLO, - ENABLE_PCLK_APOLLO, - ENABLE_SCLK_APOLLO, - ENABLE_IP_APOLLO0, - ENABLE_IP_APOLLO1, - CLKOUT_CMU_APOLLO, - CLKOUT_CMU_APOLLO_DIV_STAT, - ARMCLK_STOPCTRL, - APOLLO_PWR_CTRL, - APOLLO_PWR_CTRL2, - APOLLO_INTR_SPREAD_ENABLE, - APOLLO_INTR_SPREAD_USE_STANDBYWFI, - APOLLO_INTR_SPREAD_BLOCKING_DURATION, -}; - -/* list of all parent clock list */ -PNAME(mout_apollo_pll_p) = { "oscclk", "fout_apollo_pll", }; -PNAME(mout_bus_pll_apollo_user_p) = { "oscclk", "sclk_bus_pll_apollo", }; -PNAME(mout_apollo_p) = { "mout_apollo_pll", - "mout_bus_pll_apollo_user", }; - -static const struct samsung_pll_clock apollo_pll_clks[] __initconst = { - PLL(pll_35xx, CLK_FOUT_APOLLO_PLL, "fout_apollo_pll", "oscclk", - APOLLO_PLL_LOCK, APOLLO_PLL_CON0, exynos5443_pll_rates), -}; - -static const struct samsung_mux_clock apollo_mux_clks[] __initconst = { - /* MUX_SEL_APOLLO0 */ - MUX_F(CLK_MOUT_APOLLO_PLL, "mout_apollo_pll", mout_apollo_pll_p, - MUX_SEL_APOLLO0, 0, 1, CLK_SET_RATE_PARENT | - CLK_RECALC_NEW_RATES, 0), - - /* MUX_SEL_APOLLO1 */ - MUX(CLK_MOUT_BUS_PLL_APOLLO_USER, "mout_bus_pll_apollo_user", - mout_bus_pll_apollo_user_p, MUX_SEL_APOLLO1, 0, 1), - - /* MUX_SEL_APOLLO2 */ - MUX_F(CLK_MOUT_APOLLO, "mout_apollo", mout_apollo_p, MUX_SEL_APOLLO2, - 0, 1, CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_div_clock apollo_div_clks[] __initconst = { - /* DIV_APOLLO0 */ - DIV_F(CLK_DIV_CNTCLK_APOLLO, "div_cntclk_apollo", "div_apollo2", - DIV_APOLLO0, 24, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_PCLK_DBG_APOLLO, "div_pclk_dbg_apollo", "div_apollo2", - DIV_APOLLO0, 20, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_ATCLK_APOLLO, "div_atclk_apollo", "div_apollo2", - DIV_APOLLO0, 16, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_PCLK_APOLLO, "div_pclk_apollo", "div_apollo2", - DIV_APOLLO0, 12, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_ACLK_APOLLO, "div_aclk_apollo", "div_apollo2", - DIV_APOLLO0, 8, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_APOLLO2, "div_apollo2", "div_apollo1", - DIV_APOLLO0, 4, 3, CLK_SET_RATE_PARENT, 0), - DIV_F(CLK_DIV_APOLLO1, "div_apollo1", "mout_apollo", - DIV_APOLLO0, 0, 3, CLK_SET_RATE_PARENT, 0), - - /* DIV_APOLLO1 */ - DIV_F(CLK_DIV_SCLK_HPM_APOLLO, "div_sclk_hpm_apollo", "mout_apollo", - DIV_APOLLO1, 4, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_APOLLO_PLL, "div_apollo_pll", "mout_apollo", - DIV_APOLLO1, 0, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), -}; - -static const struct samsung_gate_clock apollo_gate_clks[] __initconst = { - /* ENABLE_ACLK_APOLLO */ - GATE(CLK_ACLK_ASATBSLV_APOLLO_3_CSSYS, "aclk_asatbslv_apollo_3_cssys", - "div_atclk_apollo", ENABLE_ACLK_APOLLO, - 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASATBSLV_APOLLO_2_CSSYS, "aclk_asatbslv_apollo_2_cssys", - "div_atclk_apollo", ENABLE_ACLK_APOLLO, - 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASATBSLV_APOLLO_1_CSSYS, "aclk_asatbslv_apollo_1_cssys", - "div_atclk_apollo", ENABLE_ACLK_APOLLO, - 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASATBSLV_APOLLO_0_CSSYS, "aclk_asatbslv_apollo_0_cssys", - "div_atclk_apollo", ENABLE_ACLK_APOLLO, - 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCACES_APOLLO_CCI, "aclk_asyncaces_apollo_cci", - "div_aclk_apollo", ENABLE_ACLK_APOLLO, - 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_APOLLOP, "aclk_ahb2apb_apollop", - "div_pclk_apollo", ENABLE_ACLK_APOLLO, - 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_APOLLONP_200, "aclk_apollonp_200", - "div_pclk_apollo", ENABLE_ACLK_APOLLO, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_APOLLO */ - GATE(CLK_PCLK_ASAPBMST_CSSYS_APOLLO, "pclk_asapbmst_cssys_apollo", - "div_pclk_dbg_apollo", ENABLE_PCLK_APOLLO, - 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PMU_APOLLO, "pclk_pmu_apollo", "div_pclk_apollo", - ENABLE_PCLK_APOLLO, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_APOLLO, "pclk_sysreg_apollo", - "div_pclk_apollo", ENABLE_PCLK_APOLLO, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_APOLLO */ - GATE(CLK_CNTCLK_APOLLO, "cntclk_apollo", "div_cntclk_apollo", - ENABLE_SCLK_APOLLO, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_HPM_APOLLO, "sclk_hpm_apollo", "div_sclk_hpm_apollo", - ENABLE_SCLK_APOLLO, 1, CLK_IGNORE_UNUSED, 0), -}; - -#define E5433_APOLLO_DIV0(cntclk, pclk_dbg, atclk, pclk, aclk) \ - (((cntclk) << 24) | ((pclk_dbg) << 20) | ((atclk) << 16) | \ - ((pclk) << 12) | ((aclk) << 8)) - -#define E5433_APOLLO_DIV1(hpm, copy) \ - (((hpm) << 4) | ((copy) << 0)) - -static const struct exynos_cpuclk_cfg_data exynos5433_apolloclk_d[] __initconst = { - { 1300000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), }, - { 1200000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), }, - { 1100000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), }, - { 1000000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), }, - { 900000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), }, - { 800000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), }, - { 700000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), }, - { 600000, E5433_APOLLO_DIV0(3, 7, 7, 7, 1), E5433_APOLLO_DIV1(7, 1), }, - { 500000, E5433_APOLLO_DIV0(3, 7, 7, 7, 1), E5433_APOLLO_DIV1(7, 1), }, - { 400000, E5433_APOLLO_DIV0(3, 7, 7, 7, 1), E5433_APOLLO_DIV1(7, 1), }, - { 0 }, -}; - -static void __init exynos5433_cmu_apollo_init(struct device_node *np) -{ - void __iomem *reg_base; - struct samsung_clk_provider *ctx; - - reg_base = of_iomap(np, 0); - if (!reg_base) { - panic("%s: failed to map registers\n", __func__); - return; - } - - ctx = samsung_clk_init(np, reg_base, APOLLO_NR_CLK); - if (!ctx) { - panic("%s: unable to allocate ctx\n", __func__); - return; - } - - samsung_clk_register_pll(ctx, apollo_pll_clks, - ARRAY_SIZE(apollo_pll_clks), reg_base); - samsung_clk_register_mux(ctx, apollo_mux_clks, - ARRAY_SIZE(apollo_mux_clks)); - samsung_clk_register_div(ctx, apollo_div_clks, - ARRAY_SIZE(apollo_div_clks)); - samsung_clk_register_gate(ctx, apollo_gate_clks, - ARRAY_SIZE(apollo_gate_clks)); - - exynos_register_cpu_clock(ctx, CLK_SCLK_APOLLO, "apolloclk", - mout_apollo_p[0], mout_apollo_p[1], 0x200, - exynos5433_apolloclk_d, ARRAY_SIZE(exynos5433_apolloclk_d), - CLK_CPU_HAS_E5433_REGS_LAYOUT); - - samsung_clk_sleep_init(reg_base, apollo_clk_regs, - ARRAY_SIZE(apollo_clk_regs)); - - samsung_clk_of_add_provider(np, ctx); -} -CLK_OF_DECLARE(exynos5433_cmu_apollo, "samsung,exynos5433-cmu-apollo", - exynos5433_cmu_apollo_init); - -/* - * Register offset definitions for CMU_ATLAS - */ -#define ATLAS_PLL_LOCK 0x0000 -#define ATLAS_PLL_CON0 0x0100 -#define ATLAS_PLL_CON1 0x0104 -#define ATLAS_PLL_FREQ_DET 0x010c -#define MUX_SEL_ATLAS0 0x0200 -#define MUX_SEL_ATLAS1 0x0204 -#define MUX_SEL_ATLAS2 0x0208 -#define MUX_ENABLE_ATLAS0 0x0300 -#define MUX_ENABLE_ATLAS1 0x0304 -#define MUX_ENABLE_ATLAS2 0x0308 -#define MUX_STAT_ATLAS0 0x0400 -#define MUX_STAT_ATLAS1 0x0404 -#define MUX_STAT_ATLAS2 0x0408 -#define DIV_ATLAS0 0x0600 -#define DIV_ATLAS1 0x0604 -#define DIV_ATLAS_PLL_FREQ_DET 0x0608 -#define DIV_STAT_ATLAS0 0x0700 -#define DIV_STAT_ATLAS1 0x0704 -#define DIV_STAT_ATLAS_PLL_FREQ_DET 0x0708 -#define ENABLE_ACLK_ATLAS 0x0800 -#define ENABLE_PCLK_ATLAS 0x0900 -#define ENABLE_SCLK_ATLAS 0x0a00 -#define ENABLE_IP_ATLAS0 0x0b00 -#define ENABLE_IP_ATLAS1 0x0b04 -#define CLKOUT_CMU_ATLAS 0x0c00 -#define CLKOUT_CMU_ATLAS_DIV_STAT 0x0c04 -#define ARMCLK_STOPCTRL 0x1000 -#define ATLAS_PWR_CTRL 0x1020 -#define ATLAS_PWR_CTRL2 0x1024 -#define ATLAS_INTR_SPREAD_ENABLE 0x1080 -#define ATLAS_INTR_SPREAD_USE_STANDBYWFI 0x1084 -#define ATLAS_INTR_SPREAD_BLOCKING_DURATION 0x1088 - -static const unsigned long atlas_clk_regs[] __initconst = { - ATLAS_PLL_LOCK, - ATLAS_PLL_CON0, - ATLAS_PLL_CON1, - ATLAS_PLL_FREQ_DET, - MUX_SEL_ATLAS0, - MUX_SEL_ATLAS1, - MUX_SEL_ATLAS2, - MUX_ENABLE_ATLAS0, - MUX_ENABLE_ATLAS1, - MUX_ENABLE_ATLAS2, - DIV_ATLAS0, - DIV_ATLAS1, - DIV_ATLAS_PLL_FREQ_DET, - ENABLE_ACLK_ATLAS, - ENABLE_PCLK_ATLAS, - ENABLE_SCLK_ATLAS, - ENABLE_IP_ATLAS0, - ENABLE_IP_ATLAS1, - CLKOUT_CMU_ATLAS, - CLKOUT_CMU_ATLAS_DIV_STAT, - ARMCLK_STOPCTRL, - ATLAS_PWR_CTRL, - ATLAS_PWR_CTRL2, - ATLAS_INTR_SPREAD_ENABLE, - ATLAS_INTR_SPREAD_USE_STANDBYWFI, - ATLAS_INTR_SPREAD_BLOCKING_DURATION, -}; - -/* list of all parent clock list */ -PNAME(mout_atlas_pll_p) = { "oscclk", "fout_atlas_pll", }; -PNAME(mout_bus_pll_atlas_user_p) = { "oscclk", "sclk_bus_pll_atlas", }; -PNAME(mout_atlas_p) = { "mout_atlas_pll", - "mout_bus_pll_atlas_user", }; - -static const struct samsung_pll_clock atlas_pll_clks[] __initconst = { - PLL(pll_35xx, CLK_FOUT_ATLAS_PLL, "fout_atlas_pll", "oscclk", - ATLAS_PLL_LOCK, ATLAS_PLL_CON0, exynos5443_pll_rates), -}; - -static const struct samsung_mux_clock atlas_mux_clks[] __initconst = { - /* MUX_SEL_ATLAS0 */ - MUX_F(CLK_MOUT_ATLAS_PLL, "mout_atlas_pll", mout_atlas_pll_p, - MUX_SEL_ATLAS0, 0, 1, CLK_SET_RATE_PARENT | - CLK_RECALC_NEW_RATES, 0), - - /* MUX_SEL_ATLAS1 */ - MUX(CLK_MOUT_BUS_PLL_ATLAS_USER, "mout_bus_pll_atlas_user", - mout_bus_pll_atlas_user_p, MUX_SEL_ATLAS1, 0, 1), - - /* MUX_SEL_ATLAS2 */ - MUX_F(CLK_MOUT_ATLAS, "mout_atlas", mout_atlas_p, MUX_SEL_ATLAS2, - 0, 1, CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_div_clock atlas_div_clks[] __initconst = { - /* DIV_ATLAS0 */ - DIV_F(CLK_DIV_CNTCLK_ATLAS, "div_cntclk_atlas", "div_atlas2", - DIV_ATLAS0, 24, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_PCLK_DBG_ATLAS, "div_pclk_dbg_atlas", "div_atclk_atlas", - DIV_ATLAS0, 20, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_ATCLK_ATLASO, "div_atclk_atlas", "div_atlas2", - DIV_ATLAS0, 16, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_PCLK_ATLAS, "div_pclk_atlas", "div_atlas2", - DIV_ATLAS0, 12, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_ACLK_ATLAS, "div_aclk_atlas", "div_atlas2", - DIV_ATLAS0, 8, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_ATLAS2, "div_atlas2", "div_atlas1", - DIV_ATLAS0, 4, 3, CLK_SET_RATE_PARENT, 0), - DIV_F(CLK_DIV_ATLAS1, "div_atlas1", "mout_atlas", - DIV_ATLAS0, 0, 3, CLK_SET_RATE_PARENT, 0), - - /* DIV_ATLAS1 */ - DIV_F(CLK_DIV_SCLK_HPM_ATLAS, "div_sclk_hpm_atlas", "mout_atlas", - DIV_ATLAS1, 4, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), - DIV_F(CLK_DIV_ATLAS_PLL, "div_atlas_pll", "mout_atlas", - DIV_ATLAS1, 0, 3, CLK_GET_RATE_NOCACHE, - CLK_DIVIDER_READ_ONLY), -}; - -static const struct samsung_gate_clock atlas_gate_clks[] __initconst = { - /* ENABLE_ACLK_ATLAS */ - GATE(CLK_ACLK_ATB_AUD_CSSYS, "aclk_atb_aud_cssys", - "div_atclk_atlas", ENABLE_ACLK_ATLAS, - 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ATB_APOLLO3_CSSYS, "aclk_atb_apollo3_cssys", - "div_atclk_atlas", ENABLE_ACLK_ATLAS, - 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ATB_APOLLO2_CSSYS, "aclk_atb_apollo2_cssys", - "div_atclk_atlas", ENABLE_ACLK_ATLAS, - 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ATB_APOLLO1_CSSYS, "aclk_atb_apollo1_cssys", - "div_atclk_atlas", ENABLE_ACLK_ATLAS, - 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ATB_APOLLO0_CSSYS, "aclk_atb_apollo0_cssys", - "div_atclk_atlas", ENABLE_ACLK_ATLAS, - 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAHBS_CSSYS_SSS, "aclk_asyncahbs_cssys_sss", - "div_atclk_atlas", ENABLE_ACLK_ATLAS, - 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_CSSYS_CCIX, "aclk_asyncaxis_cssys_ccix", - "div_pclk_dbg_atlas", ENABLE_ACLK_ATLAS, - 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCACES_ATLAS_CCI, "aclk_asyncaces_atlas_cci", - "div_aclk_atlas", ENABLE_ACLK_ATLAS, - 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_ATLASP, "aclk_ahb2apb_atlasp", "div_pclk_atlas", - ENABLE_ACLK_ATLAS, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ATLASNP_200, "aclk_atlasnp_200", "div_pclk_atlas", - ENABLE_ACLK_ATLAS, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_ATLAS */ - GATE(CLK_PCLK_ASYNCAPB_AUD_CSSYS, "pclk_asyncapb_aud_cssys", - "div_pclk_dbg_atlas", ENABLE_PCLK_ATLAS, - 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAPB_ISP_CSSYS, "pclk_asyncapb_isp_cssys", - "div_pclk_dbg_atlas", ENABLE_PCLK_ATLAS, - 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAPB_APOLLO_CSSYS, "pclk_asyncapb_apollo_cssys", - "div_pclk_dbg_atlas", ENABLE_PCLK_ATLAS, - 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PMU_ATLAS, "pclk_pmu_atlas", "div_pclk_atlas", - ENABLE_PCLK_ATLAS, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_ATLAS, "pclk_sysreg_atlas", "div_pclk_atlas", - ENABLE_PCLK_ATLAS, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SECJTAG, "pclk_secjtag", "div_pclk_dbg_atlas", - ENABLE_PCLK_ATLAS, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_ATLAS */ - GATE(CLK_CNTCLK_ATLAS, "cntclk_atlas", "div_cntclk_atlas", - ENABLE_SCLK_ATLAS, 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_HPM_ATLAS, "sclk_hpm_atlas", "div_sclk_hpm_atlas", - ENABLE_SCLK_ATLAS, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_TRACECLK, "traceclk", "div_atclk_atlas", - ENABLE_SCLK_ATLAS, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_CTMCLK, "ctmclk", "div_atclk_atlas", - ENABLE_SCLK_ATLAS, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_HCLK_CSSYS, "hclk_cssys", "div_atclk_atlas", - ENABLE_SCLK_ATLAS, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_DBG_CSSYS, "pclk_dbg_cssys", "div_pclk_dbg_atlas", - ENABLE_SCLK_ATLAS, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_DBG, "pclk_dbg", "div_pclk_dbg_atlas", - ENABLE_SCLK_ATLAS, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ATCLK, "atclk", "div_atclk_atlas", - ENABLE_SCLK_ATLAS, 1, CLK_IGNORE_UNUSED, 0), -}; - -#define E5433_ATLAS_DIV0(cntclk, pclk_dbg, atclk, pclk, aclk) \ - (((cntclk) << 24) | ((pclk_dbg) << 20) | ((atclk) << 16) | \ - ((pclk) << 12) | ((aclk) << 8)) - -#define E5433_ATLAS_DIV1(hpm, copy) \ - (((hpm) << 4) | ((copy) << 0)) - -static const struct exynos_cpuclk_cfg_data exynos5433_atlasclk_d[] __initconst = { - { 1900000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), }, - { 1800000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), }, - { 1700000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), }, - { 1600000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), }, - { 1500000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), }, - { 1400000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), }, - { 1300000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), }, - { 1200000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), }, - { 1100000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), }, - { 1000000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), }, - { 900000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), }, - { 800000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), }, - { 700000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), }, - { 600000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), }, - { 500000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), }, - { 0 }, -}; - -static void __init exynos5433_cmu_atlas_init(struct device_node *np) -{ - void __iomem *reg_base; - struct samsung_clk_provider *ctx; - - reg_base = of_iomap(np, 0); - if (!reg_base) { - panic("%s: failed to map registers\n", __func__); - return; - } - - ctx = samsung_clk_init(np, reg_base, ATLAS_NR_CLK); - if (!ctx) { - panic("%s: unable to allocate ctx\n", __func__); - return; - } - - samsung_clk_register_pll(ctx, atlas_pll_clks, - ARRAY_SIZE(atlas_pll_clks), reg_base); - samsung_clk_register_mux(ctx, atlas_mux_clks, - ARRAY_SIZE(atlas_mux_clks)); - samsung_clk_register_div(ctx, atlas_div_clks, - ARRAY_SIZE(atlas_div_clks)); - samsung_clk_register_gate(ctx, atlas_gate_clks, - ARRAY_SIZE(atlas_gate_clks)); - - exynos_register_cpu_clock(ctx, CLK_SCLK_ATLAS, "atlasclk", - mout_atlas_p[0], mout_atlas_p[1], 0x200, - exynos5433_atlasclk_d, ARRAY_SIZE(exynos5433_atlasclk_d), - CLK_CPU_HAS_E5433_REGS_LAYOUT); - - samsung_clk_sleep_init(reg_base, atlas_clk_regs, - ARRAY_SIZE(atlas_clk_regs)); - - samsung_clk_of_add_provider(np, ctx); -} -CLK_OF_DECLARE(exynos5433_cmu_atlas, "samsung,exynos5433-cmu-atlas", - exynos5433_cmu_atlas_init); - -/* - * Register offset definitions for CMU_MSCL - */ -#define MUX_SEL_MSCL0 0x0200 -#define MUX_SEL_MSCL1 0x0204 -#define MUX_ENABLE_MSCL0 0x0300 -#define MUX_ENABLE_MSCL1 0x0304 -#define MUX_STAT_MSCL0 0x0400 -#define MUX_STAT_MSCL1 0x0404 -#define DIV_MSCL 0x0600 -#define DIV_STAT_MSCL 0x0700 -#define ENABLE_ACLK_MSCL 0x0800 -#define ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0 0x0804 -#define ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1 0x0808 -#define ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG 0x080c -#define ENABLE_PCLK_MSCL 0x0900 -#define ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0 0x0904 -#define ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1 0x0908 -#define ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG 0x090c -#define ENABLE_SCLK_MSCL 0x0a00 -#define ENABLE_IP_MSCL0 0x0b00 -#define ENABLE_IP_MSCL1 0x0b04 -#define ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER0 0x0b08 -#define ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER1 0x0b0c -#define ENABLE_IP_MSCL_SECURE_SMMU_JPEG 0x0b10 - -static const unsigned long mscl_clk_regs[] __initconst = { - MUX_SEL_MSCL0, - MUX_SEL_MSCL1, - MUX_ENABLE_MSCL0, - MUX_ENABLE_MSCL1, - DIV_MSCL, - ENABLE_ACLK_MSCL, - ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0, - ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1, - ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG, - ENABLE_PCLK_MSCL, - ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0, - ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1, - ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG, - ENABLE_SCLK_MSCL, - ENABLE_IP_MSCL0, - ENABLE_IP_MSCL1, - ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER0, - ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER1, - ENABLE_IP_MSCL_SECURE_SMMU_JPEG, -}; - -/* list of all parent clock list */ -PNAME(mout_sclk_jpeg_user_p) = { "oscclk", "sclk_jpeg_mscl", }; -PNAME(mout_aclk_mscl_400_user_p) = { "oscclk", "aclk_mscl_400", }; -PNAME(mout_sclk_jpeg_p) = { "mout_sclk_jpeg_user", - "mout_aclk_mscl_400_user", }; - -static const struct samsung_mux_clock mscl_mux_clks[] __initconst = { - /* MUX_SEL_MSCL0 */ - MUX(CLK_MOUT_SCLK_JPEG_USER, "mout_sclk_jpeg_user", - mout_sclk_jpeg_user_p, MUX_SEL_MSCL0, 4, 1), - MUX(CLK_MOUT_ACLK_MSCL_400_USER, "mout_aclk_mscl_400_user", - mout_aclk_mscl_400_user_p, MUX_SEL_MSCL0, 0, 1), - - /* MUX_SEL_MSCL1 */ - MUX(CLK_MOUT_SCLK_JPEG, "mout_sclk_jpeg", mout_sclk_jpeg_p, - MUX_SEL_MSCL1, 0, 1), -}; - -static const struct samsung_div_clock mscl_div_clks[] __initconst = { - /* DIV_MSCL */ - DIV(CLK_DIV_PCLK_MSCL, "div_pclk_mscl", "mout_aclk_mscl_400_user", - DIV_MSCL, 0, 3), -}; - -static const struct samsung_gate_clock mscl_gate_clks[] __initconst = { - /* ENABLE_ACLK_MSCL */ - GATE(CLK_ACLK_BTS_JPEG, "aclk_bts_jpeg", "mout_aclk_mscl_400_user", - ENABLE_ACLK_MSCL, 9, 0, 0), - GATE(CLK_ACLK_BTS_M2MSCALER1, "aclk_bts_m2mscaler1", - "mout_aclk_mscl_400_user", ENABLE_ACLK_MSCL, 8, 0, 0), - GATE(CLK_ACLK_BTS_M2MSCALER0, "aclk_bts_m2mscaler0", - "mout_aclk_mscl_400_user", ENABLE_ACLK_MSCL, 7, 0, 0), - GATE(CLK_ACLK_AHB2APB_MSCL0P, "aclk_abh2apb_mscl0p", "div_pclk_mscl", - ENABLE_ACLK_MSCL, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_MSCLX, "aclk_xiu_msclx", "mout_aclk_mscl_400_user", - ENABLE_ACLK_MSCL, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MSCLNP_100, "aclk_msclnp_100", "div_pclk_mscl", - ENABLE_ACLK_MSCL, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MSCLND_400, "aclk_msclnd_400", "mout_aclk_mscl_400_user", - ENABLE_ACLK_MSCL, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_JPEG, "aclk_jpeg", "mout_aclk_mscl_400_user", - ENABLE_ACLK_MSCL, 2, 0, 0), - GATE(CLK_ACLK_M2MSCALER1, "aclk_m2mscaler1", "mout_aclk_mscl_400_user", - ENABLE_ACLK_MSCL, 1, 0, 0), - GATE(CLK_ACLK_M2MSCALER0, "aclk_m2mscaler0", "mout_aclk_mscl_400_user", - ENABLE_ACLK_MSCL, 0, 0, 0), - - /* ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0 */ - GATE(CLK_ACLK_SMMU_M2MSCALER0, "aclk_smmu_m2mscaler0", - "mout_aclk_mscl_400_user", - ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1 */ - GATE(CLK_ACLK_SMMU_M2MSCALER1, "aclk_smmu_m2mscaler1", - "mout_aclk_mscl_400_user", - ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG */ - GATE(CLK_ACLK_SMMU_JPEG, "aclk_smmu_jpeg", "mout_aclk_mscl_400_user", - ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_MSCL */ - GATE(CLK_PCLK_BTS_JPEG, "pclk_bts_jpeg", "div_pclk_mscl", - ENABLE_PCLK_MSCL, 7, 0, 0), - GATE(CLK_PCLK_BTS_M2MSCALER1, "pclk_bts_m2mscaler1", "div_pclk_mscl", - ENABLE_PCLK_MSCL, 6, 0, 0), - GATE(CLK_PCLK_BTS_M2MSCALER0, "pclk_bts_m2mscaler0", "div_pclk_mscl", - ENABLE_PCLK_MSCL, 5, 0, 0), - GATE(CLK_PCLK_PMU_MSCL, "pclk_pmu_mscl", "div_pclk_mscl", - ENABLE_PCLK_MSCL, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_MSCL, "pclk_sysreg_mscl", "div_pclk_mscl", - ENABLE_PCLK_MSCL, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_JPEG, "pclk_jpeg", "div_pclk_mscl", - ENABLE_PCLK_MSCL, 2, 0, 0), - GATE(CLK_PCLK_M2MSCALER1, "pclk_m2mscaler1", "div_pclk_mscl", - ENABLE_PCLK_MSCL, 1, 0, 0), - GATE(CLK_PCLK_M2MSCALER0, "pclk_m2mscaler0", "div_pclk_mscl", - ENABLE_PCLK_MSCL, 0, 0, 0), - - /* ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0 */ - GATE(CLK_PCLK_SMMU_M2MSCALER0, "pclk_smmu_m2mscaler0", "div_pclk_mscl", - ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1 */ - GATE(CLK_PCLK_SMMU_M2MSCALER1, "pclk_smmu_m2mscaler1", "div_pclk_mscl", - ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG */ - GATE(CLK_PCLK_SMMU_JPEG, "pclk_smmu_jpeg", "div_pclk_mscl", - ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_MSCL */ - GATE(CLK_SCLK_JPEG, "sclk_jpeg", "mout_sclk_jpeg", ENABLE_SCLK_MSCL, 0, - CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_cmu_info mscl_cmu_info __initconst = { - .mux_clks = mscl_mux_clks, - .nr_mux_clks = ARRAY_SIZE(mscl_mux_clks), - .div_clks = mscl_div_clks, - .nr_div_clks = ARRAY_SIZE(mscl_div_clks), - .gate_clks = mscl_gate_clks, - .nr_gate_clks = ARRAY_SIZE(mscl_gate_clks), - .nr_clk_ids = MSCL_NR_CLK, - .clk_regs = mscl_clk_regs, - .nr_clk_regs = ARRAY_SIZE(mscl_clk_regs), -}; - -static void __init exynos5433_cmu_mscl_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &mscl_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_mscl, "samsung,exynos5433-cmu-mscl", - exynos5433_cmu_mscl_init); - -/* - * Register offset definitions for CMU_MFC - */ -#define MUX_SEL_MFC 0x0200 -#define MUX_ENABLE_MFC 0x0300 -#define MUX_STAT_MFC 0x0400 -#define DIV_MFC 0x0600 -#define DIV_STAT_MFC 0x0700 -#define ENABLE_ACLK_MFC 0x0800 -#define ENABLE_ACLK_MFC_SECURE_SMMU_MFC 0x0804 -#define ENABLE_PCLK_MFC 0x0900 -#define ENABLE_PCLK_MFC_SECURE_SMMU_MFC 0x0904 -#define ENABLE_IP_MFC0 0x0b00 -#define ENABLE_IP_MFC1 0x0b04 -#define ENABLE_IP_MFC_SECURE_SMMU_MFC 0x0b08 - -static const unsigned long mfc_clk_regs[] __initconst = { - MUX_SEL_MFC, - MUX_ENABLE_MFC, - DIV_MFC, - ENABLE_ACLK_MFC, - ENABLE_ACLK_MFC_SECURE_SMMU_MFC, - ENABLE_PCLK_MFC, - ENABLE_PCLK_MFC_SECURE_SMMU_MFC, - ENABLE_IP_MFC0, - ENABLE_IP_MFC1, - ENABLE_IP_MFC_SECURE_SMMU_MFC, -}; - -PNAME(mout_aclk_mfc_400_user_p) = { "oscclk", "aclk_mfc_400", }; - -static const struct samsung_mux_clock mfc_mux_clks[] __initconst = { - /* MUX_SEL_MFC */ - MUX(CLK_MOUT_ACLK_MFC_400_USER, "mout_aclk_mfc_400_user", - mout_aclk_mfc_400_user_p, MUX_SEL_MFC, 0, 0), -}; - -static const struct samsung_div_clock mfc_div_clks[] __initconst = { - /* DIV_MFC */ - DIV(CLK_DIV_PCLK_MFC, "div_pclk_mfc", "mout_aclk_mfc_400_user", - DIV_MFC, 0, 2), -}; - -static const struct samsung_gate_clock mfc_gate_clks[] __initconst = { - /* ENABLE_ACLK_MFC */ - GATE(CLK_ACLK_BTS_MFC_1, "aclk_bts_mfc_1", "mout_aclk_mfc_400_user", - ENABLE_ACLK_MFC, 6, 0, 0), - GATE(CLK_ACLK_BTS_MFC_0, "aclk_bts_mfc_0", "mout_aclk_mfc_400_user", - ENABLE_ACLK_MFC, 5, 0, 0), - GATE(CLK_ACLK_AHB2APB_MFCP, "aclk_ahb2apb_mfcp", "div_pclk_mfc", - ENABLE_ACLK_MFC, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_MFCX, "aclk_xiu_mfcx", "mout_aclk_mfc_400_user", - ENABLE_ACLK_MFC, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MFCNP_100, "aclk_mfcnp_100", "div_pclk_mfc", - ENABLE_ACLK_MFC, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MFCND_400, "aclk_mfcnd_400", "mout_aclk_mfc_400_user", - ENABLE_ACLK_MFC, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_MFC, "aclk_mfc", "mout_aclk_mfc_400_user", - ENABLE_ACLK_MFC, 0, 0, 0), - - /* ENABLE_ACLK_MFC_SECURE_SMMU_MFC */ - GATE(CLK_ACLK_SMMU_MFC_1, "aclk_smmu_mfc_1", "mout_aclk_mfc_400_user", - ENABLE_ACLK_MFC_SECURE_SMMU_MFC, - 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_MFC_0, "aclk_smmu_mfc_0", "mout_aclk_mfc_400_user", - ENABLE_ACLK_MFC_SECURE_SMMU_MFC, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_MFC */ - GATE(CLK_PCLK_BTS_MFC_1, "pclk_bts_mfc_1", "div_pclk_mfc", - ENABLE_PCLK_MFC, 4, 0, 0), - GATE(CLK_PCLK_BTS_MFC_0, "pclk_bts_mfc_0", "div_pclk_mfc", - ENABLE_PCLK_MFC, 3, 0, 0), - GATE(CLK_PCLK_PMU_MFC, "pclk_pmu_mfc", "div_pclk_mfc", - ENABLE_PCLK_MFC, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_MFC, "pclk_sysreg_mfc", "div_pclk_mfc", - ENABLE_PCLK_MFC, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_MFC, "pclk_mfc", "div_pclk_mfc", - ENABLE_PCLK_MFC, 4, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_MFC_SECURE_SMMU_MFC */ - GATE(CLK_PCLK_SMMU_MFC_1, "pclk_smmu_mfc_1", "div_pclk_mfc", - ENABLE_PCLK_MFC_SECURE_SMMU_MFC, - 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_MFC_0, "pclk_smmu_mfc_0", "div_pclk_mfc", - ENABLE_PCLK_MFC_SECURE_SMMU_MFC, - 0, CLK_IGNORE_UNUSED, 0), -}; - -static const struct samsung_cmu_info mfc_cmu_info __initconst = { - .mux_clks = mfc_mux_clks, - .nr_mux_clks = ARRAY_SIZE(mfc_mux_clks), - .div_clks = mfc_div_clks, - .nr_div_clks = ARRAY_SIZE(mfc_div_clks), - .gate_clks = mfc_gate_clks, - .nr_gate_clks = ARRAY_SIZE(mfc_gate_clks), - .nr_clk_ids = MFC_NR_CLK, - .clk_regs = mfc_clk_regs, - .nr_clk_regs = ARRAY_SIZE(mfc_clk_regs), -}; - -static void __init exynos5433_cmu_mfc_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &mfc_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_mfc, "samsung,exynos5433-cmu-mfc", - exynos5433_cmu_mfc_init); - -/* - * Register offset definitions for CMU_HEVC - */ -#define MUX_SEL_HEVC 0x0200 -#define MUX_ENABLE_HEVC 0x0300 -#define MUX_STAT_HEVC 0x0400 -#define DIV_HEVC 0x0600 -#define DIV_STAT_HEVC 0x0700 -#define ENABLE_ACLK_HEVC 0x0800 -#define ENABLE_ACLK_HEVC_SECURE_SMMU_HEVC 0x0804 -#define ENABLE_PCLK_HEVC 0x0900 -#define ENABLE_PCLK_HEVC_SECURE_SMMU_HEVC 0x0904 -#define ENABLE_IP_HEVC0 0x0b00 -#define ENABLE_IP_HEVC1 0x0b04 -#define ENABLE_IP_HEVC_SECURE_SMMU_HEVC 0x0b08 - -static const unsigned long hevc_clk_regs[] __initconst = { - MUX_SEL_HEVC, - MUX_ENABLE_HEVC, - DIV_HEVC, - ENABLE_ACLK_HEVC, - ENABLE_ACLK_HEVC_SECURE_SMMU_HEVC, - ENABLE_PCLK_HEVC, - ENABLE_PCLK_HEVC_SECURE_SMMU_HEVC, - ENABLE_IP_HEVC0, - ENABLE_IP_HEVC1, - ENABLE_IP_HEVC_SECURE_SMMU_HEVC, -}; - -PNAME(mout_aclk_hevc_400_user_p) = { "oscclk", "aclk_hevc_400", }; - -static const struct samsung_mux_clock hevc_mux_clks[] __initconst = { - /* MUX_SEL_HEVC */ - MUX(CLK_MOUT_ACLK_HEVC_400_USER, "mout_aclk_hevc_400_user", - mout_aclk_hevc_400_user_p, MUX_SEL_HEVC, 0, 0), -}; - -static const struct samsung_div_clock hevc_div_clks[] __initconst = { - /* DIV_HEVC */ - DIV(CLK_DIV_PCLK_HEVC, "div_pclk_hevc", "mout_aclk_hevc_400_user", - DIV_HEVC, 0, 2), -}; - -static const struct samsung_gate_clock hevc_gate_clks[] __initconst = { - /* ENABLE_ACLK_HEVC */ - GATE(CLK_ACLK_BTS_HEVC_1, "aclk_bts_hevc_1", "mout_aclk_hevc_400_user", - ENABLE_ACLK_HEVC, 6, 0, 0), - GATE(CLK_ACLK_BTS_HEVC_0, "aclk_bts_hevc_0", "mout_aclk_hevc_400_user", - ENABLE_ACLK_HEVC, 5, 0, 0), - GATE(CLK_ACLK_AHB2APB_HEVCP, "aclk_ahb2apb_hevcp", "div_pclk_hevc", - ENABLE_ACLK_HEVC, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_HEVCX, "aclk_xiu_hevcx", "mout_aclk_hevc_400_user", - ENABLE_ACLK_HEVC, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_HEVCNP_100, "aclk_hevcnp_100", "div_pclk_hevc", - ENABLE_ACLK_HEVC, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_HEVCND_400, "aclk_hevcnd_400", "mout_aclk_hevc_400_user", - ENABLE_ACLK_HEVC, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_HEVC, "aclk_hevc", "mout_aclk_hevc_400_user", - ENABLE_ACLK_HEVC, 0, 0, 0), - - /* ENABLE_ACLK_HEVC_SECURE_SMMU_HEVC */ - GATE(CLK_ACLK_SMMU_HEVC_1, "aclk_smmu_hevc_1", - "mout_aclk_hevc_400_user", - ENABLE_ACLK_HEVC_SECURE_SMMU_HEVC, - 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_HEVC_0, "aclk_smmu_hevc_0", - "mout_aclk_hevc_400_user", - ENABLE_ACLK_HEVC_SECURE_SMMU_HEVC, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_HEVC */ - GATE(CLK_PCLK_BTS_HEVC_1, "pclk_bts_hevc_1", "div_pclk_hevc", - ENABLE_PCLK_HEVC, 4, 0, 0), - GATE(CLK_PCLK_BTS_HEVC_0, "pclk_bts_hevc_0", "div_pclk_hevc", - ENABLE_PCLK_HEVC, 3, 0, 0), - GATE(CLK_PCLK_PMU_HEVC, "pclk_pmu_hevc", "div_pclk_hevc", - ENABLE_PCLK_HEVC, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_HEVC, "pclk_sysreg_hevc", "div_pclk_hevc", - ENABLE_PCLK_HEVC, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_HEVC, "pclk_hevc", "div_pclk_hevc", - ENABLE_PCLK_HEVC, 4, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_HEVC_SECURE_SMMU_HEVC */ - GATE(CLK_PCLK_SMMU_HEVC_1, "pclk_smmu_hevc_1", "div_pclk_hevc", - ENABLE_PCLK_HEVC_SECURE_SMMU_HEVC, - 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_HEVC_0, "pclk_smmu_hevc_0", "div_pclk_hevc", - ENABLE_PCLK_HEVC_SECURE_SMMU_HEVC, - 0, CLK_IGNORE_UNUSED, 0), -}; - -static const struct samsung_cmu_info hevc_cmu_info __initconst = { - .mux_clks = hevc_mux_clks, - .nr_mux_clks = ARRAY_SIZE(hevc_mux_clks), - .div_clks = hevc_div_clks, - .nr_div_clks = ARRAY_SIZE(hevc_div_clks), - .gate_clks = hevc_gate_clks, - .nr_gate_clks = ARRAY_SIZE(hevc_gate_clks), - .nr_clk_ids = HEVC_NR_CLK, - .clk_regs = hevc_clk_regs, - .nr_clk_regs = ARRAY_SIZE(hevc_clk_regs), -}; - -static void __init exynos5433_cmu_hevc_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &hevc_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_hevc, "samsung,exynos5433-cmu-hevc", - exynos5433_cmu_hevc_init); - -/* - * Register offset definitions for CMU_ISP - */ -#define MUX_SEL_ISP 0x0200 -#define MUX_ENABLE_ISP 0x0300 -#define MUX_STAT_ISP 0x0400 -#define DIV_ISP 0x0600 -#define DIV_STAT_ISP 0x0700 -#define ENABLE_ACLK_ISP0 0x0800 -#define ENABLE_ACLK_ISP1 0x0804 -#define ENABLE_ACLK_ISP2 0x0808 -#define ENABLE_PCLK_ISP 0x0900 -#define ENABLE_SCLK_ISP 0x0a00 -#define ENABLE_IP_ISP0 0x0b00 -#define ENABLE_IP_ISP1 0x0b04 -#define ENABLE_IP_ISP2 0x0b08 -#define ENABLE_IP_ISP3 0x0b0c - -static const unsigned long isp_clk_regs[] __initconst = { - MUX_SEL_ISP, - MUX_ENABLE_ISP, - DIV_ISP, - ENABLE_ACLK_ISP0, - ENABLE_ACLK_ISP1, - ENABLE_ACLK_ISP2, - ENABLE_PCLK_ISP, - ENABLE_SCLK_ISP, - ENABLE_IP_ISP0, - ENABLE_IP_ISP1, - ENABLE_IP_ISP2, - ENABLE_IP_ISP3, -}; - -PNAME(mout_aclk_isp_dis_400_user_p) = { "oscclk", "aclk_isp_dis_400", }; -PNAME(mout_aclk_isp_400_user_p) = { "oscclk", "aclk_isp_400", }; - -static const struct samsung_mux_clock isp_mux_clks[] __initconst = { - /* MUX_SEL_ISP */ - MUX(CLK_MOUT_ACLK_ISP_DIS_400_USER, "mout_aclk_isp_dis_400_user", - mout_aclk_isp_dis_400_user_p, MUX_SEL_ISP, 4, 0), - MUX(CLK_MOUT_ACLK_ISP_400_USER, "mout_aclk_isp_400_user", - mout_aclk_isp_400_user_p, MUX_SEL_ISP, 0, 0), -}; - -static const struct samsung_div_clock isp_div_clks[] __initconst = { - /* DIV_ISP */ - DIV(CLK_DIV_PCLK_ISP_DIS, "div_pclk_isp_dis", - "mout_aclk_isp_dis_400_user", DIV_ISP, 12, 3), - DIV(CLK_DIV_PCLK_ISP, "div_pclk_isp", "mout_aclk_isp_400_user", - DIV_ISP, 8, 3), - DIV(CLK_DIV_ACLK_ISP_D_200, "div_aclk_isp_d_200", - "mout_aclk_isp_400_user", DIV_ISP, 4, 3), - DIV(CLK_DIV_ACLK_ISP_C_200, "div_aclk_isp_c_200", - "mout_aclk_isp_400_user", DIV_ISP, 0, 3), -}; - -static const struct samsung_gate_clock isp_gate_clks[] __initconst = { - /* ENABLE_ACLK_ISP0 */ - GATE(CLK_ACLK_ISP_D_GLUE, "aclk_isp_d_glue", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP0, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SCALERP, "aclk_scalerp", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP0, 5, 0, 0), - GATE(CLK_ACLK_3DNR, "aclk_3dnr", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP0, 4, 0, 0), - GATE(CLK_ACLK_DIS, "aclk_dis", "mout_aclk_isp_dis_400_user", - ENABLE_ACLK_ISP0, 3, 0, 0), - GATE(CLK_ACLK_SCALERC, "aclk_scalerc", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP0, 2, 0, 0), - GATE(CLK_ACLK_DRC, "aclk_drc", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP0, 1, 0, 0), - GATE(CLK_ACLK_ISP, "aclk_isp", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP0, 0, 0, 0), - - /* ENABLE_ACLK_ISP1 */ - GATE(CLK_ACLK_AXIUS_SCALERP, "aclk_axius_scalerp", - "mout_aclk_isp_400_user", ENABLE_ACLK_ISP1, - 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIUS_SCALERC, "aclk_axius_scalerc", - "mout_aclk_isp_400_user", ENABLE_ACLK_ISP1, - 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIUS_DRC, "aclk_axius_drc", - "mout_aclk_isp_400_user", ENABLE_ACLK_ISP1, - 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAHBM_ISP2P, "aclk_asyncahbm_isp2p", - "div_pclk_isp", ENABLE_ACLK_ISP1, - 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAHBM_ISP1P, "aclk_asyncahbm_isp1p", - "div_pclk_isp", ENABLE_ACLK_ISP1, - 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_DIS1, "aclk_asyncaxis_dis1", - "mout_aclk_isp_dis_400_user", ENABLE_ACLK_ISP1, - 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_DIS0, "aclk_asyncaxis_dis0", - "mout_aclk_isp_dis_400_user", ENABLE_ACLK_ISP1, - 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_DIS1, "aclk_asyncaxim_dis1", - "mout_aclk_isp_400_user", ENABLE_ACLK_ISP1, - 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_DIS0, "aclk_asyncaxim_dis0", - "mout_aclk_isp_400_user", ENABLE_ACLK_ISP1, - 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_ISP2P, "aclk_asyncaxim_isp2p", - "div_aclk_isp_d_200", ENABLE_ACLK_ISP1, - 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_ISP1P, "aclk_asyncaxim_isp1p", - "div_aclk_isp_c_200", ENABLE_ACLK_ISP1, - 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_ISP2P, "aclk_ahb2apb_isp2p", "div_pclk_isp", - ENABLE_ACLK_ISP1, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_ISP1P, "aclk_ahb2apb_isp1p", "div_pclk_isp", - ENABLE_ACLK_ISP1, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXI2APB_ISP2P, "aclk_axi2apb_isp2p", - "div_aclk_isp_d_200", ENABLE_ACLK_ISP1, - 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXI2APB_ISP1P, "aclk_axi2apb_isp1p", - "div_aclk_isp_c_200", ENABLE_ACLK_ISP1, - 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_ISPEX1, "aclk_xiu_ispex1", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP1, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_ISPEX0, "aclk_xiu_ispex0", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP1, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ISPND_400, "aclk_ispnd_400", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP1, 1, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_ACLK_ISP2 */ - GATE(CLK_ACLK_SMMU_SCALERP, "aclk_smmu_scalerp", - "mout_aclk_isp_400_user", ENABLE_ACLK_ISP2, - 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_3DNR, "aclk_smmu_3dnr", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP2, 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_DIS1, "aclk_smmu_dis1", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP2, 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_DIS0, "aclk_smmu_dis0", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP2, 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_SCALERC, "aclk_smmu_scalerc", - "mout_aclk_isp_400_user", ENABLE_ACLK_ISP2, - 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_DRC, "aclk_smmu_drc", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP2, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_ISP, "aclk_smmu_isp", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP2, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_SCALERP, "aclk_bts_scalerp", - "mout_aclk_isp_400_user", ENABLE_ACLK_ISP2, - 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_3DR, "aclk_bts_3dnr", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP2, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_DIS1, "aclk_bts_dis1", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP2, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_DIS0, "aclk_bts_dis0", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP2, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_SCALERC, "aclk_bts_scalerc", - "mout_aclk_isp_400_user", ENABLE_ACLK_ISP2, - 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_DRC, "aclk_bts_drc", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP2, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_ISP, "aclk_bts_isp", "mout_aclk_isp_400_user", - ENABLE_ACLK_ISP2, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_ISP */ - GATE(CLK_PCLK_SMMU_SCALERP, "pclk_smmu_scalerp", "div_aclk_isp_d_200", - ENABLE_PCLK_ISP, 25, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_3DNR, "pclk_smmu_3dnr", "div_aclk_isp_d_200", - ENABLE_PCLK_ISP, 24, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_DIS1, "pclk_smmu_dis1", "div_aclk_isp_d_200", - ENABLE_PCLK_ISP, 23, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_DIS0, "pclk_smmu_dis0", "div_aclk_isp_d_200", - ENABLE_PCLK_ISP, 22, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_SCALERC, "pclk_smmu_scalerc", "div_aclk_isp_c_200", - ENABLE_PCLK_ISP, 21, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_DRC, "pclk_smmu_drc", "div_aclk_isp_c_200", - ENABLE_PCLK_ISP, 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_ISP, "pclk_smmu_isp", "div_aclk_isp_c_200", - ENABLE_PCLK_ISP, 19, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_SCALERP, "pclk_bts_scalerp", "div_pclk_isp", - ENABLE_PCLK_ISP, 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_3DNR, "pclk_bts_3dnr", "div_pclk_isp", - ENABLE_PCLK_ISP, 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_DIS1, "pclk_bts_dis1", "div_pclk_isp", - ENABLE_PCLK_ISP, 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_DIS0, "pclk_bts_dis0", "div_pclk_isp", - ENABLE_PCLK_ISP, 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_SCALERC, "pclk_bts_scalerc", "div_pclk_isp", - ENABLE_PCLK_ISP, 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_DRC, "pclk_bts_drc", "div_pclk_isp", - ENABLE_PCLK_ISP, 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_ISP, "pclk_bts_isp", "div_pclk_isp", - ENABLE_PCLK_ISP, 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXI_DIS1, "pclk_asyncaxi_dis1", "div_pclk_isp", - ENABLE_PCLK_ISP, 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXI_DIS0, "pclk_asyncaxi_dis0", "div_pclk_isp", - ENABLE_PCLK_ISP, 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PMU_ISP, "pclk_pmu_isp", "div_pclk_isp", - ENABLE_PCLK_ISP, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_ISP, "pclk_sysreg_isp", "div_pclk_isp", - ENABLE_PCLK_ISP, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_CMU_ISP_LOCAL, "pclk_cmu_isp_local", - "div_aclk_isp_c_200", ENABLE_PCLK_ISP, - 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SCALERP, "pclk_scalerp", "div_aclk_isp_d_200", - ENABLE_PCLK_ISP, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_3DNR, "pclk_3dnr", "div_aclk_isp_d_200", - ENABLE_PCLK_ISP, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_DIS_CORE, "pclk_dis_core", "div_pclk_isp_dis", - ENABLE_PCLK_ISP, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_DIS, "pclk_dis", "div_aclk_isp_d_200", - ENABLE_PCLK_ISP, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SCALERC, "pclk_scalerc", "div_aclk_isp_c_200", - ENABLE_PCLK_ISP, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_DRC, "pclk_drc", "div_aclk_isp_c_200", - ENABLE_PCLK_ISP, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP, "pclk_isp", "div_aclk_isp_c_200", - ENABLE_PCLK_ISP, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_ISP */ - GATE(CLK_SCLK_PIXELASYNCS_DIS, "sclk_pixelasyncs_dis", - "mout_aclk_isp_dis_400_user", ENABLE_SCLK_ISP, - 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_PIXELASYNCM_DIS, "sclk_pixelasyncm_dis", - "mout_aclk_isp_dis_400_user", ENABLE_SCLK_ISP, - 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_PIXELASYNCS_SCALERP, "sclk_pixelasyncs_scalerp", - "mout_aclk_isp_400_user", ENABLE_SCLK_ISP, - 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_PIXELASYNCM_ISPD, "sclk_pixelasyncm_ispd", - "mout_aclk_isp_400_user", ENABLE_SCLK_ISP, - 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_PIXELASYNCS_ISPC, "sclk_pixelasyncs_ispc", - "mout_aclk_isp_400_user", ENABLE_SCLK_ISP, - 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_SCLK_PIXELASYNCM_ISPC, "sclk_pixelasyncm_ispc", - "mout_aclk_isp_400_user", ENABLE_SCLK_ISP, - 0, CLK_IGNORE_UNUSED, 0), -}; - -static const struct samsung_cmu_info isp_cmu_info __initconst = { - .mux_clks = isp_mux_clks, - .nr_mux_clks = ARRAY_SIZE(isp_mux_clks), - .div_clks = isp_div_clks, - .nr_div_clks = ARRAY_SIZE(isp_div_clks), - .gate_clks = isp_gate_clks, - .nr_gate_clks = ARRAY_SIZE(isp_gate_clks), - .nr_clk_ids = ISP_NR_CLK, - .clk_regs = isp_clk_regs, - .nr_clk_regs = ARRAY_SIZE(isp_clk_regs), -}; - -static void __init exynos5433_cmu_isp_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &isp_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_isp, "samsung,exynos5433-cmu-isp", - exynos5433_cmu_isp_init); - -/* - * Register offset definitions for CMU_CAM0 - */ -#define MUX_SEL_CAM00 0x0200 -#define MUX_SEL_CAM01 0x0204 -#define MUX_SEL_CAM02 0x0208 -#define MUX_SEL_CAM03 0x020c -#define MUX_SEL_CAM04 0x0210 -#define MUX_ENABLE_CAM00 0x0300 -#define MUX_ENABLE_CAM01 0x0304 -#define MUX_ENABLE_CAM02 0x0308 -#define MUX_ENABLE_CAM03 0x030c -#define MUX_ENABLE_CAM04 0x0310 -#define MUX_STAT_CAM00 0x0400 -#define MUX_STAT_CAM01 0x0404 -#define MUX_STAT_CAM02 0x0408 -#define MUX_STAT_CAM03 0x040c -#define MUX_STAT_CAM04 0x0410 -#define MUX_IGNORE_CAM01 0x0504 -#define DIV_CAM00 0x0600 -#define DIV_CAM01 0x0604 -#define DIV_CAM02 0x0608 -#define DIV_CAM03 0x060c -#define DIV_STAT_CAM00 0x0700 -#define DIV_STAT_CAM01 0x0704 -#define DIV_STAT_CAM02 0x0708 -#define DIV_STAT_CAM03 0x070c -#define ENABLE_ACLK_CAM00 0X0800 -#define ENABLE_ACLK_CAM01 0X0804 -#define ENABLE_ACLK_CAM02 0X0808 -#define ENABLE_PCLK_CAM0 0X0900 -#define ENABLE_SCLK_CAM0 0X0a00 -#define ENABLE_IP_CAM00 0X0b00 -#define ENABLE_IP_CAM01 0X0b04 -#define ENABLE_IP_CAM02 0X0b08 -#define ENABLE_IP_CAM03 0X0b0C - -static const unsigned long cam0_clk_regs[] __initconst = { - MUX_SEL_CAM00, - MUX_SEL_CAM01, - MUX_SEL_CAM02, - MUX_SEL_CAM03, - MUX_SEL_CAM04, - MUX_ENABLE_CAM00, - MUX_ENABLE_CAM01, - MUX_ENABLE_CAM02, - MUX_ENABLE_CAM03, - MUX_ENABLE_CAM04, - MUX_IGNORE_CAM01, - DIV_CAM00, - DIV_CAM01, - DIV_CAM02, - DIV_CAM03, - ENABLE_ACLK_CAM00, - ENABLE_ACLK_CAM01, - ENABLE_ACLK_CAM02, - ENABLE_PCLK_CAM0, - ENABLE_SCLK_CAM0, - ENABLE_IP_CAM00, - ENABLE_IP_CAM01, - ENABLE_IP_CAM02, - ENABLE_IP_CAM03, -}; -PNAME(mout_aclk_cam0_333_user_p) = { "oscclk", "aclk_cam0_333", }; -PNAME(mout_aclk_cam0_400_user_p) = { "oscclk", "aclk_cam0_400", }; -PNAME(mout_aclk_cam0_552_user_p) = { "oscclk", "aclk_cam0_552", }; - -PNAME(mout_phyclk_rxbyteclkhs0_s4_user_p) = { "oscclk", - "phyclk_rxbyteclkhs0_s4_phy", }; -PNAME(mout_phyclk_rxbyteclkhs0_s2a_user_p) = { "oscclk", - "phyclk_rxbyteclkhs0_s2a_phy", }; - -PNAME(mout_aclk_lite_d_b_p) = { "mout_aclk_lite_d_a", - "mout_aclk_cam0_333_user", }; -PNAME(mout_aclk_lite_d_a_p) = { "mout_aclk_cam0_552_user", - "mout_aclk_cam0_400_user", }; -PNAME(mout_aclk_lite_b_b_p) = { "mout_aclk_lite_b_a", - "mout_aclk_cam0_333_user", }; -PNAME(mout_aclk_lite_b_a_p) = { "mout_aclk_cam0_552_user", - "mout_aclk_cam0_400_user", }; -PNAME(mout_aclk_lite_a_b_p) = { "mout_aclk_lite_a_a", - "mout_aclk_cam0_333_user", }; -PNAME(mout_aclk_lite_a_a_p) = { "mout_aclk_cam0_552_user", - "mout_aclk_cam0_400_user", }; -PNAME(mout_aclk_cam0_400_p) = { "mout_aclk_cam0_400_user", - "mout_aclk_cam0_333_user", }; - -PNAME(mout_aclk_csis1_b_p) = { "mout_aclk_csis1_a", - "mout_aclk_cam0_333_user" }; -PNAME(mout_aclk_csis1_a_p) = { "mout_aclk_cam0_552_user", - "mout_aclk_cam0_400_user", }; -PNAME(mout_aclk_csis0_b_p) = { "mout_aclk_csis0_a", - "mout_aclk_cam0_333_user", }; -PNAME(mout_aclk_csis0_a_p) = { "mout_aclk_cam0_552_user", - "mout_aclk-cam0_400_user", }; -PNAME(mout_aclk_3aa1_b_p) = { "mout_aclk_3aa1_a", - "mout_aclk_cam0_333_user", }; -PNAME(mout_aclk_3aa1_a_p) = { "mout_aclk_cam0_552_user", - "mout_aclk_cam0_400_user", }; -PNAME(mout_aclk_3aa0_b_p) = { "mout_aclk_3aa0_a", - "mout_aclk_cam0_333_user", }; -PNAME(mout_aclk_3aa0_a_p) = { "mout_aclk_cam0_552_user", - "mout_aclk_cam0_400_user", }; - -PNAME(mout_sclk_lite_freecnt_c_p) = { "mout_sclk_lite_freecnt_b", - "div_pclk_lite_d", }; -PNAME(mout_sclk_lite_freecnt_b_p) = { "mout_sclk_lite_freecnt_a", - "div_pclk_pixelasync_lite_c", }; -PNAME(mout_sclk_lite_freecnt_a_p) = { "div_pclk_lite_a", - "div_pclk_lite_b", }; -PNAME(mout_sclk_pixelasync_lite_c_b_p) = { "mout_sclk_pixelasync_lite_c_a", - "mout_aclk_cam0_333_user", }; -PNAME(mout_sclk_pixelasync_lite_c_a_p) = { "mout_aclk_cam0_552_user", - "mout_aclk_cam0_400_user", }; -PNAME(mout_sclk_pixelasync_lite_c_init_b_p) = { - "mout_sclk_pixelasync_lite_c_init_a", - "mout_aclk_cam0_400_user", }; -PNAME(mout_sclk_pixelasync_lite_c_init_a_p) = { - "mout_aclk_cam0_552_user", - "mout_aclk_cam0_400_user", }; - -static const struct samsung_fixed_rate_clock cam0_fixed_clks[] __initconst = { - FRATE(CLK_PHYCLK_RXBYTEECLKHS0_S4_PHY, "phyclk_rxbyteclkhs0_s4_phy", - NULL, 0, 100000000), - FRATE(CLK_PHYCLK_RXBYTEECLKHS0_S2A_PHY, "phyclk_rxbyteclkhs0_s2a_phy", - NULL, 0, 100000000), -}; - -static const struct samsung_mux_clock cam0_mux_clks[] __initconst = { - /* MUX_SEL_CAM00 */ - MUX(CLK_MOUT_ACLK_CAM0_333_USER, "mout_aclk_cam0_333_user", - mout_aclk_cam0_333_user_p, MUX_SEL_CAM00, 8, 1), - MUX(CLK_MOUT_ACLK_CAM0_400_USER, "mout_aclk_cam0_400_user", - mout_aclk_cam0_400_user_p, MUX_SEL_CAM00, 4, 1), - MUX(CLK_MOUT_ACLK_CAM0_552_USER, "mout_aclk_cam0_552_user", - mout_aclk_cam0_552_user_p, MUX_SEL_CAM00, 0, 1), - - /* MUX_SEL_CAM01 */ - MUX(CLK_MOUT_PHYCLK_RXBYTECLKHS0_S4_USER, - "mout_phyclk_rxbyteclkhs0_s4_user", - mout_phyclk_rxbyteclkhs0_s4_user_p, - MUX_SEL_CAM01, 4, 1), - MUX(CLK_MOUT_PHYCLK_RXBYTECLKHS0_S2A_USER, - "mout_phyclk_rxbyteclkhs0_s2a_user", - mout_phyclk_rxbyteclkhs0_s2a_user_p, - MUX_SEL_CAM01, 0, 1), - - /* MUX_SEL_CAM02 */ - MUX(CLK_MOUT_ACLK_LITE_D_B, "mout_aclk_lite_d_b", mout_aclk_lite_d_b_p, - MUX_SEL_CAM02, 24, 1), - MUX(CLK_MOUT_ACLK_LITE_D_A, "mout_aclk_lite_d_a", mout_aclk_lite_d_a_p, - MUX_SEL_CAM02, 20, 1), - MUX(CLK_MOUT_ACLK_LITE_B_B, "mout_aclk_lite_b_b", mout_aclk_lite_b_b_p, - MUX_SEL_CAM02, 16, 1), - MUX(CLK_MOUT_ACLK_LITE_B_A, "mout_aclk_lite_b_a", mout_aclk_lite_b_a_p, - MUX_SEL_CAM02, 12, 1), - MUX(CLK_MOUT_ACLK_LITE_A_B, "mout_aclk_lite_a_b", mout_aclk_lite_a_b_p, - MUX_SEL_CAM02, 8, 1), - MUX(CLK_MOUT_ACLK_LITE_A_A, "mout_aclk_lite_a_a", mout_aclk_lite_a_a_p, - MUX_SEL_CAM02, 4, 1), - MUX(CLK_MOUT_ACLK_CAM0_400, "mout_aclk_cam0_400", mout_aclk_cam0_400_p, - MUX_SEL_CAM02, 0, 1), - - /* MUX_SEL_CAM03 */ - MUX(CLK_MOUT_ACLK_CSIS1_B, "mout_aclk_csis1_b", mout_aclk_csis1_b_p, - MUX_SEL_CAM03, 28, 1), - MUX(CLK_MOUT_ACLK_CSIS1_A, "mout_aclk_csis1_a", mout_aclk_csis1_a_p, - MUX_SEL_CAM03, 24, 1), - MUX(CLK_MOUT_ACLK_CSIS0_B, "mout_aclk_csis0_b", mout_aclk_csis0_b_p, - MUX_SEL_CAM03, 20, 1), - MUX(CLK_MOUT_ACLK_CSIS0_A, "mout_aclk_csis0_a", mout_aclk_csis0_a_p, - MUX_SEL_CAM03, 16, 1), - MUX(CLK_MOUT_ACLK_3AA1_B, "mout_aclk_3aa1_b", mout_aclk_3aa1_b_p, - MUX_SEL_CAM03, 12, 1), - MUX(CLK_MOUT_ACLK_3AA1_A, "mout_aclk_3aa1_a", mout_aclk_3aa1_a_p, - MUX_SEL_CAM03, 8, 1), - MUX(CLK_MOUT_ACLK_3AA0_B, "mout_aclk_3aa0_b", mout_aclk_3aa0_b_p, - MUX_SEL_CAM03, 4, 1), - MUX(CLK_MOUT_ACLK_3AA0_A, "mout_aclk_3aa0_a", mout_aclk_3aa0_a_p, - MUX_SEL_CAM03, 0, 1), - - /* MUX_SEL_CAM04 */ - MUX(CLK_MOUT_SCLK_LITE_FREECNT_C, "mout_sclk_lite_freecnt_c", - mout_sclk_lite_freecnt_c_p, MUX_SEL_CAM04, 24, 1), - MUX(CLK_MOUT_SCLK_LITE_FREECNT_B, "mout_sclk_lite_freecnt_b", - mout_sclk_lite_freecnt_b_p, MUX_SEL_CAM04, 20, 1), - MUX(CLK_MOUT_SCLK_LITE_FREECNT_A, "mout_sclk_lite_freecnt_a", - mout_sclk_lite_freecnt_a_p, MUX_SEL_CAM04, 16, 1), - MUX(CLK_MOUT_SCLK_PIXELASYNC_LITE_C_B, "mout_sclk_pixelasync_lite_c_b", - mout_sclk_pixelasync_lite_c_b_p, MUX_SEL_CAM04, 12, 1), - MUX(CLK_MOUT_SCLK_PIXELASYNC_LITE_C_A, "mout_sclk_pixelasync_lite_c_a", - mout_sclk_pixelasync_lite_c_a_p, MUX_SEL_CAM04, 8, 1), - MUX(CLK_MOUT_SCLK_PIXELASYNC_LITE_C_INIT_B, - "mout_sclk_pixelasync_lite_c_init_b", - mout_sclk_pixelasync_lite_c_init_b_p, - MUX_SEL_CAM04, 4, 1), - MUX(CLK_MOUT_SCLK_PIXELASYNC_LITE_C_INIT_A, - "mout_sclk_pixelasync_lite_c_init_a", - mout_sclk_pixelasync_lite_c_init_a_p, - MUX_SEL_CAM04, 0, 1), -}; - -static const struct samsung_div_clock cam0_div_clks[] __initconst = { - /* DIV_CAM00 */ - DIV(CLK_DIV_PCLK_CAM0_50, "div_pclk_cam0_50", "div_aclk_cam0_200", - DIV_CAM00, 8, 2), - DIV(CLK_DIV_ACLK_CAM0_200, "div_aclk_cam0_200", "mout_aclk_cam0_400", - DIV_CAM00, 4, 3), - DIV(CLK_DIV_ACLK_CAM0_BUS_400, "div_aclk_cam0_bus_400", - "mout_aclk_cam0_400", DIV_CAM00, 0, 3), - - /* DIV_CAM01 */ - DIV(CLK_DIV_PCLK_LITE_D, "div_pclk_lite_d", "div_aclk_lite_d", - DIV_CAM01, 20, 2), - DIV(CLK_DIV_ACLK_LITE_D, "div_aclk_lite_d", "mout_aclk_lite_d_b", - DIV_CAM01, 16, 3), - DIV(CLK_DIV_PCLK_LITE_B, "div_pclk_lite_b", "div_aclk_lite_b", - DIV_CAM01, 12, 2), - DIV(CLK_DIV_ACLK_LITE_B, "div_aclk_lite_b", "mout_aclk_lite_b_b", - DIV_CAM01, 8, 3), - DIV(CLK_DIV_PCLK_LITE_A, "div_pclk_lite_a", "div_aclk_lite_a", - DIV_CAM01, 4, 2), - DIV(CLK_DIV_ACLK_LITE_A, "div_aclk_lite_a", "mout_aclk_lite_a_b", - DIV_CAM01, 0, 3), - - /* DIV_CAM02 */ - DIV(CLK_DIV_ACLK_CSIS1, "div_aclk_csis1", "mout_aclk_csis1_b", - DIV_CAM02, 20, 3), - DIV(CLK_DIV_ACLK_CSIS0, "div_aclk_csis0", "mout_aclk_csis0_b", - DIV_CAM02, 16, 3), - DIV(CLK_DIV_PCLK_3AA1, "div_pclk_3aa1", "div_aclk_3aa1", - DIV_CAM02, 12, 2), - DIV(CLK_DIV_ACLK_3AA1, "div_aclk_3aa1", "mout_aclk_3aa1_b", - DIV_CAM02, 8, 3), - DIV(CLK_DIV_PCLK_3AA0, "div_pclk_3aa0", "div_aclk_3aa0", - DIV_CAM02, 4, 2), - DIV(CLK_DIV_ACLK_3AA0, "div_aclk_3aa0", "mout_aclk_3aa0_b", - DIV_CAM02, 0, 3), - - /* DIV_CAM03 */ - DIV(CLK_DIV_SCLK_PIXELASYNC_LITE_C, "div_sclk_pixelasync_lite_c", - "mout_sclk_pixelasync_lite_c_b", DIV_CAM03, 8, 3), - DIV(CLK_DIV_PCLK_PIXELASYNC_LITE_C, "div_pclk_pixelasync_lite_c", - "div_sclk_pixelasync_lite_c_init", DIV_CAM03, 4, 2), - DIV(CLK_DIV_SCLK_PIXELASYNC_LITE_C_INIT, - "div_sclk_pixelasync_lite_c_init", - "mout_sclk_pixelasync_lite_c_init_b", DIV_CAM03, 0, 3), -}; - -static const struct samsung_gate_clock cam0_gate_clks[] __initconst = { - /* ENABLE_ACLK_CAM00 */ - GATE(CLK_ACLK_CSIS1, "aclk_csis1", "div_aclk_csis1", ENABLE_ACLK_CAM00, - 6, 0, 0), - GATE(CLK_ACLK_CSIS0, "aclk_csis0", "div_aclk_csis0", ENABLE_ACLK_CAM00, - 5, 0, 0), - GATE(CLK_ACLK_3AA1, "aclk_3aa1", "div_aclk_3aa1", ENABLE_ACLK_CAM00, - 4, 0, 0), - GATE(CLK_ACLK_3AA0, "aclk_3aa0", "div_aclk_3aa0", ENABLE_ACLK_CAM00, - 3, 0, 0), - GATE(CLK_ACLK_LITE_D, "aclk_lite_d", "div_aclk_lite_d", - ENABLE_ACLK_CAM00, 2, 0, 0), - GATE(CLK_ACLK_LITE_B, "aclk_lite_b", "div_aclk_lite_b", - ENABLE_ACLK_CAM00, 1, 0, 0), - GATE(CLK_ACLK_LITE_A, "aclk_lite_a", "div_aclk_lite_a", - ENABLE_ACLK_CAM00, 0, 0, 0), - - /* ENABLE_ACLK_CAM01 */ - GATE(CLK_ACLK_AHBSYNCDN, "aclk_ahbsyncdn", "div_aclk_cam0_200", - ENABLE_ACLK_CAM01, 31, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIUS_LITE_D, "aclk_axius_lite_d", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM01, 30, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIUS_LITE_B, "aclk_axius_lite_b", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM01, 29, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIUS_LITE_A, "aclk_axius_lite_a", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM01, 28, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBM_3AA1, "aclk_asyncapbm_3aa1", "div_pclk_3aa1", - ENABLE_ACLK_CAM01, 27, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBS_3AA1, "aclk_asyncapbs_3aa1", "div_aclk_3aa1", - ENABLE_ACLK_CAM01, 26, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBM_3AA0, "aclk_asyncapbm_3aa0", "div_pclk_3aa0", - ENABLE_ACLK_CAM01, 25, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBS_3AA0, "aclk_asyncapbs_3aa0", "div_aclk_3aa0", - ENABLE_ACLK_CAM01, 24, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBM_LITE_D, "aclk_asyncapbm_lite_d", - "div_pclk_lite_d", ENABLE_ACLK_CAM01, - 23, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBS_LITE_D, "aclk_asyncapbs_lite_d", - "div_aclk_cam0_200", ENABLE_ACLK_CAM01, - 22, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBM_LITE_B, "aclk_asyncapbm_lite_b", - "div_pclk_lite_b", ENABLE_ACLK_CAM01, - 21, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBS_LITE_B, "aclk_asyncapbs_lite_b", - "div_aclk_cam0_200", ENABLE_ACLK_CAM01, - 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBM_LITE_A, "aclk_asyncapbm_lite_a", - "div_pclk_lite_a", ENABLE_ACLK_CAM01, - 19, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBS_LITE_A, "aclk_asyncapbs_lite_a", - "div_aclk_cam0_200", ENABLE_ACLK_CAM01, - 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_ISP0P, "aclk_asyncaxim_isp0p", - "div_aclk_cam0_200", ENABLE_ACLK_CAM01, - 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_3AA1, "aclk_asyncaxim_3aa1", - "div_aclk_cam0_bus_400", ENABLE_ACLK_CAM01, - 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_3AA1, "aclk_asyncaxis_3aa1", - "div_aclk_3aa1", ENABLE_ACLK_CAM01, - 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_3AA0, "aclk_asyncaxim_3aa0", - "div_aclk_cam0_bus_400", ENABLE_ACLK_CAM01, - 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_3AA0, "aclk_asyncaxis_3aa0", - "div_aclk_3aa0", ENABLE_ACLK_CAM01, - 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_LITE_D, "aclk_asyncaxim_lite_d", - "div_aclk_cam0_bus_400", ENABLE_ACLK_CAM01, - 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_LITE_D, "aclk_asyncaxis_lite_d", - "div_aclk_lite_d", ENABLE_ACLK_CAM01, - 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_LITE_B, "aclk_asyncaxim_lite_b", - "div_aclk_cam0_bus_400", ENABLE_ACLK_CAM01, - 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_LITE_B, "aclk_asyncaxis_lite_b", - "div_aclk_lite_b", ENABLE_ACLK_CAM01, - 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_LITE_A, "aclk_asyncaxim_lite_a", - "div_aclk_cam0_bus_400", ENABLE_ACLK_CAM01, - 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_LITE_A, "aclk_asyncaxis_lite_a", - "div_aclk_lite_a", ENABLE_ACLK_CAM01, - 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_ISPSFRP, "aclk_ahb2apb_ispsfrp", - "div_pclk_cam0_50", ENABLE_ACLK_CAM01, - 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXI2APB_ISP0P, "aclk_axi2apb_isp0p", "div_aclk_cam0_200", - ENABLE_ACLK_CAM01, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXI2AHB_ISP0P, "aclk_axi2ahb_isp0p", "div_aclk_cam0_200", - ENABLE_ACLK_CAM01, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_IS0X, "aclk_xiu_is0x", "div_aclk_cam0_200", - ENABLE_ACLK_CAM01, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_ISP0EX, "aclk_xiu_isp0ex", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM01, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_CAM0NP_276, "aclk_cam0np_276", "div_aclk_cam0_200", - ENABLE_ACLK_CAM01, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_CAM0ND_400, "aclk_cam0nd_400", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM01, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_ACLK_CAM02 */ - GATE(CLK_ACLK_SMMU_3AA1, "aclk_smmu_3aa1", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM02, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_3AA0, "aclk_smmu_3aa0", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM02, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_LITE_D, "aclk_smmu_lite_d", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM02, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_LITE_B, "aclk_smmu_lite_b", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM02, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_LITE_A, "aclk_smmu_lite_a", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM02, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_3AA1, "aclk_bts_3aa1", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM02, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_3AA0, "aclk_bts_3aa0", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM02, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_LITE_D, "aclk_bts_lite_d", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM02, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_LITE_B, "aclk_bts_lite_b", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM02, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_LITE_A, "aclk_bts_lite_a", "div_aclk_cam0_bus_400", - ENABLE_ACLK_CAM02, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_CAM0 */ - GATE(CLK_PCLK_SMMU_3AA1, "pclk_smmu_3aa1", "div_aclk_cam0_200", - ENABLE_PCLK_CAM0, 25, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_3AA0, "pclk_smmu_3aa0", "div_aclk_cam0_200", - ENABLE_PCLK_CAM0, 24, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_LITE_D, "pclk_smmu_lite_d", "div_aclk_cam0_200", - ENABLE_PCLK_CAM0, 23, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_LITE_B, "pclk_smmu_lite_b", "div_aclk_cam0_200", - ENABLE_PCLK_CAM0, 22, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_LITE_A, "pclk_smmu_lite_a", "div_aclk_cam0_200", - ENABLE_PCLK_CAM0, 21, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_3AA1, "pclk_bts_3aa1", "div_pclk_cam0_50", - ENABLE_PCLK_CAM0, 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_3AA0, "pclk_bts_3aa0", "div_pclk_cam0_50", - ENABLE_PCLK_CAM0, 19, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_LITE_D, "pclk_bts_lite_d", "div_pclk_cam0_50", - ENABLE_PCLK_CAM0, 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_LITE_B, "pclk_bts_lite_b", "div_pclk_cam0_50", - ENABLE_PCLK_CAM0, 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_LITE_A, "pclk_bts_lite_a", "div_pclk_cam0_50", - ENABLE_PCLK_CAM0, 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXI_CAM1, "pclk_asyncaxi_cam1", "div_pclk_cam0_50", - ENABLE_PCLK_CAM0, 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXI_3AA1, "pclk_asyncaxi_3aa1", "div_pclk_cam0_50", - ENABLE_PCLK_CAM0, 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXI_3AA0, "pclk_asyncaxi_3aa0", "div_pclk_cam0_50", - ENABLE_PCLK_CAM0, 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXI_LITE_D, "pclk_asyncaxi_lite_d", - "div_pclk_cam0_50", ENABLE_PCLK_CAM0, - 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXI_LITE_B, "pclk_asyncaxi_lite_b", - "div_pclk_cam0_50", ENABLE_PCLK_CAM0, - 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXI_LITE_A, "pclk_asyncaxi_lite_a", - "div_pclk_cam0_50", ENABLE_PCLK_CAM0, - 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PMU_CAM0, "pclk_pmu_cam0", "div_pclk_cam0_50", - ENABLE_PCLK_CAM0, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_CAM0, "pclk_sysreg_cam0", "div_pclk_cam0_50", - ENABLE_PCLK_CAM0, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_CMU_CAM0_LOCAL, "pclk_cmu_cam0_local", - "div_aclk_cam0_200", ENABLE_PCLK_CAM0, - 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_CSIS1, "pclk_csis1", "div_aclk_cam0_200", - ENABLE_PCLK_CAM0, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_CSIS0, "pclk_csis0", "div_aclk_cam0_200", - ENABLE_PCLK_CAM0, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_3AA1, "pclk_3aa1", "div_pclk_3aa1", - ENABLE_PCLK_CAM0, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_3AA0, "pclk_3aa0", "div_pclk_3aa0", - ENABLE_PCLK_CAM0, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_LITE_D, "pclk_lite_d", "div_pclk_lite_d", - ENABLE_PCLK_CAM0, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_LITE_B, "pclk_lite_b", "div_pclk_lite_b", - ENABLE_PCLK_CAM0, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_LITE_A, "pclk_lite_a", "div_pclk_lite_a", - ENABLE_PCLK_CAM0, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_CAM0 */ - GATE(CLK_PHYCLK_RXBYTECLKHS0_S4, "phyclk_rxbyteclkhs0_s4", - "mout_phyclk_rxbyteclkhs0_s4_user", - ENABLE_SCLK_CAM0, 8, 0, 0), - GATE(CLK_PHYCLK_RXBYTECLKHS0_S2A, "phyclk_rxbyteclkhs0_s2a", - "mout_phyclk_rxbyteclkhs0_s2a_user", - ENABLE_SCLK_CAM0, 7, 0, 0), - GATE(CLK_SCLK_LITE_FREECNT, "sclk_lite_freecnt", - "mout_sclk_lite_freecnt_c", ENABLE_SCLK_CAM0, 6, 0, 0), - GATE(CLK_SCLK_PIXELASYNCM_3AA1, "sclk_pixelasycm_3aa1", - "div_aclk_3aa1", ENABLE_SCLK_CAM0, 5, 0, 0), - GATE(CLK_SCLK_PIXELASYNCM_3AA0, "sclk_pixelasycm_3aa0", - "div_aclk_3aa0", ENABLE_SCLK_CAM0, 4, 0, 0), - GATE(CLK_SCLK_PIXELASYNCS_3AA0, "sclk_pixelasycs_3aa0", - "div_aclk_3aa0", ENABLE_SCLK_CAM0, 3, 0, 0), - GATE(CLK_SCLK_PIXELASYNCM_LITE_C, "sclk_pixelasyncm_lite_c", - "div_sclk_pixelasync_lite_c", - ENABLE_SCLK_CAM0, 2, 0, 0), - GATE(CLK_SCLK_PIXELASYNCM_LITE_C_INIT, "sclk_pixelasyncm_lite_c_init", - "div_sclk_pixelasync_lite_c_init", - ENABLE_SCLK_CAM0, 1, 0, 0), - GATE(CLK_SCLK_PIXELASYNCS_LITE_C_INIT, "sclk_pixelasyncs_lite_c_init", - "div_sclk_pixelasync_lite_c", - ENABLE_SCLK_CAM0, 0, 0, 0), -}; - -static const struct samsung_cmu_info cam0_cmu_info __initconst = { - .mux_clks = cam0_mux_clks, - .nr_mux_clks = ARRAY_SIZE(cam0_mux_clks), - .div_clks = cam0_div_clks, - .nr_div_clks = ARRAY_SIZE(cam0_div_clks), - .gate_clks = cam0_gate_clks, - .nr_gate_clks = ARRAY_SIZE(cam0_gate_clks), - .fixed_clks = cam0_fixed_clks, - .nr_fixed_clks = ARRAY_SIZE(cam0_fixed_clks), - .nr_clk_ids = CAM0_NR_CLK, - .clk_regs = cam0_clk_regs, - .nr_clk_regs = ARRAY_SIZE(cam0_clk_regs), -}; - -static void __init exynos5433_cmu_cam0_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &cam0_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_cam0, "samsung,exynos5433-cmu-cam0", - exynos5433_cmu_cam0_init); - -/* - * Register offset definitions for CMU_CAM1 - */ -#define MUX_SEL_CAM10 0x0200 -#define MUX_SEL_CAM11 0x0204 -#define MUX_SEL_CAM12 0x0208 -#define MUX_ENABLE_CAM10 0x0300 -#define MUX_ENABLE_CAM11 0x0304 -#define MUX_ENABLE_CAM12 0x0308 -#define MUX_STAT_CAM10 0x0400 -#define MUX_STAT_CAM11 0x0404 -#define MUX_STAT_CAM12 0x0408 -#define MUX_IGNORE_CAM11 0x0504 -#define DIV_CAM10 0x0600 -#define DIV_CAM11 0x0604 -#define DIV_STAT_CAM10 0x0700 -#define DIV_STAT_CAM11 0x0704 -#define ENABLE_ACLK_CAM10 0X0800 -#define ENABLE_ACLK_CAM11 0X0804 -#define ENABLE_ACLK_CAM12 0X0808 -#define ENABLE_PCLK_CAM1 0X0900 -#define ENABLE_SCLK_CAM1 0X0a00 -#define ENABLE_IP_CAM10 0X0b00 -#define ENABLE_IP_CAM11 0X0b04 -#define ENABLE_IP_CAM12 0X0b08 - -static const unsigned long cam1_clk_regs[] __initconst = { - MUX_SEL_CAM10, - MUX_SEL_CAM11, - MUX_SEL_CAM12, - MUX_ENABLE_CAM10, - MUX_ENABLE_CAM11, - MUX_ENABLE_CAM12, - MUX_IGNORE_CAM11, - DIV_CAM10, - DIV_CAM11, - ENABLE_ACLK_CAM10, - ENABLE_ACLK_CAM11, - ENABLE_ACLK_CAM12, - ENABLE_PCLK_CAM1, - ENABLE_SCLK_CAM1, - ENABLE_IP_CAM10, - ENABLE_IP_CAM11, - ENABLE_IP_CAM12, -}; - -PNAME(mout_sclk_isp_uart_user_p) = { "oscclk", "sclk_isp_uart_cam1", }; -PNAME(mout_sclk_isp_spi1_user_p) = { "oscclk", "sclk_isp_spi1_cam1", }; -PNAME(mout_sclk_isp_spi0_user_p) = { "oscclk", "sclk_isp_spi0_cam1", }; - -PNAME(mout_aclk_cam1_333_user_p) = { "oscclk", "aclk_cam1_333", }; -PNAME(mout_aclk_cam1_400_user_p) = { "oscclk", "aclk_cam1_400", }; -PNAME(mout_aclk_cam1_552_user_p) = { "oscclk", "aclk_cam1_552", }; - -PNAME(mout_phyclk_rxbyteclkhs0_s2b_user_p) = { "oscclk", - "phyclk_rxbyteclkhs0_s2b_phy", }; - -PNAME(mout_aclk_csis2_b_p) = { "mout_aclk_csis2_a", - "mout_aclk_cam1_333_user", }; -PNAME(mout_aclk_csis2_a_p) = { "mout_aclk_cam1_552_user", - "mout_aclk_cam1_400_user", }; - -PNAME(mout_aclk_fd_b_p) = { "mout_aclk_fd_a", - "mout_aclk_cam1_333_user", }; -PNAME(mout_aclk_fd_a_p) = { "mout_aclk_cam1_552_user", - "mout_aclk_cam1_400_user", }; - -PNAME(mout_aclk_lite_c_b_p) = { "mout_aclk_lite_c_a", - "mout_aclk_cam1_333_user", }; -PNAME(mout_aclk_lite_c_a_p) = { "mout_aclk_cam1_552_user", - "mout_aclk_cam1_400_user", }; - -static const struct samsung_fixed_rate_clock cam1_fixed_clks[] __initconst = { - FRATE(CLK_PHYCLK_RXBYTEECLKHS0_S2B, "phyclk_rxbyteclkhs0_s2b_phy", NULL, - 0, 100000000), -}; - -static const struct samsung_mux_clock cam1_mux_clks[] __initconst = { - /* MUX_SEL_CAM10 */ - MUX(CLK_MOUT_SCLK_ISP_UART_USER, "mout_sclk_isp_uart_user", - mout_sclk_isp_uart_user_p, MUX_SEL_CAM10, 20, 1), - MUX(CLK_MOUT_SCLK_ISP_SPI1_USER, "mout_sclk_isp_spi1_user", - mout_sclk_isp_spi1_user_p, MUX_SEL_CAM10, 16, 1), - MUX(CLK_MOUT_SCLK_ISP_SPI0_USER, "mout_sclk_isp_spi0_user", - mout_sclk_isp_spi0_user_p, MUX_SEL_CAM10, 12, 1), - MUX(CLK_MOUT_ACLK_CAM1_333_USER, "mout_aclk_cam1_333_user", - mout_aclk_cam1_333_user_p, MUX_SEL_CAM10, 8, 1), - MUX(CLK_MOUT_ACLK_CAM1_400_USER, "mout_aclk_cam1_400_user", - mout_aclk_cam1_400_user_p, MUX_SEL_CAM10, 4, 1), - MUX(CLK_MOUT_ACLK_CAM1_552_USER, "mout_aclk_cam1_552_user", - mout_aclk_cam1_552_user_p, MUX_SEL_CAM10, 0, 1), - - /* MUX_SEL_CAM11 */ - MUX(CLK_MOUT_PHYCLK_RXBYTECLKHS0_S2B_USER, - "mout_phyclk_rxbyteclkhs0_s2b_user", - mout_phyclk_rxbyteclkhs0_s2b_user_p, - MUX_SEL_CAM11, 0, 1), - - /* MUX_SEL_CAM12 */ - MUX(CLK_MOUT_ACLK_CSIS2_B, "mout_aclk_csis2_b", mout_aclk_csis2_b_p, - MUX_SEL_CAM12, 20, 1), - MUX(CLK_MOUT_ACLK_CSIS2_A, "mout_aclk_csis2_a", mout_aclk_csis2_a_p, - MUX_SEL_CAM12, 16, 1), - MUX(CLK_MOUT_ACLK_FD_B, "mout_aclk_fd_b", mout_aclk_fd_b_p, - MUX_SEL_CAM12, 12, 1), - MUX(CLK_MOUT_ACLK_FD_A, "mout_aclk_fd_a", mout_aclk_fd_a_p, - MUX_SEL_CAM12, 8, 1), - MUX(CLK_MOUT_ACLK_LITE_C_B, "mout_aclk_lite_c_b", mout_aclk_lite_c_b_p, - MUX_SEL_CAM12, 4, 1), - MUX(CLK_MOUT_ACLK_LITE_C_A, "mout_aclk_lite_c_a", mout_aclk_lite_c_a_p, - MUX_SEL_CAM12, 0, 1), -}; - -static const struct samsung_div_clock cam1_div_clks[] __initconst = { - /* DIV_CAM10 */ - DIV(CLK_DIV_SCLK_ISP_MPWM, "div_sclk_isp_mpwm", - "div_pclk_cam1_83", DIV_CAM10, 16, 2), - DIV(CLK_DIV_PCLK_CAM1_83, "div_pclk_cam1_83", - "mout_aclk_cam1_333_user", DIV_CAM10, 12, 2), - DIV(CLK_DIV_PCLK_CAM1_166, "div_pclk_cam1_166", - "mout_aclk_cam1_333_user", DIV_CAM10, 8, 2), - DIV(CLK_DIV_PCLK_DBG_CAM1, "div_pclk_dbg_cam1", - "mout_aclk_cam1_552_user", DIV_CAM10, 4, 3), - DIV(CLK_DIV_ATCLK_CAM1, "div_atclk_cam1", "mout_aclk_cam1_552_user", - DIV_CAM10, 0, 3), - - /* DIV_CAM11 */ - DIV(CLK_DIV_ACLK_CSIS2, "div_aclk_csis2", "mout_aclk_csis2_b", - DIV_CAM11, 16, 3), - DIV(CLK_DIV_PCLK_FD, "div_pclk_fd", "div_aclk_fd", DIV_CAM11, 12, 2), - DIV(CLK_DIV_ACLK_FD, "div_aclk_fd", "mout_aclk_fd_b", DIV_CAM11, 8, 3), - DIV(CLK_DIV_PCLK_LITE_C, "div_pclk_lite_c", "div_aclk_lite_c", - DIV_CAM11, 4, 2), - DIV(CLK_DIV_ACLK_LITE_C, "div_aclk_lite_c", "mout_aclk_lite_c_b", - DIV_CAM11, 0, 3), -}; - -static const struct samsung_gate_clock cam1_gate_clks[] __initconst = { - /* ENABLE_ACLK_CAM10 */ - GATE(CLK_ACLK_ISP_GIC, "aclk_isp_gic", "mout_aclk_cam1_333_user", - ENABLE_ACLK_CAM10, 4, 0, 0), - GATE(CLK_ACLK_FD, "aclk_fd", "div_aclk_fd", - ENABLE_ACLK_CAM10, 3, 0, 0), - GATE(CLK_ACLK_LITE_C, "aclk_lite_c", "div_aclk_lite_c", - ENABLE_ACLK_CAM10, 1, 0, 0), - GATE(CLK_ACLK_CSIS2, "aclk_csis2", "div_aclk_csis2", - ENABLE_ACLK_CAM10, 0, 0, 0), - - /* ENABLE_ACLK_CAM11 */ - GATE(CLK_ACLK_ASYNCAPBM_FD, "aclk_asyncapbm_fd", "div_pclk_fd", - ENABLE_ACLK_CAM11, 29, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBS_FD, "aclk_asyncapbs_fd", "div_pclk_cam1_166", - ENABLE_ACLK_CAM11, 28, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBM_LITE_C, "aclk_asyncapbm_lite_c", - "div_pclk_lite_c", ENABLE_ACLK_CAM11, - 27, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAPBS_LITE_C, "aclk_asyncapbs_lite_c", - "div_pclk_cam1_166", ENABLE_ACLK_CAM11, - 26, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAHBS_SFRISP2H2, "aclk_asyncahbs_sfrisp2h2", - "div_pclk_cam1_83", ENABLE_ACLK_CAM11, - 25, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAHBS_SFRISP2H1, "aclk_asyncahbs_sfrisp2h1", - "div_pclk_cam1_83", ENABLE_ACLK_CAM11, - 24, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_CA5, "aclk_asyncaxim_ca5", - "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11, - 23, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_CA5, "aclk_asyncaxis_ca5", - "mout_aclk_cam1_552_user", ENABLE_ACLK_CAM11, - 22, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_ISPX2, "aclk_asyncaxis_ispx2", - "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11, - 21, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_ISPX1, "aclk_asyncaxis_ispx1", - "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11, - 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_ISPX0, "aclk_asyncaxis_ispx0", - "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11, - 19, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_ISPEX, "aclk_asyncaxim_ispex", - "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM11, - 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_ISP3P, "aclk_asyncaxim_isp3p", - "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM11, - 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_ISP3P, "aclk_asyncaxis_isp3p", - "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11, - 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_FD, "aclk_asyncaxim_fd", - "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM11, - 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_FD, "aclk_asyncaxis_fd", "div_aclk_fd", - ENABLE_ACLK_CAM11, 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIM_LITE_C, "aclk_asyncaxim_lite_c", - "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM11, - 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_ASYNCAXIS_LITE_C, "aclk_asyncaxis_lite_c", - "div_aclk_lite_c", ENABLE_ACLK_CAM11, - 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_ISP5P, "aclk_ahb2apb_isp5p", "div_pclk_cam1_83", - ENABLE_ACLK_CAM11, 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB2APB_ISP3P, "aclk_ahb2apb_isp3p", "div_pclk_cam1_83", - ENABLE_ACLK_CAM11, 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXI2APB_ISP3P, "aclk_axi2apb_isp3p", - "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11, - 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHB_SFRISP2H, "aclk_ahb_sfrisp2h", "div_pclk_cam1_83", - ENABLE_ACLK_CAM11, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXI_ISP_HX_R, "aclk_axi_isp_hx_r", "div_pclk_cam1_166", - ENABLE_ACLK_CAM11, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXI_ISP_CX_R, "aclk_axi_isp_cx_r", "div_pclk_cam1_166", - ENABLE_ACLK_CAM11, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXI_ISP_HX, "aclk_axi_isp_hx", "mout_aclk_cam1_333_user", - ENABLE_ACLK_CAM11, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXI_ISP_CX, "aclk_axi_isp_cx", "mout_aclk_cam1_333_user", - ENABLE_ACLK_CAM11, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_ISPX, "aclk_xiu_ispx", "mout_aclk_cam1_333_user", - ENABLE_ACLK_CAM11, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_XIU_ISPEX, "aclk_xiu_ispex", "mout_aclk_cam1_400_user", - ENABLE_ACLK_CAM11, 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_CAM1NP_333, "aclk_cam1np_333", "mout_aclk_cam1_333_user", - ENABLE_ACLK_CAM11, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_CAM1ND_400, "aclk_cam1nd_400", "mout_aclk_cam1_400_user", - ENABLE_ACLK_CAM11, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_ACLK_CAM12 */ - GATE(CLK_ACLK_SMMU_ISPCPU, "aclk_smmu_ispcpu", - "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM12, - 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_FD, "aclk_smmu_fd", "mout_aclk_cam1_400_user", - ENABLE_ACLK_CAM12, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_SMMU_LITE_C, "aclk_smmu_lite_c", - "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM12, - 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_ISP3P, "aclk_bts_isp3p", "mout_aclk_cam1_400_user", - ENABLE_ACLK_CAM12, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_FD, "aclk_bts_fd", "mout_aclk_cam1_400_user", - ENABLE_ACLK_CAM12, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_BTS_LITE_C, "aclk_bts_lite_c", "mout_aclk_cam1_400_user", - ENABLE_ACLK_CAM12, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHBDN_SFRISP2H, "aclk_ahbdn_sfrisp2h", - "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM12, - 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AHBDN_ISP5P, "aclk_aclk-shbdn_isp5p", - "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM12, - 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIUS_ISP3P, "aclk_axius_isp3p", - "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM12, - 2, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIUS_FD, "aclk_axius_fd", "mout_aclk_cam1_400_user", - ENABLE_ACLK_CAM12, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK_AXIUS_LITE_C, "aclk_axius_lite_c", - "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM12, - 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_PCLK_CAM1 */ - GATE(CLK_PCLK_SMMU_ISPCPU, "pclk_smmu_ispcpu", "div_pclk_cam1_166", - ENABLE_PCLK_CAM1, 27, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_FD, "pclk_smmu_fd", "div_pclk_cam1_166", - ENABLE_PCLK_CAM1, 26, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SMMU_LITE_C, "pclk_smmu_lite_c", "div_pclk_cam1_166", - ENABLE_PCLK_CAM1, 25, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_ISP3P, "pclk_bts_isp3p", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 24, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_FD, "pclk_bts_fd", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 23, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_BTS_LITE_C, "pclk_bts_lite_c", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 22, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXIM_CA5, "pclk_asyncaxim_ca5", "div_pclk_cam1_166", - ENABLE_PCLK_CAM1, 21, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXIM_ISPEX, "pclk_asyncaxim_ispex", - "div_pclk_cam1_83", ENABLE_PCLK_CAM1, - 20, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXIM_ISP3P, "pclk_asyncaxim_isp3p", - "div_pclk_cam1_83", ENABLE_PCLK_CAM1, - 19, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXIM_FD, "pclk_asyncaxim_fd", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 18, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ASYNCAXIM_LITE_C, "pclk_asyncaxim_lite_c", - "div_pclk_cam1_83", ENABLE_PCLK_CAM1, - 17, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_PMU_CAM1, "pclk_pmu_cam1", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 16, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_SYSREG_CAM1, "pclk_sysreg_cam1", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 15, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_CMU_CAM1_LOCAL, "pclk_cmu_cam1_local", - "div_pclk_cam1_166", ENABLE_PCLK_CAM1, - 14, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP_MCTADC, "pclk_isp_mctadc", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 13, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP_WDT, "pclk_isp_wdt", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 12, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP_PWM, "pclk_isp_pwm", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 11, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP_UART, "pclk_isp_uart", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP_MCUCTL, "pclk_isp_mcuctl", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 9, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP_SPI1, "pclk_isp_spi1", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 8, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP_SPI0, "pclk_isp_spi0", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 7, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP_I2C2, "pclk_isp_i2c2", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 6, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP_I2C1, "pclk_isp_i2c1", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 5, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP_I2C0, "pclk_isp_i2c0", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 4, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_ISP_MPWM, "pclk_isp_mpwm", "div_pclk_cam1_83", - ENABLE_PCLK_CAM1, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_FD, "pclk_fd", "div_pclk_fd", - ENABLE_PCLK_CAM1, 3, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_LITE_C, "pclk_lite_c", "div_pclk_lite_c", - ENABLE_PCLK_CAM1, 1, CLK_IGNORE_UNUSED, 0), - GATE(CLK_PCLK_CSIS2, "pclk_csis2", "div_pclk_cam1_166", - ENABLE_PCLK_CAM1, 0, CLK_IGNORE_UNUSED, 0), - - /* ENABLE_SCLK_CAM1 */ - GATE(CLK_SCLK_ISP_I2C2, "sclk_isp_i2c2", "oscclk", ENABLE_SCLK_CAM1, - 15, 0, 0), - GATE(CLK_SCLK_ISP_I2C1, "sclk_isp_i2c1", "oscclk", ENABLE_SCLK_CAM1, - 14, 0, 0), - GATE(CLK_SCLK_ISP_I2C0, "sclk_isp_i2c0", "oscclk", ENABLE_SCLK_CAM1, - 13, 0, 0), - GATE(CLK_SCLK_ISP_PWM, "sclk_isp_pwm", "oscclk", ENABLE_SCLK_CAM1, - 12, 0, 0), - GATE(CLK_PHYCLK_RXBYTECLKHS0_S2B, "phyclk_rxbyteclkhs0_s2b", - "mout_phyclk_rxbyteclkhs0_s2b_user", - ENABLE_SCLK_CAM1, 11, 0, 0), - GATE(CLK_SCLK_LITE_C_FREECNT, "sclk_lite_c_freecnt", "div_pclk_lite_c", - ENABLE_SCLK_CAM1, 10, 0, 0), - GATE(CLK_SCLK_PIXELASYNCM_FD, "sclk_pixelasyncm_fd", "div_aclk_fd", - ENABLE_SCLK_CAM1, 9, 0, 0), - GATE(CLK_SCLK_ISP_MCTADC, "sclk_isp_mctadc", "sclk_isp_mctadc_cam1", - ENABLE_SCLK_CAM1, 7, 0, 0), - GATE(CLK_SCLK_ISP_UART, "sclk_isp_uart", "mout_sclk_isp_uart_user", - ENABLE_SCLK_CAM1, 6, 0, 0), - GATE(CLK_SCLK_ISP_SPI1, "sclk_isp_spi1", "mout_sclk_isp_spi1_user", - ENABLE_SCLK_CAM1, 5, 0, 0), - GATE(CLK_SCLK_ISP_SPI0, "sclk_isp_spi0", "mout_sclk_isp_spi0_user", - ENABLE_SCLK_CAM1, 4, 0, 0), - GATE(CLK_SCLK_ISP_MPWM, "sclk_isp_mpwm", "div_sclk_isp_mpwm", - ENABLE_SCLK_CAM1, 3, 0, 0), - GATE(CLK_PCLK_DBG_ISP, "sclk_dbg_isp", "div_pclk_dbg_cam1", - ENABLE_SCLK_CAM1, 2, 0, 0), - GATE(CLK_ATCLK_ISP, "atclk_isp", "div_atclk_cam1", - ENABLE_SCLK_CAM1, 1, 0, 0), - GATE(CLK_SCLK_ISP_CA5, "sclk_isp_ca5", "mout_aclk_cam1_552_user", - ENABLE_SCLK_CAM1, 0, 0, 0), -}; - -static const struct samsung_cmu_info cam1_cmu_info __initconst = { - .mux_clks = cam1_mux_clks, - .nr_mux_clks = ARRAY_SIZE(cam1_mux_clks), - .div_clks = cam1_div_clks, - .nr_div_clks = ARRAY_SIZE(cam1_div_clks), - .gate_clks = cam1_gate_clks, - .nr_gate_clks = ARRAY_SIZE(cam1_gate_clks), - .fixed_clks = cam1_fixed_clks, - .nr_fixed_clks = ARRAY_SIZE(cam1_fixed_clks), - .nr_clk_ids = CAM1_NR_CLK, - .clk_regs = cam1_clk_regs, - .nr_clk_regs = ARRAY_SIZE(cam1_clk_regs), -}; - -static void __init exynos5433_cmu_cam1_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &cam1_cmu_info); -} -CLK_OF_DECLARE(exynos5433_cmu_cam1, "samsung,exynos5433-cmu-cam1", - exynos5433_cmu_cam1_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos5440.c b/drivers/clk/samsung/samsung/clk-exynos5440.c deleted file mode 100644 index a80f3ef20801..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos5440.c +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Author: Thomas Abraham - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos5440 SoC. -*/ - -#include -#include -#include -#include -#include -#include - -#include "clk.h" -#include "clk-pll.h" - -#define CLKEN_OV_VAL 0xf8 -#define CPU_CLK_STATUS 0xfc -#define MISC_DOUT1 0x558 - -static void __iomem *reg_base; - -/* parent clock name list */ -PNAME(mout_armclk_p) = { "cplla", "cpllb" }; -PNAME(mout_spi_p) = { "div125", "div200" }; - -/* fixed rate clocks generated outside the soc */ -static struct samsung_fixed_rate_clock exynos5440_fixed_rate_ext_clks[] __initdata = { - FRATE(0, "xtal", NULL, 0, 0), -}; - -/* fixed rate clocks */ -static const struct samsung_fixed_rate_clock exynos5440_fixed_rate_clks[] __initconst = { - FRATE(0, "ppll", NULL, 0, 1000000000), - FRATE(0, "usb_phy0", NULL, 0, 60000000), - FRATE(0, "usb_phy1", NULL, 0, 60000000), - FRATE(0, "usb_ohci12", NULL, 0, 12000000), - FRATE(0, "usb_ohci48", NULL, 0, 48000000), -}; - -/* fixed factor clocks */ -static const struct samsung_fixed_factor_clock exynos5440_fixed_factor_clks[] __initconst = { - FFACTOR(0, "div250", "ppll", 1, 4, 0), - FFACTOR(0, "div200", "ppll", 1, 5, 0), - FFACTOR(0, "div125", "div250", 1, 2, 0), -}; - -/* mux clocks */ -static const struct samsung_mux_clock exynos5440_mux_clks[] __initconst = { - MUX(0, "mout_spi", mout_spi_p, MISC_DOUT1, 5, 1), - MUX_A(CLK_ARM_CLK, "arm_clk", mout_armclk_p, - CPU_CLK_STATUS, 0, 1, "armclk"), -}; - -/* divider clocks */ -static const struct samsung_div_clock exynos5440_div_clks[] __initconst = { - DIV(CLK_SPI_BAUD, "div_spi", "mout_spi", MISC_DOUT1, 3, 2), -}; - -/* gate clocks */ -static const struct samsung_gate_clock exynos5440_gate_clks[] __initconst = { - GATE(CLK_PB0_250, "pb0_250", "div250", CLKEN_OV_VAL, 3, 0, 0), - GATE(CLK_PR0_250, "pr0_250", "div250", CLKEN_OV_VAL, 4, 0, 0), - GATE(CLK_PR1_250, "pr1_250", "div250", CLKEN_OV_VAL, 5, 0, 0), - GATE(CLK_B_250, "b_250", "div250", CLKEN_OV_VAL, 9, 0, 0), - GATE(CLK_B_125, "b_125", "div125", CLKEN_OV_VAL, 10, 0, 0), - GATE(CLK_B_200, "b_200", "div200", CLKEN_OV_VAL, 11, 0, 0), - GATE(CLK_SATA, "sata", "div200", CLKEN_OV_VAL, 12, 0, 0), - GATE(CLK_USB, "usb", "div200", CLKEN_OV_VAL, 13, 0, 0), - GATE(CLK_GMAC0, "gmac0", "div200", CLKEN_OV_VAL, 14, 0, 0), - GATE(CLK_CS250, "cs250", "div250", CLKEN_OV_VAL, 19, 0, 0), - GATE(CLK_PB0_250_O, "pb0_250_o", "pb0_250", CLKEN_OV_VAL, 3, 0, 0), - GATE(CLK_PR0_250_O, "pr0_250_o", "pr0_250", CLKEN_OV_VAL, 4, 0, 0), - GATE(CLK_PR1_250_O, "pr1_250_o", "pr1_250", CLKEN_OV_VAL, 5, 0, 0), - GATE(CLK_B_250_O, "b_250_o", "b_250", CLKEN_OV_VAL, 9, 0, 0), - GATE(CLK_B_125_O, "b_125_o", "b_125", CLKEN_OV_VAL, 10, 0, 0), - GATE(CLK_B_200_O, "b_200_o", "b_200", CLKEN_OV_VAL, 11, 0, 0), - GATE(CLK_SATA_O, "sata_o", "sata", CLKEN_OV_VAL, 12, 0, 0), - GATE(CLK_USB_O, "usb_o", "usb", CLKEN_OV_VAL, 13, 0, 0), - GATE(CLK_GMAC0_O, "gmac0_o", "gmac", CLKEN_OV_VAL, 14, 0, 0), - GATE(CLK_CS250_O, "cs250_o", "cs250", CLKEN_OV_VAL, 19, 0, 0), -}; - -static const struct of_device_id ext_clk_match[] __initconst = { - { .compatible = "samsung,clock-xtal", .data = (void *)0, }, - {}, -}; - -static int exynos5440_clk_restart_notify(struct notifier_block *this, - unsigned long code, void *unused) -{ - u32 val, status; - - status = readl_relaxed(reg_base + 0xbc); - val = readl_relaxed(reg_base + 0xcc); - val = (val & 0xffff0000) | (status & 0xffff); - writel_relaxed(val, reg_base + 0xcc); - - return NOTIFY_DONE; -} - -/* - * Exynos5440 Clock restart notifier, handles restart functionality - */ -static struct notifier_block exynos5440_clk_restart_handler = { - .notifier_call = exynos5440_clk_restart_notify, - .priority = 128, -}; - -static const struct samsung_pll_clock exynos5440_plls[] __initconst = { - PLL(pll_2550x, CLK_CPLLA, "cplla", "xtal", 0, 0x4c, NULL), - PLL(pll_2550x, CLK_CPLLB, "cpllb", "xtal", 0, 0x50, NULL), -}; - -/* register exynos5440 clocks */ -static void __init exynos5440_clk_init(struct device_node *np) -{ - struct samsung_clk_provider *ctx; - - reg_base = of_iomap(np, 0); - if (!reg_base) { - pr_err("%s: failed to map clock controller registers," - " aborting clock initialization\n", __func__); - return; - } - - ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); - - samsung_clk_of_register_fixed_ext(ctx, exynos5440_fixed_rate_ext_clks, - ARRAY_SIZE(exynos5440_fixed_rate_ext_clks), ext_clk_match); - - samsung_clk_register_pll(ctx, exynos5440_plls, - ARRAY_SIZE(exynos5440_plls), ctx->reg_base); - - samsung_clk_register_fixed_rate(ctx, exynos5440_fixed_rate_clks, - ARRAY_SIZE(exynos5440_fixed_rate_clks)); - samsung_clk_register_fixed_factor(ctx, exynos5440_fixed_factor_clks, - ARRAY_SIZE(exynos5440_fixed_factor_clks)); - samsung_clk_register_mux(ctx, exynos5440_mux_clks, - ARRAY_SIZE(exynos5440_mux_clks)); - samsung_clk_register_div(ctx, exynos5440_div_clks, - ARRAY_SIZE(exynos5440_div_clks)); - samsung_clk_register_gate(ctx, exynos5440_gate_clks, - ARRAY_SIZE(exynos5440_gate_clks)); - - samsung_clk_of_add_provider(np, ctx); - - if (register_restart_handler(&exynos5440_clk_restart_handler)) - pr_warn("exynos5440 clock can't register restart handler\n"); - - pr_info("Exynos5440: arm_clk = %ldHz\n", _get_rate("arm_clk")); - pr_info("exynos5440 clock initialization complete\n"); -} -CLK_OF_DECLARE(exynos5440_clk, "samsung,exynos5440-clock", exynos5440_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos7.c b/drivers/clk/samsung/samsung/clk-exynos7.c deleted file mode 100644 index 5931a4140c3d..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos7.c +++ /dev/null @@ -1,1315 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * Author: Naveen Krishna Ch - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * -*/ - -#include -#include - -#include "clk.h" -#include - -/* Register Offset definitions for CMU_TOPC (0x10570000) */ -#define CC_PLL_LOCK 0x0000 -#define BUS0_PLL_LOCK 0x0004 -#define BUS1_DPLL_LOCK 0x0008 -#define MFC_PLL_LOCK 0x000C -#define AUD_PLL_LOCK 0x0010 -#define CC_PLL_CON0 0x0100 -#define BUS0_PLL_CON0 0x0110 -#define BUS1_DPLL_CON0 0x0120 -#define MFC_PLL_CON0 0x0130 -#define AUD_PLL_CON0 0x0140 -#define MUX_SEL_TOPC0 0x0200 -#define MUX_SEL_TOPC1 0x0204 -#define MUX_SEL_TOPC2 0x0208 -#define MUX_SEL_TOPC3 0x020C -#define DIV_TOPC0 0x0600 -#define DIV_TOPC1 0x0604 -#define DIV_TOPC3 0x060C -#define ENABLE_ACLK_TOPC0 0x0800 -#define ENABLE_ACLK_TOPC1 0x0804 -#define ENABLE_SCLK_TOPC1 0x0A04 - -static const struct samsung_fixed_factor_clock topc_fixed_factor_clks[] __initconst = { - FFACTOR(0, "ffac_topc_bus0_pll_div2", "mout_topc_bus0_pll", 1, 2, 0), - FFACTOR(0, "ffac_topc_bus0_pll_div4", - "ffac_topc_bus0_pll_div2", 1, 2, 0), - FFACTOR(0, "ffac_topc_bus1_pll_div2", "mout_topc_bus1_pll", 1, 2, 0), - FFACTOR(0, "ffac_topc_cc_pll_div2", "mout_topc_cc_pll", 1, 2, 0), - FFACTOR(0, "ffac_topc_mfc_pll_div2", "mout_topc_mfc_pll", 1, 2, 0), -}; - -/* List of parent clocks for Muxes in CMU_TOPC */ -PNAME(mout_topc_aud_pll_ctrl_p) = { "fin_pll", "fout_aud_pll" }; -PNAME(mout_topc_bus0_pll_ctrl_p) = { "fin_pll", "fout_bus0_pll" }; -PNAME(mout_topc_bus1_pll_ctrl_p) = { "fin_pll", "fout_bus1_pll" }; -PNAME(mout_topc_cc_pll_ctrl_p) = { "fin_pll", "fout_cc_pll" }; -PNAME(mout_topc_mfc_pll_ctrl_p) = { "fin_pll", "fout_mfc_pll" }; - -PNAME(mout_topc_group2) = { "mout_topc_bus0_pll_half", - "mout_topc_bus1_pll_half", "mout_topc_cc_pll_half", - "mout_topc_mfc_pll_half" }; - -PNAME(mout_topc_bus0_pll_half_p) = { "mout_topc_bus0_pll", - "ffac_topc_bus0_pll_div2", "ffac_topc_bus0_pll_div4"}; -PNAME(mout_topc_bus1_pll_half_p) = { "mout_topc_bus1_pll", - "ffac_topc_bus1_pll_div2"}; -PNAME(mout_topc_cc_pll_half_p) = { "mout_topc_cc_pll", - "ffac_topc_cc_pll_div2"}; -PNAME(mout_topc_mfc_pll_half_p) = { "mout_topc_mfc_pll", - "ffac_topc_mfc_pll_div2"}; - - -PNAME(mout_topc_bus0_pll_out_p) = {"mout_topc_bus0_pll", - "ffac_topc_bus0_pll_div2"}; - -static const unsigned long topc_clk_regs[] __initconst = { - CC_PLL_LOCK, - BUS0_PLL_LOCK, - BUS1_DPLL_LOCK, - MFC_PLL_LOCK, - AUD_PLL_LOCK, - CC_PLL_CON0, - BUS0_PLL_CON0, - BUS1_DPLL_CON0, - MFC_PLL_CON0, - AUD_PLL_CON0, - MUX_SEL_TOPC0, - MUX_SEL_TOPC1, - MUX_SEL_TOPC2, - MUX_SEL_TOPC3, - DIV_TOPC0, - DIV_TOPC1, - DIV_TOPC3, -}; - -static const struct samsung_mux_clock topc_mux_clks[] __initconst = { - MUX(0, "mout_topc_bus0_pll", mout_topc_bus0_pll_ctrl_p, - MUX_SEL_TOPC0, 0, 1), - MUX(0, "mout_topc_bus1_pll", mout_topc_bus1_pll_ctrl_p, - MUX_SEL_TOPC0, 4, 1), - MUX(0, "mout_topc_cc_pll", mout_topc_cc_pll_ctrl_p, - MUX_SEL_TOPC0, 8, 1), - MUX(0, "mout_topc_mfc_pll", mout_topc_mfc_pll_ctrl_p, - MUX_SEL_TOPC0, 12, 1), - MUX(0, "mout_topc_bus0_pll_half", mout_topc_bus0_pll_half_p, - MUX_SEL_TOPC0, 16, 2), - MUX(0, "mout_topc_bus1_pll_half", mout_topc_bus1_pll_half_p, - MUX_SEL_TOPC0, 20, 1), - MUX(0, "mout_topc_cc_pll_half", mout_topc_cc_pll_half_p, - MUX_SEL_TOPC0, 24, 1), - MUX(0, "mout_topc_mfc_pll_half", mout_topc_mfc_pll_half_p, - MUX_SEL_TOPC0, 28, 1), - - MUX(0, "mout_topc_aud_pll", mout_topc_aud_pll_ctrl_p, - MUX_SEL_TOPC1, 0, 1), - MUX(0, "mout_topc_bus0_pll_out", mout_topc_bus0_pll_out_p, - MUX_SEL_TOPC1, 16, 1), - - MUX(0, "mout_aclk_ccore_133", mout_topc_group2, MUX_SEL_TOPC2, 4, 2), - - MUX(0, "mout_aclk_mscl_532", mout_topc_group2, MUX_SEL_TOPC3, 20, 2), - MUX(0, "mout_aclk_peris_66", mout_topc_group2, MUX_SEL_TOPC3, 24, 2), -}; - -static const struct samsung_div_clock topc_div_clks[] __initconst = { - DIV(DOUT_ACLK_CCORE_133, "dout_aclk_ccore_133", "mout_aclk_ccore_133", - DIV_TOPC0, 4, 4), - - DIV(DOUT_ACLK_MSCL_532, "dout_aclk_mscl_532", "mout_aclk_mscl_532", - DIV_TOPC1, 20, 4), - DIV(DOUT_ACLK_PERIS, "dout_aclk_peris_66", "mout_aclk_peris_66", - DIV_TOPC1, 24, 4), - - DIV(DOUT_SCLK_BUS0_PLL, "dout_sclk_bus0_pll", "mout_topc_bus0_pll_out", - DIV_TOPC3, 0, 4), - DIV(DOUT_SCLK_BUS1_PLL, "dout_sclk_bus1_pll", "mout_topc_bus1_pll", - DIV_TOPC3, 8, 4), - DIV(DOUT_SCLK_CC_PLL, "dout_sclk_cc_pll", "mout_topc_cc_pll", - DIV_TOPC3, 12, 4), - DIV(DOUT_SCLK_MFC_PLL, "dout_sclk_mfc_pll", "mout_topc_mfc_pll", - DIV_TOPC3, 16, 4), - DIV(DOUT_SCLK_AUD_PLL, "dout_sclk_aud_pll", "mout_topc_aud_pll", - DIV_TOPC3, 28, 4), -}; - -static const struct samsung_pll_rate_table pll1460x_24mhz_tbl[] __initconst = { - PLL_36XX_RATE(491520000, 20, 1, 0, 31457), - {}, -}; - -static const struct samsung_gate_clock topc_gate_clks[] __initconst = { - GATE(ACLK_CCORE_133, "aclk_ccore_133", "dout_aclk_ccore_133", - ENABLE_ACLK_TOPC0, 4, CLK_IS_CRITICAL, 0), - - GATE(ACLK_MSCL_532, "aclk_mscl_532", "dout_aclk_mscl_532", - ENABLE_ACLK_TOPC1, 20, 0, 0), - - GATE(ACLK_PERIS_66, "aclk_peris_66", "dout_aclk_peris_66", - ENABLE_ACLK_TOPC1, 24, 0, 0), - - GATE(SCLK_AUD_PLL, "sclk_aud_pll", "dout_sclk_aud_pll", - ENABLE_SCLK_TOPC1, 20, 0, 0), - GATE(SCLK_MFC_PLL_B, "sclk_mfc_pll_b", "dout_sclk_mfc_pll", - ENABLE_SCLK_TOPC1, 17, 0, 0), - GATE(SCLK_MFC_PLL_A, "sclk_mfc_pll_a", "dout_sclk_mfc_pll", - ENABLE_SCLK_TOPC1, 16, 0, 0), - GATE(SCLK_BUS1_PLL_B, "sclk_bus1_pll_b", "dout_sclk_bus1_pll", - ENABLE_SCLK_TOPC1, 13, 0, 0), - GATE(SCLK_BUS1_PLL_A, "sclk_bus1_pll_a", "dout_sclk_bus1_pll", - ENABLE_SCLK_TOPC1, 12, 0, 0), - GATE(SCLK_BUS0_PLL_B, "sclk_bus0_pll_b", "dout_sclk_bus0_pll", - ENABLE_SCLK_TOPC1, 5, 0, 0), - GATE(SCLK_BUS0_PLL_A, "sclk_bus0_pll_a", "dout_sclk_bus0_pll", - ENABLE_SCLK_TOPC1, 4, 0, 0), - GATE(SCLK_CC_PLL_B, "sclk_cc_pll_b", "dout_sclk_cc_pll", - ENABLE_SCLK_TOPC1, 1, 0, 0), - GATE(SCLK_CC_PLL_A, "sclk_cc_pll_a", "dout_sclk_cc_pll", - ENABLE_SCLK_TOPC1, 0, 0, 0), -}; - -static const struct samsung_pll_clock topc_pll_clks[] __initconst = { - PLL(pll_1451x, 0, "fout_bus0_pll", "fin_pll", BUS0_PLL_LOCK, - BUS0_PLL_CON0, NULL), - PLL(pll_1452x, 0, "fout_cc_pll", "fin_pll", CC_PLL_LOCK, - CC_PLL_CON0, NULL), - PLL(pll_1452x, 0, "fout_bus1_pll", "fin_pll", BUS1_DPLL_LOCK, - BUS1_DPLL_CON0, NULL), - PLL(pll_1452x, 0, "fout_mfc_pll", "fin_pll", MFC_PLL_LOCK, - MFC_PLL_CON0, NULL), - PLL(pll_1460x, FOUT_AUD_PLL, "fout_aud_pll", "fin_pll", AUD_PLL_LOCK, - AUD_PLL_CON0, pll1460x_24mhz_tbl), -}; - -static const struct samsung_cmu_info topc_cmu_info __initconst = { - .pll_clks = topc_pll_clks, - .nr_pll_clks = ARRAY_SIZE(topc_pll_clks), - .mux_clks = topc_mux_clks, - .nr_mux_clks = ARRAY_SIZE(topc_mux_clks), - .div_clks = topc_div_clks, - .nr_div_clks = ARRAY_SIZE(topc_div_clks), - .gate_clks = topc_gate_clks, - .nr_gate_clks = ARRAY_SIZE(topc_gate_clks), - .fixed_factor_clks = topc_fixed_factor_clks, - .nr_fixed_factor_clks = ARRAY_SIZE(topc_fixed_factor_clks), - .nr_clk_ids = TOPC_NR_CLK, - .clk_regs = topc_clk_regs, - .nr_clk_regs = ARRAY_SIZE(topc_clk_regs), -}; - -static void __init exynos7_clk_topc_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &topc_cmu_info); -} - -CLK_OF_DECLARE(exynos7_clk_topc, "samsung,exynos7-clock-topc", - exynos7_clk_topc_init); - -/* Register Offset definitions for CMU_TOP0 (0x105D0000) */ -#define MUX_SEL_TOP00 0x0200 -#define MUX_SEL_TOP01 0x0204 -#define MUX_SEL_TOP03 0x020C -#define MUX_SEL_TOP0_PERIC0 0x0230 -#define MUX_SEL_TOP0_PERIC1 0x0234 -#define MUX_SEL_TOP0_PERIC2 0x0238 -#define MUX_SEL_TOP0_PERIC3 0x023C -#define DIV_TOP03 0x060C -#define DIV_TOP0_PERIC0 0x0630 -#define DIV_TOP0_PERIC1 0x0634 -#define DIV_TOP0_PERIC2 0x0638 -#define DIV_TOP0_PERIC3 0x063C -#define ENABLE_ACLK_TOP03 0x080C -#define ENABLE_SCLK_TOP0_PERIC0 0x0A30 -#define ENABLE_SCLK_TOP0_PERIC1 0x0A34 -#define ENABLE_SCLK_TOP0_PERIC2 0x0A38 -#define ENABLE_SCLK_TOP0_PERIC3 0x0A3C - -/* List of parent clocks for Muxes in CMU_TOP0 */ -PNAME(mout_top0_bus0_pll_user_p) = { "fin_pll", "sclk_bus0_pll_a" }; -PNAME(mout_top0_bus1_pll_user_p) = { "fin_pll", "sclk_bus1_pll_a" }; -PNAME(mout_top0_cc_pll_user_p) = { "fin_pll", "sclk_cc_pll_a" }; -PNAME(mout_top0_mfc_pll_user_p) = { "fin_pll", "sclk_mfc_pll_a" }; -PNAME(mout_top0_aud_pll_user_p) = { "fin_pll", "sclk_aud_pll" }; - -PNAME(mout_top0_bus0_pll_half_p) = {"mout_top0_bus0_pll_user", - "ffac_top0_bus0_pll_div2"}; -PNAME(mout_top0_bus1_pll_half_p) = {"mout_top0_bus1_pll_user", - "ffac_top0_bus1_pll_div2"}; -PNAME(mout_top0_cc_pll_half_p) = {"mout_top0_cc_pll_user", - "ffac_top0_cc_pll_div2"}; -PNAME(mout_top0_mfc_pll_half_p) = {"mout_top0_mfc_pll_user", - "ffac_top0_mfc_pll_div2"}; - -PNAME(mout_top0_group1) = {"mout_top0_bus0_pll_half", - "mout_top0_bus1_pll_half", "mout_top0_cc_pll_half", - "mout_top0_mfc_pll_half"}; -PNAME(mout_top0_group3) = {"ioclk_audiocdclk0", - "ioclk_audiocdclk1", "ioclk_spdif_extclk", - "mout_top0_aud_pll_user", "mout_top0_bus0_pll_half", - "mout_top0_bus1_pll_half"}; -PNAME(mout_top0_group4) = {"ioclk_audiocdclk1", "mout_top0_aud_pll_user", - "mout_top0_bus0_pll_half", "mout_top0_bus1_pll_half"}; - -static const unsigned long top0_clk_regs[] __initconst = { - MUX_SEL_TOP00, - MUX_SEL_TOP01, - MUX_SEL_TOP03, - MUX_SEL_TOP0_PERIC0, - MUX_SEL_TOP0_PERIC1, - MUX_SEL_TOP0_PERIC2, - MUX_SEL_TOP0_PERIC3, - DIV_TOP03, - DIV_TOP0_PERIC0, - DIV_TOP0_PERIC1, - DIV_TOP0_PERIC2, - DIV_TOP0_PERIC3, - ENABLE_SCLK_TOP0_PERIC0, - ENABLE_SCLK_TOP0_PERIC1, - ENABLE_SCLK_TOP0_PERIC2, - ENABLE_SCLK_TOP0_PERIC3, -}; - -static const struct samsung_mux_clock top0_mux_clks[] __initconst = { - MUX(0, "mout_top0_aud_pll_user", mout_top0_aud_pll_user_p, - MUX_SEL_TOP00, 0, 1), - MUX(0, "mout_top0_mfc_pll_user", mout_top0_mfc_pll_user_p, - MUX_SEL_TOP00, 4, 1), - MUX(0, "mout_top0_cc_pll_user", mout_top0_cc_pll_user_p, - MUX_SEL_TOP00, 8, 1), - MUX(0, "mout_top0_bus1_pll_user", mout_top0_bus1_pll_user_p, - MUX_SEL_TOP00, 12, 1), - MUX(0, "mout_top0_bus0_pll_user", mout_top0_bus0_pll_user_p, - MUX_SEL_TOP00, 16, 1), - - MUX(0, "mout_top0_mfc_pll_half", mout_top0_mfc_pll_half_p, - MUX_SEL_TOP01, 4, 1), - MUX(0, "mout_top0_cc_pll_half", mout_top0_cc_pll_half_p, - MUX_SEL_TOP01, 8, 1), - MUX(0, "mout_top0_bus1_pll_half", mout_top0_bus1_pll_half_p, - MUX_SEL_TOP01, 12, 1), - MUX(0, "mout_top0_bus0_pll_half", mout_top0_bus0_pll_half_p, - MUX_SEL_TOP01, 16, 1), - - MUX(0, "mout_aclk_peric1_66", mout_top0_group1, MUX_SEL_TOP03, 12, 2), - MUX(0, "mout_aclk_peric0_66", mout_top0_group1, MUX_SEL_TOP03, 20, 2), - - MUX(0, "mout_sclk_spdif", mout_top0_group3, MUX_SEL_TOP0_PERIC0, 4, 3), - MUX(0, "mout_sclk_pcm1", mout_top0_group4, MUX_SEL_TOP0_PERIC0, 8, 2), - MUX(0, "mout_sclk_i2s1", mout_top0_group4, MUX_SEL_TOP0_PERIC0, 20, 2), - - MUX(0, "mout_sclk_spi1", mout_top0_group1, MUX_SEL_TOP0_PERIC1, 8, 2), - MUX(0, "mout_sclk_spi0", mout_top0_group1, MUX_SEL_TOP0_PERIC1, 20, 2), - - MUX(0, "mout_sclk_spi3", mout_top0_group1, MUX_SEL_TOP0_PERIC2, 8, 2), - MUX(0, "mout_sclk_spi2", mout_top0_group1, MUX_SEL_TOP0_PERIC2, 20, 2), - MUX(0, "mout_sclk_uart3", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 4, 2), - MUX(0, "mout_sclk_uart2", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 8, 2), - MUX(0, "mout_sclk_uart1", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 12, 2), - MUX(0, "mout_sclk_uart0", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 16, 2), - MUX(0, "mout_sclk_spi4", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 20, 2), -}; - -static const struct samsung_div_clock top0_div_clks[] __initconst = { - DIV(DOUT_ACLK_PERIC1, "dout_aclk_peric1_66", "mout_aclk_peric1_66", - DIV_TOP03, 12, 6), - DIV(DOUT_ACLK_PERIC0, "dout_aclk_peric0_66", "mout_aclk_peric0_66", - DIV_TOP03, 20, 6), - - DIV(0, "dout_sclk_spdif", "mout_sclk_spdif", DIV_TOP0_PERIC0, 4, 4), - DIV(0, "dout_sclk_pcm1", "mout_sclk_pcm1", DIV_TOP0_PERIC0, 8, 12), - DIV(0, "dout_sclk_i2s1", "mout_sclk_i2s1", DIV_TOP0_PERIC0, 20, 10), - - DIV(0, "dout_sclk_spi1", "mout_sclk_spi1", DIV_TOP0_PERIC1, 8, 12), - DIV(0, "dout_sclk_spi0", "mout_sclk_spi0", DIV_TOP0_PERIC1, 20, 12), - - DIV(0, "dout_sclk_spi3", "mout_sclk_spi3", DIV_TOP0_PERIC2, 8, 12), - DIV(0, "dout_sclk_spi2", "mout_sclk_spi2", DIV_TOP0_PERIC2, 20, 12), - - DIV(0, "dout_sclk_uart3", "mout_sclk_uart3", DIV_TOP0_PERIC3, 4, 4), - DIV(0, "dout_sclk_uart2", "mout_sclk_uart2", DIV_TOP0_PERIC3, 8, 4), - DIV(0, "dout_sclk_uart1", "mout_sclk_uart1", DIV_TOP0_PERIC3, 12, 4), - DIV(0, "dout_sclk_uart0", "mout_sclk_uart0", DIV_TOP0_PERIC3, 16, 4), - DIV(0, "dout_sclk_spi4", "mout_sclk_spi4", DIV_TOP0_PERIC3, 20, 12), -}; - -static const struct samsung_gate_clock top0_gate_clks[] __initconst = { - GATE(CLK_ACLK_PERIC0_66, "aclk_peric0_66", "dout_aclk_peric0_66", - ENABLE_ACLK_TOP03, 20, CLK_SET_RATE_PARENT, 0), - GATE(CLK_ACLK_PERIC1_66, "aclk_peric1_66", "dout_aclk_peric1_66", - ENABLE_ACLK_TOP03, 12, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_SPDIF, "sclk_spdif", "dout_sclk_spdif", - ENABLE_SCLK_TOP0_PERIC0, 4, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_PCM1, "sclk_pcm1", "dout_sclk_pcm1", - ENABLE_SCLK_TOP0_PERIC0, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_I2S1, "sclk_i2s1", "dout_sclk_i2s1", - ENABLE_SCLK_TOP0_PERIC0, 20, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_SPI1, "sclk_spi1", "dout_sclk_spi1", - ENABLE_SCLK_TOP0_PERIC1, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI0, "sclk_spi0", "dout_sclk_spi0", - ENABLE_SCLK_TOP0_PERIC1, 20, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_SPI3, "sclk_spi3", "dout_sclk_spi3", - ENABLE_SCLK_TOP0_PERIC2, 8, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_SPI2, "sclk_spi2", "dout_sclk_spi2", - ENABLE_SCLK_TOP0_PERIC2, 20, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_UART3, "sclk_uart3", "dout_sclk_uart3", - ENABLE_SCLK_TOP0_PERIC3, 4, 0, 0), - GATE(CLK_SCLK_UART2, "sclk_uart2", "dout_sclk_uart2", - ENABLE_SCLK_TOP0_PERIC3, 8, 0, 0), - GATE(CLK_SCLK_UART1, "sclk_uart1", "dout_sclk_uart1", - ENABLE_SCLK_TOP0_PERIC3, 12, 0, 0), - GATE(CLK_SCLK_UART0, "sclk_uart0", "dout_sclk_uart0", - ENABLE_SCLK_TOP0_PERIC3, 16, 0, 0), - GATE(CLK_SCLK_SPI4, "sclk_spi4", "dout_sclk_spi4", - ENABLE_SCLK_TOP0_PERIC3, 20, CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_fixed_factor_clock top0_fixed_factor_clks[] __initconst = { - FFACTOR(0, "ffac_top0_bus0_pll_div2", "mout_top0_bus0_pll_user", - 1, 2, 0), - FFACTOR(0, "ffac_top0_bus1_pll_div2", "mout_top0_bus1_pll_user", - 1, 2, 0), - FFACTOR(0, "ffac_top0_cc_pll_div2", "mout_top0_cc_pll_user", 1, 2, 0), - FFACTOR(0, "ffac_top0_mfc_pll_div2", "mout_top0_mfc_pll_user", 1, 2, 0), -}; - -static const struct samsung_cmu_info top0_cmu_info __initconst = { - .mux_clks = top0_mux_clks, - .nr_mux_clks = ARRAY_SIZE(top0_mux_clks), - .div_clks = top0_div_clks, - .nr_div_clks = ARRAY_SIZE(top0_div_clks), - .gate_clks = top0_gate_clks, - .nr_gate_clks = ARRAY_SIZE(top0_gate_clks), - .fixed_factor_clks = top0_fixed_factor_clks, - .nr_fixed_factor_clks = ARRAY_SIZE(top0_fixed_factor_clks), - .nr_clk_ids = TOP0_NR_CLK, - .clk_regs = top0_clk_regs, - .nr_clk_regs = ARRAY_SIZE(top0_clk_regs), -}; - -static void __init exynos7_clk_top0_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &top0_cmu_info); -} - -CLK_OF_DECLARE(exynos7_clk_top0, "samsung,exynos7-clock-top0", - exynos7_clk_top0_init); - -/* Register Offset definitions for CMU_TOP1 (0x105E0000) */ -#define MUX_SEL_TOP10 0x0200 -#define MUX_SEL_TOP11 0x0204 -#define MUX_SEL_TOP13 0x020C -#define MUX_SEL_TOP1_FSYS0 0x0224 -#define MUX_SEL_TOP1_FSYS1 0x0228 -#define MUX_SEL_TOP1_FSYS11 0x022C -#define DIV_TOP13 0x060C -#define DIV_TOP1_FSYS0 0x0624 -#define DIV_TOP1_FSYS1 0x0628 -#define DIV_TOP1_FSYS11 0x062C -#define ENABLE_ACLK_TOP13 0x080C -#define ENABLE_SCLK_TOP1_FSYS0 0x0A24 -#define ENABLE_SCLK_TOP1_FSYS1 0x0A28 -#define ENABLE_SCLK_TOP1_FSYS11 0x0A2C - -/* List of parent clocks for Muxes in CMU_TOP1 */ -PNAME(mout_top1_bus0_pll_user_p) = { "fin_pll", "sclk_bus0_pll_b" }; -PNAME(mout_top1_bus1_pll_user_p) = { "fin_pll", "sclk_bus1_pll_b" }; -PNAME(mout_top1_cc_pll_user_p) = { "fin_pll", "sclk_cc_pll_b" }; -PNAME(mout_top1_mfc_pll_user_p) = { "fin_pll", "sclk_mfc_pll_b" }; - -PNAME(mout_top1_bus0_pll_half_p) = {"mout_top1_bus0_pll_user", - "ffac_top1_bus0_pll_div2"}; -PNAME(mout_top1_bus1_pll_half_p) = {"mout_top1_bus1_pll_user", - "ffac_top1_bus1_pll_div2"}; -PNAME(mout_top1_cc_pll_half_p) = {"mout_top1_cc_pll_user", - "ffac_top1_cc_pll_div2"}; -PNAME(mout_top1_mfc_pll_half_p) = {"mout_top1_mfc_pll_user", - "ffac_top1_mfc_pll_div2"}; - -PNAME(mout_top1_group1) = {"mout_top1_bus0_pll_half", - "mout_top1_bus1_pll_half", "mout_top1_cc_pll_half", - "mout_top1_mfc_pll_half"}; - -static const unsigned long top1_clk_regs[] __initconst = { - MUX_SEL_TOP10, - MUX_SEL_TOP11, - MUX_SEL_TOP13, - MUX_SEL_TOP1_FSYS0, - MUX_SEL_TOP1_FSYS1, - MUX_SEL_TOP1_FSYS11, - DIV_TOP13, - DIV_TOP1_FSYS0, - DIV_TOP1_FSYS1, - DIV_TOP1_FSYS11, - ENABLE_ACLK_TOP13, - ENABLE_SCLK_TOP1_FSYS0, - ENABLE_SCLK_TOP1_FSYS1, - ENABLE_SCLK_TOP1_FSYS11, -}; - -static const struct samsung_mux_clock top1_mux_clks[] __initconst = { - MUX(0, "mout_top1_mfc_pll_user", mout_top1_mfc_pll_user_p, - MUX_SEL_TOP10, 4, 1), - MUX(0, "mout_top1_cc_pll_user", mout_top1_cc_pll_user_p, - MUX_SEL_TOP10, 8, 1), - MUX(0, "mout_top1_bus1_pll_user", mout_top1_bus1_pll_user_p, - MUX_SEL_TOP10, 12, 1), - MUX(0, "mout_top1_bus0_pll_user", mout_top1_bus0_pll_user_p, - MUX_SEL_TOP10, 16, 1), - - MUX(0, "mout_top1_mfc_pll_half", mout_top1_mfc_pll_half_p, - MUX_SEL_TOP11, 4, 1), - MUX(0, "mout_top1_cc_pll_half", mout_top1_cc_pll_half_p, - MUX_SEL_TOP11, 8, 1), - MUX(0, "mout_top1_bus1_pll_half", mout_top1_bus1_pll_half_p, - MUX_SEL_TOP11, 12, 1), - MUX(0, "mout_top1_bus0_pll_half", mout_top1_bus0_pll_half_p, - MUX_SEL_TOP11, 16, 1), - - MUX(0, "mout_aclk_fsys1_200", mout_top1_group1, MUX_SEL_TOP13, 24, 2), - MUX(0, "mout_aclk_fsys0_200", mout_top1_group1, MUX_SEL_TOP13, 28, 2), - - MUX(0, "mout_sclk_phy_fsys0_26m", mout_top1_group1, - MUX_SEL_TOP1_FSYS0, 0, 2), - MUX(0, "mout_sclk_mmc2", mout_top1_group1, MUX_SEL_TOP1_FSYS0, 16, 2), - MUX(0, "mout_sclk_usbdrd300", mout_top1_group1, - MUX_SEL_TOP1_FSYS0, 28, 2), - - MUX(0, "mout_sclk_phy_fsys1", mout_top1_group1, - MUX_SEL_TOP1_FSYS1, 0, 2), - MUX(0, "mout_sclk_ufsunipro20", mout_top1_group1, - MUX_SEL_TOP1_FSYS1, 16, 2), - - MUX(0, "mout_sclk_mmc1", mout_top1_group1, MUX_SEL_TOP1_FSYS11, 0, 2), - MUX(0, "mout_sclk_mmc0", mout_top1_group1, MUX_SEL_TOP1_FSYS11, 12, 2), - MUX(0, "mout_sclk_phy_fsys1_26m", mout_top1_group1, - MUX_SEL_TOP1_FSYS11, 24, 2), -}; - -static const struct samsung_div_clock top1_div_clks[] __initconst = { - DIV(DOUT_ACLK_FSYS1_200, "dout_aclk_fsys1_200", "mout_aclk_fsys1_200", - DIV_TOP13, 24, 4), - DIV(DOUT_ACLK_FSYS0_200, "dout_aclk_fsys0_200", "mout_aclk_fsys0_200", - DIV_TOP13, 28, 4), - - DIV(DOUT_SCLK_PHY_FSYS1, "dout_sclk_phy_fsys1", - "mout_sclk_phy_fsys1", DIV_TOP1_FSYS1, 0, 6), - - DIV(DOUT_SCLK_UFSUNIPRO20, "dout_sclk_ufsunipro20", - "mout_sclk_ufsunipro20", - DIV_TOP1_FSYS1, 16, 6), - - DIV(DOUT_SCLK_MMC2, "dout_sclk_mmc2", "mout_sclk_mmc2", - DIV_TOP1_FSYS0, 16, 10), - DIV(0, "dout_sclk_usbdrd300", "mout_sclk_usbdrd300", - DIV_TOP1_FSYS0, 28, 4), - - DIV(DOUT_SCLK_MMC1, "dout_sclk_mmc1", "mout_sclk_mmc1", - DIV_TOP1_FSYS11, 0, 10), - DIV(DOUT_SCLK_MMC0, "dout_sclk_mmc0", "mout_sclk_mmc0", - DIV_TOP1_FSYS11, 12, 10), - - DIV(DOUT_SCLK_PHY_FSYS1_26M, "dout_sclk_phy_fsys1_26m", - "mout_sclk_phy_fsys1_26m", DIV_TOP1_FSYS11, 24, 6), -}; - -static const struct samsung_gate_clock top1_gate_clks[] __initconst = { - GATE(CLK_SCLK_MMC2, "sclk_mmc2", "dout_sclk_mmc2", - ENABLE_SCLK_TOP1_FSYS0, 16, CLK_SET_RATE_PARENT, 0), - GATE(0, "sclk_usbdrd300", "dout_sclk_usbdrd300", - ENABLE_SCLK_TOP1_FSYS0, 28, 0, 0), - - GATE(CLK_SCLK_PHY_FSYS1, "sclk_phy_fsys1", "dout_sclk_phy_fsys1", - ENABLE_SCLK_TOP1_FSYS1, 0, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_UFSUNIPRO20, "sclk_ufsunipro20", "dout_sclk_ufsunipro20", - ENABLE_SCLK_TOP1_FSYS1, 16, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_MMC1, "sclk_mmc1", "dout_sclk_mmc1", - ENABLE_SCLK_TOP1_FSYS11, 0, CLK_SET_RATE_PARENT, 0), - GATE(CLK_SCLK_MMC0, "sclk_mmc0", "dout_sclk_mmc0", - ENABLE_SCLK_TOP1_FSYS11, 12, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_ACLK_FSYS0_200, "aclk_fsys0_200", "dout_aclk_fsys0_200", - ENABLE_ACLK_TOP13, 28, CLK_SET_RATE_PARENT | - CLK_IS_CRITICAL, 0), - GATE(CLK_ACLK_FSYS1_200, "aclk_fsys1_200", "dout_aclk_fsys1_200", - ENABLE_ACLK_TOP13, 24, CLK_SET_RATE_PARENT, 0), - - GATE(CLK_SCLK_PHY_FSYS1_26M, "sclk_phy_fsys1_26m", - "dout_sclk_phy_fsys1_26m", ENABLE_SCLK_TOP1_FSYS11, - 24, CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_fixed_factor_clock top1_fixed_factor_clks[] __initconst = { - FFACTOR(0, "ffac_top1_bus0_pll_div2", "mout_top1_bus0_pll_user", - 1, 2, 0), - FFACTOR(0, "ffac_top1_bus1_pll_div2", "mout_top1_bus1_pll_user", - 1, 2, 0), - FFACTOR(0, "ffac_top1_cc_pll_div2", "mout_top1_cc_pll_user", 1, 2, 0), - FFACTOR(0, "ffac_top1_mfc_pll_div2", "mout_top1_mfc_pll_user", 1, 2, 0), -}; - -static const struct samsung_cmu_info top1_cmu_info __initconst = { - .mux_clks = top1_mux_clks, - .nr_mux_clks = ARRAY_SIZE(top1_mux_clks), - .div_clks = top1_div_clks, - .nr_div_clks = ARRAY_SIZE(top1_div_clks), - .gate_clks = top1_gate_clks, - .nr_gate_clks = ARRAY_SIZE(top1_gate_clks), - .fixed_factor_clks = top1_fixed_factor_clks, - .nr_fixed_factor_clks = ARRAY_SIZE(top1_fixed_factor_clks), - .nr_clk_ids = TOP1_NR_CLK, - .clk_regs = top1_clk_regs, - .nr_clk_regs = ARRAY_SIZE(top1_clk_regs), -}; - -static void __init exynos7_clk_top1_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &top1_cmu_info); -} - -CLK_OF_DECLARE(exynos7_clk_top1, "samsung,exynos7-clock-top1", - exynos7_clk_top1_init); - -/* Register Offset definitions for CMU_CCORE (0x105B0000) */ -#define MUX_SEL_CCORE 0x0200 -#define DIV_CCORE 0x0600 -#define ENABLE_ACLK_CCORE0 0x0800 -#define ENABLE_ACLK_CCORE1 0x0804 -#define ENABLE_PCLK_CCORE 0x0900 - -/* - * List of parent clocks for Muxes in CMU_CCORE - */ -PNAME(mout_aclk_ccore_133_user_p) = { "fin_pll", "aclk_ccore_133" }; - -static const unsigned long ccore_clk_regs[] __initconst = { - MUX_SEL_CCORE, - ENABLE_PCLK_CCORE, -}; - -static const struct samsung_mux_clock ccore_mux_clks[] __initconst = { - MUX(0, "mout_aclk_ccore_133_user", mout_aclk_ccore_133_user_p, - MUX_SEL_CCORE, 1, 1), -}; - -static const struct samsung_gate_clock ccore_gate_clks[] __initconst = { - GATE(PCLK_RTC, "pclk_rtc", "mout_aclk_ccore_133_user", - ENABLE_PCLK_CCORE, 8, 0, 0), -}; - -static const struct samsung_cmu_info ccore_cmu_info __initconst = { - .mux_clks = ccore_mux_clks, - .nr_mux_clks = ARRAY_SIZE(ccore_mux_clks), - .gate_clks = ccore_gate_clks, - .nr_gate_clks = ARRAY_SIZE(ccore_gate_clks), - .nr_clk_ids = CCORE_NR_CLK, - .clk_regs = ccore_clk_regs, - .nr_clk_regs = ARRAY_SIZE(ccore_clk_regs), -}; - -static void __init exynos7_clk_ccore_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &ccore_cmu_info); -} - -CLK_OF_DECLARE(exynos7_clk_ccore, "samsung,exynos7-clock-ccore", - exynos7_clk_ccore_init); - -/* Register Offset definitions for CMU_PERIC0 (0x13610000) */ -#define MUX_SEL_PERIC0 0x0200 -#define ENABLE_PCLK_PERIC0 0x0900 -#define ENABLE_SCLK_PERIC0 0x0A00 - -/* List of parent clocks for Muxes in CMU_PERIC0 */ -PNAME(mout_aclk_peric0_66_user_p) = { "fin_pll", "aclk_peric0_66" }; -PNAME(mout_sclk_uart0_user_p) = { "fin_pll", "sclk_uart0" }; - -static const unsigned long peric0_clk_regs[] __initconst = { - MUX_SEL_PERIC0, - ENABLE_PCLK_PERIC0, - ENABLE_SCLK_PERIC0, -}; - -static const struct samsung_mux_clock peric0_mux_clks[] __initconst = { - MUX(0, "mout_aclk_peric0_66_user", mout_aclk_peric0_66_user_p, - MUX_SEL_PERIC0, 0, 1), - MUX(0, "mout_sclk_uart0_user", mout_sclk_uart0_user_p, - MUX_SEL_PERIC0, 16, 1), -}; - -static const struct samsung_gate_clock peric0_gate_clks[] __initconst = { - GATE(PCLK_HSI2C0, "pclk_hsi2c0", "mout_aclk_peric0_66_user", - ENABLE_PCLK_PERIC0, 8, 0, 0), - GATE(PCLK_HSI2C1, "pclk_hsi2c1", "mout_aclk_peric0_66_user", - ENABLE_PCLK_PERIC0, 9, 0, 0), - GATE(PCLK_HSI2C4, "pclk_hsi2c4", "mout_aclk_peric0_66_user", - ENABLE_PCLK_PERIC0, 10, 0, 0), - GATE(PCLK_HSI2C5, "pclk_hsi2c5", "mout_aclk_peric0_66_user", - ENABLE_PCLK_PERIC0, 11, 0, 0), - GATE(PCLK_HSI2C9, "pclk_hsi2c9", "mout_aclk_peric0_66_user", - ENABLE_PCLK_PERIC0, 12, 0, 0), - GATE(PCLK_HSI2C10, "pclk_hsi2c10", "mout_aclk_peric0_66_user", - ENABLE_PCLK_PERIC0, 13, 0, 0), - GATE(PCLK_HSI2C11, "pclk_hsi2c11", "mout_aclk_peric0_66_user", - ENABLE_PCLK_PERIC0, 14, 0, 0), - GATE(PCLK_UART0, "pclk_uart0", "mout_aclk_peric0_66_user", - ENABLE_PCLK_PERIC0, 16, 0, 0), - GATE(PCLK_ADCIF, "pclk_adcif", "mout_aclk_peric0_66_user", - ENABLE_PCLK_PERIC0, 20, 0, 0), - GATE(PCLK_PWM, "pclk_pwm", "mout_aclk_peric0_66_user", - ENABLE_PCLK_PERIC0, 21, 0, 0), - - GATE(SCLK_UART0, "sclk_uart0_user", "mout_sclk_uart0_user", - ENABLE_SCLK_PERIC0, 16, 0, 0), - GATE(SCLK_PWM, "sclk_pwm", "fin_pll", ENABLE_SCLK_PERIC0, 21, 0, 0), -}; - -static const struct samsung_cmu_info peric0_cmu_info __initconst = { - .mux_clks = peric0_mux_clks, - .nr_mux_clks = ARRAY_SIZE(peric0_mux_clks), - .gate_clks = peric0_gate_clks, - .nr_gate_clks = ARRAY_SIZE(peric0_gate_clks), - .nr_clk_ids = PERIC0_NR_CLK, - .clk_regs = peric0_clk_regs, - .nr_clk_regs = ARRAY_SIZE(peric0_clk_regs), -}; - -static void __init exynos7_clk_peric0_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &peric0_cmu_info); -} - -/* Register Offset definitions for CMU_PERIC1 (0x14C80000) */ -#define MUX_SEL_PERIC10 0x0200 -#define MUX_SEL_PERIC11 0x0204 -#define MUX_SEL_PERIC12 0x0208 -#define ENABLE_PCLK_PERIC1 0x0900 -#define ENABLE_SCLK_PERIC10 0x0A00 - -CLK_OF_DECLARE(exynos7_clk_peric0, "samsung,exynos7-clock-peric0", - exynos7_clk_peric0_init); - -/* List of parent clocks for Muxes in CMU_PERIC1 */ -PNAME(mout_aclk_peric1_66_user_p) = { "fin_pll", "aclk_peric1_66" }; -PNAME(mout_sclk_uart1_user_p) = { "fin_pll", "sclk_uart1" }; -PNAME(mout_sclk_uart2_user_p) = { "fin_pll", "sclk_uart2" }; -PNAME(mout_sclk_uart3_user_p) = { "fin_pll", "sclk_uart3" }; -PNAME(mout_sclk_spi0_user_p) = { "fin_pll", "sclk_spi0" }; -PNAME(mout_sclk_spi1_user_p) = { "fin_pll", "sclk_spi1" }; -PNAME(mout_sclk_spi2_user_p) = { "fin_pll", "sclk_spi2" }; -PNAME(mout_sclk_spi3_user_p) = { "fin_pll", "sclk_spi3" }; -PNAME(mout_sclk_spi4_user_p) = { "fin_pll", "sclk_spi4" }; - -static const unsigned long peric1_clk_regs[] __initconst = { - MUX_SEL_PERIC10, - MUX_SEL_PERIC11, - MUX_SEL_PERIC12, - ENABLE_PCLK_PERIC1, - ENABLE_SCLK_PERIC10, -}; - -static const struct samsung_mux_clock peric1_mux_clks[] __initconst = { - MUX(0, "mout_aclk_peric1_66_user", mout_aclk_peric1_66_user_p, - MUX_SEL_PERIC10, 0, 1), - - MUX_F(0, "mout_sclk_spi0_user", mout_sclk_spi0_user_p, - MUX_SEL_PERIC11, 0, 1, CLK_SET_RATE_PARENT, 0), - MUX_F(0, "mout_sclk_spi1_user", mout_sclk_spi1_user_p, - MUX_SEL_PERIC11, 4, 1, CLK_SET_RATE_PARENT, 0), - MUX_F(0, "mout_sclk_spi2_user", mout_sclk_spi2_user_p, - MUX_SEL_PERIC11, 8, 1, CLK_SET_RATE_PARENT, 0), - MUX_F(0, "mout_sclk_spi3_user", mout_sclk_spi3_user_p, - MUX_SEL_PERIC11, 12, 1, CLK_SET_RATE_PARENT, 0), - MUX_F(0, "mout_sclk_spi4_user", mout_sclk_spi4_user_p, - MUX_SEL_PERIC11, 16, 1, CLK_SET_RATE_PARENT, 0), - MUX(0, "mout_sclk_uart1_user", mout_sclk_uart1_user_p, - MUX_SEL_PERIC11, 20, 1), - MUX(0, "mout_sclk_uart2_user", mout_sclk_uart2_user_p, - MUX_SEL_PERIC11, 24, 1), - MUX(0, "mout_sclk_uart3_user", mout_sclk_uart3_user_p, - MUX_SEL_PERIC11, 28, 1), -}; - -static const struct samsung_gate_clock peric1_gate_clks[] __initconst = { - GATE(PCLK_HSI2C2, "pclk_hsi2c2", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 4, 0, 0), - GATE(PCLK_HSI2C3, "pclk_hsi2c3", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 5, 0, 0), - GATE(PCLK_HSI2C6, "pclk_hsi2c6", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 6, 0, 0), - GATE(PCLK_HSI2C7, "pclk_hsi2c7", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 7, 0, 0), - GATE(PCLK_HSI2C8, "pclk_hsi2c8", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 8, 0, 0), - GATE(PCLK_UART1, "pclk_uart1", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 9, 0, 0), - GATE(PCLK_UART2, "pclk_uart2", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 10, 0, 0), - GATE(PCLK_UART3, "pclk_uart3", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 11, 0, 0), - GATE(PCLK_SPI0, "pclk_spi0", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 12, 0, 0), - GATE(PCLK_SPI1, "pclk_spi1", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 13, 0, 0), - GATE(PCLK_SPI2, "pclk_spi2", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 14, 0, 0), - GATE(PCLK_SPI3, "pclk_spi3", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 15, 0, 0), - GATE(PCLK_SPI4, "pclk_spi4", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 16, 0, 0), - GATE(PCLK_I2S1, "pclk_i2s1", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 17, CLK_SET_RATE_PARENT, 0), - GATE(PCLK_PCM1, "pclk_pcm1", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 18, 0, 0), - GATE(PCLK_SPDIF, "pclk_spdif", "mout_aclk_peric1_66_user", - ENABLE_PCLK_PERIC1, 19, 0, 0), - - GATE(SCLK_UART1, "sclk_uart1_user", "mout_sclk_uart1_user", - ENABLE_SCLK_PERIC10, 9, 0, 0), - GATE(SCLK_UART2, "sclk_uart2_user", "mout_sclk_uart2_user", - ENABLE_SCLK_PERIC10, 10, 0, 0), - GATE(SCLK_UART3, "sclk_uart3_user", "mout_sclk_uart3_user", - ENABLE_SCLK_PERIC10, 11, 0, 0), - GATE(SCLK_SPI0, "sclk_spi0_user", "mout_sclk_spi0_user", - ENABLE_SCLK_PERIC10, 12, CLK_SET_RATE_PARENT, 0), - GATE(SCLK_SPI1, "sclk_spi1_user", "mout_sclk_spi1_user", - ENABLE_SCLK_PERIC10, 13, CLK_SET_RATE_PARENT, 0), - GATE(SCLK_SPI2, "sclk_spi2_user", "mout_sclk_spi2_user", - ENABLE_SCLK_PERIC10, 14, CLK_SET_RATE_PARENT, 0), - GATE(SCLK_SPI3, "sclk_spi3_user", "mout_sclk_spi3_user", - ENABLE_SCLK_PERIC10, 15, CLK_SET_RATE_PARENT, 0), - GATE(SCLK_SPI4, "sclk_spi4_user", "mout_sclk_spi4_user", - ENABLE_SCLK_PERIC10, 16, CLK_SET_RATE_PARENT, 0), - GATE(SCLK_I2S1, "sclk_i2s1_user", "sclk_i2s1", - ENABLE_SCLK_PERIC10, 17, CLK_SET_RATE_PARENT, 0), - GATE(SCLK_PCM1, "sclk_pcm1_user", "sclk_pcm1", - ENABLE_SCLK_PERIC10, 18, CLK_SET_RATE_PARENT, 0), - GATE(SCLK_SPDIF, "sclk_spdif_user", "sclk_spdif", - ENABLE_SCLK_PERIC10, 19, CLK_SET_RATE_PARENT, 0), -}; - -static const struct samsung_cmu_info peric1_cmu_info __initconst = { - .mux_clks = peric1_mux_clks, - .nr_mux_clks = ARRAY_SIZE(peric1_mux_clks), - .gate_clks = peric1_gate_clks, - .nr_gate_clks = ARRAY_SIZE(peric1_gate_clks), - .nr_clk_ids = PERIC1_NR_CLK, - .clk_regs = peric1_clk_regs, - .nr_clk_regs = ARRAY_SIZE(peric1_clk_regs), -}; - -static void __init exynos7_clk_peric1_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &peric1_cmu_info); -} - -CLK_OF_DECLARE(exynos7_clk_peric1, "samsung,exynos7-clock-peric1", - exynos7_clk_peric1_init); - -/* Register Offset definitions for CMU_PERIS (0x10040000) */ -#define MUX_SEL_PERIS 0x0200 -#define ENABLE_PCLK_PERIS 0x0900 -#define ENABLE_PCLK_PERIS_SECURE_CHIPID 0x0910 -#define ENABLE_SCLK_PERIS 0x0A00 -#define ENABLE_SCLK_PERIS_SECURE_CHIPID 0x0A10 - -/* List of parent clocks for Muxes in CMU_PERIS */ -PNAME(mout_aclk_peris_66_user_p) = { "fin_pll", "aclk_peris_66" }; - -static const unsigned long peris_clk_regs[] __initconst = { - MUX_SEL_PERIS, - ENABLE_PCLK_PERIS, - ENABLE_PCLK_PERIS_SECURE_CHIPID, - ENABLE_SCLK_PERIS, - ENABLE_SCLK_PERIS_SECURE_CHIPID, -}; - -static const struct samsung_mux_clock peris_mux_clks[] __initconst = { - MUX(0, "mout_aclk_peris_66_user", - mout_aclk_peris_66_user_p, MUX_SEL_PERIS, 0, 1), -}; - -static const struct samsung_gate_clock peris_gate_clks[] __initconst = { - GATE(PCLK_WDT, "pclk_wdt", "mout_aclk_peris_66_user", - ENABLE_PCLK_PERIS, 6, 0, 0), - GATE(PCLK_TMU, "pclk_tmu_apbif", "mout_aclk_peris_66_user", - ENABLE_PCLK_PERIS, 10, 0, 0), - - GATE(PCLK_CHIPID, "pclk_chipid", "mout_aclk_peris_66_user", - ENABLE_PCLK_PERIS_SECURE_CHIPID, 0, 0, 0), - GATE(SCLK_CHIPID, "sclk_chipid", "fin_pll", - ENABLE_SCLK_PERIS_SECURE_CHIPID, 0, 0, 0), - - GATE(SCLK_TMU, "sclk_tmu", "fin_pll", ENABLE_SCLK_PERIS, 10, 0, 0), -}; - -static const struct samsung_cmu_info peris_cmu_info __initconst = { - .mux_clks = peris_mux_clks, - .nr_mux_clks = ARRAY_SIZE(peris_mux_clks), - .gate_clks = peris_gate_clks, - .nr_gate_clks = ARRAY_SIZE(peris_gate_clks), - .nr_clk_ids = PERIS_NR_CLK, - .clk_regs = peris_clk_regs, - .nr_clk_regs = ARRAY_SIZE(peris_clk_regs), -}; - -static void __init exynos7_clk_peris_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &peris_cmu_info); -} - -CLK_OF_DECLARE(exynos7_clk_peris, "samsung,exynos7-clock-peris", - exynos7_clk_peris_init); - -/* Register Offset definitions for CMU_FSYS0 (0x10E90000) */ -#define MUX_SEL_FSYS00 0x0200 -#define MUX_SEL_FSYS01 0x0204 -#define MUX_SEL_FSYS02 0x0208 -#define ENABLE_ACLK_FSYS00 0x0800 -#define ENABLE_ACLK_FSYS01 0x0804 -#define ENABLE_SCLK_FSYS01 0x0A04 -#define ENABLE_SCLK_FSYS02 0x0A08 -#define ENABLE_SCLK_FSYS04 0x0A10 - -/* - * List of parent clocks for Muxes in CMU_FSYS0 - */ -PNAME(mout_aclk_fsys0_200_user_p) = { "fin_pll", "aclk_fsys0_200" }; -PNAME(mout_sclk_mmc2_user_p) = { "fin_pll", "sclk_mmc2" }; - -PNAME(mout_sclk_usbdrd300_user_p) = { "fin_pll", "sclk_usbdrd300" }; -PNAME(mout_phyclk_usbdrd300_udrd30_phyclk_user_p) = { "fin_pll", - "phyclk_usbdrd300_udrd30_phyclock" }; -PNAME(mout_phyclk_usbdrd300_udrd30_pipe_pclk_user_p) = { "fin_pll", - "phyclk_usbdrd300_udrd30_pipe_pclk" }; - -/* fixed rate clocks used in the FSYS0 block */ -static const struct samsung_fixed_rate_clock fixed_rate_clks_fsys0[] __initconst = { - FRATE(0, "phyclk_usbdrd300_udrd30_phyclock", NULL, 0, 60000000), - FRATE(0, "phyclk_usbdrd300_udrd30_pipe_pclk", NULL, 0, 125000000), -}; - -static const unsigned long fsys0_clk_regs[] __initconst = { - MUX_SEL_FSYS00, - MUX_SEL_FSYS01, - MUX_SEL_FSYS02, - ENABLE_ACLK_FSYS00, - ENABLE_ACLK_FSYS01, - ENABLE_SCLK_FSYS01, - ENABLE_SCLK_FSYS02, - ENABLE_SCLK_FSYS04, -}; - -static const struct samsung_mux_clock fsys0_mux_clks[] __initconst = { - MUX(0, "mout_aclk_fsys0_200_user", mout_aclk_fsys0_200_user_p, - MUX_SEL_FSYS00, 24, 1), - - MUX(0, "mout_sclk_mmc2_user", mout_sclk_mmc2_user_p, - MUX_SEL_FSYS01, 24, 1), - MUX(0, "mout_sclk_usbdrd300_user", mout_sclk_usbdrd300_user_p, - MUX_SEL_FSYS01, 28, 1), - - MUX(0, "mout_phyclk_usbdrd300_udrd30_pipe_pclk_user", - mout_phyclk_usbdrd300_udrd30_pipe_pclk_user_p, - MUX_SEL_FSYS02, 24, 1), - MUX(0, "mout_phyclk_usbdrd300_udrd30_phyclk_user", - mout_phyclk_usbdrd300_udrd30_phyclk_user_p, - MUX_SEL_FSYS02, 28, 1), -}; - -static const struct samsung_gate_clock fsys0_gate_clks[] __initconst = { - GATE(ACLK_PDMA1, "aclk_pdma1", "mout_aclk_fsys0_200_user", - ENABLE_ACLK_FSYS00, 3, 0, 0), - GATE(ACLK_PDMA0, "aclk_pdma0", "mout_aclk_fsys0_200_user", - ENABLE_ACLK_FSYS00, 4, 0, 0), - GATE(ACLK_AXIUS_USBDRD30X_FSYS0X, "aclk_axius_usbdrd30x_fsys0x", - "mout_aclk_fsys0_200_user", - ENABLE_ACLK_FSYS00, 19, 0, 0), - - GATE(ACLK_USBDRD300, "aclk_usbdrd300", "mout_aclk_fsys0_200_user", - ENABLE_ACLK_FSYS01, 29, 0, 0), - GATE(ACLK_MMC2, "aclk_mmc2", "mout_aclk_fsys0_200_user", - ENABLE_ACLK_FSYS01, 31, 0, 0), - - GATE(SCLK_USBDRD300_SUSPENDCLK, "sclk_usbdrd300_suspendclk", - "mout_sclk_usbdrd300_user", - ENABLE_SCLK_FSYS01, 4, 0, 0), - GATE(SCLK_USBDRD300_REFCLK, "sclk_usbdrd300_refclk", "fin_pll", - ENABLE_SCLK_FSYS01, 8, 0, 0), - - GATE(PHYCLK_USBDRD300_UDRD30_PIPE_PCLK_USER, - "phyclk_usbdrd300_udrd30_pipe_pclk_user", - "mout_phyclk_usbdrd300_udrd30_pipe_pclk_user", - ENABLE_SCLK_FSYS02, 24, 0, 0), - GATE(PHYCLK_USBDRD300_UDRD30_PHYCLK_USER, - "phyclk_usbdrd300_udrd30_phyclk_user", - "mout_phyclk_usbdrd300_udrd30_phyclk_user", - ENABLE_SCLK_FSYS02, 28, 0, 0), - - GATE(OSCCLK_PHY_CLKOUT_USB30_PHY, "oscclk_phy_clkout_usb30_phy", - "fin_pll", - ENABLE_SCLK_FSYS04, 28, 0, 0), -}; - -static const struct samsung_cmu_info fsys0_cmu_info __initconst = { - .fixed_clks = fixed_rate_clks_fsys0, - .nr_fixed_clks = ARRAY_SIZE(fixed_rate_clks_fsys0), - .mux_clks = fsys0_mux_clks, - .nr_mux_clks = ARRAY_SIZE(fsys0_mux_clks), - .gate_clks = fsys0_gate_clks, - .nr_gate_clks = ARRAY_SIZE(fsys0_gate_clks), - .nr_clk_ids = FSYS0_NR_CLK, - .clk_regs = fsys0_clk_regs, - .nr_clk_regs = ARRAY_SIZE(fsys0_clk_regs), -}; - -static void __init exynos7_clk_fsys0_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &fsys0_cmu_info); -} - -CLK_OF_DECLARE(exynos7_clk_fsys0, "samsung,exynos7-clock-fsys0", - exynos7_clk_fsys0_init); - -/* Register Offset definitions for CMU_FSYS1 (0x156E0000) */ -#define MUX_SEL_FSYS10 0x0200 -#define MUX_SEL_FSYS11 0x0204 -#define MUX_SEL_FSYS12 0x0208 -#define DIV_FSYS1 0x0600 -#define ENABLE_ACLK_FSYS1 0x0800 -#define ENABLE_PCLK_FSYS1 0x0900 -#define ENABLE_SCLK_FSYS11 0x0A04 -#define ENABLE_SCLK_FSYS12 0x0A08 -#define ENABLE_SCLK_FSYS13 0x0A0C - -/* - * List of parent clocks for Muxes in CMU_FSYS1 - */ -PNAME(mout_aclk_fsys1_200_user_p) = { "fin_pll", "aclk_fsys1_200" }; -PNAME(mout_fsys1_group_p) = { "fin_pll", "fin_pll_26m", - "sclk_phy_fsys1_26m" }; -PNAME(mout_sclk_mmc0_user_p) = { "fin_pll", "sclk_mmc0" }; -PNAME(mout_sclk_mmc1_user_p) = { "fin_pll", "sclk_mmc1" }; -PNAME(mout_sclk_ufsunipro20_user_p) = { "fin_pll", "sclk_ufsunipro20" }; -PNAME(mout_phyclk_ufs20_tx0_user_p) = { "fin_pll", "phyclk_ufs20_tx0_symbol" }; -PNAME(mout_phyclk_ufs20_rx0_user_p) = { "fin_pll", "phyclk_ufs20_rx0_symbol" }; -PNAME(mout_phyclk_ufs20_rx1_user_p) = { "fin_pll", "phyclk_ufs20_rx1_symbol" }; - -/* fixed rate clocks used in the FSYS1 block */ -static const struct samsung_fixed_rate_clock fixed_rate_clks_fsys1[] __initconst = { - FRATE(PHYCLK_UFS20_TX0_SYMBOL, "phyclk_ufs20_tx0_symbol", NULL, - 0, 300000000), - FRATE(PHYCLK_UFS20_RX0_SYMBOL, "phyclk_ufs20_rx0_symbol", NULL, - 0, 300000000), - FRATE(PHYCLK_UFS20_RX1_SYMBOL, "phyclk_ufs20_rx1_symbol", NULL, - 0, 300000000), -}; - -static const unsigned long fsys1_clk_regs[] __initconst = { - MUX_SEL_FSYS10, - MUX_SEL_FSYS11, - MUX_SEL_FSYS12, - DIV_FSYS1, - ENABLE_ACLK_FSYS1, - ENABLE_PCLK_FSYS1, - ENABLE_SCLK_FSYS11, - ENABLE_SCLK_FSYS12, - ENABLE_SCLK_FSYS13, -}; - -static const struct samsung_mux_clock fsys1_mux_clks[] __initconst = { - MUX(MOUT_FSYS1_PHYCLK_SEL1, "mout_fsys1_phyclk_sel1", - mout_fsys1_group_p, MUX_SEL_FSYS10, 16, 2), - MUX(0, "mout_fsys1_phyclk_sel0", mout_fsys1_group_p, - MUX_SEL_FSYS10, 20, 2), - MUX(0, "mout_aclk_fsys1_200_user", mout_aclk_fsys1_200_user_p, - MUX_SEL_FSYS10, 28, 1), - - MUX(0, "mout_sclk_mmc1_user", mout_sclk_mmc1_user_p, - MUX_SEL_FSYS11, 24, 1), - MUX(0, "mout_sclk_mmc0_user", mout_sclk_mmc0_user_p, - MUX_SEL_FSYS11, 28, 1), - MUX(0, "mout_sclk_ufsunipro20_user", mout_sclk_ufsunipro20_user_p, - MUX_SEL_FSYS11, 20, 1), - - MUX(0, "mout_phyclk_ufs20_rx1_symbol_user", - mout_phyclk_ufs20_rx1_user_p, MUX_SEL_FSYS12, 16, 1), - MUX(0, "mout_phyclk_ufs20_rx0_symbol_user", - mout_phyclk_ufs20_rx0_user_p, MUX_SEL_FSYS12, 24, 1), - MUX(0, "mout_phyclk_ufs20_tx0_symbol_user", - mout_phyclk_ufs20_tx0_user_p, MUX_SEL_FSYS12, 28, 1), -}; - -static const struct samsung_div_clock fsys1_div_clks[] __initconst = { - DIV(DOUT_PCLK_FSYS1, "dout_pclk_fsys1", "mout_aclk_fsys1_200_user", - DIV_FSYS1, 0, 2), -}; - -static const struct samsung_gate_clock fsys1_gate_clks[] __initconst = { - GATE(SCLK_UFSUNIPRO20_USER, "sclk_ufsunipro20_user", - "mout_sclk_ufsunipro20_user", - ENABLE_SCLK_FSYS11, 20, 0, 0), - - GATE(ACLK_MMC1, "aclk_mmc1", "mout_aclk_fsys1_200_user", - ENABLE_ACLK_FSYS1, 29, 0, 0), - GATE(ACLK_MMC0, "aclk_mmc0", "mout_aclk_fsys1_200_user", - ENABLE_ACLK_FSYS1, 30, 0, 0), - - GATE(ACLK_UFS20_LINK, "aclk_ufs20_link", "dout_pclk_fsys1", - ENABLE_ACLK_FSYS1, 31, 0, 0), - GATE(PCLK_GPIO_FSYS1, "pclk_gpio_fsys1", "mout_aclk_fsys1_200_user", - ENABLE_PCLK_FSYS1, 30, 0, 0), - - GATE(PHYCLK_UFS20_RX1_SYMBOL_USER, "phyclk_ufs20_rx1_symbol_user", - "mout_phyclk_ufs20_rx1_symbol_user", - ENABLE_SCLK_FSYS12, 16, 0, 0), - GATE(PHYCLK_UFS20_RX0_SYMBOL_USER, "phyclk_ufs20_rx0_symbol_user", - "mout_phyclk_ufs20_rx0_symbol_user", - ENABLE_SCLK_FSYS12, 24, 0, 0), - GATE(PHYCLK_UFS20_TX0_SYMBOL_USER, "phyclk_ufs20_tx0_symbol_user", - "mout_phyclk_ufs20_tx0_symbol_user", - ENABLE_SCLK_FSYS12, 28, 0, 0), - - GATE(OSCCLK_PHY_CLKOUT_EMBEDDED_COMBO_PHY, - "oscclk_phy_clkout_embedded_combo_phy", - "fin_pll", - ENABLE_SCLK_FSYS12, 4, CLK_IGNORE_UNUSED, 0), - - GATE(SCLK_COMBO_PHY_EMBEDDED_26M, "sclk_combo_phy_embedded_26m", - "mout_fsys1_phyclk_sel1", - ENABLE_SCLK_FSYS13, 24, CLK_IGNORE_UNUSED, 0), -}; - -static const struct samsung_cmu_info fsys1_cmu_info __initconst = { - .fixed_clks = fixed_rate_clks_fsys1, - .nr_fixed_clks = ARRAY_SIZE(fixed_rate_clks_fsys1), - .mux_clks = fsys1_mux_clks, - .nr_mux_clks = ARRAY_SIZE(fsys1_mux_clks), - .div_clks = fsys1_div_clks, - .nr_div_clks = ARRAY_SIZE(fsys1_div_clks), - .gate_clks = fsys1_gate_clks, - .nr_gate_clks = ARRAY_SIZE(fsys1_gate_clks), - .nr_clk_ids = FSYS1_NR_CLK, - .clk_regs = fsys1_clk_regs, - .nr_clk_regs = ARRAY_SIZE(fsys1_clk_regs), -}; - -static void __init exynos7_clk_fsys1_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &fsys1_cmu_info); -} - -CLK_OF_DECLARE(exynos7_clk_fsys1, "samsung,exynos7-clock-fsys1", - exynos7_clk_fsys1_init); - -#define MUX_SEL_MSCL 0x0200 -#define DIV_MSCL 0x0600 -#define ENABLE_ACLK_MSCL 0x0800 -#define ENABLE_PCLK_MSCL 0x0900 - -/* List of parent clocks for Muxes in CMU_MSCL */ -PNAME(mout_aclk_mscl_532_user_p) = { "fin_pll", "aclk_mscl_532" }; - -static const unsigned long mscl_clk_regs[] __initconst = { - MUX_SEL_MSCL, - DIV_MSCL, - ENABLE_ACLK_MSCL, - ENABLE_PCLK_MSCL, -}; - -static const struct samsung_mux_clock mscl_mux_clks[] __initconst = { - MUX(USERMUX_ACLK_MSCL_532, "usermux_aclk_mscl_532", - mout_aclk_mscl_532_user_p, MUX_SEL_MSCL, 0, 1), -}; -static const struct samsung_div_clock mscl_div_clks[] __initconst = { - DIV(DOUT_PCLK_MSCL, "dout_pclk_mscl", "usermux_aclk_mscl_532", - DIV_MSCL, 0, 3), -}; -static const struct samsung_gate_clock mscl_gate_clks[] __initconst = { - - GATE(ACLK_MSCL_0, "aclk_mscl_0", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 31, 0, 0), - GATE(ACLK_MSCL_1, "aclk_mscl_1", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 30, 0, 0), - GATE(ACLK_JPEG, "aclk_jpeg", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 29, 0, 0), - GATE(ACLK_G2D, "aclk_g2d", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 28, 0, 0), - GATE(ACLK_LH_ASYNC_SI_MSCL_0, "aclk_lh_async_si_mscl_0", - "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 27, 0, 0), - GATE(ACLK_LH_ASYNC_SI_MSCL_1, "aclk_lh_async_si_mscl_1", - "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 26, 0, 0), - GATE(ACLK_XIU_MSCLX_0, "aclk_xiu_msclx_0", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 25, 0, 0), - GATE(ACLK_XIU_MSCLX_1, "aclk_xiu_msclx_1", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 24, 0, 0), - GATE(ACLK_AXI2ACEL_BRIDGE, "aclk_axi2acel_bridge", - "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 23, 0, 0), - GATE(ACLK_QE_MSCL_0, "aclk_qe_mscl_0", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 22, 0, 0), - GATE(ACLK_QE_MSCL_1, "aclk_qe_mscl_1", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 21, 0, 0), - GATE(ACLK_QE_JPEG, "aclk_qe_jpeg", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 20, 0, 0), - GATE(ACLK_QE_G2D, "aclk_qe_g2d", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 19, 0, 0), - GATE(ACLK_PPMU_MSCL_0, "aclk_ppmu_mscl_0", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 18, 0, 0), - GATE(ACLK_PPMU_MSCL_1, "aclk_ppmu_mscl_1", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 17, 0, 0), - GATE(ACLK_MSCLNP_133, "aclk_msclnp_133", "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 16, 0, 0), - GATE(ACLK_AHB2APB_MSCL0P, "aclk_ahb2apb_mscl0p", - "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 15, 0, 0), - GATE(ACLK_AHB2APB_MSCL1P, "aclk_ahb2apb_mscl1p", - "usermux_aclk_mscl_532", - ENABLE_ACLK_MSCL, 14, 0, 0), - - GATE(PCLK_MSCL_0, "pclk_mscl_0", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 31, 0, 0), - GATE(PCLK_MSCL_1, "pclk_mscl_1", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 30, 0, 0), - GATE(PCLK_JPEG, "pclk_jpeg", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 29, 0, 0), - GATE(PCLK_G2D, "pclk_g2d", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 28, 0, 0), - GATE(PCLK_QE_MSCL_0, "pclk_qe_mscl_0", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 27, 0, 0), - GATE(PCLK_QE_MSCL_1, "pclk_qe_mscl_1", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 26, 0, 0), - GATE(PCLK_QE_JPEG, "pclk_qe_jpeg", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 25, 0, 0), - GATE(PCLK_QE_G2D, "pclk_qe_g2d", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 24, 0, 0), - GATE(PCLK_PPMU_MSCL_0, "pclk_ppmu_mscl_0", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 23, 0, 0), - GATE(PCLK_PPMU_MSCL_1, "pclk_ppmu_mscl_1", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 22, 0, 0), - GATE(PCLK_AXI2ACEL_BRIDGE, "pclk_axi2acel_bridge", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 21, 0, 0), - GATE(PCLK_PMU_MSCL, "pclk_pmu_mscl", "dout_pclk_mscl", - ENABLE_PCLK_MSCL, 20, 0, 0), -}; - -static const struct samsung_cmu_info mscl_cmu_info __initconst = { - .mux_clks = mscl_mux_clks, - .nr_mux_clks = ARRAY_SIZE(mscl_mux_clks), - .div_clks = mscl_div_clks, - .nr_div_clks = ARRAY_SIZE(mscl_div_clks), - .gate_clks = mscl_gate_clks, - .nr_gate_clks = ARRAY_SIZE(mscl_gate_clks), - .nr_clk_ids = MSCL_NR_CLK, - .clk_regs = mscl_clk_regs, - .nr_clk_regs = ARRAY_SIZE(mscl_clk_regs), -}; - -static void __init exynos7_clk_mscl_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &mscl_cmu_info); -} - -CLK_OF_DECLARE(exynos7_clk_mscl, "samsung,exynos7-clock-mscl", - exynos7_clk_mscl_init); - -/* Register Offset definitions for CMU_AUD (0x114C0000) */ -#define MUX_SEL_AUD 0x0200 -#define DIV_AUD0 0x0600 -#define DIV_AUD1 0x0604 -#define ENABLE_ACLK_AUD 0x0800 -#define ENABLE_PCLK_AUD 0x0900 -#define ENABLE_SCLK_AUD 0x0A00 - -/* - * List of parent clocks for Muxes in CMU_AUD - */ -PNAME(mout_aud_pll_user_p) = { "fin_pll", "fout_aud_pll" }; -PNAME(mout_aud_group_p) = { "dout_aud_cdclk", "ioclk_audiocdclk0" }; - -static const unsigned long aud_clk_regs[] __initconst = { - MUX_SEL_AUD, - DIV_AUD0, - DIV_AUD1, - ENABLE_ACLK_AUD, - ENABLE_PCLK_AUD, - ENABLE_SCLK_AUD, -}; - -static const struct samsung_mux_clock aud_mux_clks[] __initconst = { - MUX(0, "mout_sclk_i2s", mout_aud_group_p, MUX_SEL_AUD, 12, 1), - MUX(0, "mout_sclk_pcm", mout_aud_group_p, MUX_SEL_AUD, 16, 1), - MUX(0, "mout_aud_pll_user", mout_aud_pll_user_p, MUX_SEL_AUD, 20, 1), -}; - -static const struct samsung_div_clock aud_div_clks[] __initconst = { - DIV(0, "dout_aud_ca5", "mout_aud_pll_user", DIV_AUD0, 0, 4), - DIV(0, "dout_aclk_aud", "dout_aud_ca5", DIV_AUD0, 4, 4), - DIV(0, "dout_aud_pclk_dbg", "dout_aud_ca5", DIV_AUD0, 8, 4), - - DIV(0, "dout_sclk_i2s", "mout_sclk_i2s", DIV_AUD1, 0, 4), - DIV(0, "dout_sclk_pcm", "mout_sclk_pcm", DIV_AUD1, 4, 8), - DIV(0, "dout_sclk_uart", "dout_aud_cdclk", DIV_AUD1, 12, 4), - DIV(0, "dout_sclk_slimbus", "dout_aud_cdclk", DIV_AUD1, 16, 5), - DIV(0, "dout_aud_cdclk", "mout_aud_pll_user", DIV_AUD1, 24, 4), -}; - -static const struct samsung_gate_clock aud_gate_clks[] __initconst = { - GATE(SCLK_PCM, "sclk_pcm", "dout_sclk_pcm", - ENABLE_SCLK_AUD, 27, CLK_SET_RATE_PARENT, 0), - GATE(SCLK_I2S, "sclk_i2s", "dout_sclk_i2s", - ENABLE_SCLK_AUD, 28, CLK_SET_RATE_PARENT, 0), - GATE(0, "sclk_uart", "dout_sclk_uart", ENABLE_SCLK_AUD, 29, 0, 0), - GATE(0, "sclk_slimbus", "dout_sclk_slimbus", - ENABLE_SCLK_AUD, 30, 0, 0), - - GATE(0, "pclk_dbg_aud", "dout_aud_pclk_dbg", ENABLE_PCLK_AUD, 19, 0, 0), - GATE(0, "pclk_gpio_aud", "dout_aclk_aud", ENABLE_PCLK_AUD, 20, 0, 0), - GATE(0, "pclk_wdt1", "dout_aclk_aud", ENABLE_PCLK_AUD, 22, 0, 0), - GATE(0, "pclk_wdt0", "dout_aclk_aud", ENABLE_PCLK_AUD, 23, 0, 0), - GATE(0, "pclk_slimbus", "dout_aclk_aud", ENABLE_PCLK_AUD, 24, 0, 0), - GATE(0, "pclk_uart", "dout_aclk_aud", ENABLE_PCLK_AUD, 25, 0, 0), - GATE(PCLK_PCM, "pclk_pcm", "dout_aclk_aud", - ENABLE_PCLK_AUD, 26, CLK_SET_RATE_PARENT, 0), - GATE(PCLK_I2S, "pclk_i2s", "dout_aclk_aud", - ENABLE_PCLK_AUD, 27, CLK_SET_RATE_PARENT, 0), - GATE(0, "pclk_timer", "dout_aclk_aud", ENABLE_PCLK_AUD, 28, 0, 0), - GATE(0, "pclk_smmu_aud", "dout_aclk_aud", ENABLE_PCLK_AUD, 31, 0, 0), - - GATE(0, "aclk_smmu_aud", "dout_aclk_aud", ENABLE_ACLK_AUD, 27, 0, 0), - GATE(0, "aclk_acel_lh_async_si_top", "dout_aclk_aud", - ENABLE_ACLK_AUD, 28, 0, 0), - GATE(ACLK_ADMA, "aclk_dmac", "dout_aclk_aud", ENABLE_ACLK_AUD, 31, 0, 0), -}; - -static const struct samsung_cmu_info aud_cmu_info __initconst = { - .mux_clks = aud_mux_clks, - .nr_mux_clks = ARRAY_SIZE(aud_mux_clks), - .div_clks = aud_div_clks, - .nr_div_clks = ARRAY_SIZE(aud_div_clks), - .gate_clks = aud_gate_clks, - .nr_gate_clks = ARRAY_SIZE(aud_gate_clks), - .nr_clk_ids = AUD_NR_CLK, - .clk_regs = aud_clk_regs, - .nr_clk_regs = ARRAY_SIZE(aud_clk_regs), -}; - -static void __init exynos7_clk_aud_init(struct device_node *np) -{ - samsung_cmu_register_one(np, &aud_cmu_info); -} - -CLK_OF_DECLARE(exynos7_clk_aud, "samsung,exynos7-clock-aud", - exynos7_clk_aud_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos8895.c b/drivers/clk/samsung/samsung/clk-exynos8895.c deleted file mode 100644 index 4f6f407339a7..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos8895.c +++ /dev/null @@ -1,694 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Authors: Thomas Abraham - * Chander Kashyap - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos8895 SoC. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "../../soc/samsung/cal-if/exynos8895/cmucal-vclk.h" -#include "../../soc/samsung/cal-if/exynos8895/cmucal-node.h" -#include "../../soc/samsung/cal-if/exynos8895/cmucal-qch.h" -#include "../../soc/samsung/cal-if/exynos8895/clkout_exynos8895.h" -#include "composite.h" - -static struct samsung_clk_provider *exynos8895_clk_provider; -/* - * list of controller registers to be saved and restored during a - * suspend/resume cycle. - */ -/* fixed rate clocks generated outside the soc */ -struct samsung_fixed_rate exynos8895_fixed_rate_ext_clks[] __initdata = { - FRATE(OSCCLK, "fin_pll", NULL, 0, 26000000), -}; - -/* HWACG VCLK */ -struct init_vclk exynos8895_abox_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_ABOX_CMU_ABOX, ABOX_CMU_ABOX_QCH, "GATE_ABOX_CMU_ABOX", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_TOP, ABOX_TOP_QCH, "GATE_ABOX_TOP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BTM_ABOX, BTM_ABOX_QCH, "GATE_BTM_ABOX", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GPIO_ABOX, GPIO_ABOX_QCH, "GATE_GPIO_ABOX", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_ABOX, PMU_ABOX_QCH, "GATE_PMU_ABOX", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_ABOX, BCM_ABOX_QCH, "GATE_BCM_ABOX", NULL, 0, VCLK_GATE, "GATE_BCM_ABOX"), - HWACG_VCLK(GATE_SMMU_ABOX, SMMU_ABOX_QCH, "GATE_SMMU_ABOX", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_ABOX, SYSREG_ABOX_QCH, "GATE_SYSREG_ABOX", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_ABOXCPU, WDT_ABOXCPU_QCH, "GATE_WDT_ABOXCPU", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UAIF0, GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_UAIF0 , "GATE_UAIF0", NULL, 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_UAIF1, GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_UAIF1 , "GATE_UAIF1", NULL, 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_UAIF2, GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_UAIF2 , "GATE_UAIF2", NULL, 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_UAIF3, GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_UAIF3 , "GATE_UAIF3", NULL, 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_UAIF4, GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_UAIF4 , "GATE_UAIF4", NULL, 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_DSIF, GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_DSIF, "GATE_DSIF", NULL, 0, VCLK_GATE | VCLK_QCH_DIS, NULL), -}; - -struct init_vclk exynos8895_apm_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_APM_BUS, MUX_CLKCMU_APM_BUS_USER, "UMUX_CLKCMU_APM_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_APM_SYS, APM_QCH_SYS, "GATE_APM_SYS", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_APM_CPU, APM_QCH_CPU, "GATE_APM_CPU", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_APM_OSCCLK, APM_QCH_OSCCLK, "GATE_APM_OSCCLK", "fin_pll", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_APM_CMU_APM, APM_CMU_APM_QCH, "GATE_APM_CMU_APM", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2AP, MAILBOX_APM2AP_QCH, "GATE_MAILBOX_APM2AP", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2CP, MAILBOX_APM2CP_QCH, "GATE_MAILBOX_APM2CP", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2GNSS, MAILBOX_APM2GNSS_QCH, "GATE_MAILBOX_APM2GNSS", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SCAN2AXI, SCAN2AXI_QCH, "GATE_SCAN2AXI", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_APM, SYSREG_APM_QCH, "GATE_SYSREG_APM", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_APM, WDT_APM_QCH, "GATE_WDT_APM", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_bus1_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_BUS1_BUS, MUX_CLKCMU_BUS1_BUS_USER, "UMUX_CLKCMU_BUS1_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BUS1_CMU_BUS1, BUS1_CMU_BUS1_QCH, "GATE_BUS1_CMU_BUS1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_BUS1, PMU_BUS1_QCH, "GATE_PMU_BUS1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_BUS1, SYSREG_BUS1_QCH, "GATE_SYSREG_BUS1", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_busc_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_BUSC_BUS, MUX_CLKCMU_BUSC_BUS_USER, "UMUX_CLKCMU_BUSC_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_BUSC_BUSPHSI2C, MUX_CLKCMU_BUSC_BUSPHSI2C_USER, "UMUX_CLKCMU_BUSC_BUSPHSI2C", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_ADCIF_BUSC_S0, ADCIF_BUSC_QCH_S0, "GATE_ADCIF_BUSC_S0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ADCIF_BUSC_S1, ADCIF_BUSC_QCH_S1, "GATE_ADCIF_BUSC_S1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BUSC_CMU_BUSC, BUSC_CMU_BUSC_QCH, "GATE_BUSC_CMU_BUSC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BUSIF_CMUTOPC, BUSIF_CMUTOPC_QCH, "GATE_BUSIF_CMUTOPC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GNSSMBOX, GNSSMBOX_QCH, "GATE_GNSSMBOX", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GPIO_BUSC, GPIO_BUSC_QCH, "GATE_GPIO_BUSC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_HSI2CDF, HSI2CDF_QCH, "GATE_HSI2CDF", "UMUX_CLKCMU_BUSC_BUSPHSI2C", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MBOX, MBOX_QCH, "GATE_MBOX", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PDMA0, PDMA0_QCH, "GATE_PDMA0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_BUSC, PMU_BUSC_QCH, "GATE_PMU_BUSC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SECMBOX, SECMBOX_QCH, "GATE_SECMBOX", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPDMA, SPDMA_QCH, "GATE_SPDMA", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY, SPEEDY_QCH, "GATE_SPEEDY", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY_BATCHER_WRAP_BATCHER_SPEEDY, SPEEDY_BATCHER_WRAP_QCH_BATCHER_SPEEDY, "GATE_SPEEDY_BATCHER_WRAP_BATCHER_SPEEDY", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY_BATCHER_WRAP_BATCHER_CP, SPEEDY_BATCHER_WRAP_QCH_BATCHER_CP, "GATE_SPEEDY_BATCHER_WRAP_BATCHER_CP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY_BATCHER_WRAP_BATCHER_AP, SPEEDY_BATCHER_WRAP_QCH_BATCHER_AP, "GATE_SPEEDY_BATCHER_WRAP_BATCHER_AP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_BUSC, SYSREG_BUSC_QCH, "GATE_SYSREG_BUSC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK_QACTIVE(GATE_TREX_BUSC, "GATE_TREX_BUSC", NULL, 0, VCLK_QACTIVE, NULL, 0x151a1004, 0x1000001, 0x1000001), - HWACG_VCLK_QACTIVE(GATE_TREX_CORE, "GATE_TREX_CORE", NULL, 0, VCLK_QACTIVE, NULL, 0x14A91004, 0x1000001, 0x1000001), -}; - -struct init_vclk exynos8895_cam_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_CAM_BUS, MUX_CLKCMU_CAM_BUS_USER, "UMUX_CLKCMU_CAM_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_CAM_TPU0, MUX_CLKCMU_CAM_TPU0_USER, "UMUX_CLKCMU_CAM_TPU0", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_CAM_VRA, MUX_CLKCMU_CAM_VRA_USER, "UMUX_CLKCMU_CAM_VRA", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_CAM_TPU1, MUX_CLKCMU_CAM_TPU1_USER, "UMUX_CLKCMU_CAM_TPU1", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BTM_CAMD0, BTM_CAMD0_QCH, "GATE_BTM_CAMD0", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BTM_CAMD1, BTM_CAMD1_QCH, "GATE_BTM_CAMD1", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_CAM_CMU_CAM, CAM_CMU_CAM_QCH, "GATE_CAM_CMU_CAM", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ISP_EWGEN_CAM, ISP_EWGEN_CAM_QCH, "GATE_ISP_EWGEN_CAM", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_CSIS0, IS_CAM_QCH_CSIS0, "GATE_IS_CAM_CSIS0", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_CSIS1, IS_CAM_QCH_CSIS1, "GATE_IS_CAM_CSIS1", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_CSIS2, IS_CAM_QCH_CSIS2, "GATE_IS_CAM_CSIS2", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_CSIS3, IS_CAM_QCH_CSIS3, "GATE_IS_CAM_CSIS3", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_MC_SCALER, IS_CAM_QCH_MC_SCALER, "GATE_IS_CAM_MC_SCALER", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_CSISX4_DMA, IS_CAM_QCH_CSISX4_DMA, "GATE_IS_CAM_CSISX4_DMA", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_SYSMMU_CAM0, IS_CAM_QCH_SYSMMU_CAM0, "GATE_IS_CAM_SYSMMU_CAM0", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_SYSMMU_CAM1, IS_CAM_QCH_SYSMMU_CAM1, "GATE_IS_CAM_SYSMMU_CAM1", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_BCM_CAM0, IS_CAM_QCH_BCM_CAM0, "GATE_IS_CAM_BCM_CAM0", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, "GATE_BCM_CAM0"), - HWACG_VCLK(GATE_IS_CAM_BCM_CAM1, IS_CAM_QCH_BCM_CAM1, "GATE_IS_CAM_BCM_CAM1", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, "GATE_BCM_CAM1"), - HWACG_VCLK(GATE_IS_CAM_QE_TPU0, IS_CAM_QCH_QE_TPU0, "GATE_IS_CAM_QE_TPU0", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_QE_VRA, IS_CAM_QCH_QE_VRA, "GATE_IS_CAM_QE_VRA", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_BNS, IS_CAM_QCH_BNS, "GATE_IS_CAM_BNS", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_QE_CSISX4, IS_CAM_QCH_QE_CSISX4, "GATE_IS_CAM_QE_CSISX4", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_QE_TPU1, IS_CAM_QCH_QE_TPU1, "GATE_IS_CAM_QE_TPU1", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_CAM, PMU_CAM_QCH, "GATE_PMU_CAM", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_CAM, SYSREG_CAM_QCH, "GATE_SYSREG_CAM", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_TPU0, IS_CAM_QCH_TPU0, "GATE_IS_CAM_TPU0", "UMUX_CLKCMU_CAM_TPU0", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_VRA, IS_CAM_QCH_VRA, "GATE_IS_CAM_VRA", "UMUX_CLKCMU_CAM_VRA", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_CAM_TPU1, IS_CAM_QCH_TPU1, "GATE_IS_CAM_TPU1", "UMUX_CLKCMU_CAM_TPU1", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_cmu_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_CMU_CMU_CMUREF, CMU_CMU_CMUREF_QCH, "GATE_CMU_CMU_CMUREF", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK0, DFTMUX_TOP_QCH_CIS_CLK0, "GATE_DFTMUX_TOP_CIS_CLK0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK1, DFTMUX_TOP_QCH_CIS_CLK1, "GATE_DFTMUX_TOP_CIS_CLK1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK2, DFTMUX_TOP_QCH_CIS_CLK2, "GATE_DFTMUX_TOP_CIS_CLK2", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK3, DFTMUX_TOP_QCH_CIS_CLK3, "GATE_DFTMUX_TOP_CIS_CLK3", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_dcam_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DCAM_BUS, MUX_CLKCMU_DCAM_BUS_USER, "UMUX_CLKCMU_DCAM_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_DCAM_IMGD, MUX_CLKCMU_DCAM_IMGD_USER, "UMUX_CLKCMU_DCAM_IMGD", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BTM_DCAM, BTM_DCAM_QCH, "GATE_BTM_DCAM", "UMUX_CLKCMU_DCAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DCAM_CMU_DCAM, DCAM_CMU_DCAM_QCH, "GATE_DCAM_CMU_DCAM", "UMUX_CLKCMU_DCAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DCP, DCP_QCH, "GATE_DCP", "UMUX_CLKCMU_DCAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_DCAM, PMU_DCAM_QCH, "GATE_PMU_DCAM", "UMUX_CLKCMU_DCAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_DCAM, BCM_DCAM_QCH, "GATE_BCM_DCAM", "UMUX_CLKCMU_DCAM_BUS", 0, VCLK_GATE, "GATE_BCM_DCAM"), - HWACG_VCLK(GATE_SYSREG_DCAM, SYSREG_DCAM_QCH, "GATE_SYSREG_DCAM", "UMUX_CLKCMU_DCAM_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_dpu0_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DPU_BUS, MUX_CLKCMU_DPU_BUS_USER, "UMUX_CLKCMU_DPU_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BTM_DPUD0, BTM_DPUD0_QCH, "GATE_BTM_DPUD0", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BTM_DPUD1, BTM_DPUD1_QCH, "GATE_BTM_DPUD1", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BTM_DPUD2, BTM_DPUD2_QCH, "GATE_BTM_DPUD2", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DECON0, DECON0_QCH, "GATE_DECON0", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPP_DPP_G0, DPP_QCH_DPP_G0, "GATE_DPP_DPP_G0", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPP_DPP_G1, DPP_QCH_DPP_G1, "GATE_DPP_DPP_G1", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPP_DPP_VGR, DPP_QCH_DPP_VGR, "GATE_DPP_DPP_VGR", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU0_CMU_DPU0, DPU0_CMU_DPU0_QCH, "GATE_DPU0_CMU_DPU0", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU_DMA, DPU_DMA_QCH, "GATE_DPU_DMA", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU_WB_MUX, DPU_WB_MUX_QCH, "GATE_DPU_WB_MUX", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_DPU0, PMU_DPU0_QCH, "GATE_PMU_DPU0", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_DPUD0, BCM_DPUD0_QCH, "GATE_BCM_DPUD0", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, "GATE_BCM_DPU0"), - HWACG_VCLK(GATE_BCM_DPUD1, BCM_DPUD1_QCH, "GATE_BCM_DPUD1", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, "GATE_BCM_DPU1"), - HWACG_VCLK(GATE_BCM_DPUD2, BCM_DPUD2_QCH, "GATE_BCM_DPUD2", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, "GATE_BCM_DPU2"), - HWACG_VCLK(GATE_SYSMMU_DPUD0, SYSMMU_DPUD0_QCH, "GATE_SYSMMU_DPUD0", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_DPUD1, SYSMMU_DPUD1_QCH, "GATE_SYSMMU_DPUD1", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_DPUD2, SYSMMU_DPUD2_QCH, "GATE_SYSMMU_DPUD2", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_DPU0, SYSREG_DPU0_QCH, "GATE_SYSREG_DPU0", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_dpu1_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DPU1_BUSD, MUX_CLKCMU_DPU1_BUSD_USER, "UMUX_CLKCMU_DPU1_BUSD", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_DPU1_BUSP, MUX_CLKCMU_DPU1_BUSP_USER, "UMUX_CLKCMU_DPU1_BUSP", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_DECON1, DECON1_QCH, "GATE_DECON1", "UMUX_CLKCMU_DPU1_BUSD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DECON2_ACLK, DECON2_QCH_ACLK, "GATE_DECON2_ACLK", "UMUX_CLKCMU_DPU1_BUSD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DECON2_VCLK, DECON2_QCH_VCLK, "GATE_DECON2_VCLK", "UMUX_CLKCMU_DPU1_BUSD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU1_CMU_DPU1, DPU1_CMU_DPU1_QCH, "GATE_DPU1_CMU_DPU1", "UMUX_CLKCMU_DPU1_BUSP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_DPU1, PMU_DPU1_QCH, "GATE_PMU_DPU1", "UMUX_CLKCMU_DPU1_BUSP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_DPU1, SYSREG_DPU1_QCH, "GATE_SYSREG_DPU1", "UMUX_CLKCMU_DPU1_BUSP", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_dsp_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DSP_BUS, MUX_CLKCMU_DSP_BUS_USER, "UMUX_CLKCMU_DSP_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BTM_SCORE, BTM_SCORE_QCH, "GATE_BTM_SCORE", "UMUX_CLKCMU_DSP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DSP_CMU_DSP, DSP_CMU_DSP_QCH, "GATE_DSP_CMU_DSP", "UMUX_CLKCMU_DSP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_DSP, PMU_DSP_QCH, "GATE_PMU_DSP", "UMUX_CLKCMU_DSP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_SCORE, BCM_SCORE_QCH, "GATE_BCM_SCORE", "UMUX_CLKCMU_DSP_BUS", 0, VCLK_GATE, "GATE_BCM_SCORE"), - HWACG_VCLK(GATE_SCORE, SCORE_QCH, "GATE_SCORE", "UMUX_CLKCMU_DSP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_SCORE, SMMU_SCORE_QCH, "GATE_SMMU_SCORE", "UMUX_CLKCMU_DSP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_DSP, SYSREG_DSP_QCH, "GATE_SYSREG_DSP", "UMUX_CLKCMU_DSP_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_fsys0_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_FSYS0_BUS, MUX_CLKCMU_FSYS0_BUS_USER, "UMUX_CLKCMU_FSYS0_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_DPGTC, MUX_CLKCMU_FSYS0_DPGTC_USER, "UMUX_CLKCMU_FSYS0_DPGTC", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_UFS_EMBD, MUX_CLKCMU_FSYS0_UFS_EMBD_USER, "UMUX_CLKCMU_FSYS0_UFS_EMBD", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_MMC_EMBD, MUX_CLKCMU_FSYS0_MMC_EMBD_USER, "UMUX_CLKCMU_FSYS0_MMC_EMBD", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_USBDRD30, MUX_CLKCMU_FSYS0_USBDRD30_USER, "UMUX_CLKCMU_FSYS0_USBDRD30", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_BTM_FSYS0, BTM_FSYS0_QCH, "GATE_BTM_FSYS0", "UMUX_CLKCMU_FSYS0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ETR_MIU_PCLK, ETR_MIU_QCH_PCLK, "GATE_ETR_MIU_PCLK", "UMUX_CLKCMU_FSYS0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ETR_MIU_ACLK, ETR_MIU_QCH_ACLK, "GATE_ETR_MIU_ACLK", "UMUX_CLKCMU_FSYS0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_FSYS0_CMU_FSYS0, FSYS0_CMU_FSYS0_QCH, "GATE_FSYS0_CMU_FSYS0", "UMUX_CLKCMU_FSYS0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GPIO_FSYS0, GPIO_FSYS0_QCH, "GATE_GPIO_FSYS0", "UMUX_CLKCMU_FSYS0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_FSYS0, PMU_FSYS0_QCH, "GATE_PMU_FSYS0", "UMUX_CLKCMU_FSYS0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_FSYS0, BCM_FSYS0_QCH, "GATE_BCM_FSYS0", "UMUX_CLKCMU_FSYS0_BUS", 0, VCLK_GATE, "GATE_BCM_FSYS0"), - HWACG_VCLK(GATE_SYSREG_FSYS0, SYSREG_FSYS0_QCH, "GATE_SYSREG_FSYS0", "UMUX_CLKCMU_FSYS0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_EMBD_FMP, UFS_EMBD_QCH_FMP, "GATE_UFS_EMBD_FMP", "UMUX_CLKCMU_FSYS0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USBTV_USBTV_HOST, USBTV_QCH_USBTV_HOST, "GATE_USBTV_USBTV_HOST", "UMUX_CLKCMU_FSYS0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DP_LINK, DP_LINK_QCH, "GATE_DP_LINK", "UMUX_CLKCMU_FSYS0_DPGTC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_EMBD, UFS_EMBD_QCH, "GATE_UFS_EMBD", "UMUX_CLKCMU_FSYS0_UFS_EMBD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MMC_EMBD, MMC_EMBD_QCH, "GATE_MMC_EMBD", "UMUX_CLKCMU_FSYS0_MMC_EMBD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USBTV_USB30DRD_LINK, USBTV_QCH_USB30DRD_LINK, "GATE_USBTV_USB30DRD_LINK", "UMUX_CLKCMU_FSYS0_USBDRD30", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_fsys1_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_FSYS1_BUS, MUX_CLKCMU_FSYS1_BUS_USER, "UMUX_CLKCMU_FSYS1_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS1_MMC_CARD, MUX_CLKCMU_FSYS1_MMC_CARD_USER, "UMUX_CLKCMU_FSYS1_MMC_CARD", "UMUX_CLKCMU_FSYS1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS1_UFS_CARD, MUX_CLKCMU_FSYS1_UFS_CARD_USER, "UMUX_CLKCMU_FSYS1_UFS_CARD", "UMUX_CLKCMU_FSYS1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS1_PCIE, MUX_CLKCMU_FSYS1_PCIE_USER, "UMUX_CLKCMU_FSYS1_PCIE", "UMUX_CLKCMU_FSYS1_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_ADM_AHB_SSS, ADM_AHB_SSS_QCH, "GATE_ADM_AHB_SSS", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BTM_FSYS1, BTM_FSYS1_QCH, "GATE_BTM_FSYS1", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_FSYS1_CMU_FSYS1, FSYS1_CMU_FSYS1_QCH, "GATE_FSYS1_CMU_FSYS1", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GPIO_FSYS1, GPIO_FSYS1_QCH, "GATE_GPIO_FSYS1", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_PCIE0_MSTR, PCIE_QCH_PCIE0_MSTR, "GATE_PCIE_PCIE0_MSTR", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_PCIE_PCS, PCIE_QCH_PCIE_PCS, "GATE_PCIE_PCIE_PCS", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_PCIE_PHY, PCIE_QCH_PCIE_PHY, "GATE_PCIE_PCIE_PHY", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_PCIE0_DBI, PCIE_QCH_PCIE0_DBI, "GATE_PCIE_PCIE0_DBI", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_PCIE0_APB, PCIE_QCH_PCIE0_APB, "GATE_PCIE_PCIE0_APB", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - /* PCIE ref_clk don't have QCH */ - HWACG_VCLK(GATE_PCIE_PCIE_SOCPLL, PCIE_QCH_PCIE_SOCPLL, "GATE_PCIE_PCIE_SOCPLL", "UMUX_CLKCMU_FSYS1_PCIE", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_PCIE1_MSTR, PCIE_QCH_PCIE1_MSTR, "GATE_PCIE_PCIE1_MSTR", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_PCIE1_DBI, PCIE_QCH_PCIE1_DBI, "GATE_PCIE_PCIE1_DBI", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_PCIE1_APB, PCIE_QCH_PCIE1_APB, "GATE_PCIE_PCIE1_APB", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_FSYS1, PMU_FSYS1_QCH, "GATE_PMU_FSYS1", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_FSYS1, BCM_FSYS1_QCH, "GATE_BCM_FSYS1", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, "GATE_BCM_FSYS1"), - HWACG_VCLK(GATE_RTIC, RTIC_QCH, "GATE_RTIC", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SSS, SSS_QCH, "GATE_SSS", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_FSYS1, SYSREG_FSYS1_QCH, "GATE_SYSREG_FSYS1", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TOE_WIFI0, TOE_WIFI0_QCH, "GATE_TOE_WIFI0", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TOE_WIFI1, TOE_WIFI1_QCH, "GATE_TOE_WIFI1", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_CARD_FMP, UFS_CARD_QCH_FMP, "GATE_UFS_CARD_FMP", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MMC_CARD, MMC_CARD_QCH, "GATE_MMC_CARD", "UMUX_CLKCMU_FSYS1_MMC_CARD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_CARD, UFS_CARD_QCH, "GATE_UFS_CARD", "UMUX_CLKCMU_FSYS1_UFS_CARD", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_g2d_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_G2D_JPEG, MUX_CLKCMU_G2D_JPEG_USER, "UMUX_CLKCMU_G2D_JPEG", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_G2D_G2D, MUX_CLKCMU_G2D_G2D_USER, "UMUX_CLKCMU_G2D_G2D", "UMUX_CLKCMU_G2D_JPEG", 0, 0, NULL), - - HWACG_VCLK(GATE_BTM_G2DD0, BTM_G2DD0_QCH, "GATE_BTM_G2DD0", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BTM_G2DD1, BTM_G2DD1_QCH, "GATE_BTM_G2DD1", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_G2D, G2D_QCH, "GATE_G2D", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_G2D_CMU_G2D, G2D_CMU_G2D_QCH, "GATE_G2D_CMU_G2D", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_G2D, PMU_G2D_QCH, "GATE_PMU_G2D", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_G2DD0, BCM_G2DD0_QCH, "GATE_BCM_G2DD0", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, "GATE_BCM_G2D0"), - HWACG_VCLK(GATE_BCM_G2DD1, BCM_G2DD1_QCH, "GATE_BCM_G2DD1", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, "GATE_BCM_G2D1"), - HWACG_VCLK(GATE_SMMU_G2DD0, SMMU_G2DD0_QCH, "GATE_SMMU_G2DD0", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_G2DD1, SMMU_G2DD1_QCH, "GATE_SMMU_G2DD1", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_G2D, SYSREG_G2D_QCH, "GATE_SYSREG_G2D", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - - HWACG_VCLK(GATE_JPEG, JPEG_QCH, "GATE_JPEG", "UMUX_CLKCMU_G2D_JPEG", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_M2MSCALER, M2MSCALER_QCH, "GATE_M2MSCALER", "UMUX_CLKCMU_G2D_JPEG", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BTM_G2DD2, BTM_G2DD2_QCH, "GATE_BTM_G2DD2", "UMUX_CLKCMU_G2D_JPEG", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_QE_JPEG, QE_JPEG_QCH, "GATE_QE_JPEG", "UMUX_CLKCMU_G2D_JPEG", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_QE_M2MSCALER, QE_M2MSCALER_QCH, "GATE_QE_M2MSCALER", "UMUX_CLKCMU_G2D_JPEG", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_G2DD2, BCM_G2DD2_QCH, "GATE_BCM_G2DD2", "UMUX_CLKCMU_G2D_JPEG", 0, VCLK_GATE, "GATE_BCM_G2D2"), - HWACG_VCLK(GATE_SMMU_G2DD2, SMMU_G2DD2_QCH, "GATE_SMMU_G2DD2", "UMUX_CLKCMU_G2D_JPEG", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_g3d_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_AGPU_G3D, AGPU_QCH_G3D, "GATE_AGPU_G3D", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BUSIF_HPMG3D, BUSIF_HPMG3D_QCH, "GATE_BUSIF_HPMG3D", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_G3D_CMU_G3D, G3D_CMU_G3D_QCH, "GATE_G3D_CMU_G3D", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_G3D, PMU_G3D_QCH, "GATE_PMU_G3D", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_G3D, SYSREG_G3D_QCH, "GATE_SYSREG_G3D", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_imem_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_IMEM_BUS, MUX_CLKCMU_IMEM_BUS_USER, "UMUX_CLKCMU_IMEM_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IMEM_CMU_IMEM, IMEM_CMU_IMEM_QCH, "GATE_IMEM_CMU_IMEM", "UMUX_CLKCMU_IMEM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_INTMEM, INTMEM_QCH, "GATE_INTMEM", "UMUX_CLKCMU_IMEM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_IMEM, PMU_IMEM_QCH, "GATE_PMU_IMEM", "UMUX_CLKCMU_IMEM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_IMEM, SYSREG_IMEM_QCH, "GATE_SYSREG_IMEM", "UMUX_CLKCMU_IMEM_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_isphq_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_ISPHQ_BUS, MUX_CLKCMU_ISPHQ_BUS_USER, "UMUX_CLKCMU_ISPHQ_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_ISPHQ_CMU_ISPHQ, ISPHQ_CMU_ISPHQ_QCH, "GATE_ISPHQ_CMU_ISPHQ", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ISP_EWGEN_ISPHQ, ISP_EWGEN_ISPHQ_QCH, "GATE_ISP_EWGEN_ISPHQ", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPHQ_3AA, IS_ISPHQ_QCH_3AA, "GATE_IS_ISPHQ_3AA", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPHQ_ISPHQ, IS_ISPHQ_QCH_ISPHQ, "GATE_IS_ISPHQ_ISPHQ", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPHQ_QE_3AA, IS_ISPHQ_QCH_QE_3AA, "GATE_IS_ISPHQ_QE_3AA", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPHQ_QE_ISPHQ, IS_ISPHQ_QCH_QE_ISPHQ, "GATE_IS_ISPHQ_QE_ISPHQ", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_ISPHQ, PMU_ISPHQ_QCH, "GATE_PMU_ISPHQ", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_ISPHQ, SYSREG_ISPHQ_QCH, "GATE_SYSREG_ISPHQ", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_isplq_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_ISPLP_BUS, MUX_CLKCMU_ISPLP_BUS_USER, "UMUX_CLKCMU_ISPLP_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BTM_ISPLP, BTM_ISPLP_QCH, "GATE_BTM_ISPLP", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ISPLP_CMU_ISPLP, ISPLP_CMU_ISPLP_QCH, "GATE_ISPLP_CMU_ISPLP", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ISP_EWGEN_ISPLP, ISP_EWGEN_ISPLP_QCH, "GATE_ISP_EWGEN_ISPLP", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_3AAW, IS_ISPLP_QCH_3AAW, "GATE_IS_ISPLP_3AAW", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_ISPLP, IS_ISPLP_QCH_ISPLP, "GATE_IS_ISPLP_ISPLP", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_QE_3AAW, IS_ISPLP_QCH_QE_3AAW, "GATE_IS_ISPLP_QE_3AAW", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_QE_ISPLP, IS_ISPLP_QCH_QE_ISPLP, "GATE_IS_ISPLP_QE_ISPLP", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_SMMU_ISPLP, IS_ISPLP_QCH_SMMU_ISPLP, "GATE_IS_ISPLP_SMMU_ISPLP", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_BCM_ISPLP, IS_ISPLP_QCH_BCM_ISPLP, "GATE_IS_ISPLP_BCM_ISPLP", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, "GATE_BCM_ISPLP"), - HWACG_VCLK(GATE_PMU_ISPLP, PMU_ISPLP_QCH, "GATE_PMU_ISPLP", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_ISPLP, SYSREG_ISPLP_QCH, "GATE_SYSREG_ISPLP", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_iva_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_IVA_BUS, MUX_CLKCMU_IVA_BUS_USER, "UMUX_CLKCMU_IVA_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BTM_IVA, BTM_IVA_QCH, "GATE_BTM_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IVA, IVA_QCH, "GATE_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IVA_CMU_IVA, IVA_CMU_IVA_QCH, "GATE_IVA_CMU_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IVA_INTMEM, IVA_INTMEM_QCH, "GATE_IVA_INTMEM", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_IVA, PMU_IVA_QCH, "GATE_PMU_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_IVA, BCM_IVA_QCH, "GATE_BCM_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, "GATE_BCM_IVA"), - HWACG_VCLK(GATE_SMMU_IVA, SMMU_IVA_QCH, "GATE_SMMU_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_IVA, SYSREG_IVA_QCH, "GATE_SYSREG_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_mfc_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_MFC_BUS, MUX_CLKCMU_MFC_BUS_USER, "UMUX_CLKCMU_MFC_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BTM_MFCD0, BTM_MFCD0_QCH, "GATE_BTM_MFCD0", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BTM_MFCD1, BTM_MFCD1_QCH, "GATE_BTM_MFCD1", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MFC, MFC_QCH, "GATE_MFC", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MFC_CMU_MFC, MFC_CMU_MFC_QCH, "GATE_MFC_CMU_MFC", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_MFC, PMU_MFC_QCH, "GATE_PMU_MFC", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_MFCD0, BCM_MFCD0_QCH, "GATE_BCM_MFCD0", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, "GATE_BCM_MFC0"), - HWACG_VCLK(GATE_BCM_MFCD1, BCM_MFCD1_QCH, "GATE_BCM_MFCD1", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, "GATE_BCM_MFC1"), - HWACG_VCLK(GATE_SMMU_MFCD0, SMMU_MFCD0_QCH, "GATE_SMMU_MFCD0", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_MFCD1, SMMU_MFCD1_QCH, "GATE_SMMU_MFCD1", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_MFC, SYSREG_MFC_QCH, "GATE_SYSREG_MFC", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_peric0_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_PERIC0_BUS, MUX_CLKCMU_PERIC0_BUS_USER, "UMUX_CLKCMU_PERIC0_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC0_UART_DBG, MUX_CLKCMU_PERIC0_UART_DBG_USER, "UMUX_CLKCMU_PERIC0_UART_DBG", "UMUX_CLKCMU_PERIC0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC0_USI00, MUX_CLKCMU_PERIC0_USI00_USER, "UMUX_CLKCMU_PERIC0_USI00", "UMUX_CLKCMU_PERIC0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC0_USI01, MUX_CLKCMU_PERIC0_USI01_USER, "UMUX_CLKCMU_PERIC0_USI01", "UMUX_CLKCMU_PERIC0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC0_USI02, MUX_CLKCMU_PERIC0_USI02_USER, "UMUX_CLKCMU_PERIC0_USI02", "UMUX_CLKCMU_PERIC0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC0_USI03, MUX_CLKCMU_PERIC0_USI03_USER, "UMUX_CLKCMU_PERIC0_USI03", "UMUX_CLKCMU_PERIC0_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_GPIO_PERIC0, GPIO_PERIC0_QCH, "GATE_GPIO_PERIC0", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PERIC0_CMU_PERIC0, PERIC0_CMU_PERIC0_QCH, "GATE_PERIC0_CMU_PERIC0", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_PERIC0, PMU_PERIC0_QCH, "GATE_PMU_PERIC0", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PWM, PWM_QCH, "GATE_PWM", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY2_TSP, SPEEDY2_TSP_QCH, "GATE_SPEEDY2_TSP", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_PERIC0, SYSREG_PERIC0_QCH, "GATE_SYSREG_PERIC0", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UART_DBG, UART_DBG_QCH, "GATE_UART_DBG", "UMUX_CLKCMU_PERIC0_UART_DBG", 0, VCLK_GATE, "console-pclk0"), - HWACG_VCLK(GATE_USI00, USI00_QCH, "GATE_USI00", "UMUX_CLKCMU_PERIC0_USI00", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI01, USI01_QCH, "GATE_USI01", "UMUX_CLKCMU_PERIC0_USI01", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI02, USI02_QCH, "GATE_USI02", "UMUX_CLKCMU_PERIC0_USI02", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI03, USI03_QCH, "GATE_USI03", "UMUX_CLKCMU_PERIC0_USI03", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), -}; - -struct init_vclk exynos8895_peric1_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_PERIC1_BUS, MUX_CLKCMU_PERIC1_BUS_USER, "UMUX_CLKCMU_PERIC1_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_UART_BT, MUX_CLKCMU_PERIC1_UART_BT_USER, "UMUX_CLKCMU_PERIC1_UART_BT", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_USI04, MUX_CLKCMU_PERIC1_USI04_USER, "UMUX_CLKCMU_PERIC1_USI04", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_USI05, MUX_CLKCMU_PERIC1_USI05_USER, "UMUX_CLKCMU_PERIC1_USI05", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_USI06, MUX_CLKCMU_PERIC1_USI06_USER, "UMUX_CLKCMU_PERIC1_USI06", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_USI07, MUX_CLKCMU_PERIC1_USI07_USER, "UMUX_CLKCMU_PERIC1_USI07", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_USI08, MUX_CLKCMU_PERIC1_USI08_USER, "UMUX_CLKCMU_PERIC1_USI08", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_USI09, MUX_CLKCMU_PERIC1_USI09_USER, "UMUX_CLKCMU_PERIC1_USI09", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_USI10, MUX_CLKCMU_PERIC1_USI10_USER, "UMUX_CLKCMU_PERIC1_USI10", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_USI11, MUX_CLKCMU_PERIC1_USI11_USER, "UMUX_CLKCMU_PERIC1_USI11", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_USI12, MUX_CLKCMU_PERIC1_USI12_USER, "UMUX_CLKCMU_PERIC1_USI12", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_USI13, MUX_CLKCMU_PERIC1_USI13_USER, "UMUX_CLKCMU_PERIC1_USI13", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_SPI_CAM0, MUX_CLKCMU_PERIC1_SPI_CAM0_USER, "UMUX_CLKCMU_PERIC1_SPI_CAM0", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_SPI_CAM1, MUX_CLKCMU_PERIC1_SPI_CAM1_USER, "UMUX_CLKCMU_PERIC1_SPI_CAM1", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_SPEEDY2, MUX_CLKCMU_PERIC1_SPEEDY2_USER, "UMUX_CLKCMU_PERIC1_SPEEDY2", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_GPIO_PERIC1, GPIO_PERIC1_QCH, "GATE_GPIO_PERIC1", "UMUX_CLKCMU_PERIC1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_HSI2C_CAM0, HSI2C_CAM0_QCH, "GATE_HSI2C_CAM0", "UMUX_CLKCMU_PERIC1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_HSI2C_CAM1, HSI2C_CAM1_QCH, "GATE_HSI2C_CAM1", "UMUX_CLKCMU_PERIC1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_HSI2C_CAM2, HSI2C_CAM2_QCH, "GATE_HSI2C_CAM2", "UMUX_CLKCMU_PERIC1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_HSI2C_CAM3, HSI2C_CAM3_QCH, "GATE_HSI2C_CAM3", "UMUX_CLKCMU_PERIC1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PERIC1_CMU_PERIC1, PERIC1_CMU_PERIC1_QCH, "GATE_PERIC1_CMU_PERIC1", "UMUX_CLKCMU_PERIC1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_PERIC1, PMU_PERIC1_QCH, "GATE_PMU_PERIC1", "UMUX_CLKCMU_PERIC1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY2_TSP1, SPEEDY2_TSP1_QCH, "GATE_SPEEDY2_TSP1", "UMUX_CLKCMU_PERIC1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY2_TSP2, SPEEDY2_TSP2_QCH, "GATE_SPEEDY2_TSP2", "UMUX_CLKCMU_PERIC1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_PERIC1, SYSREG_PERIC1_QCH, "GATE_SYSREG_PERIC1", "UMUX_CLKCMU_PERIC1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UART_BT, UART_BT_QCH, "GATE_UART_BT", "UMUX_CLKCMU_PERIC1_UART_BT", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI04, USI04_QCH, "GATE_USI04", "UMUX_CLKCMU_PERIC1_USI04", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI05, USI05_QCH, "GATE_USI05", "UMUX_CLKCMU_PERIC1_USI05", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI06, USI06_QCH, "GATE_USI06", "UMUX_CLKCMU_PERIC1_USI06", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI07, USI07_QCH, "GATE_USI07", "UMUX_CLKCMU_PERIC1_USI07", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI08, USI08_QCH, "GATE_USI08", "UMUX_CLKCMU_PERIC1_USI08", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI09, USI09_QCH, "GATE_USI09", "UMUX_CLKCMU_PERIC1_USI09", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI10, USI10_QCH, "GATE_USI10", "UMUX_CLKCMU_PERIC1_USI10", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI11, USI11_QCH, "GATE_USI11", "UMUX_CLKCMU_PERIC1_USI11", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI12, USI12_QCH, "GATE_USI12", "UMUX_CLKCMU_PERIC1_USI12", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_USI13, USI13_QCH, "GATE_USI13", "UMUX_CLKCMU_PERIC1_USI13", 0, VCLK_GATE | VCLK_QCH_DIS, NULL), - HWACG_VCLK(GATE_SPI_CAM0, SPI_CAM0_QCH, "GATE_SPI_CAM0", "UMUX_CLKCMU_PERIC1_SPI_CAM0", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPI_CAM1, SPI_CAM1_QCH, "GATE_SPI_CAM1", "UMUX_CLKCMU_PERIC1_SPI_CAM1", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY2_DDI, SPEEDY2_DDI_QCH, "GATE_SPEEDY2_DDI", "UMUX_CLKCMU_PERIC1_SPEEDY2", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY2_DDI1, SPEEDY2_DDI1_QCH, "GATE_SPEEDY2_DDI1", "UMUX_CLKCMU_PERIC1_SPEEDY2", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY2_DDI2, SPEEDY2_DDI2_QCH, "GATE_SPEEDY2_DDI2", "UMUX_CLKCMU_PERIC1_SPEEDY2", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_peris_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_PERIS_BUS, MUX_CLKCMU_PERIS_BUS_USER, "UMUX_CLKCMU_PERIS_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BUSIF_TMU, BUSIF_TMU_QCH, "GATE_BUSIF_TMU", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GIC, GIC_QCH, "GATE_GIC", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MCT, MCT_QCH, "GATE_MCT", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_OTP_CON_BIRA, OTP_CON_BIRA_QCH, "GATE_OTP_CON_BIRA", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_OTP_CON_TOP, OTP_CON_TOP_QCH, "GATE_OTP_CON_TOP", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PERIS_CMU_PERIS, PERIS_CMU_PERIS_QCH, "GATE_PERIS_CMU_PERIS", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_PERIS, PMU_PERIS_QCH, "GATE_PMU_PERIS", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_PERIS, SYSREG_PERIS_QCH, "GATE_SYSREG_PERIS", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC00, TZPC00_QCH, "GATE_TZPC00", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC01, TZPC01_QCH, "GATE_TZPC01", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC02, TZPC02_QCH, "GATE_TZPC02", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC03, TZPC03_QCH, "GATE_TZPC03", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC04, TZPC04_QCH, "GATE_TZPC04", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC05, TZPC05_QCH, "GATE_TZPC05", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC06, TZPC06_QCH, "GATE_TZPC06", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC07, TZPC07_QCH, "GATE_TZPC07", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC08, TZPC08_QCH, "GATE_TZPC08", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC09, TZPC09_QCH, "GATE_TZPC09", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC10, TZPC10_QCH, "GATE_TZPC10", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC11, TZPC11_QCH, "GATE_TZPC11", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC12, TZPC12_QCH, "GATE_TZPC12", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC13, TZPC13_QCH, "GATE_TZPC13", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC14, TZPC14_QCH, "GATE_TZPC14", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TZPC15, TZPC15_QCH, "GATE_TZPC15", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_CLUSTER0, WDT_CLUSTER0_QCH, "GATE_WDT_CLUSTER0", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_CLUSTER1, WDT_CLUSTER1_QCH, "GATE_WDT_CLUSTER1", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_srdz_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_SRDZ_BUS, MUX_CLKCMU_SRDZ_BUS_USER, "UMUX_CLKCMU_SRDZ_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_SRDZ_IMGD, MUX_CLKCMU_SRDZ_IMGD_USER, "UMUX_CLKCMU_SRDZ_IMGD", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BTM_SRDZ, BTM_SRDZ_QCH, "GATE_BTM_SRDZ", "UMUX_CLKCMU_SRDZ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_SRDZ, PMU_SRDZ_QCH, "GATE_PMU_SRDZ", "UMUX_CLKCMU_SRDZ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_SRDZ, BCM_SRDZ_QCH, "GATE_BCM_SRDZ", "UMUX_CLKCMU_SRDZ_BUS", 0, VCLK_GATE, "GATE_BCM_SRDZ"), - HWACG_VCLK(GATE_SMMU_SRDZ, SMMU_SRDZ_QCH, "GATE_SMMU_SRDZ", "UMUX_CLKCMU_SRDZ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SRDZ, SRDZ_QCH, "GATE_SRDZ", "UMUX_CLKCMU_SRDZ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SRDZ_CMU_SRDZ, SRDZ_CMU_SRDZ_QCH, "GATE_SRDZ_CMU_SRDZ", "UMUX_CLKCMU_SRDZ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_SRDZ, SYSREG_SRDZ_QCH, "GATE_SYSREG_SRDZ", "UMUX_CLKCMU_SRDZ_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_vpu_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_VPU_BUS, MUX_CLKCMU_VPU_BUS_USER, "UMUX_CLKCMU_VPU_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BTM_VPU, BTM_VPU_QCH, "GATE_BTM_VPU", "UMUX_CLKCMU_VPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PMU_VPU, PMU_VPU_QCH, "GATE_PMU_VPU", "UMUX_CLKCMU_VPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_BCM_VPU, BCM_VPU_QCH, "GATE_BCM_VPU", "UMUX_CLKCMU_VPU_BUS", 0, VCLK_GATE, "GATE_BCM_VPU"), - HWACG_VCLK(GATE_SMMU_VPU, SMMU_VPU_QCH, "GATE_SMMU_VPU", "UMUX_CLKCMU_VPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_VPU, SYSREG_VPU_QCH, "GATE_SYSREG_VPU", "UMUX_CLKCMU_VPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_VPU, VPU_QCH, "GATE_VPU", "UMUX_CLKCMU_VPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_VPU_CMU_VPU, VPU_CMU_VPU_QCH, "GATE_VPU_CMU_VPU", "UMUX_CLKCMU_VPU_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos8895_vts_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_OSC_VTS, OSC_VTS, "GATE_OSC_VTS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_CMU_VTS_CMUREF, CMU_VTS_CMUREF_QCH, "GATE_CMU_VTS_CMUREF", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DMIC_AHB, DMIC_AHB_QCH_PCLK, "GATE_DMIC_AHB", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DMIC_AHB_HCLK, DMIC_AHB_QCH_HCLK, "GATE_DMIC_AHB_HCLK", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DMIC_IF, DMIC_IF_QCH_PCLK, "GATE_DMIC_IF", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DMIC_IF_DMIC_CLK, DMIC_IF_QCH_DMIC_CLK, "GATE_DMIC_IF_DMIC_CLK", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GPIO_VTS, GPIO_VTS_QCH, "GATE_GPIO_VTS", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_VTS2AP, MAILBOX_VTS2AP_QCH, "GATE_MAILBOX_VTS2AP", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_VTS, SYSREG_VTS_QCH, "GATE_SYSREG_VTS", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_VTS_CPU, VTS_QCH_CPU, "GATE_VTS_CPU", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_VTS_SYS, VTS_QCH_SYS, "GATE_VTS_SYS", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_VTS_SYS_DMIC, VTS_QCH_SYS_DMIC, "GATE_VTS_SYS_DMIC", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_VTS_CMU_VTS, VTS_CMU_VTS_QCH, "GATE_VTS_CMU_VTS", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_VTS, WDT_VTS_QCH, "GATE_WDT_VTS", "GATE_OSC_VTS", 0, VCLK_GATE, NULL), -}; - -static struct init_vclk exynos8895_clkout_vclks[] __initdata = { - VCLK(OSCCLK_NFC, VCLK_CLKOUT1, "OSCCLK_NFC", 0, 0, NULL), - VCLK(OSCCLK_AUD, VCLK_CLKOUT0, "OSCCLK_AUD", 0, 0, NULL), -}; - -/* Special VCLK */ -struct init_vclk exynos8895_abox_vclks[] __initdata = { - VCLK(ABOX_CPU_PCLKDBG, VCLK_SPL_CLK_ABOX_CPU_PCLKDBG_BLK_ABOX, "ABOX_CPU_PCLKDBG", 0, 0, NULL), - VCLK(ABOX_UAIF0, VCLK_SPL_CLK_ABOX_UAIF0_BLK_ABOX, "ABOX_UAIF0", 0, 0, NULL), - VCLK(ABOX_UAIF1, VCLK_SPL_CLK_ABOX_UAIF1_BLK_ABOX, "ABOX_UAIF1", 0, 0, NULL), - VCLK(ABOX_UAIF2, VCLK_SPL_CLK_ABOX_UAIF2_BLK_ABOX, "ABOX_UAIF2", 0, 0, NULL), - VCLK(ABOX_UAIF3, VCLK_SPL_CLK_ABOX_UAIF3_BLK_ABOX, "ABOX_UAIF3", 0, 0, NULL), - VCLK(ABOX_UAIF4, VCLK_SPL_CLK_ABOX_UAIF4_BLK_ABOX, "ABOX_UAIF4", 0, 0, NULL), - VCLK(ABOX_CPU_ACLK, VCLK_SPL_CLK_ABOX_CPU_ACLK_BLK_ABOX, "ABOX_CPU_ACLK", 0, 0, NULL), - VCLK(ABOX_DMIC, VCLK_DIV_CLK_ABOX_DMIC_BLK_ABOX, "ABOX_DMIC", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_AUDIF, DIV_CLK_ABOX_AUDIF, "DOUT_CLK_ABOX_AUDIF", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_DSIF, DIV_CLK_ABOX_DSIF, "DOUT_CLK_ABOX_DSIF", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_DMIC, DIV_CLK_ABOX_DMIC, "DOUT_CLK_ABOX_DMIC", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF0, DIV_CLK_ABOX_UAIF0, "DOUT_CLK_ABOX_UAIF0", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF1, DIV_CLK_ABOX_UAIF1, "DOUT_CLK_ABOX_UAIF1", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF2, DIV_CLK_ABOX_UAIF2, "DOUT_CLK_ABOX_UAIF2", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF3, DIV_CLK_ABOX_UAIF3, "DOUT_CLK_ABOX_UAIF3", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF4, DIV_CLK_ABOX_UAIF4, "DOUT_CLK_ABOX_UAIF4", 0, 0, NULL), - VCLK(PLL_OUT_AUD, PLL_AUD, "PLL_OUT_AUD", 0, 0, NULL), -}; - -struct init_vclk exynos8895_fsys0_vclks[] __initdata = { - VCLK(MMC_EMBD, VCLK_SPL_CLK_FSYS0_MMC_EMBD_BLK_CMU, "MMC_EMBD", 0, 0, NULL), - VCLK(DPGTC, VCLK_SPL_CLK_FSYS0_DPGTC_BLK_CMU, "DPGTC", 0, 0, NULL), - VCLK(UFS_EMBD, VCLK_SPL_CLK_FSYS0_UFS_EMBD_BLK_CMU, "UFS_EMBD", 0, 0, NULL), - VCLK(USBDRD30, VCLK_SPL_CLK_FSYS0_USBDRD30_BLK_CMU, "USBDRD30", 0, 0, NULL), -}; - -struct init_vclk exynos8895_fsys1_vclks[] __initdata = { - VCLK(MMC_CARD, VCLK_SPL_CLK_FSYS1_MMC_CARD_BLK_CMU, "MMC_CARD", 0, 0, NULL), - VCLK(UFS_CARD, VCLK_SPL_CLK_FSYS1_UFS_CARD_BLK_CMU, "UFS_CARD", 0, 0, NULL), - VCLK(PCIE, VCLK_OCC_CLK_FSYS1_PCIE_BLK_CMU, "PCIE", 0, 0, NULL), -}; - -struct init_vclk exynos8895_peric0_vclks[] __initdata = { - VCLK(UART_DBG, VCLK_SPL_CLK_PERIC0_UART_DBG_BLK_CMU, "UART_DBG", 0, 0, "console-sclk0"), - VCLK(USI00, VCLK_SPL_CLK_PERIC0_USI00_BLK_CMU, "USI00", 0, 0, NULL), - VCLK(USI01, VCLK_SPL_CLK_PERIC0_USI01_BLK_CMU, "USI01", 0, 0, NULL), - VCLK(USI02, VCLK_SPL_CLK_PERIC0_USI02_BLK_CMU, "USI02", 0, 0, NULL), - VCLK(USI03, VCLK_SPL_CLK_PERIC0_USI03_BLK_CMU, "USI03", 0, 0, NULL), -}; - -struct init_vclk exynos8895_peric1_vclks[] __initdata = { - VCLK(SPI_CAM0, VCLK_SPL_CLK_PERIC1_SPI_CAM0_BLK_CMU, "SPI_CAM0", 0, 0, NULL), - VCLK(SPI_CAM1, VCLK_SPL_CLK_PERIC1_SPI_CAM1_BLK_CMU, "SPI_CAM1", 0, 0, NULL), - VCLK(UART_BT, VCLK_SPL_CLK_PERIC1_UART_BT_BLK_CMU, "UART_BT", 0, 0, NULL), - VCLK(USI04, VCLK_SPL_CLK_PERIC1_USI04_BLK_CMU, "USI04", 0, 0, NULL), - VCLK(USI05, VCLK_SPL_CLK_PERIC1_USI05_BLK_CMU, "USI05", 0, 0, NULL), - VCLK(USI06, VCLK_SPL_CLK_PERIC1_USI06_BLK_CMU, "USI06", 0, 0, NULL), - VCLK(USI07, VCLK_SPL_CLK_PERIC1_USI07_BLK_CMU, "USI07", 0, 0, NULL), - VCLK(USI08, VCLK_SPL_CLK_PERIC1_USI08_BLK_CMU, "USI08", 0, 0, NULL), - VCLK(USI09, VCLK_SPL_CLK_PERIC1_USI09_BLK_CMU, "USI09", 0, 0, NULL), - VCLK(USI10, VCLK_SPL_CLK_PERIC1_USI10_BLK_CMU, "USI10", 0, 0, NULL), - VCLK(USI11, VCLK_SPL_CLK_PERIC1_USI11_BLK_CMU, "USI11", 0, 0, NULL), - VCLK(USI12, VCLK_SPL_CLK_PERIC1_USI12_BLK_CMU, "USI12", 0, 0, NULL), - VCLK(USI13, VCLK_SPL_CLK_PERIC1_USI13_BLK_CMU, "USI13", 0, 0, NULL), - VCLK(DOUT_CLKCMU_PERIC1_SPI_CAM0, CLKCMU_PERIC1_SPI_CAM0, "DOUT_CLKCMU_PERIC1_SPI_CAM0", 0, 0, NULL), - VCLK(DOUT_CLKCMU_PERIC1_SPI_CAM1, CLKCMU_PERIC1_SPI_CAM1, "DOUT_CLKCMU_PERIC1_SPI_CAM1", 0, 0, NULL), -}; - -struct init_vclk exynos8895_cmu_vclks[] __initdata = { - VCLK(CMU_CMUREF, VCLK_OCC_CMU_CMUREF_BLK_CMU, "CMU_CMUREF", 0, 0, NULL), - VCLK(HPM, VCLK_CLKCMU_HPM_BLK_CMU, "HPM", 0, 0, NULL), - VCLK(CIS_CLK0, VCLK_CLKCMU_CIS_CLK0_BLK_CMU, "CIS_CLK0", 0, 0, NULL), - VCLK(CIS_CLK1, VCLK_CLKCMU_CIS_CLK1_BLK_CMU, "CIS_CLK1", 0, 0, NULL), - VCLK(CIS_CLK2, VCLK_CLKCMU_CIS_CLK2_BLK_CMU, "CIS_CLK2", 0, 0, NULL), - VCLK(CIS_CLK3, VCLK_CLKCMU_CIS_CLK3_BLK_CMU, "CIS_CLK3", 0, 0, NULL), -}; - -struct init_vclk exynos8895_dpu1_vclks[] __initdata = { - VCLK(DECON2, VCLK_SPL_CLK_DPU1_DECON2_BLK_DPU1, "DECON2", 0, 0, NULL), -}; - -struct init_vclk exynos8895_vts_vclks[] __initdata = { - VCLK(DMIC, VCLK_DIV_CLK_VTS_DMIC_BLK_VTS, "DMIC", 0, 0, NULL), - VCLK(DOUT_CLK_VTS_DMICIF, DIV_CLK_VTS_DMICIF, "DOUT_CLK_VTS_DMICIF", 0, 0, NULL), - VCLK(DOUT_CLK_VTS_DMIC, DIV_CLK_VTS_DMIC, "DOUT_CLK_VTS_DMIC", 0, 0, NULL), - VCLK(DOUT_CLK_VTS_DMIC_DIV2, DIV_CLK_VTS_DMIC_DIV2, "DOUT_CLK_VTS_DMIC_DIV2", 0, 0, NULL), -}; - -struct init_vclk exynos8895_dvfs_vclks[] __initdata = { - VCLK(DFS_ABOX, VCLK_DFS_ABOX, "dfs_abox", 0, VCLK_DFS, NULL), -}; - -static __initdata struct of_device_id ext_clk_match[] = { - {.compatible = "samsung,exynos8895-oscclk", .data = (void *)0}, - {}, -}; - -void exynos8895_vclk_init(void) -{ - /* Common clock init */ - cal_clk_setrate(VCLK_BLK_BUS1, 266500); - cal_clk_setrate(VCLK_BLK_BUSC, 266500); - cal_clk_setrate(VCLK_BLK_CORE, 355333); - cal_clk_setrate(VCLK_BLK_ABOX, 1179648); - cal_clk_setrate(VCLK_BLK_CAM, 266500); - cal_clk_setrate(VCLK_BLK_DBG, 200000); - cal_clk_setrate(VCLK_BLK_DCAM, 222444); - cal_clk_setrate(VCLK_BLK_DPU0, 157500); - cal_clk_setrate(VCLK_BLK_DSP, 266500); - cal_clk_setrate(VCLK_BLK_G2D, 266500); - cal_clk_setrate(VCLK_BLK_ISPHQ, 266500); - cal_clk_setrate(VCLK_BLK_ISPLP, 266500); - cal_clk_setrate(VCLK_BLK_IVA, 266500); - cal_clk_setrate(VCLK_BLK_MFC, 166833); - cal_clk_setrate(VCLK_BLK_SRDZ, 266500); - cal_clk_setrate(VCLK_BLK_VPU, 266500); - cal_clk_setrate(VCLK_BLK_VTS, 49152); - - cal_clk_disable(GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_UAIF0); - cal_clk_disable(GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_UAIF1); - cal_clk_disable(GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_UAIF2); - cal_clk_disable(GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_UAIF3); - cal_clk_disable(GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_UAIF4); - cal_clk_disable(GOUT_BLK_ABOX_UID_ABOX_TOP_IPCLKPORT_BCLK_DSIF); -} - -/* register exynos8895 clocks */ -void __init exynos8895_clk_init(struct device_node *np) -{ - void __iomem *reg_base; - int ret; - - if (np) { - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - } else { - panic("%s: unable to determine soc\n", __func__); - } - - ret = cal_if_init(np); - if (ret) - panic("%s: unable to initialize cal-if\n", __func__); - - exynos8895_clk_provider = samsung_clk_init(np, reg_base, CLK_NR_CLKS); - if (!exynos8895_clk_provider) - panic("%s: unable to allocate context.\n", __func__); - - samsung_register_of_fixed_ext(exynos8895_clk_provider, exynos8895_fixed_rate_ext_clks, - ARRAY_SIZE(exynos8895_fixed_rate_ext_clks), - ext_clk_match); - /* register HWACG vclk */ - samsung_register_vclk(exynos8895_clk_provider, exynos8895_abox_hwacg_vclks, ARRAY_SIZE(exynos8895_abox_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_apm_hwacg_vclks, ARRAY_SIZE(exynos8895_apm_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_bus1_hwacg_vclks, ARRAY_SIZE(exynos8895_bus1_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_busc_hwacg_vclks, ARRAY_SIZE(exynos8895_busc_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_cam_hwacg_vclks, ARRAY_SIZE(exynos8895_cam_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_cmu_hwacg_vclks, ARRAY_SIZE(exynos8895_cmu_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_dcam_hwacg_vclks, ARRAY_SIZE(exynos8895_dcam_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_dpu0_hwacg_vclks, ARRAY_SIZE(exynos8895_dpu0_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_dpu1_hwacg_vclks, ARRAY_SIZE(exynos8895_dpu1_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_dsp_hwacg_vclks, ARRAY_SIZE(exynos8895_dsp_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_fsys0_hwacg_vclks, ARRAY_SIZE(exynos8895_fsys0_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_fsys1_hwacg_vclks, ARRAY_SIZE(exynos8895_fsys1_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_g2d_hwacg_vclks, ARRAY_SIZE(exynos8895_g2d_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_g3d_hwacg_vclks, ARRAY_SIZE(exynos8895_g3d_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_imem_hwacg_vclks, ARRAY_SIZE(exynos8895_imem_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_isphq_hwacg_vclks, ARRAY_SIZE(exynos8895_isphq_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_isplq_hwacg_vclks, ARRAY_SIZE(exynos8895_isplq_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_iva_hwacg_vclks, ARRAY_SIZE(exynos8895_iva_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_mfc_hwacg_vclks, ARRAY_SIZE(exynos8895_mfc_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_peric0_hwacg_vclks, ARRAY_SIZE(exynos8895_peric0_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_peric1_hwacg_vclks, ARRAY_SIZE(exynos8895_peric1_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_peris_hwacg_vclks, ARRAY_SIZE(exynos8895_peris_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_srdz_hwacg_vclks, ARRAY_SIZE(exynos8895_srdz_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_vpu_hwacg_vclks, ARRAY_SIZE(exynos8895_vpu_hwacg_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_vts_hwacg_vclks, ARRAY_SIZE(exynos8895_vts_hwacg_vclks)); - - /* register special vclk */ - samsung_register_vclk(exynos8895_clk_provider, exynos8895_cmu_vclks, ARRAY_SIZE(exynos8895_cmu_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_abox_vclks, ARRAY_SIZE(exynos8895_abox_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_fsys0_vclks, ARRAY_SIZE(exynos8895_fsys0_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_fsys1_vclks, ARRAY_SIZE(exynos8895_fsys1_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_peric0_vclks, ARRAY_SIZE(exynos8895_peric0_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_peric1_vclks, ARRAY_SIZE(exynos8895_peric1_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_dpu1_vclks, ARRAY_SIZE(exynos8895_dpu1_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_vts_vclks, ARRAY_SIZE(exynos8895_vts_vclks)); - samsung_register_vclk(exynos8895_clk_provider, exynos8895_clkout_vclks, ARRAY_SIZE(exynos8895_clkout_vclks)); - - /* register DVFS vclk */ - samsung_register_vclk(exynos8895_clk_provider, exynos8895_dvfs_vclks, ARRAY_SIZE(exynos8895_dvfs_vclks)); - - clk_register_fixed_factor(NULL, "pwm-clock", "fin_pll",CLK_SET_RATE_PARENT, 1, 1); - - samsung_clk_of_add_provider(np, exynos8895_clk_provider); - - late_time_init = exynos8895_vclk_init; - - pr_info("EXYNOS8895: Clock setup completed\n"); -} - -CLK_OF_DECLARE(exynos8895_clk, "samsung,exynos8895-clock", exynos8895_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos9610.c b/drivers/clk/samsung/samsung/clk-exynos9610.c deleted file mode 100644 index 3f165829a515..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos9610.c +++ /dev/null @@ -1,378 +0,0 @@ -/* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos9610 SoC. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "../../soc/samsung/cal-if/exynos9610/cmucal-vclk.h" -#include "../../soc/samsung/cal-if/exynos9610/cmucal-node.h" -#include "../../soc/samsung/cal-if/exynos9610/cmucal-qch.h" -#include "../../soc/samsung/cal-if/exynos9610/clkout_exynos9610.h" -#include "composite.h" - -static struct samsung_clk_provider *exynos9610_clk_provider; -/* - * list of controller registers to be saved and restored during a - * suspend/resume cycle. - */ -/* fixed rate clocks generated outside the soc */ -struct samsung_fixed_rate exynos9610_fixed_rate_ext_clks[] __initdata = { - FRATE(OSCCLK, "fin_pll", NULL, 0, 26000000), -}; - -/* HWACG VCLK */ -struct init_vclk exynos9610_apm_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_APM_BUS, MUX_CLKCMU_APM_BUS_USER, "UMUX_CLKCMU_APM_BUS", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GREBEINTEGRATION_QCH_GREBE, GREBEINTEGRATION_QCH_GREBE, "GATE_GREBEINTEGRATION_QCH_GREBE", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GREBEINTEGRATION_QCH_DBG, GREBEINTEGRATION_QCH_DBG, "GATE_GREBEINTEGRATION_QCH_DBG", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_INTMEM_QCH, INTMEM_QCH, "GATE_INTMEM_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2CP_QCH, MAILBOX_AP2CP_QCH, "GATE_MAILBOX_AP2CP_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2CP_S_QCH, MAILBOX_AP2CP_S_QCH, "GATE_MAILBOX_AP2CP_S_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2GNSS_QCH, MAILBOX_AP2GNSS_QCH, "GATE_MAILBOX_AP2GNSS_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2SHUB_QCH, MAILBOX_AP2SHUB_QCH, "GATE_MAILBOX_AP2SHUB_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2WLBT_QCH, MAILBOX_AP2WLBT_QCH, "GATE_MAILBOX_AP2WLBT_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2AP_QCH, MAILBOX_APM2AP_QCH, "GATE_MAILBOX_APM2AP_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2CP_QCH, MAILBOX_APM2CP_QCH, "GATE_MAILBOX_APM2CP_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2GNSS_QCH, MAILBOX_APM2GNSS_QCH, "GATE_MAILBOX_APM2GNSS_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2SHUB_QCH, MAILBOX_APM2SHUB_QCH, "GATE_MAILBOX_APM2SHUB_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2WLBT_QCH, MAILBOX_APM2WLBT_QCH, "GATE_MAILBOX_APM2WLBT_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_CP2GNSS_QCH, MAILBOX_CP2GNSS_QCH, "GATE_MAILBOX_CP2GNSS_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_CP2SHUB_QCH, MAILBOX_CP2SHUB_QCH, "GATE_MAILBOX_CP2SHUB_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_CP2WLBT_QCH, MAILBOX_CP2WLBT_QCH, "GATE_MAILBOX_CP2WLBT_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_SHUB2GNSS_QCH, MAILBOX_SHUB2GNSS_QCH, "GATE_MAILBOX_SHUB2GNSS_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_SHUB2WLBT_QCH, MAILBOX_SHUB2WLBT_QCH, "GATE_MAILBOX_SHUB2WLBT_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_WLBT2ABOX_QCH, MAILBOX_WLBT2ABOX_QCH, "GATE_MAILBOX_WLBT2ABOX_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_WLBT2GNSS_QCH, MAILBOX_WLBT2GNSS_QCH, "GATE_MAILBOX_WLBT2GNSS_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PEM_QCH, PEM_QCH, "GATE_PEM_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY_APM_QCH, SPEEDY_APM_QCH, "GATE_SPEEDY_APM_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSREG_APM_QCH, SYSREG_APM_QCH, "GATE_SYSREG_APM_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_APM_QCH, WDT_APM_QCH, "GATE_WDT_APM_QCH", "UMUX_CLKCMU_APM_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_cam_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_CAM_BUS, MUX_CLKCMU_CAM_BUS_USER, "UMUX_CLKCMU_CAM_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(GATE_IS6P10P0_CAM_QCH_S_CAM_CSIS0, IS6P10P0_CAM_QCH_S_CAM_CSIS0, "GATE_IS6P10P0_CAM_QCH_S_CAM_CSIS0", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_CAM_QCH_S_CAM_CSIS1, IS6P10P0_CAM_QCH_S_CAM_CSIS1, "GATE_IS6P10P0_CAM_QCH_S_CAM_CSIS1", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_CAM_QCH_S_CAM_CSIS2, IS6P10P0_CAM_QCH_S_CAM_CSIS2, "GATE_IS6P10P0_CAM_QCH_S_CAM_CSIS2", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_CAM_QCH_S_CAM_CSIS3, IS6P10P0_CAM_QCH_S_CAM_CSIS3, "GATE_IS6P10P0_CAM_QCH_S_CAM_CSIS3", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_CAM_QCH_S_CAM_3AA, IS6P10P0_CAM_QCH_S_CAM_3AA, "GATE_IS6P10P0_CAM_QCH_S_CAM_3AA", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_CAM_QCH_S_CAM_SMMU, IS6P10P0_CAM_QCH_S_CAM_SMMU, "GATE_IS6P10P0_CAM_QCH_S_CAM_SMMU", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_CAM_QCH_S_CAM_PDP_CORE, IS6P10P0_CAM_QCH_S_CAM_PDP_CORE, "GATE_IS6P10P0_CAM_QCH_S_CAM_PDP_CORE", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_CAM_QCH_S_CAM_PDP_DMA, IS6P10P0_CAM_QCH_S_CAM_PDP_DMA, "GATE_IS6P10P0_CAM_QCH_S_CAM_PDP_DMA", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_CAM_QCH_S_CAM_RDMA, IS6P10P0_CAM_QCH_S_CAM_RDMA, "GATE_IS6P10P0_CAM_QCH_S_CAM_RDMA", "UMUX_CLKCMU_CAM_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_cmgp_hwacg_vclks[] __initdata = { - HWACG_VCLK(MUX_CMGP_ADC, MUX_CLK_CMGP_ADC, "MUX_CMGP_ADC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(MUX_CMGP_I2C, MUX_CLK_CMGP_I2C, "MUX_CMGP_I2C", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(MUX_CMGP_USI00, MUX_CLK_CMGP_USI00, "MUX_CMGP_USI00", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(MUX_CMGP_USI01, MUX_CLK_CMGP_USI01, "MUX_CMGP_USI01", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(MUX_CMGP_USI02, MUX_CLK_CMGP_USI02, "MUX_CMGP_USI02", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(MUX_CMGP_USI03, MUX_CLK_CMGP_USI03, "MUX_CMGP_USI03", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(MUX_CMGP_USI04, MUX_CLK_CMGP_USI04, "MUX_CMGP_USI04", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ADC_CMGP_QCH_S0, ADC_CMGP_QCH_S0, "GATE_ADC_CMGP_QCH_S0", "MUX_CMGP_ADC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ADC_CMGP_QCH_S1, ADC_CMGP_QCH_S1, "GATE_ADC_CMGP_QCH_S1", "MUX_CMGP_ADC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ADC_CMGP_QCH_ADC, ADC_CMGP_QCH_ADC, "GATE_ADC_CMGP_QCH_ADC", "MUX_CMGP_ADC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP00_QCH, I2C_CMGP00_QCH, "GATE_I2C_CMGP00_QCH", "MUX_CMGP_I2C", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP01_QCH, I2C_CMGP01_QCH, "GATE_I2C_CMGP01_QCH", "MUX_CMGP_I2C", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP02_QCH, I2C_CMGP02_QCH, "GATE_I2C_CMGP02_QCH", "MUX_CMGP_I2C", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP03_QCH, I2C_CMGP03_QCH, "GATE_I2C_CMGP03_QCH", "MUX_CMGP_I2C", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP04_QCH, I2C_CMGP04_QCH, "GATE_I2C_CMGP04_QCH", "MUX_CMGP_I2C", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP00_QCH, USI_CMGP00_QCH, "GATE_USI_CMGP00_QCH", "MUX_CMGP_USI00", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP01_QCH, USI_CMGP01_QCH, "GATE_USI_CMGP01_QCH", "MUX_CMGP_USI01", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP02_QCH, USI_CMGP02_QCH, "GATE_USI_CMGP02_QCH", "MUX_CMGP_USI02", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP03_QCH, USI_CMGP03_QCH, "GATE_USI_CMGP03_QCH", "MUX_CMGP_USI03", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP04_QCH, USI_CMGP04_QCH, "GATE_USI_CMGP04_QCH", "MUX_CMGP_USI04", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_top_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_DFTMUX_TOP_QCH_CLK_CSIS0, DFTMUX_TOP_QCH_CLK_CSIS0, "GATE_DFTMUX_TOP_QCH_CLK_CSIS0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_QCH_CLK_CSIS1, DFTMUX_TOP_QCH_CLK_CSIS1, "GATE_DFTMUX_TOP_QCH_CLK_CSIS1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_QCH_CLK_CSIS2, DFTMUX_TOP_QCH_CLK_CSIS2, "GATE_DFTMUX_TOP_QCH_CLK_CSIS2", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_QCH_CLK_CSIS3, DFTMUX_TOP_QCH_CLK_CSIS3, "GATE_DFTMUX_TOP_QCH_CLK_CSIS3", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_OTP_QCH, OTP_QCH, "GATE_OTP_QCH", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_core_hwacg_vclks[] __initdata = { - HWACG_VCLK(MUX_CORE_GIC, MUX_CLK_CORE_GIC, "MUX_CORE_GIC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GIC400_AIHWACG_QCH, GIC400_AIHWACG_QCH, "GATE_GIC400_AIHWACG_QCH", "MUX_CORE_GIC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PDMA_CORE_QCH, PDMA_CORE_QCH, "GATE_PDMA_CORE_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PPFW_CORE_MEM0_QCH, PPFW_CORE_MEM0_QCH, "GATE_PPFW_CORE_MEM0_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PPFW_CORE_MEM1_QCH, PPFW_CORE_MEM1_QCH, "GATE_PPFW_CORE_MEM1_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PPFW_CORE_PERI_QCH, PPFW_CORE_PERI_QCH, "GATE_PPFW_CORE_PERI_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SIREX_QCH, SIREX_QCH, "GATE_SIREX_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPDMA_CORE_QCH, SPDMA_CORE_QCH, "GATE_SPDMA_CORE_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_D_CORE_QCH, TREX_D_CORE_QCH, "GATE_TREX_D_CORE_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_D_NRT_QCH, TREX_D_NRT_QCH, "GATE_TREX_D_NRT_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_P_CORE_QCH, TREX_P_CORE_QCH, "GATE_TREX_P_CORE_QCH", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_dispaud_hwacg_vclks[] __initdata = { - HWACG_VCLK(MUX_AUD_FM, MUX_CLK_AUD_FM, "MUX_AUD_FM", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_DISPAUD_BUS, MUX_CLKCMU_DISPAUD_DISP_USER, "MUX_CLKCMU_DISPAUD_DISP_USER", NULL, 0, 0, NULL), - HWACG_VCLK(GATE_ABOX_QCH_CPU, ABOX_QCH_CPU, "GATE_ABOX_QCH_CPU", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_QCH_S_ACLK, ABOX_QCH_S_ACLK, "GATE_ABOX_QCH_S_ACLK", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_QCH_S_BCLK0, ABOX_QCH_S_BCLK0, "GATE_ABOX_QCH_S_BCLK0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_QCH_S_BCLK2, ABOX_QCH_S_BCLK2, "GATE_ABOX_QCH_S_BCLK2", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_QCH_S_BCLK1, ABOX_QCH_S_BCLK1, "GATE_ABOX_QCH_S_BCLK1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_QCH_FM, ABOX_QCH_FM, "GATE_ABOX_QCH_FM", "MUX_AUD_FM", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_QCH_S_BCLK_DSIF, ABOX_QCH_S_BCLK_DSIF, "GATE_ABOX_QCH_S_BCLK_DSIF", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU_QCH_S_DPP, DPU_QCH_S_DPP, "GATE_DPU_QCH_S_DPP", "MUX_CLKCMU_DISPAUD_DISP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU_QCH_S_DMA, DPU_QCH_S_DMA, "GATE_DPU_QCH_S_DMA", "MUX_CLKCMU_DISPAUD_DISP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU_QCH_S_DECON, DPU_QCH_S_DECON, "GATE_DPU_QCH_S_DECON", "MUX_CLKCMU_DISPAUD_DISP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_ABOX_QCH, SMMU_ABOX_QCH, "GATE_SMMU_ABOX_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_DPU_QCH, SMMU_DPU_QCH, "GATE_SMMU_DPU_QCH", "MUX_CLKCMU_DISPAUD_DISP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_AUD_QCH, WDT_AUD_QCH, "GATE_WDT_AUD_QCH", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_fsys_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_FSYS_BUS, MUX_CLKCMU_FSYS_BUS_USER, "MUX_CLKCMU_FSYS_BUS_USER", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS_MMC_EMBD, MUX_CLKCMU_FSYS_MMC_EMBD_USER, "MUX_CLKCMU_FSYS_MMC_EMBD_USER", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS_MMC_CARD, MUX_CLKCMU_FSYS_MMC_CARD_USER, "MUX_CLKCMU_FSYS_MMC_CARD_USER", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS_UFS_EMBD, MUX_CLKCMU_FSYS_UFS_EMBD_USER, "MUX_CLKCMU_FSYS_UFS_EMBD_USER", NULL, 0, 0, NULL), - HWACG_VCLK(GATE_MMC_CARD_QCH, MMC_CARD_QCH, "GATE_MMC_CARD_QCH", "MUX_CLKCMU_FSYS_MMC_CARD_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MMC_EMBD_QCH, MMC_EMBD_QCH, "GATE_MMC_EMBD_QCH", "MUX_CLKCMU_FSYS_MMC_EMBD_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_RTIC_QCH, RTIC_QCH, "GATE_RTIC_QCH", "MUX_CLKCMU_FSYS_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SSS_QCH, SSS_QCH, "GATE_SSS_QCH", "MUX_CLKCMU_FSYS_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_EMBD_QCH_UFS, UFS_EMBD_QCH_UFS, "GATE_UFS_EMBD_QCH_UFS", "MUX_CLKCMU_FSYS_UFS_EMBD_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_EMBD_QCH_FMP, UFS_EMBD_QCH_FMP, "GATE_UFS_EMBD_QCH_FMP", "MUX_CLKCMU_FSYS_UFS_EMBD_USER", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_g2d_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_G2D_G2D, MUX_CLKCMU_G2D_G2D_USER, "MUX_CLKCMU_G2D_G2D_USER", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_G2D_MSCL, MUX_CLKCMU_G2D_MSCL_USER, "MUX_CLKCMU_G2D_MSCL_USER", NULL, 0, 0, NULL), - HWACG_VCLK(GATE_G2D_QCH, G2D_QCH, "GATE_G2D_QCH", "MUX_CLKCMU_G2D_G2D_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_JPEG_QCH, JPEG_QCH, "GATE_JPEG_QCH", "MUX_CLKCMU_G2D_MSCL_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MSCL_QCH, MSCL_QCH, "GATE_MSCL_QCH", "MUX_CLKCMU_G2D_MSCL_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_G2D_QCH, SYSMMU_G2D_QCH, "GATE_SYSMMU_G2D_QCH", "MUX_CLKCMU_G2D_G2D_USER", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_g3d_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_G3D_QCH, G3D_QCH, "GATE_G3D_QCH", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_isp_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_ISP_BUS, MUX_CLKCMU_ISP_BUS_USER, "MUX_CLKCMU_ISP_BUS_USER", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_ISP_GDC, MUX_CLKCMU_ISP_GDC_USER, "MUX_CLKCMU_ISP_GDC_USER", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_ISP_VRA, MUX_CLKCMU_ISP_VRA_USER, "MUX_CLKCMU_ISP_VRA_USER", NULL, 0, 0, NULL), - HWACG_VCLK(GATE_IS6P10P0_ISP_QCH_S_ISP_ISP, IS6P10P0_ISP_QCH_S_ISP_ISP, "GATE_IS6P10P0_ISP_QCH_S_ISP_ISP", "MUX_CLKCMU_ISP_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_ISP_QCH_S_ISP_MCSC, IS6P10P0_ISP_QCH_S_ISP_MCSC, "GATE_IS6P10P0_ISP_QCH_S_ISP_MCSC", "MUX_CLKCMU_ISP_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_ISP_QCH_S_ISP_VRA, IS6P10P0_ISP_QCH_S_ISP_VRA, "GATE_IS6P10P0_ISP_QCH_S_ISP_VRA", "MUX_CLKCMU_ISP_VRA_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_ISP_QCH_S_ISP_GDC, IS6P10P0_ISP_QCH_S_ISP_GDC, "GATE_IS6P10P0_ISP_QCH_S_ISP_GDC", "MUX_CLKCMU_ISP_GDC_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_ISP_QCH_S_ISP_SMMU_ISP0, IS6P10P0_ISP_QCH_S_ISP_SMMU_ISP0, "GATE_IS6P10P0_ISP_QCH_S_ISP_SMMU_ISP0", "MUX_CLKCMU_ISP_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS6P10P0_ISP_QCH_S_ISP_SMMU_ISP1, IS6P10P0_ISP_QCH_S_ISP_SMMU_ISP1, "GATE_IS6P10P0_ISP_QCH_S_ISP_SMMU_ISP1", "MUX_CLKCMU_ISP_BUS_USER", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_mfc_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_MFC_MFC, MUX_CLKCMU_MFC_MFC_USER, "MUX_CLKCMU_MFC_MFC_USER", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_MFC_WFD, MUX_CLKCMU_MFC_WFD_USER, "MUX_CLKCMU_MFC_WFD_USER", "MUX_CLKCMU_MFC_MFC_USER", 0, 0, NULL), - HWACG_VCLK(GATE_MFC_QCH, MFC_QCH, "GATE_MFC_QCH", "MUX_CLKCMU_MFC_MFC_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_MFCD0_QCH, SYSMMU_MFCD0_QCH, "GATE_SYSMMU_MFCD0_QCH", "MUX_CLKCMU_MFC_MFC_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_MFCD1_QCH, SYSMMU_MFCD1_QCH, "GATE_SYSMMU_MFCD1_QCH", "MUX_CLKCMU_MFC_MFC_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WFD_QCH, WFD_QCH, "GATE_WFD_QCH", "MUX_CLKCMU_MFC_WFD_USER", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_peri_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_PERI_UART, MUX_CLKCMU_PERI_UART_USER, "UMUX_CLKCMU_PERI_UART", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERI_BUS, MUX_CLKCMU_PERI_BUS_USER, "UMUX_CLKCMU_PERI_BUS", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_CAMI2C_0_QCH, CAMI2C_0_QCH, "GATE_CAMI2C_0_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_CAMI2C_1_QCH, CAMI2C_1_QCH, "GATE_CAMI2C_1_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_CAMI2C_2_QCH, CAMI2C_2_QCH, "GATE_CAMI2C_2_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_CAMI2C_3_QCH, CAMI2C_3_QCH, "GATE_CAMI2C_3_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_0_QCH, I2C_0_QCH, "GATE_I2C_0_QCH", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_1_QCH, I2C_1_QCH, "GATE_I2C_1_QCH", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_2_QCH, I2C_2_QCH, "GATE_I2C_2_QCH", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_3_QCH, I2C_3_QCH, "GATE_I2C_3_QCH", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_4_QCH, I2C_4_QCH, "GATE_I2C_4_QCH", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_5_QCH, I2C_5_QCH, "GATE_I2C_5_QCH", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_6_QCH, I2C_6_QCH, "GATE_I2C_6_QCH", "UMUX_CLKCMU_PERI_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MCT_QCH, MCT_QCH, "GATE_MCT_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_OTP_CON_TOP_QCH, OTP_CON_TOP_QCH, "GATE_OTP_CON_TOP_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PWM_MOTOR_QCH, PWM_MOTOR_QCH, "GATE_PWM_MOTOR_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPI_0_QCH, SPI_0_QCH, "GATE_SPI_0_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPI_1_QCH, SPI_1_QCH, "GATE_SPI_1_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPI_2_QCH, SPI_2_QCH, "GATE_SPI_2_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UART_QCH, UART_QCH, "GATE_UART_QCH", "UMUX_CLKCMU_PERI_UART", 0, 0, "console-pclk0"), - HWACG_VCLK(GATE_USI00_I2C_QCH, USI00_I2C_QCH, "GATE_USI00_I2C_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI00_USI_QCH, USI00_USI_QCH, "GATE_USI00_USI_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_CLUSTER0_QCH, WDT_CLUSTER0_QCH, "GATE_WDT_CLUSTER0_QCH", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_CLUSTER1_QCH, WDT_CLUSTER1_QCH, "GATE_WDT_CLUSTER1_QCH", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_shub_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_SHUB_BUS, MUX_CLKCMU_SHUB_BUS_USER, "MUX_CLKCMU_SHUB_BUS_USER", NULL, 0, 0, NULL), - HWACG_VCLK(MUX_SHUB_I2C, MUX_CLK_SHUB_I2C, "MUX_SHUB_I2C", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(MUX_SHUB_USI00, MUX_CLK_SHUB_USI00, "MUX_SHUB_USI00", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(MUX_SHUB_USI01, MUX_CLK_SHUB_USI01, "MUX_SHUB_USI01", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_CM4_SHUB_QCH, CM4_SHUB_QCH, "GATE_CM4_SHUB_QCH", "MUX_CLKCMU_SHUB_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_SHUB00_QCH, I2C_SHUB00_QCH, "GATE_I2C_SHUB00_QCH", "MUX_SHUB_I2C", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PDMA_SHUB_QCH, PDMA_SHUB_QCH, "GATE_PDMA_SHUB_QCH", "MUX_CLKCMU_SHUB_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PWM_SHUB_QCH, PWM_SHUB_QCH, "GATE_PWM_SHUB_QCH", "MUX_CLKCMU_SHUB_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TIMER_SHUB_QCH, TIMER_SHUB_QCH, "GATE_TIMER_SHUB_QCH", "MUX_CLKCMU_SHUB_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_SHUB00_QCH, USI_SHUB00_QCH, "GATE_USI_SHUB00_QCH", "MUX_SHUB_USI00", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_SHUB_QCH, WDT_SHUB_QCH, "GATE_WDT_SHUB_QCH", "MUX_CLKCMU_SHUB_BUS_USER", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_usb_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_USB_USBDRD30, MUX_CLKCMU_USB_USB30DRD, "MUX_CLKCMU_USB_USB30DRD", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_USB_DPGTC, MUX_CLKCMU_USB_DPGTC, "MUX_CLKCMU_USB_DPGTC", NULL, 0, 0, NULL), - HWACG_VCLK(GATE_DP_LINK_QCH_DP, DP_LINK_QCH_DP, "GATE_DP_LINK_QCH_DP", "MUX_CLKCMU_USB_DPGTC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DP_LINK_QCH_GTC, DP_LINK_QCH_GTC, "GATE_DP_LINK_QCH_GTC", "MUX_CLKCMU_USB_DPGTC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_QCH_USB30, USB30DRD_QCH_USB30, "GATE_USB30DRD_QCH_USB30", "MUX_CLKCMU_USB_USB30DRD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_QCH_USBPHY_30CTRL_0, USB30DRD_QCH_USBPHY_30CTRL_0, "GATE_USB30DRD_QCH_USBPHY_30CTRL_0", "MUX_CLKCMU_USB_USB30DRD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_QCH_USBPHY_30CTRL_1, USB30DRD_QCH_USBPHY_30CTRL_1, "GATE_USB30DRD_QCH_USBPHY_30CTRL_1", "MUX_CLKCMU_USB_USB30DRD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_QCH_USBPHY_20CTRL, USB30DRD_QCH_USBPHY_20CTRL, "GATE_USB30DRD_QCH_USBPHY_20CTRL", "MUX_CLKCMU_USB_USB30DRD", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_vipx1_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_VIPX1_BUS, MUX_CLKCMU_VIPX1_BUS_USER, "MUX_CLKCMU_VIPX1_BUS_USER", NULL, 0, 0, NULL), - HWACG_VCLK(GATE_SMMU_D_VIPX1_QCH, SMMU_D_VIPX1_QCH, "GATE_SMMU_D_VIPX1_QCH", "MUX_CLKCMU_VIPX1_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_VIPX1_QCH, VIPX1_QCH, "GATE_VIPX1_QCH", "MUX_CLKCMU_VIPX1_BUS_USER", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9610_vipx2_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_VIPX2_BUS, MUX_CLKCMU_VIPX2_BUS_USER, "MUX_CLKCMU_VIPX2_BUS_USER", NULL, 0, 0, NULL), - HWACG_VCLK(GATE_SMMU_D_VIPX2_QCH, SMMU_D_VIPX2_QCH, "GATE_SMMU_D_VIPX2_QCH", "MUX_CLKCMU_VIPX2_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_VIPX2_QCH, VIPX2_QCH, "GATE_VIPX2_QCH", "MUX_CLKCMU_VIPX2_BUS_USER", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_VIPX2_QCH_LOCAL, VIPX2_QCH_LOCAL, "GATE_VIPX2_QCH_LOCAL", "MUX_CLKCMU_VIPX2_BUS_USER", 0, VCLK_GATE, NULL), -}; - -/* Special VCLK */ -struct init_vclk exynos9610_dispaud_vclks[] __initdata = { - VCLK(DOUT_CLK_AUD_ACLK, DIV_CLK_AUD_BUS, "DOUT_CLK_AUD_ACLK", 0, 0, NULL), - VCLK(DOUT_CLK_AUD_AUDIF, DIV_CLK_AUD_AUDIF, "DOUT_CLK_AUD_AUDIF", 0, 0, NULL), - VCLK(DOUT_CLK_AUD_DSIF, DIV_CLK_AUD_DSIF, "DOUT_CLK_AUD_DSIF", 0, 0, NULL), - VCLK(DOUT_CLK_AUD_UAIF0, DIV_CLK_AUD_UAIF0, "DOUT_CLK_AUD_UAIF0", 0, 0, NULL), - VCLK(DOUT_CLK_AUD_UAIF1, DIV_CLK_AUD_UAIF1, "DOUT_CLK_AUD_UAIF1", 0, 0, NULL), - VCLK(DOUT_CLK_AUD_UAIF2, DIV_CLK_AUD_UAIF2, "DOUT_CLK_AUD_UAIF2", 0, 0, NULL), - VCLK(PLL_OUT_AUD, PLL_AUD, "PLL_OUT_AUD", 0, 0, NULL), - VCLK(DOUT_CLK_AUD_FM, DIV_CLK_AUD_FM, "DOUT_CLK_AUD_FM", 0, 0, NULL), -}; - -struct init_vclk exynos9610_cmgp_vclks[] __initdata = { - VCLK(CMGP00_USI, DIV_CLK_CMGP_USI00, "CMGP00_USI", 0, 0, NULL), - VCLK(CMGP01_USI, DIV_CLK_CMGP_USI01, "CMGP01_USI", 0, 0, NULL), - VCLK(CMGP02_USI, DIV_CLK_CMGP_USI02, "CMGP02_USI", 0, 0, NULL), - VCLK(CMGP03_USI, DIV_CLK_CMGP_USI03, "CMGP03_USI", 0, 0, NULL), - VCLK(CMGP04_USI, DIV_CLK_CMGP_USI04, "CMGP04_USI", 0, 0, NULL), - VCLK(CMGP_I2C, DIV_CLK_CMGP_I2C, "CMGP_I2C", 0, 0, NULL), - VCLK(CMGP_ADC, DIV_CLK_CMGP_ADC, "CMGP_ADC", 0, 0, NULL), -}; - -struct init_vclk exynos9610_fsys_vclks[] __initdata = { - VCLK(MMC_EMBD, CLKCMU_FSYS_MMC_EMBD, "MMC_EMBD", 0, 0, NULL), - VCLK(MMC_CARD, CLKCMU_FSYS_MMC_CARD, "MMC_CARD", 0, 0, NULL), - VCLK(UFS_EMBD, CLKCMU_FSYS_BUS, "UFS_EMBD", 0, 0, NULL), -}; - -struct init_vclk exynos9610_usb_vclks[] __initdata = { - VCLK(USB30DRD, VCLK_CLKCMU_USB_USB30DRD, "USB30DRD", 0, 0, NULL), - VCLK(DP_LINK, VCLK_CLKCMU_USB_DPGTC, "DP_LINK", 0, 0, NULL), -}; - -struct init_vclk exynos9610_peri_vclks[] __initdata = { - VCLK(UART, CLKCMU_PERI_UART, "UART", 0, 0, "console-sclk0"), - VCLK(I2C, DIV_CLK_PERI_I2C, "I2C", 0, 0, NULL), - VCLK(SPI0, DIV_CLK_PERI_SPI0, "SPI0", 0, 0, NULL), - VCLK(SPI1, DIV_CLK_PERI_SPI1, "SPI1", 0, 0, NULL), - VCLK(SPI2, DIV_CLK_PERI_SPI2, "SPI2", 0, 0, NULL), - VCLK(USI_I2C, DIV_CLK_PERI_USI_I2C, "USI_I2C", 0, 0, NULL), - VCLK(USI_USI, DIV_CLK_PERI_USI_USI, "USI_USI", 0, 0, NULL), -}; - -struct init_vclk exynos9610_top_vclks[] __initdata = { - VCLK(CIS_CLK0, CLKCMU_CIS_CLK0, "CIS_CLK0", 0, 0, NULL), - VCLK(CIS_CLK1, CLKCMU_CIS_CLK1, "CIS_CLK1", 0, 0, NULL), - VCLK(CIS_CLK2, CLKCMU_CIS_CLK2, "CIS_CLK2", 0, 0, NULL), - VCLK(CIS_CLK3, CLKCMU_CIS_CLK3, "CIS_CLK3", 0, 0, NULL), -}; - -static struct init_vclk exynos9610_clkout_vclks[] __initdata = { - VCLK(OSC_NFC, VCLK_CLKOUT1, "OSC_NFC", 0, 0, NULL), - VCLK(OSC_AUD, VCLK_CLKOUT0, "OSC_AUD", 0, 0, NULL), -}; - -static __initdata struct of_device_id ext_clk_match[] = { - {.compatible = "samsung,exynos9610-oscclk", .data = (void *)0}, - {}, -}; - -void exynos9610_vclk_init(void) -{ - cal_clk_setrate(DIV_CLK_AUD_FM, 40000); -} - -/* register exynos9610 clocks */ -void __init exynos9610_clk_init(struct device_node *np) -{ - void __iomem *reg_base; - int ret; - - if (np) { - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - } else { - panic("%s: unable to determine soc\n", __func__); - } - - ret = cal_if_init(np); - if (ret) - panic("%s: unable to initialize cal-if\n", __func__); - - exynos9610_clk_provider = samsung_clk_init(np, reg_base, CLK_NR_CLKS); - if (!exynos9610_clk_provider) - panic("%s: unable to allocate context.\n", __func__); - - samsung_register_of_fixed_ext(exynos9610_clk_provider, exynos9610_fixed_rate_ext_clks, - ARRAY_SIZE(exynos9610_fixed_rate_ext_clks), - ext_clk_match); - /* register HWACG vclk */ - samsung_register_vclk(exynos9610_clk_provider, exynos9610_apm_hwacg_vclks, ARRAY_SIZE(exynos9610_apm_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_cam_hwacg_vclks, ARRAY_SIZE(exynos9610_cam_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_cmgp_hwacg_vclks, ARRAY_SIZE(exynos9610_cmgp_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_top_hwacg_vclks, ARRAY_SIZE(exynos9610_top_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_core_hwacg_vclks, ARRAY_SIZE(exynos9610_core_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_dispaud_hwacg_vclks, ARRAY_SIZE(exynos9610_dispaud_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_fsys_hwacg_vclks, ARRAY_SIZE(exynos9610_fsys_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_g2d_hwacg_vclks, ARRAY_SIZE(exynos9610_g2d_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_g3d_hwacg_vclks, ARRAY_SIZE(exynos9610_g3d_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_isp_hwacg_vclks, ARRAY_SIZE(exynos9610_isp_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_mfc_hwacg_vclks, ARRAY_SIZE(exynos9610_mfc_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_peri_hwacg_vclks, ARRAY_SIZE(exynos9610_peri_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_shub_hwacg_vclks, ARRAY_SIZE(exynos9610_shub_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_usb_hwacg_vclks, ARRAY_SIZE(exynos9610_usb_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_vipx1_hwacg_vclks, ARRAY_SIZE(exynos9610_vipx1_hwacg_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_vipx2_hwacg_vclks, ARRAY_SIZE(exynos9610_vipx2_hwacg_vclks)); - - /* register special vclk */ - samsung_register_vclk(exynos9610_clk_provider, exynos9610_dispaud_vclks, ARRAY_SIZE(exynos9610_dispaud_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_cmgp_vclks, ARRAY_SIZE(exynos9610_cmgp_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_fsys_vclks, ARRAY_SIZE(exynos9610_fsys_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_usb_vclks, ARRAY_SIZE(exynos9610_usb_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_peri_vclks, ARRAY_SIZE(exynos9610_peri_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_top_vclks, ARRAY_SIZE(exynos9610_top_vclks)); - samsung_register_vclk(exynos9610_clk_provider, exynos9610_clkout_vclks, ARRAY_SIZE(exynos9610_clkout_vclks)); - - clk_register_fixed_factor(NULL, "pwm-clock", "fin_pll", CLK_SET_RATE_PARENT, 1, 1); - - samsung_clk_of_add_provider(np, exynos9610_clk_provider); - - late_time_init = exynos9610_vclk_init; - - pr_info("EXYNOS9610: Clock setup completed\n"); -} - -CLK_OF_DECLARE(exynos9610_clk, "samsung,exynos9610-clock", exynos9610_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos9810.c b/drivers/clk/samsung/samsung/clk-exynos9810.c deleted file mode 100644 index 5444f20ff895..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos9810.c +++ /dev/null @@ -1,557 +0,0 @@ -/* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos9810 SoC. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "../../soc/samsung/cal-if/exynos9810/cmucal-vclk.h" -#include "../../soc/samsung/cal-if/exynos9810/cmucal-node.h" -#include "../../soc/samsung/cal-if/exynos9810/cmucal-qch.h" -#include "../../soc/samsung/cal-if/exynos9810/clkout_exynos9810.h" -#include "composite.h" - -static struct samsung_clk_provider *exynos9810_clk_provider; -/* - * list of controller registers to be saved and restored during a - * suspend/resume cycle. - */ -/* fixed rate clocks generated outside the soc */ -struct samsung_fixed_rate exynos9810_fixed_rate_ext_clks[] __initdata = { - FRATE(OSCCLK, "fin_pll", NULL, 0, 26000000), -}; - -/* HWACG VCLK */ -struct init_vclk exynos9810_apm_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_DLL, MUX_DLL_USER, "UMUX_DLL", NULL, 0, VCLK_GATE, NULL), - - HWACG_VCLK(GATE_GREBE, GREBEINTEGRATION_QCH_GREBE, "GATE_GREBE", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GREBE_DBG, GREBEINTEGRATION_QCH_DBG, "GATE_GREBE_DBG", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_INTMEM, INTMEM_QCH, "GATE_INTMEM", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2CHUB, MAILBOX_AP2CHUB_QCH, "GATE_MAILBOX_AP2CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2CP, MAILBOX_AP2CP_QCH, "GATE_MAILBOX_AP2CP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2CP_S, MAILBOX_AP2CP_S_QCH, "GATE_MAILBOX_AP2CP_S", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2GNSS, MAILBOX_AP2GNSS_QCH, "GATE_MAILBOX_AP2GNSS", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2VTS, MAILBOX_AP2VTS_QCH, "GATE_MAILBOX_AP2VTS", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2AP, MAILBOX_APM2AP_QCH, "GATE_MAILBOX_APM2AP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2CHUB, MAILBOX_APM2CHUB_QCH, "GATE_MAILBOX_APM2CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2CP, MAILBOX_APM2CP_QCH, "GATE_MAILBOX_APM2CP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2GNSS, MAILBOX_APM2GNSS_QCH, "GATE_MAILBOX_APM2GNSS", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_CHUB2CP, MAILBOX_CHUB2CP_QCH, "GATE_MAILBOX_CHUB2CP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_GNSS2CHUB, MAILBOX_GNSS2CHUB_QCH, "GATE_MAILBOX_GNSS2CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_GNSS2CP, MAILBOX_GNSS2CP_QCH, "GATE_MAILBOX_GNSS2CP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PEM, PEM_QCH, "GATE_PEM", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY_APM, SPEEDY_APM_QCH, "GATE_SPEEDY_APM", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY_SUB_APM, SPEEDY_SUB_APM_QCH, "GATE_SPEEDY_SUB_APM", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_APM, WDT_APM_QCH, "GATE_WDT_APM", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_abox_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_ABOX_ACLK, ABOX_QCH_ACLK, "GATE_ABOX_ACLK", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_BCLK_DSIF, ABOX_QCH_BCLK_DSIF, "GATE_ABOX_BCLK_DSIF", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_BCLK0, ABOX_QCH_BCLK0, "GATE_ABOX_BCLK0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_BCLK1, ABOX_QCH_BCLK1, "GATE_ABOX_BCLK1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_BCLK2, ABOX_QCH_BCLK2, "GATE_ABOX_BCLK2", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_BCLK3, ABOX_QCH_BCLK3, "GATE_ABOX_BCLK3", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_DUMMY, ABOX_QCH_DUMMY, "GATE_ABOX_DUMMY", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_DMIC, DMIC_QCH, "GATE_ABOX_DMIC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_ABOX, SYSMMU_AUD_QCH, "GATE_SYSMMU_AUD", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_ABOXCPU, WDT_AUD_QCH, "GATE_WDT_AUD", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_bus1_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_TREX_P_BUS1, TREX_P_BUS1_QCH, "GATE_TREX_P_BUS1", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_busc_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_PDMA0, PDMA0_QCH, "GATE_PDMA0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PPFW, PPFW_QCH, "GATE_PPFW", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SBIC, SBIC_QCH, "GATE_SBIC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SIREX, SIREX_QCH, "GATE_SIREX", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPDMA, SPDMA_QCH, "GATE_SPDMA", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_D_BUSC, TREX_D_BUSC_QCH, "GATE_TREX_D_BUSC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_P_BUSC, TREX_P_BUSC_QCH, "GATE_TREX_P_BUSC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_RB_BUSC, TREX_RB_BUSC_QCH, "GATE_TREX_RB_BUSC", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_chub_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_CM4_CHUB, CM4_CHUB_QCH, "GATE_CM4_CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CHUB00, I2C_CHUB00_QCH, "GATE_I2C_CHUB00", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CHUB01, I2C_CHUB01_QCH, "GATE_I2C_CHUB01", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PDMA_CHUB, PDMA_CHUB_QCH, "GATE_PDMA_CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PWM_CHUB, PWM_CHUB_QCH, "GATE_PWM_CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TIMER_CHUB, TIMER_CHUB_QCH, "GATE_TIMER_CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CHUB00, USI_CHUB00_QCH, "GATE_USI_CHUB00", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CHUB01, USI_CHUB01_QCH, "GATE_USI_CHUB01", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_CHUB, WDT_CHUB_QCH, "GATE_WDT_CHUB", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_cmgp_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_ADC_CMGP_S0, ADC_CMGP_QCH_S0, "GATE_ADC_CMGP_S0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ADC_CMGP_S1, ADC_CMGP_QCH_S1, "GATE_ADC_CMGP_S1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ADC_CMGP, ADC_CMGP_QCH_ADC, "GATE_ADC_CMGP_ADC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP00, I2C_CMGP00_QCH, "GATE_I2C_CMGP00", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP01, I2C_CMGP01_QCH, "GATE_I2C_CMGP01", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP02, I2C_CMGP02_QCH, "GATE_I2C_CMGP02", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP03, I2C_CMGP03_QCH, "GATE_I2C_CMGP03", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP00, USI_CMGP00_QCH, "GATE_USI_CMGP00", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP01, USI_CMGP01_QCH, "GATE_USI_CMGP01", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP02, USI_CMGP02_QCH, "GATE_USI_CMGP02", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP03, USI_CMGP03_QCH, "GATE_USI_CMGP03", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_cmu_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_CMU_CMUREF, CMU_CMU_CMUREF_QCH, "GATE_CMU_CMUREF", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK0, DFTMUX_TOP_QCH_CIS_CLK0, "GATE_CIS_CLK0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK1, DFTMUX_TOP_QCH_CIS_CLK1, "GATE_CIS_CLK1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK2, DFTMUX_TOP_QCH_CIS_CLK2, "GATE_CIS_CLK2", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK3, DFTMUX_TOP_QCH_CIS_CLK3, "GATE_CIS_CLK3", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_OTP, OTP_QCH, "GATE_OTP", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_core_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_TREX_D_CORE, TREX_D_CORE_QCH, "GATE_TREX_D_CORE", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_P0_CORE, TREX_P0_CORE_QCH, "GATE_TREX_P0_CORE", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_P1_CORE, TREX_P1_CORE_QCH, "GATE_TREX_P1_CORE", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dcf_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DCF_BUS, MUX_CLKCMU_DCF_BUS_USER, "UMUX_CLKCMU_DCF_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_DCF_CIP, IS_DCF_QCH_CIP, "GATE_IS_DCF_CIP", "UMUX_CLKCMU_DCF_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCF_C2SYNC_2SLV, IS_DCF_QCH_C2SYNC_2SLV, "GATE_IS_DCF_C2SYNC_2SLV", "UMUX_CLKCMU_DCF_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCF_SYSMMU, IS_DCF_QCH_SYSMMU, "GATE_IS_DCF_SYSMMU", "UMUX_CLKCMU_DCF_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dcpost_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DCPOST_BUS, MUX_CLKCMU_DCPOST_BUS_USER, "UMUX_CLKCMU_DCPOST_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_DCPOST_CIP2, IS_DCPOST_QCH_CIP2, "GATE_IS_DCPOST_CIP2", "UMUX_CLKCMU_DCPOST_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCPOST_C2SYNC_1SLV_CLK, IS_DCPOST_QCH_C2SYNC_1SLV_CLK, "GATE_IS_DCPOST_C2SYNC_1SLV_CLK", "UMUX_CLKCMU_DCPOST_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dcrd_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DCRD_BUS, MUX_CLKCMU_DCRD_BUS_USER, "UMUX_CLKCMU_DCRD_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_DCRD_DCP, IS_DCRD_QCH_DCP, "GATE_IS_DCRD_DCP", "UMUX_CLKCMU_DCRD_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCRD_SYSMMU, IS_DCRD_QCH_SYSMMU, "GATE_IS_DCRD_SYSMMU", "UMUX_CLKCMU_DCRD_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCRD_DCP_C2C, IS_DCRD_QCH_DCP_C2C, "GATE_IS_DCRD_DCP_C2C", "UMUX_CLKCMU_DCRD_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCRD_DCP_DIV2, IS_DCRD_QCH_DCP_DIV2, "GATE_IS_DCRD_DCP_DIV2", "UMUX_CLKCMU_DCRD_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dpu_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DPU_BUS, MUX_CLKCMU_DPU_BUS_USER, "UMUX_CLKCMU_DPU_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_DPU, DPU_QCH_DPU, "GATE_DPU_DPU", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU_DMA, DPU_QCH_DPU_DMA, "GATE_DPU_DMA", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU_DPP, DPU_QCH_DPU_DPP, "GATE_DPU_DPP", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU_WB_MUX, DPU_QCH_DPU_WB_MUX, "GATE_DPU_WB_MUX", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_DPUD0, SYSMMU_DPUD0_QCH, "GATE_SYSMMU_DPUD0", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_DPUD1, SYSMMU_DPUD1_QCH, "GATE_SYSMMU_DPUD1", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_DPUD2, SYSMMU_DPUD2_QCH, "GATE_SYSMMU_DPUD2", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dspm_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DSPM_BUS, MUX_CLKCMU_DSPM_BUS_USER, "UMUX_CLKCMU_DSPM_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_SCORE_MASTER, SCORE_MASTER_QCH, "GATE_SCORE_MASTER", "UMUX_CLKCMU_DSPM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_DSPM0, SYSMMU_DSPM0_QCH, "GATE_SMMU_DSPM0", "UMUX_CLKCMU_DSPM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_DSPM1, SYSMMU_DSPM1_QCH, "GATE_SMMU_DSPM1", "UMUX_CLKCMU_DSPM_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dsps_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DSPS_BUS, MUX_CLKCMU_DSPS_BUS_USER, "UMUX_CLKCMU_DSPS_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_DSPS_AUD, MUX_CLKCMU_DSPS_AUD_USER, "UMUX_CLKCMU_DSPS_AUD", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_SCORE_KNIGHT, SCORE_KNIGHT_QCH, "GATE_SCORE_KNIGHT", "UMUX_CLKCMU_DSPS_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_fsys0_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_FSYS0_BUS, MUX_CLKCMU_FSYS0_BUS_USER, "UMUX_CLKCMU_FSYS0_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_UFS_EMBD, MUX_CLKCMU_FSYS0_UFS_EMBD_USER, "UMUX_CLKCMU_FSYS0_UFS_EMBD", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_USB30DRD, MUX_CLKCMU_FSYS0_USB30DRD_USER, "UMUX_CLKCMU_FSYS0_USB30DRD", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_DPGTC, MUX_CLKCMU_FSYS0_DPGTC_USER, "UMUX_CLKCMU_FSYS0_DPGTC", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_USBDP_DEBUG, MUX_CLKCMU_FSYS0_USBDP_DEBUG_USER, "UMUX_CLKCMU_FSYS0_USBDP_DEBUG", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_DP_LINK, DP_LINK_QCH, "GATE_DP_LINK", "UMUX_CLKCMU_FSYS0_DPGTC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DP_LINK_GTC, DP_LINK_QCH_GTC, "GATE_DP_LINK_GTC", "UMUX_CLKCMU_FSYS0_DPGTC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_EMBD, UFS_EMBD_QCH, "GATE_UFS_EMBD", "UMUX_CLKCMU_FSYS0_UFS_EMBD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_EMBD_FMP, UFS_EMBD_QCH_FMP, "GATE_UFS_EMBD_FMP", "UMUX_CLKCMU_FSYS0_UFS_EMBD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_USB30DRD_LINK, USB30DRD_QCH_USB30DRD_LINK, "GATE_USB30DRD_USB30DRD_LINK", "UMUX_CLKCMU_FSYS0_USB30DRD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_USBPCS, USB30DRD_QCH_USBPCS, "GATE_USB30DRD_USBPCS", "UMUX_CLKCMU_FSYS0_USB30DRD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_USB30DRD_CTRL, USB30DRD_QCH_USB30DRD_CTRL, "GATE_USB30DRD_USB30DRD_CTRL", "UMUX_CLKCMU_FSYS0_USB30DRD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_USBDPPHY, USB30DRD_QCH_USBDPPHY, "GATE_USB30DRD_USBDPPHY", "UMUX_CLKCMU_FSYS0_USB30DRD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_SOC_PLL, USB30DRD_QCH_SOC_PLL, "GATE_USB30DRD_SOC_PLL", "UMUX_CLKCMU_FSYS0_USBDP_DEBUG", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_fsys1_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_FSYS1_BUS, MUX_CLKCMU_FSYS1_BUS_USER, "UMUX_CLKCMU_FSYS1_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS1_PCIE, MUX_CLKCMU_FSYS1_PCIE_USER, "UMUX_CLKCMU_FSYS1_PCIE", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS1_MMC_CARD, MUX_CLKCMU_FSYS1_MMC_CARD_USER, "UMUX_CLKCMU_FSYS1_MMC_CARD", "UMUX_CLKCMU_FSYS1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS1_UFS_CARD, MUX_CLKCMU_FSYS1_UFS_CARD_USER, "UMUX_CLKCMU_FSYS1_UFS_CARD", "UMUX_CLKCMU_FSYS1_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_MMC_CARD, MMC_CARD_QCH, "GATE_MMC_CARD", "UMUX_CLKCMU_FSYS1_MMC_CARD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_MSTR, PCIE_GEN2_QCH_MSTR, "GATE_PCIE_GEN2_MSTR", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_PCS, PCIE_GEN2_QCH_PCS, "GATE_PCIE_GEN2_PCS", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_PHY, PCIE_GEN2_QCH_PHY, "GATE_PCIE_GEN2_PHY", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_DBI, PCIE_GEN2_QCH_DBI, "GATE_PCIE_GEN2_DBI", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_APB, PCIE_GEN2_QCH_APB, "GATE_PCIE_GEN2_APB", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_SOCPLL, PCIE_GEN2_QCH_SOCPLL, "GATE_PCIE_GEN2_SOCPLL", "UMUX_CLKCMU_FSYS1_PCIE", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_MSTR, PCIE_GEN3_QCH_MSTR, "GATE_PCIE_GEN3_MSTR", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_PCS, PCIE_GEN3_QCH_PCS, "GATE_PCIE_GEN3_PCS", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_DBI, PCIE_GEN3_QCH_DBI, "GATE_PCIE_GEN3_DBI", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_APB, PCIE_GEN3_QCH_APB, "GATE_PCIE_GEN3_APB", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_SOCPLL, PCIE_GEN3_QCH_SOCPLL, "GATE_PCIE_GEN3_SOCPLL", "UMUX_CLKCMU_FSYS1_PCIE", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_PHY, PCIE_GEN3_QCH_PHY, "GATE_PCIE_GEN3", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_IA_GEN2, PCIE_IA_GEN2_QCH, "GATE_PCIE_IA_GEN2", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_IA_GEN3, PCIE_IA_GEN3_QCH, "GATE_PCIE_IA_GEN3", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_RTIC, RTIC_QCH, "GATE_RTIC", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SSS, SSS_QCH, "GATE_SSS", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_FSYS1, SYSMMU_FSYS1_QCH, "GATE_SYSMMU_FSYS1", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_CARD, UFS_CARD_QCH, "GATE_UFS_CARD", "UMUX_CLKCMU_FSYS1_UFS_CARD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_CARD_FMP, UFS_CARD_QCH_FMP, "GATE_UFS_CARD_FMP", "UMUX_CLKCMU_FSYS1_UFS_CARD", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_g2d_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_G2D_MSCL, MUX_CLKCMU_G2D_MSCL_USER, "UMUX_CLKCMU_G2D_MSCL", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_G2D_G2D, MUX_CLKCMU_G2D_G2D_USER, "UMUX_CLKCMU_G2D_G2D", "UMUX_CLKCMU_G2D_MSCL", 0, 0, NULL), - - HWACG_VCLK(GATE_ASTC, ASTC_QCH, "GATE_ASTC", "UMUX_CLKCMU_G2D_MSCL", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_G2D, G2D_QCH, "GATE_G2D", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_JPEG, JPEG_QCH, "GATE_JPEG", "UMUX_CLKCMU_G2D_MSCL", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MSCL, MSCL_QCH, "GATE_MSCL", "UMUX_CLKCMU_G2D_MSCL", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_G2DD0, SYSMMU_G2DD0_QCH, "GATE_SMMU_G2DD0", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_G2DD1, SYSMMU_G2DD1_QCH, "GATE_SMMU_G2DD1", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_G2DD2, SYSMMU_G2DD2_QCH, "GATE_SMMU_G2DD2", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_g3d_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_GPU, GPU_QCH, "GATE_GPU", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_isphq_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_ISPHQ_BUS, MUX_CLKCMU_ISPHQ_BUS_USER, "UMUX_CLKCMU_ISPHQ_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_ISPHQ, IS_ISPHQ_QCH_ISPHQ, "GATE_IS_ISPHQ", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPHQ_C2COM, IS_ISPHQ_QCH_ISPHQ_C2COM, "GATE_IS_ISPHQ_C2COM", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPHQ_SYSMMU, IS_ISPHQ_QCH_SYSMMU_ISPHQ, "GATE_IS_ISPHQ_SYSMMU", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_isplp_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_ISPLP_BUS, MUX_CLKCMU_ISPLP_BUS_USER, "UMUX_CLKCMU_ISPLP_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_ISPLP_VRA, MUX_CLKCMU_ISPLP_VRA_USER, "UMUX_CLKCMU_ISPLP_VRA", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_ISPLP_GDC, MUX_CLKCMU_ISPLP_GDC_USER, "UMUX_CLKCMU_ISPLP_GDC", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_ISPLP_MC_SCALER, IS_ISPLP_QCH_MC_SCALER, "GATE_IS_ISPLP_MC_SCALER", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP, IS_ISPLP_QCH_ISPLP, "GATE_IS_ISPLP_ISPLP", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_VRA, IS_ISPLP_QCH_VRA, "GATE_IS_ISPLP_VRA", "UMUX_CLKCMU_ISPLP_VRA", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_GDC, IS_ISPLP_QCH_GDC, "GATE_IS_ISPLP_GDC", "UMUX_CLKCMU_ISPLP_GDC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_C2, IS_ISPLP_QCH_ISPLP_C2, "GATE_IS_ISPLP_ISPLP_C2", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_SYSMMU_ISPLP0, IS_ISPLP_QCH_SYSMMU_ISPLP0, "GATE_IS_ISPLP_SYSMMU_ISPLP0", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_SYSMMU_ISPLP1, IS_ISPLP_QCH_SYSMMU_ISPLP1, "GATE_IS_ISPLP_SYSMMU_ISPLP1", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_isppre_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_ISPPRE_BUS, MUX_CLKCMU_ISPPRE_BUS_USER, "UMUX_CLKCMU_ISPPRE_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_ISPPRE_CSIS0, IS_ISPPRE_QCH_CSIS0, "GATE_IS_ISPPRE_CSIS0", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_CSIS1, IS_ISPPRE_QCH_CSIS1, "GATE_IS_ISPPRE_CSIS1", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_CSIS2, IS_ISPPRE_QCH_CSIS2, "GATE_IS_ISPPRE_CSIS2", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_CSIS3, IS_ISPPRE_QCH_CSIS3, "GATE_IS_ISPPRE_CSIS3", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_PDP_DMA, IS_ISPPRE_QCH_PDP_DMA, "GATE_IS_ISPPRE_PDP_DMA", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_SYSMMU, IS_ISPPRE_QCH_SYSMMU_ISPPRE, "GATE_IS_ISPPRE_SYSMMU", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_3AA, IS_ISPPRE_QCH_3AA, "GATE_IS_ISPPRE_3AA", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_3AAM, IS_ISPPRE_QCH_3AAM, "GATE_IS_ISPPRE_3AAM", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_PDP_CORE0, IS_ISPPRE_QCH_PDP_CORE0, "GATE_IS_ISPPRE_PDP_CORE0", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_PDP_CORE1, IS_ISPPRE_QCH_PDP_CORE1, "GATE_IS_ISPPRE_PDP_CORE1", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_iva_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_IVA_BUS, MUX_CLKCMU_IVA_BUS_USER, "UMUX_CLKCMU_IVA_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IVA, IVA_QCH_IVA, "GATE_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IVA_DEBUG, IVA_QCH_IVA_DEBUG, "GATE_IVA_DEBUG", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IVA_INTMEM, IVA_INTMEM_QCH, "GATE_IVA_INTMEM", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_IVA, SYSMMU_IVA_QCH, "GATE_SMMU_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_RB_IVA, TREX_RB_IVA_QCH, "GATE_TREX_RB_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_mfc_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_MFC_BUS, MUX_CLKCMU_MFC_BUS_USER, "UMUX_CLKCMU_MFC_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_MFC_WFD, MUX_CLKCMU_MFC_WFD_USER, "UMUX_CLKCMU_MFC_WFD", "UMUX_CLKCMU_MFC_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_MFC, MFC_QCH, "GATE_MFC", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WFD, WFD_QCH, "GATE_WFD", "UMUX_CLKCMU_MFC_WFD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_MFCD0, SYSMMU_MFCD0_QCH, "GATE_SMMU_MFCD0", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_MFCD1, SYSMMU_MFCD1_QCH, "GATE_SMMU_MFCD1", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_peric0_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_PERIC0_BUS, MUX_CLKCMU_PERIC0_BUS_USER, "UMUX_CLKCMU_PERIC0_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC0_IP, MUX_CLKCMU_PERIC0_IP_USER, "UMUX_CLKCMU_PERIC0_IP", "UMUX_CLKCMU_PERIC0_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_PWM, PWM_QCH, "GATE_PWM", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UART_DBG, UART_DBG_QCH, "GATE_UART_DBG", "UMUX_CLKCMU_PERIC0_BUS", 0, 0, "console-pclk0"), - HWACG_VCLK(GATE_USI00_I2C, USI00_I2C_QCH, "GATE_USI00_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI00, USI00_USI_QCH, "GATE_USI00_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI01_I2C, USI01_I2C_QCH, "GATE_USI01_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI01, USI01_USI_QCH, "GATE_USI01_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI02_I2C, USI02_I2C_QCH, "GATE_USI02_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI02, USI02_USI_QCH, "GATE_USI02_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI03_I2C, USI03_I2C_QCH, "GATE_USI03_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI03, USI03_USI_QCH, "GATE_USI03_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI04_I2C, USI04_I2C_QCH, "GATE_USI04_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI04, USI04_USI_QCH, "GATE_USI04_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI05_I2C, USI05_I2C_QCH, "GATE_USI05_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI05, USI05_USI_QCH, "GATE_USI05_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI12_I2C, USI12_I2C_QCH, "GATE_USI12_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI12, USI12_USI_QCH, "GATE_USI12_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI13_I2C, USI13_I2C_QCH, "GATE_USI13_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI13, USI13_USI_QCH, "GATE_USI13_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI14_I2C, USI14_I2C_QCH, "GATE_USI14_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI14, USI14_USI_QCH, "GATE_USI14_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_peric1_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_PERIC1_BUS, MUX_CLKCMU_PERIC1_BUS_USER, "UMUX_CLKCMU_PERIC1_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_IP, MUX_CLKCMU_PERIC1_IP_USER, "UMUX_CLKCMU_PERIC1_IP", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_I2C_CAM0, I2C_CAM0_QCH, "GATE_I2C_CAM0", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CAM1, I2C_CAM1_QCH, "GATE_I2C_CAM1", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CAM2, I2C_CAM2_QCH, "GATE_I2C_CAM2", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CAM3, I2C_CAM3_QCH, "GATE_I2C_CAM3", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPI_CAM0, SPI_CAM0_QCH, "GATE_SPI_CAM0", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UART_BT, UART_BT_QCH, "GATE_UART_BT", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI06_I2C, USI06_I2C_QCH, "GATE_USI06_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI06, USI06_USI_QCH, "GATE_USI06", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI07_I2C, USI07_I2C_QCH, "GATE_USI07_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI07, USI07_USI_QCH, "GATE_USI07", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI08_I2C, USI08_I2C_QCH, "GATE_USI08_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI08, USI08_USI_QCH, "GATE_USI08", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI09_I2C, USI09_I2C_QCH, "GATE_USI09_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI09, USI09_USI_QCH, "GATE_USI09", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI10_I2C, USI10_I2C_QCH, "GATE_USI10_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI10, USI10_USI_QCH, "GATE_USI10", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI11_I2C, USI11_I2C_QCH, "GATE_USI11_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI11, USI11_USI_QCH, "GATE_USI11", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_peris_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_PERIS_BUS, MUX_CLKCMU_PERIS_BUS_USER, "UMUX_CLKCMU_PERIS_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BUSIF_TMU, BUSIF_TMU_QCH, "GATE_BUSIF_TMU", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GIC, GIC_QCH, "GATE_GIC", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MCT, MCT_QCH, "GATE_MCT", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_OTP_CON_BIRA, OTP_CON_BIRA_QCH, "GATE_OTP_CON_BIRA", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_OTP_CON_TOP, OTP_CON_TOP_QCH, "GATE_OTP_CON_TOP", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_CLUSTER0, WDT_CLUSTER0_QCH, "GATE_WDT_CLUSTER0", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_CLUSTER1, WDT_CLUSTER1_QCH, "GATE_WDT_CLUSTER1", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_vts_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_VTS_BUS, MUX_CLKCMU_VTS_BUS_USER, "UMUX_CLKCMU_VTS_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_VTS_DLL, MUX_CLKCMU_VTS_DLL_USER, "UMUX_CLKCMU_VTS_DLL", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_VTS_CPU, CORTEXM4INTEGRATION_QCH_CPU, "GATE_CORTEXM4_CPU", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_VTS_DMIC_IF, DMIC_IF_QCH_DMIC_CLK, "GATE_DMIC_IF", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_HWACG_SYS_DMIC0, HWACG_SYS_DMIC0_QCH, "GATE_HWACG_SYS_DMIC0", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_HWACG_SYS_DMIC1, HWACG_SYS_DMIC1_QCH, "GATE_HWACG_SYS_DMIC1", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_VTS2CHUB, MAILBOX_VTS2CHUB_QCH, "GATE_MAILBOX_VTS2CHUB", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_VTS, WDT_VTS_QCH, "GATE_WDT_VTS", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_U_DMIC_CLK_MUX, U_DMIC_CLK_MUX_QCH, "GATE_U_DMIC_CLK_MUX", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), -}; - -/* Special VCLK */ -struct init_vclk exynos9810_apm_vclks[] __initdata = { - VCLK(APM_DLL_CMGP, CLKCMU_APM_DLL_CMGP, "APM_DLL_CMGP", 0, 0, NULL), - VCLK(APM_DLL_VTS, CLKCMU_APM_DLL_VTS, "APM_DLL_VTS", 0, 0, NULL), -}; - -struct init_vclk exynos9810_abox_vclks[] __initdata = { - VCLK(DOUT_CLK_ABOX_ACLK, DIV_CLK_AUD_BUS, "DOUT_CLK_ABOX_ACLK", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_AUDIF, DIV_CLK_AUD_AUDIF, "DOUT_CLK_ABOX_AUDIF", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_DSIF, DIV_CLK_AUD_DSIF, "DOUT_CLK_ABOX_DSIF", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_DMIC, DIV_CLK_AUD_DMIC, "DOUT_CLK_ABOX_DMIC", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF0, DIV_CLK_AUD_UAIF0, "DOUT_CLK_ABOX_UAIF0", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF1, DIV_CLK_AUD_UAIF1, "DOUT_CLK_ABOX_UAIF1", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF2, DIV_CLK_AUD_UAIF2, "DOUT_CLK_ABOX_UAIF2", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF3, DIV_CLK_AUD_UAIF3, "DOUT_CLK_ABOX_UAIF3", 0, 0, NULL), - VCLK(PLL_OUT_AUD, PLL_AUD, "PLL_OUT_AUD", 0, 0, NULL), -}; - -struct init_vclk exynos9810_chub_vclks[] __initdata = { - VCLK(CHUB_USI00, DIV_CLK_CHUB_USI00, "CHUB_USI00", 0, 0, NULL), - VCLK(CHUB_USI01, DIV_CLK_CHUB_USI01, "CHUB_USI01", 0, 0, NULL), - VCLK(CHUB_USI_I2C, DIV_CLK_CHUB_I2C, "CHUB_USI_I2C", 0, 0, NULL), - VCLK(CHUB_TIMER_FCLK, CLK_CHUB_TIMER_FCLK, "CHUB_TIMER_FCLK", 0, 0, NULL), - VCLK(CHUB_BUS, DIV_CLK_CHUB_BUS, "CHUB_BUS", 0, 0, NULL), -}; - -struct init_vclk exynos9810_cmgp_vclks[] __initdata = { - VCLK(USI_CMGP00, DIV_CLK_USI_CMGP00, "USI_CMGP00", 0, 0, NULL), - VCLK(USI_CMGP01, DIV_CLK_USI_CMGP01, "USI_CMGP01", 0, 0, NULL), - VCLK(USI_CMGP02, DIV_CLK_USI_CMGP02, "USI_CMGP02", 0, 0, NULL), - VCLK(USI_CMGP03, DIV_CLK_USI_CMGP03, "USI_CMGP03", 0, 0, NULL), - VCLK(CMGP_USI_I2C, DIV_CLK_I2C_CMGP, "CMGP_USI_I2C", 0, 0, NULL), - VCLK(CMGP_ADC, DIV_CLK_CMGP_ADC, "CMGP_ADC", 0, 0, NULL), -}; - -struct init_vclk exynos9810_fsys0_vclks[] __initdata = { - VCLK(UFS_EMBD, VCLK_CLK_FSYS0_UFS_EMBD_BLK_CMU, "UFS_EMBD", 0, 0, NULL), - VCLK(DPGTC, VCLK_CLK_FSYS0_DPGTC_BLK_CMU, "DPGTC", 0, 0, NULL), - VCLK(USB30DRD, VCLK_CLK_FSYS0_USB30DRD_BLK_CMU, "USB30DRD", 0, 0, NULL), - VCLK(USBDP_DEBUG_USER, VCLK_MUX_CLKCMU_FSYS0_USBDP_DEBUG_USER_BLK_CMU, "USBDP_DEBUG_USER", 0, 0, NULL), -}; - -struct init_vclk exynos9810_fsys1_vclks[] __initdata = { - VCLK(MMC_CARD, CLKCMU_FSYS1_MMC_CARD, "MMC_CARD", 0, 0, NULL), - VCLK(UFS_CARD, VCLK_CLK_FSYS1_UFS_CARD_BLK_CMU, "UFS_CARD", 0, 0, NULL), -}; - -struct init_vclk exynos9810_peric0_vclks[] __initdata = { - VCLK(UART_DBG, DIV_CLK_PERIC0_UART_DBG, "UART_DBG", 0, 0, "console-sclk0"), - VCLK(USI00, DIV_CLK_PERIC0_USI00_USI, "USI00_USI", 0, 0, NULL), - VCLK(USI01, DIV_CLK_PERIC0_USI01_USI, "USI01_USI", 0, 0, NULL), - VCLK(USI02, DIV_CLK_PERIC0_USI02_USI, "USI02_USI", 0, 0, NULL), - VCLK(USI03, DIV_CLK_PERIC0_USI03_USI, "USI03_USI", 0, 0, NULL), - VCLK(USI04, DIV_CLK_PERIC0_USI04_USI, "USI04_USI", 0, 0, NULL), - VCLK(USI05, DIV_CLK_PERIC0_USI05_USI, "USI05_USI", 0, 0, NULL), - VCLK(USI12, DIV_CLK_PERIC0_USI12_USI, "USI12_USI", 0, 0, NULL), - VCLK(USI13, DIV_CLK_PERIC0_USI13_USI, "USI13_USI", 0, 0, NULL), - VCLK(USI14, DIV_CLK_PERIC0_USI14_USI, "USI14_USI", 0, 0, NULL), - VCLK(PERIC0_USI_I2C, DIV_CLK_PERIC0_USI_I2C, "PERIC0_USI_I2C", 0, 0, NULL), -}; - -struct init_vclk exynos9810_peric1_vclks[] __initdata = { - VCLK(UART_BT, DIV_CLK_PERIC1_UART_BT, "UART_BT", 0, 0, NULL), - VCLK(I2C_CAM0, DIV_CLK_PERIC1_I2C_CAM0, "I2C_CAM0", 0, 0, NULL), - VCLK(I2C_CAM1, DIV_CLK_PERIC1_I2C_CAM1, "I2C_CAM1", 0, 0, NULL), - VCLK(I2C_CAM2, DIV_CLK_PERIC1_I2C_CAM2, "I2C_CAM2", 0, 0, NULL), - VCLK(I2C_CAM3, DIV_CLK_PERIC1_I2C_CAM3, "I2C_CAM3", 0, 0, NULL), - VCLK(SPI_CAM0, DIV_CLK_PERIC1_SPI_CAM0, "SPI_CAM0", 0, 0, NULL), - VCLK(USI06, DIV_CLK_PERIC1_USI06_USI, "USI06", 0, 0, NULL), - VCLK(USI07, DIV_CLK_PERIC1_USI07_USI, "USI07", 0, 0, NULL), - VCLK(USI08, DIV_CLK_PERIC1_USI08_USI, "USI08", 0, 0, NULL), - VCLK(USI09, DIV_CLK_PERIC1_USI09_USI, "USI09", 0, 0, NULL), - VCLK(USI10, DIV_CLK_PERIC1_USI10_USI, "USI10", 0, 0, NULL), - VCLK(USI11, DIV_CLK_PERIC1_USI11_USI, "USI11", 0, 0, NULL), - VCLK(PERIC1_USI_I2C, DIV_CLK_PERIC1_USI_I2C, "PERIC1_USI_I2C", 0, 0, NULL), -}; - -struct init_vclk exynos9810_cmu_vclks[] __initdata = { - VCLK(CIS_CLK0, CLKCMU_CIS_CLK0, "CIS_CLK0", 0, 0, NULL), - VCLK(CIS_CLK1, CLKCMU_CIS_CLK1, "CIS_CLK1", 0, 0, NULL), - VCLK(CIS_CLK2, CLKCMU_CIS_CLK2, "CIS_CLK2", 0, 0, NULL), - VCLK(CIS_CLK3, CLKCMU_CIS_CLK3, "CIS_CLK3", 0, 0, NULL), - VCLK(HPM, VCLK_CLKCMU_HPM_BLK_CMU, "HPM", 0, 0, NULL), -}; - -struct init_vclk exynos9810_vts_vclks[] __initdata = { - VCLK(DOUT_CLK_VTS_DMICIF, DIV_CLK_VTS_DMIC_IF, "DOUT_CLK_VTS_DMICIF", 0, 0, NULL), - VCLK(DOUT_CLK_VTS_DMIC, DIV_CLK_VTS_DMIC, "DOUT_CLK_VTS_DMIC", 0, 0, NULL), - VCLK(DOUT_CLK_VTS_DMIC_DIV2, DIV_CLK_VTS_DMIC_DIV2, "DOUT_CLK_VTS_DMIC_DIV2", 0, 0, NULL), -}; - -static struct init_vclk exynos9810_clkout_vclks[] __initdata = { - VCLK(OSC_NFC, VCLK_CLKOUT1, "OSC_NFC", 0, 0, NULL), - VCLK(OSC_AUD, VCLK_CLKOUT0, "OSC_AUD", 0, 0, NULL), -}; - -static __initdata struct of_device_id ext_clk_match[] = { - {.compatible = "samsung,exynos9810-oscclk", .data = (void *)0}, - {}, -}; - -void exynos9810_vclk_init(void) -{ - /* Common clock init */ -} - -/* register exynos9810 clocks */ -void __init exynos9810_clk_init(struct device_node *np) -{ - void __iomem *reg_base; - int ret; - - if (np) { - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - } else { - panic("%s: unable to determine soc\n", __func__); - } - - ret = cal_if_init(np); - if (ret) - panic("%s: unable to initialize cal-if\n", __func__); - - exynos9810_clk_provider = samsung_clk_init(np, reg_base, CLK_NR_CLKS); - if (!exynos9810_clk_provider) - panic("%s: unable to allocate context.\n", __func__); - - samsung_register_of_fixed_ext(exynos9810_clk_provider, exynos9810_fixed_rate_ext_clks, - ARRAY_SIZE(exynos9810_fixed_rate_ext_clks), - ext_clk_match); - /* register HWACG vclk */ - samsung_register_vclk(exynos9810_clk_provider, exynos9810_apm_hwacg_vclks, ARRAY_SIZE(exynos9810_apm_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_abox_hwacg_vclks, ARRAY_SIZE(exynos9810_abox_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_bus1_hwacg_vclks, ARRAY_SIZE(exynos9810_bus1_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_busc_hwacg_vclks, ARRAY_SIZE(exynos9810_busc_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_chub_hwacg_vclks, ARRAY_SIZE(exynos9810_chub_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_cmgp_hwacg_vclks, ARRAY_SIZE(exynos9810_cmgp_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_cmu_hwacg_vclks, ARRAY_SIZE(exynos9810_cmu_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_core_hwacg_vclks, ARRAY_SIZE(exynos9810_core_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dcf_hwacg_vclks, ARRAY_SIZE(exynos9810_dcf_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dcpost_hwacg_vclks, ARRAY_SIZE(exynos9810_dcpost_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dcrd_hwacg_vclks, ARRAY_SIZE(exynos9810_dcrd_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dpu_hwacg_vclks, ARRAY_SIZE(exynos9810_dpu_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dspm_hwacg_vclks, ARRAY_SIZE(exynos9810_dspm_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dsps_hwacg_vclks, ARRAY_SIZE(exynos9810_dsps_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_fsys0_hwacg_vclks, ARRAY_SIZE(exynos9810_fsys0_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_fsys1_hwacg_vclks, ARRAY_SIZE(exynos9810_fsys1_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_g2d_hwacg_vclks, ARRAY_SIZE(exynos9810_g2d_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_g3d_hwacg_vclks, ARRAY_SIZE(exynos9810_g3d_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_isphq_hwacg_vclks, ARRAY_SIZE(exynos9810_isphq_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_isplp_hwacg_vclks, ARRAY_SIZE(exynos9810_isplp_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_isppre_hwacg_vclks, ARRAY_SIZE(exynos9810_isppre_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_iva_hwacg_vclks, ARRAY_SIZE(exynos9810_iva_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_mfc_hwacg_vclks, ARRAY_SIZE(exynos9810_mfc_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_peric0_hwacg_vclks, ARRAY_SIZE(exynos9810_peric0_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_peric1_hwacg_vclks, ARRAY_SIZE(exynos9810_peric1_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_peris_hwacg_vclks, ARRAY_SIZE(exynos9810_peris_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_vts_hwacg_vclks, ARRAY_SIZE(exynos9810_vts_hwacg_vclks)); - - /* register special vclk */ - samsung_register_vclk(exynos9810_clk_provider, exynos9810_apm_vclks, ARRAY_SIZE(exynos9810_apm_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_abox_vclks, ARRAY_SIZE(exynos9810_abox_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_chub_vclks, ARRAY_SIZE(exynos9810_chub_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_cmgp_vclks, ARRAY_SIZE(exynos9810_cmgp_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_cmu_vclks, ARRAY_SIZE(exynos9810_cmu_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_fsys0_vclks, ARRAY_SIZE(exynos9810_fsys0_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_fsys1_vclks, ARRAY_SIZE(exynos9810_fsys1_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_peric0_vclks, ARRAY_SIZE(exynos9810_peric0_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_peric1_vclks, ARRAY_SIZE(exynos9810_peric1_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_vts_vclks, ARRAY_SIZE(exynos9810_vts_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_clkout_vclks, ARRAY_SIZE(exynos9810_clkout_vclks)); - - clk_register_fixed_factor(NULL, "pwm-clock", "fin_pll", CLK_SET_RATE_PARENT, 1, 1); - - samsung_clk_of_add_provider(np, exynos9810_clk_provider); - - late_time_init = exynos9810_vclk_init; - - pr_info("EXYNOS9810: Clock setup completed\n"); -} - -CLK_OF_DECLARE(exynos9810_clk, "samsung,exynos9810-clock", exynos9810_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-exynos9810_evt0.c b/drivers/clk/samsung/samsung/clk-exynos9810_evt0.c deleted file mode 100644 index 2cb8c7732733..000000000000 --- a/drivers/clk/samsung/samsung/clk-exynos9810_evt0.c +++ /dev/null @@ -1,559 +0,0 @@ -/* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for Exynos9810 SoC. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "../../soc/samsung/cal-if/exynos9810_evt0/cmucal-vclk.h" -#include "../../soc/samsung/cal-if/exynos9810_evt0/cmucal-node.h" -#include "../../soc/samsung/cal-if/exynos9810_evt0/cmucal-qch.h" -#include "../../soc/samsung/cal-if/exynos9810_evt0/clkout_exynos9810.h" -#include "composite.h" - -static struct samsung_clk_provider *exynos9810_clk_provider; -/* - * list of controller registers to be saved and restored during a - * suspend/resume cycle. - */ -/* fixed rate clocks generated outside the soc */ -struct samsung_fixed_rate exynos9810_fixed_rate_ext_clks[] __initdata = { - FRATE(OSCCLK, "fin_pll", NULL, 0, 26000000), -}; - -/* HWACG VCLK */ -struct init_vclk exynos9810_apm_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_DLL, MUX_DLL_USER, "UMUX_DLL", NULL, 0, VCLK_GATE, NULL), - - HWACG_VCLK(GATE_GREBE, GREBEINTEGRATION_QCH_GREBE, "GATE_GREBE", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GREBE_DBG, GREBEINTEGRATION_QCH_DBG, "GATE_GREBE_DBG", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_INTMEM, INTMEM_QCH, "GATE_INTMEM", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2CHUB, MAILBOX_AP2CHUB_QCH, "GATE_MAILBOX_AP2CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2CP, MAILBOX_AP2CP_QCH, "GATE_MAILBOX_AP2CP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2CP_S, MAILBOX_AP2CP_S_QCH, "GATE_MAILBOX_AP2CP_S", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2GNSS, MAILBOX_AP2GNSS_QCH, "GATE_MAILBOX_AP2GNSS", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_AP2VTS, MAILBOX_AP2VTS_QCH, "GATE_MAILBOX_AP2VTS", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2AP, MAILBOX_APM2AP_QCH, "GATE_MAILBOX_APM2AP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2CHUB, MAILBOX_APM2CHUB_QCH, "GATE_MAILBOX_APM2CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2CP, MAILBOX_APM2CP_QCH, "GATE_MAILBOX_APM2CP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_APM2GNSS, MAILBOX_APM2GNSS_QCH, "GATE_MAILBOX_APM2GNSS", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_CHUB2CP, MAILBOX_CHUB2CP_QCH, "GATE_MAILBOX_CHUB2CP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_GNSS2CHUB, MAILBOX_GNSS2CHUB_QCH, "GATE_MAILBOX_GNSS2CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_GNSS2CP, MAILBOX_GNSS2CP_QCH, "GATE_MAILBOX_GNSS2CP", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PEM, PEM_QCH, "GATE_PEM", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY_APM, SPEEDY_APM_QCH, "GATE_SPEEDY_APM", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPEEDY_SUB_APM, SPEEDY_SUB_APM_QCH, "GATE_SPEEDY_SUB_APM", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_APM, WDT_APM_QCH, "GATE_WDT_APM", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_abox_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_ABOX_ACLK, ABOX_QCH_ACLK, "GATE_ABOX_ACLK", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_BCLK_DSIF, ABOX_QCH_BCLK_DSIF, "GATE_ABOX_BCLK_DSIF", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_BCLK0, ABOX_QCH_BCLK0, "GATE_ABOX_BCLK0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_BCLK1, ABOX_QCH_BCLK1, "GATE_ABOX_BCLK1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_BCLK2, ABOX_QCH_BCLK2, "GATE_ABOX_BCLK2", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_BCLK3, ABOX_QCH_BCLK3, "GATE_ABOX_BCLK3", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_DUMMY, ABOX_QCH_DUMMY, "GATE_ABOX_DUMMY", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ABOX_DMIC, DMIC_QCH, "GATE_ABOX_DMIC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_ABOX, SYSMMU_AUD_QCH, "GATE_SYSMMU_AUD", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_ABOXCPU, WDT_AUD_QCH, "GATE_WDT_AUD", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_bus1_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_TREX_P_BUS1, TREX_P_BUS1_QCH, "GATE_TREX_P_BUS1", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_busc_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_PDMA0, PDMA0_QCH, "GATE_PDMA0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PPFW, PPFW_QCH, "GATE_PPFW", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SBIC, SBIC_QCH, "GATE_SBIC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SIREX, SIREX_QCH, "GATE_SIREX", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPDMA, SPDMA_QCH, "GATE_SPDMA", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_D_BUSC, TREX_D_BUSC_QCH, "GATE_TREX_D_BUSC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_P_BUSC, TREX_P_BUSC_QCH, "GATE_TREX_P_BUSC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_RB_BUSC, TREX_RB_BUSC_QCH, "GATE_TREX_RB_BUSC", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_chub_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_CM4_CHUB, CM4_CHUB_QCH, "GATE_CM4_CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CHUB00, I2C_CHUB00_QCH, "GATE_I2C_CHUB00", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CHUB01, I2C_CHUB01_QCH, "GATE_I2C_CHUB01", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PDMA_CHUB, PDMA_CHUB_QCH, "GATE_PDMA_CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PWM_CHUB, PWM_CHUB_QCH, "GATE_PWM_CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TIMER_CHUB, TIMER_CHUB_QCH, "GATE_TIMER_CHUB", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CHUB00, USI_CHUB00_QCH, "GATE_USI_CHUB00", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CHUB01, USI_CHUB01_QCH, "GATE_USI_CHUB01", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_CHUB, WDT_CHUB_QCH, "GATE_WDT_CHUB", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_cmgp_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_ADC_CMGP_S0, ADC_CMGP_QCH_S0, "GATE_ADC_CMGP_S0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ADC_CMGP_S1, ADC_CMGP_QCH_S1, "GATE_ADC_CMGP_S1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_ADC_CMGP, ADC_CMGP_QCH_ADC, "GATE_ADC_CMGP_ADC", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP00, I2C_CMGP00_QCH, "GATE_I2C_CMGP00", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP01, I2C_CMGP01_QCH, "GATE_I2C_CMGP01", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP02, I2C_CMGP02_QCH, "GATE_I2C_CMGP02", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CMGP03, I2C_CMGP03_QCH, "GATE_I2C_CMGP03", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP00, USI_CMGP00_QCH, "GATE_USI_CMGP00", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP01, USI_CMGP01_QCH, "GATE_USI_CMGP01", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP02, USI_CMGP02_QCH, "GATE_USI_CMGP02", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI_CMGP03, USI_CMGP03_QCH, "GATE_USI_CMGP03", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_cmu_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_CMU_CMUREF, CMU_CMU_CMUREF_QCH, "GATE_CMU_CMUREF", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK0, DFTMUX_TOP_QCH_CIS_CLK0, "GATE_CIS_CLK0", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK1, DFTMUX_TOP_QCH_CIS_CLK1, "GATE_CIS_CLK1", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK2, DFTMUX_TOP_QCH_CIS_CLK2, "GATE_CIS_CLK2", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DFTMUX_TOP_CIS_CLK3, DFTMUX_TOP_QCH_CIS_CLK3, "GATE_CIS_CLK3", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_OTP, OTP_QCH, "GATE_OTP", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_core_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_TREX_D_CORE, TREX_D_CORE_QCH, "GATE_TREX_D_CORE", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_P0_CORE, TREX_P0_CORE_QCH, "GATE_TREX_P0_CORE", NULL, 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_P1_CORE, TREX_P1_CORE_QCH, "GATE_TREX_P1_CORE", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dcf_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DCF_BUS, MUX_CLKCMU_DCF_BUS_USER, "UMUX_CLKCMU_DCF_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_DCF_CIP, IS_DCF_QCH_CIP, "GATE_IS_DCF_CIP", "UMUX_CLKCMU_DCF_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCF_C2SYNC_2SLV, IS_DCF_QCH_C2SYNC_2SLV, "GATE_IS_DCF_C2SYNC_2SLV", "UMUX_CLKCMU_DCF_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCF_SYSMMU, IS_DCF_QCH_SYSMMU, "GATE_IS_DCF_SYSMMU", "UMUX_CLKCMU_DCF_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dcpost_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DCPOST_BUS, MUX_CLKCMU_DCPOST_BUS_USER, "UMUX_CLKCMU_DCPOST_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_DCPOST_CIP2, IS_DCPOST_QCH_CIP2, "GATE_IS_DCPOST_CIP2", "UMUX_CLKCMU_DCPOST_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCPOST_C2SYNC_1SLV_CLK, IS_DCPOST_QCH_C2SYNC_1SLV_CLK, "GATE_IS_DCPOST_C2SYNC_1SLV_CLK", "UMUX_CLKCMU_DCPOST_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dcrd_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DCRD_BUS, MUX_CLKCMU_DCRD_BUS_USER, "UMUX_CLKCMU_DCRD_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_DCRD_DCP, IS_DCRD_QCH_DCP, "GATE_IS_DCRD_DCP", "UMUX_CLKCMU_DCRD_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCRD_SYSMMU, IS_DCRD_QCH_SYSMMU, "GATE_IS_DCRD_SYSMMU", "UMUX_CLKCMU_DCRD_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCRD_DCP_C2C, IS_DCRD_QCH_DCP_C2C, "GATE_IS_DCRD_DCP_C2C", "UMUX_CLKCMU_DCRD_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_DCRD_DCP_DIV2, IS_DCRD_QCH_DCP_DIV2, "GATE_IS_DCRD_DCP_DIV2", "UMUX_CLKCMU_DCRD_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dpu_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DPU_BUS, MUX_CLKCMU_DPU_BUS_USER, "UMUX_CLKCMU_DPU_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_DPU, DPU_QCH_DPU, "GATE_DPU_DPU", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU_DMA, DPU_QCH_DPU_DMA, "GATE_DPU_DMA", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU_DPP, DPU_QCH_DPU_DPP, "GATE_DPU_DPP", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DPU_WB_MUX, DPU_QCH_DPU_WB_MUX, "GATE_DPU_WB_MUX", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_DPUD0, SYSMMU_DPUD0_QCH, "GATE_SYSMMU_DPUD0", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_DPUD1, SYSMMU_DPUD1_QCH, "GATE_SYSMMU_DPUD1", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_DPUD2, SYSMMU_DPUD2_QCH, "GATE_SYSMMU_DPUD2", "UMUX_CLKCMU_DPU_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dspm_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DSPM_BUS, MUX_CLKCMU_DSPM_BUS_USER, "UMUX_CLKCMU_DSPM_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_CNN, CNN_QCH, "GATE_CNN", "UMUX_CLKCMU_DSPM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SCORE_MASTER, SCORE_MASTER_QCH, "GATE_SCORE_MASTER", "UMUX_CLKCMU_DSPM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_DSPM0, SYSMMU_DSPM0_QCH, "GATE_SMMU_DSPM0", "UMUX_CLKCMU_DSPM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_DSPM1, SYSMMU_DSPM1_QCH, "GATE_SMMU_DSPM1", "UMUX_CLKCMU_DSPM_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_DSPM2, SYSMMU_DSPM2_QCH, "GATE_SMMU_DSPM2", "UMUX_CLKCMU_DSPM_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_dsps_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_DSPS_BUS, MUX_CLKCMU_DSPS_BUS_USER, "UMUX_CLKCMU_DSPS_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_DSPS_AUD, MUX_CLKCMU_DSPS_AUD_USER, "UMUX_CLKCMU_DSPS_AUD", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_SCORE_KNIGHT, SCORE_KNIGHT_QCH, "GATE_SCORE_KNIGHT", "UMUX_CLKCMU_DSPS_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_fsys0_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_FSYS0_BUS, MUX_CLKCMU_FSYS0_BUS_USER, "UMUX_CLKCMU_FSYS0_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_UFS_EMBD, MUX_CLKCMU_FSYS0_UFS_EMBD_USER, "UMUX_CLKCMU_FSYS0_UFS_EMBD", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_USB30DRD, MUX_CLKCMU_FSYS0_USB30DRD_USER, "UMUX_CLKCMU_FSYS0_USB30DRD", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_DPGTC, MUX_CLKCMU_FSYS0_DPGTC_USER, "UMUX_CLKCMU_FSYS0_DPGTC", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS0_USBDP_DEBUG, MUX_CLKCMU_FSYS0_USBDP_DEBUG_USER, "UMUX_CLKCMU_FSYS0_USBDP_DEBUG", "UMUX_CLKCMU_FSYS0_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_DP_LINK, DP_LINK_QCH, "GATE_DP_LINK", "UMUX_CLKCMU_FSYS0_DPGTC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_DP_LINK_GTC, DP_LINK_QCH_GTC, "GATE_DP_LINK_GTC", "UMUX_CLKCMU_FSYS0_DPGTC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_EMBD, UFS_EMBD_QCH, "GATE_UFS_EMBD", "UMUX_CLKCMU_FSYS0_UFS_EMBD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_EMBD_FMP, UFS_EMBD_QCH_FMP, "GATE_UFS_EMBD_FMP", "UMUX_CLKCMU_FSYS0_UFS_EMBD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_USB30DRD_LINK, USB30DRD_QCH_USB30DRD_LINK, "GATE_USB30DRD_USB30DRD_LINK", "UMUX_CLKCMU_FSYS0_USB30DRD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_USBPCS, USB30DRD_QCH_USBPCS, "GATE_USB30DRD_USBPCS", "UMUX_CLKCMU_FSYS0_USB30DRD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_USB30DRD_CTRL, USB30DRD_QCH_USB30DRD_CTRL, "GATE_USB30DRD_USB30DRD_CTRL", "UMUX_CLKCMU_FSYS0_USB30DRD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_USBDPPHY, USB30DRD_QCH_USBDPPHY, "GATE_USB30DRD_USBDPPHY", "UMUX_CLKCMU_FSYS0_USB30DRD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USB30DRD_SOC_PLL, USB30DRD_QCH_SOC_PLL, "GATE_USB30DRD_SOC_PLL", "UMUX_CLKCMU_FSYS0_USBDP_DEBUG", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_fsys1_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_FSYS1_BUS, MUX_CLKCMU_FSYS1_BUS_USER, "UMUX_CLKCMU_FSYS1_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS1_PCIE, MUX_CLKCMU_FSYS1_PCIE_USER, "UMUX_CLKCMU_FSYS1_PCIE", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS1_MMC_CARD, MUX_CLKCMU_FSYS1_MMC_CARD_USER, "UMUX_CLKCMU_FSYS1_MMC_CARD", "UMUX_CLKCMU_FSYS1_BUS", 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_FSYS1_UFS_CARD, MUX_CLKCMU_FSYS1_UFS_CARD_USER, "UMUX_CLKCMU_FSYS1_UFS_CARD", "UMUX_CLKCMU_FSYS1_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_MMC_CARD, MMC_CARD_QCH, "GATE_MMC_CARD", "UMUX_CLKCMU_FSYS1_MMC_CARD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_MSTR, PCIE_GEN2_QCH_MSTR, "GATE_PCIE_GEN2_MSTR", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_PCS, PCIE_GEN2_QCH_PCS, "GATE_PCIE_GEN2_PCS", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_PHY, PCIE_GEN2_QCH_PHY, "GATE_PCIE_GEN2_PHY", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_DBI, PCIE_GEN2_QCH_DBI, "GATE_PCIE_GEN2_DBI", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_APB, PCIE_GEN2_QCH_APB, "GATE_PCIE_GEN2_APB", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN2_SOCPLL, PCIE_GEN2_QCH_SOCPLL, "GATE_PCIE_GEN2_SOCPLL", "UMUX_CLKCMU_FSYS1_PCIE", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_MSTR, PCIE_GEN3_QCH_MSTR, "GATE_PCIE_GEN3_MSTR", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_PCS, PCIE_GEN3_QCH_PCS, "GATE_PCIE_GEN3_PCS", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_DBI, PCIE_GEN3_QCH_DBI, "GATE_PCIE_GEN3_DBI", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_APB, PCIE_GEN3_QCH_APB, "GATE_PCIE_GEN3_APB", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_SOCPLL, PCIE_GEN3_QCH_SOCPLL, "GATE_PCIE_GEN3_SOCPLL", "UMUX_CLKCMU_FSYS1_PCIE", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_GEN3_PHY, PCIE_GEN3_QCH_PHY, "GATE_PCIE_GEN3", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_IA_GEN2, PCIE_IA_GEN2_QCH, "GATE_PCIE_IA_GEN2", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_PCIE_IA_GEN3, PCIE_IA_GEN3_QCH, "GATE_PCIE_IA_GEN3", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_RTIC, RTIC_QCH, "GATE_RTIC", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SSS, SSS_QCH, "GATE_SSS", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SYSMMU_FSYS1, SYSMMU_FSYS1_QCH, "GATE_SYSMMU_FSYS1", "UMUX_CLKCMU_FSYS1_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_CARD, UFS_CARD_QCH, "GATE_UFS_CARD", "UMUX_CLKCMU_FSYS1_UFS_CARD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UFS_CARD_FMP, UFS_CARD_QCH_FMP, "GATE_UFS_CARD_FMP", "UMUX_CLKCMU_FSYS1_UFS_CARD", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_g2d_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_G2D_MSCL, MUX_CLKCMU_G2D_MSCL_USER, "UMUX_CLKCMU_G2D_MSCL", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_G2D_G2D, MUX_CLKCMU_G2D_G2D_USER, "UMUX_CLKCMU_G2D_G2D", "UMUX_CLKCMU_G2D_MSCL", 0, 0, NULL), - - HWACG_VCLK(GATE_ASTC, ASTC_QCH, "GATE_ASTC", "UMUX_CLKCMU_G2D_MSCL", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_G2D, G2D_QCH, "GATE_G2D", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_JPEG, JPEG_QCH, "GATE_JPEG", "UMUX_CLKCMU_G2D_MSCL", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MSCL, MSCL_QCH, "GATE_MSCL", "UMUX_CLKCMU_G2D_MSCL", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_G2DD0, SYSMMU_G2DD0_QCH, "GATE_SMMU_G2DD0", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_G2DD1, SYSMMU_G2DD1_QCH, "GATE_SMMU_G2DD1", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_G2DD2, SYSMMU_G2DD2_QCH, "GATE_SMMU_G2DD2", "UMUX_CLKCMU_G2D_G2D", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_g3d_hwacg_vclks[] __initdata = { - HWACG_VCLK(GATE_GPU, GPU_QCH, "GATE_GPU", NULL, 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_isphq_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_ISPHQ_BUS, MUX_CLKCMU_ISPHQ_BUS_USER, "UMUX_CLKCMU_ISPHQ_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_ISPHQ, IS_ISPHQ_QCH_ISPHQ, "GATE_IS_ISPHQ", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPHQ_C2COM, IS_ISPHQ_QCH_ISPHQ_C2COM, "GATE_IS_ISPHQ_C2COM", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPHQ_SYSMMU, IS_ISPHQ_QCH_SYSMMU_ISPHQ, "GATE_IS_ISPHQ_SYSMMU", "UMUX_CLKCMU_ISPHQ_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_isplp_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_ISPLP_BUS, MUX_CLKCMU_ISPLP_BUS_USER, "UMUX_CLKCMU_ISPLP_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_ISPLP_VRA, MUX_CLKCMU_ISPLP_VRA_USER, "UMUX_CLKCMU_ISPLP_VRA", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_ISPLP_GDC, MUX_CLKCMU_ISPLP_GDC_USER, "UMUX_CLKCMU_ISPLP_GDC", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_ISPLP_MC_SCALER, IS_ISPLP_QCH_MC_SCALER, "GATE_IS_ISPLP_MC_SCALER", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP, IS_ISPLP_QCH_ISPLP, "GATE_IS_ISPLP_ISPLP", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_VRA, IS_ISPLP_QCH_VRA, "GATE_IS_ISPLP_VRA", "UMUX_CLKCMU_ISPLP_VRA", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_GDC, IS_ISPLP_QCH_GDC, "GATE_IS_ISPLP_GDC", "UMUX_CLKCMU_ISPLP_GDC", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPLP_C2, IS_ISPLP_QCH_ISPLP_C2, "GATE_IS_ISPLP_ISPLP_C2", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_SYSMMU_ISPLP0, IS_ISPLP_QCH_SYSMMU_ISPLP0, "GATE_IS_ISPLP_SYSMMU_ISPLP0", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_SYSMMU_ISPLP1, IS_ISPLP_QCH_SYSMMU_ISPLP1, "GATE_IS_ISPLP_SYSMMU_ISPLP1", "UMUX_CLKCMU_ISPLP_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_isppre_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_ISPPRE_BUS, MUX_CLKCMU_ISPPRE_BUS_USER, "UMUX_CLKCMU_ISPPRE_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IS_ISPPRE_CSIS0, IS_ISPPRE_QCH_CSIS0, "GATE_IS_ISPPRE_CSIS0", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_CSIS1, IS_ISPPRE_QCH_CSIS1, "GATE_IS_ISPPRE_CSIS1", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_CSIS2, IS_ISPPRE_QCH_CSIS2, "GATE_IS_ISPPRE_CSIS2", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_CSIS3, IS_ISPPRE_QCH_CSIS3, "GATE_IS_ISPPRE_CSIS3", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_PDP_DMA, IS_ISPPRE_QCH_PDP_DMA, "GATE_IS_ISPPRE_PDP_DMA", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_SYSMMU, IS_ISPPRE_QCH_SYSMMU_ISPPRE, "GATE_IS_ISPPRE_SYSMMU", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_3AA, IS_ISPPRE_QCH_3AA, "GATE_IS_ISPPRE_3AA", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_3AAM, IS_ISPPRE_QCH_3AAM, "GATE_IS_ISPPRE_3AAM", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_PDP_CORE0, IS_ISPPRE_QCH_PDP_CORE0, "GATE_IS_ISPPRE_PDP_CORE0", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IS_ISPPRE_PDP_CORE1, IS_ISPPRE_QCH_PDP_CORE1, "GATE_IS_ISPPRE_PDP_CORE1", "UMUX_CLKCMU_ISPPRE_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_iva_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_IVA_BUS, MUX_CLKCMU_IVA_BUS_USER, "UMUX_CLKCMU_IVA_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_IVA, IVA_QCH_IVA, "GATE_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IVA_DEBUG, IVA_QCH_IVA_DEBUG, "GATE_IVA_DEBUG", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_IVA_INTMEM, IVA_INTMEM_QCH, "GATE_IVA_INTMEM", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_IVA, SYSMMU_IVA_QCH, "GATE_SMMU_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_TREX_RB_IVA, TREX_RB_IVA_QCH, "GATE_TREX_RB_IVA", "UMUX_CLKCMU_IVA_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_mfc_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_MFC_BUS, MUX_CLKCMU_MFC_BUS_USER, "UMUX_CLKCMU_MFC_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_MFC_WFD, MUX_CLKCMU_MFC_WFD_USER, "UMUX_CLKCMU_MFC_WFD", "UMUX_CLKCMU_MFC_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_MFC, MFC_QCH, "GATE_MFC", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WFD, WFD_QCH, "GATE_WFD", "UMUX_CLKCMU_MFC_WFD", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_MFCD0, SYSMMU_MFCD0_QCH, "GATE_SMMU_MFCD0", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SMMU_MFCD1, SYSMMU_MFCD1_QCH, "GATE_SMMU_MFCD1", "UMUX_CLKCMU_MFC_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_peric0_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_PERIC0_BUS, MUX_CLKCMU_PERIC0_BUS_USER, "UMUX_CLKCMU_PERIC0_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC0_IP, MUX_CLKCMU_PERIC0_IP_USER, "UMUX_CLKCMU_PERIC0_IP", "UMUX_CLKCMU_PERIC0_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_PWM, PWM_QCH, "GATE_PWM", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UART_DBG, UART_DBG_QCH, "GATE_UART_DBG", "UMUX_CLKCMU_PERIC0_BUS", 0, 0, "console-pclk0"), - HWACG_VCLK(GATE_USI00_I2C, USI00_I2C_QCH, "GATE_USI00_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI00, USI00_USI_QCH, "GATE_USI00_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI01_I2C, USI01_I2C_QCH, "GATE_USI01_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI01, USI01_USI_QCH, "GATE_USI01_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI02_I2C, USI02_I2C_QCH, "GATE_USI02_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI02, USI02_USI_QCH, "GATE_USI02_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI03_I2C, USI03_I2C_QCH, "GATE_USI03_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI03, USI03_USI_QCH, "GATE_USI03_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI04_I2C, USI04_I2C_QCH, "GATE_USI04_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI04, USI04_USI_QCH, "GATE_USI04_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI05_I2C, USI05_I2C_QCH, "GATE_USI05_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI05, USI05_USI_QCH, "GATE_USI05_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI12_I2C, USI12_I2C_QCH, "GATE_USI12_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI12, USI12_USI_QCH, "GATE_USI12_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI13_I2C, USI13_I2C_QCH, "GATE_USI13_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI13, USI13_USI_QCH, "GATE_USI13_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI14_I2C, USI14_I2C_QCH, "GATE_USI14_I2C", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI14, USI14_USI_QCH, "GATE_USI14_USI", "UMUX_CLKCMU_PERIC0_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_peric1_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_PERIC1_BUS, MUX_CLKCMU_PERIC1_BUS_USER, "UMUX_CLKCMU_PERIC1_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_PERIC1_IP, MUX_CLKCMU_PERIC1_IP_USER, "UMUX_CLKCMU_PERIC1_IP", "UMUX_CLKCMU_PERIC1_BUS", 0, 0, NULL), - - HWACG_VCLK(GATE_I2C_CAM0, I2C_CAM0_QCH, "GATE_I2C_CAM0", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CAM1, I2C_CAM1_QCH, "GATE_I2C_CAM1", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CAM2, I2C_CAM2_QCH, "GATE_I2C_CAM2", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_I2C_CAM3, I2C_CAM3_QCH, "GATE_I2C_CAM3", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_SPI_CAM0, SPI_CAM0_QCH, "GATE_SPI_CAM0", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_UART_BT, UART_BT_QCH, "GATE_UART_BT", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI06_I2C, USI06_I2C_QCH, "GATE_USI06_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI06, USI06_USI_QCH, "GATE_USI06", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI07_I2C, USI07_I2C_QCH, "GATE_USI07_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI07, USI07_USI_QCH, "GATE_USI07", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI08_I2C, USI08_I2C_QCH, "GATE_USI08_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI08, USI08_USI_QCH, "GATE_USI08", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI09_I2C, USI09_I2C_QCH, "GATE_USI09_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI09, USI09_USI_QCH, "GATE_USI09", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI10_I2C, USI10_I2C_QCH, "GATE_USI10_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI10, USI10_USI_QCH, "GATE_USI10", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI11_I2C, USI11_I2C_QCH, "GATE_USI11_I2C", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_USI11, USI11_USI_QCH, "GATE_USI11", "UMUX_CLKCMU_PERIC1_IP", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_peris_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_PERIS_BUS, MUX_CLKCMU_PERIS_BUS_USER, "UMUX_CLKCMU_PERIS_BUS", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_BUSIF_TMU, BUSIF_TMU_QCH, "GATE_BUSIF_TMU", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_GIC, GIC_QCH, "GATE_GIC", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MCT, MCT_QCH, "GATE_MCT", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_OTP_CON_BIRA, OTP_CON_BIRA_QCH, "GATE_OTP_CON_BIRA", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_OTP_CON_TOP, OTP_CON_TOP_QCH, "GATE_OTP_CON_TOP", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_CLUSTER0, WDT_CLUSTER0_QCH, "GATE_WDT_CLUSTER0", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_CLUSTER1, WDT_CLUSTER1_QCH, "GATE_WDT_CLUSTER1", "UMUX_CLKCMU_PERIS_BUS", 0, VCLK_GATE, NULL), -}; - -struct init_vclk exynos9810_vts_hwacg_vclks[] __initdata = { - HWACG_VCLK(UMUX_CLKCMU_VTS_BUS, MUX_CLKCMU_VTS_BUS_USER, "UMUX_CLKCMU_VTS_BUS", NULL, 0, 0, NULL), - HWACG_VCLK(UMUX_CLKCMU_VTS_DLL, MUX_CLKCMU_VTS_DLL_USER, "UMUX_CLKCMU_VTS_DLL", NULL, 0, 0, NULL), - - HWACG_VCLK(GATE_VTS_CPU, CORTEXM4INTEGRATION_QCH_CPU, "GATE_CORTEXM4_CPU", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_VTS_DMIC_IF, DMIC_IF_QCH_DMIC_CLK, "GATE_DMIC_IF", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_HWACG_SYS_DMIC0, HWACG_SYS_DMIC0_QCH, "GATE_HWACG_SYS_DMIC0", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_HWACG_SYS_DMIC1, HWACG_SYS_DMIC1_QCH, "GATE_HWACG_SYS_DMIC1", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_MAILBOX_VTS2CHUB, MAILBOX_VTS2CHUB_QCH, "GATE_MAILBOX_VTS2CHUB", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_WDT_VTS, WDT_VTS_QCH, "GATE_WDT_VTS", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), - HWACG_VCLK(GATE_U_DMIC_CLK_MUX, U_DMIC_CLK_MUX_QCH, "GATE_U_DMIC_CLK_MUX", "UMUX_CLKCMU_VTS_BUS", 0, VCLK_GATE, NULL), -}; - -/* Special VCLK */ -struct init_vclk exynos9810_apm_vclks[] __initdata = { - VCLK(APM_DLL_CMGP, CLKCMU_APM_DLL_CMGP, "APM_DLL_CMGP", 0, 0, NULL), - VCLK(APM_DLL_VTS, CLKCMU_APM_DLL_VTS, "APM_DLL_VTS", 0, 0, NULL), -}; - -struct init_vclk exynos9810_abox_vclks[] __initdata = { - VCLK(DOUT_CLK_ABOX_ACLK, DIV_CLK_AUD_BUS, "DOUT_CLK_ABOX_ACLK", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_AUDIF, DIV_CLK_AUD_AUDIF, "DOUT_CLK_ABOX_AUDIF", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_DSIF, DIV_CLK_AUD_DSIF, "DOUT_CLK_ABOX_DSIF", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_DMIC, DIV_CLK_AUD_DMIC, "DOUT_CLK_ABOX_DMIC", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF0, DIV_CLK_AUD_UAIF0, "DOUT_CLK_ABOX_UAIF0", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF1, DIV_CLK_AUD_UAIF1, "DOUT_CLK_ABOX_UAIF1", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF2, DIV_CLK_AUD_UAIF2, "DOUT_CLK_ABOX_UAIF2", 0, 0, NULL), - VCLK(DOUT_CLK_ABOX_UAIF3, DIV_CLK_AUD_UAIF3, "DOUT_CLK_ABOX_UAIF3", 0, 0, NULL), - VCLK(PLL_OUT_AUD, PLL_AUD, "PLL_OUT_AUD", 0, 0, NULL), -}; - -struct init_vclk exynos9810_chub_vclks[] __initdata = { - VCLK(CHUB_USI00, DIV_CLK_CHUB_USI00, "CHUB_USI00", 0, 0, NULL), - VCLK(CHUB_USI01, DIV_CLK_CHUB_USI01, "CHUB_USI01", 0, 0, NULL), - VCLK(CHUB_USI_I2C, DIV_CLK_CHUB_I2C, "CHUB_USI_I2C", 0, 0, NULL), - VCLK(CHUB_TIMER_FCLK, CLK_CHUB_TIMER_FCLK, "CHUB_TIMER_FCLK", 0, 0, NULL), - VCLK(CHUB_BUS, DIV_CLK_CHUB_BUS, "CHUB_BUS", 0, 0, NULL), -}; - -struct init_vclk exynos9810_cmgp_vclks[] __initdata = { - VCLK(USI_CMGP00, DIV_CLK_USI_CMGP00, "USI_CMGP00", 0, 0, NULL), - VCLK(USI_CMGP01, DIV_CLK_USI_CMGP01, "USI_CMGP01", 0, 0, NULL), - VCLK(USI_CMGP02, DIV_CLK_USI_CMGP02, "USI_CMGP02", 0, 0, NULL), - VCLK(USI_CMGP03, DIV_CLK_USI_CMGP03, "USI_CMGP03", 0, 0, NULL), - VCLK(CMGP_USI_I2C, DIV_CLK_I2C_CMGP, "CMGP_USI_I2C", 0, 0, NULL), - VCLK(CMGP_ADC, DIV_CLK_CMGP_ADC, "CMGP_ADC", 0, 0, NULL), -}; - -struct init_vclk exynos9810_fsys0_vclks[] __initdata = { - VCLK(UFS_EMBD, VCLK_CLK_FSYS0_UFS_EMBD_BLK_CMU, "UFS_EMBD", 0, 0, NULL), - VCLK(DPGTC, VCLK_CLK_FSYS0_DPGTC_BLK_CMU, "DPGTC", 0, 0, NULL), - VCLK(USB30DRD, VCLK_CLK_FSYS0_USB30DRD_BLK_CMU, "USB30DRD", 0, 0, NULL), - VCLK(USBDP_DEBUG_USER, VCLK_MUX_CLKCMU_FSYS0_USBDP_DEBUG_USER_BLK_CMU, "USBDP_DEBUG_USER", 0, 0, NULL), -}; - -struct init_vclk exynos9810_fsys1_vclks[] __initdata = { - VCLK(MMC_CARD, CLKCMU_FSYS1_MMC_CARD, "MMC_CARD", 0, 0, NULL), - VCLK(UFS_CARD, VCLK_CLK_FSYS1_UFS_CARD_BLK_CMU, "UFS_CARD", 0, 0, NULL), -}; - -struct init_vclk exynos9810_peric0_vclks[] __initdata = { - VCLK(UART_DBG, DIV_CLK_PERIC0_UART_DBG, "UART_DBG", 0, 0, "console-sclk0"), - VCLK(USI00, DIV_CLK_PERIC0_USI00_USI, "USI00_USI", 0, 0, NULL), - VCLK(USI01, DIV_CLK_PERIC0_USI01_USI, "USI01_USI", 0, 0, NULL), - VCLK(USI02, DIV_CLK_PERIC0_USI02_USI, "USI02_USI", 0, 0, NULL), - VCLK(USI03, DIV_CLK_PERIC0_USI03_USI, "USI03_USI", 0, 0, NULL), - VCLK(USI04, DIV_CLK_PERIC0_USI04_USI, "USI04_USI", 0, 0, NULL), - VCLK(USI05, DIV_CLK_PERIC0_USI05_USI, "USI05_USI", 0, 0, NULL), - VCLK(USI12, DIV_CLK_PERIC0_USI12_USI, "USI12_USI", 0, 0, NULL), - VCLK(USI13, DIV_CLK_PERIC0_USI13_USI, "USI13_USI", 0, 0, NULL), - VCLK(USI14, DIV_CLK_PERIC0_USI14_USI, "USI14_USI", 0, 0, NULL), - VCLK(PERIC0_USI_I2C, DIV_CLK_PERIC0_USI_I2C, "PERIC0_USI_I2C", 0, 0, NULL), -}; - -struct init_vclk exynos9810_peric1_vclks[] __initdata = { - VCLK(UART_BT, DIV_CLK_PERIC1_UART_BT, "UART_BT", 0, 0, NULL), - VCLK(I2C_CAM0, DIV_CLK_PERIC1_I2C_CAM0, "I2C_CAM0", 0, 0, NULL), - VCLK(I2C_CAM1, DIV_CLK_PERIC1_I2C_CAM1, "I2C_CAM1", 0, 0, NULL), - VCLK(I2C_CAM2, DIV_CLK_PERIC1_I2C_CAM2, "I2C_CAM2", 0, 0, NULL), - VCLK(I2C_CAM3, DIV_CLK_PERIC1_I2C_CAM3, "I2C_CAM3", 0, 0, NULL), - VCLK(SPI_CAM0, DIV_CLK_PERIC1_SPI_CAM0, "SPI_CAM0", 0, 0, NULL), - VCLK(USI06, DIV_CLK_PERIC1_USI06_USI, "USI06", 0, 0, NULL), - VCLK(USI07, DIV_CLK_PERIC1_USI07_USI, "USI07", 0, 0, NULL), - VCLK(USI08, DIV_CLK_PERIC1_USI08_USI, "USI08", 0, 0, NULL), - VCLK(USI09, DIV_CLK_PERIC1_USI09_USI, "USI09", 0, 0, NULL), - VCLK(USI10, DIV_CLK_PERIC1_USI10_USI, "USI10", 0, 0, NULL), - VCLK(USI11, DIV_CLK_PERIC1_USI11_USI, "USI11", 0, 0, NULL), - VCLK(PERIC1_USI_I2C, DIV_CLK_PERIC1_USI_I2C, "PERIC1_USI_I2C", 0, 0, NULL), -}; - -struct init_vclk exynos9810_cmu_vclks[] __initdata = { - VCLK(CIS_CLK0, CLKCMU_CIS_CLK0, "CIS_CLK0", 0, 0, NULL), - VCLK(CIS_CLK1, CLKCMU_CIS_CLK1, "CIS_CLK1", 0, 0, NULL), - VCLK(CIS_CLK2, CLKCMU_CIS_CLK2, "CIS_CLK2", 0, 0, NULL), - VCLK(CIS_CLK3, CLKCMU_CIS_CLK3, "CIS_CLK3", 0, 0, NULL), - VCLK(HPM, VCLK_CLKCMU_HPM_BLK_CMU, "HPM", 0, 0, NULL), -}; - -struct init_vclk exynos9810_vts_vclks[] __initdata = { - VCLK(DOUT_CLK_VTS_DMICIF, DIV_CLK_VTS_DMIC_IF, "DOUT_CLK_VTS_DMICIF", 0, 0, NULL), - VCLK(DOUT_CLK_VTS_DMIC, DIV_CLK_VTS_DMIC, "DOUT_CLK_VTS_DMIC", 0, 0, NULL), - VCLK(DOUT_CLK_VTS_DMIC_DIV2, DIV_CLK_VTS_DMIC_DIV2, "DOUT_CLK_VTS_DMIC_DIV2", 0, 0, NULL), -}; - -static struct init_vclk exynos9810_clkout_vclks[] __initdata = { - VCLK(OSC_NFC, VCLK_CLKOUT1, "OSC_NFC", 0, 0, NULL), - VCLK(OSC_AUD, VCLK_CLKOUT0, "OSC_AUD", 0, 0, NULL), -}; - -static __initdata struct of_device_id ext_clk_match[] = { - {.compatible = "samsung,exynos9810-oscclk", .data = (void *)0}, - {}, -}; - -void exynos9810_vclk_init(void) -{ - /* Common clock init */ -} - -/* register exynos9810 clocks */ -void __init exynos9810_clk_init(struct device_node *np) -{ - void __iomem *reg_base; - int ret; - - if (np) { - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - } else { - panic("%s: unable to determine soc\n", __func__); - } - - ret = cal_if_init(np); - if (ret) - panic("%s: unable to initialize cal-if\n", __func__); - - exynos9810_clk_provider = samsung_clk_init(np, reg_base, CLK_NR_CLKS); - if (!exynos9810_clk_provider) - panic("%s: unable to allocate context.\n", __func__); - - samsung_register_of_fixed_ext(exynos9810_clk_provider, exynos9810_fixed_rate_ext_clks, - ARRAY_SIZE(exynos9810_fixed_rate_ext_clks), - ext_clk_match); - /* register HWACG vclk */ - samsung_register_vclk(exynos9810_clk_provider, exynos9810_apm_hwacg_vclks, ARRAY_SIZE(exynos9810_apm_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_abox_hwacg_vclks, ARRAY_SIZE(exynos9810_abox_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_bus1_hwacg_vclks, ARRAY_SIZE(exynos9810_bus1_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_busc_hwacg_vclks, ARRAY_SIZE(exynos9810_busc_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_chub_hwacg_vclks, ARRAY_SIZE(exynos9810_chub_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_cmgp_hwacg_vclks, ARRAY_SIZE(exynos9810_cmgp_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_cmu_hwacg_vclks, ARRAY_SIZE(exynos9810_cmu_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_core_hwacg_vclks, ARRAY_SIZE(exynos9810_core_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dcf_hwacg_vclks, ARRAY_SIZE(exynos9810_dcf_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dcpost_hwacg_vclks, ARRAY_SIZE(exynos9810_dcpost_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dcrd_hwacg_vclks, ARRAY_SIZE(exynos9810_dcrd_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dpu_hwacg_vclks, ARRAY_SIZE(exynos9810_dpu_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dspm_hwacg_vclks, ARRAY_SIZE(exynos9810_dspm_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_dsps_hwacg_vclks, ARRAY_SIZE(exynos9810_dsps_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_fsys0_hwacg_vclks, ARRAY_SIZE(exynos9810_fsys0_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_fsys1_hwacg_vclks, ARRAY_SIZE(exynos9810_fsys1_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_g2d_hwacg_vclks, ARRAY_SIZE(exynos9810_g2d_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_g3d_hwacg_vclks, ARRAY_SIZE(exynos9810_g3d_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_isphq_hwacg_vclks, ARRAY_SIZE(exynos9810_isphq_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_isplp_hwacg_vclks, ARRAY_SIZE(exynos9810_isplp_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_isppre_hwacg_vclks, ARRAY_SIZE(exynos9810_isppre_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_iva_hwacg_vclks, ARRAY_SIZE(exynos9810_iva_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_mfc_hwacg_vclks, ARRAY_SIZE(exynos9810_mfc_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_peric0_hwacg_vclks, ARRAY_SIZE(exynos9810_peric0_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_peric1_hwacg_vclks, ARRAY_SIZE(exynos9810_peric1_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_peris_hwacg_vclks, ARRAY_SIZE(exynos9810_peris_hwacg_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_vts_hwacg_vclks, ARRAY_SIZE(exynos9810_vts_hwacg_vclks)); - - /* register special vclk */ - samsung_register_vclk(exynos9810_clk_provider, exynos9810_apm_vclks, ARRAY_SIZE(exynos9810_apm_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_abox_vclks, ARRAY_SIZE(exynos9810_abox_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_chub_vclks, ARRAY_SIZE(exynos9810_chub_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_cmgp_vclks, ARRAY_SIZE(exynos9810_cmgp_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_cmu_vclks, ARRAY_SIZE(exynos9810_cmu_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_fsys0_vclks, ARRAY_SIZE(exynos9810_fsys0_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_fsys1_vclks, ARRAY_SIZE(exynos9810_fsys1_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_peric0_vclks, ARRAY_SIZE(exynos9810_peric0_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_peric1_vclks, ARRAY_SIZE(exynos9810_peric1_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_vts_vclks, ARRAY_SIZE(exynos9810_vts_vclks)); - samsung_register_vclk(exynos9810_clk_provider, exynos9810_clkout_vclks, ARRAY_SIZE(exynos9810_clkout_vclks)); - - clk_register_fixed_factor(NULL, "pwm-clock", "fin_pll", CLK_SET_RATE_PARENT, 1, 1); - - samsung_clk_of_add_provider(np, exynos9810_clk_provider); - - late_time_init = exynos9810_vclk_init; - - pr_info("EXYNOS9810: Clock setup completed\n"); -} - -CLK_OF_DECLARE(exynos9810_clk, "samsung,exynos9810-clock", exynos9810_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-pll.c b/drivers/clk/samsung/samsung/clk-pll.c deleted file mode 100644 index 9617825daabb..000000000000 --- a/drivers/clk/samsung/samsung/clk-pll.c +++ /dev/null @@ -1,1375 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Copyright (c) 2013 Linaro Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This file contains the utility functions to register the pll clocks. -*/ - -#include -#include -#include -#include -#include -#include "clk.h" -#include "clk-pll.h" - -#define PLL_TIMEOUT_MS 10 - -struct samsung_clk_pll { - struct clk_hw hw; - void __iomem *lock_reg; - void __iomem *con_reg; - enum samsung_pll_type type; - unsigned int rate_count; - const struct samsung_pll_rate_table *rate_table; -}; - -#define to_clk_pll(_hw) container_of(_hw, struct samsung_clk_pll, hw) - -static const struct samsung_pll_rate_table *samsung_get_pll_settings( - struct samsung_clk_pll *pll, unsigned long rate) -{ - const struct samsung_pll_rate_table *rate_table = pll->rate_table; - int i; - - for (i = 0; i < pll->rate_count; i++) { - if (rate == rate_table[i].rate) - return &rate_table[i]; - } - - return NULL; -} - -static long samsung_pll_round_rate(struct clk_hw *hw, - unsigned long drate, unsigned long *prate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - const struct samsung_pll_rate_table *rate_table = pll->rate_table; - int i; - - /* Assumming rate_table is in descending order */ - for (i = 0; i < pll->rate_count; i++) { - if (drate >= rate_table[i].rate) - return rate_table[i].rate; - } - - /* return minimum supported value */ - return rate_table[i - 1].rate; -} - -/* - * PLL2126 Clock Type - */ - -#define PLL2126_MDIV_MASK (0xff) -#define PLL2126_PDIV_MASK (0x3f) -#define PLL2126_SDIV_MASK (0x3) -#define PLL2126_MDIV_SHIFT (16) -#define PLL2126_PDIV_SHIFT (8) -#define PLL2126_SDIV_SHIFT (0) - -static unsigned long samsung_pll2126_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 pll_con, mdiv, pdiv, sdiv; - u64 fvco = parent_rate; - - pll_con = readl_relaxed(pll->con_reg); - mdiv = (pll_con >> PLL2126_MDIV_SHIFT) & PLL2126_MDIV_MASK; - pdiv = (pll_con >> PLL2126_PDIV_SHIFT) & PLL2126_PDIV_MASK; - sdiv = (pll_con >> PLL2126_SDIV_SHIFT) & PLL2126_SDIV_MASK; - - fvco *= (mdiv + 8); - do_div(fvco, (pdiv + 2) << sdiv); - - return (unsigned long)fvco; -} - -static const struct clk_ops samsung_pll2126_clk_ops = { - .recalc_rate = samsung_pll2126_recalc_rate, -}; - -/* - * PLL3000 Clock Type - */ - -#define PLL3000_MDIV_MASK (0xff) -#define PLL3000_PDIV_MASK (0x3) -#define PLL3000_SDIV_MASK (0x3) -#define PLL3000_MDIV_SHIFT (16) -#define PLL3000_PDIV_SHIFT (8) -#define PLL3000_SDIV_SHIFT (0) - -static unsigned long samsung_pll3000_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 pll_con, mdiv, pdiv, sdiv; - u64 fvco = parent_rate; - - pll_con = readl_relaxed(pll->con_reg); - mdiv = (pll_con >> PLL3000_MDIV_SHIFT) & PLL3000_MDIV_MASK; - pdiv = (pll_con >> PLL3000_PDIV_SHIFT) & PLL3000_PDIV_MASK; - sdiv = (pll_con >> PLL3000_SDIV_SHIFT) & PLL3000_SDIV_MASK; - - fvco *= (2 * (mdiv + 8)); - do_div(fvco, pdiv << sdiv); - - return (unsigned long)fvco; -} - -static const struct clk_ops samsung_pll3000_clk_ops = { - .recalc_rate = samsung_pll3000_recalc_rate, -}; - -/* - * PLL35xx Clock Type - */ -/* Maximum lock time can be 270 * PDIV cycles */ -#define PLL35XX_LOCK_FACTOR (270) - -#define PLL35XX_MDIV_MASK (0x3FF) -#define PLL35XX_PDIV_MASK (0x3F) -#define PLL35XX_SDIV_MASK (0x7) -#define PLL35XX_LOCK_STAT_MASK (0x1) -#define PLL35XX_MDIV_SHIFT (16) -#define PLL35XX_PDIV_SHIFT (8) -#define PLL35XX_SDIV_SHIFT (0) -#define PLL35XX_LOCK_STAT_SHIFT (29) - -static unsigned long samsung_pll35xx_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 mdiv, pdiv, sdiv, pll_con; - u64 fvco = parent_rate; - - pll_con = readl_relaxed(pll->con_reg); - mdiv = (pll_con >> PLL35XX_MDIV_SHIFT) & PLL35XX_MDIV_MASK; - pdiv = (pll_con >> PLL35XX_PDIV_SHIFT) & PLL35XX_PDIV_MASK; - sdiv = (pll_con >> PLL35XX_SDIV_SHIFT) & PLL35XX_SDIV_MASK; - - fvco *= mdiv; - do_div(fvco, (pdiv << sdiv)); - - return (unsigned long)fvco; -} - -static inline bool samsung_pll35xx_mp_change( - const struct samsung_pll_rate_table *rate, u32 pll_con) -{ - u32 old_mdiv, old_pdiv; - - old_mdiv = (pll_con >> PLL35XX_MDIV_SHIFT) & PLL35XX_MDIV_MASK; - old_pdiv = (pll_con >> PLL35XX_PDIV_SHIFT) & PLL35XX_PDIV_MASK; - - return (rate->mdiv != old_mdiv || rate->pdiv != old_pdiv); -} - -static int samsung_pll35xx_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long prate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - const struct samsung_pll_rate_table *rate; - u32 tmp; - - /* Get required rate settings from table */ - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, clk_hw_get_name(hw)); - return -EINVAL; - } - - tmp = readl_relaxed(pll->con_reg); - - if (!(samsung_pll35xx_mp_change(rate, tmp))) { - /* If only s change, change just s value only*/ - tmp &= ~(PLL35XX_SDIV_MASK << PLL35XX_SDIV_SHIFT); - tmp |= rate->sdiv << PLL35XX_SDIV_SHIFT; - writel_relaxed(tmp, pll->con_reg); - - return 0; - } - - /* Set PLL lock time. */ - writel_relaxed(rate->pdiv * PLL35XX_LOCK_FACTOR, - pll->lock_reg); - - /* Change PLL PMS values */ - tmp &= ~((PLL35XX_MDIV_MASK << PLL35XX_MDIV_SHIFT) | - (PLL35XX_PDIV_MASK << PLL35XX_PDIV_SHIFT) | - (PLL35XX_SDIV_MASK << PLL35XX_SDIV_SHIFT)); - tmp |= (rate->mdiv << PLL35XX_MDIV_SHIFT) | - (rate->pdiv << PLL35XX_PDIV_SHIFT) | - (rate->sdiv << PLL35XX_SDIV_SHIFT); - writel_relaxed(tmp, pll->con_reg); - - /* wait_lock_time */ - do { - cpu_relax(); - tmp = readl_relaxed(pll->con_reg); - } while (!(tmp & (PLL35XX_LOCK_STAT_MASK - << PLL35XX_LOCK_STAT_SHIFT))); - return 0; -} - -static const struct clk_ops samsung_pll35xx_clk_ops = { - .recalc_rate = samsung_pll35xx_recalc_rate, - .round_rate = samsung_pll_round_rate, - .set_rate = samsung_pll35xx_set_rate, -}; - -static const struct clk_ops samsung_pll35xx_clk_min_ops = { - .recalc_rate = samsung_pll35xx_recalc_rate, -}; - -/* - * PLL36xx Clock Type - */ -/* Maximum lock time can be 3000 * PDIV cycles */ -#define PLL36XX_LOCK_FACTOR (3000) - -#define PLL36XX_KDIV_MASK (0xFFFF) -#define PLL36XX_MDIV_MASK (0x1FF) -#define PLL36XX_PDIV_MASK (0x3F) -#define PLL36XX_SDIV_MASK (0x7) -#define PLL36XX_MDIV_SHIFT (16) -#define PLL36XX_PDIV_SHIFT (8) -#define PLL36XX_SDIV_SHIFT (0) -#define PLL36XX_KDIV_SHIFT (0) -#define PLL36XX_LOCK_STAT_SHIFT (29) - -static unsigned long samsung_pll36xx_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 mdiv, pdiv, sdiv, pll_con0, pll_con1; - s16 kdiv; - u64 fvco = parent_rate; - - pll_con0 = readl_relaxed(pll->con_reg); - pll_con1 = readl_relaxed(pll->con_reg + 4); - mdiv = (pll_con0 >> PLL36XX_MDIV_SHIFT) & PLL36XX_MDIV_MASK; - pdiv = (pll_con0 >> PLL36XX_PDIV_SHIFT) & PLL36XX_PDIV_MASK; - sdiv = (pll_con0 >> PLL36XX_SDIV_SHIFT) & PLL36XX_SDIV_MASK; - kdiv = (s16)(pll_con1 & PLL36XX_KDIV_MASK); - - fvco *= (mdiv << 16) + kdiv; - do_div(fvco, (pdiv << sdiv)); - fvco >>= 16; - - return (unsigned long)fvco; -} - -static inline bool samsung_pll36xx_mpk_change( - const struct samsung_pll_rate_table *rate, u32 pll_con0, u32 pll_con1) -{ - u32 old_mdiv, old_pdiv, old_kdiv; - - old_mdiv = (pll_con0 >> PLL36XX_MDIV_SHIFT) & PLL36XX_MDIV_MASK; - old_pdiv = (pll_con0 >> PLL36XX_PDIV_SHIFT) & PLL36XX_PDIV_MASK; - old_kdiv = (pll_con1 >> PLL36XX_KDIV_SHIFT) & PLL36XX_KDIV_MASK; - - return (rate->mdiv != old_mdiv || rate->pdiv != old_pdiv || - rate->kdiv != old_kdiv); -} - -static int samsung_pll36xx_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 tmp, pll_con0, pll_con1; - const struct samsung_pll_rate_table *rate; - - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, clk_hw_get_name(hw)); - return -EINVAL; - } - - pll_con0 = readl_relaxed(pll->con_reg); - pll_con1 = readl_relaxed(pll->con_reg + 4); - - if (!(samsung_pll36xx_mpk_change(rate, pll_con0, pll_con1))) { - /* If only s change, change just s value only*/ - pll_con0 &= ~(PLL36XX_SDIV_MASK << PLL36XX_SDIV_SHIFT); - pll_con0 |= (rate->sdiv << PLL36XX_SDIV_SHIFT); - writel_relaxed(pll_con0, pll->con_reg); - - return 0; - } - - /* Set PLL lock time. */ - writel_relaxed(rate->pdiv * PLL36XX_LOCK_FACTOR, pll->lock_reg); - - /* Change PLL PMS values */ - pll_con0 &= ~((PLL36XX_MDIV_MASK << PLL36XX_MDIV_SHIFT) | - (PLL36XX_PDIV_MASK << PLL36XX_PDIV_SHIFT) | - (PLL36XX_SDIV_MASK << PLL36XX_SDIV_SHIFT)); - pll_con0 |= (rate->mdiv << PLL36XX_MDIV_SHIFT) | - (rate->pdiv << PLL36XX_PDIV_SHIFT) | - (rate->sdiv << PLL36XX_SDIV_SHIFT); - writel_relaxed(pll_con0, pll->con_reg); - - pll_con1 &= ~(PLL36XX_KDIV_MASK << PLL36XX_KDIV_SHIFT); - pll_con1 |= rate->kdiv << PLL36XX_KDIV_SHIFT; - writel_relaxed(pll_con1, pll->con_reg + 4); - - /* wait_lock_time */ - do { - cpu_relax(); - tmp = readl_relaxed(pll->con_reg); - } while (!(tmp & (1 << PLL36XX_LOCK_STAT_SHIFT))); - - return 0; -} - -static const struct clk_ops samsung_pll36xx_clk_ops = { - .recalc_rate = samsung_pll36xx_recalc_rate, - .set_rate = samsung_pll36xx_set_rate, - .round_rate = samsung_pll_round_rate, -}; - -static const struct clk_ops samsung_pll36xx_clk_min_ops = { - .recalc_rate = samsung_pll36xx_recalc_rate, -}; - -/* - * PLL45xx Clock Type - */ -#define PLL4502_LOCK_FACTOR 400 -#define PLL4508_LOCK_FACTOR 240 - -#define PLL45XX_MDIV_MASK (0x3FF) -#define PLL45XX_PDIV_MASK (0x3F) -#define PLL45XX_SDIV_MASK (0x7) -#define PLL45XX_AFC_MASK (0x1F) -#define PLL45XX_MDIV_SHIFT (16) -#define PLL45XX_PDIV_SHIFT (8) -#define PLL45XX_SDIV_SHIFT (0) -#define PLL45XX_AFC_SHIFT (0) - -#define PLL45XX_ENABLE BIT(31) -#define PLL45XX_LOCKED BIT(29) - -static unsigned long samsung_pll45xx_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 mdiv, pdiv, sdiv, pll_con; - u64 fvco = parent_rate; - - pll_con = readl_relaxed(pll->con_reg); - mdiv = (pll_con >> PLL45XX_MDIV_SHIFT) & PLL45XX_MDIV_MASK; - pdiv = (pll_con >> PLL45XX_PDIV_SHIFT) & PLL45XX_PDIV_MASK; - sdiv = (pll_con >> PLL45XX_SDIV_SHIFT) & PLL45XX_SDIV_MASK; - - if (pll->type == pll_4508) - sdiv = sdiv - 1; - - fvco *= mdiv; - do_div(fvco, (pdiv << sdiv)); - - return (unsigned long)fvco; -} - -static bool samsung_pll45xx_mp_change(u32 pll_con0, u32 pll_con1, - const struct samsung_pll_rate_table *rate) -{ - u32 old_mdiv, old_pdiv, old_afc; - - old_mdiv = (pll_con0 >> PLL45XX_MDIV_SHIFT) & PLL45XX_MDIV_MASK; - old_pdiv = (pll_con0 >> PLL45XX_PDIV_SHIFT) & PLL45XX_PDIV_MASK; - old_afc = (pll_con1 >> PLL45XX_AFC_SHIFT) & PLL45XX_AFC_MASK; - - return (old_mdiv != rate->mdiv || old_pdiv != rate->pdiv - || old_afc != rate->afc); -} - -static int samsung_pll45xx_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long prate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - const struct samsung_pll_rate_table *rate; - u32 con0, con1; - ktime_t start; - - /* Get required rate settings from table */ - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, clk_hw_get_name(hw)); - return -EINVAL; - } - - con0 = readl_relaxed(pll->con_reg); - con1 = readl_relaxed(pll->con_reg + 0x4); - - if (!(samsung_pll45xx_mp_change(con0, con1, rate))) { - /* If only s change, change just s value only*/ - con0 &= ~(PLL45XX_SDIV_MASK << PLL45XX_SDIV_SHIFT); - con0 |= rate->sdiv << PLL45XX_SDIV_SHIFT; - writel_relaxed(con0, pll->con_reg); - - return 0; - } - - /* Set PLL PMS values. */ - con0 &= ~((PLL45XX_MDIV_MASK << PLL45XX_MDIV_SHIFT) | - (PLL45XX_PDIV_MASK << PLL45XX_PDIV_SHIFT) | - (PLL45XX_SDIV_MASK << PLL45XX_SDIV_SHIFT)); - con0 |= (rate->mdiv << PLL45XX_MDIV_SHIFT) | - (rate->pdiv << PLL45XX_PDIV_SHIFT) | - (rate->sdiv << PLL45XX_SDIV_SHIFT); - - /* Set PLL AFC value. */ - con1 = readl_relaxed(pll->con_reg + 0x4); - con1 &= ~(PLL45XX_AFC_MASK << PLL45XX_AFC_SHIFT); - con1 |= (rate->afc << PLL45XX_AFC_SHIFT); - - /* Set PLL lock time. */ - switch (pll->type) { - case pll_4502: - writel_relaxed(rate->pdiv * PLL4502_LOCK_FACTOR, pll->lock_reg); - break; - case pll_4508: - writel_relaxed(rate->pdiv * PLL4508_LOCK_FACTOR, pll->lock_reg); - break; - default: - break; - } - - /* Set new configuration. */ - writel_relaxed(con1, pll->con_reg + 0x4); - writel_relaxed(con0, pll->con_reg); - - /* Wait for locking. */ - start = ktime_get(); - while (!(readl_relaxed(pll->con_reg) & PLL45XX_LOCKED)) { - ktime_t delta = ktime_sub(ktime_get(), start); - - if (ktime_to_ms(delta) > PLL_TIMEOUT_MS) { - pr_err("%s: could not lock PLL %s\n", - __func__, clk_hw_get_name(hw)); - return -EFAULT; - } - - cpu_relax(); - } - - return 0; -} - -static const struct clk_ops samsung_pll45xx_clk_ops = { - .recalc_rate = samsung_pll45xx_recalc_rate, - .round_rate = samsung_pll_round_rate, - .set_rate = samsung_pll45xx_set_rate, -}; - -static const struct clk_ops samsung_pll45xx_clk_min_ops = { - .recalc_rate = samsung_pll45xx_recalc_rate, -}; - -/* - * PLL46xx Clock Type - */ -#define PLL46XX_LOCK_FACTOR 3000 - -#define PLL46XX_VSEL_MASK (1) -#define PLL46XX_MDIV_MASK (0x1FF) -#define PLL1460X_MDIV_MASK (0x3FF) - -#define PLL46XX_PDIV_MASK (0x3F) -#define PLL46XX_SDIV_MASK (0x7) -#define PLL46XX_VSEL_SHIFT (27) -#define PLL46XX_MDIV_SHIFT (16) -#define PLL46XX_PDIV_SHIFT (8) -#define PLL46XX_SDIV_SHIFT (0) - -#define PLL46XX_KDIV_MASK (0xFFFF) -#define PLL4650C_KDIV_MASK (0xFFF) -#define PLL46XX_KDIV_SHIFT (0) -#define PLL46XX_MFR_MASK (0x3F) -#define PLL46XX_MRR_MASK (0x1F) -#define PLL46XX_KDIV_SHIFT (0) -#define PLL46XX_MFR_SHIFT (16) -#define PLL46XX_MRR_SHIFT (24) - -#define PLL46XX_ENABLE BIT(31) -#define PLL46XX_LOCKED BIT(29) -#define PLL46XX_VSEL BIT(27) - -static unsigned long samsung_pll46xx_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 mdiv, pdiv, sdiv, kdiv, pll_con0, pll_con1, shift; - u64 fvco = parent_rate; - - pll_con0 = readl_relaxed(pll->con_reg); - pll_con1 = readl_relaxed(pll->con_reg + 4); - mdiv = (pll_con0 >> PLL46XX_MDIV_SHIFT) & ((pll->type == pll_1460x) ? - PLL1460X_MDIV_MASK : PLL46XX_MDIV_MASK); - pdiv = (pll_con0 >> PLL46XX_PDIV_SHIFT) & PLL46XX_PDIV_MASK; - sdiv = (pll_con0 >> PLL46XX_SDIV_SHIFT) & PLL46XX_SDIV_MASK; - kdiv = pll->type == pll_4650c ? pll_con1 & PLL4650C_KDIV_MASK : - pll_con1 & PLL46XX_KDIV_MASK; - - shift = ((pll->type == pll_4600) || (pll->type == pll_1460x)) ? 16 : 10; - - fvco *= (mdiv << shift) + kdiv; - do_div(fvco, (pdiv << sdiv)); - fvco >>= shift; - - return (unsigned long)fvco; -} - -static bool samsung_pll46xx_mpk_change(u32 pll_con0, u32 pll_con1, - const struct samsung_pll_rate_table *rate) -{ - u32 old_mdiv, old_pdiv, old_kdiv; - - old_mdiv = (pll_con0 >> PLL46XX_MDIV_SHIFT) & PLL46XX_MDIV_MASK; - old_pdiv = (pll_con0 >> PLL46XX_PDIV_SHIFT) & PLL46XX_PDIV_MASK; - old_kdiv = (pll_con1 >> PLL46XX_KDIV_SHIFT) & PLL46XX_KDIV_MASK; - - return (old_mdiv != rate->mdiv || old_pdiv != rate->pdiv - || old_kdiv != rate->kdiv); -} - -static int samsung_pll46xx_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long prate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - const struct samsung_pll_rate_table *rate; - u32 con0, con1, lock; - ktime_t start; - - /* Get required rate settings from table */ - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, clk_hw_get_name(hw)); - return -EINVAL; - } - - con0 = readl_relaxed(pll->con_reg); - con1 = readl_relaxed(pll->con_reg + 0x4); - - if (!(samsung_pll46xx_mpk_change(con0, con1, rate))) { - /* If only s change, change just s value only*/ - con0 &= ~(PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT); - con0 |= rate->sdiv << PLL46XX_SDIV_SHIFT; - writel_relaxed(con0, pll->con_reg); - - return 0; - } - - /* Set PLL lock time. */ - lock = rate->pdiv * PLL46XX_LOCK_FACTOR; - if (lock > 0xffff) - /* Maximum lock time bitfield is 16-bit. */ - lock = 0xffff; - - /* Set PLL PMS and VSEL values. */ - if (pll->type == pll_1460x) { - con0 &= ~((PLL1460X_MDIV_MASK << PLL46XX_MDIV_SHIFT) | - (PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT) | - (PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT)); - } else { - con0 &= ~((PLL46XX_MDIV_MASK << PLL46XX_MDIV_SHIFT) | - (PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT) | - (PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT) | - (PLL46XX_VSEL_MASK << PLL46XX_VSEL_SHIFT)); - con0 |= rate->vsel << PLL46XX_VSEL_SHIFT; - } - - con0 |= (rate->mdiv << PLL46XX_MDIV_SHIFT) | - (rate->pdiv << PLL46XX_PDIV_SHIFT) | - (rate->sdiv << PLL46XX_SDIV_SHIFT); - - /* Set PLL K, MFR and MRR values. */ - con1 = readl_relaxed(pll->con_reg + 0x4); - con1 &= ~((PLL46XX_KDIV_MASK << PLL46XX_KDIV_SHIFT) | - (PLL46XX_MFR_MASK << PLL46XX_MFR_SHIFT) | - (PLL46XX_MRR_MASK << PLL46XX_MRR_SHIFT)); - con1 |= (rate->kdiv << PLL46XX_KDIV_SHIFT) | - (rate->mfr << PLL46XX_MFR_SHIFT) | - (rate->mrr << PLL46XX_MRR_SHIFT); - - /* Write configuration to PLL */ - writel_relaxed(lock, pll->lock_reg); - writel_relaxed(con0, pll->con_reg); - writel_relaxed(con1, pll->con_reg + 0x4); - - /* Wait for locking. */ - start = ktime_get(); - while (!(readl_relaxed(pll->con_reg) & PLL46XX_LOCKED)) { - ktime_t delta = ktime_sub(ktime_get(), start); - - if (ktime_to_ms(delta) > PLL_TIMEOUT_MS) { - pr_err("%s: could not lock PLL %s\n", - __func__, clk_hw_get_name(hw)); - return -EFAULT; - } - - cpu_relax(); - } - - return 0; -} - -static const struct clk_ops samsung_pll46xx_clk_ops = { - .recalc_rate = samsung_pll46xx_recalc_rate, - .round_rate = samsung_pll_round_rate, - .set_rate = samsung_pll46xx_set_rate, -}; - -static const struct clk_ops samsung_pll46xx_clk_min_ops = { - .recalc_rate = samsung_pll46xx_recalc_rate, -}; - -/* - * PLL6552 Clock Type - */ - -#define PLL6552_MDIV_MASK 0x3ff -#define PLL6552_PDIV_MASK 0x3f -#define PLL6552_SDIV_MASK 0x7 -#define PLL6552_MDIV_SHIFT 16 -#define PLL6552_MDIV_SHIFT_2416 14 -#define PLL6552_PDIV_SHIFT 8 -#define PLL6552_PDIV_SHIFT_2416 5 -#define PLL6552_SDIV_SHIFT 0 - -static unsigned long samsung_pll6552_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 mdiv, pdiv, sdiv, pll_con; - u64 fvco = parent_rate; - - pll_con = readl_relaxed(pll->con_reg); - if (pll->type == pll_6552_s3c2416) { - mdiv = (pll_con >> PLL6552_MDIV_SHIFT_2416) & PLL6552_MDIV_MASK; - pdiv = (pll_con >> PLL6552_PDIV_SHIFT_2416) & PLL6552_PDIV_MASK; - } else { - mdiv = (pll_con >> PLL6552_MDIV_SHIFT) & PLL6552_MDIV_MASK; - pdiv = (pll_con >> PLL6552_PDIV_SHIFT) & PLL6552_PDIV_MASK; - } - sdiv = (pll_con >> PLL6552_SDIV_SHIFT) & PLL6552_SDIV_MASK; - - fvco *= mdiv; - do_div(fvco, (pdiv << sdiv)); - - return (unsigned long)fvco; -} - -static const struct clk_ops samsung_pll6552_clk_ops = { - .recalc_rate = samsung_pll6552_recalc_rate, -}; - -/* - * PLL6553 Clock Type - */ - -#define PLL6553_MDIV_MASK 0xff -#define PLL6553_PDIV_MASK 0x3f -#define PLL6553_SDIV_MASK 0x7 -#define PLL6553_KDIV_MASK 0xffff -#define PLL6553_MDIV_SHIFT 16 -#define PLL6553_PDIV_SHIFT 8 -#define PLL6553_SDIV_SHIFT 0 -#define PLL6553_KDIV_SHIFT 0 - -static unsigned long samsung_pll6553_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 mdiv, pdiv, sdiv, kdiv, pll_con0, pll_con1; - u64 fvco = parent_rate; - - pll_con0 = readl_relaxed(pll->con_reg); - pll_con1 = readl_relaxed(pll->con_reg + 0x4); - mdiv = (pll_con0 >> PLL6553_MDIV_SHIFT) & PLL6553_MDIV_MASK; - pdiv = (pll_con0 >> PLL6553_PDIV_SHIFT) & PLL6553_PDIV_MASK; - sdiv = (pll_con0 >> PLL6553_SDIV_SHIFT) & PLL6553_SDIV_MASK; - kdiv = (pll_con1 >> PLL6553_KDIV_SHIFT) & PLL6553_KDIV_MASK; - - fvco *= (mdiv << 16) + kdiv; - do_div(fvco, (pdiv << sdiv)); - fvco >>= 16; - - return (unsigned long)fvco; -} - -static const struct clk_ops samsung_pll6553_clk_ops = { - .recalc_rate = samsung_pll6553_recalc_rate, -}; - -/* - * PLL Clock Type of S3C24XX before S3C2443 - */ - -#define PLLS3C2410_MDIV_MASK (0xff) -#define PLLS3C2410_PDIV_MASK (0x1f) -#define PLLS3C2410_SDIV_MASK (0x3) -#define PLLS3C2410_MDIV_SHIFT (12) -#define PLLS3C2410_PDIV_SHIFT (4) -#define PLLS3C2410_SDIV_SHIFT (0) - -#define PLLS3C2410_ENABLE_REG_OFFSET 0x10 - -static unsigned long samsung_s3c2410_pll_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 pll_con, mdiv, pdiv, sdiv; - u64 fvco = parent_rate; - - pll_con = readl_relaxed(pll->con_reg); - mdiv = (pll_con >> PLLS3C2410_MDIV_SHIFT) & PLLS3C2410_MDIV_MASK; - pdiv = (pll_con >> PLLS3C2410_PDIV_SHIFT) & PLLS3C2410_PDIV_MASK; - sdiv = (pll_con >> PLLS3C2410_SDIV_SHIFT) & PLLS3C2410_SDIV_MASK; - - fvco *= (mdiv + 8); - do_div(fvco, (pdiv + 2) << sdiv); - - return (unsigned int)fvco; -} - -static unsigned long samsung_s3c2440_mpll_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 pll_con, mdiv, pdiv, sdiv; - u64 fvco = parent_rate; - - pll_con = readl_relaxed(pll->con_reg); - mdiv = (pll_con >> PLLS3C2410_MDIV_SHIFT) & PLLS3C2410_MDIV_MASK; - pdiv = (pll_con >> PLLS3C2410_PDIV_SHIFT) & PLLS3C2410_PDIV_MASK; - sdiv = (pll_con >> PLLS3C2410_SDIV_SHIFT) & PLLS3C2410_SDIV_MASK; - - fvco *= (2 * (mdiv + 8)); - do_div(fvco, (pdiv + 2) << sdiv); - - return (unsigned int)fvco; -} - -static int samsung_s3c2410_pll_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long prate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - const struct samsung_pll_rate_table *rate; - u32 tmp; - - /* Get required rate settings from table */ - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, clk_hw_get_name(hw)); - return -EINVAL; - } - - tmp = readl_relaxed(pll->con_reg); - - /* Change PLL PMS values */ - tmp &= ~((PLLS3C2410_MDIV_MASK << PLLS3C2410_MDIV_SHIFT) | - (PLLS3C2410_PDIV_MASK << PLLS3C2410_PDIV_SHIFT) | - (PLLS3C2410_SDIV_MASK << PLLS3C2410_SDIV_SHIFT)); - tmp |= (rate->mdiv << PLLS3C2410_MDIV_SHIFT) | - (rate->pdiv << PLLS3C2410_PDIV_SHIFT) | - (rate->sdiv << PLLS3C2410_SDIV_SHIFT); - writel_relaxed(tmp, pll->con_reg); - - /* Time to settle according to the manual */ - udelay(300); - - return 0; -} - -static int samsung_s3c2410_pll_enable(struct clk_hw *hw, int bit, bool enable) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 pll_en = readl_relaxed(pll->lock_reg + PLLS3C2410_ENABLE_REG_OFFSET); - u32 pll_en_orig = pll_en; - - if (enable) - pll_en &= ~BIT(bit); - else - pll_en |= BIT(bit); - - writel_relaxed(pll_en, pll->lock_reg + PLLS3C2410_ENABLE_REG_OFFSET); - - /* if we started the UPLL, then allow to settle */ - if (enable && (pll_en_orig & BIT(bit))) - udelay(300); - - return 0; -} - -static int samsung_s3c2410_mpll_enable(struct clk_hw *hw) -{ - return samsung_s3c2410_pll_enable(hw, 5, true); -} - -static void samsung_s3c2410_mpll_disable(struct clk_hw *hw) -{ - samsung_s3c2410_pll_enable(hw, 5, false); -} - -static int samsung_s3c2410_upll_enable(struct clk_hw *hw) -{ - return samsung_s3c2410_pll_enable(hw, 7, true); -} - -static void samsung_s3c2410_upll_disable(struct clk_hw *hw) -{ - samsung_s3c2410_pll_enable(hw, 7, false); -} - -static const struct clk_ops samsung_s3c2410_mpll_clk_min_ops = { - .recalc_rate = samsung_s3c2410_pll_recalc_rate, - .enable = samsung_s3c2410_mpll_enable, - .disable = samsung_s3c2410_mpll_disable, -}; - -static const struct clk_ops samsung_s3c2410_upll_clk_min_ops = { - .recalc_rate = samsung_s3c2410_pll_recalc_rate, - .enable = samsung_s3c2410_upll_enable, - .disable = samsung_s3c2410_upll_disable, -}; - -static const struct clk_ops samsung_s3c2440_mpll_clk_min_ops = { - .recalc_rate = samsung_s3c2440_mpll_recalc_rate, - .enable = samsung_s3c2410_mpll_enable, - .disable = samsung_s3c2410_mpll_disable, -}; - -static const struct clk_ops samsung_s3c2410_mpll_clk_ops = { - .recalc_rate = samsung_s3c2410_pll_recalc_rate, - .enable = samsung_s3c2410_mpll_enable, - .disable = samsung_s3c2410_mpll_disable, - .round_rate = samsung_pll_round_rate, - .set_rate = samsung_s3c2410_pll_set_rate, -}; - -static const struct clk_ops samsung_s3c2410_upll_clk_ops = { - .recalc_rate = samsung_s3c2410_pll_recalc_rate, - .enable = samsung_s3c2410_upll_enable, - .disable = samsung_s3c2410_upll_disable, - .round_rate = samsung_pll_round_rate, - .set_rate = samsung_s3c2410_pll_set_rate, -}; - -static const struct clk_ops samsung_s3c2440_mpll_clk_ops = { - .recalc_rate = samsung_s3c2440_mpll_recalc_rate, - .enable = samsung_s3c2410_mpll_enable, - .disable = samsung_s3c2410_mpll_disable, - .round_rate = samsung_pll_round_rate, - .set_rate = samsung_s3c2410_pll_set_rate, -}; - -/* - * PLL2550x Clock Type - */ - -#define PLL2550X_R_MASK (0x1) -#define PLL2550X_P_MASK (0x3F) -#define PLL2550X_M_MASK (0x3FF) -#define PLL2550X_S_MASK (0x7) -#define PLL2550X_R_SHIFT (20) -#define PLL2550X_P_SHIFT (14) -#define PLL2550X_M_SHIFT (4) -#define PLL2550X_S_SHIFT (0) - -static unsigned long samsung_pll2550x_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 r, p, m, s, pll_stat; - u64 fvco = parent_rate; - - pll_stat = readl_relaxed(pll->con_reg); - r = (pll_stat >> PLL2550X_R_SHIFT) & PLL2550X_R_MASK; - if (!r) - return 0; - p = (pll_stat >> PLL2550X_P_SHIFT) & PLL2550X_P_MASK; - m = (pll_stat >> PLL2550X_M_SHIFT) & PLL2550X_M_MASK; - s = (pll_stat >> PLL2550X_S_SHIFT) & PLL2550X_S_MASK; - - fvco *= m; - do_div(fvco, (p << s)); - - return (unsigned long)fvco; -} - -static const struct clk_ops samsung_pll2550x_clk_ops = { - .recalc_rate = samsung_pll2550x_recalc_rate, -}; - -/* - * PLL2550xx Clock Type - */ - -/* Maximum lock time can be 270 * PDIV cycles */ -#define PLL2550XX_LOCK_FACTOR 270 - -#define PLL2550XX_M_MASK 0x3FF -#define PLL2550XX_P_MASK 0x3F -#define PLL2550XX_S_MASK 0x7 -#define PLL2550XX_LOCK_STAT_MASK 0x1 -#define PLL2550XX_M_SHIFT 9 -#define PLL2550XX_P_SHIFT 3 -#define PLL2550XX_S_SHIFT 0 -#define PLL2550XX_LOCK_STAT_SHIFT 21 - -static unsigned long samsung_pll2550xx_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 mdiv, pdiv, sdiv, pll_con; - u64 fvco = parent_rate; - - pll_con = readl_relaxed(pll->con_reg); - mdiv = (pll_con >> PLL2550XX_M_SHIFT) & PLL2550XX_M_MASK; - pdiv = (pll_con >> PLL2550XX_P_SHIFT) & PLL2550XX_P_MASK; - sdiv = (pll_con >> PLL2550XX_S_SHIFT) & PLL2550XX_S_MASK; - - fvco *= mdiv; - do_div(fvco, (pdiv << sdiv)); - - return (unsigned long)fvco; -} - -static inline bool samsung_pll2550xx_mp_change(u32 mdiv, u32 pdiv, u32 pll_con) -{ - u32 old_mdiv, old_pdiv; - - old_mdiv = (pll_con >> PLL2550XX_M_SHIFT) & PLL2550XX_M_MASK; - old_pdiv = (pll_con >> PLL2550XX_P_SHIFT) & PLL2550XX_P_MASK; - - return mdiv != old_mdiv || pdiv != old_pdiv; -} - -static int samsung_pll2550xx_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long prate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - const struct samsung_pll_rate_table *rate; - u32 tmp; - - /* Get required rate settings from table */ - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, clk_hw_get_name(hw)); - return -EINVAL; - } - - tmp = readl_relaxed(pll->con_reg); - - if (!(samsung_pll2550xx_mp_change(rate->mdiv, rate->pdiv, tmp))) { - /* If only s change, change just s value only*/ - tmp &= ~(PLL2550XX_S_MASK << PLL2550XX_S_SHIFT); - tmp |= rate->sdiv << PLL2550XX_S_SHIFT; - writel_relaxed(tmp, pll->con_reg); - - return 0; - } - - /* Set PLL lock time. */ - writel_relaxed(rate->pdiv * PLL2550XX_LOCK_FACTOR, pll->lock_reg); - - /* Change PLL PMS values */ - tmp &= ~((PLL2550XX_M_MASK << PLL2550XX_M_SHIFT) | - (PLL2550XX_P_MASK << PLL2550XX_P_SHIFT) | - (PLL2550XX_S_MASK << PLL2550XX_S_SHIFT)); - tmp |= (rate->mdiv << PLL2550XX_M_SHIFT) | - (rate->pdiv << PLL2550XX_P_SHIFT) | - (rate->sdiv << PLL2550XX_S_SHIFT); - writel_relaxed(tmp, pll->con_reg); - - /* wait_lock_time */ - do { - cpu_relax(); - tmp = readl_relaxed(pll->con_reg); - } while (!(tmp & (PLL2550XX_LOCK_STAT_MASK - << PLL2550XX_LOCK_STAT_SHIFT))); - - return 0; -} - -static const struct clk_ops samsung_pll2550xx_clk_ops = { - .recalc_rate = samsung_pll2550xx_recalc_rate, - .round_rate = samsung_pll_round_rate, - .set_rate = samsung_pll2550xx_set_rate, -}; - -static const struct clk_ops samsung_pll2550xx_clk_min_ops = { - .recalc_rate = samsung_pll2550xx_recalc_rate, -}; - -/* - * PLL2650x Clock Type - */ - -/* Maximum lock time can be 3000 * PDIV cycles */ -#define PLL2650X_LOCK_FACTOR 3000 - -#define PLL2650X_M_MASK 0x1ff -#define PLL2650X_P_MASK 0x3f -#define PLL2650X_S_MASK 0x7 -#define PLL2650X_K_MASK 0xffff -#define PLL2650X_LOCK_STAT_MASK 0x1 -#define PLL2650X_M_SHIFT 16 -#define PLL2650X_P_SHIFT 8 -#define PLL2650X_S_SHIFT 0 -#define PLL2650X_K_SHIFT 0 -#define PLL2650X_LOCK_STAT_SHIFT 29 -#define PLL2650X_PLL_ENABLE_SHIFT 31 - -static unsigned long samsung_pll2650x_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u64 fout = parent_rate; - u32 mdiv, pdiv, sdiv, pll_con0, pll_con1; - s16 kdiv; - - pll_con0 = readl_relaxed(pll->con_reg); - mdiv = (pll_con0 >> PLL2650X_M_SHIFT) & PLL2650X_M_MASK; - pdiv = (pll_con0 >> PLL2650X_P_SHIFT) & PLL2650X_P_MASK; - sdiv = (pll_con0 >> PLL2650X_S_SHIFT) & PLL2650X_S_MASK; - - pll_con1 = readl_relaxed(pll->con_reg + 4); - kdiv = (s16)((pll_con1 >> PLL2650X_K_SHIFT) & PLL2650X_K_MASK); - - fout *= (mdiv << 16) + kdiv; - do_div(fout, (pdiv << sdiv)); - fout >>= 16; - - return (unsigned long)fout; -} - -static int samsung_pll2650x_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long prate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - const struct samsung_pll_rate_table *rate; - u32 con0, con1; - - /* Get required rate settings from table */ - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, clk_hw_get_name(hw)); - return -EINVAL; - } - - con0 = readl_relaxed(pll->con_reg); - con1 = readl_relaxed(pll->con_reg + 4); - - /* Set PLL lock time. */ - writel_relaxed(rate->pdiv * PLL2650X_LOCK_FACTOR, pll->lock_reg); - - /* Change PLL PMS values */ - con0 &= ~((PLL2650X_M_MASK << PLL2650X_M_SHIFT) | - (PLL2650X_P_MASK << PLL2650X_P_SHIFT) | - (PLL2650X_S_MASK << PLL2650X_S_SHIFT)); - con0 |= (rate->mdiv << PLL2650X_M_SHIFT) | - (rate->pdiv << PLL2650X_P_SHIFT) | - (rate->sdiv << PLL2650X_S_SHIFT); - con0 |= (1 << PLL2650X_PLL_ENABLE_SHIFT); - writel_relaxed(con0, pll->con_reg); - - con1 &= ~(PLL2650X_K_MASK << PLL2650X_K_SHIFT); - con1 |= ((rate->kdiv & PLL2650X_K_MASK) << PLL2650X_K_SHIFT); - writel_relaxed(con1, pll->con_reg + 4); - - do { - cpu_relax(); - con0 = readl_relaxed(pll->con_reg); - } while (!(con0 & (PLL2650X_LOCK_STAT_MASK - << PLL2650X_LOCK_STAT_SHIFT))); - - return 0; -} - -static const struct clk_ops samsung_pll2650x_clk_ops = { - .recalc_rate = samsung_pll2650x_recalc_rate, - .round_rate = samsung_pll_round_rate, - .set_rate = samsung_pll2650x_set_rate, -}; - -static const struct clk_ops samsung_pll2650x_clk_min_ops = { - .recalc_rate = samsung_pll2650x_recalc_rate, -}; - -/* - * PLL2650XX Clock Type - */ - -/* Maximum lock time can be 3000 * PDIV cycles */ -#define PLL2650XX_LOCK_FACTOR 3000 - -#define PLL2650XX_MDIV_SHIFT 9 -#define PLL2650XX_PDIV_SHIFT 3 -#define PLL2650XX_SDIV_SHIFT 0 -#define PLL2650XX_KDIV_SHIFT 0 -#define PLL2650XX_MDIV_MASK 0x1ff -#define PLL2650XX_PDIV_MASK 0x3f -#define PLL2650XX_SDIV_MASK 0x7 -#define PLL2650XX_KDIV_MASK 0xffff -#define PLL2650XX_PLL_ENABLE_SHIFT 23 -#define PLL2650XX_PLL_LOCKTIME_SHIFT 21 -#define PLL2650XX_PLL_FOUTMASK_SHIFT 31 - -static unsigned long samsung_pll2650xx_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 mdiv, pdiv, sdiv, pll_con0, pll_con2; - s16 kdiv; - u64 fvco = parent_rate; - - pll_con0 = readl_relaxed(pll->con_reg); - pll_con2 = readl_relaxed(pll->con_reg + 8); - mdiv = (pll_con0 >> PLL2650XX_MDIV_SHIFT) & PLL2650XX_MDIV_MASK; - pdiv = (pll_con0 >> PLL2650XX_PDIV_SHIFT) & PLL2650XX_PDIV_MASK; - sdiv = (pll_con0 >> PLL2650XX_SDIV_SHIFT) & PLL2650XX_SDIV_MASK; - kdiv = (s16)(pll_con2 & PLL2650XX_KDIV_MASK); - - fvco *= (mdiv << 16) + kdiv; - do_div(fvco, (pdiv << sdiv)); - fvco >>= 16; - - return (unsigned long)fvco; -} - -static int samsung_pll2650xx_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long parent_rate) -{ - struct samsung_clk_pll *pll = to_clk_pll(hw); - u32 tmp, pll_con0, pll_con2; - const struct samsung_pll_rate_table *rate; - - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, clk_hw_get_name(hw)); - return -EINVAL; - } - - pll_con0 = readl_relaxed(pll->con_reg); - pll_con2 = readl_relaxed(pll->con_reg + 8); - - /* Change PLL PMS values */ - pll_con0 &= ~(PLL2650XX_MDIV_MASK << PLL2650XX_MDIV_SHIFT | - PLL2650XX_PDIV_MASK << PLL2650XX_PDIV_SHIFT | - PLL2650XX_SDIV_MASK << PLL2650XX_SDIV_SHIFT); - pll_con0 |= rate->mdiv << PLL2650XX_MDIV_SHIFT; - pll_con0 |= rate->pdiv << PLL2650XX_PDIV_SHIFT; - pll_con0 |= rate->sdiv << PLL2650XX_SDIV_SHIFT; - pll_con0 |= 1 << PLL2650XX_PLL_ENABLE_SHIFT; - pll_con0 |= 1 << PLL2650XX_PLL_FOUTMASK_SHIFT; - - pll_con2 &= ~(PLL2650XX_KDIV_MASK << PLL2650XX_KDIV_SHIFT); - pll_con2 |= ((~(rate->kdiv) + 1) & PLL2650XX_KDIV_MASK) - << PLL2650XX_KDIV_SHIFT; - - /* Set PLL lock time. */ - writel_relaxed(PLL2650XX_LOCK_FACTOR * rate->pdiv, pll->lock_reg); - - writel_relaxed(pll_con0, pll->con_reg); - writel_relaxed(pll_con2, pll->con_reg + 8); - - do { - tmp = readl_relaxed(pll->con_reg); - } while (!(tmp & (0x1 << PLL2650XX_PLL_LOCKTIME_SHIFT))); - - return 0; -} - -static const struct clk_ops samsung_pll2650xx_clk_ops = { - .recalc_rate = samsung_pll2650xx_recalc_rate, - .set_rate = samsung_pll2650xx_set_rate, - .round_rate = samsung_pll_round_rate, -}; - -static const struct clk_ops samsung_pll2650xx_clk_min_ops = { - .recalc_rate = samsung_pll2650xx_recalc_rate, -}; - -static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx, - const struct samsung_pll_clock *pll_clk, - void __iomem *base) -{ - struct samsung_clk_pll *pll; - struct clk *clk; - struct clk_init_data init; - int ret, len; - - pll = kzalloc(sizeof(*pll), GFP_KERNEL); - if (!pll) { - pr_err("%s: could not allocate pll clk %s\n", - __func__, pll_clk->name); - return; - } - - init.name = pll_clk->name; - init.flags = pll_clk->flags; - init.parent_names = &pll_clk->parent_name; - init.num_parents = 1; - - if (pll_clk->rate_table) { - /* find count of rates in rate_table */ - for (len = 0; pll_clk->rate_table[len].rate != 0; ) - len++; - - pll->rate_count = len; - pll->rate_table = kmemdup(pll_clk->rate_table, - pll->rate_count * - sizeof(struct samsung_pll_rate_table), - GFP_KERNEL); - WARN(!pll->rate_table, - "%s: could not allocate rate table for %s\n", - __func__, pll_clk->name); - } - - switch (pll_clk->type) { - case pll_2126: - init.ops = &samsung_pll2126_clk_ops; - break; - case pll_3000: - init.ops = &samsung_pll3000_clk_ops; - break; - /* clk_ops for 35xx and 2550 are similar */ - case pll_35xx: - case pll_2550: - case pll_1450x: - case pll_1451x: - case pll_1452x: - if (!pll->rate_table) - init.ops = &samsung_pll35xx_clk_min_ops; - else - init.ops = &samsung_pll35xx_clk_ops; - break; - case pll_4500: - init.ops = &samsung_pll45xx_clk_min_ops; - break; - case pll_4502: - case pll_4508: - if (!pll->rate_table) - init.ops = &samsung_pll45xx_clk_min_ops; - else - init.ops = &samsung_pll45xx_clk_ops; - break; - /* clk_ops for 36xx and 2650 are similar */ - case pll_36xx: - case pll_2650: - if (!pll->rate_table) - init.ops = &samsung_pll36xx_clk_min_ops; - else - init.ops = &samsung_pll36xx_clk_ops; - break; - case pll_6552: - case pll_6552_s3c2416: - init.ops = &samsung_pll6552_clk_ops; - break; - case pll_6553: - init.ops = &samsung_pll6553_clk_ops; - break; - case pll_4600: - case pll_4650: - case pll_4650c: - case pll_1460x: - if (!pll->rate_table) - init.ops = &samsung_pll46xx_clk_min_ops; - else - init.ops = &samsung_pll46xx_clk_ops; - break; - case pll_s3c2410_mpll: - if (!pll->rate_table) - init.ops = &samsung_s3c2410_mpll_clk_min_ops; - else - init.ops = &samsung_s3c2410_mpll_clk_ops; - break; - case pll_s3c2410_upll: - if (!pll->rate_table) - init.ops = &samsung_s3c2410_upll_clk_min_ops; - else - init.ops = &samsung_s3c2410_upll_clk_ops; - break; - case pll_s3c2440_mpll: - if (!pll->rate_table) - init.ops = &samsung_s3c2440_mpll_clk_min_ops; - else - init.ops = &samsung_s3c2440_mpll_clk_ops; - break; - case pll_2550x: - init.ops = &samsung_pll2550x_clk_ops; - break; - case pll_2550xx: - if (!pll->rate_table) - init.ops = &samsung_pll2550xx_clk_min_ops; - else - init.ops = &samsung_pll2550xx_clk_ops; - break; - case pll_2650x: - if (!pll->rate_table) - init.ops = &samsung_pll2650x_clk_min_ops; - else - init.ops = &samsung_pll2650x_clk_ops; - break; - case pll_2650xx: - if (!pll->rate_table) - init.ops = &samsung_pll2650xx_clk_min_ops; - else - init.ops = &samsung_pll2650xx_clk_ops; - break; - default: - pr_warn("%s: Unknown pll type for pll clk %s\n", - __func__, pll_clk->name); - } - - pll->hw.init = &init; - pll->type = pll_clk->type; - pll->lock_reg = base + pll_clk->lock_offset; - pll->con_reg = base + pll_clk->con_offset; - - clk = clk_register(NULL, &pll->hw); - if (IS_ERR(clk)) { - pr_err("%s: failed to register pll clock %s : %ld\n", - __func__, pll_clk->name, PTR_ERR(clk)); - kfree(pll); - return; - } - - samsung_clk_add_lookup(ctx, clk, pll_clk->id); - - if (!pll_clk->alias) - return; - - ret = clk_register_clkdev(clk, pll_clk->alias, pll_clk->dev_name); - if (ret) - pr_err("%s: failed to register lookup for %s : %d", - __func__, pll_clk->name, ret); -} - -void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx, - const struct samsung_pll_clock *pll_list, - unsigned int nr_pll, void __iomem *base) -{ - int cnt; - - for (cnt = 0; cnt < nr_pll; cnt++) - _samsung_clk_register_pll(ctx, &pll_list[cnt], base); -} diff --git a/drivers/clk/samsung/samsung/clk-pll.h b/drivers/clk/samsung/samsung/clk-pll.h deleted file mode 100644 index a1ca0233cb4b..000000000000 --- a/drivers/clk/samsung/samsung/clk-pll.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Copyright (c) 2013 Linaro Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for all PLL's in Samsung platforms -*/ - -#ifndef __SAMSUNG_CLK_PLL_H -#define __SAMSUNG_CLK_PLL_H - -enum samsung_pll_type { - pll_2126, - pll_3000, - pll_35xx, - pll_36xx, - pll_2550, - pll_2650, - pll_4500, - pll_4502, - pll_4508, - pll_4600, - pll_4650, - pll_4650c, - pll_6552, - pll_6552_s3c2416, - pll_6553, - pll_s3c2410_mpll, - pll_s3c2410_upll, - pll_s3c2440_mpll, - pll_2550x, - pll_2550xx, - pll_2650x, - pll_2650xx, - pll_1450x, - pll_1451x, - pll_1452x, - pll_1460x, -}; - -#define PLL_35XX_RATE(_rate, _m, _p, _s) \ - { \ - .rate = (_rate), \ - .mdiv = (_m), \ - .pdiv = (_p), \ - .sdiv = (_s), \ - } - -#define PLL_36XX_RATE(_rate, _m, _p, _s, _k) \ - { \ - .rate = (_rate), \ - .mdiv = (_m), \ - .pdiv = (_p), \ - .sdiv = (_s), \ - .kdiv = (_k), \ - } - -#define PLL_45XX_RATE(_rate, _m, _p, _s, _afc) \ - { \ - .rate = (_rate), \ - .mdiv = (_m), \ - .pdiv = (_p), \ - .sdiv = (_s), \ - .afc = (_afc), \ - } - -#define PLL_4600_RATE(_rate, _m, _p, _s, _k, _vsel) \ - { \ - .rate = (_rate), \ - .mdiv = (_m), \ - .pdiv = (_p), \ - .sdiv = (_s), \ - .kdiv = (_k), \ - .vsel = (_vsel), \ - } - -#define PLL_4650_RATE(_rate, _m, _p, _s, _k, _mfr, _mrr, _vsel) \ - { \ - .rate = (_rate), \ - .mdiv = (_m), \ - .pdiv = (_p), \ - .sdiv = (_s), \ - .kdiv = (_k), \ - .mfr = (_mfr), \ - .mrr = (_mrr), \ - .vsel = (_vsel), \ - } - -/* NOTE: Rate table should be kept sorted in descending order. */ - -struct samsung_pll_rate_table { - unsigned int rate; - unsigned int pdiv; - unsigned int mdiv; - unsigned int sdiv; - unsigned int kdiv; - unsigned int afc; - unsigned int mfr; - unsigned int mrr; - unsigned int vsel; -}; - -extern struct clk * __init samsung_clk_register_pll2550x(const char *name, - const char *pname, const void __iomem *reg_base, - const unsigned long offset); - -#endif /* __SAMSUNG_CLK_PLL_H */ diff --git a/drivers/clk/samsung/samsung/clk-s3c2410-dclk.c b/drivers/clk/samsung/samsung/clk-s3c2410-dclk.c deleted file mode 100644 index ae9a595c72d0..000000000000 --- a/drivers/clk/samsung/samsung/clk-s3c2410-dclk.c +++ /dev/null @@ -1,443 +0,0 @@ -/* - * Copyright (c) 2013 Heiko Stuebner - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for s3c24xx external clock output. - */ - -#include -#include -#include -#include -#include -#include -#include "clk.h" - -/* legacy access to misccr, until dt conversion is finished */ -#include -#include - -#define MUX_DCLK0 0 -#define MUX_DCLK1 1 -#define DIV_DCLK0 2 -#define DIV_DCLK1 3 -#define GATE_DCLK0 4 -#define GATE_DCLK1 5 -#define MUX_CLKOUT0 6 -#define MUX_CLKOUT1 7 -#define DCLK_MAX_CLKS (MUX_CLKOUT1 + 1) - -enum supported_socs { - S3C2410, - S3C2412, - S3C2440, - S3C2443, -}; - -struct s3c24xx_dclk_drv_data { - const char **clkout0_parent_names; - int clkout0_num_parents; - const char **clkout1_parent_names; - int clkout1_num_parents; - const char **mux_parent_names; - int mux_num_parents; -}; - -/* - * Clock for output-parent selection in misccr - */ - -struct s3c24xx_clkout { - struct clk_hw hw; - u32 mask; - u8 shift; -}; - -#define to_s3c24xx_clkout(_hw) container_of(_hw, struct s3c24xx_clkout, hw) - -static u8 s3c24xx_clkout_get_parent(struct clk_hw *hw) -{ - struct s3c24xx_clkout *clkout = to_s3c24xx_clkout(hw); - int num_parents = clk_hw_get_num_parents(hw); - u32 val; - - val = readl_relaxed(S3C24XX_MISCCR) >> clkout->shift; - val >>= clkout->shift; - val &= clkout->mask; - - if (val >= num_parents) - return -EINVAL; - - return val; -} - -static int s3c24xx_clkout_set_parent(struct clk_hw *hw, u8 index) -{ - struct s3c24xx_clkout *clkout = to_s3c24xx_clkout(hw); - - s3c2410_modify_misccr((clkout->mask << clkout->shift), - (index << clkout->shift)); - - return 0; -} - -static const struct clk_ops s3c24xx_clkout_ops = { - .get_parent = s3c24xx_clkout_get_parent, - .set_parent = s3c24xx_clkout_set_parent, - .determine_rate = __clk_mux_determine_rate, -}; - -static struct clk *s3c24xx_register_clkout(struct device *dev, const char *name, - const char **parent_names, u8 num_parents, - u8 shift, u32 mask) -{ - struct s3c24xx_clkout *clkout; - struct clk *clk; - struct clk_init_data init; - - /* allocate the clkout */ - clkout = kzalloc(sizeof(*clkout), GFP_KERNEL); - if (!clkout) - return ERR_PTR(-ENOMEM); - - init.name = name; - init.ops = &s3c24xx_clkout_ops; - init.flags = CLK_IS_BASIC; - init.parent_names = parent_names; - init.num_parents = num_parents; - - clkout->shift = shift; - clkout->mask = mask; - clkout->hw.init = &init; - - clk = clk_register(dev, &clkout->hw); - - return clk; -} - -/* - * dclk and clkout init - */ - -struct s3c24xx_dclk { - struct device *dev; - void __iomem *base; - struct clk_onecell_data clk_data; - struct notifier_block dclk0_div_change_nb; - struct notifier_block dclk1_div_change_nb; - spinlock_t dclk_lock; - unsigned long reg_save; -}; - -#define to_s3c24xx_dclk0(x) \ - container_of(x, struct s3c24xx_dclk, dclk0_div_change_nb) - -#define to_s3c24xx_dclk1(x) \ - container_of(x, struct s3c24xx_dclk, dclk1_div_change_nb) - -static const char *dclk_s3c2410_p[] = { "pclk", "uclk" }; -static const char *clkout0_s3c2410_p[] = { "mpll", "upll", "fclk", "hclk", "pclk", - "gate_dclk0" }; -static const char *clkout1_s3c2410_p[] = { "mpll", "upll", "fclk", "hclk", "pclk", - "gate_dclk1" }; - -static const char *clkout0_s3c2412_p[] = { "mpll", "upll", "rtc_clkout", - "hclk", "pclk", "gate_dclk0" }; -static const char *clkout1_s3c2412_p[] = { "xti", "upll", "fclk", "hclk", "pclk", - "gate_dclk1" }; - -static const char *clkout0_s3c2440_p[] = { "xti", "upll", "fclk", "hclk", "pclk", - "gate_dclk0" }; -static const char *clkout1_s3c2440_p[] = { "mpll", "upll", "rtc_clkout", - "hclk", "pclk", "gate_dclk1" }; - -static const char *dclk_s3c2443_p[] = { "pclk", "epll" }; -static const char *clkout0_s3c2443_p[] = { "xti", "epll", "armclk", "hclk", "pclk", - "gate_dclk0" }; -static const char *clkout1_s3c2443_p[] = { "dummy", "epll", "rtc_clkout", - "hclk", "pclk", "gate_dclk1" }; - -#define DCLKCON_DCLK_DIV_MASK 0xf -#define DCLKCON_DCLK0_DIV_SHIFT 4 -#define DCLKCON_DCLK0_CMP_SHIFT 8 -#define DCLKCON_DCLK1_DIV_SHIFT 20 -#define DCLKCON_DCLK1_CMP_SHIFT 24 - -static void s3c24xx_dclk_update_cmp(struct s3c24xx_dclk *s3c24xx_dclk, - int div_shift, int cmp_shift) -{ - unsigned long flags = 0; - u32 dclk_con, div, cmp; - - spin_lock_irqsave(&s3c24xx_dclk->dclk_lock, flags); - - dclk_con = readl_relaxed(s3c24xx_dclk->base); - - div = ((dclk_con >> div_shift) & DCLKCON_DCLK_DIV_MASK) + 1; - cmp = ((div + 1) / 2) - 1; - - dclk_con &= ~(DCLKCON_DCLK_DIV_MASK << cmp_shift); - dclk_con |= (cmp << cmp_shift); - - writel_relaxed(dclk_con, s3c24xx_dclk->base); - - spin_unlock_irqrestore(&s3c24xx_dclk->dclk_lock, flags); -} - -static int s3c24xx_dclk0_div_notify(struct notifier_block *nb, - unsigned long event, void *data) -{ - struct s3c24xx_dclk *s3c24xx_dclk = to_s3c24xx_dclk0(nb); - - if (event == POST_RATE_CHANGE) { - s3c24xx_dclk_update_cmp(s3c24xx_dclk, - DCLKCON_DCLK0_DIV_SHIFT, DCLKCON_DCLK0_CMP_SHIFT); - } - - return NOTIFY_DONE; -} - -static int s3c24xx_dclk1_div_notify(struct notifier_block *nb, - unsigned long event, void *data) -{ - struct s3c24xx_dclk *s3c24xx_dclk = to_s3c24xx_dclk1(nb); - - if (event == POST_RATE_CHANGE) { - s3c24xx_dclk_update_cmp(s3c24xx_dclk, - DCLKCON_DCLK1_DIV_SHIFT, DCLKCON_DCLK1_CMP_SHIFT); - } - - return NOTIFY_DONE; -} - -#ifdef CONFIG_PM_SLEEP -static int s3c24xx_dclk_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct s3c24xx_dclk *s3c24xx_dclk = platform_get_drvdata(pdev); - - s3c24xx_dclk->reg_save = readl_relaxed(s3c24xx_dclk->base); - return 0; -} - -static int s3c24xx_dclk_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct s3c24xx_dclk *s3c24xx_dclk = platform_get_drvdata(pdev); - - writel_relaxed(s3c24xx_dclk->reg_save, s3c24xx_dclk->base); - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(s3c24xx_dclk_pm_ops, - s3c24xx_dclk_suspend, s3c24xx_dclk_resume); - -static int s3c24xx_dclk_probe(struct platform_device *pdev) -{ - struct s3c24xx_dclk *s3c24xx_dclk; - struct resource *mem; - struct clk **clk_table; - struct s3c24xx_dclk_drv_data *dclk_variant; - int ret, i; - - s3c24xx_dclk = devm_kzalloc(&pdev->dev, sizeof(*s3c24xx_dclk), - GFP_KERNEL); - if (!s3c24xx_dclk) - return -ENOMEM; - - s3c24xx_dclk->dev = &pdev->dev; - platform_set_drvdata(pdev, s3c24xx_dclk); - spin_lock_init(&s3c24xx_dclk->dclk_lock); - - clk_table = devm_kzalloc(&pdev->dev, - sizeof(struct clk *) * DCLK_MAX_CLKS, - GFP_KERNEL); - if (!clk_table) - return -ENOMEM; - - s3c24xx_dclk->clk_data.clks = clk_table; - s3c24xx_dclk->clk_data.clk_num = DCLK_MAX_CLKS; - - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); - s3c24xx_dclk->base = devm_ioremap_resource(&pdev->dev, mem); - if (IS_ERR(s3c24xx_dclk->base)) - return PTR_ERR(s3c24xx_dclk->base); - - dclk_variant = (struct s3c24xx_dclk_drv_data *) - platform_get_device_id(pdev)->driver_data; - - - clk_table[MUX_DCLK0] = clk_register_mux(&pdev->dev, "mux_dclk0", - dclk_variant->mux_parent_names, - dclk_variant->mux_num_parents, 0, - s3c24xx_dclk->base, 1, 1, 0, - &s3c24xx_dclk->dclk_lock); - clk_table[MUX_DCLK1] = clk_register_mux(&pdev->dev, "mux_dclk1", - dclk_variant->mux_parent_names, - dclk_variant->mux_num_parents, 0, - s3c24xx_dclk->base, 17, 1, 0, - &s3c24xx_dclk->dclk_lock); - - clk_table[DIV_DCLK0] = clk_register_divider(&pdev->dev, "div_dclk0", - "mux_dclk0", 0, s3c24xx_dclk->base, - 4, 4, 0, &s3c24xx_dclk->dclk_lock); - clk_table[DIV_DCLK1] = clk_register_divider(&pdev->dev, "div_dclk1", - "mux_dclk1", 0, s3c24xx_dclk->base, - 20, 4, 0, &s3c24xx_dclk->dclk_lock); - - clk_table[GATE_DCLK0] = clk_register_gate(&pdev->dev, "gate_dclk0", - "div_dclk0", CLK_SET_RATE_PARENT, - s3c24xx_dclk->base, 0, 0, - &s3c24xx_dclk->dclk_lock); - clk_table[GATE_DCLK1] = clk_register_gate(&pdev->dev, "gate_dclk1", - "div_dclk1", CLK_SET_RATE_PARENT, - s3c24xx_dclk->base, 16, 0, - &s3c24xx_dclk->dclk_lock); - - clk_table[MUX_CLKOUT0] = s3c24xx_register_clkout(&pdev->dev, - "clkout0", dclk_variant->clkout0_parent_names, - dclk_variant->clkout0_num_parents, 4, 7); - clk_table[MUX_CLKOUT1] = s3c24xx_register_clkout(&pdev->dev, - "clkout1", dclk_variant->clkout1_parent_names, - dclk_variant->clkout1_num_parents, 8, 7); - - for (i = 0; i < DCLK_MAX_CLKS; i++) - if (IS_ERR(clk_table[i])) { - dev_err(&pdev->dev, "clock %d failed to register\n", i); - ret = PTR_ERR(clk_table[i]); - goto err_clk_register; - } - - ret = clk_register_clkdev(clk_table[MUX_DCLK0], "dclk0", NULL); - if (!ret) - ret = clk_register_clkdev(clk_table[MUX_DCLK1], "dclk1", NULL); - if (!ret) - ret = clk_register_clkdev(clk_table[MUX_CLKOUT0], - "clkout0", NULL); - if (!ret) - ret = clk_register_clkdev(clk_table[MUX_CLKOUT1], - "clkout1", NULL); - if (ret) { - dev_err(&pdev->dev, "failed to register aliases, %d\n", ret); - goto err_clk_register; - } - - s3c24xx_dclk->dclk0_div_change_nb.notifier_call = - s3c24xx_dclk0_div_notify; - - s3c24xx_dclk->dclk1_div_change_nb.notifier_call = - s3c24xx_dclk1_div_notify; - - ret = clk_notifier_register(clk_table[DIV_DCLK0], - &s3c24xx_dclk->dclk0_div_change_nb); - if (ret) - goto err_clk_register; - - ret = clk_notifier_register(clk_table[DIV_DCLK1], - &s3c24xx_dclk->dclk1_div_change_nb); - if (ret) - goto err_dclk_notify; - - return 0; - -err_dclk_notify: - clk_notifier_unregister(clk_table[DIV_DCLK0], - &s3c24xx_dclk->dclk0_div_change_nb); -err_clk_register: - for (i = 0; i < DCLK_MAX_CLKS; i++) - if (clk_table[i] && !IS_ERR(clk_table[i])) - clk_unregister(clk_table[i]); - - return ret; -} - -static int s3c24xx_dclk_remove(struct platform_device *pdev) -{ - struct s3c24xx_dclk *s3c24xx_dclk = platform_get_drvdata(pdev); - struct clk **clk_table = s3c24xx_dclk->clk_data.clks; - int i; - - clk_notifier_unregister(clk_table[DIV_DCLK1], - &s3c24xx_dclk->dclk1_div_change_nb); - clk_notifier_unregister(clk_table[DIV_DCLK0], - &s3c24xx_dclk->dclk0_div_change_nb); - - for (i = 0; i < DCLK_MAX_CLKS; i++) - clk_unregister(clk_table[i]); - - return 0; -} - -static struct s3c24xx_dclk_drv_data dclk_variants[] = { - [S3C2410] = { - .clkout0_parent_names = clkout0_s3c2410_p, - .clkout0_num_parents = ARRAY_SIZE(clkout0_s3c2410_p), - .clkout1_parent_names = clkout1_s3c2410_p, - .clkout1_num_parents = ARRAY_SIZE(clkout1_s3c2410_p), - .mux_parent_names = dclk_s3c2410_p, - .mux_num_parents = ARRAY_SIZE(dclk_s3c2410_p), - }, - [S3C2412] = { - .clkout0_parent_names = clkout0_s3c2412_p, - .clkout0_num_parents = ARRAY_SIZE(clkout0_s3c2412_p), - .clkout1_parent_names = clkout1_s3c2412_p, - .clkout1_num_parents = ARRAY_SIZE(clkout1_s3c2412_p), - .mux_parent_names = dclk_s3c2410_p, - .mux_num_parents = ARRAY_SIZE(dclk_s3c2410_p), - }, - [S3C2440] = { - .clkout0_parent_names = clkout0_s3c2440_p, - .clkout0_num_parents = ARRAY_SIZE(clkout0_s3c2440_p), - .clkout1_parent_names = clkout1_s3c2440_p, - .clkout1_num_parents = ARRAY_SIZE(clkout1_s3c2440_p), - .mux_parent_names = dclk_s3c2410_p, - .mux_num_parents = ARRAY_SIZE(dclk_s3c2410_p), - }, - [S3C2443] = { - .clkout0_parent_names = clkout0_s3c2443_p, - .clkout0_num_parents = ARRAY_SIZE(clkout0_s3c2443_p), - .clkout1_parent_names = clkout1_s3c2443_p, - .clkout1_num_parents = ARRAY_SIZE(clkout1_s3c2443_p), - .mux_parent_names = dclk_s3c2443_p, - .mux_num_parents = ARRAY_SIZE(dclk_s3c2443_p), - }, -}; - -static const struct platform_device_id s3c24xx_dclk_driver_ids[] = { - { - .name = "s3c2410-dclk", - .driver_data = (kernel_ulong_t)&dclk_variants[S3C2410], - }, { - .name = "s3c2412-dclk", - .driver_data = (kernel_ulong_t)&dclk_variants[S3C2412], - }, { - .name = "s3c2440-dclk", - .driver_data = (kernel_ulong_t)&dclk_variants[S3C2440], - }, { - .name = "s3c2443-dclk", - .driver_data = (kernel_ulong_t)&dclk_variants[S3C2443], - }, - { } -}; - -MODULE_DEVICE_TABLE(platform, s3c24xx_dclk_driver_ids); - -static struct platform_driver s3c24xx_dclk_driver = { - .driver = { - .name = "s3c24xx-dclk", - .pm = &s3c24xx_dclk_pm_ops, - .suppress_bind_attrs = true, - }, - .probe = s3c24xx_dclk_probe, - .remove = s3c24xx_dclk_remove, - .id_table = s3c24xx_dclk_driver_ids, -}; -module_platform_driver(s3c24xx_dclk_driver); - -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Heiko Stuebner "); -MODULE_DESCRIPTION("Driver for the S3C24XX external clock outputs"); diff --git a/drivers/clk/samsung/samsung/clk-s3c2410.c b/drivers/clk/samsung/samsung/clk-s3c2410.c deleted file mode 100644 index d7a1e772d95a..000000000000 --- a/drivers/clk/samsung/samsung/clk-s3c2410.c +++ /dev/null @@ -1,485 +0,0 @@ -/* - * Copyright (c) 2013 Heiko Stuebner - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for S3C2410 and following SoCs. - */ - -#include -#include -#include -#include - -#include - -#include "clk.h" -#include "clk-pll.h" - -#define LOCKTIME 0x00 -#define MPLLCON 0x04 -#define UPLLCON 0x08 -#define CLKCON 0x0c -#define CLKSLOW 0x10 -#define CLKDIVN 0x14 -#define CAMDIVN 0x18 - -/* the soc types */ -enum supported_socs { - S3C2410, - S3C2440, - S3C2442, -}; - -/* list of PLLs to be registered */ -enum s3c2410_plls { - mpll, upll, -}; - -static void __iomem *reg_base; - -#ifdef CONFIG_PM_SLEEP -static struct samsung_clk_reg_dump *s3c2410_save; - -/* - * list of controller registers to be saved and restored during a - * suspend/resume cycle. - */ -static unsigned long s3c2410_clk_regs[] __initdata = { - LOCKTIME, - MPLLCON, - UPLLCON, - CLKCON, - CLKSLOW, - CLKDIVN, - CAMDIVN, -}; - -static int s3c2410_clk_suspend(void) -{ - samsung_clk_save(reg_base, s3c2410_save, - ARRAY_SIZE(s3c2410_clk_regs)); - - return 0; -} - -static void s3c2410_clk_resume(void) -{ - samsung_clk_restore(reg_base, s3c2410_save, - ARRAY_SIZE(s3c2410_clk_regs)); -} - -static struct syscore_ops s3c2410_clk_syscore_ops = { - .suspend = s3c2410_clk_suspend, - .resume = s3c2410_clk_resume, -}; - -static void s3c2410_clk_sleep_init(void) -{ - s3c2410_save = samsung_clk_alloc_reg_dump(s3c2410_clk_regs, - ARRAY_SIZE(s3c2410_clk_regs)); - if (!s3c2410_save) { - pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", - __func__); - return; - } - - register_syscore_ops(&s3c2410_clk_syscore_ops); - return; -} -#else -static void s3c2410_clk_sleep_init(void) {} -#endif - -PNAME(fclk_p) = { "mpll", "div_slow" }; - -struct samsung_mux_clock s3c2410_common_muxes[] __initdata = { - MUX(FCLK, "fclk", fclk_p, CLKSLOW, 4, 1), -}; - -static struct clk_div_table divslow_d[] = { - { .val = 0, .div = 1 }, - { .val = 1, .div = 2 }, - { .val = 2, .div = 4 }, - { .val = 3, .div = 6 }, - { .val = 4, .div = 8 }, - { .val = 5, .div = 10 }, - { .val = 6, .div = 12 }, - { .val = 7, .div = 14 }, - { /* sentinel */ }, -}; - -struct samsung_div_clock s3c2410_common_dividers[] __initdata = { - DIV_T(0, "div_slow", "xti", CLKSLOW, 0, 3, divslow_d), - DIV(PCLK, "pclk", "hclk", CLKDIVN, 0, 1), -}; - -struct samsung_gate_clock s3c2410_common_gates[] __initdata = { - GATE(PCLK_SPI, "spi", "pclk", CLKCON, 18, 0, 0), - GATE(PCLK_I2S, "i2s", "pclk", CLKCON, 17, 0, 0), - GATE(PCLK_I2C, "i2c", "pclk", CLKCON, 16, 0, 0), - GATE(PCLK_ADC, "adc", "pclk", CLKCON, 15, 0, 0), - GATE(PCLK_RTC, "rtc", "pclk", CLKCON, 14, 0, 0), - GATE(PCLK_GPIO, "gpio", "pclk", CLKCON, 13, CLK_IGNORE_UNUSED, 0), - GATE(PCLK_UART2, "uart2", "pclk", CLKCON, 12, 0, 0), - GATE(PCLK_UART1, "uart1", "pclk", CLKCON, 11, 0, 0), - GATE(PCLK_UART0, "uart0", "pclk", CLKCON, 10, 0, 0), - GATE(PCLK_SDI, "sdi", "pclk", CLKCON, 9, 0, 0), - GATE(PCLK_PWM, "pwm", "pclk", CLKCON, 8, 0, 0), - GATE(HCLK_USBD, "usb-device", "hclk", CLKCON, 7, 0, 0), - GATE(HCLK_USBH, "usb-host", "hclk", CLKCON, 6, 0, 0), - GATE(HCLK_LCD, "lcd", "hclk", CLKCON, 5, 0, 0), - GATE(HCLK_NAND, "nand", "hclk", CLKCON, 4, 0, 0), -}; - -/* should be added _after_ the soc-specific clocks are created */ -struct samsung_clock_alias s3c2410_common_aliases[] __initdata = { - ALIAS(PCLK_I2C, "s3c2410-i2c.0", "i2c"), - ALIAS(PCLK_ADC, NULL, "adc"), - ALIAS(PCLK_RTC, NULL, "rtc"), - ALIAS(PCLK_PWM, NULL, "timers"), - ALIAS(HCLK_LCD, NULL, "lcd"), - ALIAS(HCLK_USBD, NULL, "usb-device"), - ALIAS(HCLK_USBH, NULL, "usb-host"), - ALIAS(UCLK, NULL, "usb-bus-host"), - ALIAS(UCLK, NULL, "usb-bus-gadget"), - ALIAS(ARMCLK, NULL, "armclk"), - ALIAS(UCLK, NULL, "uclk"), - ALIAS(HCLK, NULL, "hclk"), - ALIAS(MPLL, NULL, "mpll"), - ALIAS(FCLK, NULL, "fclk"), - ALIAS(PCLK, NULL, "watchdog"), - ALIAS(PCLK_SDI, NULL, "sdi"), - ALIAS(HCLK_NAND, NULL, "nand"), - ALIAS(PCLK_I2S, NULL, "iis"), - ALIAS(PCLK_I2C, NULL, "i2c"), -}; - -/* S3C2410 specific clocks */ - -static struct samsung_pll_rate_table pll_s3c2410_12mhz_tbl[] __initdata = { - /* sorted in descending order */ - /* 2410A extras */ - PLL_35XX_RATE(270000000, 127, 1, 1), - PLL_35XX_RATE(268000000, 126, 1, 1), - PLL_35XX_RATE(266000000, 125, 1, 1), - PLL_35XX_RATE(226000000, 105, 1, 1), - PLL_35XX_RATE(210000000, 132, 2, 1), - /* 2410 common */ - PLL_35XX_RATE(203000000, 161, 3, 1), - PLL_35XX_RATE(192000000, 88, 1, 1), - PLL_35XX_RATE(186000000, 85, 1, 1), - PLL_35XX_RATE(180000000, 82, 1, 1), - PLL_35XX_RATE(170000000, 77, 1, 1), - PLL_35XX_RATE(158000000, 71, 1, 1), - PLL_35XX_RATE(152000000, 68, 1, 1), - PLL_35XX_RATE(147000000, 90, 2, 1), - PLL_35XX_RATE(135000000, 82, 2, 1), - PLL_35XX_RATE(124000000, 116, 1, 2), - PLL_35XX_RATE(118000000, 150, 2, 2), - PLL_35XX_RATE(113000000, 105, 1, 2), - PLL_35XX_RATE(101000000, 127, 2, 2), - PLL_35XX_RATE(90000000, 112, 2, 2), - PLL_35XX_RATE(85000000, 105, 2, 2), - PLL_35XX_RATE(79000000, 71, 1, 2), - PLL_35XX_RATE(68000000, 82, 2, 2), - PLL_35XX_RATE(56000000, 142, 2, 3), - PLL_35XX_RATE(48000000, 120, 2, 3), - PLL_35XX_RATE(51000000, 161, 3, 3), - PLL_35XX_RATE(45000000, 82, 1, 3), - PLL_35XX_RATE(34000000, 82, 2, 3), - { /* sentinel */ }, -}; - -static struct samsung_pll_clock s3c2410_plls[] __initdata = { - [mpll] = PLL(pll_s3c2410_mpll, MPLL, "mpll", "xti", - LOCKTIME, MPLLCON, NULL), - [upll] = PLL(pll_s3c2410_upll, UPLL, "upll", "xti", - LOCKTIME, UPLLCON, NULL), -}; - -struct samsung_div_clock s3c2410_dividers[] __initdata = { - DIV(HCLK, "hclk", "mpll", CLKDIVN, 1, 1), -}; - -struct samsung_fixed_factor_clock s3c2410_ffactor[] __initdata = { - /* - * armclk is directly supplied by the fclk, without - * switching possibility like on the s3c244x below. - */ - FFACTOR(ARMCLK, "armclk", "fclk", 1, 1, 0), - - /* uclk is fed from the unmodified upll */ - FFACTOR(UCLK, "uclk", "upll", 1, 1, 0), -}; - -struct samsung_clock_alias s3c2410_aliases[] __initdata = { - ALIAS(PCLK_UART0, "s3c2410-uart.0", "uart"), - ALIAS(PCLK_UART1, "s3c2410-uart.1", "uart"), - ALIAS(PCLK_UART2, "s3c2410-uart.2", "uart"), - ALIAS(PCLK_UART0, "s3c2410-uart.0", "clk_uart_baud0"), - ALIAS(PCLK_UART1, "s3c2410-uart.1", "clk_uart_baud0"), - ALIAS(PCLK_UART2, "s3c2410-uart.2", "clk_uart_baud0"), - ALIAS(UCLK, NULL, "clk_uart_baud1"), -}; - -/* S3C244x specific clocks */ - -static struct samsung_pll_rate_table pll_s3c244x_12mhz_tbl[] __initdata = { - /* sorted in descending order */ - PLL_35XX_RATE(400000000, 0x5c, 1, 1), - PLL_35XX_RATE(390000000, 0x7a, 2, 1), - PLL_35XX_RATE(380000000, 0x57, 1, 1), - PLL_35XX_RATE(370000000, 0xb1, 4, 1), - PLL_35XX_RATE(360000000, 0x70, 2, 1), - PLL_35XX_RATE(350000000, 0xa7, 4, 1), - PLL_35XX_RATE(340000000, 0x4d, 1, 1), - PLL_35XX_RATE(330000000, 0x66, 2, 1), - PLL_35XX_RATE(320000000, 0x98, 4, 1), - PLL_35XX_RATE(310000000, 0x93, 4, 1), - PLL_35XX_RATE(300000000, 0x75, 3, 1), - PLL_35XX_RATE(240000000, 0x70, 1, 2), - PLL_35XX_RATE(230000000, 0x6b, 1, 2), - PLL_35XX_RATE(220000000, 0x66, 1, 2), - PLL_35XX_RATE(210000000, 0x84, 2, 2), - PLL_35XX_RATE(200000000, 0x5c, 1, 2), - PLL_35XX_RATE(190000000, 0x57, 1, 2), - PLL_35XX_RATE(180000000, 0x70, 2, 2), - PLL_35XX_RATE(170000000, 0x4d, 1, 2), - PLL_35XX_RATE(160000000, 0x98, 4, 2), - PLL_35XX_RATE(150000000, 0x75, 3, 2), - PLL_35XX_RATE(120000000, 0x70, 1, 3), - PLL_35XX_RATE(110000000, 0x66, 1, 3), - PLL_35XX_RATE(100000000, 0x5c, 1, 3), - PLL_35XX_RATE(90000000, 0x70, 2, 3), - PLL_35XX_RATE(80000000, 0x98, 4, 3), - PLL_35XX_RATE(75000000, 0x75, 3, 3), - { /* sentinel */ }, -}; - -static struct samsung_pll_clock s3c244x_common_plls[] __initdata = { - [mpll] = PLL(pll_s3c2440_mpll, MPLL, "mpll", "xti", - LOCKTIME, MPLLCON, NULL), - [upll] = PLL(pll_s3c2410_upll, UPLL, "upll", "xti", - LOCKTIME, UPLLCON, NULL), -}; - -PNAME(hclk_p) = { "fclk", "div_hclk_2", "div_hclk_4", "div_hclk_3" }; -PNAME(armclk_p) = { "fclk", "hclk" }; - -struct samsung_mux_clock s3c244x_common_muxes[] __initdata = { - MUX(HCLK, "hclk", hclk_p, CLKDIVN, 1, 2), - MUX(ARMCLK, "armclk", armclk_p, CAMDIVN, 12, 1), -}; - -struct samsung_fixed_factor_clock s3c244x_common_ffactor[] __initdata = { - FFACTOR(0, "div_hclk_2", "fclk", 1, 2, 0), - FFACTOR(0, "ff_cam", "div_cam", 2, 1, CLK_SET_RATE_PARENT), -}; - -static struct clk_div_table div_hclk_4_d[] = { - { .val = 0, .div = 4 }, - { .val = 1, .div = 8 }, - { /* sentinel */ }, -}; - -static struct clk_div_table div_hclk_3_d[] = { - { .val = 0, .div = 3 }, - { .val = 1, .div = 6 }, - { /* sentinel */ }, -}; - -struct samsung_div_clock s3c244x_common_dividers[] __initdata = { - DIV(UCLK, "uclk", "upll", CLKDIVN, 3, 1), - DIV(0, "div_hclk", "fclk", CLKDIVN, 1, 1), - DIV_T(0, "div_hclk_4", "fclk", CAMDIVN, 9, 1, div_hclk_4_d), - DIV_T(0, "div_hclk_3", "fclk", CAMDIVN, 8, 1, div_hclk_3_d), - DIV(0, "div_cam", "upll", CAMDIVN, 0, 3), -}; - -struct samsung_gate_clock s3c244x_common_gates[] __initdata = { - GATE(HCLK_CAM, "cam", "hclk", CLKCON, 19, 0, 0), -}; - -struct samsung_clock_alias s3c244x_common_aliases[] __initdata = { - ALIAS(PCLK_UART0, "s3c2440-uart.0", "uart"), - ALIAS(PCLK_UART1, "s3c2440-uart.1", "uart"), - ALIAS(PCLK_UART2, "s3c2440-uart.2", "uart"), - ALIAS(PCLK_UART0, "s3c2440-uart.0", "clk_uart_baud2"), - ALIAS(PCLK_UART1, "s3c2440-uart.1", "clk_uart_baud2"), - ALIAS(PCLK_UART2, "s3c2440-uart.2", "clk_uart_baud2"), - ALIAS(HCLK_CAM, NULL, "camif"), - ALIAS(CAMIF, NULL, "camif-upll"), -}; - -/* S3C2440 specific clocks */ - -PNAME(s3c2440_camif_p) = { "upll", "ff_cam" }; - -struct samsung_mux_clock s3c2440_muxes[] __initdata = { - MUX(CAMIF, "camif", s3c2440_camif_p, CAMDIVN, 4, 1), -}; - -struct samsung_gate_clock s3c2440_gates[] __initdata = { - GATE(PCLK_AC97, "ac97", "pclk", CLKCON, 20, 0, 0), -}; - -/* S3C2442 specific clocks */ - -struct samsung_fixed_factor_clock s3c2442_ffactor[] __initdata = { - FFACTOR(0, "upll_3", "upll", 1, 3, 0), -}; - -PNAME(s3c2442_camif_p) = { "upll", "ff_cam", "upll", "upll_3" }; - -struct samsung_mux_clock s3c2442_muxes[] __initdata = { - MUX(CAMIF, "camif", s3c2442_camif_p, CAMDIVN, 4, 2), -}; - -/* - * fixed rate clocks generated outside the soc - * Only necessary until the devicetree-move is complete - */ -#define XTI 1 -struct samsung_fixed_rate_clock s3c2410_common_frate_clks[] __initdata = { - FRATE(XTI, "xti", NULL, 0, 0), -}; - -static void __init s3c2410_common_clk_register_fixed_ext( - struct samsung_clk_provider *ctx, - unsigned long xti_f) -{ - struct samsung_clock_alias xti_alias = ALIAS(XTI, NULL, "xtal"); - - s3c2410_common_frate_clks[0].fixed_rate = xti_f; - samsung_clk_register_fixed_rate(ctx, s3c2410_common_frate_clks, - ARRAY_SIZE(s3c2410_common_frate_clks)); - - samsung_clk_register_alias(ctx, &xti_alias, 1); -} - -void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f, - int current_soc, - void __iomem *base) -{ - struct samsung_clk_provider *ctx; - reg_base = base; - - if (np) { - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - } - - ctx = samsung_clk_init(np, reg_base, NR_CLKS); - - /* Register external clocks only in non-dt cases */ - if (!np) - s3c2410_common_clk_register_fixed_ext(ctx, xti_f); - - if (current_soc == S3C2410) { - if (_get_rate("xti") == 12 * MHZ) { - s3c2410_plls[mpll].rate_table = pll_s3c2410_12mhz_tbl; - s3c2410_plls[upll].rate_table = pll_s3c2410_12mhz_tbl; - } - - /* Register PLLs. */ - samsung_clk_register_pll(ctx, s3c2410_plls, - ARRAY_SIZE(s3c2410_plls), reg_base); - - } else { /* S3C2440, S3C2442 */ - if (_get_rate("xti") == 12 * MHZ) { - /* - * plls follow different calculation schemes, with the - * upll following the same scheme as the s3c2410 plls - */ - s3c244x_common_plls[mpll].rate_table = - pll_s3c244x_12mhz_tbl; - s3c244x_common_plls[upll].rate_table = - pll_s3c2410_12mhz_tbl; - } - - /* Register PLLs. */ - samsung_clk_register_pll(ctx, s3c244x_common_plls, - ARRAY_SIZE(s3c244x_common_plls), reg_base); - } - - /* Register common internal clocks. */ - samsung_clk_register_mux(ctx, s3c2410_common_muxes, - ARRAY_SIZE(s3c2410_common_muxes)); - samsung_clk_register_div(ctx, s3c2410_common_dividers, - ARRAY_SIZE(s3c2410_common_dividers)); - samsung_clk_register_gate(ctx, s3c2410_common_gates, - ARRAY_SIZE(s3c2410_common_gates)); - - if (current_soc == S3C2440 || current_soc == S3C2442) { - samsung_clk_register_div(ctx, s3c244x_common_dividers, - ARRAY_SIZE(s3c244x_common_dividers)); - samsung_clk_register_gate(ctx, s3c244x_common_gates, - ARRAY_SIZE(s3c244x_common_gates)); - samsung_clk_register_mux(ctx, s3c244x_common_muxes, - ARRAY_SIZE(s3c244x_common_muxes)); - samsung_clk_register_fixed_factor(ctx, s3c244x_common_ffactor, - ARRAY_SIZE(s3c244x_common_ffactor)); - } - - /* Register SoC-specific clocks. */ - switch (current_soc) { - case S3C2410: - samsung_clk_register_div(ctx, s3c2410_dividers, - ARRAY_SIZE(s3c2410_dividers)); - samsung_clk_register_fixed_factor(ctx, s3c2410_ffactor, - ARRAY_SIZE(s3c2410_ffactor)); - samsung_clk_register_alias(ctx, s3c2410_aliases, - ARRAY_SIZE(s3c2410_aliases)); - break; - case S3C2440: - samsung_clk_register_mux(ctx, s3c2440_muxes, - ARRAY_SIZE(s3c2440_muxes)); - samsung_clk_register_gate(ctx, s3c2440_gates, - ARRAY_SIZE(s3c2440_gates)); - break; - case S3C2442: - samsung_clk_register_mux(ctx, s3c2442_muxes, - ARRAY_SIZE(s3c2442_muxes)); - samsung_clk_register_fixed_factor(ctx, s3c2442_ffactor, - ARRAY_SIZE(s3c2442_ffactor)); - break; - } - - /* - * Register common aliases at the end, as some of the aliased clocks - * are SoC specific. - */ - samsung_clk_register_alias(ctx, s3c2410_common_aliases, - ARRAY_SIZE(s3c2410_common_aliases)); - - if (current_soc == S3C2440 || current_soc == S3C2442) { - samsung_clk_register_alias(ctx, s3c244x_common_aliases, - ARRAY_SIZE(s3c244x_common_aliases)); - } - - s3c2410_clk_sleep_init(); - - samsung_clk_of_add_provider(np, ctx); -} - -static void __init s3c2410_clk_init(struct device_node *np) -{ - s3c2410_common_clk_init(np, 0, S3C2410, 0); -} -CLK_OF_DECLARE(s3c2410_clk, "samsung,s3c2410-clock", s3c2410_clk_init); - -static void __init s3c2440_clk_init(struct device_node *np) -{ - s3c2410_common_clk_init(np, 0, S3C2440, 0); -} -CLK_OF_DECLARE(s3c2440_clk, "samsung,s3c2440-clock", s3c2440_clk_init); - -static void __init s3c2442_clk_init(struct device_node *np) -{ - s3c2410_common_clk_init(np, 0, S3C2442, 0); -} -CLK_OF_DECLARE(s3c2442_clk, "samsung,s3c2442-clock", s3c2442_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-s3c2412.c b/drivers/clk/samsung/samsung/clk-s3c2412.c deleted file mode 100644 index ec873ee15d37..000000000000 --- a/drivers/clk/samsung/samsung/clk-s3c2412.c +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright (c) 2013 Heiko Stuebner - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for S3C2412 and S3C2413. - */ - -#include -#include -#include -#include -#include - -#include - -#include "clk.h" -#include "clk-pll.h" - -#define LOCKTIME 0x00 -#define MPLLCON 0x04 -#define UPLLCON 0x08 -#define CLKCON 0x0c -#define CLKDIVN 0x14 -#define CLKSRC 0x1c -#define SWRST 0x30 - -/* list of PLLs to be registered */ -enum s3c2412_plls { - mpll, upll, -}; - -static void __iomem *reg_base; - -#ifdef CONFIG_PM_SLEEP -static struct samsung_clk_reg_dump *s3c2412_save; - -/* - * list of controller registers to be saved and restored during a - * suspend/resume cycle. - */ -static unsigned long s3c2412_clk_regs[] __initdata = { - LOCKTIME, - MPLLCON, - UPLLCON, - CLKCON, - CLKDIVN, - CLKSRC, -}; - -static int s3c2412_clk_suspend(void) -{ - samsung_clk_save(reg_base, s3c2412_save, - ARRAY_SIZE(s3c2412_clk_regs)); - - return 0; -} - -static void s3c2412_clk_resume(void) -{ - samsung_clk_restore(reg_base, s3c2412_save, - ARRAY_SIZE(s3c2412_clk_regs)); -} - -static struct syscore_ops s3c2412_clk_syscore_ops = { - .suspend = s3c2412_clk_suspend, - .resume = s3c2412_clk_resume, -}; - -static void s3c2412_clk_sleep_init(void) -{ - s3c2412_save = samsung_clk_alloc_reg_dump(s3c2412_clk_regs, - ARRAY_SIZE(s3c2412_clk_regs)); - if (!s3c2412_save) { - pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", - __func__); - return; - } - - register_syscore_ops(&s3c2412_clk_syscore_ops); - return; -} -#else -static void s3c2412_clk_sleep_init(void) {} -#endif - -static struct clk_div_table divxti_d[] = { - { .val = 0, .div = 1 }, - { .val = 1, .div = 2 }, - { .val = 2, .div = 4 }, - { .val = 3, .div = 6 }, - { .val = 4, .div = 8 }, - { .val = 5, .div = 10 }, - { .val = 6, .div = 12 }, - { .val = 7, .div = 14 }, - { /* sentinel */ }, -}; - -struct samsung_div_clock s3c2412_dividers[] __initdata = { - DIV_T(0, "div_xti", "xti", CLKSRC, 0, 3, divxti_d), - DIV(0, "div_cam", "mux_cam", CLKDIVN, 16, 4), - DIV(0, "div_i2s", "mux_i2s", CLKDIVN, 12, 4), - DIV(0, "div_uart", "mux_uart", CLKDIVN, 8, 4), - DIV(0, "div_usb", "mux_usb", CLKDIVN, 6, 1), - DIV(0, "div_hclk_half", "hclk", CLKDIVN, 5, 1), - DIV(ARMDIV, "armdiv", "msysclk", CLKDIVN, 3, 1), - DIV(PCLK, "pclk", "hclk", CLKDIVN, 2, 1), - DIV(HCLK, "hclk", "armdiv", CLKDIVN, 0, 2), -}; - -struct samsung_fixed_factor_clock s3c2412_ffactor[] __initdata = { - FFACTOR(0, "ff_hclk", "hclk", 2, 1, CLK_SET_RATE_PARENT), -}; - -/* - * The first two use the OM[4] setting, which is not readable from - * software, so assume it is set to xti. - */ -PNAME(erefclk_p) = { "xti", "xti", "xti", "ext" }; -PNAME(urefclk_p) = { "xti", "xti", "xti", "ext" }; - -PNAME(camclk_p) = { "usysclk", "hclk" }; -PNAME(usbclk_p) = { "usysclk", "hclk" }; -PNAME(i2sclk_p) = { "erefclk", "mpll" }; -PNAME(uartclk_p) = { "erefclk", "mpll" }; -PNAME(usysclk_p) = { "urefclk", "upll" }; -PNAME(msysclk_p) = { "mdivclk", "mpll" }; -PNAME(mdivclk_p) = { "xti", "div_xti" }; -PNAME(armclk_p) = { "armdiv", "hclk" }; - -struct samsung_mux_clock s3c2412_muxes[] __initdata = { - MUX(0, "erefclk", erefclk_p, CLKSRC, 14, 2), - MUX(0, "urefclk", urefclk_p, CLKSRC, 12, 2), - MUX(0, "mux_cam", camclk_p, CLKSRC, 11, 1), - MUX(0, "mux_usb", usbclk_p, CLKSRC, 10, 1), - MUX(0, "mux_i2s", i2sclk_p, CLKSRC, 9, 1), - MUX(0, "mux_uart", uartclk_p, CLKSRC, 8, 1), - MUX(USYSCLK, "usysclk", usysclk_p, CLKSRC, 5, 1), - MUX(MSYSCLK, "msysclk", msysclk_p, CLKSRC, 4, 1), - MUX(MDIVCLK, "mdivclk", mdivclk_p, CLKSRC, 3, 1), - MUX(ARMCLK, "armclk", armclk_p, CLKDIVN, 4, 1), -}; - -static struct samsung_pll_clock s3c2412_plls[] __initdata = { - [mpll] = PLL(pll_s3c2440_mpll, MPLL, "mpll", "xti", - LOCKTIME, MPLLCON, NULL), - [upll] = PLL(pll_s3c2410_upll, UPLL, "upll", "urefclk", - LOCKTIME, UPLLCON, NULL), -}; - -struct samsung_gate_clock s3c2412_gates[] __initdata = { - GATE(PCLK_WDT, "wdt", "pclk", CLKCON, 28, 0, 0), - GATE(PCLK_SPI, "spi", "pclk", CLKCON, 27, 0, 0), - GATE(PCLK_I2S, "i2s", "pclk", CLKCON, 26, 0, 0), - GATE(PCLK_I2C, "i2c", "pclk", CLKCON, 25, 0, 0), - GATE(PCLK_ADC, "adc", "pclk", CLKCON, 24, 0, 0), - GATE(PCLK_RTC, "rtc", "pclk", CLKCON, 23, 0, 0), - GATE(PCLK_GPIO, "gpio", "pclk", CLKCON, 22, CLK_IGNORE_UNUSED, 0), - GATE(PCLK_UART2, "uart2", "pclk", CLKCON, 21, 0, 0), - GATE(PCLK_UART1, "uart1", "pclk", CLKCON, 20, 0, 0), - GATE(PCLK_UART0, "uart0", "pclk", CLKCON, 19, 0, 0), - GATE(PCLK_SDI, "sdi", "pclk", CLKCON, 18, 0, 0), - GATE(PCLK_PWM, "pwm", "pclk", CLKCON, 17, 0, 0), - GATE(PCLK_USBD, "usb-device", "pclk", CLKCON, 16, 0, 0), - GATE(SCLK_CAM, "sclk_cam", "div_cam", CLKCON, 15, 0, 0), - GATE(SCLK_UART, "sclk_uart", "div_uart", CLKCON, 14, 0, 0), - GATE(SCLK_I2S, "sclk_i2s", "div_i2s", CLKCON, 13, 0, 0), - GATE(SCLK_USBH, "sclk_usbh", "div_usb", CLKCON, 12, 0, 0), - GATE(SCLK_USBD, "sclk_usbd", "div_usb", CLKCON, 11, 0, 0), - GATE(HCLK_HALF, "hclk_half", "div_hclk_half", CLKCON, 10, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_X2, "hclkx2", "ff_hclk", CLKCON, 9, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_SDRAM, "sdram", "hclk", CLKCON, 8, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_USBH, "usb-host", "hclk", CLKCON, 6, 0, 0), - GATE(HCLK_LCD, "lcd", "hclk", CLKCON, 5, 0, 0), - GATE(HCLK_NAND, "nand", "hclk", CLKCON, 4, 0, 0), - GATE(HCLK_DMA3, "dma3", "hclk", CLKCON, 3, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_DMA2, "dma2", "hclk", CLKCON, 2, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_DMA1, "dma1", "hclk", CLKCON, 1, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_DMA0, "dma0", "hclk", CLKCON, 0, CLK_IGNORE_UNUSED, 0), -}; - -struct samsung_clock_alias s3c2412_aliases[] __initdata = { - ALIAS(PCLK_UART0, "s3c2412-uart.0", "uart"), - ALIAS(PCLK_UART1, "s3c2412-uart.1", "uart"), - ALIAS(PCLK_UART2, "s3c2412-uart.2", "uart"), - ALIAS(PCLK_UART0, "s3c2412-uart.0", "clk_uart_baud2"), - ALIAS(PCLK_UART1, "s3c2412-uart.1", "clk_uart_baud2"), - ALIAS(PCLK_UART2, "s3c2412-uart.2", "clk_uart_baud2"), - ALIAS(SCLK_UART, NULL, "clk_uart_baud3"), - ALIAS(PCLK_I2C, "s3c2410-i2c.0", "i2c"), - ALIAS(PCLK_ADC, NULL, "adc"), - ALIAS(PCLK_RTC, NULL, "rtc"), - ALIAS(PCLK_PWM, NULL, "timers"), - ALIAS(HCLK_LCD, NULL, "lcd"), - ALIAS(PCLK_USBD, NULL, "usb-device"), - ALIAS(SCLK_USBD, NULL, "usb-bus-gadget"), - ALIAS(HCLK_USBH, NULL, "usb-host"), - ALIAS(SCLK_USBH, NULL, "usb-bus-host"), - ALIAS(ARMCLK, NULL, "armclk"), - ALIAS(HCLK, NULL, "hclk"), - ALIAS(MPLL, NULL, "mpll"), - ALIAS(MSYSCLK, NULL, "fclk"), -}; - -static int s3c2412_restart(struct notifier_block *this, - unsigned long mode, void *cmd) -{ - /* errata "Watch-dog/Software Reset Problem" specifies that - * this reset must be done with the SYSCLK sourced from - * EXTCLK instead of FOUT to avoid a glitch in the reset - * mechanism. - * - * See the watchdog section of the S3C2412 manual for more - * information on this fix. - */ - - __raw_writel(0x00, reg_base + CLKSRC); - __raw_writel(0x533C2412, reg_base + SWRST); - return NOTIFY_DONE; -} - -static struct notifier_block s3c2412_restart_handler = { - .notifier_call = s3c2412_restart, - .priority = 129, -}; - -/* - * fixed rate clocks generated outside the soc - * Only necessary until the devicetree-move is complete - */ -#define XTI 1 -struct samsung_fixed_rate_clock s3c2412_common_frate_clks[] __initdata = { - FRATE(XTI, "xti", NULL, 0, 0), - FRATE(0, "ext", NULL, 0, 0), -}; - -static void __init s3c2412_common_clk_register_fixed_ext( - struct samsung_clk_provider *ctx, - unsigned long xti_f, unsigned long ext_f) -{ - /* xtal alias is necessary for the current cpufreq driver */ - struct samsung_clock_alias xti_alias = ALIAS(XTI, NULL, "xtal"); - - s3c2412_common_frate_clks[0].fixed_rate = xti_f; - s3c2412_common_frate_clks[1].fixed_rate = ext_f; - samsung_clk_register_fixed_rate(ctx, s3c2412_common_frate_clks, - ARRAY_SIZE(s3c2412_common_frate_clks)); - - samsung_clk_register_alias(ctx, &xti_alias, 1); -} - -void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f, - unsigned long ext_f, void __iomem *base) -{ - struct samsung_clk_provider *ctx; - int ret; - reg_base = base; - - if (np) { - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - } - - ctx = samsung_clk_init(np, reg_base, NR_CLKS); - - /* Register external clocks only in non-dt cases */ - if (!np) - s3c2412_common_clk_register_fixed_ext(ctx, xti_f, ext_f); - - /* Register PLLs. */ - samsung_clk_register_pll(ctx, s3c2412_plls, ARRAY_SIZE(s3c2412_plls), - reg_base); - - /* Register common internal clocks. */ - samsung_clk_register_mux(ctx, s3c2412_muxes, ARRAY_SIZE(s3c2412_muxes)); - samsung_clk_register_div(ctx, s3c2412_dividers, - ARRAY_SIZE(s3c2412_dividers)); - samsung_clk_register_gate(ctx, s3c2412_gates, - ARRAY_SIZE(s3c2412_gates)); - samsung_clk_register_fixed_factor(ctx, s3c2412_ffactor, - ARRAY_SIZE(s3c2412_ffactor)); - samsung_clk_register_alias(ctx, s3c2412_aliases, - ARRAY_SIZE(s3c2412_aliases)); - - s3c2412_clk_sleep_init(); - - samsung_clk_of_add_provider(np, ctx); - - ret = register_restart_handler(&s3c2412_restart_handler); - if (ret) - pr_warn("cannot register restart handler, %d\n", ret); -} - -static void __init s3c2412_clk_init(struct device_node *np) -{ - s3c2412_common_clk_init(np, 0, 0, 0); -} -CLK_OF_DECLARE(s3c2412_clk, "samsung,s3c2412-clock", s3c2412_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-s3c2443.c b/drivers/clk/samsung/samsung/clk-s3c2443.c deleted file mode 100644 index 5e24a17e10e6..000000000000 --- a/drivers/clk/samsung/samsung/clk-s3c2443.c +++ /dev/null @@ -1,483 +0,0 @@ -/* - * Copyright (c) 2013 Heiko Stuebner - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for S3C2443 and following SoCs. - */ - -#include -#include -#include -#include -#include - -#include - -#include "clk.h" -#include "clk-pll.h" - -/* S3C2416 clock controller register offsets */ -#define LOCKCON0 0x00 -#define LOCKCON1 0x04 -#define MPLLCON 0x10 -#define EPLLCON 0x18 -#define EPLLCON_K 0x1C -#define CLKSRC 0x20 -#define CLKDIV0 0x24 -#define CLKDIV1 0x28 -#define CLKDIV2 0x2C -#define HCLKCON 0x30 -#define PCLKCON 0x34 -#define SCLKCON 0x38 -#define SWRST 0x44 - -/* the soc types */ -enum supported_socs { - S3C2416, - S3C2443, - S3C2450, -}; - -/* list of PLLs to be registered */ -enum s3c2443_plls { - mpll, epll, -}; - -static void __iomem *reg_base; - -#ifdef CONFIG_PM_SLEEP -static struct samsung_clk_reg_dump *s3c2443_save; - -/* - * list of controller registers to be saved and restored during a - * suspend/resume cycle. - */ -static unsigned long s3c2443_clk_regs[] __initdata = { - LOCKCON0, - LOCKCON1, - MPLLCON, - EPLLCON, - EPLLCON_K, - CLKSRC, - CLKDIV0, - CLKDIV1, - CLKDIV2, - PCLKCON, - HCLKCON, - SCLKCON, -}; - -static int s3c2443_clk_suspend(void) -{ - samsung_clk_save(reg_base, s3c2443_save, - ARRAY_SIZE(s3c2443_clk_regs)); - - return 0; -} - -static void s3c2443_clk_resume(void) -{ - samsung_clk_restore(reg_base, s3c2443_save, - ARRAY_SIZE(s3c2443_clk_regs)); -} - -static struct syscore_ops s3c2443_clk_syscore_ops = { - .suspend = s3c2443_clk_suspend, - .resume = s3c2443_clk_resume, -}; - -static void s3c2443_clk_sleep_init(void) -{ - s3c2443_save = samsung_clk_alloc_reg_dump(s3c2443_clk_regs, - ARRAY_SIZE(s3c2443_clk_regs)); - if (!s3c2443_save) { - pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", - __func__); - return; - } - - register_syscore_ops(&s3c2443_clk_syscore_ops); - return; -} -#else -static void s3c2443_clk_sleep_init(void) {} -#endif - -PNAME(epllref_p) = { "mpllref", "mpllref", "xti", "ext" }; -PNAME(esysclk_p) = { "epllref", "epll" }; -PNAME(mpllref_p) = { "xti", "mdivclk" }; -PNAME(msysclk_p) = { "mpllref", "mpll" }; -PNAME(armclk_p) = { "armdiv" , "hclk" }; -PNAME(i2s0_p) = { "div_i2s0", "ext_i2s", "epllref", "epllref" }; - -struct samsung_mux_clock s3c2443_common_muxes[] __initdata = { - MUX(0, "epllref", epllref_p, CLKSRC, 7, 2), - MUX(ESYSCLK, "esysclk", esysclk_p, CLKSRC, 6, 1), - MUX(0, "mpllref", mpllref_p, CLKSRC, 3, 1), - MUX_A(MSYSCLK, "msysclk", msysclk_p, CLKSRC, 4, 1, "msysclk"), - MUX_A(ARMCLK, "armclk", armclk_p, CLKDIV0, 13, 1, "armclk"), - MUX(0, "mux_i2s0", i2s0_p, CLKSRC, 14, 2), -}; - -static struct clk_div_table hclk_d[] = { - { .val = 0, .div = 1 }, - { .val = 1, .div = 2 }, - { .val = 3, .div = 4 }, - { /* sentinel */ }, -}; - -static struct clk_div_table mdivclk_d[] = { - { .val = 0, .div = 1 }, - { .val = 1, .div = 3 }, - { .val = 2, .div = 5 }, - { .val = 3, .div = 7 }, - { .val = 4, .div = 9 }, - { .val = 5, .div = 11 }, - { .val = 6, .div = 13 }, - { .val = 7, .div = 15 }, - { /* sentinel */ }, -}; - -struct samsung_div_clock s3c2443_common_dividers[] __initdata = { - DIV_T(0, "mdivclk", "xti", CLKDIV0, 6, 3, mdivclk_d), - DIV(0, "prediv", "msysclk", CLKDIV0, 4, 2), - DIV_T(HCLK, "hclk", "prediv", CLKDIV0, 0, 2, hclk_d), - DIV(PCLK, "pclk", "hclk", CLKDIV0, 2, 1), - DIV(0, "div_hsspi0_epll", "esysclk", CLKDIV1, 24, 2), - DIV(0, "div_fimd", "esysclk", CLKDIV1, 16, 8), - DIV(0, "div_i2s0", "esysclk", CLKDIV1, 12, 4), - DIV(0, "div_uart", "esysclk", CLKDIV1, 8, 4), - DIV(0, "div_hsmmc1", "esysclk", CLKDIV1, 6, 2), - DIV(0, "div_usbhost", "esysclk", CLKDIV1, 4, 2), -}; - -struct samsung_gate_clock s3c2443_common_gates[] __initdata = { - GATE(SCLK_HSMMC_EXT, "sclk_hsmmcext", "ext", SCLKCON, 13, 0, 0), - GATE(SCLK_HSMMC1, "sclk_hsmmc1", "div_hsmmc1", SCLKCON, 12, 0, 0), - GATE(SCLK_FIMD, "sclk_fimd", "div_fimd", SCLKCON, 10, 0, 0), - GATE(SCLK_I2S0, "sclk_i2s0", "mux_i2s0", SCLKCON, 9, 0, 0), - GATE(SCLK_UART, "sclk_uart", "div_uart", SCLKCON, 8, 0, 0), - GATE(SCLK_USBH, "sclk_usbhost", "div_usbhost", SCLKCON, 1, 0, 0), - GATE(HCLK_DRAM, "dram", "hclk", HCLKCON, 19, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_SSMC, "ssmc", "hclk", HCLKCON, 18, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_HSMMC1, "hsmmc1", "hclk", HCLKCON, 16, 0, 0), - GATE(HCLK_USBD, "usb-device", "hclk", HCLKCON, 12, 0, 0), - GATE(HCLK_USBH, "usb-host", "hclk", HCLKCON, 11, 0, 0), - GATE(HCLK_LCD, "lcd", "hclk", HCLKCON, 9, 0, 0), - GATE(HCLK_DMA5, "dma5", "hclk", HCLKCON, 5, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_DMA4, "dma4", "hclk", HCLKCON, 4, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_DMA3, "dma3", "hclk", HCLKCON, 3, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_DMA2, "dma2", "hclk", HCLKCON, 2, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_DMA1, "dma1", "hclk", HCLKCON, 1, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_DMA0, "dma0", "hclk", HCLKCON, 0, CLK_IGNORE_UNUSED, 0), - GATE(PCLK_GPIO, "gpio", "pclk", PCLKCON, 13, CLK_IGNORE_UNUSED, 0), - GATE(PCLK_RTC, "rtc", "pclk", PCLKCON, 12, 0, 0), - GATE(PCLK_WDT, "wdt", "pclk", PCLKCON, 11, 0, 0), - GATE(PCLK_PWM, "pwm", "pclk", PCLKCON, 10, 0, 0), - GATE(PCLK_I2S0, "i2s0", "pclk", PCLKCON, 9, 0, 0), - GATE(PCLK_AC97, "ac97", "pclk", PCLKCON, 8, 0, 0), - GATE(PCLK_ADC, "adc", "pclk", PCLKCON, 7, 0, 0), - GATE(PCLK_SPI0, "spi0", "pclk", PCLKCON, 6, 0, 0), - GATE(PCLK_I2C0, "i2c0", "pclk", PCLKCON, 4, 0, 0), - GATE(PCLK_UART3, "uart3", "pclk", PCLKCON, 3, 0, 0), - GATE(PCLK_UART2, "uart2", "pclk", PCLKCON, 2, 0, 0), - GATE(PCLK_UART1, "uart1", "pclk", PCLKCON, 1, 0, 0), - GATE(PCLK_UART0, "uart0", "pclk", PCLKCON, 0, 0, 0), -}; - -struct samsung_clock_alias s3c2443_common_aliases[] __initdata = { - ALIAS(HCLK, NULL, "hclk"), - ALIAS(HCLK_SSMC, NULL, "nand"), - ALIAS(PCLK_UART0, "s3c2440-uart.0", "uart"), - ALIAS(PCLK_UART1, "s3c2440-uart.1", "uart"), - ALIAS(PCLK_UART2, "s3c2440-uart.2", "uart"), - ALIAS(PCLK_UART3, "s3c2440-uart.3", "uart"), - ALIAS(PCLK_UART0, "s3c2440-uart.0", "clk_uart_baud2"), - ALIAS(PCLK_UART1, "s3c2440-uart.1", "clk_uart_baud2"), - ALIAS(PCLK_UART2, "s3c2440-uart.2", "clk_uart_baud2"), - ALIAS(PCLK_UART3, "s3c2440-uart.3", "clk_uart_baud2"), - ALIAS(SCLK_UART, NULL, "clk_uart_baud3"), - ALIAS(PCLK_PWM, NULL, "timers"), - ALIAS(PCLK_RTC, NULL, "rtc"), - ALIAS(PCLK_WDT, NULL, "watchdog"), - ALIAS(PCLK_ADC, NULL, "adc"), - ALIAS(PCLK_I2C0, "s3c2410-i2c.0", "i2c"), - ALIAS(HCLK_USBD, NULL, "usb-device"), - ALIAS(HCLK_USBH, NULL, "usb-host"), - ALIAS(SCLK_USBH, NULL, "usb-bus-host"), - ALIAS(PCLK_SPI0, "s3c2443-spi.0", "spi"), - ALIAS(PCLK_SPI0, "s3c2443-spi.0", "spi_busclk0"), - ALIAS(HCLK_HSMMC1, "s3c-sdhci.1", "hsmmc"), - ALIAS(HCLK_HSMMC1, "s3c-sdhci.1", "mmc_busclk.0"), - ALIAS(PCLK_I2S0, "samsung-i2s.0", "iis"), - ALIAS(SCLK_I2S0, NULL, "i2s-if"), - ALIAS(HCLK_LCD, NULL, "lcd"), - ALIAS(SCLK_FIMD, NULL, "sclk_fimd"), -}; - -/* S3C2416 specific clocks */ - -static struct samsung_pll_clock s3c2416_pll_clks[] __initdata = { - [mpll] = PLL(pll_6552_s3c2416, 0, "mpll", "mpllref", - LOCKCON0, MPLLCON, NULL), - [epll] = PLL(pll_6553, 0, "epll", "epllref", - LOCKCON1, EPLLCON, NULL), -}; - -PNAME(s3c2416_hsmmc0_p) = { "sclk_hsmmc0", "sclk_hsmmcext" }; -PNAME(s3c2416_hsmmc1_p) = { "sclk_hsmmc1", "sclk_hsmmcext" }; -PNAME(s3c2416_hsspi0_p) = { "hsspi0_epll", "hsspi0_mpll" }; - -static struct clk_div_table armdiv_s3c2416_d[] = { - { .val = 0, .div = 1 }, - { .val = 1, .div = 2 }, - { .val = 2, .div = 3 }, - { .val = 3, .div = 4 }, - { .val = 5, .div = 6 }, - { .val = 7, .div = 8 }, - { /* sentinel */ }, -}; - -struct samsung_div_clock s3c2416_dividers[] __initdata = { - DIV_T(ARMDIV, "armdiv", "msysclk", CLKDIV0, 9, 3, armdiv_s3c2416_d), - DIV(0, "div_hsspi0_mpll", "msysclk", CLKDIV2, 0, 4), - DIV(0, "div_hsmmc0", "esysclk", CLKDIV2, 6, 2), -}; - -struct samsung_mux_clock s3c2416_muxes[] __initdata = { - MUX(MUX_HSMMC0, "mux_hsmmc0", s3c2416_hsmmc0_p, CLKSRC, 16, 1), - MUX(MUX_HSMMC1, "mux_hsmmc1", s3c2416_hsmmc1_p, CLKSRC, 17, 1), - MUX(MUX_HSSPI0, "mux_hsspi0", s3c2416_hsspi0_p, CLKSRC, 18, 1), -}; - -struct samsung_gate_clock s3c2416_gates[] __initdata = { - GATE(0, "hsspi0_mpll", "div_hsspi0_mpll", SCLKCON, 19, 0, 0), - GATE(0, "hsspi0_epll", "div_hsspi0_epll", SCLKCON, 14, 0, 0), - GATE(0, "sclk_hsmmc0", "div_hsmmc0", SCLKCON, 6, 0, 0), - GATE(HCLK_2D, "2d", "hclk", HCLKCON, 20, 0, 0), - GATE(HCLK_HSMMC0, "hsmmc0", "hclk", HCLKCON, 15, 0, 0), - GATE(HCLK_IROM, "irom", "hclk", HCLKCON, 13, CLK_IGNORE_UNUSED, 0), - GATE(PCLK_PCM, "pcm", "pclk", PCLKCON, 19, 0, 0), -}; - -struct samsung_clock_alias s3c2416_aliases[] __initdata = { - ALIAS(HCLK_HSMMC0, "s3c-sdhci.0", "hsmmc"), - ALIAS(HCLK_HSMMC0, "s3c-sdhci.0", "mmc_busclk.0"), - ALIAS(MUX_HSMMC0, "s3c-sdhci.0", "mmc_busclk.2"), - ALIAS(MUX_HSMMC1, "s3c-sdhci.1", "mmc_busclk.2"), - ALIAS(MUX_HSSPI0, "s3c2443-spi.0", "spi_busclk2"), - ALIAS(ARMDIV, NULL, "armdiv"), -}; - -/* S3C2443 specific clocks */ - -static struct samsung_pll_clock s3c2443_pll_clks[] __initdata = { - [mpll] = PLL(pll_3000, 0, "mpll", "mpllref", - LOCKCON0, MPLLCON, NULL), - [epll] = PLL(pll_2126, 0, "epll", "epllref", - LOCKCON1, EPLLCON, NULL), -}; - -static struct clk_div_table armdiv_s3c2443_d[] = { - { .val = 0, .div = 1 }, - { .val = 8, .div = 2 }, - { .val = 2, .div = 3 }, - { .val = 9, .div = 4 }, - { .val = 10, .div = 6 }, - { .val = 11, .div = 8 }, - { .val = 13, .div = 12 }, - { .val = 15, .div = 16 }, - { /* sentinel */ }, -}; - -struct samsung_div_clock s3c2443_dividers[] __initdata = { - DIV_T(ARMDIV, "armdiv", "msysclk", CLKDIV0, 9, 4, armdiv_s3c2443_d), - DIV(0, "div_cam", "esysclk", CLKDIV1, 26, 4), -}; - -struct samsung_gate_clock s3c2443_gates[] __initdata = { - GATE(SCLK_HSSPI0, "sclk_hsspi0", "div_hsspi0_epll", SCLKCON, 14, 0, 0), - GATE(SCLK_CAM, "sclk_cam", "div_cam", SCLKCON, 11, 0, 0), - GATE(HCLK_CFC, "cfc", "hclk", HCLKCON, 17, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_CAM, "cam", "hclk", HCLKCON, 8, 0, 0), - GATE(PCLK_SPI1, "spi1", "pclk", PCLKCON, 15, 0, 0), - GATE(PCLK_SDI, "sdi", "pclk", PCLKCON, 5, 0, 0), -}; - -struct samsung_clock_alias s3c2443_aliases[] __initdata = { - ALIAS(SCLK_HSSPI0, "s3c2443-spi.0", "spi_busclk2"), - ALIAS(SCLK_HSMMC1, "s3c-sdhci.1", "mmc_busclk.2"), - ALIAS(SCLK_CAM, NULL, "camif-upll"), - ALIAS(PCLK_SPI1, "s3c2410-spi.0", "spi"), - ALIAS(PCLK_SDI, NULL, "sdi"), - ALIAS(HCLK_CFC, NULL, "cfc"), - ALIAS(ARMDIV, NULL, "armdiv"), -}; - -/* S3C2450 specific clocks */ - -PNAME(s3c2450_cam_p) = { "div_cam", "hclk" }; -PNAME(s3c2450_hsspi1_p) = { "hsspi1_epll", "hsspi1_mpll" }; -PNAME(i2s1_p) = { "div_i2s1", "ext_i2s", "epllref", "epllref" }; - -struct samsung_div_clock s3c2450_dividers[] __initdata = { - DIV(0, "div_cam", "esysclk", CLKDIV1, 26, 4), - DIV(0, "div_hsspi1_epll", "esysclk", CLKDIV2, 24, 2), - DIV(0, "div_hsspi1_mpll", "msysclk", CLKDIV2, 16, 4), - DIV(0, "div_i2s1", "esysclk", CLKDIV2, 12, 4), -}; - -struct samsung_mux_clock s3c2450_muxes[] __initdata = { - MUX(0, "mux_cam", s3c2450_cam_p, CLKSRC, 20, 1), - MUX(MUX_HSSPI1, "mux_hsspi1", s3c2450_hsspi1_p, CLKSRC, 19, 1), - MUX(0, "mux_i2s1", i2s1_p, CLKSRC, 12, 2), -}; - -struct samsung_gate_clock s3c2450_gates[] __initdata = { - GATE(SCLK_I2S1, "sclk_i2s1", "div_i2s1", SCLKCON, 5, 0, 0), - GATE(HCLK_CFC, "cfc", "hclk", HCLKCON, 17, 0, 0), - GATE(HCLK_CAM, "cam", "hclk", HCLKCON, 8, 0, 0), - GATE(HCLK_DMA7, "dma7", "hclk", HCLKCON, 7, CLK_IGNORE_UNUSED, 0), - GATE(HCLK_DMA6, "dma6", "hclk", HCLKCON, 6, CLK_IGNORE_UNUSED, 0), - GATE(PCLK_I2S1, "i2s1", "pclk", PCLKCON, 17, 0, 0), - GATE(PCLK_I2C1, "i2c1", "pclk", PCLKCON, 16, 0, 0), - GATE(PCLK_SPI1, "spi1", "pclk", PCLKCON, 14, 0, 0), -}; - -struct samsung_clock_alias s3c2450_aliases[] __initdata = { - ALIAS(PCLK_SPI1, "s3c2443-spi.1", "spi"), - ALIAS(PCLK_SPI1, "s3c2443-spi.1", "spi_busclk0"), - ALIAS(MUX_HSSPI1, "s3c2443-spi.1", "spi_busclk2"), - ALIAS(PCLK_I2C1, "s3c2410-i2c.1", "i2c"), -}; - -static int s3c2443_restart(struct notifier_block *this, - unsigned long mode, void *cmd) -{ - __raw_writel(0x533c2443, reg_base + SWRST); - return NOTIFY_DONE; -} - -static struct notifier_block s3c2443_restart_handler = { - .notifier_call = s3c2443_restart, - .priority = 129, -}; - -/* - * fixed rate clocks generated outside the soc - * Only necessary until the devicetree-move is complete - */ -struct samsung_fixed_rate_clock s3c2443_common_frate_clks[] __initdata = { - FRATE(0, "xti", NULL, 0, 0), - FRATE(0, "ext", NULL, 0, 0), - FRATE(0, "ext_i2s", NULL, 0, 0), - FRATE(0, "ext_uart", NULL, 0, 0), -}; - -static void __init s3c2443_common_clk_register_fixed_ext( - struct samsung_clk_provider *ctx, unsigned long xti_f) -{ - s3c2443_common_frate_clks[0].fixed_rate = xti_f; - samsung_clk_register_fixed_rate(ctx, s3c2443_common_frate_clks, - ARRAY_SIZE(s3c2443_common_frate_clks)); -} - -void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f, - int current_soc, - void __iomem *base) -{ - struct samsung_clk_provider *ctx; - int ret; - reg_base = base; - - if (np) { - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - } - - ctx = samsung_clk_init(np, reg_base, NR_CLKS); - - /* Register external clocks only in non-dt cases */ - if (!np) - s3c2443_common_clk_register_fixed_ext(ctx, xti_f); - - /* Register PLLs. */ - if (current_soc == S3C2416 || current_soc == S3C2450) - samsung_clk_register_pll(ctx, s3c2416_pll_clks, - ARRAY_SIZE(s3c2416_pll_clks), reg_base); - else - samsung_clk_register_pll(ctx, s3c2443_pll_clks, - ARRAY_SIZE(s3c2443_pll_clks), reg_base); - - /* Register common internal clocks. */ - samsung_clk_register_mux(ctx, s3c2443_common_muxes, - ARRAY_SIZE(s3c2443_common_muxes)); - samsung_clk_register_div(ctx, s3c2443_common_dividers, - ARRAY_SIZE(s3c2443_common_dividers)); - samsung_clk_register_gate(ctx, s3c2443_common_gates, - ARRAY_SIZE(s3c2443_common_gates)); - samsung_clk_register_alias(ctx, s3c2443_common_aliases, - ARRAY_SIZE(s3c2443_common_aliases)); - - /* Register SoC-specific clocks. */ - switch (current_soc) { - case S3C2450: - samsung_clk_register_div(ctx, s3c2450_dividers, - ARRAY_SIZE(s3c2450_dividers)); - samsung_clk_register_mux(ctx, s3c2450_muxes, - ARRAY_SIZE(s3c2450_muxes)); - samsung_clk_register_gate(ctx, s3c2450_gates, - ARRAY_SIZE(s3c2450_gates)); - samsung_clk_register_alias(ctx, s3c2450_aliases, - ARRAY_SIZE(s3c2450_aliases)); - /* fall through, as s3c2450 extends the s3c2416 clocks */ - case S3C2416: - samsung_clk_register_div(ctx, s3c2416_dividers, - ARRAY_SIZE(s3c2416_dividers)); - samsung_clk_register_mux(ctx, s3c2416_muxes, - ARRAY_SIZE(s3c2416_muxes)); - samsung_clk_register_gate(ctx, s3c2416_gates, - ARRAY_SIZE(s3c2416_gates)); - samsung_clk_register_alias(ctx, s3c2416_aliases, - ARRAY_SIZE(s3c2416_aliases)); - break; - case S3C2443: - samsung_clk_register_div(ctx, s3c2443_dividers, - ARRAY_SIZE(s3c2443_dividers)); - samsung_clk_register_gate(ctx, s3c2443_gates, - ARRAY_SIZE(s3c2443_gates)); - samsung_clk_register_alias(ctx, s3c2443_aliases, - ARRAY_SIZE(s3c2443_aliases)); - break; - } - - s3c2443_clk_sleep_init(); - - samsung_clk_of_add_provider(np, ctx); - - ret = register_restart_handler(&s3c2443_restart_handler); - if (ret) - pr_warn("cannot register restart handler, %d\n", ret); -} - -static void __init s3c2416_clk_init(struct device_node *np) -{ - s3c2443_common_clk_init(np, 0, S3C2416, 0); -} -CLK_OF_DECLARE(s3c2416_clk, "samsung,s3c2416-clock", s3c2416_clk_init); - -static void __init s3c2443_clk_init(struct device_node *np) -{ - s3c2443_common_clk_init(np, 0, S3C2443, 0); -} -CLK_OF_DECLARE(s3c2443_clk, "samsung,s3c2443-clock", s3c2443_clk_init); - -static void __init s3c2450_clk_init(struct device_node *np) -{ - s3c2443_common_clk_init(np, 0, S3C2450, 0); -} -CLK_OF_DECLARE(s3c2450_clk, "samsung,s3c2450-clock", s3c2450_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-s3c64xx.c b/drivers/clk/samsung/samsung/clk-s3c64xx.c deleted file mode 100644 index a48bd5f17330..000000000000 --- a/drivers/clk/samsung/samsung/clk-s3c64xx.c +++ /dev/null @@ -1,537 +0,0 @@ -/* - * Copyright (c) 2013 Tomasz Figa - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for all S3C64xx SoCs. -*/ - -#include -#include -#include -#include -#include - -#include - -#include "clk.h" -#include "clk-pll.h" - -/* S3C64xx clock controller register offsets. */ -#define APLL_LOCK 0x000 -#define MPLL_LOCK 0x004 -#define EPLL_LOCK 0x008 -#define APLL_CON 0x00c -#define MPLL_CON 0x010 -#define EPLL_CON0 0x014 -#define EPLL_CON1 0x018 -#define CLK_SRC 0x01c -#define CLK_DIV0 0x020 -#define CLK_DIV1 0x024 -#define CLK_DIV2 0x028 -#define HCLK_GATE 0x030 -#define PCLK_GATE 0x034 -#define SCLK_GATE 0x038 -#define MEM0_GATE 0x03c -#define CLK_SRC2 0x10c -#define OTHERS 0x900 - -/* Helper macros to define clock arrays. */ -#define FIXED_RATE_CLOCKS(name) \ - static struct samsung_fixed_rate_clock name[] -#define MUX_CLOCKS(name) \ - static struct samsung_mux_clock name[] -#define DIV_CLOCKS(name) \ - static struct samsung_div_clock name[] -#define GATE_CLOCKS(name) \ - static struct samsung_gate_clock name[] - -/* Helper macros for gate types present on S3C64xx. */ -#define GATE_BUS(_id, cname, pname, o, b) \ - GATE(_id, cname, pname, o, b, 0, 0) -#define GATE_SCLK(_id, cname, pname, o, b) \ - GATE(_id, cname, pname, o, b, CLK_SET_RATE_PARENT, 0) -#define GATE_ON(_id, cname, pname, o, b) \ - GATE(_id, cname, pname, o, b, CLK_IGNORE_UNUSED, 0) - -/* list of PLLs to be registered */ -enum s3c64xx_plls { - apll, mpll, epll, -}; - -static void __iomem *reg_base; -static bool is_s3c6400; - -#ifdef CONFIG_PM_SLEEP -static struct samsung_clk_reg_dump *s3c64xx_save_common; -static struct samsung_clk_reg_dump *s3c64xx_save_soc; - -/* - * List of controller registers to be saved and restored during - * a suspend/resume cycle. - */ -static unsigned long s3c64xx_clk_regs[] __initdata = { - APLL_LOCK, - MPLL_LOCK, - EPLL_LOCK, - APLL_CON, - MPLL_CON, - EPLL_CON0, - EPLL_CON1, - CLK_SRC, - CLK_DIV0, - CLK_DIV1, - CLK_DIV2, - HCLK_GATE, - PCLK_GATE, - SCLK_GATE, -}; - -static unsigned long s3c6410_clk_regs[] __initdata = { - CLK_SRC2, - MEM0_GATE, -}; - -static int s3c64xx_clk_suspend(void) -{ - samsung_clk_save(reg_base, s3c64xx_save_common, - ARRAY_SIZE(s3c64xx_clk_regs)); - - if (!is_s3c6400) - samsung_clk_save(reg_base, s3c64xx_save_soc, - ARRAY_SIZE(s3c6410_clk_regs)); - - return 0; -} - -static void s3c64xx_clk_resume(void) -{ - samsung_clk_restore(reg_base, s3c64xx_save_common, - ARRAY_SIZE(s3c64xx_clk_regs)); - - if (!is_s3c6400) - samsung_clk_restore(reg_base, s3c64xx_save_soc, - ARRAY_SIZE(s3c6410_clk_regs)); -} - -static struct syscore_ops s3c64xx_clk_syscore_ops = { - .suspend = s3c64xx_clk_suspend, - .resume = s3c64xx_clk_resume, -}; - -static void s3c64xx_clk_sleep_init(void) -{ - s3c64xx_save_common = samsung_clk_alloc_reg_dump(s3c64xx_clk_regs, - ARRAY_SIZE(s3c64xx_clk_regs)); - if (!s3c64xx_save_common) - goto err_warn; - - if (!is_s3c6400) { - s3c64xx_save_soc = samsung_clk_alloc_reg_dump(s3c6410_clk_regs, - ARRAY_SIZE(s3c6410_clk_regs)); - if (!s3c64xx_save_soc) - goto err_soc; - } - - register_syscore_ops(&s3c64xx_clk_syscore_ops); - return; - -err_soc: - kfree(s3c64xx_save_common); -err_warn: - pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", - __func__); -} -#else -static void s3c64xx_clk_sleep_init(void) {} -#endif - -/* List of parent clocks common for all S3C64xx SoCs. */ -PNAME(spi_mmc_p) = { "mout_epll", "dout_mpll", "fin_pll", "clk27m" }; -PNAME(uart_p) = { "mout_epll", "dout_mpll" }; -PNAME(audio0_p) = { "mout_epll", "dout_mpll", "fin_pll", "iiscdclk0", - "pcmcdclk0", "none", "none", "none" }; -PNAME(audio1_p) = { "mout_epll", "dout_mpll", "fin_pll", "iiscdclk1", - "pcmcdclk0", "none", "none", "none" }; -PNAME(mfc_p) = { "hclkx2", "mout_epll" }; -PNAME(apll_p) = { "fin_pll", "fout_apll" }; -PNAME(mpll_p) = { "fin_pll", "fout_mpll" }; -PNAME(epll_p) = { "fin_pll", "fout_epll" }; -PNAME(hclkx2_p) = { "mout_mpll", "mout_apll" }; - -/* S3C6400-specific parent clocks. */ -PNAME(scaler_lcd_p6400) = { "mout_epll", "dout_mpll", "none", "none" }; -PNAME(irda_p6400) = { "mout_epll", "dout_mpll", "none", "clk48m" }; -PNAME(uhost_p6400) = { "clk48m", "mout_epll", "dout_mpll", "none" }; - -/* S3C6410-specific parent clocks. */ -PNAME(clk27_p6410) = { "clk27m", "fin_pll" }; -PNAME(scaler_lcd_p6410) = { "mout_epll", "dout_mpll", "fin_pll", "none" }; -PNAME(irda_p6410) = { "mout_epll", "dout_mpll", "fin_pll", "clk48m" }; -PNAME(uhost_p6410) = { "clk48m", "mout_epll", "dout_mpll", "fin_pll" }; -PNAME(audio2_p6410) = { "mout_epll", "dout_mpll", "fin_pll", "iiscdclk2", - "pcmcdclk1", "none", "none", "none" }; - -/* Fixed rate clocks generated outside the SoC. */ -FIXED_RATE_CLOCKS(s3c64xx_fixed_rate_ext_clks) __initdata = { - FRATE(0, "fin_pll", NULL, 0, 0), - FRATE(0, "xusbxti", NULL, 0, 0), -}; - -/* Fixed rate clocks generated inside the SoC. */ -FIXED_RATE_CLOCKS(s3c64xx_fixed_rate_clks) __initdata = { - FRATE(CLK27M, "clk27m", NULL, 0, 27000000), - FRATE(CLK48M, "clk48m", NULL, 0, 48000000), -}; - -/* List of clock muxes present on all S3C64xx SoCs. */ -MUX_CLOCKS(s3c64xx_mux_clks) __initdata = { - MUX_F(0, "mout_syncmux", hclkx2_p, OTHERS, 6, 1, 0, CLK_MUX_READ_ONLY), - MUX(MOUT_APLL, "mout_apll", apll_p, CLK_SRC, 0, 1), - MUX(MOUT_MPLL, "mout_mpll", mpll_p, CLK_SRC, 1, 1), - MUX(MOUT_EPLL, "mout_epll", epll_p, CLK_SRC, 2, 1), - MUX(MOUT_MFC, "mout_mfc", mfc_p, CLK_SRC, 4, 1), - MUX(MOUT_AUDIO0, "mout_audio0", audio0_p, CLK_SRC, 7, 3), - MUX(MOUT_AUDIO1, "mout_audio1", audio1_p, CLK_SRC, 10, 3), - MUX(MOUT_UART, "mout_uart", uart_p, CLK_SRC, 13, 1), - MUX(MOUT_SPI0, "mout_spi0", spi_mmc_p, CLK_SRC, 14, 2), - MUX(MOUT_SPI1, "mout_spi1", spi_mmc_p, CLK_SRC, 16, 2), - MUX(MOUT_MMC0, "mout_mmc0", spi_mmc_p, CLK_SRC, 18, 2), - MUX(MOUT_MMC1, "mout_mmc1", spi_mmc_p, CLK_SRC, 20, 2), - MUX(MOUT_MMC2, "mout_mmc2", spi_mmc_p, CLK_SRC, 22, 2), -}; - -/* List of clock muxes present on S3C6400. */ -MUX_CLOCKS(s3c6400_mux_clks) __initdata = { - MUX(MOUT_UHOST, "mout_uhost", uhost_p6400, CLK_SRC, 5, 2), - MUX(MOUT_IRDA, "mout_irda", irda_p6400, CLK_SRC, 24, 2), - MUX(MOUT_LCD, "mout_lcd", scaler_lcd_p6400, CLK_SRC, 26, 2), - MUX(MOUT_SCALER, "mout_scaler", scaler_lcd_p6400, CLK_SRC, 28, 2), -}; - -/* List of clock muxes present on S3C6410. */ -MUX_CLOCKS(s3c6410_mux_clks) __initdata = { - MUX(MOUT_UHOST, "mout_uhost", uhost_p6410, CLK_SRC, 5, 2), - MUX(MOUT_IRDA, "mout_irda", irda_p6410, CLK_SRC, 24, 2), - MUX(MOUT_LCD, "mout_lcd", scaler_lcd_p6410, CLK_SRC, 26, 2), - MUX(MOUT_SCALER, "mout_scaler", scaler_lcd_p6410, CLK_SRC, 28, 2), - MUX(MOUT_DAC27, "mout_dac27", clk27_p6410, CLK_SRC, 30, 1), - MUX(MOUT_TV27, "mout_tv27", clk27_p6410, CLK_SRC, 31, 1), - MUX(MOUT_AUDIO2, "mout_audio2", audio2_p6410, CLK_SRC2, 0, 3), -}; - -/* List of clock dividers present on all S3C64xx SoCs. */ -DIV_CLOCKS(s3c64xx_div_clks) __initdata = { - DIV(DOUT_MPLL, "dout_mpll", "mout_mpll", CLK_DIV0, 4, 1), - DIV(HCLKX2, "hclkx2", "mout_syncmux", CLK_DIV0, 9, 3), - DIV(HCLK, "hclk", "hclkx2", CLK_DIV0, 8, 1), - DIV(PCLK, "pclk", "hclkx2", CLK_DIV0, 12, 4), - DIV(DOUT_SECUR, "dout_secur", "hclkx2", CLK_DIV0, 18, 2), - DIV(DOUT_CAM, "dout_cam", "hclkx2", CLK_DIV0, 20, 4), - DIV(DOUT_JPEG, "dout_jpeg", "hclkx2", CLK_DIV0, 24, 4), - DIV(DOUT_MFC, "dout_mfc", "mout_mfc", CLK_DIV0, 28, 4), - DIV(DOUT_MMC0, "dout_mmc0", "mout_mmc0", CLK_DIV1, 0, 4), - DIV(DOUT_MMC1, "dout_mmc1", "mout_mmc1", CLK_DIV1, 4, 4), - DIV(DOUT_MMC2, "dout_mmc2", "mout_mmc2", CLK_DIV1, 8, 4), - DIV(DOUT_LCD, "dout_lcd", "mout_lcd", CLK_DIV1, 12, 4), - DIV(DOUT_SCALER, "dout_scaler", "mout_scaler", CLK_DIV1, 16, 4), - DIV(DOUT_UHOST, "dout_uhost", "mout_uhost", CLK_DIV1, 20, 4), - DIV(DOUT_SPI0, "dout_spi0", "mout_spi0", CLK_DIV2, 0, 4), - DIV(DOUT_SPI1, "dout_spi1", "mout_spi1", CLK_DIV2, 4, 4), - DIV(DOUT_AUDIO0, "dout_audio0", "mout_audio0", CLK_DIV2, 8, 4), - DIV(DOUT_AUDIO1, "dout_audio1", "mout_audio1", CLK_DIV2, 12, 4), - DIV(DOUT_UART, "dout_uart", "mout_uart", CLK_DIV2, 16, 4), - DIV(DOUT_IRDA, "dout_irda", "mout_irda", CLK_DIV2, 20, 4), -}; - -/* List of clock dividers present on S3C6400. */ -DIV_CLOCKS(s3c6400_div_clks) __initdata = { - DIV(ARMCLK, "armclk", "mout_apll", CLK_DIV0, 0, 3), -}; - -/* List of clock dividers present on S3C6410. */ -DIV_CLOCKS(s3c6410_div_clks) __initdata = { - DIV(ARMCLK, "armclk", "mout_apll", CLK_DIV0, 0, 4), - DIV(DOUT_FIMC, "dout_fimc", "hclk", CLK_DIV1, 24, 4), - DIV(DOUT_AUDIO2, "dout_audio2", "mout_audio2", CLK_DIV2, 24, 4), -}; - -/* List of clock gates present on all S3C64xx SoCs. */ -GATE_CLOCKS(s3c64xx_gate_clks) __initdata = { - GATE_BUS(HCLK_UHOST, "hclk_uhost", "hclk", HCLK_GATE, 29), - GATE_BUS(HCLK_SECUR, "hclk_secur", "hclk", HCLK_GATE, 28), - GATE_BUS(HCLK_SDMA1, "hclk_sdma1", "hclk", HCLK_GATE, 27), - GATE_BUS(HCLK_SDMA0, "hclk_sdma0", "hclk", HCLK_GATE, 26), - GATE_ON(HCLK_DDR1, "hclk_ddr1", "hclk", HCLK_GATE, 24), - GATE_BUS(HCLK_USB, "hclk_usb", "hclk", HCLK_GATE, 20), - GATE_BUS(HCLK_HSMMC2, "hclk_hsmmc2", "hclk", HCLK_GATE, 19), - GATE_BUS(HCLK_HSMMC1, "hclk_hsmmc1", "hclk", HCLK_GATE, 18), - GATE_BUS(HCLK_HSMMC0, "hclk_hsmmc0", "hclk", HCLK_GATE, 17), - GATE_BUS(HCLK_MDP, "hclk_mdp", "hclk", HCLK_GATE, 16), - GATE_BUS(HCLK_DHOST, "hclk_dhost", "hclk", HCLK_GATE, 15), - GATE_BUS(HCLK_IHOST, "hclk_ihost", "hclk", HCLK_GATE, 14), - GATE_BUS(HCLK_DMA1, "hclk_dma1", "hclk", HCLK_GATE, 13), - GATE_BUS(HCLK_DMA0, "hclk_dma0", "hclk", HCLK_GATE, 12), - GATE_BUS(HCLK_JPEG, "hclk_jpeg", "hclk", HCLK_GATE, 11), - GATE_BUS(HCLK_CAMIF, "hclk_camif", "hclk", HCLK_GATE, 10), - GATE_BUS(HCLK_SCALER, "hclk_scaler", "hclk", HCLK_GATE, 9), - GATE_BUS(HCLK_2D, "hclk_2d", "hclk", HCLK_GATE, 8), - GATE_BUS(HCLK_TV, "hclk_tv", "hclk", HCLK_GATE, 7), - GATE_BUS(HCLK_POST0, "hclk_post0", "hclk", HCLK_GATE, 5), - GATE_BUS(HCLK_ROT, "hclk_rot", "hclk", HCLK_GATE, 4), - GATE_BUS(HCLK_LCD, "hclk_lcd", "hclk", HCLK_GATE, 3), - GATE_BUS(HCLK_TZIC, "hclk_tzic", "hclk", HCLK_GATE, 2), - GATE_ON(HCLK_INTC, "hclk_intc", "hclk", HCLK_GATE, 1), - GATE_ON(PCLK_SKEY, "pclk_skey", "pclk", PCLK_GATE, 24), - GATE_ON(PCLK_CHIPID, "pclk_chipid", "pclk", PCLK_GATE, 23), - GATE_BUS(PCLK_SPI1, "pclk_spi1", "pclk", PCLK_GATE, 22), - GATE_BUS(PCLK_SPI0, "pclk_spi0", "pclk", PCLK_GATE, 21), - GATE_BUS(PCLK_HSIRX, "pclk_hsirx", "pclk", PCLK_GATE, 20), - GATE_BUS(PCLK_HSITX, "pclk_hsitx", "pclk", PCLK_GATE, 19), - GATE_ON(PCLK_GPIO, "pclk_gpio", "pclk", PCLK_GATE, 18), - GATE_BUS(PCLK_IIC0, "pclk_iic0", "pclk", PCLK_GATE, 17), - GATE_BUS(PCLK_IIS1, "pclk_iis1", "pclk", PCLK_GATE, 16), - GATE_BUS(PCLK_IIS0, "pclk_iis0", "pclk", PCLK_GATE, 15), - GATE_BUS(PCLK_AC97, "pclk_ac97", "pclk", PCLK_GATE, 14), - GATE_BUS(PCLK_TZPC, "pclk_tzpc", "pclk", PCLK_GATE, 13), - GATE_BUS(PCLK_TSADC, "pclk_tsadc", "pclk", PCLK_GATE, 12), - GATE_BUS(PCLK_KEYPAD, "pclk_keypad", "pclk", PCLK_GATE, 11), - GATE_BUS(PCLK_IRDA, "pclk_irda", "pclk", PCLK_GATE, 10), - GATE_BUS(PCLK_PCM1, "pclk_pcm1", "pclk", PCLK_GATE, 9), - GATE_BUS(PCLK_PCM0, "pclk_pcm0", "pclk", PCLK_GATE, 8), - GATE_BUS(PCLK_PWM, "pclk_pwm", "pclk", PCLK_GATE, 7), - GATE_BUS(PCLK_RTC, "pclk_rtc", "pclk", PCLK_GATE, 6), - GATE_BUS(PCLK_WDT, "pclk_wdt", "pclk", PCLK_GATE, 5), - GATE_BUS(PCLK_UART3, "pclk_uart3", "pclk", PCLK_GATE, 4), - GATE_BUS(PCLK_UART2, "pclk_uart2", "pclk", PCLK_GATE, 3), - GATE_BUS(PCLK_UART1, "pclk_uart1", "pclk", PCLK_GATE, 2), - GATE_BUS(PCLK_UART0, "pclk_uart0", "pclk", PCLK_GATE, 1), - GATE_BUS(PCLK_MFC, "pclk_mfc", "pclk", PCLK_GATE, 0), - GATE_SCLK(SCLK_UHOST, "sclk_uhost", "dout_uhost", SCLK_GATE, 30), - GATE_SCLK(SCLK_MMC2_48, "sclk_mmc2_48", "clk48m", SCLK_GATE, 29), - GATE_SCLK(SCLK_MMC1_48, "sclk_mmc1_48", "clk48m", SCLK_GATE, 28), - GATE_SCLK(SCLK_MMC0_48, "sclk_mmc0_48", "clk48m", SCLK_GATE, 27), - GATE_SCLK(SCLK_MMC2, "sclk_mmc2", "dout_mmc2", SCLK_GATE, 26), - GATE_SCLK(SCLK_MMC1, "sclk_mmc1", "dout_mmc1", SCLK_GATE, 25), - GATE_SCLK(SCLK_MMC0, "sclk_mmc0", "dout_mmc0", SCLK_GATE, 24), - GATE_SCLK(SCLK_SPI1_48, "sclk_spi1_48", "clk48m", SCLK_GATE, 23), - GATE_SCLK(SCLK_SPI0_48, "sclk_spi0_48", "clk48m", SCLK_GATE, 22), - GATE_SCLK(SCLK_SPI1, "sclk_spi1", "dout_spi1", SCLK_GATE, 21), - GATE_SCLK(SCLK_SPI0, "sclk_spi0", "dout_spi0", SCLK_GATE, 20), - GATE_SCLK(SCLK_DAC27, "sclk_dac27", "mout_dac27", SCLK_GATE, 19), - GATE_SCLK(SCLK_TV27, "sclk_tv27", "mout_tv27", SCLK_GATE, 18), - GATE_SCLK(SCLK_SCALER27, "sclk_scaler27", "clk27m", SCLK_GATE, 17), - GATE_SCLK(SCLK_SCALER, "sclk_scaler", "dout_scaler", SCLK_GATE, 16), - GATE_SCLK(SCLK_LCD27, "sclk_lcd27", "clk27m", SCLK_GATE, 15), - GATE_SCLK(SCLK_LCD, "sclk_lcd", "dout_lcd", SCLK_GATE, 14), - GATE_SCLK(SCLK_POST0_27, "sclk_post0_27", "clk27m", SCLK_GATE, 12), - GATE_SCLK(SCLK_POST0, "sclk_post0", "dout_lcd", SCLK_GATE, 10), - GATE_SCLK(SCLK_AUDIO1, "sclk_audio1", "dout_audio1", SCLK_GATE, 9), - GATE_SCLK(SCLK_AUDIO0, "sclk_audio0", "dout_audio0", SCLK_GATE, 8), - GATE_SCLK(SCLK_SECUR, "sclk_secur", "dout_secur", SCLK_GATE, 7), - GATE_SCLK(SCLK_IRDA, "sclk_irda", "dout_irda", SCLK_GATE, 6), - GATE_SCLK(SCLK_UART, "sclk_uart", "dout_uart", SCLK_GATE, 5), - GATE_SCLK(SCLK_MFC, "sclk_mfc", "dout_mfc", SCLK_GATE, 3), - GATE_SCLK(SCLK_CAM, "sclk_cam", "dout_cam", SCLK_GATE, 2), - GATE_SCLK(SCLK_JPEG, "sclk_jpeg", "dout_jpeg", SCLK_GATE, 1), -}; - -/* List of clock gates present on S3C6400. */ -GATE_CLOCKS(s3c6400_gate_clks) __initdata = { - GATE_ON(HCLK_DDR0, "hclk_ddr0", "hclk", HCLK_GATE, 23), - GATE_SCLK(SCLK_ONENAND, "sclk_onenand", "parent", SCLK_GATE, 4), -}; - -/* List of clock gates present on S3C6410. */ -GATE_CLOCKS(s3c6410_gate_clks) __initdata = { - GATE_BUS(HCLK_3DSE, "hclk_3dse", "hclk", HCLK_GATE, 31), - GATE_ON(HCLK_IROM, "hclk_irom", "hclk", HCLK_GATE, 25), - GATE_ON(HCLK_MEM1, "hclk_mem1", "hclk", HCLK_GATE, 22), - GATE_ON(HCLK_MEM0, "hclk_mem0", "hclk", HCLK_GATE, 21), - GATE_BUS(HCLK_MFC, "hclk_mfc", "hclk", HCLK_GATE, 0), - GATE_BUS(PCLK_IIC1, "pclk_iic1", "pclk", PCLK_GATE, 27), - GATE_BUS(PCLK_IIS2, "pclk_iis2", "pclk", PCLK_GATE, 26), - GATE_SCLK(SCLK_FIMC, "sclk_fimc", "dout_fimc", SCLK_GATE, 13), - GATE_SCLK(SCLK_AUDIO2, "sclk_audio2", "dout_audio2", SCLK_GATE, 11), - GATE_BUS(MEM0_CFCON, "mem0_cfcon", "hclk_mem0", MEM0_GATE, 5), - GATE_BUS(MEM0_ONENAND1, "mem0_onenand1", "hclk_mem0", MEM0_GATE, 4), - GATE_BUS(MEM0_ONENAND0, "mem0_onenand0", "hclk_mem0", MEM0_GATE, 3), - GATE_BUS(MEM0_NFCON, "mem0_nfcon", "hclk_mem0", MEM0_GATE, 2), - GATE_ON(MEM0_SROM, "mem0_srom", "hclk_mem0", MEM0_GATE, 1), -}; - -/* List of PLL clocks. */ -static struct samsung_pll_clock s3c64xx_pll_clks[] __initdata = { - [apll] = PLL(pll_6552, FOUT_APLL, "fout_apll", "fin_pll", - APLL_LOCK, APLL_CON, NULL), - [mpll] = PLL(pll_6552, FOUT_MPLL, "fout_mpll", "fin_pll", - MPLL_LOCK, MPLL_CON, NULL), - [epll] = PLL(pll_6553, FOUT_EPLL, "fout_epll", "fin_pll", - EPLL_LOCK, EPLL_CON0, NULL), -}; - -/* Aliases for common s3c64xx clocks. */ -static struct samsung_clock_alias s3c64xx_clock_aliases[] = { - ALIAS(FOUT_APLL, NULL, "fout_apll"), - ALIAS(FOUT_MPLL, NULL, "fout_mpll"), - ALIAS(FOUT_EPLL, NULL, "fout_epll"), - ALIAS(MOUT_EPLL, NULL, "mout_epll"), - ALIAS(DOUT_MPLL, NULL, "dout_mpll"), - ALIAS(HCLKX2, NULL, "hclk2"), - ALIAS(HCLK, NULL, "hclk"), - ALIAS(PCLK, NULL, "pclk"), - ALIAS(PCLK, NULL, "clk_uart_baud2"), - ALIAS(ARMCLK, NULL, "armclk"), - ALIAS(HCLK_UHOST, "s3c2410-ohci", "usb-host"), - ALIAS(HCLK_USB, "s3c-hsotg", "otg"), - ALIAS(HCLK_HSMMC2, "s3c-sdhci.2", "hsmmc"), - ALIAS(HCLK_HSMMC2, "s3c-sdhci.2", "mmc_busclk.0"), - ALIAS(HCLK_HSMMC1, "s3c-sdhci.1", "hsmmc"), - ALIAS(HCLK_HSMMC1, "s3c-sdhci.1", "mmc_busclk.0"), - ALIAS(HCLK_HSMMC0, "s3c-sdhci.0", "hsmmc"), - ALIAS(HCLK_HSMMC0, "s3c-sdhci.0", "mmc_busclk.0"), - ALIAS(HCLK_DMA1, "dma-pl080s.1", "apb_pclk"), - ALIAS(HCLK_DMA0, "dma-pl080s.0", "apb_pclk"), - ALIAS(HCLK_CAMIF, "s3c-camif", "camif"), - ALIAS(HCLK_LCD, "s3c-fb", "lcd"), - ALIAS(PCLK_SPI1, "s3c6410-spi.1", "spi"), - ALIAS(PCLK_SPI0, "s3c6410-spi.0", "spi"), - ALIAS(PCLK_IIC0, "s3c2440-i2c.0", "i2c"), - ALIAS(PCLK_IIS1, "samsung-i2s.1", "iis"), - ALIAS(PCLK_IIS0, "samsung-i2s.0", "iis"), - ALIAS(PCLK_AC97, "samsung-ac97", "ac97"), - ALIAS(PCLK_TSADC, "s3c64xx-adc", "adc"), - ALIAS(PCLK_KEYPAD, "samsung-keypad", "keypad"), - ALIAS(PCLK_PCM1, "samsung-pcm.1", "pcm"), - ALIAS(PCLK_PCM0, "samsung-pcm.0", "pcm"), - ALIAS(PCLK_PWM, NULL, "timers"), - ALIAS(PCLK_RTC, "s3c64xx-rtc", "rtc"), - ALIAS(PCLK_WDT, NULL, "watchdog"), - ALIAS(PCLK_UART3, "s3c6400-uart.3", "uart"), - ALIAS(PCLK_UART2, "s3c6400-uart.2", "uart"), - ALIAS(PCLK_UART1, "s3c6400-uart.1", "uart"), - ALIAS(PCLK_UART0, "s3c6400-uart.0", "uart"), - ALIAS(SCLK_UHOST, "s3c2410-ohci", "usb-bus-host"), - ALIAS(SCLK_MMC2, "s3c-sdhci.2", "mmc_busclk.2"), - ALIAS(SCLK_MMC1, "s3c-sdhci.1", "mmc_busclk.2"), - ALIAS(SCLK_MMC0, "s3c-sdhci.0", "mmc_busclk.2"), - ALIAS(PCLK_SPI1, "s3c6410-spi.1", "spi_busclk0"), - ALIAS(SCLK_SPI1, "s3c6410-spi.1", "spi_busclk2"), - ALIAS(PCLK_SPI0, "s3c6410-spi.0", "spi_busclk0"), - ALIAS(SCLK_SPI0, "s3c6410-spi.0", "spi_busclk2"), - ALIAS(SCLK_AUDIO1, "samsung-pcm.1", "audio-bus"), - ALIAS(SCLK_AUDIO1, "samsung-i2s.1", "audio-bus"), - ALIAS(SCLK_AUDIO0, "samsung-pcm.0", "audio-bus"), - ALIAS(SCLK_AUDIO0, "samsung-i2s.0", "audio-bus"), - ALIAS(SCLK_UART, NULL, "clk_uart_baud3"), - ALIAS(SCLK_CAM, "s3c-camif", "camera"), -}; - -/* Aliases for s3c6400-specific clocks. */ -static struct samsung_clock_alias s3c6400_clock_aliases[] = { - /* Nothing to place here yet. */ -}; - -/* Aliases for s3c6410-specific clocks. */ -static struct samsung_clock_alias s3c6410_clock_aliases[] = { - ALIAS(PCLK_IIC1, "s3c2440-i2c.1", "i2c"), - ALIAS(PCLK_IIS2, "samsung-i2s.2", "iis"), - ALIAS(SCLK_FIMC, "s3c-camif", "fimc"), - ALIAS(SCLK_AUDIO2, "samsung-i2s.2", "audio-bus"), - ALIAS(MEM0_SROM, NULL, "srom"), -}; - -static void __init s3c64xx_clk_register_fixed_ext( - struct samsung_clk_provider *ctx, - unsigned long fin_pll_f, - unsigned long xusbxti_f) -{ - s3c64xx_fixed_rate_ext_clks[0].fixed_rate = fin_pll_f; - s3c64xx_fixed_rate_ext_clks[1].fixed_rate = xusbxti_f; - samsung_clk_register_fixed_rate(ctx, s3c64xx_fixed_rate_ext_clks, - ARRAY_SIZE(s3c64xx_fixed_rate_ext_clks)); -} - -/* Register s3c64xx clocks. */ -void __init s3c64xx_clk_init(struct device_node *np, unsigned long xtal_f, - unsigned long xusbxti_f, bool s3c6400, - void __iomem *base) -{ - struct samsung_clk_provider *ctx; - - reg_base = base; - is_s3c6400 = s3c6400; - - if (np) { - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - } - - ctx = samsung_clk_init(np, reg_base, NR_CLKS); - - /* Register external clocks. */ - if (!np) - s3c64xx_clk_register_fixed_ext(ctx, xtal_f, xusbxti_f); - - /* Register PLLs. */ - samsung_clk_register_pll(ctx, s3c64xx_pll_clks, - ARRAY_SIZE(s3c64xx_pll_clks), reg_base); - - /* Register common internal clocks. */ - samsung_clk_register_fixed_rate(ctx, s3c64xx_fixed_rate_clks, - ARRAY_SIZE(s3c64xx_fixed_rate_clks)); - samsung_clk_register_mux(ctx, s3c64xx_mux_clks, - ARRAY_SIZE(s3c64xx_mux_clks)); - samsung_clk_register_div(ctx, s3c64xx_div_clks, - ARRAY_SIZE(s3c64xx_div_clks)); - samsung_clk_register_gate(ctx, s3c64xx_gate_clks, - ARRAY_SIZE(s3c64xx_gate_clks)); - - /* Register SoC-specific clocks. */ - if (is_s3c6400) { - samsung_clk_register_mux(ctx, s3c6400_mux_clks, - ARRAY_SIZE(s3c6400_mux_clks)); - samsung_clk_register_div(ctx, s3c6400_div_clks, - ARRAY_SIZE(s3c6400_div_clks)); - samsung_clk_register_gate(ctx, s3c6400_gate_clks, - ARRAY_SIZE(s3c6400_gate_clks)); - samsung_clk_register_alias(ctx, s3c6400_clock_aliases, - ARRAY_SIZE(s3c6400_clock_aliases)); - } else { - samsung_clk_register_mux(ctx, s3c6410_mux_clks, - ARRAY_SIZE(s3c6410_mux_clks)); - samsung_clk_register_div(ctx, s3c6410_div_clks, - ARRAY_SIZE(s3c6410_div_clks)); - samsung_clk_register_gate(ctx, s3c6410_gate_clks, - ARRAY_SIZE(s3c6410_gate_clks)); - samsung_clk_register_alias(ctx, s3c6410_clock_aliases, - ARRAY_SIZE(s3c6410_clock_aliases)); - } - - samsung_clk_register_alias(ctx, s3c64xx_clock_aliases, - ARRAY_SIZE(s3c64xx_clock_aliases)); - s3c64xx_clk_sleep_init(); - - samsung_clk_of_add_provider(np, ctx); - - pr_info("%s clocks: apll = %lu, mpll = %lu\n" - "\tepll = %lu, arm_clk = %lu\n", - is_s3c6400 ? "S3C6400" : "S3C6410", - _get_rate("fout_apll"), _get_rate("fout_mpll"), - _get_rate("fout_epll"), _get_rate("armclk")); -} - -static void __init s3c6400_clk_init(struct device_node *np) -{ - s3c64xx_clk_init(np, 0, 0, true, NULL); -} -CLK_OF_DECLARE(s3c6400_clk, "samsung,s3c6400-clock", s3c6400_clk_init); - -static void __init s3c6410_clk_init(struct device_node *np) -{ - s3c64xx_clk_init(np, 0, 0, false, NULL); -} -CLK_OF_DECLARE(s3c6410_clk, "samsung,s3c6410-clock", s3c6410_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-s5pv210-audss.c b/drivers/clk/samsung/samsung/clk-s5pv210-audss.c deleted file mode 100644 index c66ed2d1450e..000000000000 --- a/drivers/clk/samsung/samsung/clk-s5pv210-audss.c +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2014 Tomasz Figa - * - * Based on Exynos Audio Subsystem Clock Controller driver: - * - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Author: Padmavathi Venna - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Driver for Audio Subsystem Clock Controller of S5PV210-compatible SoCs. -*/ - -#include -#include -#include -#include -#include -#include -#include - -#include - -static DEFINE_SPINLOCK(lock); -static struct clk **clk_table; -static void __iomem *reg_base; -static struct clk_onecell_data clk_data; - -#define ASS_CLK_SRC 0x0 -#define ASS_CLK_DIV 0x4 -#define ASS_CLK_GATE 0x8 - -#ifdef CONFIG_PM_SLEEP -static unsigned long reg_save[][2] = { - {ASS_CLK_SRC, 0}, - {ASS_CLK_DIV, 0}, - {ASS_CLK_GATE, 0}, -}; - -static int s5pv210_audss_clk_suspend(void) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(reg_save); i++) - reg_save[i][1] = readl(reg_base + reg_save[i][0]); - - return 0; -} - -static void s5pv210_audss_clk_resume(void) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(reg_save); i++) - writel(reg_save[i][1], reg_base + reg_save[i][0]); -} - -static struct syscore_ops s5pv210_audss_clk_syscore_ops = { - .suspend = s5pv210_audss_clk_suspend, - .resume = s5pv210_audss_clk_resume, -}; -#endif /* CONFIG_PM_SLEEP */ - -/* register s5pv210_audss clocks */ -static int s5pv210_audss_clk_probe(struct platform_device *pdev) -{ - int i, ret = 0; - struct resource *res; - const char *mout_audss_p[2]; - const char *mout_i2s_p[3]; - const char *hclk_p; - struct clk *hclk, *pll_ref, *pll_in, *cdclk, *sclk_audio; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - reg_base = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(reg_base)) { - dev_err(&pdev->dev, "failed to map audss registers\n"); - return PTR_ERR(reg_base); - } - - clk_table = devm_kzalloc(&pdev->dev, - sizeof(struct clk *) * AUDSS_MAX_CLKS, - GFP_KERNEL); - if (!clk_table) - return -ENOMEM; - - clk_data.clks = clk_table; - clk_data.clk_num = AUDSS_MAX_CLKS; - - hclk = devm_clk_get(&pdev->dev, "hclk"); - if (IS_ERR(hclk)) { - dev_err(&pdev->dev, "failed to get hclk clock\n"); - return PTR_ERR(hclk); - } - - pll_in = devm_clk_get(&pdev->dev, "fout_epll"); - if (IS_ERR(pll_in)) { - dev_err(&pdev->dev, "failed to get fout_epll clock\n"); - return PTR_ERR(pll_in); - } - - sclk_audio = devm_clk_get(&pdev->dev, "sclk_audio0"); - if (IS_ERR(sclk_audio)) { - dev_err(&pdev->dev, "failed to get sclk_audio0 clock\n"); - return PTR_ERR(sclk_audio); - } - - /* iiscdclk0 is an optional external I2S codec clock */ - cdclk = devm_clk_get(&pdev->dev, "iiscdclk0"); - pll_ref = devm_clk_get(&pdev->dev, "xxti"); - - if (!IS_ERR(pll_ref)) - mout_audss_p[0] = __clk_get_name(pll_ref); - else - mout_audss_p[0] = "xxti"; - mout_audss_p[1] = __clk_get_name(pll_in); - clk_table[CLK_MOUT_AUDSS] = clk_register_mux(NULL, "mout_audss", - mout_audss_p, ARRAY_SIZE(mout_audss_p), - CLK_SET_RATE_NO_REPARENT, - reg_base + ASS_CLK_SRC, 0, 1, 0, &lock); - - mout_i2s_p[0] = "mout_audss"; - if (!IS_ERR(cdclk)) - mout_i2s_p[1] = __clk_get_name(cdclk); - else - mout_i2s_p[1] = "iiscdclk0"; - mout_i2s_p[2] = __clk_get_name(sclk_audio); - clk_table[CLK_MOUT_I2S_A] = clk_register_mux(NULL, "mout_i2s_audss", - mout_i2s_p, ARRAY_SIZE(mout_i2s_p), - CLK_SET_RATE_NO_REPARENT, - reg_base + ASS_CLK_SRC, 2, 2, 0, &lock); - - clk_table[CLK_DOUT_AUD_BUS] = clk_register_divider(NULL, - "dout_aud_bus", "mout_audss", 0, - reg_base + ASS_CLK_DIV, 0, 4, 0, &lock); - clk_table[CLK_DOUT_I2S_A] = clk_register_divider(NULL, "dout_i2s_audss", - "mout_i2s_audss", 0, reg_base + ASS_CLK_DIV, - 4, 4, 0, &lock); - - clk_table[CLK_I2S] = clk_register_gate(NULL, "i2s_audss", - "dout_i2s_audss", CLK_SET_RATE_PARENT, - reg_base + ASS_CLK_GATE, 6, 0, &lock); - - hclk_p = __clk_get_name(hclk); - - clk_table[CLK_HCLK_I2S] = clk_register_gate(NULL, "hclk_i2s_audss", - hclk_p, CLK_IGNORE_UNUSED, - reg_base + ASS_CLK_GATE, 5, 0, &lock); - clk_table[CLK_HCLK_UART] = clk_register_gate(NULL, "hclk_uart_audss", - hclk_p, CLK_IGNORE_UNUSED, - reg_base + ASS_CLK_GATE, 4, 0, &lock); - clk_table[CLK_HCLK_HWA] = clk_register_gate(NULL, "hclk_hwa_audss", - hclk_p, CLK_IGNORE_UNUSED, - reg_base + ASS_CLK_GATE, 3, 0, &lock); - clk_table[CLK_HCLK_DMA] = clk_register_gate(NULL, "hclk_dma_audss", - hclk_p, CLK_IGNORE_UNUSED, - reg_base + ASS_CLK_GATE, 2, 0, &lock); - clk_table[CLK_HCLK_BUF] = clk_register_gate(NULL, "hclk_buf_audss", - hclk_p, CLK_IGNORE_UNUSED, - reg_base + ASS_CLK_GATE, 1, 0, &lock); - clk_table[CLK_HCLK_RP] = clk_register_gate(NULL, "hclk_rp_audss", - hclk_p, CLK_IGNORE_UNUSED, - reg_base + ASS_CLK_GATE, 0, 0, &lock); - - for (i = 0; i < clk_data.clk_num; i++) { - if (IS_ERR(clk_table[i])) { - dev_err(&pdev->dev, "failed to register clock %d\n", i); - ret = PTR_ERR(clk_table[i]); - goto unregister; - } - } - - ret = of_clk_add_provider(pdev->dev.of_node, of_clk_src_onecell_get, - &clk_data); - if (ret) { - dev_err(&pdev->dev, "failed to add clock provider\n"); - goto unregister; - } - -#ifdef CONFIG_PM_SLEEP - register_syscore_ops(&s5pv210_audss_clk_syscore_ops); -#endif - - return 0; - -unregister: - for (i = 0; i < clk_data.clk_num; i++) { - if (!IS_ERR(clk_table[i])) - clk_unregister(clk_table[i]); - } - - return ret; -} - -static const struct of_device_id s5pv210_audss_clk_of_match[] = { - { .compatible = "samsung,s5pv210-audss-clock", }, - {}, -}; - -static struct platform_driver s5pv210_audss_clk_driver = { - .driver = { - .name = "s5pv210-audss-clk", - .suppress_bind_attrs = true, - .of_match_table = s5pv210_audss_clk_of_match, - }, - .probe = s5pv210_audss_clk_probe, -}; - -static int __init s5pv210_audss_clk_init(void) -{ - return platform_driver_register(&s5pv210_audss_clk_driver); -} -core_initcall(s5pv210_audss_clk_init); diff --git a/drivers/clk/samsung/samsung/clk-s5pv210.c b/drivers/clk/samsung/samsung/clk-s5pv210.c deleted file mode 100644 index fd2725710a6f..000000000000 --- a/drivers/clk/samsung/samsung/clk-s5pv210.c +++ /dev/null @@ -1,854 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Author: Mateusz Krawczuk - * - * Based on clock drivers for S3C64xx and Exynos4 SoCs. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for all S5PC110/S5PV210 SoCs. - */ - -#include -#include -#include -#include - -#include "clk.h" -#include "clk-pll.h" - -#include - -/* S5PC110/S5PV210 clock controller register offsets */ -#define APLL_LOCK 0x0000 -#define MPLL_LOCK 0x0008 -#define EPLL_LOCK 0x0010 -#define VPLL_LOCK 0x0020 -#define APLL_CON0 0x0100 -#define APLL_CON1 0x0104 -#define MPLL_CON 0x0108 -#define EPLL_CON0 0x0110 -#define EPLL_CON1 0x0114 -#define VPLL_CON 0x0120 -#define CLK_SRC0 0x0200 -#define CLK_SRC1 0x0204 -#define CLK_SRC2 0x0208 -#define CLK_SRC3 0x020c -#define CLK_SRC4 0x0210 -#define CLK_SRC5 0x0214 -#define CLK_SRC6 0x0218 -#define CLK_SRC_MASK0 0x0280 -#define CLK_SRC_MASK1 0x0284 -#define CLK_DIV0 0x0300 -#define CLK_DIV1 0x0304 -#define CLK_DIV2 0x0308 -#define CLK_DIV3 0x030c -#define CLK_DIV4 0x0310 -#define CLK_DIV5 0x0314 -#define CLK_DIV6 0x0318 -#define CLK_DIV7 0x031c -#define CLK_GATE_MAIN0 0x0400 -#define CLK_GATE_MAIN1 0x0404 -#define CLK_GATE_MAIN2 0x0408 -#define CLK_GATE_PERI0 0x0420 -#define CLK_GATE_PERI1 0x0424 -#define CLK_GATE_SCLK0 0x0440 -#define CLK_GATE_SCLK1 0x0444 -#define CLK_GATE_IP0 0x0460 -#define CLK_GATE_IP1 0x0464 -#define CLK_GATE_IP2 0x0468 -#define CLK_GATE_IP3 0x046c -#define CLK_GATE_IP4 0x0470 -#define CLK_GATE_BLOCK 0x0480 -#define CLK_GATE_IP5 0x0484 -#define CLK_OUT 0x0500 -#define MISC 0xe000 -#define OM_STAT 0xe100 - -/* IDs of PLLs available on S5PV210/S5P6442 SoCs */ -enum { - apll, - mpll, - epll, - vpll, -}; - -/* IDs of external clocks (used for legacy boards) */ -enum { - xxti, - xusbxti, -}; - -static void __iomem *reg_base; - -#ifdef CONFIG_PM_SLEEP -static struct samsung_clk_reg_dump *s5pv210_clk_dump; - -/* List of registers that need to be preserved across suspend/resume. */ -static unsigned long s5pv210_clk_regs[] __initdata = { - CLK_SRC0, - CLK_SRC1, - CLK_SRC2, - CLK_SRC3, - CLK_SRC4, - CLK_SRC5, - CLK_SRC6, - CLK_SRC_MASK0, - CLK_SRC_MASK1, - CLK_DIV0, - CLK_DIV1, - CLK_DIV2, - CLK_DIV3, - CLK_DIV4, - CLK_DIV5, - CLK_DIV6, - CLK_DIV7, - CLK_GATE_MAIN0, - CLK_GATE_MAIN1, - CLK_GATE_MAIN2, - CLK_GATE_PERI0, - CLK_GATE_PERI1, - CLK_GATE_SCLK0, - CLK_GATE_SCLK1, - CLK_GATE_IP0, - CLK_GATE_IP1, - CLK_GATE_IP2, - CLK_GATE_IP3, - CLK_GATE_IP4, - CLK_GATE_IP5, - CLK_GATE_BLOCK, - APLL_LOCK, - MPLL_LOCK, - EPLL_LOCK, - VPLL_LOCK, - APLL_CON0, - APLL_CON1, - MPLL_CON, - EPLL_CON0, - EPLL_CON1, - VPLL_CON, - CLK_OUT, -}; - -static int s5pv210_clk_suspend(void) -{ - samsung_clk_save(reg_base, s5pv210_clk_dump, - ARRAY_SIZE(s5pv210_clk_regs)); - return 0; -} - -static void s5pv210_clk_resume(void) -{ - samsung_clk_restore(reg_base, s5pv210_clk_dump, - ARRAY_SIZE(s5pv210_clk_regs)); -} - -static struct syscore_ops s5pv210_clk_syscore_ops = { - .suspend = s5pv210_clk_suspend, - .resume = s5pv210_clk_resume, -}; - -static void s5pv210_clk_sleep_init(void) -{ - s5pv210_clk_dump = - samsung_clk_alloc_reg_dump(s5pv210_clk_regs, - ARRAY_SIZE(s5pv210_clk_regs)); - if (!s5pv210_clk_dump) { - pr_warn("%s: Failed to allocate sleep save data\n", __func__); - return; - } - - register_syscore_ops(&s5pv210_clk_syscore_ops); -} -#else -static inline void s5pv210_clk_sleep_init(void) { } -#endif - -/* Mux parent lists. */ -static const char *const fin_pll_p[] __initconst = { - "xxti", - "xusbxti" -}; - -static const char *const mout_apll_p[] __initconst = { - "fin_pll", - "fout_apll" -}; - -static const char *const mout_mpll_p[] __initconst = { - "fin_pll", - "fout_mpll" -}; - -static const char *const mout_epll_p[] __initconst = { - "fin_pll", - "fout_epll" -}; - -static const char *const mout_vpllsrc_p[] __initconst = { - "fin_pll", - "sclk_hdmi27m" -}; - -static const char *const mout_vpll_p[] __initconst = { - "mout_vpllsrc", - "fout_vpll" -}; - -static const char *const mout_group1_p[] __initconst = { - "dout_a2m", - "mout_mpll", - "mout_epll", - "mout_vpll" -}; - -static const char *const mout_group2_p[] __initconst = { - "xxti", - "xusbxti", - "sclk_hdmi27m", - "sclk_usbphy0", - "sclk_usbphy1", - "sclk_hdmiphy", - "mout_mpll", - "mout_epll", - "mout_vpll", -}; - -static const char *const mout_audio0_p[] __initconst = { - "xxti", - "pcmcdclk0", - "sclk_hdmi27m", - "sclk_usbphy0", - "sclk_usbphy1", - "sclk_hdmiphy", - "mout_mpll", - "mout_epll", - "mout_vpll", -}; - -static const char *const mout_audio1_p[] __initconst = { - "i2scdclk1", - "pcmcdclk1", - "sclk_hdmi27m", - "sclk_usbphy0", - "sclk_usbphy1", - "sclk_hdmiphy", - "mout_mpll", - "mout_epll", - "mout_vpll", -}; - -static const char *const mout_audio2_p[] __initconst = { - "i2scdclk2", - "pcmcdclk2", - "sclk_hdmi27m", - "sclk_usbphy0", - "sclk_usbphy1", - "sclk_hdmiphy", - "mout_mpll", - "mout_epll", - "mout_vpll", -}; - -static const char *const mout_spdif_p[] __initconst = { - "dout_audio0", - "dout_audio1", - "dout_audio3", -}; - -static const char *const mout_group3_p[] __initconst = { - "mout_apll", - "mout_mpll" -}; - -static const char *const mout_group4_p[] __initconst = { - "mout_mpll", - "dout_a2m" -}; - -static const char *const mout_flash_p[] __initconst = { - "dout_hclkd", - "dout_hclkp" -}; - -static const char *const mout_dac_p[] __initconst = { - "mout_vpll", - "sclk_hdmiphy" -}; - -static const char *const mout_hdmi_p[] __initconst = { - "sclk_hdmiphy", - "dout_tblk" -}; - -static const char *const mout_mixer_p[] __initconst = { - "mout_dac", - "mout_hdmi" -}; - -static const char *const mout_vpll_6442_p[] __initconst = { - "fin_pll", - "fout_vpll" -}; - -static const char *const mout_mixer_6442_p[] __initconst = { - "mout_vpll", - "dout_mixer" -}; - -static const char *const mout_d0sync_6442_p[] __initconst = { - "mout_dsys", - "div_apll" -}; - -static const char *const mout_d1sync_6442_p[] __initconst = { - "mout_psys", - "div_apll" -}; - -static const char *const mout_group2_6442_p[] __initconst = { - "fin_pll", - "none", - "none", - "sclk_usbphy0", - "none", - "none", - "mout_mpll", - "mout_epll", - "mout_vpll", -}; - -static const char *const mout_audio0_6442_p[] __initconst = { - "fin_pll", - "pcmcdclk0", - "none", - "sclk_usbphy0", - "none", - "none", - "mout_mpll", - "mout_epll", - "mout_vpll", -}; - -static const char *const mout_audio1_6442_p[] __initconst = { - "i2scdclk1", - "pcmcdclk1", - "none", - "sclk_usbphy0", - "none", - "none", - "mout_mpll", - "mout_epll", - "mout_vpll", - "fin_pll", -}; - -static const char *const mout_clksel_p[] __initconst = { - "fout_apll_clkout", - "fout_mpll_clkout", - "fout_epll", - "fout_vpll", - "sclk_usbphy0", - "sclk_usbphy1", - "sclk_hdmiphy", - "rtc", - "rtc_tick", - "dout_hclkm", - "dout_pclkm", - "dout_hclkd", - "dout_pclkd", - "dout_hclkp", - "dout_pclkp", - "dout_apll_clkout", - "dout_hpm", - "xxti", - "xusbxti", - "div_dclk" -}; - -static const char *const mout_clksel_6442_p[] __initconst = { - "fout_apll_clkout", - "fout_mpll_clkout", - "fout_epll", - "fout_vpll", - "sclk_usbphy0", - "none", - "none", - "rtc", - "rtc_tick", - "none", - "none", - "dout_hclkd", - "dout_pclkd", - "dout_hclkp", - "dout_pclkp", - "dout_apll_clkout", - "none", - "fin_pll", - "none", - "div_dclk" -}; - -static const char *const mout_clkout_p[] __initconst = { - "dout_clkout", - "none", - "xxti", - "xusbxti" -}; - -/* Common fixed factor clocks. */ -static const struct samsung_fixed_factor_clock ffactor_clks[] __initconst = { - FFACTOR(FOUT_APLL_CLKOUT, "fout_apll_clkout", "fout_apll", 1, 4, 0), - FFACTOR(FOUT_MPLL_CLKOUT, "fout_mpll_clkout", "fout_mpll", 1, 2, 0), - FFACTOR(DOUT_APLL_CLKOUT, "dout_apll_clkout", "dout_apll", 1, 4, 0), -}; - -/* PLL input mux (fin_pll), which needs to be registered before PLLs. */ -static const struct samsung_mux_clock early_mux_clks[] __initconst = { - MUX_F(FIN_PLL, "fin_pll", fin_pll_p, OM_STAT, 0, 1, - CLK_MUX_READ_ONLY, 0), -}; - -/* Common clock muxes. */ -static const struct samsung_mux_clock mux_clks[] __initconst = { - MUX(MOUT_FLASH, "mout_flash", mout_flash_p, CLK_SRC0, 28, 1), - MUX(MOUT_PSYS, "mout_psys", mout_group4_p, CLK_SRC0, 24, 1), - MUX(MOUT_DSYS, "mout_dsys", mout_group4_p, CLK_SRC0, 20, 1), - MUX(MOUT_MSYS, "mout_msys", mout_group3_p, CLK_SRC0, 16, 1), - MUX(MOUT_EPLL, "mout_epll", mout_epll_p, CLK_SRC0, 8, 1), - MUX(MOUT_MPLL, "mout_mpll", mout_mpll_p, CLK_SRC0, 4, 1), - MUX(MOUT_APLL, "mout_apll", mout_apll_p, CLK_SRC0, 0, 1), - - MUX(MOUT_CLKOUT, "mout_clkout", mout_clkout_p, MISC, 8, 2), -}; - -/* S5PV210-specific clock muxes. */ -static const struct samsung_mux_clock s5pv210_mux_clks[] __initconst = { - MUX(MOUT_VPLL, "mout_vpll", mout_vpll_p, CLK_SRC0, 12, 1), - - MUX(MOUT_VPLLSRC, "mout_vpllsrc", mout_vpllsrc_p, CLK_SRC1, 28, 1), - MUX(MOUT_CSIS, "mout_csis", mout_group2_p, CLK_SRC1, 24, 4), - MUX(MOUT_FIMD, "mout_fimd", mout_group2_p, CLK_SRC1, 20, 4), - MUX(MOUT_CAM1, "mout_cam1", mout_group2_p, CLK_SRC1, 16, 4), - MUX(MOUT_CAM0, "mout_cam0", mout_group2_p, CLK_SRC1, 12, 4), - MUX(MOUT_DAC, "mout_dac", mout_dac_p, CLK_SRC1, 8, 1), - MUX(MOUT_MIXER, "mout_mixer", mout_mixer_p, CLK_SRC1, 4, 1), - MUX(MOUT_HDMI, "mout_hdmi", mout_hdmi_p, CLK_SRC1, 0, 1), - - MUX(MOUT_G2D, "mout_g2d", mout_group1_p, CLK_SRC2, 8, 2), - MUX(MOUT_MFC, "mout_mfc", mout_group1_p, CLK_SRC2, 4, 2), - MUX(MOUT_G3D, "mout_g3d", mout_group1_p, CLK_SRC2, 0, 2), - - MUX(MOUT_FIMC2, "mout_fimc2", mout_group2_p, CLK_SRC3, 20, 4), - MUX(MOUT_FIMC1, "mout_fimc1", mout_group2_p, CLK_SRC3, 16, 4), - MUX(MOUT_FIMC0, "mout_fimc0", mout_group2_p, CLK_SRC3, 12, 4), - - MUX(MOUT_UART3, "mout_uart3", mout_group2_p, CLK_SRC4, 28, 4), - MUX(MOUT_UART2, "mout_uart2", mout_group2_p, CLK_SRC4, 24, 4), - MUX(MOUT_UART1, "mout_uart1", mout_group2_p, CLK_SRC4, 20, 4), - MUX(MOUT_UART0, "mout_uart0", mout_group2_p, CLK_SRC4, 16, 4), - MUX(MOUT_MMC3, "mout_mmc3", mout_group2_p, CLK_SRC4, 12, 4), - MUX(MOUT_MMC2, "mout_mmc2", mout_group2_p, CLK_SRC4, 8, 4), - MUX(MOUT_MMC1, "mout_mmc1", mout_group2_p, CLK_SRC4, 4, 4), - MUX(MOUT_MMC0, "mout_mmc0", mout_group2_p, CLK_SRC4, 0, 4), - - MUX(MOUT_PWM, "mout_pwm", mout_group2_p, CLK_SRC5, 12, 4), - MUX(MOUT_SPI1, "mout_spi1", mout_group2_p, CLK_SRC5, 4, 4), - MUX(MOUT_SPI0, "mout_spi0", mout_group2_p, CLK_SRC5, 0, 4), - - MUX(MOUT_DMC0, "mout_dmc0", mout_group1_p, CLK_SRC6, 24, 2), - MUX(MOUT_PWI, "mout_pwi", mout_group2_p, CLK_SRC6, 20, 4), - MUX(MOUT_HPM, "mout_hpm", mout_group3_p, CLK_SRC6, 16, 1), - MUX(MOUT_SPDIF, "mout_spdif", mout_spdif_p, CLK_SRC6, 12, 2), - MUX(MOUT_AUDIO2, "mout_audio2", mout_audio2_p, CLK_SRC6, 8, 4), - MUX(MOUT_AUDIO1, "mout_audio1", mout_audio1_p, CLK_SRC6, 4, 4), - MUX(MOUT_AUDIO0, "mout_audio0", mout_audio0_p, CLK_SRC6, 0, 4), - - MUX(MOUT_CLKSEL, "mout_clksel", mout_clksel_p, CLK_OUT, 12, 5), -}; - -/* S5P6442-specific clock muxes. */ -static const struct samsung_mux_clock s5p6442_mux_clks[] __initconst = { - MUX(MOUT_VPLL, "mout_vpll", mout_vpll_6442_p, CLK_SRC0, 12, 1), - - MUX(MOUT_FIMD, "mout_fimd", mout_group2_6442_p, CLK_SRC1, 20, 4), - MUX(MOUT_CAM1, "mout_cam1", mout_group2_6442_p, CLK_SRC1, 16, 4), - MUX(MOUT_CAM0, "mout_cam0", mout_group2_6442_p, CLK_SRC1, 12, 4), - MUX(MOUT_MIXER, "mout_mixer", mout_mixer_6442_p, CLK_SRC1, 4, 1), - - MUX(MOUT_D0SYNC, "mout_d0sync", mout_d0sync_6442_p, CLK_SRC2, 28, 1), - MUX(MOUT_D1SYNC, "mout_d1sync", mout_d1sync_6442_p, CLK_SRC2, 24, 1), - - MUX(MOUT_FIMC2, "mout_fimc2", mout_group2_6442_p, CLK_SRC3, 20, 4), - MUX(MOUT_FIMC1, "mout_fimc1", mout_group2_6442_p, CLK_SRC3, 16, 4), - MUX(MOUT_FIMC0, "mout_fimc0", mout_group2_6442_p, CLK_SRC3, 12, 4), - - MUX(MOUT_UART2, "mout_uart2", mout_group2_6442_p, CLK_SRC4, 24, 4), - MUX(MOUT_UART1, "mout_uart1", mout_group2_6442_p, CLK_SRC4, 20, 4), - MUX(MOUT_UART0, "mout_uart0", mout_group2_6442_p, CLK_SRC4, 16, 4), - MUX(MOUT_MMC2, "mout_mmc2", mout_group2_6442_p, CLK_SRC4, 8, 4), - MUX(MOUT_MMC1, "mout_mmc1", mout_group2_6442_p, CLK_SRC4, 4, 4), - MUX(MOUT_MMC0, "mout_mmc0", mout_group2_6442_p, CLK_SRC4, 0, 4), - - MUX(MOUT_PWM, "mout_pwm", mout_group2_6442_p, CLK_SRC5, 12, 4), - MUX(MOUT_SPI0, "mout_spi0", mout_group2_6442_p, CLK_SRC5, 0, 4), - - MUX(MOUT_AUDIO1, "mout_audio1", mout_audio1_6442_p, CLK_SRC6, 4, 4), - MUX(MOUT_AUDIO0, "mout_audio0", mout_audio0_6442_p, CLK_SRC6, 0, 4), - - MUX(MOUT_CLKSEL, "mout_clksel", mout_clksel_6442_p, CLK_OUT, 12, 5), -}; - -/* S5PV210-specific fixed rate clocks generated inside the SoC. */ -static const struct samsung_fixed_rate_clock s5pv210_frate_clks[] __initconst = { - FRATE(SCLK_HDMI27M, "sclk_hdmi27m", NULL, 0, 27000000), - FRATE(SCLK_HDMIPHY, "sclk_hdmiphy", NULL, 0, 27000000), - FRATE(SCLK_USBPHY0, "sclk_usbphy0", NULL, 0, 48000000), - FRATE(SCLK_USBPHY1, "sclk_usbphy1", NULL, 0, 48000000), -}; - -/* S5P6442-specific fixed rate clocks generated inside the SoC. */ -static const struct samsung_fixed_rate_clock s5p6442_frate_clks[] __initconst = { - FRATE(SCLK_USBPHY0, "sclk_usbphy0", NULL, 0, 30000000), -}; - -/* Common clock dividers. */ -static const struct samsung_div_clock div_clks[] __initconst = { - DIV(DOUT_PCLKP, "dout_pclkp", "dout_hclkp", CLK_DIV0, 28, 3), - DIV(DOUT_PCLKD, "dout_pclkd", "dout_hclkd", CLK_DIV0, 20, 3), - DIV(DOUT_A2M, "dout_a2m", "mout_apll", CLK_DIV0, 4, 3), - DIV(DOUT_APLL, "dout_apll", "mout_msys", CLK_DIV0, 0, 3), - - DIV(DOUT_FIMD, "dout_fimd", "mout_fimd", CLK_DIV1, 20, 4), - DIV(DOUT_CAM1, "dout_cam1", "mout_cam1", CLK_DIV1, 16, 4), - DIV(DOUT_CAM0, "dout_cam0", "mout_cam0", CLK_DIV1, 12, 4), - - DIV(DOUT_FIMC2, "dout_fimc2", "mout_fimc2", CLK_DIV3, 20, 4), - DIV(DOUT_FIMC1, "dout_fimc1", "mout_fimc1", CLK_DIV3, 16, 4), - DIV(DOUT_FIMC0, "dout_fimc0", "mout_fimc0", CLK_DIV3, 12, 4), - - DIV(DOUT_UART2, "dout_uart2", "mout_uart2", CLK_DIV4, 24, 4), - DIV(DOUT_UART1, "dout_uart1", "mout_uart1", CLK_DIV4, 20, 4), - DIV(DOUT_UART0, "dout_uart0", "mout_uart0", CLK_DIV4, 16, 4), - DIV(DOUT_MMC2, "dout_mmc2", "mout_mmc2", CLK_DIV4, 8, 4), - DIV(DOUT_MMC1, "dout_mmc1", "mout_mmc1", CLK_DIV4, 4, 4), - DIV(DOUT_MMC0, "dout_mmc0", "mout_mmc0", CLK_DIV4, 0, 4), - - DIV(DOUT_PWM, "dout_pwm", "mout_pwm", CLK_DIV5, 12, 4), - DIV(DOUT_SPI0, "dout_spi0", "mout_spi0", CLK_DIV5, 0, 4), - - DIV(DOUT_FLASH, "dout_flash", "mout_flash", CLK_DIV6, 12, 3), - DIV(DOUT_AUDIO1, "dout_audio1", "mout_audio1", CLK_DIV6, 4, 4), - DIV(DOUT_AUDIO0, "dout_audio0", "mout_audio0", CLK_DIV6, 0, 4), - - DIV(DOUT_CLKOUT, "dout_clkout", "mout_clksel", CLK_OUT, 20, 4), -}; - -/* S5PV210-specific clock dividers. */ -static const struct samsung_div_clock s5pv210_div_clks[] __initconst = { - DIV(DOUT_HCLKP, "dout_hclkp", "mout_psys", CLK_DIV0, 24, 4), - DIV(DOUT_HCLKD, "dout_hclkd", "mout_dsys", CLK_DIV0, 16, 4), - DIV(DOUT_PCLKM, "dout_pclkm", "dout_hclkm", CLK_DIV0, 12, 3), - DIV(DOUT_HCLKM, "dout_hclkm", "dout_apll", CLK_DIV0, 8, 3), - - DIV(DOUT_CSIS, "dout_csis", "mout_csis", CLK_DIV1, 28, 4), - DIV(DOUT_TBLK, "dout_tblk", "mout_vpll", CLK_DIV1, 0, 4), - - DIV(DOUT_G2D, "dout_g2d", "mout_g2d", CLK_DIV2, 8, 4), - DIV(DOUT_MFC, "dout_mfc", "mout_mfc", CLK_DIV2, 4, 4), - DIV(DOUT_G3D, "dout_g3d", "mout_g3d", CLK_DIV2, 0, 4), - - DIV(DOUT_UART3, "dout_uart3", "mout_uart3", CLK_DIV4, 28, 4), - DIV(DOUT_MMC3, "dout_mmc3", "mout_mmc3", CLK_DIV4, 12, 4), - - DIV(DOUT_SPI1, "dout_spi1", "mout_spi1", CLK_DIV5, 4, 4), - - DIV(DOUT_DMC0, "dout_dmc0", "mout_dmc0", CLK_DIV6, 28, 4), - DIV(DOUT_PWI, "dout_pwi", "mout_pwi", CLK_DIV6, 24, 4), - DIV(DOUT_HPM, "dout_hpm", "dout_copy", CLK_DIV6, 20, 3), - DIV(DOUT_COPY, "dout_copy", "mout_hpm", CLK_DIV6, 16, 3), - DIV(DOUT_AUDIO2, "dout_audio2", "mout_audio2", CLK_DIV6, 8, 4), - - DIV(DOUT_DPM, "dout_dpm", "dout_pclkp", CLK_DIV7, 8, 7), - DIV(DOUT_DVSEM, "dout_dvsem", "dout_pclkp", CLK_DIV7, 0, 7), -}; - -/* S5P6442-specific clock dividers. */ -static const struct samsung_div_clock s5p6442_div_clks[] __initconst = { - DIV(DOUT_HCLKP, "dout_hclkp", "mout_d1sync", CLK_DIV0, 24, 4), - DIV(DOUT_HCLKD, "dout_hclkd", "mout_d0sync", CLK_DIV0, 16, 4), - - DIV(DOUT_MIXER, "dout_mixer", "mout_vpll", CLK_DIV1, 0, 4), -}; - -/* Common clock gates. */ -static const struct samsung_gate_clock gate_clks[] __initconst = { - GATE(CLK_ROTATOR, "rotator", "dout_hclkd", CLK_GATE_IP0, 29, 0, 0), - GATE(CLK_FIMC2, "fimc2", "dout_hclkd", CLK_GATE_IP0, 26, 0, 0), - GATE(CLK_FIMC1, "fimc1", "dout_hclkd", CLK_GATE_IP0, 25, 0, 0), - GATE(CLK_FIMC0, "fimc0", "dout_hclkd", CLK_GATE_IP0, 24, 0, 0), - GATE(CLK_PDMA0, "pdma0", "dout_hclkp", CLK_GATE_IP0, 3, 0, 0), - GATE(CLK_MDMA, "mdma", "dout_hclkd", CLK_GATE_IP0, 2, 0, 0), - - GATE(CLK_SROMC, "sromc", "dout_hclkp", CLK_GATE_IP1, 26, 0, 0), - GATE(CLK_NANDXL, "nandxl", "dout_hclkp", CLK_GATE_IP1, 24, 0, 0), - GATE(CLK_USB_OTG, "usb_otg", "dout_hclkp", CLK_GATE_IP1, 16, 0, 0), - GATE(CLK_TVENC, "tvenc", "dout_hclkd", CLK_GATE_IP1, 10, 0, 0), - GATE(CLK_MIXER, "mixer", "dout_hclkd", CLK_GATE_IP1, 9, 0, 0), - GATE(CLK_VP, "vp", "dout_hclkd", CLK_GATE_IP1, 8, 0, 0), - GATE(CLK_FIMD, "fimd", "dout_hclkd", CLK_GATE_IP1, 0, 0, 0), - - GATE(CLK_HSMMC2, "hsmmc2", "dout_hclkp", CLK_GATE_IP2, 18, 0, 0), - GATE(CLK_HSMMC1, "hsmmc1", "dout_hclkp", CLK_GATE_IP2, 17, 0, 0), - GATE(CLK_HSMMC0, "hsmmc0", "dout_hclkp", CLK_GATE_IP2, 16, 0, 0), - GATE(CLK_MODEMIF, "modemif", "dout_hclkp", CLK_GATE_IP2, 9, 0, 0), - GATE(CLK_SECSS, "secss", "dout_hclkp", CLK_GATE_IP2, 0, 0, 0), - - GATE(CLK_PCM1, "pcm1", "dout_pclkp", CLK_GATE_IP3, 29, 0, 0), - GATE(CLK_PCM0, "pcm0", "dout_pclkp", CLK_GATE_IP3, 28, 0, 0), - GATE(CLK_TSADC, "tsadc", "dout_pclkp", CLK_GATE_IP3, 24, 0, 0), - GATE(CLK_PWM, "pwm", "dout_pclkp", CLK_GATE_IP3, 23, 0, 0), - GATE(CLK_WDT, "watchdog", "dout_pclkp", CLK_GATE_IP3, 22, 0, 0), - GATE(CLK_KEYIF, "keyif", "dout_pclkp", CLK_GATE_IP3, 21, 0, 0), - GATE(CLK_UART2, "uart2", "dout_pclkp", CLK_GATE_IP3, 19, 0, 0), - GATE(CLK_UART1, "uart1", "dout_pclkp", CLK_GATE_IP3, 18, 0, 0), - GATE(CLK_UART0, "uart0", "dout_pclkp", CLK_GATE_IP3, 17, 0, 0), - GATE(CLK_SYSTIMER, "systimer", "dout_pclkp", CLK_GATE_IP3, 16, 0, 0), - GATE(CLK_RTC, "rtc", "dout_pclkp", CLK_GATE_IP3, 15, 0, 0), - GATE(CLK_SPI0, "spi0", "dout_pclkp", CLK_GATE_IP3, 12, 0, 0), - GATE(CLK_I2C2, "i2c2", "dout_pclkp", CLK_GATE_IP3, 9, 0, 0), - GATE(CLK_I2C0, "i2c0", "dout_pclkp", CLK_GATE_IP3, 7, 0, 0), - GATE(CLK_I2S1, "i2s1", "dout_pclkp", CLK_GATE_IP3, 5, 0, 0), - GATE(CLK_I2S0, "i2s0", "dout_pclkp", CLK_GATE_IP3, 4, 0, 0), - - GATE(CLK_SECKEY, "seckey", "dout_pclkp", CLK_GATE_IP4, 3, 0, 0), - GATE(CLK_CHIPID, "chipid", "dout_pclkp", CLK_GATE_IP4, 0, 0, 0), - - GATE(SCLK_AUDIO1, "sclk_audio1", "dout_audio1", CLK_SRC_MASK0, 25, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_AUDIO0, "sclk_audio0", "dout_audio0", CLK_SRC_MASK0, 24, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_PWM, "sclk_pwm", "dout_pwm", CLK_SRC_MASK0, 19, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_SPI0, "sclk_spi0", "dout_spi0", CLK_SRC_MASK0, 16, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_UART2, "sclk_uart2", "dout_uart2", CLK_SRC_MASK0, 14, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_UART1, "sclk_uart1", "dout_uart1", CLK_SRC_MASK0, 13, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_UART0, "sclk_uart0", "dout_uart0", CLK_SRC_MASK0, 12, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_MMC2, "sclk_mmc2", "dout_mmc2", CLK_SRC_MASK0, 10, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_MMC1, "sclk_mmc1", "dout_mmc1", CLK_SRC_MASK0, 9, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_MMC0, "sclk_mmc0", "dout_mmc0", CLK_SRC_MASK0, 8, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_FIMD, "sclk_fimd", "dout_fimd", CLK_SRC_MASK0, 5, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_CAM1, "sclk_cam1", "dout_cam1", CLK_SRC_MASK0, 4, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_CAM0, "sclk_cam0", "dout_cam0", CLK_SRC_MASK0, 3, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_MIXER, "sclk_mixer", "mout_mixer", CLK_SRC_MASK0, 1, - CLK_SET_RATE_PARENT, 0), - - GATE(SCLK_FIMC2, "sclk_fimc2", "dout_fimc2", CLK_SRC_MASK1, 4, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_FIMC1, "sclk_fimc1", "dout_fimc1", CLK_SRC_MASK1, 3, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_FIMC0, "sclk_fimc0", "dout_fimc0", CLK_SRC_MASK1, 2, - CLK_SET_RATE_PARENT, 0), -}; - -/* S5PV210-specific clock gates. */ -static const struct samsung_gate_clock s5pv210_gate_clks[] __initconst = { - GATE(CLK_CSIS, "clk_csis", "dout_hclkd", CLK_GATE_IP0, 31, 0, 0), - GATE(CLK_MFC, "mfc", "dout_hclkm", CLK_GATE_IP0, 16, 0, 0), - GATE(CLK_G2D, "g2d", "dout_hclkd", CLK_GATE_IP0, 12, 0, 0), - GATE(CLK_G3D, "g3d", "dout_hclkm", CLK_GATE_IP0, 8, 0, 0), - GATE(CLK_IMEM, "imem", "dout_hclkm", CLK_GATE_IP0, 5, 0, 0), - GATE(CLK_PDMA1, "pdma1", "dout_hclkp", CLK_GATE_IP0, 4, 0, 0), - - GATE(CLK_NFCON, "nfcon", "dout_hclkp", CLK_GATE_IP1, 28, 0, 0), - GATE(CLK_CFCON, "cfcon", "dout_hclkp", CLK_GATE_IP1, 25, 0, 0), - GATE(CLK_USB_HOST, "usb_host", "dout_hclkp", CLK_GATE_IP1, 17, 0, 0), - GATE(CLK_HDMI, "hdmi", "dout_hclkd", CLK_GATE_IP1, 11, 0, 0), - GATE(CLK_DSIM, "dsim", "dout_pclkd", CLK_GATE_IP1, 2, 0, 0), - - GATE(CLK_TZIC3, "tzic3", "dout_hclkm", CLK_GATE_IP2, 31, 0, 0), - GATE(CLK_TZIC2, "tzic2", "dout_hclkm", CLK_GATE_IP2, 30, 0, 0), - GATE(CLK_TZIC1, "tzic1", "dout_hclkm", CLK_GATE_IP2, 29, 0, 0), - GATE(CLK_TZIC0, "tzic0", "dout_hclkm", CLK_GATE_IP2, 28, 0, 0), - GATE(CLK_TSI, "tsi", "dout_hclkd", CLK_GATE_IP2, 20, 0, 0), - GATE(CLK_HSMMC3, "hsmmc3", "dout_hclkp", CLK_GATE_IP2, 19, 0, 0), - GATE(CLK_JTAG, "jtag", "dout_hclkp", CLK_GATE_IP2, 11, 0, 0), - GATE(CLK_CORESIGHT, "coresight", "dout_pclkp", CLK_GATE_IP2, 8, 0, 0), - GATE(CLK_SDM, "sdm", "dout_pclkm", CLK_GATE_IP2, 1, 0, 0), - - GATE(CLK_PCM2, "pcm2", "dout_pclkp", CLK_GATE_IP3, 30, 0, 0), - GATE(CLK_UART3, "uart3", "dout_pclkp", CLK_GATE_IP3, 20, 0, 0), - GATE(CLK_SPI1, "spi1", "dout_pclkp", CLK_GATE_IP3, 13, 0, 0), - GATE(CLK_I2C_HDMI_PHY, "i2c_hdmi_phy", "dout_pclkd", - CLK_GATE_IP3, 11, 0, 0), - GATE(CLK_I2C1, "i2c1", "dout_pclkd", CLK_GATE_IP3, 10, 0, 0), - GATE(CLK_I2S2, "i2s2", "dout_pclkp", CLK_GATE_IP3, 6, 0, 0), - GATE(CLK_AC97, "ac97", "dout_pclkp", CLK_GATE_IP3, 1, 0, 0), - GATE(CLK_SPDIF, "spdif", "dout_pclkp", CLK_GATE_IP3, 0, 0, 0), - - GATE(CLK_TZPC3, "tzpc.3", "dout_pclkd", CLK_GATE_IP4, 8, 0, 0), - GATE(CLK_TZPC2, "tzpc.2", "dout_pclkd", CLK_GATE_IP4, 7, 0, 0), - GATE(CLK_TZPC1, "tzpc.1", "dout_pclkp", CLK_GATE_IP4, 6, 0, 0), - GATE(CLK_TZPC0, "tzpc.0", "dout_pclkm", CLK_GATE_IP4, 5, 0, 0), - GATE(CLK_IEM_APC, "iem_apc", "dout_pclkp", CLK_GATE_IP4, 2, 0, 0), - GATE(CLK_IEM_IEC, "iem_iec", "dout_pclkp", CLK_GATE_IP4, 1, 0, 0), - - GATE(CLK_JPEG, "jpeg", "dout_hclkd", CLK_GATE_IP5, 29, 0, 0), - - GATE(SCLK_SPDIF, "sclk_spdif", "mout_spdif", CLK_SRC_MASK0, 27, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_AUDIO2, "sclk_audio2", "dout_audio2", CLK_SRC_MASK0, 26, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_SPI1, "sclk_spi1", "dout_spi1", CLK_SRC_MASK0, 17, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_UART3, "sclk_uart3", "dout_uart3", CLK_SRC_MASK0, 15, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_MMC3, "sclk_mmc3", "dout_mmc3", CLK_SRC_MASK0, 11, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_CSIS, "sclk_csis", "dout_csis", CLK_SRC_MASK0, 6, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_DAC, "sclk_dac", "mout_dac", CLK_SRC_MASK0, 2, - CLK_SET_RATE_PARENT, 0), - GATE(SCLK_HDMI, "sclk_hdmi", "mout_hdmi", CLK_SRC_MASK0, 0, - CLK_SET_RATE_PARENT, 0), -}; - -/* S5P6442-specific clock gates. */ -static const struct samsung_gate_clock s5p6442_gate_clks[] __initconst = { - GATE(CLK_JPEG, "jpeg", "dout_hclkd", CLK_GATE_IP0, 28, 0, 0), - GATE(CLK_MFC, "mfc", "dout_hclkd", CLK_GATE_IP0, 16, 0, 0), - GATE(CLK_G2D, "g2d", "dout_hclkd", CLK_GATE_IP0, 12, 0, 0), - GATE(CLK_G3D, "g3d", "dout_hclkd", CLK_GATE_IP0, 8, 0, 0), - GATE(CLK_IMEM, "imem", "dout_hclkd", CLK_GATE_IP0, 5, 0, 0), - - GATE(CLK_ETB, "etb", "dout_hclkd", CLK_GATE_IP1, 31, 0, 0), - GATE(CLK_ETM, "etm", "dout_hclkd", CLK_GATE_IP1, 30, 0, 0), - - GATE(CLK_I2C1, "i2c1", "dout_pclkp", CLK_GATE_IP3, 8, 0, 0), - - GATE(SCLK_DAC, "sclk_dac", "mout_vpll", CLK_SRC_MASK0, 2, - CLK_SET_RATE_PARENT, 0), -}; - -/* - * Clock aliases for legacy clkdev look-up. - * NOTE: Needed only to support legacy board files. - */ -static const struct samsung_clock_alias s5pv210_aliases[] __initconst = { - ALIAS(DOUT_APLL, NULL, "armclk"), - ALIAS(DOUT_HCLKM, NULL, "hclk_msys"), - ALIAS(MOUT_DMC0, NULL, "sclk_dmc0"), -}; - -/* S5PV210-specific PLLs. */ -static const struct samsung_pll_clock s5pv210_pll_clks[] __initconst = { - [apll] = PLL(pll_4508, FOUT_APLL, "fout_apll", "fin_pll", - APLL_LOCK, APLL_CON0, NULL), - [mpll] = PLL(pll_4502, FOUT_MPLL, "fout_mpll", "fin_pll", - MPLL_LOCK, MPLL_CON, NULL), - [epll] = PLL(pll_4600, FOUT_EPLL, "fout_epll", "fin_pll", - EPLL_LOCK, EPLL_CON0, NULL), - [vpll] = PLL(pll_4502, FOUT_VPLL, "fout_vpll", "mout_vpllsrc", - VPLL_LOCK, VPLL_CON, NULL), -}; - -/* S5P6442-specific PLLs. */ -static const struct samsung_pll_clock s5p6442_pll_clks[] __initconst = { - [apll] = PLL(pll_4502, FOUT_APLL, "fout_apll", "fin_pll", - APLL_LOCK, APLL_CON0, NULL), - [mpll] = PLL(pll_4502, FOUT_MPLL, "fout_mpll", "fin_pll", - MPLL_LOCK, MPLL_CON, NULL), - [epll] = PLL(pll_4500, FOUT_EPLL, "fout_epll", "fin_pll", - EPLL_LOCK, EPLL_CON0, NULL), - [vpll] = PLL(pll_4500, FOUT_VPLL, "fout_vpll", "fin_pll", - VPLL_LOCK, VPLL_CON, NULL), -}; - -static void __init __s5pv210_clk_init(struct device_node *np, - unsigned long xxti_f, - unsigned long xusbxti_f, - bool is_s5p6442) -{ - struct samsung_clk_provider *ctx; - - ctx = samsung_clk_init(np, reg_base, NR_CLKS); - - samsung_clk_register_mux(ctx, early_mux_clks, - ARRAY_SIZE(early_mux_clks)); - - if (is_s5p6442) { - samsung_clk_register_fixed_rate(ctx, s5p6442_frate_clks, - ARRAY_SIZE(s5p6442_frate_clks)); - samsung_clk_register_pll(ctx, s5p6442_pll_clks, - ARRAY_SIZE(s5p6442_pll_clks), reg_base); - samsung_clk_register_mux(ctx, s5p6442_mux_clks, - ARRAY_SIZE(s5p6442_mux_clks)); - samsung_clk_register_div(ctx, s5p6442_div_clks, - ARRAY_SIZE(s5p6442_div_clks)); - samsung_clk_register_gate(ctx, s5p6442_gate_clks, - ARRAY_SIZE(s5p6442_gate_clks)); - } else { - samsung_clk_register_fixed_rate(ctx, s5pv210_frate_clks, - ARRAY_SIZE(s5pv210_frate_clks)); - samsung_clk_register_pll(ctx, s5pv210_pll_clks, - ARRAY_SIZE(s5pv210_pll_clks), reg_base); - samsung_clk_register_mux(ctx, s5pv210_mux_clks, - ARRAY_SIZE(s5pv210_mux_clks)); - samsung_clk_register_div(ctx, s5pv210_div_clks, - ARRAY_SIZE(s5pv210_div_clks)); - samsung_clk_register_gate(ctx, s5pv210_gate_clks, - ARRAY_SIZE(s5pv210_gate_clks)); - } - - samsung_clk_register_mux(ctx, mux_clks, ARRAY_SIZE(mux_clks)); - samsung_clk_register_div(ctx, div_clks, ARRAY_SIZE(div_clks)); - samsung_clk_register_gate(ctx, gate_clks, ARRAY_SIZE(gate_clks)); - - samsung_clk_register_fixed_factor(ctx, ffactor_clks, - ARRAY_SIZE(ffactor_clks)); - - samsung_clk_register_alias(ctx, s5pv210_aliases, - ARRAY_SIZE(s5pv210_aliases)); - - s5pv210_clk_sleep_init(); - - samsung_clk_of_add_provider(np, ctx); - - pr_info("%s clocks: mout_apll = %ld, mout_mpll = %ld\n" - "\tmout_epll = %ld, mout_vpll = %ld\n", - is_s5p6442 ? "S5P6442" : "S5PV210", - _get_rate("mout_apll"), _get_rate("mout_mpll"), - _get_rate("mout_epll"), _get_rate("mout_vpll")); -} - -static void __init s5pv210_clk_dt_init(struct device_node *np) -{ - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - - __s5pv210_clk_init(np, 0, 0, false); -} -CLK_OF_DECLARE(s5pv210_clk, "samsung,s5pv210-clock", s5pv210_clk_dt_init); - -static void __init s5p6442_clk_dt_init(struct device_node *np) -{ - reg_base = of_iomap(np, 0); - if (!reg_base) - panic("%s: failed to map registers\n", __func__); - - __s5pv210_clk_init(np, 0, 0, true); -} -CLK_OF_DECLARE(s5p6442_clk, "samsung,s5p6442-clock", s5p6442_clk_dt_init); diff --git a/drivers/clk/samsung/samsung/clk.c b/drivers/clk/samsung/samsung/clk.c deleted file mode 100644 index b7d87d6db9dc..000000000000 --- a/drivers/clk/samsung/samsung/clk.c +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Copyright (c) 2013 Linaro Ltd. - * Author: Thomas Abraham - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This file includes utility functions to register clocks to common - * clock framework for Samsung platforms. -*/ - -#include -#include -#include -#include -#include -#include - -#include "clk.h" - -static LIST_HEAD(clock_reg_cache_list); - -void samsung_clk_save(void __iomem *base, - struct samsung_clk_reg_dump *rd, - unsigned int num_regs) -{ - for (; num_regs > 0; --num_regs, ++rd) - rd->value = readl(base + rd->offset); -} - -void samsung_clk_restore(void __iomem *base, - const struct samsung_clk_reg_dump *rd, - unsigned int num_regs) -{ - for (; num_regs > 0; --num_regs, ++rd) - writel(rd->value, base + rd->offset); -} - -struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump( - const unsigned long *rdump, - unsigned long nr_rdump) -{ - struct samsung_clk_reg_dump *rd; - unsigned int i; - - rd = kcalloc(nr_rdump, sizeof(*rd), GFP_KERNEL); - if (!rd) - return NULL; - - for (i = 0; i < nr_rdump; ++i) - rd[i].offset = rdump[i]; - - return rd; -} - -/* setup the essentials required to support clock lookup using ccf */ -struct samsung_clk_provider *__init samsung_clk_init(struct device_node *np, - void __iomem *base, unsigned long nr_clks) -{ - struct samsung_clk_provider *ctx; - struct clk **clk_table; - int i; - - ctx = kzalloc(sizeof(struct samsung_clk_provider), GFP_KERNEL); - if (!ctx) - panic("could not allocate clock provider context.\n"); - - clk_table = kcalloc(nr_clks, sizeof(struct clk *), GFP_KERNEL); - if (!clk_table) - panic("could not allocate clock lookup table\n"); - - for (i = 0; i < nr_clks; ++i) - clk_table[i] = ERR_PTR(-ENOENT); - - ctx->reg_base = base; - ctx->clk_data.clks = clk_table; - ctx->clk_data.clk_num = nr_clks; - spin_lock_init(&ctx->lock); - - return ctx; -} - -void __init samsung_clk_of_add_provider(struct device_node *np, - struct samsung_clk_provider *ctx) -{ - if (np) { - if (of_clk_add_provider(np, of_clk_src_onecell_get, - &ctx->clk_data)) - panic("could not register clk provider\n"); - } -} - -/* add a clock instance to the clock lookup table used for dt based lookup */ -void samsung_clk_add_lookup(struct samsung_clk_provider *ctx, struct clk *clk, - unsigned int id) -{ - if (ctx->clk_data.clks && id) - ctx->clk_data.clks[id] = clk; -} - -/* register a list of aliases */ -void __init samsung_clk_register_alias(struct samsung_clk_provider *ctx, - const struct samsung_clock_alias *list, - unsigned int nr_clk) -{ - struct clk *clk; - unsigned int idx, ret; - - if (!ctx->clk_data.clks) { - pr_err("%s: clock table missing\n", __func__); - return; - } - - for (idx = 0; idx < nr_clk; idx++, list++) { - if (!list->id) { - pr_err("%s: clock id missing for index %d\n", __func__, - idx); - continue; - } - - clk = ctx->clk_data.clks[list->id]; - if (!clk) { - pr_err("%s: failed to find clock %d\n", __func__, - list->id); - continue; - } - - ret = clk_register_clkdev(clk, list->alias, list->dev_name); - if (ret) - pr_err("%s: failed to register lookup %s\n", - __func__, list->alias); - } -} - -/* register a list of fixed clocks */ -void __init samsung_clk_register_fixed_rate(struct samsung_clk_provider *ctx, - const struct samsung_fixed_rate_clock *list, - unsigned int nr_clk) -{ - struct clk *clk; - unsigned int idx, ret; - - for (idx = 0; idx < nr_clk; idx++, list++) { - clk = clk_register_fixed_rate(NULL, list->name, - list->parent_name, list->flags, list->fixed_rate); - if (IS_ERR(clk)) { - pr_err("%s: failed to register clock %s\n", __func__, - list->name); - continue; - } - - samsung_clk_add_lookup(ctx, clk, list->id); - - /* - * Unconditionally add a clock lookup for the fixed rate clocks. - * There are not many of these on any of Samsung platforms. - */ - ret = clk_register_clkdev(clk, list->name, NULL); - if (ret) - pr_err("%s: failed to register clock lookup for %s", - __func__, list->name); - } -} - -/* register a list of fixed factor clocks */ -void __init samsung_clk_register_fixed_factor(struct samsung_clk_provider *ctx, - const struct samsung_fixed_factor_clock *list, unsigned int nr_clk) -{ - struct clk *clk; - unsigned int idx; - - for (idx = 0; idx < nr_clk; idx++, list++) { - clk = clk_register_fixed_factor(NULL, list->name, - list->parent_name, list->flags, list->mult, list->div); - if (IS_ERR(clk)) { - pr_err("%s: failed to register clock %s\n", __func__, - list->name); - continue; - } - - samsung_clk_add_lookup(ctx, clk, list->id); - } -} - -/* register a list of mux clocks */ -void __init samsung_clk_register_mux(struct samsung_clk_provider *ctx, - const struct samsung_mux_clock *list, - unsigned int nr_clk) -{ - struct clk *clk; - unsigned int idx, ret; - - for (idx = 0; idx < nr_clk; idx++, list++) { - clk = clk_register_mux(NULL, list->name, list->parent_names, - list->num_parents, list->flags, - ctx->reg_base + list->offset, - list->shift, list->width, list->mux_flags, &ctx->lock); - if (IS_ERR(clk)) { - pr_err("%s: failed to register clock %s\n", __func__, - list->name); - continue; - } - - samsung_clk_add_lookup(ctx, clk, list->id); - - /* register a clock lookup only if a clock alias is specified */ - if (list->alias) { - ret = clk_register_clkdev(clk, list->alias, - list->dev_name); - if (ret) - pr_err("%s: failed to register lookup %s\n", - __func__, list->alias); - } - } -} - -/* register a list of div clocks */ -void __init samsung_clk_register_div(struct samsung_clk_provider *ctx, - const struct samsung_div_clock *list, - unsigned int nr_clk) -{ - struct clk *clk; - unsigned int idx, ret; - - for (idx = 0; idx < nr_clk; idx++, list++) { - if (list->table) - clk = clk_register_divider_table(NULL, list->name, - list->parent_name, list->flags, - ctx->reg_base + list->offset, - list->shift, list->width, list->div_flags, - list->table, &ctx->lock); - else - clk = clk_register_divider(NULL, list->name, - list->parent_name, list->flags, - ctx->reg_base + list->offset, list->shift, - list->width, list->div_flags, &ctx->lock); - if (IS_ERR(clk)) { - pr_err("%s: failed to register clock %s\n", __func__, - list->name); - continue; - } - - samsung_clk_add_lookup(ctx, clk, list->id); - - /* register a clock lookup only if a clock alias is specified */ - if (list->alias) { - ret = clk_register_clkdev(clk, list->alias, - list->dev_name); - if (ret) - pr_err("%s: failed to register lookup %s\n", - __func__, list->alias); - } - } -} - -/* register a list of gate clocks */ -void __init samsung_clk_register_gate(struct samsung_clk_provider *ctx, - const struct samsung_gate_clock *list, - unsigned int nr_clk) -{ - struct clk *clk; - unsigned int idx, ret; - - for (idx = 0; idx < nr_clk; idx++, list++) { - clk = clk_register_gate(NULL, list->name, list->parent_name, - list->flags, ctx->reg_base + list->offset, - list->bit_idx, list->gate_flags, &ctx->lock); - if (IS_ERR(clk)) { - pr_err("%s: failed to register clock %s\n", __func__, - list->name); - continue; - } - - /* register a clock lookup only if a clock alias is specified */ - if (list->alias) { - ret = clk_register_clkdev(clk, list->alias, - list->dev_name); - if (ret) - pr_err("%s: failed to register lookup %s\n", - __func__, list->alias); - } - - samsung_clk_add_lookup(ctx, clk, list->id); - } -} - -/* - * obtain the clock speed of all external fixed clock sources from device - * tree and register it - */ -void __init samsung_clk_of_register_fixed_ext(struct samsung_clk_provider *ctx, - struct samsung_fixed_rate_clock *fixed_rate_clk, - unsigned int nr_fixed_rate_clk, - const struct of_device_id *clk_matches) -{ - const struct of_device_id *match; - struct device_node *clk_np; - u32 freq; - - for_each_matching_node_and_match(clk_np, clk_matches, &match) { - if (of_property_read_u32(clk_np, "clock-frequency", &freq)) - continue; - fixed_rate_clk[(unsigned long)match->data].fixed_rate = freq; - } - samsung_clk_register_fixed_rate(ctx, fixed_rate_clk, nr_fixed_rate_clk); -} - -/* utility function to get the rate of a specified clock */ -unsigned long _get_rate(const char *clk_name) -{ - struct clk *clk; - - clk = __clk_lookup(clk_name); - if (!clk) { - pr_err("%s: could not find clock %s\n", __func__, clk_name); - return 0; - } - - return clk_get_rate(clk); -} - -#ifdef CONFIG_PM_SLEEP -static int samsung_clk_suspend(void) -{ - struct samsung_clock_reg_cache *reg_cache; - - list_for_each_entry(reg_cache, &clock_reg_cache_list, node) - samsung_clk_save(reg_cache->reg_base, reg_cache->rdump, - reg_cache->rd_num); - return 0; -} - -static void samsung_clk_resume(void) -{ - struct samsung_clock_reg_cache *reg_cache; - - list_for_each_entry(reg_cache, &clock_reg_cache_list, node) - samsung_clk_restore(reg_cache->reg_base, reg_cache->rdump, - reg_cache->rd_num); -} - -static struct syscore_ops samsung_clk_syscore_ops = { - .suspend = samsung_clk_suspend, - .resume = samsung_clk_resume, -}; - -void samsung_clk_sleep_init(void __iomem *reg_base, - const unsigned long *rdump, - unsigned long nr_rdump) -{ - struct samsung_clock_reg_cache *reg_cache; - - reg_cache = kzalloc(sizeof(struct samsung_clock_reg_cache), - GFP_KERNEL); - if (!reg_cache) - panic("could not allocate register reg_cache.\n"); - reg_cache->rdump = samsung_clk_alloc_reg_dump(rdump, nr_rdump); - - if (!reg_cache->rdump) - panic("could not allocate register dump storage.\n"); - - if (list_empty(&clock_reg_cache_list)) - register_syscore_ops(&samsung_clk_syscore_ops); - - reg_cache->reg_base = reg_base; - reg_cache->rd_num = nr_rdump; - list_add_tail(®_cache->node, &clock_reg_cache_list); -} - -#else -void samsung_clk_sleep_init(void __iomem *reg_base, - const unsigned long *rdump, - unsigned long nr_rdump) {} -#endif - -/* - * Common function which registers plls, muxes, dividers and gates - * for each CMU. It also add CMU register list to register cache. - */ -struct samsung_clk_provider * __init samsung_cmu_register_one( - struct device_node *np, - const struct samsung_cmu_info *cmu) -{ - void __iomem *reg_base; - struct samsung_clk_provider *ctx; - - reg_base = of_iomap(np, 0); - if (!reg_base) { - panic("%s: failed to map registers\n", __func__); - return NULL; - } - - ctx = samsung_clk_init(np, reg_base, cmu->nr_clk_ids); - if (!ctx) { - panic("%s: unable to allocate ctx\n", __func__); - return ctx; - } - - if (cmu->pll_clks) - samsung_clk_register_pll(ctx, cmu->pll_clks, cmu->nr_pll_clks, - reg_base); - if (cmu->mux_clks) - samsung_clk_register_mux(ctx, cmu->mux_clks, - cmu->nr_mux_clks); - if (cmu->div_clks) - samsung_clk_register_div(ctx, cmu->div_clks, cmu->nr_div_clks); - if (cmu->gate_clks) - samsung_clk_register_gate(ctx, cmu->gate_clks, - cmu->nr_gate_clks); - if (cmu->fixed_clks) - samsung_clk_register_fixed_rate(ctx, cmu->fixed_clks, - cmu->nr_fixed_clks); - if (cmu->fixed_factor_clks) - samsung_clk_register_fixed_factor(ctx, cmu->fixed_factor_clks, - cmu->nr_fixed_factor_clks); - if (cmu->clk_regs) - samsung_clk_sleep_init(reg_base, cmu->clk_regs, - cmu->nr_clk_regs); - - samsung_clk_of_add_provider(np, ctx); - - return ctx; -} diff --git a/drivers/clk/samsung/samsung/clk.h b/drivers/clk/samsung/samsung/clk.h deleted file mode 100644 index da3bdebabf1e..000000000000 --- a/drivers/clk/samsung/samsung/clk.h +++ /dev/null @@ -1,416 +0,0 @@ -/* - * Copyright (c) 2013 Samsung Electronics Co., Ltd. - * Copyright (c) 2013 Linaro Ltd. - * Author: Thomas Abraham - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Common Clock Framework support for all Samsung platforms -*/ - -#ifndef __SAMSUNG_CLK_H -#define __SAMSUNG_CLK_H - -#include -#include "clk-pll.h" - -struct clk; - -/** - * struct samsung_clk_provider: information about clock provider - * @reg_base: virtual address for the register base. - * @clk_data: holds clock related data like clk* and number of clocks. - * @lock: maintains exclusion between callbacks for a given clock-provider. - */ -struct samsung_clk_provider { - void __iomem *reg_base; - struct clk_onecell_data clk_data; - spinlock_t lock; -}; - -/** - * struct samsung_clock_alias: information about mux clock - * @id: platform specific id of the clock. - * @dev_name: name of the device to which this clock belongs. - * @alias: optional clock alias name to be assigned to this clock. - */ -struct samsung_clock_alias { - unsigned int id; - const char *dev_name; - const char *alias; -}; - -#define ALIAS(_id, dname, a) \ - { \ - .id = _id, \ - .dev_name = dname, \ - .alias = a, \ - } - -#define MHZ (1000 * 1000) - -/** - * struct samsung_fixed_rate_clock: information about fixed-rate clock - * @id: platform specific id of the clock. - * @name: name of this fixed-rate clock. - * @parent_name: optional parent clock name. - * @flags: optional fixed-rate clock flags. - * @fixed-rate: fixed clock rate of this clock. - */ -struct samsung_fixed_rate_clock { - unsigned int id; - char *name; - const char *parent_name; - unsigned long flags; - unsigned long fixed_rate; -}; - -#define FRATE(_id, cname, pname, f, frate) \ - { \ - .id = _id, \ - .name = cname, \ - .parent_name = pname, \ - .flags = f, \ - .fixed_rate = frate, \ - } - -/* - * struct samsung_fixed_factor_clock: information about fixed-factor clock - * @id: platform specific id of the clock. - * @name: name of this fixed-factor clock. - * @parent_name: parent clock name. - * @mult: fixed multiplication factor. - * @div: fixed division factor. - * @flags: optional fixed-factor clock flags. - */ -struct samsung_fixed_factor_clock { - unsigned int id; - char *name; - const char *parent_name; - unsigned long mult; - unsigned long div; - unsigned long flags; -}; - -#define FFACTOR(_id, cname, pname, m, d, f) \ - { \ - .id = _id, \ - .name = cname, \ - .parent_name = pname, \ - .mult = m, \ - .div = d, \ - .flags = f, \ - } - -/** - * struct samsung_mux_clock: information about mux clock - * @id: platform specific id of the clock. - * @dev_name: name of the device to which this clock belongs. - * @name: name of this mux clock. - * @parent_names: array of pointer to parent clock names. - * @num_parents: number of parents listed in @parent_names. - * @flags: optional flags for basic clock. - * @offset: offset of the register for configuring the mux. - * @shift: starting bit location of the mux control bit-field in @reg. - * @width: width of the mux control bit-field in @reg. - * @mux_flags: flags for mux-type clock. - * @alias: optional clock alias name to be assigned to this clock. - */ -struct samsung_mux_clock { - unsigned int id; - const char *dev_name; - const char *name; - const char *const *parent_names; - u8 num_parents; - unsigned long flags; - unsigned long offset; - u8 shift; - u8 width; - u8 mux_flags; - const char *alias; -}; - -#define __MUX(_id, dname, cname, pnames, o, s, w, f, mf, a) \ - { \ - .id = _id, \ - .dev_name = dname, \ - .name = cname, \ - .parent_names = pnames, \ - .num_parents = ARRAY_SIZE(pnames), \ - .flags = (f) | CLK_SET_RATE_NO_REPARENT, \ - .offset = o, \ - .shift = s, \ - .width = w, \ - .mux_flags = mf, \ - .alias = a, \ - } - -#define MUX(_id, cname, pnames, o, s, w) \ - __MUX(_id, NULL, cname, pnames, o, s, w, 0, 0, NULL) - -#define MUX_A(_id, cname, pnames, o, s, w, a) \ - __MUX(_id, NULL, cname, pnames, o, s, w, 0, 0, a) - -#define MUX_F(_id, cname, pnames, o, s, w, f, mf) \ - __MUX(_id, NULL, cname, pnames, o, s, w, f, mf, NULL) - -#define MUX_FA(_id, cname, pnames, o, s, w, f, mf, a) \ - __MUX(_id, NULL, cname, pnames, o, s, w, f, mf, a) - -/** - * @id: platform specific id of the clock. - * struct samsung_div_clock: information about div clock - * @dev_name: name of the device to which this clock belongs. - * @name: name of this div clock. - * @parent_name: name of the parent clock. - * @flags: optional flags for basic clock. - * @offset: offset of the register for configuring the div. - * @shift: starting bit location of the div control bit-field in @reg. - * @div_flags: flags for div-type clock. - * @alias: optional clock alias name to be assigned to this clock. - */ -struct samsung_div_clock { - unsigned int id; - const char *dev_name; - const char *name; - const char *parent_name; - unsigned long flags; - unsigned long offset; - u8 shift; - u8 width; - u8 div_flags; - const char *alias; - struct clk_div_table *table; -}; - -#define __DIV(_id, dname, cname, pname, o, s, w, f, df, a, t) \ - { \ - .id = _id, \ - .dev_name = dname, \ - .name = cname, \ - .parent_name = pname, \ - .flags = f, \ - .offset = o, \ - .shift = s, \ - .width = w, \ - .div_flags = df, \ - .alias = a, \ - .table = t, \ - } - -#define DIV(_id, cname, pname, o, s, w) \ - __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, NULL, NULL) - -#define DIV_A(_id, cname, pname, o, s, w, a) \ - __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, a, NULL) - -#define DIV_F(_id, cname, pname, o, s, w, f, df) \ - __DIV(_id, NULL, cname, pname, o, s, w, f, df, NULL, NULL) - -#define DIV_T(_id, cname, pname, o, s, w, t) \ - __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, NULL, t) - -/** - * struct samsung_gate_clock: information about gate clock - * @id: platform specific id of the clock. - * @dev_name: name of the device to which this clock belongs. - * @name: name of this gate clock. - * @parent_name: name of the parent clock. - * @flags: optional flags for basic clock. - * @offset: offset of the register for configuring the gate. - * @bit_idx: bit index of the gate control bit-field in @reg. - * @gate_flags: flags for gate-type clock. - * @alias: optional clock alias name to be assigned to this clock. - */ -struct samsung_gate_clock { - unsigned int id; - const char *dev_name; - const char *name; - const char *parent_name; - unsigned long flags; - unsigned long offset; - u8 bit_idx; - u8 gate_flags; - const char *alias; -}; - -#define __GATE(_id, dname, cname, pname, o, b, f, gf, a) \ - { \ - .id = _id, \ - .dev_name = dname, \ - .name = cname, \ - .parent_name = pname, \ - .flags = f, \ - .offset = o, \ - .bit_idx = b, \ - .gate_flags = gf, \ - .alias = a, \ - } - -#define GATE(_id, cname, pname, o, b, f, gf) \ - __GATE(_id, NULL, cname, pname, o, b, f, gf, NULL) - -#define GATE_A(_id, cname, pname, o, b, f, gf, a) \ - __GATE(_id, NULL, cname, pname, o, b, f, gf, a) - -#define GATE_D(_id, dname, cname, pname, o, b, f, gf) \ - __GATE(_id, dname, cname, pname, o, b, f, gf, NULL) - -#define GATE_DA(_id, dname, cname, pname, o, b, f, gf, a) \ - __GATE(_id, dname, cname, pname, o, b, f, gf, a) - -#define PNAME(x) static const char * const x[] __initconst - -/** - * struct samsung_clk_reg_dump: register dump of clock controller registers. - * @offset: clock register offset from the controller base address. - * @value: the value to be register at offset. - */ -struct samsung_clk_reg_dump { - u32 offset; - u32 value; -}; - -/** - * struct samsung_pll_clock: information about pll clock - * @id: platform specific id of the clock. - * @dev_name: name of the device to which this clock belongs. - * @name: name of this pll clock. - * @parent_name: name of the parent clock. - * @flags: optional flags for basic clock. - * @con_offset: offset of the register for configuring the PLL. - * @lock_offset: offset of the register for locking the PLL. - * @type: Type of PLL to be registered. - * @alias: optional clock alias name to be assigned to this clock. - */ -struct samsung_pll_clock { - unsigned int id; - const char *dev_name; - const char *name; - const char *parent_name; - unsigned long flags; - int con_offset; - int lock_offset; - enum samsung_pll_type type; - const struct samsung_pll_rate_table *rate_table; - const char *alias; -}; - -#define __PLL(_typ, _id, _dname, _name, _pname, _flags, _lock, _con, \ - _rtable, _alias) \ - { \ - .id = _id, \ - .type = _typ, \ - .dev_name = _dname, \ - .name = _name, \ - .parent_name = _pname, \ - .flags = CLK_GET_RATE_NOCACHE, \ - .con_offset = _con, \ - .lock_offset = _lock, \ - .rate_table = _rtable, \ - .alias = _alias, \ - } - -#define PLL(_typ, _id, _name, _pname, _lock, _con, _rtable) \ - __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \ - _lock, _con, _rtable, _name) - -#define PLL_A(_typ, _id, _name, _pname, _lock, _con, _alias, _rtable) \ - __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \ - _lock, _con, _rtable, _alias) - -struct samsung_clock_reg_cache { - struct list_head node; - void __iomem *reg_base; - struct samsung_clk_reg_dump *rdump; - unsigned int rd_num; -}; - -struct samsung_cmu_info { - /* list of pll clocks and respective count */ - const struct samsung_pll_clock *pll_clks; - unsigned int nr_pll_clks; - /* list of mux clocks and respective count */ - const struct samsung_mux_clock *mux_clks; - unsigned int nr_mux_clks; - /* list of div clocks and respective count */ - const struct samsung_div_clock *div_clks; - unsigned int nr_div_clks; - /* list of gate clocks and respective count */ - const struct samsung_gate_clock *gate_clks; - unsigned int nr_gate_clks; - /* list of fixed clocks and respective count */ - const struct samsung_fixed_rate_clock *fixed_clks; - unsigned int nr_fixed_clks; - /* list of fixed factor clocks and respective count */ - const struct samsung_fixed_factor_clock *fixed_factor_clks; - unsigned int nr_fixed_factor_clks; - /* total number of clocks with IDs assigned*/ - unsigned int nr_clk_ids; - - /* list and number of clocks registers */ - const unsigned long *clk_regs; - unsigned int nr_clk_regs; -}; - -extern struct samsung_clk_provider *__init samsung_clk_init( - struct device_node *np, void __iomem *base, - unsigned long nr_clks); -extern void __init samsung_clk_of_add_provider(struct device_node *np, - struct samsung_clk_provider *ctx); -extern void __init samsung_clk_of_register_fixed_ext( - struct samsung_clk_provider *ctx, - struct samsung_fixed_rate_clock *fixed_rate_clk, - unsigned int nr_fixed_rate_clk, - const struct of_device_id *clk_matches); - -extern void samsung_clk_add_lookup(struct samsung_clk_provider *ctx, - struct clk *clk, unsigned int id); - -extern void __init samsung_clk_register_alias(struct samsung_clk_provider *ctx, - const struct samsung_clock_alias *list, - unsigned int nr_clk); -extern void __init samsung_clk_register_fixed_rate( - struct samsung_clk_provider *ctx, - const struct samsung_fixed_rate_clock *clk_list, - unsigned int nr_clk); -extern void __init samsung_clk_register_fixed_factor( - struct samsung_clk_provider *ctx, - const struct samsung_fixed_factor_clock *list, - unsigned int nr_clk); -extern void __init samsung_clk_register_mux(struct samsung_clk_provider *ctx, - const struct samsung_mux_clock *clk_list, - unsigned int nr_clk); -extern void __init samsung_clk_register_div(struct samsung_clk_provider *ctx, - const struct samsung_div_clock *clk_list, - unsigned int nr_clk); -extern void __init samsung_clk_register_gate(struct samsung_clk_provider *ctx, - const struct samsung_gate_clock *clk_list, - unsigned int nr_clk); -extern void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx, - const struct samsung_pll_clock *pll_list, - unsigned int nr_clk, void __iomem *base); - -extern struct samsung_clk_provider __init *samsung_cmu_register_one( - struct device_node *, - const struct samsung_cmu_info *); - -extern unsigned long _get_rate(const char *clk_name); - -extern void samsung_clk_sleep_init(void __iomem *reg_base, - const unsigned long *rdump, - unsigned long nr_rdump); - -extern void samsung_clk_save(void __iomem *base, - struct samsung_clk_reg_dump *rd, - unsigned int num_regs); -extern void samsung_clk_restore(void __iomem *base, - const struct samsung_clk_reg_dump *rd, - unsigned int num_regs); -extern struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump( - const unsigned long *rdump, - unsigned long nr_rdump); - -#endif /* __SAMSUNG_CLK_H */ diff --git a/drivers/clk/samsung/samsung/composite.c b/drivers/clk/samsung/samsung/composite.c deleted file mode 100644 index f6aa91b2ecd9..000000000000 --- a/drivers/clk/samsung/samsung/composite.c +++ /dev/null @@ -1,1750 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This file contains the utility functions for composite clocks. - */ - -#include -#include -#include -#include -#include -#include - -#include "composite.h" - -#define PLL_STAT_OSC (0x0) -#define PLL_STAT_PLL (0x1) -#define PLL_STAT_CHANGE (0x4) -#define PLL_STAT_MASK (0x7) - -#define to_comp_pll(_hw) container_of(_hw, struct samsung_composite_pll, hw) -#define to_comp_mux(_hw) container_of(_hw, struct samsung_composite_mux, hw) -#define to_comp_divider(_hw) container_of(_hw, struct samsung_composite_divider, hw) -#define to_usermux(_hw) container_of(_hw, struct clk_samsung_usermux, hw) -#define to_vclk(_hw) container_of(_hw, struct samsung_vclk, hw) - -static DEFINE_SPINLOCK(lock); - -#ifdef CONFIG_PM_SLEEP -void samsung_clk_save(void __iomem *base, - struct samsung_clk_reg_dump *rd, - unsigned int num_regs) -{ - for (; num_regs > 0; --num_regs, ++rd) - rd->value = readl(base + rd->offset); -} - -void samsung_clk_restore(void __iomem *base, - const struct samsung_clk_reg_dump *rd, - unsigned int num_regs) -{ - for (; num_regs > 0; --num_regs, ++rd) - writel(rd->value, base + rd->offset); -} - -struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump( - const unsigned long *rdump, - unsigned long nr_rdump) -{ - struct samsung_clk_reg_dump *rd; - unsigned int i; - - rd = kcalloc(nr_rdump, sizeof(*rd), GFP_KERNEL); - if (!rd) - return NULL; - - for (i = 0; i < nr_rdump; ++i) - rd[i].offset = rdump[i]; - - return rd; -} -#endif /* CONFIG_PM_SLEEP */ - -/* setup the essentials required to support clock lookup using ccf */ -struct samsung_clk_provider *__init samsung_clk_init(struct device_node *np, - void __iomem *base, unsigned long nr_clks) -{ - struct samsung_clk_provider *ctx = NULL; - struct clk **clk_table; - int i; - - if (!np) - return ctx; - - ctx = kzalloc(sizeof(struct samsung_clk_provider), GFP_KERNEL); - if (!ctx) - panic("could not allocate clock provider context.\n"); - - clk_table = kcalloc(nr_clks, sizeof(struct clk *), GFP_KERNEL); - if (!clk_table) - panic("could not allocate clock lookup table\n"); - - for (i = 0; i < nr_clks; ++i) - clk_table[i] = ERR_PTR(-ENOENT); - - ctx->reg_base = base; - ctx->clk_data.clks = clk_table; - ctx->clk_data.clk_num = nr_clks; - spin_lock_init(&ctx->lock); - - return ctx; -} - -void __init samsung_clk_of_add_provider(struct device_node *np, - struct samsung_clk_provider *ctx) -{ - if (np) { - if (of_clk_add_provider(np, of_clk_src_onecell_get, - &ctx->clk_data)) - panic("could not register clk provider\n"); - } -} - -/* add a clock instance to the clock lookup table used for dt based lookup */ -static void samsung_clk_add_lookup(struct samsung_clk_provider *ctx, struct clk *clk, - unsigned int id) -{ - if (ctx->clk_data.clks && id) - ctx->clk_data.clks[id] = clk; -} - -/* register a list of fixed clocks */ -void __init samsung_register_fixed_rate(struct samsung_clk_provider *ctx, - struct samsung_fixed_rate *list, unsigned int nr_clk) -{ - struct clk *clk; - unsigned int idx, ret; - - for (idx = 0; idx < nr_clk; idx++, list++) { - clk = clk_register_fixed_rate(NULL, list->name, - list->parent_name, list->flags, list->fixed_rate); - if (IS_ERR(clk)) { - pr_err("%s: failed to register clock %s\n", __func__, - list->name); - continue; - } - - samsung_clk_add_lookup(ctx, clk, list->id); - - /* - * Unconditionally add a clock lookup for the fixed rate clocks. - * There are not many of these on any of Samsung platforms. - */ - ret = clk_register_clkdev(clk, list->name, NULL); - if (ret) - pr_err("%s: failed to register clock lookup for %s", - __func__, list->name); - } -} - -/* register a list of fixed factor clocks */ -void __init samsung_register_fixed_factor(struct samsung_clk_provider *ctx, - struct samsung_fixed_factor *list, unsigned int nr_clk) -{ - struct clk *clk; - unsigned int idx, ret; - - for (idx = 0; idx < nr_clk; idx++, list++) { - clk = clk_register_fixed_factor(NULL, list->name, - list->parent_name, list->flags, list->mult, list->div); - if (IS_ERR(clk)) { - pr_err("%s: failed to register clock %s\n", __func__, - list->name); - continue; - } - - samsung_clk_add_lookup(ctx, clk, list->id); - - ret = clk_register_clkdev(clk, list->name, NULL); - if (ret) - pr_err("%s: failed to register clock lookup for %s", - __func__, list->name); - } -} - -/* - * obtain the clock speed of all external fixed clock sources from device - * tree and register it - */ -void __init samsung_register_of_fixed_ext(struct samsung_clk_provider *ctx, - struct samsung_fixed_rate *fixed_rate_clk, - unsigned int nr_fixed_rate_clk, - struct of_device_id *clk_matches) -{ - const struct of_device_id *match; - struct device_node *np; - u32 freq; - - for_each_matching_node_and_match(np, clk_matches, &match) { - if (of_property_read_u32(np, "clock-frequency", &freq)) - continue; - fixed_rate_clk[(unsigned long)match->data].fixed_rate = freq; - } - samsung_register_fixed_rate(ctx, fixed_rate_clk, nr_fixed_rate_clk); -} - -/* operation functions for pll clocks */ -static const struct samsung_pll_rate_table *samsung_get_pll_settings( - struct samsung_composite_pll *pll, unsigned long rate) -{ - const struct samsung_pll_rate_table *rate_table = pll->rate_table; - int i; - - for (i = 0; i < pll->rate_count; i++) { - if (rate == rate_table[i].rate) - return &rate_table[i]; - } - - return NULL; -} - -static long samsung_pll_round_rate(struct clk_hw *hw, - unsigned long drate, unsigned long *prate) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - const struct samsung_pll_rate_table *rate_table = pll->rate_table; - int i; - - /* Assumming rate_table is in descending order */ - for (i = 0; i < pll->rate_count; i++) { - if (drate >= rate_table[i].rate) - return rate_table[i].rate; - } - - /* return minimum supported value */ - return rate_table[i - 1].rate; -} - -static int samsung_composite_pll_is_enabled(struct clk_hw *hw) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - int set = pll->pll_flag & PLL_BYPASS ? 0 : 1; - unsigned int reg; - - reg = readl(pll->enable_reg); - - return (((reg >> pll->enable_bit) & 1) == set) ? 1 : 0; -} - -static int samsung_composite_pll_enable(struct clk_hw *hw) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - int set = pll->pll_flag & PLL_BYPASS ? 0 : 1; - unsigned int reg; - - /* Setting Enable register */ - reg = readl(pll->enable_reg); - if (set) - reg |= (1 << pll->enable_bit); - else - reg &= ~(1 << pll->enable_bit); - writel(reg, pll->enable_reg); - - /* setting CTRL mux register to 1 */ - reg = readl(pll->sel_reg); - reg |= (1 << pll->sel_bit); - writel(reg, pll->sel_reg); - - /* check status for mux setting */ - do { - cpu_relax(); - reg = readl(pll->stat_reg); - } while (((reg >> pll->stat_bit) & PLL_STAT_MASK) != PLL_STAT_PLL); - - return 0; -} - -static void samsung_composite_pll_disable(struct clk_hw *hw) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - int set = pll->pll_flag & PLL_BYPASS ? 0 : 1; - unsigned int reg; - - /* setting CTRL mux register to 0 */ - reg = readl(pll->sel_reg); - reg &= ~(1 << pll->sel_bit); - writel(reg, pll->sel_reg); - - /* check status for mux setting */ - do { - cpu_relax(); - reg = readl(pll->stat_reg); - } while (((reg >> pll->stat_bit) & PLL_STAT_MASK) != PLL_STAT_OSC); - - /* Setting Register */ - reg = readl(pll->enable_reg); - if (set) - reg &= ~(1 << pll->enable_bit); - else - reg |= (1 << pll->enable_bit); - - writel(reg, pll->enable_reg); -} - -static unsigned long samsung_pll145xx_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - u32 mdiv, pdiv, sdiv, pll_con; - u64 fvco = parent_rate; - - pll_con = readl(pll->con_reg); - mdiv = (pll_con >> PLL145XX_MDIV_SHIFT) & PLL145XX_MDIV_MASK; - pdiv = (pll_con >> PLL145XX_PDIV_SHIFT) & PLL145XX_PDIV_MASK; - sdiv = (pll_con >> PLL145XX_SDIV_SHIFT) & PLL145XX_SDIV_MASK; - /* Do calculation */ - fvco *= mdiv; - do_div(fvco, (pdiv << sdiv)); - - return (unsigned long)fvco; -} - -static inline bool samsung_pll145xx_mp_check(u32 mdiv, u32 pdiv, u32 pll_con) -{ - return ((mdiv != ((pll_con >> PLL145XX_MDIV_SHIFT) & PLL145XX_MDIV_MASK)) || - (pdiv != ((pll_con >> PLL145XX_PDIV_SHIFT) & PLL145XX_PDIV_MASK))); -} - -static int samsung_pll145xx_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long prate) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - const struct samsung_pll_rate_table *rate; - u32 pll_con; - - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, __clk_get_name(hw->clk)); - return -EINVAL; - } - - pll_con = readl(pll->con_reg); - if (!(samsung_pll145xx_mp_check(rate->mdiv, rate->pdiv, pll_con))) { - if ((rate->sdiv) == ((pll_con >> PLL145XX_SDIV_SHIFT) & PLL145XX_SDIV_MASK)) - return 0; - /* In the case of changing S value only */ - pll_con &= ~(PLL145XX_SDIV_MASK << PLL145XX_SDIV_SHIFT); - pll_con |= rate->sdiv << PLL145XX_SDIV_SHIFT; - writel(pll_con, pll->con_reg); - - return 0; - } - - /* Set PLL lock time */ - writel(rate->pdiv * PLL145XX_LOCK_FACTOR, pll->lock_reg); - /* Change PLL PMS values */ - pll_con &= ~((PLL145XX_MDIV_MASK << PLL145XX_MDIV_SHIFT) | - (PLL145XX_PDIV_MASK << PLL145XX_PDIV_SHIFT) | - (PLL145XX_SDIV_MASK << PLL145XX_SDIV_SHIFT)); - pll_con |= (rate->mdiv << PLL145XX_MDIV_SHIFT) | - (rate->pdiv << PLL145XX_PDIV_SHIFT) | - (rate->sdiv << PLL145XX_SDIV_SHIFT); - /* To prevent instable PLL operation, preset ENABLE bit with 0 */ - pll_con &= ~BIT(31); - writel(pll_con, pll->con_reg); - - /* Set enable bit */ - pll_con |= BIT(31); - writel(pll_con, pll->con_reg); - - do { - cpu_relax(); - pll_con = readl(pll->con_reg); - } while (!(pll_con & (PLL145XX_LOCKED_MASK << PLL145XX_LOCKED_SHIFT))); - - return 0; -} - - -static unsigned long samsung_pll1460x_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - u32 mdiv, pdiv, sdiv, pll_con0, pll_con1; - s16 kdiv; - u64 fvco = parent_rate; - - pll_con0 = readl(pll->con_reg); - pll_con1 = readl(pll->con_reg + 4); - mdiv = (pll_con0 >> PLL1460X_MDIV_SHIFT) & PLL1460X_MDIV_MASK; - pdiv = (pll_con0 >> PLL1460X_PDIV_SHIFT) & PLL1460X_PDIV_MASK; - sdiv = (pll_con0 >> PLL1460X_SDIV_SHIFT) & PLL1460X_SDIV_MASK; - kdiv = (s16)((pll_con1 >> PLL1460X_KDIV_SHIFT) & PLL1460X_KDIV_MASK); - /* Do calculation */ - fvco *= (mdiv << 16) + kdiv; - do_div(fvco, (pdiv << sdiv)); - fvco >>= 16; - - return (unsigned long)fvco; -} - -static inline bool samsung_pll1460x_mpk_check(u32 mdiv, u32 pdiv, u32 kdiv, u32 pll_con0, u32 pll_con1) -{ - return ((mdiv != ((pll_con0 >> PLL1460X_MDIV_SHIFT) & PLL1460X_MDIV_MASK)) || - (pdiv != ((pll_con0 >> PLL1460X_PDIV_SHIFT) & PLL1460X_PDIV_MASK)) || - (kdiv != ((pll_con1 >> PLL1460X_KDIV_SHIFT) & PLL1460X_KDIV_MASK))); -} - -static int samsung_pll1460x_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long parent_rate) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - u32 pll_con0, pll_con1; - const struct samsung_pll_rate_table *rate; - - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, __clk_get_name(hw->clk)); - return -EINVAL; - } - - pll_con0 = readl(pll->con_reg); - pll_con1 = readl(pll->con_reg + 4); - if (!(samsung_pll1460x_mpk_check(rate->mdiv, rate->pdiv, rate->kdiv, pll_con0, pll_con1))) { - if ((rate->sdiv) == ((pll_con0 >> PLL1460X_SDIV_SHIFT) & PLL1460X_SDIV_MASK)) - return 0; - /* In the case of changing S value only */ - pll_con0 &= ~(PLL1460X_SDIV_MASK << PLL1460X_SDIV_SHIFT); - pll_con0 |= (rate->sdiv << PLL1460X_SDIV_SHIFT); - writel(pll_con0, pll->con_reg); - - return 0; - } - - /* Set PLL lock time */ - writel(rate->pdiv * PLL1460X_LOCK_FACTOR, pll->lock_reg); - - pll_con1 &= ~(PLL1460X_KDIV_MASK << PLL1460X_KDIV_SHIFT); - pll_con1 |= (rate->kdiv << PLL1460X_KDIV_SHIFT); - writel(pll_con1, pll->con_reg + 4); - - pll_con0 &= ~((PLL1460X_MDIV_MASK << PLL1460X_MDIV_SHIFT) | - (PLL1460X_PDIV_MASK << PLL1460X_PDIV_SHIFT) | - (PLL1460X_SDIV_MASK << PLL1460X_SDIV_SHIFT)); - pll_con0 |= (rate->mdiv << PLL1460X_MDIV_SHIFT) | - (rate->pdiv << PLL1460X_PDIV_SHIFT) | - (rate->sdiv << PLL1460X_SDIV_SHIFT); - /* To prevent instable PLL operation, preset ENABLE bit with 0 */ - pll_con0 &= ~BIT(31); - writel(pll_con0, pll->con_reg); - - /* Set enable bit */ - pll_con0 |= BIT(31); - writel(pll_con0, pll->con_reg); - - /* Wait lock time */ - do { - cpu_relax(); - pll_con0 = readl(pll->con_reg); - } while (!(pll_con0 & (PLL1460X_LOCKED_MASK << PLL1460X_LOCKED_SHIFT))); - - return 0; -} - -static const struct clk_ops samsung_pll145xx_clk_ops = { - .recalc_rate = samsung_pll145xx_recalc_rate, - .set_rate = samsung_pll145xx_set_rate, - .round_rate = samsung_pll_round_rate, - .enable = samsung_composite_pll_enable, - .disable = samsung_composite_pll_disable, - .is_enabled = samsung_composite_pll_is_enabled, -}; - -static const struct clk_ops samsung_pll1460x_clk_ops = { - .recalc_rate = samsung_pll1460x_recalc_rate, - .set_rate = samsung_pll1460x_set_rate, - .round_rate = samsung_pll_round_rate, - .enable = samsung_composite_pll_enable, - .disable = samsung_composite_pll_disable, - .is_enabled = samsung_composite_pll_is_enabled, -}; - -static int samsung_composite_pll_enable_onchange(struct clk_hw *hw) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - int set = pll->pll_flag & PLL_BYPASS ? 0 : 1; - unsigned int reg; - - /* Setting Enable register */ - reg = readl(pll->enable_reg); - if (set) - reg |= (1 << pll->enable_bit); - else - reg &= ~(1 << pll->enable_bit); - writel(reg, pll->enable_reg); - - /* setting CTRL mux register to 1 */ - reg = readl(pll->sel_reg); - reg |= (1 << pll->sel_bit); - writel(reg, pll->sel_reg); - - /* check status for mux setting */ - do { - cpu_relax(); - reg = readl(pll->stat_reg); - } while (((reg >> pll->stat_bit) & PLL_STAT_MASK) == PLL_STAT_CHANGE); - - return 0; -} - -static void samsung_composite_pll_disable_onchange(struct clk_hw *hw) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - int set = pll->pll_flag & PLL_BYPASS ? 0 : 1; - unsigned int reg; - - /* setting CTRL mux register to 0 */ - reg = readl(pll->sel_reg); - reg &= ~(1 << pll->sel_bit); - writel(reg, pll->sel_reg); - - /* check status for mux setting */ - do { - cpu_relax(); - reg = readl(pll->stat_reg); - } while (((reg >> pll->stat_bit) & PLL_STAT_MASK) == PLL_STAT_CHANGE); - - /* Setting Register */ - reg = readl(pll->enable_reg); - if (set) - reg &= ~(1 << pll->enable_bit); - else - reg |= (1 << pll->enable_bit); - - writel(reg, pll->enable_reg); -} - -static unsigned long samsung_pll255xx_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - u32 mdiv, pdiv, sdiv, pll_con; - u64 fvco = parent_rate; - - pll_con = readl(pll->con_reg); - mdiv = (pll_con >> PLL255XX_MDIV_SHIFT) & PLL255XX_MDIV_MASK; - pdiv = (pll_con >> PLL255XX_PDIV_SHIFT) & PLL255XX_PDIV_MASK; - sdiv = (pll_con >> PLL255XX_SDIV_SHIFT) & PLL255XX_SDIV_MASK; - /* Do calculation */ - fvco *= mdiv; - do_div(fvco, (pdiv << sdiv)); - - return (unsigned long)fvco; -} - -static inline bool samsung_pll255xx_mp_check(u32 mdiv, u32 pdiv, u32 pll_con) -{ - return ((mdiv != ((pll_con >> PLL255XX_MDIV_SHIFT) & PLL255XX_MDIV_MASK)) || - (pdiv != ((pll_con >> PLL255XX_PDIV_SHIFT) & PLL255XX_PDIV_MASK))); -} - -static int samsung_pll255xx_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long prate) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - const struct samsung_pll_rate_table *rate; - u32 pll_con; - - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, __clk_get_name(hw->clk)); - return -EINVAL; - } - - pll_con = readl(pll->con_reg); - if (!(samsung_pll255xx_mp_check(rate->mdiv, rate->pdiv, pll_con))) { - if ((rate->sdiv) == ((pll_con >> PLL255XX_SDIV_SHIFT) & PLL255XX_SDIV_MASK)) - return 0; - /* In the case of changing S value only */ - pll_con &= ~(PLL255XX_SDIV_MASK << PLL255XX_SDIV_SHIFT); - pll_con |= rate->sdiv << PLL255XX_SDIV_SHIFT; - writel(pll_con, pll->con_reg); - - return 0; - } - - /* Set PLL lock time */ - writel(rate->pdiv * PLL255XX_LOCK_FACTOR, pll->lock_reg); - /* Change PLL PMS values */ - pll_con &= ~((PLL255XX_MDIV_MASK << PLL255XX_MDIV_SHIFT) | - (PLL255XX_PDIV_MASK << PLL255XX_PDIV_SHIFT) | - (PLL255XX_SDIV_MASK << PLL255XX_SDIV_SHIFT)); - pll_con |= (rate->mdiv << PLL255XX_MDIV_SHIFT) | - (rate->pdiv << PLL255XX_PDIV_SHIFT) | - (rate->sdiv << PLL255XX_SDIV_SHIFT); - - /* To prevent unstable PLL operation, preset enable bit with 0 */ - pll_con &= ~BIT(31); - writel(pll_con, pll->con_reg); - - /* Set enable bit */ - pll_con |= BIT(31); - writel(pll_con, pll->con_reg); - - do { - cpu_relax(); - pll_con = readl(pll->con_reg); - } while (!(pll_con & (PLL255XX_LOCKED_MASK << PLL255XX_LOCKED_SHIFT))); - - return 0; -} - -/* register function for pll clocks */ -static const struct clk_ops samsung_pll255xx_clk_ops = { - .recalc_rate = samsung_pll255xx_recalc_rate, - .set_rate = samsung_pll255xx_set_rate, - .round_rate = samsung_pll_round_rate, - .enable = samsung_composite_pll_enable_onchange, - .disable = samsung_composite_pll_disable_onchange, - .is_enabled = samsung_composite_pll_is_enabled, -}; - -static unsigned long samsung_pll2650x_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - u32 mdiv, pdiv, sdiv, pll_con0, pll_con1; - s16 kdiv; - u64 fvco = parent_rate; - - pll_con0 = readl(pll->con_reg); - pll_con1 = readl(pll->con_reg + 4); - mdiv = (pll_con0 >> PLL2650X_MDIV_SHIFT) & PLL2650X_MDIV_MASK; - pdiv = (pll_con0 >> PLL2650X_PDIV_SHIFT) & PLL2650X_PDIV_MASK; - sdiv = (pll_con0 >> PLL2650X_SDIV_SHIFT) & PLL2650X_SDIV_MASK; - kdiv = (s16)((pll_con1 >> PLL2650X_KDIV_SHIFT) & PLL2650X_KDIV_MASK); - /* Do calculation */ - fvco *= (mdiv << 16) + kdiv; - do_div(fvco, (pdiv << sdiv)); - fvco >>= 16; - - return (unsigned long)fvco; -} - -static inline bool samsung_pll2650x_mpk_check(u32 mdiv, u32 pdiv, u32 kdiv, u32 pll_con0, u32 pll_con1) -{ - return ((mdiv != ((pll_con0 >> PLL2650X_MDIV_SHIFT) & PLL2650X_MDIV_MASK)) || - (pdiv != ((pll_con0 >> PLL2650X_PDIV_SHIFT) & PLL2650X_PDIV_MASK)) || - (kdiv != ((pll_con1 >> PLL2650X_KDIV_SHIFT) & PLL2650X_KDIV_MASK))); -} - -static int samsung_pll2650x_set_rate(struct clk_hw *hw, unsigned long drate, - unsigned long parent_rate) -{ - struct samsung_composite_pll *pll = to_comp_pll(hw); - u32 pll_con0, pll_con1; - const struct samsung_pll_rate_table *rate; - - rate = samsung_get_pll_settings(pll, drate); - if (!rate) { - pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, - drate, __clk_get_name(hw->clk)); - return -EINVAL; - } - - pll_con0 = readl(pll->con_reg); - pll_con1 = readl(pll->con_reg + 4); - if (!(samsung_pll2650x_mpk_check(rate->mdiv, rate->pdiv, rate->kdiv, pll_con0, pll_con1))) { - if ((rate->sdiv) == ((pll_con0 >> PLL2650X_SDIV_SHIFT) & PLL2650X_SDIV_MASK)) - return 0; - /* In the case of changing S value only */ - pll_con0 &= ~(PLL2650X_SDIV_MASK << PLL2650X_SDIV_SHIFT); - pll_con0 |= (rate->sdiv << PLL2650X_SDIV_SHIFT); - writel(pll_con0, pll->con_reg); - - return 0; - } - - /* Set PLL lock time */ - writel(rate->pdiv * PLL2650X_LOCK_FACTOR, pll->lock_reg); - - pll_con1 &= ~(PLL2650X_KDIV_MASK << PLL2650X_KDIV_SHIFT); - pll_con1 |= (rate->kdiv << PLL2650X_KDIV_SHIFT); - writel(pll_con1, pll->con_reg + 4); - - pll_con0 &= ~((PLL2650X_MDIV_MASK << PLL2650X_MDIV_SHIFT) | - (PLL2650X_PDIV_MASK << PLL2650X_PDIV_SHIFT) | - (PLL2650X_SDIV_MASK << PLL2650X_SDIV_SHIFT)); - pll_con0 |= (rate->mdiv << PLL2650X_MDIV_SHIFT) | - (rate->pdiv << PLL2650X_PDIV_SHIFT) | - (rate->sdiv << PLL2650X_SDIV_SHIFT); - - /* To prevent unstable PLL operation, preset enable bit with 0 */ - pll_con0 &= ~BIT(31); - writel(pll_con0, pll->con_reg); - - /* Set enable bit */ - pll_con0 |= BIT(31); - writel(pll_con0, pll->con_reg); - - /* - * Wait lock time - * unit address translation : us to ms for mdelay - */ - mdelay(rate->pdiv * PLL2650X_LOCK_FACTOR / 1000); - - return 0; -} - -static const struct clk_ops samsung_pll2650x_clk_ops = { - .recalc_rate = samsung_pll2650x_recalc_rate, - .set_rate = samsung_pll2650x_set_rate, - .round_rate = samsung_pll_round_rate, - .enable = samsung_composite_pll_enable_onchange, - .disable = samsung_composite_pll_disable_onchange, - .is_enabled = samsung_composite_pll_is_enabled, -}; - -/* register function for pll clocks */ -static void _samsung_register_comp_pll(struct samsung_clk_provider *ctx, - struct samsung_composite_pll *list) -{ - struct clk *clk; - static const char *pname[1] = {"fin_pll"}; - int len; - unsigned int ret = 0; - - if (list->rate_table) { - /* find count of rates in rate_table */ - for (len = 0; list->rate_table[len].rate != 0; ) - len++; - list->rate_count = len; } - else - list->rate_count = 0; - - if (list->type == pll_1450x) - clk = clk_register_composite(NULL, list->name, pname, 1, - NULL, NULL, - &list->hw, &samsung_pll145xx_clk_ops, - &list->hw, &samsung_pll145xx_clk_ops, list->flag); - else if (list->type == pll_1451x || list->type == pll_1452x) - clk = clk_register_composite(NULL, list->name, pname, 1, - NULL, NULL, - &list->hw, &samsung_pll145xx_clk_ops, - &list->hw, &samsung_pll145xx_clk_ops, list->flag); - else if (list->type == pll_1460x) - clk = clk_register_composite(NULL, list->name, pname, 1, - NULL, NULL, - &list->hw, &samsung_pll1460x_clk_ops, - &list->hw, &samsung_pll1460x_clk_ops, list->flag); - else if (list->type == pll_2551x || list->type == pll_2555x) - clk = clk_register_composite(NULL, list->name, pname, 1, - NULL, NULL, - &list->hw, &samsung_pll255xx_clk_ops, - &list->hw, &samsung_pll255xx_clk_ops, list->flag); - else if (list->type == pll_2650x) - clk = clk_register_composite(NULL, list->name, pname, 1, - NULL, NULL, - &list->hw, &samsung_pll2650x_clk_ops, - &list->hw, &samsung_pll2650x_clk_ops, list->flag); - else { - pr_err("%s: invalid pll type %d\n", __func__, list->type); - return; - } - - if (IS_ERR(clk)) { - pr_err("%s: failed to register pll clock %s\n", - __func__, list->name); - return; - } - - samsung_clk_add_lookup(ctx, clk, list->id); - - /* register a clock lookup only if a clock alias is specified */ - if (list->alias) { - ret = clk_register_clkdev(clk, list->alias, NULL); - if (ret) - pr_err("%s: failed to register lookup %s\n", - __func__, list->alias); - } -} - -void samsung_register_comp_pll(struct samsung_clk_provider *ctx, - struct samsung_composite_pll *list, unsigned int nr_pll) -{ - int cnt; - - for (cnt = 0; cnt < nr_pll; cnt++) - _samsung_register_comp_pll(ctx, &list[cnt]); -} - -/* operation functions for mux clocks */ -static u8 samsung_mux_get_parent(struct clk_hw *hw) -{ - struct samsung_composite_mux *mux = to_comp_mux(hw); - u32 val; - - val = readl(mux->sel_reg) >> mux->sel_bit; - val &= (BIT(mux->sel_width) - 1); - - return (u8)val; -} - -static int samsung_mux_set_parent(struct clk_hw *hw, u8 index) -{ - struct samsung_composite_mux *mux = to_comp_mux(hw); - u32 val; - unsigned long flags = 0; - unsigned int timeout = 1000; - - if (mux->lock) - spin_lock_irqsave(mux->lock, flags); - - val = readl(mux->sel_reg); - val &= ~((BIT(mux->sel_width) - 1) << mux->sel_bit); - val |= index << mux->sel_bit; - writel(val, mux->sel_reg); - - if (mux->stat_reg) - do { - --timeout; - if (!timeout) { - pr_err("%s: failed to set parent %s.\n", - __func__, clk_hw_get_name(hw)); - pr_err("MUX_REG: %08x, MUX_STAT_REG: %08x\n", - readl(mux->sel_reg), readl(mux->stat_reg)); - if (mux->lock) - spin_unlock_irqrestore(mux->lock, flags); - return -ETIMEDOUT; - } - val = readl(mux->stat_reg); - val &= ((BIT(mux->stat_width) - 1) << mux->stat_bit); - } while (val != (index << mux->stat_bit)); - - if (mux->lock) - spin_unlock_irqrestore(mux->lock, flags); - - return 0; -} - -static const struct clk_ops samsung_composite_mux_ops = { - .get_parent = samsung_mux_get_parent, - .set_parent = samsung_mux_set_parent, -}; - -/* operation functions for mux clocks checking status with "on changing" */ - -static int samsung_mux_set_parent_onchange(struct clk_hw *hw, u8 index) -{ - struct samsung_composite_mux *mux = to_comp_mux(hw); - u32 val; - unsigned long flags = 0; - unsigned int timeout = 1000; - - if (mux->lock) - spin_lock_irqsave(mux->lock, flags); - - val = readl(mux->sel_reg); - val &= ~((BIT(mux->sel_width) - 1) << mux->sel_bit); - val |= index << mux->sel_bit; - writel(val, mux->sel_reg); - - if (mux->stat_reg) - do { - --timeout; - if (!timeout) { - pr_err("%s: failed to set parent %s.\n", - __func__, clk_hw_get_name(hw)); - pr_err("MUX_REG: %08x, MUX_STAT_REG: %08x\n", - readl(mux->sel_reg), readl(mux->stat_reg)); - if (mux->lock) - spin_unlock_irqrestore(mux->lock, flags); - return -ETIMEDOUT; - } - val = readl(mux->stat_reg); - val &= ((BIT(mux->stat_width) - 1) << mux->stat_bit); - } while (val == PLL_STAT_CHANGE); - - if (mux->lock) - spin_unlock_irqrestore(mux->lock, flags); - - return 0; -} -static const struct clk_ops samsung_composite_mux_ops_onchange = { - .get_parent = samsung_mux_get_parent, - .set_parent = samsung_mux_set_parent_onchange, -}; - -/* register function for mux clock */ -static void _samsung_register_comp_mux(struct samsung_clk_provider *ctx, - struct samsung_composite_mux *list) -{ - struct clk *clk; - unsigned int ret = 0; - - list->lock = &lock; - - if (!(list->flag & CLK_ON_CHANGING)) - clk = clk_register_composite(NULL, list->name, list->parents, list->num_parents, - &list->hw, &samsung_composite_mux_ops, - NULL, NULL, - NULL, NULL, list->flag); - else - clk = clk_register_composite(NULL, list->name, list->parents, list->num_parents, - &list->hw, &samsung_composite_mux_ops_onchange, - NULL, NULL, - NULL, NULL, list->flag); - - if (IS_ERR(clk)) { - pr_err("%s: failed to register mux clock %s\n", - __func__, list->name); - return; - } - - samsung_clk_add_lookup(ctx, clk, list->id); - - /* register a clock lookup only if a clock alias is specified */ - if (list->alias) { - ret = clk_register_clkdev(clk, list->alias, NULL); - if (ret) - pr_err("%s: failed to register lookup %s\n", - __func__, list->alias); - } -} - -void samsung_register_comp_mux(struct samsung_clk_provider *ctx, - struct samsung_composite_mux *list, unsigned int nr_mux) -{ - int cnt; - - for (cnt = 0; cnt < nr_mux; cnt++) - _samsung_register_comp_mux(ctx, &list[cnt]); -} - -/* operation functions for divider clocks */ -static unsigned long samsung_divider_recalc_rate(struct clk_hw *hw, - unsigned long parent_rate) -{ - struct samsung_composite_divider *divider = to_comp_divider(hw); - unsigned int val; - - val = readl(divider->rate_reg) >> divider->rate_bit; - val &= (1 << divider->rate_width) - 1; - val += 1; - if (!val) - return parent_rate; - - return parent_rate / val; -} - -static int samsung_divider_bestdiv(struct clk_hw *hw, unsigned long rate, - unsigned long *best_parent_rate) -{ - struct samsung_composite_divider *divider = to_comp_divider(hw); - int i, bestdiv = 0; - unsigned long parent_rate, maxdiv, now, best = 0; - unsigned long parent_rate_saved = *best_parent_rate; - - if (!rate) - rate = 1; - - maxdiv = ((unsigned long)(1UL << (divider->rate_width)) - 1UL) + 1UL; - - if (!(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) { - parent_rate = *best_parent_rate; - bestdiv = (parent_rate + rate - 1) / rate; - bestdiv = bestdiv == 0 ? 1 : bestdiv; - bestdiv = bestdiv > maxdiv ? maxdiv : bestdiv; - return bestdiv; - } - - maxdiv = min(ULONG_MAX / rate, maxdiv); - - for (i = 1; i <= maxdiv; i++) { - if (rate * i == parent_rate_saved) { - /* - * It's the most ideal case if the requested rate can be - * divided from parent clock without needing to change - * parent rate, so return the divider immediately. - */ - *best_parent_rate = parent_rate_saved; - return i; - } - parent_rate = clk_round_rate(clk_get_parent(hw->clk), - ((rate * i) + i - 1)); - now = parent_rate / i; - if (now <= rate && now > best) { - bestdiv = i; - best = now; - *best_parent_rate = parent_rate; - } - } - - if (!bestdiv) { - bestdiv = ((1 << (divider->rate_width)) - 1) + 1; - *best_parent_rate = clk_round_rate(clk_get_parent(hw->clk), 1); - } - - return bestdiv; -} - -static long samsung_divider_round_rate(struct clk_hw *hw, unsigned long rate, - unsigned long *prate) -{ - int div = 1; - - div = samsung_divider_bestdiv(hw, rate, prate); - if (div == 0) { - pr_err("%s: divider value should not be %d\n", __func__, div); - div = 1; - } - - return *prate / div; -} - -static int samsung_divider_set_rate(struct clk_hw *hw, unsigned long rate, - unsigned long parent_rate) -{ - struct samsung_composite_divider *divider = to_comp_divider(hw); - unsigned int div; - u32 val; - unsigned long flags = 0; - unsigned int timeout = 1000; - - div = (parent_rate / rate) - 1; - - if (div > ((1 << divider->rate_width) - 1)) - div = (1 << divider->rate_width) - 1; - - if (divider->lock) - spin_lock_irqsave(divider->lock, flags); - - val = readl(divider->rate_reg); - val &= ~(((1 << divider->rate_width) - 1) << divider->rate_bit); - val |= div << divider->rate_bit; - writel(val, divider->rate_reg); - - if (divider->stat_reg) - do { - --timeout; - if (!timeout) { - pr_err("%s: faild to set rate %s.\n", - __func__, clk_hw_get_name(hw)); - pr_err("DIV_REG: %08x, MUX_STAT_REG: %08x\n", - readl(divider->rate_reg), readl(divider->stat_reg)); - if (divider->lock) - spin_unlock_irqrestore(divider->lock, flags); - return -ETIMEDOUT; - } - val = readl(divider->stat_reg); - val &= BIT(divider->stat_width - 1) << divider->stat_bit; - } while (val); - - if (divider->lock) - spin_unlock_irqrestore(divider->lock, flags); - - return 0; -} - -static const struct clk_ops samsung_composite_divider_ops = { - .recalc_rate = samsung_divider_recalc_rate, - .round_rate = samsung_divider_round_rate, - .set_rate = samsung_divider_set_rate, -}; - -/* register function for divider clocks */ -static void _samsung_register_comp_divider(struct samsung_clk_provider *ctx, - struct samsung_composite_divider *list) -{ - struct clk *clk; - unsigned int ret = 0; - - list->lock = &lock; - - clk = clk_register_composite(NULL, list->name, &list->parent_name, 1, - NULL, NULL, - &list->hw, &samsung_composite_divider_ops, - NULL, NULL, list->flag); - - if (IS_ERR(clk)) { - pr_err("%s: failed to register mux clock %s\n", - __func__, list->name); - return; - } - - samsung_clk_add_lookup(ctx, clk, list->id); - - /* register a clock lookup only if a clock alias is specified */ - if (list->alias) { - ret = clk_register_clkdev(clk, list->alias, NULL); - if (ret) - pr_err("%s: failed to register lookup %s\n", - __func__, list->alias); - } -} - -void samsung_register_comp_divider(struct samsung_clk_provider *ctx, - struct samsung_composite_divider *list, unsigned int nr_div) -{ - int cnt; - - for (cnt = 0; cnt < nr_div; cnt++) - _samsung_register_comp_divider(ctx, &list[cnt]); -} - -struct dummy_gate_clk { - unsigned long offset; - u8 bit_idx; - struct clk *clk; -}; - -static struct dummy_gate_clk **gate_clk_list; -static unsigned int gate_clk_nr; - -int samsung_add_clk_gate_list(struct clk *clk, unsigned long offset, u8 bit_idx, const char *name) -{ - struct dummy_gate_clk *tmp_clk; - - if (!clk || !offset) - return -EINVAL; - - tmp_clk = kzalloc(sizeof(struct dummy_gate_clk), GFP_KERNEL); - if (!tmp_clk) { - pr_err("%s: fail to alloc for gate_clk\n", __func__); - return -ENOMEM; - } - - tmp_clk->offset = offset; - tmp_clk->bit_idx = bit_idx; - tmp_clk->clk = clk; - - gate_clk_list[gate_clk_nr] = tmp_clk; - - gate_clk_nr++; - - return 0; -} - -struct clk *samsung_clk_get_by_reg(unsigned long offset, u8 bit_idx) -{ - unsigned int i; - - for (i = 0; i < gate_clk_nr; i++) { - if (gate_clk_list[i]->offset == offset) { - if (gate_clk_list[i]->bit_idx == bit_idx) - return gate_clk_list[i]->clk; - } - } - - pr_err("%s: Fail to get clk by register offset\n", __func__); - - return 0; -} - -/* existing register function for gate clocks */ -static struct clk * __init _samsung_register_gate( - struct samsung_clk_provider *ctx, struct samsung_gate *list) -{ - struct clk *clk; - unsigned int ret = 0; - - clk = clk_register_gate(NULL, list->name, list->parent_name, - list->flag, list->reg, list->bit, - list->flag, &lock); - - if (IS_ERR(clk)) { - pr_err("%s: failed to register clock %s\n", __func__, - list->name); - return 0; - } - - samsung_clk_add_lookup(ctx, clk, list->id); - - if (list->alias) { - ret = clk_register_clkdev(clk, list->alias, NULL); - if (ret) - pr_err("%s: failed to register lookup %s\n", - __func__, list->alias); - } - - return clk; -} - -void __init samsung_register_gate(struct samsung_clk_provider *ctx, - struct samsung_gate *list, unsigned int nr_gate) -{ - int cnt; - struct clk *clk; - bool gate_list_fail = false; - unsigned int gate_enable_nr = 0; - struct clk **gate_enable_list; - - gate_clk_list = kzalloc(sizeof(struct dummy_gate_clk *) * nr_gate, GFP_KERNEL); - if (!gate_clk_list) { - pr_err("%s: can not alloc for gate clock list\n", __func__); - gate_list_fail = true; - } - - gate_enable_list = kzalloc(sizeof(struct clk *) * nr_gate, GFP_KERNEL); - - if (!gate_enable_list) { - pr_err("%s: can not alloc for enable gate clock list\n", __func__); - return ; - } - - for (cnt = 0; cnt < nr_gate; cnt++) { - clk = _samsung_register_gate(ctx, &list[cnt]); - - if (((&list[cnt])->flag & CLK_GATE_ENABLE) && gate_enable_list) { - gate_enable_list[gate_enable_nr] = clk; - gate_enable_nr++; - } - - /* Make list for gate clk to used by samsung_clk_get_by_reg */ - if (!gate_list_fail) - samsung_add_clk_gate_list(clk, (unsigned long)(list[cnt].reg), list[cnt].bit, list[cnt].name); - } - - /* - * Enable for not controlling gate clocks - */ - for (cnt = 0; cnt < gate_enable_nr; cnt++) - clk_prepare_enable(gate_enable_list[cnt]); - - if (gate_enable_list) - kfree(gate_enable_list); -} - -/* operation functions for usermux clocks */ -static int samsung_usermux_is_enabled(struct clk_hw *hw) -{ - struct clk_samsung_usermux *usermux = to_usermux(hw); - u32 val; - - val = readl(usermux->sel_reg); - val &= BIT(usermux->sel_bit); - - return val ? 1 : 0; -} - -static int samsung_usermux_enable(struct clk_hw *hw) -{ - struct clk_samsung_usermux *usermux = to_usermux(hw); - u32 val; - unsigned long flags = 0; - unsigned int timeout = 1000; - - if (usermux->lock) - spin_lock_irqsave(usermux->lock, flags); - - val = readl(usermux->sel_reg); - val &= ~(1 << usermux->sel_bit); - val |= (1 << usermux->sel_bit); - writel(val, usermux->sel_reg); - - if (usermux->stat_reg) - do { - --timeout; - if (!timeout) { - pr_err("%s: failed to enable clock %s.\n", - __func__, clk_hw_get_name(hw)); - if (usermux->lock) - spin_unlock_irqrestore(usermux->lock, flags); - return -ETIMEDOUT; - } - val = readl(usermux->stat_reg); - val &= BIT(2) << usermux->stat_bit; - } while (val); - - if (usermux->lock) - spin_unlock_irqrestore(usermux->lock, flags); - - return 0; -} - -static void samsung_usermux_disable(struct clk_hw *hw) -{ - struct clk_samsung_usermux *usermux = to_usermux(hw); - u32 val; - unsigned long flags = 0; - unsigned int timeout = 1000; - - if (usermux->lock) - spin_lock_irqsave(usermux->lock, flags); - - val = readl(usermux->sel_reg); - val &= ~(1 << usermux->sel_bit); - writel(val, usermux->sel_reg); - - if (usermux->stat_reg) - do { - --timeout; - if (!timeout) { - pr_err("%s: failed to disable clock %s.\n", - __func__, clk_hw_get_name(hw)); - if (usermux->lock) - spin_unlock_irqrestore(usermux->lock, flags); - return; - } - val = readl(usermux->stat_reg); - val &= BIT(2) << usermux->stat_bit; - } while (val); - - if (usermux->lock) - spin_unlock_irqrestore(usermux->lock, flags); -} - -static const struct clk_ops samsung_usermux_ops = { - .enable = samsung_usermux_enable, - .disable = samsung_usermux_disable, - .is_enabled = samsung_usermux_is_enabled, -}; - -/* register function for usermux clocks */ -static struct clk * __init _samsung_register_comp_usermux(struct samsung_usermux *list) -{ - struct clk_samsung_usermux *usermux; - struct clk *clk; - struct clk_init_data init; - - usermux = kzalloc(sizeof(struct clk_samsung_usermux), GFP_KERNEL); - if (!usermux) { - pr_err("%s: could not allocate usermux clk\n", __func__); - return ERR_PTR(-ENOMEM); - } - - init.name = list->name; - init.ops = &samsung_usermux_ops; - init.flags = list->flag | CLK_IS_BASIC; - init.parent_names = (list->parent_name ? &list->parent_name : NULL); - init.num_parents = (list->parent_name ? 1 : 0); - - usermux->sel_reg = list->sel_reg; - usermux->sel_bit = list->sel_bit; - usermux->stat_reg = list->stat_reg; - usermux->stat_bit = list->stat_bit; - usermux->flag = 0; - usermux->lock = &lock; - usermux->hw.init = &init; - - clk = clk_register(NULL, &usermux->hw); - - if (IS_ERR(clk)) - kfree(usermux); - - return clk; -} - -void __init samsung_register_usermux(struct samsung_clk_provider *ctx, - struct samsung_usermux *list, unsigned int nr_usermux) -{ - struct clk *clk; - int cnt; - unsigned int ret = 0; - - for (cnt = 0; cnt < nr_usermux; cnt++) { - clk = _samsung_register_comp_usermux(&list[cnt]); - if (IS_ERR(clk)) { - pr_err("%s: failed to register clock %s\n", __func__, - (&list[cnt])->name); - return; - } - - samsung_clk_add_lookup(ctx, clk, (&list[cnt])->id); - - if ((&list[cnt])->alias) { - ret = clk_register_clkdev(clk, (&list[cnt])->alias, NULL); - if (ret) - pr_err("%s: failed to register lookup %s\n", - __func__, (&list[cnt])->alias); - } - } -} - -/** - * Operations for virtual clock used in cal - * When cal is used to set clocks, following operations will be executed. - */ -int cal_vclk_enable(struct clk_hw *hw) -{ - struct samsung_vclk *vclk = to_vclk(hw); - unsigned long flags = 0; - int ret = 0; - - if ((vclk->flags & VCLK_GATE) && !(vclk->flags & VCLK_QCH_DIS)) - return 0; - - if (vclk->lock) - spin_lock_irqsave(vclk->lock, flags); - - exynos_ss_clk(hw, __func__, 1, ESS_FLAG_IN); - /* Call cal api to enable virtual clock */ - ret = cal_clk_enable(vclk->id); - if (ret) { - pr_err("[CAL]%s failed %d %d.\n", __func__, vclk->id, ret); - exynos_ss_clk(hw, __func__, 1, ESS_FLAG_ON); - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); - return -EAGAIN; - } - exynos_ss_clk(hw, __func__, 1, ESS_FLAG_OUT); - - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); - - return 0; -} - -void cal_vclk_disable(struct clk_hw *hw) -{ - struct samsung_vclk *vclk = to_vclk(hw); - unsigned long flags = 0; - int ret = 0; - - if ((vclk->flags & VCLK_GATE) && !(vclk->flags & VCLK_QCH_DIS)) - return ; - - if (vclk->lock) - spin_lock_irqsave(vclk->lock, flags); - - exynos_ss_clk(hw, __func__, 0, ESS_FLAG_IN); - /* Call cal api to disable virtual clock */ - ret = cal_clk_disable(vclk->id); - if (ret) { - pr_err("[CAL]%s failed %d %d.\n", __func__, vclk->id, ret); - exynos_ss_clk(hw, __func__, 0, ESS_FLAG_ON); - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); - return; - } - exynos_ss_clk(hw, __func__, 0, ESS_FLAG_OUT); - - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); -} - -int cal_vclk_is_enabled(struct clk_hw *hw) -{ - struct samsung_vclk *vclk = to_vclk(hw); - int ret = 0; - - /* - * Call cal api to check whether clock is enabled or not - * Spinlock is not needed because only read operation will - * be executed - */ - ret = cal_clk_is_enabled(vclk->id); - - return ret; -} - -unsigned long cal_vclk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) -{ - struct samsung_vclk *vclk = to_vclk(hw); - unsigned long ret = 0; - - exynos_ss_clk(hw, __func__, 0, ESS_FLAG_IN); - /* Call cal api to recalculate rate */ - ret = cal_clk_getrate(vclk->id); - exynos_ss_clk(hw, __func__, ret, ESS_FLAG_OUT); - - return ret; -} - -unsigned long cal_vclk_gate_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) -{ - struct samsung_vclk *vclk; - struct clk_hw *parent; - unsigned long ret = 0; - - exynos_ss_clk(hw, __func__, 0, ESS_FLAG_IN); - parent = clk_hw_get_parent(hw); - if (parent) { - vclk = to_vclk(parent); - /* call cal api to recalculate rate */ - ret = cal_clk_getrate(vclk->id); - } - exynos_ss_clk(hw, __func__, ret, ESS_FLAG_OUT); - - return ret; -} - -long cal_vclk_round_rate(struct clk_hw *hw, unsigned long rate, - unsigned long *prate) -{ - /* round_rate ops is not needed when using cal */ - return (long)rate; -} - -int cal_vclk_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long prate) -{ - struct samsung_vclk *vclk = to_vclk(hw); - unsigned long flags = 0; - int ret = 0; - - if (vclk->lock) - spin_lock_irqsave(vclk->lock, flags); - - exynos_ss_clk(hw, __func__, rate, ESS_FLAG_IN); - /* Call cal api to set rate of clock */ - ret = cal_clk_setrate(vclk->id, rate); - if (ret) { - pr_err("[CAL]%s failed %d %lu %d.\n", __func__, - vclk->id, rate, ret); - exynos_ss_clk(hw, __func__, rate, ESS_FLAG_ON); - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); - return -EAGAIN; - } - exynos_ss_clk(hw, __func__, rate, ESS_FLAG_OUT); - - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); - - return ret; -} - -unsigned long cal_vclk_dfs_sw_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) -{ - struct samsung_vclk *vclk = to_vclk(hw); - unsigned long ret = 0; - - /* Call cal api to recalculate rate */ - ret = cal_dfs_cached_get_rate(vclk->id); - - return ret; -} -unsigned long cal_vclk_dfs_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) -{ - struct samsung_vclk *vclk = to_vclk(hw); - unsigned long ret = 0; - - /* Call cal api to recalculate rate */ - ret = cal_dfs_get_rate(vclk->id); - - return ret; -} - -int cal_vclk_dfs_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long prate) -{ - struct samsung_vclk *vclk = to_vclk(hw); - unsigned long flags = 0; - int ret = 0; - - if (vclk->lock) - spin_lock_irqsave(vclk->lock, flags); - - exynos_ss_clk(hw, __func__, rate, ESS_FLAG_IN); - /* Call cal api to set rate of clock */ - ret = cal_dfs_set_rate(vclk->id, rate); - if (ret) { - pr_err("[CAL]%s failed %d %lu %d.\n", __func__, - vclk->id, rate, ret); - exynos_ss_clk(hw, __func__, rate, ESS_FLAG_ON); - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); - return -EAGAIN; - } - exynos_ss_clk(hw, __func__, rate, ESS_FLAG_OUT); - - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); - - return ret; -} - -int cal_vclk_dfs_set_rate_switch(struct clk_hw *hw, unsigned long rate, unsigned long prate) -{ - struct samsung_vclk *vclk = to_vclk(hw); - unsigned long flags = 0; - int ret = 0; - - if (vclk->lock) - spin_lock_irqsave(vclk->lock, flags); - - /* Call cal api to set rate of clock */ - ret = cal_dfs_set_rate_switch(vclk->id, rate); - if (ret) { - pr_err("[CAL]%s failed.\n", __func__); - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); - return -EAGAIN; - } - - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); - - return ret; -} - -static int cal_vclk_qch_init(struct clk_hw *hw) -{ - struct samsung_vclk *vclk = to_vclk(hw); - int ret = 0; - - if (vclk->flags & VCLK_QCH_EN) - ret = cal_qch_init(vclk->id, 1); - else if (vclk->flags & VCLK_QCH_DIS) - ret = cal_qch_init(vclk->id, 0); - - return ret; -} - -int cal_vclk_qactive_enable(struct clk_hw *hw) -{ - struct samsung_vclk *vclk = to_vclk(hw); - unsigned long flags = 0; - unsigned int reg; - - if (!(vclk->flags & VCLK_QACTIVE)) - return 0; - - if (!vclk->addr) - return 0; - - if (vclk->lock) - spin_lock_irqsave(vclk->lock, flags); - - exynos_ss_clk(hw, __func__, 1, ESS_FLAG_IN); - - reg = readl(vclk->addr); - reg &= ~(vclk->mask); - reg |= vclk->val; - writel(reg, vclk->addr); - - exynos_ss_clk(hw, __func__, 1, ESS_FLAG_OUT); - - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); - - return 0; -} - -void cal_vclk_qactive_disable(struct clk_hw *hw) -{ - struct samsung_vclk *vclk = to_vclk(hw); - unsigned long flags = 0; - unsigned int reg; - - if (!(vclk->flags & VCLK_QACTIVE)) - return ; - - if (!vclk->addr) - return ;; - - if (vclk->lock) - spin_lock_irqsave(vclk->lock, flags); - - exynos_ss_clk(hw, __func__, 0, ESS_FLAG_IN); - - reg = readl(vclk->addr); - reg &= ~(vclk->mask); - writel(reg, vclk->addr); - - exynos_ss_clk(hw, __func__, 0, ESS_FLAG_OUT); - - if (vclk->lock) - spin_unlock_irqrestore(vclk->lock, flags); -} - -static const struct clk_ops samsung_vclk_ops = { - .enable = cal_vclk_enable, - .disable = cal_vclk_disable, - .is_enabled = cal_vclk_is_enabled, - .recalc_rate = cal_vclk_recalc_rate, - .round_rate = cal_vclk_round_rate, - .set_rate = cal_vclk_set_rate, -}; - -static const struct clk_ops samsung_vclk_dfs_ops = { - .recalc_rate = cal_vclk_dfs_recalc_rate, - .round_rate = cal_vclk_round_rate, - .set_rate = cal_vclk_dfs_set_rate, -}; - -static const struct clk_ops samsung_vclk_dfs_sw_ops = { - .recalc_rate = cal_vclk_dfs_sw_recalc_rate, - .round_rate = cal_vclk_round_rate, - .set_rate = cal_vclk_dfs_set_rate_switch, -}; - -static const struct clk_ops samsung_vclk_gate_ops = { - .enable = cal_vclk_enable, - .disable = cal_vclk_disable, - .is_enabled = cal_vclk_is_enabled, - .recalc_rate = cal_vclk_gate_recalc_rate, -}; - -static const struct clk_ops samsung_vclk_qactive_ops = { - .enable = cal_vclk_qactive_enable, - .disable = cal_vclk_qactive_disable, -}; - -static struct clk * __init _samsung_register_vclk(struct init_vclk *list) -{ - struct samsung_vclk *vclk; - struct clk *clk; - struct clk_init_data init; - - vclk = kzalloc(sizeof(struct samsung_vclk), GFP_KERNEL); - if (!vclk) { - pr_err("%s: could not allocate struct vclk\n", __func__); - return ERR_PTR(-ENOMEM); - } - - init.name = list->name; - if (list->vclk_flags & VCLK_DFS) - init.ops = &samsung_vclk_dfs_ops; - else if (list->vclk_flags & VCLK_DFS_SWITCH) - init.ops = &samsung_vclk_dfs_sw_ops; - else if (list->vclk_flags & VCLK_GATE) - init.ops = &samsung_vclk_gate_ops; - else if (list->vclk_flags & VCLK_QACTIVE) { - init.ops = &samsung_vclk_qactive_ops; - vclk->addr = ioremap(list->addr, 4); - vclk->mask = list->mask; - vclk->val = list->val; - } else - init.ops = &samsung_vclk_ops; - init.flags = list->flags | (CLK_IS_BASIC | CLK_GET_RATE_NOCACHE | CLK_IGNORE_UNUSED); - init.parent_names = (list->parent ? &list->parent : NULL); - init.num_parents = (list->parent ? 1 : 0); - vclk->id = list->calid; - /* Flags for vclk are not defined yet */ - vclk->flags = list->vclk_flags; - vclk->lock = &lock; - vclk->hw.init = &init; - clk = clk_register(NULL, &vclk->hw); - - if (IS_ERR(clk)) - kfree(vclk); - - return clk; -} - -void __init samsung_register_vclk(struct samsung_clk_provider *ctx, - struct init_vclk *list, unsigned int nr_vclk) -{ - struct clk *clk; - int cnt; - unsigned int ret = 0; - - for (cnt = 0; cnt < nr_vclk; cnt++) { - clk = _samsung_register_vclk(&list[cnt]); - if (IS_ERR(clk)) { - pr_err("%s: failed to register virtual clock %s\n", - __func__, (&list[cnt])->name); - continue; - } - - samsung_clk_add_lookup(ctx, clk, (&list[cnt])->id); - - /* Additional array of clocks for finding struct clk */ - if ((&list[cnt])->alias) { - ret = clk_register_clkdev(clk, (&list[cnt])->alias, NULL); - if (ret) - pr_err("%s: failed to register lookup %s\n", - __func__, (&list[cnt])->alias); - } - - cal_vclk_qch_init(__clk_get_hw(clk)); - } -} diff --git a/drivers/clk/samsung/samsung/composite.h b/drivers/clk/samsung/samsung/composite.h deleted file mode 100644 index d8cf81964e5f..000000000000 --- a/drivers/clk/samsung/samsung/composite.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This file contains the utility functions for composite clocks. - */ - -#ifndef __SAMSUNG_CLK_COMPOSITE_H -#define __SAMSUNG_CLK_COMPOSITE_H - -#include -#include -#include -#include - -/* - * struct samsung_clk_provider: information about clock provider - * @reg_base: virtual address for the register base. - * @clk_data: holds clock related data like clk* and number of clocks. - * @lock: maintains exclusion bwtween callbacks for a given clock-provider. - */ -struct samsung_clk_provider { - void __iomem *reg_base; - struct clk_onecell_data clk_data; - spinlock_t lock; -}; - -/* - * struct samsung_clk_reg_dump: register dump of clock controller registers. - * @offset: clock register offset from the controller base address. - * @value: the value to be register at offset. - */ -struct samsung_clk_reg_dump { - unsigned long offset; - u32 value; -}; - -/* - * struct samsung_fixed_rate_clock: information about fixed-rate clock - * @id: platform specific id of the clock. - * @name: name of this fixed-rate clock. - * @parent_name: optional parent clock name. - * @flags: optional fixed-rate clock flags. - * @fixed-rate: fixed clock rate of this clock. - */ -struct samsung_fixed_rate { - unsigned int id; - char *name; - const char *parent_name; - unsigned long flags; - unsigned long fixed_rate; -}; - -#define FRATE(_id, cname, pname, f, frate) \ - { \ - .id = _id, \ - .name = cname, \ - .parent_name = pname, \ - .flags = f, \ - .fixed_rate = frate, \ - } - -extern void __init samsung_register_fixed_rate( - struct samsung_clk_provider *ctx, - struct samsung_fixed_rate *list, - unsigned int nr_clk); -/* - * struct samsung_fixed_factor_clock: information about fixed-factor clock - * @id: platform specific id of the clock. - * @name: name of this fixed-factor clock. - * @parent_name: parent clock name. - * @mult: fixed multiplication factor. - * @div: fixed division factor. - * @flags: optional fixed-factor clock flags. - */ -struct samsung_fixed_factor { - unsigned int id; - char *name; - const char *parent_name; - unsigned long mult; - unsigned long div; - unsigned long flags; -}; - -#define FFACTOR(_id, cname, pname, m, d, f) \ - { \ - .id = _id, \ - .name = cname, \ - .parent_name = pname, \ - .mult = m, \ - .div = d, \ - .flags = f, \ - } - -extern void __init samsung_register_fixed_factor( - struct samsung_clk_provider *ctx, - struct samsung_fixed_factor *list, - unsigned int nr_clk); - -/* - * PLL145xx Clock Type: PLL1450x, PLL1451x, PLL1452x - * Maximum lock time can be 150 * Pdiv cycles - */ -#define PLL145XX_LOCK_FACTOR (150) -#define PLL145XX_MDIV_MASK (0x3FF) -#define PLL145XX_PDIV_MASK (0x03F) -#define PLL145XX_SDIV_MASK (0x007) -#define PLL145XX_LOCKED_MASK (0x1) -#define PLL145XX_MDIV_SHIFT (16) -#define PLL145XX_PDIV_SHIFT (8) -#define PLL145XX_SDIV_SHIFT (0) -#define PLL145XX_LOCKED_SHIFT (29) - -/* - * PLL1460X Clock Type - * Maximum lock time can be 3000 * Pdiv cycles - */ -#define PLL1460X_LOCK_FACTOR (3000) -#define PLL1460X_MDIV_MASK (0x03FF) -#define PLL1460X_PDIV_MASK (0x003F) -#define PLL1460X_SDIV_MASK (0x0007) -#define PLL1460X_KDIV_MASK (0xFFFF) -#define PLL1460X_LOCKED_MASK (0x1) -#define PLL1460X_MDIV_SHIFT (16) -#define PLL1460X_PDIV_SHIFT (8) -#define PLL1460X_SDIV_SHIFT (0) -#define PLL1460X_KDIV_SHIFT (0) -#define PLL1460X_LOCKED_SHIFT (29) - -/* - * PLL255xx Clock Type : PLL2551x, PLL2555x - * Maximum lock time can be 200 * Pdiv cycles - */ -#define PLL255XX_LOCK_FACTOR (200) -#define PLL255XX_MDIV_MASK (0x3FF) -#define PLL255XX_PDIV_MASK (0x3F) -#define PLL255XX_SDIV_MASK (0x7) -#define PLL255XX_LOCKED_MASK (0x1) -#define PLL255XX_MDIV_SHIFT (12) -#define PLL255XX_PDIV_SHIFT (4) -#define PLL255XX_SDIV_SHIFT (0) -#define PLL255XX_LOCKED_SHIFT (29) - -/* - * PLL2650X Clock Type - * Maximum lock time can be 3000 * Pdiv cycles - */ -#define PLL2650X_LOCK_FACTOR (3000) -#define PLL2650X_MDIV_MASK (0x01FF) -#define PLL2650X_PDIV_MASK (0x003F) -#define PLL2650X_SDIV_MASK (0x0007) -#define PLL2650X_KDIV_MASK (0xFFFF) -#define PLL2650X_LOCKED_MASK (0x1) -#define PLL2650X_MDIV_SHIFT (12) -#define PLL2650X_PDIV_SHIFT (4) -#define PLL2650X_SDIV_SHIFT (0) -#define PLL2650X_KDIV_SHIFT (0) -#define PLL2650X_LOCKED_SHIFT (29) - -enum pll_type { - pll_1450x = 0, - pll_1451x, - pll_1452x, - pll_1460x, - pll_2551x, - pll_2555x, - pll_2650x, -}; - -struct samsung_pll_rate_table { - long rate; - unsigned int pdiv; - unsigned int mdiv; - unsigned int sdiv; - unsigned int kdiv; -}; - -#define PLL_BYPASS BIT(0) -#define CHK_ON_CHANGING BIT(7) -/* - * struct samsung_composite_pll: information about composite-pll clocks - * @id: id of the clock for binding with device tree. - * @name: name of this pll clock. - * @type: type of this pll clock. - * @lock_reg: register for locking pll. - * @con_reg: configuration register for pll. - * @enable_reg: it can be different whether pll can be gated or only bypassed. - * @enable_bit: bit index for en/disable pll. - * @sel_reg: composite-pll has ctrl-mux. when disabled, it is set by 0. - * @sel_bit: bit index for ctrl-mux. - * @stat_reg: when sel_reg is set, status register must be checked. - * @stat_bit: bit index for status register. - * @rate_table: available pll output ratio table. - * @alias: support alias for this clock. - */ -struct samsung_composite_pll { - struct clk_hw hw; - unsigned int id; - const char *name; - enum pll_type type; - void __iomem *lock_reg; - void __iomem *con_reg; - void __iomem *enable_reg; - unsigned int enable_bit; - void __iomem *sel_reg; - unsigned int sel_bit; - void __iomem *stat_reg; - unsigned int stat_bit; - const struct samsung_pll_rate_table *rate_table; - unsigned int rate_count; - unsigned int pll_flag; - u8 flag; - const char *alias; -}; - -#define PLL(_id, cname, _type, lock, con, en, enbit, sel, selbit, stat, statbit, rtable, pf, f, a) \ - { \ - .id = _id, \ - .name = cname, \ - .type = _type, \ - .lock_reg = lock, \ - .con_reg = con, \ - .enable_reg = en, \ - .enable_bit = enbit, \ - .sel_reg = sel, \ - .sel_bit = selbit, \ - .stat_reg = stat, \ - .stat_bit = statbit, \ - .rate_table = rtable, \ - .rate_count = 0, \ - .pll_flag = pf, \ - .flag = f, \ - .alias = a, \ - } - -extern void samsung_register_comp_pll( - struct samsung_clk_provider *ctx, - struct samsung_composite_pll *pll_list, - unsigned int nr_pll); - -#define PNAME(x) static const char *x[] -/* - * struct samsung_composite_mux: information about composite-mux clocks - * @id: id of the clock for binding with device tree. - * @name: name of this mux clock. - * @parents: array of parent clocks. - * @num_parents: number of parent clocks. - * @sel_reg: register for mux selection. - * @sel_bit: bit index for sel_reg. - * @sel_width: different by number of parent clocks. - * @stat_reg: status must be checked when changing parent. - * @stat_bit: bit index for status register. - * @stat_width: different by number of parent clocks. - * @flag: optional flag for clock. - * @alias: optional name. recommend no more than 15 characters. - */ -struct samsung_composite_mux { - struct clk_hw hw; - unsigned int id; - const char *name; - const char **parents; - unsigned int num_parents; - void __iomem *sel_reg; - unsigned int sel_bit; - unsigned int sel_width; - void __iomem *stat_reg; - unsigned int stat_bit; - unsigned int stat_width; - unsigned int flag; - const char *alias; - spinlock_t *lock; -}; - -#define MUX(_id, cname, pnames, sel, selbit, selwid, stat, statbit, statwid, f, a) \ - { \ - .id = _id, \ - .name = cname, \ - .parents = pnames, \ - .num_parents = ARRAY_SIZE(pnames), \ - .sel_reg = sel, \ - .sel_bit = selbit, \ - .sel_width = selwid, \ - .stat_reg = stat, \ - .stat_bit = statbit, \ - .stat_width = statwid, \ - .flag = f, \ - .alias = a, \ - } - -extern void samsung_register_comp_mux( - struct samsung_clk_provider *ctx, - struct samsung_composite_mux *mux_list, - unsigned int nr_mux); - -/* - * struct samsung_composite_divider: information about composite-divider clocks - * @id: id of the clock for binding with device tree. - * @name: name of this divider clock. - * @parent_name: name of parent clock. - * @rate_reg: register for ratio selection. - * @rate_bit: bit index for rate_reg. - * @rate_width: can be different by bit index. - * @stat_reg: status must be checked when changing ratio. - * @stat_bit: bit index for status register. - * @stat_width: can be different by bit index. - * @flag: flag for clock. - * @alias: optional name. recommend no more than 15 characters. - */ -struct samsung_composite_divider { - struct clk_hw hw; - unsigned int id; - const char *name; - const char *parent_name; - void __iomem *rate_reg; - unsigned int rate_bit; - unsigned int rate_width; - void __iomem *stat_reg; - unsigned int stat_bit; - unsigned int stat_width; - unsigned int flag; - const char *alias; - spinlock_t *lock; -}; - -#define DIV(_id, cname, pname, rate, ratebit, ratewid, stat, statbit, statwid, f, a) \ - { \ - .id = _id, \ - .name = cname, \ - .parent_name = pname, \ - .rate_reg = rate, \ - .rate_bit = ratebit, \ - .rate_width = ratewid, \ - .stat_reg = stat, \ - .stat_bit = statbit, \ - .stat_width = statwid, \ - .flag = f, \ - .alias = a, \ - } - -extern void samsung_register_comp_divider(struct samsung_clk_provider *ctx, - struct samsung_composite_divider *div_list, unsigned int nr_div); - -#define CLK_GATE_ENABLE BIT(20) -#define CLK_ON_CHANGING BIT(7) -/* - * struct samsung_gate: information about gate clocks - * @id: id of the clock for binding with device tree. - * @name: - * @parent_name: - * @reg: - * @bit: - * @flag: - * @alias: - */ -struct samsung_gate { - unsigned int id; - const char *name; - const char *parent_name; - void __iomem *reg; - u8 bit; - unsigned int flag; - const char *alias; -}; - -#define GATE(_id, cname, pname, r, b, f, a) \ - { \ - .id = _id, \ - .name = cname, \ - .parent_name = pname, \ - .reg = r, \ - .bit = b, \ - .flag = f, \ - .alias = a, \ - } - -extern void __init samsung_register_gate( - struct samsung_clk_provider *ctx, - struct samsung_gate *gate_list, - unsigned int nr_gate); - -struct clk_samsung_usermux { - struct clk_hw hw; - void __iomem *sel_reg; - u8 sel_bit; - void __iomem *stat_reg; - u8 stat_bit; - u8 flag; - spinlock_t *lock; -}; - -/* - * struct samsung_composite_usermux: information about usermux clocks - * @id: id of the clock for binding with device tree. - * @name: name of this usermux clock. - * @parent_name: name of parent clock. - * @sel_reg: register for usermux selection. - * @sel_bit: bit index for sel_reg. - * @stat_reg: status must be checked when changing parent. - * @stat_bit: bit index for status register. - * @flag: optional flag for clock. - * @alias: optional name. recommend no more than 15 characters. - */ -struct samsung_usermux { - unsigned int id; - const char *name; - const char *parent_name; - void __iomem *sel_reg; - u8 sel_bit; - void __iomem *stat_reg; - u8 stat_bit; - u8 flag; - const char *alias; -}; - -#define USERMUX(_id, cname, pname, sel, selbit, stat, statbit, f, a) \ - { \ - .id = _id, \ - .name = cname, \ - .parent_name = pname, \ - .sel_reg = sel, \ - .sel_bit = selbit, \ - .stat_reg = stat, \ - .stat_bit = statbit, \ - .flag = f, \ - .alias = a, \ - } - -extern void __init samsung_register_usermux( - struct samsung_clk_provider *ctx, - struct samsung_usermux *list, - unsigned int nr_usermux); - -#define VCLK_DFS BIT(1) -#define VCLK_DFS_SWITCH BIT(2) -#define VCLK_GATE BIT(3) -#define VCLK_QCH_EN BIT(4) -#define VCLK_QCH_DIS BIT(5) -#define VCLK_QACTIVE BIT(6) - -/* - * struct init_vclk: initial information for virtual clocks - * @id: id of the clock for binding with device tree. - * @calid: id of the clock for calling cal. - * @name: name of this virtual clock. - * @flags: optional flag for clock. - * @vclk_flags: optional flag for only virtual clock. - * @alias: optional name. recommend no more than 15 characters. - */ -struct init_vclk{ - unsigned int id; - unsigned int calid; - const char *name; - const char *parent; - u8 flags; - u8 vclk_flags; - const char *alias; - u32 addr; - u32 mask; - u32 val; -}; - -struct samsung_vclk { - struct clk_hw hw; - unsigned int id; - u8 flags; - spinlock_t *lock; - void __iomem *addr; - u32 mask; - u32 val; -}; - -#define VCLK(_id, _calid, _name, f, vf, a) \ - { \ - .id = _id, \ - .calid = _calid, \ - .name = _name, \ - .flags = f, \ - .vclk_flags = vf, \ - .alias = a, \ - } - -#define HWACG_VCLK(_id, _calid, _name, _parent, f, vf, a) \ - { \ - .id = _id, \ - .calid = _calid, \ - .name = _name, \ - .parent = _parent, \ - .flags = f, \ - .vclk_flags = vf, \ - .alias = a, \ - } - -#define HWACG_VCLK_QACTIVE(_id, _name, _parent, f, vf, a, _addr, _mask, _val) \ - { \ - .id = _id, \ - .name = _name, \ - .parent = _parent, \ - .flags = f, \ - .vclk_flags = vf, \ - .alias = a, \ - .addr = _addr, \ - .mask = _mask, \ - .val = _val, \ - } - -extern void __init samsung_register_vclk(struct samsung_clk_provider *ctx, - struct init_vclk *list, unsigned int nr_vclk); - -extern struct samsung_clk_provider *__init samsung_clk_init( - struct device_node *np, void __iomem *base, - unsigned long nr_clks); - -extern void __init samsung_clk_of_add_provider(struct device_node *np, - struct samsung_clk_provider *ctx); - -extern void __init samsung_register_of_fixed_ext( - struct samsung_clk_provider *ctx, - struct samsung_fixed_rate *fixed_rate_clk, - unsigned int nr_fixed_rate_clk, - struct of_device_id *clk_matches); - -extern void samsung_clk_save(void __iomem *base, - struct samsung_clk_reg_dump *rd, - unsigned int num_regs); -extern void samsung_clk_restore(void __iomem *base, - const struct samsung_clk_reg_dump *rd, - unsigned int num_regs); -extern struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump( - const unsigned long *rdump, - unsigned long nr_rdump); - -#endif /* __SAMSUNG_CLK_COMPOSITE_H */ -- 2.20.1