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; } 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; 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 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 = client->dev.platform_data; if (!pdata) { dev_err(&client->dev, "No Platform data"); return -EIO; } max = devm_kzalloc(&client->dev, sizeof(*max), GFP_KERNEL); if (!max) { dev_err(&client->dev, "Memory allocation for max failed\n"); 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->dev = &client->dev; max->desc.name = id->name; max->desc.id = 0; max->desc.ops = &max8973_dcdc_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->enable_ext_control) { max->desc.enable_reg = MAX8973_VOUT; max->desc.enable_mask = MAX8973_VOUT_ENABLE; max8973_dcdc_ops.enable = regulator_enable_regmap; max8973_dcdc_ops.disable = regulator_disable_regmap; max8973_dcdc_ops.is_enabled = regulator_is_enabled_regmap; } max->enable_external_control = pdata->enable_ext_control; max->dvs_gpio = pdata->dvs_gpio; max->curr_gpio_val = pdata->dvs_def_state; max->curr_vout_reg = MAX8973_VOUT + pdata->dvs_def_state; max->lru_index[0] = max->curr_vout_reg; max->valid_dvs_gpio = false; 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; } 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 = regulator_register(&max->desc, &config); if (IS_ERR(rdev)) { ret = PTR_ERR(rdev); dev_err(max->dev, "regulator register failed, err %d\n", ret); return ret; } max->rdev = rdev; return 0; }
static int __devinit max8973_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct max8973_regulator_platform_data *pdata; struct regulator_dev *rdev; struct max8973_chip *max; int ret; pdata = client->dev.platform_data; if (!pdata) { dev_err(&client->dev, "%s(): No Platform data", __func__); return -EIO; } max = devm_kzalloc(&client->dev, sizeof(*max), GFP_KERNEL); if (!max) { dev_err(&client->dev, "%s(): Memory allocation failed\n", __func__); return -ENOMEM; } max->dev = &client->dev; max->desc.name = id->name; max->desc.id = 0; max->desc.ops = &max8973_dcdc_ops; max->desc.type = REGULATOR_VOLTAGE; max->desc.owner = THIS_MODULE; max->regmap = devm_regmap_init_i2c(client, &max8973_regmap_config); if (IS_ERR(max->regmap)) { ret = PTR_ERR(max->regmap); dev_err(&client->dev, "%s(): regmap allocation failed with err %d\n", __func__, ret); return ret; } i2c_set_clientdata(client, max); max->enable_external_control = pdata->enable_ext_control; max->dvs_gpio = pdata->dvs_gpio; max->curr_gpio_val = pdata->dvs_def_state; max->curr_vout_reg = MAX8973_VOUT + pdata->dvs_def_state; max->lru_index[0] = max->curr_vout_reg; max->valid_dvs_gpio = false; 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 = gpio_request_one(max->dvs_gpio, gpio_flags, "max8973-dvs"); if (ret) { dev_err(&client->dev, "%s(): Could not obtain dvs GPIO %d: %d\n", __func__, 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; } ret = max8973_init_dcdc(max, pdata); if (ret < 0) { dev_err(max->dev, "%s(): Init failed with err = %d\n", __func__, ret); goto err_init; } /* Register the regulators */ rdev = regulator_register(&max->desc, &client->dev, pdata->reg_init_data, max, NULL); if (IS_ERR(rdev)) { dev_err(max->dev, "%s(): regulator register failed with err %s\n", __func__, id->name); ret = PTR_ERR(rdev); goto err_init; } max->rdev = rdev; return 0; err_init: if (gpio_is_valid(max->dvs_gpio)) gpio_free(max->dvs_gpio); return ret; }