[PATCH v5] serial: sh-sci: Add OF support - incremental

Bastian Hecht hechtb at gmail.com
Tue Mar 5 08:30:39 EST 2013


This is an incremental patch to the "[PATCH v4 1/3] serial: sh-sci: Add
OF support" implementing suggestions from Arnd.

- The compatible pattern has been reworked to include devices with
  legacy register sets.
- DT property interrupt-names added
- Renamed renesas,scbrr-algo-id into renesas,clock-algorithm
- Replaced #ifdef CONFIG_OF with
  +       if (!IS_ENABLED(CONFIG_OF) || !np)
  +                               return NULL;

I opted to show the changes in an incremental patch as it may be easier
to follow the changes and as Paul has the v3 already in his repo.

Signed-off-by: Bastian Hecht <hechtb+renesas at gmail.com>
---
 .../bindings/tty/serial/renesas,sci-serial.txt     |   41 +++++-----
 arch/arm/boot/dts/r8a7740.dtsi                     |   45 ++++++-----
 drivers/tty/serial/sh-sci.c                        |   81 ++++++++++++--------
 3 files changed, 95 insertions(+), 72 deletions(-)

diff --git a/Documentation/devicetree/bindings/tty/serial/renesas,sci-serial.txt b/Documentation/devicetree/bindings/tty/serial/renesas,sci-serial.txt
index 6ad1adf..5b85897 100644
--- a/Documentation/devicetree/bindings/tty/serial/renesas,sci-serial.txt
+++ b/Documentation/devicetree/bindings/tty/serial/renesas,sci-serial.txt
@@ -1,10 +1,18 @@
 * Renesas SH-Mobile Serial Communication Interface
 
 Required properties:
-- compatible : Should be "renesas,sci-<port type>-uart", where <port type> may be
-  SCI, SCIF, IRDA, SCIFA or SCIFB.
+- compatible : Should be "renesas,sci-<port type>-serial", where <port type> is
+  "sci", "scif", "irda", "scifa", "scifb"
+  or for legacy devices
+  "sh2_scif_fifodata", "sh3_scif", "sh4_scif", "sh4_scif_no_scsptr",
+  "sh4_scif_fifodata", "sh7705_scif".
 - reg : Address and length of the register set for the device
-- interrupts : Should contain the following IRQs: ERI, RXI, TXI and BRI.
+- interrupts : Should contain the following IRQs in this order:
+	ERI: receive-error interrupt
+	RXI: receive-FIFO-data-full interrupt
+	TXI: transmit-FIFO-data-empty interrupt
+	BRI: break reception interrupt
+- interrupt-names: The IRQ names "eri", "rxi", "txi" and "bri".
 - cell-index : The device id.
 - renesas,scscr : Should contain a bitfield used by the Serial Control Register.
   b7 = SCSCR_TIE
@@ -15,7 +23,8 @@ Required properties:
   b2 = SCSCR_TOIE
   b1 = SCSCR_CKE1
   b0 = SCSCR_CKE0
-- renesas,scbrr-algo-id : Algorithm ID for the Bit Rate Register
+- renesas,clock-algorithm : Choose the clock frequency by selecting one of the
+		    following algorithm IDs for the Bit Rate Register.
   1 = SCBRR_ALGO_1 ((clk + 16 * bps) / (16 * bps) - 1)
   2 = SCBRR_ALGO_2 ((clk + 16 * bps) / (32 * bps) - 1)
   3 = SCBRR_ALGO_3 (((clk * 2) + 16 * bps) / (16 * bps) - 1)
@@ -23,31 +32,17 @@ Required properties:
   5 = SCBRR_ALGO_5 (((clk * 1000 / 32) / bps) - 1)
 
 Optional properties:
-- renesas,autoconf : Set if device is capable of auto configuration
-- renesas,regtype : Overwrite the register layout. In most cases you can rely
-  on auto-probing (omit this property or set to 0) but some legacy devices
-  use a non-default register layout. Possible layouts are
-  0 = SCIx_PROBE_REGTYPE (default)
-  1 = SCIx_SCI_REGTYPE
-  2 = SCIx_IRDA_REGTYPE
-  3 = SCIx_SCIFA_REGTYPE
-  4 = SCIx_SCIFB_REGTYPE
-  5 = SCIx_SH2_SCIF_FIFODATA_REGTYPE
-  6 = SCIx_SH3_SCIF_REGTYPE
-  7 = SCIx_SH4_SCIF_REGTYPE
-  8 = SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE
-  9 = SCIx_SH4_SCIF_FIFODATA_REGTYPE
- 10 = SCIx_SH7705_SCIF_REGTYPE
-
+- renesas,autoconf : Set if device is capable of auto configuration.
 
 Example:
-	sci at 0xe6c50000 {
-		compatible = "renesas,sci-SCIFA-uart";
+	sci at e6c50000 {
+		compatible = "renesas,sci-scifa-serial";
 		interrupt-parent = <&intca>;
 		reg = <0xe6c50000 0x100>;
 		interrupts = <0x0c20>, <0x0c20>, <0x0c20>, <0x0c20>;
+		interrupt-names = "eri", "rxi", "txi", "bri";
 		cell-index = <1>;
 		renesas,scscr = <0x30>;
-		renesas,scbrr-algo-id = <4>;
+		renesas,clock-algorithm = <4>;
 		renesas,autoconf;
 	};
diff --git a/arch/arm/boot/dts/r8a7740.dtsi b/arch/arm/boot/dts/r8a7740.dtsi
index ecbc237..d962dc6 100644
--- a/arch/arm/boot/dts/r8a7740.dtsi
+++ b/arch/arm/boot/dts/r8a7740.dtsi
@@ -769,101 +769,110 @@
 	};
 
 	sci at e6c40000 {
-		compatible = "renesas,sci-SCIFA-uart";
+		compatible = "renesas,sci-scifa-serial";
 		interrupt-parent = <&intca>;
 		reg = <0xe6c40000 0x100>;
 		interrupts = <0x0c00>, <0x0c00>, <0x0c00>, <0x0c00>;
+		interrupt-names = "eri", "rxi", "txi", "bri";
 		cell-index = <0>;
 		renesas,scscr = <0x30>;
-		renesas,scbrr-algo-id = <4>;
+		renesas,clock-algorithm = <4>;
 		renesas,autoconf;
 	};
 
 	sci at e6c50000 {
-		compatible = "renesas,sci-SCIFA-uart";
+		compatible = "renesas,sci-scifa-serial";
 		interrupt-parent = <&intca>;
 		reg = <0xe6c50000 0x100>;
 		interrupts = <0x0c20>, <0x0c20>, <0x0c20>, <0x0c20>;
+		interrupt-names = "eri", "rxi", "txi", "bri";
 		cell-index = <1>;
 		renesas,scscr = <0x30>;
-		renesas,scbrr-algo-id = <4>;
+		renesas,clock-algorithm = <4>;
 		renesas,autoconf;
 	};
 
 	sci at e6c60000 {
-		compatible = "renesas,sci-SCIFA-uart";
+		compatible = "renesas,sci-scifa-serial";
 		interrupt-parent = <&intca>;
 		reg = <0xe6c60000 0x100>;
 		interrupts = <0x0c40>, <0x0c40>, <0x0c40>, <0x0c40>;
+		interrupt-names = "eri", "rxi", "txi", "bri";
 		cell-index = <2>;
 		renesas,scscr = <0x30>;
-		renesas,scbrr-algo-id = <4>;
+		renesas,clock-algorithm = <4>;
 		renesas,autoconf;
 	};
 
 	sci at e6c70000 {
-		compatible = "renesas,sci-SCIFA-uart";
+		compatible = "renesas,sci-scifa-serial";
 		interrupt-parent = <&intca>;
 		reg = <0xe6c70000 0x100>;
 		interrupts = <0x0c60>, <0x0c60>, <0x0c60>, <0x0c60>;
+		interrupt-names = "eri", "rxi", "txi", "bri";
 		cell-index = <3>;
 		renesas,scscr = <0x30>;
-		renesas,scbrr-algo-id = <4>;
+		renesas,clock-algorithm = <4>;
 		renesas,autoconf;
 	};
 
 	sci at e6c80000 {
-		compatible = "renesas,sci-SCIFA-uart";
+		compatible = "renesas,sci-scifa-serial";
 		interrupt-parent = <&intca>;
 		reg = <0xe6c80000 0x100>;
 		interrupts = <0x0d20>, <0x0d20>, <0x0d20>, <0x0d20>;
+		interrupt-names = "eri", "rxi", "txi", "bri";
 		cell-index = <4>;
 		renesas,scscr = <0x30>;
-		renesas,scbrr-algo-id = <4>;
+		renesas,clock-algorithm = <4>;
 		renesas,autoconf;
 	};
 
 	sci at e6cb0000 {
-		compatible = "renesas,sci-SCIFA-uart";
+		compatible = "renesas,sci-scifa-serial";
 		interrupt-parent = <&intca>;
 		reg = <0xe6cb0000 0x100>;
 		interrupts = <0x0d40>, <0x0d40>, <0x0d40>, <0x0d40>;
+		interrupt-names = "eri", "rxi", "txi", "bri";
 		cell-index = <5>;
 		renesas,scscr = <0x30>;
-		renesas,scbrr-algo-id = <4>;
+		renesas,clock-algorithm = <4>;
 		renesas,autoconf;
 	};
 
 	sci at e6cc0000 {
-		compatible = "renesas,sci-SCIFA-uart";
+		compatible = "renesas,sci-scifa-serial";
 		interrupt-parent = <&intca>;
 		reg = <0xe6cc0000 0x100>;
 		interrupts = <0x04c0>, <0x04c0>, <0x04c0>, <0x04c0>;
+		interrupt-names = "eri", "rxi", "txi", "bri";
 		cell-index = <6>;
 		renesas,scscr = <0x30>;
-		renesas,scbrr-algo-id = <4>;
+		renesas,clock-algorithm = <4>;
 		renesas,autoconf;
 	};
 
 	sci at 0xe6cd0000 {
-		compatible = "renesas,sci-SCIFA-uart";
+		compatible = "renesas,sci-scifa-serial";
 		interrupt-parent = <&intca>;
 		reg = <0xe6cd0000 0x100>;
 		interrupts = <0x04e0>, <0x04e0>, <0x04e0>, <0x04e0>;
+		interrupt-names = "eri", "rxi", "txi", "bri";
 		cell-index = <7>;
 		renesas,scscr = <0x30>;
-		renesas,scbrr-algo-id = <4>;
+		renesas,clock-algorithm = <4>;
 		renesas,autoconf;
 	};
 
 	sci at e6c30000 {
-		compatible = "renesas,sci-SCIFB-uart";
+		compatible = "renesas,sci-scifb-serial";
 		interrupt-parent = <&intca>;
 		reg = <0xe6c30000 0x100>;
 		interrupts = <0x0d60>, <0x0d60>, <0x0d60>, <0x0d60>;
+		interrupt-names = "eri", "rxi", "txi", "bri";
 		cell-index = <8>;
 		renesas,scscr = <0x30>;
-		renesas,scbrr-algo-id = <4>;
+		renesas,clock-algorithm = <4>;
 		renesas,autoconf;
 	};
 };
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index cc1b69c..9468ae1 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -2354,18 +2354,29 @@ static int sci_remove(struct platform_device *dev)
 	return 0;
 }
 
-#ifdef CONFIG_OF
 static const struct of_device_id of_sci_match[] = {
-	{ .compatible = "renesas,sci-SCI-uart",
-		.data = (void *)PORT_SCI },
-	{ .compatible = "renesas,sci-SCIF-uart",
-		.data = (void *)PORT_SCIF },
-	{ .compatible = "renesas,sci-IRDA-uart",
-		.data = (void *)PORT_IRDA },
-	{ .compatible = "renesas,sci-SCIFA-uart",
-		.data = (void *)PORT_SCIFA },
-	{ .compatible = "renesas,sci-SCIFB-uart",
-		.data = (void *)PORT_SCIFB },
+	{ .compatible = "renesas,sci-sci-serial",
+		.data = (void *)SCIx_SCI_REGTYPE },
+	{ .compatible = "renesas,sci-scif-serial",
+		.data = (void *)SCIx_SH4_SCIF_REGTYPE, },
+	{ .compatible = "renesas,sci-irda-serial",
+		.data = (void *)SCIx_IRDA_REGTYPE },
+	{ .compatible = "renesas,sci-scifa-serial",
+		.data = (void *)SCIx_SCIFA_REGTYPE },
+	{ .compatible = "renesas,sci-scifb-serial",
+		.data = (void *)SCIx_SCIFB_REGTYPE },
+	{ .compatible = "renesas,sci-sh2_scif_fifodata-serial",
+		.data = (void *)SCIx_SH2_SCIF_FIFODATA_REGTYPE },
+	{ .compatible = "renesas,sci-sh3_scif-serial",
+		.data = (void *)SCIx_SH3_SCIF_REGTYPE },
+	{ .compatible = "renesas,sci-sh4_scif-serial",
+		.data = (void *)SCIx_SH4_SCIF_REGTYPE },
+	{ .compatible = "renesas,sci-sh4_scif_no_scsptr-serial",
+		.data = (void *)SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE },
+	{ .compatible = "renesas,sci-sh4_scif_fifodata-serial",
+		.data = (void *)SCIx_SH4_SCIF_FIFODATA_REGTYPE },
+	{ .compatible = "renesas,sci-sh7705_scif-serial",
+		.data = (void *)SCIx_SH7705_SCIF_REGTYPE },
 	{},
 };
 MODULE_DEVICE_TABLE(of, of_sci_match);
@@ -2380,6 +2391,9 @@ static struct plat_sci_port *sci_parse_dt(struct platform_device *pdev,
 	const __be32 *prop;
 	int i, irq, val;
 
+	if (!IS_ENABLED(CONFIG_OF) || !np)
+		return NULL;
+
 	match = of_match_node(of_sci_match, pdev->dev.of_node);
 	if (!match || !match->data) {
 		dev_err(&pdev->dev, "OF match error\n");
@@ -2422,14 +2436,14 @@ static struct plat_sci_port *sci_parse_dt(struct platform_device *pdev,
 	}
 	p->scscr = be32_to_cpup(prop);
 
-	prop = of_get_property(np, "renesas,scbrr-algo-id", NULL);
+	prop = of_get_property(np, "renesas,clock-algorithm", NULL);
 	if (!prop) {
-		dev_err(&pdev->dev, "required DT prop scbrr-algo-id missing\n");
+		dev_err(&pdev->dev, "required DT prop clock-algorithm missing\n");
 		return NULL;
 	}
 	val = be32_to_cpup(prop);
 	if (val <= SCBRR_ALGO_INVALID || val >= SCBRR_NR_ALGOS) {
-		dev_err(&pdev->dev, "DT prop scbrr-algo-id out of range\n");
+		dev_err(&pdev->dev, "DT prop clock-algorithm out of range\n");
 		return NULL;
 	}
 	p->scbrr_algo_id = val;
@@ -2438,27 +2452,32 @@ static struct plat_sci_port *sci_parse_dt(struct platform_device *pdev,
 	if (of_get_property(np, "renesas,autoconf", NULL))
 		p->flags |= UPF_BOOT_AUTOCONF;
 
-	prop = of_get_property(np, "renesas,regtype", NULL);
-	if (prop) {
-		val = be32_to_cpup(prop);
-		if (val < SCIx_PROBE_REGTYPE || val >= SCIx_NR_REGTYPES) {
-			dev_err(&pdev->dev, "DT prop regtype out of range\n");
-			return NULL;
-		}
-		p->regtype = val;
-	}
+	p->regtype = (unsigned int)match->data;
 
-	p->type = (unsigned int)match->data;
+	switch (p->regtype) {
+	case SCIx_SCI_REGTYPE:
+		p->type = PORT_SCI;
+		break;
+	case SCIx_SH4_SCIF_REGTYPE:
+		p->type = PORT_SCIF;
+		break;
+	case SCIx_IRDA_REGTYPE:
+		p->type = PORT_IRDA;
+		break;
+	case SCIx_SCIFA_REGTYPE:
+		p->type = PORT_SCIFA;
+		break;
+	case SCIx_SCIFB_REGTYPE:
+		p->type = PORT_SCIFB;
+		break;
+	default:
+		/* legacy register sets default to PORT_SCIF */
+		p->type = PORT_SCIF;
+		break;
+	}
 
 	return p;
 }
-#else
-static struct plat_sci_port *sci_parse_dt(struct platform_device *pdev,
-								int *dev_id)
-{
-	return NULL;
-}
-#endif /* CONFIG_OF */
 
 static int sci_probe_single(struct platform_device *dev,
 				      unsigned int index,
-- 
1.7.9.5




More information about the linux-arm-kernel mailing list