linux/drivers/gpu/drm/msm/dsi/dsi_cfg.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2015, The Linux Foundation. All rights reserved.
   4 */
   5
   6#include "dsi_cfg.h"
   7
   8static const char * const dsi_v2_bus_clk_names[] = {
   9        "core_mmss", "iface", "bus",
  10};
  11
  12static const struct msm_dsi_config apq8064_dsi_cfg = {
  13        .io_offset = 0,
  14        .reg_cfg = {
  15                .num = 3,
  16                .regs = {
  17                        {"vdda", 100000, 100},  /* 1.2 V */
  18                        {"avdd", 10000, 100},   /* 3.0 V */
  19                        {"vddio", 100000, 100}, /* 1.8 V */
  20                },
  21        },
  22        .bus_clk_names = dsi_v2_bus_clk_names,
  23        .num_bus_clks = ARRAY_SIZE(dsi_v2_bus_clk_names),
  24        .io_start = { 0x4700000, 0x5800000 },
  25        .num_dsi = 2,
  26};
  27
  28static const char * const dsi_6g_bus_clk_names[] = {
  29        "mdp_core", "iface", "bus", "core_mmss",
  30};
  31
  32static const struct msm_dsi_config msm8974_apq8084_dsi_cfg = {
  33        .io_offset = DSI_6G_REG_SHIFT,
  34        .reg_cfg = {
  35                .num = 4,
  36                .regs = {
  37                        {"gdsc", -1, -1},
  38                        {"vdd", 150000, 100},   /* 3.0 V */
  39                        {"vdda", 100000, 100},  /* 1.2 V */
  40                        {"vddio", 100000, 100}, /* 1.8 V */
  41                },
  42        },
  43        .bus_clk_names = dsi_6g_bus_clk_names,
  44        .num_bus_clks = ARRAY_SIZE(dsi_6g_bus_clk_names),
  45        .io_start = { 0xfd922800, 0xfd922b00 },
  46        .num_dsi = 2,
  47};
  48
  49static const char * const dsi_8916_bus_clk_names[] = {
  50        "mdp_core", "iface", "bus",
  51};
  52
  53static const struct msm_dsi_config msm8916_dsi_cfg = {
  54        .io_offset = DSI_6G_REG_SHIFT,
  55        .reg_cfg = {
  56                .num = 3,
  57                .regs = {
  58                        {"gdsc", -1, -1},
  59                        {"vdda", 100000, 100},  /* 1.2 V */
  60                        {"vddio", 100000, 100}, /* 1.8 V */
  61                },
  62        },
  63        .bus_clk_names = dsi_8916_bus_clk_names,
  64        .num_bus_clks = ARRAY_SIZE(dsi_8916_bus_clk_names),
  65        .io_start = { 0x1a98000 },
  66        .num_dsi = 1,
  67};
  68
  69static const char * const dsi_8976_bus_clk_names[] = {
  70        "mdp_core", "iface", "bus",
  71};
  72
  73static const struct msm_dsi_config msm8976_dsi_cfg = {
  74        .io_offset = DSI_6G_REG_SHIFT,
  75        .reg_cfg = {
  76                .num = 3,
  77                .regs = {
  78                        {"gdsc", -1, -1},
  79                        {"vdda", 100000, 100},  /* 1.2 V */
  80                        {"vddio", 100000, 100}, /* 1.8 V */
  81                },
  82        },
  83        .bus_clk_names = dsi_8976_bus_clk_names,
  84        .num_bus_clks = ARRAY_SIZE(dsi_8976_bus_clk_names),
  85        .io_start = { 0x1a94000, 0x1a96000 },
  86        .num_dsi = 2,
  87};
  88
  89static const struct msm_dsi_config msm8994_dsi_cfg = {
  90        .io_offset = DSI_6G_REG_SHIFT,
  91        .reg_cfg = {
  92                .num = 7,
  93                .regs = {
  94                        {"gdsc", -1, -1},
  95                        {"vdda", 100000, 100},  /* 1.25 V */
  96                        {"vddio", 100000, 100}, /* 1.8 V */
  97                        {"vcca", 10000, 100},   /* 1.0 V */
  98                        {"vdd", 100000, 100},   /* 1.8 V */
  99                        {"lab_reg", -1, -1},
 100                        {"ibb_reg", -1, -1},
 101                },
 102        },
 103        .bus_clk_names = dsi_6g_bus_clk_names,
 104        .num_bus_clks = ARRAY_SIZE(dsi_6g_bus_clk_names),
 105        .io_start = { 0xfd998000, 0xfd9a0000 },
 106        .num_dsi = 2,
 107};
 108
 109static const char * const dsi_8996_bus_clk_names[] = {
 110        "mdp_core", "iface", "bus", "core_mmss",
 111};
 112
 113static const struct msm_dsi_config msm8996_dsi_cfg = {
 114        .io_offset = DSI_6G_REG_SHIFT,
 115        .reg_cfg = {
 116                .num = 2,
 117                .regs = {
 118                        {"vdda", 18160, 1 },    /* 1.25 V */
 119                        {"vcca", 17000, 32 },   /* 0.925 V */
 120                        {"vddio", 100000, 100 },/* 1.8 V */
 121                },
 122        },
 123        .bus_clk_names = dsi_8996_bus_clk_names,
 124        .num_bus_clks = ARRAY_SIZE(dsi_8996_bus_clk_names),
 125        .io_start = { 0x994000, 0x996000 },
 126        .num_dsi = 2,
 127};
 128
 129static const char * const dsi_msm8998_bus_clk_names[] = {
 130        "iface", "bus", "core",
 131};
 132
 133static const struct msm_dsi_config msm8998_dsi_cfg = {
 134        .io_offset = DSI_6G_REG_SHIFT,
 135        .reg_cfg = {
 136                .num = 2,
 137                .regs = {
 138                        {"vdd", 367000, 16 },   /* 0.9 V */
 139                        {"vdda", 62800, 2 },    /* 1.2 V */
 140                },
 141        },
 142        .bus_clk_names = dsi_msm8998_bus_clk_names,
 143        .num_bus_clks = ARRAY_SIZE(dsi_msm8998_bus_clk_names),
 144        .io_start = { 0xc994000, 0xc996000 },
 145        .num_dsi = 2,
 146};
 147
 148static const char * const dsi_sdm660_bus_clk_names[] = {
 149        "iface", "bus", "core", "core_mmss",
 150};
 151
 152static const struct msm_dsi_config sdm660_dsi_cfg = {
 153        .io_offset = DSI_6G_REG_SHIFT,
 154        .reg_cfg = {
 155                .num = 2,
 156                .regs = {
 157                        {"vdda", 12560, 4 },    /* 1.2 V */
 158                },
 159        },
 160        .bus_clk_names = dsi_sdm660_bus_clk_names,
 161        .num_bus_clks = ARRAY_SIZE(dsi_sdm660_bus_clk_names),
 162        .io_start = { 0xc994000, 0xc996000 },
 163        .num_dsi = 2,
 164};
 165
 166static const char * const dsi_sdm845_bus_clk_names[] = {
 167        "iface", "bus",
 168};
 169
 170static const char * const dsi_sc7180_bus_clk_names[] = {
 171        "iface", "bus",
 172};
 173
 174static const struct msm_dsi_config sdm845_dsi_cfg = {
 175        .io_offset = DSI_6G_REG_SHIFT,
 176        .reg_cfg = {
 177                .num = 1,
 178                .regs = {
 179                        {"vdda", 21800, 4 },    /* 1.2 V */
 180                },
 181        },
 182        .bus_clk_names = dsi_sdm845_bus_clk_names,
 183        .num_bus_clks = ARRAY_SIZE(dsi_sdm845_bus_clk_names),
 184        .io_start = { 0xae94000, 0xae96000 },
 185        .num_dsi = 2,
 186};
 187
 188static const struct msm_dsi_config sc7180_dsi_cfg = {
 189        .io_offset = DSI_6G_REG_SHIFT,
 190        .reg_cfg = {
 191                .num = 1,
 192                .regs = {
 193                        {"vdda", 21800, 4 },    /* 1.2 V */
 194                },
 195        },
 196        .bus_clk_names = dsi_sc7180_bus_clk_names,
 197        .num_bus_clks = ARRAY_SIZE(dsi_sc7180_bus_clk_names),
 198        .io_start = { 0xae94000 },
 199        .num_dsi = 1,
 200};
 201
 202static const struct msm_dsi_host_cfg_ops msm_dsi_v2_host_ops = {
 203        .link_clk_set_rate = dsi_link_clk_set_rate_v2,
 204        .link_clk_enable = dsi_link_clk_enable_v2,
 205        .link_clk_disable = dsi_link_clk_disable_v2,
 206        .clk_init_ver = dsi_clk_init_v2,
 207        .tx_buf_alloc = dsi_tx_buf_alloc_v2,
 208        .tx_buf_get = dsi_tx_buf_get_v2,
 209        .tx_buf_put = NULL,
 210        .dma_base_get = dsi_dma_base_get_v2,
 211        .calc_clk_rate = dsi_calc_clk_rate_v2,
 212};
 213
 214static const struct msm_dsi_host_cfg_ops msm_dsi_6g_host_ops = {
 215        .link_clk_set_rate = dsi_link_clk_set_rate_6g,
 216        .link_clk_enable = dsi_link_clk_enable_6g,
 217        .link_clk_disable = dsi_link_clk_disable_6g,
 218        .clk_init_ver = NULL,
 219        .tx_buf_alloc = dsi_tx_buf_alloc_6g,
 220        .tx_buf_get = dsi_tx_buf_get_6g,
 221        .tx_buf_put = dsi_tx_buf_put_6g,
 222        .dma_base_get = dsi_dma_base_get_6g,
 223        .calc_clk_rate = dsi_calc_clk_rate_6g,
 224};
 225
 226static const struct msm_dsi_host_cfg_ops msm_dsi_6g_v2_host_ops = {
 227        .link_clk_set_rate = dsi_link_clk_set_rate_6g,
 228        .link_clk_enable = dsi_link_clk_enable_6g,
 229        .link_clk_disable = dsi_link_clk_disable_6g,
 230        .clk_init_ver = dsi_clk_init_6g_v2,
 231        .tx_buf_alloc = dsi_tx_buf_alloc_6g,
 232        .tx_buf_get = dsi_tx_buf_get_6g,
 233        .tx_buf_put = dsi_tx_buf_put_6g,
 234        .dma_base_get = dsi_dma_base_get_6g,
 235        .calc_clk_rate = dsi_calc_clk_rate_6g,
 236};
 237
 238static const struct msm_dsi_cfg_handler dsi_cfg_handlers[] = {
 239        {MSM_DSI_VER_MAJOR_V2, MSM_DSI_V2_VER_MINOR_8064,
 240                &apq8064_dsi_cfg, &msm_dsi_v2_host_ops},
 241        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_0,
 242                &msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
 243        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_1,
 244                &msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
 245        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_1_1,
 246                &msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
 247        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_2,
 248                &msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
 249        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3,
 250                &msm8994_dsi_cfg, &msm_dsi_6g_host_ops},
 251        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3_1,
 252                &msm8916_dsi_cfg, &msm_dsi_6g_host_ops},
 253        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_4_1,
 254                &msm8996_dsi_cfg, &msm_dsi_6g_host_ops},
 255        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_4_2,
 256                &msm8976_dsi_cfg, &msm_dsi_6g_host_ops},
 257        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_1_0,
 258                &sdm660_dsi_cfg, &msm_dsi_6g_v2_host_ops},
 259        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_0,
 260                &msm8998_dsi_cfg, &msm_dsi_6g_v2_host_ops},
 261        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_1,
 262                &sdm845_dsi_cfg, &msm_dsi_6g_v2_host_ops},
 263        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_3_0,
 264                &sdm845_dsi_cfg, &msm_dsi_6g_v2_host_ops},
 265        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_4_0,
 266                &sdm845_dsi_cfg, &msm_dsi_6g_v2_host_ops},
 267        {MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_4_1,
 268                &sc7180_dsi_cfg, &msm_dsi_6g_v2_host_ops},
 269};
 270
 271const struct msm_dsi_cfg_handler *msm_dsi_cfg_get(u32 major, u32 minor)
 272{
 273        const struct msm_dsi_cfg_handler *cfg_hnd = NULL;
 274        int i;
 275
 276        for (i = ARRAY_SIZE(dsi_cfg_handlers) - 1; i >= 0; i--) {
 277                if ((dsi_cfg_handlers[i].major == major) &&
 278                        (dsi_cfg_handlers[i].minor == minor)) {
 279                        cfg_hnd = &dsi_cfg_handlers[i];
 280                        break;
 281                }
 282        }
 283
 284        return cfg_hnd;
 285}
 286
 287