]> sigrok.org Git - libsigrok.git/blobdiff - hwdriver.c
sr_driver_init(): Improve checks.
[libsigrok.git] / hwdriver.c
index 4c2ae142b622595b9e5914ab93b86c456409db27..364d97bd471a72141a0de46ec11c882e88d1b12c 100644 (file)
 #include "libsigrok.h"
 #include "libsigrok-internal.h"
 
+/* Message logging helpers with driver-specific prefix string. */
+#define DRIVER_LOG_DOMAIN "hwdriver: "
+#define sr_log(l, s, args...) sr_log(l, DRIVER_LOG_DOMAIN s, ## args)
+#define sr_spew(s, args...) sr_spew(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_dbg(s, args...) sr_dbg(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_info(s, args...) sr_info(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args)
+
 /**
  * @file
  *
@@ -236,19 +245,38 @@ SR_API struct sr_dev_driver **sr_driver_list(void)
 /**
  * Initialize a hardware driver.
  *
+ * This usually involves memory allocations and variable initializations
+ * within the driver, but _not_ scanning for attached devices.
+ * The API call sr_driver_scan() is used for that.
+ *
  * @param ctx A libsigrok context object allocated by a previous call to
- *             sr_init().
- * @param driver The driver to initialize.
+ *            sr_init(). Must not be NULL.
+ * @param driver The driver to initialize. This must be a pointer to one of
+ *               the entries returned by sr_driver_list(). Must not be NULL.
  *
- * @return SR_OK if all went well, or an error code otherwise.
+ * @return SR_OK upon success, SR_ERR_ARG upon invalid parameters,
+ *         SR_ERR_BUG upon internal errors, or another negative error code
+ *         upon other errors.
  */
 SR_API int sr_driver_init(struct sr_context *ctx, struct sr_dev_driver *driver)
 {
+       int ret;
+
+       if (!ctx) {
+               sr_err("Invalid libsigrok context, can't initialize.");
+               return SR_ERR_ARG;
+       }
 
-       if (driver->init)
-               return driver->init(ctx);
+       if (!driver) {
+               sr_err("Invalid driver, can't initialize.");
+               return SR_ERR_ARG;
+       }
 
-       return SR_OK;
+       sr_spew("Initializing driver '%s'.", driver->name);
+       if ((ret = driver->init(ctx)) < 0)
+               sr_err("Failed to initialize the driver: %d.", ret);
+
+       return ret;
 }
 
 /**
@@ -351,7 +379,7 @@ SR_API int sr_config_set(const struct sr_dev_inst *sdi, int key,
 {
        int ret;
 
-       if (!sdi || !sdi->driver)
+       if (!sdi || !sdi->driver || !value)
                return SR_ERR;
 
        if (!sdi->driver->config_set)