diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-xiic.c')
| -rw-r--r-- | drivers/i2c/busses/i2c-xiic.c | 95 | 
1 files changed, 31 insertions, 64 deletions
diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c index 4c8b368d463..7731f179586 100644 --- a/drivers/i2c/busses/i2c-xiic.c +++ b/drivers/i2c/busses/i2c-xiic.c @@ -30,8 +30,8 @@   */  #include <linux/kernel.h>  #include <linux/module.h> -#include <linux/init.h>  #include <linux/errno.h> +#include <linux/err.h>  #include <linux/delay.h>  #include <linux/platform_device.h>  #include <linux/i2c.h> @@ -40,6 +40,7 @@  #include <linux/i2c-xiic.h>  #include <linux/io.h>  #include <linux/slab.h> +#include <linux/of.h>  #define DRIVER_NAME "xiic-i2c" @@ -68,7 +69,7 @@ struct xiic_i2c {  	struct i2c_adapter	adap;  	struct i2c_msg		*tx_msg;  	spinlock_t		lock; -	unsigned int 		tx_pos; +	unsigned int		tx_pos;  	unsigned int		nmsgs;  	enum xilinx_i2c_state	state;  	struct i2c_msg		*rx_msg; @@ -271,8 +272,8 @@ static void xiic_read_rx(struct xiic_i2c *i2c)  	bytes_in_fifo = xiic_getreg8(i2c, XIIC_RFO_REG_OFFSET) + 1; -	dev_dbg(i2c->adap.dev.parent, "%s entry, bytes in fifo: %d, msg: %d" -		", SR: 0x%x, CR: 0x%x\n", +	dev_dbg(i2c->adap.dev.parent, +		"%s entry, bytes in fifo: %d, msg: %d, SR: 0x%x, CR: 0x%x\n",  		__func__, bytes_in_fifo, xiic_rx_space(i2c),  		xiic_getreg8(i2c, XIIC_SR_REG_OFFSET),  		xiic_getreg8(i2c, XIIC_CR_REG_OFFSET)); @@ -339,9 +340,10 @@ static void xiic_process(struct xiic_i2c *i2c)  	ier = xiic_getreg32(i2c, XIIC_IIER_OFFSET);  	pend = isr & ier; -	dev_dbg(i2c->adap.dev.parent, "%s entry, IER: 0x%x, ISR: 0x%x, " -		"pend: 0x%x, SR: 0x%x, msg: %p, nmsgs: %d\n", -		__func__, ier, isr, pend, xiic_getreg8(i2c, XIIC_SR_REG_OFFSET), +	dev_dbg(i2c->adap.dev.parent, "%s: IER: 0x%x, ISR: 0x%x, pend: 0x%x\n", +		__func__, ier, isr, pend); +	dev_dbg(i2c->adap.dev.parent, "%s: SR: 0x%x, msg: %p, nmsgs: %d\n", +		__func__, xiic_getreg8(i2c, XIIC_SR_REG_OFFSET),  		i2c->tx_msg, i2c->nmsgs);  	/* Do not processes a devices interrupts if the device has no @@ -541,9 +543,10 @@ static void xiic_start_send(struct xiic_i2c *i2c)  	xiic_irq_clr(i2c, XIIC_INTR_TX_ERROR_MASK); -	dev_dbg(i2c->adap.dev.parent, "%s entry, msg: %p, len: %d, " -		"ISR: 0x%x, CR: 0x%x\n", -		__func__, msg, msg->len, xiic_getreg32(i2c, XIIC_IISR_OFFSET), +	dev_dbg(i2c->adap.dev.parent, "%s entry, msg: %p, len: %d", +		__func__, msg, msg->len); +	dev_dbg(i2c->adap.dev.parent, "%s entry, ISR: 0x%x, CR: 0x%x\n", +		__func__, xiic_getreg32(i2c, XIIC_IISR_OFFSET),  		xiic_getreg8(i2c, XIIC_CR_REG_OFFSET));  	if (!(msg->flags & I2C_M_NOSTART)) { @@ -681,7 +684,7 @@ static const struct i2c_algorithm xiic_algorithm = {  static struct i2c_adapter xiic_adapter = {  	.owner		= THIS_MODULE,  	.name		= DRIVER_NAME, -	.class		= I2C_CLASS_HWMON | I2C_CLASS_SPD, +	.class		= I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED,  	.algo		= &xiic_algorithm,  }; @@ -694,32 +697,20 @@ static int xiic_i2c_probe(struct platform_device *pdev)  	int ret, irq;  	u8 i; +	i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); +	if (!i2c) +		return -ENOMEM; +  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!res) -		goto resource_missing; +	i2c->base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(i2c->base)) +		return PTR_ERR(i2c->base);  	irq = platform_get_irq(pdev, 0);  	if (irq < 0) -		goto resource_missing; - -	pdata = (struct xiic_i2c_platform_data *)dev_get_platdata(&pdev->dev); - -	i2c = kzalloc(sizeof(*i2c), GFP_KERNEL); -	if (!i2c) -		return -ENOMEM; - -	if (!request_mem_region(res->start, resource_size(res), pdev->name)) { -		dev_err(&pdev->dev, "Memory region busy\n"); -		ret = -EBUSY; -		goto request_mem_failed; -	} +		return irq; -	i2c->base = ioremap(res->start, resource_size(res)); -	if (!i2c->base) { -		dev_err(&pdev->dev, "Unable to map registers\n"); -		ret = -EIO; -		goto map_failed; -	} +	pdata = dev_get_platdata(&pdev->dev);  	/* hook up driver to tree */  	platform_set_drvdata(pdev, i2c); @@ -728,21 +719,23 @@ static int xiic_i2c_probe(struct platform_device *pdev)  	i2c->adap.dev.parent = &pdev->dev;  	i2c->adap.dev.of_node = pdev->dev.of_node; -	xiic_reinit(i2c); -  	spin_lock_init(&i2c->lock);  	init_waitqueue_head(&i2c->wait); -	ret = request_irq(irq, xiic_isr, 0, pdev->name, i2c); -	if (ret) { + +	ret = devm_request_irq(&pdev->dev, irq, xiic_isr, 0, pdev->name, i2c); +	if (ret < 0) {  		dev_err(&pdev->dev, "Cannot claim IRQ\n"); -		goto request_irq_failed; +		return ret;  	} +	xiic_reinit(i2c); +  	/* add i2c adapter to i2c tree */  	ret = i2c_add_adapter(&i2c->adap);  	if (ret) {  		dev_err(&pdev->dev, "Failed to add adapter\n"); -		goto add_adapter_failed; +		xiic_deinit(i2c); +		return ret;  	}  	if (pdata) { @@ -752,43 +745,17 @@ static int xiic_i2c_probe(struct platform_device *pdev)  	}  	return 0; - -add_adapter_failed: -	free_irq(irq, i2c); -request_irq_failed: -	xiic_deinit(i2c); -	iounmap(i2c->base); -map_failed: -	release_mem_region(res->start, resource_size(res)); -request_mem_failed: -	kfree(i2c); - -	return ret; -resource_missing: -	dev_err(&pdev->dev, "IRQ or Memory resource is missing\n"); -	return -ENOENT;  }  static int xiic_i2c_remove(struct platform_device *pdev)  {  	struct xiic_i2c *i2c = platform_get_drvdata(pdev); -	struct resource *res;  	/* remove adapter & data */  	i2c_del_adapter(&i2c->adap);  	xiic_deinit(i2c); -	free_irq(platform_get_irq(pdev, 0), i2c); - -	iounmap(i2c->base); - -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (res) -		release_mem_region(res->start, resource_size(res)); - -	kfree(i2c); -  	return 0;  }  | 
