diff options
Diffstat (limited to 'drivers/fmc')
| -rw-r--r-- | drivers/fmc/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/fmc/fmc-core.c | 22 | ||||
| -rw-r--r-- | drivers/fmc/fmc-sdb.c | 41 | ||||
| -rw-r--r-- | drivers/fmc/fmc-write-eeprom.c | 2 | 
4 files changed, 49 insertions, 18 deletions
diff --git a/drivers/fmc/Kconfig b/drivers/fmc/Kconfig index c01cf45bc3d..3a75f4256d0 100644 --- a/drivers/fmc/Kconfig +++ b/drivers/fmc/Kconfig @@ -46,6 +46,6 @@ config FMC_CHARDEV  	  This driver matches every mezzanine device and allows user  	  space to read and write registers using a char device. It  	  can be used to write user-space drivers, or just get -	  aquainted with a mezzanine before writing its specific driver. +	  acquainted with a mezzanine before writing its specific driver.  endif # FMC diff --git a/drivers/fmc/fmc-core.c b/drivers/fmc/fmc-core.c index 24d52497524..353fc546fb0 100644 --- a/drivers/fmc/fmc-core.c +++ b/drivers/fmc/fmc-core.c @@ -99,10 +99,23 @@ static ssize_t fmc_read_eeprom(struct file *file, struct kobject *kobj,  	return count;  } +static ssize_t fmc_write_eeprom(struct file *file, struct kobject *kobj, +				struct bin_attribute *bin_attr, +				char *buf, loff_t off, size_t count) +{ +	struct device *dev; +	struct fmc_device *fmc; + +	dev = container_of(kobj, struct device, kobj); +	fmc = container_of(dev, struct fmc_device, dev); +	return fmc->op->write_ee(fmc, off, buf, count); +} +  static struct bin_attribute fmc_eeprom_attr = { -	.attr = { .name = "eeprom", .mode = S_IRUGO, }, +	.attr = { .name = "eeprom", .mode = S_IRUGO | S_IWUSR, },  	.size = 8192, /* more or less standard */  	.read = fmc_read_eeprom, +	.write = fmc_write_eeprom,  };  /* @@ -154,7 +167,7 @@ int fmc_device_register_n(struct fmc_device **devs, int n)  			ret = -EINVAL;  			break;  		} -		if (fmc->flags == FMC_DEVICE_NO_MEZZANINE) { +		if (fmc->flags & FMC_DEVICE_NO_MEZZANINE) {  			dev_info(fmc->hwdev, "absent mezzanine in slot %d\n",  				 fmc->slot_id);  			continue; @@ -189,9 +202,6 @@ int fmc_device_register_n(struct fmc_device **devs, int n)  	for (i = 0; i < n; i++) {  		fmc = devarray[i]; -		if (fmc->flags == FMC_DEVICE_NO_MEZZANINE) -			continue; /* dev_info already done above */ -  		fmc->nr_slots = n; /* each slot must know how many are there */  		fmc->devarray = devarray; @@ -263,8 +273,6 @@ void fmc_device_unregister_n(struct fmc_device **devs, int n)  	kfree(devs[0]->devarray);  	for (i = 0; i < n; i++) { -		if (devs[i]->flags == FMC_DEVICE_NO_MEZZANINE) -			continue;  		sysfs_remove_bin_file(&devs[i]->dev.kobj, &fmc_eeprom_attr);  		device_del(&devs[i]->dev);  		fmc_free_id_info(devs[i]); diff --git a/drivers/fmc/fmc-sdb.c b/drivers/fmc/fmc-sdb.c index 79adc39221e..4603fdb7446 100644 --- a/drivers/fmc/fmc-sdb.c +++ b/drivers/fmc/fmc-sdb.c @@ -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"); diff --git a/drivers/fmc/fmc-write-eeprom.c b/drivers/fmc/fmc-write-eeprom.c index ee5b4790413..9bb2cbd5c9f 100644 --- a/drivers/fmc/fmc-write-eeprom.c +++ b/drivers/fmc/fmc-write-eeprom.c @@ -27,7 +27,7 @@ FMC_PARAM_BUSID(fwe_drv);  /* The "file=" is like the generic "gateware=" used elsewhere */  static char *fwe_file[FMC_MAX_CARDS];  static int fwe_file_n; -module_param_array_named(file, fwe_file, charp, &fwe_file_n, 444); +module_param_array_named(file, fwe_file, charp, &fwe_file_n, 0444);  static int fwe_run_tlv(struct fmc_device *fmc, const struct firmware *fw,  	int write)  | 
