OSDN Git Service

Merge "diag: Add NULL pointer checks"
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / drivers / char / diag / diagchar_core.c
index 5b7ac22..eaed3b1 100644 (file)
@@ -22,6 +22,8 @@
 #include <linux/sched.h>
 #include <linux/ratelimit.h>
 #include <linux/timer.h>
+#include <linux/platform_device.h>
+#include <linux/msm_mhi.h>
 #ifdef CONFIG_DIAG_OVER_USB
 #include <linux/usb/usbdiag.h>
 #endif
@@ -1853,14 +1855,18 @@ static int diag_ioctl_lsm_deinit(void)
 {
        int i;
 
+       mutex_lock(&driver->diagchar_mutex);
        for (i = 0; i < driver->num_clients; i++)
                if (driver->client_map[i].pid == current->tgid)
                        break;
 
-       if (i == driver->num_clients)
+       if (i == driver->num_clients) {
+               mutex_unlock(&driver->diagchar_mutex);
                return -EINVAL;
+       }
 
        driver->data_ready[i] |= DEINIT_TYPE;
+       mutex_unlock(&driver->diagchar_mutex);
        wake_up_interruptible(&driver->wait_q);
 
        return 1;
@@ -3602,6 +3608,41 @@ static int diagchar_cleanup(void)
        return 0;
 }
 
+static int diag_mhi_probe(struct platform_device *pdev)
+{
+       int ret;
+
+       if (!mhi_is_device_ready(&pdev->dev, "qcom,mhi"))
+               return -EPROBE_DEFER;
+       driver->pdev = pdev;
+       ret = diag_remote_init();
+       if (ret) {
+               diag_remote_exit();
+               return ret;
+       }
+       ret = diagfwd_bridge_init();
+       if (ret) {
+               diagfwd_bridge_exit();
+               return ret;
+       }
+       pr_debug("diag: mhi device is ready\n");
+       return 0;
+}
+
+static const struct of_device_id diag_mhi_table[] = {
+       {.compatible = "qcom,diag-mhi"},
+       {},
+};
+
+static struct platform_driver diag_mhi_driver = {
+       .probe = diag_mhi_probe,
+       .driver = {
+               .name = "DIAG MHI Platform",
+               .owner = THIS_MODULE,
+               .of_match_table = diag_mhi_table,
+       },
+};
+
 static int __init diagchar_init(void)
 {
        dev_t dev;
@@ -3691,9 +3732,6 @@ static int __init diagchar_init(void)
        ret = diag_masks_init();
        if (ret)
                goto fail;
-       ret = diag_remote_init();
-       if (ret)
-               goto fail;
        ret = diag_mux_init();
        if (ret)
                goto fail;
@@ -3730,9 +3768,7 @@ static int __init diagchar_init(void)
                goto fail;
 
        pr_debug("diagchar initialized now");
-       ret = diagfwd_bridge_init();
-       if (ret)
-               diagfwd_bridge_exit();
+       platform_driver_register(&diag_mhi_driver);
        return 0;
 
 fail:
@@ -3746,9 +3782,7 @@ fail:
        diagfwd_cntl_exit();
        diag_dci_exit();
        diag_masks_exit();
-       diag_remote_exit();
        return -1;
-
 }
 
 static void diagchar_exit(void)