Hi Christian, On Wed, May 29 2013, Christian Daudt wrote: > + /* if device is eMMC, emulate card insert right here */ > + if (kona_dev->non_removable) { > + ret = sdhci_bcm_kona_sd_card_emulate(host, 1); > + if (ret) { > + dev_err(dev, > + "unable to emulate card insertion\n"); > + goto err_remove_host; > + } > + } else if (gpio_is_valid(kona_dev->cd_gpio)) { > + ret = devm_gpio_request(dev, kona_dev->cd_gpio, "sdio cd"); > + if (ret < 0) { > + dev_err(mmc_dev(host->mmc), > + "Unable to request GPIO pin %d\n", > + kona_dev->cd_gpio); > + goto err_remove_host; > + } > + > + gpio_direction_input(kona_dev->cd_gpio); > + > + /* Set debounce for SD Card detect to maximum value (128ms) > + * > + * NOTE-1: If gpio_set_debounce() returns error we still > + * continue with the default debounce value set. Another reason > + * for doing this is that on rhea-ray boards the SD Detect GPIO > + * is on GPIO Expander and gpio_set_debounce() will return error > + * and if we return error from here, then probe() would fail and > + * SD detection would always fail. > + * > + * NOTE-2: We also give a msleep() of the "debounce" time here > + * so that we give enough time for the debounce to stabilize > + * before we read the gpio value in gpio_get_value_cansleep(). > + */ > + ret = gpio_set_debounce(kona_dev->cd_gpio, > + (SD_DETECT_GPIO_DEBOUNCE_128MS * 1000)); > + if (ret < 0) { > + dev_err(mmc_dev(host->mmc), > + "%s: gpio set debounce failed." > + "default debounce value assumed\n", __func__); > + } > + > + /* Sleep for 128ms to allow debounce to stabilize */ > + msleep(SD_DETECT_GPIO_DEBOUNCE_128MS); > + /* request irq for cd_gpio after the gpio debounce is > + * stabilized, otherwise, some bogus gpio interrupts might be > + * triggered. > + */ > + irq = gpio_to_irq(kona_dev->cd_gpio); > + ret = devm_request_threaded_irq(dev, > + irq, > + NULL, > + sdhci_bcm_kona_pltfm_cd_interrupt, > + IRQF_TRIGGER_FALLING| > + IRQF_TRIGGER_RISING | > + IRQF_ONESHOT | > + IRQF_NO_SUSPEND, "sdio cd", host); > + if (ret) { > + dev_err(mmc_dev(host->mmc), > + "Failed irq %d request for gpio=%d ret=%d\n", > + gpio_to_irq(kona_dev->cd_gpio), > + kona_dev->cd_gpio, ret); > + goto err_remove_host; > + } > + if (gpio_is_valid(kona_dev->wp_gpio)) { > + ret = devm_gpio_request(dev, > + kona_dev->wp_gpio, "sdio wp"); > + if (ret < 0) { > + dev_err(&pdev->dev, > + "Unable to request WP pin %d\n", > + kona_dev->wp_gpio); > + kona_dev->wp_gpio = -1; > + } else { > + gpio_direction_input(kona_dev->wp_gpio); > + } > + }
Could you investigate replacing this section of code with a call to mmc_of_parse(), please? It should be able to replace your parsing and handling of bus-width, cd-gpios, wp-gpios, and non-removable (other than the initialization quirks specific to your hardware). I'd like to avoid every driver having its own DT parsing. Thanks, - Chris. -- Chris Ball <c...@laptop.org> <http://printf.net/> One Laptop Per Child _______________________________________________ devicetree-discuss mailing list devicetree-discuss@lists.ozlabs.org https://lists.ozlabs.org/listinfo/devicetree-discuss