static int rt5025_pre_init(struct rt5025_chip *rt5025_chip){ printk("%s,line=%d\n", __func__,__LINE__); int ret; /**********set voltage speed***********************/ ret = rt5025_reg_read(rt5025_chip->i2c, 0x08); ret &= (~(3<<0)); //dcdc1 25mv/10us rt5025_reg_write(rt5025_chip->i2c, 0x08,ret); ret = rt5025_reg_read(rt5025_chip->i2c, 0x09); ret &= (~(3<<0));//dcdc2 100mv/10us rt5025_reg_write(rt5025_chip->i2c, 0x09,ret); ret = rt5025_reg_read(rt5025_chip->i2c, 0x0a); ret &= (~(3<<0));//dcdc3 50mv/12us rt5025_reg_write(rt5025_chip->i2c, 0x0a,ret); /************************************************/ /***************set power off voltage***************/ ret = rt5025_reg_read(rt5025_chip->i2c, 0x17); ret &= (~(7<<5)); //power off 2.8v rt5025_reg_write(rt5025_chip->i2c, 0x17,ret); ret = rt5025_reg_read(rt5025_chip->i2c, 0x17); ret |= (1<<3); //enable DC4 boost rt5025_reg_write(rt5025_chip->i2c, 0x17,ret); /***********************************************/ /************************************************/ return 0; }
int rt5025_cable_exist(void) { int ret = 0; #ifdef CONFIG_CHARGER_RT5025 struct power_supply *psy = power_supply_get_by_name("rt-charger"); union power_supply_propval pval; if (!psy) { pr_err(" couldn't get charger power supply\n"); } else { ret = psy->get_property(psy, POWER_SUPPLY_PROP_CHARGE_NOW, &pval); if (ret < 0) { ret = 0; } else { if (pval.intval > POWER_SUPPLY_TYPE_BATTERY) ret = 1; else ret = 0; } } #else ret = rt5025_reg_read(g_shdn, RT5025_REG_CHGCTL1); if (ret < 0) { pr_err("couldn't get cable status\n"); ret = 0; } else { if (ret & RT5025_CABLEIN_MASK) ret = 1; else ret = 0; } #endif /* #ifdef CONFIG_CHARGER_RT5025 */ return ret; }
static int rt5025_is_enabled(struct regulator_dev *rdev) { struct rt5025_regulator_info *info = rdev_get_drvdata(rdev); int ret; ret = rt5025_reg_read(info->i2c, info->enable_reg); if (ret < 0) return ret; return (ret & (info->enable_bit))?1 : 0; }
static int rt5025_get_voltage_sel(struct regulator_dev *rdev) { struct rt5025_regulator_info *info = rdev_get_drvdata(rdev); int ret; ret = rt5025_reg_read(info->i2c, info->vol_reg); if (ret < 0) return ret; return (ret & info->vol_mask) >> info->vol_shift; }
static int rt5025_misc_reginit(struct i2c_client *client) { rt5025_reg_write(client, RT5025_REG_MISC1, misc_init_regval[0]); rt5025_reg_write(client, RT5025_REG_ONEVENT, misc_init_regval[1]); rt5025_assign_bits(client, RT5025_REG_DCDCONOFF, RT5025_VSYSOFF_MASK, misc_init_regval[2]); rt5025_reg_write(client, RT5025_REG_MISC2, misc_init_regval[3]); rt5025_reg_write(client, RT5025_REG_MISC3, misc_init_regval[4]); rt5025_reg_write(client, RT5025_REG_MISC4, misc_init_regval[5]); /*set all to be masked*/ rt5025_reg_write(client, RT5025_REG_IRQEN4, 0x00); rt5025_reg_write(client, RT5025_REG_IRQEN5, 0x00); /*clear the old irq status*/ rt5025_reg_read(client, RT5025_REG_IRQSTAT4); rt5025_reg_read(client, RT5025_REG_IRQSTAT5); /*set enable irqs as we want*/ rt5025_reg_write(client, RT5025_REG_IRQEN4, misc_init_regval[6]); rt5025_reg_write(client, RT5025_REG_IRQEN5, misc_init_regval[7]); return 0; }
int rt5025_cable_exist(void) { int ret = 0; ret = rt5025_reg_read(g_shdn, 0x01); if (ret < 0) return 0; else { if (ret&0x3) return 1; return 0; } }
static unsigned int rt5025_get_mode(struct regulator_dev *rdev) { struct rt5025_regulator_info *info = rdev_get_drvdata(rdev); unsigned int mode; int data; if (!info->mode_bit) { mode = REGULATOR_MODE_NORMAL; } else { data = rt5025_reg_read(info->i2c, info->mode_reg); mode = (data & info->mode_bit)?REGULATOR_MODE_NORMAL : REGULATOR_MODE_FAST; } return mode; }
static int rt5025_gpio_get_value(struct gpio_chip *chip, unsigned offset) { struct rt5025_gpio_info *gi = dev_get_drvdata(chip->dev); int gpio_reg = 0; int ret = 0; ret = find_rt5025_gpioreg(offset, &gpio_reg); if (ret < 0) { dev_err(chip->dev, "not a valid gpio index\n"); return ret; } ret = rt5025_reg_read(gi->i2c, gpio_reg); if (ret < 0) { dev_err(chip->dev, "read gpio register fail\n"); return ret; } return (ret&RT5025_GPIO_IVALUEMASK)?1 : 0; }