void modem_pinctrl_init(void)
{
    struct modem_pintrl_cfg *pin_source = SHM_MEM_MODEM_PINTRL_ADDR;
    u32 addr_temp = 0;
    u32 pin_num   = pin_source->pintrl_size[MODEM_PIN_INIT] + pin_source->pintrl_size[MODEM_PIN_NORMAL]\
                  + pin_source->pintrl_size[MODEM_PIN_POWERDOWN];

    u32 size      = sizeof(struct modem_pintrl_cfg) + pin_num * sizeof(struct pintrl_stru);
    g_pin_cfg = osl_malloc(size);
    if(NULL == g_pin_cfg){
        ios_print_error("modem pinctrl malloc fail!size:0x%x\n",SHM_MEM_MODEM_PINTRL_SIZE);
        g_pin_cfg = SHM_MEM_MODEM_PINTRL_ADDR;
        return ;
    }
    memcpy(g_pin_cfg,SHM_MEM_MODEM_PINTRL_ADDR,size);
    addr_temp = (u32)g_pin_cfg + sizeof(struct modem_pintrl_cfg);
    g_pin_cfg->pintrl_addr[MODEM_PIN_INIT].addr.low = addr_temp;
    addr_temp = addr_temp + (g_pin_cfg->pintrl_size[MODEM_PIN_INIT])*sizeof(struct pintrl_stru);
    g_pin_cfg->pintrl_addr[MODEM_PIN_NORMAL].addr.low = addr_temp;
    addr_temp = addr_temp + (g_pin_cfg->pintrl_size[MODEM_PIN_NORMAL])*sizeof(struct pintrl_stru);
    g_pin_cfg->pintrl_addr[MODEM_PIN_POWERDOWN].addr.low = addr_temp;
    if(size > SHM_MEM_MODEM_PINTRL_SIZE){
        ios_print_error("modem pinctrl memory expend 6k!\n");
    }
    ios_print_error("modem pinctrl init ok!\n");
}
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);

}
Esempio n. 3
0
/* Top level function that updates the device tree. */
int modem_pintrl_dts_parse(int mode, PINTRL_STRU **iocfg_table, unsigned int *length)
{
	int ret;
    int len;
	int offset;

    unsigned int fdt = DDR_DTS_ADDR;
	int total_space = 0x40000;
    int *data = NULL;
    
    char pintrl_name[20]={0};
    const struct fdt_property *pro = NULL;

	/* let's give it all the room it could need */
	ret = fdt_open_into((void*)fdt, (void*)fdt, total_space);
	if (ret < 0){
		ios_print_error("Could not open modem dts, fdt=0x%x ret=0x%x.\n", fdt, ret);
		return ret;
    }

	/* Get offset of the chosen node */
	ret = fdt_path_offset((void*)fdt, "/modem_pintrl");
	if (ret < 0) {
		ios_print_error("Could not find modem_pintrl node, fdt=0x%x ret=0x%x.\n", fdt, ret);
		return ret;
	}

	offset = ret;
    
	/* Get property of the chosen node */
    pro = fdt_get_property((void*)fdt, offset, (const char*)"pinctrl-num",&len);
    if((int)pro < 0){
        ios_print_error("Could not get property, pro=0x%x fdt=0x%x offset=0x%x len=0x%x.\n", pro, fdt, offset, len);
        return -1;
    }
    
    data = (int*)pro->data;
    *length = data[mode];

    snprintf(pintrl_name,20,"pinctrl-%d",mode);
    
	/* Adding the cmdline to the chosen node */
    pro = fdt_get_property((void*)fdt, offset, pintrl_name,&len);
    if((int)pro < 0){
        ios_print_error("Could not get property, pro=0x%x fdt=0x%x offset=0x%x len=0x%x.\n", pro, fdt, offset, len);
        return -1;
    }

    *iocfg_table = (PINTRL_STRU*)pro->data;
    
	fdt_pack((void*)fdt);

	return 0;
}
void modem_pintrl_debug(int mode)
{
    unsigned int i = 0;    
    unsigned int length = 0;
    struct pintrl_stru *pintrl_stru = NULL;
    struct modem_pintrl_cfg *pintrl_cfg = g_pin_cfg;

    if((MODEM_PIN_INIT != mode) && (MODEM_PIN_NORMAL != mode) && (MODEM_PIN_POWERDOWN != mode))
    {
        ios_print_error("modem pintrl mode is error, mode=%d.\n", mode);
        return ;
    }
    
    length = pintrl_cfg->pintrl_size[mode];
    pintrl_stru = (struct pintrl_stru *)pintrl_cfg->pintrl_addr[mode].addr.low;
    
    ios_print_info("iocfg table length is %d\n", length);
    ios_print_info("  group  pin  iomg  iocg  dir  value\n");
    
    for(i = 0;i < length;i++)
    {
        //pintrl_data_convert(&iocfg_stru, &(iocfg_table[i]));

        ios_print_info("%5d %5d %5d %5d %5d %5d\n", pintrl_stru[i].ugpiog,pintrl_stru[i].ugpio_bit,\
                                                            pintrl_stru[i].iomg_val,pintrl_stru[i].iocg_val,\
                                                            pintrl_stru[i].gpio_dir,pintrl_stru[i].gpio_val);
                                                          

    }

}
Esempio n. 5
0
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 modem_pintrl_config(int mode)
{

    if((MODEM_PIN_INIT != mode) && (MODEM_PIN_NORMAL != mode) && (MODEM_PIN_POWERDOWN != mode))
    {
        ios_print_error("modem pintrl mode is error, mode=%d.\n", mode);
        return ;
    }

    pintrl_config((struct pintrl_stru *)(g_pin_cfg->pintrl_addr[mode].addr.low), g_pin_cfg->pintrl_size[mode]);

}
Esempio n. 7
0
void modem_pintrl_config(int mode)
{
    //int ret = 0;
    //unsigned int length = 0;
    
    struct modem_pintrl_cfg *pintrl_cfg = (struct modem_pintrl_cfg *)SHM_MEM_MODEM_PINTRL_ADDR;

    if((MODEM_PIN_INIT != mode) && (MODEM_PIN_NORMAL != mode) && (MODEM_PIN_POWERDOWN != mode))
    {
        ios_print_error("modem pintrl mode is error, mode=%d.\n", mode);
        return ;
    }

    /*ret = modem_pintrl_dts_parse(mode, &iocfg_table, &length);
    if(0 != ret)
    {
        ios_print_error("modem pintrl parse is fail, ret=0x%x mode=%d.\n", ret, mode);
        return;
    }*/
    
    pintrl_config(pintrl_cfg->pintrl_addr[mode], pintrl_cfg->pintrl_size[mode]);

}
Esempio n. 8
0
void modem_pintrl_debug(int mode)
{
    unsigned int i = 0;    
    unsigned int length = 0;
    struct pintrl_stru *pintrl_stru = NULL;
    struct modem_pintrl_cfg *pintrl_cfg = (struct modem_pintrl_cfg *)SHM_MEM_MODEM_PINTRL_ADDR;    

    if((MODEM_PIN_INIT != mode) && (MODEM_PIN_NORMAL != mode) && (MODEM_PIN_POWERDOWN != mode))
    {
        ios_print_error("modem pintrl mode is error, mode=%d.\n", mode);
        return ;
    }
    
    length = pintrl_cfg->pintrl_size[mode];
    pintrl_stru = pintrl_cfg->pintrl_addr[mode];
    /*ret = modem_pintrl_dts_parse(mode, &iocfg_table, &length);
    if(0 != ret)
    {
        ios_print_error("modem pintrl parse is fail, ret=0x%x mode=%d.\n", ret, mode);
        return;
    }*/
    
    ios_print_info("iocfg table length is %d\n", length);
    ios_print_info("  group  pin  iomg  iocg  dir  value\n");
    
    for(i = 0;i < length;i++)
    {
        //pintrl_data_convert(&iocfg_stru, &(iocfg_table[i]));

        ios_print_info("%5d %5d %5d %5d %5d %5d\n", pintrl_stru[i].ugpiog,pintrl_stru[i].ugpio_bit,\
                                                            pintrl_stru[i].iomg_val,pintrl_stru[i].iocg_val,\
                                                            pintrl_stru[i].gpio_dir,pintrl_stru[i].gpio_val);
                                                          

    }

}
Esempio n. 9
0
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 ;
        
    }

}