Module Name:    src
Committed By:   jmcneill
Date:           Thu Jul 23 18:22:05 UTC 2015

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

Log Message:
Support fractional dividers. This lets us use 48MHz for SDMMC HS mode
instead of 45.333MHz.


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/arm/nvidia/tegra_car.c \
    src/sys/arch/arm/nvidia/tegra_var.h
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/nvidia/tegra_sdhc.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.22 src/sys/arch/arm/nvidia/tegra_car.c:1.23
--- src/sys/arch/arm/nvidia/tegra_car.c:1.22	Thu Jul 23 14:30:06 2015
+++ src/sys/arch/arm/nvidia/tegra_car.c	Thu Jul 23 18:22:05 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_car.c,v 1.22 2015/07/23 14:30:06 jmcneill Exp $ */
+/* $NetBSD: tegra_car.c,v 1.23 2015/07/23 18:22:05 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.22 2015/07/23 14:30:06 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_car.c,v 1.23 2015/07/23 18:22:05 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -374,13 +374,13 @@ tegra_car_periph_sdmmc_rate(u_int port)
 
 	const uint32_t src = bus_space_read_4(bst, bsh, src_reg);
 
-	const u_int div = (__SHIFTOUT(src, CAR_CLKSRC_SDMMC_DIV) / 2) + 1;
+	const u_int div = __SHIFTOUT(src, CAR_CLKSRC_SDMMC_DIV) + 2;
 
-	return tegra_car_pllp0_rate() / div;
+	return (tegra_car_pllp0_rate() * 2) / div;
 }
 
 int
-tegra_car_periph_sdmmc_set_div(u_int port, u_int div)
+tegra_car_periph_sdmmc_set_rate(u_int port, u_int rate)
 {
 	bus_space_tag_t bst;
 	bus_space_handle_t bsh;
@@ -388,7 +388,7 @@ tegra_car_periph_sdmmc_set_div(u_int por
 	u_int dev_bit;
 	uint32_t src;
 
-	KASSERT(div > 0);
+	KASSERT(rate > 0);
 
 	tegra_car_get_bs(&bst, &bsh);
 
@@ -425,10 +425,12 @@ tegra_car_periph_sdmmc_set_div(u_int por
 	/* enable clk */
 	bus_space_write_4(bst, bsh, enb_reg, dev_bit);
 
+	const u_int div = howmany(tegra_car_pllp0_rate() * 2, rate) - 2;
+
 	/* update clk div */
 	src = __SHIFTIN(CAR_CLKSRC_SDMMC_SRC_PLLP_OUT0,
 			CAR_CLKSRC_SDMMC_SRC);
-	src |= __SHIFTIN((div - 1) * 2, CAR_CLKSRC_SDMMC_DIV);
+	src |= __SHIFTIN(div, CAR_CLKSRC_SDMMC_DIV);
 	bus_space_write_4(bst, bsh, src_reg, src);
 
 	/* leave reset */
Index: src/sys/arch/arm/nvidia/tegra_var.h
diff -u src/sys/arch/arm/nvidia/tegra_var.h:1.22 src/sys/arch/arm/nvidia/tegra_var.h:1.23
--- src/sys/arch/arm/nvidia/tegra_var.h:1.22	Wed Jul  8 01:23:28 2015
+++ src/sys/arch/arm/nvidia/tegra_var.h	Thu Jul 23 18:22:05 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_var.h,v 1.22 2015/07/08 01:23:28 jmcneill Exp $ */
+/* $NetBSD: tegra_var.h,v 1.23 2015/07/23 18:22:05 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -96,7 +96,7 @@ u_int	tegra_car_pllp0_rate(void);
 u_int	tegra_car_plld2_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);
+int	tegra_car_periph_sdmmc_set_rate(u_int, u_int);
 int	tegra_car_periph_usb_enable(u_int);
 void	tegra_car_periph_hda_enable(void);
 void	tegra_car_periph_sata_enable(void);

Index: src/sys/arch/arm/nvidia/tegra_sdhc.c
diff -u src/sys/arch/arm/nvidia/tegra_sdhc.c:1.6 src/sys/arch/arm/nvidia/tegra_sdhc.c:1.7
--- src/sys/arch/arm/nvidia/tegra_sdhc.c:1.6	Sat May 30 18:53:39 2015
+++ src/sys/arch/arm/nvidia/tegra_sdhc.c	Thu Jul 23 18:22:05 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_sdhc.c,v 1.6 2015/05/30 18:53:39 jmcneill Exp $ */
+/* $NetBSD: tegra_sdhc.c,v 1.7 2015/07/23 18:22:05 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_sdhc.c,v 1.6 2015/05/30 18:53:39 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_sdhc.c,v 1.7 2015/07/23 18:22:05 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -122,12 +122,7 @@ tegra_sdhc_attach(device_t parent, devic
 	if (sc->sc_pin_wp)
 		sc->sc.sc_vendor_write_protect = tegra_sdhc_write_protect;
 
-#if notyet
-	tegra_car_periph_sdmmc_set_div(sc->sc_port, 1);
-#else
-	const u_int div = howmany(tegra_car_pllp0_rate() / 1000, 50000);
-	tegra_car_periph_sdmmc_set_div(sc->sc_port, div);
-#endif
+	tegra_car_periph_sdmmc_set_rate(sc->sc_port, 50000000);
 	sc->sc.sc_clkbase = tegra_car_periph_sdmmc_rate(sc->sc_port) / 1000;
 
 	aprint_naive("\n");

Reply via email to