Module Name: src Committed By: riastradh Date: Tue Dec 11 19:26:40 UTC 2012
Modified Files: src/sys/arch/arm/omap: omap3_sdhc.c Log Message: Initial kludgerific attempt at making sdhc work on the AM335x. There's a timing issue somewhere in the whole sdmmc thing so that this doesn't actually work without SDMMC_DEBUG or some specially crafted debugging messages, and the SoC-specific code needs to be separated out here another way, but it's a little progress. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/omap/omap3_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/omap/omap3_sdhc.c diff -u src/sys/arch/arm/omap/omap3_sdhc.c:1.3 src/sys/arch/arm/omap/omap3_sdhc.c:1.4 --- src/sys/arch/arm/omap/omap3_sdhc.c:1.3 Tue Dec 11 01:54:42 2012 +++ src/sys/arch/arm/omap/omap3_sdhc.c Tue Dec 11 19:26:40 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: omap3_sdhc.c,v 1.3 2012/12/11 01:54:42 khorben Exp $ */ +/* $NetBSD: omap3_sdhc.c,v 1.4 2012/12/11 19:26:40 riastradh 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.3 2012/12/11 01:54:42 khorben Exp $"); +__KERNEL_RCSID(0, "$NetBSD: omap3_sdhc.c,v 1.4 2012/12/11 19:26:40 riastradh Exp $"); #include "opt_omap.h" @@ -45,6 +45,11 @@ __KERNEL_RCSID(0, "$NetBSD: omap3_sdhc.c #include <arm/omap/omap2_obiovar.h> #include <arm/omap/omap3_sdmmcreg.h> +#ifdef TI_AM335X +# include <arm/omap/am335x_prcm.h> +# include <arm/omap/omap2_prcm.h> +#endif + #include <dev/sdmmc/sdhcreg.h> #include <dev/sdmmc/sdhcvar.h> @@ -72,6 +77,22 @@ struct obiosdhc_softc { void *sc_ih; /* interrupt vectoring */ }; +#ifdef TI_AM335X +struct am335x_sdhc { + const char *as_name; + bus_addr_t as_base_addr; + int as_intr; + struct omap_module as_module; +}; + +static const struct am335x_sdhc am335x_sdhc[] = { + /* XXX All offset by 0x100 because of the am335x's mmc registers. */ + { "MMCHS0", 0x48060100, 64, { AM335X_PRCM_CM_PER, 0x3c } }, + { "MMC1", 0x481d8100, 28, { AM335X_PRCM_CM_PER, 0xf4 } }, + { "MMCHS2", 0x47810100, 29, { AM335X_PRCM_CM_WKUP, 0xf8 } }, +}; +#endif + CFATTACH_DECL_NEW(obiosdhc, sizeof(struct obiosdhc_softc), obiosdhc_match, obiosdhc_attach, obiosdhc_detach, NULL); @@ -81,6 +102,10 @@ obiosdhc_match(device_t parent, cfdata_t #if defined(OMAP_3430) || defined(OMAP_3530) struct obio_attach_args * const oa = aux; #endif +#ifdef TI_AM335X + struct obio_attach_args * const oa = aux; + size_t i; +#endif #if defined(OMAP_3430) if (oa->obio_addr == SDMMC1_BASE_3430 @@ -94,6 +119,13 @@ obiosdhc_match(device_t parent, cfdata_t return 1; #endif +#ifdef TI_AM335X + for (i = 0; i < __arraycount(am335x_sdhc); i++) + if ((oa->obio_addr == am335x_sdhc[i].as_base_addr) && + (oa->obio_intr == am335x_sdhc[i].as_intr)) + return 1; +#endif + return 0; } @@ -104,6 +136,9 @@ obiosdhc_attach(device_t parent, device_ struct obio_attach_args * const oa = aux; uint32_t clkd, stat; int error, timo, clksft, n; +#ifdef TI_AM335X + size_t i; +#endif sc->sc.sc_dmat = oa->obio_dmat; sc->sc.sc_dev = self; @@ -136,6 +171,17 @@ obiosdhc_attach(device_t parent, device_ aprint_naive(": SDHC controller\n"); aprint_normal(": SDHC controller\n"); +#ifdef TI_AM335X + /* XXX Not really AM335X-specific. */ + for (i = 0; i < __arraycount(am335x_sdhc); i++) + if ((oa->obio_addr == am335x_sdhc[i].as_base_addr) && + (oa->obio_intr == am335x_sdhc[i].as_intr)) { + prcm_module_enable(&am335x_sdhc[i].as_module); + break; + } + KASSERT(i < __arraycount(am335x_sdhc)); +#endif + /* XXXXXX: Turn-on regurator via I2C. */ /* XXXXXX: And enable ICLOCK/FCLOCK. */