All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vishnu Patekar <vishnupatekar0510-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Maxime Ripard
	<maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Cc: "robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org"
	<robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	Jonathan Corbet <corbet-T1hC0tSOHrs@public.gmane.org>,
	"pawel.moll-5wv7dgnIgG8@public.gmane.org"
	<pawel.moll-5wv7dgnIgG8@public.gmane.org>,
	"mark.rutland-5wv7dgnIgG8@public.gmane.org"
	<mark.rutland-5wv7dgnIgG8@public.gmane.org>,
	"ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org"
	<ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org>,
	Kumar Gala <galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
	"linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org"
	<linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>,
	Emilio Lopez <emilio-0Z03zUJReD5OxF6Tv1QG9Q@public.gmane.org>,
	Jens Kuske <jenskuske-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>,
	"devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	"linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org"
	<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>,
	"linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	"linux-sunxi-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org"
	<linux-sunxi-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>,
	linux-gpio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	Linus Walleij
	<linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	Michael Turquette
	<mturquette-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>,
	Stephen Boyd <sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
	Rein
Subject: Re: [PATCH v4 02/13] clk: sunxi: add ahb1 clock for A83T
Date: Sat, 16 Apr 2016 23:59:40 +0800	[thread overview]
Message-ID: <CAEzqOZs44zZiu9e2Uae7ovT0=-o2rOCX+g2pJ6D0Rej2J2D3Ww@mail.gmail.com> (raw)
In-Reply-To: <20160414172838.GS4005@lukather>

Hello Maxime,

On Fri, Apr 15, 2016 at 1:28 AM, Maxime Ripard
<maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> On Mon, Apr 04, 2016 at 11:07:29AM +0800, Vishnu Patekar wrote:
>> Hello Maxime,
>>
>> On Thu, Mar 17, 2016 at 6:40 PM, Maxime Ripard
>> <maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
>> > On Thu, Mar 17, 2016 at 12:04:25AM +0800, Vishnu Patekar wrote:
>> >> AHB1 on A83T is similar to ahb1 on A31, except parents are different.
>> >> clock index 0b1x is PLL6.
>> >>
>> >> Signed-off-by: Vishnu Patekar <vishnupatekar0510-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
>> >> Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>
>> >> Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
>> >> ---
>> >>  Documentation/devicetree/bindings/clock/sunxi.txt |  1 +
>> >>  drivers/clk/sunxi/clk-sunxi.c                     | 76 +++++++++++++++++++++++
>> >>  2 files changed, 77 insertions(+)
>> >>
>> >> diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt b/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> index 834436f..cba9fe55 100644
>> >> --- a/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> +++ b/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> @@ -30,6 +30,7 @@ Required properties:
>> >>       "allwinner,sun6i-a31-ar100-clk" - for the AR100 on A31
>> >>       "allwinner,sun9i-a80-cpus-clk" - for the CPUS on A80
>> >>       "allwinner,sun6i-a31-ahb1-clk" - for the AHB1 clock on A31
>> >> +     "allwinner,sun8i-a83t-ahb1-clk" - for the AHB1 clock on A83T
>> >>       "allwinner,sun8i-h3-ahb2-clk" - for the AHB2 clock on H3
>> >>       "allwinner,sun6i-a31-ahb1-gates-clk" - for the AHB1 gates on A31
>> >>       "allwinner,sun8i-a23-ahb1-gates-clk" - for the AHB1 gates on A23
>> >> diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
>> >> index 91de0a0..a7aab65 100644
>> >> --- a/drivers/clk/sunxi/clk-sunxi.c
>> >> +++ b/drivers/clk/sunxi/clk-sunxi.c
>> >> @@ -344,6 +344,67 @@ static void sun6i_ahb1_recalc(struct factors_request *req)
>> >>       req->rate >>= req->p;
>> >>  }
>> >>
>> >> +#define SUN8I_A83T_AHB1_PARENT_PLL6  2
>> >> +/**
>> >> + * sun8i_a83t_get_ahb_factors() - calculates m, p factors for AHB
>> >> + * AHB rate is calculated as follows
>> >> + * rate = parent_rate >> p
>> >> + *
>> >> + * if parent is pll6, then
>> >> + * parent_rate = pll6 rate / (m + 1)
>> >> + */
>> >> +
>> >> +static void sun8i_a83t_get_ahb1_factors(struct factors_request *req)
>> >> +{
>> >> +     u8 div, calcp, calcm = 1;
>> >> +
>> >> +     /*
>> >> +      * clock can only divide, so we will never be able to achieve
>> >> +      * frequencies higher than the parent frequency
>> >> +      */
>> >> +     if (req->parent_rate && req->rate > req->parent_rate)
>> >> +             req->rate = req->parent_rate;
>> >> +
>> >> +     div = DIV_ROUND_UP(req->parent_rate, req->rate);
>> >> +
>> >> +     /* calculate pre-divider if parent is pll6 */
>> >> +     if (req->parent_index >= SUN8I_A83T_AHB1_PARENT_PLL6) {
>> >> +             if (div < 4)
>> >> +                     calcp = 0;
>> >> +             else if (div / 2 < 4)
>> >> +                     calcp = 1;
>> >> +             else if (div / 4 < 4)
>> >> +                     calcp = 2;
>> >> +             else
>> >> +                     calcp = 3;
>> >> +
>> >> +             calcm = DIV_ROUND_UP(div, 1 << calcp);
>> >> +     } else {
>> >> +             calcp = __roundup_pow_of_two(div);
>> >> +             calcp = calcp > 3 ? 3 : calcp;
>> >> +     }
>> >> +
>> >> +     req->rate = (req->parent_rate / calcm) >> calcp;
>> >> +     req->p = calcp;
>> >> +     req->m = calcm - 1;
>> >> +}
>> >> +
>> >> +/**
>> >> +* sun8i_a83t_ahb1_recalc() - calculates AHB clock rate from m, p factors and
>> >> +*                     parent index
>> >> +*/
>> >> +static void sun8i_a83t_ahb1_recalc(struct factors_request *req)
>> >> +{
>> >> +     req->rate = req->parent_rate;
>> >> +
>> >> +/* apply pre-divider first if parent is pll6 */
>> >
>> > The comment indentation is wrong
>> >
>> >> +     if (req->parent_index >= SUN6I_AHB1_PARENT_PLL6)
>> >
>> > And this is not the right define you're using.
>> >
>> > I still believe that duplicating the same logic just because of
>> > different dividers is not the way to go.
>> >
>> > You could solve that easily by adding a table for the muxes, and
>> > associate it with parents and dividers, that you could store in
>> > clk_factors.
>>
>> I've similar solution (please ignore a83 specific functions those will
>> be common for a31 and a83t).
>> https://github.com/vishnupatekar/linux/commit/f7de5b48d886a672b1f6db112fbfd5d2c9849afa
>>
>> is it aligned to what you're saying?
>
> Yep. I'd even go a step further, and allow to have directly the core
> deal with the pre-divider.
>
> I guess in your prediv table you could have the index, and either the
> offset and width of the divider (if it's a variable one), or its fixed
> value.
That's good idea, index with shift and width will do as prediv can be variable.
>
> The generic function would then be able to deal with the rate
> adjustments, and you wouldn't need to be able to have anything related
> to the parent index in the clock specific functions anymore.
>
> Does that make sense?
Adjusting rate in generic clk_factors_recalc_rate, with prediv shift
and width is straight forward, and we can remove recalc function
itself, currently it's used only for a31 ahb1.

I'm doubtful about getter, In sun6i_get_ahb1_factors we still need to
pass req->prediv_width instead of req->parent_index.

I'll send separate patch for this prediv handling.
>
> Maxime
>
> --
> Maxime Ripard, Free Electrons
> Embedded Linux, Kernel and Android engineering
> http://free-electrons.com

WARNING: multiple messages have this Message-ID (diff)
From: Vishnu Patekar <vishnupatekar0510@gmail.com>
To: Maxime Ripard <maxime.ripard@free-electrons.com>
Cc: "robh+dt@kernel.org" <robh+dt@kernel.org>,
	Jonathan Corbet <corbet@lwn.net>,
	"pawel.moll@arm.com" <pawel.moll@arm.com>,
	"mark.rutland@arm.com" <mark.rutland@arm.com>,
	"ijc+devicetree@hellion.org.uk" <ijc+devicetree@hellion.org.uk>,
	Kumar Gala <galak@codeaurora.org>,
	"linux@arm.linux.org.uk" <linux@arm.linux.org.uk>,
	Emilio Lopez <emilio@elopez.com.ar>,
	Jens Kuske <jenskuske@gmail.com>,
	Hans de Goede <hdegoede@redhat.com>, Chen-Yu Tsai <wens@csie.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-sunxi@googlegroups.com" <linux-sunxi@googlegroups.com>,
	linux-gpio@vger.kernel.org,
	Linus Walleij <linus.walleij@linaro.org>,
	Michael Turquette <mturquette@baylibre.com>,
	Stephen Boyd <sboyd@codeaurora.org>,
	Reinder de Haan <patchesrdh@mveas.com>,
	linux-clk <linux-clk@vger.kernel.org>
Subject: Re: [PATCH v4 02/13] clk: sunxi: add ahb1 clock for A83T
Date: Sat, 16 Apr 2016 23:59:40 +0800	[thread overview]
Message-ID: <CAEzqOZs44zZiu9e2Uae7ovT0=-o2rOCX+g2pJ6D0Rej2J2D3Ww@mail.gmail.com> (raw)
In-Reply-To: <20160414172838.GS4005@lukather>

Hello Maxime,

On Fri, Apr 15, 2016 at 1:28 AM, Maxime Ripard
<maxime.ripard@free-electrons.com> wrote:
> On Mon, Apr 04, 2016 at 11:07:29AM +0800, Vishnu Patekar wrote:
>> Hello Maxime,
>>
>> On Thu, Mar 17, 2016 at 6:40 PM, Maxime Ripard
>> <maxime.ripard@free-electrons.com> wrote:
>> > On Thu, Mar 17, 2016 at 12:04:25AM +0800, Vishnu Patekar wrote:
>> >> AHB1 on A83T is similar to ahb1 on A31, except parents are different.
>> >> clock index 0b1x is PLL6.
>> >>
>> >> Signed-off-by: Vishnu Patekar <vishnupatekar0510@gmail.com>
>> >> Acked-by: Chen-Yu Tsai <wens@csie.org>
>> >> Acked-by: Rob Herring <robh@kernel.org>
>> >> ---
>> >>  Documentation/devicetree/bindings/clock/sunxi.txt |  1 +
>> >>  drivers/clk/sunxi/clk-sunxi.c                     | 76 +++++++++++++++++++++++
>> >>  2 files changed, 77 insertions(+)
>> >>
>> >> diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt b/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> index 834436f..cba9fe55 100644
>> >> --- a/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> +++ b/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> @@ -30,6 +30,7 @@ Required properties:
>> >>       "allwinner,sun6i-a31-ar100-clk" - for the AR100 on A31
>> >>       "allwinner,sun9i-a80-cpus-clk" - for the CPUS on A80
>> >>       "allwinner,sun6i-a31-ahb1-clk" - for the AHB1 clock on A31
>> >> +     "allwinner,sun8i-a83t-ahb1-clk" - for the AHB1 clock on A83T
>> >>       "allwinner,sun8i-h3-ahb2-clk" - for the AHB2 clock on H3
>> >>       "allwinner,sun6i-a31-ahb1-gates-clk" - for the AHB1 gates on A31
>> >>       "allwinner,sun8i-a23-ahb1-gates-clk" - for the AHB1 gates on A23
>> >> diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
>> >> index 91de0a0..a7aab65 100644
>> >> --- a/drivers/clk/sunxi/clk-sunxi.c
>> >> +++ b/drivers/clk/sunxi/clk-sunxi.c
>> >> @@ -344,6 +344,67 @@ static void sun6i_ahb1_recalc(struct factors_request *req)
>> >>       req->rate >>= req->p;
>> >>  }
>> >>
>> >> +#define SUN8I_A83T_AHB1_PARENT_PLL6  2
>> >> +/**
>> >> + * sun8i_a83t_get_ahb_factors() - calculates m, p factors for AHB
>> >> + * AHB rate is calculated as follows
>> >> + * rate = parent_rate >> p
>> >> + *
>> >> + * if parent is pll6, then
>> >> + * parent_rate = pll6 rate / (m + 1)
>> >> + */
>> >> +
>> >> +static void sun8i_a83t_get_ahb1_factors(struct factors_request *req)
>> >> +{
>> >> +     u8 div, calcp, calcm = 1;
>> >> +
>> >> +     /*
>> >> +      * clock can only divide, so we will never be able to achieve
>> >> +      * frequencies higher than the parent frequency
>> >> +      */
>> >> +     if (req->parent_rate && req->rate > req->parent_rate)
>> >> +             req->rate = req->parent_rate;
>> >> +
>> >> +     div = DIV_ROUND_UP(req->parent_rate, req->rate);
>> >> +
>> >> +     /* calculate pre-divider if parent is pll6 */
>> >> +     if (req->parent_index >= SUN8I_A83T_AHB1_PARENT_PLL6) {
>> >> +             if (div < 4)
>> >> +                     calcp = 0;
>> >> +             else if (div / 2 < 4)
>> >> +                     calcp = 1;
>> >> +             else if (div / 4 < 4)
>> >> +                     calcp = 2;
>> >> +             else
>> >> +                     calcp = 3;
>> >> +
>> >> +             calcm = DIV_ROUND_UP(div, 1 << calcp);
>> >> +     } else {
>> >> +             calcp = __roundup_pow_of_two(div);
>> >> +             calcp = calcp > 3 ? 3 : calcp;
>> >> +     }
>> >> +
>> >> +     req->rate = (req->parent_rate / calcm) >> calcp;
>> >> +     req->p = calcp;
>> >> +     req->m = calcm - 1;
>> >> +}
>> >> +
>> >> +/**
>> >> +* sun8i_a83t_ahb1_recalc() - calculates AHB clock rate from m, p factors and
>> >> +*                     parent index
>> >> +*/
>> >> +static void sun8i_a83t_ahb1_recalc(struct factors_request *req)
>> >> +{
>> >> +     req->rate = req->parent_rate;
>> >> +
>> >> +/* apply pre-divider first if parent is pll6 */
>> >
>> > The comment indentation is wrong
>> >
>> >> +     if (req->parent_index >= SUN6I_AHB1_PARENT_PLL6)
>> >
>> > And this is not the right define you're using.
>> >
>> > I still believe that duplicating the same logic just because of
>> > different dividers is not the way to go.
>> >
>> > You could solve that easily by adding a table for the muxes, and
>> > associate it with parents and dividers, that you could store in
>> > clk_factors.
>>
>> I've similar solution (please ignore a83 specific functions those will
>> be common for a31 and a83t).
>> https://github.com/vishnupatekar/linux/commit/f7de5b48d886a672b1f6db112fbfd5d2c9849afa
>>
>> is it aligned to what you're saying?
>
> Yep. I'd even go a step further, and allow to have directly the core
> deal with the pre-divider.
>
> I guess in your prediv table you could have the index, and either the
> offset and width of the divider (if it's a variable one), or its fixed
> value.
That's good idea, index with shift and width will do as prediv can be variable.
>
> The generic function would then be able to deal with the rate
> adjustments, and you wouldn't need to be able to have anything related
> to the parent index in the clock specific functions anymore.
>
> Does that make sense?
Adjusting rate in generic clk_factors_recalc_rate, with prediv shift
and width is straight forward, and we can remove recalc function
itself, currently it's used only for a31 ahb1.

I'm doubtful about getter, In sun6i_get_ahb1_factors we still need to
pass req->prediv_width instead of req->parent_index.

I'll send separate patch for this prediv handling.
>
> Maxime
>
> --
> Maxime Ripard, Free Electrons
> Embedded Linux, Kernel and Android engineering
> http://free-electrons.com

WARNING: multiple messages have this Message-ID (diff)
From: Vishnu Patekar <vishnupatekar0510@gmail.com>
To: Maxime Ripard <maxime.ripard@free-electrons.com>
Cc: "robh+dt@kernel.org" <robh+dt@kernel.org>,
	Jonathan Corbet <corbet@lwn.net>,
	"pawel.moll@arm.com" <pawel.moll@arm.com>,
	"mark.rutland@arm.com" <mark.rutland@arm.com>,
	"ijc+devicetree@hellion.org.uk" <ijc+devicetree@hellion.org.uk>,
	Kumar Gala <galak@codeaurora.org>,
	"linux@arm.linux.org.uk" <linux@arm.linux.org.uk>,
	Emilio Lopez <emilio@elopez.com.ar>,
	Jens Kuske <jenskuske@gmail.com>,
	Hans de Goede <hdegoede@redhat.com>, Chen-Yu Tsai <wens@csie.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-sunxi@googlegroups.com" <linux-sunxi@googlegroups.com>,
	linux-gpio@vger.kernel.org,
	Linus Walleij <linus.walleij@linaro.org>,
	Michael Turquette <mturquette@baylibre.com>,
	Stephen Boyd <sboyd@codeaurora.org>,
	Reinder de Haan <patchesrdh@mveas.com>,
	linux-clk <linux-clk@vger.kernel.org>
Subject: Re: [PATCH v4 02/13] clk: sunxi: add ahb1 clock for A83T
Date: Sat, 16 Apr 2016 23:59:40 +0800	[thread overview]
Message-ID: <CAEzqOZs44zZiu9e2Uae7ovT0=-o2rOCX+g2pJ6D0Rej2J2D3Ww@mail.gmail.com> (raw)
In-Reply-To: <20160414172838.GS4005@lukather>

Hello Maxime,

On Fri, Apr 15, 2016 at 1:28 AM, Maxime Ripard
<maxime.ripard@free-electrons.com> wrote:
> On Mon, Apr 04, 2016 at 11:07:29AM +0800, Vishnu Patekar wrote:
>> Hello Maxime,
>>
>> On Thu, Mar 17, 2016 at 6:40 PM, Maxime Ripard
>> <maxime.ripard@free-electrons.com> wrote:
>> > On Thu, Mar 17, 2016 at 12:04:25AM +0800, Vishnu Patekar wrote:
>> >> AHB1 on A83T is similar to ahb1 on A31, except parents are different.
>> >> clock index 0b1x is PLL6.
>> >>
>> >> Signed-off-by: Vishnu Patekar <vishnupatekar0510@gmail.com>
>> >> Acked-by: Chen-Yu Tsai <wens@csie.org>
>> >> Acked-by: Rob Herring <robh@kernel.org>
>> >> ---
>> >>  Documentation/devicetree/bindings/clock/sunxi.txt |  1 +
>> >>  drivers/clk/sunxi/clk-sunxi.c                     | 76 +++++++++++++++++++++++
>> >>  2 files changed, 77 insertions(+)
>> >>
>> >> diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt b/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> index 834436f..cba9fe55 100644
>> >> --- a/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> +++ b/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> @@ -30,6 +30,7 @@ Required properties:
>> >>       "allwinner,sun6i-a31-ar100-clk" - for the AR100 on A31
>> >>       "allwinner,sun9i-a80-cpus-clk" - for the CPUS on A80
>> >>       "allwinner,sun6i-a31-ahb1-clk" - for the AHB1 clock on A31
>> >> +     "allwinner,sun8i-a83t-ahb1-clk" - for the AHB1 clock on A83T
>> >>       "allwinner,sun8i-h3-ahb2-clk" - for the AHB2 clock on H3
>> >>       "allwinner,sun6i-a31-ahb1-gates-clk" - for the AHB1 gates on A31
>> >>       "allwinner,sun8i-a23-ahb1-gates-clk" - for the AHB1 gates on A23
>> >> diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
>> >> index 91de0a0..a7aab65 100644
>> >> --- a/drivers/clk/sunxi/clk-sunxi.c
>> >> +++ b/drivers/clk/sunxi/clk-sunxi.c
>> >> @@ -344,6 +344,67 @@ static void sun6i_ahb1_recalc(struct factors_request *req)
>> >>       req->rate >>= req->p;
>> >>  }
>> >>
>> >> +#define SUN8I_A83T_AHB1_PARENT_PLL6  2
>> >> +/**
>> >> + * sun8i_a83t_get_ahb_factors() - calculates m, p factors for AHB
>> >> + * AHB rate is calculated as follows
>> >> + * rate = parent_rate >> p
>> >> + *
>> >> + * if parent is pll6, then
>> >> + * parent_rate = pll6 rate / (m + 1)
>> >> + */
>> >> +
>> >> +static void sun8i_a83t_get_ahb1_factors(struct factors_request *req)
>> >> +{
>> >> +     u8 div, calcp, calcm = 1;
>> >> +
>> >> +     /*
>> >> +      * clock can only divide, so we will never be able to achieve
>> >> +      * frequencies higher than the parent frequency
>> >> +      */
>> >> +     if (req->parent_rate && req->rate > req->parent_rate)
>> >> +             req->rate = req->parent_rate;
>> >> +
>> >> +     div = DIV_ROUND_UP(req->parent_rate, req->rate);
>> >> +
>> >> +     /* calculate pre-divider if parent is pll6 */
>> >> +     if (req->parent_index >= SUN8I_A83T_AHB1_PARENT_PLL6) {
>> >> +             if (div < 4)
>> >> +                     calcp = 0;
>> >> +             else if (div / 2 < 4)
>> >> +                     calcp = 1;
>> >> +             else if (div / 4 < 4)
>> >> +                     calcp = 2;
>> >> +             else
>> >> +                     calcp = 3;
>> >> +
>> >> +             calcm = DIV_ROUND_UP(div, 1 << calcp);
>> >> +     } else {
>> >> +             calcp = __roundup_pow_of_two(div);
>> >> +             calcp = calcp > 3 ? 3 : calcp;
>> >> +     }
>> >> +
>> >> +     req->rate = (req->parent_rate / calcm) >> calcp;
>> >> +     req->p = calcp;
>> >> +     req->m = calcm - 1;
>> >> +}
>> >> +
>> >> +/**
>> >> +* sun8i_a83t_ahb1_recalc() - calculates AHB clock rate from m, p factors and
>> >> +*                     parent index
>> >> +*/
>> >> +static void sun8i_a83t_ahb1_recalc(struct factors_request *req)
>> >> +{
>> >> +     req->rate = req->parent_rate;
>> >> +
>> >> +/* apply pre-divider first if parent is pll6 */
>> >
>> > The comment indentation is wrong
>> >
>> >> +     if (req->parent_index >= SUN6I_AHB1_PARENT_PLL6)
>> >
>> > And this is not the right define you're using.
>> >
>> > I still believe that duplicating the same logic just because of
>> > different dividers is not the way to go.
>> >
>> > You could solve that easily by adding a table for the muxes, and
>> > associate it with parents and dividers, that you could store in
>> > clk_factors.
>>
>> I've similar solution (please ignore a83 specific functions those will
>> be common for a31 and a83t).
>> https://github.com/vishnupatekar/linux/commit/f7de5b48d886a672b1f6db112fbfd5d2c9849afa
>>
>> is it aligned to what you're saying?
>
> Yep. I'd even go a step further, and allow to have directly the core
> deal with the pre-divider.
>
> I guess in your prediv table you could have the index, and either the
> offset and width of the divider (if it's a variable one), or its fixed
> value.
That's good idea, index with shift and width will do as prediv can be variable.
>
> The generic function would then be able to deal with the rate
> adjustments, and you wouldn't need to be able to have anything related
> to the parent index in the clock specific functions anymore.
>
> Does that make sense?
Adjusting rate in generic clk_factors_recalc_rate, with prediv shift
and width is straight forward, and we can remove recalc function
itself, currently it's used only for a31 ahb1.

I'm doubtful about getter, In sun6i_get_ahb1_factors we still need to
pass req->prediv_width instead of req->parent_index.

I'll send separate patch for this prediv handling.
>
> Maxime
>
> --
> Maxime Ripard, Free Electrons
> Embedded Linux, Kernel and Android engineering
> http://free-electrons.com

WARNING: multiple messages have this Message-ID (diff)
From: vishnupatekar0510@gmail.com (Vishnu Patekar)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 02/13] clk: sunxi: add ahb1 clock for A83T
Date: Sat, 16 Apr 2016 23:59:40 +0800	[thread overview]
Message-ID: <CAEzqOZs44zZiu9e2Uae7ovT0=-o2rOCX+g2pJ6D0Rej2J2D3Ww@mail.gmail.com> (raw)
In-Reply-To: <20160414172838.GS4005@lukather>

Hello Maxime,

On Fri, Apr 15, 2016 at 1:28 AM, Maxime Ripard
<maxime.ripard@free-electrons.com> wrote:
> On Mon, Apr 04, 2016 at 11:07:29AM +0800, Vishnu Patekar wrote:
>> Hello Maxime,
>>
>> On Thu, Mar 17, 2016 at 6:40 PM, Maxime Ripard
>> <maxime.ripard@free-electrons.com> wrote:
>> > On Thu, Mar 17, 2016 at 12:04:25AM +0800, Vishnu Patekar wrote:
>> >> AHB1 on A83T is similar to ahb1 on A31, except parents are different.
>> >> clock index 0b1x is PLL6.
>> >>
>> >> Signed-off-by: Vishnu Patekar <vishnupatekar0510@gmail.com>
>> >> Acked-by: Chen-Yu Tsai <wens@csie.org>
>> >> Acked-by: Rob Herring <robh@kernel.org>
>> >> ---
>> >>  Documentation/devicetree/bindings/clock/sunxi.txt |  1 +
>> >>  drivers/clk/sunxi/clk-sunxi.c                     | 76 +++++++++++++++++++++++
>> >>  2 files changed, 77 insertions(+)
>> >>
>> >> diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt b/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> index 834436f..cba9fe55 100644
>> >> --- a/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> +++ b/Documentation/devicetree/bindings/clock/sunxi.txt
>> >> @@ -30,6 +30,7 @@ Required properties:
>> >>       "allwinner,sun6i-a31-ar100-clk" - for the AR100 on A31
>> >>       "allwinner,sun9i-a80-cpus-clk" - for the CPUS on A80
>> >>       "allwinner,sun6i-a31-ahb1-clk" - for the AHB1 clock on A31
>> >> +     "allwinner,sun8i-a83t-ahb1-clk" - for the AHB1 clock on A83T
>> >>       "allwinner,sun8i-h3-ahb2-clk" - for the AHB2 clock on H3
>> >>       "allwinner,sun6i-a31-ahb1-gates-clk" - for the AHB1 gates on A31
>> >>       "allwinner,sun8i-a23-ahb1-gates-clk" - for the AHB1 gates on A23
>> >> diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
>> >> index 91de0a0..a7aab65 100644
>> >> --- a/drivers/clk/sunxi/clk-sunxi.c
>> >> +++ b/drivers/clk/sunxi/clk-sunxi.c
>> >> @@ -344,6 +344,67 @@ static void sun6i_ahb1_recalc(struct factors_request *req)
>> >>       req->rate >>= req->p;
>> >>  }
>> >>
>> >> +#define SUN8I_A83T_AHB1_PARENT_PLL6  2
>> >> +/**
>> >> + * sun8i_a83t_get_ahb_factors() - calculates m, p factors for AHB
>> >> + * AHB rate is calculated as follows
>> >> + * rate = parent_rate >> p
>> >> + *
>> >> + * if parent is pll6, then
>> >> + * parent_rate = pll6 rate / (m + 1)
>> >> + */
>> >> +
>> >> +static void sun8i_a83t_get_ahb1_factors(struct factors_request *req)
>> >> +{
>> >> +     u8 div, calcp, calcm = 1;
>> >> +
>> >> +     /*
>> >> +      * clock can only divide, so we will never be able to achieve
>> >> +      * frequencies higher than the parent frequency
>> >> +      */
>> >> +     if (req->parent_rate && req->rate > req->parent_rate)
>> >> +             req->rate = req->parent_rate;
>> >> +
>> >> +     div = DIV_ROUND_UP(req->parent_rate, req->rate);
>> >> +
>> >> +     /* calculate pre-divider if parent is pll6 */
>> >> +     if (req->parent_index >= SUN8I_A83T_AHB1_PARENT_PLL6) {
>> >> +             if (div < 4)
>> >> +                     calcp = 0;
>> >> +             else if (div / 2 < 4)
>> >> +                     calcp = 1;
>> >> +             else if (div / 4 < 4)
>> >> +                     calcp = 2;
>> >> +             else
>> >> +                     calcp = 3;
>> >> +
>> >> +             calcm = DIV_ROUND_UP(div, 1 << calcp);
>> >> +     } else {
>> >> +             calcp = __roundup_pow_of_two(div);
>> >> +             calcp = calcp > 3 ? 3 : calcp;
>> >> +     }
>> >> +
>> >> +     req->rate = (req->parent_rate / calcm) >> calcp;
>> >> +     req->p = calcp;
>> >> +     req->m = calcm - 1;
>> >> +}
>> >> +
>> >> +/**
>> >> +* sun8i_a83t_ahb1_recalc() - calculates AHB clock rate from m, p factors and
>> >> +*                     parent index
>> >> +*/
>> >> +static void sun8i_a83t_ahb1_recalc(struct factors_request *req)
>> >> +{
>> >> +     req->rate = req->parent_rate;
>> >> +
>> >> +/* apply pre-divider first if parent is pll6 */
>> >
>> > The comment indentation is wrong
>> >
>> >> +     if (req->parent_index >= SUN6I_AHB1_PARENT_PLL6)
>> >
>> > And this is not the right define you're using.
>> >
>> > I still believe that duplicating the same logic just because of
>> > different dividers is not the way to go.
>> >
>> > You could solve that easily by adding a table for the muxes, and
>> > associate it with parents and dividers, that you could store in
>> > clk_factors.
>>
>> I've similar solution (please ignore a83 specific functions those will
>> be common for a31 and a83t).
>> https://github.com/vishnupatekar/linux/commit/f7de5b48d886a672b1f6db112fbfd5d2c9849afa
>>
>> is it aligned to what you're saying?
>
> Yep. I'd even go a step further, and allow to have directly the core
> deal with the pre-divider.
>
> I guess in your prediv table you could have the index, and either the
> offset and width of the divider (if it's a variable one), or its fixed
> value.
That's good idea, index with shift and width will do as prediv can be variable.
>
> The generic function would then be able to deal with the rate
> adjustments, and you wouldn't need to be able to have anything related
> to the parent index in the clock specific functions anymore.
>
> Does that make sense?
Adjusting rate in generic clk_factors_recalc_rate, with prediv shift
and width is straight forward, and we can remove recalc function
itself, currently it's used only for a31 ahb1.

I'm doubtful about getter, In sun6i_get_ahb1_factors we still need to
pass req->prediv_width instead of req->parent_index.

I'll send separate patch for this prediv handling.
>
> Maxime
>
> --
> Maxime Ripard, Free Electrons
> Embedded Linux, Kernel and Android engineering
> http://free-electrons.com

  reply	other threads:[~2016-04-16 15:59 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-16 16:04 [PATCH v4 00/13] Add A83T clk, r_pio, mmc rsb support Vishnu Patekar
2016-03-16 16:04 ` Vishnu Patekar
2016-03-16 16:04 ` Vishnu Patekar
     [not found] ` <1458144276-31108-1-git-send-email-vishnupatekar0510-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-03-16 16:04   ` [PATCH v4 01/13] pinctrl: sunxi: Add A83T R_PIO controller Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-17 14:51     ` Linus Walleij
2016-03-17 14:51       ` Linus Walleij
2016-03-17 14:51       ` Linus Walleij
2016-03-17 15:34       ` Vishnu Patekar
2016-03-17 15:34         ` Vishnu Patekar
2016-03-17 15:34         ` Vishnu Patekar
     [not found]         ` <CAEzqOZugVOGarjy9NjDOhwJeU6P26Ch2aX13Tec2N0z2Gb9g7A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-03-22 13:12           ` Linus Walleij
2016-03-22 13:12             ` Linus Walleij
2016-03-22 13:12             ` Linus Walleij
     [not found]             ` <CACRpkda1gYciHz79ZaFsQmZdq8PwxtoR2LwCO3LteCGbNQE=gA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-03-22 13:16               ` Linus Walleij
2016-03-22 13:16                 ` Linus Walleij
2016-03-22 13:16                 ` Linus Walleij
2016-03-16 16:04   ` [PATCH v4 02/13] clk: sunxi: add ahb1 clock for A83T Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-17 10:40     ` Maxime Ripard
2016-03-17 10:40       ` Maxime Ripard
2016-04-04  3:07       ` Vishnu Patekar
2016-04-04  3:07         ` Vishnu Patekar
2016-04-04  3:07         ` Vishnu Patekar
2016-04-04  3:07         ` Vishnu Patekar
     [not found]         ` <CAEzqOZvoMrvf-3=Tfi7MK9ZTm1EtJre5gsBdz=2wZ+D+hj056A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-04-14 17:28           ` Maxime Ripard
2016-04-14 17:28             ` Maxime Ripard
2016-04-14 17:28             ` Maxime Ripard
2016-04-14 17:28             ` Maxime Ripard
2016-04-16 15:59             ` Vishnu Patekar [this message]
2016-04-16 15:59               ` Vishnu Patekar
2016-04-16 15:59               ` Vishnu Patekar
2016-04-16 15:59               ` Vishnu Patekar
2016-03-16 16:04   ` [PATCH v4 03/13] clk: sunxi: Add APB1 " Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-17 10:41     ` Maxime Ripard
2016-03-17 10:41       ` Maxime Ripard
2016-03-16 16:04   ` [PATCH v4 04/13] ARM: dts: sun8i-a83t: Add basic clocks and resets Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04   ` [PATCH v4 05/13] ARM: dts: sun8i-a83t: add mmc clock nodes Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04   ` [PATCH v4 06/13] ARM: dts: sun8i-a83t: Add mmc controller nodes Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04   ` [PATCH v4 07/13] ARM: dts: sun8i-a83t: Add PRCM related clocks and resets Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04   ` [PATCH v4 08/13] ARM: dts: sun8i-a83t: Add R_PIO controller node to the dtsi Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04   ` [PATCH v4 09/13] ARM: dts: sun8i-a83t: Add RSB controller device node to dtsi Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04   ` [PATCH v4 10/13] ARM: dts: sun8i-a83t: add mmc0 CD pin Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04   ` [PATCH v4 11/13] ARM: dts: sun8i: enable mmc for H8Homlet Board Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04   ` [PATCH v4 12/13] ARM: dts: sun8i: Add A83T based Sinovoip Bpi-M3 Board Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04   ` [PATCH v4 13/13] ARM: sunxi: Add Kconfig for sunxi clocks Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
2016-03-16 16:04     ` Vishnu Patekar
     [not found]     ` <1458144276-31108-14-git-send-email-vishnupatekar0510-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-03-16 17:20       ` Priit Laes
2016-03-16 17:20         ` [linux-sunxi] " Priit Laes
2016-03-16 17:20         ` 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='CAEzqOZs44zZiu9e2Uae7ovT0=-o2rOCX+g2pJ6D0Rej2J2D3Ww@mail.gmail.com' \
    --to=vishnupatekar0510-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=corbet-T1hC0tSOHrs@public.gmane.org \
    --cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=emilio-0Z03zUJReD5OxF6Tv1QG9Q@public.gmane.org \
    --cc=galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
    --cc=hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org \
    --cc=jenskuske-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
    --cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
    --cc=linux-gpio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org \
    --cc=linux-sunxi-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org \
    --cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
    --cc=maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org \
    --cc=mturquette-rdvid1DuHRBWk0Htik3J/w@public.gmane.org \
    --cc=pawel.moll-5wv7dgnIgG8@public.gmane.org \
    --cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
    --cc=sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
    --cc=wens-jdAy2FN1RRM@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 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.