]> git.sur5r.net Git - u-boot/blobdiff - drivers/dfu/dfu.c
dm: exynos: Move serial to driver model
[u-boot] / drivers / dfu / dfu.c
index b8d382d9b5dfefd453557ff122c2a3399b31d318..55e6a83b9ad6956ccc1013bdb227d99d5f9ddfbc 100644 (file)
 #include <linux/list.h>
 #include <linux/compiler.h>
 
-static bool dfu_reset_request;
+static bool dfu_detach_request;
 static LIST_HEAD(dfu_list);
 static int dfu_alt_num;
 static int alt_num_cnt;
 static struct hash_algo *dfu_hash_algo;
 
-bool dfu_reset(void)
+/*
+ * The purpose of the dfu_usb_get_reset() function is to
+ * provide information if after USB_DETACH request
+ * being sent the dfu-util performed reset of USB
+ * bus.
+ *
+ * Described behaviour is the only way to distinct if
+ * user has typed -e (detach) or -R (reset) when invoking
+ * dfu-util command.
+ *
+ */
+__weak bool dfu_usb_get_reset(void)
 {
-       return dfu_reset_request;
+       return true;
 }
 
-void dfu_trigger_reset()
+bool dfu_detach(void)
 {
-       dfu_reset_request = true;
+       return dfu_detach_request;
+}
+
+void dfu_trigger_detach(void)
+{
+       dfu_detach_request = true;
+}
+
+void dfu_clear_detach(void)
+{
+       dfu_detach_request = false;
 }
 
 static int dfu_find_alt_num(const char *s)
@@ -332,7 +353,7 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
                case DFU_RAM_ADDR:
                        break;
                default:
-                       if (dfu->r_left >= dfu_buf_size) {
+                       if (dfu->r_left > dfu_buf_size) {
                                printf("%s: File too big for buffer\n",
                                       __func__);
                                return -EOVERFLOW;
@@ -401,6 +422,7 @@ static int dfu_fill_entity(struct dfu_entity *dfu, char *s, int alt,
 
        dfu->alt = alt;
        dfu->max_buf_size = 0;
+       dfu->free_entity = NULL;
 
        /* Specific for mmc device */
        if (strcmp(interface, "mmc") == 0) {
@@ -412,6 +434,9 @@ static int dfu_fill_entity(struct dfu_entity *dfu, char *s, int alt,
        } else if (strcmp(interface, "ram") == 0) {
                if (dfu_fill_entity_ram(dfu, devstr, s))
                        return -1;
+       } else if (strcmp(interface, "sf") == 0) {
+               if (dfu_fill_entity_sf(dfu, devstr, s))
+                       return -1;
        } else {
                printf("%s: Device %s not (yet) supported!\n",
                       __func__,  interface);
@@ -427,6 +452,8 @@ void dfu_free_entities(void)
 
        list_for_each_entry_safe_reverse(dfu, p, &dfu_list, list) {
                list_del(&dfu->list);
+               if (dfu->free_entity)
+                       dfu->free_entity(dfu);
                t = dfu;
        }
        if (t)