summaryrefslogtreecommitdiff
path: root/drivers/pps/pps.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pps/pps.c')
-rw-r--r--drivers/pps/pps.c47
1 files changed, 4 insertions, 43 deletions
diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c
index 6437703..2420d5a 100644
--- a/drivers/pps/pps.c
+++ b/drivers/pps/pps.c
@@ -247,15 +247,12 @@ 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;
}
@@ -277,10 +274,8 @@ static void pps_device_destruct(struct device *dev)
{
struct pps_device *pps = dev_get_drvdata(dev);
- cdev_del(&pps->cdev);
-
- /* Now we can release the ID for re-use */
- pr_debug("deallocating pps%d\n", pps->id);
+ /* release id here to protect others from using it while it's
+ * still in use */
mutex_lock(&pps_idr_lock);
idr_remove(&pps_idr, pps->id);
mutex_unlock(&pps_idr_lock);
@@ -337,7 +332,6 @@ 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,
@@ -358,44 +352,11 @@ 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);
}
/*
- * Look up a pps device by magic cookie.
- * The cookie is usually a pointer to some enclosing device, but this
- * code doesn't care; you should never be dereferencing it.
- *
- * This is a bit of a kludge that is currently used only by the PPS
- * serial line discipline. It may need to be tweaked when a second user
- * is found.
- *
- * There is no function interface for setting the lookup_cookie field.
- * It's initialized to NULL when the pps device is created, and if a
- * client wants to use it, just fill it in afterward.
- *
- * The cookie is automatically set to NULL in pps_unregister_source()
- * so that it will not be used again, even if the pps device cannot
- * be removed from the idr due to pending references holding the minor
- * number in use.
- */
-struct pps_device *pps_lookup_dev(void const *cookie)
-{
- struct pps_device *pps;
- unsigned id;
-
- rcu_read_lock();
- idr_for_each_entry(&pps_idr, pps, id)
- if (cookie == pps->lookup_cookie)
- break;
- rcu_read_unlock();
- return pps;
-}
-EXPORT_SYMBOL(pps_lookup_dev);
-
-/*
* Module stuff
*/