From: Andy Shevchenko <andy.shevchenko@gmail.com>
To: "Andreas Färber" <afaerber@suse.de>
Cc: "linux-arm Mailing List" <linux-arm-kernel@lists.infradead.org>,
mp-cs@actions-semi.com,
"Thomas Liau" <thomas.liau@actions-semi.com>,
张东风 <zhangdf@actions-semi.com>, 刘炜 <liuwei@actions-semi.com>,
张天益 <tyzhang@actions-semi.com>,
96boards@ucrobotics.com, support@lemaker.org,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Jiri Slaby" <jslaby@suse.com>,
"linux-serial@vger.kernel.org" <linux-serial@vger.kernel.org>
Subject: Re: [PATCH v4 16/28] tty: serial: owl: Implement console driver
Date: Wed, 7 Jun 2017 17:37:09 +0300 [thread overview]
Message-ID: <CAHp75VcYtdxknAw5b1zp+qLi1MT3ktwm99rOJEivcBrc+9B-cg@mail.gmail.com> (raw)
In-Reply-To: <20170606005426.26446-17-afaerber@suse.de>
On Tue, Jun 6, 2017 at 3:54 AM, Andreas Färber <afaerber@suse.de> wrote:
> Implement serial console driver to complement earlycon.
>
> Based on LeMaker linux-actions tree.
> +#define OWL_UART_CTL_DWLS_MASK (0x3 << 0)
GENMASK() ?
> +#define OWL_UART_CTL_PRS_MASK (0x7 << 4)
Ditto.
> #define OWL_UART_STAT_TRFL_MASK (0x1f << 11)
Ditto.
> +static struct owl_uart_port *owl_uart_ports[OWL_UART_PORT_NUM];
And this is needed for...?
> +static void owl_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
> +{
> +}
Do we need an empty stub?
> +static void owl_uart_send_chars(struct uart_port *port)
> +{
> + xmit->tail = (xmit->tail + 1) & (SERIAL_XMIT_SIZE - 1);
% SERIAL_XMIT_SIZE shorter (I hope it's a power of 2), but it's up to you.
> +}
> +static irqreturn_t owl_uart_irq(int irq, void *dev_id)
> +{
> + struct uart_port *port = (struct uart_port *)dev_id;
Useless casting.
> + spin_lock(&port->lock);
spin_lock_irqsave() ?
Consider the kernel command option that switches all IRQ handlers to
be threaded.
> +}
> +static void owl_uart_change_baudrate(struct owl_uart_port *owl_port,
> + unsigned long baud)
> +{
> + clk_set_rate(owl_port->clk, baud * 8);
> +}
> +static void owl_uart_release_port(struct uart_port *port)
> +{
> + struct platform_device *pdev = to_platform_device(port->dev);
> + struct resource *res;
> +
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!res)
> + return;
> +
> + if (port->flags & UPF_IOREMAP) {
> + devm_release_mem_region(port->dev, port->mapbase,
> + resource_size(res));
> + devm_iounmap(port->dev, port->membase);
> + port->membase = NULL;
> + }
Above is entirely redundant.
> +}
> +
> +static int owl_uart_request_port(struct uart_port *port)
> +{
> + struct platform_device *pdev = to_platform_device(port->dev);
> + struct resource *res;
> +
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!res)
> + return -ENXIO;
> +
> + if (!devm_request_mem_region(port->dev, port->mapbase,
> + resource_size(res), dev_name(port->dev)))
> + return -EBUSY;
> +
> + if (port->flags & UPF_IOREMAP) {
> + port->membase = devm_ioremap_nocache(port->dev, port->mapbase,
> + resource_size(res));
> + if (!port->membase)
> + return -EBUSY;
> + }
> +
> + return 0;
> +}
> +static void owl_uart_config_port(struct uart_port *port, int flags)
> +{
> + if (flags & UART_CONFIG_TYPE) {
if (!(...))
return;
?
> + port->type = PORT_OWL;
> + owl_uart_request_port(port);
> + }
> +}
> +static int owl_uart_probe(struct platform_device *pdev)
> +{
> + struct resource *res_mem, *res_irq;
> + struct owl_uart_port *owl_port;
> + int ret;
> +
> + if (pdev->dev.of_node)
> + pdev->id = of_alias_get_id(pdev->dev.of_node, "serial");
> +
> + if (pdev->id < 0 || pdev->id >= OWL_UART_PORT_NUM) {
> + dev_err(&pdev->dev, "id %d out of range\n", pdev->id);
> + return -EINVAL;
> + }
> +
> + res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!res_mem) {
> + dev_err(&pdev->dev, "could not get mem\n");
> + return -ENODEV;
> + }
You can use
struct resource *mem;
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
x = devm_ioremap_resource();
if (IS_ERR(x))
return PTR_ERR(x);
and remote IOREMAP flag below.
> + res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
> + if (!res_irq) {
> + dev_err(&pdev->dev, "could not get irq\n");
> + return -ENODEV;
> + }
platform_get_irq()
> + if (owl_uart_ports[pdev->id]) {
> + dev_err(&pdev->dev, "port %d already allocated\n", pdev->id);
> + return -EBUSY;
> + }
I guess it's redundant. It should be conflicting by resource (for example, IRQ).
> + owl_port->clk = clk_get(&pdev->dev, NULL);
devm_ ?
> + owl_port->port.iotype = UPIO_MEM;
> + owl_port->port.mapbase = res_mem->start;
> + owl_port->port.irq = res_irq->start;
> + owl_port->port.uartclk = clk_get_rate(owl_port->clk);
You need to check if it's 0 and use device property instead or bail out.
> + owl_port->port.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_LOW_LATENCY;
> + owl_port->port.x_char = 0;
> + owl_port->port.fifosize = 16;
> + owl_port->port.ops = &owl_uart_ops;
> +
> + owl_uart_ports[pdev->id] = owl_port;
> + platform_set_drvdata(pdev, owl_port);
It should be just before return 0, right?..
> +
> + ret = uart_add_one_port(&owl_uart_driver, &owl_port->port);
> + if (ret)
> + owl_uart_ports[pdev->id] = NULL;
...and thus, taking into consideration redundancy of that global var:
ret = uart_add_one_port(&owl_uart_driver, &owl_port->port);
if (ret)
retrun ret;
platform_set_drvdata(pdev, owl_port);
return 0;
> + return ret;
> +}
> +
> +static int owl_uart_remove(struct platform_device *pdev)
> +{
> + struct owl_uart_port *owl_port;
> +
> + owl_port = platform_get_drvdata(pdev);
Do above in one line.
> + uart_remove_one_port(&owl_uart_driver, &owl_port->port);
> + owl_uart_ports[pdev->id] = NULL;
Redundant.
> +
> + return 0;
> +}
> +/* Actions Semi Owl UART */
> +#define PORT_OWL 117
We can use holes for now IIUC.
See 36 or alike
--
With Best Regards,
Andy Shevchenko
next prev parent reply other threads:[~2017-06-07 14:38 UTC|newest]
Thread overview: 99+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-06 0:53 [PATCH v4 00/28] ARM: Initial Actions Semi S500 and S900 enablement Andreas Färber
2017-06-06 0:53 ` [PATCH v4 01/28] dt-bindings: Add vendor prefix for Actions Semi Andreas Färber
2017-06-18 18:46 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 02/28] dt-bindings: arm: Document Actions Semi S500 Andreas Färber
2017-06-18 18:48 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 03/28] dt-bindings: timer: Document Owl timer Andreas Färber
2017-06-18 20:18 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 04/28] clocksource: Add " Andreas Färber
2017-06-06 16:33 ` Daniel Lezcano
2017-06-18 20:43 ` Andreas Färber
2017-06-19 13:53 ` Daniel Lezcano
2017-06-19 14:31 ` Andreas Färber
2017-06-21 11:57 ` Daniel Lezcano
2017-06-06 0:54 ` [PATCH v4 05/28] clocksource: owl: Add S900 support Andreas Färber
2017-06-06 16:34 ` Daniel Lezcano
2017-06-18 20:50 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 06/28] ARM: Prepare Actions Semi S500 Andreas Färber
2017-06-18 21:21 ` Andreas Färber
2017-07-01 21:41 ` [PATCH] ARM: owl: Drop custom machine Andreas Färber
2017-06-06 0:54 ` [PATCH v4 07/28] ARM64: Prepare Actions Semi S900 Andreas Färber
2017-06-11 13:04 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 08/28] dt-bindings: serial: Document Actions Semi Owl UARTs Andreas Färber
2017-06-06 0:54 ` [PATCH v4 09/28] tty: serial: Add Actions Semi Owl UART earlycon Andreas Färber
2017-06-18 21:45 ` Andreas Färber
2017-06-19 1:16 ` Greg Kroah-Hartman
2017-06-19 1:24 ` Andreas Färber
2017-06-19 1:46 ` [PATCH v5 07/26] dt-bindings: serial: Document Actions Semi Owl UARTs Andreas Färber
2017-06-19 1:46 ` [PATCH v5 08/26] tty: serial: Add Actions Semi Owl UART earlycon Andreas Färber
2017-06-19 2:12 ` [PATCH v4 09/28] " Greg Kroah-Hartman
2017-06-19 2:26 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 10/28] Documentation: kernel-parameters: Document owl earlycon Andreas Färber
2017-06-06 0:54 ` [PATCH v4 11/28] ARM: dts: Add Actions Semi S500 and LeMaker Guitar Andreas Färber
2017-06-18 22:10 ` Andreas Färber
2017-06-19 1:08 ` [PATCH v5 10/27] " Andreas Färber
2017-06-19 2:01 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 12/28] dt-bindings: Add vendor prefix for uCRobotics Andreas Färber
2017-06-18 22:19 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 13/28] dt-bindings: arm: Document Actions Semi S900 Andreas Färber
2017-06-18 22:29 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 14/28] ARM64: dts: Add Actions Semi S900 and Bubblegum-96 Andreas Färber
2017-06-18 22:40 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 15/28] MAINTAINERS: Add Actions Semi Owl section Andreas Färber
2017-06-18 22:49 ` Andreas Färber
2017-06-19 2:44 ` [PATCH v5 13/26] " Andreas Färber
2017-06-26 6:56 ` 答复: " 张天益
2017-06-06 0:54 ` [PATCH v4 16/28] tty: serial: owl: Implement console driver Andreas Färber
2017-06-06 13:34 ` Alan Cox
2017-07-02 20:27 ` Andreas Färber
2017-06-07 14:37 ` Andy Shevchenko [this message]
2017-07-02 22:36 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 17/28] ARM64: dts: actions: s900-bubblegum-96: Add fake uart5 clock Andreas Färber
2017-09-05 21:29 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 18/28] ARM: dts: s500-guitar-bb-rev-b: Add fake uart3 clock Andreas Färber
2017-09-05 21:37 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 19/28] dt-bindings: arm: cpus: Add S500 enable-method Andreas Färber
2017-06-19 2:09 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 20/28] ARM: owl: Implement CPU enable-method for S500 Andreas Färber
2017-06-19 2:11 ` Andreas Färber
2017-06-21 8:16 ` Arnd Bergmann
2017-06-21 10:25 ` Arnd Bergmann
2017-06-21 16:48 ` Andreas Färber
2017-06-21 18:02 ` Arnd Bergmann
2017-06-29 15:07 ` Arnd Bergmann
2017-06-29 15:22 ` Andreas Färber
2017-06-29 15:50 ` Arnd Bergmann
2017-07-01 21:29 ` [PATCH] ARM: owl: smp: Drop bogus holding pen Andreas Färber
2017-07-03 12:35 ` Arnd Bergmann
2017-07-01 4:42 ` 答复: [PATCH v4 20/28] ARM: owl: Implement CPU enable-method for S500 刘炜
2017-07-01 19:56 ` Andreas Färber
2017-07-03 8:13 ` 刘炜
2017-07-04 23:32 ` [PATCH] ARM: owl: smp: Drop owl_secondary_boot() Andreas Färber
2017-07-05 2:36 ` Florian Fainelli
2017-07-06 17:17 ` Andreas Färber
2017-07-06 17:38 ` Alexandre Belloni
2017-07-06 19:47 ` Florian Fainelli
2017-07-07 7:34 ` Gregory CLEMENT
2017-07-07 17:32 ` Florian Fainelli
2017-07-06 17:39 ` Mark Rutland
2017-07-06 21:16 ` Florian Fainelli
2017-07-09 21:55 ` Andreas Färber
2017-07-10 4:27 ` Florian Fainelli
2017-06-06 0:54 ` [PATCH v4 21/28] ARM: dts: s500: Set CPU enable-method Andreas Färber
2017-06-19 2:09 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 22/28] dt-bindings: power: Add Owl SPS power domains Andreas Färber
2017-06-19 3:36 ` [PATCH v5 20/26] " Andreas Färber
2017-06-19 3:57 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 23/28] soc: actions: Add Owl SPS Andreas Färber
2017-06-19 3:40 ` [PATCH v5 21/26] " Andreas Färber
2017-06-19 3:59 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 24/28] MAINTAINERS: Update Actions Semi section with SPS Andreas Färber
2017-06-19 3:44 ` [PATCH v5 22/26] " Andreas Färber
2017-06-19 4:00 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 25/28] ARM: dts: s500: Add SPS node Andreas Färber
2017-06-19 4:01 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 26/28] ARM: dts: s500: Set power domains for CPU2 and CPU3 Andreas Färber
2017-07-27 20:58 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 27/28] soc: actions: owl-sps: Factor out owl_sps_set_pg() for power-gating Andreas Färber
2017-06-19 4:12 ` Andreas Färber
2017-06-06 0:54 ` [PATCH v4 28/28] ARM: owl: smp: Implement SPS power-gating for CPU2 and CPU3 Andreas Färber
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAHp75VcYtdxknAw5b1zp+qLi1MT3ktwm99rOJEivcBrc+9B-cg@mail.gmail.com \
--to=andy.shevchenko@gmail.com \
--cc=96boards@ucrobotics.com \
--cc=afaerber@suse.de \
--cc=gregkh@linuxfoundation.org \
--cc=jslaby@suse.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=liuwei@actions-semi.com \
--cc=mp-cs@actions-semi.com \
--cc=support@lemaker.org \
--cc=thomas.liau@actions-semi.com \
--cc=tyzhang@actions-semi.com \
--cc=zhangdf@actions-semi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).