raw/cnxk_bphy: add doxygen comments
[dpdk.git] / drivers / raw / cnxk_gpio / cnxk_gpio.c
index 4ff1328..d759ed8 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <dirent.h>
 #include <string.h>
+#include <sys/stat.h>
 
 #include <rte_bus_vdev.h>
 #include <rte_eal.h>
@@ -178,24 +179,30 @@ out:
 static int
 cnxk_gpio_read_attr(char *attr, char *val)
 {
+       int ret, ret2;
        FILE *fp;
-       int ret;
 
        fp = fopen(attr, "r");
        if (!fp)
                return -errno;
 
        ret = fscanf(fp, "%s", val);
-       if (ret < 0)
-               return -errno;
-       if (ret != 1)
-               return -EIO;
+       if (ret < 0) {
+               ret = -errno;
+               goto out;
+       }
+       if (ret != 1) {
+               ret = -EIO;
+               goto out;
+       }
 
-       ret = fclose(fp);
-       if (ret)
-               return -errno;
+       ret = 0;
+out:
+       ret2 = fclose(fp);
+       if (!ret)
+               ret = ret2;
 
-       return 0;
+       return ret;
 }
 
 static int
@@ -271,6 +278,17 @@ cnxk_gpio_lookup(struct cnxk_gpiochip *gpiochip, uint16_t queue)
        return gpiochip->gpios[gpio];
 }
 
+static bool
+cnxk_gpio_exists(int num)
+{
+       char buf[CNXK_GPIO_BUFSZ];
+       struct stat st;
+
+       snprintf(buf, sizeof(buf), "%s/gpio%d", CNXK_GPIO_CLASS_PATH, num);
+
+       return !stat(buf, &st);
+}
+
 static int
 cnxk_gpio_queue_setup(struct rte_rawdev *dev, uint16_t queue_id,
                      rte_rawdev_obj_t queue_conf, size_t queue_conf_size)
@@ -298,11 +316,15 @@ cnxk_gpio_queue_setup(struct rte_rawdev *dev, uint16_t queue_id,
        gpio->num = num + gpiochip->base;
        gpio->gpiochip = gpiochip;
 
-       snprintf(buf, sizeof(buf), "%s/export", CNXK_GPIO_CLASS_PATH);
-       ret = cnxk_gpio_write_attr_int(buf, gpio->num);
-       if (ret) {
-               rte_free(gpio);
-               return ret;
+       if (!cnxk_gpio_exists(gpio->num)) {
+               snprintf(buf, sizeof(buf), "%s/export", CNXK_GPIO_CLASS_PATH);
+               ret = cnxk_gpio_write_attr_int(buf, gpio->num);
+               if (ret) {
+                       rte_free(gpio);
+                       return ret;
+               }
+       } else {
+               RTE_LOG(WARNING, PMD, "using existing gpio%d\n", gpio->num);
        }
 
        gpiochip->gpios[num] = gpio;