Message ID | 20221118122539.384993-11-brgl@bgdev.pl (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | serial: qcom-geni-serial: implement support for SE DMA | expand |
On 18/11/2022 13:25, Bartosz Golaszewski wrote: > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > Instead of checking the device compatible in probe(), assign the > device-specific data to struct of_device_id. We'll use it later when > providing SE DMA support. > > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > --- Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org> Konrad > drivers/tty/serial/qcom_geni_serial.c | 46 ++++++++++++++++++++------- > 1 file changed, 34 insertions(+), 12 deletions(-) > > diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c > index 72d0e7b91080..6a9f3f937f29 100644 > --- a/drivers/tty/serial/qcom_geni_serial.c > +++ b/drivers/tty/serial/qcom_geni_serial.c > @@ -95,6 +95,11 @@ > /* We always configure 4 bytes per FIFO word */ > #define BYTES_PER_FIFO_WORD 4 > > +struct qcom_geni_device_data { > + bool console; > + void (*handle_rx)(struct uart_port *uport, u32 bytes, bool drop); > +}; > + > struct qcom_geni_private_data { > /* NOTE: earlycon port will have NULL here */ > struct uart_driver *drv; > @@ -114,7 +119,6 @@ struct qcom_geni_serial_port { > u32 tx_fifo_width; > u32 rx_fifo_depth; > bool setup; > - void (*handle_rx)(struct uart_port *uport, u32 bytes, bool drop); > unsigned int baud; > void *rx_fifo; > u32 loopback; > @@ -126,6 +130,7 @@ struct qcom_geni_serial_port { > bool cts_rts_swap; > > struct qcom_geni_private_data private_data; > + const struct qcom_geni_device_data *dev_data; > }; > > static const struct uart_ops qcom_geni_console_pops; > @@ -637,7 +642,7 @@ static void qcom_geni_serial_handle_rx(struct uart_port *uport, bool drop) > total_bytes += last_word_byte_cnt; > else > total_bytes += BYTES_PER_FIFO_WORD; > - port->handle_rx(uport, total_bytes, drop); > + port->dev_data->handle_rx(uport, total_bytes, drop); > } > > static void qcom_geni_serial_stop_rx(struct uart_port *uport) > @@ -1348,13 +1353,14 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) > struct uart_port *uport; > struct resource *res; > int irq; > - bool console = false; > struct uart_driver *drv; > + const struct qcom_geni_device_data *data; > > - if (of_device_is_compatible(pdev->dev.of_node, "qcom,geni-debug-uart")) > - console = true; > + data = of_device_get_match_data(&pdev->dev); > + if (!data) > + return -EINVAL; > > - if (console) { > + if (data->console) { > drv = &qcom_geni_console_driver; > line = of_alias_get_id(pdev->dev.of_node, "serial"); > } else { > @@ -1364,7 +1370,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) > line = of_alias_get_id(pdev->dev.of_node, "hsuart"); > } > > - port = get_port_from_line(line, console); > + port = get_port_from_line(line, data->console); > if (IS_ERR(port)) { > dev_err(&pdev->dev, "Invalid line %d\n", line); > return PTR_ERR(port); > @@ -1376,6 +1382,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) > return -ENODEV; > > uport->dev = &pdev->dev; > + port->dev_data = data; > port->se.dev = &pdev->dev; > port->se.wrapper = dev_get_drvdata(pdev->dev.parent); > port->se.clk = devm_clk_get(&pdev->dev, "se"); > @@ -1394,7 +1401,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) > port->rx_fifo_depth = DEF_FIFO_DEPTH_WORDS; > port->tx_fifo_width = DEF_FIFO_WIDTH_BITS; > > - if (!console) { > + if (!data->console) { > port->rx_fifo = devm_kcalloc(uport->dev, > port->rx_fifo_depth, sizeof(u32), GFP_KERNEL); > if (!port->rx_fifo) > @@ -1424,7 +1431,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) > uport->irq = irq; > uport->has_sysrq = IS_ENABLED(CONFIG_SERIAL_QCOM_GENI_CONSOLE); > > - if (!console) > + if (!data->console) > port->wakeup_irq = platform_get_irq_optional(pdev, 1); > > if (of_property_read_bool(pdev->dev.of_node, "rx-tx-swap")) > @@ -1446,7 +1453,6 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) > port->private_data.drv = drv; > uport->private_data = &port->private_data; > platform_set_drvdata(pdev, port); > - port->handle_rx = console ? handle_rx_console : handle_rx_uart; > > ret = uart_add_one_port(drv, uport); > if (ret) > @@ -1526,14 +1532,30 @@ static int __maybe_unused qcom_geni_serial_sys_resume(struct device *dev) > return ret; > } > > +static const struct qcom_geni_device_data qcom_geni_console_data = { > + .console = true, > + .handle_rx = handle_rx_console, > +}; > + > +static const struct qcom_geni_device_data qcom_geni_uart_data = { > + .console = false, > + .handle_rx = handle_rx_uart, > +}; > + > static const struct dev_pm_ops qcom_geni_serial_pm_ops = { > SET_SYSTEM_SLEEP_PM_OPS(qcom_geni_serial_sys_suspend, > qcom_geni_serial_sys_resume) > }; > > static const struct of_device_id qcom_geni_serial_match_table[] = { > - { .compatible = "qcom,geni-debug-uart", }, > - { .compatible = "qcom,geni-uart", }, > + { > + .compatible = "qcom,geni-debug-uart", > + .data = &qcom_geni_console_data, > + }, > + { > + .compatible = "qcom,geni-uart", > + .data = &qcom_geni_uart_data, > + }, > {} > }; > MODULE_DEVICE_TABLE(of, qcom_geni_serial_match_table);
diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c index 72d0e7b91080..6a9f3f937f29 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c @@ -95,6 +95,11 @@ /* We always configure 4 bytes per FIFO word */ #define BYTES_PER_FIFO_WORD 4 +struct qcom_geni_device_data { + bool console; + void (*handle_rx)(struct uart_port *uport, u32 bytes, bool drop); +}; + struct qcom_geni_private_data { /* NOTE: earlycon port will have NULL here */ struct uart_driver *drv; @@ -114,7 +119,6 @@ struct qcom_geni_serial_port { u32 tx_fifo_width; u32 rx_fifo_depth; bool setup; - void (*handle_rx)(struct uart_port *uport, u32 bytes, bool drop); unsigned int baud; void *rx_fifo; u32 loopback; @@ -126,6 +130,7 @@ struct qcom_geni_serial_port { bool cts_rts_swap; struct qcom_geni_private_data private_data; + const struct qcom_geni_device_data *dev_data; }; static const struct uart_ops qcom_geni_console_pops; @@ -637,7 +642,7 @@ static void qcom_geni_serial_handle_rx(struct uart_port *uport, bool drop) total_bytes += last_word_byte_cnt; else total_bytes += BYTES_PER_FIFO_WORD; - port->handle_rx(uport, total_bytes, drop); + port->dev_data->handle_rx(uport, total_bytes, drop); } static void qcom_geni_serial_stop_rx(struct uart_port *uport) @@ -1348,13 +1353,14 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) struct uart_port *uport; struct resource *res; int irq; - bool console = false; struct uart_driver *drv; + const struct qcom_geni_device_data *data; - if (of_device_is_compatible(pdev->dev.of_node, "qcom,geni-debug-uart")) - console = true; + data = of_device_get_match_data(&pdev->dev); + if (!data) + return -EINVAL; - if (console) { + if (data->console) { drv = &qcom_geni_console_driver; line = of_alias_get_id(pdev->dev.of_node, "serial"); } else { @@ -1364,7 +1370,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) line = of_alias_get_id(pdev->dev.of_node, "hsuart"); } - port = get_port_from_line(line, console); + port = get_port_from_line(line, data->console); if (IS_ERR(port)) { dev_err(&pdev->dev, "Invalid line %d\n", line); return PTR_ERR(port); @@ -1376,6 +1382,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) return -ENODEV; uport->dev = &pdev->dev; + port->dev_data = data; port->se.dev = &pdev->dev; port->se.wrapper = dev_get_drvdata(pdev->dev.parent); port->se.clk = devm_clk_get(&pdev->dev, "se"); @@ -1394,7 +1401,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) port->rx_fifo_depth = DEF_FIFO_DEPTH_WORDS; port->tx_fifo_width = DEF_FIFO_WIDTH_BITS; - if (!console) { + if (!data->console) { port->rx_fifo = devm_kcalloc(uport->dev, port->rx_fifo_depth, sizeof(u32), GFP_KERNEL); if (!port->rx_fifo) @@ -1424,7 +1431,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) uport->irq = irq; uport->has_sysrq = IS_ENABLED(CONFIG_SERIAL_QCOM_GENI_CONSOLE); - if (!console) + if (!data->console) port->wakeup_irq = platform_get_irq_optional(pdev, 1); if (of_property_read_bool(pdev->dev.of_node, "rx-tx-swap")) @@ -1446,7 +1453,6 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) port->private_data.drv = drv; uport->private_data = &port->private_data; platform_set_drvdata(pdev, port); - port->handle_rx = console ? handle_rx_console : handle_rx_uart; ret = uart_add_one_port(drv, uport); if (ret) @@ -1526,14 +1532,30 @@ static int __maybe_unused qcom_geni_serial_sys_resume(struct device *dev) return ret; } +static const struct qcom_geni_device_data qcom_geni_console_data = { + .console = true, + .handle_rx = handle_rx_console, +}; + +static const struct qcom_geni_device_data qcom_geni_uart_data = { + .console = false, + .handle_rx = handle_rx_uart, +}; + static const struct dev_pm_ops qcom_geni_serial_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS(qcom_geni_serial_sys_suspend, qcom_geni_serial_sys_resume) }; static const struct of_device_id qcom_geni_serial_match_table[] = { - { .compatible = "qcom,geni-debug-uart", }, - { .compatible = "qcom,geni-uart", }, + { + .compatible = "qcom,geni-debug-uart", + .data = &qcom_geni_console_data, + }, + { + .compatible = "qcom,geni-uart", + .data = &qcom_geni_uart_data, + }, {} }; MODULE_DEVICE_TABLE(of, qcom_geni_serial_match_table);