linux/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (c) 2016, Fuzhou Rockchip Electronics Co., Ltd
   4 * Copyright (C) STMicroelectronics SA 2017
   5 *
   6 * Modified by Philippe Cornu <philippe.cornu@st.com>
   7 * This generic Synopsys DesignWare MIPI DSI host driver is based on the
   8 * Rockchip version from rockchip/dw-mipi-dsi.c with phy & bridge APIs.
   9 */
  10
  11#include <linux/clk.h>
  12#include <linux/component.h>
  13#include <linux/iopoll.h>
  14#include <linux/module.h>
  15#include <linux/of_device.h>
  16#include <linux/pm_runtime.h>
  17#include <linux/reset.h>
  18#include <drm/drmP.h>
  19#include <drm/drm_atomic_helper.h>
  20#include <drm/drm_bridge.h>
  21#include <drm/drm_crtc.h>
  22#include <drm/drm_crtc_helper.h>
  23#include <drm/drm_mipi_dsi.h>
  24#include <drm/drm_of.h>
  25#include <drm/bridge/dw_mipi_dsi.h>
  26#include <video/mipi_display.h>
  27
  28#define HWVER_131                       0x31333100      /* IP version 1.31 */
  29
  30#define DSI_VERSION                     0x00
  31#define VERSION                         GENMASK(31, 8)
  32
  33#define DSI_PWR_UP                      0x04
  34#define RESET                           0
  35#define POWERUP                         BIT(0)
  36
  37#define DSI_CLKMGR_CFG                  0x08
  38#define TO_CLK_DIVISION(div)            (((div) & 0xff) << 8)
  39#define TX_ESC_CLK_DIVISION(div)        ((div) & 0xff)
  40
  41#define DSI_DPI_VCID                    0x0c
  42#define DPI_VCID(vcid)                  ((vcid) & 0x3)
  43
  44#define DSI_DPI_COLOR_CODING            0x10
  45#define LOOSELY18_EN                    BIT(8)
  46#define DPI_COLOR_CODING_16BIT_1        0x0
  47#define DPI_COLOR_CODING_16BIT_2        0x1
  48#define DPI_COLOR_CODING_16BIT_3        0x2
  49#define DPI_COLOR_CODING_18BIT_1        0x3
  50#define DPI_COLOR_CODING_18BIT_2        0x4
  51#define DPI_COLOR_CODING_24BIT          0x5
  52
  53#define DSI_DPI_CFG_POL                 0x14
  54#define COLORM_ACTIVE_LOW               BIT(4)
  55#define SHUTD_ACTIVE_LOW                BIT(3)
  56#define HSYNC_ACTIVE_LOW                BIT(2)
  57#define VSYNC_ACTIVE_LOW                BIT(1)
  58#define DATAEN_ACTIVE_LOW               BIT(0)
  59
  60#define DSI_DPI_LP_CMD_TIM              0x18
  61#define OUTVACT_LPCMD_TIME(p)           (((p) & 0xff) << 16)
  62#define INVACT_LPCMD_TIME(p)            ((p) & 0xff)
  63
  64#define DSI_DBI_VCID                    0x1c
  65#define DSI_DBI_CFG                     0x20
  66#define DSI_DBI_PARTITIONING_EN         0x24
  67#define DSI_DBI_CMDSIZE                 0x28
  68
  69#define DSI_PCKHDL_CFG                  0x2c
  70#define CRC_RX_EN                       BIT(4)
  71#define ECC_RX_EN                       BIT(3)
  72#define BTA_EN                          BIT(2)
  73#define EOTP_RX_EN                      BIT(1)
  74#define EOTP_TX_EN                      BIT(0)
  75
  76#define DSI_GEN_VCID                    0x30
  77
  78#define DSI_MODE_CFG                    0x34
  79#define ENABLE_VIDEO_MODE               0
  80#define ENABLE_CMD_MODE                 BIT(0)
  81
  82#define DSI_VID_MODE_CFG                0x38
  83#define ENABLE_LOW_POWER                (0x3f << 8)
  84#define ENABLE_LOW_POWER_MASK           (0x3f << 8)
  85#define VID_MODE_TYPE_NON_BURST_SYNC_PULSES     0x0
  86#define VID_MODE_TYPE_NON_BURST_SYNC_EVENTS     0x1
  87#define VID_MODE_TYPE_BURST                     0x2
  88#define VID_MODE_TYPE_MASK                      0x3
  89
  90#define DSI_VID_PKT_SIZE                0x3c
  91#define VID_PKT_SIZE(p)                 ((p) & 0x3fff)
  92
  93#define DSI_VID_NUM_CHUNKS              0x40
  94#define VID_NUM_CHUNKS(c)               ((c) & 0x1fff)
  95
  96#define DSI_VID_NULL_SIZE               0x44
  97#define VID_NULL_SIZE(b)                ((b) & 0x1fff)
  98
  99#define DSI_VID_HSA_TIME                0x48
 100#define DSI_VID_HBP_TIME                0x4c
 101#define DSI_VID_HLINE_TIME              0x50
 102#define DSI_VID_VSA_LINES               0x54
 103#define DSI_VID_VBP_LINES               0x58
 104#define DSI_VID_VFP_LINES               0x5c
 105#define DSI_VID_VACTIVE_LINES           0x60
 106#define DSI_EDPI_CMD_SIZE               0x64
 107
 108#define DSI_CMD_MODE_CFG                0x68
 109#define MAX_RD_PKT_SIZE_LP              BIT(24)
 110#define DCS_LW_TX_LP                    BIT(19)
 111#define DCS_SR_0P_TX_LP                 BIT(18)
 112#define DCS_SW_1P_TX_LP                 BIT(17)
 113#define DCS_SW_0P_TX_LP                 BIT(16)
 114#define GEN_LW_TX_LP                    BIT(14)
 115#define GEN_SR_2P_TX_LP                 BIT(13)
 116#define GEN_SR_1P_TX_LP                 BIT(12)
 117#define GEN_SR_0P_TX_LP                 BIT(11)
 118#define GEN_SW_2P_TX_LP                 BIT(10)
 119#define GEN_SW_1P_TX_LP                 BIT(9)
 120#define GEN_SW_0P_TX_LP                 BIT(8)
 121#define ACK_RQST_EN                     BIT(1)
 122#define TEAR_FX_EN                      BIT(0)
 123
 124#define CMD_MODE_ALL_LP                 (MAX_RD_PKT_SIZE_LP | \
 125                                         DCS_LW_TX_LP | \
 126                                         DCS_SR_0P_TX_LP | \
 127                                         DCS_SW_1P_TX_LP | \
 128                                         DCS_SW_0P_TX_LP | \
 129                                         GEN_LW_TX_LP | \
 130                                         GEN_SR_2P_TX_LP | \
 131                                         GEN_SR_1P_TX_LP | \
 132                                         GEN_SR_0P_TX_LP | \
 133                                         GEN_SW_2P_TX_LP | \
 134                                         GEN_SW_1P_TX_LP | \
 135                                         GEN_SW_0P_TX_LP)
 136
 137#define DSI_GEN_HDR                     0x6c
 138#define DSI_GEN_PLD_DATA                0x70
 139
 140#define DSI_CMD_PKT_STATUS              0x74
 141#define GEN_RD_CMD_BUSY                 BIT(6)
 142#define GEN_PLD_R_FULL                  BIT(5)
 143#define GEN_PLD_R_EMPTY                 BIT(4)
 144#define GEN_PLD_W_FULL                  BIT(3)
 145#define GEN_PLD_W_EMPTY                 BIT(2)
 146#define GEN_CMD_FULL                    BIT(1)
 147#define GEN_CMD_EMPTY                   BIT(0)
 148
 149#define DSI_TO_CNT_CFG                  0x78
 150#define HSTX_TO_CNT(p)                  (((p) & 0xffff) << 16)
 151#define LPRX_TO_CNT(p)                  ((p) & 0xffff)
 152
 153#define DSI_HS_RD_TO_CNT                0x7c
 154#define DSI_LP_RD_TO_CNT                0x80
 155#define DSI_HS_WR_TO_CNT                0x84
 156#define DSI_LP_WR_TO_CNT                0x88
 157#define DSI_BTA_TO_CNT                  0x8c
 158
 159#define DSI_LPCLK_CTRL                  0x94
 160#define AUTO_CLKLANE_CTRL               BIT(1)
 161#define PHY_TXREQUESTCLKHS              BIT(0)
 162
 163#define DSI_PHY_TMR_LPCLK_CFG           0x98
 164#define PHY_CLKHS2LP_TIME(lbcc)         (((lbcc) & 0x3ff) << 16)
 165#define PHY_CLKLP2HS_TIME(lbcc)         ((lbcc) & 0x3ff)
 166
 167#define DSI_PHY_TMR_CFG                 0x9c
 168#define PHY_HS2LP_TIME(lbcc)            (((lbcc) & 0xff) << 24)
 169#define PHY_LP2HS_TIME(lbcc)            (((lbcc) & 0xff) << 16)
 170#define MAX_RD_TIME(lbcc)               ((lbcc) & 0x7fff)
 171#define PHY_HS2LP_TIME_V131(lbcc)       (((lbcc) & 0x3ff) << 16)
 172#define PHY_LP2HS_TIME_V131(lbcc)       ((lbcc) & 0x3ff)
 173
 174#define DSI_PHY_RSTZ                    0xa0
 175#define PHY_DISFORCEPLL                 0
 176#define PHY_ENFORCEPLL                  BIT(3)
 177#define PHY_DISABLECLK                  0
 178#define PHY_ENABLECLK                   BIT(2)
 179#define PHY_RSTZ                        0
 180#define PHY_UNRSTZ                      BIT(1)
 181#define PHY_SHUTDOWNZ                   0
 182#define PHY_UNSHUTDOWNZ                 BIT(0)
 183
 184#define DSI_PHY_IF_CFG                  0xa4
 185#define PHY_STOP_WAIT_TIME(cycle)       (((cycle) & 0xff) << 8)
 186#define N_LANES(n)                      (((n) - 1) & 0x3)
 187
 188#define DSI_PHY_ULPS_CTRL               0xa8
 189#define DSI_PHY_TX_TRIGGERS             0xac
 190
 191#define DSI_PHY_STATUS                  0xb0
 192#define PHY_STOP_STATE_CLK_LANE         BIT(2)
 193#define PHY_LOCK                        BIT(0)
 194
 195#define DSI_PHY_TST_CTRL0               0xb4
 196#define PHY_TESTCLK                     BIT(1)
 197#define PHY_UNTESTCLK                   0
 198#define PHY_TESTCLR                     BIT(0)
 199#define PHY_UNTESTCLR                   0
 200
 201#define DSI_PHY_TST_CTRL1               0xb8
 202#define PHY_TESTEN                      BIT(16)
 203#define PHY_UNTESTEN                    0
 204#define PHY_TESTDOUT(n)                 (((n) & 0xff) << 8)
 205#define PHY_TESTDIN(n)                  ((n) & 0xff)
 206
 207#define DSI_INT_ST0                     0xbc
 208#define DSI_INT_ST1                     0xc0
 209#define DSI_INT_MSK0                    0xc4
 210#define DSI_INT_MSK1                    0xc8
 211
 212#define DSI_PHY_TMR_RD_CFG              0xf4
 213#define MAX_RD_TIME_V131(lbcc)          ((lbcc) & 0x7fff)
 214
 215#define PHY_STATUS_TIMEOUT_US           10000
 216#define CMD_PKT_STATUS_TIMEOUT_US       20000
 217
 218struct dw_mipi_dsi {
 219        struct drm_bridge bridge;
 220        struct mipi_dsi_host dsi_host;
 221        struct drm_bridge *panel_bridge;
 222        struct device *dev;
 223        void __iomem *base;
 224
 225        struct clk *pclk;
 226
 227        unsigned int lane_mbps; /* per lane */
 228        u32 channel;
 229        u32 lanes;
 230        u32 format;
 231        unsigned long mode_flags;
 232
 233        const struct dw_mipi_dsi_plat_data *plat_data;
 234};
 235
 236/*
 237 * The controller should generate 2 frames before
 238 * preparing the peripheral.
 239 */
 240static void dw_mipi_dsi_wait_for_two_frames(struct drm_display_mode *mode)
 241{
 242        int refresh, two_frames;
 243
 244        refresh = drm_mode_vrefresh(mode);
 245        two_frames = DIV_ROUND_UP(MSEC_PER_SEC, refresh) * 2;
 246        msleep(two_frames);
 247}
 248
 249static inline struct dw_mipi_dsi *host_to_dsi(struct mipi_dsi_host *host)
 250{
 251        return container_of(host, struct dw_mipi_dsi, dsi_host);
 252}
 253
 254static inline struct dw_mipi_dsi *bridge_to_dsi(struct drm_bridge *bridge)
 255{
 256        return container_of(bridge, struct dw_mipi_dsi, bridge);
 257}
 258
 259static inline void dsi_write(struct dw_mipi_dsi *dsi, u32 reg, u32 val)
 260{
 261        writel(val, dsi->base + reg);
 262}
 263
 264static inline u32 dsi_read(struct dw_mipi_dsi *dsi, u32 reg)
 265{
 266        return readl(dsi->base + reg);
 267}
 268
 269static int dw_mipi_dsi_host_attach(struct mipi_dsi_host *host,
 270                                   struct mipi_dsi_device *device)
 271{
 272        struct dw_mipi_dsi *dsi = host_to_dsi(host);
 273        struct drm_bridge *bridge;
 274        struct drm_panel *panel;
 275        int ret;
 276
 277        if (device->lanes > dsi->plat_data->max_data_lanes) {
 278                dev_err(dsi->dev, "the number of data lanes(%u) is too many\n",
 279                        device->lanes);
 280                return -EINVAL;
 281        }
 282
 283        dsi->lanes = device->lanes;
 284        dsi->channel = device->channel;
 285        dsi->format = device->format;
 286        dsi->mode_flags = device->mode_flags;
 287
 288        ret = drm_of_find_panel_or_bridge(host->dev->of_node, 1, 0,
 289                                          &panel, &bridge);
 290        if (ret)
 291                return ret;
 292
 293        if (panel) {
 294                bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_DSI);
 295                if (IS_ERR(bridge))
 296                        return PTR_ERR(bridge);
 297        }
 298
 299        dsi->panel_bridge = bridge;
 300
 301        drm_bridge_add(&dsi->bridge);
 302
 303        return 0;
 304}
 305
 306static int dw_mipi_dsi_host_detach(struct mipi_dsi_host *host,
 307                                   struct mipi_dsi_device *device)
 308{
 309        struct dw_mipi_dsi *dsi = host_to_dsi(host);
 310
 311        drm_of_panel_bridge_remove(host->dev->of_node, 1, 0);
 312
 313        drm_bridge_remove(&dsi->bridge);
 314
 315        return 0;
 316}
 317
 318static void dw_mipi_message_config(struct dw_mipi_dsi *dsi,
 319                                   const struct mipi_dsi_msg *msg)
 320{
 321        bool lpm = msg->flags & MIPI_DSI_MSG_USE_LPM;
 322        u32 val = 0;
 323
 324        if (msg->flags & MIPI_DSI_MSG_REQ_ACK)
 325                val |= ACK_RQST_EN;
 326        if (lpm)
 327                val |= CMD_MODE_ALL_LP;
 328
 329        dsi_write(dsi, DSI_LPCLK_CTRL, lpm ? 0 : PHY_TXREQUESTCLKHS);
 330        dsi_write(dsi, DSI_CMD_MODE_CFG, val);
 331}
 332
 333static int dw_mipi_dsi_gen_pkt_hdr_write(struct dw_mipi_dsi *dsi, u32 hdr_val)
 334{
 335        int ret;
 336        u32 val, mask;
 337
 338        ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS,
 339                                 val, !(val & GEN_CMD_FULL), 1000,
 340                                 CMD_PKT_STATUS_TIMEOUT_US);
 341        if (ret) {
 342                dev_err(dsi->dev, "failed to get available command FIFO\n");
 343                return ret;
 344        }
 345
 346        dsi_write(dsi, DSI_GEN_HDR, hdr_val);
 347
 348        mask = GEN_CMD_EMPTY | GEN_PLD_W_EMPTY;
 349        ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS,
 350                                 val, (val & mask) == mask,
 351                                 1000, CMD_PKT_STATUS_TIMEOUT_US);
 352        if (ret) {
 353                dev_err(dsi->dev, "failed to write command FIFO\n");
 354                return ret;
 355        }
 356
 357        return 0;
 358}
 359
 360static int dw_mipi_dsi_write(struct dw_mipi_dsi *dsi,
 361                             const struct mipi_dsi_packet *packet)
 362{
 363        const u8 *tx_buf = packet->payload;
 364        int len = packet->payload_length, pld_data_bytes = sizeof(u32), ret;
 365        __le32 word;
 366        u32 val;
 367
 368        while (len) {
 369                if (len < pld_data_bytes) {
 370                        word = 0;
 371                        memcpy(&word, tx_buf, len);
 372                        dsi_write(dsi, DSI_GEN_PLD_DATA, le32_to_cpu(word));
 373                        len = 0;
 374                } else {
 375                        memcpy(&word, tx_buf, pld_data_bytes);
 376                        dsi_write(dsi, DSI_GEN_PLD_DATA, le32_to_cpu(word));
 377                        tx_buf += pld_data_bytes;
 378                        len -= pld_data_bytes;
 379                }
 380
 381                ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS,
 382                                         val, !(val & GEN_PLD_W_FULL), 1000,
 383                                         CMD_PKT_STATUS_TIMEOUT_US);
 384                if (ret) {
 385                        dev_err(dsi->dev,
 386                                "failed to get available write payload FIFO\n");
 387                        return ret;
 388                }
 389        }
 390
 391        word = 0;
 392        memcpy(&word, packet->header, sizeof(packet->header));
 393        return dw_mipi_dsi_gen_pkt_hdr_write(dsi, le32_to_cpu(word));
 394}
 395
 396static int dw_mipi_dsi_read(struct dw_mipi_dsi *dsi,
 397                            const struct mipi_dsi_msg *msg)
 398{
 399        int i, j, ret, len = msg->rx_len;
 400        u8 *buf = msg->rx_buf;
 401        u32 val;
 402
 403        /* Wait end of the read operation */
 404        ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS,
 405                                 val, !(val & GEN_RD_CMD_BUSY),
 406                                 1000, CMD_PKT_STATUS_TIMEOUT_US);
 407        if (ret) {
 408                dev_err(dsi->dev, "Timeout during read operation\n");
 409                return ret;
 410        }
 411
 412        for (i = 0; i < len; i += 4) {
 413                /* Read fifo must not be empty before all bytes are read */
 414                ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS,
 415                                         val, !(val & GEN_PLD_R_EMPTY),
 416                                         1000, CMD_PKT_STATUS_TIMEOUT_US);
 417                if (ret) {
 418                        dev_err(dsi->dev, "Read payload FIFO is empty\n");
 419                        return ret;
 420                }
 421
 422                val = dsi_read(dsi, DSI_GEN_PLD_DATA);
 423                for (j = 0; j < 4 && j + i < len; j++)
 424                        buf[i + j] = val >> (8 * j);
 425        }
 426
 427        return ret;
 428}
 429
 430static ssize_t dw_mipi_dsi_host_transfer(struct mipi_dsi_host *host,
 431                                         const struct mipi_dsi_msg *msg)
 432{
 433        struct dw_mipi_dsi *dsi = host_to_dsi(host);
 434        struct mipi_dsi_packet packet;
 435        int ret, nb_bytes;
 436
 437        ret = mipi_dsi_create_packet(&packet, msg);
 438        if (ret) {
 439                dev_err(dsi->dev, "failed to create packet: %d\n", ret);
 440                return ret;
 441        }
 442
 443        dw_mipi_message_config(dsi, msg);
 444
 445        ret = dw_mipi_dsi_write(dsi, &packet);
 446        if (ret)
 447                return ret;
 448
 449        if (msg->rx_buf && msg->rx_len) {
 450                ret = dw_mipi_dsi_read(dsi, msg);
 451                if (ret)
 452                        return ret;
 453                nb_bytes = msg->rx_len;
 454        } else {
 455                nb_bytes = packet.size;
 456        }
 457
 458        return nb_bytes;
 459}
 460
 461static const struct mipi_dsi_host_ops dw_mipi_dsi_host_ops = {
 462        .attach = dw_mipi_dsi_host_attach,
 463        .detach = dw_mipi_dsi_host_detach,
 464        .transfer = dw_mipi_dsi_host_transfer,
 465};
 466
 467static void dw_mipi_dsi_video_mode_config(struct dw_mipi_dsi *dsi)
 468{
 469        u32 val;
 470
 471        /*
 472         * TODO dw drv improvements
 473         * enabling low power is panel-dependent, we should use the
 474         * panel configuration here...
 475         */
 476        val = ENABLE_LOW_POWER;
 477
 478        if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST)
 479                val |= VID_MODE_TYPE_BURST;
 480        else if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)
 481                val |= VID_MODE_TYPE_NON_BURST_SYNC_PULSES;
 482        else
 483                val |= VID_MODE_TYPE_NON_BURST_SYNC_EVENTS;
 484
 485        dsi_write(dsi, DSI_VID_MODE_CFG, val);
 486}
 487
 488static void dw_mipi_dsi_set_mode(struct dw_mipi_dsi *dsi,
 489                                 unsigned long mode_flags)
 490{
 491        dsi_write(dsi, DSI_PWR_UP, RESET);
 492
 493        if (mode_flags & MIPI_DSI_MODE_VIDEO) {
 494                dsi_write(dsi, DSI_MODE_CFG, ENABLE_VIDEO_MODE);
 495                dw_mipi_dsi_video_mode_config(dsi);
 496                dsi_write(dsi, DSI_LPCLK_CTRL, PHY_TXREQUESTCLKHS);
 497        } else {
 498                dsi_write(dsi, DSI_MODE_CFG, ENABLE_CMD_MODE);
 499        }
 500
 501        dsi_write(dsi, DSI_PWR_UP, POWERUP);
 502}
 503
 504static void dw_mipi_dsi_disable(struct dw_mipi_dsi *dsi)
 505{
 506        dsi_write(dsi, DSI_PWR_UP, RESET);
 507        dsi_write(dsi, DSI_PHY_RSTZ, PHY_RSTZ);
 508}
 509
 510static void dw_mipi_dsi_init(struct dw_mipi_dsi *dsi)
 511{
 512        /*
 513         * The maximum permitted escape clock is 20MHz and it is derived from
 514         * lanebyteclk, which is running at "lane_mbps / 8".  Thus we want:
 515         *
 516         *     (lane_mbps >> 3) / esc_clk_division < 20
 517         * which is:
 518         *     (lane_mbps >> 3) / 20 > esc_clk_division
 519         */
 520        u32 esc_clk_division = (dsi->lane_mbps >> 3) / 20 + 1;
 521
 522        dsi_write(dsi, DSI_PWR_UP, RESET);
 523
 524        /*
 525         * TODO dw drv improvements
 526         * timeout clock division should be computed with the
 527         * high speed transmission counter timeout and byte lane...
 528         */
 529        dsi_write(dsi, DSI_CLKMGR_CFG, TO_CLK_DIVISION(10) |
 530                  TX_ESC_CLK_DIVISION(esc_clk_division));
 531}
 532
 533static void dw_mipi_dsi_dpi_config(struct dw_mipi_dsi *dsi,
 534                                   struct drm_display_mode *mode)
 535{
 536        u32 val = 0, color = 0;
 537
 538        switch (dsi->format) {
 539        case MIPI_DSI_FMT_RGB888:
 540                color = DPI_COLOR_CODING_24BIT;
 541                break;
 542        case MIPI_DSI_FMT_RGB666:
 543                color = DPI_COLOR_CODING_18BIT_2 | LOOSELY18_EN;
 544                break;
 545        case MIPI_DSI_FMT_RGB666_PACKED:
 546                color = DPI_COLOR_CODING_18BIT_1;
 547                break;
 548        case MIPI_DSI_FMT_RGB565:
 549                color = DPI_COLOR_CODING_16BIT_1;
 550                break;
 551        }
 552
 553        if (mode->flags & DRM_MODE_FLAG_NVSYNC)
 554                val |= VSYNC_ACTIVE_LOW;
 555        if (mode->flags & DRM_MODE_FLAG_NHSYNC)
 556                val |= HSYNC_ACTIVE_LOW;
 557
 558        dsi_write(dsi, DSI_DPI_VCID, DPI_VCID(dsi->channel));
 559        dsi_write(dsi, DSI_DPI_COLOR_CODING, color);
 560        dsi_write(dsi, DSI_DPI_CFG_POL, val);
 561        /*
 562         * TODO dw drv improvements
 563         * largest packet sizes during hfp or during vsa/vpb/vfp
 564         * should be computed according to byte lane, lane number and only
 565         * if sending lp cmds in high speed is enable (PHY_TXREQUESTCLKHS)
 566         */
 567        dsi_write(dsi, DSI_DPI_LP_CMD_TIM, OUTVACT_LPCMD_TIME(4)
 568                  | INVACT_LPCMD_TIME(4));
 569}
 570
 571static void dw_mipi_dsi_packet_handler_config(struct dw_mipi_dsi *dsi)
 572{
 573        dsi_write(dsi, DSI_PCKHDL_CFG, CRC_RX_EN | ECC_RX_EN | BTA_EN);
 574}
 575
 576static void dw_mipi_dsi_video_packet_config(struct dw_mipi_dsi *dsi,
 577                                            struct drm_display_mode *mode)
 578{
 579        /*
 580         * TODO dw drv improvements
 581         * only burst mode is supported here. For non-burst video modes,
 582         * we should compute DSI_VID_PKT_SIZE, DSI_VCCR.NUMC &
 583         * DSI_VNPCR.NPSIZE... especially because this driver supports
 584         * non-burst video modes, see dw_mipi_dsi_video_mode_config()...
 585         */
 586        dsi_write(dsi, DSI_VID_PKT_SIZE, VID_PKT_SIZE(mode->hdisplay));
 587}
 588
 589static void dw_mipi_dsi_command_mode_config(struct dw_mipi_dsi *dsi)
 590{
 591        /*
 592         * TODO dw drv improvements
 593         * compute high speed transmission counter timeout according
 594         * to the timeout clock division (TO_CLK_DIVISION) and byte lane...
 595         */
 596        dsi_write(dsi, DSI_TO_CNT_CFG, HSTX_TO_CNT(1000) | LPRX_TO_CNT(1000));
 597        /*
 598         * TODO dw drv improvements
 599         * the Bus-Turn-Around Timeout Counter should be computed
 600         * according to byte lane...
 601         */
 602        dsi_write(dsi, DSI_BTA_TO_CNT, 0xd00);
 603        dsi_write(dsi, DSI_MODE_CFG, ENABLE_CMD_MODE);
 604}
 605
 606/* Get lane byte clock cycles. */
 607static u32 dw_mipi_dsi_get_hcomponent_lbcc(struct dw_mipi_dsi *dsi,
 608                                           struct drm_display_mode *mode,
 609                                           u32 hcomponent)
 610{
 611        u32 frac, lbcc;
 612
 613        lbcc = hcomponent * dsi->lane_mbps * MSEC_PER_SEC / 8;
 614
 615        frac = lbcc % mode->clock;
 616        lbcc = lbcc / mode->clock;
 617        if (frac)
 618                lbcc++;
 619
 620        return lbcc;
 621}
 622
 623static void dw_mipi_dsi_line_timer_config(struct dw_mipi_dsi *dsi,
 624                                          struct drm_display_mode *mode)
 625{
 626        u32 htotal, hsa, hbp, lbcc;
 627
 628        htotal = mode->htotal;
 629        hsa = mode->hsync_end - mode->hsync_start;
 630        hbp = mode->htotal - mode->hsync_end;
 631
 632        /*
 633         * TODO dw drv improvements
 634         * computations below may be improved...
 635         */
 636        lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, mode, htotal);
 637        dsi_write(dsi, DSI_VID_HLINE_TIME, lbcc);
 638
 639        lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, mode, hsa);
 640        dsi_write(dsi, DSI_VID_HSA_TIME, lbcc);
 641
 642        lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, mode, hbp);
 643        dsi_write(dsi, DSI_VID_HBP_TIME, lbcc);
 644}
 645
 646static void dw_mipi_dsi_vertical_timing_config(struct dw_mipi_dsi *dsi,
 647                                               struct drm_display_mode *mode)
 648{
 649        u32 vactive, vsa, vfp, vbp;
 650
 651        vactive = mode->vdisplay;
 652        vsa = mode->vsync_end - mode->vsync_start;
 653        vfp = mode->vsync_start - mode->vdisplay;
 654        vbp = mode->vtotal - mode->vsync_end;
 655
 656        dsi_write(dsi, DSI_VID_VACTIVE_LINES, vactive);
 657        dsi_write(dsi, DSI_VID_VSA_LINES, vsa);
 658        dsi_write(dsi, DSI_VID_VFP_LINES, vfp);
 659        dsi_write(dsi, DSI_VID_VBP_LINES, vbp);
 660}
 661
 662static void dw_mipi_dsi_dphy_timing_config(struct dw_mipi_dsi *dsi)
 663{
 664        u32 hw_version;
 665
 666        /*
 667         * TODO dw drv improvements
 668         * data & clock lane timers should be computed according to panel
 669         * blankings and to the automatic clock lane control mode...
 670         * note: DSI_PHY_TMR_CFG.MAX_RD_TIME should be in line with
 671         * DSI_CMD_MODE_CFG.MAX_RD_PKT_SIZE_LP (see CMD_MODE_ALL_LP)
 672         */
 673
 674        hw_version = dsi_read(dsi, DSI_VERSION) & VERSION;
 675
 676        if (hw_version >= HWVER_131) {
 677                dsi_write(dsi, DSI_PHY_TMR_CFG, PHY_HS2LP_TIME_V131(0x40) |
 678                          PHY_LP2HS_TIME_V131(0x40));
 679                dsi_write(dsi, DSI_PHY_TMR_RD_CFG, MAX_RD_TIME_V131(10000));
 680        } else {
 681                dsi_write(dsi, DSI_PHY_TMR_CFG, PHY_HS2LP_TIME(0x40) |
 682                          PHY_LP2HS_TIME(0x40) | MAX_RD_TIME(10000));
 683        }
 684
 685        dsi_write(dsi, DSI_PHY_TMR_LPCLK_CFG, PHY_CLKHS2LP_TIME(0x40)
 686                  | PHY_CLKLP2HS_TIME(0x40));
 687}
 688
 689static void dw_mipi_dsi_dphy_interface_config(struct dw_mipi_dsi *dsi)
 690{
 691        /*
 692         * TODO dw drv improvements
 693         * stop wait time should be the maximum between host dsi
 694         * and panel stop wait times
 695         */
 696        dsi_write(dsi, DSI_PHY_IF_CFG, PHY_STOP_WAIT_TIME(0x20) |
 697                  N_LANES(dsi->lanes));
 698}
 699
 700static void dw_mipi_dsi_dphy_init(struct dw_mipi_dsi *dsi)
 701{
 702        /* Clear PHY state */
 703        dsi_write(dsi, DSI_PHY_RSTZ, PHY_DISFORCEPLL | PHY_DISABLECLK
 704                  | PHY_RSTZ | PHY_SHUTDOWNZ);
 705        dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLR);
 706        dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLR);
 707        dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLR);
 708}
 709
 710static void dw_mipi_dsi_dphy_enable(struct dw_mipi_dsi *dsi)
 711{
 712        u32 val;
 713        int ret;
 714
 715        dsi_write(dsi, DSI_PHY_RSTZ, PHY_ENFORCEPLL | PHY_ENABLECLK |
 716                  PHY_UNRSTZ | PHY_UNSHUTDOWNZ);
 717
 718        ret = readl_poll_timeout(dsi->base + DSI_PHY_STATUS, val,
 719                                 val & PHY_LOCK, 1000, PHY_STATUS_TIMEOUT_US);
 720        if (ret)
 721                DRM_DEBUG_DRIVER("failed to wait phy lock state\n");
 722
 723        ret = readl_poll_timeout(dsi->base + DSI_PHY_STATUS,
 724                                 val, val & PHY_STOP_STATE_CLK_LANE, 1000,
 725                                 PHY_STATUS_TIMEOUT_US);
 726        if (ret)
 727                DRM_DEBUG_DRIVER("failed to wait phy clk lane stop state\n");
 728}
 729
 730static void dw_mipi_dsi_clear_err(struct dw_mipi_dsi *dsi)
 731{
 732        dsi_read(dsi, DSI_INT_ST0);
 733        dsi_read(dsi, DSI_INT_ST1);
 734        dsi_write(dsi, DSI_INT_MSK0, 0);
 735        dsi_write(dsi, DSI_INT_MSK1, 0);
 736}
 737
 738static void dw_mipi_dsi_bridge_post_disable(struct drm_bridge *bridge)
 739{
 740        struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge);
 741
 742        /*
 743         * Switch to command mode before panel-bridge post_disable &
 744         * panel unprepare.
 745         * Note: panel-bridge disable & panel disable has been called
 746         * before by the drm framework.
 747         */
 748        dw_mipi_dsi_set_mode(dsi, 0);
 749
 750        /*
 751         * TODO Only way found to call panel-bridge post_disable &
 752         * panel unprepare before the dsi "final" disable...
 753         * This needs to be fixed in the drm_bridge framework and the API
 754         * needs to be updated to manage our own call chains...
 755         */
 756        dsi->panel_bridge->funcs->post_disable(dsi->panel_bridge);
 757
 758        dw_mipi_dsi_disable(dsi);
 759        clk_disable_unprepare(dsi->pclk);
 760        pm_runtime_put(dsi->dev);
 761}
 762
 763static void dw_mipi_dsi_bridge_mode_set(struct drm_bridge *bridge,
 764                                        struct drm_display_mode *mode,
 765                                        struct drm_display_mode *adjusted_mode)
 766{
 767        struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge);
 768        const struct dw_mipi_dsi_phy_ops *phy_ops = dsi->plat_data->phy_ops;
 769        void *priv_data = dsi->plat_data->priv_data;
 770        int ret;
 771
 772        clk_prepare_enable(dsi->pclk);
 773
 774        ret = phy_ops->get_lane_mbps(priv_data, adjusted_mode, dsi->mode_flags,
 775                                     dsi->lanes, dsi->format, &dsi->lane_mbps);
 776        if (ret)
 777                DRM_DEBUG_DRIVER("Phy get_lane_mbps() failed\n");
 778
 779        pm_runtime_get_sync(dsi->dev);
 780        dw_mipi_dsi_init(dsi);
 781        dw_mipi_dsi_dpi_config(dsi, adjusted_mode);
 782        dw_mipi_dsi_packet_handler_config(dsi);
 783        dw_mipi_dsi_video_mode_config(dsi);
 784        dw_mipi_dsi_video_packet_config(dsi, adjusted_mode);
 785        dw_mipi_dsi_command_mode_config(dsi);
 786        dw_mipi_dsi_line_timer_config(dsi, adjusted_mode);
 787        dw_mipi_dsi_vertical_timing_config(dsi, adjusted_mode);
 788
 789        dw_mipi_dsi_dphy_init(dsi);
 790        dw_mipi_dsi_dphy_timing_config(dsi);
 791        dw_mipi_dsi_dphy_interface_config(dsi);
 792
 793        dw_mipi_dsi_clear_err(dsi);
 794
 795        ret = phy_ops->init(priv_data);
 796        if (ret)
 797                DRM_DEBUG_DRIVER("Phy init() failed\n");
 798
 799        dw_mipi_dsi_dphy_enable(dsi);
 800
 801        dw_mipi_dsi_wait_for_two_frames(adjusted_mode);
 802
 803        /* Switch to cmd mode for panel-bridge pre_enable & panel prepare */
 804        dw_mipi_dsi_set_mode(dsi, 0);
 805}
 806
 807static void dw_mipi_dsi_bridge_enable(struct drm_bridge *bridge)
 808{
 809        struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge);
 810
 811        /* Switch to video mode for panel-bridge enable & panel enable */
 812        dw_mipi_dsi_set_mode(dsi, MIPI_DSI_MODE_VIDEO);
 813}
 814
 815static enum drm_mode_status
 816dw_mipi_dsi_bridge_mode_valid(struct drm_bridge *bridge,
 817                              const struct drm_display_mode *mode)
 818{
 819        struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge);
 820        const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data;
 821        enum drm_mode_status mode_status = MODE_OK;
 822
 823        if (pdata->mode_valid)
 824                mode_status = pdata->mode_valid(pdata->priv_data, mode);
 825
 826        return mode_status;
 827}
 828
 829static int dw_mipi_dsi_bridge_attach(struct drm_bridge *bridge)
 830{
 831        struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge);
 832
 833        if (!bridge->encoder) {
 834                DRM_ERROR("Parent encoder object not found\n");
 835                return -ENODEV;
 836        }
 837
 838        /* Set the encoder type as caller does not know it */
 839        bridge->encoder->encoder_type = DRM_MODE_ENCODER_DSI;
 840
 841        /* Attach the panel-bridge to the dsi bridge */
 842        return drm_bridge_attach(bridge->encoder, dsi->panel_bridge, bridge);
 843}
 844
 845static const struct drm_bridge_funcs dw_mipi_dsi_bridge_funcs = {
 846        .mode_set     = dw_mipi_dsi_bridge_mode_set,
 847        .enable       = dw_mipi_dsi_bridge_enable,
 848        .post_disable = dw_mipi_dsi_bridge_post_disable,
 849        .mode_valid   = dw_mipi_dsi_bridge_mode_valid,
 850        .attach       = dw_mipi_dsi_bridge_attach,
 851};
 852
 853static struct dw_mipi_dsi *
 854__dw_mipi_dsi_probe(struct platform_device *pdev,
 855                    const struct dw_mipi_dsi_plat_data *plat_data)
 856{
 857        struct device *dev = &pdev->dev;
 858        struct reset_control *apb_rst;
 859        struct dw_mipi_dsi *dsi;
 860        struct resource *res;
 861        int ret;
 862
 863        dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
 864        if (!dsi)
 865                return ERR_PTR(-ENOMEM);
 866
 867        dsi->dev = dev;
 868        dsi->plat_data = plat_data;
 869
 870        if (!plat_data->phy_ops->init || !plat_data->phy_ops->get_lane_mbps) {
 871                DRM_ERROR("Phy not properly configured\n");
 872                return ERR_PTR(-ENODEV);
 873        }
 874
 875        if (!plat_data->base) {
 876                res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 877                if (!res)
 878                        return ERR_PTR(-ENODEV);
 879
 880                dsi->base = devm_ioremap_resource(dev, res);
 881                if (IS_ERR(dsi->base))
 882                        return ERR_PTR(-ENODEV);
 883
 884        } else {
 885                dsi->base = plat_data->base;
 886        }
 887
 888        dsi->pclk = devm_clk_get(dev, "pclk");
 889        if (IS_ERR(dsi->pclk)) {
 890                ret = PTR_ERR(dsi->pclk);
 891                dev_err(dev, "Unable to get pclk: %d\n", ret);
 892                return ERR_PTR(ret);
 893        }
 894
 895        /*
 896         * Note that the reset was not defined in the initial device tree, so
 897         * we have to be prepared for it not being found.
 898         */
 899        apb_rst = devm_reset_control_get_optional_exclusive(dev, "apb");
 900        if (IS_ERR(apb_rst)) {
 901                ret = PTR_ERR(apb_rst);
 902
 903                if (ret != -EPROBE_DEFER)
 904                        dev_err(dev, "Unable to get reset control: %d\n", ret);
 905
 906                return ERR_PTR(ret);
 907        }
 908
 909        if (apb_rst) {
 910                ret = clk_prepare_enable(dsi->pclk);
 911                if (ret) {
 912                        dev_err(dev, "%s: Failed to enable pclk\n", __func__);
 913                        return ERR_PTR(ret);
 914                }
 915
 916                reset_control_assert(apb_rst);
 917                usleep_range(10, 20);
 918                reset_control_deassert(apb_rst);
 919
 920                clk_disable_unprepare(dsi->pclk);
 921        }
 922
 923        pm_runtime_enable(dev);
 924
 925        dsi->dsi_host.ops = &dw_mipi_dsi_host_ops;
 926        dsi->dsi_host.dev = dev;
 927        ret = mipi_dsi_host_register(&dsi->dsi_host);
 928        if (ret) {
 929                dev_err(dev, "Failed to register MIPI host: %d\n", ret);
 930                return ERR_PTR(ret);
 931        }
 932
 933        dsi->bridge.driver_private = dsi;
 934        dsi->bridge.funcs = &dw_mipi_dsi_bridge_funcs;
 935#ifdef CONFIG_OF
 936        dsi->bridge.of_node = pdev->dev.of_node;
 937#endif
 938
 939        return dsi;
 940}
 941
 942static void __dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi)
 943{
 944        pm_runtime_disable(dsi->dev);
 945}
 946
 947/*
 948 * Probe/remove API, used from platforms based on the DRM bridge API.
 949 */
 950struct dw_mipi_dsi *
 951dw_mipi_dsi_probe(struct platform_device *pdev,
 952                  const struct dw_mipi_dsi_plat_data *plat_data)
 953{
 954        return __dw_mipi_dsi_probe(pdev, plat_data);
 955}
 956EXPORT_SYMBOL_GPL(dw_mipi_dsi_probe);
 957
 958void dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi)
 959{
 960        mipi_dsi_host_unregister(&dsi->dsi_host);
 961
 962        __dw_mipi_dsi_remove(dsi);
 963}
 964EXPORT_SYMBOL_GPL(dw_mipi_dsi_remove);
 965
 966/*
 967 * Bind/unbind API, used from platforms based on the component framework.
 968 */
 969struct dw_mipi_dsi *
 970dw_mipi_dsi_bind(struct platform_device *pdev, struct drm_encoder *encoder,
 971                 const struct dw_mipi_dsi_plat_data *plat_data)
 972{
 973        struct dw_mipi_dsi *dsi;
 974        int ret;
 975
 976        dsi = __dw_mipi_dsi_probe(pdev, plat_data);
 977        if (IS_ERR(dsi))
 978                return dsi;
 979
 980        ret = drm_bridge_attach(encoder, &dsi->bridge, NULL);
 981        if (ret) {
 982                dw_mipi_dsi_remove(dsi);
 983                DRM_ERROR("Failed to initialize bridge with drm\n");
 984                return ERR_PTR(ret);
 985        }
 986
 987        return dsi;
 988}
 989EXPORT_SYMBOL_GPL(dw_mipi_dsi_bind);
 990
 991void dw_mipi_dsi_unbind(struct dw_mipi_dsi *dsi)
 992{
 993        __dw_mipi_dsi_remove(dsi);
 994}
 995EXPORT_SYMBOL_GPL(dw_mipi_dsi_unbind);
 996
 997MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
 998MODULE_AUTHOR("Philippe Cornu <philippe.cornu@st.com>");
 999MODULE_DESCRIPTION("DW MIPI DSI host controller driver");
1000MODULE_LICENSE("GPL");
1001MODULE_ALIAS("platform:dw-mipi-dsi");
1002