Skip to content
Snippets Groups Projects
omap_hsmmc.c 27.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • static int omap_hsmmc_ofdata_to_platdata(struct udevice *dev)
    {
    
    	struct omap_hsmmc_plat *plat = dev_get_platdata(dev);
    	struct mmc_config *cfg = &plat->cfg;
    
    	int node = dev_of_offset(dev);
    
    	plat->base_addr = map_physmem(devfdt_get_addr(dev),
    				      sizeof(struct hsmmc *),
    
    
    	cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
    	val = fdtdec_get_int(fdt, node, "bus-width", -1);
    	if (val < 0) {
    		printf("error: bus-width property missing\n");
    		return -ENOENT;
    	}
    
    	switch (val) {
    	case 0x8:
    		cfg->host_caps |= MMC_MODE_8BIT;
    	case 0x4:
    		cfg->host_caps |= MMC_MODE_4BIT;
    		break;
    	default:
    		printf("error: invalid bus-width property\n");
    		return -ENOENT;
    	}
    
    	cfg->f_min = 400000;
    	cfg->f_max = fdtdec_get_int(fdt, node, "max-frequency", 52000000);
    	cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
    	cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
    
    
    #ifdef OMAP_HSMMC_USE_GPIO
    
    	plat->cd_inverted = fdtdec_get_bool(fdt, node, "cd-inverted");
    
    #ifdef CONFIG_BLK
    
    static int omap_hsmmc_bind(struct udevice *dev)
    {
    	struct omap_hsmmc_plat *plat = dev_get_platdata(dev);
    
    	return mmc_bind(dev, &plat->mmc, &plat->cfg);
    }
    #endif
    
    static int omap_hsmmc_probe(struct udevice *dev)
    {
    
    	struct omap_hsmmc_plat *plat = dev_get_platdata(dev);
    
    	struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
    	struct omap_hsmmc_data *priv = dev_get_priv(dev);
    
    	priv->base_addr = plat->base_addr;
    #ifdef OMAP_HSMMC_USE_GPIO
    	priv->cd_inverted = plat->cd_inverted;
    #endif
    
    #ifdef CONFIG_BLK
    	mmc = &plat->mmc;
    #else
    
    	mmc = mmc_create(cfg, priv);
    	if (mmc == NULL)
    		return -1;
    
    #if defined(OMAP_HSMMC_USE_GPIO) && CONFIG_IS_ENABLED(OF_CONTROL)
    
    	gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, GPIOD_IS_IN);
    	gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, GPIOD_IS_IN);
    #endif
    
    
    	return omap_hsmmc_init_setup(mmc);
    
    #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
    
    static const struct udevice_id omap_hsmmc_ids[] = {
    
    	{ .compatible = "ti,omap3-hsmmc" },
    	{ .compatible = "ti,omap4-hsmmc" },
    	{ .compatible = "ti,am33xx-hsmmc" },
    
    
    U_BOOT_DRIVER(omap_hsmmc) = {
    	.name	= "omap_hsmmc",
    	.id	= UCLASS_MMC,
    
    #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
    
    	.of_match = omap_hsmmc_ids,
    	.ofdata_to_platdata = omap_hsmmc_ofdata_to_platdata,
    
    	.platdata_auto_alloc_size = sizeof(struct omap_hsmmc_plat),
    #endif
    
    #ifdef CONFIG_BLK
    	.bind = omap_hsmmc_bind,
    #endif
    
    	.ops = &omap_hsmmc_ops,
    
    	.probe	= omap_hsmmc_probe,
    	.priv_auto_alloc_size = sizeof(struct omap_hsmmc_data),
    
    	.flags	= DM_FLAG_PRE_RELOC,