All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH linux dev-4.7 v2 0/2] drivers: fsi: i2c Fixes
@ 2017-02-10 16:49 Eddie James
  2017-02-10 16:49 ` [PATCH linux dev-4.7 v2 1/2] drivers: fsi: i2c fix probing Eddie James
  2017-02-10 16:49 ` [PATCH linux dev-4.7 v2 2/2] drivers: fsi: i2c fix ports Eddie James
  0 siblings, 2 replies; 6+ messages in thread
From: Eddie James @ 2017-02-10 16:49 UTC (permalink / raw)
  To: openbmc; +Cc: joel, cbostic, Edward A. James

From: "Edward A. James" <eajames@us.ibm.com>

Fix driver cleanup on remove to allow clean probing the second time. Also
add missing ports for P9.

Edward A. James (2):
  drivers: fsi: i2c fix probing
  drivers: fsi: i2c fix ports

 drivers/fsi/i2c/iic-fsi.c  | 125 +++------------------------------------------
 drivers/fsi/i2c/iic-mstr.c |  42 +++------------
 2 files changed, 14 insertions(+), 153 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH linux dev-4.7 v2 1/2] drivers: fsi: i2c fix probing
  2017-02-10 16:49 [PATCH linux dev-4.7 v2 0/2] drivers: fsi: i2c Fixes Eddie James
@ 2017-02-10 16:49 ` Eddie James
  2017-02-10 16:59   ` Christopher Bostic
  2017-02-10 16:49 ` [PATCH linux dev-4.7 v2 2/2] drivers: fsi: i2c fix ports Eddie James
  1 sibling, 1 reply; 6+ messages in thread
From: Eddie James @ 2017-02-10 16:49 UTC (permalink / raw)
  To: openbmc; +Cc: joel, cbostic, Edward A. James

From: "Edward A. James" <eajames@us.ibm.com>

resolve the problems when probing up the i2c driver a second time.

Signed-off-by: Edward A. James <eajames@us.ibm.com>
---
 drivers/fsi/i2c/iic-fsi.c  | 125 +++------------------------------------------
 drivers/fsi/i2c/iic-mstr.c |  42 +++------------
 2 files changed, 14 insertions(+), 153 deletions(-)

diff --git a/drivers/fsi/i2c/iic-fsi.c b/drivers/fsi/i2c/iic-fsi.c
index 2c0aec9..6d5b045 100644
--- a/drivers/fsi/i2c/iic-fsi.c
+++ b/drivers/fsi/i2c/iic-fsi.c
@@ -36,60 +36,12 @@
 struct class* iic_fsi_class = 0;
 dev_t iic_devnum_start = 0;
 
-static const char iic_fsi_version[] = "3.0";
+static const char iic_fsi_version[] = "3.1";
 
 int iic_fsi_probe(struct device *dev);
 int iic_fsi_remove(struct device *dev);
-void iic_fsi_shutdown(struct device *dev);
 int iic_fsi_suspend(struct device *dev);
 int iic_fsi_resume(struct device *dev);
-static void iic_eng_release(struct kobject* kobj);
-
-/* callback function for when the reference count for an engine reaches 0 */
-static void iic_eng_release(struct kobject* kobj)
-{
-	iic_eng_t* eng = container_of(kobj, iic_eng_t, kobj);
-	struct device* dev = eng->dev;
-	unsigned long flags;
-
-	IENTER();
-
-	/*remove all busses associated with the engine */
-	spin_lock_irqsave(&eng->lock, flags);
-	while(eng->busses){
-		iic_bus_t* temp = eng->busses;
-		eng->busses = temp->next;
-		iic_delete_bus(iic_fsi_class, temp);
-	}
-
-	eng->enabled = 0x0ULL;
-	spin_unlock_irqrestore(&eng->lock, flags);
-
-
-	/* providing an arch specific cleanup routine is optional.
-	 * if not specified, use the default.
-	 */
-	if (iic_eng_ops_is_vaild(eng->ops)) {
-		if(eng->ops->cleanup_eng)
-		{
-			eng->ops->cleanup_eng(eng);
-		}
-		else
-		{
-			IDBGd(0, "free engine\n");
-			kfree(eng);
-		}
-	}
-
-	dev_set_drvdata(dev, 0);
-	kobject_put(&dev->kobj);
-
-	IEXIT(0);
-}
-
-static struct kobj_type iic_eng_ktype = {
-	.release = iic_eng_release,
-};
 
 int readb_wrap(iic_eng_t* eng, unsigned int addr, unsigned char *val, 
 	       iic_ffdc_t** ffdc)
@@ -223,7 +175,7 @@ int iic_add_ports(iic_eng_t* eng, uint64_t ports)
 
 	IENTER();
 
-	IFLDi(3, "Adding ports[0x%08x%08x] to eng[0x%08x]",
+	IFLDi(3, "Adding ports[0x%08x%08x] to eng[0x%08x]\n",
 	      (uint32_t)(ports >> 32),
 	      (uint32_t)ports,
 	      eng->id);
@@ -305,8 +257,6 @@ int iic_del_ports(iic_eng_t* eng, uint64_t ports)
 
 	/* walk unordered SLL and delete bus if it is in the ports bit mask */
 	spin_lock_irqsave(&eng->lock, flags);
-	if(test_bit(IIC_ENG_REMOVED, &eng->flags))
-		goto exit;
 	p_abusp = &eng->busses;
 	abusp = *p_abusp;
 	while(abusp)
@@ -316,7 +266,6 @@ int iic_del_ports(iic_eng_t* eng, uint64_t ports)
 			/* found a match, remove it */
 			*p_abusp = abusp->next;
 			eng->enabled &= ~(0x1ULL << abusp->port);
-			device_destroy(iic_fsi_class, abusp->devnum);
 			iic_delete_bus(iic_fsi_class, abusp);
 		}
 		else
@@ -327,12 +276,12 @@ int iic_del_ports(iic_eng_t* eng, uint64_t ports)
 		abusp = *p_abusp;
 	}
 
-exit:
 	spin_unlock_irqrestore(&eng->lock, flags);
 	IEXIT(0);
 	return 0;
 }
 
+#define IIC_FSI_PORTS	0xFFFULL
 /*
  * Called when an FSI IIC engine is plugged in.  
  * Causes creation of the /dev entry.
@@ -361,12 +310,11 @@ int iic_fsi_probe(struct device *dev)
 	iic_init_eng(eng);
 	set_bit(IIC_ENG_BLOCK, &eng->flags); //block until resumed
 	eng->id = 0x00F5112C;
-	IFLDi(1, "PROBE    eng[%08x]", eng->id);
+	IFLDi(1, "PROBE    eng[%08x]\n", eng->id);
 	eng->ra = &fsi_reg_access;
 	IFLDd(1, "vaddr=%#08lx\n", eng->base);
 	eng->dev = dev;
 	// The new kernel now requires 2 arguments
-	kobject_init(&eng->kobj, &iic_eng_ktype); //ref count = 1
 	eng->ops = iic_get_eng_ops(FSI_ENGID_I2C);
 	if(!eng->ops)
 	{
@@ -382,7 +330,7 @@ int iic_fsi_probe(struct device *dev)
 
 	IFLDd(1, "irq  = %d\n", eng->irq);
 
-	new_ports = 0xFFFULL;
+	new_ports = IIC_FSI_PORTS;
 	set_bit(IIC_ENG_P8_Z8_CENTAUR, &eng->flags);
 
 
@@ -394,21 +342,13 @@ int iic_fsi_probe(struct device *dev)
 	dev_set_drvdata(dev, eng);
 	eng->private_data = 0; //unused
 
-
-	/* set the callback function for when the eng ref count reaches 0 */
-	kobject_get(&eng->dev->kobj);
-
 	iic_fsi_resume(dev);
 
 error:
 	if(rc)
 	{
 		IFLDi(1, "IIC: iic_fsi_probe failed: %d\n", rc);
-		while(eng && eng->busses){
-			iic_bus_t* temp = eng->busses;
-			eng->busses = temp->next;
-			iic_delete_bus(iic_fsi_class, temp);
-		}
+		iic_del_ports(eng, new_ports);
 		if(eng)
 		{
 			kfree(eng);
@@ -430,9 +370,7 @@ error:
 int iic_fsi_remove(struct device* dev)
 {
 	int rc = 0;
-	iic_bus_t* bus;
 	iic_eng_t* eng = (iic_eng_t*)dev_get_drvdata(dev);
-	unsigned long flags;
 
 	IENTER();
        
@@ -453,62 +391,15 @@ int iic_fsi_remove(struct device* dev)
 	IFLDi(1, "REMOVE   eng[%08x]\n", eng->id);
 
 	/* Clean up device files immediately, don't wait for ref count */
-	spin_lock_irqsave(&eng->lock, flags);
-	bus = eng->busses;
-	while(bus)
-	{
-		/* causes hot unplug event */
-		device_destroy(iic_fsi_class, bus->devnum);
-		bus = bus->next;
-	}
-	spin_unlock_irqrestore(&eng->lock, flags);
-
+	iic_del_ports(eng, IIC_FSI_PORTS);
 	/* cleans up engine and bus structures if ref count is zero */
-	kobject_put(&eng->kobj);
+	kfree(eng);
 	
 error:
 	IEXIT(0);
 	return 0;
 }
 
-/* This function is called when a link is removed or the driver is unloaded.
- * It's job is to quiesce and disable the hardware if possible and unregister 
- * interrupts. It always precedes the remove function.
- *
- * The device may be in the resumed or suspended state when this function is
- * called.
- *
- * This function is no longer called for mcp5
- */
-void iic_fsi_shutdown(struct device *dev)
-{
-	int rc = 0;
-	iic_eng_t* eng = (iic_eng_t*)dev_get_drvdata(dev);
-
-	IENTER();
-	if(!eng || !eng->ops)
-	{
-		rc = -1;
-		goto error;
-	}
-	IFLDi(1, "SHUTDOWN eng[%08x]\n", eng->id);
-
-	/* set ENG_REMOVED flag so that aborted operations have status
-	 * set to ENOLINK (lost fsi link) instead of ENODEV (no lbus).
-	 */
-	set_bit(IIC_ENG_REMOVED, &eng->flags);
-
-	iic_fsi_suspend(dev);
-	
-error:
-	if(rc)
-	{
-		IFLDe(1, "iic_fsi_shutdown failed: %d\n", rc);
-	}
-	IEXIT(0);
-	return;
-}
-
 /* This function is called when we loose ownership or are preparing to give
  * up ownership of the local bus.  If we still own lbus, then we try to
  * gracefully halt any pending transfer.  No hot unplug events are caused by
diff --git a/drivers/fsi/i2c/iic-mstr.c b/drivers/fsi/i2c/iic-mstr.c
index 0d97671..5501b22 100644
--- a/drivers/fsi/i2c/iic-mstr.c
+++ b/drivers/fsi/i2c/iic-mstr.c
@@ -83,27 +83,7 @@ iic_opts_t iic_dflt_opts =
 	}
 };
 
-static const char iic_mstr_version[] = "3.0";
-
-/* save off the default cdev type pointer so we can call the default cdev
- * release function in our own bus release function
- */
-static struct kobj_type* cdev_dflt_type = 0;
-struct kobj_type iic_bus_type;
-
-/* funtion called when cdev object (embedded in bus object) ref count
- * reaches zero.  (prevents cdev memory from being freed to early)
- */
-void iic_bus_release(struct kobject* kobj)
-{
-	struct cdev *p = container_of(kobj, struct cdev, kobj);
-	iic_bus_t* bus = container_of(p, iic_bus_t, cdev);
-
-	IFLDi(1, "deleting bus[%08lx]\n", bus->bus_id);
-	if(cdev_dflt_type && cdev_dflt_type->release)
-		cdev_dflt_type->release(kobj);
-	kfree(bus);
-}
+static const char iic_mstr_version[] = "3.1";
 
 int iic_open(struct inode* inode, struct file* filp);
 int iic_release(struct inode* inode, struct file* filp);
@@ -167,7 +147,6 @@ int iic_common_open(iic_client_t ** o_client, iic_bus_t * bus, int engine_num)
 	client->tgid = current->tgid;
 	sema_init(&client->sem, 1);
 	init_waitqueue_head(&client->wait);
-	kobject_get(&bus->eng->kobj);
 	*o_client = client;
 
 exit:
@@ -262,7 +241,6 @@ int iic_common_release(iic_client_t * client)
 
         client->bus = 0;
         kfree(client);
-        kobject_put(&bus->eng->kobj);
 
         IEXIT(rc);
         return rc;
@@ -1170,6 +1148,7 @@ EXPORT_SYMBOL(iic_sideways_read);
 ssize_t iic_read(struct file *filp, char __user *buf, size_t count,
 		 loff_t *offset)
 {
+	int rc_copy;
 	ssize_t rc = count;
 	char *kbuf;
 	iic_client_t *client = (iic_client_t*)filp->private_data;
@@ -1203,7 +1182,7 @@ ssize_t iic_read(struct file *filp, char __user *buf, size_t count,
 	if (rc < 0)
 		goto free;
 
-	rc = copy_to_user(buf, kbuf, count);
+	rc_copy = copy_to_user(buf, kbuf, count);
 
 free:
 	kfree(kbuf);
@@ -2148,23 +2127,11 @@ iic_bus_t*  iic_create_bus(struct class* classp, iic_eng_t* eng,
 	bus->devnum = devnum;
 	bus->i2c_hz = 400000;
 	cdev_init(&bus->cdev, &iic_fops); // ref count = 1
-	/* since cdev is embedded in our bus structure, override the cdev
-	 * cleanup function with our own so that the bus object doesn't get
-	 * freed until the cdev ref count goes to zero.
-	 */
-	if(!cdev_dflt_type)
-	{
-		cdev_dflt_type = bus->cdev.kobj.ktype;
-		memcpy(&iic_bus_type, cdev_dflt_type, sizeof(iic_bus_type));
-		iic_bus_type.release = iic_bus_release;
-	}
-	bus->cdev.kobj.ktype = &iic_bus_type;
 	kobject_set_name(&bus->cdev.kobj, name);
 	rc = cdev_add(&bus->cdev, devnum, 1);
 	if(rc)
 	{
 		IFLDe(1, "cdev_add failed for bus %08lx\n", bus->bus_id);
-		kobject_put(&bus->cdev.kobj);
 		goto exit_cdev_add;
 	}
 
@@ -2186,6 +2153,7 @@ iic_bus_t*  iic_create_bus(struct class* classp, iic_eng_t* eng,
 exit_class_add:
 	cdev_del(&bus->cdev);
 exit_cdev_add:
+	kfree(bus);
 	bus = 0;
 exit:
 	IEXIT((int)bus);
@@ -2202,7 +2170,9 @@ void iic_delete_bus(struct class* classp, iic_bus_t* bus)
 		goto exit;
 	}
 	IFLDi(1, "cleanup bus[%08lx]\n", bus->bus_id);
+	device_destroy(classp, bus->devnum);
 	cdev_del(&bus->cdev);
+	kfree(bus);
 exit:
 	IEXIT(0);
 	return;
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH linux dev-4.7 v2 2/2] drivers: fsi: i2c fix ports
  2017-02-10 16:49 [PATCH linux dev-4.7 v2 0/2] drivers: fsi: i2c Fixes Eddie James
  2017-02-10 16:49 ` [PATCH linux dev-4.7 v2 1/2] drivers: fsi: i2c fix probing Eddie James
@ 2017-02-10 16:49 ` Eddie James
  2017-02-13  2:02   ` Joel Stanley
  1 sibling, 1 reply; 6+ messages in thread
From: Eddie James @ 2017-02-10 16:49 UTC (permalink / raw)
  To: openbmc; +Cc: joel, cbostic, Edward A. James

From: "Edward A. James" <eajames@us.ibm.com>

missing a couple of ports

Signed-off-by: Edward A. James <eajames@us.ibm.com>
---
 drivers/fsi/i2c/iic-fsi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/fsi/i2c/iic-fsi.c b/drivers/fsi/i2c/iic-fsi.c
index 6d5b045..9c70e38 100644
--- a/drivers/fsi/i2c/iic-fsi.c
+++ b/drivers/fsi/i2c/iic-fsi.c
@@ -281,7 +281,7 @@ int iic_del_ports(iic_eng_t* eng, uint64_t ports)
 	return 0;
 }
 
-#define IIC_FSI_PORTS	0xFFFULL
+#define IIC_FSI_PORTS	0x7FFFULL
 /*
  * Called when an FSI IIC engine is plugged in.  
  * Causes creation of the /dev entry.
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH linux dev-4.7 v2 1/2] drivers: fsi: i2c fix probing
  2017-02-10 16:49 ` [PATCH linux dev-4.7 v2 1/2] drivers: fsi: i2c fix probing Eddie James
@ 2017-02-10 16:59   ` Christopher Bostic
  2017-02-13  2:03     ` Joel Stanley
  0 siblings, 1 reply; 6+ messages in thread
From: Christopher Bostic @ 2017-02-10 16:59 UTC (permalink / raw)
  To: Eddie James, openbmc; +Cc: Edward A. James

Acked-by: Christopher Bostic <cbostic@linux.vnet.ibm.com>


On 2/10/17 10:49 AM, Eddie James wrote:
> From: "Edward A. James" <eajames@us.ibm.com>
>
> resolve the problems when probing up the i2c driver a second time.
>
> Signed-off-by: Edward A. James <eajames@us.ibm.com>
> ---
>   drivers/fsi/i2c/iic-fsi.c  | 125 +++------------------------------------------
>   drivers/fsi/i2c/iic-mstr.c |  42 +++------------
>   2 files changed, 14 insertions(+), 153 deletions(-)
>
> diff --git a/drivers/fsi/i2c/iic-fsi.c b/drivers/fsi/i2c/iic-fsi.c
> index 2c0aec9..6d5b045 100644
> --- a/drivers/fsi/i2c/iic-fsi.c
> +++ b/drivers/fsi/i2c/iic-fsi.c
> @@ -36,60 +36,12 @@
>   struct class* iic_fsi_class = 0;
>   dev_t iic_devnum_start = 0;
>
> -static const char iic_fsi_version[] = "3.0";
> +static const char iic_fsi_version[] = "3.1";
>
>   int iic_fsi_probe(struct device *dev);
>   int iic_fsi_remove(struct device *dev);
> -void iic_fsi_shutdown(struct device *dev);
>   int iic_fsi_suspend(struct device *dev);
>   int iic_fsi_resume(struct device *dev);
> -static void iic_eng_release(struct kobject* kobj);
> -
> -/* callback function for when the reference count for an engine reaches 0 */
> -static void iic_eng_release(struct kobject* kobj)
> -{
> -	iic_eng_t* eng = container_of(kobj, iic_eng_t, kobj);
> -	struct device* dev = eng->dev;
> -	unsigned long flags;
> -
> -	IENTER();
> -
> -	/*remove all busses associated with the engine */
> -	spin_lock_irqsave(&eng->lock, flags);
> -	while(eng->busses){
> -		iic_bus_t* temp = eng->busses;
> -		eng->busses = temp->next;
> -		iic_delete_bus(iic_fsi_class, temp);
> -	}
> -
> -	eng->enabled = 0x0ULL;
> -	spin_unlock_irqrestore(&eng->lock, flags);
> -
> -
> -	/* providing an arch specific cleanup routine is optional.
> -	 * if not specified, use the default.
> -	 */
> -	if (iic_eng_ops_is_vaild(eng->ops)) {
> -		if(eng->ops->cleanup_eng)
> -		{
> -			eng->ops->cleanup_eng(eng);
> -		}
> -		else
> -		{
> -			IDBGd(0, "free engine\n");
> -			kfree(eng);
> -		}
> -	}
> -
> -	dev_set_drvdata(dev, 0);
> -	kobject_put(&dev->kobj);
> -
> -	IEXIT(0);
> -}
> -
> -static struct kobj_type iic_eng_ktype = {
> -	.release = iic_eng_release,
> -};
>
>   int readb_wrap(iic_eng_t* eng, unsigned int addr, unsigned char *val,
>   	       iic_ffdc_t** ffdc)
> @@ -223,7 +175,7 @@ int iic_add_ports(iic_eng_t* eng, uint64_t ports)
>
>   	IENTER();
>
> -	IFLDi(3, "Adding ports[0x%08x%08x] to eng[0x%08x]",
> +	IFLDi(3, "Adding ports[0x%08x%08x] to eng[0x%08x]\n",
>   	      (uint32_t)(ports >> 32),
>   	      (uint32_t)ports,
>   	      eng->id);
> @@ -305,8 +257,6 @@ int iic_del_ports(iic_eng_t* eng, uint64_t ports)
>
>   	/* walk unordered SLL and delete bus if it is in the ports bit mask */
>   	spin_lock_irqsave(&eng->lock, flags);
> -	if(test_bit(IIC_ENG_REMOVED, &eng->flags))
> -		goto exit;
>   	p_abusp = &eng->busses;
>   	abusp = *p_abusp;
>   	while(abusp)
> @@ -316,7 +266,6 @@ int iic_del_ports(iic_eng_t* eng, uint64_t ports)
>   			/* found a match, remove it */
>   			*p_abusp = abusp->next;
>   			eng->enabled &= ~(0x1ULL << abusp->port);
> -			device_destroy(iic_fsi_class, abusp->devnum);
>   			iic_delete_bus(iic_fsi_class, abusp);
>   		}
>   		else
> @@ -327,12 +276,12 @@ int iic_del_ports(iic_eng_t* eng, uint64_t ports)
>   		abusp = *p_abusp;
>   	}
>
> -exit:
>   	spin_unlock_irqrestore(&eng->lock, flags);
>   	IEXIT(0);
>   	return 0;
>   }
>
> +#define IIC_FSI_PORTS	0xFFFULL
>   /*
>    * Called when an FSI IIC engine is plugged in.
>    * Causes creation of the /dev entry.
> @@ -361,12 +310,11 @@ int iic_fsi_probe(struct device *dev)
>   	iic_init_eng(eng);
>   	set_bit(IIC_ENG_BLOCK, &eng->flags); //block until resumed
>   	eng->id = 0x00F5112C;
> -	IFLDi(1, "PROBE    eng[%08x]", eng->id);
> +	IFLDi(1, "PROBE    eng[%08x]\n", eng->id);
>   	eng->ra = &fsi_reg_access;
>   	IFLDd(1, "vaddr=%#08lx\n", eng->base);
>   	eng->dev = dev;
>   	// The new kernel now requires 2 arguments
> -	kobject_init(&eng->kobj, &iic_eng_ktype); //ref count = 1
>   	eng->ops = iic_get_eng_ops(FSI_ENGID_I2C);
>   	if(!eng->ops)
>   	{
> @@ -382,7 +330,7 @@ int iic_fsi_probe(struct device *dev)
>
>   	IFLDd(1, "irq  = %d\n", eng->irq);
>
> -	new_ports = 0xFFFULL;
> +	new_ports = IIC_FSI_PORTS;
>   	set_bit(IIC_ENG_P8_Z8_CENTAUR, &eng->flags);
>
>
> @@ -394,21 +342,13 @@ int iic_fsi_probe(struct device *dev)
>   	dev_set_drvdata(dev, eng);
>   	eng->private_data = 0; //unused
>
> -
> -	/* set the callback function for when the eng ref count reaches 0 */
> -	kobject_get(&eng->dev->kobj);
> -
>   	iic_fsi_resume(dev);
>
>   error:
>   	if(rc)
>   	{
>   		IFLDi(1, "IIC: iic_fsi_probe failed: %d\n", rc);
> -		while(eng && eng->busses){
> -			iic_bus_t* temp = eng->busses;
> -			eng->busses = temp->next;
> -			iic_delete_bus(iic_fsi_class, temp);
> -		}
> +		iic_del_ports(eng, new_ports);
>   		if(eng)
>   		{
>   			kfree(eng);
> @@ -430,9 +370,7 @@ error:
>   int iic_fsi_remove(struct device* dev)
>   {
>   	int rc = 0;
> -	iic_bus_t* bus;
>   	iic_eng_t* eng = (iic_eng_t*)dev_get_drvdata(dev);
> -	unsigned long flags;
>
>   	IENTER();
>          
> @@ -453,62 +391,15 @@ int iic_fsi_remove(struct device* dev)
>   	IFLDi(1, "REMOVE   eng[%08x]\n", eng->id);
>
>   	/* Clean up device files immediately, don't wait for ref count */
> -	spin_lock_irqsave(&eng->lock, flags);
> -	bus = eng->busses;
> -	while(bus)
> -	{
> -		/* causes hot unplug event */
> -		device_destroy(iic_fsi_class, bus->devnum);
> -		bus = bus->next;
> -	}
> -	spin_unlock_irqrestore(&eng->lock, flags);
> -
> +	iic_del_ports(eng, IIC_FSI_PORTS);
>   	/* cleans up engine and bus structures if ref count is zero */
> -	kobject_put(&eng->kobj);
> +	kfree(eng);
>   	
>   error:
>   	IEXIT(0);
>   	return 0;
>   }
>
> -/* This function is called when a link is removed or the driver is unloaded.
> - * It's job is to quiesce and disable the hardware if possible and unregister
> - * interrupts. It always precedes the remove function.
> - *
> - * The device may be in the resumed or suspended state when this function is
> - * called.
> - *
> - * This function is no longer called for mcp5
> - */
> -void iic_fsi_shutdown(struct device *dev)
> -{
> -	int rc = 0;
> -	iic_eng_t* eng = (iic_eng_t*)dev_get_drvdata(dev);
> -
> -	IENTER();
> -	if(!eng || !eng->ops)
> -	{
> -		rc = -1;
> -		goto error;
> -	}
> -	IFLDi(1, "SHUTDOWN eng[%08x]\n", eng->id);
> -
> -	/* set ENG_REMOVED flag so that aborted operations have status
> -	 * set to ENOLINK (lost fsi link) instead of ENODEV (no lbus).
> -	 */
> -	set_bit(IIC_ENG_REMOVED, &eng->flags);
> -
> -	iic_fsi_suspend(dev);
> -	
> -error:
> -	if(rc)
> -	{
> -		IFLDe(1, "iic_fsi_shutdown failed: %d\n", rc);
> -	}
> -	IEXIT(0);
> -	return;
> -}
> -
>   /* This function is called when we loose ownership or are preparing to give
>    * up ownership of the local bus.  If we still own lbus, then we try to
>    * gracefully halt any pending transfer.  No hot unplug events are caused by
> diff --git a/drivers/fsi/i2c/iic-mstr.c b/drivers/fsi/i2c/iic-mstr.c
> index 0d97671..5501b22 100644
> --- a/drivers/fsi/i2c/iic-mstr.c
> +++ b/drivers/fsi/i2c/iic-mstr.c
> @@ -83,27 +83,7 @@ iic_opts_t iic_dflt_opts =
>   	}
>   };
>
> -static const char iic_mstr_version[] = "3.0";
> -
> -/* save off the default cdev type pointer so we can call the default cdev
> - * release function in our own bus release function
> - */
> -static struct kobj_type* cdev_dflt_type = 0;
> -struct kobj_type iic_bus_type;
> -
> -/* funtion called when cdev object (embedded in bus object) ref count
> - * reaches zero.  (prevents cdev memory from being freed to early)
> - */
> -void iic_bus_release(struct kobject* kobj)
> -{
> -	struct cdev *p = container_of(kobj, struct cdev, kobj);
> -	iic_bus_t* bus = container_of(p, iic_bus_t, cdev);
> -
> -	IFLDi(1, "deleting bus[%08lx]\n", bus->bus_id);
> -	if(cdev_dflt_type && cdev_dflt_type->release)
> -		cdev_dflt_type->release(kobj);
> -	kfree(bus);
> -}
> +static const char iic_mstr_version[] = "3.1";
>
>   int iic_open(struct inode* inode, struct file* filp);
>   int iic_release(struct inode* inode, struct file* filp);
> @@ -167,7 +147,6 @@ int iic_common_open(iic_client_t ** o_client, iic_bus_t * bus, int engine_num)
>   	client->tgid = current->tgid;
>   	sema_init(&client->sem, 1);
>   	init_waitqueue_head(&client->wait);
> -	kobject_get(&bus->eng->kobj);
>   	*o_client = client;
>
>   exit:
> @@ -262,7 +241,6 @@ int iic_common_release(iic_client_t * client)
>
>           client->bus = 0;
>           kfree(client);
> -        kobject_put(&bus->eng->kobj);
>
>           IEXIT(rc);
>           return rc;
> @@ -1170,6 +1148,7 @@ EXPORT_SYMBOL(iic_sideways_read);
>   ssize_t iic_read(struct file *filp, char __user *buf, size_t count,
>   		 loff_t *offset)
>   {
> +	int rc_copy;
>   	ssize_t rc = count;
>   	char *kbuf;
>   	iic_client_t *client = (iic_client_t*)filp->private_data;
> @@ -1203,7 +1182,7 @@ ssize_t iic_read(struct file *filp, char __user *buf, size_t count,
>   	if (rc < 0)
>   		goto free;
>
> -	rc = copy_to_user(buf, kbuf, count);
> +	rc_copy = copy_to_user(buf, kbuf, count);
>
>   free:
>   	kfree(kbuf);
> @@ -2148,23 +2127,11 @@ iic_bus_t*  iic_create_bus(struct class* classp, iic_eng_t* eng,
>   	bus->devnum = devnum;
>   	bus->i2c_hz = 400000;
>   	cdev_init(&bus->cdev, &iic_fops); // ref count = 1
> -	/* since cdev is embedded in our bus structure, override the cdev
> -	 * cleanup function with our own so that the bus object doesn't get
> -	 * freed until the cdev ref count goes to zero.
> -	 */
> -	if(!cdev_dflt_type)
> -	{
> -		cdev_dflt_type = bus->cdev.kobj.ktype;
> -		memcpy(&iic_bus_type, cdev_dflt_type, sizeof(iic_bus_type));
> -		iic_bus_type.release = iic_bus_release;
> -	}
> -	bus->cdev.kobj.ktype = &iic_bus_type;
>   	kobject_set_name(&bus->cdev.kobj, name);
>   	rc = cdev_add(&bus->cdev, devnum, 1);
>   	if(rc)
>   	{
>   		IFLDe(1, "cdev_add failed for bus %08lx\n", bus->bus_id);
> -		kobject_put(&bus->cdev.kobj);
>   		goto exit_cdev_add;
>   	}
>
> @@ -2186,6 +2153,7 @@ iic_bus_t*  iic_create_bus(struct class* classp, iic_eng_t* eng,
>   exit_class_add:
>   	cdev_del(&bus->cdev);
>   exit_cdev_add:
> +	kfree(bus);
>   	bus = 0;
>   exit:
>   	IEXIT((int)bus);
> @@ -2202,7 +2170,9 @@ void iic_delete_bus(struct class* classp, iic_bus_t* bus)
>   		goto exit;
>   	}
>   	IFLDi(1, "cleanup bus[%08lx]\n", bus->bus_id);
> +	device_destroy(classp, bus->devnum);
>   	cdev_del(&bus->cdev);
> +	kfree(bus);
>   exit:
>   	IEXIT(0);
>   	return;

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH linux dev-4.7 v2 2/2] drivers: fsi: i2c fix ports
  2017-02-10 16:49 ` [PATCH linux dev-4.7 v2 2/2] drivers: fsi: i2c fix ports Eddie James
@ 2017-02-13  2:02   ` Joel Stanley
  0 siblings, 0 replies; 6+ messages in thread
From: Joel Stanley @ 2017-02-13  2:02 UTC (permalink / raw)
  To: Eddie James; +Cc: OpenBMC Maillist, Christopher Bostic, Edward A. James

On Sat, Feb 11, 2017 at 3:19 AM, Eddie James <eajames@linux.vnet.ibm.com> wrote:
> From: "Edward A. James" <eajames@us.ibm.com>
>
> missing a couple of ports
>
> Signed-off-by: Edward A. James <eajames@us.ibm.com>

Applied to dev-4.7 with some fixes to the commit message.

Cheers,

Joel

> ---
>  drivers/fsi/i2c/iic-fsi.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/fsi/i2c/iic-fsi.c b/drivers/fsi/i2c/iic-fsi.c
> index 6d5b045..9c70e38 100644
> --- a/drivers/fsi/i2c/iic-fsi.c
> +++ b/drivers/fsi/i2c/iic-fsi.c
> @@ -281,7 +281,7 @@ int iic_del_ports(iic_eng_t* eng, uint64_t ports)
>         return 0;
>  }
>
> -#define IIC_FSI_PORTS  0xFFFULL
> +#define IIC_FSI_PORTS  0x7FFFULL
>  /*
>   * Called when an FSI IIC engine is plugged in.
>   * Causes creation of the /dev entry.
> --
> 1.8.3.1
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH linux dev-4.7 v2 1/2] drivers: fsi: i2c fix probing
  2017-02-10 16:59   ` Christopher Bostic
@ 2017-02-13  2:03     ` Joel Stanley
  0 siblings, 0 replies; 6+ messages in thread
From: Joel Stanley @ 2017-02-13  2:03 UTC (permalink / raw)
  To: Christopher Bostic; +Cc: Eddie James, OpenBMC Maillist, Edward A. James

On Sat, Feb 11, 2017 at 3:29 AM, Christopher Bostic
<cbostic@linux.vnet.ibm.com> wrote:
> Acked-by: Christopher Bostic <cbostic@linux.vnet.ibm.com>
>
>
>
> On 2/10/17 10:49 AM, Eddie James wrote:
>>
>> From: "Edward A. James" <eajames@us.ibm.com>
>>
>> resolve the problems when probing up the i2c driver a second time.
>>
>> Signed-off-by: Edward A. James <eajames@us.ibm.com>

Applied to dev-4.7.

Cheers,

Joel

>> ---
>>   drivers/fsi/i2c/iic-fsi.c  | 125
>> +++------------------------------------------
>>   drivers/fsi/i2c/iic-mstr.c |  42 +++------------
>>   2 files changed, 14 insertions(+), 153 deletions(-)

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-02-13  2:03 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-10 16:49 [PATCH linux dev-4.7 v2 0/2] drivers: fsi: i2c Fixes Eddie James
2017-02-10 16:49 ` [PATCH linux dev-4.7 v2 1/2] drivers: fsi: i2c fix probing Eddie James
2017-02-10 16:59   ` Christopher Bostic
2017-02-13  2:03     ` Joel Stanley
2017-02-10 16:49 ` [PATCH linux dev-4.7 v2 2/2] drivers: fsi: i2c fix ports Eddie James
2017-02-13  2:02   ` Joel Stanley

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.