All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] clk: Add support for IDT 5P49V5935
@ 2017-04-04 13:16 ` Alexey Firago
  0 siblings, 0 replies; 13+ messages in thread
From: Alexey Firago @ 2017-04-04 13:16 UTC (permalink / raw)
  To: mturquette-rdvid1DuHRBWk0Htik3J/w, sboyd-sgV2jX0FEOL9JmXXK+q4OQ,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
	marek.vasut-Re5JQEeQqe8AvxtiuMwx3w,
	linux-clk-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA
  Cc: Alexey Firago

This series adds support for IDT VersaClock 5P49V5935 programmable clock
generator to the existing clk-versaclock5 driver.

Patches were verified on Avnet UltraZed-EG board with IO Carrier Card. 

Alexey Firago (2):
  clk: vc5: Add bindings for IDT VersaClock 5P49V5935
  clk: vc5: Add support for IDT VersaClock 5P49V5935

 .../devicetree/bindings/clock/idt,versaclock5.txt  | 16 +++++--
 drivers/clk/clk-versaclock5.c                      | 50 +++++++++++++++++-----
 2 files changed, 53 insertions(+), 13 deletions(-)

-- 
2.7.4

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

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

* [PATCH 0/2] clk: Add support for IDT 5P49V5935
@ 2017-04-04 13:16 ` Alexey Firago
  0 siblings, 0 replies; 13+ messages in thread
From: Alexey Firago @ 2017-04-04 13:16 UTC (permalink / raw)
  To: mturquette, sboyd, robh+dt, marek.vasut, linux-clk, devicetree
  Cc: Alexey Firago

This series adds support for IDT VersaClock 5P49V5935 programmable clock
generator to the existing clk-versaclock5 driver.

Patches were verified on Avnet UltraZed-EG board with IO Carrier Card. 

Alexey Firago (2):
  clk: vc5: Add bindings for IDT VersaClock 5P49V5935
  clk: vc5: Add support for IDT VersaClock 5P49V5935

 .../devicetree/bindings/clock/idt,versaclock5.txt  | 16 +++++--
 drivers/clk/clk-versaclock5.c                      | 50 +++++++++++++++++-----
 2 files changed, 53 insertions(+), 13 deletions(-)

-- 
2.7.4

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

* [PATCH 1/2] clk: vc5: Add bindings for IDT VersaClock 5P49V5935
  2017-04-04 13:16 ` Alexey Firago
@ 2017-04-04 13:16     ` Alexey Firago
  -1 siblings, 0 replies; 13+ messages in thread
From: Alexey Firago @ 2017-04-04 13:16 UTC (permalink / raw)
  To: mturquette-rdvid1DuHRBWk0Htik3J/w, sboyd-sgV2jX0FEOL9JmXXK+q4OQ,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
	marek.vasut-Re5JQEeQqe8AvxtiuMwx3w,
	linux-clk-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA
  Cc: Alexey Firago

IDT VersaClock 5 5P49V5935 has 4 clock outputs, 4 fractional dividers.
Input clock source can be taken from either integrated crystal or from
external reference clock.

Signed-off-by: Alexey Firago <alexey_firago-nmGgyN9QBj3QT0dZR+AlfA@public.gmane.org>
---
 .../devicetree/bindings/clock/idt,versaclock5.txt        | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/clock/idt,versaclock5.txt b/Documentation/devicetree/bindings/clock/idt,versaclock5.txt
index 87e9c47..53d7e50 100644
--- a/Documentation/devicetree/bindings/clock/idt,versaclock5.txt
+++ b/Documentation/devicetree/bindings/clock/idt,versaclock5.txt
@@ -6,18 +6,21 @@ from 3 to 12 output clocks.
 ==I2C device node==
 
 Required properties:
-- compatible:	shall be one of "idt,5p49v5923" , "idt,5p49v5933".
+- compatible:	shall be one of "idt,5p49v5923" , "idt,5p49v5933" ,
+		"idt,5p49v5935".
 - reg:		i2c device address, shall be 0x68 or 0x6a.
 - #clock-cells:	from common clock binding; shall be set to 1.
 - clocks:	from common clock binding; list of parent clock handles,
 		- 5p49v5923: (required) either or both of XTAL or CLKIN
 					reference clock.
-		- 5p49v5933: (optional) property not present (internal
+		- 5p49v5933 and
+		- 5p49v5935: (optional) property not present (internal
 					Xtal used) or CLKIN reference
 					clock.
 - clock-names:	from common clock binding; clock input names, can be
 		- 5p49v5923: (required) either or both of "xin", "clkin".
-		- 5p49v5933: (optional) property not present or "clkin".
+		- 5p49v5933 and
+		- 5p49v5935: (optional) property not present or "clkin".
 
 ==Mapping between clock specifier and physical pins==
 
@@ -34,6 +37,13 @@ clock specifier, the following mapping applies:
 	1 -- OUT1
 	2 -- OUT4
 
+5P49V5935:
+	0 -- OUT0_SEL_I2CB
+	1 -- OUT1
+	2 -- OUT2
+	3 -- OUT3
+	4 -- OUT4
+
 ==Example==
 
 /* 25MHz reference crystal */
-- 
2.7.4

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

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

* [PATCH 1/2] clk: vc5: Add bindings for IDT VersaClock 5P49V5935
@ 2017-04-04 13:16     ` Alexey Firago
  0 siblings, 0 replies; 13+ messages in thread
From: Alexey Firago @ 2017-04-04 13:16 UTC (permalink / raw)
  To: mturquette, sboyd, robh+dt, marek.vasut, linux-clk, devicetree
  Cc: Alexey Firago

IDT VersaClock 5 5P49V5935 has 4 clock outputs, 4 fractional dividers.
Input clock source can be taken from either integrated crystal or from
external reference clock.

Signed-off-by: Alexey Firago <alexey_firago@mentor.com>
---
 .../devicetree/bindings/clock/idt,versaclock5.txt        | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/clock/idt,versaclock5.txt b/Documentation/devicetree/bindings/clock/idt,versaclock5.txt
index 87e9c47..53d7e50 100644
--- a/Documentation/devicetree/bindings/clock/idt,versaclock5.txt
+++ b/Documentation/devicetree/bindings/clock/idt,versaclock5.txt
@@ -6,18 +6,21 @@ from 3 to 12 output clocks.
 ==I2C device node==
 
 Required properties:
-- compatible:	shall be one of "idt,5p49v5923" , "idt,5p49v5933".
+- compatible:	shall be one of "idt,5p49v5923" , "idt,5p49v5933" ,
+		"idt,5p49v5935".
 - reg:		i2c device address, shall be 0x68 or 0x6a.
 - #clock-cells:	from common clock binding; shall be set to 1.
 - clocks:	from common clock binding; list of parent clock handles,
 		- 5p49v5923: (required) either or both of XTAL or CLKIN
 					reference clock.
-		- 5p49v5933: (optional) property not present (internal
+		- 5p49v5933 and
+		- 5p49v5935: (optional) property not present (internal
 					Xtal used) or CLKIN reference
 					clock.
 - clock-names:	from common clock binding; clock input names, can be
 		- 5p49v5923: (required) either or both of "xin", "clkin".
-		- 5p49v5933: (optional) property not present or "clkin".
+		- 5p49v5933 and
+		- 5p49v5935: (optional) property not present or "clkin".
 
 ==Mapping between clock specifier and physical pins==
 
@@ -34,6 +37,13 @@ clock specifier, the following mapping applies:
 	1 -- OUT1
 	2 -- OUT4
 
+5P49V5935:
+	0 -- OUT0_SEL_I2CB
+	1 -- OUT1
+	2 -- OUT2
+	3 -- OUT3
+	4 -- OUT4
+
 ==Example==
 
 /* 25MHz reference crystal */
-- 
2.7.4

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

* [PATCH 2/2] clk: vc5: Add support for IDT VersaClock 5P49V5935
  2017-04-04 13:16 ` Alexey Firago
@ 2017-04-04 13:16   ` Alexey Firago
  -1 siblings, 0 replies; 13+ messages in thread
From: Alexey Firago @ 2017-04-04 13:16 UTC (permalink / raw)
  To: mturquette, sboyd, robh+dt, marek.vasut, linux-clk, devicetree
  Cc: Alexey Firago

Update IDT VersaClock 5 driver to support 5P49V5935. This chip has
two clock inputs (internal XTAL or external CLKIN), four fractional
dividers (FODs) and five clock outputs (four universal clock outputs
and one reference clock output at OUT0_SELB_I2C).

Current driver supports up to 2 FODs and up to 3 clock outputs.
This patch sets max number of supported FODs to 4 and max number
of supported clocks to 5.

Number of used FODs and clock outputs is set on probe according to
the model specified via device-tree.

Signed-off-by: Alexey Firago <alexey_firago@mentor.com>
---
 drivers/clk/clk-versaclock5.c | 50 ++++++++++++++++++++++++++++++++++---------
 1 file changed, 40 insertions(+), 10 deletions(-)

diff --git a/drivers/clk/clk-versaclock5.c b/drivers/clk/clk-versaclock5.c
index 56741f3..f74d6e4 100644
--- a/drivers/clk/clk-versaclock5.c
+++ b/drivers/clk/clk-versaclock5.c
@@ -113,10 +113,17 @@
 #define VC5_MUX_IN_XIN		BIT(0)
 #define VC5_MUX_IN_CLKIN	BIT(1)
 
+/* Maximum number of clk_out supported by this driver */
+#define VC5_MAX_CLK_OUT_NUM	5
+
+/* Maximum number of FODs supported by this driver */
+#define VC5_MAX_FOD_NUM		4
+
 /* Supported IDT VC5 models. */
 enum vc5_model {
 	IDT_VC5_5P49V5923,
 	IDT_VC5_5P49V5933,
+	IDT_VC5_5P49V5935,
 };
 
 struct vc5_driver_data;
@@ -139,8 +146,10 @@ struct vc5_driver_data {
 	unsigned char		clk_mux_ins;
 	struct clk_hw		clk_mux;
 	struct vc5_hw_data	clk_pll;
-	struct vc5_hw_data	clk_fod[2];
-	struct vc5_hw_data	clk_out[3];
+	int			clk_fod_cnt;
+	struct vc5_hw_data	clk_fod[VC5_MAX_FOD_NUM];
+	int			clk_out_cnt;
+	struct vc5_hw_data	clk_out[VC5_MAX_CLK_OUT_NUM];
 };
 
 static const char * const vc5_mux_names[] = {
@@ -563,7 +572,7 @@ static struct clk_hw *vc5_of_clk_get(struct of_phandle_args *clkspec,
 	struct vc5_driver_data *vc5 = data;
 	unsigned int idx = clkspec->args[0];
 
-	if (idx > 2)
+	if (idx > vc5->clk_out_cnt)
 		return ERR_PTR(-EINVAL);
 
 	return &vc5->clk_out[idx].hw;
@@ -576,6 +585,7 @@ static int vc5_map_index_to_output(const enum vc5_model model,
 	case IDT_VC5_5P49V5933:
 		return (n == 0) ? 0 : 3;
 	case IDT_VC5_5P49V5923:
+	case IDT_VC5_5P49V5935:
 	default:
 		return n;
 	}
@@ -591,7 +601,7 @@ static int vc5_probe(struct i2c_client *client,
 	struct vc5_driver_data *vc5;
 	struct clk_init_data init;
 	const char *parent_names[2];
-	unsigned int n, idx;
+	unsigned int n, idx = 0;
 	int ret;
 
 	vc5 = devm_kzalloc(&client->dev, sizeof(*vc5), GFP_KERNEL);
@@ -602,6 +612,23 @@ static int vc5_probe(struct i2c_client *client,
 	vc5->client = client;
 	vc5->model = (enum vc5_model)of_id->data;
 
+	/* Set number of supported outputs according to the repoted model */
+	switch (vc5->model) {
+	case IDT_VC5_5P49V5923:
+	case IDT_VC5_5P49V5933:
+		vc5->clk_fod_cnt = 2;
+		vc5->clk_out_cnt = 3;
+		break;
+	case IDT_VC5_5P49V5935:
+		vc5->clk_fod_cnt = 4;
+		vc5->clk_out_cnt = 5;
+		break;
+	default:
+		/* Should never go here */
+		dev_err(&client->dev, "unsupported IDT VC5 ID specified\n");
+		return -EINVAL;
+	}
+
 	vc5->pin_xin = devm_clk_get(&client->dev, "xin");
 	if (PTR_ERR(vc5->pin_xin) == -EPROBE_DEFER)
 		return -EPROBE_DEFER;
@@ -622,8 +649,9 @@ static int vc5_probe(struct i2c_client *client,
 	if (!IS_ERR(vc5->pin_xin)) {
 		vc5->clk_mux_ins |= VC5_MUX_IN_XIN;
 		parent_names[init.num_parents++] = __clk_get_name(vc5->pin_xin);
-	} else if (vc5->model == IDT_VC5_5P49V5933) {
-		/* IDT VC5 5P49V5933 has built-in oscilator. */
+	} else if (vc5->model == IDT_VC5_5P49V5933 ||
+		   vc5->model == IDT_VC5_5P49V5935) {
+		/* IDT VC5 5P49V5933 and 5P49V5935 have built-in oscilator. */
 		vc5->pin_xin = clk_register_fixed_rate(&client->dev,
 						       "internal-xtal", NULL,
 						       0, 25000000);
@@ -672,7 +700,7 @@ static int vc5_probe(struct i2c_client *client,
 	}
 
 	/* Register FODs */
-	for (n = 0; n < 2; n++) {
+	for (n = 0; n < vc5->clk_fod_cnt; n++) {
 		idx = vc5_map_index_to_output(vc5->model, n);
 		memset(&init, 0, sizeof(init));
 		init.name = vc5_fod_names[idx];
@@ -709,7 +737,7 @@ static int vc5_probe(struct i2c_client *client,
 	}
 
 	/* Register FOD-connected OUTx outputs */
-	for (n = 1; n < 3; n++) {
+	for (n = 1; n < vc5->clk_out_cnt; n++) {
 		idx = vc5_map_index_to_output(vc5->model, n - 1);
 		parent_names[0] = vc5_fod_names[idx];
 		if (n == 1)
@@ -744,7 +772,7 @@ static int vc5_probe(struct i2c_client *client,
 	return 0;
 
 err_clk:
-	if (vc5->model == IDT_VC5_5P49V5933)
+	if (vc5->model == IDT_VC5_5P49V5933 || vc5->model == IDT_VC5_5P49V5935)
 		clk_unregister_fixed_rate(vc5->pin_xin);
 	return ret;
 }
@@ -755,7 +783,7 @@ static int vc5_remove(struct i2c_client *client)
 
 	of_clk_del_provider(client->dev.of_node);
 
-	if (vc5->model == IDT_VC5_5P49V5933)
+	if (vc5->model == IDT_VC5_5P49V5933 || vc5->model == IDT_VC5_5P49V5935)
 		clk_unregister_fixed_rate(vc5->pin_xin);
 
 	return 0;
@@ -764,6 +792,7 @@ static int vc5_remove(struct i2c_client *client)
 static const struct i2c_device_id vc5_id[] = {
 	{ "5p49v5923", .driver_data = IDT_VC5_5P49V5923 },
 	{ "5p49v5933", .driver_data = IDT_VC5_5P49V5933 },
+	{ "5p49v5935", .driver_data = IDT_VC5_5P49V5935 },
 	{ }
 };
 MODULE_DEVICE_TABLE(i2c, vc5_id);
@@ -771,6 +800,7 @@ MODULE_DEVICE_TABLE(i2c, vc5_id);
 static const struct of_device_id clk_vc5_of_match[] = {
 	{ .compatible = "idt,5p49v5923", .data = (void *)IDT_VC5_5P49V5923 },
 	{ .compatible = "idt,5p49v5933", .data = (void *)IDT_VC5_5P49V5933 },
+	{ .compatible = "idt,5p49v5935", .data = (void *)IDT_VC5_5P49V5935 },
 	{ },
 };
 MODULE_DEVICE_TABLE(of, clk_vc5_of_match);
-- 
2.7.4


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

* [PATCH 2/2] clk: vc5: Add support for IDT VersaClock 5P49V5935
@ 2017-04-04 13:16   ` Alexey Firago
  0 siblings, 0 replies; 13+ messages in thread
From: Alexey Firago @ 2017-04-04 13:16 UTC (permalink / raw)
  To: mturquette, sboyd, robh+dt, marek.vasut, linux-clk, devicetree
  Cc: Alexey Firago

Update IDT VersaClock 5 driver to support 5P49V5935. This chip has
two clock inputs (internal XTAL or external CLKIN), four fractional
dividers (FODs) and five clock outputs (four universal clock outputs
and one reference clock output at OUT0_SELB_I2C).

Current driver supports up to 2 FODs and up to 3 clock outputs.
This patch sets max number of supported FODs to 4 and max number
of supported clocks to 5.

Number of used FODs and clock outputs is set on probe according to
the model specified via device-tree.

Signed-off-by: Alexey Firago <alexey_firago@mentor.com>
---
 drivers/clk/clk-versaclock5.c | 50 ++++++++++++++++++++++++++++++++++---------
 1 file changed, 40 insertions(+), 10 deletions(-)

diff --git a/drivers/clk/clk-versaclock5.c b/drivers/clk/clk-versaclock5.c
index 56741f3..f74d6e4 100644
--- a/drivers/clk/clk-versaclock5.c
+++ b/drivers/clk/clk-versaclock5.c
@@ -113,10 +113,17 @@
 #define VC5_MUX_IN_XIN		BIT(0)
 #define VC5_MUX_IN_CLKIN	BIT(1)
 
+/* Maximum number of clk_out supported by this driver */
+#define VC5_MAX_CLK_OUT_NUM	5
+
+/* Maximum number of FODs supported by this driver */
+#define VC5_MAX_FOD_NUM		4
+
 /* Supported IDT VC5 models. */
 enum vc5_model {
 	IDT_VC5_5P49V5923,
 	IDT_VC5_5P49V5933,
+	IDT_VC5_5P49V5935,
 };
 
 struct vc5_driver_data;
@@ -139,8 +146,10 @@ struct vc5_driver_data {
 	unsigned char		clk_mux_ins;
 	struct clk_hw		clk_mux;
 	struct vc5_hw_data	clk_pll;
-	struct vc5_hw_data	clk_fod[2];
-	struct vc5_hw_data	clk_out[3];
+	int			clk_fod_cnt;
+	struct vc5_hw_data	clk_fod[VC5_MAX_FOD_NUM];
+	int			clk_out_cnt;
+	struct vc5_hw_data	clk_out[VC5_MAX_CLK_OUT_NUM];
 };
 
 static const char * const vc5_mux_names[] = {
@@ -563,7 +572,7 @@ static struct clk_hw *vc5_of_clk_get(struct of_phandle_args *clkspec,
 	struct vc5_driver_data *vc5 = data;
 	unsigned int idx = clkspec->args[0];
 
-	if (idx > 2)
+	if (idx > vc5->clk_out_cnt)
 		return ERR_PTR(-EINVAL);
 
 	return &vc5->clk_out[idx].hw;
@@ -576,6 +585,7 @@ static int vc5_map_index_to_output(const enum vc5_model model,
 	case IDT_VC5_5P49V5933:
 		return (n == 0) ? 0 : 3;
 	case IDT_VC5_5P49V5923:
+	case IDT_VC5_5P49V5935:
 	default:
 		return n;
 	}
@@ -591,7 +601,7 @@ static int vc5_probe(struct i2c_client *client,
 	struct vc5_driver_data *vc5;
 	struct clk_init_data init;
 	const char *parent_names[2];
-	unsigned int n, idx;
+	unsigned int n, idx = 0;
 	int ret;
 
 	vc5 = devm_kzalloc(&client->dev, sizeof(*vc5), GFP_KERNEL);
@@ -602,6 +612,23 @@ static int vc5_probe(struct i2c_client *client,
 	vc5->client = client;
 	vc5->model = (enum vc5_model)of_id->data;
 
+	/* Set number of supported outputs according to the repoted model */
+	switch (vc5->model) {
+	case IDT_VC5_5P49V5923:
+	case IDT_VC5_5P49V5933:
+		vc5->clk_fod_cnt = 2;
+		vc5->clk_out_cnt = 3;
+		break;
+	case IDT_VC5_5P49V5935:
+		vc5->clk_fod_cnt = 4;
+		vc5->clk_out_cnt = 5;
+		break;
+	default:
+		/* Should never go here */
+		dev_err(&client->dev, "unsupported IDT VC5 ID specified\n");
+		return -EINVAL;
+	}
+
 	vc5->pin_xin = devm_clk_get(&client->dev, "xin");
 	if (PTR_ERR(vc5->pin_xin) == -EPROBE_DEFER)
 		return -EPROBE_DEFER;
@@ -622,8 +649,9 @@ static int vc5_probe(struct i2c_client *client,
 	if (!IS_ERR(vc5->pin_xin)) {
 		vc5->clk_mux_ins |= VC5_MUX_IN_XIN;
 		parent_names[init.num_parents++] = __clk_get_name(vc5->pin_xin);
-	} else if (vc5->model == IDT_VC5_5P49V5933) {
-		/* IDT VC5 5P49V5933 has built-in oscilator. */
+	} else if (vc5->model == IDT_VC5_5P49V5933 ||
+		   vc5->model == IDT_VC5_5P49V5935) {
+		/* IDT VC5 5P49V5933 and 5P49V5935 have built-in oscilator. */
 		vc5->pin_xin = clk_register_fixed_rate(&client->dev,
 						       "internal-xtal", NULL,
 						       0, 25000000);
@@ -672,7 +700,7 @@ static int vc5_probe(struct i2c_client *client,
 	}
 
 	/* Register FODs */
-	for (n = 0; n < 2; n++) {
+	for (n = 0; n < vc5->clk_fod_cnt; n++) {
 		idx = vc5_map_index_to_output(vc5->model, n);
 		memset(&init, 0, sizeof(init));
 		init.name = vc5_fod_names[idx];
@@ -709,7 +737,7 @@ static int vc5_probe(struct i2c_client *client,
 	}
 
 	/* Register FOD-connected OUTx outputs */
-	for (n = 1; n < 3; n++) {
+	for (n = 1; n < vc5->clk_out_cnt; n++) {
 		idx = vc5_map_index_to_output(vc5->model, n - 1);
 		parent_names[0] = vc5_fod_names[idx];
 		if (n == 1)
@@ -744,7 +772,7 @@ static int vc5_probe(struct i2c_client *client,
 	return 0;
 
 err_clk:
-	if (vc5->model == IDT_VC5_5P49V5933)
+	if (vc5->model == IDT_VC5_5P49V5933 || vc5->model == IDT_VC5_5P49V5935)
 		clk_unregister_fixed_rate(vc5->pin_xin);
 	return ret;
 }
@@ -755,7 +783,7 @@ static int vc5_remove(struct i2c_client *client)
 
 	of_clk_del_provider(client->dev.of_node);
 
-	if (vc5->model == IDT_VC5_5P49V5933)
+	if (vc5->model == IDT_VC5_5P49V5933 || vc5->model == IDT_VC5_5P49V5935)
 		clk_unregister_fixed_rate(vc5->pin_xin);
 
 	return 0;
@@ -764,6 +792,7 @@ static int vc5_remove(struct i2c_client *client)
 static const struct i2c_device_id vc5_id[] = {
 	{ "5p49v5923", .driver_data = IDT_VC5_5P49V5923 },
 	{ "5p49v5933", .driver_data = IDT_VC5_5P49V5933 },
+	{ "5p49v5935", .driver_data = IDT_VC5_5P49V5935 },
 	{ }
 };
 MODULE_DEVICE_TABLE(i2c, vc5_id);
@@ -771,6 +800,7 @@ MODULE_DEVICE_TABLE(i2c, vc5_id);
 static const struct of_device_id clk_vc5_of_match[] = {
 	{ .compatible = "idt,5p49v5923", .data = (void *)IDT_VC5_5P49V5923 },
 	{ .compatible = "idt,5p49v5933", .data = (void *)IDT_VC5_5P49V5933 },
+	{ .compatible = "idt,5p49v5935", .data = (void *)IDT_VC5_5P49V5935 },
 	{ },
 };
 MODULE_DEVICE_TABLE(of, clk_vc5_of_match);
-- 
2.7.4

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

* Re: [PATCH 2/2] clk: vc5: Add support for IDT VersaClock 5P49V5935
  2017-04-04 13:16   ` Alexey Firago
  (?)
@ 2017-04-04 13:21   ` Marek Vasut
       [not found]     ` <72c66927-0acf-c888-2b4b-906a6c27e15c-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  -1 siblings, 1 reply; 13+ messages in thread
From: Marek Vasut @ 2017-04-04 13:21 UTC (permalink / raw)
  To: Alexey Firago, mturquette, sboyd, robh+dt, linux-clk, devicetree

On 04/04/2017 03:16 PM, Alexey Firago wrote:
> Update IDT VersaClock 5 driver to support 5P49V5935. This chip has
> two clock inputs (internal XTAL or external CLKIN), four fractional
> dividers (FODs) and five clock outputs (four universal clock outputs
> and one reference clock output at OUT0_SELB_I2C).
> 
> Current driver supports up to 2 FODs and up to 3 clock outputs.
> This patch sets max number of supported FODs to 4 and max number
> of supported clocks to 5.
> 
> Number of used FODs and clock outputs is set on probe according to
> the model specified via device-tree.
> 
> Signed-off-by: Alexey Firago <alexey_firago@mentor.com>
> ---
>  drivers/clk/clk-versaclock5.c | 50 ++++++++++++++++++++++++++++++++++---------
>  1 file changed, 40 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/clk/clk-versaclock5.c b/drivers/clk/clk-versaclock5.c
> index 56741f3..f74d6e4 100644
> --- a/drivers/clk/clk-versaclock5.c
> +++ b/drivers/clk/clk-versaclock5.c
> @@ -113,10 +113,17 @@
>  #define VC5_MUX_IN_XIN		BIT(0)
>  #define VC5_MUX_IN_CLKIN	BIT(1)
>  
> +/* Maximum number of clk_out supported by this driver */
> +#define VC5_MAX_CLK_OUT_NUM	5
> +
> +/* Maximum number of FODs supported by this driver */
> +#define VC5_MAX_FOD_NUM		4
> +
>  /* Supported IDT VC5 models. */
>  enum vc5_model {
>  	IDT_VC5_5P49V5923,
>  	IDT_VC5_5P49V5933,
> +	IDT_VC5_5P49V5935,
>  };
>  
>  struct vc5_driver_data;
> @@ -139,8 +146,10 @@ struct vc5_driver_data {
>  	unsigned char		clk_mux_ins;
>  	struct clk_hw		clk_mux;
>  	struct vc5_hw_data	clk_pll;
> -	struct vc5_hw_data	clk_fod[2];
> -	struct vc5_hw_data	clk_out[3];
> +	int			clk_fod_cnt;
> +	struct vc5_hw_data	clk_fod[VC5_MAX_FOD_NUM];
> +	int			clk_out_cnt;
> +	struct vc5_hw_data	clk_out[VC5_MAX_CLK_OUT_NUM];
>  };
>  
>  static const char * const vc5_mux_names[] = {
> @@ -563,7 +572,7 @@ static struct clk_hw *vc5_of_clk_get(struct of_phandle_args *clkspec,
>  	struct vc5_driver_data *vc5 = data;
>  	unsigned int idx = clkspec->args[0];
>  
> -	if (idx > 2)
> +	if (idx > vc5->clk_out_cnt)
>  		return ERR_PTR(-EINVAL);
>  
>  	return &vc5->clk_out[idx].hw;
> @@ -576,6 +585,7 @@ static int vc5_map_index_to_output(const enum vc5_model model,
>  	case IDT_VC5_5P49V5933:
>  		return (n == 0) ? 0 : 3;
>  	case IDT_VC5_5P49V5923:
> +	case IDT_VC5_5P49V5935:
>  	default:
>  		return n;
>  	}
> @@ -591,7 +601,7 @@ static int vc5_probe(struct i2c_client *client,
>  	struct vc5_driver_data *vc5;
>  	struct clk_init_data init;
>  	const char *parent_names[2];
> -	unsigned int n, idx;
> +	unsigned int n, idx = 0;
>  	int ret;
>  
>  	vc5 = devm_kzalloc(&client->dev, sizeof(*vc5), GFP_KERNEL);
> @@ -602,6 +612,23 @@ static int vc5_probe(struct i2c_client *client,
>  	vc5->client = client;
>  	vc5->model = (enum vc5_model)of_id->data;
>  
> +	/* Set number of supported outputs according to the repoted model */

s/repoted/reported/ :)

> +	switch (vc5->model) {
> +	case IDT_VC5_5P49V5923:
> +	case IDT_VC5_5P49V5933:
> +		vc5->clk_fod_cnt = 2;
> +		vc5->clk_out_cnt = 3;
> +		break;
> +	case IDT_VC5_5P49V5935:
> +		vc5->clk_fod_cnt = 4;
> +		vc5->clk_out_cnt = 5;
> +		break;
> +	default:
> +		/* Should never go here */
> +		dev_err(&client->dev, "unsupported IDT VC5 ID specified\n");
> +		return -EINVAL;
> +	}
> +
>  	vc5->pin_xin = devm_clk_get(&client->dev, "xin");
>  	if (PTR_ERR(vc5->pin_xin) == -EPROBE_DEFER)
>  		return -EPROBE_DEFER;
> @@ -622,8 +649,9 @@ static int vc5_probe(struct i2c_client *client,
>  	if (!IS_ERR(vc5->pin_xin)) {
>  		vc5->clk_mux_ins |= VC5_MUX_IN_XIN;
>  		parent_names[init.num_parents++] = __clk_get_name(vc5->pin_xin);
> -	} else if (vc5->model == IDT_VC5_5P49V5933) {
> -		/* IDT VC5 5P49V5933 has built-in oscilator. */
> +	} else if (vc5->model == IDT_VC5_5P49V5933 ||
> +		   vc5->model == IDT_VC5_5P49V5935) {
> +		/* IDT VC5 5P49V5933 and 5P49V5935 have built-in oscilator. */
>  		vc5->pin_xin = clk_register_fixed_rate(&client->dev,
>  						       "internal-xtal", NULL,
>  						       0, 25000000);
> @@ -672,7 +700,7 @@ static int vc5_probe(struct i2c_client *client,
>  	}
>  
>  	/* Register FODs */
> -	for (n = 0; n < 2; n++) {
> +	for (n = 0; n < vc5->clk_fod_cnt; n++) {
>  		idx = vc5_map_index_to_output(vc5->model, n);
>  		memset(&init, 0, sizeof(init));
>  		init.name = vc5_fod_names[idx];
> @@ -709,7 +737,7 @@ static int vc5_probe(struct i2c_client *client,
>  	}
>  
>  	/* Register FOD-connected OUTx outputs */
> -	for (n = 1; n < 3; n++) {
> +	for (n = 1; n < vc5->clk_out_cnt; n++) {
>  		idx = vc5_map_index_to_output(vc5->model, n - 1);
>  		parent_names[0] = vc5_fod_names[idx];
>  		if (n == 1)
> @@ -744,7 +772,7 @@ static int vc5_probe(struct i2c_client *client,
>  	return 0;
>  
>  err_clk:
> -	if (vc5->model == IDT_VC5_5P49V5933)
> +	if (vc5->model == IDT_VC5_5P49V5933 || vc5->model == IDT_VC5_5P49V5935)

Maybe we should introduce some sort of flags to describe the VC
properties instead of using the model all over the place ?



-- 
Best regards,
Marek Vasut

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

* Re: [PATCH 2/2] clk: vc5: Add support for IDT VersaClock 5P49V5935
  2017-04-04 13:21   ` Marek Vasut
@ 2017-04-04 13:23         ` Geert Uytterhoeven
  0 siblings, 0 replies; 13+ messages in thread
From: Geert Uytterhoeven @ 2017-04-04 13:23 UTC (permalink / raw)
  To: Marek Vasut
  Cc: Alexey Firago, Michael Turquette, Stephen Boyd, Rob Herring,
	linux-clk, devicetree-u79uwXL29TY76Z2rM5mHXA

On Tue, Apr 4, 2017 at 3:21 PM, Marek Vasut <marek.vasut-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>On 04/04/2017 03:16 PM, Alexey Firago wrote:
>> +     switch (vc5->model) {
>> +     case IDT_VC5_5P49V5923:
>> +     case IDT_VC5_5P49V5933:
>> +             vc5->clk_fod_cnt = 2;
>> +             vc5->clk_out_cnt = 3;
>> +             break;
>> +     case IDT_VC5_5P49V5935:
>> +             vc5->clk_fod_cnt = 4;
>> +             vc5->clk_out_cnt = 5;
>> +             break;
>> +     default:
>> +             /* Should never go here */
>> +             dev_err(&client->dev, "unsupported IDT VC5 ID specified\n");
>> +             return -EINVAL;
>> +     }
>> +
>>       vc5->pin_xin = devm_clk_get(&client->dev, "xin");
>>       if (PTR_ERR(vc5->pin_xin) == -EPROBE_DEFER)
>>               return -EPROBE_DEFER;

>> @@ -744,7 +772,7 @@ static int vc5_probe(struct i2c_client *client,
>>       return 0;
>>
>>  err_clk:
>> -     if (vc5->model == IDT_VC5_5P49V5933)
>> +     if (vc5->model == IDT_VC5_5P49V5933 || vc5->model == IDT_VC5_5P49V5935)
>
> Maybe we should introduce some sort of flags to describe the VC
> properties instead of using the model all over the place ?

Yep, a structure describing the features (incl. fod_cnt and out_cnt), to be
pointed to by clk_vc5_of_match[].data.

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert-Td1EMuHUCqxL1ZNQvxDV9g@public.gmane.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 2/2] clk: vc5: Add support for IDT VersaClock 5P49V5935
@ 2017-04-04 13:23         ` Geert Uytterhoeven
  0 siblings, 0 replies; 13+ messages in thread
From: Geert Uytterhoeven @ 2017-04-04 13:23 UTC (permalink / raw)
  To: Marek Vasut
  Cc: Alexey Firago, Michael Turquette, Stephen Boyd, Rob Herring,
	linux-clk, devicetree

On Tue, Apr 4, 2017 at 3:21 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>On 04/04/2017 03:16 PM, Alexey Firago wrote:
>> +     switch (vc5->model) {
>> +     case IDT_VC5_5P49V5923:
>> +     case IDT_VC5_5P49V5933:
>> +             vc5->clk_fod_cnt = 2;
>> +             vc5->clk_out_cnt = 3;
>> +             break;
>> +     case IDT_VC5_5P49V5935:
>> +             vc5->clk_fod_cnt = 4;
>> +             vc5->clk_out_cnt = 5;
>> +             break;
>> +     default:
>> +             /* Should never go here */
>> +             dev_err(&client->dev, "unsupported IDT VC5 ID specified\n");
>> +             return -EINVAL;
>> +     }
>> +
>>       vc5->pin_xin = devm_clk_get(&client->dev, "xin");
>>       if (PTR_ERR(vc5->pin_xin) == -EPROBE_DEFER)
>>               return -EPROBE_DEFER;

>> @@ -744,7 +772,7 @@ static int vc5_probe(struct i2c_client *client,
>>       return 0;
>>
>>  err_clk:
>> -     if (vc5->model == IDT_VC5_5P49V5933)
>> +     if (vc5->model == IDT_VC5_5P49V5933 || vc5->model == IDT_VC5_5P49V5935)
>
> Maybe we should introduce some sort of flags to describe the VC
> properties instead of using the model all over the place ?

Yep, a structure describing the features (incl. fod_cnt and out_cnt), to be
pointed to by clk_vc5_of_match[].data.

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

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

* Re: [PATCH 2/2] clk: vc5: Add support for IDT VersaClock 5P49V5935
  2017-04-04 13:21   ` Marek Vasut
@ 2017-04-04 13:35         ` Alexey Firago
  0 siblings, 0 replies; 13+ messages in thread
From: Alexey Firago @ 2017-04-04 13:35 UTC (permalink / raw)
  To: Marek Vasut, mturquette-rdvid1DuHRBWk0Htik3J/w,
	sboyd-sgV2jX0FEOL9JmXXK+q4OQ, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
	linux-clk-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA

On 04.04.2017 16:21, Marek Vasut wrote:
> On 04/04/2017 03:16 PM, Alexey Firago wrote:
>> Update IDT VersaClock 5 driver to support 5P49V5935. This chip has
>> two clock inputs (internal XTAL or external CLKIN), four fractional
>> dividers (FODs) and five clock outputs (four universal clock outputs
>> and one reference clock output at OUT0_SELB_I2C).
>>
>> Current driver supports up to 2 FODs and up to 3 clock outputs.
>> This patch sets max number of supported FODs to 4 and max number
>> of supported clocks to 5.
>>
>> Number of used FODs and clock outputs is set on probe according to
>> the model specified via device-tree.
>>
>> Signed-off-by: Alexey Firago <alexey_firago-nmGgyN9QBj3QT0dZR+AlfA@public.gmane.org>
>> ---
>>  drivers/clk/clk-versaclock5.c | 50 ++++++++++++++++++++++++++++++++++---------
>>  1 file changed, 40 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/clk/clk-versaclock5.c b/drivers/clk/clk-versaclock5.c
>> index 56741f3..f74d6e4 100644
>> --- a/drivers/clk/clk-versaclock5.c
>> +++ b/drivers/clk/clk-versaclock5.c
>> @@ -113,10 +113,17 @@
>>  #define VC5_MUX_IN_XIN		BIT(0)
>>  #define VC5_MUX_IN_CLKIN	BIT(1)
>>
>> +/* Maximum number of clk_out supported by this driver */
>> +#define VC5_MAX_CLK_OUT_NUM	5
>> +
>> +/* Maximum number of FODs supported by this driver */
>> +#define VC5_MAX_FOD_NUM		4
>> +
>>  /* Supported IDT VC5 models. */
>>  enum vc5_model {
>>  	IDT_VC5_5P49V5923,
>>  	IDT_VC5_5P49V5933,
>> +	IDT_VC5_5P49V5935,
>>  };
>>
>>  struct vc5_driver_data;
>> @@ -139,8 +146,10 @@ struct vc5_driver_data {
>>  	unsigned char		clk_mux_ins;
>>  	struct clk_hw		clk_mux;
>>  	struct vc5_hw_data	clk_pll;
>> -	struct vc5_hw_data	clk_fod[2];
>> -	struct vc5_hw_data	clk_out[3];
>> +	int			clk_fod_cnt;
>> +	struct vc5_hw_data	clk_fod[VC5_MAX_FOD_NUM];
>> +	int			clk_out_cnt;
>> +	struct vc5_hw_data	clk_out[VC5_MAX_CLK_OUT_NUM];
>>  };
>>
>>  static const char * const vc5_mux_names[] = {
>> @@ -563,7 +572,7 @@ static struct clk_hw *vc5_of_clk_get(struct of_phandle_args *clkspec,
>>  	struct vc5_driver_data *vc5 = data;
>>  	unsigned int idx = clkspec->args[0];
>>
>> -	if (idx > 2)
>> +	if (idx > vc5->clk_out_cnt)
>>  		return ERR_PTR(-EINVAL);
>>
>>  	return &vc5->clk_out[idx].hw;
>> @@ -576,6 +585,7 @@ static int vc5_map_index_to_output(const enum vc5_model model,
>>  	case IDT_VC5_5P49V5933:
>>  		return (n == 0) ? 0 : 3;
>>  	case IDT_VC5_5P49V5923:
>> +	case IDT_VC5_5P49V5935:
>>  	default:
>>  		return n;
>>  	}
>> @@ -591,7 +601,7 @@ static int vc5_probe(struct i2c_client *client,
>>  	struct vc5_driver_data *vc5;
>>  	struct clk_init_data init;
>>  	const char *parent_names[2];
>> -	unsigned int n, idx;
>> +	unsigned int n, idx = 0;
>>  	int ret;
>>
>>  	vc5 = devm_kzalloc(&client->dev, sizeof(*vc5), GFP_KERNEL);
>> @@ -602,6 +612,23 @@ static int vc5_probe(struct i2c_client *client,
>>  	vc5->client = client;
>>  	vc5->model = (enum vc5_model)of_id->data;
>>
>> +	/* Set number of supported outputs according to the repoted model */
>
> s/repoted/reported/ :)

Oops. Thanks, will fix.

>
>> +	switch (vc5->model) {
>> +	case IDT_VC5_5P49V5923:
>> +	case IDT_VC5_5P49V5933:
>> +		vc5->clk_fod_cnt = 2;
>> +		vc5->clk_out_cnt = 3;
>> +		break;
>> +	case IDT_VC5_5P49V5935:
>> +		vc5->clk_fod_cnt = 4;
>> +		vc5->clk_out_cnt = 5;
>> +		break;
>> +	default:
>> +		/* Should never go here */
>> +		dev_err(&client->dev, "unsupported IDT VC5 ID specified\n");
>> +		return -EINVAL;
>> +	}
>> +
>>  	vc5->pin_xin = devm_clk_get(&client->dev, "xin");
>>  	if (PTR_ERR(vc5->pin_xin) == -EPROBE_DEFER)
>>  		return -EPROBE_DEFER;
>> @@ -622,8 +649,9 @@ static int vc5_probe(struct i2c_client *client,
>>  	if (!IS_ERR(vc5->pin_xin)) {
>>  		vc5->clk_mux_ins |= VC5_MUX_IN_XIN;
>>  		parent_names[init.num_parents++] = __clk_get_name(vc5->pin_xin);
>> -	} else if (vc5->model == IDT_VC5_5P49V5933) {
>> -		/* IDT VC5 5P49V5933 has built-in oscilator. */
>> +	} else if (vc5->model == IDT_VC5_5P49V5933 ||
>> +		   vc5->model == IDT_VC5_5P49V5935) {
>> +		/* IDT VC5 5P49V5933 and 5P49V5935 have built-in oscilator. */
>>  		vc5->pin_xin = clk_register_fixed_rate(&client->dev,
>>  						       "internal-xtal", NULL,
>>  						       0, 25000000);
>> @@ -672,7 +700,7 @@ static int vc5_probe(struct i2c_client *client,
>>  	}
>>
>>  	/* Register FODs */
>> -	for (n = 0; n < 2; n++) {
>> +	for (n = 0; n < vc5->clk_fod_cnt; n++) {
>>  		idx = vc5_map_index_to_output(vc5->model, n);
>>  		memset(&init, 0, sizeof(init));
>>  		init.name = vc5_fod_names[idx];
>> @@ -709,7 +737,7 @@ static int vc5_probe(struct i2c_client *client,
>>  	}
>>
>>  	/* Register FOD-connected OUTx outputs */
>> -	for (n = 1; n < 3; n++) {
>> +	for (n = 1; n < vc5->clk_out_cnt; n++) {
>>  		idx = vc5_map_index_to_output(vc5->model, n - 1);
>>  		parent_names[0] = vc5_fod_names[idx];
>>  		if (n == 1)
>> @@ -744,7 +772,7 @@ static int vc5_probe(struct i2c_client *client,
>>  	return 0;
>>
>>  err_clk:
>> -	if (vc5->model == IDT_VC5_5P49V5933)
>> +	if (vc5->model == IDT_VC5_5P49V5933 || vc5->model == IDT_VC5_5P49V5935)
>
> Maybe we should introduce some sort of flags to describe the VC
> properties instead of using the model all over the place ?

That makes sense. Will rework.

Regards,
Alexey
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 2/2] clk: vc5: Add support for IDT VersaClock 5P49V5935
@ 2017-04-04 13:35         ` Alexey Firago
  0 siblings, 0 replies; 13+ messages in thread
From: Alexey Firago @ 2017-04-04 13:35 UTC (permalink / raw)
  To: Marek Vasut, mturquette, sboyd, robh+dt, linux-clk, devicetree

On 04.04.2017 16:21, Marek Vasut wrote:
> On 04/04/2017 03:16 PM, Alexey Firago wrote:
>> Update IDT VersaClock 5 driver to support 5P49V5935. This chip has
>> two clock inputs (internal XTAL or external CLKIN), four fractional
>> dividers (FODs) and five clock outputs (four universal clock outputs
>> and one reference clock output at OUT0_SELB_I2C).
>>
>> Current driver supports up to 2 FODs and up to 3 clock outputs.
>> This patch sets max number of supported FODs to 4 and max number
>> of supported clocks to 5.
>>
>> Number of used FODs and clock outputs is set on probe according to
>> the model specified via device-tree.
>>
>> Signed-off-by: Alexey Firago <alexey_firago@mentor.com>
>> ---
>>  drivers/clk/clk-versaclock5.c | 50 ++++++++++++++++++++++++++++++++++---------
>>  1 file changed, 40 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/clk/clk-versaclock5.c b/drivers/clk/clk-versaclock5.c
>> index 56741f3..f74d6e4 100644
>> --- a/drivers/clk/clk-versaclock5.c
>> +++ b/drivers/clk/clk-versaclock5.c
>> @@ -113,10 +113,17 @@
>>  #define VC5_MUX_IN_XIN		BIT(0)
>>  #define VC5_MUX_IN_CLKIN	BIT(1)
>>
>> +/* Maximum number of clk_out supported by this driver */
>> +#define VC5_MAX_CLK_OUT_NUM	5
>> +
>> +/* Maximum number of FODs supported by this driver */
>> +#define VC5_MAX_FOD_NUM		4
>> +
>>  /* Supported IDT VC5 models. */
>>  enum vc5_model {
>>  	IDT_VC5_5P49V5923,
>>  	IDT_VC5_5P49V5933,
>> +	IDT_VC5_5P49V5935,
>>  };
>>
>>  struct vc5_driver_data;
>> @@ -139,8 +146,10 @@ struct vc5_driver_data {
>>  	unsigned char		clk_mux_ins;
>>  	struct clk_hw		clk_mux;
>>  	struct vc5_hw_data	clk_pll;
>> -	struct vc5_hw_data	clk_fod[2];
>> -	struct vc5_hw_data	clk_out[3];
>> +	int			clk_fod_cnt;
>> +	struct vc5_hw_data	clk_fod[VC5_MAX_FOD_NUM];
>> +	int			clk_out_cnt;
>> +	struct vc5_hw_data	clk_out[VC5_MAX_CLK_OUT_NUM];
>>  };
>>
>>  static const char * const vc5_mux_names[] = {
>> @@ -563,7 +572,7 @@ static struct clk_hw *vc5_of_clk_get(struct of_phandle_args *clkspec,
>>  	struct vc5_driver_data *vc5 = data;
>>  	unsigned int idx = clkspec->args[0];
>>
>> -	if (idx > 2)
>> +	if (idx > vc5->clk_out_cnt)
>>  		return ERR_PTR(-EINVAL);
>>
>>  	return &vc5->clk_out[idx].hw;
>> @@ -576,6 +585,7 @@ static int vc5_map_index_to_output(const enum vc5_model model,
>>  	case IDT_VC5_5P49V5933:
>>  		return (n == 0) ? 0 : 3;
>>  	case IDT_VC5_5P49V5923:
>> +	case IDT_VC5_5P49V5935:
>>  	default:
>>  		return n;
>>  	}
>> @@ -591,7 +601,7 @@ static int vc5_probe(struct i2c_client *client,
>>  	struct vc5_driver_data *vc5;
>>  	struct clk_init_data init;
>>  	const char *parent_names[2];
>> -	unsigned int n, idx;
>> +	unsigned int n, idx = 0;
>>  	int ret;
>>
>>  	vc5 = devm_kzalloc(&client->dev, sizeof(*vc5), GFP_KERNEL);
>> @@ -602,6 +612,23 @@ static int vc5_probe(struct i2c_client *client,
>>  	vc5->client = client;
>>  	vc5->model = (enum vc5_model)of_id->data;
>>
>> +	/* Set number of supported outputs according to the repoted model */
>
> s/repoted/reported/ :)

Oops. Thanks, will fix.

>
>> +	switch (vc5->model) {
>> +	case IDT_VC5_5P49V5923:
>> +	case IDT_VC5_5P49V5933:
>> +		vc5->clk_fod_cnt = 2;
>> +		vc5->clk_out_cnt = 3;
>> +		break;
>> +	case IDT_VC5_5P49V5935:
>> +		vc5->clk_fod_cnt = 4;
>> +		vc5->clk_out_cnt = 5;
>> +		break;
>> +	default:
>> +		/* Should never go here */
>> +		dev_err(&client->dev, "unsupported IDT VC5 ID specified\n");
>> +		return -EINVAL;
>> +	}
>> +
>>  	vc5->pin_xin = devm_clk_get(&client->dev, "xin");
>>  	if (PTR_ERR(vc5->pin_xin) == -EPROBE_DEFER)
>>  		return -EPROBE_DEFER;
>> @@ -622,8 +649,9 @@ static int vc5_probe(struct i2c_client *client,
>>  	if (!IS_ERR(vc5->pin_xin)) {
>>  		vc5->clk_mux_ins |= VC5_MUX_IN_XIN;
>>  		parent_names[init.num_parents++] = __clk_get_name(vc5->pin_xin);
>> -	} else if (vc5->model == IDT_VC5_5P49V5933) {
>> -		/* IDT VC5 5P49V5933 has built-in oscilator. */
>> +	} else if (vc5->model == IDT_VC5_5P49V5933 ||
>> +		   vc5->model == IDT_VC5_5P49V5935) {
>> +		/* IDT VC5 5P49V5933 and 5P49V5935 have built-in oscilator. */
>>  		vc5->pin_xin = clk_register_fixed_rate(&client->dev,
>>  						       "internal-xtal", NULL,
>>  						       0, 25000000);
>> @@ -672,7 +700,7 @@ static int vc5_probe(struct i2c_client *client,
>>  	}
>>
>>  	/* Register FODs */
>> -	for (n = 0; n < 2; n++) {
>> +	for (n = 0; n < vc5->clk_fod_cnt; n++) {
>>  		idx = vc5_map_index_to_output(vc5->model, n);
>>  		memset(&init, 0, sizeof(init));
>>  		init.name = vc5_fod_names[idx];
>> @@ -709,7 +737,7 @@ static int vc5_probe(struct i2c_client *client,
>>  	}
>>
>>  	/* Register FOD-connected OUTx outputs */
>> -	for (n = 1; n < 3; n++) {
>> +	for (n = 1; n < vc5->clk_out_cnt; n++) {
>>  		idx = vc5_map_index_to_output(vc5->model, n - 1);
>>  		parent_names[0] = vc5_fod_names[idx];
>>  		if (n == 1)
>> @@ -744,7 +772,7 @@ static int vc5_probe(struct i2c_client *client,
>>  	return 0;
>>
>>  err_clk:
>> -	if (vc5->model == IDT_VC5_5P49V5933)
>> +	if (vc5->model == IDT_VC5_5P49V5933 || vc5->model == IDT_VC5_5P49V5935)
>
> Maybe we should introduce some sort of flags to describe the VC
> properties instead of using the model all over the place ?

That makes sense. Will rework.

Regards,
Alexey

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

* Re: [PATCH 2/2] clk: vc5: Add support for IDT VersaClock 5P49V5935
  2017-04-04 13:23         ` Geert Uytterhoeven
@ 2017-04-04 13:36             ` Alexey Firago
  -1 siblings, 0 replies; 13+ messages in thread
From: Alexey Firago @ 2017-04-04 13:36 UTC (permalink / raw)
  To: Geert Uytterhoeven, Marek Vasut
  Cc: Michael Turquette, Stephen Boyd, Rob Herring, linux-clk,
	devicetree-u79uwXL29TY76Z2rM5mHXA

On 04.04.2017 16:23, Geert Uytterhoeven wrote:
> On Tue, Apr 4, 2017 at 3:21 PM, Marek Vasut <marek.vasut-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>> On 04/04/2017 03:16 PM, Alexey Firago wrote:
>>> +     switch (vc5->model) {
>>> +     case IDT_VC5_5P49V5923:
>>> +     case IDT_VC5_5P49V5933:
>>> +             vc5->clk_fod_cnt = 2;
>>> +             vc5->clk_out_cnt = 3;
>>> +             break;
>>> +     case IDT_VC5_5P49V5935:
>>> +             vc5->clk_fod_cnt = 4;
>>> +             vc5->clk_out_cnt = 5;
>>> +             break;
>>> +     default:
>>> +             /* Should never go here */
>>> +             dev_err(&client->dev, "unsupported IDT VC5 ID specified\n");
>>> +             return -EINVAL;
>>> +     }
>>> +
>>>       vc5->pin_xin = devm_clk_get(&client->dev, "xin");
>>>       if (PTR_ERR(vc5->pin_xin) == -EPROBE_DEFER)
>>>               return -EPROBE_DEFER;
>
>>> @@ -744,7 +772,7 @@ static int vc5_probe(struct i2c_client *client,
>>>       return 0;
>>>
>>>  err_clk:
>>> -     if (vc5->model == IDT_VC5_5P49V5933)
>>> +     if (vc5->model == IDT_VC5_5P49V5933 || vc5->model == IDT_VC5_5P49V5935)
>>
>> Maybe we should introduce some sort of flags to describe the VC
>> properties instead of using the model all over the place ?
>
> Yep, a structure describing the features (incl. fod_cnt and out_cnt), to be
> pointed to by clk_vc5_of_match[].data.

Ok, will rework and resend.

Thanks,
Alexey
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 2/2] clk: vc5: Add support for IDT VersaClock 5P49V5935
@ 2017-04-04 13:36             ` Alexey Firago
  0 siblings, 0 replies; 13+ messages in thread
From: Alexey Firago @ 2017-04-04 13:36 UTC (permalink / raw)
  To: Geert Uytterhoeven, Marek Vasut
  Cc: Michael Turquette, Stephen Boyd, Rob Herring, linux-clk, devicetree

On 04.04.2017 16:23, Geert Uytterhoeven wrote:
> On Tue, Apr 4, 2017 at 3:21 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
>> On 04/04/2017 03:16 PM, Alexey Firago wrote:
>>> +     switch (vc5->model) {
>>> +     case IDT_VC5_5P49V5923:
>>> +     case IDT_VC5_5P49V5933:
>>> +             vc5->clk_fod_cnt = 2;
>>> +             vc5->clk_out_cnt = 3;
>>> +             break;
>>> +     case IDT_VC5_5P49V5935:
>>> +             vc5->clk_fod_cnt = 4;
>>> +             vc5->clk_out_cnt = 5;
>>> +             break;
>>> +     default:
>>> +             /* Should never go here */
>>> +             dev_err(&client->dev, "unsupported IDT VC5 ID specified\n");
>>> +             return -EINVAL;
>>> +     }
>>> +
>>>       vc5->pin_xin = devm_clk_get(&client->dev, "xin");
>>>       if (PTR_ERR(vc5->pin_xin) == -EPROBE_DEFER)
>>>               return -EPROBE_DEFER;
>
>>> @@ -744,7 +772,7 @@ static int vc5_probe(struct i2c_client *client,
>>>       return 0;
>>>
>>>  err_clk:
>>> -     if (vc5->model == IDT_VC5_5P49V5933)
>>> +     if (vc5->model == IDT_VC5_5P49V5933 || vc5->model == IDT_VC5_5P49V5935)
>>
>> Maybe we should introduce some sort of flags to describe the VC
>> properties instead of using the model all over the place ?
>
> Yep, a structure describing the features (incl. fod_cnt and out_cnt), to be
> pointed to by clk_vc5_of_match[].data.

Ok, will rework and resend.

Thanks,
Alexey

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

end of thread, other threads:[~2017-04-04 13:36 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-04 13:16 [PATCH 0/2] clk: Add support for IDT 5P49V5935 Alexey Firago
2017-04-04 13:16 ` Alexey Firago
     [not found] ` <1491311788-31905-1-git-send-email-alexey_firago-nmGgyN9QBj3QT0dZR+AlfA@public.gmane.org>
2017-04-04 13:16   ` [PATCH 1/2] clk: vc5: Add bindings for IDT VersaClock 5P49V5935 Alexey Firago
2017-04-04 13:16     ` Alexey Firago
2017-04-04 13:16 ` [PATCH 2/2] clk: vc5: Add support " Alexey Firago
2017-04-04 13:16   ` Alexey Firago
2017-04-04 13:21   ` Marek Vasut
     [not found]     ` <72c66927-0acf-c888-2b4b-906a6c27e15c-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-04-04 13:23       ` Geert Uytterhoeven
2017-04-04 13:23         ` Geert Uytterhoeven
     [not found]         ` <CAMuHMdUOtY5i0_BoS7cKYzWKpA_fF3VssN4bZnNyFB117EpacQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-04-04 13:36           ` Alexey Firago
2017-04-04 13:36             ` Alexey Firago
2017-04-04 13:35       ` Alexey Firago
2017-04-04 13:35         ` Alexey Firago

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.