Module Name:    src
Committed By:   jmcneill
Date:           Sun May  3 16:40:12 UTC 2015

Modified Files:
        src/sys/arch/arm/nvidia: tegra_car.c tegra_carreg.h tegra_var.h

Log Message:
add pllc and uart rate funcs


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/nvidia/tegra_car.c \
    src/sys/arch/arm/nvidia/tegra_carreg.h
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/nvidia/tegra_var.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/nvidia/tegra_car.c
diff -u src/sys/arch/arm/nvidia/tegra_car.c:1.3 src/sys/arch/arm/nvidia/tegra_car.c:1.4
--- src/sys/arch/arm/nvidia/tegra_car.c:1.3	Sun May  3 11:47:15 2015
+++ src/sys/arch/arm/nvidia/tegra_car.c	Sun May  3 16:40:12 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_car.c,v 1.3 2015/05/03 11:47:15 jmcneill Exp $ */
+/* $NetBSD: tegra_car.c,v 1.4 2015/05/03 16:40:12 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #include "locators.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_car.c,v 1.3 2015/05/03 11:47:15 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_car.c,v 1.4 2015/05/03 16:40:12 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -132,6 +132,13 @@ tegra_car_pllx_rate(void)
 }
 
 u_int
+tegra_car_pllc_rate(void)
+{
+	return tegra_car_pll_rate(CAR_PLLC_BASE_REG, CAR_PLLC_BASE_DIVM,
+	    CAR_PLLC_BASE_DIVN, CAR_PLLC_BASE_DIVP);
+}
+
+u_int
 tegra_car_pllp0_rate(void)
 {
 	return tegra_car_pll_rate(CAR_PLLP_BASE_REG, CAR_PLLP_BASE_DIVM,
@@ -139,6 +146,41 @@ tegra_car_pllp0_rate(void)
 }
 
 u_int
+tegra_car_uart_rate(u_int port)
+{
+	bus_space_tag_t bst;
+	bus_space_handle_t bsh;
+	bus_size_t src_reg;
+	u_int src_rate;
+
+	tegra_car_get_bs(&bst, &bsh);
+
+	switch (port) {
+	case 0: src_reg = CAR_CLKSRC_UARTA_REG; break;
+	case 1: src_reg = CAR_CLKSRC_UARTB_REG; break;
+	case 2: src_reg = CAR_CLKSRC_UARTC_REG; break;
+	case 3: src_reg = CAR_CLKSRC_UARTD_REG; break;
+	default: return 0;
+	}
+
+	const uint32_t src = bus_space_read_4(bst, bsh, src_reg);
+	switch (__SHIFTOUT(src, CAR_CLKSRC_UART_SRC)) {
+	case 0:
+		src_rate = tegra_car_pllp0_rate();
+		break;
+	default:
+		panic("%s: unsupported src %#x", __func__, src);
+	}
+
+	if (__SHIFTOUT(src, CAR_CLKSRC_UART_DIV_ENB)) {
+		const u_int div = __SHIFTOUT(src, CAR_CLKSRC_UART_DIV) + 1;
+		return src_rate / div;
+	} else {
+		return src_rate;
+	}
+}
+
+u_int
 tegra_car_periph_sdmmc_rate(u_int port)
 {
 	bus_space_tag_t bst;
Index: src/sys/arch/arm/nvidia/tegra_carreg.h
diff -u src/sys/arch/arm/nvidia/tegra_carreg.h:1.3 src/sys/arch/arm/nvidia/tegra_carreg.h:1.4
--- src/sys/arch/arm/nvidia/tegra_carreg.h:1.3	Sun May  3 11:47:15 2015
+++ src/sys/arch/arm/nvidia/tegra_carreg.h	Sun May  3 16:40:12 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_carreg.h,v 1.3 2015/05/03 11:47:15 jmcneill Exp $ */
+/* $NetBSD: tegra_carreg.h,v 1.4 2015/05/03 16:40:12 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -45,8 +45,25 @@
 
 #define CAR_PLLP_OUTA_REG	0xa4
 #define CAR_PLLP_OUTB_REG	0xa8
+#define CAR_PLLP_OUTB_OUT4_RATIO	__BITS(31,24)
+#define CAR_PLLP_OUTB_OUT4_OVRRIDE	__BIT(18)
+#define CAR_PLLP_OUTB_OUT4_CLKEN	__BIT(17)
+#define CAR_PLLP_OUTB_OUT4_RSTN		__BIT(16)
+#define CAR_PLLP_OUTB_OUT3_RATIO	__BITS(15,8)
+#define CAR_PLLP_OUTB_OUT3_OVRRIDE	__BIT(2)
+#define CAR_PLLP_OUTB_OUT3_CLKEN	__BIT(1)
+#define CAR_PLLP_OUTB_OUT3_RSTN		__BIT(0)
 #define CAR_PLLP_MISC_REG	0xac
 
+#define CAR_PLLC_BASE_REG	0x80
+#define CAR_PLLC_BASE_ENABLE		__BIT(30)
+#define CAR_PLLC_BASE_REF_DIS		__BIT(29)
+#define CAR_PLLC_BASE_LOCK_OVERRIDE	__BIT(28)
+#define CAR_PLLC_BASE_LOCK		__BIT(27)
+#define CAR_PLLC_BASE_DIVP		__BITS(23,20)
+#define CAR_PLLC_BASE_DIVN		__BITS(15,8)
+#define CAR_PLLC_BASE_DIVM		__BITS(7,0)
+
 #define CAR_PLLX_BASE_REG	0xe0
 #define CAR_PLLX_BASE_BYPASS		__BIT(31)
 #define CAR_PLLX_BASE_ENABLE		__BIT(30)
@@ -58,6 +75,21 @@
 
 #define CAR_PLLX_MISC_REG	0xe8
 
+#define CAR_CLKSRC_UARTA_REG		0x178
+#define CAR_CLKSRC_UARTB_REG		0x17c
+#define CAR_CLKSRC_UARTC_REG		0x1a0
+#define CAR_CLKSRC_UARTD_REG		0x1c0
+
+#define CAR_CLKSRC_UART_SRC		__BITS(31,29)
+#define CAR_CLKSRC_UART_SRC_PLLP_OUT0	0
+#define CAR_CLKSRC_UART_SRC_PLLC2_OUT0	1
+#define CAR_CLKSRC_UART_SRC_PLLC_OUT0	2
+#define CAR_CLKSRC_UART_SRC_PLLC3_OUT0	3
+#define CAR_CLKSRC_UART_SRC_PLLM_OUT0	4
+#define CAR_CLKSRC_UART_SRC_CLK_M	6
+#define CAR_CLKSRC_UART_DIV_ENB		__BIT(24)
+#define CAR_CLKSRC_UART_DIV		__BITS(15,0)
+
 #define CAR_CLKSRC_SDMMC1_REG		0x150
 #define CAR_CLKSRC_SDMMC2_REG		0x154
 #define CAR_CLKSRC_SDMMC4_REG		0x164

Index: src/sys/arch/arm/nvidia/tegra_var.h
diff -u src/sys/arch/arm/nvidia/tegra_var.h:1.7 src/sys/arch/arm/nvidia/tegra_var.h:1.8
--- src/sys/arch/arm/nvidia/tegra_var.h:1.7	Sun May  3 01:07:44 2015
+++ src/sys/arch/arm/nvidia/tegra_var.h	Sun May  3 16:40:12 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_var.h,v 1.7 2015/05/03 01:07:44 jmcneill Exp $ */
+/* $NetBSD: tegra_var.h,v 1.8 2015/05/03 16:40:12 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -74,8 +74,10 @@ void	tegra_bootstrap(void);
 void	tegra_dma_bootstrap(psize_t);
 
 u_int	tegra_car_osc_rate(void);
+u_int	tegra_car_pllc_rate(void);
 u_int	tegra_car_pllx_rate(void);
 u_int	tegra_car_pllp0_rate(void);
+u_int	tegra_car_uart_rate(u_int);
 u_int	tegra_car_periph_sdmmc_rate(u_int);
 int	tegra_car_periph_sdmmc_set_div(u_int, u_int);
 

Reply via email to