Module Name: src Committed By: matt Date: Wed Dec 12 15:19:53 UTC 2012
Modified Files: src/sys/arch/arm/omap: omap3_sdhc.c omap3_sdmmcreg.h Log Message: Improved SDHC support for OMAP3. >From jmcneill. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/omap/omap3_sdhc.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/omap/omap3_sdmmcreg.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/omap/omap3_sdhc.c diff -u src/sys/arch/arm/omap/omap3_sdhc.c:1.4 src/sys/arch/arm/omap/omap3_sdhc.c:1.5 --- src/sys/arch/arm/omap/omap3_sdhc.c:1.4 Tue Dec 11 19:26:40 2012 +++ src/sys/arch/arm/omap/omap3_sdhc.c Wed Dec 12 15:19:53 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: omap3_sdhc.c,v 1.4 2012/12/11 19:26:40 riastradh Exp $ */ +/* $NetBSD: omap3_sdhc.c,v 1.5 2012/12/12 15:19:53 matt Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: omap3_sdhc.c,v 1.4 2012/12/11 19:26:40 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: omap3_sdhc.c,v 1.5 2012/12/12 15:19:53 matt Exp $"); #include "opt_omap.h" @@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: omap3_sdhc.c #include <sys/bus.h> #include <arm/omap/omap2_obiovar.h> +#include <arm/omap/omap2_reg.h> #include <arm/omap/omap3_sdmmcreg.h> #ifdef TI_AM335X @@ -64,6 +65,7 @@ static int obiosdhc_match(device_t, cfda static void obiosdhc_attach(device_t, device_t, void *); static int obiosdhc_detach(device_t, int); +static int obiosdhc_bus_clock(struct sdhc_softc *, int); static int obiosdhc_rod(struct sdhc_softc *, int); static int obiosdhc_write_protect(struct sdhc_softc *); static int obiosdhc_card_detect(struct sdhc_softc *); @@ -134,6 +136,7 @@ obiosdhc_attach(device_t parent, device_ { struct obiosdhc_softc * const sc = device_private(self); struct obio_attach_args * const oa = aux; + prop_dictionary_t prop = device_properties(self); uint32_t clkd, stat; int error, timo, clksft, n; #ifdef TI_AM335X @@ -149,10 +152,12 @@ obiosdhc_attach(device_t parent, device_ sc->sc.sc_flags |= SDHC_FLAG_SINGLE_ONLY; sc->sc.sc_host = sc->sc_hosts; sc->sc.sc_clkbase = 96000; /* 96MHZ */ - sc->sc.sc_clkmsk = 0x0000ffc0; + if (!prop_dictionary_get_uint32(prop, "clkmask", &sc->sc.sc_clkmsk)) + sc->sc.sc_clkmsk = 0x0000ffc0; sc->sc.sc_vendor_rod = obiosdhc_rod; sc->sc.sc_vendor_write_protect = obiosdhc_write_protect; sc->sc.sc_vendor_card_detect = obiosdhc_card_detect; + sc->sc.sc_vendor_bus_clock = obiosdhc_bus_clock; sc->sc_bst = oa->obio_iot; clksft = ffs(sc->sc.sc_clkmsk) - 1; @@ -198,7 +203,8 @@ obiosdhc_attach(device_t parent, device_ if (timo == 0) aprint_error_dev(self, "Soft reset timeout\n"); bus_space_write_4(sc->sc_bst, sc->sc_bsh, MMCHS_SYSCONFIG, - SYSCONFIG_ENAWAKEUP | SYSCONFIG_AUTOIDLE); + SYSCONFIG_ENAWAKEUP | SYSCONFIG_AUTOIDLE | SYSCONFIG_SIDLEMODE_AUTO | + SYSCONFIG_CLOCKACTIVITY_FCLK | SYSCONFIG_CLOCKACTIVITY_ICLK); sc->sc_ih = intr_establish(oa->obio_intr, IPL_VM, IST_LEVEL, sdhc_intr, &sc->sc); @@ -340,3 +346,20 @@ obiosdhc_card_detect(struct sdhc_softc * /* Maybe board dependent, using GPIO. Get GPIO-pin from prop? */ return 1; /* XXXXXXXX */ } + +static int +obiosdhc_bus_clock(struct sdhc_softc *sc, int clk) +{ + struct obiosdhc_softc *osc = (struct obiosdhc_softc *)sc; + uint32_t ctl; + + ctl = bus_space_read_4(osc->sc_bst, osc->sc_bsh, MMCHS_SYSCTL); + if (clk == 0) { + clk &= ~SYSCTL_CEN; + } else { + clk |= SYSCTL_CEN; + } + bus_space_write_4(osc->sc_bst, osc->sc_bsh, MMCHS_SYSCTL, ctl); + + return 0; +} Index: src/sys/arch/arm/omap/omap3_sdmmcreg.h diff -u src/sys/arch/arm/omap/omap3_sdmmcreg.h:1.3 src/sys/arch/arm/omap/omap3_sdmmcreg.h:1.4 --- src/sys/arch/arm/omap/omap3_sdmmcreg.h:1.3 Tue Dec 11 01:54:43 2012 +++ src/sys/arch/arm/omap/omap3_sdmmcreg.h Wed Dec 12 15:19:53 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: omap3_sdmmcreg.h,v 1.3 2012/12/11 01:54:43 khorben Exp $ */ +/* $NetBSD: omap3_sdmmcreg.h,v 1.4 2012/12/12 15:19:53 matt Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -46,6 +46,8 @@ # define SYSCONFIG_CLOCKACTIVITY_MASK (3 << 8) # define SYSCONFIG_CLOCKACTIVITY_FCLK (2 << 8) # define SYSCONFIG_CLOCKACTIVITY_ICLK (1 << 8) +# define SYSCONFIG_SIDLEMODE_MASK (3 << 3) +# define SYSCONFIG_SIDLEMODE_AUTO (2 << 3) # define SYSCONFIG_ENAWAKEUP (1 << 2) # define SYSCONFIG_SOFTRESET (1 << 1) # define SYSCONFIG_AUTOIDLE (1 << 0) @@ -74,5 +76,7 @@ # define CON_INIT (1 << 1) /* Send init stream */ # define CON_OD (1 << 0) /* Card open drain */ #define MMCHS_PWCNT 0x030 /* Power counter */ +#define MMCHS_SYSCTL 0x12c /* SD system control register */ +# define SYSCTL_CEN (1 << 2) /* Clock enable */ #endif