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);
}
Exemplo n.º 2
0
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
}
Exemplo n.º 3
0
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));
}
Exemplo n.º 8
0
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);
}
Exemplo n.º 11
0
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);
}
Exemplo n.º 20
0
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);
}