static unsigned int max8649_get_mode(struct regulator_dev *rdev) { struct max8649_regulator_info *info = rdev_get_drvdata(rdev); int ret; #ifdef CONFIG_MAX8649_SUPPORT_CHANGE_VID_MODE ret = max8649_reg_read(info->i2c, MAX8649_CONTROL) ; ret = ( ret & MAX8649_VID_MASK ) >> 5 ; if ( ret & MAX8649_MODE0 ) return REGULATOR_MODE_FAST ; return REGULATOR_MODE_NORMAL ; #else ret = max8649_reg_read(info->i2c, info->vol_reg); if (ret & MAX8649_FORCE_PWM) return REGULATOR_MODE_FAST; return REGULATOR_MODE_NORMAL; #endif }
static unsigned int max8649_get_mode(struct regulator_dev *rdev) { struct max8649_regulator_info *info = rdev_get_drvdata(rdev); int ret; ret = max8649_reg_read(info->i2c, info->vol_reg); if (ret & MAX8649_FORCE_PWM) return REGULATOR_MODE_FAST; return REGULATOR_MODE_NORMAL; }
static int max8649_is_enabled(struct regulator_dev *rdev) { struct max8649_regulator_info *info = rdev_get_drvdata(rdev); int ret; ret = max8649_reg_read(info->i2c, MAX8649_CONTROL); if (ret < 0) return ret; return !((unsigned char)ret & MAX8649_EN_PD); }
static int max8649_enable_time(struct regulator_dev *rdev) { struct max8649_regulator_info *info = rdev_get_drvdata(rdev); int voltage, rate, ret; /* get voltage */ ret = max8649_reg_read(info->i2c, info->vol_reg); if (ret < 0) return ret; ret &= MAX8649_VOL_MASK; voltage = max8649_list_voltage(rdev, (unsigned char)ret); /* uV */ /* get rate */ ret = max8649_reg_read(info->i2c, MAX8649_RAMP); if (ret < 0) return ret; ret = (ret & MAX8649_RAMP_MASK) >> 5; rate = (32 * 1000) >> ret; /* uV/uS */ return (voltage / rate); }
static int max8649_get_voltage(struct regulator_dev *rdev) { struct max8649_regulator_info *info = rdev_get_drvdata(rdev); unsigned char data; int ret; ret = max8649_reg_read(info->i2c, info->vol_reg); if (ret < 0) return ret; data = (unsigned char)ret & MAX8649_VOL_MASK; return max8649_list_voltage(rdev, 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; }