Re: [RFC] serial: sc16is7xx: Use DT sub-nodes for UART ports
From: Andreas Färber <afaerber@suse.de>
Date: 2018-08-10 17:45:49
Also in:
linux-serial, lkml
Am 10.08.2018 um 19:34 schrieb Rob Herring:
On Sun, Aug 5, 2018 at 5:27 PM Andreas Färber [off-list ref] wrote:quoted
This is to allow using serdev. Signed-off-by: Andreas Färber <afaerber@suse.de> --- drivers/tty/serial/sc16is7xx.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c index 243c96025053..ad7267274f65 100644 --- a/drivers/tty/serial/sc16is7xx.c +++ b/drivers/tty/serial/sc16is7xx.c@@ -1213,9 +1213,31 @@ static int sc16is7xx_probe(struct device *dev, SC16IS7XX_IOCONTROL_SRESET_BIT); for (i = 0; i < devtype->nr_uart; ++i) { +#ifdef CONFIG_OF + struct device_node *np; + struct platform_device *pdev; + char name[6] = "uartx"; +#endif + s->p[i].line = i; /* Initialize port data */ +#ifdef CONFIG_OF + name[4] = '0' + i; + np = of_get_child_by_name(dev->of_node, name); + if (IS_ERR(np)) { + ret = PTR_ERR(np); + goto out_ports; + } + pdev = of_platform_device_create(np, NULL, dev);Ideally, you would use of_platform_default_populate here. I think you'd have to add a compatible to the child nodes, but that wouldn't be a bad thing. I could envision that the child nodes ultimately become their own driver utilizing the standard 8250 driver and a compatible string would be needed in that case.
Separate compatibles would mean separate drivers. Unlike your DUART example this is not an MMIO device that we can easily split but a SPI slave (well, regmap due to some I2C models). I don't see how separate drivers could work, given that the whole spi_device has a single interrupt for all functions of this device. That left me with this ugly but working construct. Is the uartX naming correct, or should it be serialX? Regards, Andreas
You'd then have to loop over each child of 'dev' instead of the DT nodes.quoted
+ if (IS_ERR(pdev)) { + ret = PTR_ERR(pdev); + goto out_ports; + } + platform_set_drvdata(pdev, dev_get_drvdata(dev)); + s->p[i].port.dev = &pdev->dev; +#else s->p[i].port.dev = dev; +#endif s->p[i].port.irq = irq; s->p[i].port.type = PORT_SC16IS7XX; s->p[i].port.fifosize = SC16IS7XX_FIFO_SIZE;
-- SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG Nürnberg)