#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
{
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;
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;
ret = diag_masks_init();
if (ret)
goto fail;
- ret = diag_remote_init();
- if (ret)
- goto fail;
ret = diag_mux_init();
if (ret)
goto fail;
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:
diagfwd_cntl_exit();
diag_dci_exit();
diag_masks_exit();
- diag_remote_exit();
return -1;
-
}
static void diagchar_exit(void)