ARM: tegra: move uart debug port initialization into common file.
Laxman Dewangan [Thu, 11 Oct 2012 13:44:10 +0000 (18:44 +0530)]
There is lots of duplicate code for initializing
the debug port for all platform.
Move this to board-common file so that duplicate code
can be avoided.

Change-Id: I3e8a10cd3db4db21d6752a0b689136bfe9828197
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/143721
Reviewed-by: Mrutyunjay Sawant <msawant@nvidia.com>
Tested-by: Mrutyunjay Sawant <msawant@nvidia.com>

Rebase-Id: R0ee5cb4caae5d563a0a9df9a1d69b1846b974ebd

arch/arm/mach-tegra/Makefile
arch/arm/mach-tegra/board-common.c [new file with mode: 0644]
arch/arm/mach-tegra/board-common.h [new file with mode: 0644]

index 95da163..7005e9c 100644 (file)
@@ -121,6 +121,8 @@ obj-$(CONFIG_ARCH_TEGRA_2x_SOC)             += board-harmony-pcie.o
 
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += board-paz00.o
 
+obj-y                                  += board-common.o
+
 obj-${CONFIG_MACH_CURACAO}              += board-curacao.o
 obj-${CONFIG_MACH_CURACAO}              += board-curacao-panel.o
 obj-${CONFIG_MACH_CURACAO}              += board-curacao-pinmux.o
diff --git a/arch/arm/mach-tegra/board-common.c b/arch/arm/mach-tegra/board-common.c
new file mode 100644 (file)
index 0000000..54c4f61
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * board-common.c: Implement function which is common across
+ * different boards.
+ *
+ * Copyright (c) 2011-2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <linux/clk.h>
+#include <linux/serial_8250.h>
+
+#include <mach/clk.h>
+
+#include "board.h"
+#include "board-common.h"
+#include "devices.h"
+#include "clock.h"
+
+extern unsigned long  debug_uart_port_base;
+extern struct clk *debug_uart_clk;
+
+struct platform_device *uart_console_debug_device = NULL;
+
+int uart_console_debug_init(int default_debug_port)
+{
+       int debug_port_id;
+
+       debug_port_id = get_tegra_uart_debug_port_id();
+       if (debug_port_id < 0)
+               debug_port_id = default_debug_port;
+
+       if (debug_port_id < 0) {
+               pr_warn("No debug console channel\n");
+               return -EINVAL;
+       }
+
+       switch (debug_port_id) {
+       case 0:
+               /* UARTA is the debug port. */
+               pr_info("Selecting UARTA as the debug console\n");
+               debug_uart_clk = clk_get_sys("serial8250.0", "uarta");
+               debug_uart_port_base = ((struct plat_serial8250_port *)(
+                       debug_uarta_device.dev.platform_data))->mapbase;
+               uart_console_debug_device = &debug_uarta_device;
+               break;
+
+       case 1:
+               /* UARTB is the debug port. */
+               pr_info("Selecting UARTB as the debug console\n");
+               debug_uart_clk =  clk_get_sys("serial8250.0", "uartb");
+               debug_uart_port_base = ((struct plat_serial8250_port *)(
+                       debug_uartb_device.dev.platform_data))->mapbase;
+               uart_console_debug_device = &debug_uartb_device;
+               break;
+
+       case 2:
+               /* UARTC is the debug port. */
+               pr_info("Selecting UARTC as the debug console\n");
+               debug_uart_clk =  clk_get_sys("serial8250.0", "uartc");
+               debug_uart_port_base = ((struct plat_serial8250_port *)(
+                       debug_uartc_device.dev.platform_data))->mapbase;
+               uart_console_debug_device = &debug_uartc_device;
+               break;
+
+       case 3:
+               /* UARTD is the debug port. */
+               pr_info("Selecting UARTD as the debug console\n");
+               debug_uart_clk =  clk_get_sys("serial8250.0", "uartd");
+               debug_uart_port_base = ((struct plat_serial8250_port *)(
+                       debug_uartd_device.dev.platform_data))->mapbase;
+               uart_console_debug_device = &debug_uartd_device;
+               break;
+
+#if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
+       case 4:
+               /* UARTE is the debug port. */
+               pr_info("Selecting UARTE as the debug console\n");
+               debug_uart_clk =  clk_get_sys("serial8250.0", "uarte");
+               debug_uart_port_base = ((struct plat_serial8250_port *)(
+                       debug_uarte_device.dev.platform_data))->mapbase;
+               uart_console_debug_device = &debug_uarte_device;
+               break;
+#endif
+
+       default:
+               pr_info("The debug console id %d is invalid, Assuming UARTA", debug_port_id);
+               debug_uart_clk = clk_get_sys("serial8250.0", "uarta");
+               debug_uart_port_base = ((struct plat_serial8250_port *)(
+                       debug_uarta_device.dev.platform_data))->mapbase;
+               uart_console_debug_device = &debug_uarta_device;
+               break;
+       }
+
+       if (!IS_ERR_OR_NULL(debug_uart_clk)) {
+               struct clk *c;
+               pr_info("The debug console clock name is %s\n",
+                                               debug_uart_clk->name);
+               c = tegra_get_clock_by_name("pll_p");
+               if (IS_ERR_OR_NULL(c))
+                       pr_err("Not getting the parent clock pll_p\n");
+               else
+                       clk_set_parent(debug_uart_clk, c);
+
+               clk_enable(debug_uart_clk);
+               clk_set_rate(debug_uart_clk, clk_get_rate(c));
+       } else {
+               pr_err("Not getting the clock for debug consolei %d\n",
+                       debug_port_id);
+       }
+       return debug_port_id;
+}
diff --git a/arch/arm/mach-tegra/board-common.h b/arch/arm/mach-tegra/board-common.h
new file mode 100644 (file)
index 0000000..fdacefd
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * board-common.h: Common function API declaration for all board files.
+ *
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __MACH_TEGRA_BOARD_COMMON_H
+#define __MACH_TEGRA_BOARD_COMMON_H
+
+extern struct platform_device *uart_console_debug_device;
+int  uart_console_debug_init(int defaul_debug_port);
+
+#endif