linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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

  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).