pmic wrapper:
- code style improvements devapc: - add support for MT8186 Smart Voltage Scaling (SVS) - add support for MT8183 and MT8192 MMSYS: - Add more display paths for MT8365 Mutex: - Add common interface for MOD and SOF table - Add support for MDP on MT8183 - Move binding to soc folder - Add support to use CMDQ to enable the mutex, needed by MDP3 Power domains: - Add support for MT6795 -----BEGIN PGP SIGNATURE----- iQJLBAABCAA1FiEEUdvKHhzqrUYPB/u8L21+TfbCqH4FAmLIYUUXHG1hdHRoaWFz LmJnZ0BnbWFpbC5jb20ACgkQL21+TfbCqH5PJQ/9Ffxj2hvBIijbiomaah+854GZ Z6pJjozFRFLfsJW1EcVXVCGWGXm2b1Zj6SY0ReAw+SG0wb983N+ldym0onBjMozd Pzo5oImxgZzQVXIW9xreFDf0HsSI9i8IJJaABckW/ZjGPv15z1DRWhw99jeH3C/7 /eogSqMZrKjxWO5AnGL+3VJxSadFr8sXkxSy0bCr4C0y13hKmp8d9udn5zlnjR/K Ubavm0oruCuOPilWgkJi2rwql85cQN+3/21dQTdr6klQK76yfeJgwEGKlqXShrzP Heuzn6STHhMaLcXm4I/65jwXIiBmyiLL9jdLtlfHvR4d+2o9oUd0fD+sqcjn6LF2 K04vmKQ10cSFdXJq+YOzx/h+UThCrb8w0SSyHv83xNMNrjzLEf5ozfD9vjm+ogBd oYjrt/y6C61wQcRS/yqnb9AeNLxHdiOFcAmL8c4uwJwdH01OKOWxFfHGX+bGRt0M qvmvG9ctdZmQbo1sQmnIdU4za+rEzjMktCjuFY2bdy9CvgKYEUWir1/OGPkrnPQa 7A+0Pd2QbpDFSLK6kD4Mut8QXckMq9mitMMKFWO4xHstAN0FYvvSIoUPwSTksIaa QMNPhKI3wIXFtWnHKyHTLY7IyIUNo34RrOsH5vLFnX63mjrwop+XAwDoa9mwIdN7 7vZ0XlkI0Xkjkm8V0dI= =VZvg -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEo6/YBQwIrVS28WGKmmx57+YAGNkFAmLNcKsACgkQmmx57+YA GNmT6A/7BZy2sgLVuM8Z3rdvpWkuIw1LcvKs+66iAVEeZNrEOh5SWSuY1RffTMiL 8cGbenKJlmIalBQkUUVVp3dNsGIU89sExdnYSTfKNuKaZpQw1dbY+5s7w6Y72C2h /tJ+10LnG2fUJunvdEluENBNqapy+nACazJu1sfXkTp7wD+WQO+bYv0nZrk9sAoo YjBU42SpJUX3y7nX/ljnqIqBbyHHIeF7JUByUa5wUlMfA3DnOqlA02DkOGxDUqn+ F2e7Xozaj5P4pbxddTWX91CWfRcA77ho3R4jre2u8XZMzrClDnajQCtP+PwMssre WdWGUo6ENiy85ZohXIl5kBzXy8CoIgjsn6M09lqaEfQh+VVjHK54Ti3KX6ziGLeI Gfh12l2zcCtNa40L1oypsISdCDc3SSY79MXiEu8Ux1TJ7O9cmsMyjyKDCwhWixlL DFAe1bXMIcwjjC+eOEyBHaAmWOb1xLIn4bsp/A7XzmalSzgYyiU0G8hzx73VS3Q5 MslcSVwPlHoR6G+RuFjwWJ6fcS/765E3mRN8lbaYUgO5vaJT9faFmgkH7ubOCk8g oBV/57f4nd8+ifDqPgDwv6DJNWq8jNBtyEQ+oHSc4lj7UE+jZMor7XPKnArdtL3Q /qMqQhTA6rCsXUij6ayKBg3IGia7M13ffP30WerMc8TOixUjQvY= =KbI7 -----END PGP SIGNATURE----- Merge tag 'v5.19-next-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux into arm/drivers pmic wrapper: - code style improvements devapc: - add support for MT8186 Smart Voltage Scaling (SVS) - add support for MT8183 and MT8192 MMSYS: - Add more display paths for MT8365 Mutex: - Add common interface for MOD and SOF table - Add support for MDP on MT8183 - Move binding to soc folder - Add support to use CMDQ to enable the mutex, needed by MDP3 Power domains: - Add support for MT6795 * tag 'v5.19-next-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux: (29 commits) soc: mediatek: mutex: Simplify with devm_platform_get_and_ioremap_resource() soc: mediatek: pm-domains: Add support for Helio X10 MT6795 dt-bindings: power: Add MediaTek Helio X10 MT6795 power domains soc: mediatek: SVS: Use DEFINE_SIMPLE_DEV_PM_OPS for svs_pm_ops soc: mediatek: mtk-pm-domains: Allow probing vreg supply on two MFGs soc: mediatek: fix missing clk_disable_unprepare() on err in svs_resume() soc: mediatek: mutex: Use DDP_COMPONENT_DITHER0 mod index for MT8365 soc: mediatek: mutex: add functions that operate registers by CMDQ dt-bindings: soc: mediatek: add gce-client-reg for MUTEX dt-bindings: soc: mediatek: move out common module from display folder soc: mediatek: mutex: add 8183 MUTEX MOD settings for MDP soc: mediatek: mutex: add common interface for modules setting soc: mediatek: pm-domains: Add support always on flag soc: mediatek: mt8365-mmsys: add DPI/HDMI display path soc: mediatek: mutex: add MT8365 support soc: mediatek: SVS: add mt8192 SVS GPU driver dt-bindings: soc: mediatek: add mt8192 svs dt-bindings soc: mediatek: SVS: add debug commands soc: mediatek: SVS: add monitor mode soc: mediatek: SVS: introduce MTK SVS engine ... Link: https://lore.kernel.org/r/b733bd82-6d99-23ef-0541-98e98eb8d3bc@gmail.com Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
ff6c226953
@ -23,6 +23,7 @@ properties:
|
||||
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt6795-power-controller
|
||||
- mediatek,mt8167-power-controller
|
||||
- mediatek,mt8173-power-controller
|
||||
- mediatek,mt8183-power-controller
|
||||
@ -62,6 +63,7 @@ patternProperties:
|
||||
reg:
|
||||
description: |
|
||||
Power domain index. Valid values are defined in:
|
||||
"include/dt-bindings/power/mt6795-power.h" - for MT8167 type power domain.
|
||||
"include/dt-bindings/power/mt8167-power.h" - for MT8167 type power domain.
|
||||
"include/dt-bindings/power/mt8173-power.h" - for MT8173 type power domain.
|
||||
"include/dt-bindings/power/mt8183-power.h" - for MT8183 type power domain.
|
||||
|
@ -20,6 +20,7 @@ properties:
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt6779-devapc
|
||||
- mediatek,mt8186-devapc
|
||||
|
||||
reg:
|
||||
description: The base address of devapc register bank
|
||||
|
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/mediatek/mediatek,mutex.yaml#
|
||||
$id: http://devicetree.org/schemas/soc/mediatek/mediatek,mutex.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Mediatek mutex
|
||||
@ -55,6 +55,18 @@ properties:
|
||||
include/dt-bindings/gce/<chip>-gce.h of each chips.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
|
||||
mediatek,gce-client-reg:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
items:
|
||||
items:
|
||||
- description: phandle of GCE
|
||||
- description: GCE subsys id
|
||||
- description: register offset
|
||||
- description: register size
|
||||
description: The register of client driver can be configured by gce with
|
||||
4 arguments defined in this property. Each GCE subsys id is mapping to
|
||||
a client defined in the header include/dt-bindings/gce/<chip>-gce.h.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
91
Documentation/devicetree/bindings/soc/mediatek/mtk-svs.yaml
Normal file
91
Documentation/devicetree/bindings/soc/mediatek/mtk-svs.yaml
Normal file
@ -0,0 +1,91 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/soc/mediatek/mtk-svs.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek Smart Voltage Scaling (SVS) Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Roger Lu <roger.lu@mediatek.com>
|
||||
- Matthias Brugger <matthias.bgg@gmail.com>
|
||||
- Kevin Hilman <khilman@kernel.org>
|
||||
|
||||
description: |+
|
||||
The SVS engine is a piece of hardware which has several
|
||||
controllers(banks) for calculating suitable voltage to
|
||||
different power domains(CPU/GPU/CCI) according to
|
||||
chip process corner, temperatures and other factors. Then DVFS
|
||||
driver could apply SVS bank voltage to PMIC/Buck.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt8183-svs
|
||||
- mediatek,mt8192-svs
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description: Address range of the MTK SVS controller.
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
description: Main clock for MTK SVS controller to work.
|
||||
|
||||
clock-names:
|
||||
const: main
|
||||
|
||||
nvmem-cells:
|
||||
minItems: 1
|
||||
description:
|
||||
Phandle to the calibration data provided by a nvmem device.
|
||||
items:
|
||||
- description: SVS efuse for SVS controller
|
||||
- description: Thermal efuse for SVS controller
|
||||
|
||||
nvmem-cell-names:
|
||||
items:
|
||||
- const: svs-calibration-data
|
||||
- const: t-calibration-data
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
- const: svs_rst
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- clock-names
|
||||
- nvmem-cells
|
||||
- nvmem-cell-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/mt8183-clk.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
svs@1100b000 {
|
||||
compatible = "mediatek,mt8183-svs";
|
||||
reg = <0 0x1100b000 0 0x1000>;
|
||||
interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_LOW>;
|
||||
clocks = <&infracfg CLK_INFRA_THERM>;
|
||||
clock-names = "main";
|
||||
nvmem-cells = <&svs_calibration>, <&thermal_calibration>;
|
||||
nvmem-cell-names = "svs-calibration-data", "t-calibration-data";
|
||||
};
|
||||
};
|
@ -73,4 +73,14 @@ config MTK_MMSYS
|
||||
Say yes here to add support for the MediaTek Multimedia
|
||||
Subsystem (MMSYS).
|
||||
|
||||
config MTK_SVS
|
||||
tristate "MediaTek Smart Voltage Scaling(SVS)"
|
||||
depends on MTK_EFUSE && NVMEM
|
||||
help
|
||||
The Smart Voltage Scaling(SVS) engine is a piece of hardware
|
||||
which has several controllers(banks) for calculating suitable
|
||||
voltage to different power domains(CPU/GPU/CCI) according to
|
||||
chip process corner, temperatures and other factors. Then DVFS
|
||||
driver could apply SVS bank voltage to PMIC/Buck.
|
||||
|
||||
endmenu
|
||||
|
@ -7,3 +7,4 @@ obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o
|
||||
obj-$(CONFIG_MTK_SCPSYS_PM_DOMAINS) += mtk-pm-domains.o
|
||||
obj-$(CONFIG_MTK_MMSYS) += mtk-mmsys.o
|
||||
obj-$(CONFIG_MTK_MMSYS) += mtk-mutex.o
|
||||
obj-$(CONFIG_MTK_SVS) += mtk-svs.o
|
||||
|
112
drivers/soc/mediatek/mt6795-pm-domains.h
Normal file
112
drivers/soc/mediatek/mt6795-pm-domains.h
Normal file
@ -0,0 +1,112 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#ifndef __SOC_MEDIATEK_MT6795_PM_DOMAINS_H
|
||||
#define __SOC_MEDIATEK_MT6795_PM_DOMAINS_H
|
||||
|
||||
#include "mtk-pm-domains.h"
|
||||
#include <dt-bindings/power/mt6795-power.h>
|
||||
|
||||
/*
|
||||
* MT6795 power domain support
|
||||
*/
|
||||
|
||||
static const struct scpsys_domain_data scpsys_domain_data_mt6795[] = {
|
||||
[MT6795_POWER_DOMAIN_VDEC] = {
|
||||
.name = "vdec",
|
||||
.sta_mask = PWR_STATUS_VDEC,
|
||||
.ctl_offs = SPM_VDE_PWR_CON,
|
||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND,
|
||||
.sram_pdn_bits = GENMASK(11, 8),
|
||||
.sram_pdn_ack_bits = GENMASK(12, 12),
|
||||
},
|
||||
[MT6795_POWER_DOMAIN_VENC] = {
|
||||
.name = "venc",
|
||||
.sta_mask = PWR_STATUS_VENC,
|
||||
.ctl_offs = SPM_VEN_PWR_CON,
|
||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND,
|
||||
.sram_pdn_bits = GENMASK(11, 8),
|
||||
.sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
},
|
||||
[MT6795_POWER_DOMAIN_ISP] = {
|
||||
.name = "isp",
|
||||
.sta_mask = PWR_STATUS_ISP,
|
||||
.ctl_offs = SPM_ISP_PWR_CON,
|
||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND,
|
||||
.sram_pdn_bits = GENMASK(11, 8),
|
||||
.sram_pdn_ack_bits = GENMASK(13, 12),
|
||||
},
|
||||
[MT6795_POWER_DOMAIN_MM] = {
|
||||
.name = "mm",
|
||||
.sta_mask = PWR_STATUS_DISP,
|
||||
.ctl_offs = SPM_DIS_PWR_CON,
|
||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND,
|
||||
.sram_pdn_bits = GENMASK(11, 8),
|
||||
.sram_pdn_ack_bits = GENMASK(12, 12),
|
||||
.bp_infracfg = {
|
||||
BUS_PROT_UPDATE_TOPAXI(MT8173_TOP_AXI_PROT_EN_MM_M0 |
|
||||
MT8173_TOP_AXI_PROT_EN_MM_M1),
|
||||
},
|
||||
},
|
||||
[MT6795_POWER_DOMAIN_MJC] = {
|
||||
.name = "mjc",
|
||||
.sta_mask = BIT(20),
|
||||
.ctl_offs = 0x298,
|
||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND,
|
||||
.sram_pdn_bits = GENMASK(11, 8),
|
||||
.sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
},
|
||||
[MT6795_POWER_DOMAIN_AUDIO] = {
|
||||
.name = "audio",
|
||||
.sta_mask = PWR_STATUS_AUDIO,
|
||||
.ctl_offs = SPM_AUDIO_PWR_CON,
|
||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND,
|
||||
.sram_pdn_bits = GENMASK(11, 8),
|
||||
.sram_pdn_ack_bits = GENMASK(15, 12),
|
||||
},
|
||||
[MT6795_POWER_DOMAIN_MFG_ASYNC] = {
|
||||
.name = "mfg_async",
|
||||
.sta_mask = PWR_STATUS_MFG_ASYNC,
|
||||
.ctl_offs = SPM_MFG_ASYNC_PWR_CON,
|
||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND,
|
||||
.sram_pdn_bits = GENMASK(11, 8),
|
||||
.sram_pdn_ack_bits = 0,
|
||||
},
|
||||
[MT6795_POWER_DOMAIN_MFG_2D] = {
|
||||
.name = "mfg_2d",
|
||||
.sta_mask = PWR_STATUS_MFG_2D,
|
||||
.ctl_offs = SPM_MFG_2D_PWR_CON,
|
||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND,
|
||||
.sram_pdn_bits = GENMASK(11, 8),
|
||||
.sram_pdn_ack_bits = GENMASK(13, 12),
|
||||
},
|
||||
[MT6795_POWER_DOMAIN_MFG] = {
|
||||
.name = "mfg",
|
||||
.sta_mask = PWR_STATUS_MFG,
|
||||
.ctl_offs = SPM_MFG_PWR_CON,
|
||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND,
|
||||
.sram_pdn_bits = GENMASK(13, 8),
|
||||
.sram_pdn_ack_bits = GENMASK(21, 16),
|
||||
.bp_infracfg = {
|
||||
BUS_PROT_UPDATE_TOPAXI(MT8173_TOP_AXI_PROT_EN_MFG_S |
|
||||
MT8173_TOP_AXI_PROT_EN_MFG_M0 |
|
||||
MT8173_TOP_AXI_PROT_EN_MFG_M1 |
|
||||
MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct scpsys_soc_data mt6795_scpsys_data = {
|
||||
.domains_data = scpsys_domain_data_mt6795,
|
||||
.num_domains = ARRAY_SIZE(scpsys_domain_data_mt6795),
|
||||
};
|
||||
|
||||
#endif /* __SOC_MEDIATEK_MT6795_PM_DOMAINS_H */
|
@ -41,6 +41,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
|
||||
.pwr_sta2nd_offs = 0x0184,
|
||||
.sram_pdn_bits = 0,
|
||||
.sram_pdn_ack_bits = 0,
|
||||
.caps = MTK_SCPD_DOMAIN_SUPPLY,
|
||||
},
|
||||
[MT8183_POWER_DOMAIN_MFG] = {
|
||||
.name = "mfg",
|
||||
|
@ -51,7 +51,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8186[] = {
|
||||
MT8186_TOP_AXI_PROT_EN_1_CLR,
|
||||
MT8186_TOP_AXI_PROT_EN_1_STA),
|
||||
},
|
||||
.caps = MTK_SCPD_KEEP_DEFAULT_OFF,
|
||||
.caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_DOMAIN_SUPPLY,
|
||||
},
|
||||
[MT8186_POWER_DOMAIN_MFG2] = {
|
||||
.name = "mfg2",
|
||||
|
@ -58,6 +58,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
|
||||
.pwr_sta2nd_offs = 0x0170,
|
||||
.sram_pdn_bits = GENMASK(8, 8),
|
||||
.sram_pdn_ack_bits = GENMASK(12, 12),
|
||||
.caps = MTK_SCPD_DOMAIN_SUPPLY,
|
||||
},
|
||||
[MT8192_POWER_DOMAIN_MFG1] = {
|
||||
.name = "mfg1",
|
||||
@ -85,6 +86,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
|
||||
MT8192_TOP_AXI_PROT_EN_2_CLR,
|
||||
MT8192_TOP_AXI_PROT_EN_2_STA1),
|
||||
},
|
||||
.caps = MTK_SCPD_DOMAIN_SUPPLY,
|
||||
},
|
||||
[MT8192_POWER_DOMAIN_MFG2] = {
|
||||
.name = "mfg2",
|
||||
|
@ -67,7 +67,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8195[] = {
|
||||
.ctl_offs = 0x334,
|
||||
.pwr_sta_offs = 0x174,
|
||||
.pwr_sta2nd_offs = 0x178,
|
||||
.caps = MTK_SCPD_ACTIVE_WAKEUP,
|
||||
.caps = MTK_SCPD_ACTIVE_WAKEUP | MTK_SCPD_ALWAYS_ON,
|
||||
},
|
||||
[MT8195_POWER_DOMAIN_CSI_RX_TOP] = {
|
||||
.name = "csi_rx_top",
|
||||
@ -162,7 +162,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8195[] = {
|
||||
MT8195_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR,
|
||||
MT8195_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA1),
|
||||
},
|
||||
.caps = MTK_SCPD_KEEP_DEFAULT_OFF,
|
||||
.caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_DOMAIN_SUPPLY,
|
||||
},
|
||||
[MT8195_POWER_DOMAIN_MFG2] = {
|
||||
.name = "mfg2",
|
||||
|
@ -10,6 +10,9 @@
|
||||
#define MT8365_DISP_REG_CONFIG_DISP_RDMA0_RSZ0_SEL_IN 0xf60
|
||||
#define MT8365_DISP_REG_CONFIG_DISP_COLOR0_SEL_IN 0xf64
|
||||
#define MT8365_DISP_REG_CONFIG_DISP_DSI0_SEL_IN 0xf68
|
||||
#define MT8365_DISP_REG_CONFIG_DISP_RDMA1_SOUT_SEL 0xfd0
|
||||
#define MT8365_DISP_REG_CONFIG_DISP_DPI0_SEL_IN 0xfd8
|
||||
#define MT8365_DISP_REG_CONFIG_DISP_LVDS_SYS_CFG_00 0xfdc
|
||||
|
||||
#define MT8365_RDMA0_SOUT_COLOR0 0x1
|
||||
#define MT8365_DITHER_MOUT_EN_DSI0 0x1
|
||||
@ -18,6 +21,10 @@
|
||||
#define MT8365_RDMA0_RSZ0_SEL_IN_RDMA0 0x0
|
||||
#define MT8365_DISP_COLOR_SEL_IN_COLOR0 0x0
|
||||
#define MT8365_OVL0_MOUT_PATH0_SEL BIT(0)
|
||||
#define MT8365_RDMA1_SOUT_DPI0 0x1
|
||||
#define MT8365_DPI0_SEL_IN_RDMA1 0x0
|
||||
#define MT8365_LVDS_SYS_CFG_00_SEL_LVDS_PXL_CLK 0x1
|
||||
#define MT8365_DPI0_SEL_IN_RDMA1 0x0
|
||||
|
||||
static const struct mtk_mmsys_routes mt8365_mmsys_routing_table[] = {
|
||||
{
|
||||
@ -55,6 +62,21 @@ static const struct mtk_mmsys_routes mt8365_mmsys_routing_table[] = {
|
||||
MT8365_DISP_REG_CONFIG_DISP_RDMA0_RSZ0_SEL_IN,
|
||||
MT8365_RDMA0_RSZ0_SEL_IN_RDMA0, MT8365_RDMA0_RSZ0_SEL_IN_RDMA0
|
||||
},
|
||||
{
|
||||
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DPI0,
|
||||
MT8365_DISP_REG_CONFIG_DISP_LVDS_SYS_CFG_00,
|
||||
MT8365_LVDS_SYS_CFG_00_SEL_LVDS_PXL_CLK, MT8365_LVDS_SYS_CFG_00_SEL_LVDS_PXL_CLK
|
||||
},
|
||||
{
|
||||
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DPI0,
|
||||
MT8365_DISP_REG_CONFIG_DISP_DPI0_SEL_IN,
|
||||
MT8365_DPI0_SEL_IN_RDMA1, MT8365_DPI0_SEL_IN_RDMA1
|
||||
},
|
||||
{
|
||||
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DPI0,
|
||||
MT8365_DISP_REG_CONFIG_DISP_RDMA1_SOUT_SEL,
|
||||
MT8365_RDMA1_SOUT_DPI0, MT8365_RDMA1_SOUT_DPI0
|
||||
},
|
||||
};
|
||||
|
||||
#endif /* __SOC_MEDIATEK_MT8365_MMSYS_H */
|
||||
|
@ -31,10 +31,7 @@ struct mtk_devapc_vio_dbgs {
|
||||
u32 vio_dbg1;
|
||||
};
|
||||
|
||||
struct mtk_devapc_data {
|
||||
/* numbers of violation index */
|
||||
u32 vio_idx_num;
|
||||
|
||||
struct mtk_devapc_regs_ofs {
|
||||
/* reg offset */
|
||||
u32 vio_mask_offset;
|
||||
u32 vio_sta_offset;
|
||||
@ -46,6 +43,12 @@ struct mtk_devapc_data {
|
||||
u32 vio_shift_con_offset;
|
||||
};
|
||||
|
||||
struct mtk_devapc_data {
|
||||
/* numbers of violation index */
|
||||
u32 vio_idx_num;
|
||||
const struct mtk_devapc_regs_ofs *regs_ofs;
|
||||
};
|
||||
|
||||
struct mtk_devapc_context {
|
||||
struct device *dev;
|
||||
void __iomem *infra_base;
|
||||
@ -58,7 +61,7 @@ static void clear_vio_status(struct mtk_devapc_context *ctx)
|
||||
void __iomem *reg;
|
||||
int i;
|
||||
|
||||
reg = ctx->infra_base + ctx->data->vio_sta_offset;
|
||||
reg = ctx->infra_base + ctx->data->regs_ofs->vio_sta_offset;
|
||||
|
||||
for (i = 0; i < VIO_MOD_TO_REG_IND(ctx->data->vio_idx_num) - 1; i++)
|
||||
writel(GENMASK(31, 0), reg + 4 * i);
|
||||
@ -73,7 +76,7 @@ static void mask_module_irq(struct mtk_devapc_context *ctx, bool mask)
|
||||
u32 val;
|
||||
int i;
|
||||
|
||||
reg = ctx->infra_base + ctx->data->vio_mask_offset;
|
||||
reg = ctx->infra_base + ctx->data->regs_ofs->vio_mask_offset;
|
||||
|
||||
if (mask)
|
||||
val = GENMASK(31, 0);
|
||||
@ -116,11 +119,11 @@ static int devapc_sync_vio_dbg(struct mtk_devapc_context *ctx)
|
||||
u32 val;
|
||||
|
||||
pd_vio_shift_sta_reg = ctx->infra_base +
|
||||
ctx->data->vio_shift_sta_offset;
|
||||
ctx->data->regs_ofs->vio_shift_sta_offset;
|
||||
pd_vio_shift_sel_reg = ctx->infra_base +
|
||||
ctx->data->vio_shift_sel_offset;
|
||||
ctx->data->regs_ofs->vio_shift_sel_offset;
|
||||
pd_vio_shift_con_reg = ctx->infra_base +
|
||||
ctx->data->vio_shift_con_offset;
|
||||
ctx->data->regs_ofs->vio_shift_con_offset;
|
||||
|
||||
/* Find the minimum shift group which has violation */
|
||||
val = readl(pd_vio_shift_sta_reg);
|
||||
@ -161,8 +164,8 @@ static void devapc_extract_vio_dbg(struct mtk_devapc_context *ctx)
|
||||
void __iomem *vio_dbg0_reg;
|
||||
void __iomem *vio_dbg1_reg;
|
||||
|
||||
vio_dbg0_reg = ctx->infra_base + ctx->data->vio_dbg0_offset;
|
||||
vio_dbg1_reg = ctx->infra_base + ctx->data->vio_dbg1_offset;
|
||||
vio_dbg0_reg = ctx->infra_base + ctx->data->regs_ofs->vio_dbg0_offset;
|
||||
vio_dbg1_reg = ctx->infra_base + ctx->data->regs_ofs->vio_dbg1_offset;
|
||||
|
||||
vio_dbgs.vio_dbg0 = readl(vio_dbg0_reg);
|
||||
vio_dbgs.vio_dbg1 = readl(vio_dbg1_reg);
|
||||
@ -200,7 +203,7 @@ static irqreturn_t devapc_violation_irq(int irq_number, void *data)
|
||||
*/
|
||||
static void start_devapc(struct mtk_devapc_context *ctx)
|
||||
{
|
||||
writel(BIT(31), ctx->infra_base + ctx->data->apc_con_offset);
|
||||
writel(BIT(31), ctx->infra_base + ctx->data->regs_ofs->apc_con_offset);
|
||||
|
||||
mask_module_irq(ctx, false);
|
||||
}
|
||||
@ -212,11 +215,10 @@ static void stop_devapc(struct mtk_devapc_context *ctx)
|
||||
{
|
||||
mask_module_irq(ctx, true);
|
||||
|
||||
writel(BIT(2), ctx->infra_base + ctx->data->apc_con_offset);
|
||||
writel(BIT(2), ctx->infra_base + ctx->data->regs_ofs->apc_con_offset);
|
||||
}
|
||||
|
||||
static const struct mtk_devapc_data devapc_mt6779 = {
|
||||
.vio_idx_num = 511,
|
||||
static const struct mtk_devapc_regs_ofs devapc_regs_ofs_mt6779 = {
|
||||
.vio_mask_offset = 0x0,
|
||||
.vio_sta_offset = 0x400,
|
||||
.vio_dbg0_offset = 0x900,
|
||||
@ -227,10 +229,23 @@ static const struct mtk_devapc_data devapc_mt6779 = {
|
||||
.vio_shift_con_offset = 0xF20,
|
||||
};
|
||||
|
||||
static const struct mtk_devapc_data devapc_mt6779 = {
|
||||
.vio_idx_num = 511,
|
||||
.regs_ofs = &devapc_regs_ofs_mt6779,
|
||||
};
|
||||
|
||||
static const struct mtk_devapc_data devapc_mt8186 = {
|
||||
.vio_idx_num = 519,
|
||||
.regs_ofs = &devapc_regs_ofs_mt6779,
|
||||
};
|
||||
|
||||
static const struct of_device_id mtk_devapc_dt_match[] = {
|
||||
{
|
||||
.compatible = "mediatek,mt6779-devapc",
|
||||
.data = &devapc_mt6779,
|
||||
}, {
|
||||
.compatible = "mediatek,mt8186-devapc",
|
||||
.data = &devapc_mt8186,
|
||||
}, {
|
||||
},
|
||||
};
|
||||
|
@ -7,10 +7,12 @@
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/soc/mediatek/mtk-mmsys.h>
|
||||
#include <linux/soc/mediatek/mtk-mutex.h>
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
|
||||
#define MT2701_MUTEX0_MOD0 0x2c
|
||||
#define MT2701_MUTEX0_SOF0 0x30
|
||||
@ -80,6 +82,15 @@
|
||||
#define MT8183_MUTEX_MOD_DISP_GAMMA0 16
|
||||
#define MT8183_MUTEX_MOD_DISP_DITHER0 17
|
||||
|
||||
#define MT8183_MUTEX_MOD_MDP_RDMA0 2
|
||||
#define MT8183_MUTEX_MOD_MDP_RSZ0 4
|
||||
#define MT8183_MUTEX_MOD_MDP_RSZ1 5
|
||||
#define MT8183_MUTEX_MOD_MDP_TDSHP0 6
|
||||
#define MT8183_MUTEX_MOD_MDP_WROT0 7
|
||||
#define MT8183_MUTEX_MOD_MDP_WDMA 8
|
||||
#define MT8183_MUTEX_MOD_MDP_AAL0 23
|
||||
#define MT8183_MUTEX_MOD_MDP_CCORR0 24
|
||||
|
||||
#define MT8173_MUTEX_MOD_DISP_OVL0 11
|
||||
#define MT8173_MUTEX_MOD_DISP_OVL1 12
|
||||
#define MT8173_MUTEX_MOD_DISP_RDMA0 13
|
||||
@ -110,6 +121,20 @@
|
||||
#define MT8195_MUTEX_MOD_DISP_DP_INTF0 21
|
||||
#define MT8195_MUTEX_MOD_DISP_PWM0 27
|
||||
|
||||
#define MT8365_MUTEX_MOD_DISP_OVL0 7
|
||||
#define MT8365_MUTEX_MOD_DISP_OVL0_2L 8
|
||||
#define MT8365_MUTEX_MOD_DISP_RDMA0 9
|
||||
#define MT8365_MUTEX_MOD_DISP_RDMA1 10
|
||||
#define MT8365_MUTEX_MOD_DISP_WDMA0 11
|
||||
#define MT8365_MUTEX_MOD_DISP_COLOR0 12
|
||||
#define MT8365_MUTEX_MOD_DISP_CCORR 13
|
||||
#define MT8365_MUTEX_MOD_DISP_AAL 14
|
||||
#define MT8365_MUTEX_MOD_DISP_GAMMA 15
|
||||
#define MT8365_MUTEX_MOD_DISP_DITHER 16
|
||||
#define MT8365_MUTEX_MOD_DISP_DSI0 17
|
||||
#define MT8365_MUTEX_MOD_DISP_PWM0 20
|
||||
#define MT8365_MUTEX_MOD_DISP_DPI0 22
|
||||
|
||||
#define MT2712_MUTEX_MOD_DISP_PWM2 10
|
||||
#define MT2712_MUTEX_MOD_DISP_OVL0 11
|
||||
#define MT2712_MUTEX_MOD_DISP_OVL1 12
|
||||
@ -185,6 +210,7 @@ struct mtk_mutex_data {
|
||||
const unsigned int *mutex_sof;
|
||||
const unsigned int mutex_mod_reg;
|
||||
const unsigned int mutex_sof_reg;
|
||||
const unsigned int *mutex_table_mod;
|
||||
const bool no_clk;
|
||||
};
|
||||
|
||||
@ -194,6 +220,8 @@ struct mtk_mutex_ctx {
|
||||
void __iomem *regs;
|
||||
struct mtk_mutex mutex[10];
|
||||
const struct mtk_mutex_data *data;
|
||||
phys_addr_t addr;
|
||||
struct cmdq_client_reg cmdq_reg;
|
||||
};
|
||||
|
||||
static const unsigned int mt2701_mutex_mod[DDP_COMPONENT_ID_MAX] = {
|
||||
@ -272,6 +300,17 @@ static const unsigned int mt8183_mutex_mod[DDP_COMPONENT_ID_MAX] = {
|
||||
[DDP_COMPONENT_WDMA0] = MT8183_MUTEX_MOD_DISP_WDMA0,
|
||||
};
|
||||
|
||||
static const unsigned int mt8183_mutex_table_mod[MUTEX_MOD_IDX_MAX] = {
|
||||
[MUTEX_MOD_IDX_MDP_RDMA0] = MT8183_MUTEX_MOD_MDP_RDMA0,
|
||||
[MUTEX_MOD_IDX_MDP_RSZ0] = MT8183_MUTEX_MOD_MDP_RSZ0,
|
||||
[MUTEX_MOD_IDX_MDP_RSZ1] = MT8183_MUTEX_MOD_MDP_RSZ1,
|
||||
[MUTEX_MOD_IDX_MDP_TDSHP0] = MT8183_MUTEX_MOD_MDP_TDSHP0,
|
||||
[MUTEX_MOD_IDX_MDP_WROT0] = MT8183_MUTEX_MOD_MDP_WROT0,
|
||||
[MUTEX_MOD_IDX_MDP_WDMA] = MT8183_MUTEX_MOD_MDP_WDMA,
|
||||
[MUTEX_MOD_IDX_MDP_AAL0] = MT8183_MUTEX_MOD_MDP_AAL0,
|
||||
[MUTEX_MOD_IDX_MDP_CCORR0] = MT8183_MUTEX_MOD_MDP_CCORR0,
|
||||
};
|
||||
|
||||
static const unsigned int mt8186_mutex_mod[DDP_COMPONENT_ID_MAX] = {
|
||||
[DDP_COMPONENT_AAL0] = MT8186_MUTEX_MOD_DISP_AAL0,
|
||||
[DDP_COMPONENT_CCORR] = MT8186_MUTEX_MOD_DISP_CCORR0,
|
||||
@ -315,6 +354,22 @@ static const unsigned int mt8195_mutex_mod[DDP_COMPONENT_ID_MAX] = {
|
||||
[DDP_COMPONENT_DP_INTF0] = MT8195_MUTEX_MOD_DISP_DP_INTF0,
|
||||
};
|
||||
|
||||
static const unsigned int mt8365_mutex_mod[DDP_COMPONENT_ID_MAX] = {
|
||||
[DDP_COMPONENT_AAL0] = MT8365_MUTEX_MOD_DISP_AAL,
|
||||
[DDP_COMPONENT_CCORR] = MT8365_MUTEX_MOD_DISP_CCORR,
|
||||
[DDP_COMPONENT_COLOR0] = MT8365_MUTEX_MOD_DISP_COLOR0,
|
||||
[DDP_COMPONENT_DITHER0] = MT8365_MUTEX_MOD_DISP_DITHER,
|
||||
[DDP_COMPONENT_DPI0] = MT8365_MUTEX_MOD_DISP_DPI0,
|
||||
[DDP_COMPONENT_DSI0] = MT8365_MUTEX_MOD_DISP_DSI0,
|
||||
[DDP_COMPONENT_GAMMA] = MT8365_MUTEX_MOD_DISP_GAMMA,
|
||||
[DDP_COMPONENT_OVL0] = MT8365_MUTEX_MOD_DISP_OVL0,
|
||||
[DDP_COMPONENT_OVL_2L0] = MT8365_MUTEX_MOD_DISP_OVL0_2L,
|
||||
[DDP_COMPONENT_PWM0] = MT8365_MUTEX_MOD_DISP_PWM0,
|
||||
[DDP_COMPONENT_RDMA0] = MT8365_MUTEX_MOD_DISP_RDMA0,
|
||||
[DDP_COMPONENT_RDMA1] = MT8365_MUTEX_MOD_DISP_RDMA1,
|
||||
[DDP_COMPONENT_WDMA0] = MT8365_MUTEX_MOD_DISP_WDMA0,
|
||||
};
|
||||
|
||||
static const unsigned int mt2712_mutex_sof[DDP_MUTEX_SOF_MAX] = {
|
||||
[MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
|
||||
[MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0,
|
||||
@ -399,6 +454,7 @@ static const struct mtk_mutex_data mt8183_mutex_driver_data = {
|
||||
.mutex_sof = mt8183_mutex_sof,
|
||||
.mutex_mod_reg = MT8183_MUTEX0_MOD0,
|
||||
.mutex_sof_reg = MT8183_MUTEX0_SOF0,
|
||||
.mutex_table_mod = mt8183_mutex_table_mod,
|
||||
.no_clk = true,
|
||||
};
|
||||
|
||||
@ -423,6 +479,14 @@ static const struct mtk_mutex_data mt8195_mutex_driver_data = {
|
||||
.mutex_sof_reg = MT8183_MUTEX0_SOF0,
|
||||
};
|
||||
|
||||
static const struct mtk_mutex_data mt8365_mutex_driver_data = {
|
||||
.mutex_mod = mt8365_mutex_mod,
|
||||
.mutex_sof = mt8183_mutex_sof,
|
||||
.mutex_mod_reg = MT8183_MUTEX0_MOD0,
|
||||
.mutex_sof_reg = MT8183_MUTEX0_SOF0,
|
||||
.no_clk = true,
|
||||
};
|
||||
|
||||
struct mtk_mutex *mtk_mutex_get(struct device *dev)
|
||||
{
|
||||
struct mtk_mutex_ctx *mtx = dev_get_drvdata(dev);
|
||||
@ -572,6 +636,30 @@ void mtk_mutex_enable(struct mtk_mutex *mutex)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtk_mutex_enable);
|
||||
|
||||
int mtk_mutex_enable_by_cmdq(struct mtk_mutex *mutex, void *pkt)
|
||||
{
|
||||
struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
|
||||
mutex[mutex->id]);
|
||||
#if IS_REACHABLE(CONFIG_MTK_CMDQ)
|
||||
struct cmdq_pkt *cmdq_pkt = (struct cmdq_pkt *)pkt;
|
||||
|
||||
WARN_ON(&mtx->mutex[mutex->id] != mutex);
|
||||
|
||||
if (!mtx->cmdq_reg.size) {
|
||||
dev_err(mtx->dev, "mediatek,gce-client-reg hasn't been set");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
cmdq_pkt_write(cmdq_pkt, mtx->cmdq_reg.subsys,
|
||||
mtx->addr + DISP_REG_MUTEX_EN(mutex->id), 1);
|
||||
return 0;
|
||||
#else
|
||||
dev_err(mtx->dev, "Not support for enable MUTEX by CMDQ");
|
||||
return -ENODEV;
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtk_mutex_enable_by_cmdq);
|
||||
|
||||
void mtk_mutex_disable(struct mtk_mutex *mutex)
|
||||
{
|
||||
struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
|
||||
@ -606,12 +694,67 @@ void mtk_mutex_release(struct mtk_mutex *mutex)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtk_mutex_release);
|
||||
|
||||
int mtk_mutex_write_mod(struct mtk_mutex *mutex,
|
||||
enum mtk_mutex_mod_index idx, bool clear)
|
||||
{
|
||||
struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
|
||||
mutex[mutex->id]);
|
||||
unsigned int reg;
|
||||
unsigned int offset;
|
||||
|
||||
WARN_ON(&mtx->mutex[mutex->id] != mutex);
|
||||
|
||||
if (idx < MUTEX_MOD_IDX_MDP_RDMA0 ||
|
||||
idx >= MUTEX_MOD_IDX_MAX) {
|
||||
dev_err(mtx->dev, "Not supported MOD table index : %d", idx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
|
||||
mutex->id);
|
||||
reg = readl_relaxed(mtx->regs + offset);
|
||||
|
||||
if (clear)
|
||||
reg &= ~BIT(mtx->data->mutex_table_mod[idx]);
|
||||
else
|
||||
reg |= BIT(mtx->data->mutex_table_mod[idx]);
|
||||
|
||||
writel_relaxed(reg, mtx->regs + offset);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtk_mutex_write_mod);
|
||||
|
||||
int mtk_mutex_write_sof(struct mtk_mutex *mutex,
|
||||
enum mtk_mutex_sof_index idx)
|
||||
{
|
||||
struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
|
||||
mutex[mutex->id]);
|
||||
|
||||
WARN_ON(&mtx->mutex[mutex->id] != mutex);
|
||||
|
||||
if (idx < MUTEX_SOF_IDX_SINGLE_MODE ||
|
||||
idx >= MUTEX_SOF_IDX_MAX) {
|
||||
dev_err(mtx->dev, "Not supported SOF index : %d", idx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
writel_relaxed(idx, mtx->regs +
|
||||
DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id));
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtk_mutex_write_sof);
|
||||
|
||||
static int mtk_mutex_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct mtk_mutex_ctx *mtx;
|
||||
struct resource *regs;
|
||||
int i;
|
||||
#if IS_REACHABLE(CONFIG_MTK_CMDQ)
|
||||
int ret;
|
||||
#endif
|
||||
|
||||
mtx = devm_kzalloc(dev, sizeof(*mtx), GFP_KERNEL);
|
||||
if (!mtx)
|
||||
@ -631,12 +774,18 @@ static int mtk_mutex_probe(struct platform_device *pdev)
|
||||
}
|
||||
}
|
||||
|
||||
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
mtx->regs = devm_ioremap_resource(dev, regs);
|
||||
mtx->regs = devm_platform_get_and_ioremap_resource(pdev, 0, ®s);
|
||||
if (IS_ERR(mtx->regs)) {
|
||||
dev_err(dev, "Failed to map mutex registers\n");
|
||||
return PTR_ERR(mtx->regs);
|
||||
}
|
||||
mtx->addr = regs->start;
|
||||
|
||||
#if IS_REACHABLE(CONFIG_MTK_CMDQ)
|
||||
ret = cmdq_dev_get_client_reg(dev, &mtx->cmdq_reg, 0);
|
||||
if (ret)
|
||||
dev_dbg(dev, "No mediatek,gce-client-reg!\n");
|
||||
#endif
|
||||
|
||||
platform_set_drvdata(pdev, mtx);
|
||||
|
||||
@ -665,6 +814,8 @@ static const struct of_device_id mutex_driver_dt_match[] = {
|
||||
.data = &mt8192_mutex_driver_data},
|
||||
{ .compatible = "mediatek,mt8195-disp-mutex",
|
||||
.data = &mt8195_mutex_driver_data},
|
||||
{ .compatible = "mediatek,mt8365-disp-mutex",
|
||||
.data = &mt8365_mutex_driver_data},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, mutex_driver_dt_match);
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/soc/mediatek/infracfg.h>
|
||||
|
||||
#include "mt6795-pm-domains.h"
|
||||
#include "mt8167-pm-domains.h"
|
||||
#include "mt8173-pm-domains.h"
|
||||
#include "mt8183-pm-domains.h"
|
||||
@ -428,6 +429,9 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
|
||||
dev_err(scpsys->dev, "%pOF: failed to power on domain: %d\n", node, ret);
|
||||
goto err_put_subsys_clocks;
|
||||
}
|
||||
|
||||
if (MTK_SCPD_CAPS(pd, MTK_SCPD_ALWAYS_ON))
|
||||
pd->genpd.flags |= GENPD_FLAG_ALWAYS_ON;
|
||||
}
|
||||
|
||||
if (scpsys->domains[id]) {
|
||||
@ -555,6 +559,10 @@ static void scpsys_domain_cleanup(struct scpsys *scpsys)
|
||||
}
|
||||
|
||||
static const struct of_device_id scpsys_of_match[] = {
|
||||
{
|
||||
.compatible = "mediatek,mt6795-power-controller",
|
||||
.data = &mt6795_scpsys_data,
|
||||
},
|
||||
{
|
||||
.compatible = "mediatek,mt8167-power-controller",
|
||||
.data = &mt8167_scpsys_data,
|
||||
|
@ -8,6 +8,8 @@
|
||||
#define MTK_SCPD_SRAM_ISO BIT(2)
|
||||
#define MTK_SCPD_KEEP_DEFAULT_OFF BIT(3)
|
||||
#define MTK_SCPD_DOMAIN_SUPPLY BIT(4)
|
||||
/* can't set MTK_SCPD_KEEP_DEFAULT_OFF at the same time */
|
||||
#define MTK_SCPD_ALWAYS_ON BIT(5)
|
||||
#define MTK_SCPD_CAPS(_scpd, _x) ((_scpd)->data->caps & (_x))
|
||||
|
||||
#define SPM_VDE_PWR_CON 0x0210
|
||||
|
@ -13,6 +13,9 @@
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/reset.h>
|
||||
|
||||
#define PWRAP_POLL_DELAY_US 10
|
||||
#define PWRAP_POLL_TIMEOUT_US 10000
|
||||
|
||||
#define PWRAP_MT8135_BRIDGE_IORD_ARB_EN 0x4
|
||||
#define PWRAP_MT8135_BRIDGE_WACS3_EN 0x10
|
||||
#define PWRAP_MT8135_BRIDGE_INIT_DONE3 0x14
|
||||
@ -1140,12 +1143,9 @@ enum pwrap_type {
|
||||
};
|
||||
|
||||
struct pmic_wrapper;
|
||||
struct pwrap_slv_type {
|
||||
const u32 *dew_regs;
|
||||
enum pmic_type type;
|
||||
|
||||
struct pwrap_slv_regops {
|
||||
const struct regmap_config *regmap;
|
||||
/* Flags indicating the capability for the target slave */
|
||||
u32 caps;
|
||||
/*
|
||||
* pwrap operations are highly associated with the PMIC types,
|
||||
* so the pointers added increases flexibility allowing determination
|
||||
@ -1155,6 +1155,14 @@ struct pwrap_slv_type {
|
||||
int (*pwrap_write)(struct pmic_wrapper *wrp, u32 adr, u32 wdata);
|
||||
};
|
||||
|
||||
struct pwrap_slv_type {
|
||||
const u32 *dew_regs;
|
||||
enum pmic_type type;
|
||||
const struct pwrap_slv_regops *regops;
|
||||
/* Flags indicating the capability for the target slave */
|
||||
u32 caps;
|
||||
};
|
||||
|
||||
struct pmic_wrapper {
|
||||
struct device *dev;
|
||||
void __iomem *base;
|
||||
@ -1241,27 +1249,14 @@ static bool pwrap_is_fsm_idle_and_sync_idle(struct pmic_wrapper *wrp)
|
||||
(val & PWRAP_STATE_SYNC_IDLE0);
|
||||
}
|
||||
|
||||
static int pwrap_wait_for_state(struct pmic_wrapper *wrp,
|
||||
bool (*fp)(struct pmic_wrapper *))
|
||||
{
|
||||
unsigned long timeout;
|
||||
|
||||
timeout = jiffies + usecs_to_jiffies(10000);
|
||||
|
||||
do {
|
||||
if (time_after(jiffies, timeout))
|
||||
return fp(wrp) ? 0 : -ETIMEDOUT;
|
||||
if (fp(wrp))
|
||||
return 0;
|
||||
} while (1);
|
||||
}
|
||||
|
||||
static int pwrap_read16(struct pmic_wrapper *wrp, u32 adr, u32 *rdata)
|
||||
{
|
||||
bool tmp;
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle);
|
||||
ret = readx_poll_timeout(pwrap_is_fsm_idle, wrp, tmp, tmp,
|
||||
PWRAP_POLL_DELAY_US, PWRAP_POLL_TIMEOUT_US);
|
||||
if (ret) {
|
||||
pwrap_leave_fsm_vldclr(wrp);
|
||||
return ret;
|
||||
@ -1273,7 +1268,8 @@ static int pwrap_read16(struct pmic_wrapper *wrp, u32 adr, u32 *rdata)
|
||||
val = (adr >> 1) << 16;
|
||||
pwrap_writel(wrp, val, PWRAP_WACS2_CMD);
|
||||
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_vldclr);
|
||||
ret = readx_poll_timeout(pwrap_is_fsm_vldclr, wrp, tmp, tmp,
|
||||
PWRAP_POLL_DELAY_US, PWRAP_POLL_TIMEOUT_US);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -1290,11 +1286,14 @@ static int pwrap_read16(struct pmic_wrapper *wrp, u32 adr, u32 *rdata)
|
||||
|
||||
static int pwrap_read32(struct pmic_wrapper *wrp, u32 adr, u32 *rdata)
|
||||
{
|
||||
bool tmp;
|
||||
int ret, msb;
|
||||
|
||||
*rdata = 0;
|
||||
for (msb = 0; msb < 2; msb++) {
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle);
|
||||
ret = readx_poll_timeout(pwrap_is_fsm_idle, wrp, tmp, tmp,
|
||||
PWRAP_POLL_DELAY_US, PWRAP_POLL_TIMEOUT_US);
|
||||
|
||||
if (ret) {
|
||||
pwrap_leave_fsm_vldclr(wrp);
|
||||
return ret;
|
||||
@ -1303,7 +1302,8 @@ static int pwrap_read32(struct pmic_wrapper *wrp, u32 adr, u32 *rdata)
|
||||
pwrap_writel(wrp, ((msb << 30) | (adr << 16)),
|
||||
PWRAP_WACS2_CMD);
|
||||
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_vldclr);
|
||||
ret = readx_poll_timeout(pwrap_is_fsm_vldclr, wrp, tmp, tmp,
|
||||
PWRAP_POLL_DELAY_US, PWRAP_POLL_TIMEOUT_US);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -1318,14 +1318,16 @@ static int pwrap_read32(struct pmic_wrapper *wrp, u32 adr, u32 *rdata)
|
||||
|
||||
static int pwrap_read(struct pmic_wrapper *wrp, u32 adr, u32 *rdata)
|
||||
{
|
||||
return wrp->slave->pwrap_read(wrp, adr, rdata);
|
||||
return wrp->slave->regops->pwrap_read(wrp, adr, rdata);
|
||||
}
|
||||
|
||||
static int pwrap_write16(struct pmic_wrapper *wrp, u32 adr, u32 wdata)
|
||||
{
|
||||
bool tmp;
|
||||
int ret;
|
||||
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle);
|
||||
ret = readx_poll_timeout(pwrap_is_fsm_idle, wrp, tmp, tmp,
|
||||
PWRAP_POLL_DELAY_US, PWRAP_POLL_TIMEOUT_US);
|
||||
if (ret) {
|
||||
pwrap_leave_fsm_vldclr(wrp);
|
||||
return ret;
|
||||
@ -1344,10 +1346,12 @@ static int pwrap_write16(struct pmic_wrapper *wrp, u32 adr, u32 wdata)
|
||||
|
||||
static int pwrap_write32(struct pmic_wrapper *wrp, u32 adr, u32 wdata)
|
||||
{
|
||||
bool tmp;
|
||||
int ret, msb, rdata;
|
||||
|
||||
for (msb = 0; msb < 2; msb++) {
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle);
|
||||
ret = readx_poll_timeout(pwrap_is_fsm_idle, wrp, tmp, tmp,
|
||||
PWRAP_POLL_DELAY_US, PWRAP_POLL_TIMEOUT_US);
|
||||
if (ret) {
|
||||
pwrap_leave_fsm_vldclr(wrp);
|
||||
return ret;
|
||||
@ -1373,7 +1377,7 @@ static int pwrap_write32(struct pmic_wrapper *wrp, u32 adr, u32 wdata)
|
||||
|
||||
static int pwrap_write(struct pmic_wrapper *wrp, u32 adr, u32 wdata)
|
||||
{
|
||||
return wrp->slave->pwrap_write(wrp, adr, wdata);
|
||||
return wrp->slave->regops->pwrap_write(wrp, adr, wdata);
|
||||
}
|
||||
|
||||
static int pwrap_regmap_read(void *context, u32 adr, u32 *rdata)
|
||||
@ -1388,6 +1392,7 @@ static int pwrap_regmap_write(void *context, u32 adr, u32 wdata)
|
||||
|
||||
static int pwrap_reset_spislave(struct pmic_wrapper *wrp)
|
||||
{
|
||||
bool tmp;
|
||||
int ret, i;
|
||||
|
||||
pwrap_writel(wrp, 0, PWRAP_HIPRIO_ARB_EN);
|
||||
@ -1407,7 +1412,8 @@ static int pwrap_reset_spislave(struct pmic_wrapper *wrp)
|
||||
pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_OUTS,
|
||||
PWRAP_MAN_CMD);
|
||||
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_sync_idle);
|
||||
ret = readx_poll_timeout(pwrap_is_sync_idle, wrp, tmp, tmp,
|
||||
PWRAP_POLL_DELAY_US, PWRAP_POLL_TIMEOUT_US);
|
||||
if (ret) {
|
||||
dev_err(wrp->dev, "%s fail, ret=%d\n", __func__, ret);
|
||||
return ret;
|
||||
@ -1458,14 +1464,15 @@ static int pwrap_init_sidly(struct pmic_wrapper *wrp)
|
||||
static int pwrap_init_dual_io(struct pmic_wrapper *wrp)
|
||||
{
|
||||
int ret;
|
||||
bool tmp;
|
||||
u32 rdata;
|
||||
|
||||
/* Enable dual IO mode */
|
||||
pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_DIO_EN], 1);
|
||||
|
||||
/* Check IDLE & INIT_DONE in advance */
|
||||
ret = pwrap_wait_for_state(wrp,
|
||||
pwrap_is_fsm_idle_and_sync_idle);
|
||||
ret = readx_poll_timeout(pwrap_is_fsm_idle_and_sync_idle, wrp, tmp, tmp,
|
||||
PWRAP_POLL_DELAY_US, PWRAP_POLL_TIMEOUT_US);
|
||||
if (ret) {
|
||||
dev_err(wrp->dev, "%s fail, ret=%d\n", __func__, ret);
|
||||
return ret;
|
||||
@ -1570,6 +1577,7 @@ static bool pwrap_is_pmic_cipher_ready(struct pmic_wrapper *wrp)
|
||||
static int pwrap_init_cipher(struct pmic_wrapper *wrp)
|
||||
{
|
||||
int ret;
|
||||
bool tmp;
|
||||
u32 rdata = 0;
|
||||
|
||||
pwrap_writel(wrp, 0x1, PWRAP_CIPHER_SWRST);
|
||||
@ -1624,14 +1632,16 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp)
|
||||
}
|
||||
|
||||
/* wait for cipher data ready@AP */
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_cipher_ready);
|
||||
ret = readx_poll_timeout(pwrap_is_cipher_ready, wrp, tmp, tmp,
|
||||
PWRAP_POLL_DELAY_US, PWRAP_POLL_TIMEOUT_US);
|
||||
if (ret) {
|
||||
dev_err(wrp->dev, "cipher data ready@AP fail, ret=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* wait for cipher data ready@PMIC */
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_pmic_cipher_ready);
|
||||
ret = readx_poll_timeout(pwrap_is_pmic_cipher_ready, wrp, tmp, tmp,
|
||||
PWRAP_POLL_DELAY_US, PWRAP_POLL_TIMEOUT_US);
|
||||
if (ret) {
|
||||
dev_err(wrp->dev,
|
||||
"timeout waiting for cipher data ready@PMIC\n");
|
||||
@ -1640,7 +1650,8 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp)
|
||||
|
||||
/* wait for cipher mode idle */
|
||||
pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_MODE], 0x1);
|
||||
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle_and_sync_idle);
|
||||
ret = readx_poll_timeout(pwrap_is_fsm_idle_and_sync_idle, wrp, tmp, tmp,
|
||||
PWRAP_POLL_DELAY_US, PWRAP_POLL_TIMEOUT_US);
|
||||
if (ret) {
|
||||
dev_err(wrp->dev, "cipher mode idle fail, ret=%d\n", ret);
|
||||
return ret;
|
||||
@ -1885,99 +1896,82 @@ static const struct regmap_config pwrap_regmap_config32 = {
|
||||
.max_register = 0xffff,
|
||||
};
|
||||
|
||||
static const struct pwrap_slv_regops pwrap_regops16 = {
|
||||
.pwrap_read = pwrap_read16,
|
||||
.pwrap_write = pwrap_write16,
|
||||
.regmap = &pwrap_regmap_config16,
|
||||
};
|
||||
|
||||
static const struct pwrap_slv_regops pwrap_regops32 = {
|
||||
.pwrap_read = pwrap_read32,
|
||||
.pwrap_write = pwrap_write32,
|
||||
.regmap = &pwrap_regmap_config32,
|
||||
};
|
||||
|
||||
static const struct pwrap_slv_type pmic_mt6323 = {
|
||||
.dew_regs = mt6323_regs,
|
||||
.type = PMIC_MT6323,
|
||||
.regmap = &pwrap_regmap_config16,
|
||||
.regops = &pwrap_regops16,
|
||||
.caps = PWRAP_SLV_CAP_SPI | PWRAP_SLV_CAP_DUALIO |
|
||||
PWRAP_SLV_CAP_SECURITY,
|
||||
.pwrap_read = pwrap_read16,
|
||||
.pwrap_write = pwrap_write16,
|
||||
};
|
||||
|
||||
static const struct pwrap_slv_type pmic_mt6351 = {
|
||||
.dew_regs = mt6351_regs,
|
||||
.type = PMIC_MT6351,
|
||||
.regmap = &pwrap_regmap_config16,
|
||||
.regops = &pwrap_regops16,
|
||||
.caps = 0,
|
||||
.pwrap_read = pwrap_read16,
|
||||
.pwrap_write = pwrap_write16,
|
||||
};
|
||||
|
||||
static const struct pwrap_slv_type pmic_mt6357 = {
|
||||
.dew_regs = mt6357_regs,
|
||||
.type = PMIC_MT6357,
|
||||
.regmap = &pwrap_regmap_config16,
|
||||
.regops = &pwrap_regops16,
|
||||
.caps = 0,
|
||||
.pwrap_read = pwrap_read16,
|
||||
.pwrap_write = pwrap_write16,
|
||||
};
|
||||
|
||||
static const struct pwrap_slv_type pmic_mt6358 = {
|
||||
.dew_regs = mt6358_regs,
|
||||
.type = PMIC_MT6358,
|
||||
.regmap = &pwrap_regmap_config16,
|
||||
.regops = &pwrap_regops16,
|
||||
.caps = PWRAP_SLV_CAP_SPI | PWRAP_SLV_CAP_DUALIO,
|
||||
.pwrap_read = pwrap_read16,
|
||||
.pwrap_write = pwrap_write16,
|
||||
};
|
||||
|
||||
static const struct pwrap_slv_type pmic_mt6359 = {
|
||||
.dew_regs = mt6359_regs,
|
||||
.type = PMIC_MT6359,
|
||||
.regmap = &pwrap_regmap_config16,
|
||||
.regops = &pwrap_regops16,
|
||||
.caps = PWRAP_SLV_CAP_DUALIO,
|
||||
.pwrap_read = pwrap_read16,
|
||||
.pwrap_write = pwrap_write16,
|
||||
};
|
||||
|
||||
static const struct pwrap_slv_type pmic_mt6380 = {
|
||||
.dew_regs = NULL,
|
||||
.type = PMIC_MT6380,
|
||||
.regmap = &pwrap_regmap_config32,
|
||||
.regops = &pwrap_regops32,
|
||||
.caps = 0,
|
||||
.pwrap_read = pwrap_read32,
|
||||
.pwrap_write = pwrap_write32,
|
||||
};
|
||||
|
||||
static const struct pwrap_slv_type pmic_mt6397 = {
|
||||
.dew_regs = mt6397_regs,
|
||||
.type = PMIC_MT6397,
|
||||
.regmap = &pwrap_regmap_config16,
|
||||
.regops = &pwrap_regops16,
|
||||
.caps = PWRAP_SLV_CAP_SPI | PWRAP_SLV_CAP_DUALIO |
|
||||
PWRAP_SLV_CAP_SECURITY,
|
||||
.pwrap_read = pwrap_read16,
|
||||
.pwrap_write = pwrap_write16,
|
||||
};
|
||||
|
||||
static const struct of_device_id of_slave_match_tbl[] = {
|
||||
{
|
||||
.compatible = "mediatek,mt6323",
|
||||
.data = &pmic_mt6323,
|
||||
}, {
|
||||
.compatible = "mediatek,mt6351",
|
||||
.data = &pmic_mt6351,
|
||||
}, {
|
||||
.compatible = "mediatek,mt6357",
|
||||
.data = &pmic_mt6357,
|
||||
}, {
|
||||
.compatible = "mediatek,mt6358",
|
||||
.data = &pmic_mt6358,
|
||||
}, {
|
||||
.compatible = "mediatek,mt6359",
|
||||
.data = &pmic_mt6359,
|
||||
}, {
|
||||
/* The MT6380 PMIC only implements a regulator, so we bind it
|
||||
* directly instead of using a MFD.
|
||||
*/
|
||||
.compatible = "mediatek,mt6380-regulator",
|
||||
.data = &pmic_mt6380,
|
||||
}, {
|
||||
.compatible = "mediatek,mt6397",
|
||||
.data = &pmic_mt6397,
|
||||
}, {
|
||||
/* sentinel */
|
||||
}
|
||||
{ .compatible = "mediatek,mt6323", .data = &pmic_mt6323 },
|
||||
{ .compatible = "mediatek,mt6351", .data = &pmic_mt6351 },
|
||||
{ .compatible = "mediatek,mt6357", .data = &pmic_mt6357 },
|
||||
{ .compatible = "mediatek,mt6358", .data = &pmic_mt6358 },
|
||||
{ .compatible = "mediatek,mt6359", .data = &pmic_mt6359 },
|
||||
|
||||
/* The MT6380 PMIC only implements a regulator, so we bind it
|
||||
* directly instead of using a MFD.
|
||||
*/
|
||||
{ .compatible = "mediatek,mt6380-regulator", .data = &pmic_mt6380 },
|
||||
{ .compatible = "mediatek,mt6397", .data = &pmic_mt6397 },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_slave_match_tbl);
|
||||
|
||||
@ -2136,45 +2130,19 @@ static struct pmic_wrapper_type pwrap_mt8186 = {
|
||||
};
|
||||
|
||||
static const struct of_device_id of_pwrap_match_tbl[] = {
|
||||
{
|
||||
.compatible = "mediatek,mt2701-pwrap",
|
||||
.data = &pwrap_mt2701,
|
||||
}, {
|
||||
.compatible = "mediatek,mt6765-pwrap",
|
||||
.data = &pwrap_mt6765,
|
||||
}, {
|
||||
.compatible = "mediatek,mt6779-pwrap",
|
||||
.data = &pwrap_mt6779,
|
||||
}, {
|
||||
.compatible = "mediatek,mt6797-pwrap",
|
||||
.data = &pwrap_mt6797,
|
||||
}, {
|
||||
.compatible = "mediatek,mt6873-pwrap",
|
||||
.data = &pwrap_mt6873,
|
||||
}, {
|
||||
.compatible = "mediatek,mt7622-pwrap",
|
||||
.data = &pwrap_mt7622,
|
||||
}, {
|
||||
.compatible = "mediatek,mt8135-pwrap",
|
||||
.data = &pwrap_mt8135,
|
||||
}, {
|
||||
.compatible = "mediatek,mt8173-pwrap",
|
||||
.data = &pwrap_mt8173,
|
||||
}, {
|
||||
.compatible = "mediatek,mt8183-pwrap",
|
||||
.data = &pwrap_mt8183,
|
||||
}, {
|
||||
.compatible = "mediatek,mt8186-pwrap",
|
||||
.data = &pwrap_mt8186,
|
||||
}, {
|
||||
.compatible = "mediatek,mt8195-pwrap",
|
||||
.data = &pwrap_mt8195,
|
||||
}, {
|
||||
.compatible = "mediatek,mt8516-pwrap",
|
||||
.data = &pwrap_mt8516,
|
||||
}, {
|
||||
/* sentinel */
|
||||
}
|
||||
{ .compatible = "mediatek,mt2701-pwrap", .data = &pwrap_mt2701 },
|
||||
{ .compatible = "mediatek,mt6765-pwrap", .data = &pwrap_mt6765 },
|
||||
{ .compatible = "mediatek,mt6779-pwrap", .data = &pwrap_mt6779 },
|
||||
{ .compatible = "mediatek,mt6797-pwrap", .data = &pwrap_mt6797 },
|
||||
{ .compatible = "mediatek,mt6873-pwrap", .data = &pwrap_mt6873 },
|
||||
{ .compatible = "mediatek,mt7622-pwrap", .data = &pwrap_mt7622 },
|
||||
{ .compatible = "mediatek,mt8135-pwrap", .data = &pwrap_mt8135 },
|
||||
{ .compatible = "mediatek,mt8173-pwrap", .data = &pwrap_mt8173 },
|
||||
{ .compatible = "mediatek,mt8183-pwrap", .data = &pwrap_mt8183 },
|
||||
{ .compatible = "mediatek,mt8186-pwrap", .data = &pwrap_mt8186 },
|
||||
{ .compatible = "mediatek,mt8195-pwrap", .data = &pwrap_mt8195 },
|
||||
{ .compatible = "mediatek,mt8516-pwrap", .data = &pwrap_mt8516 },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_pwrap_match_tbl);
|
||||
|
||||
@ -2185,7 +2153,6 @@ static int pwrap_probe(struct platform_device *pdev)
|
||||
struct pmic_wrapper *wrp;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const struct of_device_id *of_slave_id = NULL;
|
||||
struct resource *res;
|
||||
|
||||
if (np->child)
|
||||
of_slave_id = of_match_node(of_slave_match_tbl, np->child);
|
||||
@ -2205,8 +2172,7 @@ static int pwrap_probe(struct platform_device *pdev)
|
||||
wrp->slave = of_slave_id->data;
|
||||
wrp->dev = &pdev->dev;
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pwrap");
|
||||
wrp->base = devm_ioremap_resource(wrp->dev, res);
|
||||
wrp->base = devm_platform_ioremap_resource_byname(pdev, "pwrap");
|
||||
if (IS_ERR(wrp->base))
|
||||
return PTR_ERR(wrp->base);
|
||||
|
||||
@ -2220,9 +2186,7 @@ static int pwrap_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
if (HAS_CAP(wrp->master->caps, PWRAP_CAP_BRIDGE)) {
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
||||
"pwrap-bridge");
|
||||
wrp->bridge_base = devm_ioremap_resource(wrp->dev, res);
|
||||
wrp->bridge_base = devm_platform_ioremap_resource_byname(pdev, "pwrap-bridge");
|
||||
if (IS_ERR(wrp->bridge_base))
|
||||
return PTR_ERR(wrp->bridge_base);
|
||||
|
||||
@ -2315,13 +2279,18 @@ static int pwrap_probe(struct platform_device *pdev)
|
||||
pwrap_writel(wrp, wrp->master->int1_en_all, PWRAP_INT1_EN);
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0) {
|
||||
ret = irq;
|
||||
goto err_out2;
|
||||
}
|
||||
|
||||
ret = devm_request_irq(wrp->dev, irq, pwrap_interrupt,
|
||||
IRQF_TRIGGER_HIGH,
|
||||
"mt-pmic-pwrap", wrp);
|
||||
if (ret)
|
||||
goto err_out2;
|
||||
|
||||
wrp->regmap = devm_regmap_init(wrp->dev, NULL, wrp, wrp->slave->regmap);
|
||||
wrp->regmap = devm_regmap_init(wrp->dev, NULL, wrp, wrp->slave->regops->regmap);
|
||||
if (IS_ERR(wrp->regmap)) {
|
||||
ret = PTR_ERR(wrp->regmap);
|
||||
goto err_out2;
|
||||
|
2403
drivers/soc/mediatek/mtk-svs.c
Normal file
2403
drivers/soc/mediatek/mtk-svs.c
Normal file
File diff suppressed because it is too large
Load Diff
16
include/dt-bindings/power/mt6795-power.h
Normal file
16
include/dt-bindings/power/mt6795-power.h
Normal file
@ -0,0 +1,16 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
#ifndef _DT_BINDINGS_POWER_MT6795_POWER_H
|
||||
#define _DT_BINDINGS_POWER_MT6795_POWER_H
|
||||
|
||||
#define MT6795_POWER_DOMAIN_MM 0
|
||||
#define MT6795_POWER_DOMAIN_VDEC 1
|
||||
#define MT6795_POWER_DOMAIN_VENC 2
|
||||
#define MT6795_POWER_DOMAIN_ISP 3
|
||||
#define MT6795_POWER_DOMAIN_MJC 4
|
||||
#define MT6795_POWER_DOMAIN_AUDIO 5
|
||||
#define MT6795_POWER_DOMAIN_MFG_ASYNC 6
|
||||
#define MT6795_POWER_DOMAIN_MFG_2D 7
|
||||
#define MT6795_POWER_DOMAIN_MFG 8
|
||||
#define MT6795_POWER_DOMAIN_MODEM 9
|
||||
|
||||
#endif /* _DT_BINDINGS_POWER_MT6795_POWER_H */
|
@ -10,11 +10,33 @@ struct regmap;
|
||||
struct device;
|
||||
struct mtk_mutex;
|
||||
|
||||
enum mtk_mutex_mod_index {
|
||||
/* MDP table index */
|
||||
MUTEX_MOD_IDX_MDP_RDMA0,
|
||||
MUTEX_MOD_IDX_MDP_RSZ0,
|
||||
MUTEX_MOD_IDX_MDP_RSZ1,
|
||||
MUTEX_MOD_IDX_MDP_TDSHP0,
|
||||
MUTEX_MOD_IDX_MDP_WROT0,
|
||||
MUTEX_MOD_IDX_MDP_WDMA,
|
||||
MUTEX_MOD_IDX_MDP_AAL0,
|
||||
MUTEX_MOD_IDX_MDP_CCORR0,
|
||||
|
||||
MUTEX_MOD_IDX_MAX /* ALWAYS keep at the end */
|
||||
};
|
||||
|
||||
enum mtk_mutex_sof_index {
|
||||
MUTEX_SOF_IDX_SINGLE_MODE,
|
||||
|
||||
MUTEX_SOF_IDX_MAX /* ALWAYS keep at the end */
|
||||
};
|
||||
|
||||
struct mtk_mutex *mtk_mutex_get(struct device *dev);
|
||||
int mtk_mutex_prepare(struct mtk_mutex *mutex);
|
||||
void mtk_mutex_add_comp(struct mtk_mutex *mutex,
|
||||
enum mtk_ddp_comp_id id);
|
||||
void mtk_mutex_enable(struct mtk_mutex *mutex);
|
||||
int mtk_mutex_enable_by_cmdq(struct mtk_mutex *mutex,
|
||||
void *pkt);
|
||||
void mtk_mutex_disable(struct mtk_mutex *mutex);
|
||||
void mtk_mutex_remove_comp(struct mtk_mutex *mutex,
|
||||
enum mtk_ddp_comp_id id);
|
||||
@ -22,5 +44,10 @@ void mtk_mutex_unprepare(struct mtk_mutex *mutex);
|
||||
void mtk_mutex_put(struct mtk_mutex *mutex);
|
||||
void mtk_mutex_acquire(struct mtk_mutex *mutex);
|
||||
void mtk_mutex_release(struct mtk_mutex *mutex);
|
||||
int mtk_mutex_write_mod(struct mtk_mutex *mutex,
|
||||
enum mtk_mutex_mod_index idx,
|
||||
bool clear);
|
||||
int mtk_mutex_write_sof(struct mtk_mutex *mutex,
|
||||
enum mtk_mutex_sof_index idx);
|
||||
|
||||
#endif /* MTK_MUTEX_H */
|
||||
|
Loading…
Reference in New Issue
Block a user