static int max8649_set_mode(struct regulator_dev *rdev, unsigned int mode) { struct max8649_regulator_info *info = rdev_get_drvdata(rdev); switch (mode) { case REGULATOR_MODE_FAST: max8649_set_bits(info->i2c, info->vol_reg, MAX8649_FORCE_PWM, MAX8649_FORCE_PWM); break; case REGULATOR_MODE_NORMAL: max8649_set_bits(info->i2c, info->vol_reg, MAX8649_FORCE_PWM, 0); break; default: return -EINVAL; } return 0; }
static int max8649_set_mode(struct regulator_dev *rdev, unsigned int mode) { struct max8649_regulator_info *info = rdev_get_drvdata(rdev); switch (mode) { case REGULATOR_MODE_FAST: { #ifdef CONFIG_MAX8649_SUPPORT_CHANGE_VID_MODE // Change CONTROL register value ( bit5 = 0, bit6 = 0, so that we are in MODE0 ). max8649_set_bits(info->i2c, MAX8649_CONTROL, MAX8649_VID_MASK, 0); // Change info->vol_reg value to MODE0. info->vol_reg = MAX8649_MODE0 ; #else max8649_set_bits(info->i2c, info->vol_reg, MAX8649_FORCE_PWM, MAX8649_FORCE_PWM); #endif break; } case REGULATOR_MODE_NORMAL: { #ifdef CONFIG_MAX8649_SUPPORT_CHANGE_VID_MODE // Change CONTROL register value ( bit5 = 0, bit 6 = 1, so that we are in MODE2 ). max8649_set_bits(info->i2c, MAX8649_CONTROL, MAX8649_VID_MASK, MAX8649_VID0_PD ); // Change info->vol_reg value to MODE0. info->vol_reg = MAX8649_MODE2 ; #else max8649_set_bits(info->i2c, info->vol_reg, MAX8649_FORCE_PWM, 0); #endif } break; default: return -EINVAL; } return 0; }
static int max8649_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV) { struct max8649_regulator_info *info = rdev_get_drvdata(rdev); unsigned char data, mask; if (check_range(min_uV, max_uV)) { dev_err(info->dev, "invalid voltage range (%d, %d) uV\n", min_uV, max_uV); return -EINVAL; } data = (min_uV - MAX8649_DCDC_VMIN + MAX8649_DCDC_STEP - 1) / MAX8649_DCDC_STEP; mask = MAX8649_VOL_MASK; return max8649_set_bits(info->i2c, info->vol_reg, mask, data); }
static int __devinit max8649_regulator_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct max8649_platform_data *pdata = client->dev.platform_data; struct max8649_regulator_info *info = NULL; unsigned char data; int ret; info = kzalloc(sizeof(struct max8649_regulator_info), GFP_KERNEL); if (!info) { dev_err(&client->dev, "No enough memory\n"); return -ENOMEM; } info->i2c = client; info->dev = &client->dev; mutex_init(&info->io_lock); i2c_set_clientdata(client, info); info->mode = pdata->mode; switch (info->mode) { case 0: info->vol_reg = MAX8649_MODE0; break; case 1: info->vol_reg = MAX8649_MODE1; break; case 2: info->vol_reg = MAX8649_MODE2; break; case 3: info->vol_reg = MAX8649_MODE3; break; default: break; } ret = max8649_reg_read(info->i2c, MAX8649_CHIP_ID1); if (ret < 0) { dev_err(info->dev, "Failed to detect ID of MAX8649:%d\n", ret); goto out; } dev_info(info->dev, "Detected MAX8649 (ID:%x)\n", ret); /* enable VID0 & VID1 */ max8649_set_bits(info->i2c, MAX8649_CONTROL, MAX8649_VID_MASK, 0); /* enable/disable external clock synchronization */ info->extclk = pdata->extclk; data = (info->extclk) ? MAX8649_SYNC_EXTCLK : 0; max8649_set_bits(info->i2c, info->vol_reg, MAX8649_SYNC_EXTCLK, data); if (info->extclk) { /* set external clock frequency */ info->extclk_freq = pdata->extclk_freq; max8649_set_bits(info->i2c, MAX8649_SYNC, MAX8649_EXT_MASK, info->extclk_freq); } if (pdata->ramp_timing) { info->ramp_timing = pdata->ramp_timing; max8649_set_bits(info->i2c, MAX8649_RAMP, MAX8649_RAMP_MASK, info->ramp_timing << 5); } info->ramp_down = pdata->ramp_down; if (info->ramp_down) { max8649_set_bits(info->i2c, MAX8649_RAMP, MAX8649_RAMP_DOWN, MAX8649_RAMP_DOWN); } info->regulator = regulator_register(&dcdc_desc, &client->dev, pdata->regulator, info); if (IS_ERR(info->regulator)) { dev_err(info->dev, "failed to register regulator %s\n", dcdc_desc.name); ret = PTR_ERR(info->regulator); goto out; } dev_info(info->dev, "Max8649 regulator device is detected.\n"); return 0; out: i2c_set_clientdata(client, NULL); kfree(info); return ret; }
/* * Applied internal pulldown resistor on EN input pin. * If pulldown EN pin outside, it would be better. */ static int max8649_disable(struct regulator_dev *rdev) { struct max8649_regulator_info *info = rdev_get_drvdata(rdev); return max8649_set_bits(info->i2c, MAX8649_CONTROL, MAX8649_EN_PD, MAX8649_EN_PD); }