This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Linux/PROCESSOR-SDK-AM437X: How to config gpio in device tree and used in driver

Part Number: PROCESSOR-SDK-AM437X


Tool/software: Linux

Hi,

I define a fpga_load  node in device tree(am437x-gp-evm.dts file):

    FPGA_Load_pins: FPGA_Load {
        compatible = "fpgaload";
        status = "okay";
        
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_fpga_load>;
        pinctrl-1 = <&pinctrl_fpga_sleep>;
        
        fpga,nSTATUS = <&gpio5 8 GPIO_ACTIVE_HIGH>;
        fpga,nDCLK = <&gpio5 9 GPIO_ACTIVE_HIGH>;
        fpga,DATA0 = <&gpio5 10 GPIO_ACTIVE_HIGH>;
        fpga,nCONFIG= <&gpio5 11 GPIO_ACTIVE_HIGH>;
        fpga,CONFIG_DONE= <&gpio5 13 GPIO_ACTIVE_HIGH>;
        fpga,RESET=<&gpio5 6 GPIO_ACTIVE_LOW>;
            

    };
in the driver program(fpgaload.c), when probe, I get gpio number with function of_get_named_gpio( node,"fpga,nSTATUS",0), the function return -2.  I  try  gpio_request( 5*32+8,"nSTATUS") ,it is also return fail with -517. I check the .dts file and cann't find problem. I attach the dts and driver program here. Is there a wrong in driver program or error(s) in the .dts file?  Our SDK version is ti-sdk-05.01.00.11.

Best Regards,

4722.am437x-gp-evm.rarfpgaload.rar

  • Hi user3529609,

    I can suggest you to refer the below DTS and C/H fiels for reference. These files are using of_get_named_gpio() and devm_gpio_request() functions.

    linux-kernel/arch/arm/boot/dts/am572x-idk-pps.dts

    pps-enable-gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;

    linux-kernel/drivers/net/ethernet/ti/cpts.h
    linux-kernel/drivers/net/ethernet/ti/cpts.c

    gpio = of_get_named_gpio(node, "pps-enable-gpios", 0);
    if (!gpio_is_valid(gpio)) {
    dev_err(cpts->dev, "failed to parse pps-enable gpio\n");
    return gpio;
    }


    cpts->pps_enable_gpio = gpio;
    gpio_direction_output(gpio, 0);

    See also below e2e threads:

    e2e.ti.com/.../390082
    e2e.ti.com/.../2386585

    Regards,
    Pavel
  • Dear Pavel,

    I cann't find what's wrong with my driver program from the example you offered! I  use the same way and same functions as the examle. I also reference other gpio driver progrm and can't find my problem. I think there may be other problem such as the kernel version etc.  

    I add node valid check in function fpga_probe  as:

    static int fpga_probe(struct platform_device *pdev)
    {

        int err = 0, ret=0;
    //    struct device *dev;
        struct device_node *node = pdev->dev.of_node;// *child;
        
        if( !node){
            printk("probe err!\n");    
            return -1;
        }

    ...

    when insmod, it return -1 with "probe err!". 

    Is there a simple character device  driver ( including ops:open,write,read, ictl,etc.)  example program with DTS?

    Best Regards,

  • Hi,

    I want to know why it return -517  when call gpio_request(5*32+11); 517 is EPROBE_DEFER ( Driver requests probe retry )defined in include/linux/errno.h. The linux driver   can work in old SDK(linux 3.14.43,ti-sdk-01.00.00.03), but return failure(-517) in the new SDK(linux4.14.67, ti-sdk-05.01.00.11).

    Best Regards,

  • I reply on your new e2e thread:

    e2e.ti.com/.../791530

    Please close this one.

    Regards,
    Pavel
  • Hi Pavel,

    I want to use gpio5_8, gpio5_9,gpio5_10,gpio5_11,gpio5_13,gpio5_6. I use function of_get_named_gpio()(GPIO_FPGA_nSTATUS = of_get_named_gpio(node,"fpga",0)) to get gpio in driver program the first time and it also return with -517.

    // GPIO_FPGA_nSTATUS = of_get_named_gpio(node,"fpga",0);//,&flag);//&flag);
    GPIO_FPGA_nSTATUS = 32*5+8;
    if(!gpio_is_valid(GPIO_FPGA_nSTATUS)){
    printk("probe gpio failed1 %d!\n",GPIO_FPGA_nSTATUS);
    return -1;
    }
    if((ret = gpio_request(GPIO_FPGA_nSTATUS,"nSTATUS"))){
    printk("request gpio failed1! %d\n", ret);
    return -1;
    }
    // GPIO_FPGA_nDCLK = of_get_named_gpio(node,"fpga",1);//,NULL);//&flag);
    GPIO_FPGA_nDCLK = 32*5+9;
    if(!gpio_is_valid(GPIO_FPGA_nDCLK)){
    gpio_free(GPIO_FPGA_nSTATUS);
    printk("probe gpio failed2!\n");
    return -1;
    }
    if(gpio_request(GPIO_FPGA_nSTATUS,"nDCLK")){
    gpio_free(GPIO_FPGA_nSTATUS);
    printk("request gpio failed2!\n");
    return -1;
    }
    // GPIO_FPGA_DATA0 = of_get_named_gpio(node,"fpga",2);//,NULL);//&flag);
    GPIO_FPGA_DATA0 = 32*5+10;
    if(!gpio_is_valid(GPIO_FPGA_DATA0)){
    gpio_free(GPIO_FPGA_nSTATUS);
    gpio_free(GPIO_FPGA_nDCLK);
    printk("probe gpio failed3!\n");
    return -1;
    }
    if(gpio_request(GPIO_FPGA_DATA0,"DATA0")){
    gpio_free(GPIO_FPGA_nSTATUS);
    gpio_free(GPIO_FPGA_nDCLK);
    printk("request gpio failed3!\n");
    return -1;
    }
    // GPIO_FPGA_nCONFIG = of_get_named_gpio(node,"fpga",3);//,NULL);//&flag);
    GPIO_FPGA_nCONFIG = 32*5+11;
    if(!gpio_is_valid(GPIO_FPGA_nCONFIG)){
    gpio_free(GPIO_FPGA_nSTATUS);
    gpio_free(GPIO_FPGA_nDCLK);
    gpio_free(GPIO_FPGA_DATA0);
    printk("probe gpio failed4!\n");
    return -1;
    }
    if(gpio_request(GPIO_FPGA_nCONFIG,"nCONFIG")){
    gpio_free(GPIO_FPGA_nSTATUS);
    gpio_free(GPIO_FPGA_nDCLK);
    gpio_free(GPIO_FPGA_DATA0);
    printk("request gpio failed4!\n");
    return -1;
    }
    // GPIO_FPGA_CONFIG_DONE = of_get_named_gpio(node,"fpga",4);//,NULL);//&flag);
    GPIO_FPGA_CONFIG_DONE = 32*5+13;
    if(!gpio_is_valid(GPIO_FPGA_CONFIG_DONE)){
    gpio_free(GPIO_FPGA_nSTATUS);
    gpio_free(GPIO_FPGA_nDCLK);
    gpio_free(GPIO_FPGA_DATA0);
    gpio_free(GPIO_FPGA_nCONFIG);
    printk("probe gpio failed5!\n");
    return -1;
    }
    if(gpio_request(GPIO_FPGA_CONFIG_DONE,"fpga,CONFIG_DONE")){
    gpio_free(GPIO_FPGA_nSTATUS);
    gpio_free(GPIO_FPGA_nDCLK);
    gpio_free(GPIO_FPGA_DATA0);
    gpio_free(GPIO_FPGA_nCONFIG);
    printk("request gpio failed5!\n");
    return -1;
    }
    // GPIO_FPGA_RESET = of_get_named_gpio(node,"fpga",5);//,NULL);//&flag);
    GPIO_FPGA_RESET = 5*32+6;
    if(!gpio_is_valid(GPIO_FPGA_RESET)){
    gpio_free(GPIO_FPGA_nSTATUS);
    gpio_free(GPIO_FPGA_nDCLK);
    gpio_free(GPIO_FPGA_DATA0);
    gpio_free(GPIO_FPGA_nCONFIG);
    gpio_free(GPIO_FPGA_CONFIG_DONE);
    printk("probe gpio failed6!\n");
    return -1;
    }
    if(gpio_request(GPIO_FPGA_RESET,"RESET")){
    gpio_free(GPIO_FPGA_nSTATUS);
    gpio_free(GPIO_FPGA_nDCLK);
    gpio_free(GPIO_FPGA_DATA0);
    gpio_free(GPIO_FPGA_nCONFIG);
    gpio_free(GPIO_FPGA_CONFIG_DONE);
    printk("request gpio failed6!\n");
    return -1;
    }


    in the DTS file, I define node as:

    FPGA_Load_pins {
    compatible = "cr,fpgaload";
    status = "okay";

    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_fpga_load>;

    fpga-gpios = <&gpio5 8 GPIO_ACTIVE_HIGH>, //nSTATUS
    <&gpio5 9 GPIO_ACTIVE_HIGH>, //nDCLK
    <&gpio5 10 GPIO_ACTIVE_HIGH>, //DATA0
    <&gpio5 11 GPIO_ACTIVE_HIGH>, //nCONFIG
    <&gpio5 13 GPIO_ACTIVE_HIGH>, //CONFIG_DONE
    <&gpio5 6 GPIO_ACTIVE_LOW>; //RESET

    };


    I cann't get answer from your reference example. So this time I use gpio_request(5*32+11,"nSTATUS") which is correct in old SDK to try if it is work in the NEW SDK,but is return error -517 also. I have spend many time in this problem and cann't solve it, Please check my programm I attach before.

    I cann't close this thread as "this did not resolve my issue" this time, I'll close it later!

    Best Regards,