From: Maxime Ripard <maxime.ripard@free-electrons.com>
To: Chen-Yu Tsai <wens@csie.org>
Cc: Mike Turquette <mturquette@baylibre.com>,
Stephen Boyd <sboyd@codeaurora.org>,
David Airlie <airlied@linux.ie>,
Thierry Reding <thierry.reding@gmail.com>,
Philipp Zabel <p.zabel@pengutronix.de>,
devicetree <devicetree@vger.kernel.org>,
linux-arm-kernel <linux-arm-kernel@lists.infradead.org>,
linux-kernel <linux-kernel@vger.kernel.org>,
linux-clk <linux-clk@vger.kernel.org>,
dri-devel <dri-devel@lists.freedesktop.org>,
linux-sunxi <linux-sunxi@googlegroups.com>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Hans de Goede <hdegoede@redhat.com>,
Alexander Kaplan <alex@nextthing.co>,
Boris Brezillon <boris.brezillon@free-electrons.com>,
Wynter Woods <wynter@nextthing.co>,
Thomas Petazzoni <thomas.petazzoni@free-electrons.com>,
Rob Clark <robdclark@gmail.com>, Daniel Vetter <daniel@ffwll.ch>
Subject: Re: [PATCH v2 07/26] clk: sunxi: Add TCON channel1 clock
Date: Wed, 3 Feb 2016 21:29:26 +0100 [thread overview]
Message-ID: <20160203202926.GE3327@lukather> (raw)
In-Reply-To: <CAGb2v65_jsmiQ6DNCznFuQCcWxqs1N2fYJ-8OiUJ_BR+jf314w@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 9000 bytes --]
Hi,
On Sun, Jan 17, 2016 at 12:36:20AM +0800, Chen-Yu Tsai wrote:
> Hi,
>
> On Thu, Jan 14, 2016 at 11:24 PM, Maxime Ripard
> <maxime.ripard@free-electrons.com> wrote:
> > The TCON is a controller generating the timings to output videos signals,
> > acting like both a CRTC and an encoder.
> >
> > It has two channels depending on the output, each channel being driven by
> > its own clock (and own clock controller).
> >
> > Add a driver for the channel 1 clock.
> >
> > Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> > ---
> > Documentation/devicetree/bindings/clock/sunxi.txt | 1 +
> > drivers/clk/sunxi/Makefile | 1 +
> > drivers/clk/sunxi/clk-sun4i-tcon-ch1.c | 154 ++++++++++++++++++++++
> > 3 files changed, 156 insertions(+)
> > create mode 100644 drivers/clk/sunxi/clk-sun4i-tcon-ch1.c
> >
> > diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt b/Documentation/devicetree/bindings/clock/sunxi.txt
> > index bb9fb78dcff8..fe34fc56e803 100644
> > --- a/Documentation/devicetree/bindings/clock/sunxi.txt
> > +++ b/Documentation/devicetree/bindings/clock/sunxi.txt
> > @@ -67,6 +67,7 @@ Required properties:
> > "allwinner,sun7i-a20-out-clk" - for the external output clocks
> > "allwinner,sun7i-a20-gmac-clk" - for the GMAC clock module on A20/A31
> > "allwinner,sun4i-a10-tcon-ch0-clk" - for the TCON channel 0 clock on the A10
> > + "allwinner,sun4i-a10-tcon-ch1-clk" - for the TCON channel 1 clock on the A10
> > "allwinner,sun4i-a10-usb-clk" - for usb gates + resets on A10 / A20
> > "allwinner,sun5i-a13-usb-clk" - for usb gates + resets on A13
> > "allwinner,sun6i-a31-usb-clk" - for usb gates + resets on A31
> > diff --git a/drivers/clk/sunxi/Makefile b/drivers/clk/sunxi/Makefile
> > index 40c32ffd912c..0a20873cd103 100644
> > --- a/drivers/clk/sunxi/Makefile
> > +++ b/drivers/clk/sunxi/Makefile
> > @@ -12,6 +12,7 @@ obj-y += clk-mod0.o
> > obj-y += clk-simple-gates.o
> > obj-y += clk-sun4i-display.o
> > obj-y += clk-sun4i-pll3.o
> > +obj-y += clk-sun4i-tcon-ch1.o
> > obj-y += clk-sun8i-mbus.o
> > obj-y += clk-sun9i-core.o
> > obj-y += clk-sun9i-mmc.o
> > diff --git a/drivers/clk/sunxi/clk-sun4i-tcon-ch1.c b/drivers/clk/sunxi/clk-sun4i-tcon-ch1.c
> > new file mode 100644
> > index 000000000000..51ddc38821f7
> > --- /dev/null
> > +++ b/drivers/clk/sunxi/clk-sun4i-tcon-ch1.c
> > @@ -0,0 +1,154 @@
> > +/*
> > + * Copyright 2015 Maxime Ripard
> > + *
> > + * Maxime Ripard <maxime.ripard@free-electrons.com>
> > + *
> > + * 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/of.h>
> > +#include <linux/of_address.h>
> > +#include <linux/slab.h>
> > +#include <linux/spinlock.h>
> > +
> > +#define SUN4I_TCON_CH1_SCLK_NAME_LEN 32
> > +
> > +#define SUN4I_A10_TCON_CH1_SCLK2_PARENTS 4
> > +
> > +#define SUN4I_A10_TCON_CH1_SCLK2_GATE_BIT 31
> > +#define SUN4I_A10_TCON_CH1_SCLK2_MUX_MASK 3
> > +#define SUN4I_A10_TCON_CH1_SCLK2_MUX_SHIFT 24
> > +#define SUN4I_A10_TCON_CH1_SCLK2_DIV_WIDTH 4
> > +#define SUN4I_A10_TCON_CH1_SCLK2_DIV_SHIFT 0
> > +
> > +#define SUN4I_A10_TCON_CH1_SCLK1_GATE_BIT 15
> > +#define SUN4I_A10_TCON_CH1_SCLK1_DIV_WIDTH 1
> > +#define SUN4I_A10_TCON_CH1_SCLK1_DIV_SHIFT 11
> > +
> > +static DEFINE_SPINLOCK(sun4i_a10_tcon_ch1_lock);
> > +
> > +static void __init sun4i_a10_tcon_ch1_setup(struct device_node *node)
> > +{
> > + const char *sclk2_parents[SUN4I_A10_TCON_CH1_SCLK2_PARENTS];
> > + const char *sclk1_name = node->name;
> > + const char *sclk2_name;
> > + struct clk_divider *sclk1_div, *sclk2_div;
> > + struct clk_gate *sclk1_gate, *sclk2_gate;
> > + struct clk_mux *sclk2_mux;
> > + struct clk *sclk1, *sclk2;
> > + void __iomem *reg;
> > + int i, ret;
> > +
> > + of_property_read_string(node, "clock-output-names",
> > + &sclk1_name);
> > +
> > + sclk2_name = kasprintf(GFP_KERNEL, "%s2", sclk1_name);
> > + if (!sclk2_name)
> > + return;
> > +
> > + reg = of_io_request_and_map(node, 0, of_node_full_name(node));
> > + if (IS_ERR(reg)) {
> > + pr_err("%s: Could not map the clock registers\n", sclk2_name);
> > + return;
> > + }
> > +
> > + for (i = 0; i < SUN4I_A10_TCON_CH1_SCLK2_PARENTS; i++)
> > + sclk2_parents[i] = of_clk_get_parent_name(node, i);
>
> of_clk_parent_fill?
Indeed
>
> > +
> > + sclk2_mux = kzalloc(sizeof(*sclk2_mux), GFP_KERNEL);
> > + if (!sclk2_mux)
> > + return;
> > +
> > + sclk2_mux->reg = reg;
> > + sclk2_mux->shift = SUN4I_A10_TCON_CH1_SCLK2_MUX_SHIFT;
> > + sclk2_mux->mask = SUN4I_A10_TCON_CH1_SCLK2_MUX_MASK;
> > + sclk2_mux->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk2_gate = kzalloc(sizeof(*sclk2_gate), GFP_KERNEL);
> > + if (!sclk2_gate)
> > + goto free_sclk2_mux;
> > +
> > + sclk2_gate->reg = reg;
> > + sclk2_gate->bit_idx = SUN4I_A10_TCON_CH1_SCLK2_GATE_BIT;
> > + sclk2_gate->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk2_div = kzalloc(sizeof(*sclk2_div), GFP_KERNEL);
> > + if (!sclk2_div)
> > + goto free_sclk2_gate;
> > +
> > + sclk2_div->reg = reg;
> > + sclk2_div->shift = SUN4I_A10_TCON_CH1_SCLK2_DIV_SHIFT;
> > + sclk2_div->width = SUN4I_A10_TCON_CH1_SCLK2_DIV_WIDTH;
> > + sclk2_div->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk2 = clk_register_composite(NULL, sclk2_name, sclk2_parents,
> > + SUN4I_A10_TCON_CH1_SCLK2_PARENTS,
> > + &sclk2_mux->hw, &clk_mux_ops, &
>
> > + sclk2_div->hw, &clk_divider_ops,
>
> Placement of the "&" is very weird.
Hmm, right. I don't know what happened here, but it's obviously wrong :)
>
> > + &sclk2_gate->hw, &clk_gate_ops,
> > + 0);
> > + if (IS_ERR(sclk2)) {
> > + pr_err("%s: Couldn't register the clock\n", sclk2_name);
> > + goto free_sclk2_div;
> > + }
> > +
> > + sclk1_div = kzalloc(sizeof(*sclk1_div), GFP_KERNEL);
> > + if (!sclk1_div)
> > + goto free_sclk2;
> > +
> > + sclk1_div->reg = reg;
> > + sclk1_div->shift = SUN4I_A10_TCON_CH1_SCLK1_DIV_SHIFT;
> > + sclk1_div->width = SUN4I_A10_TCON_CH1_SCLK1_DIV_WIDTH;
> > + sclk1_div->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk1_gate = kzalloc(sizeof(*sclk1_gate), GFP_KERNEL);
> > + if (!sclk1_gate)
> > + goto free_sclk1_mux;
> > +
> > + sclk1_gate->reg = reg;
> > + sclk1_gate->bit_idx = SUN4I_A10_TCON_CH1_SCLK1_GATE_BIT;
> > + sclk1_gate->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk1 = clk_register_composite(NULL, sclk1_name, &sclk2_name, 1,
> > + NULL, NULL,
> > + &sclk1_div->hw, &clk_divider_ops,
> > + &sclk1_gate->hw, &clk_gate_ops,
> > + 0);
> > + if (IS_ERR(sclk1)) {
> > + pr_err("%s: Couldn't register the clock\n", sclk1_name);
> > + goto free_sclk1_gate;
> > + }
> > +
> > + ret = of_clk_add_provider(node, of_clk_src_simple_get, sclk1);
> > + if (WARN_ON(ret))
> > + goto free_sclk1;
> > +
> > + return;
> > +
> > +free_sclk1:
> > + clk_unregister_composite(sclk1);
> > +free_sclk1_gate:
> > + kfree(sclk1_gate);
> > +free_sclk1_mux:
> > + kfree(sclk1_div);
> > +free_sclk2:
> > + clk_unregister(sclk2);
> > +free_sclk2_div:
> > + kfree(sclk2_div);
> > +free_sclk2_gate:
> > + kfree(sclk2_gate);
> > +free_sclk2_mux:
> > + kfree(sclk2_mux);
>
> Cleanup after of_io_request_and_map?
Indeed.
Thanks!
Maxime
--
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: maxime.ripard@free-electrons.com (Maxime Ripard)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 07/26] clk: sunxi: Add TCON channel1 clock
Date: Wed, 3 Feb 2016 21:29:26 +0100 [thread overview]
Message-ID: <20160203202926.GE3327@lukather> (raw)
In-Reply-To: <CAGb2v65_jsmiQ6DNCznFuQCcWxqs1N2fYJ-8OiUJ_BR+jf314w@mail.gmail.com>
Hi,
On Sun, Jan 17, 2016 at 12:36:20AM +0800, Chen-Yu Tsai wrote:
> Hi,
>
> On Thu, Jan 14, 2016 at 11:24 PM, Maxime Ripard
> <maxime.ripard@free-electrons.com> wrote:
> > The TCON is a controller generating the timings to output videos signals,
> > acting like both a CRTC and an encoder.
> >
> > It has two channels depending on the output, each channel being driven by
> > its own clock (and own clock controller).
> >
> > Add a driver for the channel 1 clock.
> >
> > Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> > ---
> > Documentation/devicetree/bindings/clock/sunxi.txt | 1 +
> > drivers/clk/sunxi/Makefile | 1 +
> > drivers/clk/sunxi/clk-sun4i-tcon-ch1.c | 154 ++++++++++++++++++++++
> > 3 files changed, 156 insertions(+)
> > create mode 100644 drivers/clk/sunxi/clk-sun4i-tcon-ch1.c
> >
> > diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt b/Documentation/devicetree/bindings/clock/sunxi.txt
> > index bb9fb78dcff8..fe34fc56e803 100644
> > --- a/Documentation/devicetree/bindings/clock/sunxi.txt
> > +++ b/Documentation/devicetree/bindings/clock/sunxi.txt
> > @@ -67,6 +67,7 @@ Required properties:
> > "allwinner,sun7i-a20-out-clk" - for the external output clocks
> > "allwinner,sun7i-a20-gmac-clk" - for the GMAC clock module on A20/A31
> > "allwinner,sun4i-a10-tcon-ch0-clk" - for the TCON channel 0 clock on the A10
> > + "allwinner,sun4i-a10-tcon-ch1-clk" - for the TCON channel 1 clock on the A10
> > "allwinner,sun4i-a10-usb-clk" - for usb gates + resets on A10 / A20
> > "allwinner,sun5i-a13-usb-clk" - for usb gates + resets on A13
> > "allwinner,sun6i-a31-usb-clk" - for usb gates + resets on A31
> > diff --git a/drivers/clk/sunxi/Makefile b/drivers/clk/sunxi/Makefile
> > index 40c32ffd912c..0a20873cd103 100644
> > --- a/drivers/clk/sunxi/Makefile
> > +++ b/drivers/clk/sunxi/Makefile
> > @@ -12,6 +12,7 @@ obj-y += clk-mod0.o
> > obj-y += clk-simple-gates.o
> > obj-y += clk-sun4i-display.o
> > obj-y += clk-sun4i-pll3.o
> > +obj-y += clk-sun4i-tcon-ch1.o
> > obj-y += clk-sun8i-mbus.o
> > obj-y += clk-sun9i-core.o
> > obj-y += clk-sun9i-mmc.o
> > diff --git a/drivers/clk/sunxi/clk-sun4i-tcon-ch1.c b/drivers/clk/sunxi/clk-sun4i-tcon-ch1.c
> > new file mode 100644
> > index 000000000000..51ddc38821f7
> > --- /dev/null
> > +++ b/drivers/clk/sunxi/clk-sun4i-tcon-ch1.c
> > @@ -0,0 +1,154 @@
> > +/*
> > + * Copyright 2015 Maxime Ripard
> > + *
> > + * Maxime Ripard <maxime.ripard@free-electrons.com>
> > + *
> > + * 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/of.h>
> > +#include <linux/of_address.h>
> > +#include <linux/slab.h>
> > +#include <linux/spinlock.h>
> > +
> > +#define SUN4I_TCON_CH1_SCLK_NAME_LEN 32
> > +
> > +#define SUN4I_A10_TCON_CH1_SCLK2_PARENTS 4
> > +
> > +#define SUN4I_A10_TCON_CH1_SCLK2_GATE_BIT 31
> > +#define SUN4I_A10_TCON_CH1_SCLK2_MUX_MASK 3
> > +#define SUN4I_A10_TCON_CH1_SCLK2_MUX_SHIFT 24
> > +#define SUN4I_A10_TCON_CH1_SCLK2_DIV_WIDTH 4
> > +#define SUN4I_A10_TCON_CH1_SCLK2_DIV_SHIFT 0
> > +
> > +#define SUN4I_A10_TCON_CH1_SCLK1_GATE_BIT 15
> > +#define SUN4I_A10_TCON_CH1_SCLK1_DIV_WIDTH 1
> > +#define SUN4I_A10_TCON_CH1_SCLK1_DIV_SHIFT 11
> > +
> > +static DEFINE_SPINLOCK(sun4i_a10_tcon_ch1_lock);
> > +
> > +static void __init sun4i_a10_tcon_ch1_setup(struct device_node *node)
> > +{
> > + const char *sclk2_parents[SUN4I_A10_TCON_CH1_SCLK2_PARENTS];
> > + const char *sclk1_name = node->name;
> > + const char *sclk2_name;
> > + struct clk_divider *sclk1_div, *sclk2_div;
> > + struct clk_gate *sclk1_gate, *sclk2_gate;
> > + struct clk_mux *sclk2_mux;
> > + struct clk *sclk1, *sclk2;
> > + void __iomem *reg;
> > + int i, ret;
> > +
> > + of_property_read_string(node, "clock-output-names",
> > + &sclk1_name);
> > +
> > + sclk2_name = kasprintf(GFP_KERNEL, "%s2", sclk1_name);
> > + if (!sclk2_name)
> > + return;
> > +
> > + reg = of_io_request_and_map(node, 0, of_node_full_name(node));
> > + if (IS_ERR(reg)) {
> > + pr_err("%s: Could not map the clock registers\n", sclk2_name);
> > + return;
> > + }
> > +
> > + for (i = 0; i < SUN4I_A10_TCON_CH1_SCLK2_PARENTS; i++)
> > + sclk2_parents[i] = of_clk_get_parent_name(node, i);
>
> of_clk_parent_fill?
Indeed
>
> > +
> > + sclk2_mux = kzalloc(sizeof(*sclk2_mux), GFP_KERNEL);
> > + if (!sclk2_mux)
> > + return;
> > +
> > + sclk2_mux->reg = reg;
> > + sclk2_mux->shift = SUN4I_A10_TCON_CH1_SCLK2_MUX_SHIFT;
> > + sclk2_mux->mask = SUN4I_A10_TCON_CH1_SCLK2_MUX_MASK;
> > + sclk2_mux->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk2_gate = kzalloc(sizeof(*sclk2_gate), GFP_KERNEL);
> > + if (!sclk2_gate)
> > + goto free_sclk2_mux;
> > +
> > + sclk2_gate->reg = reg;
> > + sclk2_gate->bit_idx = SUN4I_A10_TCON_CH1_SCLK2_GATE_BIT;
> > + sclk2_gate->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk2_div = kzalloc(sizeof(*sclk2_div), GFP_KERNEL);
> > + if (!sclk2_div)
> > + goto free_sclk2_gate;
> > +
> > + sclk2_div->reg = reg;
> > + sclk2_div->shift = SUN4I_A10_TCON_CH1_SCLK2_DIV_SHIFT;
> > + sclk2_div->width = SUN4I_A10_TCON_CH1_SCLK2_DIV_WIDTH;
> > + sclk2_div->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk2 = clk_register_composite(NULL, sclk2_name, sclk2_parents,
> > + SUN4I_A10_TCON_CH1_SCLK2_PARENTS,
> > + &sclk2_mux->hw, &clk_mux_ops, &
>
> > + sclk2_div->hw, &clk_divider_ops,
>
> Placement of the "&" is very weird.
Hmm, right. I don't know what happened here, but it's obviously wrong :)
>
> > + &sclk2_gate->hw, &clk_gate_ops,
> > + 0);
> > + if (IS_ERR(sclk2)) {
> > + pr_err("%s: Couldn't register the clock\n", sclk2_name);
> > + goto free_sclk2_div;
> > + }
> > +
> > + sclk1_div = kzalloc(sizeof(*sclk1_div), GFP_KERNEL);
> > + if (!sclk1_div)
> > + goto free_sclk2;
> > +
> > + sclk1_div->reg = reg;
> > + sclk1_div->shift = SUN4I_A10_TCON_CH1_SCLK1_DIV_SHIFT;
> > + sclk1_div->width = SUN4I_A10_TCON_CH1_SCLK1_DIV_WIDTH;
> > + sclk1_div->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk1_gate = kzalloc(sizeof(*sclk1_gate), GFP_KERNEL);
> > + if (!sclk1_gate)
> > + goto free_sclk1_mux;
> > +
> > + sclk1_gate->reg = reg;
> > + sclk1_gate->bit_idx = SUN4I_A10_TCON_CH1_SCLK1_GATE_BIT;
> > + sclk1_gate->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk1 = clk_register_composite(NULL, sclk1_name, &sclk2_name, 1,
> > + NULL, NULL,
> > + &sclk1_div->hw, &clk_divider_ops,
> > + &sclk1_gate->hw, &clk_gate_ops,
> > + 0);
> > + if (IS_ERR(sclk1)) {
> > + pr_err("%s: Couldn't register the clock\n", sclk1_name);
> > + goto free_sclk1_gate;
> > + }
> > +
> > + ret = of_clk_add_provider(node, of_clk_src_simple_get, sclk1);
> > + if (WARN_ON(ret))
> > + goto free_sclk1;
> > +
> > + return;
> > +
> > +free_sclk1:
> > + clk_unregister_composite(sclk1);
> > +free_sclk1_gate:
> > + kfree(sclk1_gate);
> > +free_sclk1_mux:
> > + kfree(sclk1_div);
> > +free_sclk2:
> > + clk_unregister(sclk2);
> > +free_sclk2_div:
> > + kfree(sclk2_div);
> > +free_sclk2_gate:
> > + kfree(sclk2_gate);
> > +free_sclk2_mux:
> > + kfree(sclk2_mux);
>
> Cleanup after of_io_request_and_map?
Indeed.
Thanks!
Maxime
--
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160203/a23789f0/attachment-0001.sig>
WARNING: multiple messages have this Message-ID (diff)
From: Maxime Ripard <maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
To: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>
Cc: Mike Turquette
<mturquette-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>,
Stephen Boyd <sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
David Airlie <airlied-cv59FeDIM0c@public.gmane.org>,
Thierry Reding
<thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Philipp Zabel <p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>,
devicetree <devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
linux-arm-kernel
<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>,
linux-kernel
<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
linux-clk <linux-clk-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
dri-devel
<dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org>,
linux-sunxi <linux-sunxi-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>,
Laurent Pinchart
<laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>,
Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
Alexander Kaplan <alex-MflLfwwFzuz+yO7R74ARew@public.gmane.org>,
Boris Brezillon
<boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>,
Wynter Woods <wynter-MflLfwwFzuz+yO7R74ARew@public.gmane.org>,
Thomas Petazzoni
<thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>,
Rob Clark <robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Daniel Vetter <daniel-/w4YWyX8dFk@public.gmane.org>
Subject: Re: [PATCH v2 07/26] clk: sunxi: Add TCON channel1 clock
Date: Wed, 3 Feb 2016 21:29:26 +0100 [thread overview]
Message-ID: <20160203202926.GE3327@lukather> (raw)
In-Reply-To: <CAGb2v65_jsmiQ6DNCznFuQCcWxqs1N2fYJ-8OiUJ_BR+jf314w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 8864 bytes --]
Hi,
On Sun, Jan 17, 2016 at 12:36:20AM +0800, Chen-Yu Tsai wrote:
> Hi,
>
> On Thu, Jan 14, 2016 at 11:24 PM, Maxime Ripard
> <maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> > The TCON is a controller generating the timings to output videos signals,
> > acting like both a CRTC and an encoder.
> >
> > It has two channels depending on the output, each channel being driven by
> > its own clock (and own clock controller).
> >
> > Add a driver for the channel 1 clock.
> >
> > Signed-off-by: Maxime Ripard <maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
> > ---
> > Documentation/devicetree/bindings/clock/sunxi.txt | 1 +
> > drivers/clk/sunxi/Makefile | 1 +
> > drivers/clk/sunxi/clk-sun4i-tcon-ch1.c | 154 ++++++++++++++++++++++
> > 3 files changed, 156 insertions(+)
> > create mode 100644 drivers/clk/sunxi/clk-sun4i-tcon-ch1.c
> >
> > diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt b/Documentation/devicetree/bindings/clock/sunxi.txt
> > index bb9fb78dcff8..fe34fc56e803 100644
> > --- a/Documentation/devicetree/bindings/clock/sunxi.txt
> > +++ b/Documentation/devicetree/bindings/clock/sunxi.txt
> > @@ -67,6 +67,7 @@ Required properties:
> > "allwinner,sun7i-a20-out-clk" - for the external output clocks
> > "allwinner,sun7i-a20-gmac-clk" - for the GMAC clock module on A20/A31
> > "allwinner,sun4i-a10-tcon-ch0-clk" - for the TCON channel 0 clock on the A10
> > + "allwinner,sun4i-a10-tcon-ch1-clk" - for the TCON channel 1 clock on the A10
> > "allwinner,sun4i-a10-usb-clk" - for usb gates + resets on A10 / A20
> > "allwinner,sun5i-a13-usb-clk" - for usb gates + resets on A13
> > "allwinner,sun6i-a31-usb-clk" - for usb gates + resets on A31
> > diff --git a/drivers/clk/sunxi/Makefile b/drivers/clk/sunxi/Makefile
> > index 40c32ffd912c..0a20873cd103 100644
> > --- a/drivers/clk/sunxi/Makefile
> > +++ b/drivers/clk/sunxi/Makefile
> > @@ -12,6 +12,7 @@ obj-y += clk-mod0.o
> > obj-y += clk-simple-gates.o
> > obj-y += clk-sun4i-display.o
> > obj-y += clk-sun4i-pll3.o
> > +obj-y += clk-sun4i-tcon-ch1.o
> > obj-y += clk-sun8i-mbus.o
> > obj-y += clk-sun9i-core.o
> > obj-y += clk-sun9i-mmc.o
> > diff --git a/drivers/clk/sunxi/clk-sun4i-tcon-ch1.c b/drivers/clk/sunxi/clk-sun4i-tcon-ch1.c
> > new file mode 100644
> > index 000000000000..51ddc38821f7
> > --- /dev/null
> > +++ b/drivers/clk/sunxi/clk-sun4i-tcon-ch1.c
> > @@ -0,0 +1,154 @@
> > +/*
> > + * Copyright 2015 Maxime Ripard
> > + *
> > + * Maxime Ripard <maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
> > + *
> > + * 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/of.h>
> > +#include <linux/of_address.h>
> > +#include <linux/slab.h>
> > +#include <linux/spinlock.h>
> > +
> > +#define SUN4I_TCON_CH1_SCLK_NAME_LEN 32
> > +
> > +#define SUN4I_A10_TCON_CH1_SCLK2_PARENTS 4
> > +
> > +#define SUN4I_A10_TCON_CH1_SCLK2_GATE_BIT 31
> > +#define SUN4I_A10_TCON_CH1_SCLK2_MUX_MASK 3
> > +#define SUN4I_A10_TCON_CH1_SCLK2_MUX_SHIFT 24
> > +#define SUN4I_A10_TCON_CH1_SCLK2_DIV_WIDTH 4
> > +#define SUN4I_A10_TCON_CH1_SCLK2_DIV_SHIFT 0
> > +
> > +#define SUN4I_A10_TCON_CH1_SCLK1_GATE_BIT 15
> > +#define SUN4I_A10_TCON_CH1_SCLK1_DIV_WIDTH 1
> > +#define SUN4I_A10_TCON_CH1_SCLK1_DIV_SHIFT 11
> > +
> > +static DEFINE_SPINLOCK(sun4i_a10_tcon_ch1_lock);
> > +
> > +static void __init sun4i_a10_tcon_ch1_setup(struct device_node *node)
> > +{
> > + const char *sclk2_parents[SUN4I_A10_TCON_CH1_SCLK2_PARENTS];
> > + const char *sclk1_name = node->name;
> > + const char *sclk2_name;
> > + struct clk_divider *sclk1_div, *sclk2_div;
> > + struct clk_gate *sclk1_gate, *sclk2_gate;
> > + struct clk_mux *sclk2_mux;
> > + struct clk *sclk1, *sclk2;
> > + void __iomem *reg;
> > + int i, ret;
> > +
> > + of_property_read_string(node, "clock-output-names",
> > + &sclk1_name);
> > +
> > + sclk2_name = kasprintf(GFP_KERNEL, "%s2", sclk1_name);
> > + if (!sclk2_name)
> > + return;
> > +
> > + reg = of_io_request_and_map(node, 0, of_node_full_name(node));
> > + if (IS_ERR(reg)) {
> > + pr_err("%s: Could not map the clock registers\n", sclk2_name);
> > + return;
> > + }
> > +
> > + for (i = 0; i < SUN4I_A10_TCON_CH1_SCLK2_PARENTS; i++)
> > + sclk2_parents[i] = of_clk_get_parent_name(node, i);
>
> of_clk_parent_fill?
Indeed
>
> > +
> > + sclk2_mux = kzalloc(sizeof(*sclk2_mux), GFP_KERNEL);
> > + if (!sclk2_mux)
> > + return;
> > +
> > + sclk2_mux->reg = reg;
> > + sclk2_mux->shift = SUN4I_A10_TCON_CH1_SCLK2_MUX_SHIFT;
> > + sclk2_mux->mask = SUN4I_A10_TCON_CH1_SCLK2_MUX_MASK;
> > + sclk2_mux->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk2_gate = kzalloc(sizeof(*sclk2_gate), GFP_KERNEL);
> > + if (!sclk2_gate)
> > + goto free_sclk2_mux;
> > +
> > + sclk2_gate->reg = reg;
> > + sclk2_gate->bit_idx = SUN4I_A10_TCON_CH1_SCLK2_GATE_BIT;
> > + sclk2_gate->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk2_div = kzalloc(sizeof(*sclk2_div), GFP_KERNEL);
> > + if (!sclk2_div)
> > + goto free_sclk2_gate;
> > +
> > + sclk2_div->reg = reg;
> > + sclk2_div->shift = SUN4I_A10_TCON_CH1_SCLK2_DIV_SHIFT;
> > + sclk2_div->width = SUN4I_A10_TCON_CH1_SCLK2_DIV_WIDTH;
> > + sclk2_div->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk2 = clk_register_composite(NULL, sclk2_name, sclk2_parents,
> > + SUN4I_A10_TCON_CH1_SCLK2_PARENTS,
> > + &sclk2_mux->hw, &clk_mux_ops, &
>
> > + sclk2_div->hw, &clk_divider_ops,
>
> Placement of the "&" is very weird.
Hmm, right. I don't know what happened here, but it's obviously wrong :)
>
> > + &sclk2_gate->hw, &clk_gate_ops,
> > + 0);
> > + if (IS_ERR(sclk2)) {
> > + pr_err("%s: Couldn't register the clock\n", sclk2_name);
> > + goto free_sclk2_div;
> > + }
> > +
> > + sclk1_div = kzalloc(sizeof(*sclk1_div), GFP_KERNEL);
> > + if (!sclk1_div)
> > + goto free_sclk2;
> > +
> > + sclk1_div->reg = reg;
> > + sclk1_div->shift = SUN4I_A10_TCON_CH1_SCLK1_DIV_SHIFT;
> > + sclk1_div->width = SUN4I_A10_TCON_CH1_SCLK1_DIV_WIDTH;
> > + sclk1_div->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk1_gate = kzalloc(sizeof(*sclk1_gate), GFP_KERNEL);
> > + if (!sclk1_gate)
> > + goto free_sclk1_mux;
> > +
> > + sclk1_gate->reg = reg;
> > + sclk1_gate->bit_idx = SUN4I_A10_TCON_CH1_SCLK1_GATE_BIT;
> > + sclk1_gate->lock = &sun4i_a10_tcon_ch1_lock;
> > +
> > + sclk1 = clk_register_composite(NULL, sclk1_name, &sclk2_name, 1,
> > + NULL, NULL,
> > + &sclk1_div->hw, &clk_divider_ops,
> > + &sclk1_gate->hw, &clk_gate_ops,
> > + 0);
> > + if (IS_ERR(sclk1)) {
> > + pr_err("%s: Couldn't register the clock\n", sclk1_name);
> > + goto free_sclk1_gate;
> > + }
> > +
> > + ret = of_clk_add_provider(node, of_clk_src_simple_get, sclk1);
> > + if (WARN_ON(ret))
> > + goto free_sclk1;
> > +
> > + return;
> > +
> > +free_sclk1:
> > + clk_unregister_composite(sclk1);
> > +free_sclk1_gate:
> > + kfree(sclk1_gate);
> > +free_sclk1_mux:
> > + kfree(sclk1_div);
> > +free_sclk2:
> > + clk_unregister(sclk2);
> > +free_sclk2_div:
> > + kfree(sclk2_div);
> > +free_sclk2_gate:
> > + kfree(sclk2_gate);
> > +free_sclk2_mux:
> > + kfree(sclk2_mux);
>
> Cleanup after of_io_request_and_map?
Indeed.
Thanks!
Maxime
--
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
next prev parent reply other threads:[~2016-02-03 20:29 UTC|newest]
Thread overview: 196+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-14 15:24 [PATCH v2 00/26] drm: Add Allwinner A10 display engine support Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` [PATCH v2 01/26] reset: Move DT cell size check to the core Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-15 15:50 ` Philipp Zabel
2016-01-15 15:50 ` Philipp Zabel
2016-01-15 15:50 ` Philipp Zabel
2016-01-14 15:24 ` [PATCH v2 02/26] reset: Make reset_control_ops const Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-15 15:50 ` Philipp Zabel
2016-01-15 15:50 ` Philipp Zabel
2016-01-15 15:50 ` Philipp Zabel
2016-01-14 15:24 ` [PATCH v2 03/26] clk: Add regmap support Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-28 7:56 ` Stephen Boyd
2016-01-28 7:56 ` Stephen Boyd
2016-01-28 7:56 ` Stephen Boyd
2016-01-14 15:24 ` [PATCH v2 04/26] clk: composite: Add unregister function Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` [PATCH v2 05/26] clk: sunxi: Add display and TCON0 clocks driver Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-15 3:01 ` Rob Herring
2016-01-15 3:01 ` Rob Herring
2016-01-15 3:01 ` Rob Herring
2016-01-16 14:08 ` [linux-sunxi] " Priit Laes
2016-01-16 14:08 ` Priit Laes
2016-01-16 14:08 ` [linux-sunxi] " Priit Laes
2016-01-16 15:29 ` Chen-Yu Tsai
2016-01-16 15:29 ` Chen-Yu Tsai
2016-01-16 15:29 ` Chen-Yu Tsai
2016-02-03 20:18 ` Maxime Ripard
2016-02-03 20:18 ` Maxime Ripard
2016-02-03 20:18 ` Maxime Ripard
2016-01-14 15:24 ` [PATCH v2 06/26] clk: sunxi: Add PLL3 clock Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-15 3:02 ` Rob Herring
2016-01-15 3:02 ` Rob Herring
2016-01-15 3:02 ` Rob Herring
2016-01-16 16:05 ` Chen-Yu Tsai
2016-01-16 16:05 ` Chen-Yu Tsai
2016-01-16 16:05 ` Chen-Yu Tsai
2016-02-03 20:27 ` Maxime Ripard
2016-02-03 20:27 ` Maxime Ripard
2016-02-03 20:27 ` Maxime Ripard
2016-01-14 15:24 ` [PATCH v2 07/26] clk: sunxi: Add TCON channel1 clock Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-15 3:03 ` Rob Herring
2016-01-15 3:03 ` Rob Herring
2016-01-15 3:03 ` Rob Herring
2016-01-16 16:36 ` Chen-Yu Tsai
2016-01-16 16:36 ` Chen-Yu Tsai
2016-01-16 16:36 ` Chen-Yu Tsai
2016-02-03 20:29 ` Maxime Ripard [this message]
2016-02-03 20:29 ` Maxime Ripard
2016-02-03 20:29 ` Maxime Ripard
2016-01-14 15:24 ` [PATCH v2 08/26] clk: sun5i: add DRAM gates Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-15 3:04 ` Rob Herring
2016-01-15 3:04 ` Rob Herring
2016-01-15 3:04 ` Rob Herring
2016-01-14 15:24 ` [PATCH v2 09/26] ARM: sun5i: dt: Add pll3 and pll7 clocks Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` [PATCH v2 10/26] ARM: sun5i: a13: Add display and TCON clocks Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-16 17:06 ` Chen-Yu Tsai
2016-01-16 17:06 ` Chen-Yu Tsai
2016-01-16 17:06 ` Chen-Yu Tsai
2016-02-03 20:31 ` Maxime Ripard
2016-02-03 20:31 ` Maxime Ripard
2016-02-05 9:49 ` Chen-Yu Tsai
2016-02-05 9:49 ` Chen-Yu Tsai
2016-02-05 9:49 ` Chen-Yu Tsai
2016-01-14 15:24 ` [PATCH v2 11/26] ARM: sun5i: Add DRAM gates Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-16 17:10 ` Chen-Yu Tsai
2016-01-16 17:10 ` Chen-Yu Tsai
2016-01-16 17:10 ` Chen-Yu Tsai
2016-02-03 20:36 ` Maxime Ripard
2016-02-03 20:36 ` Maxime Ripard
2016-01-14 15:24 ` [PATCH v2 12/26] ARM: sun5i: Add TV encoder gate to the DTSI Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-16 17:12 ` Chen-Yu Tsai
2016-01-16 17:12 ` Chen-Yu Tsai
2016-01-16 17:12 ` Chen-Yu Tsai
2016-01-14 15:24 ` [PATCH v2 13/26] drm/fb_cma_helper: Remove implicit call to disable_unused_functions Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 23:13 ` Laurent Pinchart
2016-01-14 23:13 ` Laurent Pinchart
2016-01-14 23:13 ` Laurent Pinchart
2016-01-15 10:17 ` Daniel Vetter
2016-01-15 10:17 ` Daniel Vetter
2016-01-15 10:17 ` Daniel Vetter
2016-01-24 22:19 ` Laurent Pinchart
2016-01-24 22:19 ` Laurent Pinchart
2016-01-25 7:29 ` Daniel Vetter
2016-01-25 7:29 ` Daniel Vetter
2016-01-25 7:29 ` Daniel Vetter
2016-01-25 19:02 ` Laurent Pinchart
2016-01-25 19:02 ` Laurent Pinchart
2016-01-25 19:02 ` Laurent Pinchart
2016-01-25 19:02 ` Laurent Pinchart
2016-01-25 19:02 ` Laurent Pinchart
2016-01-25 19:02 ` Laurent Pinchart
[not found] ` <20160125072938.GI11240-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
2016-01-25 19:02 ` Laurent Pinchart
2016-01-24 22:19 ` Laurent Pinchart
2016-01-24 22:19 ` Laurent Pinchart
[not found] ` <20160115101730.GH19130-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
2016-01-24 22:19 ` Laurent Pinchart
2016-01-24 22:19 ` Laurent Pinchart
2016-01-24 22:19 ` Laurent Pinchart
2016-01-14 15:24 ` [PATCH v2 14/26] drm/modes: Rewrite the command line parser Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` [PATCH v2 15/26] drm/modes: Support modes names on the command line Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` [PATCH v2 16/26] drm: Add Allwinner A10 Display Engine support Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-14 15:24 ` Maxime Ripard
2016-01-16 15:11 ` [linux-sunxi] " Priit Laes
2016-01-16 15:11 ` Priit Laes
2016-01-16 15:11 ` [linux-sunxi] " Priit Laes
2016-01-17 12:58 ` Priit Laes
2016-01-17 12:58 ` Priit Laes
2016-01-17 12:58 ` Priit Laes
2016-01-19 15:38 ` Maxime Ripard
2016-01-19 15:38 ` Maxime Ripard
2016-01-14 15:25 ` [PATCH v2 17/26] drm: sun4i: Add DT bindings documentation Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-15 3:15 ` Rob Herring
2016-01-15 3:15 ` Rob Herring
2016-01-15 3:15 ` Rob Herring
2016-02-03 19:59 ` Maxime Ripard
2016-02-03 19:59 ` Maxime Ripard
2016-02-03 19:59 ` Maxime Ripard
2016-02-03 20:19 ` Rob Herring
2016-02-03 20:19 ` Rob Herring
2016-02-03 20:19 ` Rob Herring
2016-02-03 20:47 ` Maxime Ripard
2016-02-03 20:47 ` Maxime Ripard
2016-02-03 20:47 ` Maxime Ripard
2016-01-14 15:25 ` [PATCH v2 18/26] drm: sun4i: Add RGB output Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` [PATCH v2 19/26] drm: sun4i: Add composite output Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` [PATCH v2 20/26] drm: sun4i: tv: Add PAL output standard Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` [PATCH v2 21/26] drm: sun4i: tv: Add NTSC " Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` [PATCH v2 22/26] ARM: sun5i: r8: Add display blocks to the DTSI Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` [PATCH v2 23/26] ARM: sun5i: chip: Enable the TV Encoder Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` [PATCH v2 24/26] devicetree: Add olimex vendor prefix Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-15 3:15 ` Rob Herring
2016-01-15 3:15 ` Rob Herring
2016-01-15 3:15 ` Rob Herring
2016-01-15 6:41 ` Stefan Wahren
2016-01-15 6:41 ` Stefan Wahren
2016-01-15 8:05 ` Maxime Ripard
2016-01-15 8:05 ` Maxime Ripard
2016-01-15 8:05 ` Maxime Ripard
2016-01-14 15:25 ` [PATCH v2 25/26] drm/panel: simple: Add timings for the Olimex LCD-OLinuXino-4.3TS Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-15 3:17 ` Rob Herring
2016-01-15 3:17 ` Rob Herring
2016-01-15 3:17 ` Rob Herring
2016-01-14 15:25 ` [PATCH v2 26/26] DO NOT MERGE: ARM: sun5i: chip: Enable the LCD panel Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-01-14 15:25 ` Maxime Ripard
2016-02-20 13:45 ` [linux-sunxi] [PATCH v2 00/26] drm: Add Allwinner A10 display engine support Priit Laes
2016-02-20 13:45 ` Priit Laes
2016-02-20 13:45 ` [linux-sunxi] " Priit Laes
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=20160203202926.GE3327@lukather \
--to=maxime.ripard@free-electrons.com \
--cc=airlied@linux.ie \
--cc=alex@nextthing.co \
--cc=boris.brezillon@free-electrons.com \
--cc=daniel@ffwll.ch \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=hdegoede@redhat.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sunxi@googlegroups.com \
--cc=mturquette@baylibre.com \
--cc=p.zabel@pengutronix.de \
--cc=robdclark@gmail.com \
--cc=sboyd@codeaurora.org \
--cc=thierry.reding@gmail.com \
--cc=thomas.petazzoni@free-electrons.com \
--cc=wens@csie.org \
--cc=wynter@nextthing.co \
/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.