stdio: Provide functions to add/remove devices using stdio_dev
authorSimon Glass <sjg@chromium.org>
Wed, 23 Jul 2014 12:55:05 +0000 (06:55 -0600)
committerSimon Glass <sjg@chromium.org>
Wed, 23 Jul 2014 13:07:24 +0000 (14:07 +0100)
The current functions for adding and removing devices require a device name.
This is not convenient for driver model, which wants to store a pointer to
the relevant device. Add new functions which provide this feature and adjust
the old ones to call these.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/stdio.c
include/stdio_dev.h

index dd402cc23d51b6ff336ee5435a3ed1e612dec080..692ca7f1cdf595ddb548673b4131983e41e2a6b1 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <config.h>
 #include <common.h>
+#include <errno.h>
 #include <stdarg.h>
 #include <malloc.h>
 #include <stdio_dev.h>
@@ -148,32 +149,35 @@ struct stdio_dev* stdio_clone(struct stdio_dev *dev)
        return _dev;
 }
 
-int stdio_register (struct stdio_dev * dev)
+int stdio_register_dev(struct stdio_dev *dev, struct stdio_dev **devp)
 {
        struct stdio_dev *_dev;
 
        _dev = stdio_clone(dev);
        if(!_dev)
-               return -1;
+               return -ENODEV;
        list_add_tail(&(_dev->list), &(devs.list));
+       if (devp)
+               *devp = _dev;
+
        return 0;
 }
 
+int stdio_register(struct stdio_dev *dev)
+{
+       return stdio_register_dev(dev, NULL);
+}
+
 /* deregister the device "devname".
  * returns 0 if success, -1 if device is assigned and 1 if devname not found
  */
 #ifdef CONFIG_SYS_STDIO_DEREGISTER
-int stdio_deregister(const char *devname)
+int stdio_deregister_dev(struct stdio_dev *dev)
 {
        int l;
        struct list_head *pos;
-       struct stdio_dev *dev;
        char temp_names[3][16];
 
-       dev = stdio_get_by_name(devname);
-
-       if(!dev) /* device not found */
-               return -1;
        /* get stdio devices (ListRemoveItem changes the dev list) */
        for (l=0 ; l< MAX_FILES; l++) {
                if (stdio_devices[l] == dev) {
@@ -197,6 +201,18 @@ int stdio_deregister(const char *devname)
        }
        return 0;
 }
+
+int stdio_deregister(const char *devname)
+{
+       struct stdio_dev *dev;
+
+       dev = stdio_get_by_name(devname);
+
+       if (!dev) /* device not found */
+               return -ENODEV;
+
+       return stdio_deregister_dev(dev);
+}
 #endif /* CONFIG_SYS_STDIO_DEREGISTER */
 
 int stdio_init (void)
index 45870054c04b0c6ed3032d478a0702422d9af1a9..a7d0825c7e52fe86c5d6c9d94d7283b6d427b755 100644 (file)
@@ -77,10 +77,12 @@ extern char *stdio_names[MAX_FILES];
  * PROTOTYPES
  */
 int    stdio_register (struct stdio_dev * dev);
+int stdio_register_dev(struct stdio_dev *dev, struct stdio_dev **devp);
 int    stdio_init (void);
 void   stdio_print_current_devices(void);
 #ifdef CONFIG_SYS_STDIO_DEREGISTER
 int    stdio_deregister(const char *devname);
+int stdio_deregister_dev(struct stdio_dev *dev);
 #endif
 struct list_head* stdio_get_list(void);
 struct stdio_dev* stdio_get_by_name(const char* name);