linux-sh.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Marc Kleine-Budde <mkl@pengutronix.de>
To: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>,
	netdev@vger.kernel.org, wg@grandegger.com,
	linux-can@vger.kernel.org
Cc: linux-sh@vger.kernel.org, vksavl@gmail.com
Subject: Re: [PATCH] rcar_can: support all input clocks
Date: Wed, 30 Jul 2014 07:32:14 +0000	[thread overview]
Message-ID: <53D89F7E.3020204@pengutronix.de> (raw)
In-Reply-To: <201407300145.34797.sergei.shtylyov@cogentembedded.com>

[-- Attachment #1: Type: text/plain, Size: 4646 bytes --]

On 07/29/2014 11:45 PM, Sergei Shtylyov wrote:
> When writing the driver, I didn't give enough attention to the possible sources
> of the CAN clock: although the value of the CLKR register was specified by  the
> platform data, the driver only handled one case, that is CAN clock being sourced
> from the clkp1 clock, the same that clocks the whole CAN module. In order to fix
> that overlook, we'll have to handle the CAN clock separately from the peripheral
> clock (however, clkp1 will be specified for a CAN device only once)...
> 
> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>

Looks good, nitpick inline:
> 
> ---
> The patch is against the 'linux-can-next.git' repo, however it's a fix, not a
> cleanup.
> 
>  drivers/net/can/rcar_can.c |   39 ++++++++++++++++++++++++++++++++++-----
>  1 file changed, 34 insertions(+), 5 deletions(-)
> 
> Index: linux-can-next/drivers/net/can/rcar_can.c
> ===================================================================
> --- linux-can-next.orig/drivers/net/can/rcar_can.c
> +++ linux-can-next/drivers/net/can/rcar_can.c
> @@ -87,6 +87,7 @@ struct rcar_can_priv {
>  	struct napi_struct napi;
>  	struct rcar_can_regs __iomem *regs;
>  	struct clk *clk;
> +	struct clk *can_clk;
>  	u8 tx_dlc[RCAR_CAN_FIFO_DEPTH];
>  	u32 tx_head;
>  	u32 tx_tail;
> @@ -505,14 +506,20 @@ static int rcar_can_open(struct net_devi
>  
>  	err = clk_prepare_enable(priv->clk);
>  	if (err) {
> -		netdev_err(ndev, "clk_prepare_enable() failed, error %d\n",
> +		netdev_err(ndev, "failed to enable periperal clock, error %d\n",
>  			   err);
>  		goto out;
>  	}
> +	err = clk_prepare_enable(priv->can_clk);
> +	if (err) {
> +		netdev_err(ndev, "failed to enable CAN clock, error %d\n",
> +			   err);
> +		goto out_clock;
> +	}
>  	err = open_candev(ndev);
>  	if (err) {
>  		netdev_err(ndev, "open_candev() failed, error %d\n", err);
> -		goto out_clock;
> +		goto out_can_clock;
>  	}
>  	napi_enable(&priv->napi);
>  	err = request_irq(ndev->irq, rcar_can_interrupt, 0, ndev->name, ndev);
> @@ -527,6 +534,8 @@ static int rcar_can_open(struct net_devi
>  out_close:
>  	napi_disable(&priv->napi);
>  	close_candev(ndev);
> +out_can_clock:
> +	clk_disable_unprepare(priv->can_clk);
>  out_clock:
>  	clk_disable_unprepare(priv->clk);
>  out:
> @@ -565,6 +574,7 @@ static int rcar_can_close(struct net_dev
>  	rcar_can_stop(ndev);
>  	free_irq(ndev->irq, ndev);
>  	napi_disable(&priv->napi);
> +	clk_disable_unprepare(priv->can_clk);
>  	clk_disable_unprepare(priv->clk);
>  	close_candev(ndev);
>  	can_led_event(ndev, CAN_LED_EVENT_STOP);
> @@ -715,6 +725,12 @@ static int rcar_can_get_berr_counter(con
>  	return 0;
>  }
>  
> +static const char * const clock_names[] = {
> +	[CLKR_CLKP1]	= "clkp1",
> +	[CLKR_CLKP2]	= "clkp2",
> +	[CLKR_CLKEXT]	= "can_clk",
> +};
> +
>  static int rcar_can_probe(struct platform_device *pdev)
>  {
>  	struct rcar_can_platform_data *pdata;
> @@ -753,10 +769,23 @@ static int rcar_can_probe(struct platfor
>  
>  	priv = netdev_priv(ndev);
>  
> -	priv->clk = devm_clk_get(&pdev->dev, NULL);
> +	priv->clk = devm_clk_get(&pdev->dev, "clkp1");
>  	if (IS_ERR(priv->clk)) {
>  		err = PTR_ERR(priv->clk);
> -		dev_err(&pdev->dev, "cannot get clock: %d\n", err);
> +		dev_err(&pdev->dev, "cannot get peripheral clock: %d\n", err);
> +		goto fail_clk;
> +	}
> +
> +	if (pdata->clock_select > CLKR_CLKEXT) {

Please use ARRAY_SIZE instead of CLKR_CLKEXT.

> +		err = -EINVAL;
> +		dev_err(&pdev->dev, "invalid CAN clock selected\n");
> +		goto fail_clk;
> +	}
> +	priv->can_clk = devm_clk_get(&pdev->dev,
> +				     clock_names[pdata->clock_select]);
> +	if (IS_ERR(priv->can_clk)) {
> +		err = PTR_ERR(priv->can_clk);
> +		dev_err(&pdev->dev, "cannot get CAN clock: %d\n", err);
>  		goto fail_clk;
>  	}
>  
> @@ -766,7 +795,7 @@ static int rcar_can_probe(struct platfor
>  	priv->ndev = ndev;
>  	priv->regs = addr;
>  	priv->clock_select = pdata->clock_select;
> -	priv->can.clock.freq = clk_get_rate(priv->clk);
> +	priv->can.clock.freq = clk_get_rate(priv->can_clk);
>  	priv->can.bittiming_const = &rcar_can_bittiming_const;
>  	priv->can.do_set_mode = rcar_can_do_set_mode;
>  	priv->can.do_get_berr_counter = rcar_can_get_berr_counter;
> 

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 242 bytes --]

      reply	other threads:[~2014-07-30  7:32 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-29 21:45 [PATCH] rcar_can: support all input clocks Sergei Shtylyov
2014-07-30  7:32 ` Marc Kleine-Budde [this message]

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=53D89F7E.3020204@pengutronix.de \
    --to=mkl@pengutronix.de \
    --cc=linux-can@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=sergei.shtylyov@cogentembedded.com \
    --cc=vksavl@gmail.com \
    --cc=wg@grandegger.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).