linux/drivers/gpu/drm/kmb/kmb_dsi.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only
   2 *
   3 * Copyright © 2019-2020 Intel Corporation
   4 */
   5
   6#ifndef __KMB_DSI_H__
   7#define __KMB_DSI_H__
   8
   9#include <drm/drm_encoder.h>
  10#include <drm/drm_mipi_dsi.h>
  11
  12/* MIPI TX CFG */
  13#define MIPI_TX_LANE_DATA_RATE_MBPS 891
  14#define MIPI_TX_REF_CLK_KHZ         24000
  15#define MIPI_TX_CFG_CLK_KHZ         24000
  16#define MIPI_TX_BPP                 24
  17
  18/* DPHY Tx test codes*/
  19#define TEST_CODE_FSM_CONTROL                           0x03
  20#define TEST_CODE_MULTIPLE_PHY_CTRL                     0x0C
  21#define TEST_CODE_PLL_PROPORTIONAL_CHARGE_PUMP_CTRL     0x0E
  22#define TEST_CODE_PLL_INTEGRAL_CHARGE_PUMP_CTRL         0x0F
  23#define TEST_CODE_PLL_VCO_CTRL                          0x12
  24#define TEST_CODE_PLL_GMP_CTRL                          0x13
  25#define TEST_CODE_PLL_PHASE_ERR_CTRL                    0x14
  26#define TEST_CODE_PLL_LOCK_FILTER                       0x15
  27#define TEST_CODE_PLL_UNLOCK_FILTER                     0x16
  28#define TEST_CODE_PLL_INPUT_DIVIDER                     0x17
  29#define TEST_CODE_PLL_FEEDBACK_DIVIDER                  0x18
  30#define   PLL_FEEDBACK_DIVIDER_HIGH                     BIT(7)
  31#define TEST_CODE_PLL_OUTPUT_CLK_SEL                    0x19
  32#define   PLL_N_OVR_EN                                  BIT(4)
  33#define   PLL_M_OVR_EN                                  BIT(5)
  34#define TEST_CODE_VOD_LEVEL                             0x24
  35#define TEST_CODE_PLL_CHARGE_PUMP_BIAS                  0x1C
  36#define TEST_CODE_PLL_LOCK_DETECTOR                     0x1D
  37#define TEST_CODE_HS_FREQ_RANGE_CFG                     0x44
  38#define TEST_CODE_PLL_ANALOG_PROG                       0x1F
  39#define TEST_CODE_SLEW_RATE_OVERRIDE_CTRL               0xA0
  40#define TEST_CODE_SLEW_RATE_DDL_LOOP_CTRL               0xA3
  41#define TEST_CODE_SLEW_RATE_DDL_CYCLES                  0xA4
  42
  43/* DPHY params */
  44#define PLL_N_MIN       0
  45#define PLL_N_MAX       15
  46#define PLL_M_MIN       62
  47#define PLL_M_MAX       623
  48#define PLL_FVCO_MAX    1250
  49
  50#define TIMEOUT         600
  51
  52#define MIPI_TX_FRAME_GEN                               4
  53#define MIPI_TX_FRAME_GEN_SECTIONS                      4
  54#define MIPI_CTRL_VIRTUAL_CHANNELS                      4
  55#define MIPI_D_LANES_PER_DPHY                           2
  56#define MIPI_CTRL_2LANE_MAX_MC_FIFO_LOC                 255
  57#define MIPI_CTRL_4LANE_MAX_MC_FIFO_LOC                 511
  58/* 2 Data Lanes per D-PHY */
  59#define MIPI_DPHY_D_LANES                               2
  60#define MIPI_DPHY_DEFAULT_BIT_RATES                     63
  61
  62#define KMB_MIPI_DEFAULT_CLK                            24000000
  63#define KMB_MIPI_DEFAULT_CFG_CLK                        24000000
  64
  65#define to_kmb_dsi(x) container_of(x, struct kmb_dsi, base)
  66
  67struct kmb_dsi {
  68        struct drm_encoder base;
  69        struct device *dev;
  70        struct platform_device *pdev;
  71        struct mipi_dsi_host *host;
  72        struct mipi_dsi_device *device;
  73        struct drm_bridge *adv_bridge;
  74        void __iomem *mipi_mmio;
  75        struct clk *clk_mipi;
  76        struct clk *clk_mipi_ecfg;
  77        struct clk *clk_mipi_cfg;
  78        int sys_clk_mhz;
  79};
  80
  81/* DPHY Tx test codes */
  82
  83enum mipi_ctrl_num {
  84        MIPI_CTRL0 = 0,
  85        MIPI_CTRL1,
  86        MIPI_CTRL2,
  87        MIPI_CTRL3,
  88        MIPI_CTRL4,
  89        MIPI_CTRL5,
  90        MIPI_CTRL6,
  91        MIPI_CTRL7,
  92        MIPI_CTRL8,
  93        MIPI_CTRL9,
  94        MIPI_CTRL_NA
  95};
  96
  97enum mipi_dphy_num {
  98        MIPI_DPHY0 = 0,
  99        MIPI_DPHY1,
 100        MIPI_DPHY2,
 101        MIPI_DPHY3,
 102        MIPI_DPHY4,
 103        MIPI_DPHY5,
 104        MIPI_DPHY6,
 105        MIPI_DPHY7,
 106        MIPI_DPHY8,
 107        MIPI_DPHY9,
 108        MIPI_DPHY_NA
 109};
 110
 111enum mipi_dir {
 112        MIPI_RX,
 113        MIPI_TX
 114};
 115
 116enum mipi_ctrl_type {
 117        MIPI_DSI,
 118        MIPI_CSI
 119};
 120
 121enum mipi_data_if {
 122        MIPI_IF_DMA,
 123        MIPI_IF_PARALLEL
 124};
 125
 126enum mipi_data_mode {
 127        MIPI_DATA_MODE0,
 128        MIPI_DATA_MODE1,
 129        MIPI_DATA_MODE2,
 130        MIPI_DATA_MODE3
 131};
 132
 133enum mipi_dsi_video_mode {
 134        DSI_VIDEO_MODE_NO_BURST_PULSE,
 135        DSI_VIDEO_MODE_NO_BURST_EVENT,
 136        DSI_VIDEO_MODE_BURST
 137};
 138
 139enum mipi_dsi_blanking_mode {
 140        TRANSITION_TO_LOW_POWER,
 141        SEND_BLANK_PACKET
 142};
 143
 144enum mipi_dsi_eotp {
 145        DSI_EOTP_DISABLED,
 146        DSI_EOTP_ENABLES
 147};
 148
 149enum mipi_dsi_data_type {
 150        DSI_SP_DT_RESERVED_00 = 0x00,
 151        DSI_SP_DT_VSYNC_START = 0x01,
 152        DSI_SP_DT_COLOR_MODE_OFF = 0x02,
 153        DSI_SP_DT_GENERIC_SHORT_WR = 0x03,
 154        DSI_SP_DT_GENERIC_RD = 0x04,
 155        DSI_SP_DT_DCS_SHORT_WR = 0x05,
 156        DSI_SP_DT_DCS_RD = 0x06,
 157        DSI_SP_DT_EOTP = 0x08,
 158        DSI_LP_DT_NULL = 0x09,
 159        DSI_LP_DT_RESERVED_0A = 0x0a,
 160        DSI_LP_DT_RESERVED_0B = 0x0b,
 161        DSI_LP_DT_LPPS_YCBCR422_20B = 0x0c,
 162        DSI_LP_DT_PPS_RGB101010_30B = 0x0d,
 163        DSI_LP_DT_PPS_RGB565_16B = 0x0e,
 164        DSI_LP_DT_RESERVED_0F = 0x0f,
 165
 166        DSI_SP_DT_RESERVED_10 = 0x10,
 167        DSI_SP_DT_VSYNC_END = 0x11,
 168        DSI_SP_DT_COLOR_MODE_ON = 0x12,
 169        DSI_SP_DT_GENERIC_SHORT_WR_1PAR = 0x13,
 170        DSI_SP_DT_GENERIC_RD_1PAR = 0x14,
 171        DSI_SP_DT_DCS_SHORT_WR_1PAR = 0x15,
 172        DSI_SP_DT_RESERVED_16 = 0x16,
 173        DSI_SP_DT_RESERVED_17 = 0x17,
 174        DSI_SP_DT_RESERVED_18 = 0x18,
 175        DSI_LP_DT_BLANK = 0x19,
 176        DSI_LP_DT_RESERVED_1A = 0x1a,
 177        DSI_LP_DT_RESERVED_1B = 0x1b,
 178        DSI_LP_DT_PPS_YCBCR422_24B = 0x1c,
 179        DSI_LP_DT_PPS_RGB121212_36B = 0x1d,
 180        DSI_LP_DT_PPS_RGB666_18B = 0x1e,
 181        DSI_LP_DT_RESERVED_1F = 0x1f,
 182
 183        DSI_SP_DT_RESERVED_20 = 0x20,
 184        DSI_SP_DT_HSYNC_START = 0x21,
 185        DSI_SP_DT_SHUT_DOWN_PERIPH_CMD = 0x22,
 186        DSI_SP_DT_GENERIC_SHORT_WR_2PAR = 0x23,
 187        DSI_SP_DT_GENERIC_RD_2PAR = 0x24,
 188        DSI_SP_DT_RESERVED_25 = 0x25,
 189        DSI_SP_DT_RESERVED_26 = 0x26,
 190        DSI_SP_DT_RESERVED_27 = 0x27,
 191        DSI_SP_DT_RESERVED_28 = 0x28,
 192        DSI_LP_DT_GENERIC_LONG_WR = 0x29,
 193        DSI_LP_DT_RESERVED_2A = 0x2a,
 194        DSI_LP_DT_RESERVED_2B = 0x2b,
 195        DSI_LP_DT_PPS_YCBCR422_16B = 0x2c,
 196        DSI_LP_DT_RESERVED_2D = 0x2d,
 197        DSI_LP_DT_LPPS_RGB666_18B = 0x2e,
 198        DSI_LP_DT_RESERVED_2F = 0x2f,
 199
 200        DSI_SP_DT_RESERVED_30 = 0x30,
 201        DSI_SP_DT_HSYNC_END = 0x31,
 202        DSI_SP_DT_TURN_ON_PERIPH_CMD = 0x32,
 203        DSI_SP_DT_RESERVED_33 = 0x33,
 204        DSI_SP_DT_RESERVED_34 = 0x34,
 205        DSI_SP_DT_RESERVED_35 = 0x35,
 206        DSI_SP_DT_RESERVED_36 = 0x36,
 207        DSI_SP_DT_SET_MAX_RETURN_PKT_SIZE = 0x37,
 208        DSI_SP_DT_RESERVED_38 = 0x38,
 209        DSI_LP_DT_DSC_LONG_WR = 0x39,
 210        DSI_LP_DT_RESERVED_3A = 0x3a,
 211        DSI_LP_DT_RESERVED_3B = 0x3b,
 212        DSI_LP_DT_RESERVED_3C = 0x3c,
 213        DSI_LP_DT_PPS_YCBCR420_12B = 0x3d,
 214        DSI_LP_DT_PPS_RGB888_24B = 0x3e,
 215        DSI_LP_DT_RESERVED_3F = 0x3f
 216};
 217
 218enum mipi_tx_hs_tp_sel {
 219        MIPI_TX_HS_TP_WHOLE_FRAME_COLOR0 = 0,
 220        MIPI_TX_HS_TP_WHOLE_FRAME_COLOR1,
 221        MIPI_TX_HS_TP_V_STRIPES,
 222        MIPI_TX_HS_TP_H_STRIPES,
 223};
 224
 225enum dphy_mode {
 226        MIPI_DPHY_SLAVE = 0,
 227        MIPI_DPHY_MASTER
 228};
 229
 230enum dphy_tx_fsm {
 231        DPHY_TX_POWERDWN = 0,
 232        DPHY_TX_BGPON,
 233        DPHY_TX_TERMCAL,
 234        DPHY_TX_TERMCALUP,
 235        DPHY_TX_OFFSETCAL,
 236        DPHY_TX_LOCK,
 237        DPHY_TX_SRCAL,
 238        DPHY_TX_IDLE,
 239        DPHY_TX_ULP,
 240        DPHY_TX_LANESTART,
 241        DPHY_TX_CLKALIGN,
 242        DPHY_TX_DDLTUNNING,
 243        DPHY_TX_ULP_FORCE_PLL,
 244        DPHY_TX_LOCK_LOSS
 245};
 246
 247struct mipi_data_type_params {
 248        u8 size_constraint_pixels;
 249        u8 size_constraint_bytes;
 250        u8 pixels_per_pclk;
 251        u8 bits_per_pclk;
 252};
 253
 254struct mipi_tx_dsi_cfg {
 255        u8 hfp_blank_en;        /* Horizontal front porch blanking enable */
 256        u8 eotp_en;             /* End of transmission packet enable */
 257        /* Last vertical front porch blanking mode */
 258        u8 lpm_last_vfp_line;
 259        /* First vertical sync active blanking mode */
 260        u8 lpm_first_vsa_line;
 261        u8 sync_pulse_eventn;   /* Sync type */
 262        u8 hfp_blanking;        /* Horizontal front porch blanking mode */
 263        u8 hbp_blanking;        /* Horizontal back porch blanking mode */
 264        u8 hsa_blanking;        /* Horizontal sync active blanking mode */
 265        u8 v_blanking;          /* Vertical timing blanking mode */
 266};
 267
 268struct mipi_tx_frame_section_cfg {
 269        u32 dma_v_stride;
 270        u16 dma_v_scale_cfg;
 271        u16 width_pixels;
 272        u16 height_lines;
 273        u8 dma_packed;
 274        u8 bpp;
 275        u8 bpp_unpacked;
 276        u8 dma_h_stride;
 277        u8 data_type;
 278        u8 data_mode;
 279        u8 dma_flip_rotate_sel;
 280};
 281
 282struct mipi_tx_frame_timing_cfg {
 283        u32 bpp;
 284        u32 lane_rate_mbps;
 285        u32 hsync_width;
 286        u32 h_backporch;
 287        u32 h_frontporch;
 288        u32 h_active;
 289        u16 vsync_width;
 290        u16 v_backporch;
 291        u16 v_frontporch;
 292        u16 v_active;
 293        u8 active_lanes;
 294};
 295
 296struct mipi_tx_frame_sect_phcfg {
 297        u32 wc;
 298        enum mipi_data_mode data_mode;
 299        enum mipi_dsi_data_type data_type;
 300        u8 vchannel;
 301        u8 dma_packed;
 302};
 303
 304struct mipi_tx_frame_cfg {
 305        struct mipi_tx_frame_section_cfg *sections[MIPI_TX_FRAME_GEN_SECTIONS];
 306        u32 hsync_width;        /* in pixels */
 307        u32 h_backporch;        /* in pixels */
 308        u32 h_frontporch;       /* in pixels */
 309        u16 vsync_width;        /* in lines */
 310        u16 v_backporch;        /* in lines */
 311        u16 v_frontporch;       /* in lines */
 312};
 313
 314struct mipi_tx_ctrl_cfg {
 315        struct mipi_tx_frame_cfg *frames[MIPI_TX_FRAME_GEN];
 316        const struct mipi_tx_dsi_cfg *tx_dsi_cfg;
 317        u8 line_sync_pkt_en;
 318        u8 line_counter_active;
 319        u8 frame_counter_active;
 320        u8 tx_hsclkkidle_cnt;
 321        u8 tx_hsexit_cnt;
 322        u8 tx_crc_en;
 323        u8 tx_hact_wait_stop;
 324        u8 tx_always_use_hact;
 325        u8 tx_wait_trig;
 326        u8 tx_wait_all_sect;
 327};
 328
 329/* configuration structure for MIPI control */
 330struct mipi_ctrl_cfg {
 331        u8 active_lanes;        /* # active lanes per controller 2/4 */
 332        u32 lane_rate_mbps;     /* MBPS */
 333        u32 ref_clk_khz;
 334        u32 cfg_clk_khz;
 335        struct mipi_tx_ctrl_cfg tx_ctrl_cfg;
 336};
 337
 338static inline void kmb_write_mipi(struct kmb_dsi *kmb_dsi,
 339                                  unsigned int reg, u32 value)
 340{
 341        writel(value, (kmb_dsi->mipi_mmio + reg));
 342}
 343
 344static inline u32 kmb_read_mipi(struct kmb_dsi *kmb_dsi, unsigned int reg)
 345{
 346        return readl(kmb_dsi->mipi_mmio + reg);
 347}
 348
 349static inline void kmb_write_bits_mipi(struct kmb_dsi *kmb_dsi,
 350                                       unsigned int reg, u32 offset,
 351                                       u32 num_bits, u32 value)
 352{
 353        u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
 354        u32 mask = (1 << num_bits) - 1;
 355
 356        value &= mask;
 357        mask <<= offset;
 358        reg_val &= (~mask);
 359        reg_val |= (value << offset);
 360        kmb_write_mipi(kmb_dsi, reg, reg_val);
 361}
 362
 363static inline void kmb_set_bit_mipi(struct kmb_dsi *kmb_dsi,
 364                                    unsigned int reg, u32 offset)
 365{
 366        u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
 367
 368        kmb_write_mipi(kmb_dsi, reg, reg_val | (1 << offset));
 369}
 370
 371static inline void kmb_clr_bit_mipi(struct kmb_dsi *kmb_dsi,
 372                                    unsigned int reg, u32 offset)
 373{
 374        u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
 375
 376        kmb_write_mipi(kmb_dsi, reg, reg_val & (~(1 << offset)));
 377}
 378
 379int kmb_dsi_host_bridge_init(struct device *dev);
 380struct kmb_dsi *kmb_dsi_init(struct platform_device *pdev);
 381void kmb_dsi_host_unregister(struct kmb_dsi *kmb_dsi);
 382int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct drm_display_mode *mode,
 383                     int sys_clk_mhz, struct drm_atomic_state *old_state);
 384int kmb_dsi_map_mmio(struct kmb_dsi *kmb_dsi);
 385int kmb_dsi_clk_init(struct kmb_dsi *kmb_dsi);
 386int kmb_dsi_encoder_init(struct drm_device *dev, struct kmb_dsi *kmb_dsi);
 387#endif /* __KMB_DSI_H__ */
 388