Esempio n. 1
0
void mt_gpio_checkpoint_compare(void)
{
#if defined(GPIO_INIT_DEBUG)
    UINT32 latest[sizeof(gpio_init_value)/((sizeof(UINT32))*(MASK_BIT+1))];
    int idx;

    memset(&latest[0], 0x00, sizeof(latest));
    for (idx = 0; idx < sizeof(gpio_init_value)/((sizeof(UINT32))*(MASK_BIT+1)); idx++)
        latest[idx] = GPIO_RD32(gpio_init_value[idx][0]);

    if (memcmp(&latest, &save, sizeof(gpio_init_value)/((sizeof(UINT32))*(MASK_BIT+1)))) {
        GPIODBG("checkpoint compare fail!!\n");
        GPIODBG("dump checkpoint....\n");
        //mt_gpio_dump(&save);
        GPIODBG("\n\n");
        GPIODBG("dump current state\n");
        //mt_gpio_dump(&latest);
        GPIODBG("\n\n");
        mt_gpio_dump_diff(&save, &latest);
        //WARN_ON(1);
    } else {
        GPIODBG("checkpoint compare success!!\n");
    }
#endif
	//mt_gpio_checkpoint_compare_ext();
}
/*---------------------------------------------------------------------------*/
int mt_set_gpio_dir_base(unsigned long pin, unsigned long dir)
{
	unsigned long bit;

	if (pin >= MAX_GPIO_PIN)
		return -ERINVAL;

	if (dir >= GPIO_DIR_MAX)
		return -ERINVAL;
	/* GPIOERR("before  pin:%ld, dir:%ld\n",pin,dir); */
	/* pos = pin / MAX_GPIO_REG_BITS; */
	bit = DIR_offset[pin].offset;
#ifdef GPIO_BRINGUP
	reg = GPIO_RD32(DIR_addr[pin].addr);
	if (dir == GPIO_DIR_IN)
		reg &= (~(1 << bit));
	else
		reg |= (1 << bit);

	GPIO_WR32(DIR_addr[pin].addr, reg);
#else
	if (dir == GPIO_DIR_IN)
		GPIO_SET_BITS((1L << bit), DIR_addr[pin].addr + 8);
	else
		GPIO_SET_BITS((1L << bit), DIR_addr[pin].addr + 4);
#endif

	/* GPIOERR("%s:pin:%ld, dir:%ld, value:0x%x\n",__FUNCTION__, pin, dir, GPIO_RD32(DIR_addr[pin].addr)); */
	return RSUCCESS;
}
Esempio n. 3
0
/*---------------------------------------------------------------------------*/
int mt_get_gpio_pull_select_base(unsigned long pin)
{
    unsigned long pos;
    unsigned long bit;
    unsigned long data=0;
    unsigned long i,j;
    GPIO_REGS *reg = gpio_reg;

    /*for special kpad pupd*/
    for(i = 0; i < sizeof(kpad_pupd_spec)/sizeof(kpad_pupd_spec[0]); i++) {
        if (pin == kpad_pupd_spec[i].pin) {
            data = GPIO_RD32(&reg->kpad_ctrl[kpad_pupd_spec[i].reg].val);
            return (((data & (1L << kpad_pupd_spec[i].bit)) != 0)? 0: 1);
        }
    }

    if (((pin >= GPIO114)&&(pin <= GPIO119))||((pin >= GPIO99)&&(pin <= GPIO104))||((pin >= GPIO124)&&(pin <= GPIO129))) {
        /* msdc IO */
        for(i = 0; i < sizeof(msdc_pupd_spec)/sizeof(msdc_pupd_spec[0]); i++) {
            for(j = 0; j < sizeof(msdc_pupd_spec[0])/sizeof(msdc_pupd_spec[0][0]); j++) {
                if (pin == msdc_pupd_spec[i][j].pin) {
                    if (i == 0) {
                        data = GPIO_RD32(&reg->msdc1_ctrl[msdc_pupd_spec[i][j].reg].val);
                    } else if (i == 1) {
                        data = GPIO_RD32(&reg->msdc2_ctrl[msdc_pupd_spec[i][j].reg].val);
                    } else if (i == 2) {
                        data = GPIO_RD32(&reg->msdc3_ctrl[msdc_pupd_spec[i][j].reg].val);
                    }
                }
                return (((data & (1L << msdc_pupd_spec[i][j].bit)) != 0)? 0: 1);
            }
        }
    } else if((pin >= GPIO141)&&(pin <= GPIO166)) {
        return GPIO_PULL_EN_UNSUPPORTED;
    } else {
        pos = pin / MAX_GPIO_REG_BITS;
        bit = pin % MAX_GPIO_REG_BITS;

        data = GPIO_RD32(&reg->pullsel[pos].val);
    }
    return (((data & (1L << bit)) != 0)? 1: 0);
}
Esempio n. 4
0
void mt_gpio_checkpoint_save_ext(void)
{
#if defined(GPIO_INIT_DEBUG)
    int idx;

    memset(save_ext, 0x00, sizeof(gpio_init_value_ext)/((sizeof(UINT32))*(MASK_BIT+1)));
    for (idx = 0; idx < sizeof(gpio_init_value_ext)/((sizeof(UINT32))*(MASK_BIT+1)); idx++)
        save_ext[idx] = GPIO_RD32(gpio_init_value_ext[idx][0]);

#endif
}
Esempio n. 5
0
/*----------------------------------------------------------------------------*/
void mt_gpio_checkpoint_save(void)
{
#if defined(GPIO_INIT_DEBUG)    
    GPIO_REGS *pReg = (GPIO_REGS*)(GPIO_BASE);
    GPIO_REGS *cur = &saved;
    unsigned int idx;
    
    memset(cur, 0x00, sizeof(*cur));
    for (idx = 0; idx < sizeof(pReg->dir)/sizeof(pReg->dir[0]); idx++)
        cur->dir[idx].val = GPIO_RD32(&pReg->dir[idx]);
    for (idx = 0; idx < sizeof(pReg->pullen)/sizeof(pReg->pullen[0]); idx++)
        cur->pullen[idx].val = GPIO_RD32(&pReg->pullen[idx]);
    for (idx = 0; idx < sizeof(pReg->pullsel)/sizeof(pReg->pullsel[0]); idx++)
        cur->pullsel[idx].val =GPIO_RD32(&pReg->pullsel[idx]);
    for (idx = 0; idx < sizeof(pReg->dout)/sizeof(pReg->dout[0]); idx++)
        cur->dout[idx].val = GPIO_RD32(&pReg->dout[idx]);
    for (idx = 0; idx < sizeof(pReg->mode)/sizeof(pReg->mode[0]); idx++)
        cur->mode[idx].val = GPIO_RD32(&pReg->mode[idx]);    

#endif     
}
Esempio n. 6
0
/*----------------------------------------------------------------------------*/
void mt_gpio_checkpoint_compare(void)
{
#if defined(GPIO_INIT_DEBUG)        
    GPIO_REGS *pReg = (GPIO_REGS*)(GPIO_BASE);
    GPIO_REGS latest;
    GPIO_REGS *cur = &latest;
    unsigned int idx;
    
    memset(cur, 0x00, sizeof(*cur));
    for (idx = 0; idx < sizeof(pReg->dir)/sizeof(pReg->dir[0]); idx++)
        cur->dir[idx].val = GPIO_RD32(&pReg->dir[idx]);
    for (idx = 0; idx < sizeof(pReg->pullen)/sizeof(pReg->pullen[0]); idx++)
        cur->pullen[idx].val = GPIO_RD32(&pReg->pullen[idx]);
    for (idx = 0; idx < sizeof(pReg->pullsel)/sizeof(pReg->pullsel[0]); idx++)
        cur->pullsel[idx].val =GPIO_RD32(&pReg->pullsel[idx]);
/*    for (idx = 0; idx < sizeof(pReg->dinv)/sizeof(pReg->dinv[0]); idx++)
        cur->dinv[idx].val =GPIO_RD32(&pReg->dinv[idx]);*/
    for (idx = 0; idx < sizeof(pReg->dout)/sizeof(pReg->dout[0]); idx++)
        cur->dout[idx].val = GPIO_RD32(&pReg->dout[idx]);
    for (idx = 0; idx < sizeof(pReg->mode)/sizeof(pReg->mode[0]); idx++)
        cur->mode[idx].val = GPIO_RD32(&pReg->mode[idx]);    
 
    //mt_gpio_dump_diff(&latest, &saved);
    //GPIODBG("memcmp(%p, %p, %d) = %d\n", &latest, &saved, sizeof(GPIO_REGS), memcmp(&latest, &saved, sizeof(GPIO_REGS)));
    if (memcmp(&latest, &saved, sizeof(GPIO_REGS))) {
        GPIODBG("checkpoint compare fail!!\n");
        GPIODBG("dump checkpoint....\n");
        //mt_gpio_dump(&saved);
        GPIODBG("\n\n");
        GPIODBG("dump current state\n");
        //mt_gpio_dump(&latest);
        GPIODBG("\n\n");
        mt_gpio_dump_diff(&saved, &latest);        
        //WARN_ON(1);
    } else {
        GPIODBG("checkpoint compare success!!\n");
    }
#endif    
}
Esempio n. 7
0
/*---------------------------------------------------------------------------*/
int mt_get_gpio_ies_base(unsigned long pin)
{
    int i = 0;
    unsigned long data;
    GPIO_REGS *reg = gpio_reg;

    for(; i < ARRAY_SIZE(mt_ies_smt_map); i++) {
        if(pin >= mt_ies_smt_map[i].index_start && pin <= mt_ies_smt_map[i].index_end)
            break;
    }
    data = GPIO_RD32(&reg->ies[mt_ies_smt_map[i].reg_index].val);
    return (((data & (1L << mt_ies_smt_map[i].bit)) != 0)? 1: 0);
}
/*---------------------------------------------------------------------------*/
int mt_get_gpio_dir_base(unsigned long pin)
{
	unsigned long bit;
	unsigned long reg;

	if (pin >= MAX_GPIO_PIN)
		return -ERINVAL;

	bit = DIR_offset[pin].offset;

	reg = GPIO_RD32(DIR_addr[pin].addr);
	return ((reg & (1L << bit)) != 0) ? 1 : 0;
}
/*---------------------------------------------------------------------------*/
int mt_get_gpio_pull_select_base(unsigned long pin)
{

	unsigned long data;
	unsigned long bit = 0;
	u32 mask = (1L << 4) - 1;

	if (pin >= 160 && pin <= 165) {

		bit = pupd_offset[pin].offset;
		data = GPIO_RD32(pupd_addr[pin].addr);
		return ((((data >> bit) & mask) == 0x2)) ? 1 : 0;
	}
Esempio n. 10
0
/*---------------------------------------------------------------------------*/
int mt_get_gpio_in_base(unsigned long pin)
{
    unsigned long pos;
    unsigned long bit;
    unsigned long data;
    GPIO_REGS *reg = gpio_reg;

    pos = pin / MAX_GPIO_REG_BITS;
    bit = pin % MAX_GPIO_REG_BITS;

    data = GPIO_RD32(&reg->din[pos].val);
    return (((data & (1L << bit)) != 0)? 1: 0);
}
/*---------------------------------------------------------------------------*/
int mt_get_gpio_ies_base(unsigned long pin)
{
	unsigned long data;

	if (pin >= MAX_GPIO_PIN)
		return -ERINVAL;

	if (IES_offset[pin].offset == -1)
		return GPIO_IES_UNSUPPORTED;

	data = GPIO_RD32(IES_addr[pin].addr);
	return ((data & (1L << (IES_offset[pin].offset))) != 0) ? 1 : 0;

}
/*---------------------------------------------------------------------------*/
int mt_get_gpio_smt_base(unsigned long pin)
{
	unsigned long data;
	unsigned long bit = 0;

	bit = SMT_offset[pin].offset;
	if (pin >= MAX_GPIO_PIN)
		return -ERINVAL;

	if (SMT_offset[pin].offset == -1)
		return GPIO_SMT_UNSUPPORTED;
	data = GPIO_RD32(SMT_addr[pin].addr);
	return ((data & (1L << bit)) != 0) ? 1 : 0;
}
Esempio n. 13
0
void mt_gpio_set_driving(void)
{
#if 0
    u32 val;
    u32 mask;

    /* [MT6571] for MD BSI request */
    mask = 0x3000;
    val = GPIO_RD32(IO_CFG_T_BASE+0xF0);
    val &= ~(mask);
    val |= (0x0000 & mask);
    GPIO_WR32(IO_CFG_T_BASE+0xF0, val);
    /* [MT6571] end */

    /* [MT6571] for desense request (AUD IO) */
    mask = 0x30;
    val = GPIO_RD32(IO_CFG_L_BASE+0xA0);
    val &= ~(mask);
    val |= (0x00 & mask);
    GPIO_WR32(IO_CFG_L_BASE+0xA0, val);
    /* [MT6571] end */
#endif
}
/*---------------------------------------------------------------------------*/
int mt_get_gpio_pull_enable_base(unsigned long pin)
{
	unsigned long data;
	u32 bit = 0;


	if (pin >= MAX_GPIO_PIN)
		return -ERINVAL;

	if (PULLEN_offset[pin].offset == -1 && pupd_offset[pin].offset == -1)
		return GPIO_PULL_EN_UNSUPPORTED;

	if (PULLEN_offset[pin].offset != -1) {
		bit = PULLEN_offset[pin].offset;
		data = GPIO_RD32(PULLEN_addr[pin].addr);
		return ((data & (1L << bit)) != 0) ? 1 : 0;
	}

	bit = pupd_offset[pin].offset;
	data = GPIO_RD32(pupd_addr[pin].addr);
	return ((data & (0x7 << bit)) != 0) ? 1 : 0;

}
Esempio n. 15
0
void mt_gpio_set_dsel(u8 bpi_1v8)
{
    GPIO_REGS *pReg = (GPIO_REGS*)(GPIO_BASE);
	
	if (bpi_1v8 == GPIO_VIO18) {
		/*bpi_ctrl[9:4] = b`000000, [3:0] = b`0000*/
		GPIO_WR32(&pReg->bpi_ctrl[0].rst, 0x3FF);
	} else if (bpi_1v8 == GPIO_VIO28){
		/*bpi_ctrl[9:4] = b`001100, [3:0] = b`0101*/
		GPIO_WR32(&pReg->bpi_ctrl[0].set, 0xC5);
		GPIO_WR32(&pReg->bpi_ctrl[0].rst, 0x33A);
	}

	GPIOVER("BPI 0x%x\n",GPIO_RD32(&pReg->bpi_ctrl[0].val)); 		
}	
Esempio n. 16
0
/*---------------------------------------------------------------------------*/
int mt_get_gpio_mode_base(unsigned long pin)
{
    unsigned long pos;
    unsigned long bit;
    unsigned long data;
    unsigned long mask = (1L << GPIO_MODE_BITS) - 1;
    GPIO_REGS *reg = gpio_reg;

    pos = pin / MAX_GPIO_MODE_PER_REG;
    bit = pin % MAX_GPIO_MODE_PER_REG;

    data = GPIO_RD32(&reg->mode[pos].val);

    return ((data >> (GPIO_MODE_BITS*bit)) & mask);
}
Esempio n. 17
0
void mt_gpio_set_power(void)
{
#if 0
    u32 val;

    val = GPIO_RD32(GPIO_BASE+0x510);
    
    if(((val & 0x100)>>8) == 1){
	GPIO_WR32(IO_CFG_L_BASE+0x48, 0x8000);
    }
    if(((val & 0x200)>>9) == 1){
	GPIO_WR32(IO_CFG_L_BASE+0x48, 0x10000);
    }
#endif
}
Esempio n. 18
0
void mt_gpio_set_default_chip(void)
{
    u32 idx;
    u32 val;
    u32 mask;

    for (idx = 0; idx < sizeof(gpio_init_value)/((sizeof(UINT32))*(MASK_BIT+1)); idx++){
	mask = gpio_init_value[idx][MASK_BIT];
	val = GPIO_RD32(gpio_init_value[idx][ADDR_BIT]);
	val &= ~(mask);
	val |= ((gpio_init_value[idx][VAL_BIT])&mask);
        GPIO_WR32(gpio_init_value[idx][ADDR_BIT],val);
    }


    //GPIOVER("mt_gpio_set_default() done\n");        
}
Esempio n. 19
0
/*---------------------------------------------------------------------------*/
int mt_set_gpio_mode_base(unsigned long pin, unsigned long mode)
{
    unsigned long pos;
    unsigned long bit;
    unsigned long data;
    unsigned long mask = (1L << GPIO_MODE_BITS) - 1;
    GPIO_REGS *reg = gpio_reg;

    pos = pin / MAX_GPIO_MODE_PER_REG;
    bit = pin % MAX_GPIO_MODE_PER_REG;

    data = GPIO_RD32(&reg->mode[pos].val);

    data &= ~(mask << (GPIO_MODE_BITS*bit));
    data |= (mode << (GPIO_MODE_BITS*bit));

    GPIO_WR32(&reg->mode[pos].val, data);

    return RSUCCESS;
}
/*---------------------------------------------------------------------------*/
int mt_set_gpio_smt_base(unsigned long pin, unsigned long enable)
{
	/* unsigned long flags; */

	if (pin >= MAX_GPIO_PIN)
		return -ERINVAL;
#ifdef GPIO_BRINGUP

	if (SMT_offset[pin].offset == -1) {
		return GPIO_SMT_UNSUPPORTED;

	} else {
		bit = SMT_offset[pin].offset;
		reg = GPIO_RD32(SMT_addr[pin].addr);
		if (enable == GPIO_SMT_DISABLE)
			reg &= (~(1 << bit));
		else
			reg |= (1 << bit);
	}
	/* printk("SMT addr(%x),value(%x)\n",SMT_addr[pin].addr,GPIO_RD32(SMT_addr[pin].addr)); */
	GPIO_WR32(SMT_addr[pin].addr, reg);
#else

	if (SMT_offset[pin].offset == -1) {
		gpio_smt_unsupport[pin] = -1;
		return GPIO_SMT_UNSUPPORTED;
	}

	if (enable == GPIO_SMT_DISABLE)
		GPIO_SET_BITS((1L << (SMT_offset[pin].offset)), SMT_addr[pin].addr + 8);
	else
		GPIO_SET_BITS((1L << (SMT_offset[pin].offset)), SMT_addr[pin].addr + 4);

#endif

	/* GPIOERR("%s:pin:%ld, enable:%ld, value:0x%x\n",__FUNCTION__, pin, enable, GPIO_RD32(SMT_addr[pin].addr)); */

	return RSUCCESS;
}
/*---------------------------------------------------------------------------*/
int mt_set_gpio_pull_enable_base(unsigned long pin, unsigned long enable)
{
	if (pin >= MAX_GPIO_PIN)
		return -ERINVAL;



#ifdef GPIO_BRINGUP
	bit = PULLEN_offset[pin].offset;
	if (PULLEN_offset[pin].offset == -1)
		return GPIO_PULL_EN_UNSUPPORTED;
	reg = GPIO_RD32(PULLEN_addr[pin].addr);
	if (enable == GPIO_PULL_DISABLE)
		reg &= (~(1 << bit));
	else
		reg |= (1 << bit);

	GPIO_WR32(PULLEN_addr[pin].addr, reg);
#else

	if (PULLEN_offset[pin].offset == -1) {
		gpio_pullen_unsupport[pin] = -1;
		return GPIO_PULL_EN_UNSUPPORTED;
	}

	if (enable == GPIO_PULL_DISABLE)
		GPIO_SET_BITS((1L << (PULLEN_offset[pin].offset)),
				      PULLEN_addr[pin].addr + 8);
	else
		GPIO_SET_BITS((1L << (PULLEN_offset[pin].offset)),
				      PULLEN_addr[pin].addr + 4);

#endif

	return RSUCCESS;
}
/*---------------------------------------------------------------------------*/
int mt_set_gpio_pull_select_base(unsigned long pin, unsigned long select)
{
	/* unsigned long flags; */

	unsigned long bit = 0;
	/*u32 mask = (1L << 4) - 1;*/
	if (pin >= MAX_GPIO_PIN)
		return -ERINVAL;

	if (pin == 5) {
		pr_err("XXX MSDC SD CD PIN be touched!\n");
		dump_stack();
	}
#ifdef GPIO_BRINGUP


	if (PULL_offset[pin].offset == -1 && pupd_offset[pin].offset == -1)
		return GPIO_PULL_UNSUPPORTED;

	if (pin >= 160 && pin <= 165) {

		bit = pupd_offset[pin].offset;
		reg = GPIO_RD32(pupd_addr[pin].addr);
		if (select == GPIO_PULL_UP) {	/* 0x2 pull up */
			reg &= (~(mask << bit));
			reg |= (0x2 << bit);
		} else {	/* 0x6 pull down */

			reg &= (~(mask << bit));
			reg |= (0x6 << bit);
		}
		/* printk("fwq pullset pin=%d,3.............\n",pin); */
		GPIO_WR32(pupd_addr[pin].addr, reg);
		return RSUCCESS;

	}

	/* printk("fwq pullset pin=%d,select(%d)\n",pin,select); */
	if (PULL_offset[pin].offset != -1) {

		bit = PULL_offset[pin].offset;
		reg = GPIO_RD32(PULL_addr[pin].addr);
		if (select == GPIO_PULL_DOWN)
			reg &= (~(1 << bit));
		else
			reg |= (1 << bit);
		/* printk("fwq pullset pin=%d,2.............\n",pin); */
		GPIO_WR32(PULL_addr[pin].addr, reg);
	} else {
		bit = pupd_offset[pin].offset + 2;
		reg = GPIO_RD32(pupd_addr[pin].addr);
		if (select == GPIO_PULL_UP)
			reg &= (~(1 << bit));
		else
			reg |= (1 << bit);
		/* printk("fwq pullset pin=%d,3.............\n",pin); */
		GPIO_WR32(pupd_addr[pin].addr, reg);

	}

#else

	if ((PULL_offset[pin].offset == -1) && (pupd_offset[pin].offset == -1)) {
		gpio_pull_select_unsupport[pin] = -1;
		return GPIO_PULL_UNSUPPORTED;
	}


	/* printk("fwq pullset pin=%ld,1.............\n",pin); */
	if (pin >= 160 && pin <= 165) {

		if (select == GPIO_PULL_UP) {	/* 0x2 pull up */
			/* reg &= (~(mask << bit)); */
			/* reg |= (0x2 << bit); */
			GPIO_SET_BITS((2L << (pupd_offset[pin].offset)), pupd_addr[pin].addr + 4);
		} else {	/* 0x6 pull down */

			/* reg &= (~(mask << bit)); */
			/* reg |= (0x6 << bit); */
			GPIO_SET_BITS((6L << (pupd_offset[pin].offset)), pupd_addr[pin].addr + 4);
		}

		return RSUCCESS;

	}
	/* printk("fwq pullset pin=%ld,2.............\n",pin); */
	/* printk("fwq pullset pin=%d,select(%d)\n",pin,select); */
	if (PULL_offset[pin].offset != -1) {

		bit = PULL_offset[pin].offset;
		/* reg = GPIO_RD32(PULL_addr[pin].addr); */
		if (select == GPIO_PULL_DOWN)
			GPIO_SET_BITS((1L << bit), PULL_addr[pin].addr + 8);
		else
			GPIO_SET_BITS((1L << bit), PULL_addr[pin].addr + 4);
		/* printk("fwq pullset pin=%d,2.............\n",pin); */

	} else {

		bit = pupd_offset[pin].offset + 2;
		/* reg = GPIO_RD32(pupd_addr[pin].addr); */
		if (select == GPIO_PULL_UP)
			GPIO_SET_BITS((1L << (bit)), pupd_addr[pin].addr + 8);
		else
			GPIO_SET_BITS((1L << (bit)), pupd_addr[pin].addr + 4);

	}
#endif
/* GPIOERR("%s:pin:%ld, select:%ld, value:0x%x\n",__FUNCTION__, pin, select, GPIO_RD32(PULL_addr[pin].addr)); */

	return RSUCCESS;
}
Esempio n. 23
0
void mt_gpio_set_dsel(u8 nml2_1v8,u8 bsi_1v8,u8 bpi_1v8)
{
#if 0
	u32 mask;
	u32 val;
	u32 bit;
#define TDSEL_1V8 0x0
#define TDSEL_3V3 0x5
#define RDSEL_1V8 0x0
#define RDSEL_3V3 0xC
#define GPIO_NML2_OFFSET 0x730
#define GPIO_NML2_PWMR_OFFSET 0x740
#define GPIO_BSI_OFFSET 0x750
#define GPIO_BPI_OFFSET 0x740
	//set NML2 UART
	val = GPIO_RD32(GPIO_BASE + GPIO_NML2_OFFSET);
	mask = (1L << 4) - 1;
	bit = 8;
	val &= ~(mask << (bit));
	val |= (nml2_1v8?TDSEL_1V8:TDSEL_3V3)<<bit;
	GPIO_WR32(GPIO_BASE + GPIO_NML2_OFFSET, val);

	val = GPIO_RD32(GPIO_BASE + GPIO_NML2_OFFSET);
	mask = (1L << 6) - 1;
	bit = 16;
	val &= ~(mask << (bit));
	val |= (nml2_1v8?RDSEL_1V8:RDSEL_3V3)<<bit;
	GPIO_WR32(GPIO_BASE + GPIO_NML2_OFFSET, val);

	//set NML2 PWM
	val = GPIO_RD32(GPIO_BASE + GPIO_NML2_OFFSET);
	mask = (1L << 4) - 1;
	bit = 24;
	val &= ~(mask << (bit));
	val |= (nml2_1v8?TDSEL_1V8:TDSEL_3V3)<<bit;
	GPIO_WR32(GPIO_BASE + GPIO_NML2_OFFSET, val);

	val = GPIO_RD32(GPIO_BASE + GPIO_NML2_PWMR_OFFSET);
	mask = (1L << 6) - 1;
	bit = 0;
	val &= ~(mask << (bit));
	val |= (nml2_1v8?RDSEL_1V8:RDSEL_3V3)<<bit;
	GPIO_WR32(GPIO_BASE + GPIO_NML2_PWMR_OFFSET, val);

	//set BPI
	val = GPIO_RD32(GPIO_BASE + GPIO_BPI_OFFSET);
	mask = (1L << 4) - 1;
	bit = 8;
	val &= ~(mask << (bit));
	val |= (bpi_1v8?TDSEL_1V8:TDSEL_3V3)<<bit;
	GPIO_WR32(GPIO_BASE + GPIO_BPI_OFFSET, val);

	val = GPIO_RD32(GPIO_BASE + GPIO_BPI_OFFSET );
	mask = (1L << 6) - 1;
	bit = 16;
	val &= ~(mask << (bit));
	val |= (bpi_1v8?RDSEL_1V8:RDSEL_3V3)<<bit;
	GPIO_WR32(GPIO_BASE + GPIO_BPI_OFFSET, val);

	//set BSI
	val = GPIO_RD32(GPIO_BASE + GPIO_BSI_OFFSET);
	mask = (1L << 4) - 1;
	bit = 0;
	val &= ~(mask << (bit));
	val |= (bsi_1v8?TDSEL_1V8:TDSEL_3V3)<<bit;
	GPIO_WR32(GPIO_BASE + GPIO_BSI_OFFSET, val);

	val = GPIO_RD32(GPIO_BASE + GPIO_BSI_OFFSET );
	mask = (1L << 6) - 1;
	bit = 8;
	val &= ~(mask << (bit));
	val |= (bsi_1v8?RDSEL_1V8:RDSEL_3V3)<<bit;
	GPIO_WR32(GPIO_BASE + GPIO_BSI_OFFSET, val);
	GPIOVER("NML2 0x%x,BPI 0x%x, BSI 0x%x\n",GPIO_RD32(GPIO_BASE + GPIO_NML2_OFFSET),GPIO_RD32(GPIO_BASE + GPIO_BPI_OFFSET),GPIO_RD32(GPIO_BASE + GPIO_BSI_OFFSET));
#endif
}