linux/drivers/gpu/drm/omapdrm/dss/dsi.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
   4 * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
   5 */
   6
   7#ifndef __OMAP_DRM_DSS_DSI_H
   8#define __OMAP_DRM_DSS_DSI_H
   9
  10#include <drm/drm_mipi_dsi.h>
  11
  12struct dsi_reg {
  13        u16 module;
  14        u16 idx;
  15};
  16
  17#define DSI_REG(mod, idx)               ((const struct dsi_reg) { mod, idx })
  18
  19/* DSI Protocol Engine */
  20
  21#define DSI_PROTO                       0
  22#define DSI_PROTO_SZ                    0x200
  23
  24#define DSI_REVISION                    DSI_REG(DSI_PROTO, 0x0000)
  25#define DSI_SYSCONFIG                   DSI_REG(DSI_PROTO, 0x0010)
  26#define DSI_SYSSTATUS                   DSI_REG(DSI_PROTO, 0x0014)
  27#define DSI_IRQSTATUS                   DSI_REG(DSI_PROTO, 0x0018)
  28#define DSI_IRQENABLE                   DSI_REG(DSI_PROTO, 0x001C)
  29#define DSI_CTRL                        DSI_REG(DSI_PROTO, 0x0040)
  30#define DSI_GNQ                         DSI_REG(DSI_PROTO, 0x0044)
  31#define DSI_COMPLEXIO_CFG1              DSI_REG(DSI_PROTO, 0x0048)
  32#define DSI_COMPLEXIO_IRQ_STATUS        DSI_REG(DSI_PROTO, 0x004C)
  33#define DSI_COMPLEXIO_IRQ_ENABLE        DSI_REG(DSI_PROTO, 0x0050)
  34#define DSI_CLK_CTRL                    DSI_REG(DSI_PROTO, 0x0054)
  35#define DSI_TIMING1                     DSI_REG(DSI_PROTO, 0x0058)
  36#define DSI_TIMING2                     DSI_REG(DSI_PROTO, 0x005C)
  37#define DSI_VM_TIMING1                  DSI_REG(DSI_PROTO, 0x0060)
  38#define DSI_VM_TIMING2                  DSI_REG(DSI_PROTO, 0x0064)
  39#define DSI_VM_TIMING3                  DSI_REG(DSI_PROTO, 0x0068)
  40#define DSI_CLK_TIMING                  DSI_REG(DSI_PROTO, 0x006C)
  41#define DSI_TX_FIFO_VC_SIZE             DSI_REG(DSI_PROTO, 0x0070)
  42#define DSI_RX_FIFO_VC_SIZE             DSI_REG(DSI_PROTO, 0x0074)
  43#define DSI_COMPLEXIO_CFG2              DSI_REG(DSI_PROTO, 0x0078)
  44#define DSI_RX_FIFO_VC_FULLNESS         DSI_REG(DSI_PROTO, 0x007C)
  45#define DSI_VM_TIMING4                  DSI_REG(DSI_PROTO, 0x0080)
  46#define DSI_TX_FIFO_VC_EMPTINESS        DSI_REG(DSI_PROTO, 0x0084)
  47#define DSI_VM_TIMING5                  DSI_REG(DSI_PROTO, 0x0088)
  48#define DSI_VM_TIMING6                  DSI_REG(DSI_PROTO, 0x008C)
  49#define DSI_VM_TIMING7                  DSI_REG(DSI_PROTO, 0x0090)
  50#define DSI_STOPCLK_TIMING              DSI_REG(DSI_PROTO, 0x0094)
  51#define DSI_VC_CTRL(n)                  DSI_REG(DSI_PROTO, 0x0100 + (n * 0x20))
  52#define DSI_VC_TE(n)                    DSI_REG(DSI_PROTO, 0x0104 + (n * 0x20))
  53#define DSI_VC_LONG_PACKET_HEADER(n)    DSI_REG(DSI_PROTO, 0x0108 + (n * 0x20))
  54#define DSI_VC_LONG_PACKET_PAYLOAD(n)   DSI_REG(DSI_PROTO, 0x010C + (n * 0x20))
  55#define DSI_VC_SHORT_PACKET_HEADER(n)   DSI_REG(DSI_PROTO, 0x0110 + (n * 0x20))
  56#define DSI_VC_IRQSTATUS(n)             DSI_REG(DSI_PROTO, 0x0118 + (n * 0x20))
  57#define DSI_VC_IRQENABLE(n)             DSI_REG(DSI_PROTO, 0x011C + (n * 0x20))
  58
  59/* DSIPHY_SCP */
  60
  61#define DSI_PHY                         1
  62#define DSI_PHY_OFFSET                  0x200
  63#define DSI_PHY_SZ                      0x40
  64
  65#define DSI_DSIPHY_CFG0                 DSI_REG(DSI_PHY, 0x0000)
  66#define DSI_DSIPHY_CFG1                 DSI_REG(DSI_PHY, 0x0004)
  67#define DSI_DSIPHY_CFG2                 DSI_REG(DSI_PHY, 0x0008)
  68#define DSI_DSIPHY_CFG5                 DSI_REG(DSI_PHY, 0x0014)
  69#define DSI_DSIPHY_CFG10                DSI_REG(DSI_PHY, 0x0028)
  70
  71/* DSI_PLL_CTRL_SCP */
  72
  73#define DSI_PLL                         2
  74#define DSI_PLL_OFFSET                  0x300
  75#define DSI_PLL_SZ                      0x20
  76
  77#define DSI_PLL_CONTROL                 DSI_REG(DSI_PLL, 0x0000)
  78#define DSI_PLL_STATUS                  DSI_REG(DSI_PLL, 0x0004)
  79#define DSI_PLL_GO                      DSI_REG(DSI_PLL, 0x0008)
  80#define DSI_PLL_CONFIGURATION1          DSI_REG(DSI_PLL, 0x000C)
  81#define DSI_PLL_CONFIGURATION2          DSI_REG(DSI_PLL, 0x0010)
  82
  83/* Global interrupts */
  84#define DSI_IRQ_VC0             (1 << 0)
  85#define DSI_IRQ_VC1             (1 << 1)
  86#define DSI_IRQ_VC2             (1 << 2)
  87#define DSI_IRQ_VC3             (1 << 3)
  88#define DSI_IRQ_WAKEUP          (1 << 4)
  89#define DSI_IRQ_RESYNC          (1 << 5)
  90#define DSI_IRQ_PLL_LOCK        (1 << 7)
  91#define DSI_IRQ_PLL_UNLOCK      (1 << 8)
  92#define DSI_IRQ_PLL_RECALL      (1 << 9)
  93#define DSI_IRQ_COMPLEXIO_ERR   (1 << 10)
  94#define DSI_IRQ_HS_TX_TIMEOUT   (1 << 14)
  95#define DSI_IRQ_LP_RX_TIMEOUT   (1 << 15)
  96#define DSI_IRQ_TE_TRIGGER      (1 << 16)
  97#define DSI_IRQ_ACK_TRIGGER     (1 << 17)
  98#define DSI_IRQ_SYNC_LOST       (1 << 18)
  99#define DSI_IRQ_LDO_POWER_GOOD  (1 << 19)
 100#define DSI_IRQ_TA_TIMEOUT      (1 << 20)
 101#define DSI_IRQ_ERROR_MASK \
 102        (DSI_IRQ_HS_TX_TIMEOUT | DSI_IRQ_LP_RX_TIMEOUT | DSI_IRQ_SYNC_LOST | \
 103        DSI_IRQ_TA_TIMEOUT)
 104#define DSI_IRQ_CHANNEL_MASK    0xf
 105
 106/* Virtual channel interrupts */
 107#define DSI_VC_IRQ_CS           (1 << 0)
 108#define DSI_VC_IRQ_ECC_CORR     (1 << 1)
 109#define DSI_VC_IRQ_PACKET_SENT  (1 << 2)
 110#define DSI_VC_IRQ_FIFO_TX_OVF  (1 << 3)
 111#define DSI_VC_IRQ_FIFO_RX_OVF  (1 << 4)
 112#define DSI_VC_IRQ_BTA          (1 << 5)
 113#define DSI_VC_IRQ_ECC_NO_CORR  (1 << 6)
 114#define DSI_VC_IRQ_FIFO_TX_UDF  (1 << 7)
 115#define DSI_VC_IRQ_PP_BUSY_CHANGE (1 << 8)
 116#define DSI_VC_IRQ_ERROR_MASK \
 117        (DSI_VC_IRQ_CS | DSI_VC_IRQ_ECC_CORR | DSI_VC_IRQ_FIFO_TX_OVF | \
 118        DSI_VC_IRQ_FIFO_RX_OVF | DSI_VC_IRQ_ECC_NO_CORR | \
 119        DSI_VC_IRQ_FIFO_TX_UDF)
 120
 121/* ComplexIO interrupts */
 122#define DSI_CIO_IRQ_ERRSYNCESC1         (1 << 0)
 123#define DSI_CIO_IRQ_ERRSYNCESC2         (1 << 1)
 124#define DSI_CIO_IRQ_ERRSYNCESC3         (1 << 2)
 125#define DSI_CIO_IRQ_ERRSYNCESC4         (1 << 3)
 126#define DSI_CIO_IRQ_ERRSYNCESC5         (1 << 4)
 127#define DSI_CIO_IRQ_ERRESC1             (1 << 5)
 128#define DSI_CIO_IRQ_ERRESC2             (1 << 6)
 129#define DSI_CIO_IRQ_ERRESC3             (1 << 7)
 130#define DSI_CIO_IRQ_ERRESC4             (1 << 8)
 131#define DSI_CIO_IRQ_ERRESC5             (1 << 9)
 132#define DSI_CIO_IRQ_ERRCONTROL1         (1 << 10)
 133#define DSI_CIO_IRQ_ERRCONTROL2         (1 << 11)
 134#define DSI_CIO_IRQ_ERRCONTROL3         (1 << 12)
 135#define DSI_CIO_IRQ_ERRCONTROL4         (1 << 13)
 136#define DSI_CIO_IRQ_ERRCONTROL5         (1 << 14)
 137#define DSI_CIO_IRQ_STATEULPS1          (1 << 15)
 138#define DSI_CIO_IRQ_STATEULPS2          (1 << 16)
 139#define DSI_CIO_IRQ_STATEULPS3          (1 << 17)
 140#define DSI_CIO_IRQ_STATEULPS4          (1 << 18)
 141#define DSI_CIO_IRQ_STATEULPS5          (1 << 19)
 142#define DSI_CIO_IRQ_ERRCONTENTIONLP0_1  (1 << 20)
 143#define DSI_CIO_IRQ_ERRCONTENTIONLP1_1  (1 << 21)
 144#define DSI_CIO_IRQ_ERRCONTENTIONLP0_2  (1 << 22)
 145#define DSI_CIO_IRQ_ERRCONTENTIONLP1_2  (1 << 23)
 146#define DSI_CIO_IRQ_ERRCONTENTIONLP0_3  (1 << 24)
 147#define DSI_CIO_IRQ_ERRCONTENTIONLP1_3  (1 << 25)
 148#define DSI_CIO_IRQ_ERRCONTENTIONLP0_4  (1 << 26)
 149#define DSI_CIO_IRQ_ERRCONTENTIONLP1_4  (1 << 27)
 150#define DSI_CIO_IRQ_ERRCONTENTIONLP0_5  (1 << 28)
 151#define DSI_CIO_IRQ_ERRCONTENTIONLP1_5  (1 << 29)
 152#define DSI_CIO_IRQ_ULPSACTIVENOT_ALL0  (1 << 30)
 153#define DSI_CIO_IRQ_ULPSACTIVENOT_ALL1  (1 << 31)
 154#define DSI_CIO_IRQ_ERROR_MASK \
 155        (DSI_CIO_IRQ_ERRSYNCESC1 | DSI_CIO_IRQ_ERRSYNCESC2 | \
 156         DSI_CIO_IRQ_ERRSYNCESC3 | DSI_CIO_IRQ_ERRSYNCESC4 | \
 157         DSI_CIO_IRQ_ERRSYNCESC5 | \
 158         DSI_CIO_IRQ_ERRESC1 | DSI_CIO_IRQ_ERRESC2 | \
 159         DSI_CIO_IRQ_ERRESC3 | DSI_CIO_IRQ_ERRESC4 | \
 160         DSI_CIO_IRQ_ERRESC5 | \
 161         DSI_CIO_IRQ_ERRCONTROL1 | DSI_CIO_IRQ_ERRCONTROL2 | \
 162         DSI_CIO_IRQ_ERRCONTROL3 | DSI_CIO_IRQ_ERRCONTROL4 | \
 163         DSI_CIO_IRQ_ERRCONTROL5 | \
 164         DSI_CIO_IRQ_ERRCONTENTIONLP0_1 | DSI_CIO_IRQ_ERRCONTENTIONLP1_1 | \
 165         DSI_CIO_IRQ_ERRCONTENTIONLP0_2 | DSI_CIO_IRQ_ERRCONTENTIONLP1_2 | \
 166         DSI_CIO_IRQ_ERRCONTENTIONLP0_3 | DSI_CIO_IRQ_ERRCONTENTIONLP1_3 | \
 167         DSI_CIO_IRQ_ERRCONTENTIONLP0_4 | DSI_CIO_IRQ_ERRCONTENTIONLP1_4 | \
 168         DSI_CIO_IRQ_ERRCONTENTIONLP0_5 | DSI_CIO_IRQ_ERRCONTENTIONLP1_5)
 169
 170enum omap_dss_dsi_mode {
 171        OMAP_DSS_DSI_CMD_MODE = 0,
 172        OMAP_DSS_DSI_VIDEO_MODE,
 173};
 174
 175enum omap_dss_dsi_trans_mode {
 176        /* Sync Pulses: both sync start and end packets sent */
 177        OMAP_DSS_DSI_PULSE_MODE,
 178        /* Sync Events: only sync start packets sent */
 179        OMAP_DSS_DSI_EVENT_MODE,
 180        /* Burst: only sync start packets sent, pixels are time compressed */
 181        OMAP_DSS_DSI_BURST_MODE,
 182};
 183
 184struct omap_dss_dsi_videomode_timings {
 185        unsigned long hsclk;
 186
 187        unsigned int ndl;
 188        unsigned int bitspp;
 189
 190        /* pixels */
 191        u16 hact;
 192        /* lines */
 193        u16 vact;
 194
 195        /* DSI video mode blanking data */
 196        /* Unit: byte clock cycles */
 197        u16 hss;
 198        u16 hsa;
 199        u16 hse;
 200        u16 hfp;
 201        u16 hbp;
 202        /* Unit: line clocks */
 203        u16 vsa;
 204        u16 vfp;
 205        u16 vbp;
 206
 207        /* DSI blanking modes */
 208        int blanking_mode;
 209        int hsa_blanking_mode;
 210        int hbp_blanking_mode;
 211        int hfp_blanking_mode;
 212
 213        enum omap_dss_dsi_trans_mode trans_mode;
 214
 215        int window_sync;
 216};
 217
 218struct omap_dss_dsi_config {
 219        enum omap_dss_dsi_mode mode;
 220        enum mipi_dsi_pixel_format pixel_format;
 221        const struct videomode *vm;
 222
 223        unsigned long hs_clk_min, hs_clk_max;
 224        unsigned long lp_clk_min, lp_clk_max;
 225
 226        enum omap_dss_dsi_trans_mode trans_mode;
 227};
 228
 229/* DSI PLL HSDIV indices */
 230#define HSDIV_DISPC     0
 231#define HSDIV_DSI       1
 232
 233#define DSI_MAX_NR_ISRS                2
 234#define DSI_MAX_NR_LANES        5
 235
 236enum dsi_model {
 237        DSI_MODEL_OMAP3,
 238        DSI_MODEL_OMAP4,
 239        DSI_MODEL_OMAP5,
 240};
 241
 242enum dsi_lane_function {
 243        DSI_LANE_UNUSED = 0,
 244        DSI_LANE_CLK,
 245        DSI_LANE_DATA1,
 246        DSI_LANE_DATA2,
 247        DSI_LANE_DATA3,
 248        DSI_LANE_DATA4,
 249};
 250
 251struct dsi_lane_config {
 252        enum dsi_lane_function function;
 253        u8 polarity;
 254};
 255
 256typedef void (*omap_dsi_isr_t) (void *arg, u32 mask);
 257
 258struct dsi_isr_data {
 259        omap_dsi_isr_t  isr;
 260        void            *arg;
 261        u32             mask;
 262};
 263
 264enum fifo_size {
 265        DSI_FIFO_SIZE_0         = 0,
 266        DSI_FIFO_SIZE_32        = 1,
 267        DSI_FIFO_SIZE_64        = 2,
 268        DSI_FIFO_SIZE_96        = 3,
 269        DSI_FIFO_SIZE_128       = 4,
 270};
 271
 272enum dsi_vc_source {
 273        DSI_VC_SOURCE_L4 = 0,
 274        DSI_VC_SOURCE_VP,
 275};
 276
 277struct dsi_irq_stats {
 278        unsigned long last_reset;
 279        unsigned int irq_count;
 280        unsigned int dsi_irqs[32];
 281        unsigned int vc_irqs[4][32];
 282        unsigned int cio_irqs[32];
 283};
 284
 285struct dsi_isr_tables {
 286        struct dsi_isr_data isr_table[DSI_MAX_NR_ISRS];
 287        struct dsi_isr_data isr_table_vc[4][DSI_MAX_NR_ISRS];
 288        struct dsi_isr_data isr_table_cio[DSI_MAX_NR_ISRS];
 289};
 290
 291struct dsi_lp_clock_info {
 292        unsigned long lp_clk;
 293        u16 lp_clk_div;
 294};
 295
 296struct dsi_clk_calc_ctx {
 297        struct dsi_data *dsi;
 298        struct dss_pll *pll;
 299
 300        /* inputs */
 301
 302        const struct omap_dss_dsi_config *config;
 303
 304        unsigned long req_pck_min, req_pck_nom, req_pck_max;
 305
 306        /* outputs */
 307
 308        struct dss_pll_clock_info dsi_cinfo;
 309        struct dispc_clock_info dispc_cinfo;
 310        struct dsi_lp_clock_info lp_cinfo;
 311
 312        struct videomode vm;
 313        struct omap_dss_dsi_videomode_timings dsi_vm;
 314};
 315
 316struct dsi_module_id_data {
 317        u32 address;
 318        int id;
 319};
 320
 321enum dsi_quirks {
 322        DSI_QUIRK_PLL_PWR_BUG = (1 << 0),       /* DSI-PLL power command 0x3 is not working */
 323        DSI_QUIRK_DCS_CMD_CONFIG_VC = (1 << 1),
 324        DSI_QUIRK_VC_OCP_WIDTH = (1 << 2),
 325        DSI_QUIRK_REVERSE_TXCLKESC = (1 << 3),
 326        DSI_QUIRK_GNQ = (1 << 4),
 327        DSI_QUIRK_PHY_DCC = (1 << 5),
 328};
 329
 330struct dsi_of_data {
 331        enum dsi_model model;
 332        const struct dss_pll_hw *pll_hw;
 333        const struct dsi_module_id_data *modules;
 334        unsigned int max_fck_freq;
 335        unsigned int max_pll_lpdiv;
 336        enum dsi_quirks quirks;
 337};
 338
 339struct dsi_data {
 340        struct device *dev;
 341        void __iomem *proto_base;
 342        void __iomem *phy_base;
 343        void __iomem *pll_base;
 344
 345        const struct dsi_of_data *data;
 346        int module_id;
 347
 348        int irq;
 349
 350        bool is_enabled;
 351
 352        struct clk *dss_clk;
 353        struct regmap *syscon;
 354        struct dss_device *dss;
 355
 356        struct mipi_dsi_host host;
 357
 358        struct dispc_clock_info user_dispc_cinfo;
 359        struct dss_pll_clock_info user_dsi_cinfo;
 360
 361        struct dsi_lp_clock_info user_lp_cinfo;
 362        struct dsi_lp_clock_info current_lp_cinfo;
 363
 364        struct dss_pll pll;
 365
 366        bool vdds_dsi_enabled;
 367        struct regulator *vdds_dsi_reg;
 368
 369        struct mipi_dsi_device *dsidev;
 370
 371        struct {
 372                enum dsi_vc_source source;
 373                enum fifo_size tx_fifo_size;
 374                enum fifo_size rx_fifo_size;
 375        } vc[4];
 376
 377        struct mutex lock;
 378        struct semaphore bus_lock;
 379
 380        spinlock_t irq_lock;
 381        struct dsi_isr_tables isr_tables;
 382        /* space for a copy used by the interrupt handler */
 383        struct dsi_isr_tables isr_tables_copy;
 384
 385        int update_vc;
 386#ifdef DSI_PERF_MEASURE
 387        unsigned int update_bytes;
 388#endif
 389
 390        /* external TE GPIO */
 391        struct gpio_desc *te_gpio;
 392        int te_irq;
 393        struct delayed_work te_timeout_work;
 394        atomic_t do_ext_te_update;
 395
 396        bool te_enabled;
 397        bool iface_enabled;
 398        bool video_enabled;
 399
 400        struct delayed_work framedone_timeout_work;
 401
 402#ifdef DSI_CATCH_MISSING_TE
 403        struct timer_list te_timer;
 404#endif
 405
 406        unsigned long cache_req_pck;
 407        unsigned long cache_clk_freq;
 408        struct dss_pll_clock_info cache_cinfo;
 409
 410        u32             errors;
 411        spinlock_t      errors_lock;
 412#ifdef DSI_PERF_MEASURE
 413        ktime_t perf_setup_time;
 414        ktime_t perf_start_time;
 415#endif
 416        int debug_read;
 417        int debug_write;
 418        struct {
 419                struct dss_debugfs_entry *irqs;
 420                struct dss_debugfs_entry *regs;
 421                struct dss_debugfs_entry *clks;
 422        } debugfs;
 423
 424#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
 425        spinlock_t irq_stats_lock;
 426        struct dsi_irq_stats irq_stats;
 427#endif
 428
 429        unsigned int num_lanes_supported;
 430        unsigned int line_buffer_size;
 431
 432        struct dsi_lane_config lanes[DSI_MAX_NR_LANES];
 433        unsigned int num_lanes_used;
 434
 435        unsigned int scp_clk_refcount;
 436
 437        struct omap_dss_dsi_config config;
 438
 439        struct dss_lcd_mgr_config mgr_config;
 440        struct videomode vm;
 441        enum mipi_dsi_pixel_format pix_fmt;
 442        enum omap_dss_dsi_mode mode;
 443        struct omap_dss_dsi_videomode_timings vm_timings;
 444
 445        struct omap_dss_device output;
 446        struct drm_bridge bridge;
 447
 448        struct delayed_work dsi_disable_work;
 449};
 450
 451struct dsi_packet_sent_handler_data {
 452        struct dsi_data *dsi;
 453        struct completion *completion;
 454};
 455
 456#endif /* __OMAP_DRM_DSS_DSI_H */
 457