Merge tag 'gpio-v3.15-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[firefly-linux-kernel-4.4.55.git] / drivers / fmc / fmc-sdb.c
index 79adc39221ea745f1a403a9eb6b1434f9cb20618..4603fdb74465c7ef6dee2f35e544241157290fb7 100644 (file)
@@ -150,23 +150,36 @@ int fmc_reprogram(struct fmc_device *fmc, struct fmc_driver *d, char *gw,
 }
 EXPORT_SYMBOL(fmc_reprogram);
 
+static char *__strip_trailing_space(char *buf, char *str, int len)
+{
+       int i = len - 1;
+
+       memcpy(buf, str, len);
+       while(i >= 0 && buf[i] == ' ')
+               buf[i--] = '\0';
+       return buf;
+}
+
+#define __sdb_string(buf, field) ({                    \
+       BUILD_BUG_ON(sizeof(buf) < sizeof(field));      \
+       __strip_trailing_space(buf, (void *)(field), sizeof(field));    \
+               })
+
 static void __fmc_show_sdb_tree(const struct fmc_device *fmc,
                                const struct sdb_array *arr)
 {
+       unsigned long base = arr->baseaddr;
        int i, j, n = arr->len, level = arr->level;
-       const struct sdb_array *ap;
+       char buf[64];
 
        for (i = 0; i < n; i++) {
-               unsigned long base;
                union  sdb_record *r;
                struct sdb_product *p;
                struct sdb_component *c;
                r = &arr->record[i];
                c = &r->dev.sdb_component;
                p = &c->product;
-               base = 0;
-               for (ap = arr; ap; ap = ap->parent)
-                       base += ap->baseaddr;
+
                dev_info(&fmc->dev, "SDB: ");
 
                for (j = 0; j < level; j++)
@@ -193,8 +206,8 @@ static void __fmc_show_sdb_tree(const struct fmc_device *fmc,
                               p->name,
                               __be64_to_cpu(c->addr_first) + base);
                        if (IS_ERR(arr->subtree[i])) {
-                               printk(KERN_CONT "(bridge error %li)\n",
-                                      PTR_ERR(arr->subtree[i]));
+                               dev_info(&fmc->dev, "SDB: (bridge error %li)\n",
+                                        PTR_ERR(arr->subtree[i]));
                                break;
                        }
                        __fmc_show_sdb_tree(fmc, arr->subtree[i]);
@@ -203,10 +216,20 @@ static void __fmc_show_sdb_tree(const struct fmc_device *fmc,
                        printk(KERN_CONT "integration\n");
                        break;
                case sdb_type_repo_url:
-                       printk(KERN_CONT "repo-url\n");
+                       printk(KERN_CONT "Synthesis repository: %s\n",
+                              __sdb_string(buf, r->repo_url.repo_url));
                        break;
                case sdb_type_synthesis:
-                       printk(KERN_CONT "synthesis-info\n");
+                       printk(KERN_CONT "Bitstream '%s' ",
+                              __sdb_string(buf, r->synthesis.syn_name));
+                       printk(KERN_CONT "synthesized %08x by %s ",
+                              __be32_to_cpu(r->synthesis.date),
+                              __sdb_string(buf, r->synthesis.user_name));
+                       printk(KERN_CONT "(%s version %x), ",
+                              __sdb_string(buf, r->synthesis.tool_name),
+                              __be32_to_cpu(r->synthesis.tool_version));
+                       printk(KERN_CONT "commit %pm\n",
+                              r->synthesis.commit_id);
                        break;
                case sdb_type_empty:
                        printk(KERN_CONT "empty\n");