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);
	}


}
示例#4
0
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;
}
示例#5
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
	
}
示例#6
0
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;
}