All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] clk: si5351: Add invert clock output option
@ 2016-05-25 15:31 Jens Renner
  2016-08-25  0:33 ` Michael Turquette
  0 siblings, 1 reply; 2+ messages in thread
From: Jens Renner @ 2016-05-25 15:31 UTC (permalink / raw)
  To: sebastian.hesselbarth; +Cc: linux-clk, sboyd, Jens Renner

This patch implements the clock invert option for the Silabs Si5351. Clock
output invert can be enabled via DT entry "silabs,clk-invert" for each
clock child node.

The change has been tested with a Si5351A on actual hardware.

Signed-off-by: Jens Renner <renner@efe-gmbh.de>
---
 .../devicetree/bindings/clock/silabs,si5351.txt    |  1 +
 drivers/clk/clk-si5351.c                           | 25 ++++++++++++++++++++++
 include/linux/platform_data/si5351.h               |  1 +
 3 files changed, 27 insertions(+)

diff --git a/Documentation/devicetree/bindings/clock/silabs,si5351.txt b/Documentation/devicetree/bindings/clock/silabs,si5351.txt
index 28b2830..2e23cdd 100644
--- a/Documentation/devicetree/bindings/clock/silabs,si5351.txt
+++ b/Documentation/devicetree/bindings/clock/silabs,si5351.txt
@@ -45,6 +45,7 @@ Optional child node properties:
 - silabs,multisynth-source: source pll A(0) or B(1) of corresponding multisynth
   divider.
 - silabs,pll-master: boolean, multisynth can change pll frequency.
+- silabs,clk-invert: boolean, clock output is inverted.
 - silabs,disable-state : clock output disable state, shall be
   0 = clock output is driven LOW when disabled
   1 = clock output is driven HIGH when disabled
diff --git a/drivers/clk/clk-si5351.c b/drivers/clk/clk-si5351.c
index b1bc12c..34a9d6f 100644
--- a/drivers/clk/clk-si5351.c
+++ b/drivers/clk/clk-si5351.c
@@ -898,6 +898,19 @@ static int _si5351_clkout_set_disable_state(
 	return 0;
 }
 
+static int _si5351_clkout_set_clk_invert(
+	struct si5351_driver_data *drvdata, int num,
+	bool invert)
+{
+	if (num > 8)
+		return -EINVAL;
+
+	si5351_set_bits(drvdata, SI5351_CLK0_CTRL + num,
+			SI5351_CLK_INVERT, (invert) ? SI5351_CLK_INVERT : 0);
+
+	return 0;
+}
+
 static int si5351_clkout_prepare(struct clk_hw *hw)
 {
 	struct si5351_hw_data *hwdata =
@@ -1299,6 +1312,9 @@ static int si5351_dt_parse(struct i2c_client *client,
 
 		pdata->clkout[num].pll_master =
 			of_property_read_bool(child, "silabs,pll-master");
+
+		pdata->clkout[num].clk_invert =
+			of_property_read_bool(child, "silabs,clk-invert");
 	}
 	client->dev.platform_data = pdata;
 
@@ -1420,6 +1436,15 @@ static int si5351_i2c_probe(struct i2c_client *client,
 				n, pdata->clkout[n].disable_state);
 			return ret;
 		}
+
+		ret = _si5351_clkout_set_clk_invert(drvdata, n,
+						pdata->clkout[n].clk_invert);
+		if (ret) {
+			dev_err(&client->dev,
+				"failed set invert of clkout%d to %d\n",
+				n, pdata->clkout[n].clk_invert);
+			return ret;
+		}
 	}
 
 	if (!IS_ERR(drvdata->pxtal))
diff --git a/include/linux/platform_data/si5351.h b/include/linux/platform_data/si5351.h
index 533d980..38ffda5 100644
--- a/include/linux/platform_data/si5351.h
+++ b/include/linux/platform_data/si5351.h
@@ -94,6 +94,7 @@ struct si5351_clkout_config {
 	enum si5351_drive_strength drive;
 	enum si5351_disable_state disable_state;
 	bool pll_master;
+	bool clk_invert;
 	unsigned long rate;
 };
 
-- 
2.8.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] clk: si5351: Add invert clock output option
  2016-05-25 15:31 [PATCH] clk: si5351: Add invert clock output option Jens Renner
@ 2016-08-25  0:33 ` Michael Turquette
  0 siblings, 0 replies; 2+ messages in thread
From: Michael Turquette @ 2016-08-25  0:33 UTC (permalink / raw)
  To: Jens Renner, sebastian.hesselbarth; +Cc: linux-clk, sboyd, Jens Renner

Quoting Jens Renner (2016-05-25 08:31:01)
> This patch implements the clock invert option for the Silabs Si5351. Clock
> output invert can be enabled via DT entry "silabs,clk-invert" for each
> clock child node.
> =

> The change has been tested with a Si5351A on actual hardware.
> =

> Signed-off-by: Jens Renner <renner@efe-gmbh.de>
> ---
>  .../devicetree/bindings/clock/silabs,si5351.txt    |  1 +
>  drivers/clk/clk-si5351.c                           | 25 ++++++++++++++++=
++++++
>  include/linux/platform_data/si5351.h               |  1 +
>  3 files changed, 27 insertions(+)
> =

> diff --git a/Documentation/devicetree/bindings/clock/silabs,si5351.txt b/=
Documentation/devicetree/bindings/clock/silabs,si5351.txt
> index 28b2830..2e23cdd 100644
> --- a/Documentation/devicetree/bindings/clock/silabs,si5351.txt
> +++ b/Documentation/devicetree/bindings/clock/silabs,si5351.txt
> @@ -45,6 +45,7 @@ Optional child node properties:
>  - silabs,multisynth-source: source pll A(0) or B(1) of corresponding mul=
tisynth
>    divider.
>  - silabs,pll-master: boolean, multisynth can change pll frequency.
> +- silabs,clk-invert: boolean, clock output is inverted.

Instead of making this a DT property (of the provider!) can you use the
existing clk_set_phase(foo_clk, 180) function? Just supply
_si5351_clkout_set_clk_invert as the .set_phase callback, fail if the
value is anything other than 0 or a multiple of 180.

Either your provider driver or the consumer driver can call this
function.

Regards,
Mike

>  - silabs,disable-state : clock output disable state, shall be
>    0 =3D clock output is driven LOW when disabled
>    1 =3D clock output is driven HIGH when disabled
> diff --git a/drivers/clk/clk-si5351.c b/drivers/clk/clk-si5351.c
> index b1bc12c..34a9d6f 100644
> --- a/drivers/clk/clk-si5351.c
> +++ b/drivers/clk/clk-si5351.c
> @@ -898,6 +898,19 @@ static int _si5351_clkout_set_disable_state(
>         return 0;
>  }
>  =

> +static int _si5351_clkout_set_clk_invert(
> +       struct si5351_driver_data *drvdata, int num,
> +       bool invert)
> +{
> +       if (num > 8)
> +               return -EINVAL;
> +
> +       si5351_set_bits(drvdata, SI5351_CLK0_CTRL + num,
> +                       SI5351_CLK_INVERT, (invert) ? SI5351_CLK_INVERT :=
 0);
> +
> +       return 0;
> +}
> +
>  static int si5351_clkout_prepare(struct clk_hw *hw)
>  {
>         struct si5351_hw_data *hwdata =3D
> @@ -1299,6 +1312,9 @@ static int si5351_dt_parse(struct i2c_client *clien=
t,
>  =

>                 pdata->clkout[num].pll_master =3D
>                         of_property_read_bool(child, "silabs,pll-master");
> +
> +               pdata->clkout[num].clk_invert =3D
> +                       of_property_read_bool(child, "silabs,clk-invert");
>         }
>         client->dev.platform_data =3D pdata;
>  =

> @@ -1420,6 +1436,15 @@ static int si5351_i2c_probe(struct i2c_client *cli=
ent,
>                                 n, pdata->clkout[n].disable_state);
>                         return ret;
>                 }
> +
> +               ret =3D _si5351_clkout_set_clk_invert(drvdata, n,
> +                                               pdata->clkout[n].clk_inve=
rt);
> +               if (ret) {
> +                       dev_err(&client->dev,
> +                               "failed set invert of clkout%d to %d\n",
> +                               n, pdata->clkout[n].clk_invert);
> +                       return ret;
> +               }
>         }
>  =

>         if (!IS_ERR(drvdata->pxtal))
> diff --git a/include/linux/platform_data/si5351.h b/include/linux/platfor=
m_data/si5351.h
> index 533d980..38ffda5 100644
> --- a/include/linux/platform_data/si5351.h
> +++ b/include/linux/platform_data/si5351.h
> @@ -94,6 +94,7 @@ struct si5351_clkout_config {
>         enum si5351_drive_strength drive;
>         enum si5351_disable_state disable_state;
>         bool pll_master;
> +       bool clk_invert;
>         unsigned long rate;
>  };
>  =

> -- =

> 2.8.1
> =

> --
> To unsubscribe from this list: send the line "unsubscribe linux-clk" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-08-25  0:33 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-25 15:31 [PATCH] clk: si5351: Add invert clock output option Jens Renner
2016-08-25  0:33 ` Michael Turquette

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.