Module Name:    src
Committed By:   jmcneill
Date:           Sat May  2 17:07:55 UTC 2015

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

Log Message:
hook up power, card detect, write protect gpios


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 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_sdhc.c
diff -u src/sys/arch/arm/nvidia/tegra_sdhc.c:1.2 src/sys/arch/arm/nvidia/tegra_sdhc.c:1.3
--- src/sys/arch/arm/nvidia/tegra_sdhc.c:1.2	Sat May  2 14:10:03 2015
+++ src/sys/arch/arm/nvidia/tegra_sdhc.c	Sat May  2 17:07:55 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_sdhc.c,v 1.2 2015/05/02 14:10:03 jmcneill Exp $ */
+/* $NetBSD: tegra_sdhc.c,v 1.3 2015/05/02 17:07:55 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.2 2015/05/02 14:10:03 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_sdhc.c,v 1.3 2015/05/02 17:07:55 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -50,6 +50,9 @@ __KERNEL_RCSID(0, "$NetBSD: tegra_sdhc.c
 static int	tegra_sdhc_match(device_t, cfdata_t, void *);
 static void	tegra_sdhc_attach(device_t, device_t, void *);
 
+static int	tegra_sdhc_card_detect(struct sdhc_softc *);
+static int	tegra_sdhc_write_protect(struct sdhc_softc *);
+
 struct tegra_sdhc_softc {
 	struct sdhc_softc	sc;
 
@@ -60,6 +63,10 @@ struct tegra_sdhc_softc {
 	bus_size_t		sc_bsz;
 	struct sdhc_host	*sc_host;
 	void			*sc_ih;
+
+	struct tegra_gpio_pin	*sc_pin_cd;
+	struct tegra_gpio_pin	*sc_pin_power;
+	struct tegra_gpio_pin	*sc_pin_wp;
 };
 
 CFATTACH_DECL_NEW(tegra_sdhc, sizeof(struct tegra_sdhc_softc),
@@ -77,6 +84,8 @@ tegra_sdhc_attach(device_t parent, devic
 	struct tegra_sdhc_softc * const sc = device_private(self);
 	struct tegraio_attach_args * const tio = aux;
 	const struct tegra_locators * const loc = &tio->tio_loc;
+	prop_dictionary_t prop = device_properties(self);
+	const char *pin;
 	int error;
 
 	sc->sc.sc_dev = self;
@@ -97,6 +106,22 @@ tegra_sdhc_attach(device_t parent, devic
 	sc->sc_bsz = loc->loc_size;
 	sc->sc_port = loc->loc_port;
 
+	if (prop_dictionary_get_cstring_nocopy(prop, "power-gpio", &pin)) {
+		sc->sc_pin_power = tegra_gpio_acquire(pin, GPIO_PIN_OUTPUT);
+		if (sc->sc_pin_power)
+			tegra_gpio_write(sc->sc_pin_power, 1);
+	}
+
+	if (prop_dictionary_get_cstring_nocopy(prop, "cd-gpio", &pin))
+		sc->sc_pin_cd = tegra_gpio_acquire(pin, GPIO_PIN_INPUT);
+	if (prop_dictionary_get_cstring_nocopy(prop, "wp-gpio", &pin))
+		sc->sc_pin_wp = tegra_gpio_acquire(pin, GPIO_PIN_INPUT);
+
+	if (sc->sc_pin_cd)
+		sc->sc.sc_vendor_card_detect = tegra_sdhc_card_detect;
+	if (sc->sc_pin_wp)
+		sc->sc.sc_vendor_write_protect = tegra_sdhc_write_protect;
+
 	/*
 	 * The controller supports SDR104 speeds (208 MHz). With PLLP (408 Mhz)
 	 * as input and div=2 we can get a reasonable 204 MHz for the SDHC.
@@ -131,3 +156,23 @@ tegra_sdhc_attach(device_t parent, devic
 		return;
 	}
 }
+
+static int
+tegra_sdhc_card_detect(struct sdhc_softc *ssc)
+{
+	struct tegra_sdhc_softc *sc = device_private(ssc->sc_dev);
+
+	KASSERT(sc->sc_pin_cd != NULL);
+
+	return !tegra_gpio_read(sc->sc_pin_cd);
+}
+
+static int
+tegra_sdhc_write_protect(struct sdhc_softc *ssc)
+{
+	struct tegra_sdhc_softc *sc = device_private(ssc->sc_dev);
+
+	KASSERT(sc->sc_pin_wp != NULL);
+
+	return tegra_gpio_read(sc->sc_pin_wp);
+}

Reply via email to