static void set_vibrator(int on) { if (on) sci_adi_write(ANA_VIBRATOR_CTRL0, 0, BIT_VIBR_PON); else sci_adi_write(ANA_VIBRATOR_CTRL0, BIT_VIBR_PON, BIT_VIBR_PON); }
static void set_vibrator(int on) { #ifdef CONFIG_SC_VIBRATOR_GPIO gpio_set_value(GPIO_VIBRATOR_INT, on); #elif defined(CONFIG_SC_VIBRATOR_POWER) if (on) { regulator_enable(vibrator_regulator); } else { regulator_disable(vibrator_regulator); } #else /* unlock vibrator registor */ sci_adi_write(ANA_VIBR_WR_PROT, VIBRATOR_REG_UNLOCK, 0xffff); #ifdef CONFIG_ARCH_SCX35 if (on) sci_adi_write(ANA_VIBRATOR_CTRL0, BIT_VIBR_PON, BIT_VIBR_PON); else sci_adi_write(ANA_VIBRATOR_CTRL0, 0, BIT_VIBR_PON); #else sci_adi_clr(ANA_VIBRATOR_CTRL0, VIBR_PD_SET | VIBR_PD_RST); if (on) sci_adi_set(ANA_VIBRATOR_CTRL0, VIBR_PD_RST); else sci_adi_set(ANA_VIBRATOR_CTRL0, VIBR_PD_SET); #endif /* lock vibrator registor */ sci_adi_write(ANA_VIBR_WR_PROT, VIBRATOR_REG_LOCK, 0xffff); #endif }
void pm_ana_ldo_config(void) { unsigned int val; /* * FIXME, should be more gental */ val = sci_adi_read(ANA_REG_GLB_LDO_SLP_CTRL0); val = 0x87f1; val &= ~(BIT_LDOSD3_BP_EN | BIT_LDOSD0_BP_EN); sci_adi_write(ANA_REG_GLB_LDO_SLP_CTRL0, val, 0xffff); val = sci_adi_read(ANA_REG_GLB_LDO_SLP_CTRL1); val |= BIT_FSM_SLPPD_EN; val |= BIT_DCDC_ARM_BP_EN; val &= ~BIT_LDOVDD3V_BP_EN; sci_adi_write(ANA_REG_GLB_LDO_SLP_CTRL1, val, 0xffff); /* * set ARM_DCDC_ISONUM * ISO_ON_NUM: (0xa << 8), ISO_OFF_NUM: (0x20) */ val = (0xa << 8) | (0x20); sci_adi_write(ANA_REG_GLB_LDO_SLP_CTRL2, val, 0xffff); /* * set ARM_DCDC_DLY_NUM, DLY_NUM:0x2 */ sci_adi_write(ANA_REG_GLB_LDO_SLP_CTRL3, 0x2, 0xffff); }
static void vibrator_hw_init(void) { sci_adi_write(ANA_REG_GLB_RTC_CLK_EN, BIT_RTC_VIBR_EN, BIT_RTC_VIBR_EN); sci_adi_write(ANA_VIBRATOR_CTRL0,CUR_DRV_CAL_SEL,CUR_DRV_CAL_SEL); sci_adi_clr(ANA_VIBRATOR_CTRL0, 0xFF); sci_adi_write(ANA_VIBRATOR_CTRL0,LDO_VIBR_V,LDO_VIBR_V); }
static void vibrator_hw_init(void) { sci_adi_write(ANA_REG_GLB_RTC_CLK_EN, BIT_RTC_VIBR_EN, BIT_RTC_VIBR_EN); sci_adi_write(ANA_VIBRATOR_CTRL0, 0x03D2, 0xffff); }
static void set_vibrator(int on) { if (on){ sci_adi_clr(ANA_VIBRATOR_CTRL0, LDO_VIBR_PD); sci_adi_clr(ANA_VIBRATOR_CTRL0, SLP_LDOVIBR_PD_EN); printk("v_reg:0x%08x\n",ANA_VIBRATOR_CTRL0); printk("v_reg_value:0x%08x\n",vibrator_read(ANA_VIBRATOR_CTRL0)); } else{ sci_adi_write(ANA_VIBRATOR_CTRL0, LDO_VIBR_PD, LDO_VIBR_PD); sci_adi_write(ANA_VIBRATOR_CTRL0, SLP_LDOVIBR_PD_EN, SLP_LDOVIBR_PD_EN); } }
void sprd_set_sw(struct sprd_battery_data *data, int switchpoint) { BUG_ON(switchpoint > 31); sci_adi_write(ANA_CHGR_CTRL1, ((switchpoint << CHGR_SW_POINT_SHIFT) & CHGR_SW_POINT_MSK), (CHGR_SW_POINT_MSK)); }
void sprdchg_init(struct sprd_battery_platform_data *pdata) { //struct sprdbat_drivier_data *data = platform_get_drvdata(pdev); pbat_data = pdata; BUG_ON(NULL == pbat_data); #if defined(CONFIG_ADIE_SC2723S) ||defined(CONFIG_ADIE_SC2723) sci_adi_write(ANA_REG_GLB_CHGR_CTRL0, BIT_CHGLDO_DIS, BIT_CHGLDO_DIS); #endif sci_adi_set(ANA_REG_GLB_CHGR_CTRL2, BIT_CHGR_CC_EN); sci_adi_write(ANA_REG_GLB_CHGR_CTRL0, BITS_CHGR_CV_V(0), BITS_CHGR_CV_V(~0)); #if defined(CONFIG_ADIE_SC2723S) ||defined(CONFIG_ADIE_SC2723) if (pbat_data->chg_end_vol_pure < 4300) { //fixed bug367845,only for 2723 sci_adi_write(ANA_REG_GLB_CHGR_CTRL2, BITS_CHGR_DPM(2), BITS_CHGR_DPM(~0)); } else { sci_adi_write(ANA_REG_GLB_CHGR_CTRL2, BITS_CHGR_DPM(3), BITS_CHGR_DPM(~0)); } #endif if (adc_cal.cal_type == SPRDBAT_AUXADC_CAL_NO) { #ifdef CONFIG_OTP_SPRD extern int sci_efuse_calibration_get(unsigned int *p_cal_data); unsigned int efuse_cal_data[2] = { 0 }; if (sci_efuse_calibration_get(efuse_cal_data)) { adc_cal.p0_vol = efuse_cal_data[0] & 0xffff; adc_cal.p0_adc = (efuse_cal_data[0] >> 16) & 0xffff; adc_cal.p1_vol = efuse_cal_data[1] & 0xffff; adc_cal.p1_adc = (efuse_cal_data[1] >> 16) & 0xffff; adc_cal.cal_type = SPRDBAT_AUXADC_CAL_CHIP; printk ("auxadc cal from efuse ok!!! efuse_cal_data[0]: 0x%x, efuse_cal_data[1]:0x%x\n", efuse_cal_data[0], efuse_cal_data[1]); } #endif } #if !(defined(CONFIG_ARCH_SCX35L64)||defined(CONFIG_ARCH_SCX35LT8)) //mingwei TODO sci_adi_write((ANA_CTL_EIC_BASE + 0x50), 1, (0xFFF)); //eic debunce printk("ANA_CTL_EIC_BASE0x%x\n", sci_adi_read(ANA_CTL_EIC_BASE + 0x50)); #endif }
static inline int __thm_reg_write(u32 reg, u16 bits, u16 clear_msk) { if (reg >= SPRD_THM_BASE && reg <= (SPRD_THM_BASE + SPRD_THM_SIZE)) { __raw_writel(((__raw_readl((volatile void *)reg) & ~clear_msk) | bits), ((volatile void *)reg)); } else if (reg >= ANA_THM_BASE && reg <= (ANA_THM_BASE + SPRD_THM_SIZE)) { sci_adi_write(reg, bits, clear_msk); } else { printk(KERN_ERR "error thm reg0x:%x \n", reg); } return 0; }
static void sprd_kpled_set_brightness(struct sprd_kpled *led) { unsigned long brightness = led->value; unsigned long brightness_level; brightness_level = brightness; PRINT_INFO("sprd_kpled_set_brightness:led->run_mode = %d\n",led->run_mode); if(brightness_level > 255) brightness_level = 255; /*brightness steps = 16*/ if(led->run_mode == 1){ brightness_level = brightness_level/16; brightness_level = 0;//set brightness_level = 0 for reducing power consumption sci_adi_write(KPLED_CTL, ((brightness_level << KPLED_V_SHIFT) & KPLED_V_MSK), KPLED_V_MSK); } else sci_adi_write(KPLED_CTL, ((brightness_level << LDO_KPLED_V_SHIFT) & LDO_KPLED_V_MSK), LDO_KPLED_V_MSK); PRINT_INFO("reg:0x%08X set_val:0x%08X brightness:%ld brightness_level:%ld(0~15)\n", \ KPLED_CTL, kpled_read(KPLED_CTL), brightness, brightness_level); }
static void vibrator_hw_init(void) { #ifdef CONFIG_SC_VIBRATOR_GPIO gpio_request(GPIO_VIBRATOR_INT, "vibrator"); gpio_direction_output(GPIO_VIBRATOR_INT, 0); #elif defined(CONFIG_SC_VIBRATOR_POWER) vibrator_regulator = regulator_get(NULL, "vddcammot"); regulator_set_voltage(vibrator_regulator, 3300000, 3300000); #else sci_adi_write(ANA_VIBR_WR_PROT, VIBRATOR_REG_UNLOCK, 0xffff); #ifdef CONFIG_ARCH_SCX35 sci_adi_write(ANA_REG_GLB_RTC_CLK_EN, BIT_RTC_VIBR_EN, BIT_RTC_VIBR_EN); #else sci_adi_set(ANA_VIBRATOR_CTRL0, VIBR_RTC_EN); sci_adi_clr(ANA_VIBRATOR_CTRL0, VIBR_BP_EN); #endif /* set init current level */ sci_adi_write(ANA_VIBRATOR_CTRL0, (VIBRATOR_INIT_LEVEL << VIBR_INIT_V_SHIFT), VIBR_INIT_V_MSK); sci_adi_write(ANA_VIBRATOR_CTRL0, (VIBRATOR_STABLE_LEVEL << VIBR_STABLE_V_SHIFT), VIBR_STABLE_V_MSK); /* set stable current level */ sci_adi_write(ANA_VIBRATOR_CTRL1, VIBRATOR_INIT_STATE_CNT, 0xffff); sci_adi_write(ANA_VIBR_WR_PROT, VIBRATOR_REG_LOCK, 0xffff); #endif }
static void vibrator_hw_init(void) { #ifdef CONFIG_MACH_CORSICA_VE if(get_hw_rev() > 0x01) #else if(1) #endif return; else { sci_adi_write(ANA_VIBR_WR_PROT, VIBRATOR_REG_UNLOCK, 0xffff); #ifdef CONFIG_ARCH_SCX35 sci_adi_write(ANA_REG_GLB_RTC_CLK_EN, BIT_RTC_VIBR_EN, BIT_RTC_VIBR_EN); #else sci_adi_set(ANA_VIBRATOR_CTRL0, VIBR_RTC_EN); sci_adi_clr(ANA_VIBRATOR_CTRL0, VIBR_BP_EN); #endif /* set init current level */ sci_adi_write(ANA_VIBRATOR_CTRL0, (VIBRATOR_INIT_LEVEL << VIBR_INIT_V_SHIFT), VIBR_INIT_V_MSK); sci_adi_write(ANA_VIBRATOR_CTRL0, (VIBRATOR_STABLE_LEVEL << VIBR_STABLE_V_SHIFT), VIBR_STABLE_V_MSK); /* set stable current level */ sci_adi_write(ANA_VIBRATOR_CTRL1, VIBRATOR_INIT_STATE_CNT, 0xffff); sci_adi_write(ANA_VIBR_WR_PROT, VIBRATOR_REG_LOCK, 0xffff); } }
void sprd_set_chg_cur(uint32_t chg_current) { uint32_t temp; if (chg_current > SPRD_CHG_CUR_MAX) { chg_current = SPRD_CHG_CUR_MAX; } temp = ((chg_current - 300) / 100); sci_adi_write(ANA_CHGR_CTRL1, (temp << CHGR_CHG_CUR_SHIFT) & CHGR_CHG_CUR_MSK, CHGR_CHG_CUR_MSK); }
static int sci_adc_set_current(u8 enable, int isen) { if(enable) { /* BITS_AUXAD_CURRENT_IBS = (isen * 100 / 125 -1) */ isen = (isen * 100 / 125 -1); if(isen > BITS_AUXAD_CURRENT_IBS(-1)) isen = BITS_AUXAD_CURRENT_IBS(-1); sci_adi_write(ANA_REG_GLB_AUXAD_CTL, (BIT_AUXAD_CURRENTSEN_EN | BITS_AUXAD_CURRENT_IBS(isen)), BIT_AUXAD_CURRENTSEN_EN | BITS_AUXAD_CURRENT_IBS(-1)); } else { sci_adi_clr(ANA_REG_GLB_AUXAD_CTL, BIT_AUXAD_CURRENTSEN_EN); } return 0; }
uint32_t sprd_adjust_sw(struct sprd_battery_data * data, bool up_or_down) { uint8_t current_switchpoint; uint8_t shift_bit; uint8_t chg_switchpoint; chg_switchpoint = (sci_adi_read(ANA_CHGR_CTRL1) & CHGR_SW_POINT_MSK) >> CHGR_SW_POINT_SHIFT; shift_bit = chg_switchpoint >> 4; current_switchpoint = chg_switchpoint & 0x0F; if (up_or_down) { if (shift_bit > 0) { if (current_switchpoint < 0xF) { current_switchpoint += 1; } } else { if (current_switchpoint > 0) { current_switchpoint -= 1; } else { shift_bit = 1; } } } else { if (shift_bit > 0) { if (current_switchpoint > 0) { current_switchpoint -= 1; } else { shift_bit = 0; } } else { if (current_switchpoint < 0xF) { current_switchpoint += 1; } } } chg_switchpoint = (shift_bit << 4) | current_switchpoint; sci_adi_write(ANA_CHGR_CTRL1, ((chg_switchpoint << CHGR_SW_POINT_SHIFT) & CHGR_SW_POINT_MSK), (CHGR_SW_POINT_MSK)); return chg_switchpoint; }
static void set_vibrator(int on) { #ifdef CONFIG_MACH_CORSICA_VE if(get_hw_rev() > 0x01) #else if(1) #endif { if (on) { printk("###############vibrator on##################\n"); sci_adi_write(ANA_REG_GLB_BA_CTRL3, 0x1,0xffff); sci_adi_write(ANA_REG_GLB_BA_CTRL2, 0x3ad2,0xffff); sci_adi_write(ANA_REG_GLB_BA_CTRL3,0x2,0xffff); } else { printk("###############vibrator off##################\n"); sci_adi_write(ANA_REG_GLB_BA_CTRL2, 0x3bd2,0xffff); } } else { /* unlock vibrator registor */ sci_adi_write(ANA_VIBR_WR_PROT, VIBRATOR_REG_UNLOCK, 0xffff); #ifdef CONFIG_ARCH_SCX35 if (on) sci_adi_write(ANA_VIBRATOR_CTRL0, BIT_VIBR_PON, BIT_VIBR_PON); else sci_adi_write(ANA_VIBRATOR_CTRL0, 0, BIT_VIBR_PON); #else sci_adi_clr(ANA_VIBRATOR_CTRL0, VIBR_PD_SET | VIBR_PD_RST); if (on) sci_adi_set(ANA_VIBRATOR_CTRL0, VIBR_PD_RST); else sci_adi_set(ANA_VIBRATOR_CTRL0, VIBR_PD_SET); #endif /* lock vibrator registor */ sci_adi_write(ANA_VIBR_WR_PROT, VIBRATOR_REG_LOCK, 0xffff); } }
static void sprd_unmask_ana_irq(struct irq_data *data) { int offset; #ifdef CONFIG_OF int i; for (i = 0; i < irqnums; i++) { if (virq_table[i] == data->irq) { offset = i; break; } } if (i == irqnums) return; #else offset = data->irq - IRQ_ANA_INT_START; #endif pr_debug("%s %d\n", __FUNCTION__, data->irq); sci_adi_write(ANA_REG_INT_EN, BIT(offset) & MASK_ANA_INT, 0); }
static void sprd_kpled_set_brightness( unsigned long brightness) { unsigned long brightness_level; brightness_level = brightness; if(brightness_level > 255) brightness_level = 255; #ifdef CONFIG_ARCH_SCX35 /*brightness steps = 16*/ brightness_level = brightness_level/16; brightness_level = 0;//set brightness_level = 0 for reducing power consumption #else /*brightness steps = 8*/ brightness_level = brightness_level/32; #endif // Set Output Current sci_adi_write(KPLED_CTL, ((brightness_level << KPLED_V_SHIFT) & KPLED_V_MSK), KPLED_V_MSK); PRINT_INFO("reg:0x%08X set_val:0x%08X brightness:%ld brightness_level:%ld(0~15)\n", \ KPLED_CTL, kpled_read(KPLED_CTL), brightness, brightness_level); }
void sprd_chg_init(void) { sci_adi_write(ANA_CHGR_CTRL0, CHGR_CC_EN_BIT, (CHGR_CC_EN_BIT | CHGR_CC_EN_RST_BIT)); sci_adi_set(ANA_CHGR_CTRL1, CHGR_CURVE_SHARP_BIT); }
static void sprd_unmask_ana_irq(struct irq_data *data) { int offset = data->irq - IRQ_ANA_INT_START; pr_debug("%s %d\n", __FUNCTION__, data->irq); sci_adi_write(ANA_REG_INT_EN, BIT(offset) & MASK_ANA_INT, 0); }