devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
  • * [PATCH v11 5/6] flexcan: Prefer device tree clock frequency if available.
           [not found] <1313078831-2511-1-git-send-email-holt@sgi.com>
           [not found] ` <1313078831-2511-1-git-send-email-holt-sJ/iWh9BUns@public.gmane.org>
    @ 2011-08-11 16:07 ` Robin Holt
           [not found]   ` <1313078831-2511-6-git-send-email-holt-sJ/iWh9BUns@public.gmane.org>
      1 sibling, 1 reply; 8+ messages in thread
    From: Robin Holt @ 2011-08-11 16:07 UTC (permalink / raw)
      To: Kumar Gala, Wolfgang Grandegger, Marc Kleine-Budde,
    	U Bhaskar-B22300
      Cc: Robin Holt, socketcan-core, netdev, PPC list, devicetree-discuss
    
    If our CAN device's device tree node has a clock-frequency property,
    then use that value for the can devices clock frequency.  If not, fall
    back to asking the platform/mach code for the clock frequency associated
    with the flexcan device.
    
    Signed-off-by: Robin Holt <holt@sgi.com>
    To: Kumar Gala <galak@kernel.crashing.org>
    To: Wolfgang Grandegger <wg@grandegger.com>,
    To: Marc Kleine-Budde <mkl@pengutronix.de>,
    To: U Bhaskar-B22300 <B22300@freescale.com>
    To: Scott Wood <scottwood@freescale.com>
    To: Grant Likely <grant.likely@secretlab.ca>
    Cc: socketcan-core@lists.berlios.de,
    Cc: netdev@vger.kernel.org,
    Cc: PPC list <linuxppc-dev@lists.ozlabs.org>
    Cc: devicetree-discuss@lists.ozlabs.org
    ---
     .../devicetree/bindings/net/can/fsl-flexcan.txt    |    2 +
     drivers/net/can/flexcan.c                          |   33 +++++++++++++++-----
     2 files changed, 27 insertions(+), 8 deletions(-)
    
    diff --git a/Documentation/devicetree/bindings/net/can/fsl-flexcan.txt b/Documentation/devicetree/bindings/net/can/fsl-flexcan.txt
    index c78dcbb..a4382c7 100644
    --- a/Documentation/devicetree/bindings/net/can/fsl-flexcan.txt
    +++ b/Documentation/devicetree/bindings/net/can/fsl-flexcan.txt
    @@ -11,6 +11,7 @@ Required properties:
     
     - reg : Offset and length of the register set for this device
     - interrupts : Interrupt tuple for this device
    +- clock-frequency : The oscillator frequency driving the flexcan device
     
     Example:
     
    @@ -19,4 +20,5 @@ Example:
               reg = <0x1c000 0x1000>;
               interrupts = <48 0x2>;
               interrupt-parent = <&mpic>;
    +          clock-frequency = <0x0bebc1fc>;
       };
    diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
    index 662f832..d40c38e 100644
    --- a/drivers/net/can/flexcan.c
    +++ b/drivers/net/can/flexcan.c
    @@ -33,6 +33,7 @@
     #include <linux/kernel.h>
     #include <linux/list.h>
     #include <linux/module.h>
    +#include <linux/of.h>
     #include <linux/platform_device.h>
     
     #define DRV_NAME			"flexcan"
    @@ -929,12 +930,26 @@ static int __devinit flexcan_probe(struct platform_device *pdev)
     	void __iomem *base;
     	resource_size_t mem_size;
     	int err, irq;
    +	u32 clock_freq = 0;
     
    -	clk = clk_get(&pdev->dev, NULL);
    -	if (IS_ERR(clk)) {
    -		dev_err(&pdev->dev, "no clock defined\n");
    -		err = PTR_ERR(clk);
    -		goto failed_clock;
    +	if (pdev->dev.of_node) {
    +		const u32 *clock_freq_p;
    +
    +		clk = NULL;
    +		clock_freq_p = of_get_property(pdev->dev.of_node,
    +						"clock-frequency", NULL);
    +		if (clock_freq_p)
    +			clock_freq = *clock_freq_p;
    +	}
    +
    +	if (!clock_freq) {
    +		clk = clk_get(&pdev->dev, NULL);
    +		if (IS_ERR(clk)) {
    +			dev_err(&pdev->dev, "no clock defined\n");
    +			err = PTR_ERR(clk);
    +			goto failed_clock;
    +		}
    +		clock_freq = clk_get_rate(clk);
     	}
     
     	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    @@ -967,7 +982,7 @@ static int __devinit flexcan_probe(struct platform_device *pdev)
     	dev->flags |= IFF_ECHO; /* we support local echo in hardware */
     
     	priv = netdev_priv(dev);
    -	priv->can.clock.freq = clk_get_rate(clk);
    +	priv->can.clock.freq = clock_freq;
     	priv->can.bittiming_const = &flexcan_bittiming_const;
     	priv->can.do_set_mode = flexcan_set_mode;
     	priv->can.do_get_berr_counter = flexcan_get_berr_counter;
    @@ -1002,7 +1017,8 @@ static int __devinit flexcan_probe(struct platform_device *pdev)
      failed_map:
     	release_mem_region(mem->start, mem_size);
      failed_get:
    -	clk_put(clk);
    +	if (clk)
    +		clk_put(clk);
      failed_clock:
     	return err;
     }
    @@ -1020,7 +1036,8 @@ static int __devexit flexcan_remove(struct platform_device *pdev)
     	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
     	release_mem_region(mem->start, resource_size(mem));
     
    -	clk_put(priv->clk);
    +	if (priv->clk)
    +		clk_put(priv->clk);
     
     	free_candev(dev);
     
    -- 
    1.7.2.1
    
    
    ^ permalink raw reply related	[flat|nested] 8+ messages in thread

  • end of thread, other threads:[~2011-08-12  8:28 UTC | newest]
    
    Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
    -- links below jump to the message on this page --
         [not found] <1313078831-2511-1-git-send-email-holt@sgi.com>
         [not found] ` <1313078831-2511-1-git-send-email-holt-sJ/iWh9BUns@public.gmane.org>
    2011-08-11 16:07   ` [PATCH v11 3/6] flexcan: Fix up fsl-flexcan device tree binding Robin Holt
    2011-08-11 16:53     ` Grant Likely
         [not found]       ` <CACxGe6vA8K7fhrSvBpKC+9aKftUc2+1EAUQ=A0SmmwzJ2Le=9A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
    2011-08-12  8:28         ` Robin Holt
    2011-08-11 16:07   ` [PATCH v11 4/6] flexcan: Add of_match to platform_device definition Robin Holt
    2011-08-11 16:07 ` [PATCH v11 5/6] flexcan: Prefer device tree clock frequency if available Robin Holt
         [not found]   ` <1313078831-2511-6-git-send-email-holt-sJ/iWh9BUns@public.gmane.org>
    2011-08-11 16:18     ` Marc Kleine-Budde
         [not found]       ` <4E4400CC.3020704-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
    2011-08-11 17:40         ` Kumar Gala
    2011-08-11 16:35     ` Wolfgang Grandegger
    

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