static int s2mps11_pmic_probe(struct platform_device *pdev) { struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); struct sec_platform_data *pdata = NULL; struct of_regulator_match *rdata = NULL; struct regulator_config config = { }; struct s2mps11_info *s2mps11; int i, ret = 0; const struct regulator_desc *regulators; s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info), GFP_KERNEL); if (!s2mps11) return -ENOMEM; s2mps11->dev_type = platform_get_device_id(pdev)->driver_data; switch (s2mps11->dev_type) { case S2MPS11X: s2mps11->rdev_num = ARRAY_SIZE(s2mps11_regulators); regulators = s2mps11_regulators; break; case S2MPS14X: s2mps11->rdev_num = ARRAY_SIZE(s2mps14_regulators); regulators = s2mps14_regulators; break; case S2MPU02: s2mps11->rdev_num = ARRAY_SIZE(s2mpu02_regulators); regulators = s2mpu02_regulators; break; default: dev_err(&pdev->dev, "Invalid device type: %u\n", s2mps11->dev_type); return -EINVAL; }; s2mps11->ext_control_gpio = devm_kzalloc(&pdev->dev, sizeof(*s2mps11->ext_control_gpio) * s2mps11->rdev_num, GFP_KERNEL); if (!s2mps11->ext_control_gpio) return -ENOMEM; /* * 0 is a valid GPIO so initialize all GPIO-s to negative value * to indicate that external control won't be used for this regulator. */ for (i = 0; i < s2mps11->rdev_num; i++) s2mps11->ext_control_gpio[i] = -EINVAL; if (!iodev->dev->of_node) { if (iodev->pdata) { pdata = iodev->pdata; goto common_reg; } else { dev_err(pdev->dev.parent, "Platform data or DT node not supplied\n"); return -ENODEV; } } rdata = kzalloc(sizeof(*rdata) * s2mps11->rdev_num, GFP_KERNEL); if (!rdata) return -ENOMEM; for (i = 0; i < s2mps11->rdev_num; i++) rdata[i].name = regulators[i].name; ret = s2mps11_pmic_dt_parse(pdev, rdata, s2mps11); if (ret) goto out; common_reg: platform_set_drvdata(pdev, s2mps11); config.dev = &pdev->dev; config.regmap = iodev->regmap_pmic; config.driver_data = s2mps11; config.ena_gpio_flags = GPIOF_OUT_INIT_HIGH; for (i = 0; i < s2mps11->rdev_num; i++) { struct regulator_dev *regulator; if (pdata) { config.init_data = pdata->regulators[i].initdata; config.of_node = pdata->regulators[i].reg_node; } else { config.init_data = rdata[i].init_data; config.of_node = rdata[i].of_node; } config.ena_gpio = s2mps11->ext_control_gpio[i]; regulator = devm_regulator_register(&pdev->dev, ®ulators[i], &config); if (IS_ERR(regulator)) { ret = PTR_ERR(regulator); dev_err(&pdev->dev, "regulator init failed for %d\n", i); goto out; } if (gpio_is_valid(s2mps11->ext_control_gpio[i])) { ret = s2mps14_pmic_enable_ext_control(s2mps11, regulator); if (ret < 0) { dev_err(&pdev->dev, "failed to enable GPIO control over %s: %d\n", regulator->desc->name, ret); goto out; } } } out: kfree(rdata); return ret; }
static int mc13892_regulator_probe(struct platform_device *pdev) { struct mc13xxx_regulator_priv *priv; struct mc13xxx *mc13892 = dev_get_drvdata(pdev->dev.parent); struct mc13xxx_regulator_platform_data *pdata = dev_get_platdata(&pdev->dev); struct mc13xxx_regulator_init_data *mc13xxx_data; struct regulator_config config = { }; int i, ret; int num_regulators = 0; u32 val; num_regulators = mc13xxx_get_num_regulators_dt(pdev); if (num_regulators <= 0 && pdata) num_regulators = pdata->num_regulators; if (num_regulators <= 0) return -EINVAL; priv = devm_kzalloc(&pdev->dev, sizeof(*priv) + num_regulators * sizeof(priv->regulators[0]), GFP_KERNEL); if (!priv) return -ENOMEM; priv->num_regulators = num_regulators; priv->mc13xxx_regulators = mc13892_regulators; priv->mc13xxx = mc13892; platform_set_drvdata(pdev, priv); mc13xxx_lock(mc13892); ret = mc13xxx_reg_read(mc13892, MC13892_REVISION, &val); if (ret) goto err_unlock; /* enable switch auto mode (on 2.0A silicon only) */ if ((val & 0x0000FFFF) == 0x45d0) { ret = mc13xxx_reg_rmw(mc13892, MC13892_SWITCHERS4, MC13892_SWITCHERS4_SW1MODE_M | MC13892_SWITCHERS4_SW2MODE_M, MC13892_SWITCHERS4_SW1MODE_AUTO | MC13892_SWITCHERS4_SW2MODE_AUTO); if (ret) goto err_unlock; ret = mc13xxx_reg_rmw(mc13892, MC13892_SWITCHERS5, MC13892_SWITCHERS5_SW3MODE_M | MC13892_SWITCHERS5_SW4MODE_M, MC13892_SWITCHERS5_SW3MODE_AUTO | MC13892_SWITCHERS5_SW4MODE_AUTO); if (ret) goto err_unlock; } mc13xxx_unlock(mc13892); /* update mc13892_vcam ops */ memcpy(&mc13892_vcam_ops, mc13892_regulators[MC13892_VCAM].desc.ops, sizeof(struct regulator_ops)); mc13892_vcam_ops.set_mode = mc13892_vcam_set_mode, mc13892_vcam_ops.get_mode = mc13892_vcam_get_mode, mc13892_regulators[MC13892_VCAM].desc.ops = &mc13892_vcam_ops; mc13xxx_data = mc13xxx_parse_regulators_dt(pdev, mc13892_regulators, ARRAY_SIZE(mc13892_regulators)); for (i = 0; i < priv->num_regulators; i++) { struct regulator_init_data *init_data; struct regulator_desc *desc; struct device_node *node = NULL; int id; if (mc13xxx_data) { id = mc13xxx_data[i].id; init_data = mc13xxx_data[i].init_data; node = mc13xxx_data[i].node; } else { id = pdata->regulators[i].id; init_data = pdata->regulators[i].init_data; } desc = &mc13892_regulators[id].desc; config.dev = &pdev->dev; config.init_data = init_data; config.driver_data = priv; config.of_node = node; priv->regulators[i] = devm_regulator_register(&pdev->dev, desc, &config); if (IS_ERR(priv->regulators[i])) { dev_err(&pdev->dev, "failed to register regulator %s\n", mc13892_regulators[i].desc.name); return PTR_ERR(priv->regulators[i]); } } return 0; err_unlock: mc13xxx_unlock(mc13892); return ret; }
static int ab8500_ext_regulator_probe(struct platform_device *pdev) { struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent); struct ab8500_platform_data *ppdata; struct ab8500_regulator_platform_data *pdata; struct device_node *np = pdev->dev.of_node; struct regulator_config config = { }; int i, err; if (np) { err = of_regulator_match(&pdev->dev, np, ab8500_ext_regulator_match, ARRAY_SIZE(ab8500_ext_regulator_match)); if (err < 0) { dev_err(&pdev->dev, "Error parsing regulator init data: %d\n", err); return err; } } if (!ab8500) { dev_err(&pdev->dev, "null mfd parent\n"); return -EINVAL; } ppdata = dev_get_platdata(ab8500->dev); if (!ppdata) { dev_err(&pdev->dev, "null parent pdata\n"); return -EINVAL; } pdata = ppdata->regulator; if (!pdata) { dev_err(&pdev->dev, "null pdata\n"); return -EINVAL; } /* make sure the platform data has the correct size */ if (pdata->num_ext_regulator != ARRAY_SIZE(ab8500_ext_regulator_info)) { dev_err(&pdev->dev, "Configuration error: size mismatch.\n"); return -EINVAL; } /* check for AB8500 2.x */ if (is_ab8500_2p0_or_earlier(ab8500)) { struct ab8500_ext_regulator_info *info; /* VextSupply3LPn is inverted on AB8500 2.x */ info = &ab8500_ext_regulator_info[AB8500_EXT_SUPPLY3]; info->update_val = 0x30; info->update_val_hp = 0x30; info->update_val_lp = 0x10; } /* register all regulators */ for (i = 0; i < ARRAY_SIZE(ab8500_ext_regulator_info); i++) { struct ab8500_ext_regulator_info *info = NULL; /* assign per-regulator data */ info = &ab8500_ext_regulator_info[i]; info->dev = &pdev->dev; info->cfg = (struct ab8500_ext_regulator_cfg *) pdata->ext_regulator[i].driver_data; config.dev = &pdev->dev; config.driver_data = info; config.of_node = ab8500_ext_regulator_match[i].of_node; config.init_data = (np) ? ab8500_ext_regulator_match[i].init_data : &pdata->ext_regulator[i]; /* register regulator with framework */ info->rdev = devm_regulator_register(&pdev->dev, &info->desc, &config); if (IS_ERR(info->rdev)) { err = PTR_ERR(info->rdev); dev_err(&pdev->dev, "failed to register regulator %s\n", info->desc.name); return err; } dev_dbg(rdev_get_dev(info->rdev), "%s-probed\n", info->desc.name); } return 0; }
static int da9063_regulator_probe(struct platform_device *pdev) { struct da9063 *da9063 = dev_get_drvdata(pdev->dev.parent); struct da9063_pdata *da9063_pdata = dev_get_platdata(da9063->dev); struct of_regulator_match *da9063_reg_matches = NULL; struct da9063_regulators_pdata *regl_pdata; const struct da9063_dev_model *model; struct da9063_regulators *regulators; struct da9063_regulator *regl; struct regulator_config config; bool bcores_merged, bmem_bio_merged; int id, irq, n, n_regulators, ret, val; size_t size; regl_pdata = da9063_pdata ? da9063_pdata->regulators_pdata : NULL; if (!regl_pdata) regl_pdata = da9063_parse_regulators_dt(pdev, &da9063_reg_matches); if (IS_ERR(regl_pdata) || regl_pdata->n_regulators == 0) { dev_err(&pdev->dev, "No regulators defined for the platform\n"); return PTR_ERR(regl_pdata); } /* Find regulators set for particular device model */ for (model = regulators_models; model->regulator_info; model++) { if (model->dev_model == da9063->model) break; } if (!model->regulator_info) { dev_err(&pdev->dev, "Chip model not recognised (%u)\n", da9063->model); return -ENODEV; } ret = regmap_read(da9063->regmap, DA9063_REG_CONFIG_H, &val); if (ret < 0) { dev_err(&pdev->dev, "Error while reading BUCKs configuration\n"); return -EIO; } bcores_merged = val & DA9063_BCORE_MERGE; bmem_bio_merged = val & DA9063_BUCK_MERGE; n_regulators = model->n_regulators; if (bcores_merged) n_regulators -= 2; /* remove BCORE1, BCORE2 */ else n_regulators--; /* remove BCORES_MERGED */ if (bmem_bio_merged) n_regulators -= 2; /* remove BMEM, BIO */ else n_regulators--; /* remove BMEM_BIO_MERGED */ /* Allocate memory required by usable regulators */ size = sizeof(struct da9063_regulators) + n_regulators * sizeof(struct da9063_regulator); regulators = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); if (!regulators) { dev_err(&pdev->dev, "No memory for regulators\n"); return -ENOMEM; } regulators->n_regulators = n_regulators; platform_set_drvdata(pdev, regulators); /* Register all regulators declared in platform information */ n = 0; id = 0; while (n < regulators->n_regulators) { /* Skip regulator IDs depending on merge mode configuration */ switch (id) { case DA9063_ID_BCORE1: case DA9063_ID_BCORE2: if (bcores_merged) { id++; continue; } break; case DA9063_ID_BMEM: case DA9063_ID_BIO: if (bmem_bio_merged) { id++; continue; } break; case DA9063_ID_BCORES_MERGED: if (!bcores_merged) { id++; continue; } break; case DA9063_ID_BMEM_BIO_MERGED: if (!bmem_bio_merged) { id++; continue; } break; } /* Initialise regulator structure */ regl = ®ulators->regulator[n]; regl->hw = da9063; regl->info = &model->regulator_info[id]; regl->desc = regl->info->desc; regl->desc.type = REGULATOR_VOLTAGE; regl->desc.owner = THIS_MODULE; if (regl->info->mode.reg) regl->mode = devm_regmap_field_alloc(&pdev->dev, da9063->regmap, regl->info->mode); if (regl->info->suspend.reg) regl->suspend = devm_regmap_field_alloc(&pdev->dev, da9063->regmap, regl->info->suspend); if (regl->info->sleep.reg) regl->sleep = devm_regmap_field_alloc(&pdev->dev, da9063->regmap, regl->info->sleep); if (regl->info->suspend_sleep.reg) regl->suspend_sleep = devm_regmap_field_alloc(&pdev->dev, da9063->regmap, regl->info->suspend_sleep); if (regl->info->ilimit.reg) regl->ilimit = devm_regmap_field_alloc(&pdev->dev, da9063->regmap, regl->info->ilimit); /* Register regulator */ memset(&config, 0, sizeof(config)); config.dev = &pdev->dev; config.init_data = da9063_get_regulator_initdata(regl_pdata, id); config.driver_data = regl; if (da9063_reg_matches) config.of_node = da9063_reg_matches[id].of_node; config.regmap = da9063->regmap; regl->rdev = devm_regulator_register(&pdev->dev, ®l->desc, &config); if (IS_ERR(regl->rdev)) { dev_err(&pdev->dev, "Failed to register %s regulator\n", regl->desc.name); return PTR_ERR(regl->rdev); } id++; n++; } /* LDOs overcurrent event support */ irq = platform_get_irq_byname(pdev, "LDO_LIM"); if (irq < 0) { dev_err(&pdev->dev, "Failed to get IRQ.\n"); return irq; } regulators->irq_ldo_lim = regmap_irq_get_virq(da9063->regmap_irq, irq); if (regulators->irq_ldo_lim >= 0) { ret = request_threaded_irq(regulators->irq_ldo_lim, NULL, da9063_ldo_lim_event, IRQF_TRIGGER_LOW | IRQF_ONESHOT, "LDO_LIM", regulators); if (ret) { dev_err(&pdev->dev, "Failed to request LDO_LIM IRQ.\n"); regulators->irq_ldo_lim = -ENXIO; } } return 0; }
static int reg_fixed_voltage_probe(struct platform_device *pdev) { struct fixed_voltage_config *config; struct fixed_voltage_data *drvdata; struct regulator_config cfg = { }; int ret; if (pdev->dev.of_node) { config = of_get_fixed_voltage_config(&pdev->dev); if (IS_ERR(config)) return PTR_ERR(config); } else { config = dev_get_platdata(&pdev->dev); } if (!config) return -ENOMEM; drvdata = devm_kzalloc(&pdev->dev, sizeof(struct fixed_voltage_data), GFP_KERNEL); if (!drvdata) return -ENOMEM; drvdata->desc.name = devm_kstrdup(&pdev->dev, config->supply_name, GFP_KERNEL); if (drvdata->desc.name == NULL) { dev_err(&pdev->dev, "Failed to allocate supply name\n"); return -ENOMEM; } drvdata->desc.type = REGULATOR_VOLTAGE; drvdata->desc.owner = THIS_MODULE; drvdata->desc.ops = &fixed_voltage_ops; drvdata->desc.enable_time = config->startup_delay; if (config->input_supply) { drvdata->desc.supply_name = devm_kstrdup(&pdev->dev, config->input_supply, GFP_KERNEL); if (!drvdata->desc.supply_name) { dev_err(&pdev->dev, "Failed to allocate input supply\n"); return -ENOMEM; } } if (config->microvolts) drvdata->desc.n_voltages = 1; drvdata->desc.fixed_uV = config->microvolts; cfg.ena_gpio = config->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; } if (config->gpio_is_open_drain) cfg.ena_gpio_flags |= GPIOF_OPEN_DRAIN; cfg.dev = &pdev->dev; cfg.init_data = config->init_data; cfg.driver_data = drvdata; cfg.of_node = pdev->dev.of_node; drvdata->dev = devm_regulator_register(&pdev->dev, &drvdata->desc, &cfg); if (IS_ERR(drvdata->dev)) { ret = PTR_ERR(drvdata->dev); dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret); return ret; } platform_set_drvdata(pdev, drvdata); dev_dbg(&pdev->dev, "%s supplying %duV\n", drvdata->desc.name, drvdata->desc.fixed_uV); return 0; }
static int tps65917_smps_registration(struct palmas_pmic *pmic, struct palmas_pmic_driver_data *ddata, struct palmas_pmic_platform_data *pdata, const char *pdev_name, struct regulator_config config) { int id, ret; unsigned int addr, reg; struct regulator_dev *rdev; struct palmas_reg_init *reg_init; struct palmas_regs_info *rinfo; struct regulator_desc *desc; for (id = ddata->smps_start; id <= ddata->smps_end; id++) { /* * Miss out regulators which are not available due * to slaving configurations. */ desc = &pmic->desc[id]; desc->n_linear_ranges = 3; if ((id == TPS65917_REG_SMPS2) && pmic->smps12) continue; /* Initialise sleep/init values from platform data */ if (pdata && pdata->reg_init[id]) { reg_init = pdata->reg_init[id]; ret = palmas_smps_init(pmic->palmas, id, reg_init); if (ret) return ret; } else { reg_init = NULL; } rinfo = &ddata->palmas_regs_info[id]; /* Register the regulators */ desc->name = rinfo->name; desc->id = id; /* * Read and store the RANGE bit for later use * This must be done before regulator is probed, * otherwise we error in probe with unsupportable * ranges. Read the current smps mode for later use. */ addr = rinfo->vsel_addr; ret = palmas_smps_read(pmic->palmas, addr, ®); if (ret) return ret; if (reg & TPS65917_SMPS1_VOLTAGE_RANGE) pmic->range[id] = 1; if (pmic->range[id]) desc->linear_ranges = smps_high_ranges; else desc->linear_ranges = smps_low_ranges; if (reg_init && reg_init->roof_floor) desc->ops = &tps65917_ops_ext_control_smps; else desc->ops = &tps65917_ops_smps; desc->n_voltages = PALMAS_SMPS_NUM_VOLTAGES; desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, rinfo->vsel_addr); desc->vsel_mask = PALMAS_SMPS12_VOLTAGE_VSEL_MASK; desc->ramp_delay = 2500; /* Read the smps mode for later use. */ addr = rinfo->ctrl_addr; ret = palmas_smps_read(pmic->palmas, addr, ®); if (ret) return ret; pmic->current_reg_mode[id] = reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, rinfo->ctrl_addr); desc->enable_mask = PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; /* set_mode overrides this value */ desc->enable_val = SMPS_CTRL_MODE_ON; desc->type = REGULATOR_VOLTAGE; desc->owner = THIS_MODULE; if (pdata) config.init_data = pdata->reg_data[id]; else config.init_data = NULL; desc->supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; rdev = devm_regulator_register(pmic->dev, desc, &config); if (IS_ERR(rdev)) { dev_err(pmic->dev, "failed to register %s regulator\n", pdev_name); return PTR_ERR(rdev); } /* Save regulator for cleanup */ pmic->rdev[id] = rdev; } return 0; }
static int tps65917_ldo_registration(struct palmas_pmic *pmic, struct palmas_pmic_driver_data *ddata, struct palmas_pmic_platform_data *pdata, const char *pdev_name, struct regulator_config config) { int id, ret; struct regulator_dev *rdev; struct palmas_reg_init *reg_init; struct palmas_regs_info *rinfo; struct regulator_desc *desc; for (id = ddata->ldo_begin; id < ddata->max_reg; id++) { if (pdata && pdata->reg_init[id]) reg_init = pdata->reg_init[id]; else reg_init = NULL; /* Miss out regulators which are not available due * to alternate functions. */ rinfo = &ddata->palmas_regs_info[id]; /* Register the regulators */ desc = &pmic->desc[id]; desc->name = rinfo->name; desc->id = id; desc->type = REGULATOR_VOLTAGE; desc->owner = THIS_MODULE; if (id < TPS65917_REG_REGEN1) { desc->n_voltages = PALMAS_LDO_NUM_VOLTAGES; if (reg_init && reg_init->roof_floor) desc->ops = &palmas_ops_ext_control_ldo; else desc->ops = &tps65917_ops_ldo; desc->min_uV = 900000; desc->uV_step = 50000; desc->linear_min_sel = 1; desc->enable_time = 500; desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, rinfo->vsel_addr); desc->vsel_mask = PALMAS_LDO1_VOLTAGE_VSEL_MASK; desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, rinfo->ctrl_addr); desc->enable_mask = PALMAS_LDO1_CTRL_MODE_ACTIVE; /* * To be confirmed. Discussion on going with PMIC Team. * It is of the order of ~60mV/uS. */ desc->ramp_delay = 2500; } else { desc->n_voltages = 1; if (reg_init && reg_init->roof_floor) desc->ops = &palmas_ops_ext_control_extreg; else desc->ops = &palmas_ops_extreg; desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, rinfo->ctrl_addr); desc->enable_mask = PALMAS_REGEN1_CTRL_MODE_ACTIVE; } if (pdata) config.init_data = pdata->reg_data[id]; else config.init_data = NULL; desc->supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; rdev = devm_regulator_register(pmic->dev, desc, &config); if (IS_ERR(rdev)) { dev_err(pmic->dev, "failed to register %s regulator\n", pdev_name); return PTR_ERR(rdev); } /* Save regulator for cleanup */ pmic->rdev[id] = rdev; /* Initialise sleep/init values from platform data */ if (pdata) { reg_init = pdata->reg_init[id]; if (reg_init) { if (id < TPS65917_REG_REGEN1) ret = palmas_ldo_init(pmic->palmas, id, reg_init); else ret = palmas_extreg_init(pmic->palmas, id, reg_init); if (ret) return ret; } } } return 0; }
static int axp20x_regulator_probe(struct platform_device *pdev) { struct regulator_dev *rdev; struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent); const struct regulator_desc *regulators; struct regulator_config config = { .dev = pdev->dev.parent, .regmap = axp20x->regmap, .driver_data = axp20x, }; int ret, i, nregulators; u32 workmode; const char *dcdc1_name = axp22x_regulators[AXP22X_DCDC1].name; const char *dcdc5_name = axp22x_regulators[AXP22X_DCDC5].name; bool drivevbus = false; switch (axp20x->variant) { case AXP202_ID: case AXP209_ID: regulators = axp20x_regulators; nregulators = AXP20X_REG_ID_MAX; break; case AXP221_ID: case AXP223_ID: regulators = axp22x_regulators; nregulators = AXP22X_REG_ID_MAX; drivevbus = of_property_read_bool(pdev->dev.parent->of_node, "x-powers,drive-vbus-en"); break; case AXP809_ID: regulators = axp809_regulators; nregulators = AXP809_REG_ID_MAX; break; default: dev_err(&pdev->dev, "Unsupported AXP variant: %ld\n", axp20x->variant); return -EINVAL; } /* This only sets the dcdc freq. Ignore any errors */ axp20x_regulator_parse_dt(pdev); for (i = 0; i < nregulators; i++) { const struct regulator_desc *desc = ®ulators[i]; struct regulator_desc *new_desc; /* * Regulators DC1SW and DC5LDO are connected internally, * so we have to handle their supply names separately. * * We always register the regulators in proper sequence, * so the supply names are correctly read. See the last * part of this loop to see where we save the DT defined * name. */ if ((regulators == axp22x_regulators && i == AXP22X_DC1SW) || (regulators == axp809_regulators && i == AXP809_DC1SW)) { new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc), GFP_KERNEL); *new_desc = regulators[i]; new_desc->supply_name = dcdc1_name; desc = new_desc; } if ((regulators == axp22x_regulators && i == AXP22X_DC5LDO) || (regulators == axp809_regulators && i == AXP809_DC5LDO)) { new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc), GFP_KERNEL); *new_desc = regulators[i]; new_desc->supply_name = dcdc5_name; desc = new_desc; } rdev = devm_regulator_register(&pdev->dev, desc, &config); if (IS_ERR(rdev)) { dev_err(&pdev->dev, "Failed to register %s\n", regulators[i].name); return PTR_ERR(rdev); } ret = of_property_read_u32(rdev->dev.of_node, "x-powers,dcdc-workmode", &workmode); if (!ret) { if (axp20x_set_dcdc_workmode(rdev, i, workmode)) dev_err(&pdev->dev, "Failed to set workmode on %s\n", rdev->desc->name); } /* * Save AXP22X DCDC1 / DCDC5 regulator names for later. */ if ((regulators == axp22x_regulators && i == AXP22X_DCDC1) || (regulators == axp809_regulators && i == AXP809_DCDC1)) of_property_read_string(rdev->dev.of_node, "regulator-name", &dcdc1_name); if ((regulators == axp22x_regulators && i == AXP22X_DCDC5) || (regulators == axp809_regulators && i == AXP809_DCDC5)) of_property_read_string(rdev->dev.of_node, "regulator-name", &dcdc5_name); } if (drivevbus) { /* Change N_VBUSEN sense pin to DRIVEVBUS output pin */ regmap_update_bits(axp20x->regmap, AXP20X_OVER_TMP, AXP22X_MISC_N_VBUSEN_FUNC, 0); rdev = devm_regulator_register(&pdev->dev, &axp22x_drivevbus_regulator, &config); if (IS_ERR(rdev)) { dev_err(&pdev->dev, "Failed to register drivevbus\n"); return PTR_ERR(rdev); } } return 0; } static struct platform_driver axp20x_regulator_driver = { .probe = axp20x_regulator_probe, .driver = { .name = "axp20x-regulator", }, }; module_platform_driver(axp20x_regulator_driver); MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("Carlo Caione <*****@*****.**>"); MODULE_DESCRIPTION("Regulator Driver for AXP20X PMIC"); MODULE_ALIAS("platform:axp20x-regulator");
static int max8973_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct max8973_regulator_platform_data *pdata; struct regulator_init_data *ridata; struct regulator_config config = { }; struct regulator_dev *rdev; struct max8973_chip *max; bool pdata_from_dt = false; unsigned int chip_id; int ret; pdata = dev_get_platdata(&client->dev); if (!pdata && client->dev.of_node) { pdata = max8973_parse_dt(&client->dev); pdata_from_dt = true; } if (!pdata) { dev_err(&client->dev, "No Platform data"); return -EIO; } if ((pdata->dvs_gpio == -EPROBE_DEFER) || (pdata->enable_gpio == -EPROBE_DEFER)) return -EPROBE_DEFER; max = devm_kzalloc(&client->dev, sizeof(*max), GFP_KERNEL); if (!max) return -ENOMEM; max->regmap = devm_regmap_init_i2c(client, &max8973_regmap_config); if (IS_ERR(max->regmap)) { ret = PTR_ERR(max->regmap); dev_err(&client->dev, "regmap init failed, err %d\n", ret); return ret; } if (client->dev.of_node) { const struct of_device_id *match; match = of_match_device(of_match_ptr(of_max8973_match_tbl), &client->dev); if (!match) return -ENODATA; max->id = (u32)((uintptr_t)match->data); } else { max->id = id->driver_data; } ret = regmap_read(max->regmap, MAX8973_CHIPID1, &chip_id); if (ret < 0) { dev_err(&client->dev, "register CHIPID1 read failed, %d", ret); return ret; } dev_info(&client->dev, "CHIP-ID OTP: 0x%02x ID_M: 0x%02x\n", (chip_id >> 4) & 0xF, (chip_id >> 1) & 0x7); i2c_set_clientdata(client, max); max->ops = max8973_dcdc_ops; max->dev = &client->dev; max->desc.name = id->name; max->desc.id = 0; max->desc.ops = &max->ops; max->desc.type = REGULATOR_VOLTAGE; max->desc.owner = THIS_MODULE; max->desc.min_uV = MAX8973_MIN_VOLATGE; max->desc.uV_step = MAX8973_VOLATGE_STEP; max->desc.n_voltages = MAX8973_BUCK_N_VOLTAGE; max->dvs_gpio = (pdata->dvs_gpio) ? pdata->dvs_gpio : -EINVAL; max->enable_gpio = (pdata->enable_gpio) ? pdata->enable_gpio : -EINVAL; max->enable_external_control = pdata->enable_ext_control; max->curr_gpio_val = pdata->dvs_def_state; max->curr_vout_reg = MAX8973_VOUT + pdata->dvs_def_state; if (gpio_is_valid(max->enable_gpio)) max->enable_external_control = true; max->lru_index[0] = max->curr_vout_reg; if (gpio_is_valid(max->dvs_gpio)) { int gpio_flags; int i; gpio_flags = (pdata->dvs_def_state) ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; ret = devm_gpio_request_one(&client->dev, max->dvs_gpio, gpio_flags, "max8973-dvs"); if (ret) { dev_err(&client->dev, "gpio_request for gpio %d failed, err = %d\n", max->dvs_gpio, ret); return ret; } /* * Initialize the lru index with vout_reg id * The index 0 will be most recently used and * set with the max->curr_vout_reg */ for (i = 0; i < MAX8973_MAX_VOUT_REG; ++i) max->lru_index[i] = i; max->lru_index[0] = max->curr_vout_reg; max->lru_index[max->curr_vout_reg] = 0; } else { /* * If there is no DVS GPIO, the VOUT register * address is fixed. */ max->ops.set_voltage_sel = regulator_set_voltage_sel_regmap; max->ops.get_voltage_sel = regulator_get_voltage_sel_regmap; max->desc.vsel_reg = max->curr_vout_reg; max->desc.vsel_mask = MAX8973_VOUT_MASK; } if (pdata_from_dt) pdata->reg_init_data = of_get_regulator_init_data(&client->dev, client->dev.of_node, &max->desc); ridata = pdata->reg_init_data; switch (max->id) { case MAX8973: if (!pdata->enable_ext_control) { max->desc.enable_reg = MAX8973_VOUT; max->desc.enable_mask = MAX8973_VOUT_ENABLE; max->ops.enable = regulator_enable_regmap; max->ops.disable = regulator_disable_regmap; max->ops.is_enabled = regulator_is_enabled_regmap; break; } if (gpio_is_valid(max->enable_gpio)) { config.ena_gpio_flags = GPIOF_OUT_INIT_LOW; if (ridata && (ridata->constraints.always_on || ridata->constraints.boot_on)) config.ena_gpio_flags = GPIOF_OUT_INIT_HIGH; config.ena_gpio = max->enable_gpio; } break; case MAX77621: if (gpio_is_valid(max->enable_gpio)) { ret = devm_gpio_request_one(&client->dev, max->enable_gpio, GPIOF_OUT_INIT_HIGH, "max8973-en-gpio"); if (ret) { dev_err(&client->dev, "gpio_request for gpio %d failed: %d\n", max->enable_gpio, ret); return ret; } } max->desc.enable_reg = MAX8973_VOUT; max->desc.enable_mask = MAX8973_VOUT_ENABLE; max->ops.enable = regulator_enable_regmap; max->ops.disable = regulator_disable_regmap; max->ops.is_enabled = regulator_is_enabled_regmap; max->ops.set_current_limit = max8973_set_current_limit; max->ops.get_current_limit = max8973_get_current_limit; break; default: break; } ret = max8973_init_dcdc(max, pdata); if (ret < 0) { dev_err(max->dev, "Max8973 Init failed, err = %d\n", ret); return ret; } config.dev = &client->dev; config.init_data = pdata->reg_init_data; config.driver_data = max; config.of_node = client->dev.of_node; config.regmap = max->regmap; /* Register the regulators */ rdev = devm_regulator_register(&client->dev, &max->desc, &config); if (IS_ERR(rdev)) { ret = PTR_ERR(rdev); dev_err(max->dev, "regulator register failed, err %d\n", ret); return ret; } return 0; }
static int tps_65023_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct tps_driver_data *drv_data = (void *)id->driver_data; const struct tps_info *info = drv_data->info; struct regulator_config config = { }; struct regulator_init_data *init_data; struct regulator_dev *rdev; struct tps_pmic *tps; int i; int error; /** * init_data points to array of regulator_init structures * coming from the board-evm file. */ init_data = dev_get_platdata(&client->dev); if (!init_data) return -EIO; tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); if (!tps) return -ENOMEM; tps->regmap = devm_regmap_init_i2c(client, &tps65023_regmap_config); if (IS_ERR(tps->regmap)) { error = PTR_ERR(tps->regmap); dev_err(&client->dev, "Failed to allocate register map: %d\n", error); return error; } /* common for all regulators */ tps->core_regulator = drv_data->core_regulator; for (i = 0; i < TPS65023_NUM_REGULATOR; i++, info++, init_data++) { /* Store regulator specific information */ tps->info[i] = info; tps->desc[i].name = info->name; tps->desc[i].id = i; tps->desc[i].n_voltages = info->table_len; tps->desc[i].volt_table = info->table; tps->desc[i].ops = (i > TPS65023_DCDC_3 ? &tps65023_ldo_ops : &tps65023_dcdc_ops); tps->desc[i].type = REGULATOR_VOLTAGE; tps->desc[i].owner = THIS_MODULE; tps->desc[i].enable_reg = TPS65023_REG_REG_CTRL; switch (i) { case TPS65023_LDO_1: tps->desc[i].vsel_reg = TPS65023_REG_LDO_CTRL; tps->desc[i].vsel_mask = 0x07; tps->desc[i].enable_mask = 1 << 1; break; case TPS65023_LDO_2: tps->desc[i].vsel_reg = TPS65023_REG_LDO_CTRL; tps->desc[i].vsel_mask = 0x70; tps->desc[i].enable_mask = 1 << 2; break; default: /* DCDCx */ tps->desc[i].enable_mask = 1 << (TPS65023_NUM_REGULATOR - i); tps->desc[i].vsel_reg = TPS65023_REG_DEF_CORE; tps->desc[i].vsel_mask = info->table_len - 1; tps->desc[i].apply_reg = TPS65023_REG_CON_CTRL2; tps->desc[i].apply_bit = TPS65023_REG_CTRL2_GO; } config.dev = &client->dev; config.init_data = init_data; config.driver_data = tps; config.regmap = tps->regmap; /* Register the regulators */ rdev = devm_regulator_register(&client->dev, &tps->desc[i], &config); if (IS_ERR(rdev)) { dev_err(&client->dev, "failed to register %s\n", id->name); return PTR_ERR(rdev); } /* Save regulator for cleanup */ tps->rdev[i] = rdev; } i2c_set_clientdata(client, tps); /* Enable setting output voltage by I2C */ regmap_update_bits(tps->regmap, TPS65023_REG_CON_CTRL2, TPS65023_REG_CTRL2_CORE_ADJ, TPS65023_REG_CTRL2_CORE_ADJ); return 0; }
static int max8952_pmic_probe(struct i2c_client *client, const struct i2c_device_id *i2c_id) { struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); struct max8952_platform_data *pdata = dev_get_platdata(&client->dev); struct regulator_config config = { }; struct max8952_data *max8952; struct regulator_dev *rdev; int ret = 0, err = 0; if (client->dev.of_node) pdata = max8952_parse_dt(&client->dev); if (!pdata) { dev_err(&client->dev, "Require the platform data\n"); return -EINVAL; } if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE)) return -EIO; max8952 = devm_kzalloc(&client->dev, sizeof(struct max8952_data), GFP_KERNEL); if (!max8952) return -ENOMEM; max8952->client = client; max8952->pdata = pdata; config.dev = &client->dev; config.init_data = pdata->reg_data; config.driver_data = max8952; config.of_node = client->dev.of_node; config.ena_gpio = pdata->gpio_en; if (client->dev.of_node) config.ena_gpio_initialized = true; if (pdata->reg_data->constraints.boot_on) config.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH; rdev = devm_regulator_register(&client->dev, ®ulator, &config); if (IS_ERR(rdev)) { ret = PTR_ERR(rdev); dev_err(&client->dev, "regulator init failed (%d)\n", ret); return ret; } max8952->vid0 = pdata->default_mode & 0x1; max8952->vid1 = (pdata->default_mode >> 1) & 0x1; if (gpio_is_valid(pdata->gpio_vid0) && gpio_is_valid(pdata->gpio_vid1)) { unsigned long gpio_flags; gpio_flags = max8952->vid0 ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; if (devm_gpio_request_one(&client->dev, pdata->gpio_vid0, gpio_flags, "MAX8952 VID0")) err = 1; gpio_flags = max8952->vid1 ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; if (devm_gpio_request_one(&client->dev, pdata->gpio_vid1, gpio_flags, "MAX8952 VID1")) err = 2; } else err = 3; if (err) { dev_warn(&client->dev, "VID0/1 gpio invalid: " "DVS not available.\n"); max8952->vid0 = 0; max8952->vid1 = 0; /* Mark invalid */ pdata->gpio_vid0 = -1; pdata->gpio_vid1 = -1; /* Disable Pulldown of EN only */ max8952_write_reg(max8952, MAX8952_REG_CONTROL, 0x60); dev_err(&client->dev, "DVS modes disabled because VID0 and VID1" " do not have proper controls.\n"); } else { /* * Disable Pulldown on EN, VID0, VID1 to reduce * leakage current of MAX8952 assuming that MAX8952 * is turned on (EN==1). Note that without having VID0/1 * properly connected, turning pulldown off can be * problematic. Thus, turn this off only when they are * controllable by GPIO. */ max8952_write_reg(max8952, MAX8952_REG_CONTROL, 0x0); } max8952_write_reg(max8952, MAX8952_REG_MODE0, (max8952_read_reg(max8952, MAX8952_REG_MODE0) & 0xC0) | (pdata->dvs_mode[0] & 0x3F)); max8952_write_reg(max8952, MAX8952_REG_MODE1, (max8952_read_reg(max8952, MAX8952_REG_MODE1) & 0xC0) | (pdata->dvs_mode[1] & 0x3F)); max8952_write_reg(max8952, MAX8952_REG_MODE2, (max8952_read_reg(max8952, MAX8952_REG_MODE2) & 0xC0) | (pdata->dvs_mode[2] & 0x3F)); max8952_write_reg(max8952, MAX8952_REG_MODE3, (max8952_read_reg(max8952, MAX8952_REG_MODE3) & 0xC0) | (pdata->dvs_mode[3] & 0x3F)); max8952_write_reg(max8952, MAX8952_REG_SYNC, (max8952_read_reg(max8952, MAX8952_REG_SYNC) & 0x3F) | ((pdata->sync_freq & 0x3) << 6)); max8952_write_reg(max8952, MAX8952_REG_RAMP, (max8952_read_reg(max8952, MAX8952_REG_RAMP) & 0x1F) | ((pdata->ramp_speed & 0x7) << 5)); i2c_set_clientdata(client, max8952); return 0; }
static int tps51632_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct tps51632_regulator_platform_data *pdata; struct regulator_dev *rdev; struct tps51632_chip *tps; int ret; struct regulator_config config = { }; if (client->dev.of_node) { const struct of_device_id *match; match = of_match_device(of_match_ptr(tps51632_of_match), &client->dev); if (!match) { dev_err(&client->dev, "Error: No device match found\n"); return -ENODEV; } } tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); if (!tps) return -ENOMEM; tps->dev = &client->dev; tps->desc.name = client->name; tps->desc.id = 0; tps->desc.ramp_delay = TPS51632_DEFAULT_RAMP_DELAY; tps->desc.min_uV = TPS51632_MIN_VOLTAGE; tps->desc.uV_step = TPS51632_VOLTAGE_STEP_10mV; tps->desc.linear_min_sel = TPS51632_MIN_VSEL; tps->desc.n_voltages = TPS51632_MAX_VSEL + 1; tps->desc.ops = &tps51632_dcdc_ops; tps->desc.type = REGULATOR_VOLTAGE; tps->desc.owner = THIS_MODULE; pdata = dev_get_platdata(&client->dev); if (!pdata && client->dev.of_node) pdata = of_get_tps51632_platform_data(&client->dev, &tps->desc); if (!pdata) { dev_err(&client->dev, "No Platform data\n"); return -EINVAL; } if (pdata->enable_pwm_dvfs) { if ((pdata->base_voltage_uV < TPS51632_MIN_VOLTAGE) || (pdata->base_voltage_uV > TPS51632_MAX_VOLTAGE)) { dev_err(&client->dev, "Invalid base_voltage_uV setting\n"); return -EINVAL; } if ((pdata->max_voltage_uV) && ((pdata->max_voltage_uV < TPS51632_MIN_VOLTAGE) || (pdata->max_voltage_uV > TPS51632_MAX_VOLTAGE))) { dev_err(&client->dev, "Invalid max_voltage_uV setting\n"); return -EINVAL; } } if (pdata->enable_pwm_dvfs) tps->desc.vsel_reg = TPS51632_VOLTAGE_BASE_REG; else tps->desc.vsel_reg = TPS51632_VOLTAGE_SELECT_REG; tps->desc.vsel_mask = TPS51632_VOUT_MASK; tps->regmap = devm_regmap_init_i2c(client, &tps51632_regmap_config); if (IS_ERR(tps->regmap)) { ret = PTR_ERR(tps->regmap); dev_err(&client->dev, "regmap init failed, err %d\n", ret); return ret; } i2c_set_clientdata(client, tps); ret = tps51632_init_dcdc(tps, pdata); if (ret < 0) { dev_err(tps->dev, "Init failed, err = %d\n", ret); return ret; } /* Register the regulators */ config.dev = &client->dev; config.init_data = pdata->reg_init_data; config.driver_data = tps; config.regmap = tps->regmap; config.of_node = client->dev.of_node; rdev = devm_regulator_register(&client->dev, &tps->desc, &config); if (IS_ERR(rdev)) { dev_err(tps->dev, "regulator register failed\n"); return PTR_ERR(rdev); } tps->rdev = rdev; return 0; }
static int tps6586x_regulator_probe(struct platform_device *pdev) { struct tps6586x_regulator *ri = NULL; struct regulator_config config = { }; struct regulator_dev **rdev; struct regulator_init_data *reg_data; struct tps6586x_platform_data *pdata; struct of_regulator_match *tps6586x_reg_matches = NULL; int version; int id; int err; dev_dbg(&pdev->dev, "Probing regulator\n"); pdata = dev_get_platdata(pdev->dev.parent); if ((!pdata) && (pdev->dev.parent->of_node)) pdata = tps6586x_parse_regulator_dt(pdev, &tps6586x_reg_matches); if (!pdata) { dev_err(&pdev->dev, "Platform data not available, exiting\n"); return -ENODEV; } rdev = devm_kzalloc(&pdev->dev, TPS6586X_ID_MAX_REGULATOR * sizeof(*rdev), GFP_KERNEL); if (!rdev) { dev_err(&pdev->dev, "Mmemory alloc failed\n"); return -ENOMEM; } version = tps6586x_get_version(pdev->dev.parent); for (id = 0; id < TPS6586X_ID_MAX_REGULATOR; ++id) { reg_data = pdata->reg_init_data[id]; ri = find_regulator_info(id, version); if (!ri) { dev_err(&pdev->dev, "invalid regulator ID specified\n"); return -EINVAL; } err = tps6586x_regulator_preinit(pdev->dev.parent, ri); if (err) { dev_err(&pdev->dev, "regulator %d preinit failed, e %d\n", id, err); return err; } config.dev = pdev->dev.parent; config.init_data = reg_data; config.driver_data = ri; if (tps6586x_reg_matches) config.of_node = tps6586x_reg_matches[id].of_node; rdev[id] = devm_regulator_register(&pdev->dev, &ri->desc, &config); if (IS_ERR(rdev[id])) { dev_err(&pdev->dev, "failed to register regulator %s\n", ri->desc.name); return PTR_ERR(rdev[id]); } if (reg_data) { err = tps6586x_regulator_set_slew_rate(pdev, id, reg_data); if (err < 0) { dev_err(&pdev->dev, "Slew rate config failed, e %d\n", err); return err; } } } platform_set_drvdata(pdev, rdev); return 0; }
template = match->data; id = template->id; init_data = of_get_regulator_init_data(&pdev->dev, pdev->dev.of_node, ®ulators[id]); platform_set_drvdata(pdev, tps); tps->info[id] = &tps65218_pmic_regs[id]; config.dev = &pdev->dev; config.init_data = init_data; config.driver_data = tps; config.regmap = tps->regmap; config.of_node = pdev->dev.of_node; rdev = devm_regulator_register(&pdev->dev, ®ulators[id], &config); if (IS_ERR(rdev)) { dev_err(tps->dev, "failed to register %s regulator\n", pdev->name); return PTR_ERR(rdev); } return 0; } static struct platform_driver tps65218_regulator_driver = { .driver = { .name = "tps65218-pmic", .of_match_table = tps65218_of_match, }, .probe = tps65218_regulator_probe,
/** * ti_abb_probe() - Initialize an ABB ldo instance * @pdev: ABB platform device * * Initializes an individual ABB LDO for required Body-Bias. ABB is used to * addional bias supply to SoC modules for power savings or mandatory stability * configuration at certain Operating Performance Points(OPPs). * * Return: 0 on success or appropriate error value when fails */ static int ti_abb_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; const struct of_device_id *match; struct resource *res; struct ti_abb *abb; struct regulator_init_data *initdata = NULL; struct regulator_dev *rdev = NULL; struct regulator_desc *desc; struct regulation_constraints *c; struct regulator_config config = { }; char *pname; int ret = 0; match = of_match_device(ti_abb_of_match, dev); if (!match) { /* We do not expect this to happen */ dev_err(dev, "%s: Unable to match device\n", __func__); return -ENODEV; } if (!match->data) { dev_err(dev, "%s: Bad data in match\n", __func__); return -EINVAL; } abb = devm_kzalloc(dev, sizeof(struct ti_abb), GFP_KERNEL); if (!abb) return -ENOMEM; abb->regs = match->data; /* Map ABB resources */ if (abb->regs->setup_off || abb->regs->control_off) { pname = "base-address"; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, pname); abb->base = devm_ioremap_resource(dev, res); if (IS_ERR(abb->base)) return PTR_ERR(abb->base); abb->setup_reg = abb->base + abb->regs->setup_off; abb->control_reg = abb->base + abb->regs->control_off; } else { pname = "control-address"; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, pname); abb->control_reg = devm_ioremap_resource(dev, res); if (IS_ERR(abb->control_reg)) return PTR_ERR(abb->control_reg); pname = "setup-address"; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, pname); abb->setup_reg = devm_ioremap_resource(dev, res); if (IS_ERR(abb->setup_reg)) return PTR_ERR(abb->setup_reg); } pname = "int-address"; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, pname); if (!res) { dev_err(dev, "Missing '%s' IO resource\n", pname); return -ENODEV; } /* * We may have shared interrupt register offsets which are * write-1-to-clear between domains ensuring exclusivity. */ abb->int_base = devm_ioremap_nocache(dev, res->start, resource_size(res)); if (!abb->int_base) { dev_err(dev, "Unable to map '%s'\n", pname); return -ENOMEM; } /* Map Optional resources */ pname = "efuse-address"; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, pname); if (!res) { dev_dbg(dev, "Missing '%s' IO resource\n", pname); ret = -ENODEV; goto skip_opt; } /* * We may have shared efuse register offsets which are read-only * between domains */ abb->efuse_base = devm_ioremap_nocache(dev, res->start, resource_size(res)); if (!abb->efuse_base) { dev_err(dev, "Unable to map '%s'\n", pname); return -ENOMEM; } pname = "ldo-address"; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, pname); if (!res) { dev_dbg(dev, "Missing '%s' IO resource\n", pname); ret = -ENODEV; goto skip_opt; } abb->ldo_base = devm_ioremap_resource(dev, res); if (IS_ERR(abb->ldo_base)) return PTR_ERR(abb->ldo_base); /* IF ldo_base is set, the following are mandatory */ pname = "ti,ldovbb-override-mask"; ret = of_property_read_u32(pdev->dev.of_node, pname, &abb->ldovbb_override_mask); if (ret) { dev_err(dev, "Missing '%s' (%d)\n", pname, ret); return ret; } if (!abb->ldovbb_override_mask) { dev_err(dev, "Invalid property:'%s' set as 0!\n", pname); return -EINVAL; } pname = "ti,ldovbb-vset-mask"; ret = of_property_read_u32(pdev->dev.of_node, pname, &abb->ldovbb_vset_mask); if (ret) { dev_err(dev, "Missing '%s' (%d)\n", pname, ret); return ret; } if (!abb->ldovbb_vset_mask) { dev_err(dev, "Invalid property:'%s' set as 0!\n", pname); return -EINVAL; } skip_opt: pname = "ti,tranxdone-status-mask"; ret = of_property_read_u32(pdev->dev.of_node, pname, &abb->txdone_mask); if (ret) { dev_err(dev, "Missing '%s' (%d)\n", pname, ret); return ret; } if (!abb->txdone_mask) { dev_err(dev, "Invalid property:'%s' set as 0!\n", pname); return -EINVAL; } initdata = of_get_regulator_init_data(dev, pdev->dev.of_node, &abb->rdesc); if (!initdata) { dev_err(dev, "%s: Unable to alloc regulator init data\n", __func__); return -ENOMEM; } /* init ABB opp_sel table */ ret = ti_abb_init_table(dev, abb, initdata); if (ret) return ret; /* init ABB timing */ ret = ti_abb_init_timings(dev, abb); if (ret) return ret; desc = &abb->rdesc; desc->name = dev_name(dev); desc->owner = THIS_MODULE; desc->type = REGULATOR_VOLTAGE; desc->ops = &ti_abb_reg_ops; c = &initdata->constraints; if (desc->n_voltages > 1) c->valid_ops_mask |= REGULATOR_CHANGE_VOLTAGE; c->always_on = true; config.dev = dev; config.init_data = initdata; config.driver_data = abb; config.of_node = pdev->dev.of_node; rdev = devm_regulator_register(dev, desc, &config); if (IS_ERR(rdev)) { ret = PTR_ERR(rdev); dev_err(dev, "%s: failed to register regulator(%d)\n", __func__, ret); return ret; } platform_set_drvdata(pdev, rdev); /* Enable the ldo if not already done by bootloader */ ti_abb_rmw(abb->regs->sr2_en_mask, 1, abb->setup_reg); return 0; }
static int max1586_pmic_probe(struct i2c_client *client, const struct i2c_device_id *i2c_id) { struct max1586_platform_data *pdata, pdata_of; struct regulator_config config = { }; struct max1586_data *max1586; int i, id, ret; const struct of_device_id *match; pdata = dev_get_platdata(&client->dev); if (client->dev.of_node && !pdata) { match = of_match_device(of_match_ptr(max1586_of_match), &client->dev); if (!match) { dev_err(&client->dev, "Error: No device match found\n"); return -ENODEV; } ret = of_get_max1586_platform_data(&client->dev, &pdata_of); if (ret < 0) return ret; pdata = &pdata_of; } max1586 = devm_kzalloc(&client->dev, sizeof(struct max1586_data), GFP_KERNEL); if (!max1586) return -ENOMEM; max1586->client = client; if (!pdata->v3_gain) return -EINVAL; max1586->min_uV = MAX1586_V3_MIN_UV / 1000 * pdata->v3_gain / 1000; max1586->max_uV = MAX1586_V3_MAX_UV / 1000 * pdata->v3_gain / 1000; /* Set curr_sel to default voltage on power-up */ max1586->v3_curr_sel = 24; /* 1.3V */ max1586->v6_curr_sel = 0; for (i = 0; i < pdata->num_subdevs && i <= MAX1586_V6; i++) { struct regulator_dev *rdev; id = pdata->subdevs[i].id; if (!pdata->subdevs[i].platform_data) continue; if (id < MAX1586_V3 || id > MAX1586_V6) { dev_err(&client->dev, "invalid regulator id %d\n", id); return -EINVAL; } if (id == MAX1586_V3) { max1586_reg[id].min_uV = max1586->min_uV; max1586_reg[id].uV_step = (max1586->max_uV - max1586->min_uV) / MAX1586_V3_MAX_VSEL; } config.dev = &client->dev; config.init_data = pdata->subdevs[i].platform_data; config.driver_data = max1586; rdev = devm_regulator_register(&client->dev, &max1586_reg[id], &config); if (IS_ERR(rdev)) { dev_err(&client->dev, "failed to register %s\n", max1586_reg[id].name); return PTR_ERR(rdev); } } i2c_set_clientdata(client, max1586); dev_info(&client->dev, "Maxim 1586 regulator driver loaded\n"); return 0; }
static int palmas_smps_registration(struct palmas_pmic *pmic, struct palmas_pmic_driver_data *ddata, struct palmas_pmic_platform_data *pdata, const char *pdev_name, struct regulator_config config) { int id, ret; unsigned int addr, reg; struct regulator_dev *rdev; struct palmas_reg_init *reg_init; struct palmas_regs_info *rinfo; struct regulator_desc *desc; for (id = ddata->smps_start; id <= ddata->smps_end; id++) { bool ramp_delay_support = false; /* * Miss out regulators which are not available due * to slaving configurations. */ switch (id) { case PALMAS_REG_SMPS12: case PALMAS_REG_SMPS3: if (pmic->smps123) continue; if (id == PALMAS_REG_SMPS12) ramp_delay_support = true; break; case PALMAS_REG_SMPS123: if (!pmic->smps123) continue; ramp_delay_support = true; break; case PALMAS_REG_SMPS45: case PALMAS_REG_SMPS7: if (pmic->smps457) continue; if (id == PALMAS_REG_SMPS45) ramp_delay_support = true; break; case PALMAS_REG_SMPS457: if (!pmic->smps457) continue; ramp_delay_support = true; break; case PALMAS_REG_SMPS10_OUT1: case PALMAS_REG_SMPS10_OUT2: if (!PALMAS_PMIC_HAS(pmic->palmas, SMPS10_BOOST)) continue; } rinfo = &ddata->palmas_regs_info[id]; desc = &pmic->desc[id]; if ((id == PALMAS_REG_SMPS6) || (id == PALMAS_REG_SMPS8)) ramp_delay_support = true; if (ramp_delay_support) { addr = rinfo->tstep_addr; ret = palmas_smps_read(pmic->palmas, addr, ®); if (ret < 0) { dev_err(pmic->dev, "reading TSTEP reg failed: %d\n", ret); return ret; } desc->ramp_delay = palmas_smps_ramp_delay[reg & 0x3]; pmic->ramp_delay[id] = desc->ramp_delay; } /* Initialise sleep/init values from platform data */ if (pdata && pdata->reg_init[id]) { reg_init = pdata->reg_init[id]; ret = palmas_smps_init(pmic->palmas, id, reg_init); if (ret) return ret; } else { reg_init = NULL; } /* Register the regulators */ desc->name = rinfo->name; desc->id = id; switch (id) { case PALMAS_REG_SMPS10_OUT1: case PALMAS_REG_SMPS10_OUT2: desc->n_voltages = PALMAS_SMPS10_NUM_VOLTAGES; desc->ops = &palmas_ops_smps10; desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, PALMAS_SMPS10_CTRL); desc->vsel_mask = SMPS10_VSEL; desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, PALMAS_SMPS10_CTRL); if (id == PALMAS_REG_SMPS10_OUT1) desc->enable_mask = SMPS10_SWITCH_EN; else desc->enable_mask = SMPS10_BOOST_EN; desc->bypass_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, PALMAS_SMPS10_CTRL); desc->bypass_mask = SMPS10_BYPASS_EN; desc->min_uV = 3750000; desc->uV_step = 1250000; break; default: /* * Read and store the RANGE bit for later use * This must be done before regulator is probed, * otherwise we error in probe with unsupportable * ranges. Read the current smps mode for later use. */ addr = rinfo->vsel_addr; desc->n_linear_ranges = 3; ret = palmas_smps_read(pmic->palmas, addr, ®); if (ret) return ret; if (reg & PALMAS_SMPS12_VOLTAGE_RANGE) pmic->range[id] = 1; if (pmic->range[id]) desc->linear_ranges = smps_high_ranges; else desc->linear_ranges = smps_low_ranges; if (reg_init && reg_init->roof_floor) desc->ops = &palmas_ops_ext_control_smps; else desc->ops = &palmas_ops_smps; desc->n_voltages = PALMAS_SMPS_NUM_VOLTAGES; desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, rinfo->vsel_addr); desc->vsel_mask = PALMAS_SMPS12_VOLTAGE_VSEL_MASK; /* Read the smps mode for later use. */ addr = rinfo->ctrl_addr; ret = palmas_smps_read(pmic->palmas, addr, ®); if (ret) return ret; pmic->current_reg_mode[id] = reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, rinfo->ctrl_addr); desc->enable_mask = PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; /* set_mode overrides this value */ desc->enable_val = SMPS_CTRL_MODE_ON; } desc->type = REGULATOR_VOLTAGE; desc->owner = THIS_MODULE; if (pdata) config.init_data = pdata->reg_data[id]; else config.init_data = NULL; desc->supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; rdev = devm_regulator_register(pmic->dev, desc, &config); if (IS_ERR(rdev)) { dev_err(pmic->dev, "failed to register %s regulator\n", pdev_name); return PTR_ERR(rdev); } /* Save regulator for cleanup */ pmic->rdev[id] = rdev; } return 0; }
static int axp20x_regulator_probe(struct platform_device *pdev) { struct regulator_dev *rdev; struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent); const struct regulator_desc *regulators; struct regulator_config config = { .dev = pdev->dev.parent, .regmap = axp20x->regmap, .driver_data = axp20x, }; int ret, i, nregulators; u32 workmode; switch (axp20x->variant) { case AXP202_ID: case AXP209_ID: regulators = axp20x_regulators; nregulators = AXP20X_REG_ID_MAX; break; case AXP221_ID: regulators = axp22x_regulators; nregulators = AXP22X_REG_ID_MAX; break; default: dev_err(&pdev->dev, "Unsupported AXP variant: %ld\n", axp20x->variant); return -EINVAL; } /* This only sets the dcdc freq. Ignore any errors */ axp20x_regulator_parse_dt(pdev); for (i = 0; i < nregulators; i++) { rdev = devm_regulator_register(&pdev->dev, ®ulators[i], &config); if (IS_ERR(rdev)) { dev_err(&pdev->dev, "Failed to register %s\n", regulators[i].name); return PTR_ERR(rdev); } ret = of_property_read_u32(rdev->dev.of_node, "x-powers,dcdc-workmode", &workmode); if (!ret) { if (axp20x_set_dcdc_workmode(rdev, i, workmode)) dev_err(&pdev->dev, "Failed to set workmode on %s\n", rdev->desc->name); } } return 0; } static struct platform_driver axp20x_regulator_driver = { .probe = axp20x_regulator_probe, .driver = { .name = "axp20x-regulator", }, }; module_platform_driver(axp20x_regulator_driver); MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("Carlo Caione <*****@*****.**>"); MODULE_DESCRIPTION("Regulator Driver for AXP20X PMIC");
static int palmas_ldo_registration(struct palmas_pmic *pmic, struct palmas_pmic_driver_data *ddata, struct palmas_pmic_platform_data *pdata, const char *pdev_name, struct regulator_config config) { int id, ret; struct regulator_dev *rdev; struct palmas_reg_init *reg_init; struct palmas_regs_info *rinfo; struct regulator_desc *desc; for (id = ddata->ldo_begin; id < ddata->max_reg; id++) { if (pdata && pdata->reg_init[id]) reg_init = pdata->reg_init[id]; else reg_init = NULL; rinfo = &ddata->palmas_regs_info[id]; /* Miss out regulators which are not available due * to alternate functions. */ /* Register the regulators */ desc = &pmic->desc[id]; desc->name = rinfo->name; desc->id = id; desc->type = REGULATOR_VOLTAGE; desc->owner = THIS_MODULE; if (id < PALMAS_REG_REGEN1) { desc->n_voltages = PALMAS_LDO_NUM_VOLTAGES; if (reg_init && reg_init->roof_floor) desc->ops = &palmas_ops_ext_control_ldo; else desc->ops = &palmas_ops_ldo; desc->min_uV = 900000; desc->uV_step = 50000; desc->linear_min_sel = 1; desc->enable_time = 500; desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, rinfo->vsel_addr); desc->vsel_mask = PALMAS_LDO1_VOLTAGE_VSEL_MASK; desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, rinfo->ctrl_addr); desc->enable_mask = PALMAS_LDO1_CTRL_MODE_ACTIVE; /* Check if LDO8 is in tracking mode or not */ if (pdata && (id == PALMAS_REG_LDO8) && pdata->enable_ldo8_tracking) { palmas_enable_ldo8_track(pmic->palmas); desc->min_uV = 450000; desc->uV_step = 25000; } /* LOD6 in vibrator mode will have enable time 2000us */ if (pdata && pdata->ldo6_vibrator && (id == PALMAS_REG_LDO6)) desc->enable_time = 2000; } else { if (!ddata->has_regen3 && id == PALMAS_REG_REGEN3) continue; desc->n_voltages = 1; if (reg_init && reg_init->roof_floor) desc->ops = &palmas_ops_ext_control_extreg; else desc->ops = &palmas_ops_extreg; desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, rinfo->ctrl_addr); desc->enable_mask = PALMAS_REGEN1_CTRL_MODE_ACTIVE; } if (pdata) config.init_data = pdata->reg_data[id]; else config.init_data = NULL; desc->supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; rdev = devm_regulator_register(pmic->dev, desc, &config); if (IS_ERR(rdev)) { dev_err(pmic->dev, "failed to register %s regulator\n", pdev_name); return PTR_ERR(rdev); } /* Save regulator for cleanup */ pmic->rdev[id] = rdev; /* Initialise sleep/init values from platform data */ if (pdata) { reg_init = pdata->reg_init[id]; if (reg_init) { if (id <= ddata->ldo_end) ret = palmas_ldo_init(pmic->palmas, id, reg_init); else ret = palmas_extreg_init(pmic->palmas, id, reg_init); if (ret) return ret; } } } return 0; }
static int pwm_regulator_probe(struct platform_device *pdev) { struct pwm_regulator_data *drvdata; struct property *prop; struct regulator_dev *regulator; struct regulator_config config = { }; struct device_node *np = pdev->dev.of_node; int length, ret; if (!np) { dev_err(&pdev->dev, "Device Tree node missing\n"); return -EINVAL; } drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; memcpy(&drvdata->desc, &pwm_regulator_desc, sizeof(pwm_regulator_desc)); /* determine the number of voltage-table */ prop = of_find_property(np, "voltage-table", &length); if (!prop) { dev_err(&pdev->dev, "No voltage-table\n"); return -EINVAL; } if ((length < sizeof(*drvdata->duty_cycle_table)) || (length % sizeof(*drvdata->duty_cycle_table))) { dev_err(&pdev->dev, "voltage-table length(%d) is invalid\n", length); return -EINVAL; } drvdata->desc.n_voltages = length / sizeof(*drvdata->duty_cycle_table); drvdata->duty_cycle_table = devm_kzalloc(&pdev->dev, length, GFP_KERNEL); if (!drvdata->duty_cycle_table) return -ENOMEM; /* read voltage table from DT property */ ret = of_property_read_u32_array(np, "voltage-table", (u32 *)drvdata->duty_cycle_table, length / sizeof(u32)); if (ret < 0) { dev_err(&pdev->dev, "read voltage-table failed\n"); return ret; } config.init_data = of_get_regulator_init_data(&pdev->dev, np, &drvdata->desc); if (!config.init_data) return -ENOMEM; config.of_node = np; config.dev = &pdev->dev; config.driver_data = drvdata; drvdata->pwm = devm_pwm_get(&pdev->dev, NULL); if (IS_ERR(drvdata->pwm)) { dev_err(&pdev->dev, "Failed to get PWM\n"); return PTR_ERR(drvdata->pwm); } regulator = devm_regulator_register(&pdev->dev, &drvdata->desc, &config); if (IS_ERR(regulator)) { dev_err(&pdev->dev, "Failed to register regulator %s\n", drvdata->desc.name); return PTR_ERR(regulator); } return 0; }
static int ltc3676_regulator_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct device *dev = &client->dev; struct regulator_init_data *init_data = dev_get_platdata(dev); struct regulator_desc *descs; struct ltc3676 *ltc3676; int i, ret; ltc3676 = devm_kzalloc(dev, sizeof(*ltc3676), GFP_KERNEL); if (!ltc3676) return -ENOMEM; i2c_set_clientdata(client, ltc3676); ltc3676->dev = dev; descs = ltc3676->regulator_descs; memcpy(descs, ltc3676_regulators, sizeof(ltc3676_regulators)); descs[LTC3676_LDO3].fixed_uV = 1800000; /* LDO3 is fixed 1.8V */ ltc3676->regmap = devm_regmap_init_i2c(client, <c3676_regmap_config); if (IS_ERR(ltc3676->regmap)) { ret = PTR_ERR(ltc3676->regmap); dev_err(dev, "failed to initialize regmap: %d\n", ret); return ret; } for (i = 0; i < LTC3676_NUM_REGULATORS; i++) { struct regulator_desc *desc = <c3676->regulator_descs[i]; struct regulator_config config = { }; if (init_data) config.init_data = &init_data[i]; config.dev = dev; config.driver_data = ltc3676; ltc3676->regulators[i] = devm_regulator_register(dev, desc, &config); if (IS_ERR(ltc3676->regulators[i])) { ret = PTR_ERR(ltc3676->regulators[i]); dev_err(dev, "failed to register regulator %s: %d\n", desc->name, ret); return ret; } } regmap_write(ltc3676->regmap, LTC3676_CLIRQ, 0); if (client->irq) { ret = devm_request_threaded_irq(dev, client->irq, NULL, ltc3676_isr, IRQF_TRIGGER_LOW | IRQF_ONESHOT, client->name, ltc3676); if (ret) { dev_err(dev, "Failed to request IRQ: %d\n", ret); return ret; } } return 0; }
static int bcm590xx_probe(struct platform_device *pdev) { struct bcm590xx *bcm590xx = dev_get_drvdata(pdev->dev.parent); struct bcm590xx_board *pmu_data = NULL; struct bcm590xx_reg *pmu; struct regulator_config config = { }; struct bcm590xx_info *info; struct regulator_init_data *reg_data; struct regulator_dev *rdev; struct of_regulator_match *bcm590xx_reg_matches = NULL; int i; pmu_data = bcm590xx_parse_dt_reg_data(pdev, &bcm590xx_reg_matches); pmu = devm_kzalloc(&pdev->dev, sizeof(*pmu), GFP_KERNEL); if (!pmu) { dev_err(&pdev->dev, "Memory allocation failed for pmu\n"); return -ENOMEM; } pmu->mfd = bcm590xx; platform_set_drvdata(pdev, pmu); pmu->desc = devm_kzalloc(&pdev->dev, BCM590XX_NUM_REGS * sizeof(struct regulator_desc), GFP_KERNEL); if (!pmu->desc) { dev_err(&pdev->dev, "Memory alloc fails for desc\n"); return -ENOMEM; } pmu->info = devm_kzalloc(&pdev->dev, BCM590XX_NUM_REGS * sizeof(struct bcm590xx_info *), GFP_KERNEL); if (!pmu->info) { dev_err(&pdev->dev, "Memory alloc fails for info\n"); return -ENOMEM; } info = bcm590xx_regs; for (i = 0; i < BCM590XX_NUM_REGS; i++, info++) { if (pmu_data) reg_data = pmu_data->bcm590xx_pmu_init_data[i]; else reg_data = NULL; /* Register the regulators */ pmu->info[i] = info; pmu->desc[i].name = info->name; pmu->desc[i].supply_name = info->vin_name; pmu->desc[i].id = i; pmu->desc[i].volt_table = info->volt_table; pmu->desc[i].n_voltages = info->n_voltages; pmu->desc[i].linear_ranges = info->linear_ranges; pmu->desc[i].n_linear_ranges = info->n_linear_ranges; if (BCM590XX_REG_IS_LDO(i)) { pmu->desc[i].ops = &bcm590xx_ops_ldo; pmu->desc[i].vsel_mask = BCM590XX_LDO_VSEL_MASK; } else { pmu->desc[i].ops = &bcm590xx_ops_dcdc; pmu->desc[i].vsel_mask = BCM590XX_SR_VSEL_MASK; } pmu->desc[i].vsel_reg = bcm590xx_get_vsel_register(i); pmu->desc[i].enable_is_inverted = true; pmu->desc[i].enable_mask = BCM590XX_REG_ENABLE; pmu->desc[i].enable_reg = bcm590xx_get_enable_register(i); pmu->desc[i].type = REGULATOR_VOLTAGE; pmu->desc[i].owner = THIS_MODULE; config.dev = bcm590xx->dev; config.init_data = reg_data; config.driver_data = pmu; config.regmap = bcm590xx->regmap; if (bcm590xx_reg_matches) config.of_node = bcm590xx_reg_matches[i].of_node; rdev = devm_regulator_register(&pdev->dev, &pmu->desc[i], &config); if (IS_ERR(rdev)) { dev_err(bcm590xx->dev, "failed to register %s regulator\n", pdev->name); return PTR_ERR(rdev); } } return 0; }
static int tps65132_probe(struct i2c_client *client, const struct i2c_device_id *client_id) { struct device *dev = &client->dev; struct tps65132_regulator_pdata *rpdata; struct regulator_config config = { }; struct regulator_desc *rdesc; struct tps65132_regulator *tps; int id; int ret; tps = devm_kzalloc(dev, sizeof(*tps), GFP_KERNEL); if (!tps) { dev_err(dev, "memory alloc failed\n"); return -ENOMEM; } ret = tps65132_get_regulator_dt_data(dev, tps); if (ret == -EPROBE_DEFER) { dev_err(dev, "Probe deffered\n"); return ret; } else if (ret < 0) { dev_err(dev, "Reading data from DT failed: %d\n", ret); return ret; } tps->rmap = devm_regmap_init_i2c(client, &tps65132_regmap_config); if (IS_ERR(tps->rmap)) { ret = PTR_ERR(tps->rmap); dev_err(dev, "regmap init failed: %d\n", ret); return ret; } i2c_set_clientdata(client, tps); tps->dev = dev; for (id = 0; id < TPS65132_MAX_REGULATORS; ++id) { rdesc = &tps65132_regs_desc[id]; tps->rdesc[id] = rdesc; rpdata = &tps->reg_pdata[id]; config.regmap = tps->rmap; config.dev = dev; config.init_data = rpdata->ridata; config.driver_data = tps; config.of_node = tps65132_regulator_matches[id].of_node; if (gpio_is_valid(rpdata->enable_gpio)) { config.ena_gpio = rpdata->enable_gpio; if (rpdata->ridata && (rpdata->ridata->constraints.always_on || rpdata->ridata->constraints.boot_on)) config.ena_gpio_flags = GPIOF_OUT_INIT_HIGH; } if (gpio_is_valid(rpdata->active_discharge_gpio)) { ret = devm_gpio_request_one(dev, rpdata->active_discharge_gpio, GPIOF_OUT_INIT_LOW, rdesc->name); if (ret < 0) { dev_err(dev, "act dis gpio req failed for %s: %d\n", rdesc->name, ret); return ret; } } else { dev_info(dev, "No active discharge gpio for regulator %s\n", rdesc->name); } tps->rdev[id] = devm_regulator_register(dev, rdesc, &config); if (IS_ERR(tps->rdev[id])) { ret = PTR_ERR(tps->rdev[id]); dev_err(dev, "regulator %s register failed: %d\n", rdesc->name, ret); return ret; } } return 0; }
static int max8973_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct max8973_regulator_platform_data *pdata; struct regulator_config config = { }; struct regulator_dev *rdev; struct max8973_chip *max; int ret; pdata = dev_get_platdata(&client->dev); if (!pdata && !client->dev.of_node) { dev_err(&client->dev, "No Platform data"); return -EIO; } max = devm_kzalloc(&client->dev, sizeof(*max), GFP_KERNEL); if (!max) return -ENOMEM; max->regmap = devm_regmap_init_i2c(client, &max8973_regmap_config); if (IS_ERR(max->regmap)) { ret = PTR_ERR(max->regmap); dev_err(&client->dev, "regmap init failed, err %d\n", ret); return ret; } i2c_set_clientdata(client, max); max->ops = max8973_dcdc_ops; max->dev = &client->dev; max->desc.name = id->name; max->desc.id = 0; max->desc.ops = &max->ops; max->desc.type = REGULATOR_VOLTAGE; max->desc.owner = THIS_MODULE; max->desc.min_uV = MAX8973_MIN_VOLATGE; max->desc.uV_step = MAX8973_VOLATGE_STEP; max->desc.n_voltages = MAX8973_BUCK_N_VOLTAGE; if (!pdata || !pdata->enable_ext_control) { max->desc.enable_reg = MAX8973_VOUT; max->desc.enable_mask = MAX8973_VOUT_ENABLE; max->ops.enable = regulator_enable_regmap; max->ops.disable = regulator_disable_regmap; max->ops.is_enabled = regulator_is_enabled_regmap; } if (pdata) { max->dvs_gpio = pdata->dvs_gpio; max->enable_external_control = pdata->enable_ext_control; max->curr_gpio_val = pdata->dvs_def_state; max->curr_vout_reg = MAX8973_VOUT + pdata->dvs_def_state; } else { max->dvs_gpio = -EINVAL; max->curr_vout_reg = MAX8973_VOUT; } max->lru_index[0] = max->curr_vout_reg; if (gpio_is_valid(max->dvs_gpio)) { int gpio_flags; int i; gpio_flags = (pdata->dvs_def_state) ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; ret = devm_gpio_request_one(&client->dev, max->dvs_gpio, gpio_flags, "max8973-dvs"); if (ret) { dev_err(&client->dev, "gpio_request for gpio %d failed, err = %d\n", max->dvs_gpio, ret); return ret; } max->valid_dvs_gpio = true; /* * Initialize the lru index with vout_reg id * The index 0 will be most recently used and * set with the max->curr_vout_reg */ for (i = 0; i < MAX8973_MAX_VOUT_REG; ++i) max->lru_index[i] = i; max->lru_index[0] = max->curr_vout_reg; max->lru_index[max->curr_vout_reg] = 0; } else { max->valid_dvs_gpio = false; } if (pdata) { ret = max8973_init_dcdc(max, pdata); if (ret < 0) { dev_err(max->dev, "Max8973 Init failed, err = %d\n", ret); return ret; } } config.dev = &client->dev; config.init_data = pdata ? pdata->reg_init_data : of_get_regulator_init_data(&client->dev, client->dev.of_node, &max->desc); config.driver_data = max; config.of_node = client->dev.of_node; config.regmap = max->regmap; /* Register the regulators */ rdev = devm_regulator_register(&client->dev, &max->desc, &config); if (IS_ERR(rdev)) { ret = PTR_ERR(rdev); dev_err(max->dev, "regulator register failed, err %d\n", ret); return ret; } return 0; }
static int arizona_ldo1_probe(struct platform_device *pdev) { struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); const struct regulator_desc *desc; struct regulator_config config = { }; struct arizona_ldo1 *ldo1; int ret; arizona->external_dcvdd = false; ldo1 = devm_kzalloc(&pdev->dev, sizeof(*ldo1), GFP_KERNEL); if (!ldo1) return -ENOMEM; ldo1->arizona = arizona; /* * Since the chip usually supplies itself we provide some * default init_data for it. This will be overridden with * platform data if provided. */ switch (arizona->type) { case WM5102: case WM8997: desc = &arizona_ldo1_hc; ldo1->init_data = arizona_ldo1_dvfs; break; default: desc = &arizona_ldo1; ldo1->init_data = arizona_ldo1_default; break; } ldo1->init_data.consumer_supplies = &ldo1->supply; ldo1->supply.supply = "DCVDD"; ldo1->supply.dev_name = dev_name(arizona->dev); config.dev = arizona->dev; config.driver_data = ldo1; config.regmap = arizona->regmap; if (IS_ENABLED(CONFIG_OF)) { if (!dev_get_platdata(arizona->dev)) { ret = arizona_ldo1_of_get_pdata(arizona, &config); if (ret < 0) return ret; } } config.ena_gpio = arizona->pdata.ldoena; if (arizona->pdata.ldo1) config.init_data = arizona->pdata.ldo1; else config.init_data = &ldo1->init_data; /* * LDO1 can only be used to supply DCVDD so if it has no * consumers then DCVDD is supplied externally. */ if (config.init_data->num_consumer_supplies == 0) arizona->external_dcvdd = true; ldo1->regulator = devm_regulator_register(&pdev->dev, desc, &config); if (IS_ERR(ldo1->regulator)) { ret = PTR_ERR(ldo1->regulator); dev_err(arizona->dev, "Failed to register LDO1 supply: %d\n", ret); return ret; } of_node_put(config.of_node); platform_set_drvdata(pdev, ldo1); return 0; }
static int arizona_micsupp_probe(struct platform_device *pdev) { struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); const struct regulator_desc *desc; struct regulator_config config = { }; struct arizona_micsupp *micsupp; int ret; micsupp = devm_kzalloc(&pdev->dev, sizeof(*micsupp), GFP_KERNEL); if (micsupp == NULL) { dev_err(&pdev->dev, "Unable to allocate private data\n"); return -ENOMEM; } micsupp->arizona = arizona; INIT_WORK(&micsupp->check_cp_work, arizona_micsupp_check_cp); /* * Since the chip usually supplies itself we provide some * default init_data for it. This will be overridden with * platform data if provided. */ switch (arizona->type) { case WM5110: desc = &arizona_micsupp_ext; micsupp->init_data = arizona_micsupp_ext_default; break; default: desc = &arizona_micsupp; micsupp->init_data = arizona_micsupp_default; break; } micsupp->init_data.consumer_supplies = &micsupp->supply; micsupp->supply.supply = "MICVDD"; micsupp->supply.dev_name = dev_name(arizona->dev); config.dev = arizona->dev; config.driver_data = micsupp; config.regmap = arizona->regmap; if (arizona->pdata.micvdd) config.init_data = arizona->pdata.micvdd; else config.init_data = &micsupp->init_data; /* Default to regulated mode until the API supports bypass */ regmap_update_bits(arizona->regmap, ARIZONA_MIC_CHARGE_PUMP_1, ARIZONA_CPMIC_BYPASS, 0); micsupp->regulator = devm_regulator_register(&pdev->dev, desc, &config); if (IS_ERR(micsupp->regulator)) { ret = PTR_ERR(micsupp->regulator); dev_err(arizona->dev, "Failed to register mic supply: %d\n", ret); return ret; } platform_set_drvdata(pdev, micsupp); return 0; }