Esempio n. 1
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
int axp22_probe(void)
{
    u8    pmu_type;

    axp_i2c_config(SUNXI_AXP_22X, AXP22_ADDR);
    if(axp_i2c_read(AXP22_ADDR, BOOT_POWER22_VERSION, &pmu_type))
    {
        printf("axp read error\n");

        return -1;
    }
    pmu_type &= 0x0f;
    if(pmu_type & 0x06)
    {
        /* pmu type AXP221 */
        tick_printf("PMU: AXP221\n");

        return 0;
    }

    return -1;
}
Esempio n. 2
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
int axp22_set_power_onoff_vol(int set_vol, int stage)
{
    u8 reg_value;

    if(!set_vol)
    {
        if(!stage)
        {
            set_vol = 3300;
        }
        else
        {
            set_vol = 2900;
        }
    }
    if(axp_i2c_read(AXP22_ADDR, BOOT_POWER22_VOFF_SET, &reg_value))
    {
        return -1;
    }
    reg_value &= 0xf8;
    if(set_vol >= 2600 && set_vol <= 3300)
    {
        reg_value |= (set_vol - 2600)/100;
    }
    else if(set_vol <= 2600)
    {
        reg_value |= 0x00;
    }
    else
    {
        reg_value |= 0x07;
    }
    if(axp_i2c_write(AXP22_ADDR, BOOT_POWER22_VOFF_SET, reg_value))
    {
        return -1;
    }

    return 0;
}
Esempio n. 3
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
int axp81_probe_int_pending(uchar *addr)
{
	int   i;

	for(i=0;i<5;i++)
	{
	    if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_INTSTS1 + i, addr + i))
	    {
	        return -1;
	    }
	}

	for(i=0;i<5;i++)
	{
	    if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_INTSTS1 + i, 0xff))
	    {
	        return -1;
	    }
	}

	return 0;
}
Esempio n. 4
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
int axp81_set_vbus_cur_limit(int current)
{
	uchar reg_value;

	//set bus current limit off
	if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_VBUS_SET, &reg_value))
    {
        return -1;
    }
    reg_value &= 0xfC;
	if(!current)
	{
	    reg_value |= 0x03;
	}
	else if(current >= 2500) //limit to2500
	{
		reg_value |= 0x03;
	}
	else if(current >= 2000) //limit to 2000
	{
		reg_value |= 0x02;
	}
    else if(current >= 1500) //limit to 1500
	{
		reg_value |= 0x01;
	}
    else 				     //limit to 900
	{
		reg_value |= 0x00;
	}

	if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_VBUS_SET, reg_value))
    {
        return -1;
    }

    return 0;
}
Esempio n. 5
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
int axp809_probe(void)
{
	u8    pmu_type;

    axp_i2c_config(SUNXI_AXP_809, AXP809_ADDR);
	if(axp_i2c_read(AXP809_ADDR, BOOT_POWER809_VERSION, &pmu_type))
	{
		printf("axp read error\n");

		return -1;
	}

    pmu_type &= 0xCF;
	if(pmu_type == 0x42)
	{
		/* pmu type AXP809 */
		tick_printf("PMU: AXP809\n");

		return 0;
	}

	return -1;
}
Esempio n. 6
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
static int axp809_set_dldo1(int set_vol, int onoff)
{
	u8 reg_value;
	u8 tmp_step;

	if(set_vol > 0)
	{
		if(set_vol < 3500)
		{
			if(set_vol < 700)
			{
				set_vol = 700;
			}
			tmp_step = (set_vol - 700)/100;
		}
		else
		{
			if(set_vol > 4200)
			{
				set_vol = 4200;
			}
			tmp_step = (set_vol - 3400)/200 + 27;
		}

		if(axp_i2c_read(AXP809_ADDR, BOOT_POWER809_DLDO1_VOL, &reg_value))
	    {
	        return -1;
	    }
	    reg_value &= 0xE0;
		reg_value |= tmp_step;
	    if(axp_i2c_write(AXP809_ADDR, BOOT_POWER809_DLDO1_VOL, reg_value))
	    {
	    	printf("sunxi pmu error : unable to set dldo1\n");

	        return -1;
	    }
	}

	if(onoff < 0)
	{
		return 0;
	}
	if(axp_i2c_read(AXP809_ADDR, BOOT_POWER809_OUTPUT_CTL2, &reg_value))
    {
		return -1;
    }
	if(onoff == 0)
	{
		reg_value &= ~(1 << 3);
	}
	else
	{
		reg_value |=  (1 << 3);
	}
    if(axp_i2c_write(AXP809_ADDR, BOOT_POWER809_OUTPUT_CTL2, reg_value))
	{
		printf("sunxi pmu error : unable to onoff dldo1\n");

		return -1;
	}

	return 0;
}
Esempio n. 7
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
static int axp809_set_dcdc4(int set_vol, int onoff)
{
    u8   reg_value;
    u8   tmp_step;

	if(set_vol > 0)
	{
		if(set_vol <= 1540)
		{
			if(set_vol < 600)
			{
				set_vol = 600;
			}
			tmp_step = (set_vol - 600)/20;
		}
		else
		{
			if(set_vol < 1800)
			{
				set_vol = 1800;
			}
			else if(set_vol > 2600)
			{
				set_vol = 2600;
			}

			tmp_step = (set_vol - 1800)/100 + 48;
		}

		if(axp_i2c_read(AXP809_ADDR, BOOT_POWER809_DC4OUT_VOL, &reg_value))
	    {
	    	debug("%d\n", __LINE__);

	        return -1;
	    }
	    reg_value &= 0xC0;
		reg_value |= tmp_step;
		if(axp_i2c_write(AXP809_ADDR, BOOT_POWER809_DC4OUT_VOL, reg_value))
		{
			printf("sunxi pmu error : unable to set dcdc4\n");

			return -1;
		}
	}

	if(onoff < 0)
	{
		return 0;
	}
	if(axp_i2c_read(AXP809_ADDR, BOOT_POWER809_OUTPUT_CTL1, &reg_value))
    {
		return -1;
    }
	if(onoff == 0)
	{
		reg_value &= ~(1 << 4);
	}
	else
	{
		reg_value |=  (1 << 4);
	}
    if(axp_i2c_write(AXP809_ADDR, BOOT_POWER809_OUTPUT_CTL1, reg_value))
	{
		printf("sunxi pmu error : unable to onoff dcdc4\n");

		return -1;
	}

	return 0;
}
/*
 ************************************************************************************************************
 *
 *                                             function
 *
 *    函数名称:
 *
 *    参数列表:
 *
 *    返回值  :
 *
 *    说明    :
 *
 *
 ************************************************************************************************************
 */
static int axp20_set_ldo4(int set_vol, int onoff)
{
    s32 vol_value;
        s32 ret;
        u8  reg_addr;
        u8  reg_value;
        
        if(-1 == set_vol)
        {
            if(!ldo4_user_set)
            {
                ret = script_parser_fetch("target", "ldo4_vol", &vol_value, 1);
                    if(ret)
                    {
                        printf("boot power:unable to find ldo4 set\n");
                            return -1;
                    }
                ldo4_user_set = vol_value;
            }
            vol_value = ldo4_user_set;
        }
        else
        {
            vol_value = set_vol;
        }
    if(!vol_value)
    {
        reg_addr = BOOT_POWER20_OUTPUT_CTL;
            if(!axp_i2c_read(AXP20_ADDR, reg_addr, &reg_value))
            {
                reg_value &= ~(1<<3);
                    if(axp_i2c_write(AXP20_ADDR, reg_addr, reg_value))
                    {
                        printf("boot power:unable to set ldo2\n");
                            return -1;
                    }
            }
    }
    else
    {
        reg_addr  = BOOT_POWER20_LDO24OUT_VOL;
            if(!axp_i2c_read(AXP20_ADDR, reg_addr, &reg_value))
            {
                reg_value &= 0xf0;
                    /*************************************************************************************
                      0    1300     2000    2500     2700   2800    3000   3300  max
                      
                      
                     *************************************************************************************/
                    if(vol_value < 1300)
                    {
                        reg_value |= 0x00;
                    }
                    else if(vol_value <= 2000)
                    {
                        reg_value |= (vol_value - 1200)/100;
                    }
                    else if(vol_value < 2700)
                    {
                        reg_value |= 0x09;
                    }
                    else if(vol_value <= 2800)
                    {
                        reg_value |= ((vol_value - 2700)/100) + 0x0a;
                    }
                    else
                    {
                        if(vol_value < 3000)
                        {
                            vol_value = 3000;
                        }
                        else if(vol_value > 3300)
                        {
                            vol_value = 3300;
                        }
                        reg_value |= ((vol_value - 3000)/100) + 0x0c;
                    }
                if(axp_i2c_write(AXP20_ADDR, reg_addr, reg_value))
                {
                    printf("boot power:unable to set ldo4\n");
                        return -1;
                }
            }
    }
    return 0;
}
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
static int axp20_set_dcdc2(int set_vol, int onoff)
{
 	u32 vol, tmp;
	volatile u32 i;
    u8  reg_addr, value;
	if(set_vol == -1)
	{
		set_vol = 1400;
	}
    //PMU is AXP209
    reg_addr = BOOT_POWER20_DC2OUT_VOL;
    if(axp_i2c_read(AXP20_ADDR, reg_addr, &value))
    {
        return -1;
    }
    tmp     = value & 0x3f;
    vol     = tmp * 25 + 700;
    //如果电压过高,则调低
    while(vol > set_vol)
    {
        tmp -= 1;
        value &= ~0x3f;
        value |= tmp;
        reg_addr = BOOT_POWER20_DC2OUT_VOL;
        if(axp_i2c_write(AXP20_ADDR, reg_addr, value))
        {
            return -1;
        }
        for(i=0;i<2000;i++);
        reg_addr = BOOT_POWER20_DC2OUT_VOL;
        if(axp_i2c_read(AXP20_ADDR, reg_addr, &value))
        {
            return -1;
        }
        tmp     = value & 0x3f;
        vol     = tmp * 25 + 700;
    }
    //如果电压过低,则调高,根据先调低再调高的过程,保证电压会大于等于用户设定电压
    while(vol < set_vol)
    {
        tmp += 1;
        value &= ~0x3f;
        value |= tmp;
        reg_addr = BOOT_POWER20_DC2OUT_VOL;
        if(axp_i2c_write(AXP20_ADDR, reg_addr, value))
        {
            return -1;
        }
        for(i=0;i<2000;i++);
        reg_addr = BOOT_POWER20_DC2OUT_VOL;
        if(axp_i2c_read(AXP20_ADDR, reg_addr, &value))
        {
            return -1;
        }
        tmp     = value & 0x3f;
        vol     = tmp * 25 + 700;
    }
	//tick_printf("after set, dcdc2 =%dmv\n",vol);
	
	return 0;
}
Esempio n. 10
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
static int axp81X_set_dcdc6(int set_vol, int onoff)
{
    u8   reg_value;

	if(set_vol > 0)
	{
		if(set_vol < 600)
		{
			set_vol = 600;
		}
		else if(set_vol > 1520)
		{
			set_vol = 1520;
		}
		if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_DC6OUT_VOL, &reg_value))
	    {
	    	debug("%d\n", __LINE__);

	        return -1;
	    }
	    reg_value &= (~0x7f);
		//dcdc6: 0.6v-1.1v  10mv/step   1.12v-1.52v  20mv/step
        if(set_vol > 1100)
        {
             reg_value |= (50+(set_vol - 1100)/20);
        }
        else
        {
            reg_value |= (set_vol - 600)/10;
        }
		if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_DC6OUT_VOL, reg_value))
		{
			printf("sunxi pmu error : unable to set dcdc5\n");

			return -1;
		}
	}

	if(onoff < 0)
	{
		return 0;
	}
	if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL1, &reg_value))
    {
		return -1;
    }
	if(onoff == 0)
	{
		reg_value &= ~(1 << 5);
	}
	else
	{
		reg_value |=  (1 << 5);
	}
    if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL1, reg_value))
	{
		printf("sunxi pmu error : unable to onoff dcdc5\n");

		return -1;
	}

	return 0;
}
Esempio n. 11
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
static int axp81X_set_dcdc4(int set_vol, int onoff)
{
    u8   reg_value;

	if(set_vol > 0)
	{
		if(set_vol < 500)
		{
			set_vol = 500;
		}
		else if(set_vol > 1300)
		{
			set_vol = 1300;
		}

		if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_DC4OUT_VOL, &reg_value))
	    {
	    	debug("%d\n", __LINE__);

	        return -1;
	    }
	    reg_value &= (~0x7f);
		 //dcdc4: 0.5v-1.2v  10mv/step   1.22v-1.3v  20mv/step
        if(set_vol > 1200)
        {
             reg_value |= (70+(set_vol - 1200)/20);
        }
        else
        {
            reg_value |= (set_vol - 500)/10;
        }
		if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_DC4OUT_VOL, reg_value))
		{
			printf("sunxi pmu error : unable to set dcdc4\n");

			return -1;
		}
#if 0
        if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_DC4OUT_VOL, &reg_value))
	    {
	    	debug("%d\n", __LINE__);

	        return -1;
	    }
        printf("BOOT_POWER81X_DC4OUT_VOL=%d\n", reg_value);
#endif
	}

	if(onoff < 0)
	{
		return 0;
	}
	if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL1, &reg_value))
    {
		return -1;
    }
	if(onoff == 0)
	{
		reg_value &= ~(1 << 3);
	}
	else
	{
		reg_value |=  (1 << 3);
	}
    if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL1, reg_value))
	{
		printf("sunxi pmu error : unable to onoff dcdc4\n");

		return -1;
	}

	return 0;
}
Esempio n. 12
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
static int axp81X_set_dldo2(int set_vol, int onoff)
{
	u8 reg_value;

	if(set_vol > 0)
	{	
        if(set_vol < 700)
		{
			set_vol = 700;
		}
		else if(set_vol > 4200)
		{
			set_vol = 4200;
		}
		if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_DLDO2_VOL, &reg_value))
	    {
	        return -1;
	    }
	    reg_value &= 0xE0;
		//dldo: 0.7v-3.4v  100mv/step   3.4v-4.2v  200mv/step
        if(set_vol > 3400)
        {
            reg_value |= (27 + ((set_vol - 3400)/200));  //(3400-700)/100
        }
        else
        {
            reg_value |= ((set_vol - 700)/100);
        }
	    if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_DLDO2_VOL, reg_value))
	    {
	    	printf("sunxi pmu error : unable to set dldo2\n");

	        return -1;
	    }
	}

	if(onoff < 0)
	{
		return 0;
	}
	if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL2, &reg_value))
    {
		return -1;
    }
	if(onoff == 0)
	{
		reg_value &= ~(1 << 4);
	}
	else
	{
		reg_value |=  (1 << 4);
	}
    if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL2, reg_value))
	{
		printf("sunxi pmu error : unable to onoff dldo2\n");

		return -1;
	}

	return 0;
}