From 9c4bb8998b11d8be4b13526521a749a222f91ae8 Mon Sep 17 00:00:00 2001 From: Oliver Brown Date: Thu, 23 Sep 2021 15:10:32 -0500 Subject: MLK-25498 gpu: drm: imx: Add missing PHY init to cdns_mhdp_imx_resume This fixes an issue where there is no display after resuming from suspend due to missing PHY initialization. Signed-off-by: Oliver Brown Reviewed-by: Sandor Yu (cherry picked from commit 23617be31285b84b68e652d3fb39dc73875126c1) --- drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c index 273275ed5831..ead56bed3574 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c @@ -222,6 +222,7 @@ static int cdns_mhdp_imx_resume(struct device *dev) struct imx_mhdp_device *imx_mhdp = dev_get_drvdata(dev); cdns_mhdp_plat_call(&imx_mhdp->mhdp, resume); + cdns_mhdp_plat_call(&imx_mhdp->mhdp, phy_set); return 0; } -- cgit v1.2.3 From a96256e797c4c209df591137be67a656ef6b8533 Mon Sep 17 00:00:00 2001 From: Oliver Brown Date: Tue, 28 Sep 2021 10:05:49 -0500 Subject: MLK-25731: drm: imx: hdp: correct ipg clk disable Change enable calls to disable calls in imx8qm_ipg_clk_disable Signed-off-by: Oliver Brown (cherry picked from commit 8d4eef776974fce47db4447226b3834d4eb5afc5) --- drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c | 65 +++++------------------------ 1 file changed, 11 insertions(+), 54 deletions(-) diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c index 6173fda46403..9bfe5f08f4a3 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c @@ -373,63 +373,20 @@ static int imx8qm_ipg_clk_enable(struct imx_mhdp_device *imx_mhdp) return ret; } -static int imx8qm_ipg_clk_disable(struct imx_mhdp_device *imx_mhdp) +static void imx8qm_ipg_clk_disable(struct imx_mhdp_device *imx_mhdp) { - int ret; struct imx_hdp_clks *clks = &imx_mhdp->clks; - struct device *dev = imx_mhdp->mhdp.dev; - ret = clk_prepare_enable(clks->clk_i2s_bypass); - if (ret < 0) { - dev_err(dev, "%s, pre clk i2s bypass error\n", __func__); - return ret; - } - ret = clk_prepare_enable(clks->lpcg_i2s); - if (ret < 0) { - dev_err(dev, "%s, pre clk i2s error\n", __func__); - return ret; - } - ret = clk_prepare_enable(clks->lpcg_apb_ctrl); - if (ret < 0) { - dev_err(dev, "%s, pre clk apb ctrl error\n", __func__); - return ret; - } - ret = clk_prepare_enable(clks->lpcg_apb_csr); - if (ret < 0) { - dev_err(dev, "%s, pre clk apb csr error\n", __func__); - return ret; - } - ret = clk_prepare_enable(clks->lpcg_msi); - if (ret < 0) { - dev_err(dev, "%s, pre clk msierror\n", __func__); - return ret; - } - ret = clk_prepare_enable(clks->lpcg_lis); - if (ret < 0) { - dev_err(dev, "%s, pre clk lis error\n", __func__); - return ret; - } - ret = clk_prepare_enable(clks->lpcg_apb); - if (ret < 0) { - dev_err(dev, "%s, pre clk apb error\n", __func__); - return ret; - } - ret = clk_prepare_enable(clks->clk_core); - if (ret < 0) { - dev_err(dev, "%s, pre clk core error\n", __func__); - return ret; - } - ret = clk_prepare_enable(clks->clk_ipg); - if (ret < 0) { - dev_err(dev, "%s, pre clk_ipg error\n", __func__); - return ret; - } - ret = clk_prepare_enable(clks->dig_pll); - if (ret < 0) { - dev_err(dev, "%s, pre dig pll error\n", __func__); - return ret; - } - return ret; + clk_disable_unprepare(clks->clk_i2s_bypass); + clk_disable_unprepare(clks->lpcg_i2s); + clk_disable_unprepare(clks->lpcg_apb_ctrl); + clk_disable_unprepare(clks->lpcg_apb_csr); + clk_disable_unprepare(clks->lpcg_msi); + clk_disable_unprepare(clks->lpcg_lis); + clk_disable_unprepare(clks->lpcg_apb); + clk_disable_unprepare(clks->clk_core); + clk_disable_unprepare(clks->clk_ipg); + clk_disable_unprepare(clks->dig_pll); } static void imx8qm_ipg_clk_set_rate(struct imx_mhdp_device *imx_mhdp) -- cgit v1.2.3 From f04bac0476413576c8f5047c74325ecd7fd05b7a Mon Sep 17 00:00:00 2001 From: Robin Gong Date: Fri, 6 Aug 2021 00:19:06 +0800 Subject: LF-4265: mailbox: imx: fix wakeup failure from freeze mode Since IRQF_NO_SUSPEND used for imx mailbox driver, that means this irq can't be used for wakeup source so that can't wakeup from freeze mode. Add pm_system_wakeup() to wakeup from freeze mode. Signed-off-by: Robin Gong Reviewed-by: Jacky Bai Reviewed-by: Peng Fan (cherry picked from commit d12a9c6240167bab5a49180cf642cc9e6e518bca) (cherry picked from commit 23857411888f489fbff023d05a38a0cdc035af26) --- drivers/mailbox/imx-mailbox.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c index df6a5930f79f..182df9ca24dc 100644 --- a/drivers/mailbox/imx-mailbox.c +++ b/drivers/mailbox/imx-mailbox.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -67,6 +68,7 @@ struct imx_mu_priv { const struct imx_mu_dcfg *dcfg; struct clk *clk; int irq; + bool suspend; /* for control register save and restore */ u32 xcr; @@ -374,6 +376,9 @@ static irqreturn_t imx_mu_isr(int irq, void *p) return IRQ_NONE; } + if (priv->suspend) + pm_system_wakeup(); + return IRQ_HANDLED; } @@ -634,7 +639,9 @@ static int imx_mu_suspend_noirq(struct device *dev) if (!priv->clk) priv->xcr = imx_mu_read(priv, priv->dcfg->xCR); - return 0; + priv->suspend = true; + + return 0; } static int imx_mu_resume_noirq(struct device *dev) @@ -652,6 +659,8 @@ static int imx_mu_resume_noirq(struct device *dev) if (!imx_mu_read(priv, priv->dcfg->xCR) && !priv->clk) imx_mu_write(priv, priv->xcr, priv->dcfg->xCR); + priv->suspend = false; + return 0; } -- cgit v1.2.3 From 16dca2c7b2822eb3e0bec15e6a16a7d2ba434395 Mon Sep 17 00:00:00 2001 From: Ranjani Vaidyanathan Date: Wed, 6 Oct 2021 11:54:26 -0500 Subject: MLK-25649-1 firmware: imx: imx-scu-irq: Add support for identifying SCU wakeup source from sysfs Record SCU wakeup interrupt in /sys/power/pm_wakeup_irq The user can further identify the exact wakeup source by using the following interface: cat /sys/firmware/scu_wakeup_source/wakeup_src The above will print the wake groups and the irqs that could have contributed to waking up the kernel. For example if ON/OFF button was the wakeup source: cat /sys/firmware/scu_wakeup_source/wakeup_src Wakeup source group = 3, irq = 0x1 The user can refer to the SCFW API documentation to identify all the wake groups and irqs. Signed-off-by: Ranjani Vaidyanathan (cherry picked from commit d49daabfb43eddf94144560fc2eef58015311454) (cherry picked from commit fed9f95ad512fd4b4cca7c8bfd08a78ddcaebeb9) --- drivers/firmware/imx/imx-scu-irq.c | 60 ++++++++++++++++++++++++++++++++++++-- include/linux/firmware/imx/sci.h | 24 ++++++++++++++- 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/drivers/firmware/imx/imx-scu-irq.c b/drivers/firmware/imx/imx-scu-irq.c index 369621c14105..b4272a75a315 100644 --- a/drivers/firmware/imx/imx-scu-irq.c +++ b/drivers/firmware/imx/imx-scu-irq.c @@ -10,10 +10,11 @@ #include #include #include +#include +#include #define IMX_SC_IRQ_FUNC_ENABLE 1 #define IMX_SC_IRQ_FUNC_STATUS 2 -#define IMX_SC_IRQ_NUM_GROUP 7 static u32 mu_resource_id; @@ -39,6 +40,20 @@ struct imx_sc_msg_irq_enable { u8 enable; } __packed; +struct scu_wakeup { + u32 mask; + u32 wakeup_src; + bool valid; +}; + +/* Sysfs functions */ +struct kobject *wakeup_obj; +static ssize_t wakeup_source_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf); +static struct kobj_attribute wakeup_source_attr = __ATTR(wakeup_src, 0660, wakeup_source_show, NULL); + +static struct scu_wakeup scu_irq_wakeup[IMX_SC_IRQ_NUM_GROUP]; + + static struct imx_sc_ipc *imx_sc_irq_ipc_handle; static struct work_struct imx_sc_irq_work; static BLOCKING_NOTIFIER_HEAD(imx_scu_irq_notifier_chain); @@ -70,6 +85,10 @@ static void imx_scu_irq_work_handler(struct work_struct *work) u8 i; for (i = 0; i < IMX_SC_IRQ_NUM_GROUP; i++) { + if (scu_irq_wakeup[i].mask) { + scu_irq_wakeup[i].valid = false; + scu_irq_wakeup[i].wakeup_src = 0; + } ret = imx_scu_irq_get_status(i, &irq_status); if (ret) { pr_err("get irq group %d status failed, ret %d\n", @@ -79,7 +98,12 @@ static void imx_scu_irq_work_handler(struct work_struct *work) if (!irq_status) continue; - + if (scu_irq_wakeup[i].mask & irq_status) { + scu_irq_wakeup[i].valid = true; + scu_irq_wakeup[i].wakeup_src = irq_status & scu_irq_wakeup[i].mask; + } else { + scu_irq_wakeup[i].wakeup_src = irq_status; + } pm_system_wakeup(); imx_scu_irq_notifier_call_chain(irq_status, &i); } @@ -134,6 +158,11 @@ int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable) pr_err("enable irq failed, group %d, mask %d, ret %d\n", group, mask, ret); + if (enable) + scu_irq_wakeup[group].mask |= mask; + else + scu_irq_wakeup[group].mask &= ~mask; + return ret; } EXPORT_SYMBOL(imx_scu_irq_group_enable); @@ -143,6 +172,24 @@ static void imx_scu_irq_callback(struct mbox_client *c, void *msg) schedule_work(&imx_sc_irq_work); } +static ssize_t wakeup_source_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + u8 i = 0, size = 0; + + for (i = 0; i < IMX_SC_IRQ_NUM_GROUP; i++) { + if (scu_irq_wakeup[i].wakeup_src != 0) { + if (scu_irq_wakeup[i].valid) + size += sprintf(buf + size, "Wakeup source group = %d, irq = 0x%x\n", + i, scu_irq_wakeup[i].wakeup_src); + else + size += sprintf(buf + size, "Spurious SCU wakeup, group = %d, irq = 0x%x\n", + i, scu_irq_wakeup[i].wakeup_src); + } + } + return strlen(buf); +} + int imx_scu_enable_general_irq_channel(struct device *dev) { struct of_phandle_args spec; @@ -182,6 +229,15 @@ int imx_scu_enable_general_irq_channel(struct device *dev) mu_resource_id = IMX_SC_R_MU_0A + i; + /* Create directory under /sysfs/firmware */ + wakeup_obj = kobject_create_and_add("scu_wakeup_source", firmware_kobj); + + if (sysfs_create_file(wakeup_obj, &wakeup_source_attr.attr)) { + pr_err("Cannot create sysfs file......\n"); + kobject_put(wakeup_obj); + sysfs_remove_file(firmware_kobj, &wakeup_source_attr.attr); + } + return ret; } EXPORT_SYMBOL(imx_scu_enable_general_irq_channel); diff --git a/include/linux/firmware/imx/sci.h b/include/linux/firmware/imx/sci.h index e749594436bb..70fe789aa842 100644 --- a/include/linux/firmware/imx/sci.h +++ b/include/linux/firmware/imx/sci.h @@ -17,12 +17,34 @@ #include #include -#define IMX_SC_IRQ_GROUP_WAKE 3U /* Wakeup interrupts */ +#define IMX_SC_IRQ_NUM_GROUP 9 + +#define IMX_SC_IRQ_GROUP_TEMP 0 /* Temp interrupts */ +#define IMX_SC_IRQ_GROUP_WDOG 1 /* Watchdog interrupts */ +#define IMX_SC_IRQ_GROUP_RTC 2 /* RTC interrupts */ +#define IMX_SC_IRQ_GROUP_WAKE 3 /* Wakeup interrupts */ +#define IMX_SC_IRQ_GROUP_SYSCTR 4 /* System counter interrupts */ +#define IMX_SC_IRQ_GROUP_REBOOTED 5 /* Partition reboot complete */ +#define IMX_SC_IRQ_GROUP_REBOOT 6 /* Partition reboot starting */ +#define IMX_SC_IRQ_GROUP_OFFED 7 /* Partition off complete */ +#define IMX_SC_IRQ_GROUP_OFF 8 /* Partition off starting */ + +#define IMX_SC_IRQ_RTC BIT(0) /* RTC interrupt */ +#define IMX_SC_IRQ_WDOG BIT(0) /* Watch Dog interrupt */ +#define IMX_SC_IRQ_SYSCTR BIT(0) /* System Counter interrupt */ +#define IMX_SC_IRQ_BUTTON BIT(0) /* Button interrupt */ +#define IMX_SC_IRQ_PAD BIT(1) /* Pad wakeup */ +#define IMX_SC_IRQ_USR1 BIT(2) /* User defined 1 */ +#define IMX_SC_IRQ_USR2 BIT(3) /* User defined 2 */ +#define IMX_SC_IRQ_BC_PAD BIT(4) /* Pad wakeup (broadcast to all partitions) */ +#define IMX_SC_IRQ_SW_WAKE BIT(5) /* Software requested wake */ #define IMX_SC_IRQ_SECVIO BIT(6) /* Security violation */ +#define IMX_SC_IRQ_V2X_RESET BIT(7) /* V2X reset */ int imx_scu_enable_general_irq_channel(struct device *dev); int imx_scu_irq_register_notifier(struct notifier_block *nb); int imx_scu_irq_unregister_notifier(struct notifier_block *nb); int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable); int imx_scu_irq_get_status(u8 group, u32 *irq_status); + #endif /* _SC_SCI_H */ -- cgit v1.2.3 From de6a57c6ca8ebe1f0c2fc44f850eb73fc0084069 Mon Sep 17 00:00:00 2001 From: Ranjani Vaidyanathan Date: Wed, 6 Oct 2021 11:09:07 -0500 Subject: MLK-25649-2 gpio: mxc: Add support for identifying SCU wakeup source from sysfs Consolidate SCU wakeup defines in the header file. Signed-off-by: Ranjani Vaidyanathan (cherry picked from commit 7d1a364e453397d3659cb80832e2297d49b62706) (cherry picked from commit 36bde0d134c97cfbbac9ad1078a2fbeb9b2cd9fa) --- drivers/gpio/gpio-mxc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c index 0185b6e57e78..f7efac9a347b 100644 --- a/drivers/gpio/gpio-mxc.c +++ b/drivers/gpio/gpio-mxc.c @@ -30,7 +30,6 @@ #define IMX_SC_PAD_FUNC_GET_WAKEUP 9 #define IMX_SC_PAD_FUNC_SET_WAKEUP 4 #define IMX_SC_PAD_WAKEUP_OFF 0 -#define IMX_SC_IRQ_PAD (1 << 1) #endif enum mxc_gpio_hwtype { -- cgit v1.2.3 From 82359c9fef42c549eae16d50de9f0e1cc33a8891 Mon Sep 17 00:00:00 2001 From: Ranjani Vaidyanathan Date: Wed, 6 Oct 2021 11:56:13 -0500 Subject: MLK-25649-10 firmware: seco_mu: Add support for identifying SCU wakeup source from sysfs Consolidate SCU wakeup defines in the header file. Signed-off-by: Ranjani Vaidyanathan (cherry picked from commit 215433a807576abc8cafbbb1b64715650ed98224) (cherry picked from commit 7ca430575e9ae034a2c28798fa8dd7b931f0733c) --- drivers/firmware/imx/seco_mu.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/firmware/imx/seco_mu.c b/drivers/firmware/imx/seco_mu.c index d3633d0f286a..75744e4197f9 100644 --- a/drivers/firmware/imx/seco_mu.c +++ b/drivers/firmware/imx/seco_mu.c @@ -91,8 +91,6 @@ #define MAX_DATA_SIZE_PER_USER (65 * 1024) -#define SC_IRQ_V2X_RESET (1<<7) - /* Header of the messages exchange with the SECO */ struct she_mu_hdr { u8 ver; @@ -1017,7 +1015,7 @@ static int imx_sc_v2x_reset_notify(struct notifier_block *nb, struct seco_mu_device_ctx *dev_ctx = container_of(nb, struct seco_mu_device_ctx, scu_notify); - if (!(event & SC_IRQ_V2X_RESET)) + if (!(event & IMX_SC_IRQ_V2X_RESET)) return 0; dev_ctx->v2x_reset = true; @@ -1179,7 +1177,7 @@ static int seco_mu_probe(struct platform_device *pdev) } ret = imx_scu_irq_group_enable(IMX_SC_IRQ_GROUP_WAKE, - SC_IRQ_V2X_RESET, true); + IMX_SC_IRQ_V2X_RESET, true); if (ret) { dev_warn(&pdev->dev, "v2x Enable irq failed.\n"); return ret; -- cgit v1.2.3 From ce6ce4777cd1f7ff185fcd399385a35333de007b Mon Sep 17 00:00:00 2001 From: Ranjani Vaidyanathan Date: Fri, 11 Feb 2022 13:30:50 -0600 Subject: MLK-25649-6 remoteproc: imx_proc: Add support for identifying SCU wakeup sou rce from sysfs Consolidate SCU wakeup defines in the header file. Signed-off-by: Ranjani Vaidyanathan (cherry picked from commit 012932b938d28eb47d05a505705fad3735b53d5d) --- drivers/remoteproc/imx_rproc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c index 8537eccfd73a..4a4324fb5975 100644 --- a/drivers/remoteproc/imx_rproc.c +++ b/drivers/remoteproc/imx_rproc.c @@ -1274,7 +1274,7 @@ static int imx_rproc_probe(struct platform_device *pdev) &priv->mub_partition)) priv->mub_partition = 3; - ret = imx_scu_irq_group_enable(5, BIT(priv->mub_partition), + ret = imx_scu_irq_group_enable(IMX_SC_IRQ_GROUP_REBOOTED, BIT(priv->mub_partition), true); if (ret) { dev_warn(dev, "Enable irq failed.\n"); @@ -1283,7 +1283,7 @@ static int imx_rproc_probe(struct platform_device *pdev) ret = imx_scu_irq_register_notifier(&priv->proc_nb); if (ret) { - imx_scu_irq_group_enable(5, BIT(priv->mub_partition), + imx_scu_irq_group_enable(IMX_SC_IRQ_GROUP_REBOOTED, BIT(priv->mub_partition), false); dev_warn(dev, "reqister scu notifier failed.\n"); goto err_put_clk; -- cgit v1.2.3 From 0fabcdf56f1434b0babe684bdef0cdcb6ccec0ae Mon Sep 17 00:00:00 2001 From: Ranjani Vaidyanathan Date: Wed, 6 Oct 2021 11:21:04 -0500 Subject: MLK-25649-4 mailbox: imx: Add support for identifying SCU wakeup source from sysfs Record SCU wakeup interrupt in /sys/power/pm_wakeup_irq Signed-off-by: Ranjani Vaidyanathan (cherry picked from commit e8d90d8901e42f9ac039086af9f1829030204fa8) (cherry picked from commit 2b5bb07b7c25ae047530a78d5d19466f7b6b330c) --- drivers/mailbox/imx-mailbox.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c index 182df9ca24dc..b620ed2aea44 100644 --- a/drivers/mailbox/imx-mailbox.c +++ b/drivers/mailbox/imx-mailbox.c @@ -377,7 +377,7 @@ static irqreturn_t imx_mu_isr(int irq, void *p) } if (priv->suspend) - pm_system_wakeup(); + pm_system_irq_wakeup(priv->irq); return IRQ_HANDLED; } -- cgit v1.2.3 From ac1f975e1cebbcb400da2aadfa270aec9cefbfbd Mon Sep 17 00:00:00 2001 From: Ranjani Vaidyanathan Date: Wed, 6 Oct 2021 11:27:44 -0500 Subject: MLK-25649-9 watchdog: imx_sc_wdt: Add support for identifying SCU wakeup source from sysfs Consolidate SCU wakeup defines in the header file. Signed-off-by: Ranjani Vaidyanathan (cherry picked from commit 9d2e7cc3a10f2ce1e36fc40acb494494bed08109) (cherry picked from commit 0096d3876d96b1b400f5bf2cb999078236e28bf0) Ported from codeaurora/imx_5.4.70_2.3.0 Signed-off-by: Philippe Schenker --- drivers/watchdog/imx_sc_wdt.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/drivers/watchdog/imx_sc_wdt.c b/drivers/watchdog/imx_sc_wdt.c index 8c9936e78bee..46d534e3eab0 100644 --- a/drivers/watchdog/imx_sc_wdt.c +++ b/drivers/watchdog/imx_sc_wdt.c @@ -34,9 +34,6 @@ #define SC_TIMER_WDOG_ACTION_PARTITION 0 -#define SC_IRQ_WDOG 1 -#define SC_IRQ_GROUP_WDOG 1 - static bool nowayout = WATCHDOG_NOWAYOUT; module_param(nowayout, bool, 0000); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" @@ -123,8 +120,8 @@ static int imx_sc_wdt_notify(struct notifier_block *nb, struct imx_sc_wdt_device, wdt_notifier); - if (event & SC_IRQ_WDOG && - *(u8 *)group == SC_IRQ_GROUP_WDOG) + if (event & IMX_SC_IRQ_WDOG && + *(u8 *)group == IMX_SC_IRQ_GROUP_WDOG) watchdog_notify_pretimeout(&imx_sc_wdd->wdd); return 0; @@ -135,8 +132,8 @@ static void imx_sc_wdt_action(void *data) struct notifier_block *wdt_notifier = data; imx_scu_irq_unregister_notifier(wdt_notifier); - imx_scu_irq_group_enable(SC_IRQ_GROUP_WDOG, - SC_IRQ_WDOG, + imx_scu_irq_group_enable(IMX_SC_IRQ_GROUP_WDOG, + IMX_SC_IRQ_WDOG, false); } @@ -185,9 +182,9 @@ static int imx_sc_wdt_probe(struct platform_device *pdev) watchdog_stop_on_reboot(wdog); watchdog_stop_on_unregister(wdog); - ret = imx_scu_irq_group_enable(SC_IRQ_GROUP_WDOG, - SC_IRQ_WDOG, - true); + ret = imx_scu_irq_group_enable(IMX_SC_IRQ_GROUP_WDOG, + IMX_SC_IRQ_WDOG, + true); if (ret) { dev_warn(dev, "Enable irq failed, pretimeout NOT supported\n"); goto register_device; @@ -196,8 +193,8 @@ static int imx_sc_wdt_probe(struct platform_device *pdev) imx_sc_wdd->wdt_notifier.notifier_call = imx_sc_wdt_notify; ret = imx_scu_irq_register_notifier(&imx_sc_wdd->wdt_notifier); if (ret) { - imx_scu_irq_group_enable(SC_IRQ_GROUP_WDOG, - SC_IRQ_WDOG, + imx_scu_irq_group_enable(IMX_SC_IRQ_GROUP_WDOG, + IMX_SC_IRQ_WDOG, false); dev_warn(dev, "Register irq notifier failed, pretimeout NOT supported\n"); -- cgit v1.2.3 From 007174143c1307204839e855e9c23a068bc4e29d Mon Sep 17 00:00:00 2001 From: Ranjani Vaidyanathan Date: Wed, 6 Oct 2021 11:26:39 -0500 Subject: MLK-25649-8 rtc: imx-sc: Add support for identifying SCU wakeup source from sysfs Consolidate SCU wakeup defines in the header file. Signed-off-by: Ranjani Vaidyanathan (cherry picked from commit ae44e6f054423fd6b228a147571cc77bc768138e) (cherry picked from commit 8924966cd6cb48c0c549d07f028ee544fa6dca1a) --- drivers/rtc/rtc-imx-sc.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/rtc/rtc-imx-sc.c b/drivers/rtc/rtc-imx-sc.c index 531bfce65cd6..0207397f7f12 100644 --- a/drivers/rtc/rtc-imx-sc.c +++ b/drivers/rtc/rtc-imx-sc.c @@ -18,9 +18,6 @@ #define IMX_SIP_SRTC 0xC2000002 #define IMX_SIP_SRTC_SET_TIME 0x0 -#define SC_IRQ_GROUP_RTC 2 -#define SC_IRQ_RTC 1 - static struct imx_sc_ipc *rtc_ipc_handle; static struct rtc_device *imx_sc_rtc; @@ -77,7 +74,7 @@ static int imx_sc_rtc_set_time(struct device *dev, struct rtc_time *tm) static int imx_sc_rtc_alarm_irq_enable(struct device *dev, unsigned int enable) { - return imx_scu_irq_group_enable(SC_IRQ_GROUP_RTC, SC_IRQ_RTC, enable); + return imx_scu_irq_group_enable(IMX_SC_IRQ_GROUP_RTC, IMX_SC_IRQ_RTC, enable); } static int imx_sc_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) @@ -136,7 +133,7 @@ static int imx_sc_rtc_alarm_notify(struct notifier_block *nb, unsigned long event, void *group) { /* ignore non-rtc irq */ - if (!((event & SC_IRQ_RTC) && (*(u8 *)group == SC_IRQ_GROUP_RTC))) + if (!((event & IMX_SC_IRQ_RTC) && (*(u8 *)group == IMX_SC_IRQ_GROUP_RTC))) return 0; rtc_update_irq(imx_sc_rtc, 1, RTC_IRQF | RTC_AF); -- cgit v1.2.3 From 45719cacf645796012ddd248ad08af757ffa1c77 Mon Sep 17 00:00:00 2001 From: Ranjani Vaidyanathan Date: Wed, 6 Oct 2021 11:25:39 -0500 Subject: MLK-25649-7 rpmsg: imx: Add support for identifying SCU wakeup source from sysfs Consolidate SCU wakeup defines in the header file. Signed-off-by: Ranjani Vaidyanathan (cherry picked from commit d7b1dd90185df67fe1e713ff439fc898201cb8c8) (cherry picked from commit 5693275abe2a558f7a433bba23eb8ae35bd30749) --- drivers/rpmsg/imx_rpmsg.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/drivers/rpmsg/imx_rpmsg.c b/drivers/rpmsg/imx_rpmsg.c index 9dd704ae5a64..b93df26bd21b 100644 --- a/drivers/rpmsg/imx_rpmsg.c +++ b/drivers/rpmsg/imx_rpmsg.c @@ -61,8 +61,6 @@ struct imx_rpmsg_vproc { struct platform_device *pdev; }; -#define SC_IRQ_GROUP_REBOOTED 5U /* Partition reboot complete */ - /* * The time consumption by remote ready is less than 1ms in the * evaluation. Set the max wait timeout as 50ms here. @@ -418,7 +416,7 @@ static int imx_rpmsg_partition_notify(struct notifier_block *nb, /* Ignore other irqs */ if (!((event & BIT(rpdev->mub_partition)) && - (*(u8 *)group == SC_IRQ_GROUP_REBOOTED))) + (*(u8 *)group == IMX_SC_IRQ_GROUP_REBOOTED))) return 0; imx_rpmsg_restore(rpdev); @@ -618,7 +616,7 @@ static int imx_rpmsg_probe(struct platform_device *pdev) &rpdev->mub_partition)) rpdev->mub_partition = 3; /* default partition 3 */ - ret = imx_scu_irq_group_enable(SC_IRQ_GROUP_REBOOTED, + ret = imx_scu_irq_group_enable(IMX_SC_IRQ_GROUP_REBOOTED, BIT(rpdev->mub_partition), true); if (ret) { @@ -628,7 +626,7 @@ static int imx_rpmsg_probe(struct platform_device *pdev) ret = imx_scu_irq_register_notifier(&rpdev->proc_nb); if (ret) { - imx_scu_irq_group_enable(SC_IRQ_GROUP_REBOOTED, + imx_scu_irq_group_enable(IMX_SC_IRQ_GROUP_REBOOTED, BIT(rpdev->mub_partition), false); dev_warn(&pdev->dev, "reqister scu notifier failed.\n"); -- cgit v1.2.3 From 7b01408469cae7ef288bbe29ab6324727fb5db0f Mon Sep 17 00:00:00 2001 From: "Guoniu.zhou" Date: Fri, 29 Jan 2021 10:29:11 +0800 Subject: LF-3217: media: isi: cap: call streamoff if the process abnormal exit For normal case, userspace should call streamon/streamoff balance, but for some special case, the process will be killed or terminated and the streamoff ioctl will be ignored. So driver need to handle the case. Signed-off-by: Guoniu.zhou Reviewed-by: Robby Cai (cherry picked from commit 057b44588095cb6be35175f42467c1481d0dd54b) --- drivers/staging/media/imx/imx8-isi-cap.c | 9 +++++++++ drivers/staging/media/imx/imx8-isi-core.h | 1 + 2 files changed, 10 insertions(+) diff --git a/drivers/staging/media/imx/imx8-isi-cap.c b/drivers/staging/media/imx/imx8-isi-cap.c index 6ba5b3a86f49..0960a8fa8af8 100644 --- a/drivers/staging/media/imx/imx8-isi-cap.c +++ b/drivers/staging/media/imx/imx8-isi-cap.c @@ -31,6 +31,8 @@ #include "imx8-common.h" #define sd_to_cap_dev(ptr) container_of(ptr, struct mxc_isi_cap_dev, sd) +static int mxc_isi_cap_streamoff(struct file *file, void *priv, + enum v4l2_buf_type type); struct mxc_isi_fmt mxc_isi_out_formats[] = { { @@ -739,14 +741,19 @@ static int mxc_isi_capture_open(struct file *file) static int mxc_isi_capture_release(struct file *file) { struct mxc_isi_cap_dev *isi_cap = video_drvdata(file); + struct video_device *vdev = video_devdata(file); struct mxc_isi_dev *mxc_isi = mxc_isi_get_hostdata(isi_cap->pdev); struct device *dev = &isi_cap->pdev->dev; + struct vb2_queue *q = vdev->queue; struct v4l2_subdev *sd; int ret = -1; if (!isi_cap->is_link_setup) return 0; + if (isi_cap->is_streaming[isi_cap->id]) + mxc_isi_cap_streamoff(file, NULL, q->type); + sd = mxc_get_remote_subdev(&isi_cap->sd, __func__); if (!sd) goto label; @@ -1078,6 +1085,7 @@ static int mxc_isi_cap_streamon(struct file *file, void *priv, if (ret < 0 && ret != -ENOIOCTLCMD) return ret; + isi_cap->is_streaming[isi_cap->id] = 1; mxc_isi->is_streaming = 1; return 0; @@ -1096,6 +1104,7 @@ static int mxc_isi_cap_streamoff(struct file *file, void *priv, mxc_isi_channel_disable(mxc_isi); ret = vb2_ioctl_streamoff(file, priv, type); + isi_cap->is_streaming[isi_cap->id] = 0; mxc_isi->is_streaming = 0; return ret; diff --git a/drivers/staging/media/imx/imx8-isi-core.h b/drivers/staging/media/imx/imx8-isi-core.h index c955ec21c8d8..8ae41f8e6563 100644 --- a/drivers/staging/media/imx/imx8-isi-core.h +++ b/drivers/staging/media/imx/imx8-isi-core.h @@ -310,6 +310,7 @@ struct mxc_isi_cap_dev { u32 frame_count; u32 id; + u32 is_streaming[MXC_ISI_MAX_DEVS]; bool is_link_setup; struct mutex lock; -- cgit v1.2.3 From c58325ef21a0e1581da3916378b78da248d603b4 Mon Sep 17 00:00:00 2001 From: Oliver Brown Date: Wed, 13 Apr 2022 14:52:03 -0500 Subject: MLK-25088: drm/mxsfb: Change connector type for panel The connector type for a panel without a bridge should be DRM_MODE_CONNECTOR_DPI. Signed-off-by: Oliver Brown Reviewed-by: Robert Chiras (cherry picked from commit cc8cfef78c0ebaa5936af8d1a65f9372680b6634) --- drivers/gpu/drm/mxsfb/mxsfb_out.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/mxsfb/mxsfb_out.c b/drivers/gpu/drm/mxsfb/mxsfb_out.c index 4eb94744c526..582e771cf726 100644 --- a/drivers/gpu/drm/mxsfb/mxsfb_out.c +++ b/drivers/gpu/drm/mxsfb/mxsfb_out.c @@ -92,7 +92,7 @@ int mxsfb_create_output(struct drm_device *drm) &mxsfb_panel_connector_helper_funcs); ret = drm_connector_init(drm, mxsfb->connector, &mxsfb_panel_connector_funcs, - DRM_MODE_CONNECTOR_Unknown); + DRM_MODE_CONNECTOR_DPI); } return ret; -- cgit v1.2.3 From 6625f614a921fe9a32a817d84b43c2f426bc8367 Mon Sep 17 00:00:00 2001 From: Robert Chiras Date: Fri, 9 Jul 2021 17:08:33 +0300 Subject: LF-4020: clk: imx8qxp: Fix elcdif_pll clock Move the elcdif_pll clock initialization before the lcd_clk, since the elcdif_clk needs to be initialized ahead of lcd_clk, being its parent. This change fixes issues with the LCD clocks during suspend/resume. Signed-off-by: Robert Chiras Suggested-by: Ranjani Vaidyanathan Acked-by: Laurentiu Palcu (cherry picked from commit 0668a88908ccc841081b0509d80e0b4f6b5f9a78) --- drivers/clk/imx/clk-imx8qxp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/clk/imx/clk-imx8qxp.c b/drivers/clk/imx/clk-imx8qxp.c index c49c167a23ab..7fb34c2a803e 100644 --- a/drivers/clk/imx/clk-imx8qxp.c +++ b/drivers/clk/imx/clk-imx8qxp.c @@ -147,10 +147,10 @@ static int imx8qxp_clk_probe(struct platform_device *pdev) imx_clk_scu("ftm1_clk", IMX_SC_R_FTM_1, IMX_SC_PM_CLK_PER); imx_clk_scu("adc0_clk", IMX_SC_R_ADC_0, IMX_SC_PM_CLK_PER); imx_clk_scu("pwm_clk", IMX_SC_R_LCD_0_PWM_0, IMX_SC_PM_CLK_PER); + imx_clk_scu("elcdif_pll", IMX_SC_R_ELCDIF_PLL, IMX_SC_PM_CLK_PLL); imx_clk_scu2("lcd_clk", lcd_sels, ARRAY_SIZE(lcd_sels), IMX_SC_R_LCD_0, IMX_SC_PM_CLK_PER); imx_clk_scu2("lcd_pxl_clk", lcd_pxl_sels, ARRAY_SIZE(lcd_pxl_sels), IMX_SC_R_LCD_0, IMX_SC_PM_CLK_MISC0); imx_clk_scu("lcd_pxl_bypass_div_clk", IMX_SC_R_LCD_0, IMX_SC_PM_CLK_BYPASS); - imx_clk_scu("elcdif_pll", IMX_SC_R_ELCDIF_PLL, IMX_SC_PM_CLK_PLL); /* Audio SS */ -- cgit v1.2.3 From 168e12c69ba5c56497738bb6295f3e99ec9f18e8 Mon Sep 17 00:00:00 2001 From: Oliver Brown Date: Wed, 27 Apr 2022 11:02:21 -0500 Subject: MLK-25133: arm: dts: remove power domains for i2c chips The power domains are causing the i2c expander to be reset during suspend resume. After resume the expander state is not being restored properly. So since the reset is optional, I am removing the power domains. Signed-off-by: Oliver Brown Reviewed-by: Shenwei Wang (cherry picked from commit b928f18fdf653d70871958f561357ad98fa4aa86) --- arch/arm64/boot/dts/freescale/imx8dxl-evk.dts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/arch/arm64/boot/dts/freescale/imx8dxl-evk.dts b/arch/arm64/boot/dts/freescale/imx8dxl-evk.dts index 2df401327313..9d06d25a2d8f 100644 --- a/arch/arm64/boot/dts/freescale/imx8dxl-evk.dts +++ b/arch/arm64/boot/dts/freescale/imx8dxl-evk.dts @@ -343,7 +343,6 @@ reg = <0x20>; gpio-controller; #gpio-cells = <2>; - power-domains = <&pd IMX_SC_R_BOARD_R1>; }; pca6416_2: gpio@21 { @@ -351,7 +350,6 @@ reg = <0x21>; gpio-controller; #gpio-cells = <2>; - power-domains = <&pd IMX_SC_R_BOARD_R2>; }; pca9548_1: pca9548@70 { @@ -359,7 +357,6 @@ #address-cells = <1>; #size-cells = <0>; reg = <0x70>; - power-domains = <&pd IMX_SC_R_BOARD_R0>; i2c@0 { #address-cells = <1>; @@ -470,7 +467,6 @@ #gpio-cells = <2>; interrupt-parent = <&lsio_gpio2>; interrupts = <5 IRQ_TYPE_EDGE_RISING>; - power-domains = <&pd IMX_SC_R_BOARD_R4>; }; pca9548_2: pca9548@70 { @@ -478,7 +474,6 @@ #address-cells = <1>; #size-cells = <0>; reg = <0x70>; - power-domains = <&pd IMX_SC_R_BOARD_R3>; i2c@0 { #address-cells = <1>; -- cgit v1.2.3 From c4bda7fe18b3ff6898f8fa110a3d60ee8f4379a0 Mon Sep 17 00:00:00 2001 From: Alice Guo Date: Thu, 29 Apr 2021 13:48:03 +0800 Subject: LF-3705-1: caam: imx8m: fix the built-in caam driver cannot match soc_id MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit drivers/soc/imx/soc-imx8m.c is probed later than the caam driver so that return -EPROBE_DEFER is needed after calling soc_device_match() in drivers/crypto/caam/ctrl.c. For i.MX8M, soc_device_match returning NULL can be considered that the SoC device has not been probed yet, so it returns -EPROBE_DEFER directly. Fixes: 6375d33dce9a ("soc: imx8m: change to use platform driver") Signed-off-by: Alice Guo Reviewed-by: Horia Geantă (cherry picked from commit d5df21ff810453741e23aa62de3e3911957c42b1) --- drivers/crypto/caam/ctrl.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c index b19f22aab64a..a12e987ced62 100644 --- a/drivers/crypto/caam/ctrl.c +++ b/drivers/crypto/caam/ctrl.c @@ -79,6 +79,14 @@ static void build_deinstantiation_desc(u32 *desc, int handle) append_jump(desc, JUMP_CLASS_CLASS1 | JUMP_TYPE_HALT); } +static const struct of_device_id imx8m_machine_match[] = { + { .compatible = "fsl,imx8mm", }, + { .compatible = "fsl,imx8mn", }, + { .compatible = "fsl,imx8mp", }, + { .compatible = "fsl,imx8mq", }, + { } +}; + /* * run_descriptor_deco0 - runs a descriptor on DECO0, under direct control of * the software (no JR/QI used). @@ -850,6 +858,9 @@ static int caam_probe(struct platform_device *pdev) nprop = pdev->dev.of_node; imx_soc_match = soc_device_match(caam_imx_soc_table); + if (!imx_soc_match && of_match_node(imx8m_machine_match, of_root)) + return -EPROBE_DEFER; + caam_imx = (bool)imx_soc_match; #ifdef CONFIG_PM_SLEEP -- cgit v1.2.3