All of lore.kernel.org
 help / color / mirror / Atom feed
From: grant.likely@secretlab.ca (Grant Likely)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 1/7] serial: pxa: add OF support
Date: Fri, 09 Mar 2012 08:24:10 -0700	[thread overview]
Message-ID: <20120309152410.4E59C3E0908@localhost> (raw)
In-Reply-To: <1330950111-30797-2-git-send-email-haojian.zhuang@marvell.com>

On Mon,  5 Mar 2012 20:21:45 +0800, Haojian Zhuang <haojian.zhuang@marvell.com> wrote:
> Parse uart device id from alias in DTS file.
> 
> Signed-off-by: Haojian Zhuang <haojian.zhuang@marvell.com>
> ---
>  drivers/tty/serial/pxa.c |   65 +++++++++++++++++++++++++++++++++++++--------
>  1 files changed, 53 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/tty/serial/pxa.c b/drivers/tty/serial/pxa.c
> index 5c8e3bb..a71855b 100644
> --- a/drivers/tty/serial/pxa.c
> +++ b/drivers/tty/serial/pxa.c
> @@ -36,6 +36,7 @@
>  #include <linux/circ_buf.h>
>  #include <linux/delay.h>
>  #include <linux/interrupt.h>
> +#include <linux/of.h>
>  #include <linux/platform_device.h>
>  #include <linux/tty.h>
>  #include <linux/tty_flip.h>
> @@ -44,6 +45,8 @@
>  #include <linux/io.h>
>  #include <linux/slab.h>
>  
> +#define PXA_NAME_LEN		8
> +
>  struct uart_pxa_port {
>  	struct uart_port        port;
>  	unsigned char           ier;
> @@ -781,6 +784,39 @@ static const struct dev_pm_ops serial_pxa_pm_ops = {
>  };
>  #endif
>  
> +static struct of_device_id serial_pxa_dt_ids[] = {
> +	{ .compatible = "mrvl,pxa-uart", },
> +	{ .compatible = "mrvl,mmp-uart", },
> +	{}
> +};
> +MODULE_DEVICE_TABLE(of, serial_pxa_dt_ids);
> +
> +#ifdef CONFIG_OF
> +static int serial_pxa_probe_dt(struct platform_device *pdev,
> +			       struct uart_pxa_port *sport)
> +{
> +	struct device_node *np = pdev->dev.of_node;
> +	int ret;
> +
> +	if (!np)
> +		return 1;
> +
> +	ret = of_alias_get_id(np, "serial");
> +	if (ret < 0) {
> +		dev_err(&pdev->dev, "failed to get alias id, errno %d\n", ret);
> +		return ret;
> +	}
> +	sport->port.line = ret;
> +	return 0;
> +}
> +#else
> +static int serial_pxa_probe_dt(struct platform_device *pdev,
> +			       struct uart_pxa_port *sport)
> +{
> +	return 1;
> +}
> +#endif

Returning 1 on success is rather odd... see comment below.

> +
>  static int serial_pxa_probe(struct platform_device *dev)
>  {
>  	struct uart_pxa_port *sport;
> @@ -808,34 +844,37 @@ static int serial_pxa_probe(struct platform_device *dev)
>  	sport->port.irq = irqres->start;
>  	sport->port.fifosize = 64;
>  	sport->port.ops = &serial_pxa_pops;
> -	sport->port.line = dev->id;
>  	sport->port.dev = &dev->dev;
>  	sport->port.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF;
>  	sport->port.uartclk = clk_get_rate(sport->clk);
> -
> -	switch (dev->id) {
> -	case 0: sport->name = "FFUART"; break;
> -	case 1: sport->name = "BTUART"; break;
> -	case 2: sport->name = "STUART"; break;
> -	case 3: sport->name = "HWUART"; break;
> -	default:
> -		sport->name = "???";
> -		break;
> +	sport->name = kzalloc(PXA_NAME_LEN, GFP_KERNEL);

devm_kzalloc().  Then you don't need to unwind the allocation on failure.

> +	if (!sport->name) {
> +		ret = -ENOMEM;
> +		goto err_clk;
>  	}
>  
> +	ret = serial_pxa_probe_dt(dev, sport);
> +	if (ret > 0)
> +		sport->port.line = dev->id;
> +	else if (ret < 0)
> +		goto err_clk;
> +	snprintf(sport->name, PXA_NAME_LEN - 1, "UART%d", sport->port.line + 1);

returning a -/0/+ value from serial_pxa_probe_dt() is rather odd.  It's easier
to follow code which sticks to the convention of <0 for error, 0 for success.
I would do:

	sport->port.line = dev->id;
	ret = serial_pxa_probe_dt(dev, sport);
	if (ret < 0)
		goto err_clk;

Then serial_pxa_probe_dt() can return an error code on failure, or 0 on
success or no-devicetree.


> +
>  	sport->port.membase = ioremap(mmres->start, resource_size(mmres));
>  	if (!sport->port.membase) {
>  		ret = -ENOMEM;
> -		goto err_clk;
> +		goto err_name;
>  	}
>  
> -	serial_pxa_ports[dev->id] = sport;
> +	serial_pxa_ports[sport->port.line] = sport;
>  
>  	uart_add_one_port(&serial_pxa_reg, &sport->port);
>  	platform_set_drvdata(dev, sport);
>  
>  	return 0;
>  
> + err_name:
> +	kfree(sport->name);
>   err_clk:
>  	clk_put(sport->clk);
>   err_free:
> @@ -850,6 +889,7 @@ static int serial_pxa_remove(struct platform_device *dev)
>  	platform_set_drvdata(dev, NULL);
>  
>  	uart_remove_one_port(&serial_pxa_reg, &sport->port);
> +	kfree(sport->name);
>  	clk_put(sport->clk);
>  	kfree(sport);
>  
> @@ -866,6 +906,7 @@ static struct platform_driver serial_pxa_driver = {
>  #ifdef CONFIG_PM
>  		.pm	= &serial_pxa_pm_ops,
>  #endif
> +		.of_match_table = serial_pxa_dt_ids,

	.of_match_table = of_match_ptr(serial_pxa_dt_ids),

Otherwise looks great to me.

g.

WARNING: multiple messages have this Message-ID (diff)
From: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
To: arnd-r2nGTMty4D4@public.gmane.org,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
	linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org,
	eric.y.miao-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Cc: Haojian Zhuang <haojian.zhuang-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org>
Subject: Re: [PATCH v2 1/7] serial: pxa: add OF support
Date: Fri, 09 Mar 2012 08:24:10 -0700	[thread overview]
Message-ID: <20120309152410.4E59C3E0908@localhost> (raw)
In-Reply-To: <1330950111-30797-2-git-send-email-haojian.zhuang-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org>

On Mon,  5 Mar 2012 20:21:45 +0800, Haojian Zhuang <haojian.zhuang-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org> wrote:
> Parse uart device id from alias in DTS file.
> 
> Signed-off-by: Haojian Zhuang <haojian.zhuang-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org>
> ---
>  drivers/tty/serial/pxa.c |   65 +++++++++++++++++++++++++++++++++++++--------
>  1 files changed, 53 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/tty/serial/pxa.c b/drivers/tty/serial/pxa.c
> index 5c8e3bb..a71855b 100644
> --- a/drivers/tty/serial/pxa.c
> +++ b/drivers/tty/serial/pxa.c
> @@ -36,6 +36,7 @@
>  #include <linux/circ_buf.h>
>  #include <linux/delay.h>
>  #include <linux/interrupt.h>
> +#include <linux/of.h>
>  #include <linux/platform_device.h>
>  #include <linux/tty.h>
>  #include <linux/tty_flip.h>
> @@ -44,6 +45,8 @@
>  #include <linux/io.h>
>  #include <linux/slab.h>
>  
> +#define PXA_NAME_LEN		8
> +
>  struct uart_pxa_port {
>  	struct uart_port        port;
>  	unsigned char           ier;
> @@ -781,6 +784,39 @@ static const struct dev_pm_ops serial_pxa_pm_ops = {
>  };
>  #endif
>  
> +static struct of_device_id serial_pxa_dt_ids[] = {
> +	{ .compatible = "mrvl,pxa-uart", },
> +	{ .compatible = "mrvl,mmp-uart", },
> +	{}
> +};
> +MODULE_DEVICE_TABLE(of, serial_pxa_dt_ids);
> +
> +#ifdef CONFIG_OF
> +static int serial_pxa_probe_dt(struct platform_device *pdev,
> +			       struct uart_pxa_port *sport)
> +{
> +	struct device_node *np = pdev->dev.of_node;
> +	int ret;
> +
> +	if (!np)
> +		return 1;
> +
> +	ret = of_alias_get_id(np, "serial");
> +	if (ret < 0) {
> +		dev_err(&pdev->dev, "failed to get alias id, errno %d\n", ret);
> +		return ret;
> +	}
> +	sport->port.line = ret;
> +	return 0;
> +}
> +#else
> +static int serial_pxa_probe_dt(struct platform_device *pdev,
> +			       struct uart_pxa_port *sport)
> +{
> +	return 1;
> +}
> +#endif

Returning 1 on success is rather odd... see comment below.

> +
>  static int serial_pxa_probe(struct platform_device *dev)
>  {
>  	struct uart_pxa_port *sport;
> @@ -808,34 +844,37 @@ static int serial_pxa_probe(struct platform_device *dev)
>  	sport->port.irq = irqres->start;
>  	sport->port.fifosize = 64;
>  	sport->port.ops = &serial_pxa_pops;
> -	sport->port.line = dev->id;
>  	sport->port.dev = &dev->dev;
>  	sport->port.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF;
>  	sport->port.uartclk = clk_get_rate(sport->clk);
> -
> -	switch (dev->id) {
> -	case 0: sport->name = "FFUART"; break;
> -	case 1: sport->name = "BTUART"; break;
> -	case 2: sport->name = "STUART"; break;
> -	case 3: sport->name = "HWUART"; break;
> -	default:
> -		sport->name = "???";
> -		break;
> +	sport->name = kzalloc(PXA_NAME_LEN, GFP_KERNEL);

devm_kzalloc().  Then you don't need to unwind the allocation on failure.

> +	if (!sport->name) {
> +		ret = -ENOMEM;
> +		goto err_clk;
>  	}
>  
> +	ret = serial_pxa_probe_dt(dev, sport);
> +	if (ret > 0)
> +		sport->port.line = dev->id;
> +	else if (ret < 0)
> +		goto err_clk;
> +	snprintf(sport->name, PXA_NAME_LEN - 1, "UART%d", sport->port.line + 1);

returning a -/0/+ value from serial_pxa_probe_dt() is rather odd.  It's easier
to follow code which sticks to the convention of <0 for error, 0 for success.
I would do:

	sport->port.line = dev->id;
	ret = serial_pxa_probe_dt(dev, sport);
	if (ret < 0)
		goto err_clk;

Then serial_pxa_probe_dt() can return an error code on failure, or 0 on
success or no-devicetree.


> +
>  	sport->port.membase = ioremap(mmres->start, resource_size(mmres));
>  	if (!sport->port.membase) {
>  		ret = -ENOMEM;
> -		goto err_clk;
> +		goto err_name;
>  	}
>  
> -	serial_pxa_ports[dev->id] = sport;
> +	serial_pxa_ports[sport->port.line] = sport;
>  
>  	uart_add_one_port(&serial_pxa_reg, &sport->port);
>  	platform_set_drvdata(dev, sport);
>  
>  	return 0;
>  
> + err_name:
> +	kfree(sport->name);
>   err_clk:
>  	clk_put(sport->clk);
>   err_free:
> @@ -850,6 +889,7 @@ static int serial_pxa_remove(struct platform_device *dev)
>  	platform_set_drvdata(dev, NULL);
>  
>  	uart_remove_one_port(&serial_pxa_reg, &sport->port);
> +	kfree(sport->name);
>  	clk_put(sport->clk);
>  	kfree(sport);
>  
> @@ -866,6 +906,7 @@ static struct platform_driver serial_pxa_driver = {
>  #ifdef CONFIG_PM
>  		.pm	= &serial_pxa_pm_ops,
>  #endif
> +		.of_match_table = serial_pxa_dt_ids,

	.of_match_table = of_match_ptr(serial_pxa_dt_ids),

Otherwise looks great to me.

g.

  parent reply	other threads:[~2012-03-09 15:24 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-05 12:21 [PATCH v2 0/7] ARM: mmp: support OF on pxa168 Haojian Zhuang
2012-03-05 12:21 ` Haojian Zhuang
2012-03-05 12:21 ` [PATCH v2 1/7] serial: pxa: add OF support Haojian Zhuang
2012-03-05 12:21   ` Haojian Zhuang
2012-03-05 12:55   ` Arnd Bergmann
2012-03-05 12:55     ` Arnd Bergmann
2012-03-05 14:03     ` Haojian Zhuang
2012-03-05 14:03       ` Haojian Zhuang
2012-03-06  2:42     ` [PATCH v3 " Haojian Zhuang
2012-03-06  2:42       ` Haojian Zhuang
2012-03-06 15:02       ` Arnd Bergmann
2012-03-06 15:02         ` Arnd Bergmann
2012-03-06 15:04         ` Haojian Zhuang
2012-03-06 15:04           ` Haojian Zhuang
2012-03-07  1:42         ` [PATCH v3 1/6] " Haojian Zhuang
2012-03-07  1:42           ` Haojian Zhuang
2012-03-07  7:58           ` Arnd Bergmann
2012-03-07  7:58             ` Arnd Bergmann
2012-03-09 15:24   ` Grant Likely [this message]
2012-03-09 15:24     ` [PATCH v2 1/7] " Grant Likely
2012-04-03 15:45   ` Grant Likely
2012-04-03 15:45     ` Grant Likely
2012-03-05 12:21 ` [PATCH v2 2/7] rtc: sa1100: " Haojian Zhuang
2012-03-05 12:21   ` Haojian Zhuang
2012-03-05 14:41   ` Arnd Bergmann
2012-03-05 14:41     ` Arnd Bergmann
2012-03-05 12:21 ` [PATCH v2 3/7] i2c: pxa: " Haojian Zhuang
2012-03-05 12:21   ` Haojian Zhuang
2012-03-05 14:41   ` Arnd Bergmann
2012-03-05 14:41     ` Arnd Bergmann
2012-03-05 12:21 ` [PATCH v2 4/7] ARM: mmp: enable rtc clk in pxa168 Haojian Zhuang
2012-03-05 12:21   ` Haojian Zhuang
2012-03-05 14:38   ` Arnd Bergmann
2012-03-05 14:38     ` Arnd Bergmann
2012-03-05 12:21 ` [PATCH v2 5/7] ARM: mmp: append OF support on pxa168 Haojian Zhuang
2012-03-05 12:21   ` Haojian Zhuang
2012-03-05 14:37   ` Arnd Bergmann
2012-03-05 14:37     ` Arnd Bergmann
2012-04-09  1:36   ` Chris Ball
2012-04-09  1:36     ` Chris Ball
2012-04-09  1:46     ` Haojian Zhuang
2012-04-09  1:46       ` Haojian Zhuang
2012-04-09  1:51       ` Chris Ball
2012-04-09  1:51         ` Chris Ball
2012-04-09  2:04         ` Haojian Zhuang
2012-04-09  2:04           ` Haojian Zhuang
2012-04-09  1:43   ` Chris Ball
2012-04-09  1:43     ` Chris Ball
2012-04-09  1:47     ` Haojian Zhuang
2012-04-09  1:47       ` Haojian Zhuang
2012-03-05 12:21 ` [PATCH v2 6/7] ARM: dts: append DTS file of pxa168 Haojian Zhuang
2012-03-05 12:21   ` Haojian Zhuang
2012-03-05 14:35   ` Arnd Bergmann
2012-03-05 14:35     ` Arnd Bergmann
2012-03-05 12:21 ` [PATCH v2 7/7] Document: devicetree: add OF documents for arch-mmp Haojian Zhuang
2012-03-05 12:21   ` Haojian Zhuang
2012-03-05 14:46   ` Arnd Bergmann
2012-03-05 14:46     ` Arnd Bergmann
2012-03-05 15:07     ` Rob Herring
2012-03-05 15:07       ` Rob Herring
2012-03-05 15:08     ` Cousson, Benoit
2012-03-05 15:08       ` Cousson, Benoit
2012-04-02 23:21   ` Mitch Bradley
2012-04-02 23:21     ` Mitch Bradley

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=20120309152410.4E59C3E0908@localhost \
    --to=grant.likely@secretlab.ca \
    --cc=linux-arm-kernel@lists.infradead.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.