Module Name:    src
Committed By:   jmcneill
Date:           Wed May 20 00:05:53 UTC 2015

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

Log Message:
wait for PLLD2 lock


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/arm/nvidia/tegra_car.c

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.18 src/sys/arch/arm/nvidia/tegra_car.c:1.19
--- src/sys/arch/arm/nvidia/tegra_car.c:1.18	Mon May 18 21:32:05 2015
+++ src/sys/arch/arm/nvidia/tegra_car.c	Wed May 20 00:05:53 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_car.c,v 1.18 2015/05/18 21:32:05 jmcneill Exp $ */
+/* $NetBSD: tegra_car.c,v 1.19 2015/05/20 00:05:53 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.18 2015/05/18 21:32:05 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_car.c,v 1.19 2015/05/20 00:05:53 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -609,6 +609,8 @@ tegra_car_hdmi_enable(u_int rate)
 {
 	bus_space_tag_t bst;
 	bus_space_handle_t bsh;
+	uint32_t base;
+	int retry = 10000;
 
 	tegra_car_get_bs(&bst, &bsh);
 
@@ -620,12 +622,25 @@ tegra_car_hdmi_enable(u_int rate)
 	tegra_reg_set_clear(bst, bsh, CAR_PLLD2_BASE_REG,
 	    0, CAR_PLLD2_BASE_IDDQ);
 	delay(2);
+	/* Enable lock */
+	tegra_reg_set_clear(bst, bsh, CAR_PLLD2_MISC_REG,
+	    CAR_PLLD2_MISC_LOCK_ENABLE, 0);
 	/* Enable PLLD2 */
 	tegra_reg_set_clear(bst, bsh, CAR_PLLD2_BASE_REG,
 	    CAR_PLLD2_BASE_ENABLE, 0);
 
+	/* Wait for lock */
+	do {
+		delay(2);
+		base = bus_space_read_4(bst, bsh, CAR_PLLD2_BASE_REG);
+	} while ((base & CAR_PLLD2_BASE_LOCK) == 0 && --retry > 0);
+	delay(100);
+	if (retry == 0) {
+		printf("WARNING: timeout waiting for PLLD2 lock\n");
+	}
+
 	/* Set clock source to PLLD2 */
-	const u_int div = howmany(tegra_car_plld2_rate(), rate);;
+	const u_int div = howmany(tegra_car_plld2_rate(), rate);
 	bus_space_write_4(bst, bsh, CAR_CLKSRC_HDMI_REG,
 	    __SHIFTIN(CAR_CLKSRC_HDMI_SRC_PLLD2_OUT0, CAR_CLKSRC_HDMI_SRC) |
 	    __SHIFTIN(div - 1, CAR_CLKSRC_HDMI_DIV));

Reply via email to