forked from Minki/linux
clk: mediatek: Add MT6779 clock support
Add MT6779 clock support, include topckgen, apmixedsys, infracfg, and subsystem clocks. Signed-off-by: mtk01761 <wendell.lin@mediatek.com> Link: https://lkml.kernel.org/r/1566206502-4347-11-git-send-email-mars.cheng@mediatek.com Signed-off-by: Stephen Boyd <sboyd@kernel.org>
This commit is contained in:
parent
85b18fe704
commit
710774e048
@ -117,6 +117,62 @@ config COMMON_CLK_MT2712_VENCSYS
|
||||
---help---
|
||||
This driver supports MediaTek MT2712 vencsys clocks.
|
||||
|
||||
config COMMON_CLK_MT6779
|
||||
bool "Clock driver for MediaTek MT6779"
|
||||
depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
|
||||
select COMMON_CLK_MEDIATEK
|
||||
default ARCH_MEDIATEK && ARM64
|
||||
help
|
||||
This driver supports MediaTek MT6779 basic clocks.
|
||||
|
||||
config COMMON_CLK_MT6779_MMSYS
|
||||
bool "Clock driver for MediaTek MT6779 mmsys"
|
||||
depends on COMMON_CLK_MT6779
|
||||
help
|
||||
This driver supports MediaTek MT6779 mmsys clocks.
|
||||
|
||||
config COMMON_CLK_MT6779_IMGSYS
|
||||
bool "Clock driver for MediaTek MT6779 imgsys"
|
||||
depends on COMMON_CLK_MT6779
|
||||
help
|
||||
This driver supports MediaTek MT6779 imgsys clocks.
|
||||
|
||||
config COMMON_CLK_MT6779_IPESYS
|
||||
bool "Clock driver for MediaTek MT6779 ipesys"
|
||||
depends on COMMON_CLK_MT6779
|
||||
help
|
||||
This driver supports MediaTek MT6779 ipesys clocks.
|
||||
|
||||
config COMMON_CLK_MT6779_CAMSYS
|
||||
bool "Clock driver for MediaTek MT6779 camsys"
|
||||
depends on COMMON_CLK_MT6779
|
||||
help
|
||||
This driver supports MediaTek MT6779 camsys clocks.
|
||||
|
||||
config COMMON_CLK_MT6779_VDECSYS
|
||||
bool "Clock driver for MediaTek MT6779 vdecsys"
|
||||
depends on COMMON_CLK_MT6779
|
||||
help
|
||||
This driver supports MediaTek MT6779 vdecsys clocks.
|
||||
|
||||
config COMMON_CLK_MT6779_VENCSYS
|
||||
bool "Clock driver for MediaTek MT6779 vencsys"
|
||||
depends on COMMON_CLK_MT6779
|
||||
help
|
||||
This driver supports MediaTek MT6779 vencsys clocks.
|
||||
|
||||
config COMMON_CLK_MT6779_MFGCFG
|
||||
bool "Clock driver for MediaTek MT6779 mfgcfg"
|
||||
depends on COMMON_CLK_MT6779
|
||||
help
|
||||
This driver supports MediaTek MT6779 mfgcfg clocks.
|
||||
|
||||
config COMMON_CLK_MT6779_AUDSYS
|
||||
bool "Clock driver for Mediatek MT6779 audsys"
|
||||
depends on COMMON_CLK_MT6779
|
||||
help
|
||||
This driver supports Mediatek MT6779 audsys clocks.
|
||||
|
||||
config COMMON_CLK_MT6797
|
||||
bool "Clock driver for MediaTek MT6797"
|
||||
depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
|
||||
|
@ -1,6 +1,15 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
obj-$(CONFIG_COMMON_CLK_MEDIATEK) += clk-mtk.o clk-pll.o clk-gate.o clk-apmixed.o clk-cpumux.o reset.o clk-mux.o
|
||||
|
||||
obj-$(CONFIG_COMMON_CLK_MT6779) += clk-mt6779.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT6779_MMSYS) += clk-mt6779-mm.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT6779_IMGSYS) += clk-mt6779-img.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT6779_IPESYS) += clk-mt6779-ipe.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT6779_CAMSYS) += clk-mt6779-cam.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT6779_VDECSYS) += clk-mt6779-vdec.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT6779_VENCSYS) += clk-mt6779-venc.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT6779_MFGCFG) += clk-mt6779-mfg.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT6779_AUDSYS) += clk-mt6779-aud.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT6797) += clk-mt6797.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT6797_IMGSYS) += clk-mt6797-img.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT6797_MMSYS) += clk-mt6797-mm.o
|
||||
|
117
drivers/clk/mediatek/clk-mt6779-aud.c
Normal file
117
drivers/clk/mediatek/clk-mt6779-aud.c
Normal file
@ -0,0 +1,117 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2019 MediaTek Inc.
|
||||
* Author: Wendell Lin <wendell.lin@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
|
||||
#include <dt-bindings/clock/mt6779-clk.h>
|
||||
|
||||
static const struct mtk_gate_regs audio0_cg_regs = {
|
||||
.set_ofs = 0x0,
|
||||
.clr_ofs = 0x0,
|
||||
.sta_ofs = 0x0,
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs audio1_cg_regs = {
|
||||
.set_ofs = 0x4,
|
||||
.clr_ofs = 0x4,
|
||||
.sta_ofs = 0x4,
|
||||
};
|
||||
|
||||
#define GATE_AUDIO0(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &audio0_cg_regs, _shift, \
|
||||
&mtk_clk_gate_ops_no_setclr)
|
||||
#define GATE_AUDIO1(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &audio1_cg_regs, _shift, \
|
||||
&mtk_clk_gate_ops_no_setclr)
|
||||
|
||||
static const struct mtk_gate audio_clks[] = {
|
||||
/* AUDIO0 */
|
||||
GATE_AUDIO0(CLK_AUD_AFE, "aud_afe", "audio_sel", 2),
|
||||
GATE_AUDIO0(CLK_AUD_22M, "aud_22m", "aud_eng1_sel", 8),
|
||||
GATE_AUDIO0(CLK_AUD_24M, "aud_24m", "aud_eng2_sel", 9),
|
||||
GATE_AUDIO0(CLK_AUD_APLL2_TUNER, "aud_apll2_tuner",
|
||||
"aud_eng2_sel", 18),
|
||||
GATE_AUDIO0(CLK_AUD_APLL_TUNER, "aud_apll_tuner",
|
||||
"aud_eng1_sel", 19),
|
||||
GATE_AUDIO0(CLK_AUD_TDM, "aud_tdm", "aud_eng1_sel", 20),
|
||||
GATE_AUDIO0(CLK_AUD_ADC, "aud_adc", "audio_sel", 24),
|
||||
GATE_AUDIO0(CLK_AUD_DAC, "aud_dac", "audio_sel", 25),
|
||||
GATE_AUDIO0(CLK_AUD_DAC_PREDIS, "aud_dac_predis",
|
||||
"audio_sel", 26),
|
||||
GATE_AUDIO0(CLK_AUD_TML, "aud_tml", "audio_sel", 27),
|
||||
GATE_AUDIO0(CLK_AUD_NLE, "aud_nle", "audio_sel", 28),
|
||||
/* AUDIO1 */
|
||||
GATE_AUDIO1(CLK_AUD_I2S1_BCLK_SW, "aud_i2s1_bclk",
|
||||
"audio_sel", 4),
|
||||
GATE_AUDIO1(CLK_AUD_I2S2_BCLK_SW, "aud_i2s2_bclk",
|
||||
"audio_sel", 5),
|
||||
GATE_AUDIO1(CLK_AUD_I2S3_BCLK_SW, "aud_i2s3_bclk",
|
||||
"audio_sel", 6),
|
||||
GATE_AUDIO1(CLK_AUD_I2S4_BCLK_SW, "aud_i2s4_bclk",
|
||||
"audio_sel", 7),
|
||||
GATE_AUDIO1(CLK_AUD_I2S5_BCLK_SW, "aud_i2s5_bclk",
|
||||
"audio_sel", 8),
|
||||
GATE_AUDIO1(CLK_AUD_CONN_I2S_ASRC, "aud_conn_i2s",
|
||||
"audio_sel", 12),
|
||||
GATE_AUDIO1(CLK_AUD_GENERAL1_ASRC, "aud_general1",
|
||||
"audio_sel", 13),
|
||||
GATE_AUDIO1(CLK_AUD_GENERAL2_ASRC, "aud_general2",
|
||||
"audio_sel", 14),
|
||||
GATE_AUDIO1(CLK_AUD_DAC_HIRES, "aud_dac_hires",
|
||||
"audio_h_sel", 15),
|
||||
GATE_AUDIO1(CLK_AUD_ADC_HIRES, "aud_adc_hires",
|
||||
"audio_h_sel", 16),
|
||||
GATE_AUDIO1(CLK_AUD_ADC_HIRES_TML, "aud_adc_hires_tml",
|
||||
"audio_h_sel", 17),
|
||||
GATE_AUDIO1(CLK_AUD_PDN_ADDA6_ADC, "aud_pdn_adda6_adc",
|
||||
"audio_sel", 20),
|
||||
GATE_AUDIO1(CLK_AUD_ADDA6_ADC_HIRES, "aud_adda6_adc_hires",
|
||||
"audio_h_sel",
|
||||
21),
|
||||
GATE_AUDIO1(CLK_AUD_3RD_DAC, "aud_3rd_dac", "audio_sel",
|
||||
28),
|
||||
GATE_AUDIO1(CLK_AUD_3RD_DAC_PREDIS, "aud_3rd_dac_predis",
|
||||
"audio_sel", 29),
|
||||
GATE_AUDIO1(CLK_AUD_3RD_DAC_TML, "aud_3rd_dac_tml",
|
||||
"audio_sel", 30),
|
||||
GATE_AUDIO1(CLK_AUD_3RD_DAC_HIRES, "aud_3rd_dac_hires",
|
||||
"audio_h_sel", 31),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt6779_aud[] = {
|
||||
{ .compatible = "mediatek,mt6779-audio", },
|
||||
{}
|
||||
};
|
||||
|
||||
static int clk_mt6779_aud_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_AUD_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks),
|
||||
clk_data);
|
||||
|
||||
return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt6779_aud_drv = {
|
||||
.probe = clk_mt6779_aud_probe,
|
||||
.driver = {
|
||||
.name = "clk-mt6779-aud",
|
||||
.of_match_table = of_match_clk_mt6779_aud,
|
||||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(clk_mt6779_aud_drv);
|
66
drivers/clk/mediatek/clk-mt6779-cam.c
Normal file
66
drivers/clk/mediatek/clk-mt6779-cam.c
Normal file
@ -0,0 +1,66 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2019 MediaTek Inc.
|
||||
* Author: Wendell Lin <wendell.lin@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <dt-bindings/clock/mt6779-clk.h>
|
||||
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
|
||||
static const struct mtk_gate_regs cam_cg_regs = {
|
||||
.set_ofs = 0x0004,
|
||||
.clr_ofs = 0x0008,
|
||||
.sta_ofs = 0x0000,
|
||||
};
|
||||
|
||||
#define GATE_CAM(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &cam_cg_regs, _shift, \
|
||||
&mtk_clk_gate_ops_setclr)
|
||||
|
||||
static const struct mtk_gate cam_clks[] = {
|
||||
GATE_CAM(CLK_CAM_LARB10, "camsys_larb10", "cam_sel", 0),
|
||||
GATE_CAM(CLK_CAM_DFP_VAD, "camsys_dfp_vad", "cam_sel", 1),
|
||||
GATE_CAM(CLK_CAM_LARB11, "camsys_larb11", "cam_sel", 2),
|
||||
GATE_CAM(CLK_CAM_LARB9, "camsys_larb9", "cam_sel", 3),
|
||||
GATE_CAM(CLK_CAM_CAM, "camsys_cam", "cam_sel", 6),
|
||||
GATE_CAM(CLK_CAM_CAMTG, "camsys_camtg", "cam_sel", 7),
|
||||
GATE_CAM(CLK_CAM_SENINF, "camsys_seninf", "cam_sel", 8),
|
||||
GATE_CAM(CLK_CAM_CAMSV0, "camsys_camsv0", "cam_sel", 9),
|
||||
GATE_CAM(CLK_CAM_CAMSV1, "camsys_camsv1", "cam_sel", 10),
|
||||
GATE_CAM(CLK_CAM_CAMSV2, "camsys_camsv2", "cam_sel", 11),
|
||||
GATE_CAM(CLK_CAM_CAMSV3, "camsys_camsv3", "cam_sel", 12),
|
||||
GATE_CAM(CLK_CAM_CCU, "camsys_ccu", "cam_sel", 13),
|
||||
GATE_CAM(CLK_CAM_FAKE_ENG, "camsys_fake_eng", "cam_sel", 14),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt6779_cam[] = {
|
||||
{ .compatible = "mediatek,mt6779-camsys", },
|
||||
{}
|
||||
};
|
||||
|
||||
static int clk_mt6779_cam_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_CAM_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, cam_clks, ARRAY_SIZE(cam_clks),
|
||||
clk_data);
|
||||
|
||||
return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt6779_cam_drv = {
|
||||
.probe = clk_mt6779_cam_probe,
|
||||
.driver = {
|
||||
.name = "clk-mt6779-cam",
|
||||
.of_match_table = of_match_clk_mt6779_cam,
|
||||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(clk_mt6779_cam_drv);
|
58
drivers/clk/mediatek/clk-mt6779-img.c
Normal file
58
drivers/clk/mediatek/clk-mt6779-img.c
Normal file
@ -0,0 +1,58 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2019 MediaTek Inc.
|
||||
* Author: Wendell Lin <wendell.lin@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <dt-bindings/clock/mt6779-clk.h>
|
||||
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
|
||||
static const struct mtk_gate_regs img_cg_regs = {
|
||||
.set_ofs = 0x0004,
|
||||
.clr_ofs = 0x0008,
|
||||
.sta_ofs = 0x0000,
|
||||
};
|
||||
|
||||
#define GATE_IMG(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &img_cg_regs, _shift, \
|
||||
&mtk_clk_gate_ops_setclr)
|
||||
|
||||
static const struct mtk_gate img_clks[] = {
|
||||
GATE_IMG(CLK_IMG_LARB5, "imgsys_larb5", "img_sel", 0),
|
||||
GATE_IMG(CLK_IMG_LARB6, "imgsys_larb6", "img_sel", 1),
|
||||
GATE_IMG(CLK_IMG_DIP, "imgsys_dip", "img_sel", 2),
|
||||
GATE_IMG(CLK_IMG_MFB, "imgsys_mfb", "img_sel", 6),
|
||||
GATE_IMG(CLK_IMG_WPE_A, "imgsys_wpe_a", "img_sel", 7),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt6779_img[] = {
|
||||
{ .compatible = "mediatek,mt6779-imgsys", },
|
||||
{}
|
||||
};
|
||||
|
||||
static int clk_mt6779_img_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
|
||||
clk_data);
|
||||
|
||||
return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt6779_img_drv = {
|
||||
.probe = clk_mt6779_img_probe,
|
||||
.driver = {
|
||||
.name = "clk-mt6779-img",
|
||||
.of_match_table = of_match_clk_mt6779_img,
|
||||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(clk_mt6779_img_drv);
|
60
drivers/clk/mediatek/clk-mt6779-ipe.c
Normal file
60
drivers/clk/mediatek/clk-mt6779-ipe.c
Normal file
@ -0,0 +1,60 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2019 MediaTek Inc.
|
||||
* Author: Wendell Lin <wendell.lin@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <dt-bindings/clock/mt6779-clk.h>
|
||||
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
|
||||
static const struct mtk_gate_regs ipe_cg_regs = {
|
||||
.set_ofs = 0x0004,
|
||||
.clr_ofs = 0x0008,
|
||||
.sta_ofs = 0x0000,
|
||||
};
|
||||
|
||||
#define GATE_IPE(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &ipe_cg_regs, _shift, \
|
||||
&mtk_clk_gate_ops_setclr)
|
||||
|
||||
static const struct mtk_gate ipe_clks[] = {
|
||||
GATE_IPE(CLK_IPE_LARB7, "ipe_larb7", "ipe_sel", 0),
|
||||
GATE_IPE(CLK_IPE_LARB8, "ipe_larb8", "ipe_sel", 1),
|
||||
GATE_IPE(CLK_IPE_SMI_SUBCOM, "ipe_smi_subcom", "ipe_sel", 2),
|
||||
GATE_IPE(CLK_IPE_FD, "ipe_fd", "ipe_sel", 3),
|
||||
GATE_IPE(CLK_IPE_FE, "ipe_fe", "ipe_sel", 4),
|
||||
GATE_IPE(CLK_IPE_RSC, "ipe_rsc", "ipe_sel", 5),
|
||||
GATE_IPE(CLK_IPE_DPE, "ipe_dpe", "ipe_sel", 6),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt6779_ipe[] = {
|
||||
{ .compatible = "mediatek,mt6779-ipesys", },
|
||||
{}
|
||||
};
|
||||
|
||||
static int clk_mt6779_ipe_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_IPE_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, ipe_clks, ARRAY_SIZE(ipe_clks),
|
||||
clk_data);
|
||||
|
||||
return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt6779_ipe_drv = {
|
||||
.probe = clk_mt6779_ipe_probe,
|
||||
.driver = {
|
||||
.name = "clk-mt6779-ipe",
|
||||
.of_match_table = of_match_clk_mt6779_ipe,
|
||||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(clk_mt6779_ipe_drv);
|
55
drivers/clk/mediatek/clk-mt6779-mfg.c
Normal file
55
drivers/clk/mediatek/clk-mt6779-mfg.c
Normal file
@ -0,0 +1,55 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2019 MediaTek Inc.
|
||||
* Author: Wendell Lin <wendell.lin@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
|
||||
#include <dt-bindings/clock/mt6779-clk.h>
|
||||
|
||||
static const struct mtk_gate_regs mfg_cg_regs = {
|
||||
.set_ofs = 0x4,
|
||||
.clr_ofs = 0x8,
|
||||
.sta_ofs = 0x0,
|
||||
};
|
||||
|
||||
#define GATE_MFG(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &mfg_cg_regs, _shift, \
|
||||
&mtk_clk_gate_ops_setclr)
|
||||
|
||||
static const struct mtk_gate mfg_clks[] = {
|
||||
GATE_MFG(CLK_MFGCFG_BG3D, "mfg_bg3d", "mfg_sel", 0),
|
||||
};
|
||||
|
||||
static int clk_mt6779_mfg_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_MFGCFG_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, mfg_clks, ARRAY_SIZE(mfg_clks),
|
||||
clk_data);
|
||||
|
||||
return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||
}
|
||||
|
||||
static const struct of_device_id of_match_clk_mt6779_mfg[] = {
|
||||
{ .compatible = "mediatek,mt6779-mfgcfg", },
|
||||
{}
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt6779_mfg_drv = {
|
||||
.probe = clk_mt6779_mfg_probe,
|
||||
.driver = {
|
||||
.name = "clk-mt6779-mfg",
|
||||
.of_match_table = of_match_clk_mt6779_mfg,
|
||||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(clk_mt6779_mfg_drv);
|
113
drivers/clk/mediatek/clk-mt6779-mm.c
Normal file
113
drivers/clk/mediatek/clk-mt6779-mm.c
Normal file
@ -0,0 +1,113 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2019 MediaTek Inc.
|
||||
* Author: Wendell Lin <wendell.lin@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <dt-bindings/clock/mt6779-clk.h>
|
||||
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
|
||||
static const struct mtk_gate_regs mm0_cg_regs = {
|
||||
.set_ofs = 0x0104,
|
||||
.clr_ofs = 0x0108,
|
||||
.sta_ofs = 0x0100,
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs mm1_cg_regs = {
|
||||
.set_ofs = 0x0114,
|
||||
.clr_ofs = 0x0118,
|
||||
.sta_ofs = 0x0110,
|
||||
};
|
||||
|
||||
#define GATE_MM0(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &mm0_cg_regs, _shift, \
|
||||
&mtk_clk_gate_ops_setclr)
|
||||
#define GATE_MM1(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &mm1_cg_regs, _shift, \
|
||||
&mtk_clk_gate_ops_setclr)
|
||||
|
||||
static const struct mtk_gate mm_clks[] = {
|
||||
/* MM0 */
|
||||
GATE_MM0(CLK_MM_SMI_COMMON, "mm_smi_common", "mm_sel", 0),
|
||||
GATE_MM0(CLK_MM_SMI_LARB0, "mm_smi_larb0", "mm_sel", 1),
|
||||
GATE_MM0(CLK_MM_SMI_LARB1, "mm_smi_larb1", "mm_sel", 2),
|
||||
GATE_MM0(CLK_MM_GALS_COMM0, "mm_gals_comm0", "mm_sel", 3),
|
||||
GATE_MM0(CLK_MM_GALS_COMM1, "mm_gals_comm1", "mm_sel", 4),
|
||||
GATE_MM0(CLK_MM_GALS_CCU2MM, "mm_gals_ccu2mm", "mm_sel", 5),
|
||||
GATE_MM0(CLK_MM_GALS_IPU12MM, "mm_gals_ipu12mm", "mm_sel", 6),
|
||||
GATE_MM0(CLK_MM_GALS_IMG2MM, "mm_gals_img2mm", "mm_sel", 7),
|
||||
GATE_MM0(CLK_MM_GALS_CAM2MM, "mm_gals_cam2mm", "mm_sel", 8),
|
||||
GATE_MM0(CLK_MM_GALS_IPU2MM, "mm_gals_ipu2mm", "mm_sel", 9),
|
||||
GATE_MM0(CLK_MM_MDP_DL_TXCK, "mm_mdp_dl_txck", "mm_sel", 10),
|
||||
GATE_MM0(CLK_MM_IPU_DL_TXCK, "mm_ipu_dl_txck", "mm_sel", 11),
|
||||
GATE_MM0(CLK_MM_MDP_RDMA0, "mm_mdp_rdma0", "mm_sel", 12),
|
||||
GATE_MM0(CLK_MM_MDP_RDMA1, "mm_mdp_rdma1", "mm_sel", 13),
|
||||
GATE_MM0(CLK_MM_MDP_RSZ0, "mm_mdp_rsz0", "mm_sel", 14),
|
||||
GATE_MM0(CLK_MM_MDP_RSZ1, "mm_mdp_rsz1", "mm_sel", 15),
|
||||
GATE_MM0(CLK_MM_MDP_TDSHP, "mm_mdp_tdshp", "mm_sel", 16),
|
||||
GATE_MM0(CLK_MM_MDP_WROT0, "mm_mdp_wrot0", "mm_sel", 17),
|
||||
GATE_MM0(CLK_MM_MDP_WROT1, "mm_mdp_wrot1", "mm_sel", 18),
|
||||
GATE_MM0(CLK_MM_FAKE_ENG, "mm_fake_eng", "mm_sel", 19),
|
||||
GATE_MM0(CLK_MM_DISP_OVL0, "mm_disp_ovl0", "mm_sel", 20),
|
||||
GATE_MM0(CLK_MM_DISP_OVL0_2L, "mm_disp_ovl0_2l", "mm_sel", 21),
|
||||
GATE_MM0(CLK_MM_DISP_OVL1_2L, "mm_disp_ovl1_2l", "mm_sel", 22),
|
||||
GATE_MM0(CLK_MM_DISP_RDMA0, "mm_disp_rdma0", "mm_sel", 23),
|
||||
GATE_MM0(CLK_MM_DISP_RDMA1, "mm_disp_rdma1", "mm_sel", 24),
|
||||
GATE_MM0(CLK_MM_DISP_WDMA0, "mm_disp_wdma0", "mm_sel", 25),
|
||||
GATE_MM0(CLK_MM_DISP_COLOR0, "mm_disp_color0", "mm_sel", 26),
|
||||
GATE_MM0(CLK_MM_DISP_CCORR0, "mm_disp_ccorr0", "mm_sel", 27),
|
||||
GATE_MM0(CLK_MM_DISP_AAL0, "mm_disp_aal0", "mm_sel", 28),
|
||||
GATE_MM0(CLK_MM_DISP_GAMMA0, "mm_disp_gamma0", "mm_sel", 29),
|
||||
GATE_MM0(CLK_MM_DISP_DITHER0, "mm_disp_dither0", "mm_sel", 30),
|
||||
GATE_MM0(CLK_MM_DISP_SPLIT, "mm_disp_split", "mm_sel", 31),
|
||||
/* MM1 */
|
||||
GATE_MM1(CLK_MM_DSI0_MM_CK, "mm_dsi0_mmck", "mm_sel", 0),
|
||||
GATE_MM1(CLK_MM_DSI0_IF_CK, "mm_dsi0_ifck", "mm_sel", 1),
|
||||
GATE_MM1(CLK_MM_DPI_MM_CK, "mm_dpi_mmck", "mm_sel", 2),
|
||||
GATE_MM1(CLK_MM_DPI_IF_CK, "mm_dpi_ifck", "dpi0_sel", 3),
|
||||
GATE_MM1(CLK_MM_FAKE_ENG2, "mm_fake_eng2", "mm_sel", 4),
|
||||
GATE_MM1(CLK_MM_MDP_DL_RX_CK, "mm_mdp_dl_rxck", "mm_sel", 5),
|
||||
GATE_MM1(CLK_MM_IPU_DL_RX_CK, "mm_ipu_dl_rxck", "mm_sel", 6),
|
||||
GATE_MM1(CLK_MM_26M, "mm_26m", "f_f26m_ck", 7),
|
||||
GATE_MM1(CLK_MM_MM_R2Y, "mm_mmsys_r2y", "mm_sel", 8),
|
||||
GATE_MM1(CLK_MM_DISP_RSZ, "mm_disp_rsz", "mm_sel", 9),
|
||||
GATE_MM1(CLK_MM_MDP_AAL, "mm_mdp_aal", "mm_sel", 10),
|
||||
GATE_MM1(CLK_MM_MDP_HDR, "mm_mdp_hdr", "mm_sel", 11),
|
||||
GATE_MM1(CLK_MM_DBI_MM_CK, "mm_dbi_mmck", "mm_sel", 12),
|
||||
GATE_MM1(CLK_MM_DBI_IF_CK, "mm_dbi_ifck", "dpi0_sel", 13),
|
||||
GATE_MM1(CLK_MM_DISP_POSTMASK0, "mm_disp_pm0", "mm_sel", 14),
|
||||
GATE_MM1(CLK_MM_DISP_HRT_BW, "mm_disp_hrt_bw", "mm_sel", 15),
|
||||
GATE_MM1(CLK_MM_DISP_OVL_FBDC, "mm_disp_ovl_fbdc", "mm_sel", 16),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt6779_mm[] = {
|
||||
{ .compatible = "mediatek,mt6779-mmsys", },
|
||||
{}
|
||||
};
|
||||
|
||||
static int clk_mt6779_mm_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
|
||||
clk_data);
|
||||
|
||||
return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt6779_mm_drv = {
|
||||
.probe = clk_mt6779_mm_probe,
|
||||
.driver = {
|
||||
.name = "clk-mt6779-mm",
|
||||
.of_match_table = of_match_clk_mt6779_mm,
|
||||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(clk_mt6779_mm_drv);
|
67
drivers/clk/mediatek/clk-mt6779-vdec.c
Normal file
67
drivers/clk/mediatek/clk-mt6779-vdec.c
Normal file
@ -0,0 +1,67 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2019 MediaTek Inc.
|
||||
* Author: Wendell Lin <wendell.lin@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
|
||||
#include <dt-bindings/clock/mt6779-clk.h>
|
||||
|
||||
static const struct mtk_gate_regs vdec0_cg_regs = {
|
||||
.set_ofs = 0x0000,
|
||||
.clr_ofs = 0x0004,
|
||||
.sta_ofs = 0x0000,
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs vdec1_cg_regs = {
|
||||
.set_ofs = 0x0008,
|
||||
.clr_ofs = 0x000c,
|
||||
.sta_ofs = 0x0008,
|
||||
};
|
||||
|
||||
#define GATE_VDEC0_I(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &vdec0_cg_regs, _shift, \
|
||||
&mtk_clk_gate_ops_setclr_inv)
|
||||
#define GATE_VDEC1_I(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &vdec1_cg_regs, _shift, \
|
||||
&mtk_clk_gate_ops_setclr_inv)
|
||||
|
||||
static const struct mtk_gate vdec_clks[] = {
|
||||
/* VDEC0 */
|
||||
GATE_VDEC0_I(CLK_VDEC_VDEC, "vdec_cken", "vdec_sel", 0),
|
||||
/* VDEC1 */
|
||||
GATE_VDEC1_I(CLK_VDEC_LARB1, "vdec_larb1_cken", "vdec_sel", 0),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt6779_vdec[] = {
|
||||
{ .compatible = "mediatek,mt6779-vdecsys", },
|
||||
{}
|
||||
};
|
||||
|
||||
static int clk_mt6779_vdec_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_VDEC_GCON_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
|
||||
clk_data);
|
||||
|
||||
return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt6779_vdec_drv = {
|
||||
.probe = clk_mt6779_vdec_probe,
|
||||
.driver = {
|
||||
.name = "clk-mt6779-vdec",
|
||||
.of_match_table = of_match_clk_mt6779_vdec,
|
||||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(clk_mt6779_vdec_drv);
|
58
drivers/clk/mediatek/clk-mt6779-venc.c
Normal file
58
drivers/clk/mediatek/clk-mt6779-venc.c
Normal file
@ -0,0 +1,58 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2019 MediaTek Inc.
|
||||
* Author: Wendell Lin <wendell.lin@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
|
||||
#include <dt-bindings/clock/mt6779-clk.h>
|
||||
|
||||
static const struct mtk_gate_regs venc_cg_regs = {
|
||||
.set_ofs = 0x0004,
|
||||
.clr_ofs = 0x0008,
|
||||
.sta_ofs = 0x0000,
|
||||
};
|
||||
|
||||
#define GATE_VENC_I(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &venc_cg_regs, _shift, \
|
||||
&mtk_clk_gate_ops_setclr_inv)
|
||||
|
||||
static const struct mtk_gate venc_clks[] = {
|
||||
GATE_VENC_I(CLK_VENC_GCON_LARB, "venc_larb", "venc_sel", 0),
|
||||
GATE_VENC_I(CLK_VENC_GCON_VENC, "venc_venc", "venc_sel", 4),
|
||||
GATE_VENC_I(CLK_VENC_GCON_JPGENC, "venc_jpgenc", "venc_sel", 8),
|
||||
GATE_VENC_I(CLK_VENC_GCON_GALS, "venc_gals", "venc_sel", 28),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt6779_venc[] = {
|
||||
{ .compatible = "mediatek,mt6779-vencsys", },
|
||||
{}
|
||||
};
|
||||
|
||||
static int clk_mt6779_venc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_VENC_GCON_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks),
|
||||
clk_data);
|
||||
|
||||
return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt6779_venc_drv = {
|
||||
.probe = clk_mt6779_venc_probe,
|
||||
.driver = {
|
||||
.name = "clk-mt6779-venc",
|
||||
.of_match_table = of_match_clk_mt6779_venc,
|
||||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(clk_mt6779_venc_drv);
|
1315
drivers/clk/mediatek/clk-mt6779.c
Normal file
1315
drivers/clk/mediatek/clk-mt6779.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user