Date: Fri, 4 Apr 2014 00:59:40 +0000 (UTC) From: Ian Lepore <ian@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r264096 - in head/sys: arm/ti boot/fdt/dts/arm Message-ID: <201404040059.s340xeYk090436@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ian Date: Fri Apr 4 00:59:40 2014 New Revision: 264096 URL: http://svnweb.freebsd.org/changeset/base/264096 Log: Various fixes to the ti_sdhci driver, mostly to make it work on Pandaboard. - Don't allow high-speed mode on OMAP4 due to hardware erratum. - Check the proper bit in the status register when waiting for the controller to come out of reset. - Add handling for the "non-removable" fdt property by always returning "card is present" status. - Add the non-removable property for the MMC card on a Beaglebone Black. - Add the non-removable property for Pandaboard as a workaround. For Pandaboard the card detect pin is handled by the twl6030 fpga device which gets an interrupt on pin change and then has to query the fpga for the actual status. We don't have code to do that yet. Submitted by: Svatopluk Kraus <onwahe@gmail.com> Modified: head/sys/arm/ti/ti_sdhci.c head/sys/boot/fdt/dts/arm/beaglebone-black.dts head/sys/boot/fdt/dts/arm/pandaboard.dts Modified: head/sys/arm/ti/ti_sdhci.c ============================================================================== --- head/sys/arm/ti/ti_sdhci.c Fri Apr 4 00:16:46 2014 (r264095) +++ head/sys/arm/ti/ti_sdhci.c Fri Apr 4 00:59:40 2014 (r264096) @@ -72,6 +72,8 @@ struct ti_sdhci_softc { uint32_t wp_gpio_pin; uint32_t cmd_and_mode; uint32_t sdhci_clkdiv; + boolean_t disable_highspeed; + boolean_t force_card_present; }; /* @@ -105,6 +107,7 @@ static struct ofw_compat_data compat_dat #define MMCHS_SYSCONFIG 0x010 #define MMCHS_SYSCONFIG_RESET (1 << 1) #define MMCHS_SYSSTATUS 0x014 +#define MMCHS_SYSSTATUS_RESETDONE (1 << 0) #define MMCHS_CON 0x02C #define MMCHS_CON_DW8 (1 << 5) #define MMCHS_CON_DVAL_8_4MS (3 << 9) @@ -193,8 +196,24 @@ static uint32_t ti_sdhci_read_4(device_t dev, struct sdhci_slot *slot, bus_size_t off) { struct ti_sdhci_softc *sc = device_get_softc(dev); + uint32_t val32; + + val32 = RD4(sc, off); + + /* + * If we need to disallow highspeed mode due to the OMAP4 erratum, strip + * that flag from the returned capabilities. + */ + if (off == SDHCI_CAPABILITIES && sc->disable_highspeed) + val32 &= ~SDHCI_CAN_DO_HISPD; + + /* + * Force the card-present state if necessary. + */ + if (off == SDHCI_PRESENT_STATE && sc->force_card_present) + val32 |= SDHCI_CARD_PRESENT; - return (RD4(sc, off)); + return (val32); } static void @@ -358,7 +377,7 @@ ti_sdhci_hw_init(device_t dev) /* Issue a softreset to the controller */ ti_mmchs_write_4(sc, MMCHS_SYSCONFIG, MMCHS_SYSCONFIG_RESET); timeout = 1000; - while ((ti_mmchs_read_4(sc, MMCHS_SYSSTATUS) & MMCHS_SYSCONFIG_RESET)) { + while (!(ti_mmchs_read_4(sc, MMCHS_SYSSTATUS) & MMCHS_SYSSTATUS_RESETDONE)) { if (--timeout == 0) { device_printf(dev, "Error: Controller reset operation timed out\n"); break; @@ -458,12 +477,14 @@ ti_sdhci_attach(device_t dev) /* * Set the offset from the device's memory start to the MMCHS registers. + * Also for OMAP4 disable high speed mode due to erratum ID i626. */ if (ti_chip() == CHIP_OMAP_3) sc->mmchs_reg_off = OMAP3_MMCHS_REG_OFFSET; - else if (ti_chip() == CHIP_OMAP_4) + else if (ti_chip() == CHIP_OMAP_4) { sc->mmchs_reg_off = OMAP4_MMCHS_REG_OFFSET; - else if (ti_chip() == CHIP_AM335X) + sc->disable_highspeed = true; + } else if (ti_chip() == CHIP_AM335X) sc->mmchs_reg_off = AM335X_MMCHS_REG_OFFSET; else panic("Unknown OMAP device\n"); @@ -560,6 +581,14 @@ ti_sdhci_attach(device_t dev) } } + /* + * If the slot is flagged with the non-removable property, set our flag + * to always force the SDHCI_CARD_PRESENT bit on. + */ + node = ofw_bus_get_node(dev); + if (OF_hasprop(node, "non-removable")) + sc->force_card_present = true; + bus_generic_probe(dev); bus_generic_attach(dev); Modified: head/sys/boot/fdt/dts/arm/beaglebone-black.dts ============================================================================== --- head/sys/boot/fdt/dts/arm/beaglebone-black.dts Fri Apr 4 00:16:46 2014 (r264095) +++ head/sys/boot/fdt/dts/arm/beaglebone-black.dts Fri Apr 4 00:59:40 2014 (r264096) @@ -142,6 +142,7 @@ mmchs1@481D8000 { bus-width = <8>; status = "okay"; + non-removable; }; Modified: head/sys/boot/fdt/dts/arm/pandaboard.dts ============================================================================== --- head/sys/boot/fdt/dts/arm/pandaboard.dts Fri Apr 4 00:16:46 2014 (r264095) +++ head/sys/boot/fdt/dts/arm/pandaboard.dts Fri Apr 4 00:59:40 2014 (r264096) @@ -174,6 +174,7 @@ interrupts = <115>; interrupt-parent = <&GIC>; mmchs-device-id = <1>; + non-removable; /* XXX need real solution */ }; };
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201404040059.s340xeYk090436>