From: friday.yang <friday.yang@mediatek.com>
To: Krzysztof Kozlowski <krzk@kernel.org>,
Rob Herring <robh@kernel.org>, Conor Dooley <conor+dt@kernel.org>,
Matthias Brugger <matthias.bgg@gmail.com>,
AngeloGioacchino Del Regno
<angelogioacchino.delregno@collabora.com>
Cc: Yong Wu <yong.wu@mediatek.com>,
Philipp Zabel <p.zabel@pengutronix.de>,
Friday Yang <friday.yang@mediatek.com>,
<linux-mediatek@lists.infradead.org>,
<linux-kernel@vger.kernel.org>, <devicetree@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>,
<Project_Global_Chrome_Upstream_Group@mediatek.com>
Subject: [PATCH 3/4] memory: mtk-smi: mt8188: Add SMI clamp function
Date: Wed, 21 Aug 2024 16:26:51 +0800 [thread overview]
Message-ID: <20240821082845.11792-4-friday.yang@mediatek.com> (raw)
In-Reply-To: <20240821082845.11792-1-friday.yang@mediatek.com>
In order to avoid handling glitch signal when MTCMOS on/off, SMI need
clamp and reset operation. Parse power reset settings for LARBs which
need to reset. Register genpd callback for SMI LARBs and apply reset
operations in the callback.
Signed-off-by: friday.yang <friday.yang@mediatek.com>
---
drivers/memory/mtk-smi.c | 148 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 146 insertions(+), 2 deletions(-)
diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c
index fbe52ecc0eca..1ccd62a17b1d 100644
--- a/drivers/memory/mtk-smi.c
+++ b/drivers/memory/mtk-smi.c
@@ -10,11 +10,16 @@
#include <linux/err.h>
#include <linux/io.h>
#include <linux/iopoll.h>
+#include <linux/mfd/syscon.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
+#include <linux/pm_domain.h>
#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+#include <linux/reset-controller.h>
#include <linux/soc/mediatek/mtk_sip_svc.h>
#include <soc/mediatek/smi.h>
#include <dt-bindings/memory/mt2701-larb-port.h>
@@ -36,6 +41,13 @@
#define SMI_DCM 0x300
#define SMI_DUMMY 0x444
+#define SMI_COMMON_CLAMP_EN 0x3c0
+#define SMI_COMMON_CLAMP_EN_SET 0x3c4
+#define SMI_COMMON_CLAMP_EN_CLR 0x3c8
+#define SMI_COMMON_CLAMP_MASK(inport) BIT(inport)
+
+#define SMI_SUB_COMM_INPORT_NR (8)
+
/* SMI LARB */
#define SMI_LARB_SLP_CON 0xc
#define SLP_PROT_EN BIT(0)
@@ -150,6 +162,7 @@ struct mtk_smi {
};
struct mtk_smi_larb { /* larb: local arbiter */
+ struct device *dev;
struct mtk_smi smi;
void __iomem *base;
struct device *smi_common_dev; /* common or sub-common dev */
@@ -157,6 +170,10 @@ struct mtk_smi_larb { /* larb: local arbiter */
int larbid;
u32 *mmu;
unsigned char *bank;
+ struct regmap *sub_comm_syscon;
+ int sub_comm_inport;
+ struct notifier_block nb;
+ struct reset_control *rst_con;
};
static int
@@ -472,6 +489,60 @@ static void mtk_smi_larb_sleep_ctrl_disable(struct mtk_smi_larb *larb)
writel_relaxed(0, larb->base + SMI_LARB_SLP_CON);
}
+static int mtk_smi_larb_clamp_protect_enable(struct device *dev)
+{
+ struct mtk_smi_larb *larb = dev_get_drvdata(dev);
+ int ret;
+
+ /* sub_comm_syscon could be NULL if larb directly linked to SMI common */
+ if (!larb->sub_comm_syscon)
+ return -EINVAL;
+
+ ret = regmap_write(larb->sub_comm_syscon, SMI_COMMON_CLAMP_EN_SET,
+ SMI_COMMON_CLAMP_MASK(larb->sub_comm_inport));
+ if (ret)
+ dev_err(dev, "Unable to enable clamp, inport %d, ret %d\n",
+ larb->sub_comm_inport, ret);
+
+ return ret;
+}
+
+static int mtk_smi_larb_clamp_protect_disble(struct device *dev)
+{
+ struct mtk_smi_larb *larb = dev_get_drvdata(dev);
+ int ret;
+
+ /* sub_comm_syscon could be NULL if larb directly linked to SMI common */
+ if (!larb->sub_comm_syscon)
+ return -EINVAL;
+
+ ret = regmap_write(larb->sub_comm_syscon, SMI_COMMON_CLAMP_EN_CLR,
+ SMI_COMMON_CLAMP_MASK(larb->sub_comm_inport));
+ if (ret)
+ dev_err(dev, "Unable to disable clamp, inport %d, ret %d\n",
+ larb->sub_comm_inport, ret);
+
+ return ret;
+}
+
+static int mtk_smi_genpd_callback(struct notifier_block *nb,
+ unsigned long flags, void *data)
+{
+ struct mtk_smi_larb *larb = container_of(nb, struct mtk_smi_larb, nb);
+ struct device *dev = larb->dev;
+
+ if (flags == GENPD_NOTIFY_PRE_ON || flags == GENPD_NOTIFY_PRE_OFF) {
+ /* disable related SMI sub-common port */
+ mtk_smi_larb_clamp_protect_enable(dev);
+ } else if (flags == GENPD_NOTIFY_ON) {
+ /* enable related SMI sub-common port */
+ reset_control_reset(larb->rst_con);
+ mtk_smi_larb_clamp_protect_disble(dev);
+ }
+
+ return NOTIFY_OK;
+}
+
static int mtk_smi_device_link_common(struct device *dev, struct device **com_dev)
{
struct platform_device *smi_com_pdev;
@@ -528,6 +599,59 @@ static int mtk_smi_dts_clk_init(struct device *dev, struct mtk_smi *smi,
return ret;
}
+static int mtk_smi_larb_parse_clamp_info(struct mtk_smi_larb *larb)
+{
+ struct device *dev = larb->dev;
+ struct device_node *smi_node;
+ int ret;
+
+ /* smi_node could be NULL if larb directly linked to SMI common */
+ smi_node = of_parse_phandle(dev->of_node, "mediatek,smi-sub-comm", 0);
+ if (!smi_node)
+ return 0;
+
+ larb->sub_comm_syscon = device_node_to_regmap(smi_node);
+ of_node_put(smi_node);
+ ret = of_property_read_u32(dev->of_node,
+ "mediatek,smi-sub-comm-in-portid",
+ &larb->sub_comm_inport);
+
+ if (IS_ERR(larb->sub_comm_syscon) || ret ||
+ larb->sub_comm_inport >= SMI_SUB_COMM_INPORT_NR) {
+ larb->sub_comm_syscon = NULL;
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int mtk_smi_larb_parse_reset_info(struct mtk_smi_larb *larb)
+{
+ struct device_node *reset_node;
+ struct device *dev = larb->dev;
+ int ret;
+
+ /* only larb with "resets" need to get reset setting */
+ reset_node = of_parse_phandle(dev->of_node, "resets", 0);
+ if (!reset_node)
+ return 0;
+ of_node_put(reset_node);
+
+ larb->rst_con = devm_reset_control_get(dev, "larb_rst");
+ if (IS_ERR(larb->rst_con))
+ return dev_err_probe(dev, PTR_ERR(larb->rst_con),
+ "cannot get larb reset controller\n");
+
+ larb->nb.notifier_call = mtk_smi_genpd_callback;
+ ret = dev_pm_genpd_add_notifier(dev, &larb->nb);
+ if (ret) {
+ dev_err(dev, "Failed to add genpd callback %d\n", ret);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
static int mtk_smi_larb_probe(struct platform_device *pdev)
{
struct mtk_smi_larb *larb;
@@ -538,6 +662,7 @@ static int mtk_smi_larb_probe(struct platform_device *pdev)
if (!larb)
return -ENOMEM;
+ larb->dev = dev;
larb->larb_gen = of_device_get_match_data(dev);
larb->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(larb->base))
@@ -554,15 +679,29 @@ static int mtk_smi_larb_probe(struct platform_device *pdev)
if (ret < 0)
return ret;
- pm_runtime_enable(dev);
+ /* find sub common to clamp larb for ISP software reset */
+ ret = mtk_smi_larb_parse_clamp_info(larb);
+ if (ret) {
+ dev_err(dev, "Failed to get clamp setting for larb\n");
+ goto err_pm_disable;
+ }
+
+ ret = mtk_smi_larb_parse_reset_info(larb);
+ if (ret) {
+ dev_err(dev, "Failed to get power setting for larb\n");
+ goto err_pm_disable;
+ }
+
platform_set_drvdata(pdev, larb);
ret = component_add(dev, &mtk_smi_larb_component_ops);
if (ret)
goto err_pm_disable;
+
+ pm_runtime_enable(dev);
+
return 0;
err_pm_disable:
- pm_runtime_disable(dev);
device_link_remove(dev, larb->smi_common_dev);
return ret;
}
@@ -686,6 +825,10 @@ static const struct mtk_smi_common_plat mtk_smi_common_mt8188_vpp = {
.init = mtk_smi_common_mt8195_init,
};
+static const struct mtk_smi_common_plat mtk_smi_sub_common_mt8188 = {
+ .type = MTK_SMI_GEN2_SUB_COMM,
+};
+
static const struct mtk_smi_common_plat mtk_smi_common_mt8192 = {
.type = MTK_SMI_GEN2,
.has_gals = true,
@@ -729,6 +872,7 @@ static const struct of_device_id mtk_smi_common_of_ids[] = {
{.compatible = "mediatek,mt8186-smi-common", .data = &mtk_smi_common_mt8186},
{.compatible = "mediatek,mt8188-smi-common-vdo", .data = &mtk_smi_common_mt8188_vdo},
{.compatible = "mediatek,mt8188-smi-common-vpp", .data = &mtk_smi_common_mt8188_vpp},
+ {.compatible = "mediatek,mt8188-smi-sub-common", .data = &mtk_smi_sub_common_mt8188},
{.compatible = "mediatek,mt8192-smi-common", .data = &mtk_smi_common_mt8192},
{.compatible = "mediatek,mt8195-smi-common-vdo", .data = &mtk_smi_common_mt8195_vdo},
{.compatible = "mediatek,mt8195-smi-common-vpp", .data = &mtk_smi_common_mt8195_vpp},
--
2.46.0
next prev parent reply other threads:[~2024-08-21 8:34 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-21 8:26 [PATCH 0/4] Add SMI clamp and reset friday.yang
2024-08-21 8:26 ` [PATCH 1/4] dt-bindings: memory: mediatek: Add mt8188 SMI reset control binding friday.yang
2024-08-21 8:54 ` Krzysztof Kozlowski
2024-10-24 1:28 ` Friday Yang (杨阳)
2024-08-21 9:28 ` Krzysztof Kozlowski
2024-08-22 8:05 ` Krzysztof Kozlowski
2024-08-21 8:26 ` [PATCH 2/4] dt-bindings: memory: mediatek: Add smi-sub-common property for reset friday.yang
2024-08-21 8:55 ` Krzysztof Kozlowski
2024-10-24 1:28 ` Friday Yang (杨阳)
2024-10-24 6:38 ` Krzysztof Kozlowski
2024-10-25 9:32 ` Friday Yang (杨阳)
2024-10-24 11:59 ` AngeloGioacchino Del Regno
2024-10-25 9:33 ` Friday Yang (杨阳)
2024-08-21 8:26 ` friday.yang [this message]
2024-08-21 9:00 ` [PATCH 3/4] memory: mtk-smi: mt8188: Add SMI clamp function Krzysztof Kozlowski
2024-10-24 1:29 ` Friday Yang (杨阳)
2024-10-24 11:56 ` AngeloGioacchino Del Regno
2024-10-25 9:33 ` Friday Yang (杨阳)
2024-10-29 6:32 ` Krzysztof Kozlowski
2024-08-21 8:26 ` [PATCH 4/4] reset: mediatek: Add reset control driver for SMI friday.yang
2024-08-21 8:58 ` Krzysztof Kozlowski
2024-10-24 1:29 ` Friday Yang (杨阳)
2024-10-29 6:35 ` Krzysztof Kozlowski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240821082845.11792-4-friday.yang@mediatek.com \
--to=friday.yang@mediatek.com \
--cc=Project_Global_Chrome_Upstream_Group@mediatek.com \
--cc=angelogioacchino.delregno@collabora.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=krzk@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=matthias.bgg@gmail.com \
--cc=p.zabel@pengutronix.de \
--cc=robh@kernel.org \
--cc=yong.wu@mediatek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.