xref: /openbmc/linux/drivers/clk/mediatek/clk-mt8188-imp_iic_wrap.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
11b5e5299SGarmin.Chang // SPDX-License-Identifier: GPL-2.0-only
21b5e5299SGarmin.Chang /*
31b5e5299SGarmin.Chang  * Copyright (c) 2022 MediaTek Inc.
41b5e5299SGarmin.Chang  * Author: Garmin Chang <garmin.chang@mediatek.com>
51b5e5299SGarmin.Chang  */
61b5e5299SGarmin.Chang 
71b5e5299SGarmin.Chang #include <linux/clk-provider.h>
8*e0e3aca9SStephen Boyd #include <linux/mod_devicetable.h>
91b5e5299SGarmin.Chang #include <linux/platform_device.h>
101b5e5299SGarmin.Chang 
11*e0e3aca9SStephen Boyd #include <dt-bindings/clock/mediatek,mt8188-clk.h>
12*e0e3aca9SStephen Boyd 
131b5e5299SGarmin.Chang #include "clk-gate.h"
141b5e5299SGarmin.Chang #include "clk-mtk.h"
151b5e5299SGarmin.Chang 
161b5e5299SGarmin.Chang static const struct mtk_gate_regs imp_iic_wrap_cg_regs = {
171b5e5299SGarmin.Chang 	.set_ofs = 0xe08,
181b5e5299SGarmin.Chang 	.clr_ofs = 0xe04,
191b5e5299SGarmin.Chang 	.sta_ofs = 0xe00,
201b5e5299SGarmin.Chang };
211b5e5299SGarmin.Chang 
221b5e5299SGarmin.Chang #define GATE_IMP_IIC_WRAP(_id, _name, _parent, _shift)			\
231b5e5299SGarmin.Chang 	GATE_MTK_FLAGS(_id, _name, _parent, &imp_iic_wrap_cg_regs, _shift,			\
241b5e5299SGarmin.Chang 		&mtk_clk_gate_ops_setclr, CLK_OPS_PARENT_ENABLE)
251b5e5299SGarmin.Chang 
261b5e5299SGarmin.Chang static const struct mtk_gate imp_iic_wrap_c_clks[] = {
271b5e5299SGarmin.Chang 	GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_C_AP_CLOCK_I2C0,
281b5e5299SGarmin.Chang 			  "imp_iic_wrap_c_ap_clock_i2c0", "top_i2c", 0),
291b5e5299SGarmin.Chang 	GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_C_AP_CLOCK_I2C2,
301b5e5299SGarmin.Chang 			  "imp_iic_wrap_c_ap_clock_i2c2", "top_i2c", 1),
311b5e5299SGarmin.Chang 	GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_C_AP_CLOCK_I2C3,
321b5e5299SGarmin.Chang 			  "imp_iic_wrap_c_ap_clock_i2c3", "top_i2c", 2),
331b5e5299SGarmin.Chang };
341b5e5299SGarmin.Chang 
351b5e5299SGarmin.Chang static const struct mtk_gate imp_iic_wrap_w_clks[] = {
361b5e5299SGarmin.Chang 	GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_W_AP_CLOCK_I2C1,
371b5e5299SGarmin.Chang 			  "imp_iic_wrap_w_ap_clock_i2c1", "top_i2c", 0),
381b5e5299SGarmin.Chang 	GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_W_AP_CLOCK_I2C4,
391b5e5299SGarmin.Chang 			  "imp_iic_wrap_w_ap_clock_i2c4", "top_i2c", 1),
401b5e5299SGarmin.Chang };
411b5e5299SGarmin.Chang 
421b5e5299SGarmin.Chang static const struct mtk_gate imp_iic_wrap_en_clks[] = {
431b5e5299SGarmin.Chang 	GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_EN_AP_CLOCK_I2C5,
441b5e5299SGarmin.Chang 			  "imp_iic_wrap_en_ap_clock_i2c5", "top_i2c", 0),
451b5e5299SGarmin.Chang 	GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_EN_AP_CLOCK_I2C6,
461b5e5299SGarmin.Chang 			  "imp_iic_wrap_en_ap_clock_i2c6", "top_i2c", 1),
471b5e5299SGarmin.Chang };
481b5e5299SGarmin.Chang 
491b5e5299SGarmin.Chang static const struct mtk_clk_desc imp_iic_wrap_c_desc = {
501b5e5299SGarmin.Chang 	.clks = imp_iic_wrap_c_clks,
511b5e5299SGarmin.Chang 	.num_clks = ARRAY_SIZE(imp_iic_wrap_c_clks),
521b5e5299SGarmin.Chang };
531b5e5299SGarmin.Chang 
541b5e5299SGarmin.Chang static const struct mtk_clk_desc imp_iic_wrap_w_desc = {
551b5e5299SGarmin.Chang 	.clks = imp_iic_wrap_w_clks,
561b5e5299SGarmin.Chang 	.num_clks = ARRAY_SIZE(imp_iic_wrap_w_clks),
571b5e5299SGarmin.Chang };
581b5e5299SGarmin.Chang 
591b5e5299SGarmin.Chang static const struct mtk_clk_desc imp_iic_wrap_en_desc = {
601b5e5299SGarmin.Chang 	.clks = imp_iic_wrap_en_clks,
611b5e5299SGarmin.Chang 	.num_clks = ARRAY_SIZE(imp_iic_wrap_en_clks),
621b5e5299SGarmin.Chang };
631b5e5299SGarmin.Chang 
641b5e5299SGarmin.Chang static const struct of_device_id of_match_clk_mt8188_imp_iic_wrap[] = {
651b5e5299SGarmin.Chang 	{ .compatible = "mediatek,mt8188-imp-iic-wrap-c", .data = &imp_iic_wrap_c_desc },
661b5e5299SGarmin.Chang 	{ .compatible = "mediatek,mt8188-imp-iic-wrap-w", .data = &imp_iic_wrap_w_desc },
671b5e5299SGarmin.Chang 	{ .compatible = "mediatek,mt8188-imp-iic-wrap-en", .data = &imp_iic_wrap_en_desc },
681b5e5299SGarmin.Chang 	{ /* sentinel */ }
691b5e5299SGarmin.Chang };
70*e0e3aca9SStephen Boyd MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_imp_iic_wrap);
711b5e5299SGarmin.Chang 
721b5e5299SGarmin.Chang static struct platform_driver clk_mt8188_imp_iic_wrap_drv = {
731b5e5299SGarmin.Chang 	.probe = mtk_clk_simple_probe,
741b5e5299SGarmin.Chang 	.remove_new = mtk_clk_simple_remove,
751b5e5299SGarmin.Chang 	.driver = {
761b5e5299SGarmin.Chang 		.name = "clk-mt8188-imp_iic_wrap",
771b5e5299SGarmin.Chang 		.of_match_table = of_match_clk_mt8188_imp_iic_wrap,
781b5e5299SGarmin.Chang 	},
791b5e5299SGarmin.Chang };
801b5e5299SGarmin.Chang 
811b5e5299SGarmin.Chang module_platform_driver(clk_mt8188_imp_iic_wrap_drv);
821b5e5299SGarmin.Chang MODULE_LICENSE("GPL");
83