From nobody Sat Feb 7 06:14:32 2026 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8BE99359FBD; Mon, 19 Jan 2026 12:06:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=60.244.123.138 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768824375; cv=none; b=dCwSxX1NiYtJq8ODmn99wnVCy6xLXTV9mW0TbtShb6AmsgCbRTXntfacn05xKADMR8VqoCAckB/M1FKFoAflsWy+Nspk7EFKLH1l9ZSKFWWcZ85ejBjsnbUbVm19qblzxC9W9rYPm1gRQyIjHoRdEGRljC6Pp37gl7ubiPaG00Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768824375; c=relaxed/simple; bh=vHPUqvPjrKYSRKCT8/SLoPYBMcGYvCPIzgNB5DVIev8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=YJWVjXcT/Ava9rCFJpxD7u8sRskW90Y7EwFmS6TzgamQP5F6FjcKUd8DwLpVuD0CG/qXqIeiCx/rD8UvzP1vdzMIQilBo9WC1pOU9rgOf11h9Hx08/5XkkmJvAwnuumyowfTBEVUWc7Hp0+UFUlw3zz6mrYrrBzneOt3yfS0k4c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mediatek.com; spf=pass smtp.mailfrom=mediatek.com; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b=EPe8L1Dp; arc=none smtp.client-ip=60.244.123.138 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mediatek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mediatek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="EPe8L1Dp" X-UUID: 37adce6cf52f11f085319dbc3099e8fb-20260119 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=w0nwvDGGbeAKlwnytlfaB28/G6v7YRJwvlUfRCNlojw=; b=EPe8L1DpcN9ftDy5Jic4MHD8r55PInTVCswIrjn+rAilR93SnAz6TO/hoCMBw6ycERTnwXoEJv1j8l1L0hZdgUf1WQfBvElkjJPlD02wVuLMal3w9vH9BO5czu1rIPf1o8Yh/2h+wyTxvWca0SlSNZKV+ZQcJueiqAtGAsW2qXM=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.9,REQID:b5b18ef5-1c5f-4f51-b2cf-51ff76c541ae,IP:0,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:0 X-CID-META: VersionHash:5047765,CLOUDID:ca0e4c5a-a957-4259-bcca-d3af718d7034,B ulkID:nil,BulkQuantity:0,Recheck:0,SF:81|82|102|836|888|898,TC:-5,Content: 0|15|50,EDM:-3,IP:nil,URL:0,File:130,RT:0,Bulk:nil,QS:nil,BEC:nil,COL:0,OS I:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 37adce6cf52f11f085319dbc3099e8fb-20260119 Received: from mtkmbs13n2.mediatek.inc [(172.21.101.108)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 401522602; Mon, 19 Jan 2026 20:05:59 +0800 Received: from mtkmbs11n1.mediatek.inc (172.21.101.185) by MTKMBS14N2.mediatek.inc (172.21.101.76) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Mon, 19 Jan 2026 20:05:57 +0800 Received: from mhfsdcap04.gcn.mediatek.inc (10.17.3.154) by mtkmbs11n1.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.2562.29 via Frontend Transport; Mon, 19 Jan 2026 20:05:57 +0800 From: Friday Yang To: Yong Wu , Krzysztof Kozlowski , Rob Herring , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno , Philipp Zabel CC: Friday Yang , , , , , Subject: [PATCH v12 1/2] dt-bindings: memory: mediatek: Add SMI reset and clamp for MT8188 Date: Mon, 19 Jan 2026 20:05:24 +0800 Message-ID: <20260119120552.9325-2-friday.yang@mediatek.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20260119120552.9325-1-friday.yang@mediatek.com> References: <20260119120552.9325-1-friday.yang@mediatek.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" On the MediaTek MT8188 SoC, bus glitches may occur during MTCMOS on/off transitions. The root cause is a hardware design choice in the camera subsystem where the SMI LARB and SMI Sub-Common modules are located in separate power domains and controlled by independent MTCMOS gates. A timing window exists after the main power domain is enabled but before the sub-power domain is enabled. During this window, unstable glitch signals can appear on the bus. Unlike other subsystems, the camera subsystem lacks a GALs (Globally Asynchronous Locally Synchronous) hardware module, which would normally handle cross-domain synchronization and filter out such glitches. In contrast, other subsystems have their SMI LARB and SMI Sub-Common within one power domain or could rely on GALs for synchronization. Thus they are not affected by this issue. To prevent these glitches from causing bus hang, SMI requires clamp and reset operations. This change adds the 'resets' and 'reset-names' properties to SMI LARBs within camera subsystem to support the necessary reset operations. This reset setting is exclusively required for the MediaTek MT8188 platform and remains inactive on other SoCs. We also add 'smi-sub-common' in the smi-common binding for MT8188. This indicates that some SMI LARBs are connected to the SMI Sub-Common, which in turn is connected to the SMI Common. The hardware block diagram can be described as follows. SMI-Common(Smart Multimedia Interface Common) | +----------------+------------------+ | | | | | | | | | | | | | | | larb0 SMI-Sub-Common0 SMI-Sub-Common1 | | | | | larb1 larb2 larb3 larb7 larb9 Signed-off-by: Friday Yang Reviewed-by: AngeloGioacchino Del Regno Acked-by: Rob Herring --- .../mediatek,smi-common.yaml | 2 ++ .../memory-controllers/mediatek,smi-larb.yaml | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/Documentation/devicetree/bindings/memory-controllers/mediatek,= smi-common.yaml b/Documentation/devicetree/bindings/memory-controllers/medi= atek,smi-common.yaml index 0762e0ff66ef..3d98c08b2149 100644 --- a/Documentation/devicetree/bindings/memory-controllers/mediatek,smi-com= mon.yaml +++ b/Documentation/devicetree/bindings/memory-controllers/mediatek,smi-com= mon.yaml @@ -40,6 +40,7 @@ properties: - mediatek,mt8186-smi-common - mediatek,mt8188-smi-common-vdo - mediatek,mt8188-smi-common-vpp + - mediatek,mt8188-smi-sub-common - mediatek,mt8192-smi-common - mediatek,mt8195-smi-common-vdo - mediatek,mt8195-smi-common-vpp @@ -108,6 +109,7 @@ allOf: compatible: contains: enum: + - mediatek,mt8188-smi-sub-common - mediatek,mt8195-smi-sub-common then: required: diff --git a/Documentation/devicetree/bindings/memory-controllers/mediatek,= smi-larb.yaml b/Documentation/devicetree/bindings/memory-controllers/mediat= ek,smi-larb.yaml index 2e7fac4b5094..fc5feb2eac1f 100644 --- a/Documentation/devicetree/bindings/memory-controllers/mediatek,smi-lar= b.yaml +++ b/Documentation/devicetree/bindings/memory-controllers/mediatek,smi-lar= b.yaml @@ -70,6 +70,12 @@ properties: description: the hardware id of this larb. It's only required when this hardware id is not consecutive from its M4U point of view. + resets: + maxItems: 1 + + reset-names: + const: larb + required: - compatible - reg @@ -126,6 +132,19 @@ allOf: required: - mediatek,larb-id + - if: # only for image, camera and ipe subsys + properties: + compatible: + const: mediatek,mt8188-smi-larb + mediatek,larb-id: + enum: + [ 9, 10, 11, 12, 13, 16, 17, 18, 19, 20 ] + + then: + required: + - resets + - reset-names + additionalProperties: false examples: -- 2.46.0 From nobody Sat Feb 7 06:14:32 2026 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5EFE9359FA7; Mon, 19 Jan 2026 12:06:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=60.244.123.138 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768824375; cv=none; b=Ju67Ye11QZciNaVcaHNEotu85qAuEnwb4qQg78+qP4BTmgwTVAjI3rJ/D1+0Y2uPUpEyZY0o9EPN/siWaKCvVMWE7L3EahXrDNRC39t9kDR0yHwAVVcNCi+NV4q9s235q/GmWSQ31hztMUs6VXLvV5nP9kEd6VorBhI8HoiBqKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768824375; c=relaxed/simple; bh=GI/tPvzbpnuhtBI9UeyFpKt5YenYJY9Q7hTNjTzdSKc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Q9ROdTDTfy2/fZpALitotXH1PpOn78ZdR5pxKBnAUToCrqnThP5Q1AvBwvx/E50fuqhTsWs3ZreyaRWAy6x80R61giqqvVlx8fYfPepkAQMHl0kKqZIuLeVIn869bvtzQMhJY80ARqJ98w/R88yxQFlaEVT8UXjO6vxrNWyj2r0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mediatek.com; spf=pass smtp.mailfrom=mediatek.com; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b=CGRBTB4G; arc=none smtp.client-ip=60.244.123.138 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mediatek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mediatek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="CGRBTB4G" X-UUID: 38961d52f52f11f085319dbc3099e8fb-20260119 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=PT2kb8626h9iBTlh/SYsEq06up8HphX/L2figK9gfWY=; b=CGRBTB4GU3BUAc9Bzk9hyIdAoQNj2jwv3M5RzvKYrWTodzic9ClAF4BFpoLIXZ00XtKCV8023W/NEP90lwBCXyd1PmkNXDFJyvQ+Zt4+fXYZNB5lY5yvpC1spIBRLLvHcABrYOWl7L41NERhAjms3IowsQieXTSlxGezGRSrPCw=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.9,REQID:dc94a717-eb16-4437-b7e6-78175fd99163,IP:0,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:0 X-CID-META: VersionHash:5047765,CLOUDID:cc0e4c5a-a957-4259-bcca-d3af718d7034,B ulkID:nil,BulkQuantity:0,Recheck:0,SF:81|82|102|836|888|898,TC:-5,Content: 0|15|50,EDM:-3,IP:nil,URL:0,File:130,RT:0,Bulk:nil,QS:nil,BEC:nil,COL:0,OS I:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 38961d52f52f11f085319dbc3099e8fb-20260119 Received: from mtkmbs14n1.mediatek.inc [(172.21.101.75)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 882383550; Mon, 19 Jan 2026 20:06:01 +0800 Received: from mtkmbs11n1.mediatek.inc (172.21.101.185) by mtkmbs13n1.mediatek.inc (172.21.101.193) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Mon, 19 Jan 2026 20:05:59 +0800 Received: from mhfsdcap04.gcn.mediatek.inc (10.17.3.154) by mtkmbs11n1.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.2562.29 via Frontend Transport; Mon, 19 Jan 2026 20:05:58 +0800 From: Friday Yang To: Yong Wu , Krzysztof Kozlowski , Rob Herring , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno , Philipp Zabel CC: Friday Yang , , , , , Subject: [PATCH v12 2/2] memory: mtk-smi: mt8188: Add SMI reset and clamp Date: Mon, 19 Jan 2026 20:05:25 +0800 Message-ID: <20260119120552.9325-3-friday.yang@mediatek.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20260119120552.9325-1-friday.yang@mediatek.com> References: <20260119120552.9325-1-friday.yang@mediatek.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To prevent handling glitch signals during MTCMOS on/off transitions, SMI requires clamp and reset operations. Parse the reset settings for SMI LARBs and the clamp settings for the SMI Sub-Common. Register genpd callback for the SMI LARBs located in image, camera and IPE subsystems, and apply reset and clamp operations within the callback. The 'mtk_smi_device_link_common' already parses the 'mediatek,smi' property. A similar step is required to obtain the SMI Common regmap from the 'mediatek,smi' property for the clamp function. To centralize this process and avoid redundant parsing, we achieve it together. Signed-off-by: Friday Yang --- drivers/memory/mtk-smi.c | 177 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 167 insertions(+), 10 deletions(-) diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c index aaeba8ab211e..042b4c040def 100644 --- a/drivers/memory/mtk-smi.c +++ b/drivers/memory/mtk-smi.c @@ -10,11 +10,15 @@ #include #include #include +#include #include #include #include #include +#include #include +#include +#include #include #include #include @@ -34,6 +38,8 @@ #define SMI_FIFO_TH1 0x238 #define SMI_FIFO_TH2 0x23c #define SMI_DCM 0x300 +#define SMI_COMMON_CLAMP_EN_SET 0x3c4 +#define SMI_COMMON_CLAMP_EN_CLR 0x3c8 #define SMI_DUMMY 0x444 /* SMI LARB */ @@ -134,6 +140,7 @@ struct mtk_smi_larb_gen { unsigned int larb_direct_to_common_mask; unsigned int flags_general; const u8 (*ostd)[SMI_LARB_PORT_NR_MAX]; + const u8 *clamp_port; }; struct mtk_smi { @@ -150,6 +157,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 +165,10 @@ struct mtk_smi_larb { /* larb: local arbiter */ int larbid; u32 *mmu; unsigned char *bank; + struct regmap *smi_comm_syscon; /* smi-comm or sub-comm */ + u8 smi_comm_in_port_id; /* smi-comm or sub-comm */ + struct notifier_block nb; + struct reset_control *rst_con; }; static int @@ -478,6 +490,19 @@ static const u8 mtk_smi_larb_mt8195_ostd[][SMI_LARB_PO= RT_NR_MAX] =3D { [28] =3D {0x1a, 0x0e, 0x0a, 0x0a, 0x0c, 0x0e, 0x10,}, }; +static const u8 mtk_smi_larb_clamp_port_mt8188[MTK_LARB_NR_MAX] =3D { + [9] =3D BIT(1), /* larb10 */ + [10] =3D BIT(2), /* larb11a */ + [11] =3D BIT(2), /* larb11b */ + [12] =3D BIT(3), /* larb11c */ + [13] =3D BIT(0), /* larb12 */ + [16] =3D BIT(1), /* larb15 */ + [17] =3D BIT(2), /* larb16a */ + [18] =3D BIT(2), /* larb16b */ + [19] =3D BIT(3), /* larb17a */ + [20] =3D BIT(3), /* larb17b */ +}; + static const struct mtk_smi_larb_gen mtk_smi_larb_mt2701 =3D { .port_in_larb =3D { LARB0_PORT_OFFSET, LARB1_PORT_OFFSET, @@ -531,6 +556,7 @@ static const struct mtk_smi_larb_gen mtk_smi_larb_mt818= 8 =3D { .flags_general =3D MTK_SMI_FLAG_THRT_UPDATE | MTK_SMI_FLAG_SW= _FLAG | MTK_SMI_FLAG_SLEEP_CTL | MTK_SMI_FLAG_CFG_PORT_SEC_CTL, .ostd =3D mtk_smi_larb_mt8188_ostd, + .clamp_port =3D mtk_smi_larb_clamp_port_mt8188, }; static const struct mtk_smi_larb_gen mtk_smi_larb_mt8192 =3D { @@ -582,28 +608,79 @@ static void mtk_smi_larb_sleep_ctrl_disable(struct mt= k_smi_larb *larb) writel_relaxed(0, larb->base + SMI_LARB_SLP_CON); } -static int mtk_smi_device_link_common(struct device *dev, struct device **= com_dev) +static int mtk_smi_larb_clamp_protect_enable(struct device *dev, bool enab= le) +{ + struct mtk_smi_larb *larb =3D dev_get_drvdata(dev); + u32 reg; + int ret; + + reg =3D enable ? SMI_COMMON_CLAMP_EN_SET : SMI_COMMON_CLAMP_EN_CLR; + ret =3D regmap_write(larb->smi_comm_syscon, reg, larb->smi_comm_in_port_i= d); + if (ret) + dev_err(dev, "Unable to %s clamp for input port %d: %d\n", + enable ? "enable" : "disable", + larb->smi_comm_in_port_id, ret); + + return ret; +} + +static int mtk_smi_genpd_callback(struct notifier_block *nb, + unsigned long event, void *data) +{ + struct mtk_smi_larb *larb =3D container_of(nb, struct mtk_smi_larb, nb); + struct device *dev =3D larb->dev; + int ret =3D 0; + + switch (event) { + case GENPD_NOTIFY_PRE_ON: + case GENPD_NOTIFY_PRE_OFF: + /* Clamp this larb to avoid the redundant commands */ + ret =3D mtk_smi_larb_clamp_protect_enable(dev, true); + break; + case GENPD_NOTIFY_ON: + ret =3D reset_control_reset(larb->rst_con); + if (ret) { + dev_err(dev, "Failed to reset smi larb %d\n", ret); + break; + } + + ret =3D mtk_smi_larb_clamp_protect_enable(dev, false); + break; + default: + break; + } + if (ret) + return NOTIFY_BAD; + + return NOTIFY_OK; +} + +static int mtk_smi_device_link_common(struct device *dev, struct device **= com_dev, + bool require_clamp) { struct platform_device *smi_com_pdev; struct device_node *smi_com_node; struct device *smi_com_dev; struct device_link *link; + const struct mtk_smi_larb_gen *larb_gen; + struct mtk_smi_larb *larb; + int larbid, ret; smi_com_node =3D of_parse_phandle(dev->of_node, "mediatek,smi", 0); if (!smi_com_node) return -EINVAL; smi_com_pdev =3D of_find_device_by_node(smi_com_node); - of_node_put(smi_com_node); if (!smi_com_pdev) { dev_err(dev, "Failed to get the smi_common device\n"); - return -EINVAL; + ret =3D -EINVAL; + goto err_put_node; } /* smi common is the supplier, Make sure it is ready before */ if (!platform_get_drvdata(smi_com_pdev)) { - put_device(&smi_com_pdev->dev); - return -EPROBE_DEFER; + ret =3D -EPROBE_DEFER; + goto err_put_device; } smi_com_dev =3D &smi_com_pdev->dev; @@ -611,13 +688,36 @@ static int mtk_smi_device_link_common(struct device *= dev, struct device **com_de DL_FLAG_PM_RUNTIME | DL_FLAG_STATELESS); if (!link) { dev_err(dev, "Unable to link smi-common dev\n"); - put_device(&smi_com_pdev->dev); - return -ENODEV; + ret =3D -ENODEV; + goto err_put_device; } *com_dev =3D smi_com_dev; + if (require_clamp) { + larb =3D dev_get_drvdata(dev); + larb_gen =3D larb->larb_gen; + larbid =3D larb->larbid; + larb->smi_comm_in_port_id =3D larb_gen->clamp_port[larbid]; + larb->smi_comm_syscon =3D syscon_node_to_regmap(smi_com_node); + if (IS_ERR(larb->smi_comm_syscon)) { + dev_err(dev, "Failed to get smi syscon for larb %d\n", larbid); + ret =3D PTR_ERR(larb->smi_comm_syscon); + larb->smi_comm_syscon =3D NULL; + goto err_remove_link; + } + } + of_node_put(smi_com_node); + return 0; + +err_remove_link: + device_link_remove(dev, smi_com_dev); +err_put_device: + put_device(&smi_com_pdev->dev); +err_put_node: + of_node_put(smi_com_node); + return ret; } static int mtk_smi_dts_clk_init(struct device *dev, struct mtk_smi *smi, @@ -641,16 +741,39 @@ static int mtk_smi_dts_clk_init(struct device *dev, s= truct mtk_smi *smi, return ret; } +static int mtk_smi_larb_parse_reset(struct mtk_smi_larb *larb) +{ + struct device *dev =3D larb->dev; + int ret; + + larb->rst_con =3D devm_reset_control_get_exclusive(dev, "larb"); + if (IS_ERR(larb->rst_con)) + return dev_err_probe(dev, PTR_ERR(larb->rst_con), + "Failed to get reset controller\n"); + + larb->nb.notifier_call =3D mtk_smi_genpd_callback; + ret =3D dev_pm_genpd_add_notifier(dev, &larb->nb); + if (ret) { + larb->nb.notifier_call =3D NULL; + return dev_err_probe(dev, ret, + "Failed to add genpd callback\n"); + } + + return 0; +} + static int mtk_smi_larb_probe(struct platform_device *pdev) { struct mtk_smi_larb *larb; struct device *dev =3D &pdev->dev; + bool require_clamp =3D false; int ret; larb =3D devm_kzalloc(dev, sizeof(*larb), GFP_KERNEL); if (!larb) return -ENOMEM; + larb->dev =3D dev; larb->larb_gen =3D of_device_get_match_data(dev); larb->base =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(larb->base)) @@ -663,19 +786,44 @@ static int mtk_smi_larb_probe(struct platform_device = *pdev) larb->smi.dev =3D dev; - ret =3D mtk_smi_device_link_common(dev, &larb->smi_common_dev); + platform_set_drvdata(pdev, larb); + /* The larbid are sequential for IOMMU if this property is not present */ + ret =3D of_property_read_s32(dev->of_node, "mediatek,larb-id", &larb->lar= bid); + if (ret =3D=3D -EINVAL) + goto add_dev_link; + else if (ret || larb->larbid >=3D MTK_LARB_NR_MAX) + return dev_err_probe(dev, -EINVAL, "Invalid larbid:%d\n", larb->larbid); + + if (larb->larb_gen->clamp_port && larb->larb_gen->clamp_port[larb->larbid= ]) + require_clamp =3D true; + +add_dev_link: + ret =3D mtk_smi_device_link_common(dev, &larb->smi_common_dev, require_cl= amp); if (ret < 0) return ret; + /* + * Only SMI LARBs in camera, image and IPE subsys need to + * apply clamp and reset operations, others can be skipped. + */ + if (require_clamp) { + ret =3D mtk_smi_larb_parse_reset(larb); + if (ret) + goto err_link_remove; + } + pm_runtime_enable(dev); - platform_set_drvdata(pdev, larb); ret =3D component_add(dev, &mtk_smi_larb_component_ops); if (ret) goto err_pm_disable; return 0; err_pm_disable: + if (larb->nb.notifier_call) + dev_pm_genpd_remove_notifier(&pdev->dev); + pm_runtime_disable(dev); +err_link_remove: device_link_remove(dev, larb->smi_common_dev); put_device(larb->smi_common_dev); return ret; @@ -685,6 +833,9 @@ static void mtk_smi_larb_remove(struct platform_device = *pdev) { struct mtk_smi_larb *larb =3D platform_get_drvdata(pdev); + if (larb->nb.notifier_call) + dev_pm_genpd_remove_notifier(&pdev->dev); + device_link_remove(&pdev->dev, larb->smi_common_dev); pm_runtime_disable(&pdev->dev); component_del(&pdev->dev, &mtk_smi_larb_component_ops); @@ -808,6 +959,11 @@ static const struct mtk_smi_common_plat mtk_smi_common= _mt8188_vpp =3D { .init =3D mtk_smi_common_mt8195_init, }; +static const struct mtk_smi_common_plat mtk_smi_sub_common_mt8188 =3D { + .type =3D MTK_SMI_GEN2_SUB_COMM, + .has_gals =3D true, +}; + static const struct mtk_smi_common_plat mtk_smi_common_mt8192 =3D { .type =3D MTK_SMI_GEN2, .has_gals =3D true, @@ -852,6 +1008,7 @@ static const struct of_device_id mtk_smi_common_of_ids= [] =3D { {.compatible =3D "mediatek,mt8186-smi-common", .data =3D &mtk_smi_common_= mt8186}, {.compatible =3D "mediatek,mt8188-smi-common-vdo", .data =3D &mtk_smi_com= mon_mt8188_vdo}, {.compatible =3D "mediatek,mt8188-smi-common-vpp", .data =3D &mtk_smi_com= mon_mt8188_vpp}, + {.compatible =3D "mediatek,mt8188-smi-sub-common", .data =3D &mtk_smi_sub= _common_mt8188}, {.compatible =3D "mediatek,mt8192-smi-common", .data =3D &mtk_smi_common_= mt8192}, {.compatible =3D "mediatek,mt8195-smi-common-vdo", .data =3D &mtk_smi_com= mon_mt8195_vdo}, {.compatible =3D "mediatek,mt8195-smi-common-vpp", .data =3D &mtk_smi_com= mon_mt8195_vpp}, @@ -905,7 +1062,7 @@ static int mtk_smi_common_probe(struct platform_device= *pdev) /* link its smi-common if this is smi-sub-common */ if (common->plat->type =3D=3D MTK_SMI_GEN2_SUB_COMM) { - ret =3D mtk_smi_device_link_common(dev, &common->smi_common_dev); + ret =3D mtk_smi_device_link_common(dev, &common->smi_common_dev, false); if (ret < 0) return ret; } -- 2.46.0