void bsp_set_pintrl(unsigned int type, unsigned int gpio, unsigned int value)
{
    unsigned int group = 0;
    unsigned int pin = 0;
    
    struct pintrl_stru *normal_stru = NULL;

    if(gpio > GPIO_TOTAL || (type >= MODEM_IO_BUTT))
    {
        ios_print_error("para is error, gpio = %d, type = %d, value = %d.\n", gpio, type, value);        
        return ;
    }

    group = gpio / GPIO_MAX_NUMBER;
    pin   = gpio % GPIO_MAX_NUMBER;
    
    normal_stru = get_pintrl(MODEM_PIN_NORMAL, group, pin);
    if(NULL == normal_stru)
    {
        ios_print_error("get_pintrl is fail, normal_stru = 0x%x.\n", normal_stru);  
        return ;
    }

    bsp_pinctrl_modify_dts(MODEM_PIN_NORMAL, type, gpio, value);
    bsp_pinctrl_modify_dts(MODEM_PIN_POWERDOWN, type, gpio, value);

    pintrl_config(normal_stru, 1);

}
int is_in_modem_pintrl(unsigned int gpio)
{
    unsigned int group = gpio / GPIO_MAX_NUMBER;
    unsigned int pin = gpio % GPIO_MAX_NUMBER;

    if(NULL != get_pintrl(MODEM_PIN_NORMAL,group,pin))
        return 0;

    return -1;
    
}
int bsp_get_pintrl(unsigned int type, unsigned int gpio, unsigned int *value)
{
    int ret = 0;
    unsigned int group = 0;
    unsigned int pin = 0;
    struct pintrl_stru *normal_stru = NULL;

    if(gpio > GPIO_TOTAL || (type >= MODEM_IO_BUTT) || (NULL == value))
    {
        ios_print_error("para is error, gpio = %d, type = %d, value = %d.\n", gpio, type, value);        
        return -1;
    }

    group = gpio / GPIO_MAX_NUMBER;
    pin = gpio % GPIO_MAX_NUMBER;

    normal_stru = get_pintrl(MODEM_PIN_NORMAL, group, pin);
    if(NULL == normal_stru)
    {
        ios_print_error("get_pintrl is fail, normal_stru = 0x%x.\n", normal_stru);  
        return -1;
    }

    switch(type)
    {
        case MODEM_IO_MUX:
            *value   = normal_stru->iomg_val;
            ret = 0;
            break;
            
        case MODEM_IO_CFG:
            *value   = normal_stru->iocg_val;
            ret = 0;
            break;
            
        default:
            ios_print_error("type is error, type = %d.\n", type);
            ret = -1;
    }

    return ret;
}
void bsp_set_pintrl(unsigned int type, unsigned int gpio, unsigned int value)
{
    unsigned int group = 0;
    unsigned int pin = 0;
    
    struct pintrl_stru *init_stru = NULL;
    struct pintrl_stru *normal_stru = NULL;
    struct pintrl_stru *lowpower_stru = NULL;
    
    if(gpio > GPIO_TOTAL || (type >= MODEM_IO_BUTT))
    {
        ios_print_error("para is error, gpio = %d, type = %d, value = %d.\n", gpio, type, value);        
        return ;
    }

    group = gpio / GPIO_MAX_NUMBER;
    pin = gpio % GPIO_MAX_NUMBER;
    
    init_stru = get_pintrl(MODEM_PIN_INIT, group, pin);
    if(NULL == init_stru)
    {
        ios_print_error("get_pintrl is fail, init_stru = 0x%x.\n", init_stru);  
        return ;
    }
    
    normal_stru = get_pintrl(MODEM_PIN_NORMAL, group, pin);
    if(NULL == normal_stru)
    {
        ios_print_error("get_pintrl is fail, normal_stru = 0x%x.\n", normal_stru);  
        return ;
    }
    
    lowpower_stru = get_pintrl(MODEM_PIN_POWERDOWN, group, pin);
    if(NULL == lowpower_stru)
    {
        ios_print_error("get_pintrl is fail, lowpower_stru = 0x%x.\n", lowpower_stru);  
        return ;
    }
    
    switch(type)
    {
        case MODEM_IO_MUX:
            init_stru->iomg_val     = value;
            normal_stru->iomg_val   = value;
            lowpower_stru->iomg_val = value;
            break;
            
        case MODEM_IO_CFG:
            init_stru->iocg_val     = value;
            normal_stru->iocg_val   = value;
            lowpower_stru->iocg_val = value;
            break;
            
        case MODEM_GPIO_INPUT:
            init_stru->iomg_val   = 0;
            init_stru->gpio_dir   = 0;
            
            normal_stru->iomg_val = 0;
            normal_stru->gpio_dir = 0;            
            
            lowpower_stru->iomg_val = 0;
            lowpower_stru->gpio_dir = 0;
            break;
            
        case MODEM_GPIO_OUTPUT:
            init_stru->iomg_val   = 0;
            init_stru->gpio_dir   = 1;
            init_stru->gpio_val = !!value;
            
            normal_stru->iomg_val = 0;
            normal_stru->gpio_dir = 1;
            normal_stru->gpio_val = !!value;
            
            lowpower_stru->iomg_val = 0;
            lowpower_stru->gpio_dir = 1;
            lowpower_stru->gpio_val = !!value;
            break;
            
        default:
            ios_print_error("type is error, type = %d.\n", type);
            return ;
        
    }

    pintrl_config(normal_stru, 1);
}
void bsp_pinctrl_modify_dts(u32 step ,unsigned int type, unsigned int gpio, unsigned int value)
{
    unsigned int group = 0;
    unsigned int pin   = 0;
    
    struct pintrl_stru *pin_cfg = NULL;
    
    if(gpio > GPIO_TOTAL || (type >= MODEM_IO_BUTT) || (step >= MODEM_PIN_BUTT))
    {
        ios_print_error("para is error, step = %d, gpio = %d, type = %d, value = %d.\n", step, gpio, type, value);        
        return ;
    }

    group = gpio / GPIO_MAX_NUMBER;
    pin   = gpio % GPIO_MAX_NUMBER;
    
    pin_cfg = get_pintrl(step, group, pin);
    if(NULL == pin_cfg)
    {
        ios_print_error("get_pintrl is fail, pin_cfg = 0x%x.\n", pin_cfg);  
        return ;
    }
    
    switch(type)
    {
        case MODEM_IO_MUX:
            if(PINCONFIG_NF_VAL  != pin_cfg->iomg_val){
                pin_cfg->iomg_val = value;
            }
            break;
            
        case MODEM_IO_CFG:
            if(PINCONFIG_NF_VAL  != pin_cfg->iocg_val){
                pin_cfg->iocg_val = value;
            }
            break;
            
        case MODEM_GPIO_INPUT:
            if(PINCONFIG_NF_VAL  != pin_cfg->iocg_val){
                pin_cfg->iomg_val = 0;            
            }

            if(PINCONFIG_NF_VAL  != pin_cfg->gpio_dir){
                pin_cfg->gpio_dir = 0;
            }
            break;
            
        case MODEM_GPIO_OUTPUT:
            if(PINCONFIG_NF_VAL  != pin_cfg->iomg_val){
                pin_cfg->iomg_val = 0;
            }

            if(PINCONFIG_NF_VAL  != pin_cfg->gpio_dir){
                pin_cfg->gpio_dir = 1;            
            }

            if(PINCONFIG_NF_VAL  != pin_cfg->gpio_val){
                pin_cfg->gpio_val = !!value;            
            }
            break;
            
        default:
            ios_print_error("type is error, type = %d.\n", type);
            return ;
        
    }

}