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); }
/* 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); } }
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]); }
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]); }
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); } }
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 ; } }