Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (c) 2020, The Linux Foundation. All rights reserved.
0004  * Copyright (c) 2021, Linaro Ltd.
0005  */
0006 
0007 #include <linux/err.h>
0008 #include <linux/kernel.h>
0009 #include <linux/module.h>
0010 #include <linux/of_device.h>
0011 #include <linux/of.h>
0012 #include <linux/regmap.h>
0013 
0014 #include <dt-bindings/clock/qcom,dispcc-qcm2290.h>
0015 
0016 #include "clk-alpha-pll.h"
0017 #include "clk-branch.h"
0018 #include "clk-rcg.h"
0019 #include "clk-regmap.h"
0020 #include "clk-regmap-divider.h"
0021 #include "common.h"
0022 #include "gdsc.h"
0023 
0024 enum {
0025     P_BI_TCXO,
0026     P_DISP_CC_PLL0_OUT_MAIN,
0027     P_DSI0_PHY_PLL_OUT_BYTECLK,
0028     P_DSI0_PHY_PLL_OUT_DSICLK,
0029     P_DSI1_PHY_PLL_OUT_DSICLK,
0030     P_GPLL0_OUT_MAIN,
0031     P_SLEEP_CLK,
0032 };
0033 
0034 static const struct pll_vco spark_vco[] = {
0035     { 500000000, 1000000000, 2 },
0036 };
0037 
0038 /* 768MHz configuration */
0039 static const struct alpha_pll_config disp_cc_pll0_config = {
0040     .l = 0x28,
0041     .alpha = 0x0,
0042     .alpha_en_mask = BIT(24),
0043     .vco_val = 0x2 << 20,
0044     .vco_mask = GENMASK(21, 20),
0045     .main_output_mask = BIT(0),
0046     .config_ctl_val = 0x4001055B,
0047 };
0048 
0049 static struct clk_alpha_pll disp_cc_pll0 = {
0050     .offset = 0x0,
0051     .vco_table = spark_vco,
0052     .num_vco = ARRAY_SIZE(spark_vco),
0053     .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
0054     .clkr = {
0055         .hw.init = &(struct clk_init_data){
0056             .name = "disp_cc_pll0",
0057             .parent_data = &(const struct clk_parent_data){
0058                 .fw_name = "bi_tcxo",
0059             },
0060             .num_parents = 1,
0061             .ops = &clk_alpha_pll_ops,
0062         },
0063     },
0064 };
0065 
0066 static const struct parent_map disp_cc_parent_map_0[] = {
0067     { P_BI_TCXO, 0 },
0068     { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
0069 };
0070 
0071 static const struct clk_parent_data disp_cc_parent_data_0[] = {
0072     { .fw_name = "bi_tcxo" },
0073     { .fw_name = "dsi0_phy_pll_out_byteclk" },
0074     { .fw_name = "core_bi_pll_test_se" },
0075 };
0076 
0077 static const struct parent_map disp_cc_parent_map_1[] = {
0078     { P_BI_TCXO, 0 },
0079 };
0080 
0081 static const struct clk_parent_data disp_cc_parent_data_1[] = {
0082     { .fw_name = "bi_tcxo" },
0083     { .fw_name = "core_bi_pll_test_se" },
0084 };
0085 
0086 static const struct parent_map disp_cc_parent_map_2[] = {
0087     { P_BI_TCXO, 0 },
0088     { P_GPLL0_OUT_MAIN, 4 },
0089 };
0090 
0091 static const struct clk_parent_data disp_cc_parent_data_2[] = {
0092     { .fw_name = "bi_tcxo_ao" },
0093     { .fw_name = "gcc_disp_gpll0_div_clk_src" },
0094     { .fw_name = "core_bi_pll_test_se" },
0095 };
0096 
0097 static const struct parent_map disp_cc_parent_map_3[] = {
0098     { P_BI_TCXO, 0 },
0099     { P_DISP_CC_PLL0_OUT_MAIN, 1 },
0100     { P_GPLL0_OUT_MAIN, 4 },
0101 };
0102 
0103 static const struct clk_parent_data disp_cc_parent_data_3[] = {
0104     { .fw_name = "bi_tcxo" },
0105     { .hw = &disp_cc_pll0.clkr.hw },
0106     { .fw_name = "gcc_disp_gpll0_clk_src" },
0107     { .fw_name = "core_bi_pll_test_se" },
0108 };
0109 
0110 static const struct parent_map disp_cc_parent_map_4[] = {
0111     { P_BI_TCXO, 0 },
0112     { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
0113     { P_DSI1_PHY_PLL_OUT_DSICLK, 2 },
0114 };
0115 
0116 static const struct clk_parent_data disp_cc_parent_data_4[] = {
0117     { .fw_name = "bi_tcxo" },
0118     { .fw_name = "dsi0_phy_pll_out_dsiclk" },
0119     { .fw_name = "dsi1_phy_pll_out_dsiclk" },
0120     { .fw_name = "core_bi_pll_test_se" },
0121 };
0122 
0123 static const struct parent_map disp_cc_parent_map_5[] = {
0124     { P_SLEEP_CLK, 0 },
0125 };
0126 
0127 static const struct clk_parent_data disp_cc_parent_data_5[] = {
0128     { .fw_name = "sleep_clk" },
0129     { .fw_name = "core_bi_pll_test_se" },
0130 };
0131 
0132 static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
0133     .cmd_rcgr = 0x20a4,
0134     .mnd_width = 0,
0135     .hid_width = 5,
0136     .parent_map = disp_cc_parent_map_0,
0137     .clkr.hw.init = &(struct clk_init_data){
0138         .name = "disp_cc_mdss_byte0_clk_src",
0139         .parent_data = disp_cc_parent_data_0,
0140         .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
0141         /* For set_rate and set_parent to succeed, parent(s) must be enabled */
0142         .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
0143         .ops = &clk_byte2_ops,
0144     },
0145 };
0146 
0147 static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
0148     .reg = 0x20bc,
0149     .shift = 0,
0150     .width = 2,
0151     .clkr.hw.init = &(struct clk_init_data) {
0152         .name = "disp_cc_mdss_byte0_div_clk_src",
0153         .parent_hws = (const struct clk_hw*[]){
0154             &disp_cc_mdss_byte0_clk_src.clkr.hw,
0155         },
0156         .num_parents = 1,
0157         .ops = &clk_regmap_div_ops,
0158     },
0159 };
0160 
0161 static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
0162     F(19200000, P_BI_TCXO, 1, 0, 0),
0163     F(37500000, P_GPLL0_OUT_MAIN, 8, 0, 0),
0164     F(75000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
0165     { }
0166 };
0167 
0168 static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
0169     .cmd_rcgr = 0x2154,
0170     .mnd_width = 0,
0171     .hid_width = 5,
0172     .parent_map = disp_cc_parent_map_2,
0173     .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
0174     .clkr.hw.init = &(struct clk_init_data){
0175         .name = "disp_cc_mdss_ahb_clk_src",
0176         .parent_data = disp_cc_parent_data_2,
0177         .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
0178         .ops = &clk_rcg2_shared_ops,
0179     },
0180 };
0181 
0182 static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = {
0183     F(19200000, P_BI_TCXO, 1, 0, 0),
0184     { }
0185 };
0186 
0187 static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
0188     .cmd_rcgr = 0x20c0,
0189     .mnd_width = 0,
0190     .hid_width = 5,
0191     .parent_map = disp_cc_parent_map_0,
0192     .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
0193     .clkr.hw.init = &(struct clk_init_data){
0194         .name = "disp_cc_mdss_esc0_clk_src",
0195         .parent_data = disp_cc_parent_data_0,
0196         .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
0197         .ops = &clk_rcg2_ops,
0198     },
0199 };
0200 
0201 static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
0202     F(19200000, P_BI_TCXO, 1, 0, 0),
0203     F(192000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
0204     F(256000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
0205     F(307200000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
0206     F(384000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
0207     { }
0208 };
0209 
0210 static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
0211     .cmd_rcgr = 0x2074,
0212     .mnd_width = 0,
0213     .hid_width = 5,
0214     .parent_map = disp_cc_parent_map_3,
0215     .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
0216     .clkr.hw.init = &(struct clk_init_data){
0217         .name = "disp_cc_mdss_mdp_clk_src",
0218         .parent_data = disp_cc_parent_data_3,
0219         .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
0220         .flags = CLK_SET_RATE_PARENT,
0221         .ops = &clk_rcg2_shared_ops,
0222     },
0223 };
0224 
0225 static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
0226     .cmd_rcgr = 0x205c,
0227     .mnd_width = 8,
0228     .hid_width = 5,
0229     .parent_map = disp_cc_parent_map_4,
0230     .clkr.hw.init = &(struct clk_init_data){
0231         .name = "disp_cc_mdss_pclk0_clk_src",
0232         .parent_data = disp_cc_parent_data_4,
0233         .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
0234         /* For set_rate and set_parent to succeed, parent(s) must be enabled */
0235         .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
0236         .ops = &clk_pixel_ops,
0237     },
0238 };
0239 
0240 static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
0241     .cmd_rcgr = 0x208c,
0242     .mnd_width = 0,
0243     .hid_width = 5,
0244     .parent_map = disp_cc_parent_map_1,
0245     .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
0246     .clkr.hw.init = &(struct clk_init_data){
0247         .name = "disp_cc_mdss_vsync_clk_src",
0248         .parent_data = disp_cc_parent_data_1,
0249         .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
0250         .flags = CLK_SET_RATE_PARENT,
0251         .ops = &clk_rcg2_shared_ops,
0252     },
0253 };
0254 
0255 static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = {
0256     F(32764, P_SLEEP_CLK, 1, 0, 0),
0257     { }
0258 };
0259 
0260 static struct clk_rcg2 disp_cc_sleep_clk_src = {
0261     .cmd_rcgr = 0x6050,
0262     .mnd_width = 0,
0263     .hid_width = 5,
0264     .parent_map = disp_cc_parent_map_5,
0265     .freq_tbl = ftbl_disp_cc_sleep_clk_src,
0266     .clkr.hw.init = &(struct clk_init_data){
0267         .name = "disp_cc_sleep_clk_src",
0268         .parent_data = disp_cc_parent_data_5,
0269         .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
0270         .ops = &clk_rcg2_ops,
0271     },
0272 };
0273 
0274 static struct clk_branch disp_cc_mdss_ahb_clk = {
0275     .halt_reg = 0x2044,
0276     .halt_check = BRANCH_HALT,
0277     .clkr = {
0278         .enable_reg = 0x2044,
0279         .enable_mask = BIT(0),
0280         .hw.init = &(struct clk_init_data){
0281             .name = "disp_cc_mdss_ahb_clk",
0282             .parent_hws = (const struct clk_hw*[]){
0283                 &disp_cc_mdss_ahb_clk_src.clkr.hw,
0284             },
0285             .num_parents = 1,
0286             .flags = CLK_SET_RATE_PARENT,
0287             .ops = &clk_branch2_ops,
0288         },
0289     },
0290 };
0291 
0292 static struct clk_branch disp_cc_mdss_byte0_clk = {
0293     .halt_reg = 0x201c,
0294     .halt_check = BRANCH_HALT,
0295     .clkr = {
0296         .enable_reg = 0x201c,
0297         .enable_mask = BIT(0),
0298         .hw.init = &(struct clk_init_data){
0299             .name = "disp_cc_mdss_byte0_clk",
0300             .parent_hws = (const struct clk_hw*[]){
0301                 &disp_cc_mdss_byte0_clk_src.clkr.hw,
0302             },
0303             .num_parents = 1,
0304             .flags = CLK_SET_RATE_PARENT,
0305             .ops = &clk_branch2_ops,
0306         },
0307     },
0308 };
0309 
0310 static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
0311     .halt_reg = 0x2020,
0312     .halt_check = BRANCH_HALT,
0313     .clkr = {
0314         .enable_reg = 0x2020,
0315         .enable_mask = BIT(0),
0316         .hw.init = &(struct clk_init_data){
0317             .name = "disp_cc_mdss_byte0_intf_clk",
0318             .parent_hws = (const struct clk_hw*[]){
0319                 &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
0320             },
0321             .num_parents = 1,
0322             .flags = CLK_SET_RATE_PARENT,
0323             .ops = &clk_branch2_ops,
0324         },
0325     },
0326 };
0327 
0328 static struct clk_branch disp_cc_mdss_esc0_clk = {
0329     .halt_reg = 0x2024,
0330     .halt_check = BRANCH_HALT,
0331     .clkr = {
0332         .enable_reg = 0x2024,
0333         .enable_mask = BIT(0),
0334         .hw.init = &(struct clk_init_data){
0335             .name = "disp_cc_mdss_esc0_clk",
0336             .parent_hws = (const struct clk_hw*[]){
0337                 &disp_cc_mdss_esc0_clk_src.clkr.hw,
0338             },
0339             .num_parents = 1,
0340             .flags = CLK_SET_RATE_PARENT,
0341             .ops = &clk_branch2_ops,
0342         },
0343     },
0344 };
0345 
0346 static struct clk_branch disp_cc_mdss_mdp_clk = {
0347     .halt_reg = 0x2008,
0348     .halt_check = BRANCH_HALT,
0349     .clkr = {
0350         .enable_reg = 0x2008,
0351         .enable_mask = BIT(0),
0352         .hw.init = &(struct clk_init_data){
0353             .name = "disp_cc_mdss_mdp_clk",
0354             .parent_hws = (const struct clk_hw*[]){
0355                 &disp_cc_mdss_mdp_clk_src.clkr.hw,
0356             },
0357             .num_parents = 1,
0358             .flags = CLK_SET_RATE_PARENT,
0359             .ops = &clk_branch2_ops,
0360         },
0361     },
0362 };
0363 
0364 static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
0365     .halt_reg = 0x2010,
0366     .halt_check = BRANCH_HALT_VOTED,
0367     .clkr = {
0368         .enable_reg = 0x2010,
0369         .enable_mask = BIT(0),
0370         .hw.init = &(struct clk_init_data){
0371             .name = "disp_cc_mdss_mdp_lut_clk",
0372             .parent_hws = (const struct clk_hw*[]){
0373                 &disp_cc_mdss_mdp_clk_src.clkr.hw,
0374             },
0375             .num_parents = 1,
0376             .flags = CLK_SET_RATE_PARENT,
0377             .ops = &clk_branch2_ops,
0378         },
0379     },
0380 };
0381 
0382 static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
0383     .halt_reg = 0x4004,
0384     .halt_check = BRANCH_HALT_VOTED,
0385     .clkr = {
0386         .enable_reg = 0x4004,
0387         .enable_mask = BIT(0),
0388         .hw.init = &(struct clk_init_data){
0389             .name = "disp_cc_mdss_non_gdsc_ahb_clk",
0390             .parent_hws = (const struct clk_hw*[]){
0391                 &disp_cc_mdss_ahb_clk_src.clkr.hw,
0392             },
0393             .num_parents = 1,
0394             .flags = CLK_SET_RATE_PARENT,
0395             .ops = &clk_branch2_ops,
0396         },
0397     },
0398 };
0399 
0400 static struct clk_branch disp_cc_mdss_pclk0_clk = {
0401     .halt_reg = 0x2004,
0402     .halt_check = BRANCH_HALT,
0403     .clkr = {
0404         .enable_reg = 0x2004,
0405         .enable_mask = BIT(0),
0406         .hw.init = &(struct clk_init_data){
0407             .name = "disp_cc_mdss_pclk0_clk",
0408             .parent_hws = (const struct clk_hw*[]){
0409                 &disp_cc_mdss_pclk0_clk_src.clkr.hw,
0410             },
0411             .num_parents = 1,
0412             .flags = CLK_SET_RATE_PARENT,
0413             .ops = &clk_branch2_ops,
0414         },
0415     },
0416 };
0417 
0418 static struct clk_branch disp_cc_mdss_vsync_clk = {
0419     .halt_reg = 0x2018,
0420     .halt_check = BRANCH_HALT,
0421     .clkr = {
0422         .enable_reg = 0x2018,
0423         .enable_mask = BIT(0),
0424         .hw.init = &(struct clk_init_data){
0425             .name = "disp_cc_mdss_vsync_clk",
0426             .parent_hws = (const struct clk_hw*[]){
0427                 &disp_cc_mdss_vsync_clk_src.clkr.hw,
0428             },
0429             .num_parents = 1,
0430             .flags = CLK_SET_RATE_PARENT,
0431             .ops = &clk_branch2_ops,
0432         },
0433     },
0434 };
0435 
0436 static struct clk_branch disp_cc_sleep_clk = {
0437     .halt_reg = 0x6068,
0438     .halt_check = BRANCH_HALT,
0439     .clkr = {
0440         .enable_reg = 0x6068,
0441         .enable_mask = BIT(0),
0442         .hw.init = &(struct clk_init_data){
0443             .name = "disp_cc_sleep_clk",
0444             .parent_hws = (const struct clk_hw*[]){
0445                 &disp_cc_sleep_clk_src.clkr.hw,
0446             },
0447             .num_parents = 1,
0448             .flags = CLK_SET_RATE_PARENT,
0449             .ops = &clk_branch2_ops,
0450         },
0451     },
0452 };
0453 
0454 static struct gdsc mdss_gdsc = {
0455     .gdscr = 0x3000,
0456     .pd = {
0457         .name = "mdss_gdsc",
0458     },
0459     .pwrsts = PWRSTS_OFF_ON,
0460     .flags = HW_CTRL,
0461 };
0462 
0463 static struct gdsc *disp_cc_qcm2290_gdscs[] = {
0464     [MDSS_GDSC] = &mdss_gdsc,
0465 };
0466 
0467 static struct clk_regmap *disp_cc_qcm2290_clocks[] = {
0468     [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
0469     [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
0470     [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
0471     [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
0472     [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
0473     [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
0474     [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
0475     [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
0476     [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
0477     [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
0478     [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
0479     [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
0480     [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
0481     [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
0482     [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
0483     [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
0484     [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
0485     [DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
0486     [DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr,
0487 };
0488 
0489 static const struct regmap_config disp_cc_qcm2290_regmap_config = {
0490     .reg_bits = 32,
0491     .reg_stride = 4,
0492     .val_bits = 32,
0493     .max_register = 0x10000,
0494     .fast_io = true,
0495 };
0496 
0497 static const struct qcom_cc_desc disp_cc_qcm2290_desc = {
0498     .config = &disp_cc_qcm2290_regmap_config,
0499     .clks = disp_cc_qcm2290_clocks,
0500     .num_clks = ARRAY_SIZE(disp_cc_qcm2290_clocks),
0501     .gdscs = disp_cc_qcm2290_gdscs,
0502     .num_gdscs = ARRAY_SIZE(disp_cc_qcm2290_gdscs),
0503 };
0504 
0505 static const struct of_device_id disp_cc_qcm2290_match_table[] = {
0506     { .compatible = "qcom,qcm2290-dispcc" },
0507     { }
0508 };
0509 MODULE_DEVICE_TABLE(of, disp_cc_qcm2290_match_table);
0510 
0511 static int disp_cc_qcm2290_probe(struct platform_device *pdev)
0512 {
0513     struct regmap *regmap;
0514     int ret;
0515 
0516     regmap = qcom_cc_map(pdev, &disp_cc_qcm2290_desc);
0517     if (IS_ERR(regmap))
0518         return PTR_ERR(regmap);
0519 
0520     clk_alpha_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
0521 
0522     /* Keep DISP_CC_XO_CLK always-ON */
0523     regmap_update_bits(regmap, 0x604c, BIT(0), BIT(0));
0524 
0525     ret = qcom_cc_really_probe(pdev, &disp_cc_qcm2290_desc, regmap);
0526     if (ret) {
0527         dev_err(&pdev->dev, "Failed to register DISP CC clocks\n");
0528         return ret;
0529     }
0530 
0531     return ret;
0532 }
0533 
0534 static struct platform_driver disp_cc_qcm2290_driver = {
0535     .probe = disp_cc_qcm2290_probe,
0536     .driver = {
0537         .name = "dispcc-qcm2290",
0538         .of_match_table = disp_cc_qcm2290_match_table,
0539     },
0540 };
0541 
0542 static int __init disp_cc_qcm2290_init(void)
0543 {
0544     return platform_driver_register(&disp_cc_qcm2290_driver);
0545 }
0546 subsys_initcall(disp_cc_qcm2290_init);
0547 
0548 static void __exit disp_cc_qcm2290_exit(void)
0549 {
0550     platform_driver_unregister(&disp_cc_qcm2290_driver);
0551 }
0552 module_exit(disp_cc_qcm2290_exit);
0553 
0554 MODULE_DESCRIPTION("QTI DISP_CC qcm2290 Driver");
0555 MODULE_LICENSE("GPL v2");