[U-Boot] [PATCH 2/2] serial: atmel_usart: add clk support

Wenyou Yang wenyou.yang at atmel.com
Thu Mar 23 04:50:26 UTC 2017


Add the clock support.

Signed-off-by: Wenyou Yang <wenyou.yang at atmel.com>
---

 drivers/serial/atmel_usart.c | 37 +++++++++++++++++++++++++++++++++++--
 1 file changed, 35 insertions(+), 2 deletions(-)

diff --git a/drivers/serial/atmel_usart.c b/drivers/serial/atmel_usart.c
index 8b1e0d55a4..ab213c13fa 100644
--- a/drivers/serial/atmel_usart.c
+++ b/drivers/serial/atmel_usart.c
@@ -7,6 +7,7 @@
  * SPDX-License-Identifier:	GPL-2.0+
  */
 #include <common.h>
+#include <clk.h>
 #include <dm.h>
 #include <errno.h>
 #include <watchdog.h>
@@ -136,6 +137,7 @@ __weak struct serial_device *default_serial_console(void)
 
 struct atmel_serial_priv {
 	atmel_usart3_t *usart;
+	ulong usart_clk_rate;
 };
 
 static void _atmel_serial_set_brg(atmel_usart3_t *usart,
@@ -168,7 +170,7 @@ int atmel_serial_setbrg(struct udevice *dev, int baudrate)
 {
 	struct atmel_serial_priv *priv = dev_get_priv(dev);
 
-	_atmel_serial_set_brg(priv->usart, get_usart_clk_rate(0), baudrate);
+	_atmel_serial_set_brg(priv->usart, priv->usart_clk_rate, baudrate);
 
 	return 0;
 }
@@ -213,10 +215,37 @@ static const struct dm_serial_ops atmel_serial_ops = {
 	.setbrg = atmel_serial_setbrg,
 };
 
+static int atmel_serial_enable_clk(struct udevice *dev)
+{
+	struct atmel_serial_priv *priv = dev_get_priv(dev);
+	struct clk clk;
+	ulong clk_rate;
+	int ret;
+
+	ret = clk_get_by_index(dev, 0, &clk);
+	if (ret)
+		return -EINVAL;
+
+	ret = clk_enable(&clk);
+	if (ret)
+		return ret;
+
+	clk_rate = clk_get_rate(&clk);
+	if (!clk_rate)
+		return -EINVAL;
+
+	priv->usart_clk_rate = clk_rate;
+
+	clk_free(&clk);
+
+	return 0;
+}
+
 static int atmel_serial_probe(struct udevice *dev)
 {
 	struct atmel_serial_platdata *plat = dev->platdata;
 	struct atmel_serial_priv *priv = dev_get_priv(dev);
+	int ret;
 #if CONFIG_IS_ENABLED(OF_CONTROL)
 	fdt_addr_t addr_base;
 
@@ -228,7 +257,11 @@ static int atmel_serial_probe(struct udevice *dev)
 #endif
 	priv->usart = (atmel_usart3_t *)plat->base_addr;
 
-	_atmel_serial_init(priv->usart, get_usart_clk_rate(0), gd->baudrate);
+	ret = atmel_serial_enable_clk(dev);
+	if (ret)
+		return ret;
+
+	_atmel_serial_init(priv->usart, priv->usart_clk_rate, gd->baudrate);
 
 	return 0;
 }
-- 
2.11.0



More information about the U-Boot mailing list