예제 #1
0
/* axp driver porting interface */
static int axp_gpio_get_data(int gpio)
{
	uint8_t ret;
	struct axp_dev *axp = NULL;

#ifdef CONFIG_AW_AXP22
	axp = axp_dev_lookup(AXP22);
#elif defined(CONFIG_AW_AXP81X)
	axp = axp_dev_lookup(AXP81X);
#endif
	if (NULL == axp) {
		printk("%s: axp data is null\n", __func__);
		return -ENXIO;
	}
	switch(gpio){
		case 0:axp_read(axp->dev,AXP_GPIO01_STATE,&ret);ret &= 0x10;ret = ret>>4;break;
		case 1:axp_read(axp->dev,AXP_GPIO01_STATE,&ret);ret &= 0x20;ret = ret>>5;break;
		case 2:printk("This IO is not an input,no return value!");return -ENXIO;
		case 3:printk("This IO is not an input,no return value!");return -ENXIO;
		case 4:printk("This IO is not an input,no return value!");return -ENXIO;
		case 5:printk("This IO is not an input,no return value!");return -ENXIO;
		default:return -ENXIO;
	}
	return ret;
}
예제 #2
0
static int axp_pmx_get(int gpio)
{
	struct axp_dev *axp = NULL;
	uint8_t data;

#ifdef CONFIG_AW_AXP22
	axp = axp_dev_lookup(AXP22);
#elif defined(CONFIG_AW_AXP81X)
	axp = axp_dev_lookup(AXP81X);
#endif

	if (NULL == axp) {
		printk("%s: %d axp data is null\n", __func__, __LINE__);
		return -ENXIO;
	}

	switch(gpio){
	case 0:
		axp_read(axp->dev, AXP_GPIO0_CFG, &data);
		if (0 == (data & 0x06))
			return 1;
		else if (0x02 == (data & 0x07))
			return 0;
		else
			return -ENXIO;
	case 1:
		axp_read(axp->dev, AXP_GPIO1_CFG, &data);
		if (0 == (data & 0x06))
			return 1;
		else if (0x02 == (data & 0x07))
			return 0;
		else
			return -ENXIO;
	case 2:
		return 1;
	case 3:
		axp_read(axp->dev, AXP_GPIO3_CFG, &data);
		if (0 == (data & 0x08))
			return 1;
		else
			return 0;
	case 4:
		axp_read(axp->dev, AXP_GPIO4_CFG, &data);
		if (0 == (data & 0x10))
			return 1;
		else
			return 0;
	case 5:
		return 1;
	default:return -ENXIO;
	}
	return -ENXIO;
}
예제 #3
0
void axp81x_power_off(int power_start)
{
	uint8_t val;
	struct axp_dev *axp;
	axp = axp_dev_lookup(AXP81X);
	if (NULL == axp) {
		printk("%s: axp data is null\n", __func__);
		return;
	}
	if(axp81x_config.pmu_pwroff_vol >= 2600 && axp81x_config.pmu_pwroff_vol <= 3300){
		if (axp81x_config.pmu_pwroff_vol > 3200){
			val = 0x7;
		}else if (axp81x_config.pmu_pwroff_vol > 3100){
			val = 0x6;
		}else if (axp81x_config.pmu_pwroff_vol > 3000){
			val = 0x5;
		}else if (axp81x_config.pmu_pwroff_vol > 2900){
			val = 0x4;
		}else if (axp81x_config.pmu_pwroff_vol > 2800){
			val = 0x3;
		}else if (axp81x_config.pmu_pwroff_vol > 2700){
			val = 0x2;
		}else if (axp81x_config.pmu_pwroff_vol > 2600){
			val = 0x1;
		}else
			val = 0x0;
		axp_update(axp->dev, AXP81X_VOFF_SET, val, 0x7);
	}
	val = 0xff;
	printk("[axp] send power-off command!\n");

	mdelay(20);

	if(axp81x_config.power_start != 1){
		axp_read(axp->dev, AXP81X_STATUS, &val);
		if(val & 0xF0){
			axp_read(axp->dev, AXP81X_MODE_CHGSTATUS, &val);
			if(val & 0x20) {
				printk("[axp] set flag!\n");
				axp_read(axp->dev, AXP81X_BUFFERC, &val);
				if (0x0d != val)
					axp_write(axp->dev, AXP81X_BUFFERC, 0x0f);
				mdelay(20);
				printk("[axp] reboot!\n");
				machine_restart(NULL);
				printk("[axp] warning!!! arch can't ,reboot, maybe some error happend!\n");
			}
		}
	}
	axp_read(axp->dev, AXP81X_BUFFERC, &val);
	if (0x0d != val)
		axp_write(axp->dev, AXP81X_BUFFERC, 0x00);

	mdelay(20);
	axp_set_bits(axp->dev, AXP81X_OFF_CTL, 0x80);
	mdelay(20);
	printk("[axp] warning!!! axp can't power-off, maybe some error happend!\n");
}
예제 #4
0
static int axp_pmx_set(int gpio, int mux)
{
	struct axp_dev *axp = NULL;

#ifdef CONFIG_AW_AXP22
	axp = axp_dev_lookup(AXP22);
#elif defined(CONFIG_AW_AXP81X)
	axp = axp_dev_lookup(AXP81X);
#endif

	if (NULL == axp) {
		printk("%s: %d axp data is null\n", __func__, __LINE__);
		return -ENXIO;
	}
	if(mux == 1){//output
		switch(gpio){
			case 0: return axp_clr_bits_sync(axp->dev,AXP_GPIO0_CFG, 0x06);
			case 1: return axp_clr_bits_sync(axp->dev,AXP_GPIO1_CFG, 0x06);
			case 2: return 0;
			case 3: return axp_clr_bits(axp->dev,AXP_GPIO3_CFG, 0x08);
			case 4: return axp_clr_bits(axp->dev,AXP_GPIO4_CFG, 0x10);
			case 5: return 0;
			default:return -ENXIO;
		}
	}
	else if(mux == 0){//input
		switch(gpio){
			case 0: axp_clr_bits_sync(axp->dev,AXP_GPIO0_CFG,0x05);
					return axp_set_bits_sync(axp->dev,AXP_GPIO0_CFG,0x02);
			case 1: axp_clr_bits_sync(axp->dev,AXP_GPIO1_CFG,0x05);
					return axp_set_bits_sync(axp->dev,AXP_GPIO1_CFG,0x02);
			case 2:	printk("This IO can not config as an input!");
				return -EINVAL;
			case 3:	printk("This IO can not config as an input!");
				return -EINVAL;
			case 4:	printk("This IO can not config as an input!");
				return -EINVAL;	
			case 5:	printk("This IO can not config as an input!");
				return -EINVAL;
			default:return -ENXIO;
		}
	}
	return -ENXIO;
}
예제 #5
0
static int axp_pmx_set(int gpio, int mux)
{
	struct axp_dev *axp = NULL;

	axp = axp_dev_lookup(AXP19);
	if (NULL == axp) {
		printk("%s: %d axp data is null\n", __func__, __LINE__);
		return -ENXIO;
	}
	if(mux == 1){//output
		switch(gpio){
			case 0: return axp_clr_bits(axp->dev,AXP19_GPIO0_CFG,0x07);
			case 1: return axp_clr_bits(axp->dev,AXP19_GPIO1_CFG,0x07);
			case 2: return axp_clr_bits(axp->dev,AXP19_GPIO2_CFG,0x07);
			case 3: axp_set_bits(axp->dev,AXP19_GPIO34_CFG,0x81);
					return axp_clr_bits(axp->dev,AXP19_GPIO34_CFG,0x02);
			case 4: axp_set_bits(axp->dev,AXP19_GPIO34_CFG,0x84);
					return axp_clr_bits(axp->dev,AXP19_GPIO34_CFG,0x08);
			case 5: axp_set_bits(axp->dev,AXP19_GPIO5_CFG,0x80);
					return axp_clr_bits(axp->dev,AXP19_GPIO5_CFG,0x40);
			case 6: axp_set_bits(axp->dev,AXP19_GPIO67_CFG0,0x01);
					return axp_clr_bits(axp->dev,AXP19_GPIO67_CFG1,0x40);
			case 7: axp_set_bits(axp->dev,AXP19_GPIO67_CFG0,0x01);
					return axp_clr_bits(axp->dev,AXP19_GPIO67_CFG1,0x04);
			default:return -ENXIO;
		}
	}
	else if(mux == 0){//input
		switch(gpio){
			case 0: axp_clr_bits(axp->dev,AXP19_GPIO0_CFG,0x06);
					return axp_set_bits(axp->dev,AXP19_GPIO0_CFG,0x01);
			case 1: axp_clr_bits(axp->dev,AXP19_GPIO1_CFG,0x06);
					return axp_set_bits(axp->dev,AXP19_GPIO1_CFG,0x01);
			case 2: axp_clr_bits(axp->dev,AXP19_GPIO2_CFG,0x06);
					return axp_set_bits(axp->dev,AXP19_GPIO2_CFG,0x01);
			case 3: axp_set_bits(axp->dev,AXP19_GPIO34_CFG,0x82);
					return axp_clr_bits(axp->dev,AXP19_GPIO34_CFG,0x01);
			case 4: axp_set_bits(axp->dev,AXP19_GPIO34_CFG,0x88);
					return axp_clr_bits(axp->dev,AXP19_GPIO34_CFG,0x04);
			case 5: axp_set_bits(axp->dev,AXP19_GPIO5_CFG,0xC0);
			case 6: axp_set_bits(axp->dev,AXP19_GPIO67_CFG0,0x01);
					return axp_set_bits(axp->dev,AXP19_GPIO67_CFG1,0x40);
			case 7: axp_set_bits(axp->dev,AXP19_GPIO67_CFG0,0x01);
					return axp_set_bits(axp->dev,AXP19_GPIO67_CFG1,0x04);
			default:return -ENXIO;
		}
	}
	return -ENXIO;
}
예제 #6
0
static int axp_gpio_get_data(int gpio)
{
	int io_state;
	uint8_t ret;
	uint8_t val;
	int value;
	struct axp_dev *axp = NULL;

	axp = axp_dev_lookup(AXP19);
	if (NULL == axp) {
		printk("%s: axp data is null\n", __func__);
		return -ENXIO;
	}
	ret = axp_gpio_get_io(gpio,&io_state);
	if(ret)
		return ret;

	if(io_state){
		switch(gpio)
		{
			case 0:ret = axp_read(axp->dev,AXP19_GPIO012_STATE,&val); value = val & 0x01;break;
			case 1:ret = axp_read(axp->dev,AXP19_GPIO012_STATE,&val); value = (val & 0x02)?1:0;break;
			case 2:ret = axp_read(axp->dev,AXP19_GPIO012_STATE,&val); value = (val & 0x04)?1:0;break;
			case 3:ret = axp_read(axp->dev,AXP19_GPIO34_STATE,&val); value =val & 0x01;break;
			case 4:ret = axp_read(axp->dev,AXP19_GPIO34_STATE,&val); value =(val & 0x02)?1:0;break;
			case 5:ret = axp_read(axp->dev,AXP19_GPIO5_STATE,&val); value =(val & 0x20)?1:0;break;
			case 6:ret = axp_read(axp->dev,AXP19_GPIO67_STATE,&val); value =(val & 0x20)?1:0;break;
			case 7:ret = axp_read(axp->dev,AXP19_GPIO67_STATE,&val); value =(val & 0x02)?1:0;break;
			default:return -ENXIO;
		}
	}
	else{
		switch(gpio)
		{
			case 0:ret = axp_read(axp->dev,AXP19_GPIO012_STATE,&val); value = (val & 0x10)?1:0;break;
			case 1:ret = axp_read(axp->dev,AXP19_GPIO012_STATE,&val); value = (val & 0x20)?1:0;break;
			case 2:ret = axp_read(axp->dev,AXP19_GPIO012_STATE,&val); value = (val & 0x40)?1:0;break;
			case 3:ret = axp_read(axp->dev,AXP19_GPIO34_STATE,&val); value = (val & 0x10)?1:0;break;
			case 4:ret = axp_read(axp->dev,AXP19_GPIO34_STATE,&val); value = (val & 0x20)?1:0;break;
			case 5:ret = axp_read(axp->dev,AXP19_GPIO5_STATE,&val); value = (val & 0x10);break;
			case 6:ret = axp_read(axp->dev,AXP19_GPIO67_STATE,&val); value =(val & 0x10)?1:0;break;
			case 7:ret = axp_read(axp->dev,AXP19_GPIO67_STATE,&val); value =(val & 0x01)?1:0;break;
			default:return -ENXIO;
		}
	}
	return value;
}
예제 #7
0
static int axp_gpio_set_data(int gpio, int value)
{
	struct axp_dev *axp = NULL;

	axp = axp_dev_lookup(AXP19);
	if (NULL == axp) {
		printk("%s: %d axp data is null\n", __func__, __LINE__);
		return -ENXIO;
	}

	if(value){//high
		switch(gpio) {
			case 0: return axp_set_bits(axp->dev,AXP19_GPIO012_STATE,0x01);
			case 1: return axp_set_bits(axp->dev,AXP19_GPIO012_STATE,0x02);
			case 2: return axp_set_bits(axp->dev,AXP19_GPIO012_STATE,0x04);
			case 3: return axp_set_bits(axp->dev,AXP19_GPIO34_STATE,0x01);
			case 4: return axp_set_bits(axp->dev,AXP19_GPIO34_STATE,0x02);
			case 5: return axp_set_bits(axp->dev,AXP19_GPIO5_STATE,0x20);
			case 6: return axp_set_bits(axp->dev,AXP19_GPIO67_STATE,0x20);
			case 7: return axp_set_bits(axp->dev,AXP19_GPIO67_STATE,0x02);
			default:break;
		}
	}else{//low
		switch(gpio){
			case 0: return axp_clr_bits(axp->dev,AXP19_GPIO012_STATE,0x01);
			case 1: return axp_clr_bits(axp->dev,AXP19_GPIO012_STATE,0x02);
			case 2: return axp_clr_bits(axp->dev,AXP19_GPIO012_STATE,0x04);
			case 3: return axp_clr_bits(axp->dev,AXP19_GPIO34_STATE,0x01);
			case 4: return axp_clr_bits(axp->dev,AXP19_GPIO34_STATE,0x02);
			case 5: return axp_clr_bits(axp->dev,AXP19_GPIO5_STATE,0x20);
			case 6: return axp_clr_bits(axp->dev,AXP19_GPIO67_STATE,0x20);
			case 7: return axp_clr_bits(axp->dev,AXP19_GPIO67_STATE,0x02);
			default:break;
		}
	}
	return -ENXIO;
}
예제 #8
0
void axp20_power_off(int power_start)
{
	uint8_t val;
	struct axp_dev *axp;
	axp = axp_dev_lookup(AXP20);
	if (NULL == axp) {
		printk("%s: axp data is null\n", __func__);
		return;
	}
	if(axp20_config.pmu_pwroff_vol >= 2600 && axp20_config.pmu_pwroff_vol <= 3300){
		if (axp20_config.pmu_pwroff_vol > 3200){
			val = 0x7;
		}
		else if (axp20_config.pmu_pwroff_vol > 3100){
			val = 0x6;
		}
		else if (axp20_config.pmu_pwroff_vol > 3000){
			val = 0x5;
		}
		else if (axp20_config.pmu_pwroff_vol > 2900){
			val = 0x4;
		}
		else if (axp20_config.pmu_pwroff_vol > 2800){
			val = 0x3;
		}
		else if (axp20_config.pmu_pwroff_vol > 2700){
			val = 0x2;
		}
		else if (axp20_config.pmu_pwroff_vol > 2600){
			val = 0x1;
		}
		else
			val = 0x0;

		axp_update(axp->dev, POWER20_VOFF_SET, val, 0x7);
	}
	val = 0xff;
	if (!use_cou){
		axp_read(axp->dev, POWER20_COULOMB_CTL, &val);
		val &= 0x3f;
		axp_write(axp->dev, POWER20_COULOMB_CTL, val);
		val |= 0x80;
		val &= 0xbf;
		axp_write(axp->dev, POWER20_COULOMB_CTL, val);
	}
	//led auto
	axp_clr_bits(axp->dev,0x32,0x38);
	axp_clr_bits(axp->dev,0xb9,0x80);

	printk("[axp] send power-off command!\n");
	mdelay(20);
	if(axp20_config.power_start != 1){
		axp_write(axp->dev, POWER20_INTSTS3, 0x03);
		axp_read(axp->dev, POWER20_STATUS, &val);
		if(val & 0xF0){
			axp_read(axp->dev, POWER20_MODE_CHGSTATUS, &val);
		    	if(val & 0x20){
				printk("[axp] set flag!\n");
		        	axp_write(axp->dev, POWER20_DATA_BUFFERC, 0x0f);
	            		mdelay(20);
			    	printk("[axp] reboot!\n");
			    	machine_restart(NULL);
			    	printk("[axp] warning!!! arch can't ,reboot, maybe some error happend!\n");
		    	}
		}
	}
	axp_write(axp->dev, POWER20_DATA_BUFFERC, 0x00);
	//axp_write(&axp->dev, 0xf4, 0x06);
	//axp_write(&axp->dev, 0xf2, 0x04);
	//axp_write(&axp->dev, 0xff, 0x01);
	//axp_write(&axp->dev, 0x04, 0x01);
	//axp_clr_bits(&axp->dev, 0x03, 0xc0);
	//axp_write(&axp->dev, 0xff, 0x00);
	//mdelay(20);
	axp_set_bits(axp->dev, POWER20_OFF_CTL, 0x80);
	mdelay(20);
	printk("[axp] warning!!! axp can't power-off, maybe some error happend!\n");
}
예제 #9
0
/* axp driver porting interface */
int axp_gpio_get_io(int gpio, int *io_state)
{
	uint8_t val;
	struct axp_dev *axp = NULL;

	axp = axp_dev_lookup(AXP19);
	if (NULL == axp) {
		printk("%s: axp data is null\n", __func__);
		return -ENXIO;
	}

	switch(gpio)
	{
		case 0: axp_read(axp->dev,AXP19_GPIO0_CFG,&val);val &= 0x07;
				if(val == 0x00)
					*io_state = 1;
				else if (val == 0x01)
					*io_state = 0;
				else
					return -EIO;
				break;
		case 1: axp_read(axp->dev,AXP19_GPIO1_CFG,&val);val &= 0x07;
				if(val < 0x00)
					*io_state = 1;
				else if (val == 0x01)
					*io_state = 0;
				else
					return -EIO;
				break;
		case 2: axp_read(axp->dev,AXP19_GPIO2_CFG,&val);val &= 0x07;
				if(val == 0x0)
					*io_state = 1;
				else if (val == 0x01)
					*io_state = 0;
				else
					return -EIO;
				break;
		case 3: axp_read(axp->dev,AXP19_GPIO34_CFG,&val);val &= 0x03;
				if(val == 0x1)
					*io_state = 1;
				else if(val == 0x2)
					*io_state = 0;
				else
					return -EIO;
				break;
		case 4: axp_read(axp->dev,AXP19_GPIO34_CFG,&val);val &= 0x0C;
				if(val == 0x4)
					*io_state = 1;
				else if(val == 0x8)
					*io_state = 0;
				else
					return -EIO;
				break;
		case 5: axp_read(axp->dev,AXP19_GPIO5_CFG,&val);val &= 0x40;
				*io_state = val >> 6;
				break;
		case 6: axp_read(axp->dev,AXP19_GPIO67_CFG1,&val);*io_state = (val & 0x40)?0:1;break;
		case 7: axp_read(axp->dev,AXP19_GPIO67_CFG1,&val);*io_state = (val & 0x04)?0:1;break;
		default:return -ENXIO;
	}

		return 0;
}
예제 #10
0
static int axp_gpio_set_data(int gpio, int value)
{
	struct axp_dev *axp = NULL;

	if ((0 <= gpio) && (4 >= gpio)) {
#ifdef CONFIG_AW_AXP22
		axp = axp_dev_lookup(AXP22);
#elif defined(CONFIG_AW_AXP81X)
		axp = axp_dev_lookup(AXP81X);
#endif
		if (NULL == axp) {
			printk("%s: %d axp data is null\n", __func__, __LINE__);
			return -ENXIO;
		}
	} else if ((5 <= gpio) && (6 >= gpio)) {
		axp = axp_dev_lookup(AXP15);
		if (NULL == axp) {
			printk("%s: %d axp data is null\n", __func__, __LINE__);
			return -ENXIO;
		}
	} else {
		return -ENXIO;
	}

	if(value){//high
		switch(gpio) {
			case 0: 
				return axp_update_sync(axp->dev,AXP_GPIO0_CFG,0x01,0x07);
			case 1: 
				return axp_update_sync(axp->dev,AXP_GPIO1_CFG,0x01,0x07);
			case 2: 
				return axp_set_bits(axp->dev,AXP_GPIO2_CFG,0x80);
			case 3: 
				axp_clr_bits(axp->dev,AXP_GPIO3_CFG,0x30);
				return axp_clr_bits(axp->dev,AXP_GPIO3_CFG, 0x08);
			case 4: 
				axp_clr_bits(axp->dev,AXP_GPIO4_CFG, 0x10);
				return axp_set_bits(axp->dev,AXP_GPIO4_STA,0x04);
			case 5:
				return axp_set_bits(axp->dev,AXP_GPIO5_CFG,0x03);
			case 6:
				return axp_set_bits(axp->dev,AXP_GPIO6_CFG,0x80);
			default:break;
		}
	}else{//low
		switch(gpio){
			case 0:
				return axp_update_sync(axp->dev,AXP_GPIO0_CFG,0x0,0x07);
			case 1: 
				return axp_update_sync(axp->dev,AXP_GPIO1_CFG,0x0,0x07);
			case 2: 
				return axp_clr_bits(axp->dev,AXP_GPIO2_CFG,0x80);
			case 3: 
				axp_set_bits(axp->dev,AXP_GPIO3_CFG,0x30);
				return axp_clr_bits(axp->dev,AXP_GPIO3_CFG, 0x08);
			case 4: 
				axp_clr_bits(axp->dev,AXP_GPIO4_CFG, 0x10);
				return axp_clr_bits(axp->dev,AXP_GPIO4_STA,0x04);
			case 5:
				return axp_update_sync(axp->dev,AXP_GPIO5_CFG,0x02,0x07);
			case 6:
				return axp_clr_bits(axp->dev,AXP_GPIO6_CFG,0x80);
			default:break;
		}
	}
	return -ENXIO;
}