diff -Naru src/sys/arch.orig/arm/xscale/pxa2x0_mmc.c src/sys/arch/arm/xscale/pxa2x0_mmc.c --- src/sys/arch.orig/arm/xscale/pxa2x0_mmc.c Sat Mar 7 12:52:32 2009 +++ src/sys/arch/arm/xscale/pxa2x0_mmc.c Mon Mar 16 23:48:44 2009 @@ -44,7 +44,6 @@ #include /* GPIO pins */ -#define PXAMMC_CARD_DETECT 9 /* XXX zaurus-specific */ #define PXAMMC_MMCLK 32 #define PXAMMC_MMCMD 112 #define PXAMMC_MMDAT0 92 @@ -135,8 +134,8 @@ */ s = splsdmmc(); - pxa2x0_gpio_set_function(PXAMMC_CARD_DETECT, GPIO_IN); - sc->sc_card_ih = pxa2x0_gpio_intr_establish(PXAMMC_CARD_DETECT, + pxa2x0_gpio_set_function(sc->sc_gpio_detect, GPIO_IN); + sc->sc_card_ih = pxa2x0_gpio_intr_establish(sc->sc_gpio_detect, IST_EDGE_BOTH, IPL_SDMMC, pxammc_card_intr, sc, "mmccd"); if (sc->sc_card_ih == NULL) { splx(s); @@ -255,7 +254,8 @@ int pxammc_card_detect(sdmmc_chipset_handle_t sch) { - return !pxa2x0_gpio_get_bit(PXAMMC_CARD_DETECT); + return !pxa2x0_gpio_get_bit(((struct pxammc_softc *) + sch)->sc_gpio_detect); } int diff -Naru src/sys/arch.orig/arm/xscale/pxammcvar.h src/sys/arch/arm/xscale/pxammcvar.h --- src/sys/arch.orig/arm/xscale/pxammcvar.h Sun Mar 18 21:53:10 2007 +++ src/sys/arch/arm/xscale/pxammcvar.h Mon Mar 16 23:44:40 2009 @@ -35,6 +35,7 @@ int sc_flags; /* driver state flags */ #define PMF_CARD_INITED 0x0001 /* card init sequence sent */ int sc_clkdiv; /* current clock divider */ + int sc_gpio_detect; /* card detect GPIO */ struct sdmmc_command * volatile sc_cmd; /* command in progress */ }; diff -Naru src/sys/arch.orig/palm/conf/RAMDISK src/sys/arch/palm/conf/RAMDISK --- src/sys/arch.orig/palm/conf/RAMDISK Fri Mar 13 22:28:04 2009 +++ src/sys/arch/palm/conf/RAMDISK Mon Mar 16 23:11:12 2009 @@ -49,9 +49,9 @@ pxaost0 at pxaip? addr 0x40a00000 size 0x20 # SD/MMC support -##pxammc0 at pxaip? # MMC/SD/SDIO controller -##sdmmc* at pxammc? # SD/MMC bus -##scsibus* at sdmmc? # SCSI emulation +pxammc0 at pxaip? # MMC/SD/SDIO controller +sdmmc* at pxammc? # SD/MMC bus +scsibus* at sdmmc? # SCSI emulation ##sd* at scsibus? #st* at scsibus? diff -Naru src/sys/arch.orig/palm/conf/files.palm src/sys/arch/palm/conf/files.palm --- src/sys/arch.orig/palm/conf/files.palm Mon Mar 16 22:25:10 2009 +++ src/sys/arch/palm/conf/files.palm Mon Mar 16 23:11:35 2009 @@ -28,6 +28,10 @@ attach lcd at pxaip with lcd_pxaip file arch/palm/palm/palm_lcd.c lcd_pxaip +# SD/MMC socket controller +attach pxammc at pxaip with pxammc_palm +file arch/palm/dev/palm_mmc.c pxammc_palm + # # Machine-independent ATA drivers # @@ -54,4 +58,9 @@ # Include USB stuff include "dev/usb/files.usb" + +# +# Machine-independent SD/MMC drivers +# +include "dev/sdmmc/files.sdmmc" diff -Naru src/sys/arch.orig/palm/dev/palm_mmc.c src/sys/arch/palm/dev/palm_mmc.c --- src/sys/arch.orig/palm/dev/palm_mmc.c Thu Jan 1 01:00:00 1970 +++ src/sys/arch/palm/dev/palm_mmc.c Mon Mar 16 23:47:22 2009 @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2009 + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* Attachment driver for pxammc(4) on Palm */ + +#include +#include +#include + +#include + +#include + +#include +#include +#include + +int palm_mmc_match(struct device *, void *, void *); +void palm_mmc_attach(struct device *, struct device *, void *); + +struct cfattach pxammc_palm_ca = { + sizeof(struct pxammc_softc), palm_mmc_match, + palm_mmc_attach +}; + +u_int32_t palm_mmc_get_ocr(void *); +int palm_mmc_set_power(void *, u_int32_t); + +int +palm_mmc_match(struct device *parent, void *match, void *aux) +{ + return pxammc_match(); +} + +void +palm_mmc_attach(struct device *parent, struct device *self, void *aux) +{ + struct pxammc_softc *sc = (struct pxammc_softc *)self; + + sc->tag.cookie = (void *)sc; + sc->tag.get_ocr = palm_mmc_get_ocr; + sc->tag.set_power = palm_mmc_set_power; + + sc->sc_gpio_detect = PALMT5_MMC_DETECT; + + pxa2x0_gpio_set_function(sc->sc_gpio_detect, GPIO_IN); + pxa2x0_gpio_set_function(PALMT5_MMC_POWER, GPIO_OUT); + + pxammc_attach(sc, aux); +} + +u_int32_t +palm_mmc_get_ocr(void *cookie) +{ + return MMC_OCR_3_2V_3_3V | MMC_OCR_3_3V_3_4V; +} + +int +palm_mmc_set_power(void *cookie, u_int32_t ocr) +{ + if (ISSET(ocr, MMC_OCR_3_2V_3_3V | MMC_OCR_3_3V_3_4V)) { + pxa2x0_gpio_set_bit(PALMT5_MMC_POWER); + return 0; + } else if (ocr != 0) { + printf("%s: unsupported OCR (%#x)\n", __FUNCTION__, ocr); + return EINVAL; + } else { + pxa2x0_gpio_clear_bit(PALMT5_MMC_POWER); + return 0; + } +} diff -Naru src/sys/arch.orig/palm/include/palmvar.h src/sys/arch/palm/include/palmvar.h --- src/sys/arch.orig/palm/include/palmvar.h Thu Jan 1 01:00:00 1970 +++ src/sys/arch/palm/include/palmvar.h Mon Mar 16 23:23:18 2009 @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2009 + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#define PALMT5_MMC_POWER 114 +#define PALMT5_MMC_DETECT 14