162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2017 Icenowy Zheng <icenowy@aosc.io> 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/clk.h> 762306a36Sopenharmony_ci#include <linux/clk-provider.h> 862306a36Sopenharmony_ci#include <linux/module.h> 962306a36Sopenharmony_ci#include <linux/of.h> 1062306a36Sopenharmony_ci#include <linux/platform_device.h> 1162306a36Sopenharmony_ci#include <linux/reset.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "ccu_common.h" 1462306a36Sopenharmony_ci#include "ccu_div.h" 1562306a36Sopenharmony_ci#include "ccu_gate.h" 1662306a36Sopenharmony_ci#include "ccu_reset.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "ccu-sun8i-de2.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic SUNXI_CCU_GATE(bus_mixer0_clk, "bus-mixer0", "bus-de", 2162306a36Sopenharmony_ci 0x04, BIT(0), 0); 2262306a36Sopenharmony_cistatic SUNXI_CCU_GATE(bus_mixer1_clk, "bus-mixer1", "bus-de", 2362306a36Sopenharmony_ci 0x04, BIT(1), 0); 2462306a36Sopenharmony_cistatic SUNXI_CCU_GATE(bus_wb_clk, "bus-wb", "bus-de", 2562306a36Sopenharmony_ci 0x04, BIT(2), 0); 2662306a36Sopenharmony_cistatic SUNXI_CCU_GATE(bus_rot_clk, "bus-rot", "bus-de", 2762306a36Sopenharmony_ci 0x04, BIT(3), 0); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic SUNXI_CCU_GATE(mixer0_clk, "mixer0", "mixer0-div", 3062306a36Sopenharmony_ci 0x00, BIT(0), CLK_SET_RATE_PARENT); 3162306a36Sopenharmony_cistatic SUNXI_CCU_GATE(mixer1_clk, "mixer1", "mixer1-div", 3262306a36Sopenharmony_ci 0x00, BIT(1), CLK_SET_RATE_PARENT); 3362306a36Sopenharmony_cistatic SUNXI_CCU_GATE(wb_clk, "wb", "wb-div", 3462306a36Sopenharmony_ci 0x00, BIT(2), CLK_SET_RATE_PARENT); 3562306a36Sopenharmony_cistatic SUNXI_CCU_GATE(rot_clk, "rot", "rot-div", 3662306a36Sopenharmony_ci 0x00, BIT(3), CLK_SET_RATE_PARENT); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic SUNXI_CCU_M(mixer0_div_clk, "mixer0-div", "de", 0x0c, 0, 4, 3962306a36Sopenharmony_ci CLK_SET_RATE_PARENT); 4062306a36Sopenharmony_cistatic SUNXI_CCU_M(mixer1_div_clk, "mixer1-div", "de", 0x0c, 4, 4, 4162306a36Sopenharmony_ci CLK_SET_RATE_PARENT); 4262306a36Sopenharmony_cistatic SUNXI_CCU_M(wb_div_clk, "wb-div", "de", 0x0c, 8, 4, 4362306a36Sopenharmony_ci CLK_SET_RATE_PARENT); 4462306a36Sopenharmony_cistatic SUNXI_CCU_M(rot_div_clk, "rot-div", "de", 0x0c, 0x0c, 4, 4562306a36Sopenharmony_ci CLK_SET_RATE_PARENT); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic SUNXI_CCU_M(mixer0_div_a83_clk, "mixer0-div", "pll-de", 0x0c, 0, 4, 4862306a36Sopenharmony_ci CLK_SET_RATE_PARENT); 4962306a36Sopenharmony_cistatic SUNXI_CCU_M(mixer1_div_a83_clk, "mixer1-div", "pll-de", 0x0c, 4, 4, 5062306a36Sopenharmony_ci CLK_SET_RATE_PARENT); 5162306a36Sopenharmony_cistatic SUNXI_CCU_M(wb_div_a83_clk, "wb-div", "pll-de", 0x0c, 8, 4, 5262306a36Sopenharmony_ci CLK_SET_RATE_PARENT); 5362306a36Sopenharmony_cistatic SUNXI_CCU_M(rot_div_a83_clk, "rot-div", "pll-de", 0x0c, 0x0c, 4, 5462306a36Sopenharmony_ci CLK_SET_RATE_PARENT); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic struct ccu_common *sun8i_de2_ccu_clks[] = { 5762306a36Sopenharmony_ci &mixer0_clk.common, 5862306a36Sopenharmony_ci &mixer1_clk.common, 5962306a36Sopenharmony_ci &wb_clk.common, 6062306a36Sopenharmony_ci &rot_clk.common, 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci &bus_mixer0_clk.common, 6362306a36Sopenharmony_ci &bus_mixer1_clk.common, 6462306a36Sopenharmony_ci &bus_wb_clk.common, 6562306a36Sopenharmony_ci &bus_rot_clk.common, 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci &mixer0_div_clk.common, 6862306a36Sopenharmony_ci &mixer1_div_clk.common, 6962306a36Sopenharmony_ci &wb_div_clk.common, 7062306a36Sopenharmony_ci &rot_div_clk.common, 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci &mixer0_div_a83_clk.common, 7362306a36Sopenharmony_ci &mixer1_div_a83_clk.common, 7462306a36Sopenharmony_ci &wb_div_a83_clk.common, 7562306a36Sopenharmony_ci &rot_div_a83_clk.common, 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistatic struct clk_hw_onecell_data sun8i_a83t_de2_hw_clks = { 7962306a36Sopenharmony_ci .hws = { 8062306a36Sopenharmony_ci [CLK_MIXER0] = &mixer0_clk.common.hw, 8162306a36Sopenharmony_ci [CLK_MIXER1] = &mixer1_clk.common.hw, 8262306a36Sopenharmony_ci [CLK_WB] = &wb_clk.common.hw, 8362306a36Sopenharmony_ci [CLK_ROT] = &rot_clk.common.hw, 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci [CLK_BUS_MIXER0] = &bus_mixer0_clk.common.hw, 8662306a36Sopenharmony_ci [CLK_BUS_MIXER1] = &bus_mixer1_clk.common.hw, 8762306a36Sopenharmony_ci [CLK_BUS_WB] = &bus_wb_clk.common.hw, 8862306a36Sopenharmony_ci [CLK_BUS_ROT] = &bus_rot_clk.common.hw, 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci [CLK_MIXER0_DIV] = &mixer0_div_a83_clk.common.hw, 9162306a36Sopenharmony_ci [CLK_MIXER1_DIV] = &mixer1_div_a83_clk.common.hw, 9262306a36Sopenharmony_ci [CLK_WB_DIV] = &wb_div_a83_clk.common.hw, 9362306a36Sopenharmony_ci [CLK_ROT_DIV] = &rot_div_a83_clk.common.hw, 9462306a36Sopenharmony_ci }, 9562306a36Sopenharmony_ci .num = CLK_NUMBER_WITH_ROT, 9662306a36Sopenharmony_ci}; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistatic struct clk_hw_onecell_data sun8i_h3_de2_hw_clks = { 9962306a36Sopenharmony_ci .hws = { 10062306a36Sopenharmony_ci [CLK_MIXER0] = &mixer0_clk.common.hw, 10162306a36Sopenharmony_ci [CLK_MIXER1] = &mixer1_clk.common.hw, 10262306a36Sopenharmony_ci [CLK_WB] = &wb_clk.common.hw, 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci [CLK_BUS_MIXER0] = &bus_mixer0_clk.common.hw, 10562306a36Sopenharmony_ci [CLK_BUS_MIXER1] = &bus_mixer1_clk.common.hw, 10662306a36Sopenharmony_ci [CLK_BUS_WB] = &bus_wb_clk.common.hw, 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci [CLK_MIXER0_DIV] = &mixer0_div_clk.common.hw, 10962306a36Sopenharmony_ci [CLK_MIXER1_DIV] = &mixer1_div_clk.common.hw, 11062306a36Sopenharmony_ci [CLK_WB_DIV] = &wb_div_clk.common.hw, 11162306a36Sopenharmony_ci }, 11262306a36Sopenharmony_ci .num = CLK_NUMBER_WITHOUT_ROT, 11362306a36Sopenharmony_ci}; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistatic struct clk_hw_onecell_data sun8i_v3s_de2_hw_clks = { 11662306a36Sopenharmony_ci .hws = { 11762306a36Sopenharmony_ci [CLK_MIXER0] = &mixer0_clk.common.hw, 11862306a36Sopenharmony_ci [CLK_WB] = &wb_clk.common.hw, 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci [CLK_BUS_MIXER0] = &bus_mixer0_clk.common.hw, 12162306a36Sopenharmony_ci [CLK_BUS_WB] = &bus_wb_clk.common.hw, 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci [CLK_MIXER0_DIV] = &mixer0_div_clk.common.hw, 12462306a36Sopenharmony_ci [CLK_WB_DIV] = &wb_div_clk.common.hw, 12562306a36Sopenharmony_ci }, 12662306a36Sopenharmony_ci .num = CLK_NUMBER_WITHOUT_ROT, 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cistatic struct clk_hw_onecell_data sun50i_a64_de2_hw_clks = { 13062306a36Sopenharmony_ci .hws = { 13162306a36Sopenharmony_ci [CLK_MIXER0] = &mixer0_clk.common.hw, 13262306a36Sopenharmony_ci [CLK_MIXER1] = &mixer1_clk.common.hw, 13362306a36Sopenharmony_ci [CLK_WB] = &wb_clk.common.hw, 13462306a36Sopenharmony_ci [CLK_ROT] = &rot_clk.common.hw, 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci [CLK_BUS_MIXER0] = &bus_mixer0_clk.common.hw, 13762306a36Sopenharmony_ci [CLK_BUS_MIXER1] = &bus_mixer1_clk.common.hw, 13862306a36Sopenharmony_ci [CLK_BUS_WB] = &bus_wb_clk.common.hw, 13962306a36Sopenharmony_ci [CLK_BUS_ROT] = &bus_rot_clk.common.hw, 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci [CLK_MIXER0_DIV] = &mixer0_div_clk.common.hw, 14262306a36Sopenharmony_ci [CLK_MIXER1_DIV] = &mixer1_div_clk.common.hw, 14362306a36Sopenharmony_ci [CLK_WB_DIV] = &wb_div_clk.common.hw, 14462306a36Sopenharmony_ci [CLK_ROT_DIV] = &rot_div_clk.common.hw, 14562306a36Sopenharmony_ci }, 14662306a36Sopenharmony_ci .num = CLK_NUMBER_WITH_ROT, 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_cistatic struct ccu_reset_map sun8i_a83t_de2_resets[] = { 15062306a36Sopenharmony_ci [RST_MIXER0] = { 0x08, BIT(0) }, 15162306a36Sopenharmony_ci /* 15262306a36Sopenharmony_ci * Mixer1 reset line is shared with wb, so only RST_WB is 15362306a36Sopenharmony_ci * exported here. 15462306a36Sopenharmony_ci */ 15562306a36Sopenharmony_ci [RST_WB] = { 0x08, BIT(2) }, 15662306a36Sopenharmony_ci [RST_ROT] = { 0x08, BIT(3) }, 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistatic struct ccu_reset_map sun8i_h3_de2_resets[] = { 16062306a36Sopenharmony_ci [RST_MIXER0] = { 0x08, BIT(0) }, 16162306a36Sopenharmony_ci /* 16262306a36Sopenharmony_ci * Mixer1 reset line is shared with wb, so only RST_WB is 16362306a36Sopenharmony_ci * exported here. 16462306a36Sopenharmony_ci * V3s doesn't have mixer1, so it also shares this struct. 16562306a36Sopenharmony_ci */ 16662306a36Sopenharmony_ci [RST_WB] = { 0x08, BIT(2) }, 16762306a36Sopenharmony_ci}; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic struct ccu_reset_map sun50i_a64_de2_resets[] = { 17062306a36Sopenharmony_ci [RST_MIXER0] = { 0x08, BIT(0) }, 17162306a36Sopenharmony_ci [RST_MIXER1] = { 0x08, BIT(1) }, 17262306a36Sopenharmony_ci [RST_WB] = { 0x08, BIT(2) }, 17362306a36Sopenharmony_ci [RST_ROT] = { 0x08, BIT(3) }, 17462306a36Sopenharmony_ci}; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cistatic struct ccu_reset_map sun50i_h5_de2_resets[] = { 17762306a36Sopenharmony_ci [RST_MIXER0] = { 0x08, BIT(0) }, 17862306a36Sopenharmony_ci [RST_MIXER1] = { 0x08, BIT(1) }, 17962306a36Sopenharmony_ci [RST_WB] = { 0x08, BIT(2) }, 18062306a36Sopenharmony_ci}; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistatic const struct sunxi_ccu_desc sun8i_a83t_de2_clk_desc = { 18362306a36Sopenharmony_ci .ccu_clks = sun8i_de2_ccu_clks, 18462306a36Sopenharmony_ci .num_ccu_clks = ARRAY_SIZE(sun8i_de2_ccu_clks), 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci .hw_clks = &sun8i_a83t_de2_hw_clks, 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci .resets = sun8i_a83t_de2_resets, 18962306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(sun8i_a83t_de2_resets), 19062306a36Sopenharmony_ci}; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistatic const struct sunxi_ccu_desc sun8i_h3_de2_clk_desc = { 19362306a36Sopenharmony_ci .ccu_clks = sun8i_de2_ccu_clks, 19462306a36Sopenharmony_ci .num_ccu_clks = ARRAY_SIZE(sun8i_de2_ccu_clks), 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci .hw_clks = &sun8i_h3_de2_hw_clks, 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci .resets = sun8i_h3_de2_resets, 19962306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(sun8i_h3_de2_resets), 20062306a36Sopenharmony_ci}; 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_cistatic const struct sunxi_ccu_desc sun8i_r40_de2_clk_desc = { 20362306a36Sopenharmony_ci .ccu_clks = sun8i_de2_ccu_clks, 20462306a36Sopenharmony_ci .num_ccu_clks = ARRAY_SIZE(sun8i_de2_ccu_clks), 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci .hw_clks = &sun50i_a64_de2_hw_clks, 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci .resets = sun8i_a83t_de2_resets, 20962306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(sun8i_a83t_de2_resets), 21062306a36Sopenharmony_ci}; 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_cistatic const struct sunxi_ccu_desc sun8i_v3s_de2_clk_desc = { 21362306a36Sopenharmony_ci .ccu_clks = sun8i_de2_ccu_clks, 21462306a36Sopenharmony_ci .num_ccu_clks = ARRAY_SIZE(sun8i_de2_ccu_clks), 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci .hw_clks = &sun8i_v3s_de2_hw_clks, 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci .resets = sun8i_a83t_de2_resets, 21962306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(sun8i_a83t_de2_resets), 22062306a36Sopenharmony_ci}; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_cistatic const struct sunxi_ccu_desc sun50i_a64_de2_clk_desc = { 22362306a36Sopenharmony_ci .ccu_clks = sun8i_de2_ccu_clks, 22462306a36Sopenharmony_ci .num_ccu_clks = ARRAY_SIZE(sun8i_de2_ccu_clks), 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci .hw_clks = &sun50i_a64_de2_hw_clks, 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci .resets = sun50i_a64_de2_resets, 22962306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(sun50i_a64_de2_resets), 23062306a36Sopenharmony_ci}; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_cistatic const struct sunxi_ccu_desc sun50i_h5_de2_clk_desc = { 23362306a36Sopenharmony_ci .ccu_clks = sun8i_de2_ccu_clks, 23462306a36Sopenharmony_ci .num_ccu_clks = ARRAY_SIZE(sun8i_de2_ccu_clks), 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci .hw_clks = &sun8i_h3_de2_hw_clks, 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci .resets = sun50i_h5_de2_resets, 23962306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(sun50i_h5_de2_resets), 24062306a36Sopenharmony_ci}; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cistatic int sunxi_de2_clk_probe(struct platform_device *pdev) 24362306a36Sopenharmony_ci{ 24462306a36Sopenharmony_ci struct clk *bus_clk, *mod_clk; 24562306a36Sopenharmony_ci struct reset_control *rstc; 24662306a36Sopenharmony_ci void __iomem *reg; 24762306a36Sopenharmony_ci const struct sunxi_ccu_desc *ccu_desc; 24862306a36Sopenharmony_ci int ret; 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci ccu_desc = of_device_get_match_data(&pdev->dev); 25162306a36Sopenharmony_ci if (!ccu_desc) 25262306a36Sopenharmony_ci return -EINVAL; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci reg = devm_platform_ioremap_resource(pdev, 0); 25562306a36Sopenharmony_ci if (IS_ERR(reg)) 25662306a36Sopenharmony_ci return PTR_ERR(reg); 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci bus_clk = devm_clk_get(&pdev->dev, "bus"); 25962306a36Sopenharmony_ci if (IS_ERR(bus_clk)) 26062306a36Sopenharmony_ci return dev_err_probe(&pdev->dev, PTR_ERR(bus_clk), 26162306a36Sopenharmony_ci "Couldn't get bus clk\n"); 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci mod_clk = devm_clk_get(&pdev->dev, "mod"); 26462306a36Sopenharmony_ci if (IS_ERR(mod_clk)) 26562306a36Sopenharmony_ci return dev_err_probe(&pdev->dev, PTR_ERR(mod_clk), 26662306a36Sopenharmony_ci "Couldn't get mod clk\n"); 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); 26962306a36Sopenharmony_ci if (IS_ERR(rstc)) 27062306a36Sopenharmony_ci return dev_err_probe(&pdev->dev, PTR_ERR(rstc), 27162306a36Sopenharmony_ci "Couldn't get reset control\n"); 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci /* The clocks need to be enabled for us to access the registers */ 27462306a36Sopenharmony_ci ret = clk_prepare_enable(bus_clk); 27562306a36Sopenharmony_ci if (ret) { 27662306a36Sopenharmony_ci dev_err(&pdev->dev, "Couldn't enable bus clk: %d\n", ret); 27762306a36Sopenharmony_ci return ret; 27862306a36Sopenharmony_ci } 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci ret = clk_prepare_enable(mod_clk); 28162306a36Sopenharmony_ci if (ret) { 28262306a36Sopenharmony_ci dev_err(&pdev->dev, "Couldn't enable mod clk: %d\n", ret); 28362306a36Sopenharmony_ci goto err_disable_bus_clk; 28462306a36Sopenharmony_ci } 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci /* The reset control needs to be asserted for the controls to work */ 28762306a36Sopenharmony_ci ret = reset_control_deassert(rstc); 28862306a36Sopenharmony_ci if (ret) { 28962306a36Sopenharmony_ci dev_err(&pdev->dev, 29062306a36Sopenharmony_ci "Couldn't deassert reset control: %d\n", ret); 29162306a36Sopenharmony_ci goto err_disable_mod_clk; 29262306a36Sopenharmony_ci } 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci ret = devm_sunxi_ccu_probe(&pdev->dev, reg, ccu_desc); 29562306a36Sopenharmony_ci if (ret) 29662306a36Sopenharmony_ci goto err_assert_reset; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci return 0; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_cierr_assert_reset: 30162306a36Sopenharmony_ci reset_control_assert(rstc); 30262306a36Sopenharmony_cierr_disable_mod_clk: 30362306a36Sopenharmony_ci clk_disable_unprepare(mod_clk); 30462306a36Sopenharmony_cierr_disable_bus_clk: 30562306a36Sopenharmony_ci clk_disable_unprepare(bus_clk); 30662306a36Sopenharmony_ci return ret; 30762306a36Sopenharmony_ci} 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_cistatic const struct of_device_id sunxi_de2_clk_ids[] = { 31062306a36Sopenharmony_ci { 31162306a36Sopenharmony_ci .compatible = "allwinner,sun8i-a83t-de2-clk", 31262306a36Sopenharmony_ci .data = &sun8i_a83t_de2_clk_desc, 31362306a36Sopenharmony_ci }, 31462306a36Sopenharmony_ci { 31562306a36Sopenharmony_ci .compatible = "allwinner,sun8i-h3-de2-clk", 31662306a36Sopenharmony_ci .data = &sun8i_h3_de2_clk_desc, 31762306a36Sopenharmony_ci }, 31862306a36Sopenharmony_ci { 31962306a36Sopenharmony_ci .compatible = "allwinner,sun8i-r40-de2-clk", 32062306a36Sopenharmony_ci .data = &sun8i_r40_de2_clk_desc, 32162306a36Sopenharmony_ci }, 32262306a36Sopenharmony_ci { 32362306a36Sopenharmony_ci .compatible = "allwinner,sun8i-v3s-de2-clk", 32462306a36Sopenharmony_ci .data = &sun8i_v3s_de2_clk_desc, 32562306a36Sopenharmony_ci }, 32662306a36Sopenharmony_ci { 32762306a36Sopenharmony_ci .compatible = "allwinner,sun50i-a64-de2-clk", 32862306a36Sopenharmony_ci .data = &sun50i_a64_de2_clk_desc, 32962306a36Sopenharmony_ci }, 33062306a36Sopenharmony_ci { 33162306a36Sopenharmony_ci .compatible = "allwinner,sun50i-h5-de2-clk", 33262306a36Sopenharmony_ci .data = &sun50i_h5_de2_clk_desc, 33362306a36Sopenharmony_ci }, 33462306a36Sopenharmony_ci { 33562306a36Sopenharmony_ci .compatible = "allwinner,sun50i-h6-de3-clk", 33662306a36Sopenharmony_ci .data = &sun50i_h5_de2_clk_desc, 33762306a36Sopenharmony_ci }, 33862306a36Sopenharmony_ci { } 33962306a36Sopenharmony_ci}; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_cistatic struct platform_driver sunxi_de2_clk_driver = { 34262306a36Sopenharmony_ci .probe = sunxi_de2_clk_probe, 34362306a36Sopenharmony_ci .driver = { 34462306a36Sopenharmony_ci .name = "sunxi-de2-clks", 34562306a36Sopenharmony_ci .of_match_table = sunxi_de2_clk_ids, 34662306a36Sopenharmony_ci }, 34762306a36Sopenharmony_ci}; 34862306a36Sopenharmony_cimodule_platform_driver(sunxi_de2_clk_driver); 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ciMODULE_IMPORT_NS(SUNXI_CCU); 35162306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 352