diff mbox series

[1/3] clk: meson: mpll: properly handle spread spectrum

Message ID 20190329153325.23869-2-jbrunet@baylibre.com
State New
Headers show
Series clk: meson: fix mpll jitter | expand

Commit Message

Jerome Brunet March 29, 2019, 3:33 p.m. UTC
The bit 'SSEN' available on some MPLL DSS outputs is not related to the
fractional part of the divider but to the function called
'Spread Spectrum'.

This function might be used to solve EM issues by adding a jitter on
clock signal. This widens the signal spectrum and weakens the peaks in it.

While spread spectrum might be useful for some application, it is
problematic for others, such as audio.

This patch introduce a new flag to the MPLL driver to enable (or not) the
spread spectrum function.

Fixes: 1f737ffa13ef ("clk: meson: mpll: fix mpll0 fractional part ignored")
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>

---
 drivers/clk/meson/clk-mpll.c | 9 ++++++---
 drivers/clk/meson/clk-mpll.h | 1 +
 2 files changed, 7 insertions(+), 3 deletions(-)

-- 
2.20.1

Comments

Martin Blumenstingl March 29, 2019, 7:39 p.m. UTC | #1
Hi Jerome,

On Fri, Mar 29, 2019 at 4:34 PM Jerome Brunet <jbrunet@baylibre.com> wrote:
>

> The bit 'SSEN' available on some MPLL DSS outputs is not related to the

> fractional part of the divider but to the function called

> 'Spread Spectrum'.

>

> This function might be used to solve EM issues by adding a jitter on

> clock signal. This widens the signal spectrum and weakens the peaks in it.

>

> While spread spectrum might be useful for some application, it is

> problematic for others, such as audio.

>

> This patch introduce a new flag to the MPLL driver to enable (or not) the

> spread spectrum function.

>

> Fixes: 1f737ffa13ef ("clk: meson: mpll: fix mpll0 fractional part ignored")

> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>

> ---

>  drivers/clk/meson/clk-mpll.c | 9 ++++++---

>  drivers/clk/meson/clk-mpll.h | 1 +

>  2 files changed, 7 insertions(+), 3 deletions(-)

>

> diff --git a/drivers/clk/meson/clk-mpll.c b/drivers/clk/meson/clk-mpll.c

> index 64d31c8ba3d0..2d39a8bc367c 100644

> --- a/drivers/clk/meson/clk-mpll.c

> +++ b/drivers/clk/meson/clk-mpll.c

> @@ -141,9 +141,12 @@ static void mpll_init(struct clk_hw *hw)

>         /* Enable the fractional part */

>         meson_parm_write(clk->map, &mpll->sdm_en, 1);

>

> -       /* Set additional fractional part enable if required */

> -       if (MESON_PARM_APPLICABLE(&mpll->ssen))

> -               meson_parm_write(clk->map, &mpll->ssen, 1);

> +       /* Set spread spectrum if possible */

> +       if (MESON_PARM_APPLICABLE(&mpll->ssen)) {

> +               unsigned int ss =

> +                       mpll->flags & CLK_MESON_MPLL_SPREAD_SPECTRUM ? 1 : 0;

> +               meson_parm_write(clk->map, &mpll->ssen, ss);

> +       }

this changes the "ssen" flag on all supported clocks from 1 (before
this patch) to 0 (after this patch).
is this on purpose and how does it affect existing clocks?

based on the original commit 1f737ffa13ef ("clk: meson: mpll: fix
mpll0 fractional part ignored") it seems that
CLK_MESON_MPLL_SPREAD_SPECTRUM should be set for mpll0 (at least on
GXBB and Meson8b)


Martin
Jerome Brunet March 29, 2019, 11:07 p.m. UTC | #2
On Fri, 2019-03-29 at 20:39 +0100, Martin Blumenstingl wrote:
> Hi Jerome,

> 

> On Fri, Mar 29, 2019 at 4:34 PM Jerome Brunet <jbrunet@baylibre.com> wrote:

> > The bit 'SSEN' available on some MPLL DSS outputs is not related to the

> > fractional part of the divider but to the function called

> > 'Spread Spectrum'.

> > 

> > This function might be used to solve EM issues by adding a jitter on

> > clock signal. This widens the signal spectrum and weakens the peaks in it.

> > 

> > While spread spectrum might be useful for some application, it is

> > problematic for others, such as audio.

> > 

> > This patch introduce a new flag to the MPLL driver to enable (or not) the

> > spread spectrum function.

> > 

> > Fixes: 1f737ffa13ef ("clk: meson: mpll: fix mpll0 fractional part ignored")

> > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>

> > ---

> >  drivers/clk/meson/clk-mpll.c | 9 ++++++---

> >  drivers/clk/meson/clk-mpll.h | 1 +

> >  2 files changed, 7 insertions(+), 3 deletions(-)

> > 

> > diff --git a/drivers/clk/meson/clk-mpll.c b/drivers/clk/meson/clk-mpll.c

> > index 64d31c8ba3d0..2d39a8bc367c 100644

> > --- a/drivers/clk/meson/clk-mpll.c

> > +++ b/drivers/clk/meson/clk-mpll.c

> > @@ -141,9 +141,12 @@ static void mpll_init(struct clk_hw *hw)

> >         /* Enable the fractional part */

> >         meson_parm_write(clk->map, &mpll->sdm_en, 1);

> > 

> > -       /* Set additional fractional part enable if required */

> > -       if (MESON_PARM_APPLICABLE(&mpll->ssen))

> > -               meson_parm_write(clk->map, &mpll->ssen, 1);

> > +       /* Set spread spectrum if possible */

> > +       if (MESON_PARM_APPLICABLE(&mpll->ssen)) {

> > +               unsigned int ss =

> > +                       mpll->flags & CLK_MESON_MPLL_SPREAD_SPECTRUM ? 1 : 0;

> > +               meson_parm_write(clk->map, &mpll->ssen, ss);

> > +       }

> this changes the "ssen" flag on all supported clocks from 1 (before

> this patch) to 0 (after this patch).

> is this on purpose and how does it affect existing clocks?


Yes, none of our application require spread spectrum

The fact is that only 2 MPLL had this bit, mpll0 on gx (without effect) and
mpll0 on axg: actually spread spectrum impacts mpll2, making it unusable, as
explained in the related patch

> 

> based on the original commit 1f737ffa13ef ("clk: meson: mpll: fix

> mpll0 fractional part ignored") it seems that

> CLK_MESON_MPLL_SPREAD_SPECTRUM should be set for mpll0 (at least on

> GXBB and Meson8b)

> 


There a patch specifically targeting gxbb.
I have checked on GXL and this bit had no effect (fractional part still on, no
spread spectrum)

So either we fixed something since then or I messed up when doing the patch
initially.

Feel free to cross check

> 

> Martin
Martin Blumenstingl March 30, 2019, 3:56 p.m. UTC | #3
Hi Jerome,

On Sat, Mar 30, 2019 at 12:07 AM Jerome Brunet <jbrunet@baylibre.com> wrote:
>

> On Fri, 2019-03-29 at 20:39 +0100, Martin Blumenstingl wrote:

> > Hi Jerome,

> >

> > On Fri, Mar 29, 2019 at 4:34 PM Jerome Brunet <jbrunet@baylibre.com> wrote:

> > > The bit 'SSEN' available on some MPLL DSS outputs is not related to the

> > > fractional part of the divider but to the function called

> > > 'Spread Spectrum'.

> > >

> > > This function might be used to solve EM issues by adding a jitter on

> > > clock signal. This widens the signal spectrum and weakens the peaks in it.

> > >

> > > While spread spectrum might be useful for some application, it is

> > > problematic for others, such as audio.

> > >

> > > This patch introduce a new flag to the MPLL driver to enable (or not) the

> > > spread spectrum function.

> > >

> > > Fixes: 1f737ffa13ef ("clk: meson: mpll: fix mpll0 fractional part ignored")

> > > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>

> > > ---

> > >  drivers/clk/meson/clk-mpll.c | 9 ++++++---

> > >  drivers/clk/meson/clk-mpll.h | 1 +

> > >  2 files changed, 7 insertions(+), 3 deletions(-)

> > >

> > > diff --git a/drivers/clk/meson/clk-mpll.c b/drivers/clk/meson/clk-mpll.c

> > > index 64d31c8ba3d0..2d39a8bc367c 100644

> > > --- a/drivers/clk/meson/clk-mpll.c

> > > +++ b/drivers/clk/meson/clk-mpll.c

> > > @@ -141,9 +141,12 @@ static void mpll_init(struct clk_hw *hw)

> > >         /* Enable the fractional part */

> > >         meson_parm_write(clk->map, &mpll->sdm_en, 1);

> > >

> > > -       /* Set additional fractional part enable if required */

> > > -       if (MESON_PARM_APPLICABLE(&mpll->ssen))

> > > -               meson_parm_write(clk->map, &mpll->ssen, 1);

> > > +       /* Set spread spectrum if possible */

> > > +       if (MESON_PARM_APPLICABLE(&mpll->ssen)) {

> > > +               unsigned int ss =

> > > +                       mpll->flags & CLK_MESON_MPLL_SPREAD_SPECTRUM ? 1 : 0;

> > > +               meson_parm_write(clk->map, &mpll->ssen, ss);

> > > +       }

> > this changes the "ssen" flag on all supported clocks from 1 (before

> > this patch) to 0 (after this patch).

> > is this on purpose and how does it affect existing clocks?

>

> Yes, none of our application require spread spectrum

thank you for the explanation. can you please add it to the patch description?

> The fact is that only 2 MPLL had this bit, mpll0 on gx (without effect) and

> mpll0 on axg: actually spread spectrum impacts mpll2, making it unusable, as

> explained in the related patch

>

> >

> > based on the original commit 1f737ffa13ef ("clk: meson: mpll: fix

> > mpll0 fractional part ignored") it seems that

> > CLK_MESON_MPLL_SPREAD_SPECTRUM should be set for mpll0 (at least on

> > GXBB and Meson8b)

> >

>

> There a patch specifically targeting gxbb.

I missed that, sorry for the noise

> I have checked on GXL and this bit had no effect (fractional part still on, no

> spread spectrum)

>

> So either we fixed something since then or I messed up when doing the patch

> initially.

>

> Feel free to cross check

I tried it on Meson8b and it seems that there's no difference. I've
done a bit of software archaeology:
$ grep -R mpll_cntl uboot-2015-01-15-23a3562521/ | grep "=" | head -n3
uboot-2015-01-15-23a3562521/board/amlogic/m8_k100_1G/firmware/timming.c:
       .mpll_cntl = 0x600009A9,        //2.5G, fixed
uboot-2015-01-15-23a3562521/board/amlogic/m8_k100_2G/firmware/timming.c:
       .mpll_cntl = 0x600009A9,        //2.5G, fixed
uboot-2015-01-15-23a3562521/board/amlogic/m8b_ft_v1/firmware/timming.c:
.mpll_cntl = 0x600009A9,        //2.5G, fixed

Ethernet is still working on my Odroid-C1, so you can add my:
Tested-by: Martin Blumenstingl<martin.blumenstingl@googlemail.com>



Regards
Martin
Jerome Brunet April 1, 2019, 8:40 a.m. UTC | #4
On Sat, 2019-03-30 at 16:56 +0100, Martin Blumenstingl wrote:
> Hi Jerome,

> 

> On Sat, Mar 30, 2019 at 12:07 AM Jerome Brunet <jbrunet@baylibre.com> wrote:

> > On Fri, 2019-03-29 at 20:39 +0100, Martin Blumenstingl wrote:

> > > Hi Jerome,

> > > 

> > > On Fri, Mar 29, 2019 at 4:34 PM Jerome Brunet <jbrunet@baylibre.com> wrote:

> > > > The bit 'SSEN' available on some MPLL DSS outputs is not related to the

> > > > fractional part of the divider but to the function called

> > > > 'Spread Spectrum'.

> > > > 

> > > > This function might be used to solve EM issues by adding a jitter on

> > > > clock signal. This widens the signal spectrum and weakens the peaks in it.

> > > > 

> > > > While spread spectrum might be useful for some application, it is

> > > > problematic for others, such as audio.

> > > > 

> > > > This patch introduce a new flag to the MPLL driver to enable (or not) the

> > > > spread spectrum function.

> > > > 

> > > > Fixes: 1f737ffa13ef ("clk: meson: mpll: fix mpll0 fractional part ignored")

> > > > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>

> > > > ---

> > > >  drivers/clk/meson/clk-mpll.c | 9 ++++++---

> > > >  drivers/clk/meson/clk-mpll.h | 1 +

> > > >  2 files changed, 7 insertions(+), 3 deletions(-)

> > > > 


[...]

> > 

> > Yes, none of our application require spread spectrum

> thank you for the explanation. can you please add it to the patch description?


I think I described spread spectrum already in the commit description.

> 

> > The fact is that only 2 MPLL had this bit, mpll0 on gx (without effect) and

> > mpll0 on axg: actually spread spectrum impacts mpll2, making it unusable, as

> > explained in the related patch

> > 

> > > based on the original commit 1f737ffa13ef ("clk: meson: mpll: fix

> > > mpll0 fractional part ignored") it seems that

> > > CLK_MESON_MPLL_SPREAD_SPECTRUM should be set for mpll0 (at least on

> > > GXBB and Meson8b)

> > > 

> > 

> > There a patch specifically targeting gxbb.

> I missed that, sorry for the noise

> 

> > I have checked on GXL and this bit had no effect (fractional part still on, no

> > spread spectrum)

> > 

> > So either we fixed something since then or I messed up when doing the patch

> > initially.

> > 

> > Feel free to cross check

> I tried it on Meson8b and it seems that there's no difference. I've

> done a bit of software archaeology:

> $ grep -R mpll_cntl uboot-2015-01-15-23a3562521/ | grep "=" | head -n3

> uboot-2015-01-15-23a3562521/board/amlogic/m8_k100_1G/firmware/timming.c:

>        .mpll_cntl = 0x600009A9,        //2.5G, fixed

> uboot-2015-01-15-23a3562521/board/amlogic/m8_k100_2G/firmware/timming.c:

>        .mpll_cntl = 0x600009A9,        //2.5G, fixed

> uboot-2015-01-15-23a3562521/board/amlogic/m8b_ft_v1/firmware/timming.c:

> .mpll_cntl = 0x600009A9,        //2.5G, fixed

> 

> Ethernet is still working on my Odroid-C1, so you can add my:

> Tested-by: Martin Blumenstingl<martin.blumenstingl@googlemail.com>

> 

> 

> Regards

> Martin
Martin Blumenstingl April 1, 2019, 5:13 p.m. UTC | #5
Hi Jerome,

On Mon, Apr 1, 2019 at 10:40 AM Jerome Brunet <jbrunet@baylibre.com> wrote:
>

> On Sat, 2019-03-30 at 16:56 +0100, Martin Blumenstingl wrote:

> > Hi Jerome,

> >

> > On Sat, Mar 30, 2019 at 12:07 AM Jerome Brunet <jbrunet@baylibre.com> wrote:

> > > On Fri, 2019-03-29 at 20:39 +0100, Martin Blumenstingl wrote:

> > > > Hi Jerome,

> > > >

> > > > On Fri, Mar 29, 2019 at 4:34 PM Jerome Brunet <jbrunet@baylibre.com> wrote:

> > > > > The bit 'SSEN' available on some MPLL DSS outputs is not related to the

> > > > > fractional part of the divider but to the function called

> > > > > 'Spread Spectrum'.

> > > > >

> > > > > This function might be used to solve EM issues by adding a jitter on

> > > > > clock signal. This widens the signal spectrum and weakens the peaks in it.

> > > > >

> > > > > While spread spectrum might be useful for some application, it is

> > > > > problematic for others, such as audio.

> > > > >

> > > > > This patch introduce a new flag to the MPLL driver to enable (or not) the

> > > > > spread spectrum function.

> > > > >

> > > > > Fixes: 1f737ffa13ef ("clk: meson: mpll: fix mpll0 fractional part ignored")

> > > > > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>

> > > > > ---

> > > > >  drivers/clk/meson/clk-mpll.c | 9 ++++++---

> > > > >  drivers/clk/meson/clk-mpll.h | 1 +

> > > > >  2 files changed, 7 insertions(+), 3 deletions(-)

> > > > >

>

> [...]

>

> > >

> > > Yes, none of our application require spread spectrum

> > thank you for the explanation. can you please add it to the patch description?

>

> I think I described spread spectrum already in the commit description.

I haven't been clear about this one -  let me do it better this time:
if you have to re-send the patches can you please add a note stating
that "none of our application require spread spectrum" to the
description so it's clear that you're disabling spread spectrum on
purpose.
your explanation about spread spectrum itself is perfectly fine


Regards
Martin
diff mbox series

Patch

diff --git a/drivers/clk/meson/clk-mpll.c b/drivers/clk/meson/clk-mpll.c
index 64d31c8ba3d0..2d39a8bc367c 100644
--- a/drivers/clk/meson/clk-mpll.c
+++ b/drivers/clk/meson/clk-mpll.c
@@ -141,9 +141,12 @@  static void mpll_init(struct clk_hw *hw)
 	/* Enable the fractional part */
 	meson_parm_write(clk->map, &mpll->sdm_en, 1);
 
-	/* Set additional fractional part enable if required */
-	if (MESON_PARM_APPLICABLE(&mpll->ssen))
-		meson_parm_write(clk->map, &mpll->ssen, 1);
+	/* Set spread spectrum if possible */
+	if (MESON_PARM_APPLICABLE(&mpll->ssen)) {
+		unsigned int ss =
+			mpll->flags & CLK_MESON_MPLL_SPREAD_SPECTRUM ? 1 : 0;
+		meson_parm_write(clk->map, &mpll->ssen, ss);
+	}
 
 	/* Set the magic misc bit if required */
 	if (MESON_PARM_APPLICABLE(&mpll->misc))
diff --git a/drivers/clk/meson/clk-mpll.h b/drivers/clk/meson/clk-mpll.h
index 2925fb939fdd..a991d568c43a 100644
--- a/drivers/clk/meson/clk-mpll.h
+++ b/drivers/clk/meson/clk-mpll.h
@@ -25,6 +25,7 @@  struct meson_clk_mpll_data {
 };
 
 #define CLK_MESON_MPLL_ROUND_CLOSEST	BIT(0)
+#define CLK_MESON_MPLL_SPREAD_SPECTRUM	BIT(1)
 
 extern const struct clk_ops meson_clk_mpll_ro_ops;
 extern const struct clk_ops meson_clk_mpll_ops;