|
@@ -247,12 +247,15 @@ static int pps_cdev_open(struct inode *inode, struct file *file)
|
|
|
struct pps_device *pps = container_of(inode->i_cdev,
|
|
|
struct pps_device, cdev);
|
|
|
file->private_data = pps;
|
|
|
-
|
|
|
+ kobject_get(&pps->dev->kobj);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
static int pps_cdev_release(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
+ struct pps_device *pps = container_of(inode->i_cdev,
|
|
|
+ struct pps_device, cdev);
|
|
|
+ kobject_put(&pps->dev->kobj);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -274,8 +277,10 @@ static void pps_device_destruct(struct device *dev)
|
|
|
{
|
|
|
struct pps_device *pps = dev_get_drvdata(dev);
|
|
|
|
|
|
- /* release id here to protect others from using it while it's
|
|
|
- * still in use */
|
|
|
+ cdev_del(&pps->cdev);
|
|
|
+
|
|
|
+ /* Now we can release the ID for re-use */
|
|
|
+ pr_debug("deallocating pps%d\n", pps->id);
|
|
|
mutex_lock(&pps_idr_lock);
|
|
|
idr_remove(&pps_idr, pps->id);
|
|
|
mutex_unlock(&pps_idr_lock);
|
|
@@ -332,6 +337,7 @@ int pps_register_cdev(struct pps_device *pps)
|
|
|
goto del_cdev;
|
|
|
}
|
|
|
|
|
|
+ /* Override the release function with our own */
|
|
|
pps->dev->release = pps_device_destruct;
|
|
|
|
|
|
pr_debug("source %s got cdev (%d:%d)\n", pps->info.name,
|
|
@@ -352,9 +358,9 @@ free_idr:
|
|
|
|
|
|
void pps_unregister_cdev(struct pps_device *pps)
|
|
|
{
|
|
|
+ pr_debug("unregistering pps%d\n", pps->id);
|
|
|
pps->lookup_cookie = NULL;
|
|
|
device_destroy(pps_class, pps->dev->devt);
|
|
|
- cdev_del(&pps->cdev);
|
|
|
}
|
|
|
|
|
|
/*
|