* [PATCH v5] serial: sh-sci: Add OF support - incremental
@ 2013-03-05 13:30 Bastian Hecht
2013-03-05 19:28 ` Arnd Bergmann
0 siblings, 1 reply; 2+ messages in thread
From: Bastian Hecht @ 2013-03-05 13:30 UTC (permalink / raw)
To: linux-arm-kernel
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@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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [PATCH v5] serial: sh-sci: Add OF support - incremental
2013-03-05 13:30 [PATCH v5] serial: sh-sci: Add OF support - incremental Bastian Hecht
@ 2013-03-05 19:28 ` Arnd Bergmann
0 siblings, 0 replies; 2+ messages in thread
From: Arnd Bergmann @ 2013-03-05 19:28 UTC (permalink / raw)
To: linux-arm-kernel
On Tuesday 05 March 2013, Bastian Hecht wrote:
> 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.
Ok, makes sense.
> - sci at 0xe6c50000 {
> - compatible = "renesas,sci-SCIFA-uart";
> + sci at e6c50000 {
> + compatible = "renesas,sci-scifa-serial";
As mentioned, I meant the name to be changed, not the compatible value.
> + { .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 },
> {},
Ah nice, it's not even more complex than before.
Looks good,
Acked-by: Arnd Bergmann <arnd@arndb.de>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-03-05 19:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-05 13:30 [PATCH v5] serial: sh-sci: Add OF support - incremental Bastian Hecht
2013-03-05 19:28 ` Arnd Bergmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).