devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mike Turquette <mturquette-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
To: "Heiko Stübner" <heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>,
	"linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org"
	<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>
Cc: Grant Likely
	<grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
	Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
Subject: Re: [PATCH v4 1/4] clk: add support for Rockchip gate clocks
Date: Thu, 20 Jun 2013 16:29:03 -0700	[thread overview]
Message-ID: <20130620232903.9136.70323@quantum> (raw)
In-Reply-To: <201306131659.40802.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>

Quoting Heiko Stübner (2013-06-13 07:59:40)
> This adds basic support for gate-clocks on Rockchip SoCs.
> There are 16 gates in each register and use the HIWORD_MASK
> mechanism for changing gate settings.
> 
> The gate registers form a continuos block which makes the dt node
> structure a matter of taste, as either all 160 gates can be put into
> one gate clock spanning all registers or they can be divided into
> the 10 individual gates containing 16 clocks each.
> The code supports both approaches.
> 
> Signed-off-by: Heiko Stuebner <heiko@sntech.de>

I've taken this patch into clk-next for 3.11. Perhaps in the future the
gate-clock binding can be enhanced to allow for this kind of clock
globbing and this driver can disappear entirely.

Regards,
Mike

> ---
>  .../devicetree/bindings/clock/rockchip.txt         |   74 +++++++++++++++
>  drivers/clk/Makefile                               |    1 +
>  drivers/clk/rockchip/Makefile                      |    5 ++
>  drivers/clk/rockchip/clk-rockchip.c                |   94 ++++++++++++++++++++
>  4 files changed, 174 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/clock/rockchip.txt
>  create mode 100644 drivers/clk/rockchip/Makefile
>  create mode 100644 drivers/clk/rockchip/clk-rockchip.c
> 
> diff --git a/Documentation/devicetree/bindings/clock/rockchip.txt b/Documentation/devicetree/bindings/clock/rockchip.txt
> new file mode 100644
> index 0000000..a891c82
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/clock/rockchip.txt
> @@ -0,0 +1,74 @@
> +Device Tree Clock bindings for arch-rockchip
> +
> +This binding uses the common clock binding[1].
> +
> +[1] Documentation/devicetree/bindings/clock/clock-bindings.txt
> +
> +== Gate clocks ==
> +
> +The gate registers form a continuos block which makes the dt node
> +structure a matter of taste, as either all gates can be put into
> +one gate clock spanning all registers or they can be divided into
> +the 10 individual gates containing 16 clocks each.
> +The code supports both approaches.
> +
> +Required properties:
> +- compatible : "rockchip,rk2928-gate-clk"
> +- reg : shall be the control register address(es) for the clock.
> +- #clock-cells : from common clock binding; shall be set to 1
> +- clock-output-names : the corresponding gate names that the clock controls
> +- clocks : should contain the parent clock for each individual gate,
> +  therefore the number of clocks elements should match the number of
> +  clock-output-names
> +
> +Example using multiple gate clocks:
> +
> +               clk_gates0: gate-clk@200000d0 {
> +                       compatible = "rockchip,rk2928-gate-clk";
> +                       reg = <0x200000d0 0x4>;
> +                       clocks = <&dummy>, <&dummy>,
> +                                <&dummy>, <&dummy>,
> +                                <&dummy>, <&dummy>,
> +                                <&dummy>, <&dummy>,
> +                                <&dummy>, <&dummy>,
> +                                <&dummy>, <&dummy>,
> +                                <&dummy>, <&dummy>,
> +                                <&dummy>, <&dummy>;
> +
> +                       clock-output-names =
> +                               "gate_core_periph", "gate_cpu_gpll",
> +                               "gate_ddrphy", "gate_aclk_cpu",
> +                               "gate_hclk_cpu", "gate_pclk_cpu",
> +                               "gate_atclk_cpu", "gate_i2s0",
> +                               "gate_i2s0_frac", "gate_i2s1",
> +                               "gate_i2s1_frac", "gate_i2s2",
> +                               "gate_i2s2_frac", "gate_spdif",
> +                               "gate_spdif_frac", "gate_testclk";
> +
> +                       #clock-cells = <1>;
> +               };
> +
> +               clk_gates1: gate-clk@200000d4 {
> +                       compatible = "rockchip,rk2928-gate-clk";
> +                       reg = <0x200000d4 0x4>;
> +                       clocks = <&xin24m>, <&xin24m>,
> +                                <&xin24m>, <&dummy>,
> +                                <&dummy>, <&xin24m>,
> +                                <&xin24m>, <&dummy>,
> +                                <&xin24m>, <&dummy>,
> +                                <&xin24m>, <&dummy>,
> +                                <&xin24m>, <&dummy>,
> +                                <&xin24m>, <&dummy>;
> +
> +                       clock-output-names =
> +                               "gate_timer0", "gate_timer1",
> +                               "gate_timer2", "gate_jtag",
> +                               "gate_aclk_lcdc1_src", "gate_otgphy0",
> +                               "gate_otgphy1", "gate_ddr_gpll",
> +                               "gate_uart0", "gate_frac_uart0",
> +                               "gate_uart1", "gate_frac_uart1",
> +                               "gate_uart2", "gate_frac_uart2",
> +                               "gate_uart3", "gate_frac_uart3";
> +
> +                       #clock-cells = <1>;
> +               };
> diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
> index f51b52b..2e2e957 100644
> --- a/drivers/clk/Makefile
> +++ b/drivers/clk/Makefile
> @@ -25,6 +25,7 @@ ifeq ($(CONFIG_COMMON_CLK), y)
>  obj-$(CONFIG_ARCH_MMP)         += mmp/
>  endif
>  obj-$(CONFIG_MACH_LOONGSON1)   += clk-ls1x.o
> +obj-$(CONFIG_ARCH_ROCKCHIP)    += rockchip/
>  obj-$(CONFIG_ARCH_SUNXI)       += sunxi/
>  obj-$(CONFIG_ARCH_U8500)       += ux500/
>  obj-$(CONFIG_ARCH_VT8500)      += clk-vt8500.o
> diff --git a/drivers/clk/rockchip/Makefile b/drivers/clk/rockchip/Makefile
> new file mode 100644
> index 0000000..8d3aefa
> --- /dev/null
> +++ b/drivers/clk/rockchip/Makefile
> @@ -0,0 +1,5 @@
> +#
> +# Rockchip Clock specific Makefile
> +#
> +
> +obj-y  += clk-rockchip.o
> diff --git a/drivers/clk/rockchip/clk-rockchip.c b/drivers/clk/rockchip/clk-rockchip.c
> new file mode 100644
> index 0000000..ff990c4
> --- /dev/null
> +++ b/drivers/clk/rockchip/clk-rockchip.c
> @@ -0,0 +1,94 @@
> +/*
> + * Copyright (c) 2013 MundoReader S.L.
> + * Author: Heiko Stuebner <heiko@sntech.de>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/clk-provider.h>
> +#include <linux/clkdev.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +
> +static DEFINE_SPINLOCK(clk_lock);
> +
> +/*
> + * Gate clocks
> + */
> +
> +static void __init rk2928_gate_clk_init(struct device_node *node,
> +                                        void *data)
> +{
> +       struct clk_onecell_data *clk_data;
> +       const char *clk_parent;
> +       const char *clk_name;
> +       void __iomem *reg;
> +       void __iomem *reg_idx;
> +       int flags;
> +       int qty;
> +       int reg_bit;
> +       int clkflags = CLK_SET_RATE_PARENT;
> +       int i;
> +
> +       qty = of_property_count_strings(node, "clock-output-names");
> +       if (qty < 0) {
> +               pr_err("%s: error in clock-output-names %d\n", __func__, qty);
> +               return;
> +       }
> +
> +       if (qty == 0) {
> +               pr_info("%s: nothing to do\n", __func__);
> +               return;
> +       }
> +
> +       reg = of_iomap(node, 0);
> +
> +       clk_data = kzalloc(sizeof(struct clk_onecell_data), GFP_KERNEL);
> +       if (!clk_data)
> +               return;
> +
> +       clk_data->clks = kzalloc(qty * sizeof(struct clk *), GFP_KERNEL);
> +       if (!clk_data->clks) {
> +               kfree(clk_data);
> +               return;
> +       }
> +
> +       flags = CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE;
> +
> +       for (i = 0; i < qty; i++) {
> +               of_property_read_string_index(node, "clock-output-names",
> +                                             i, &clk_name);
> +
> +               /* ignore empty slots */
> +               if (!strcmp("reserved", clk_name))
> +                       continue;
> +
> +               clk_parent = of_clk_get_parent_name(node, i);
> +
> +               /* keep all gates untouched for now */
> +               clkflags |= CLK_IGNORE_UNUSED;
> +
> +               reg_idx = reg + (4 * (i / 16));
> +               reg_bit = (i % 16);
> +
> +               clk_data->clks[i] = clk_register_gate(NULL, clk_name,
> +                                                     clk_parent, clkflags,
> +                                                     reg_idx, reg_bit,
> +                                                     flags,
> +                                                     &clk_lock);
> +               WARN_ON(IS_ERR(clk_data->clks[i]));
> +       }
> +
> +       clk_data->clk_num = qty;
> +
> +       of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
> +}
> +CLK_OF_DECLARE(rk2928_gate, "rockchip,rk2928-gate-clk", rk2928_gate_clk_init);
> -- 
> 1.7.10.4
_______________________________________________
devicetree-discuss mailing list
devicetree-discuss@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/devicetree-discuss

  parent reply	other threads:[~2013-06-20 23:29 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-13 14:58 [PATCH v4 0/4] arm: add basic support for Rockchip Cortex-A9 SoCs Heiko Stübner
     [not found] ` <201306131658.36584.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
2013-06-13 14:59   ` [PATCH v4 1/4] clk: add support for Rockchip gate clocks Heiko Stübner
     [not found]     ` <201306131659.40802.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
2013-06-20 23:29       ` Mike Turquette [this message]
2013-06-13 15:00   ` [PATCH v4 2/4] arm: Add basic clocks for Rockchip rk3066a SoCs Heiko Stübner
2013-06-13 15:00   ` [PATCH v4 3/4] arm: add debug uarts for rockchip rk29xx and rk3xxx series Heiko Stübner
2013-06-13 15:02   ` [PATCH v4 4/4] arm: add basic support for Rockchip RK3066a boards Heiko Stübner
     [not found]     ` <201306131702.13400.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
2013-06-17 21:35       ` Olof Johansson
     [not found]         ` <20130617213515.GK28497-O5ziIzlqnXUVNXGz7ipsyg@public.gmane.org>
2013-06-17 22:26           ` Heiko Stübner
2013-06-18 14:13             ` Arnd Bergmann

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=20130620232903.9136.70323@quantum \
    --to=mturquette-qsej5fyqhm4dnm+yrofe0a@public.gmane.org \
    --cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
    --cc=grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
    --cc=heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org \
    --cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
    --cc=rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).