162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2019, Jeffrey Hugo 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/kernel.h> 762306a36Sopenharmony_ci#include <linux/bitops.h> 862306a36Sopenharmony_ci#include <linux/err.h> 962306a36Sopenharmony_ci#include <linux/platform_device.h> 1062306a36Sopenharmony_ci#include <linux/module.h> 1162306a36Sopenharmony_ci#include <linux/of.h> 1262306a36Sopenharmony_ci#include <linux/clk-provider.h> 1362306a36Sopenharmony_ci#include <linux/regmap.h> 1462306a36Sopenharmony_ci#include <linux/reset-controller.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <dt-bindings/clock/qcom,gpucc-msm8998.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "common.h" 1962306a36Sopenharmony_ci#include "clk-regmap.h" 2062306a36Sopenharmony_ci#include "clk-regmap-divider.h" 2162306a36Sopenharmony_ci#include "clk-alpha-pll.h" 2262306a36Sopenharmony_ci#include "clk-rcg.h" 2362306a36Sopenharmony_ci#include "clk-branch.h" 2462306a36Sopenharmony_ci#include "reset.h" 2562306a36Sopenharmony_ci#include "gdsc.h" 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cienum { 2862306a36Sopenharmony_ci P_XO, 2962306a36Sopenharmony_ci P_GPLL0, 3062306a36Sopenharmony_ci P_GPUPLL0_OUT_EVEN, 3162306a36Sopenharmony_ci}; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci/* Instead of going directly to the block, XO is routed through this branch */ 3462306a36Sopenharmony_cistatic struct clk_branch gpucc_cxo_clk = { 3562306a36Sopenharmony_ci .halt_reg = 0x1020, 3662306a36Sopenharmony_ci .clkr = { 3762306a36Sopenharmony_ci .enable_reg = 0x1020, 3862306a36Sopenharmony_ci .enable_mask = BIT(0), 3962306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ 4062306a36Sopenharmony_ci .name = "gpucc_cxo_clk", 4162306a36Sopenharmony_ci .parent_data = &(const struct clk_parent_data){ 4262306a36Sopenharmony_ci .fw_name = "xo" 4362306a36Sopenharmony_ci }, 4462306a36Sopenharmony_ci .num_parents = 1, 4562306a36Sopenharmony_ci .ops = &clk_branch2_ops, 4662306a36Sopenharmony_ci .flags = CLK_IS_CRITICAL, 4762306a36Sopenharmony_ci }, 4862306a36Sopenharmony_ci }, 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic struct pll_vco fabia_vco[] = { 5262306a36Sopenharmony_ci { 249600000, 2000000000, 0 }, 5362306a36Sopenharmony_ci { 125000000, 1000000000, 1 }, 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic const struct clk_div_table post_div_table_fabia_even[] = { 5762306a36Sopenharmony_ci { 0x0, 1 }, 5862306a36Sopenharmony_ci { 0x1, 2 }, 5962306a36Sopenharmony_ci { 0x3, 4 }, 6062306a36Sopenharmony_ci { 0x7, 8 }, 6162306a36Sopenharmony_ci { } 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic struct clk_alpha_pll gpupll0 = { 6562306a36Sopenharmony_ci .offset = 0x0, 6662306a36Sopenharmony_ci .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 6762306a36Sopenharmony_ci .vco_table = fabia_vco, 6862306a36Sopenharmony_ci .num_vco = ARRAY_SIZE(fabia_vco), 6962306a36Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 7062306a36Sopenharmony_ci .name = "gpupll0", 7162306a36Sopenharmony_ci .parent_hws = (const struct clk_hw *[]){ &gpucc_cxo_clk.clkr.hw }, 7262306a36Sopenharmony_ci .num_parents = 1, 7362306a36Sopenharmony_ci .ops = &clk_alpha_pll_fabia_ops, 7462306a36Sopenharmony_ci }, 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_cistatic struct clk_alpha_pll_postdiv gpupll0_out_even = { 7862306a36Sopenharmony_ci .offset = 0x0, 7962306a36Sopenharmony_ci .post_div_shift = 8, 8062306a36Sopenharmony_ci .post_div_table = post_div_table_fabia_even, 8162306a36Sopenharmony_ci .num_post_div = ARRAY_SIZE(post_div_table_fabia_even), 8262306a36Sopenharmony_ci .width = 4, 8362306a36Sopenharmony_ci .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 8462306a36Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 8562306a36Sopenharmony_ci .name = "gpupll0_out_even", 8662306a36Sopenharmony_ci .parent_hws = (const struct clk_hw *[]){ &gpupll0.clkr.hw }, 8762306a36Sopenharmony_ci .num_parents = 1, 8862306a36Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 8962306a36Sopenharmony_ci .ops = &clk_alpha_pll_postdiv_fabia_ops, 9062306a36Sopenharmony_ci }, 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistatic const struct parent_map gpu_xo_gpll0_map[] = { 9462306a36Sopenharmony_ci { P_XO, 0 }, 9562306a36Sopenharmony_ci { P_GPLL0, 5 }, 9662306a36Sopenharmony_ci}; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistatic const struct clk_parent_data gpu_xo_gpll0[] = { 9962306a36Sopenharmony_ci { .hw = &gpucc_cxo_clk.clkr.hw }, 10062306a36Sopenharmony_ci { .fw_name = "gpll0", .name = "gcc_gpu_gpll0_clk" }, 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistatic const struct parent_map gpu_xo_gpupll0_map[] = { 10462306a36Sopenharmony_ci { P_XO, 0 }, 10562306a36Sopenharmony_ci { P_GPUPLL0_OUT_EVEN, 1 }, 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistatic const struct clk_hw *gpu_xo_gpupll0[] = { 10962306a36Sopenharmony_ci &gpucc_cxo_clk.clkr.hw, 11062306a36Sopenharmony_ci &gpupll0_out_even.clkr.hw, 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistatic const struct freq_tbl ftbl_rbcpr_clk_src[] = { 11462306a36Sopenharmony_ci F(19200000, P_XO, 1, 0, 0), 11562306a36Sopenharmony_ci F(50000000, P_GPLL0, 12, 0, 0), 11662306a36Sopenharmony_ci { } 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistatic struct clk_rcg2 rbcpr_clk_src = { 12062306a36Sopenharmony_ci .cmd_rcgr = 0x1030, 12162306a36Sopenharmony_ci .hid_width = 5, 12262306a36Sopenharmony_ci .parent_map = gpu_xo_gpll0_map, 12362306a36Sopenharmony_ci .freq_tbl = ftbl_rbcpr_clk_src, 12462306a36Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 12562306a36Sopenharmony_ci .name = "rbcpr_clk_src", 12662306a36Sopenharmony_ci .parent_data = gpu_xo_gpll0, 12762306a36Sopenharmony_ci .num_parents = ARRAY_SIZE(gpu_xo_gpll0), 12862306a36Sopenharmony_ci .ops = &clk_rcg2_ops, 12962306a36Sopenharmony_ci }, 13062306a36Sopenharmony_ci}; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistatic const struct freq_tbl ftbl_gfx3d_clk_src[] = { 13362306a36Sopenharmony_ci { .src = P_GPUPLL0_OUT_EVEN, .pre_div = 3 }, 13462306a36Sopenharmony_ci { } 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistatic struct clk_rcg2 gfx3d_clk_src = { 13862306a36Sopenharmony_ci .cmd_rcgr = 0x1070, 13962306a36Sopenharmony_ci .hid_width = 5, 14062306a36Sopenharmony_ci .parent_map = gpu_xo_gpupll0_map, 14162306a36Sopenharmony_ci .freq_tbl = ftbl_gfx3d_clk_src, 14262306a36Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 14362306a36Sopenharmony_ci .name = "gfx3d_clk_src", 14462306a36Sopenharmony_ci .parent_hws = gpu_xo_gpupll0, 14562306a36Sopenharmony_ci .num_parents = ARRAY_SIZE(gpu_xo_gpupll0), 14662306a36Sopenharmony_ci .ops = &clk_rcg2_ops, 14762306a36Sopenharmony_ci .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE, 14862306a36Sopenharmony_ci }, 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistatic const struct freq_tbl ftbl_rbbmtimer_clk_src[] = { 15262306a36Sopenharmony_ci F(19200000, P_XO, 1, 0, 0), 15362306a36Sopenharmony_ci { } 15462306a36Sopenharmony_ci}; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistatic struct clk_rcg2 rbbmtimer_clk_src = { 15762306a36Sopenharmony_ci .cmd_rcgr = 0x10b0, 15862306a36Sopenharmony_ci .hid_width = 5, 15962306a36Sopenharmony_ci .parent_map = gpu_xo_gpll0_map, 16062306a36Sopenharmony_ci .freq_tbl = ftbl_rbbmtimer_clk_src, 16162306a36Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 16262306a36Sopenharmony_ci .name = "rbbmtimer_clk_src", 16362306a36Sopenharmony_ci .parent_data = gpu_xo_gpll0, 16462306a36Sopenharmony_ci .num_parents = ARRAY_SIZE(gpu_xo_gpll0), 16562306a36Sopenharmony_ci .ops = &clk_rcg2_ops, 16662306a36Sopenharmony_ci }, 16762306a36Sopenharmony_ci}; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic const struct freq_tbl ftbl_gfx3d_isense_clk_src[] = { 17062306a36Sopenharmony_ci F(19200000, P_XO, 1, 0, 0), 17162306a36Sopenharmony_ci F(40000000, P_GPLL0, 15, 0, 0), 17262306a36Sopenharmony_ci F(200000000, P_GPLL0, 3, 0, 0), 17362306a36Sopenharmony_ci F(300000000, P_GPLL0, 2, 0, 0), 17462306a36Sopenharmony_ci { } 17562306a36Sopenharmony_ci}; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cistatic struct clk_rcg2 gfx3d_isense_clk_src = { 17862306a36Sopenharmony_ci .cmd_rcgr = 0x1100, 17962306a36Sopenharmony_ci .hid_width = 5, 18062306a36Sopenharmony_ci .parent_map = gpu_xo_gpll0_map, 18162306a36Sopenharmony_ci .freq_tbl = ftbl_gfx3d_isense_clk_src, 18262306a36Sopenharmony_ci .clkr.hw.init = &(struct clk_init_data){ 18362306a36Sopenharmony_ci .name = "gfx3d_isense_clk_src", 18462306a36Sopenharmony_ci .parent_data = gpu_xo_gpll0, 18562306a36Sopenharmony_ci .num_parents = ARRAY_SIZE(gpu_xo_gpll0), 18662306a36Sopenharmony_ci .ops = &clk_rcg2_ops, 18762306a36Sopenharmony_ci }, 18862306a36Sopenharmony_ci}; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cistatic struct clk_branch rbcpr_clk = { 19162306a36Sopenharmony_ci .halt_reg = 0x1054, 19262306a36Sopenharmony_ci .clkr = { 19362306a36Sopenharmony_ci .enable_reg = 0x1054, 19462306a36Sopenharmony_ci .enable_mask = BIT(0), 19562306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ 19662306a36Sopenharmony_ci .name = "rbcpr_clk", 19762306a36Sopenharmony_ci .parent_hws = (const struct clk_hw *[]){ &rbcpr_clk_src.clkr.hw }, 19862306a36Sopenharmony_ci .num_parents = 1, 19962306a36Sopenharmony_ci .ops = &clk_branch2_ops, 20062306a36Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 20162306a36Sopenharmony_ci }, 20262306a36Sopenharmony_ci }, 20362306a36Sopenharmony_ci}; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_cistatic struct clk_branch gfx3d_clk = { 20662306a36Sopenharmony_ci .halt_reg = 0x1098, 20762306a36Sopenharmony_ci .clkr = { 20862306a36Sopenharmony_ci .enable_reg = 0x1098, 20962306a36Sopenharmony_ci .enable_mask = BIT(0), 21062306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ 21162306a36Sopenharmony_ci .name = "gfx3d_clk", 21262306a36Sopenharmony_ci .parent_hws = (const struct clk_hw *[]){ &gfx3d_clk_src.clkr.hw }, 21362306a36Sopenharmony_ci .num_parents = 1, 21462306a36Sopenharmony_ci .ops = &clk_branch2_ops, 21562306a36Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 21662306a36Sopenharmony_ci }, 21762306a36Sopenharmony_ci }, 21862306a36Sopenharmony_ci}; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistatic struct clk_branch rbbmtimer_clk = { 22162306a36Sopenharmony_ci .halt_reg = 0x10d0, 22262306a36Sopenharmony_ci .clkr = { 22362306a36Sopenharmony_ci .enable_reg = 0x10d0, 22462306a36Sopenharmony_ci .enable_mask = BIT(0), 22562306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ 22662306a36Sopenharmony_ci .name = "rbbmtimer_clk", 22762306a36Sopenharmony_ci .parent_hws = (const struct clk_hw *[]){ &rbbmtimer_clk_src.clkr.hw }, 22862306a36Sopenharmony_ci .num_parents = 1, 22962306a36Sopenharmony_ci .ops = &clk_branch2_ops, 23062306a36Sopenharmony_ci .flags = CLK_SET_RATE_PARENT, 23162306a36Sopenharmony_ci }, 23262306a36Sopenharmony_ci }, 23362306a36Sopenharmony_ci}; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_cistatic struct clk_branch gfx3d_isense_clk = { 23662306a36Sopenharmony_ci .halt_reg = 0x1124, 23762306a36Sopenharmony_ci .clkr = { 23862306a36Sopenharmony_ci .enable_reg = 0x1124, 23962306a36Sopenharmony_ci .enable_mask = BIT(0), 24062306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ 24162306a36Sopenharmony_ci .name = "gfx3d_isense_clk", 24262306a36Sopenharmony_ci .parent_hws = (const struct clk_hw *[]){ &gfx3d_isense_clk_src.clkr.hw }, 24362306a36Sopenharmony_ci .num_parents = 1, 24462306a36Sopenharmony_ci .ops = &clk_branch2_ops, 24562306a36Sopenharmony_ci }, 24662306a36Sopenharmony_ci }, 24762306a36Sopenharmony_ci}; 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_cistatic struct gdsc gpu_cx_gdsc = { 25062306a36Sopenharmony_ci .gdscr = 0x1004, 25162306a36Sopenharmony_ci .gds_hw_ctrl = 0x1008, 25262306a36Sopenharmony_ci .pd = { 25362306a36Sopenharmony_ci .name = "gpu_cx", 25462306a36Sopenharmony_ci }, 25562306a36Sopenharmony_ci .pwrsts = PWRSTS_OFF_ON, 25662306a36Sopenharmony_ci .flags = VOTABLE, 25762306a36Sopenharmony_ci}; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistatic struct gdsc gpu_gx_gdsc = { 26062306a36Sopenharmony_ci .gdscr = 0x1094, 26162306a36Sopenharmony_ci .clamp_io_ctrl = 0x130, 26262306a36Sopenharmony_ci .resets = (unsigned int []){ GPU_GX_BCR }, 26362306a36Sopenharmony_ci .reset_count = 1, 26462306a36Sopenharmony_ci .cxcs = (unsigned int []){ 0x1098 }, 26562306a36Sopenharmony_ci .cxc_count = 1, 26662306a36Sopenharmony_ci .pd = { 26762306a36Sopenharmony_ci .name = "gpu_gx", 26862306a36Sopenharmony_ci }, 26962306a36Sopenharmony_ci .parent = &gpu_cx_gdsc.pd, 27062306a36Sopenharmony_ci .pwrsts = PWRSTS_OFF_ON | PWRSTS_RET, 27162306a36Sopenharmony_ci .flags = CLAMP_IO | SW_RESET | AON_RESET | NO_RET_PERIPH, 27262306a36Sopenharmony_ci}; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistatic struct clk_regmap *gpucc_msm8998_clocks[] = { 27562306a36Sopenharmony_ci [GPUPLL0] = &gpupll0.clkr, 27662306a36Sopenharmony_ci [GPUPLL0_OUT_EVEN] = &gpupll0_out_even.clkr, 27762306a36Sopenharmony_ci [RBCPR_CLK_SRC] = &rbcpr_clk_src.clkr, 27862306a36Sopenharmony_ci [GFX3D_CLK_SRC] = &gfx3d_clk_src.clkr, 27962306a36Sopenharmony_ci [RBBMTIMER_CLK_SRC] = &rbbmtimer_clk_src.clkr, 28062306a36Sopenharmony_ci [GFX3D_ISENSE_CLK_SRC] = &gfx3d_isense_clk_src.clkr, 28162306a36Sopenharmony_ci [RBCPR_CLK] = &rbcpr_clk.clkr, 28262306a36Sopenharmony_ci [GFX3D_CLK] = &gfx3d_clk.clkr, 28362306a36Sopenharmony_ci [RBBMTIMER_CLK] = &rbbmtimer_clk.clkr, 28462306a36Sopenharmony_ci [GFX3D_ISENSE_CLK] = &gfx3d_isense_clk.clkr, 28562306a36Sopenharmony_ci [GPUCC_CXO_CLK] = &gpucc_cxo_clk.clkr, 28662306a36Sopenharmony_ci}; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_cistatic struct gdsc *gpucc_msm8998_gdscs[] = { 28962306a36Sopenharmony_ci [GPU_CX_GDSC] = &gpu_cx_gdsc, 29062306a36Sopenharmony_ci [GPU_GX_GDSC] = &gpu_gx_gdsc, 29162306a36Sopenharmony_ci}; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_cistatic const struct qcom_reset_map gpucc_msm8998_resets[] = { 29462306a36Sopenharmony_ci [GPU_CX_BCR] = { 0x1000 }, 29562306a36Sopenharmony_ci [RBCPR_BCR] = { 0x1050 }, 29662306a36Sopenharmony_ci [GPU_GX_BCR] = { 0x1090 }, 29762306a36Sopenharmony_ci [GPU_ISENSE_BCR] = { 0x1120 }, 29862306a36Sopenharmony_ci}; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_cistatic const struct regmap_config gpucc_msm8998_regmap_config = { 30162306a36Sopenharmony_ci .reg_bits = 32, 30262306a36Sopenharmony_ci .reg_stride = 4, 30362306a36Sopenharmony_ci .val_bits = 32, 30462306a36Sopenharmony_ci .max_register = 0x9000, 30562306a36Sopenharmony_ci .fast_io = true, 30662306a36Sopenharmony_ci}; 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cistatic const struct qcom_cc_desc gpucc_msm8998_desc = { 30962306a36Sopenharmony_ci .config = &gpucc_msm8998_regmap_config, 31062306a36Sopenharmony_ci .clks = gpucc_msm8998_clocks, 31162306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(gpucc_msm8998_clocks), 31262306a36Sopenharmony_ci .resets = gpucc_msm8998_resets, 31362306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(gpucc_msm8998_resets), 31462306a36Sopenharmony_ci .gdscs = gpucc_msm8998_gdscs, 31562306a36Sopenharmony_ci .num_gdscs = ARRAY_SIZE(gpucc_msm8998_gdscs), 31662306a36Sopenharmony_ci}; 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_cistatic const struct of_device_id gpucc_msm8998_match_table[] = { 31962306a36Sopenharmony_ci { .compatible = "qcom,msm8998-gpucc" }, 32062306a36Sopenharmony_ci { } 32162306a36Sopenharmony_ci}; 32262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, gpucc_msm8998_match_table); 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_cistatic int gpucc_msm8998_probe(struct platform_device *pdev) 32562306a36Sopenharmony_ci{ 32662306a36Sopenharmony_ci struct regmap *regmap; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci regmap = qcom_cc_map(pdev, &gpucc_msm8998_desc); 32962306a36Sopenharmony_ci if (IS_ERR(regmap)) 33062306a36Sopenharmony_ci return PTR_ERR(regmap); 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci /* force periph logic on to avoid perf counter corruption */ 33362306a36Sopenharmony_ci regmap_write_bits(regmap, gfx3d_clk.clkr.enable_reg, BIT(13), BIT(13)); 33462306a36Sopenharmony_ci /* tweak droop detector (GPUCC_GPU_DD_WRAP_CTRL) to reduce leakage */ 33562306a36Sopenharmony_ci regmap_write_bits(regmap, gfx3d_clk.clkr.enable_reg, BIT(0), BIT(0)); 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci return qcom_cc_really_probe(pdev, &gpucc_msm8998_desc, regmap); 33862306a36Sopenharmony_ci} 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_cistatic struct platform_driver gpucc_msm8998_driver = { 34162306a36Sopenharmony_ci .probe = gpucc_msm8998_probe, 34262306a36Sopenharmony_ci .driver = { 34362306a36Sopenharmony_ci .name = "gpucc-msm8998", 34462306a36Sopenharmony_ci .of_match_table = gpucc_msm8998_match_table, 34562306a36Sopenharmony_ci }, 34662306a36Sopenharmony_ci}; 34762306a36Sopenharmony_cimodule_platform_driver(gpucc_msm8998_driver); 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ciMODULE_DESCRIPTION("QCOM GPUCC MSM8998 Driver"); 35062306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 351