static int gpio_regulator_probe(struct platform_device *pdev) { struct gpio_regulator_config *config = pdev->dev.platform_data; struct device_node *np = pdev->dev.of_node; struct gpio_regulator_data *drvdata; struct regulator_config cfg = { }; int ptr, ret, state; if (np) { config = of_get_gpio_regulator_config(&pdev->dev, np); if (IS_ERR(config)) return PTR_ERR(config); } drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data), GFP_KERNEL); if (drvdata == NULL) { dev_err(&pdev->dev, "Failed to allocate device data\n"); return -ENOMEM; } drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL); if (drvdata->desc.name == NULL) { dev_err(&pdev->dev, "Failed to allocate supply name\n"); ret = -ENOMEM; goto err; } drvdata->gpios = kmemdup(config->gpios, config->nr_gpios * sizeof(struct gpio), GFP_KERNEL); if (drvdata->gpios == NULL) { dev_err(&pdev->dev, "Failed to allocate gpio data\n"); ret = -ENOMEM; goto err_name; } drvdata->states = kmemdup(config->states, config->nr_states * sizeof(struct gpio_regulator_state), GFP_KERNEL); if (drvdata->states == NULL) { dev_err(&pdev->dev, "Failed to allocate state data\n"); ret = -ENOMEM; goto err_memgpio; } drvdata->nr_states = config->nr_states; drvdata->desc.owner = THIS_MODULE; drvdata->desc.enable_time = config->startup_delay; /* handle regulator type*/ switch (config->type) { case REGULATOR_VOLTAGE: drvdata->desc.type = REGULATOR_VOLTAGE; drvdata->desc.ops = &gpio_regulator_voltage_ops; drvdata->desc.n_voltages = config->nr_states; break; case REGULATOR_CURRENT: drvdata->desc.type = REGULATOR_CURRENT; drvdata->desc.ops = &gpio_regulator_current_ops; break; default: dev_err(&pdev->dev, "No regulator type set\n"); ret = -EINVAL; goto err_memgpio; break; } drvdata->nr_gpios = config->nr_gpios; ret = gpio_request_array(drvdata->gpios, drvdata->nr_gpios); if (ret) { dev_err(&pdev->dev, "Could not obtain regulator setting GPIOs: %d\n", ret); goto err_memstate; } /* build initial state from gpio init data. */ state = 0; for (ptr = 0; ptr < drvdata->nr_gpios; ptr++) { if (config->gpios[ptr].flags & GPIOF_OUT_INIT_HIGH) state |= (1 << ptr); } drvdata->state = state; cfg.dev = &pdev->dev; cfg.init_data = config->init_data; cfg.driver_data = drvdata; cfg.of_node = np; if (config->enable_gpio >= 0) cfg.ena_gpio = config->enable_gpio; cfg.ena_gpio_invert = !config->enable_high; if (config->enabled_at_boot) { if (config->enable_high) cfg.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH; else cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW; } else { if (config->enable_high) cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW; else cfg.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH; } drvdata->dev = regulator_register(&drvdata->desc, &cfg); if (IS_ERR(drvdata->dev)) { ret = PTR_ERR(drvdata->dev); dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret); goto err_stategpio; } platform_set_drvdata(pdev, drvdata); return 0; err_stategpio: gpio_free_array(drvdata->gpios, drvdata->nr_gpios); err_memstate: kfree(drvdata->states); err_memgpio: kfree(drvdata->gpios); err_name: kfree(drvdata->desc.name); err: return ret; }
static int gpio_regulator_probe(struct platform_device *pdev) { struct gpio_regulator_config *config = dev_get_platdata(&pdev->dev); struct device_node *np = pdev->dev.of_node; struct gpio_regulator_data *drvdata; struct regulator_config cfg = { }; int ptr, ret, state; drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data), GFP_KERNEL); if (drvdata == NULL) return -ENOMEM; if (np) { config = of_get_gpio_regulator_config(&pdev->dev, np, &drvdata->desc); if (IS_ERR(config)) return PTR_ERR(config); } drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL); if (drvdata->desc.name == NULL) { dev_err(&pdev->dev, "Failed to allocate supply name\n"); ret = -ENOMEM; goto err; } if (config->nr_gpios != 0) { drvdata->gpios = kmemdup(config->gpios, config->nr_gpios * sizeof(struct gpio), GFP_KERNEL); if (drvdata->gpios == NULL) { dev_err(&pdev->dev, "Failed to allocate gpio data\n"); ret = -ENOMEM; goto err_name; } drvdata->nr_gpios = config->nr_gpios; ret = gpio_request_array(drvdata->gpios, drvdata->nr_gpios); if (ret) { dev_err(&pdev->dev, "Could not obtain regulator setting GPIOs: %d\n", ret); goto err_memstate; } } drvdata->states = kmemdup(config->states, config->nr_states * sizeof(struct gpio_regulator_state), GFP_KERNEL); if (drvdata->states == NULL) { dev_err(&pdev->dev, "Failed to allocate state data\n"); ret = -ENOMEM; goto err_memgpio; } drvdata->nr_states = config->nr_states; drvdata->desc.owner = THIS_MODULE; drvdata->desc.enable_time = config->startup_delay; /* handle regulator type*/ switch (config->type) { case REGULATOR_VOLTAGE: drvdata->desc.type = REGULATOR_VOLTAGE; drvdata->desc.ops = &gpio_regulator_voltage_ops; drvdata->desc.n_voltages = config->nr_states;