[PATCH] serial: sh-sci: OF support finishing
Bastian Hecht
hechtb at gmail.com
Wed Mar 6 06:36:46 EST 2013
This is the diff between v3 and v6 of the "serial: sh-sci: Add OF
support" patch. Among other minor changes this includes
- Reworked compatible property
- Added interrupt-names property
Signed-off-by: Bastian Hecht <hechtb+renesas at gmail.com>
Acked-by: Arnd Bergmann <arnd at arndb.de>
---
This is based on git://github.com/pmundt/linux-sh.git branch sh/serial-of.
.../bindings/tty/serial/renesas,sci-serial.txt | 40 ++++------
drivers/tty/serial/sh-sci.c | 81 ++++++++++++--------
2 files changed, 67 insertions(+), 54 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..d80039e 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>-uart", 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,7 @@ Required properties:
b2 = SCSCR_TOIE
b1 = SCSCR_CKE1
b0 = SCSCR_CKE0
-- renesas,scbrr-algo-id : Algorithm ID for the Bit Rate Register
+- renesas,scbrr-algorithm : Choose an algorithm ID for the baud rate generator.
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 +31,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";
+ serial at e6c50000 {
+ compatible = "renesas,sci-scifa-uart";
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,scbrr-algorithm = <4>;
renesas,autoconf;
};
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index e3847cc..f1343d2 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -2352,18 +2352,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-uart",
+ .data = (void *)SCIx_SCI_REGTYPE },
+ { .compatible = "renesas,sci-scif-uart",
+ .data = (void *)SCIx_SH4_SCIF_REGTYPE, },
+ { .compatible = "renesas,sci-irda-uart",
+ .data = (void *)SCIx_IRDA_REGTYPE },
+ { .compatible = "renesas,sci-scifa-uart",
+ .data = (void *)SCIx_SCIFA_REGTYPE },
+ { .compatible = "renesas,sci-scifb-uart",
+ .data = (void *)SCIx_SCIFB_REGTYPE },
+ { .compatible = "renesas,sci-sh2_scif_fifodata-uart",
+ .data = (void *)SCIx_SH2_SCIF_FIFODATA_REGTYPE },
+ { .compatible = "renesas,sci-sh3_scif-uart",
+ .data = (void *)SCIx_SH3_SCIF_REGTYPE },
+ { .compatible = "renesas,sci-sh4_scif-uart",
+ .data = (void *)SCIx_SH4_SCIF_REGTYPE },
+ { .compatible = "renesas,sci-sh4_scif_no_scsptr-uart",
+ .data = (void *)SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE },
+ { .compatible = "renesas,sci-sh4_scif_fifodata-uart",
+ .data = (void *)SCIx_SH4_SCIF_FIFODATA_REGTYPE },
+ { .compatible = "renesas,sci-sh7705_scif-uart",
+ .data = (void *)SCIx_SH7705_SCIF_REGTYPE },
{},
};
MODULE_DEVICE_TABLE(of, of_sci_match);
@@ -2378,6 +2389,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");
@@ -2420,14 +2434,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,scbrr-algorithm", NULL);
if (!prop) {
- dev_err(&pdev->dev, "required DT prop scbrr-algo-id missing\n");
+ dev_err(&pdev->dev, "required DT prop scbrr-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;
@@ -2436,27 +2450,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