Message ID | 0101016e937a3e05-f74c5c73-a964-45f2-ae71-6daed292e8ee-000000@us-west-2.amazonses.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add wakeup support and move loopback to TIOCM_LOOP | expand |
On Fri, Nov 22, 2019 at 02:18:12PM +0000, Akash Asthana wrote: > Move ISR registration from startup to probe function to avoid registering > it everytime when the port open is called for driver. > > Signed-off-by: Akash Asthana <akashast@codeaurora.org> > --- > Changes in v6: > - Rebased on tty-next branch > > Changes in v5: > - No change. > > Changes in v4: > - As per Stephen's comment, move ISR registration(later in probe) after > registering uart port with serial core. > - As per Greg's comment, corrected returning of PTR value from integer type > function(probe). > > Changes in v3: > - As per Stephen's comment, using devm_kasprintf instead of scnprintf API. > > drivers/tty/serial/qcom_geni_serial.c | 38 ++++++++++++++++++++++++----------- > 1 file changed, 26 insertions(+), 12 deletions(-) > > diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c > index 14c6306..634054a 100644 > --- a/drivers/tty/serial/qcom_geni_serial.c > +++ b/drivers/tty/serial/qcom_geni_serial.c > > ... > > @@ -1307,7 +1307,21 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) > port->handle_rx = console ? handle_rx_console : handle_rx_uart; > if (!console) > device_create_file(uport->dev, &dev_attr_loopback); > - return uart_add_one_port(drv, uport); > + > + ret = uart_add_one_port(drv, uport); > + if (ret) > + return ret; > + > + irq_set_status_flags(uport->irq, IRQ_NOAUTOEN); > + ret = devm_request_irq(uport->dev, uport->irq, qcom_geni_serial_isr, > + IRQF_TRIGGER_HIGH, port->name, uport); > + if (ret) { > + dev_err(uport->dev, "Failed to get IRQ ret %d\n", ret); > + uart_remove_one_port(drv, uport); > + return ret; nit: could fall through > + } > + > + return ret; nit: if not falling through above this could/should be 0. Reviewed-by: Matthias Kaehlcke <mka@chromium.org>
On 11/23/2019 12:16 AM, Matthias Kaehlcke wrote: > On Fri, Nov 22, 2019 at 02:18:12PM +0000, Akash Asthana wrote: >> Move ISR registration from startup to probe function to avoid registering >> it everytime when the port open is called for driver. >> >> Signed-off-by: Akash Asthana <akashast@codeaurora.org> >> --- >> Changes in v6: >> - Rebased on tty-next branch >> >> Changes in v5: >> - No change. >> >> Changes in v4: >> - As per Stephen's comment, move ISR registration(later in probe) after >> registering uart port with serial core. >> - As per Greg's comment, corrected returning of PTR value from integer type >> function(probe). >> >> Changes in v3: >> - As per Stephen's comment, using devm_kasprintf instead of scnprintf API. >> >> drivers/tty/serial/qcom_geni_serial.c | 38 ++++++++++++++++++++++++----------- >> 1 file changed, 26 insertions(+), 12 deletions(-) >> >> diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c >> index 14c6306..634054a 100644 >> --- a/drivers/tty/serial/qcom_geni_serial.c >> +++ b/drivers/tty/serial/qcom_geni_serial.c >> >> ... >> >> @@ -1307,7 +1307,21 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) >> port->handle_rx = console ? handle_rx_console : handle_rx_uart; >> if (!console) >> device_create_file(uport->dev, &dev_attr_loopback); >> - return uart_add_one_port(drv, uport); >> + >> + ret = uart_add_one_port(drv, uport); >> + if (ret) >> + return ret; >> + >> + irq_set_status_flags(uport->irq, IRQ_NOAUTOEN); >> + ret = devm_request_irq(uport->dev, uport->irq, qcom_geni_serial_isr, >> + IRQF_TRIGGER_HIGH, port->name, uport); >> + if (ret) { >> + dev_err(uport->dev, "Failed to get IRQ ret %d\n", ret); >> + uart_remove_one_port(drv, uport); >> + return ret; > nit: could fall through > >> + } >> + >> + return ret; > nit: if not falling through above this could/should be 0. ok, will change it to return 0; > Reviewed-by: Matthias Kaehlcke <mka@chromium.org>
diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c index 14c6306..634054a 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c @@ -9,6 +9,7 @@ #include <linux/console.h> #include <linux/io.h> #include <linux/iopoll.h> +#include <linux/irq.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_device.h> @@ -101,7 +102,7 @@ struct qcom_geni_serial_port { struct uart_port uport; struct geni_se se; - char name[20]; + const char *name; u32 tx_fifo_depth; u32 tx_fifo_width; u32 rx_fifo_depth; @@ -830,7 +831,7 @@ static void qcom_geni_serial_shutdown(struct uart_port *uport) if (uart_console(uport)) console_stop(uport->cons); - free_irq(uport->irq, uport); + disable_irq(uport->irq); spin_lock_irqsave(&uport->lock, flags); qcom_geni_serial_stop_tx(uport); qcom_geni_serial_stop_rx(uport); @@ -890,21 +891,14 @@ static int qcom_geni_serial_startup(struct uart_port *uport) int ret; struct qcom_geni_serial_port *port = to_dev_port(uport, uport); - scnprintf(port->name, sizeof(port->name), - "qcom_serial_%s%d", - (uart_console(uport) ? "console" : "uart"), uport->line); - if (!port->setup) { ret = qcom_geni_serial_port_setup(uport); if (ret) return ret; } + enable_irq(uport->irq); - ret = request_irq(uport->irq, qcom_geni_serial_isr, IRQF_TRIGGER_HIGH, - port->name, uport); - if (ret) - dev_err(uport->dev, "Failed to get IRQ ret %d\n", ret); - return ret; + return 0; } static unsigned long get_clk_cfg(unsigned long clk_freq) @@ -1297,6 +1291,12 @@ 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; + port->name = devm_kasprintf(uport->dev, GFP_KERNEL, + "qcom_geni_serial_%s%d", + uart_console(uport) ? "console" : "uart", uport->line); + if (!port->name) + return -ENOMEM; + irq = platform_get_irq(pdev, 0); if (irq < 0) return irq; @@ -1307,7 +1307,21 @@ static int qcom_geni_serial_probe(struct platform_device *pdev) port->handle_rx = console ? handle_rx_console : handle_rx_uart; if (!console) device_create_file(uport->dev, &dev_attr_loopback); - return uart_add_one_port(drv, uport); + + ret = uart_add_one_port(drv, uport); + if (ret) + return ret; + + irq_set_status_flags(uport->irq, IRQ_NOAUTOEN); + ret = devm_request_irq(uport->dev, uport->irq, qcom_geni_serial_isr, + IRQF_TRIGGER_HIGH, port->name, uport); + if (ret) { + dev_err(uport->dev, "Failed to get IRQ ret %d\n", ret); + uart_remove_one_port(drv, uport); + return ret; + } + + return ret; } static int qcom_geni_serial_remove(struct platform_device *pdev)
Move ISR registration from startup to probe function to avoid registering it everytime when the port open is called for driver. Signed-off-by: Akash Asthana <akashast@codeaurora.org> --- Changes in v6: - Rebased on tty-next branch Changes in v5: - No change. Changes in v4: - As per Stephen's comment, move ISR registration(later in probe) after registering uart port with serial core. - As per Greg's comment, corrected returning of PTR value from integer type function(probe). Changes in v3: - As per Stephen's comment, using devm_kasprintf instead of scnprintf API. drivers/tty/serial/qcom_geni_serial.c | 38 ++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 12 deletions(-)