From: sebastian.hesselbarth@gmail.com (Sebastian Hesselbarth)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 04/38] clk: mvebu: add Orion5x clock driver
Date: Wed, 23 Apr 2014 13:16:16 +0200 [thread overview]
Message-ID: <5357A100.1050406@gmail.com> (raw)
In-Reply-To: <1398202002-28530-5-git-send-email-thomas.petazzoni@free-electrons.com>
On 04/22/2014 11:26 PM, Thomas Petazzoni wrote:
> This commit adds a core clock driver for the Orion5x SoC, with support
> for the tclk, the CPU frequency and the DDR frequency. All the details
> about the Sample-At-Reset register were extracted from the U-Boot
> sources for Orion5x.
>
> Note that Orion5x does not have gatable clocks, so this core clock
> driver is sufficient to support clocking on Orion5x platforms.
>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> Cc: Mike Turquette <mturquette@linaro.org>
Acked-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> ---
> .../devicetree/bindings/clock/mvebu-core-clock.txt | 8 +
> drivers/clk/mvebu/Kconfig | 4 +
> drivers/clk/mvebu/Makefile | 1 +
> drivers/clk/mvebu/orion.c | 210 +++++++++++++++++++++
> 4 files changed, 223 insertions(+)
> create mode 100644 drivers/clk/mvebu/orion.c
>
> diff --git a/Documentation/devicetree/bindings/clock/mvebu-core-clock.txt b/Documentation/devicetree/bindings/clock/mvebu-core-clock.txt
> index 307a503..dc5ea5b 100644
> --- a/Documentation/devicetree/bindings/clock/mvebu-core-clock.txt
> +++ b/Documentation/devicetree/bindings/clock/mvebu-core-clock.txt
> @@ -29,6 +29,11 @@ The following is a list of provided IDs and clock names on Kirkwood and Dove:
> 2 = l2clk (L2 Cache clock derived from CPU0 clock)
> 3 = ddrclk (DDR controller clock derived from CPU0 clock)
>
> +The following is a list of provided IDs and clock names on Orion5x:
> + 0 = tclk (Internal Bus clock)
> + 1 = cpuclk (CPU0 clock)
> + 2 = ddrclk (DDR controller clock derived from CPU0 clock)
> +
> Required properties:
> - compatible : shall be one of the following:
> "marvell,armada-370-core-clock" - For Armada 370 SoC core clocks
> @@ -38,6 +43,9 @@ Required properties:
> "marvell,dove-core-clock" - for Dove SoC core clocks
> "marvell,kirkwood-core-clock" - for Kirkwood SoC (except mv88f6180)
> "marvell,mv88f6180-core-clock" - for Kirkwood MV88f6180 SoC
> + "marvell,mv88f5182-core-clock" - for Orion MV88F5182 SoC
> + "marvell,mv88f5281-core-clock" - for Orion MV88F5281 SoC
> + "marvell,mv88f6183-core-clock" - for Orion MV88F6183 SoC
> - reg : shall be the register address of the Sample-At-Reset (SAR) register
> - #clock-cells : from common clock binding; shall be set to 1
>
> diff --git a/drivers/clk/mvebu/Kconfig b/drivers/clk/mvebu/Kconfig
> index 693f7be..3b34dba 100644
> --- a/drivers/clk/mvebu/Kconfig
> +++ b/drivers/clk/mvebu/Kconfig
> @@ -34,3 +34,7 @@ config DOVE_CLK
> config KIRKWOOD_CLK
> bool
> select MVEBU_CLK_COMMON
> +
> +config ORION_CLK
> + bool
> + select MVEBU_CLK_COMMON
> diff --git a/drivers/clk/mvebu/Makefile b/drivers/clk/mvebu/Makefile
> index 4c66162..a9a56fc 100644
> --- a/drivers/clk/mvebu/Makefile
> +++ b/drivers/clk/mvebu/Makefile
> @@ -8,3 +8,4 @@ obj-$(CONFIG_ARMADA_38X_CLK) += armada-38x.o
> obj-$(CONFIG_ARMADA_XP_CLK) += armada-xp.o
> obj-$(CONFIG_DOVE_CLK) += dove.o
> obj-$(CONFIG_KIRKWOOD_CLK) += kirkwood.o
> +obj-$(CONFIG_ORION_CLK) += orion.o
> diff --git a/drivers/clk/mvebu/orion.c b/drivers/clk/mvebu/orion.c
> new file mode 100644
> index 0000000..fd12956
> --- /dev/null
> +++ b/drivers/clk/mvebu/orion.c
> @@ -0,0 +1,210 @@
> +/*
> + * Marvell Orion SoC clocks
> + *
> + * Copyright (C) 2014 Thomas Petazzoni
> + *
> + * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> + *
> + * This file is licensed under the terms of the GNU General Public
> + * License version 2. This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/clk-provider.h>
> +#include <linux/io.h>
> +#include <linux/of.h>
> +#include "common.h"
> +
> +static const struct coreclk_ratio orion_coreclk_ratios[] __initconst = {
> + { .id = 0, .name = "ddrclk", }
> +};
> +
> +/*
> + * Orion 5182
> + */
> +
> +#define SAR_MV88F5182_TCLK_FREQ 8
> +#define SAR_MV88F5182_TCLK_FREQ_MASK 0x3
> +
> +static u32 __init mv88f5182_get_tclk_freq(void __iomem *sar)
> +{
> + u32 opt = (readl(sar) >> SAR_MV88F5182_TCLK_FREQ) &
> + SAR_MV88F5182_TCLK_FREQ_MASK;
> + if (opt == 1)
> + return 150000000;
> + else if (opt == 2)
> + return 166666667;
> + else
> + return 0;
> +}
> +
> +#define SAR_MV88F5182_CPU_FREQ 4
> +#define SAR_MV88F5182_CPU_FREQ_MASK 0xf
> +
> +static u32 __init mv88f5182_get_cpu_freq(void __iomem *sar)
> +{
> + u32 opt = (readl(sar) >> SAR_MV88F5182_CPU_FREQ) &
> + SAR_MV88F5182_CPU_FREQ_MASK;
> + if (opt == 0)
> + return 333333333;
> + else if (opt == 1 || opt == 2)
> + return 400000000;
> + else if (opt == 3)
> + return 500000000;
> + else
> + return 0;
> +}
> +
> +static void __init mv88f5182_get_clk_ratio(void __iomem *sar, int id,
> + int *mult, int *div)
> +{
> + u32 opt = (readl(sar) >> SAR_MV88F5182_CPU_FREQ) &
> + SAR_MV88F5182_CPU_FREQ_MASK;
> + if (opt == 0 || opt == 1) {
> + *mult = 1;
> + *div = 2;
> + } else if (opt == 2 || opt == 3) {
> + *mult = 1;
> + *div = 3;
> + } else {
> + *mult = 0;
> + *div = 1;
> + }
> +}
> +
> +static const struct coreclk_soc_desc mv88f5182_coreclks = {
> + .get_tclk_freq = mv88f5182_get_tclk_freq,
> + .get_cpu_freq = mv88f5182_get_cpu_freq,
> + .get_clk_ratio = mv88f5182_get_clk_ratio,
> + .ratios = orion_coreclk_ratios,
> + .num_ratios = ARRAY_SIZE(orion_coreclk_ratios),
> +};
> +
> +static void __init mv88f5182_clk_init(struct device_node *np)
> +{
> + return mvebu_coreclk_setup(np, &mv88f5182_coreclks);
> +}
> +
> +CLK_OF_DECLARE(mv88f5182_clk, "marvell,mv88f5182-core-clock", mv88f5182_clk_init);
> +
> +/*
> + * Orion 5281
> + */
> +
> +static u32 __init mv88f5281_get_tclk_freq(void __iomem *sar)
> +{
> + /* On 5281, tclk is always 166 Mhz */
> + return 166666667;
> +}
> +
> +#define SAR_MV88F5281_CPU_FREQ 4
> +#define SAR_MV88F5281_CPU_FREQ_MASK 0xf
> +
> +static u32 __init mv88f5281_get_cpu_freq(void __iomem *sar)
> +{
> + u32 opt = (readl(sar) >> SAR_MV88F5281_CPU_FREQ) &
> + SAR_MV88F5281_CPU_FREQ_MASK;
> + if (opt == 1 || opt == 2)
> + return 400000000;
> + else if (opt == 3)
> + return 500000000;
> + else
> + return 0;
> +}
> +
> +static void __init mv88f5281_get_clk_ratio(void __iomem *sar, int id,
> + int *mult, int *div)
> +{
> + u32 opt = (readl(sar) >> SAR_MV88F5281_CPU_FREQ) &
> + SAR_MV88F5281_CPU_FREQ_MASK;
> + if (opt == 1) {
> + *mult = 1;
> + *div = 2;
> + } else if (opt == 2 || opt == 3) {
> + *mult = 1;
> + *div = 3;
> + } else {
> + *mult = 0;
> + *div = 1;
> + }
> +}
> +
> +static const struct coreclk_soc_desc mv88f5281_coreclks = {
> + .get_tclk_freq = mv88f5281_get_tclk_freq,
> + .get_cpu_freq = mv88f5281_get_cpu_freq,
> + .get_clk_ratio = mv88f5281_get_clk_ratio,
> + .ratios = orion_coreclk_ratios,
> + .num_ratios = ARRAY_SIZE(orion_coreclk_ratios),
> +};
> +
> +static void __init mv88f5281_clk_init(struct device_node *np)
> +{
> + return mvebu_coreclk_setup(np, &mv88f5281_coreclks);
> +}
> +
> +CLK_OF_DECLARE(mv88f5281_clk, "marvell,mv88f5281-core-clock", mv88f5281_clk_init);
> +
> +/*
> + * Orion 6183
> + */
> +
> +#define SAR_MV88F6183_TCLK_FREQ 9
> +#define SAR_MV88F6183_TCLK_FREQ_MASK 0x1
> +
> +static u32 __init mv88f6183_get_tclk_freq(void __iomem *sar)
> +{
> + u32 opt = (readl(sar) >> SAR_MV88F6183_TCLK_FREQ) &
> + SAR_MV88F6183_TCLK_FREQ_MASK;
> + if (opt == 0)
> + return 133333333;
> + else if (opt == 1)
> + return 166666667;
> + else
> + return 0;
> +}
> +
> +#define SAR_MV88F6183_CPU_FREQ 1
> +#define SAR_MV88F6183_CPU_FREQ_MASK 0x3f
> +
> +static u32 __init mv88f6183_get_cpu_freq(void __iomem *sar)
> +{
> + u32 opt = (readl(sar) >> SAR_MV88F6183_CPU_FREQ) &
> + SAR_MV88F6183_CPU_FREQ_MASK;
> + if (opt == 9)
> + return 333333333;
> + else if (opt == 17)
> + return 400000000;
> + else
> + return 0;
> +}
> +
> +static void __init mv88f6183_get_clk_ratio(void __iomem *sar, int id,
> + int *mult, int *div)
> +{
> + u32 opt = (readl(sar) >> SAR_MV88F6183_CPU_FREQ) &
> + SAR_MV88F6183_CPU_FREQ_MASK;
> + if (opt == 9 || opt == 17) {
> + *mult = 1;
> + *div = 2;
> + } else {
> + *mult = 0;
> + *div = 1;
> + }
> +}
> +
> +static const struct coreclk_soc_desc mv88f6183_coreclks = {
> + .get_tclk_freq = mv88f6183_get_tclk_freq,
> + .get_cpu_freq = mv88f6183_get_cpu_freq,
> + .get_clk_ratio = mv88f6183_get_clk_ratio,
> + .ratios = orion_coreclk_ratios,
> + .num_ratios = ARRAY_SIZE(orion_coreclk_ratios),
> +};
> +
> +
> +static void __init mv88f6183_clk_init(struct device_node *np)
> +{
> + return mvebu_coreclk_setup(np, &mv88f6183_coreclks);
> +}
> +
> +CLK_OF_DECLARE(mv88f6183_clk, "marvell,mv88f6183-core-clock", mv88f6183_clk_init);
>
next prev parent reply other threads:[~2014-04-23 11:16 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-22 21:26 [PATCH v2 00/38] ARM: orion5x: big step towards DT conversion Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 01/38] ARM: orion5x: fix target ID for crypto SRAM window Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 02/38] memory: mvebu-devbus: fix the conversion of the bus width Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 03/38] pinctrl: mvebu: new driver for Orion platforms Thomas Petazzoni
2014-04-23 11:16 ` Sebastian Hesselbarth
2014-04-23 14:17 ` Linus Walleij
2014-04-23 14:18 ` Thomas Petazzoni
2014-04-24 2:37 ` Jason Cooper
2014-04-24 13:10 ` Linus Walleij
2014-04-22 21:26 ` [PATCH v2 04/38] clk: mvebu: add Orion5x clock driver Thomas Petazzoni
2014-04-23 11:16 ` Sebastian Hesselbarth [this message]
2014-04-26 1:11 ` Jason Cooper
2014-04-22 21:26 ` [PATCH v2 05/38] memory: mvebu-devbus: use ARMADA_ prefix in defines Thomas Petazzoni
2014-04-23 11:17 ` Sebastian Hesselbarth
2014-04-26 14:21 ` Jason Cooper
2014-04-28 13:19 ` Ezequiel Garcia
2014-04-28 14:56 ` Jason Cooper
2014-04-28 16:04 ` Ezequiel Garcia
2014-04-29 13:19 ` Jason Cooper
2014-04-22 21:26 ` [PATCH v2 06/38] memory: mvebu-devbus: use _SHIFT suffixes instead of _BIT Thomas Petazzoni
2014-04-23 11:17 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 07/38] memory: mvebu-devbus: split functions Thomas Petazzoni
2014-04-23 11:18 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 08/38] memory: mvebu-devbus: add Orion5x support Thomas Petazzoni
2014-04-23 11:18 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 09/38] memory: mvebu-devbus: add a devbus, keep-config property Thomas Petazzoni
2014-04-23 11:18 ` [PATCH v2 09/38] memory: mvebu-devbus: add a devbus,keep-config property Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 10/38] ARM: orion5x: move interrupt controller node into ocp Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 11/38] ARM: orion5x: switch to preprocessor includes in DT Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 12/38] ARM: orion5x: use existing dt-bindings include for Device Tree files Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 13/38] ARM: orion5x: convert DT to use the mvebu-mbus driver Thomas Petazzoni
2014-04-23 11:22 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 14/38] ARM: orion5x: add node labels in Orion5x SoC Device Tree file Thomas Petazzoni
2014-04-23 11:22 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 15/38] ARM: orion5x: use gpio-keys and gpio-leds instead of gpio_keys/gpio_leds in edmini_v2 Thomas Petazzoni
2014-04-23 11:22 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 16/38] ARM: orion5x: add linux,stdout-path to edmini_v2 Thomas Petazzoni
2014-04-23 11:22 ` [PATCH v2 16/38] ARM: orion5x: add linux, stdout-path " Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 17/38] ARM: orion5x: use node labels for UART and SATA on edmini_v2 Thomas Petazzoni
2014-04-23 11:23 ` Sebastian Hesselbarth
2014-04-23 12:23 ` Thomas Petazzoni
2014-04-23 12:46 ` Ezequiel Garcia
2014-04-23 12:48 ` Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 18/38] ARM: orion5x: rename XOR node to dma-controller@<address> Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 19/38] ARM: orion5x: add interrupt for Ethernet in Device Tree Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 20/38] ARM: orion5x: switch to use the clock driver for DT platforms Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 21/38] ARM: orion5x: convert to use 'clocks' property for UART controllers Thomas Petazzoni
2014-04-23 11:24 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 22/38] ARM: orion: switch to a per-platform handle_irq() function Thomas Petazzoni
2014-04-22 21:45 ` Arnd Bergmann
2014-04-22 21:53 ` Thomas Petazzoni
2014-04-23 10:30 ` Arnd Bergmann
2014-04-23 11:25 ` Sebastian Hesselbarth
2014-04-26 14:54 ` Jason Cooper
2014-04-26 15:00 ` Jason Cooper
2014-04-26 15:42 ` Sebastian Hesselbarth
2014-04-26 20:33 ` Jason Cooper
2014-04-29 14:52 ` Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 23/38] ARM: orion5x: switch to DT interrupts and timer Thomas Petazzoni
2014-04-23 11:26 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 24/38] ARM: orion5x: enable pinctrl driver at SoC level Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 25/38] ARM: orion5x: update I2C description " Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 26/38] ARM: orion5x: add Device Bus " Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 27/38] ARM: orion5x: add standard pinctrl configs for sata0 and sata1 Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 28/38] ARM: orion5x: convert edmini_v2 to DT pinctrl Thomas Petazzoni
2014-04-23 11:27 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 29/38] ARM: orion5x: use DT to describe I2C devices on edmini_v2 Thomas Petazzoni
2014-04-23 11:28 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 30/38] ARM: orion5x: use DT to describe EHCI " Thomas Petazzoni
2014-04-23 11:28 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 31/38] ARM: orion5x: use DT to describe NOR " Thomas Petazzoni
2014-04-23 11:29 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 32/38] ARM: orion5x: keep TODO list in edmini_v2 DT Thomas Petazzoni
2014-04-23 11:29 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 33/38] ARM: orion5x: remove unneeded code for edmini_v2 Thomas Petazzoni
2014-04-22 21:26 ` [PATCH v2 34/38] ARM: orion5x: convert RD-88F5182 to Device Tree Thomas Petazzoni
2014-04-23 11:30 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 35/38] ARM: orion5x: convert d2net " Thomas Petazzoni
2014-04-23 11:32 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 36/38] ARM: orion5x: convert Maxtor Shared Storage II to the " Thomas Petazzoni
2014-04-23 11:33 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 37/38] ARM: orion: remove no longer needed DT IRQ code Thomas Petazzoni
2014-04-23 11:33 ` Sebastian Hesselbarth
2014-04-22 21:26 ` [PATCH v2 38/38] ARM: orion: remove no longer needed gpio DT code Thomas Petazzoni
2014-04-23 11:34 ` Sebastian Hesselbarth
2014-04-23 11:35 ` [PATCH v2 00/38] ARM: orion5x: big step towards DT conversion Sebastian Hesselbarth
2014-04-23 12:24 ` Thomas Petazzoni
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5357A100.1050406@gmail.com \
--to=sebastian.hesselbarth@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.