static int pca953x_probe(struct udevice *dev) { struct pca953x_info *info = dev_get_platdata(dev); struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev); struct dm_i2c_chip *chip = dev_get_parent_platdata(dev); char name[32], *str; int addr; ulong driver_data; int ret; if (!info) { dev_err(dev, "platdata not ready\n"); return -ENOMEM; } if (!chip) { dev_err(dev, "i2c not ready\n"); return -ENODEV; } addr = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "reg", 0); if (addr == 0) return -ENODEV; info->addr = addr; driver_data = dev_get_driver_data(dev); info->gpio_count = driver_data & PCA_GPIO_MASK; if (info->gpio_count > MAX_BANK * BANK_SZ) { dev_err(dev, "Max support %d pins now\n", MAX_BANK * BANK_SZ); return -EINVAL; } info->chip_type = PCA_CHIP_TYPE(driver_data); if (info->chip_type != PCA953X_TYPE) { dev_err(dev, "Only support PCA953X chip type now.\n"); return -EINVAL; } info->bank_count = DIV_ROUND_UP(info->gpio_count, BANK_SZ); ret = pca953x_read_regs(dev, PCA953X_OUTPUT, info->reg_output); if (ret) { dev_err(dev, "Error reading output register\n"); return ret; } ret = pca953x_read_regs(dev, PCA953X_DIRECTION, info->reg_direction); if (ret) { dev_err(dev, "Error reading direction register\n"); return ret; } snprintf(name, sizeof(name), "gpio@%x_", info->addr); str = strdup(name); if (!str) return -ENOMEM; uc_priv->bank_name = str; uc_priv->gpio_count = info->gpio_count; dev_dbg(dev, "%s is ready\n", str); return 0; }
static int pca953x_probe(struct udevice *dev) { struct pca953x_info *info = dev_get_platdata(dev); struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev); char name[32], label[8], *str; int addr; ulong driver_data; int ret; int size; const u8 *tmp; addr = dev_read_addr(dev); if (addr == 0) return -ENODEV; info->addr = addr; driver_data = dev_get_driver_data(dev); info->gpio_count = driver_data & PCA_GPIO_MASK; if (info->gpio_count > MAX_BANK * BANK_SZ) { dev_err(dev, "Max support %d pins now\n", MAX_BANK * BANK_SZ); return -EINVAL; } info->chip_type = PCA_CHIP_TYPE(driver_data); if (info->chip_type != PCA953X_TYPE) { dev_err(dev, "Only support PCA953X chip type now.\n"); return -EINVAL; } info->bank_count = DIV_ROUND_UP(info->gpio_count, BANK_SZ); ret = pca953x_read_regs(dev, PCA953X_OUTPUT, info->reg_output); if (ret) { dev_err(dev, "Error reading output register\n"); return ret; } ret = pca953x_read_regs(dev, PCA953X_DIRECTION, info->reg_direction); if (ret) { dev_err(dev, "Error reading direction register\n"); return ret; } tmp = dev_read_prop(dev, "label", &size); if (tmp) { memcpy(label, tmp, sizeof(label) - 1); label[sizeof(label) - 1] = '\0'; snprintf(name, sizeof(name), "%s@%x_", label, info->addr); } else { snprintf(name, sizeof(name), "gpio@%x_", info->addr); } str = strdup(name); if (!str) return -ENOMEM; uc_priv->bank_name = str; uc_priv->gpio_count = info->gpio_count; dev_dbg(dev, "%s is ready\n", str); return 0; }