smd_pkt: Add sanity check to avoid unregistering the driver twice
Attempting to unregister it again will cause a panic
Bug: 18759663
Change-Id: Iff2adbc79136c55141f35b872cb70584d303a689
Signed-off-by: Naveen Ramaraj <nramaraj@codeaurora.org>
diff --git a/arch/arm/mach-msm/smd_pkt.c b/arch/arm/mach-msm/smd_pkt.c
index 9da145a..68aa66d 100644
--- a/arch/arm/mach-msm/smd_pkt.c
+++ b/arch/arm/mach-msm/smd_pkt.c
@@ -49,12 +49,14 @@
#define DEVICE_NAME "smdpkt"
#define WAKELOCK_TIMEOUT (2*HZ)
+#define SMD_PKT_MAGIC (0xDEADBAAD)
struct smd_pkt_dev {
struct cdev cdev;
struct device *devicep;
void *pil;
char pdriver_name[PDRIVER_NAME_MAX_SIZE];
+ int magic;
struct platform_driver driver;
struct smd_channel *ch;
@@ -976,8 +978,14 @@
smd_pkt_devp->ch = 0;
smd_pkt_devp->blocking_write = 0;
smd_pkt_devp->poll_mode = 0;
- platform_driver_unregister(&smd_pkt_devp->driver);
- smd_pkt_devp->driver.probe = NULL;
+ if (smd_pkt_devp->driver.probe) {
+ platform_driver_unregister(&smd_pkt_devp->driver);
+ smd_pkt_devp->driver.probe = NULL;
+ } else {
+ pr_err("%s: invalid unregister dev id:%d magic %x\n",
+ __func__, smd_pkt_devp->i,
+ smd_pkt_devp->magic);
+ }
if (smd_pkt_devp->pil)
pil_put(smd_pkt_devp->pil);
smd_pkt_devp->has_reset = 0;
@@ -1044,6 +1052,7 @@
smd_pkt_devp[i]->is_open = 0;
smd_pkt_devp[i]->poll_mode = 0;
smd_pkt_devp[i]->wakelock_locked = 0;
+ smd_pkt_devp[i]->magic = SMD_PKT_MAGIC;
init_waitqueue_head(&smd_pkt_devp[i]->ch_opened_wait_queue);
spin_lock_init(&smd_pkt_devp[i]->pa_spinlock);
@@ -1117,6 +1126,7 @@
for (i = 0; i < NUM_SMD_PKT_PORTS; ++i) {
cdev_del(&smd_pkt_devp[i]->cdev);
+ smd_pkt_devp[i]->magic = 0;
kfree(smd_pkt_devp[i]);
device_destroy(smd_pkt_classp,
MKDEV(MAJOR(smd_pkt_number), i));