diff mbox

[v2,01/16] serial: sh-sci: Drop the interface clock

Message ID 1447958173-543-2-git-send-email-geert+renesas@glider.be (mailing list archive)
State Changes Requested
Commit c709cbd43ac8967384745b3ecda8581f9b59d846
Delegated to: Geert Uytterhoeven
Headers show

Commit Message

Geert Uytterhoeven Nov. 19, 2015, 6:35 p.m. UTC
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

As no platform defines an interface clock the SCI driver always falls
back to a clock named "peripheral_clk".
  - On SH platforms that clock is the base clock for the SCI functional
    clock and has the same frequency,
  - On ARM platforms that clock doesn't exist, and clk_get() will return
    the default clock for the device.
We can thus make the functional clock mandatory and drop the interface
clock.

EPROBE_DEFER is handled for clocks that may be referenced from DT (i.e.
"fck" and deprecated "sci_ick").

Cc: devicetree@vger.kernel.org
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: Simon Horman <horms+renesas@verge.net.au>
[geert: Handle EPROBE_DEFER, reformat description, break long comment line]
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v2:
  - Add Acked-by,
  - Amendment by geert.
---
 .../bindings/serial/renesas,sci-serial.txt         |  4 +-
 drivers/tty/serial/sh-sci.c                        | 64 ++++++++++++++--------
 2 files changed, 43 insertions(+), 25 deletions(-)

Comments

Rob Herring Nov. 20, 2015, 4:27 p.m. UTC | #1
On Thu, Nov 19, 2015 at 07:35:58PM +0100, Geert Uytterhoeven wrote:
> From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> 
> As no platform defines an interface clock the SCI driver always falls
> back to a clock named "peripheral_clk".
>   - On SH platforms that clock is the base clock for the SCI functional
>     clock and has the same frequency,
>   - On ARM platforms that clock doesn't exist, and clk_get() will return
>     the default clock for the device.
> We can thus make the functional clock mandatory and drop the interface
> clock.
> 
> EPROBE_DEFER is handled for clocks that may be referenced from DT (i.e.
> "fck" and deprecated "sci_ick").
> 
> Cc: devicetree@vger.kernel.org
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> Acked-by: Simon Horman <horms+renesas@verge.net.au>
> [geert: Handle EPROBE_DEFER, reformat description, break long comment line]
> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>

This could break users that care about the clock name. A new dtb with 
old kernel would be one example. I guess you are okay with that, so:

Acked-by: Rob Herring <robh@kernel.org>


> ---
> v2:
>   - Add Acked-by,
>   - Amendment by geert.
> ---
>  .../bindings/serial/renesas,sci-serial.txt         |  4 +-
>  drivers/tty/serial/sh-sci.c                        | 64 ++++++++++++++--------
>  2 files changed, 43 insertions(+), 25 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt b/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
> index 73f825e5e6448815..2c9e6b8477e92792 100644
> --- a/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
> +++ b/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
> @@ -42,7 +42,7 @@ Required properties:
>  
>    - clocks: Must contain a phandle and clock-specifier pair for each entry
>      in clock-names.
> -  - clock-names: Must contain "sci_ick" for the SCIx UART interface clock.
> +  - clock-names: Must contain "fck" for the SCIx UART functional clock.
>  
>  Note: Each enabled SCIx UART should have an alias correctly numbered in the
>  "aliases" node.
> @@ -63,7 +63,7 @@ Example:
>  		interrupt-parent = <&gic>;
>  		interrupts = <0 144 IRQ_TYPE_LEVEL_HIGH>;
>  		clocks = <&mstp2_clks R8A7790_CLK_SCIFA0>;
> -		clock-names = "sci_ick";
> +		clock-names = "fck";
>  		dmas = <&dmac0 0x21>, <&dmac0 0x22>;
>  		dma-names = "tx", "rx";
>  	};
> diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
> index 51c7507b0444957b..3c908804cab1c88c 100644
> --- a/drivers/tty/serial/sh-sci.c
> +++ b/drivers/tty/serial/sh-sci.c
> @@ -92,8 +92,6 @@ struct sci_port {
>  	struct timer_list	break_timer;
>  	int			break_flag;
>  
> -	/* Interface clock */
> -	struct clk		*iclk;
>  	/* Function clock */
>  	struct clk		*fclk;
>  
> @@ -457,9 +455,8 @@ static void sci_port_enable(struct sci_port *sci_port)
>  
>  	pm_runtime_get_sync(sci_port->port.dev);
>  
> -	clk_prepare_enable(sci_port->iclk);
> -	sci_port->port.uartclk = clk_get_rate(sci_port->iclk);
>  	clk_prepare_enable(sci_port->fclk);
> +	sci_port->port.uartclk = clk_get_rate(sci_port->fclk);
>  }
>  
>  static void sci_port_disable(struct sci_port *sci_port)
> @@ -476,7 +473,6 @@ static void sci_port_disable(struct sci_port *sci_port)
>  	sci_port->break_flag = 0;
>  
>  	clk_disable_unprepare(sci_port->fclk);
> -	clk_disable_unprepare(sci_port->iclk);
>  
>  	pm_runtime_put_sync(sci_port->port.dev);
>  }
> @@ -1622,7 +1618,7 @@ static int sci_notifier(struct notifier_block *self,
>  		struct uart_port *port = &sci_port->port;
>  
>  		spin_lock_irqsave(&port->lock, flags);
> -		port->uartclk = clk_get_rate(sci_port->iclk);
> +		port->uartclk = clk_get_rate(sci_port->fclk);
>  		spin_unlock_irqrestore(&port->lock, flags);
>  	}
>  
> @@ -2241,6 +2237,42 @@ static struct uart_ops sci_uart_ops = {
>  #endif
>  };
>  
> +static int sci_init_clocks(struct sci_port *sci_port, struct device *dev)
> +{
> +	/* Get the SCI functional clock. It's called "fck" on ARM. */
> +	sci_port->fclk = clk_get(dev, "fck");
> +	if (PTR_ERR(sci_port->fclk) == -EPROBE_DEFER)
> +		return -EPROBE_DEFER;
> +	if (!IS_ERR(sci_port->fclk))
> +		return 0;
> +
> +	/*
> +	 * But it used to be called "sci_ick", and we need to maintain DT
> +	 * backward compatibility.
> +	 */
> +	sci_port->fclk = clk_get(dev, "sci_ick");
> +	if (PTR_ERR(sci_port->fclk) == -EPROBE_DEFER)
> +		return -EPROBE_DEFER;
> +	if (!IS_ERR(sci_port->fclk))
> +		return 0;
> +
> +	/* SH has historically named the clock "sci_fck". */
> +	sci_port->fclk = clk_get(dev, "sci_fck");
> +	if (!IS_ERR(sci_port->fclk))
> +		return 0;
> +
> +	/*
> +	 * Not all SH platforms declare a clock lookup entry for SCI devices,
> +	 * in which case we need to get the global "peripheral_clk" clock.
> +	 */
> +	sci_port->fclk = clk_get(dev, "peripheral_clk");
> +	if (!IS_ERR(sci_port->fclk))
> +		return 0;
> +
> +	dev_err(dev, "failed to get functional clock\n");
> +	return PTR_ERR(sci_port->fclk);
> +}
> +
>  static int sci_init_single(struct platform_device *dev,
>  			   struct sci_port *sci_port, unsigned int index,
>  			   struct plat_sci_port *p, bool early)
> @@ -2333,22 +2365,9 @@ static int sci_init_single(struct platform_device *dev,
>  		sci_port->sampling_rate = p->sampling_rate;
>  
>  	if (!early) {
> -		sci_port->iclk = clk_get(&dev->dev, "sci_ick");
> -		if (IS_ERR(sci_port->iclk)) {
> -			sci_port->iclk = clk_get(&dev->dev, "peripheral_clk");
> -			if (IS_ERR(sci_port->iclk)) {
> -				dev_err(&dev->dev, "can't get iclk\n");
> -				return PTR_ERR(sci_port->iclk);
> -			}
> -		}
> -
> -		/*
> -		 * The function clock is optional, ignore it if we can't
> -		 * find it.
> -		 */
> -		sci_port->fclk = clk_get(&dev->dev, "sci_fck");
> -		if (IS_ERR(sci_port->fclk))
> -			sci_port->fclk = NULL;
> +		ret = sci_init_clocks(sci_port, &dev->dev);
> +		if (ret < 0)
> +			return ret;
>  
>  		port->dev = &dev->dev;
>  
> @@ -2405,7 +2424,6 @@ static int sci_init_single(struct platform_device *dev,
>  
>  static void sci_cleanup_single(struct sci_port *port)
>  {
> -	clk_put(port->iclk);
>  	clk_put(port->fclk);
>  
>  	pm_runtime_disable(port->port.dev);
> -- 
> 1.9.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe devicetree" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Greg Kroah-Hartman Dec. 13, 2015, 6:42 a.m. UTC | #2
On Thu, Nov 19, 2015 at 07:35:58PM +0100, Geert Uytterhoeven wrote:
> From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> 
> As no platform defines an interface clock the SCI driver always falls
> back to a clock named "peripheral_clk".
>   - On SH platforms that clock is the base clock for the SCI functional
>     clock and has the same frequency,
>   - On ARM platforms that clock doesn't exist, and clk_get() will return
>     the default clock for the device.
> We can thus make the functional clock mandatory and drop the interface
> clock.
> 
> EPROBE_DEFER is handled for clocks that may be referenced from DT (i.e.
> "fck" and deprecated "sci_ick").
> 
> Cc: devicetree@vger.kernel.org
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> Acked-by: Simon Horman <horms+renesas@verge.net.au>
> [geert: Handle EPROBE_DEFER, reformat description, break long comment line]
> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>

Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Simon Horman Dec. 14, 2015, 8:15 a.m. UTC | #3
Hi Greg,

On Sat, Dec 12, 2015 at 10:42:37PM -0800, Greg Kroah-Hartman wrote:
> On Thu, Nov 19, 2015 at 07:35:58PM +0100, Geert Uytterhoeven wrote:
> > From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> > 
> > As no platform defines an interface clock the SCI driver always falls
> > back to a clock named "peripheral_clk".
> >   - On SH platforms that clock is the base clock for the SCI functional
> >     clock and has the same frequency,
> >   - On ARM platforms that clock doesn't exist, and clk_get() will return
> >     the default clock for the device.
> > We can thus make the functional clock mandatory and drop the interface
> > clock.
> > 
> > EPROBE_DEFER is handled for clocks that may be referenced from DT (i.e.
> > "fck" and deprecated "sci_ick").
> > 
> > Cc: devicetree@vger.kernel.org
> > Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> > Acked-by: Simon Horman <horms+renesas@verge.net.au>
> > [geert: Handle EPROBE_DEFER, reformat description, break long comment line]
> > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
> 
> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

If its not too much trouble I would prefer if you took this into the serial
tree.
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Simon Horman Dec. 14, 2015, 8:16 a.m. UTC | #4
On Mon, Dec 14, 2015 at 05:15:40PM +0900, Simon Horman wrote:
> Hi Greg,
> 
> On Sat, Dec 12, 2015 at 10:42:37PM -0800, Greg Kroah-Hartman wrote:
> > On Thu, Nov 19, 2015 at 07:35:58PM +0100, Geert Uytterhoeven wrote:
> > > From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> > > 
> > > As no platform defines an interface clock the SCI driver always falls
> > > back to a clock named "peripheral_clk".
> > >   - On SH platforms that clock is the base clock for the SCI functional
> > >     clock and has the same frequency,
> > >   - On ARM platforms that clock doesn't exist, and clk_get() will return
> > >     the default clock for the device.
> > > We can thus make the functional clock mandatory and drop the interface
> > > clock.
> > > 
> > > EPROBE_DEFER is handled for clocks that may be referenced from DT (i.e.
> > > "fck" and deprecated "sci_ick").
> > > 
> > > Cc: devicetree@vger.kernel.org
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> > > Acked-by: Simon Horman <horms+renesas@verge.net.au>
> > > [geert: Handle EPROBE_DEFER, reformat description, break long comment line]
> > > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
> > 
> > Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> 
> If its not too much trouble I would prefer if you took this into the serial
> tree.

Sorry, I meant to can this email rather than sent it.
Please ignore the above!!!
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt b/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
index 73f825e5e6448815..2c9e6b8477e92792 100644
--- a/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
+++ b/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
@@ -42,7 +42,7 @@  Required properties:
 
   - clocks: Must contain a phandle and clock-specifier pair for each entry
     in clock-names.
-  - clock-names: Must contain "sci_ick" for the SCIx UART interface clock.
+  - clock-names: Must contain "fck" for the SCIx UART functional clock.
 
 Note: Each enabled SCIx UART should have an alias correctly numbered in the
 "aliases" node.
@@ -63,7 +63,7 @@  Example:
 		interrupt-parent = <&gic>;
 		interrupts = <0 144 IRQ_TYPE_LEVEL_HIGH>;
 		clocks = <&mstp2_clks R8A7790_CLK_SCIFA0>;
-		clock-names = "sci_ick";
+		clock-names = "fck";
 		dmas = <&dmac0 0x21>, <&dmac0 0x22>;
 		dma-names = "tx", "rx";
 	};
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 51c7507b0444957b..3c908804cab1c88c 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -92,8 +92,6 @@  struct sci_port {
 	struct timer_list	break_timer;
 	int			break_flag;
 
-	/* Interface clock */
-	struct clk		*iclk;
 	/* Function clock */
 	struct clk		*fclk;
 
@@ -457,9 +455,8 @@  static void sci_port_enable(struct sci_port *sci_port)
 
 	pm_runtime_get_sync(sci_port->port.dev);
 
-	clk_prepare_enable(sci_port->iclk);
-	sci_port->port.uartclk = clk_get_rate(sci_port->iclk);
 	clk_prepare_enable(sci_port->fclk);
+	sci_port->port.uartclk = clk_get_rate(sci_port->fclk);
 }
 
 static void sci_port_disable(struct sci_port *sci_port)
@@ -476,7 +473,6 @@  static void sci_port_disable(struct sci_port *sci_port)
 	sci_port->break_flag = 0;
 
 	clk_disable_unprepare(sci_port->fclk);
-	clk_disable_unprepare(sci_port->iclk);
 
 	pm_runtime_put_sync(sci_port->port.dev);
 }
@@ -1622,7 +1618,7 @@  static int sci_notifier(struct notifier_block *self,
 		struct uart_port *port = &sci_port->port;
 
 		spin_lock_irqsave(&port->lock, flags);
-		port->uartclk = clk_get_rate(sci_port->iclk);
+		port->uartclk = clk_get_rate(sci_port->fclk);
 		spin_unlock_irqrestore(&port->lock, flags);
 	}
 
@@ -2241,6 +2237,42 @@  static struct uart_ops sci_uart_ops = {
 #endif
 };
 
+static int sci_init_clocks(struct sci_port *sci_port, struct device *dev)
+{
+	/* Get the SCI functional clock. It's called "fck" on ARM. */
+	sci_port->fclk = clk_get(dev, "fck");
+	if (PTR_ERR(sci_port->fclk) == -EPROBE_DEFER)
+		return -EPROBE_DEFER;
+	if (!IS_ERR(sci_port->fclk))
+		return 0;
+
+	/*
+	 * But it used to be called "sci_ick", and we need to maintain DT
+	 * backward compatibility.
+	 */
+	sci_port->fclk = clk_get(dev, "sci_ick");
+	if (PTR_ERR(sci_port->fclk) == -EPROBE_DEFER)
+		return -EPROBE_DEFER;
+	if (!IS_ERR(sci_port->fclk))
+		return 0;
+
+	/* SH has historically named the clock "sci_fck". */
+	sci_port->fclk = clk_get(dev, "sci_fck");
+	if (!IS_ERR(sci_port->fclk))
+		return 0;
+
+	/*
+	 * Not all SH platforms declare a clock lookup entry for SCI devices,
+	 * in which case we need to get the global "peripheral_clk" clock.
+	 */
+	sci_port->fclk = clk_get(dev, "peripheral_clk");
+	if (!IS_ERR(sci_port->fclk))
+		return 0;
+
+	dev_err(dev, "failed to get functional clock\n");
+	return PTR_ERR(sci_port->fclk);
+}
+
 static int sci_init_single(struct platform_device *dev,
 			   struct sci_port *sci_port, unsigned int index,
 			   struct plat_sci_port *p, bool early)
@@ -2333,22 +2365,9 @@  static int sci_init_single(struct platform_device *dev,
 		sci_port->sampling_rate = p->sampling_rate;
 
 	if (!early) {
-		sci_port->iclk = clk_get(&dev->dev, "sci_ick");
-		if (IS_ERR(sci_port->iclk)) {
-			sci_port->iclk = clk_get(&dev->dev, "peripheral_clk");
-			if (IS_ERR(sci_port->iclk)) {
-				dev_err(&dev->dev, "can't get iclk\n");
-				return PTR_ERR(sci_port->iclk);
-			}
-		}
-
-		/*
-		 * The function clock is optional, ignore it if we can't
-		 * find it.
-		 */
-		sci_port->fclk = clk_get(&dev->dev, "sci_fck");
-		if (IS_ERR(sci_port->fclk))
-			sci_port->fclk = NULL;
+		ret = sci_init_clocks(sci_port, &dev->dev);
+		if (ret < 0)
+			return ret;
 
 		port->dev = &dev->dev;
 
@@ -2405,7 +2424,6 @@  static int sci_init_single(struct platform_device *dev,
 
 static void sci_cleanup_single(struct sci_port *port)
 {
-	clk_put(port->iclk);
 	clk_put(port->fclk);
 
 	pm_runtime_disable(port->port.dev);