linux/drivers/video/fbdev/exynos/exynos_mipi_dsi_lowlevel.c
<<
>>
Prefs
   1/* linux/drivers/video/exynos/exynos_mipi_dsi_lowlevel.c
   2 *
   3 * Samsung SoC MIPI-DSI lowlevel driver.
   4 *
   5 * Copyright (c) 2012 Samsung Electronics Co., Ltd
   6 *
   7 * InKi Dae, <inki.dae@samsung.com>
   8 * Donghwa Lee, <dh09.lee@samsung.com>
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License version 2 as
  12 * published by the Free Software Foundation.
  13*/
  14
  15#include <linux/module.h>
  16#include <linux/kernel.h>
  17#include <linux/errno.h>
  18#include <linux/mutex.h>
  19#include <linux/wait.h>
  20#include <linux/delay.h>
  21#include <linux/fs.h>
  22#include <linux/mm.h>
  23#include <linux/ctype.h>
  24#include <linux/platform_device.h>
  25#include <linux/io.h>
  26
  27#include <video/exynos_mipi_dsim.h>
  28
  29#include "exynos_mipi_dsi_regs.h"
  30#include "exynos_mipi_dsi_lowlevel.h"
  31
  32void exynos_mipi_dsi_func_reset(struct mipi_dsim_device *dsim)
  33{
  34        unsigned int reg;
  35
  36        reg = readl(dsim->reg_base + EXYNOS_DSIM_SWRST);
  37
  38        reg |= DSIM_FUNCRST;
  39
  40        writel(reg, dsim->reg_base + EXYNOS_DSIM_SWRST);
  41}
  42
  43void exynos_mipi_dsi_sw_reset(struct mipi_dsim_device *dsim)
  44{
  45        unsigned int reg;
  46
  47        reg = readl(dsim->reg_base + EXYNOS_DSIM_SWRST);
  48
  49        reg |= DSIM_SWRST;
  50
  51        writel(reg, dsim->reg_base + EXYNOS_DSIM_SWRST);
  52}
  53
  54void exynos_mipi_dsi_sw_reset_release(struct mipi_dsim_device *dsim)
  55{
  56        unsigned int reg;
  57
  58        reg = readl(dsim->reg_base + EXYNOS_DSIM_INTSRC);
  59
  60        reg |= INTSRC_SW_RST_RELEASE;
  61
  62        writel(reg, dsim->reg_base + EXYNOS_DSIM_INTSRC);
  63}
  64
  65int exynos_mipi_dsi_get_sw_reset_release(struct mipi_dsim_device *dsim)
  66{
  67        return (readl(dsim->reg_base + EXYNOS_DSIM_INTSRC)) &
  68                        INTSRC_SW_RST_RELEASE;
  69}
  70
  71unsigned int exynos_mipi_dsi_read_interrupt_mask(struct mipi_dsim_device *dsim)
  72{
  73        unsigned int reg;
  74
  75        reg = readl(dsim->reg_base + EXYNOS_DSIM_INTMSK);
  76
  77        return reg;
  78}
  79
  80void exynos_mipi_dsi_set_interrupt_mask(struct mipi_dsim_device *dsim,
  81                unsigned int mode, unsigned int mask)
  82{
  83        unsigned int reg = 0;
  84
  85        if (mask)
  86                reg |= mode;
  87        else
  88                reg &= ~mode;
  89
  90        writel(reg, dsim->reg_base + EXYNOS_DSIM_INTMSK);
  91}
  92
  93void exynos_mipi_dsi_init_fifo_pointer(struct mipi_dsim_device *dsim,
  94                unsigned int cfg)
  95{
  96        unsigned int reg;
  97
  98        reg = readl(dsim->reg_base + EXYNOS_DSIM_FIFOCTRL);
  99
 100        writel(reg & ~(cfg), dsim->reg_base + EXYNOS_DSIM_FIFOCTRL);
 101        mdelay(10);
 102        reg |= cfg;
 103
 104        writel(reg, dsim->reg_base + EXYNOS_DSIM_FIFOCTRL);
 105}
 106
 107/*
 108 * this function set PLL P, M and S value in D-PHY
 109 */
 110void exynos_mipi_dsi_set_phy_tunning(struct mipi_dsim_device *dsim,
 111                unsigned int value)
 112{
 113        writel(DSIM_AFC_CTL(value), dsim->reg_base + EXYNOS_DSIM_PHYACCHR);
 114}
 115
 116void exynos_mipi_dsi_set_main_stand_by(struct mipi_dsim_device *dsim,
 117                unsigned int enable)
 118{
 119        unsigned int reg;
 120
 121        reg = readl(dsim->reg_base + EXYNOS_DSIM_MDRESOL);
 122
 123        reg &= ~DSIM_MAIN_STAND_BY;
 124
 125        if (enable)
 126                reg |= DSIM_MAIN_STAND_BY;
 127
 128        writel(reg, dsim->reg_base + EXYNOS_DSIM_MDRESOL);
 129}
 130
 131void exynos_mipi_dsi_set_main_disp_resol(struct mipi_dsim_device *dsim,
 132        unsigned int width_resol, unsigned int height_resol)
 133{
 134        unsigned int reg;
 135
 136        /* standby should be set after configuration so set to not ready*/
 137        reg = (readl(dsim->reg_base + EXYNOS_DSIM_MDRESOL)) &
 138                ~(DSIM_MAIN_STAND_BY);
 139        writel(reg, dsim->reg_base + EXYNOS_DSIM_MDRESOL);
 140
 141        reg &= ~((0x7ff << 16) | (0x7ff << 0));
 142        reg |= DSIM_MAIN_VRESOL(height_resol) | DSIM_MAIN_HRESOL(width_resol);
 143
 144        reg |= DSIM_MAIN_STAND_BY;
 145        writel(reg, dsim->reg_base + EXYNOS_DSIM_MDRESOL);
 146}
 147
 148void exynos_mipi_dsi_set_main_disp_vporch(struct mipi_dsim_device *dsim,
 149        unsigned int cmd_allow, unsigned int vfront, unsigned int vback)
 150{
 151        unsigned int reg;
 152
 153        reg = (readl(dsim->reg_base + EXYNOS_DSIM_MVPORCH)) &
 154                ~((DSIM_CMD_ALLOW_MASK) | (DSIM_STABLE_VFP_MASK) |
 155                (DSIM_MAIN_VBP_MASK));
 156
 157        reg |= (DSIM_CMD_ALLOW_SHIFT(cmd_allow & 0xf) |
 158                DSIM_STABLE_VFP_SHIFT(vfront & 0x7ff) |
 159                DSIM_MAIN_VBP_SHIFT(vback & 0x7ff));
 160
 161        writel(reg, dsim->reg_base + EXYNOS_DSIM_MVPORCH);
 162}
 163
 164void exynos_mipi_dsi_set_main_disp_hporch(struct mipi_dsim_device *dsim,
 165        unsigned int front, unsigned int back)
 166{
 167        unsigned int reg;
 168
 169        reg = (readl(dsim->reg_base + EXYNOS_DSIM_MHPORCH)) &
 170                ~((DSIM_MAIN_HFP_MASK) | (DSIM_MAIN_HBP_MASK));
 171
 172        reg |= DSIM_MAIN_HFP_SHIFT(front) | DSIM_MAIN_HBP_SHIFT(back);
 173
 174        writel(reg, dsim->reg_base + EXYNOS_DSIM_MHPORCH);
 175}
 176
 177void exynos_mipi_dsi_set_main_disp_sync_area(struct mipi_dsim_device *dsim,
 178        unsigned int vert, unsigned int hori)
 179{
 180        unsigned int reg;
 181
 182        reg = (readl(dsim->reg_base + EXYNOS_DSIM_MSYNC)) &
 183                ~((DSIM_MAIN_VSA_MASK) | (DSIM_MAIN_HSA_MASK));
 184
 185        reg |= (DSIM_MAIN_VSA_SHIFT(vert & 0x3ff) |
 186                DSIM_MAIN_HSA_SHIFT(hori));
 187
 188        writel(reg, dsim->reg_base + EXYNOS_DSIM_MSYNC);
 189}
 190
 191void exynos_mipi_dsi_set_sub_disp_resol(struct mipi_dsim_device *dsim,
 192        unsigned int vert, unsigned int hori)
 193{
 194        unsigned int reg;
 195
 196        reg = (readl(dsim->reg_base + EXYNOS_DSIM_SDRESOL)) &
 197                ~(DSIM_SUB_STANDY_MASK);
 198
 199        writel(reg, dsim->reg_base + EXYNOS_DSIM_SDRESOL);
 200
 201        reg &= ~(DSIM_SUB_VRESOL_MASK) | ~(DSIM_SUB_HRESOL_MASK);
 202        reg |= (DSIM_SUB_VRESOL_SHIFT(vert & 0x7ff) |
 203                DSIM_SUB_HRESOL_SHIFT(hori & 0x7ff));
 204        writel(reg, dsim->reg_base + EXYNOS_DSIM_SDRESOL);
 205
 206        reg |= DSIM_SUB_STANDY_SHIFT(1);
 207        writel(reg, dsim->reg_base + EXYNOS_DSIM_SDRESOL);
 208}
 209
 210void exynos_mipi_dsi_init_config(struct mipi_dsim_device *dsim)
 211{
 212        struct mipi_dsim_config *dsim_config = dsim->dsim_config;
 213
 214        unsigned int cfg = (readl(dsim->reg_base + EXYNOS_DSIM_CONFIG)) &
 215                ~((1 << 28) | (0x1f << 20) | (0x3 << 5));
 216
 217        cfg =   ((DSIM_AUTO_FLUSH(dsim_config->auto_flush)) |
 218                (DSIM_EOT_DISABLE(dsim_config->eot_disable)) |
 219                (DSIM_AUTO_MODE_SHIFT(dsim_config->auto_vertical_cnt)) |
 220                (DSIM_HSE_MODE_SHIFT(dsim_config->hse)) |
 221                (DSIM_HFP_MODE_SHIFT(dsim_config->hfp)) |
 222                (DSIM_HBP_MODE_SHIFT(dsim_config->hbp)) |
 223                (DSIM_HSA_MODE_SHIFT(dsim_config->hsa)) |
 224                (DSIM_NUM_OF_DATALANE_SHIFT(dsim_config->e_no_data_lane)));
 225
 226        writel(cfg, dsim->reg_base + EXYNOS_DSIM_CONFIG);
 227}
 228
 229void exynos_mipi_dsi_display_config(struct mipi_dsim_device *dsim,
 230                                struct mipi_dsim_config *dsim_config)
 231{
 232        u32 reg = (readl(dsim->reg_base + EXYNOS_DSIM_CONFIG)) &
 233                ~((0x3 << 26) | (1 << 25) | (0x3 << 18) | (0x7 << 12) |
 234                (0x3 << 16) | (0x7 << 8));
 235
 236        if (dsim_config->e_interface == DSIM_VIDEO)
 237                reg |= (1 << 25);
 238        else if (dsim_config->e_interface == DSIM_COMMAND)
 239                reg &= ~(1 << 25);
 240        else {
 241                dev_err(dsim->dev, "unknown lcd type.\n");
 242                return;
 243        }
 244
 245        /* main lcd */
 246        reg |= ((u8) (dsim_config->e_burst_mode) & 0x3) << 26 |
 247                ((u8) (dsim_config->e_virtual_ch) & 0x3) << 18 |
 248                ((u8) (dsim_config->e_pixel_format) & 0x7) << 12;
 249
 250        writel(reg, dsim->reg_base + EXYNOS_DSIM_CONFIG);
 251}
 252
 253void exynos_mipi_dsi_enable_lane(struct mipi_dsim_device *dsim, unsigned int lane,
 254        unsigned int enable)
 255{
 256        unsigned int reg;
 257
 258        reg = readl(dsim->reg_base + EXYNOS_DSIM_CONFIG);
 259
 260        if (enable)
 261                reg |= DSIM_LANE_ENx(lane);
 262        else
 263                reg &= ~DSIM_LANE_ENx(lane);
 264
 265        writel(reg, dsim->reg_base + EXYNOS_DSIM_CONFIG);
 266}
 267
 268
 269void exynos_mipi_dsi_set_data_lane_number(struct mipi_dsim_device *dsim,
 270        unsigned int count)
 271{
 272        unsigned int cfg;
 273
 274        /* get the data lane number. */
 275        cfg = DSIM_NUM_OF_DATALANE_SHIFT(count);
 276
 277        writel(cfg, dsim->reg_base + EXYNOS_DSIM_CONFIG);
 278}
 279
 280void exynos_mipi_dsi_enable_afc(struct mipi_dsim_device *dsim, unsigned int enable,
 281        unsigned int afc_code)
 282{
 283        unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_PHYACCHR);
 284
 285        if (enable) {
 286                reg |= (1 << 14);
 287                reg &= ~(0x7 << 5);
 288                reg |= (afc_code & 0x7) << 5;
 289        } else
 290                reg &= ~(1 << 14);
 291
 292        writel(reg, dsim->reg_base + EXYNOS_DSIM_PHYACCHR);
 293}
 294
 295void exynos_mipi_dsi_enable_pll_bypass(struct mipi_dsim_device *dsim,
 296        unsigned int enable)
 297{
 298        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL)) &
 299                ~(DSIM_PLL_BYPASS_SHIFT(0x1));
 300
 301        reg |= DSIM_PLL_BYPASS_SHIFT(enable);
 302
 303        writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
 304}
 305
 306void exynos_mipi_dsi_set_pll_pms(struct mipi_dsim_device *dsim, unsigned int p,
 307        unsigned int m, unsigned int s)
 308{
 309        unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
 310
 311        reg |= ((p & 0x3f) << 13) | ((m & 0x1ff) << 4) | ((s & 0x7) << 1);
 312
 313        writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
 314}
 315
 316void exynos_mipi_dsi_pll_freq_band(struct mipi_dsim_device *dsim,
 317                unsigned int freq_band)
 318{
 319        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL)) &
 320                ~(DSIM_FREQ_BAND_SHIFT(0x1f));
 321
 322        reg |= DSIM_FREQ_BAND_SHIFT(freq_band & 0x1f);
 323
 324        writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
 325}
 326
 327void exynos_mipi_dsi_pll_freq(struct mipi_dsim_device *dsim,
 328                unsigned int pre_divider, unsigned int main_divider,
 329                unsigned int scaler)
 330{
 331        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL)) &
 332                ~(0x7ffff << 1);
 333
 334        reg |= (pre_divider & 0x3f) << 13 | (main_divider & 0x1ff) << 4 |
 335                (scaler & 0x7) << 1;
 336
 337        writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
 338}
 339
 340void exynos_mipi_dsi_pll_stable_time(struct mipi_dsim_device *dsim,
 341        unsigned int lock_time)
 342{
 343        writel(lock_time, dsim->reg_base + EXYNOS_DSIM_PLLTMR);
 344}
 345
 346void exynos_mipi_dsi_enable_pll(struct mipi_dsim_device *dsim, unsigned int enable)
 347{
 348        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL)) &
 349                ~(DSIM_PLL_EN_SHIFT(0x1));
 350
 351        reg |= DSIM_PLL_EN_SHIFT(enable & 0x1);
 352
 353        writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
 354}
 355
 356void exynos_mipi_dsi_set_byte_clock_src(struct mipi_dsim_device *dsim,
 357                unsigned int src)
 358{
 359        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL)) &
 360                ~(DSIM_BYTE_CLK_SRC_SHIFT(0x3));
 361
 362        reg |= (DSIM_BYTE_CLK_SRC_SHIFT(src));
 363
 364        writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
 365}
 366
 367void exynos_mipi_dsi_enable_byte_clock(struct mipi_dsim_device *dsim,
 368                unsigned int enable)
 369{
 370        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL)) &
 371                ~(DSIM_BYTE_CLKEN_SHIFT(0x1));
 372
 373        reg |= DSIM_BYTE_CLKEN_SHIFT(enable);
 374
 375        writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
 376}
 377
 378void exynos_mipi_dsi_set_esc_clk_prs(struct mipi_dsim_device *dsim,
 379                unsigned int enable, unsigned int prs_val)
 380{
 381        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL)) &
 382                ~(DSIM_ESC_CLKEN_SHIFT(0x1) | 0xffff);
 383
 384        reg |= DSIM_ESC_CLKEN_SHIFT(enable);
 385        if (enable)
 386                reg |= prs_val;
 387
 388        writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
 389}
 390
 391void exynos_mipi_dsi_enable_esc_clk_on_lane(struct mipi_dsim_device *dsim,
 392                unsigned int lane_sel, unsigned int enable)
 393{
 394        unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
 395
 396        if (enable)
 397                reg |= DSIM_LANE_ESC_CLKEN(lane_sel);
 398        else
 399
 400                reg &= ~DSIM_LANE_ESC_CLKEN(lane_sel);
 401
 402        writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
 403}
 404
 405void exynos_mipi_dsi_force_dphy_stop_state(struct mipi_dsim_device *dsim,
 406        unsigned int enable)
 407{
 408        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_ESCMODE)) &
 409                ~(DSIM_FORCE_STOP_STATE_SHIFT(0x1));
 410
 411        reg |= (DSIM_FORCE_STOP_STATE_SHIFT(enable & 0x1));
 412
 413        writel(reg, dsim->reg_base + EXYNOS_DSIM_ESCMODE);
 414}
 415
 416unsigned int exynos_mipi_dsi_is_lane_state(struct mipi_dsim_device *dsim)
 417{
 418        unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_STATUS);
 419
 420        /**
 421         * check clock and data lane states.
 422         * if MIPI-DSI controller was enabled at bootloader then
 423         * TX_READY_HS_CLK is enabled otherwise STOP_STATE_CLK.
 424         * so it should be checked for two case.
 425         */
 426        if ((reg & DSIM_STOP_STATE_DAT(0xf)) &&
 427                        ((reg & DSIM_STOP_STATE_CLK) ||
 428                         (reg & DSIM_TX_READY_HS_CLK)))
 429                return 1;
 430
 431        return 0;
 432}
 433
 434void exynos_mipi_dsi_set_stop_state_counter(struct mipi_dsim_device *dsim,
 435                unsigned int cnt_val)
 436{
 437        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_ESCMODE)) &
 438                ~(DSIM_STOP_STATE_CNT_SHIFT(0x7ff));
 439
 440        reg |= (DSIM_STOP_STATE_CNT_SHIFT(cnt_val & 0x7ff));
 441
 442        writel(reg, dsim->reg_base + EXYNOS_DSIM_ESCMODE);
 443}
 444
 445void exynos_mipi_dsi_set_bta_timeout(struct mipi_dsim_device *dsim,
 446                unsigned int timeout)
 447{
 448        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_TIMEOUT)) &
 449                ~(DSIM_BTA_TOUT_SHIFT(0xff));
 450
 451        reg |= (DSIM_BTA_TOUT_SHIFT(timeout));
 452
 453        writel(reg, dsim->reg_base + EXYNOS_DSIM_TIMEOUT);
 454}
 455
 456void exynos_mipi_dsi_set_lpdr_timeout(struct mipi_dsim_device *dsim,
 457                unsigned int timeout)
 458{
 459        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_TIMEOUT)) &
 460                ~(DSIM_LPDR_TOUT_SHIFT(0xffff));
 461
 462        reg |= (DSIM_LPDR_TOUT_SHIFT(timeout));
 463
 464        writel(reg, dsim->reg_base + EXYNOS_DSIM_TIMEOUT);
 465}
 466
 467void exynos_mipi_dsi_set_cpu_transfer_mode(struct mipi_dsim_device *dsim,
 468                unsigned int lp)
 469{
 470        unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_ESCMODE);
 471
 472        reg &= ~DSIM_CMD_LPDT_LP;
 473
 474        if (lp)
 475                reg |= DSIM_CMD_LPDT_LP;
 476
 477        writel(reg, dsim->reg_base + EXYNOS_DSIM_ESCMODE);
 478}
 479
 480void exynos_mipi_dsi_set_lcdc_transfer_mode(struct mipi_dsim_device *dsim,
 481                unsigned int lp)
 482{
 483        unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_ESCMODE);
 484
 485        reg &= ~DSIM_TX_LPDT_LP;
 486
 487        if (lp)
 488                reg |= DSIM_TX_LPDT_LP;
 489
 490        writel(reg, dsim->reg_base + EXYNOS_DSIM_ESCMODE);
 491}
 492
 493void exynos_mipi_dsi_enable_hs_clock(struct mipi_dsim_device *dsim,
 494                unsigned int enable)
 495{
 496        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL)) &
 497                ~(DSIM_TX_REQUEST_HSCLK_SHIFT(0x1));
 498
 499        reg |= DSIM_TX_REQUEST_HSCLK_SHIFT(enable);
 500
 501        writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
 502}
 503
 504void exynos_mipi_dsi_dp_dn_swap(struct mipi_dsim_device *dsim,
 505                unsigned int swap_en)
 506{
 507        unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_PHYACCHR1);
 508
 509        reg &= ~(0x3 << 0);
 510        reg |= (swap_en & 0x3) << 0;
 511
 512        writel(reg, dsim->reg_base + EXYNOS_DSIM_PHYACCHR1);
 513}
 514
 515void exynos_mipi_dsi_hs_zero_ctrl(struct mipi_dsim_device *dsim,
 516                unsigned int hs_zero)
 517{
 518        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL)) &
 519                ~(0xf << 28);
 520
 521        reg |= ((hs_zero & 0xf) << 28);
 522
 523        writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
 524}
 525
 526void exynos_mipi_dsi_prep_ctrl(struct mipi_dsim_device *dsim, unsigned int prep)
 527{
 528        unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL)) &
 529                ~(0x7 << 20);
 530
 531        reg |= ((prep & 0x7) << 20);
 532
 533        writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
 534}
 535
 536unsigned int exynos_mipi_dsi_read_interrupt(struct mipi_dsim_device *dsim)
 537{
 538        return readl(dsim->reg_base + EXYNOS_DSIM_INTSRC);
 539}
 540
 541void exynos_mipi_dsi_clear_interrupt(struct mipi_dsim_device *dsim,
 542                                        unsigned int src)
 543{
 544        unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_INTSRC);
 545
 546        reg |= src;
 547
 548        writel(reg, dsim->reg_base + EXYNOS_DSIM_INTSRC);
 549}
 550
 551void exynos_mipi_dsi_set_interrupt(struct mipi_dsim_device *dsim,
 552                                        unsigned int src, unsigned int enable)
 553{
 554        unsigned int reg = 0;
 555
 556        if (enable)
 557                reg |= src;
 558        else
 559                reg &= ~src;
 560
 561        writel(reg, dsim->reg_base + EXYNOS_DSIM_INTSRC);
 562}
 563
 564unsigned int exynos_mipi_dsi_is_pll_stable(struct mipi_dsim_device *dsim)
 565{
 566        unsigned int reg;
 567
 568        reg = readl(dsim->reg_base + EXYNOS_DSIM_STATUS);
 569
 570        return reg & (1 << 31) ? 1 : 0;
 571}
 572
 573unsigned int exynos_mipi_dsi_get_fifo_state(struct mipi_dsim_device *dsim)
 574{
 575        return readl(dsim->reg_base + EXYNOS_DSIM_FIFOCTRL) & ~(0x1f);
 576}
 577
 578void exynos_mipi_dsi_wr_tx_header(struct mipi_dsim_device *dsim,
 579        unsigned int di, unsigned int data0, unsigned int data1)
 580{
 581        unsigned int reg = (data1 << 16) | (data0 << 8) | ((di & 0x3f) << 0);
 582
 583        writel(reg, dsim->reg_base + EXYNOS_DSIM_PKTHDR);
 584}
 585
 586void exynos_mipi_dsi_rd_tx_header(struct mipi_dsim_device *dsim,
 587        unsigned int di, unsigned int data0)
 588{
 589        unsigned int reg = (data0 << 8) | (di << 0);
 590
 591        writel(reg, dsim->reg_base + EXYNOS_DSIM_PKTHDR);
 592}
 593
 594unsigned int exynos_mipi_dsi_rd_rx_fifo(struct mipi_dsim_device *dsim)
 595{
 596        return readl(dsim->reg_base + EXYNOS_DSIM_RXFIFO);
 597}
 598
 599unsigned int _exynos_mipi_dsi_get_frame_done_status(struct mipi_dsim_device *dsim)
 600{
 601        unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_INTSRC);
 602
 603        return (reg & INTSRC_FRAME_DONE) ? 1 : 0;
 604}
 605
 606void _exynos_mipi_dsi_clear_frame_done(struct mipi_dsim_device *dsim)
 607{
 608        unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_INTSRC);
 609
 610        writel(reg | INTSRC_FRAME_DONE, dsim->reg_base +
 611                EXYNOS_DSIM_INTSRC);
 612}
 613
 614void exynos_mipi_dsi_wr_tx_data(struct mipi_dsim_device *dsim,
 615                unsigned int tx_data)
 616{
 617        writel(tx_data, dsim->reg_base + EXYNOS_DSIM_PAYLOAD);
 618}
 619