static int rt5033_fled_init(struct rt_fled_info *fled_info) { rt5033_fled_info_t *info = (rt5033_fled_info_t *)fled_info; rt5033_mfd_platform_data_t *mfd_pdata; BUG_ON(info == NULL); mfd_pdata = info->chip->pdata; mutex_lock(&info->led_lock); rt5033_set_bits(info->i2c_client, RT5033_FLED_RESET, 0x80); rt5033_fled_set_ta_status(info->i2c_client, 0); #ifdef CONFIG_CHARGER_RT5033 rt5033_chg_fled_init(info->i2c_client); #else /* Force to do normal read (read from e-fuse) ==> let FLED current be more accurate */ rt5033_set_bits(info->i2c_client, RT5033_OFF_EVENT_NRD, FORCE_NR); /* Delay 100 us to wait for normal read complete */ usleep_range(100, 100); /* Finsh normal read and clear FORCE_NR bit */ rt5033_clr_bits(info->i2c_client, RT5033_OFF_EVENT_NRD, FORCE_NR); #endif if (!info->pdata->fled1_en) rt5033_clr_bits(info->i2c_client, RT5033_FLED_FUNCTION1, 0x01); if (!info->pdata->fled2_en) rt5033_clr_bits(info->i2c_client, RT5033_FLED_FUNCTION1, 0x02); if (info->pdata->fled_mid_track_alive) rt5033_set_bits(info->i2c_client, RT5033_FLED_CONTROL2, (1 << 6)); if (info->pdata->fled_mid_auto_track_en) rt5033_set_bits(info->i2c_client, RT5033_FLED_CONTROL2, (1 << 7)); rt5033_reg_write(info->i2c_client, RT5033_FLED_STROBE_CONTROL1, (info->pdata->fled_timeout_current_level << 5) | info->pdata->fled_strobe_current); info->base.flashlight_dev->props.strobe_brightness = info->pdata->fled_strobe_current; rt5033_reg_write(info->i2c_client, RT5033_FLED_STROBE_CONTROL2, info->pdata->fled_strobe_timeout); info->base.flashlight_dev->props.strobe_timeout = info->base.hal->fled_strobe_timeout_list(fled_info, info->pdata->fled_strobe_timeout); RT5033_FLED_INFO("Strobe timeout = %d ms\n", info->base.flashlight_dev->props.strobe_timeout); rt5033_reg_write(info->i2c_client, RT5033_FLED_CONTROL1, (info->pdata->fled_torch_current << 4) | info->pdata->fled_lv_protection); info->base.flashlight_dev->props.torch_brightness = info->pdata->fled_torch_current; rt5033_assign_bits(info->i2c_client, RT5033_FLED_CONTROL2, 0x3f, info->pdata->fled_mid_level); info->led_count = info->pdata->fled1_en + info->pdata->fled2_en; #ifdef CONFIG_FLED_RT5033_I2C rt5033_set_bits(info->i2c_client, RT5033_FLED_FUNCTION1, RT5033_FLED_PIN_CTRL); #endif mutex_unlock(&info->led_lock); return 0; }
/* For GPIO operation */ int32_t rt5033_charger_notification(struct rt_fled_info *fled_info, int32_t attach) { rt5033_fled_info_t *info = (rt5033_fled_info_t *)fled_info; int force_torch_en = 0; int chg_status; int reg0x1a; BUG_ON(info == NULL); rt5033_fled_lock(fled_info); info->ta_exist = attach; reg0x1a = rt5033_reg_read(info->i2c_client, 0x1a); reg0x1a |= 0xa0; rt5033_fled_set_ta_status(info->i2c_client, attach); if (attach == 0 && info->boost == 0) { chg_status = rt5033_reg_read(info->i2c_client, 0x00); /* remove TA, re-start FlashEN, * and then become boost mode => torch enabled */ force_torch_en = (chg_status & 0x08) ? 1 : 0; /* Enable hidden bit (Force boosting) for TA/USB detaching * To fix flicking issue for torch while TA is removing */ if (force_torch_en) rt5033_reg_write(info->i2c_client, 0x1a, reg0x1a); } rt5033_set_uug_status(info->i2c_client, attach ? 0x02 : 0x00); if (attach) { /* GPIO mode, 0x1 means disable * Disable it and then enable it */ rt5033_assign_bits(info->i2c_client, RT5033_FLED_FUNCTION2, 0x81, 0x1); rt5033_assign_bits(info->i2c_client, RT5033_FLED_FUNCTION2, 0x81, 0x0); } rt5033_fled_unlock(fled_info); /* Disable hidden bit (Force boosting) for TA/USB detaching * To fix flicking issue for torch while TA is removing */ if (force_torch_en) { usleep_range(2500, 2500); rt5033_clr_bits(info->i2c_client, 0x1a, 0x80); } RT5033_FLED_INFO("force_torch_en = %d\n", force_torch_en); return 0; }
static int rt5033_regulator_get_status(struct regulator_dev *rdev) { struct rt5033_regulator_info *info = rdev_get_drvdata(rdev); /* REGULATOR_STATUS_OFF, REGULATOR_STATUS_ON, REGULATOR_STATUS_OFF */ int ret = REGULATOR_STATUS_ERROR; /* 2 */ int org_regval, dump_reg; //int sta1, sta2; uint16_t sta1, sta2; #ifndef CONFIG_MFD_RT5033_RESET_GPIO /* if there are no reset solution(MRSTB or I2C), skip reset workaround(always return true) */ if (chip_rev < RT5033A_REV) return REGULATOR_STATUS_ON; #endif rt5033_lock_regulator(info->i2c); /* First time to check it */ msleep(2); org_regval = rt5033_reg_read(info->i2c, 0xf0); rt5033_reg_write(info->i2c, 0xf0, 0x1e); rt5033_assign_bits(info->i2c, 0xf3, 0x03 << 6, 0x2 << 6); sta1 = rt5033_reg_read(info->i2c, 0xf6) & 0x1f; rt5033_assign_bits(info->i2c, 0xf3, 0x03 << 6, 0x3 << 6); sta2 = rt5033_reg_read(info->i2c, 0xf7) & 0x1f; printk("%s status #1[0x%2x]\n", __func__, (sta2 << 8) | sta1); if (check_status_is_vaild(sta1, 0xf6) && check_status_is_vaild(sta2, 0xf7)) goto rt5033_reg_status_ok; /* Failed case, we need to check again */ msleep(2); org_regval = rt5033_reg_read(info->i2c, 0xf0); rt5033_reg_write(info->i2c, 0xf0, 0x1e); rt5033_assign_bits(info->i2c, 0xf3, 0x03 << 6, 0x2 << 6); sta1 = rt5033_reg_read(info->i2c, 0xf6) & 0x1f; rt5033_assign_bits(info->i2c, 0xf3, 0x03 << 6, 0x3 << 6); sta2 = rt5033_reg_read(info->i2c, 0xf7) & 0x1f; printk("%s status #2[0x%2x]\n", __func__, (sta2 << 8) | sta1); if (check_status_is_vaild(sta1, 0xf6) && check_status_is_vaild(sta2, 0xf7)) goto rt5033_reg_status_ok; /* Failed case, dump registers */ dump_reg = rt5033_reg_read(info->i2c, 0x41); printk("%s LDO_CTRL:0x%2X\n", __func__, dump_reg); dump_reg = rt5033_reg_read(info->i2c, 0x47); printk("%s LDO_CTRL:0x%2X\n", __func__, dump_reg); dump_reg = rt5033_reg_read(info->i2c, 0x68); printk("%s PMIC_IRQ_STAT:0x%2X\n", __func__, dump_reg); dump_reg = rt5033_reg_read(info->i2c, 0x69); printk("%s PMIC_IRQ_CTRL:0x%2X\n", __func__, dump_reg); dump_reg = rt5033_reg_read(info->i2c, 0x6A); printk("%s SHDN_CTRL:0x%2X\n", __func__, dump_reg); dump_reg = rt5033_reg_read(info->i2c, 0x6B); printk("%s SHDN_CTRL:0x%2X\n", __func__, dump_reg); goto rt5033_reg_status_exit; rt5033_reg_status_ok: ret = rt5033_regulator_is_enabled(rdev) ? REGULATOR_STATUS_ON : REGULATOR_STATUS_OFF; rt5033_reg_status_exit: rt5033_reg_write(info->i2c, 0xf0, org_regval); rt5033_unlock_regulator(info->i2c); if (ret==REGULATOR_STATUS_ERROR && chip_rev >= RT5033A_REV) ret = REGULATOR_STATUS_UNDEFINED; /* 8 */ pr_err("%s ret:%d\n", __func__, ret); return ret; }