diff options
Diffstat (limited to 'drivers/misc/c2port')
| -rw-r--r-- | drivers/misc/c2port/Kconfig | 11 | ||||
| -rw-r--r-- | drivers/misc/c2port/c2port-duramar2150.c | 3 | ||||
| -rw-r--r-- | drivers/misc/c2port/core.c | 109 | 
3 files changed, 63 insertions, 60 deletions
diff --git a/drivers/misc/c2port/Kconfig b/drivers/misc/c2port/Kconfig index e46af9a5810..0dd690e61d3 100644 --- a/drivers/misc/c2port/Kconfig +++ b/drivers/misc/c2port/Kconfig @@ -3,9 +3,8 @@  #  menuconfig C2PORT -	tristate "Silicon Labs C2 port support (EXPERIMENTAL)" -	depends on EXPERIMENTAL -	default no +	tristate "Silicon Labs C2 port support" +	default n  	help  	  This option enables support for Silicon Labs C2 port used to  	  program Silicon micro controller chips (and other 8051 compatible). @@ -22,9 +21,9 @@ menuconfig C2PORT  if C2PORT  config C2PORT_DURAMAR_2150 -	tristate "C2 port support for Eurotech's Duramar 2150 (EXPERIMENTAL)" -	depends on X86 && C2PORT -	default no +	tristate "C2 port support for Eurotech's Duramar 2150" +	depends on X86 +	default n  	help  	  This option enables C2 support for the Eurotech's Duramar 2150  	  on board micro controller. diff --git a/drivers/misc/c2port/c2port-duramar2150.c b/drivers/misc/c2port/c2port-duramar2150.c index 338dcc12150..5484301d57d 100644 --- a/drivers/misc/c2port/c2port-duramar2150.c +++ b/drivers/misc/c2port/c2port-duramar2150.c @@ -15,6 +15,7 @@  #include <linux/module.h>  #include <linux/delay.h>  #include <linux/io.h> +#include <linux/ioport.h>  #include <linux/c2port.h>  #define DATA_PORT	0x325 @@ -41,7 +42,7 @@ static void duramar2150_c2port_access(struct c2port_device *dev, int status)  		outb(v | (C2D | C2CK), DIR_PORT);  	else  		/* When access is "off" is important that both lines are set -		 * as inputs or hi-impedence */ +		 * as inputs or hi-impedance */  		outb(v & ~(C2D | C2CK), DIR_PORT);  	mutex_unlock(&update_lock); diff --git a/drivers/misc/c2port/core.c b/drivers/misc/c2port/core.c index 19fc7c1cb42..464419b3644 100644 --- a/drivers/misc/c2port/core.c +++ b/drivers/misc/c2port/core.c @@ -311,6 +311,7 @@ static ssize_t c2port_show_name(struct device *dev,  	return sprintf(buf, "%s\n", c2dev->name);  } +static DEVICE_ATTR(name, 0444, c2port_show_name, NULL);  static ssize_t c2port_show_flash_blocks_num(struct device *dev,  				struct device_attribute *attr, char *buf) @@ -320,6 +321,7 @@ static ssize_t c2port_show_flash_blocks_num(struct device *dev,  	return sprintf(buf, "%d\n", ops->blocks_num);  } +static DEVICE_ATTR(flash_blocks_num, 0444, c2port_show_flash_blocks_num, NULL);  static ssize_t c2port_show_flash_block_size(struct device *dev,  				struct device_attribute *attr, char *buf) @@ -329,6 +331,7 @@ static ssize_t c2port_show_flash_block_size(struct device *dev,  	return sprintf(buf, "%d\n", ops->block_size);  } +static DEVICE_ATTR(flash_block_size, 0444, c2port_show_flash_block_size, NULL);  static ssize_t c2port_show_flash_size(struct device *dev,  				struct device_attribute *attr, char *buf) @@ -338,18 +341,18 @@ static ssize_t c2port_show_flash_size(struct device *dev,  	return sprintf(buf, "%d\n", ops->blocks_num * ops->block_size);  } +static DEVICE_ATTR(flash_size, 0444, c2port_show_flash_size, NULL); -static ssize_t c2port_show_access(struct device *dev, -				struct device_attribute *attr, char *buf) +static ssize_t access_show(struct device *dev, struct device_attribute *attr, +			   char *buf)  {  	struct c2port_device *c2dev = dev_get_drvdata(dev);  	return sprintf(buf, "%d\n", c2dev->access);  } -static ssize_t c2port_store_access(struct device *dev, -				struct device_attribute *attr, -				const char *buf, size_t count) +static ssize_t access_store(struct device *dev, struct device_attribute *attr, +			    const char *buf, size_t count)  {  	struct c2port_device *c2dev = dev_get_drvdata(dev);  	struct c2port_ops *ops = c2dev->ops; @@ -375,6 +378,7 @@ static ssize_t c2port_store_access(struct device *dev,  	return count;  } +static DEVICE_ATTR_RW(access);  static ssize_t c2port_store_reset(struct device *dev,  				struct device_attribute *attr, @@ -395,6 +399,7 @@ static ssize_t c2port_store_reset(struct device *dev,  	return count;  } +static DEVICE_ATTR(reset, 0200, NULL, c2port_store_reset);  static ssize_t __c2port_show_dev_id(struct c2port_device *dev, char *buf)  { @@ -431,6 +436,7 @@ static ssize_t c2port_show_dev_id(struct device *dev,  	return ret;  } +static DEVICE_ATTR(dev_id, 0444, c2port_show_dev_id, NULL);  static ssize_t __c2port_show_rev_id(struct c2port_device *dev, char *buf)  { @@ -467,6 +473,7 @@ static ssize_t c2port_show_rev_id(struct device *dev,  	return ret;  } +static DEVICE_ATTR(rev_id, 0444, c2port_show_rev_id, NULL);  static ssize_t c2port_show_flash_access(struct device *dev,  				struct device_attribute *attr, char *buf) @@ -536,6 +543,8 @@ static ssize_t c2port_store_flash_access(struct device *dev,  	return count;  } +static DEVICE_ATTR(flash_access, 0644, c2port_show_flash_access, +		   c2port_store_flash_access);  static ssize_t __c2port_write_flash_erase(struct c2port_device *dev)  { @@ -616,6 +625,7 @@ static ssize_t c2port_store_flash_erase(struct device *dev,  	return count;  } +static DEVICE_ATTR(flash_erase, 0200, NULL, c2port_store_flash_erase);  static ssize_t __c2port_read_flash_data(struct c2port_device *dev,  				char *buffer, loff_t offset, size_t count) @@ -846,35 +856,40 @@ static ssize_t c2port_write_flash_data(struct file *filp, struct kobject *kobj,  	return ret;  } +/* size is computed at run-time */ +static BIN_ATTR(flash_data, 0644, c2port_read_flash_data, +		c2port_write_flash_data, 0);  /*   * Class attributes   */ +static struct attribute *c2port_attrs[] = { +	&dev_attr_name.attr, +	&dev_attr_flash_blocks_num.attr, +	&dev_attr_flash_block_size.attr, +	&dev_attr_flash_size.attr, +	&dev_attr_access.attr, +	&dev_attr_reset.attr, +	&dev_attr_dev_id.attr, +	&dev_attr_rev_id.attr, +	&dev_attr_flash_access.attr, +	&dev_attr_flash_erase.attr, +	NULL, +}; -static struct device_attribute c2port_attrs[] = { -	__ATTR(name, 0444, c2port_show_name, NULL), -	__ATTR(flash_blocks_num, 0444, c2port_show_flash_blocks_num, NULL), -	__ATTR(flash_block_size, 0444, c2port_show_flash_block_size, NULL), -	__ATTR(flash_size, 0444, c2port_show_flash_size, NULL), -	__ATTR(access, 0644, c2port_show_access, c2port_store_access), -	__ATTR(reset, 0200, NULL, c2port_store_reset), -	__ATTR(dev_id, 0444, c2port_show_dev_id, NULL), -	__ATTR(rev_id, 0444, c2port_show_rev_id, NULL), - -	__ATTR(flash_access, 0644, c2port_show_flash_access, -					c2port_store_flash_access), -	__ATTR(flash_erase, 0200, NULL, c2port_store_flash_erase), -	__ATTR_NULL, +static struct bin_attribute *c2port_bin_attrs[] = { +	&bin_attr_flash_data, +	NULL,  }; -static struct bin_attribute c2port_bin_attrs = { -	.attr	= { -		.name	= "flash_data", -		.mode	= 0644 -	}, -	.read	= c2port_read_flash_data, -	.write	= c2port_write_flash_data, -	/* .size is computed at run-time */ +static const struct attribute_group c2port_group = { +	.attrs = c2port_attrs, +	.bin_attrs = c2port_bin_attrs, +}; + +static const struct attribute_group *c2port_groups[] = { +	&c2port_group, +	NULL,  };  /* @@ -885,7 +900,7 @@ struct c2port_device *c2port_device_register(char *name,  					struct c2port_ops *ops, void *devdata)  {  	struct c2port_device *c2dev; -	int id, ret; +	int ret;  	if (unlikely(!ops) || unlikely(!ops->access) || \  		unlikely(!ops->c2d_dir) || unlikely(!ops->c2ck_set) || \ @@ -897,22 +912,20 @@ struct c2port_device *c2port_device_register(char *name,  	if (unlikely(!c2dev))  		return ERR_PTR(-ENOMEM); -	ret = idr_pre_get(&c2port_idr, GFP_KERNEL); -	if (!ret) { -		ret = -ENOMEM; -		goto error_idr_get_new; -	} - +	idr_preload(GFP_KERNEL);  	spin_lock_irq(&c2port_idr_lock); -	ret = idr_get_new(&c2port_idr, c2dev, &id); +	ret = idr_alloc(&c2port_idr, c2dev, 0, 0, GFP_NOWAIT);  	spin_unlock_irq(&c2port_idr_lock); +	idr_preload_end();  	if (ret < 0) -		goto error_idr_get_new; -	c2dev->id = id; +		goto error_idr_alloc; +	c2dev->id = ret; + +	bin_attr_flash_data.size = ops->blocks_num * ops->block_size;  	c2dev->dev = device_create(c2port_class, NULL, 0, c2dev, -					"c2port%d", id); +				   "c2port%d", c2dev->id);  	if (unlikely(IS_ERR(c2dev->dev))) {  		ret = PTR_ERR(c2dev->dev);  		goto error_device_create; @@ -923,12 +936,6 @@ struct c2port_device *c2port_device_register(char *name,  	c2dev->ops = ops;  	mutex_init(&c2dev->mutex); -	/* Create binary file */ -	c2port_bin_attrs.size = ops->blocks_num * ops->block_size; -	ret = device_create_bin_file(c2dev->dev, &c2port_bin_attrs); -	if (unlikely(ret)) -		goto error_device_create_bin_file; -  	/* By default C2 port access is off */  	c2dev->access = c2dev->flash_access = 0;  	ops->access(c2dev, 0); @@ -941,15 +948,12 @@ struct c2port_device *c2port_device_register(char *name,  	return c2dev; -error_device_create_bin_file: -	device_destroy(c2port_class, 0); -  error_device_create:  	spin_lock_irq(&c2port_idr_lock); -	idr_remove(&c2port_idr, id); +	idr_remove(&c2port_idr, c2dev->id);  	spin_unlock_irq(&c2port_idr_lock); -error_idr_get_new: +error_idr_alloc:  	kfree(c2dev);  	return ERR_PTR(ret); @@ -963,7 +967,6 @@ void c2port_device_unregister(struct c2port_device *c2dev)  	dev_info(c2dev->dev, "C2 port %s removed\n", c2dev->name); -	device_remove_bin_file(c2dev->dev, &c2port_bin_attrs);  	spin_lock_irq(&c2port_idr_lock);  	idr_remove(&c2port_idr, c2dev->id);  	spin_unlock_irq(&c2port_idr_lock); @@ -984,11 +987,11 @@ static int __init c2port_init(void)  		" - (C) 2007 Rodolfo Giometti\n");  	c2port_class = class_create(THIS_MODULE, "c2port"); -	if (!c2port_class) { +	if (IS_ERR(c2port_class)) {  		printk(KERN_ERR "c2port: failed to allocate class\n"); -		return -ENOMEM; +		return PTR_ERR(c2port_class);  	} -	c2port_class->dev_attrs = c2port_attrs; +	c2port_class->dev_groups = c2port_groups;  	return 0;  }  | 
