static int pm800_regulator_probe(struct platform_device *pdev) { struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent); struct pm80x_platform_data *pdata = dev_get_platdata(pdev->dev.parent); struct pm800_regulators *pm800_data; struct pm800_regulator_info *info; struct regulator_config config = { }; struct regulator_init_data *init_data; int i, ret, range = 0; struct of_regulator_match *regulator_matches; if (!pdata || pdata->num_regulators == 0) { if (IS_ENABLED(CONFIG_OF)) { ret = pm800_regulator_dt_init(pdev, ®ulator_matches, &range); if (ret < 0) return ret; } else { return -ENODEV; } } else if (pdata->num_regulators) { unsigned int count = 0; /* Check whether num_regulator is valid. */ for (i = 0; i < ARRAY_SIZE(pdata->regulators); i++) { if (pdata->regulators[i]) count++; } if (count != pdata->num_regulators) return -EINVAL; } else { return -EINVAL; } pm800_data = devm_kzalloc(&pdev->dev, sizeof(*pm800_data), GFP_KERNEL); if (!pm800_data) { dev_err(&pdev->dev, "Failed to allocate pm800_regualtors"); return -ENOMEM; } pm800_data->map = chip->subchip->regmap_power; pm800_data->chip = chip; platform_set_drvdata(pdev, pm800_data); for (i = 0; i < range; i++) { if (!pdata || pdata->num_regulators == 0) init_data = regulator_matches->init_data; else init_data = pdata->regulators[i]; if (!init_data) { regulator_matches++; continue; } info = regulator_matches->driver_data; info->chip = chip; config.dev = &pdev->dev; config.init_data = init_data; config.driver_data = info; config.regmap = pm800_data->map; config.of_node = regulator_matches->of_node; pm800_data->regulators[i] = regulator_register(&info->desc, &config); if (IS_ERR(pm800_data->regulators[i])) { ret = PTR_ERR(pm800_data->regulators[i]); dev_err(&pdev->dev, "Failed to register %s\n", info->desc.name); while (--i >= 0) regulator_unregister(pm800_data->regulators[i]); return ret; } pm800_data->regulators[i]->constraints->valid_ops_mask |= (REGULATOR_CHANGE_DRMS | REGULATOR_CHANGE_MODE); pm800_data->regulators[i]->constraints->valid_modes_mask |= (REGULATOR_MODE_NORMAL | REGULATOR_MODE_IDLE); pm800_data->regulators[i]->constraints->input_uV = 1000; regulator_matches++; } return 0; }
static int pm800_regulator_probe(struct platform_device *pdev) { struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent); struct pm80x_platform_data *pdata = dev_get_platdata(pdev->dev.parent); struct pm800_regulators *pm800_data; struct pm800_regulator_info *info; struct regulator_config config = { }; struct regulator_init_data *init_data; int i, ret; if (!pdata || pdata->num_regulators == 0) { if (IS_ENABLED(CONFIG_OF)) { ret = pm800_regulator_dt_init(pdev); if (ret) return ret; } else { return -ENODEV; } } else if (pdata->num_regulators) { unsigned int count = 0; /* Check whether num_regulator is valid. */ for (i = 0; i < ARRAY_SIZE(pdata->regulators); i++) { if (pdata->regulators[i]) count++; } if (count != pdata->num_regulators) return -EINVAL; } else { return -EINVAL; } pm800_data = devm_kzalloc(&pdev->dev, sizeof(*pm800_data), GFP_KERNEL); if (!pm800_data) return -ENOMEM; pm800_data->map = chip->subchip->regmap_power; pm800_data->chip = chip; platform_set_drvdata(pdev, pm800_data); for (i = 0; i < PM800_ID_RG_MAX; i++) { if (!pdata || pdata->num_regulators == 0) init_data = pm800_regulator_matches[i].init_data; else init_data = pdata->regulators[i]; if (!init_data) continue; info = pm800_regulator_matches[i].driver_data; config.dev = &pdev->dev; config.init_data = init_data; config.driver_data = info; config.regmap = pm800_data->map; config.of_node = pm800_regulator_matches[i].of_node; pm800_data->regulators[i] = regulator_register(&info->desc, &config); if (IS_ERR(pm800_data->regulators[i])) { ret = PTR_ERR(pm800_data->regulators[i]); dev_err(&pdev->dev, "Failed to register %s\n", info->desc.name); while (--i >= 0) regulator_unregister(pm800_data->regulators[i]); return ret; } } return 0; }