diff --git a/drivers/platform/tegra/tegra-fsicom.c b/drivers/platform/tegra/tegra-fsicom.c index db6408cb..2dfcc09f 100644 --- a/drivers/platform/tegra/tegra-fsicom.c +++ b/drivers/platform/tegra/tegra-fsicom.c @@ -13,6 +13,7 @@ #include #include #include +#include /* Timeout in milliseconds */ @@ -44,27 +45,25 @@ static struct task_struct *task; static struct fsi_hsp *fsi_hsp_v; -static void fsicom_send_signal(int32_t data) +static void fsicom_send_signal(int sig, int32_t data) { - struct siginfo info; - /*Sending signal to app */ memset(&info, 0, sizeof(struct siginfo)); - info.si_signo = SIG_FSI_DAEMON; + info.si_signo = sig; info.si_code = SI_QUEUE; info.si_int = (u32) (unsigned long) data; - if (task != NULL) { - if (send_sig_info(SIG_FSI_DAEMON, - (struct kernel_siginfo *)&info, task) < 0) - pr_err("Unable to send signal\n"); - } + + /* Sending signal to app */ + if (task != NULL) + if (send_sig_info(sig, (struct kernel_siginfo *)&info, task) < 0) + pr_err("Unable to send signal %d\n", sig); } static void tegra_hsp_rx_notify(struct mbox_client *cl, void *msg) { - fsicom_send_signal(*((uint32_t *)msg)); + fsicom_send_signal(SIG_FSI_WRITE_EVENT, *((uint32_t *)msg)); } static void tegra_hsp_tx_empty_notify(struct mbox_client *cl, @@ -72,6 +71,7 @@ static void tegra_hsp_tx_empty_notify(struct mbox_client *cl, { pr_debug("TX empty callback came\n"); } + static int tegra_hsp_mb_init(struct device *dev) { int err; @@ -243,11 +243,28 @@ static int fsicom_client_remove(struct platform_device *pdev) return 0; } +static int __maybe_unused fsicom_client_suspend(struct device *dev) +{ + dev_dbg(dev, "suspend called\n"); + return 0; +} + +static int __maybe_unused fsicom_client_resume(struct device *dev) +{ + dev_dbg(dev, "resume called\n"); + + fsicom_send_signal(SIG_DRIVER_RESUME, 0); + return 0; +} + +static SIMPLE_DEV_PM_OPS(fsicom_client_pm, fsicom_client_suspend, fsicom_client_resume); + static struct platform_driver fsicom_client = { .driver = { .name = "fsicom_client", .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(fsicom_client_dt_match), + .pm = pm_ptr(&fsicom_client_pm), }, .probe = fsicom_client_probe, .remove = fsicom_client_remove, diff --git a/include/uapi/linux/tegra-fsicom.h b/include/uapi/linux/tegra-fsicom.h index da0cc698..bf3fa36c 100644 --- a/include/uapi/linux/tegra-fsicom.h +++ b/include/uapi/linux/tegra-fsicom.h @@ -15,7 +15,8 @@ struct rw_data { }; /* signal value */ -#define SIG_FSI_DAEMON 44 +#define SIG_DRIVER_RESUME 43 +#define SIG_FSI_WRITE_EVENT 44 /* ioctl call macros */ #define NVMAP_SMMU_MAP _IOWR('q', 1, struct rw_data *)