/* Check for vol- button - if pressed - stop autoboot */ int misc_init_r(void) { struct udevice *pon; struct gpio_desc resin; int node, ret; ret = uclass_get_device_by_name(UCLASS_GPIO, "pm8916_pon@800", &pon); if (ret < 0) { printf("Failed to find PMIC pon node. Check device tree\n"); return 0; } node = fdt_subnode_offset(gd->fdt_blob, dev_of_offset(pon), "key_vol_down"); if (node < 0) { printf("Failed to find key_vol_down node. Check device tree\n"); return 0; } if (gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0, &resin, 0)) { printf("Failed to request key_vol_down button.\n"); return 0; } if (dm_gpio_get_value(&resin)) { env_set("bootdelay", "-1"); printf("Power button pressed - dropping to console.\n"); } return 0; }
int board_late_init(void) { struct gpio_desc gpio = {}; int node; node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, "st,led1"); if (node < 0) return -1; gpio_request_by_name_nodev(offset_to_ofnode(node), "led-gpio", 0, &gpio, GPIOD_IS_OUT); if (dm_gpio_is_valid(&gpio)) { dm_gpio_set_value(&gpio, 0); mdelay(10); dm_gpio_set_value(&gpio, 1); } /* read button 1*/ node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, "st,button1"); if (node < 0) return -1; gpio_request_by_name_nodev(offset_to_ofnode(node), "button-gpio", 0, &gpio, GPIOD_IS_IN); if (dm_gpio_is_valid(&gpio)) { if (dm_gpio_get_value(&gpio)) puts("usr button is at HIGH LEVEL\n"); else puts("usr button is at LOW LEVEL\n"); } return 0; }
static u32 cpld_read(struct udevice *dev, u8 addr) { struct renesas_ulcb_sysreset_priv *priv = dev_get_priv(dev); u32 data = 0; int i; for (i = 0; i < 8; i++) { dm_gpio_set_value(&priv->mosi, !!(addr & 0x80)); /* MSB first */ dm_gpio_set_value(&priv->sck, 1); addr <<= 1; dm_gpio_set_value(&priv->sck, 0); } dm_gpio_set_value(&priv->mosi, 0); /* READ */ dm_gpio_set_value(&priv->sstbz, 0); dm_gpio_set_value(&priv->sck, 1); dm_gpio_set_value(&priv->sck, 0); dm_gpio_set_value(&priv->sstbz, 1); for (i = 0; i < 32; i++) { dm_gpio_set_value(&priv->sck, 1); data <<= 1; data |= dm_gpio_get_value(&priv->miso); /* MSB first */ dm_gpio_set_value(&priv->sck, 0); } return data; }
static int do_sdhci_init(struct sdhci_host *host) { int dev_id, flag, ret; flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE : PINMUX_FLAG_NONE; dev_id = host->index + PERIPH_ID_SDMMC0; ret = exynos_pinmux_config(dev_id, flag); if (ret) { printf("external SD not configured\n"); return ret; } if (dm_gpio_is_valid(&host->pwr_gpio)) { dm_gpio_set_value(&host->pwr_gpio, 1); ret = exynos_pinmux_config(dev_id, flag); if (ret) { debug("MMC not configured\n"); return ret; } } if (dm_gpio_is_valid(&host->cd_gpio)) { ret = dm_gpio_get_value(&host->cd_gpio); if (ret) { debug("no SD card detected (%d)\n", ret); return -ENODEV; } } return s5p_sdhci_core_init(host); }
static int do_sdhci_init(struct sdhci_host *host) { int dev_id, flag; int err = 0; flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE : PINMUX_FLAG_NONE; dev_id = host->index + PERIPH_ID_SDMMC0; if (dm_gpio_is_valid(&host->pwr_gpio)) { dm_gpio_set_value(&host->pwr_gpio, 1); err = exynos_pinmux_config(dev_id, flag); if (err) { debug("MMC not configured\n"); return err; } } if (dm_gpio_is_valid(&host->cd_gpio)) { if (dm_gpio_get_value(&host->cd_gpio)) return -ENODEV; err = exynos_pinmux_config(dev_id, flag); if (err) { printf("external SD not configured\n"); return err; } } return s5p_sdhci_core_init(host); }
int cros_ec_interrupt_pending(struct cros_ec_dev *dev) { /* no interrupt support : always poll */ if (!dm_gpio_is_valid(&dev->ec_int)) return -ENOENT; return dm_gpio_get_value(&dev->ec_int); }
void board_pex_config(void) { #ifdef CONFIG_SPL_BUILD uint k; struct gpio_desc gpio = {}; if (!request_gpio_by_name(&gpio, "pca9698@22", 31, "fpga-program-gpio")) { /* prepare FPGA reconfiguration */ dm_gpio_set_dir_flags(&gpio, GPIOD_IS_OUT); dm_gpio_set_value(&gpio, 0); /* give lunatic PCIe clock some time to stabilize */ mdelay(500); /* start FPGA reconfiguration */ dm_gpio_set_dir_flags(&gpio, GPIOD_IS_IN); } /* wait for FPGA done */ if (!request_gpio_by_name(&gpio, "pca9698@22", 19, "fpga-done-gpio")) { for (k = 0; k < 20; ++k) { if (dm_gpio_get_value(&gpio)) { printf("FPGA done after %u rounds\n", k); break; } mdelay(100); } } /* disable FPGA reset */ if (!request_gpio_by_name(&gpio, "gpio@18100", 6, "cpu-to-fpga-reset")) { dm_gpio_set_dir_flags(&gpio, GPIOD_IS_OUT); dm_gpio_set_value(&gpio, 1); } /* wait for FPGA ready */ if (!request_gpio_by_name(&gpio, "pca9698@22", 27, "fpga-ready-gpio")) { for (k = 0; k < 2; ++k) { if (!dm_gpio_get_value(&gpio)) break; mdelay(100); } } #endif }
static int fixed_regulator_get_enable(struct udevice *dev) { struct fixed_regulator_platdata *dev_pdata = dev_get_platdata(dev); /* Enable GPIO is optional */ if (!dev_pdata->gpio.dev) return true; return dm_gpio_get_value(&dev_pdata->gpio); }
int cros_ec_interrupt_pending(struct udevice *dev) { struct cros_ec_dev *cdev = dev_get_uclass_priv(dev); /* no interrupt support : always poll */ if (!dm_gpio_is_valid(&cdev->ec_int)) return -ENOENT; return dm_gpio_get_value(&cdev->ec_int); }
static int tegra_mmc_getcd(struct udevice *dev) { struct tegra_mmc_priv *priv = dev_get_priv(dev); debug("tegra_mmc_getcd called\n"); if (dm_gpio_is_valid(&priv->cd_gpio)) return dm_gpio_get_value(&priv->cd_gpio); return 1; }
static int omap_hsmmc_getwp(struct mmc *mmc) { struct omap_hsmmc_data *priv = mmc->priv; int value; value = dm_gpio_get_value(&priv->wp_gpio); /* if no WP return as 0 */ if (value < 0) return 0; return value; }
/** * gpio_get_value() - [COMPAT] Sample GPIO pin and return it's value * gpio: GPIO number * * This function implements the API that's compatible with current * GPIO API used in U-Boot. The request is forwarded to particular * GPIO driver. Returns the value of the GPIO pin, or negative value * on error. */ int gpio_get_value(unsigned gpio) { int ret; struct gpio_desc desc; ret = gpio_to_device(gpio, &desc); if (ret) return ret; return dm_gpio_get_value(&desc); }
static int tegra_mmc_getcd(struct mmc *mmc) { struct mmc_host *host = mmc->priv; debug("tegra_mmc_getcd called\n"); if (dm_gpio_is_valid(&host->cd_gpio)) return dm_gpio_get_value(&host->cd_gpio); return 1; }
static int stm32_sdmmc2_getcd(struct udevice *dev) { struct stm32_sdmmc2_priv *priv = dev_get_priv(dev); debug("stm32_sdmmc2_getcd called\n"); if (dm_gpio_is_valid(&priv->cd_gpio)) return dm_gpio_get_value(&priv->cd_gpio); return 1; }
static enum led_state_t gpio_led_get_state(struct udevice *dev) { struct led_gpio_priv *priv = dev_get_priv(dev); int ret; if (!dm_gpio_is_valid(&priv->gpio)) return -EREMOTEIO; ret = dm_gpio_get_value(&priv->gpio); if (ret < 0) return ret; return ret ? LEDST_ON : LEDST_OFF; }
static int vf_usb_ofdata_to_platdata(struct udevice *dev) { struct ehci_vf_priv_data *priv = dev_get_priv(dev); const void *dt_blob = gd->fdt_blob; int node = dev_of_offset(dev); const char *mode; priv->portnr = dev->seq; priv->ehci = (struct usb_ehci *)devfdt_get_addr(dev); mode = fdt_getprop(dt_blob, node, "dr_mode", NULL); if (mode) { if (0 == strcmp(mode, "host")) { priv->dr_mode = DR_MODE_HOST; priv->init_type = USB_INIT_HOST; } else if (0 == strcmp(mode, "peripheral")) { priv->dr_mode = DR_MODE_DEVICE; priv->init_type = USB_INIT_DEVICE; } else if (0 == strcmp(mode, "otg")) { priv->dr_mode = DR_MODE_OTG; /* * We set init_type to device by default when OTG * mode is requested. If a valid gpio is provided * we will switch the init_type based on the state * of the gpio pin. */ priv->init_type = USB_INIT_DEVICE; } else { debug("%s: Cannot decode dr_mode '%s'\n", __func__, mode); return -EINVAL; } } else { priv->dr_mode = DR_MODE_HOST; priv->init_type = USB_INIT_HOST; } if (priv->dr_mode == DR_MODE_OTG) { gpio_request_by_name_nodev(offset_to_ofnode(node), "fsl,cdet-gpio", 0, &priv->cdet_gpio, GPIOD_IS_IN); if (dm_gpio_is_valid(&priv->cdet_gpio)) { if (dm_gpio_get_value(&priv->cdet_gpio)) priv->init_type = USB_INIT_DEVICE; else priv->init_type = USB_INIT_HOST; } } return 0; }
int video_bridge_check_attached(struct udevice *dev) { struct video_bridge_priv *uc_priv = dev_get_uclass_priv(dev); struct video_bridge_ops *ops = video_bridge_get_ops(dev); int ret; if (!ops->check_attached) { ret = dm_gpio_get_value(&uc_priv->hotplug); return ret > 0 ? 0 : ret == 0 ? -ENOTCONN : ret; } return ops->check_attached(dev); }
static int omap_hsmmc_getcd(struct mmc *mmc) { struct omap_hsmmc_data *priv = mmc->priv; int value; value = dm_gpio_get_value(&priv->cd_gpio); /* if no CD return as 1 */ if (value < 0) return 1; if (priv->cd_inverted) return !value; return value; }
int i2c_arbitrator_select(struct udevice *mux, struct udevice *bus, uint channel) { struct i2c_arbitrator_priv *priv = dev_get_priv(mux); unsigned start; int ret; debug("%s: %s\n", __func__, mux->name); /* Start a round of trying to claim the bus */ start = get_timer(0); do { unsigned start_retry; int waiting = 0; /* Indicate that we want to claim the bus */ ret = dm_gpio_set_value(&priv->ap_claim, 1); if (ret) goto err; udelay(priv->slew_delay_us); /* Wait for the EC to release it */ start_retry = get_timer(0); while (get_timer(start_retry) < priv->wait_retry_ms) { ret = dm_gpio_get_value(&priv->ec_claim); if (ret < 0) { goto err; } else if (!ret) { /* We got it, so return */ return 0; } if (!waiting) waiting = 1; } /* It didn't release, so give up, wait, and try again */ ret = dm_gpio_set_value(&priv->ap_claim, 0); if (ret) goto err; mdelay(priv->wait_retry_ms); } while (get_timer(start) < priv->wait_free_ms); /* Give up, release our claim */ printf("I2C: Could not claim bus, timeout %lu\n", get_timer(start)); ret = -ETIMEDOUT; ret = 0; err: return ret; }
int dm_gpio_get_values_as_int(const struct gpio_desc *desc_list, int count) { unsigned bitmask = 1; unsigned vector = 0; int ret, i; for (i = 0; i < count; i++) { ret = dm_gpio_get_value(&desc_list[i]); if (ret < 0) return ret; else if (ret) vector |= bitmask; bitmask <<= 1; } return vector; }
static int gpio_led_set_state(struct udevice *dev, enum led_state_t state) { struct led_gpio_priv *priv = dev_get_priv(dev); int ret; if (!dm_gpio_is_valid(&priv->gpio)) return -EREMOTEIO; switch (state) { case LEDST_OFF: case LEDST_ON: break; case LEDST_TOGGLE: ret = dm_gpio_get_value(&priv->gpio); if (ret < 0) return ret; state = !ret; break; default: return -ENOSYS; } return dm_gpio_set_value(&priv->gpio, state); }
static int i2c_gpio_sda_get(struct gpio_desc *sda) { return dm_gpio_get_value(sda); }
static int i2c_gpio_get_pin(struct gpio_desc *pin) { return dm_gpio_get_value(pin); }
/* Test that we can find GPIOs using phandles */ static int dm_test_gpio_phandles(struct dm_test_state *dms) { struct gpio_desc desc, desc_list[8], desc_list2[8]; struct udevice *dev, *gpio_a, *gpio_b; ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 0, &dev)); ut_asserteq_str("a-test", dev->name); ut_assertok(gpio_request_by_name(dev, "test-gpios", 1, &desc, 0)); ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio_a)); ut_assertok(uclass_get_device(UCLASS_GPIO, 2, &gpio_b)); ut_asserteq_str("base-gpios", gpio_a->name); ut_asserteq(true, !!device_active(gpio_a)); ut_asserteq_ptr(gpio_a, desc.dev); ut_asserteq(4, desc.offset); /* GPIOF_INPUT is the sandbox GPIO driver default */ ut_asserteq(GPIOF_INPUT, gpio_get_function(gpio_a, 4, NULL)); ut_assertok(dm_gpio_free(dev, &desc)); ut_asserteq(-ENOENT, gpio_request_by_name(dev, "test-gpios", 3, &desc, 0)); ut_asserteq_ptr(NULL, desc.dev); ut_asserteq(desc.offset, 0); ut_asserteq(-ENOENT, gpio_request_by_name(dev, "test-gpios", 5, &desc, 0)); /* Last GPIO is ignord as it comes after <0> */ ut_asserteq(3, gpio_request_list_by_name(dev, "test-gpios", desc_list, ARRAY_SIZE(desc_list), 0)); ut_asserteq(-EBUSY, gpio_request_list_by_name(dev, "test-gpios", desc_list2, ARRAY_SIZE(desc_list2), 0)); ut_assertok(gpio_free_list(dev, desc_list, 3)); ut_asserteq(3, gpio_request_list_by_name(dev, "test-gpios", desc_list, ARRAY_SIZE(desc_list), GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE)); ut_asserteq_ptr(gpio_a, desc_list[0].dev); ut_asserteq(1, desc_list[0].offset); ut_asserteq_ptr(gpio_a, desc_list[1].dev); ut_asserteq(4, desc_list[1].offset); ut_asserteq_ptr(gpio_b, desc_list[2].dev); ut_asserteq(5, desc_list[2].offset); ut_asserteq(1, dm_gpio_get_value(desc_list)); ut_assertok(gpio_free_list(dev, desc_list, 3)); ut_asserteq(6, gpio_request_list_by_name(dev, "test2-gpios", desc_list, ARRAY_SIZE(desc_list), 0)); /* This was set to output previously, so still will be */ ut_asserteq(GPIOF_OUTPUT, gpio_get_function(gpio_a, 1, NULL)); /* Active low should invert the input value */ ut_asserteq(GPIOF_INPUT, gpio_get_function(gpio_b, 6, NULL)); ut_asserteq(1, dm_gpio_get_value(&desc_list[2])); ut_asserteq(GPIOF_INPUT, gpio_get_function(gpio_b, 7, NULL)); ut_asserteq(GPIOF_OUTPUT, gpio_get_function(gpio_b, 8, NULL)); ut_asserteq(0, dm_gpio_get_value(&desc_list[4])); ut_asserteq(GPIOF_OUTPUT, gpio_get_function(gpio_b, 9, NULL)); ut_asserteq(1, dm_gpio_get_value(&desc_list[5])); return 0; }
static int omap_hsmmc_set_ios(struct mmc *mmc) { struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc); #else static int omap_hsmmc_set_ios(struct udevice *dev) { struct omap_hsmmc_data *priv = dev_get_priv(dev); struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev); struct mmc *mmc = upriv->mmc; #endif struct hsmmc *mmc_base; unsigned int dsor = 0; ulong start; mmc_base = priv->base_addr; /* configue bus width */ switch (mmc->bus_width) { case 8: writel(readl(&mmc_base->con) | DTW_8_BITMODE, &mmc_base->con); break; case 4: writel(readl(&mmc_base->con) & ~DTW_8_BITMODE, &mmc_base->con); writel(readl(&mmc_base->hctl) | DTW_4_BITMODE, &mmc_base->hctl); break; case 1: default: writel(readl(&mmc_base->con) & ~DTW_8_BITMODE, &mmc_base->con); writel(readl(&mmc_base->hctl) & ~DTW_4_BITMODE, &mmc_base->hctl); break; } /* configure clock with 96Mhz system clock. */ if (mmc->clock != 0) { dsor = (MMC_CLOCK_REFERENCE * 1000000 / mmc->clock); if ((MMC_CLOCK_REFERENCE * 1000000) / dsor > mmc->clock) dsor++; } mmc_reg_out(&mmc_base->sysctl, (ICE_MASK | DTO_MASK | CEN_MASK), (ICE_STOP | DTO_15THDTO | CEN_DISABLE)); mmc_reg_out(&mmc_base->sysctl, ICE_MASK | CLKD_MASK, (dsor << CLKD_OFFSET) | ICE_OSCILLATE); start = get_timer(0); while ((readl(&mmc_base->sysctl) & ICS_MASK) == ICS_NOTREADY) { if (get_timer(0) - start > MAX_RETRY_MS) { printf("%s: timedout waiting for ics!\n", __func__); return -ETIMEDOUT; } } writel(readl(&mmc_base->sysctl) | CEN_ENABLE, &mmc_base->sysctl); return 0; } #ifdef OMAP_HSMMC_USE_GPIO #if CONFIG_IS_ENABLED(DM_MMC) static int omap_hsmmc_getcd(struct udevice *dev) { struct omap_hsmmc_data *priv = dev_get_priv(dev); int value; value = dm_gpio_get_value(&priv->cd_gpio); /* if no CD return as 1 */ if (value < 0) return 1; if (priv->cd_inverted) return !value; return value; } static int omap_hsmmc_getwp(struct udevice *dev) { struct omap_hsmmc_data *priv = dev_get_priv(dev); int value; value = dm_gpio_get_value(&priv->wp_gpio); /* if no WP return as 0 */ if (value < 0) return 0; return value; } #else static int omap_hsmmc_getcd(struct mmc *mmc) { struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc); int cd_gpio; /* if no CD return as 1 */ cd_gpio = priv->cd_gpio; if (cd_gpio < 0) return 1; /* NOTE: assumes card detect signal is active-low */ return !gpio_get_value(cd_gpio); } static int omap_hsmmc_getwp(struct mmc *mmc) { struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc); int wp_gpio; /* if no WP return as 0 */ wp_gpio = priv->wp_gpio; if (wp_gpio < 0) return 0; /* NOTE: assumes write protect signal is active-high */ return gpio_get_value(wp_gpio); } #endif #endif #if CONFIG_IS_ENABLED(DM_MMC) static const struct dm_mmc_ops omap_hsmmc_ops = { .send_cmd = omap_hsmmc_send_cmd, .set_ios = omap_hsmmc_set_ios, #ifdef OMAP_HSMMC_USE_GPIO .get_cd = omap_hsmmc_getcd, .get_wp = omap_hsmmc_getwp, #endif }; #else static const struct mmc_ops omap_hsmmc_ops = { .send_cmd = omap_hsmmc_send_cmd, .set_ios = omap_hsmmc_set_ios, .init = omap_hsmmc_init_setup, #ifdef OMAP_HSMMC_USE_GPIO .getcd = omap_hsmmc_getcd, .getwp = omap_hsmmc_getwp, #endif }; #endif #if !CONFIG_IS_ENABLED(DM_MMC) int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio, int wp_gpio) { struct mmc *mmc; struct omap_hsmmc_data *priv; struct mmc_config *cfg; uint host_caps_val; priv = malloc(sizeof(*priv)); if (priv == NULL) return -1; host_caps_val = MMC_MODE_4BIT | MMC_MODE_HS_52MHz | MMC_MODE_HS; switch (dev_index) { case 0: priv->base_addr = (struct hsmmc *)OMAP_HSMMC1_BASE; break; #ifdef OMAP_HSMMC2_BASE case 1: priv->base_addr = (struct hsmmc *)OMAP_HSMMC2_BASE; #if (defined(CONFIG_OMAP44XX) || defined(CONFIG_OMAP54XX) || \ defined(CONFIG_DRA7XX) || defined(CONFIG_AM33XX) || \ defined(CONFIG_AM43XX) || defined(CONFIG_SOC_KEYSTONE)) && \ defined(CONFIG_HSMMC2_8BIT) /* Enable 8-bit interface for eMMC on OMAP4/5 or DRA7XX */ host_caps_val |= MMC_MODE_8BIT; #endif break; #endif #ifdef OMAP_HSMMC3_BASE case 2: priv->base_addr = (struct hsmmc *)OMAP_HSMMC3_BASE; #if defined(CONFIG_DRA7XX) && defined(CONFIG_HSMMC3_8BIT) /* Enable 8-bit interface for eMMC on DRA7XX */ host_caps_val |= MMC_MODE_8BIT; #endif break; #endif default: priv->base_addr = (struct hsmmc *)OMAP_HSMMC1_BASE; return 1; } #ifdef OMAP_HSMMC_USE_GPIO /* on error gpio values are set to -1, which is what we want */ priv->cd_gpio = omap_mmc_setup_gpio_in(cd_gpio, "mmc_cd"); priv->wp_gpio = omap_mmc_setup_gpio_in(wp_gpio, "mmc_wp"); #endif cfg = &priv->cfg; cfg->name = "OMAP SD/MMC"; cfg->ops = &omap_hsmmc_ops; cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195; cfg->host_caps = host_caps_val & ~host_caps_mask; cfg->f_min = 400000; if (f_max != 0) cfg->f_max = f_max; else { if (cfg->host_caps & MMC_MODE_HS) { if (cfg->host_caps & MMC_MODE_HS_52MHz) cfg->f_max = 52000000; else cfg->f_max = 26000000; } else cfg->f_max = 20000000; } cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT; #if defined(CONFIG_OMAP34XX) /* * Silicon revs 2.1 and older do not support multiblock transfers. */ if ((get_cpu_family() == CPU_OMAP34XX) && (get_cpu_rev() <= CPU_3XX_ES21)) cfg->b_max = 1; #endif mmc = mmc_create(cfg, priv); if (mmc == NULL) return -1; return 0; } #else #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) 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; struct omap2_mmc_platform_config *data = (struct omap2_mmc_platform_config *)dev_get_driver_data(dev); const void *fdt = gd->fdt_blob; int node = dev_of_offset(dev); int val; plat->base_addr = map_physmem(devfdt_get_addr(dev), sizeof(struct hsmmc *), MAP_NOCACHE) + data->reg_offset; 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"); #endif return 0; } #endif #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); struct mmc_config *cfg = &plat->cfg; struct mmc *mmc; cfg->name = "OMAP SD/MMC"; 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; #endif #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 mmc->dev = dev; upriv->mmc = mmc; return omap_hsmmc_init_setup(mmc); } #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) static const struct omap2_mmc_platform_config omap3_mmc_pdata = { .reg_offset = 0, }; static const struct omap2_mmc_platform_config am33xx_mmc_pdata = { .reg_offset = 0x100, }; static const struct omap2_mmc_platform_config omap4_mmc_pdata = { .reg_offset = 0x100, }; static const struct udevice_id omap_hsmmc_ids[] = { { .compatible = "ti,omap3-hsmmc", .data = (ulong)&omap3_mmc_pdata }, { .compatible = "ti,omap4-hsmmc", .data = (ulong)&omap4_mmc_pdata }, { .compatible = "ti,am33xx-hsmmc", .data = (ulong)&am33xx_mmc_pdata }, { } };