static __s32 camera_req_mclk_pin(__u32 csi_index) { char *csi_para[2] = {"csi0_para", "csi1_para"}; int req_status; script_item_u item; script_item_value_type_e type; /* »ñÈ¡gpio list */ type = script_get_item(csi_para[csi_index], "csi_ck", &item); if(SCIRPT_ITEM_VALUE_TYPE_PIO != type) { camera_err("script_get_item return type err\n"); return -ECFGERR; } /* ÉêÇëgpio */ req_status = gpio_request(item.gpio.gpio, NULL); if(0 != req_status) { camera_err("request gpio failed\n"); return -ENORMALPIN; } /* ÅäÖÃgpio */ if(0 != sw_gpio_setall_range(&item.gpio, 1)) { camera_err("sw_gpio_setall_range failed\n"); gpio_free(item.gpio.gpio); return -ECFGPIN; } /* ÊÍ·Ågpio */ if(0 == req_status) gpio_free(item.gpio.gpio); return 0; }
__hdle OSAL_GPIO_Request(disp_gpio_set_t *gpio_list, __u32 group_count_max) { __hdle ret = 0; struct gpio_config pcfg; if(gpio_list == NULL) return 0; pcfg.gpio = gpio_list->gpio; pcfg.mul_sel = gpio_list->mul_sel; pcfg.pull = gpio_list->pull; pcfg.drv_level = gpio_list->drv_level; pcfg.data = gpio_list->data; if(0 != gpio_request(pcfg.gpio, NULL)) { __wrn("OSAL_GPIO_Request failed, gpio_name=%s, gpio=%d\n", gpio_list->gpio_name, gpio_list->gpio); return ret; } if(0 != sw_gpio_setall_range(&pcfg, group_count_max)) { __wrn("OSAL_GPIO_Request: setall_range fail, gpio_name=%s, gpio=%d,mul_sel=%d\n", gpio_list->gpio_name, gpio_list->gpio, gpio_list->mul_sel); } else { __inf("OSAL_GPIO_Request ok, gpio_name=%s, gpio=%d,mul_sel=%d\n", gpio_list->gpio_name, gpio_list->gpio, gpio_list->mul_sel); ret = pcfg.gpio; } return ret; }
void NAND_PIORequest(__u32 nand_index) { int cnt, i; script_item_u *list = NULL; if(nand_index == 0) { //printk("[NAND] nand0 gpio_request\n"); /* 获取gpio list */ cnt = script_get_pio_list("nand0_para", &list); if(0 == cnt) { printk("get nand0_para gpio list failed\n"); return; } /* 申请gpio */ for(i = 0; i < cnt; i++) if(0 != gpio_request(list[i].gpio.gpio, NULL)) printk("request nand0_para gpio list failed\n"); /* 配置gpio list */ if(0 != sw_gpio_setall_range(&list[0].gpio, cnt)) printk("sw_gpio_setall_range failed\n"); } else if(nand_index ==1) { //printk("[NAND] nand1 gpio_request\n"); cnt = script_get_pio_list("nand1_para", &list); if(0 == cnt) { printk("get nand1_para gpio list failed\n"); return; } /* 申请gpio */ for(i = 0; i < cnt; i++) if(0 != gpio_request(list[i].gpio.gpio, NULL)) printk("request nand1_para gpio list failed\n"); /* 配置gpio list */ if(0 != sw_gpio_setall_range(&list[0].gpio, cnt)) printk("sw_gpio_setall_range failed\n"); } else { printk("NAND_PIORequest, nand_index error: 0x%x\n", nand_index); } }
static int __init sun6i_i2s_init(void) { int err = 0; int cnt = 0; int i = 0; script_item_u val; script_item_u *list = NULL; script_item_value_type_e type; type = script_get_item("i2s_para", "i2s_used", &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { printk("[I2S] type err!\n"); } i2s_used = val.val; type = script_get_item("i2s_para", "i2s_select", &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { printk("[I2S] i2s_select type err!\n"); } i2s_select = val.val; if (i2s_used) { /* get gpio list */ cnt = script_get_pio_list("i2s_para", &list); if (0 == cnt) { printk("get i2s_para gpio list failed\n"); return -EFAULT; } /* req gpio */ for (i = 0; i < cnt; i++) { if (0 != gpio_request(list[i].gpio.gpio, NULL)) { printk("[i2s] request some gpio fail\n"); goto end; } } /* config gpio list */ if (0 != sw_gpio_setall_range(&list[0].gpio, cnt)) { printk("sw_gpio_setall_range failed\n"); } if((err = platform_device_register(&sun6i_i2s_device)) < 0) return err; if ((err = platform_driver_register(&sun6i_i2s_driver)) < 0) return err; } else { printk("[I2S]sun6i-i2s cannot find any using configuration for controllers, return directly!\n"); return 0; } end: /* release gpio */ while(i--) gpio_free(list[i].gpio.gpio); return 0; }
static void ir_sys_cfg(void) { #ifdef SYS_GPIO_CFG_EN ir_gpio_hdle.type = script_get_item("ir_para", "ir_rx", &(ir_gpio_hdle.val)); if(SCIRPT_ITEM_VALUE_TYPE_PIO != ir_gpio_hdle.type) printk(KERN_ERR "IR gpio type err! \n"); dprintk(DEBUG_INIT, "value is: gpio %d, mul_sel %d, pull %d, drv_level %d, data %d\n", ir_gpio_hdle.val.gpio.gpio, ir_gpio_hdle.val.gpio.mul_sel, ir_gpio_hdle.val.gpio.pull, ir_gpio_hdle.val.gpio.drv_level, ir_gpio_hdle.val.gpio.data); if(0 != gpio_request(ir_gpio_hdle.val.gpio.gpio, NULL)) { printk(KERN_ERR "ERROR: IR Gpio_request is failed\n"); } if (0 != sw_gpio_setall_range(&ir_gpio_hdle.val.gpio, 1)) { printk(KERN_ERR "IR gpio set err!"); goto end; } #else unsigned long tmp; /* config IO: PIOB4 to IR_Rx */ tmp = readl(PI_BASE + 0x24); /* PIOB_CFG0_REG */ tmp &= ~(0xf<<16); tmp |= (0x2<<16); writel(tmp, PI_BASE + 0x24); #endif ir_clk_cfg(); return; #ifdef SYS_GPIO_CFG_EN end: gpio_free(ir_gpio_hdle.val.gpio.gpio); return; #endif }
static int __devinit gpio_sw_probe(struct platform_device *dev) { struct gpio_sw *gpio; struct gpio_sw_platdata *pdata = dev->dev.platform_data; unsigned int irq_ctl; int ret; char io_area[16]; static script_item_value_type_e type; static script_item_u item; gpio = kzalloc(sizeof(struct gpio_sw), GFP_KERNEL); GPIO_SW_DEBUG("kzalloc ok !\n"); if (gpio == NULL) { dev_err(&dev->dev, "No memory for device\n"); return -ENOMEM; } platform_set_drvdata(dev, gpio); GPIO_SW_DEBUG("platform_set_drvdata ok !\n"); gpio->pdata = pdata; type = script_get_item("3g_gpio_para", pdata->name, &item); if (SCIRPT_ITEM_VALUE_TYPE_PIO != type) { printk("script_get_item return type err\n"); return -EFAULT; } gpio->cdev.pio_hdle = item.gpio.gpio; if (0 != gpio_request_one(item.gpio.gpio, GPIOF_OUT_INIT_HIGH, NULL)) { printk("[gpio_para] gpio_request gpio:%d failed\n", item.gpio.gpio); return -EFAULT; } if (0 != sw_gpio_setall_range(&item.gpio, 1)) { printk(KERN_ERR "[gpio_para] gpio setall_range err!"); return -EFAULT; } GPIO_SW_DEBUG("pio_hdle is %x \n",gpio->cdev.pio_hdle); GPIO_SW_DEBUG("gpio_num = %s\n",pdata->name); GPIO_SW_DEBUG("pd->name = %s\n",gpio->pdata->name); gpio->cdev.port = item.gpio.port; gpio->cdev.port_num = item.gpio.port_num; gpio->cdev.mul_sel = item.gpio.mul_sel; gpio->cdev.pull = item.gpio.pull; gpio->cdev.drv_level = item.gpio.drv_level; gpio->cdev.data = item.gpio.data; gpio->cdev.irq_type = 0x0; sprintf(io_area,"P%c%d",gpio->cdev.port+'A'-1,gpio->cdev.port_num); GPIO_SW_DEBUG("io_area is %s \n",io_area); gpio->cdev.gpio_sw_cfg_set = gpio_sw_cfg_set; gpio->cdev.gpio_sw_pull_set = gpio_sw_pull_set; gpio->cdev.gpio_sw_data_set = gpio_sw_data_set; gpio->cdev.gpio_sw_drv_level_set = gpio_sw_drv_level_set; gpio->cdev.gpio_sw_cfg_get = gpio_sw_cfg_get; gpio->cdev.gpio_sw_pull_get = gpio_sw_pull_get; gpio->cdev.gpio_sw_data_get = gpio_sw_data_get; gpio->cdev.gpio_sw_drv_level_get = gpio_sw_drv_level_get; gpio->cdev.name = io_area; gpio->cdev.flags |= pdata->flags; if(gpio->cdev.mul_sel == 6) { if(gpio->cdev.port== 'H' - 'A' + 1) { if((gpio->cdev.port_num >= 0) && (gpio->cdev.port_num <= 21)) { irq_ctl = REG_RD(GPIO_TEST_BASE + 0x210); __raw_writel((1 << gpio->cdev.port_num) | irq_ctl, GPIO_TEST_BASE + 0x210); gpio->cdev.irq_num = gpio->cdev.port_num + 1; all_irq_enable = 1; } else { printk("[gpio]: this pin don`t have EINT FUNCTION\n"); kfree(gpio); return 1; } } else if(gpio->cdev.port== 'I' - 'A' + 1) { if((gpio->cdev.port_num >= 10) && (gpio->cdev.port_num <= 19)) { irq_ctl = REG_RD(GPIO_TEST_BASE + 0x210); __raw_writel((1 << (gpio->cdev.port_num + 12)) | irq_ctl, GPIO_TEST_BASE + 0x210); gpio->cdev.irq_num = gpio->cdev.port_num + 12 + 1; all_irq_enable = 1; } else { printk("[gpio]: this pin don`t have EINT FUNCTION\n"); kfree(gpio); return 1; } } else { printk("[gpio]: this area don`t have EINT FUNCTION\n"); kfree(gpio); return 1; } } gpio->cdev.irq=all_irq_enable; ret = gpio_sw_classdev_register(&dev->dev, &gpio->cdev); GPIO_SW_DEBUG("gpio_sw_classdev_register ok !\n"); if (ret < 0) { dev_err(&dev->dev, "gpio_sw_classdev_register failed\n"); kfree(gpio); return ret; } GPIO_SW_DEBUG("pio_hdle is %x \n",gpio->cdev.pio_hdle); GPIO_SW_DEBUG("gpio_sw_classdev_register good !\n"); return 0; }
static int sw_serial_get_resource(struct sw_serial_port *sport) { char uart_para[16]; int cnt, i = 0, ret; script_item_u *list = NULL; /* get register base */ sport->mmres = platform_get_resource(sport->pdev, IORESOURCE_MEM, 0); if (!sport->mmres) { ret = -ENODEV; UART_ERR("%s: uart%d no IORESOURCE_MEM\n", __func__, sport->port_no); goto err_out; } /* get clock */ sport->bus_clk_name = apb_clock_name[sport->port_no]; sport->bus_clk = clk_get(NULL, sport->bus_clk_name); if (IS_ERR(sport->bus_clk)) { ret = PTR_ERR(sport->bus_clk); UART_ERR("%s: uart%d get bus clock failed\n", __func__, sport->port_no); goto iounmap; } sport->mod_clk_name = mod_clock_name[sport->port_no]; sport->mod_clk = clk_get(NULL, sport->mod_clk_name); if (IS_ERR(sport->mod_clk)) { ret = PTR_ERR(sport->mod_clk); UART_ERR("%s: uart%d get mod clock failed\n", __func__, sport->port_no); goto iounmap; } sport->sclk = clk_get_rate(sport->mod_clk); /* get irq */ sport->irq = platform_get_irq(sport->pdev, 0); if (sport->irq == 0) { ret = -EINVAL; UART_ERR("%s: uart%d no IORESOURCE_irq\n", __func__, sport->port_no); goto iounmap; } clk_enable(sport->bus_clk); clk_enable(sport->mod_clk); clk_reset(sport->mod_clk, AW_CCU_CLK_NRESET); sprintf(uart_para, "uart_para%d", sport->port_no); cnt = script_get_pio_list(uart_para, &list); if (!cnt) { ret = -EINVAL; UART_ERR("%s: uart%d get pio list from sys_config.fex failed\n", __func__, sport->port_no); goto free_pclk; } for (i = 0; i < cnt; i++) if (gpio_request(list[i].gpio.gpio, NULL)) { ret = -EINVAL; UART_ERR("%s: uart%d request gpio%d failed\n", __func__, sport->port_no, list[i].gpio.gpio); goto free_pclk; } if (sw_gpio_setall_range(&list[0].gpio, cnt)) { UART_ERR("%s: uart%d gpio set all range error\n", __func__, sport->port_no); goto free_pclk; } return 0; free_pclk: clk_put(sport->mod_clk); clk_put(sport->bus_clk); iounmap: err_out: while (i--) gpio_free(list[i].gpio.gpio); return ret; }