jtag: clarify jtag->init() and jtag->quit() definitions
authorØyvind Harboe <oyvind.harboe@zylin.com>
Wed, 13 Apr 2011 19:51:42 +0000 (21:51 +0200)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 19 Apr 2011 10:43:16 +0000 (12:43 +0200)
only set jtag global pointer if jtag->init() succeeds. Less code,
more clear what the rules are.

Fix nit that error value from init() was not propagated unmodified.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
src/jtag/core.c
src/jtag/interface.h

index 68c125707bbbf92bcb7b1f5f2450175d946928cb..4c5d37a749b0e7f25e8480f47dc00088d394ebef 100644 (file)
@@ -1368,12 +1368,13 @@ int adapter_init(struct command_context *cmd_ctx)
                return ERROR_JTAG_INVALID_INTERFACE;
        }
 
-       jtag = jtag_interface;
-       if (jtag_interface->init() != ERROR_OK)
+       int retval;
+       retval = jtag_interface->init();
+       if (retval != ERROR_OK)
        {
-               jtag = NULL;
-               return ERROR_JTAG_INIT_FAILED;
+               return retval;
        }
+       jtag = jtag_interface;
 
        /* LEGACY SUPPORT ... adapter drivers  must declare what
         * transports they allow.  Until they all do so, assume
@@ -1383,7 +1384,7 @@ int adapter_init(struct command_context *cmd_ctx)
                LOG_ERROR("Adapter driver '%s' did not declare "
                        "which transports it allows; assuming "
                        "JTAG-only", jtag->name);
-               int retval = allow_transports(cmd_ctx, jtag_only);
+               retval = allow_transports(cmd_ctx, jtag_only);
                if (retval != ERROR_OK)
                        return retval;
        }
@@ -1391,7 +1392,7 @@ int adapter_init(struct command_context *cmd_ctx)
        int requested_khz = jtag_get_speed_khz();
        int actual_khz = requested_khz;
        int jtag_speed_var;
-       int retval = jtag_get_speed(&jtag_speed_var);
+       retval = jtag_get_speed(&jtag_speed_var);
        if (retval != ERROR_OK)
                return retval;
        retval = jtag_get_speed_readable(&actual_khz);
index 958af8f5a518b5844db4322ae80a83c2f9830c1b..1059436e067bbe3be4d0b057d3d87ec352621bd2 100644 (file)
@@ -231,8 +231,14 @@ struct jtag_interface {
        const struct command_registration *commands;
 
        /**
-        * Interface driver must initalize any resources and connect to a
+        * Interface driver must initialize any resources and connect to a
         * JTAG device.
+        *
+        * quit() is invoked if and only if init() succeeds. quit() is always
+        * invoked if init() succeeds. Same as malloc() + free(). Always
+        * invoke free() if malloc() succeeds and do not invoke free()
+        * otherwise.
+        *
         * @returns ERROR_OK on success, or an error code on failure.
         */
        int (*init)(void);
@@ -240,6 +246,7 @@ struct jtag_interface {
        /**
         * Interface driver must tear down all resources and disconnect from
         * the JTAG device.
+        *
         * @returns ERROR_OK on success, or an error code on failure.
         */
        int (*quit)(void);