1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Samsung MIPI DSIM bridge driver. 4 * 5 * Copyright (C) 2021 Amarula Solutions(India) 6 * Copyright (c) 2014 Samsung Electronics Co., Ltd 7 * Author: Jagan Teki <jagan@amarulasolutions.com> 8 * 9 * Based on exynos_drm_dsi from 10 * Tomasz Figa <t.figa@samsung.com> 11 */ 12 13 #include <linux/unaligned.h> 14 15 #include <linux/clk.h> 16 #include <linux/delay.h> 17 #include <linux/export.h> 18 #include <linux/irq.h> 19 #include <linux/media-bus-format.h> 20 #include <linux/of.h> 21 #include <linux/phy/phy.h> 22 #include <linux/platform_device.h> 23 #include <linux/units.h> 24 25 #include <video/mipi_display.h> 26 27 #include <drm/bridge/samsung-dsim.h> 28 #include <drm/drm_panel.h> 29 #include <drm/drm_print.h> 30 31 /* returns true iff both arguments logically differs */ 32 #define NEQV(a, b) (!(a) ^ !(b)) 33 34 /* DSIM_STATUS or DSIM_DPHY_STATUS */ 35 #define DSIM_STOP_STATE_DAT(x) (((x) & 0xf) << 0) 36 #define DSIM_STOP_STATE_CLK BIT(8) 37 #define DSIM_TX_READY_HS_CLK BIT(10) 38 39 /* DSIM_SWRST */ 40 #define DSIM_FUNCRST BIT(16) 41 #define DSIM_SWRST BIT(0) 42 43 /* DSIM_TIMEOUT */ 44 #define DSIM_LPDR_TIMEOUT(x) ((x) << 0) 45 #define DSIM_BTA_TIMEOUT(x) ((x) << 16) 46 47 /* DSIM_CLKCTRL */ 48 #define DSIM_ESC_PRESCALER(x) (((x) & 0xffff) << 0) 49 #define DSIM_ESC_PRESCALER_MASK (0xffff << 0) 50 #define DSIM_LANE_ESC_CLK_EN_DATA(x, offset) (((x) & 0xf) << offset) 51 #define DSIM_LANE_ESC_CLK_EN_DATA_MASK(offset) (0xf << offset) 52 #define DSIM_BYTE_CLK_SRC(x) (((x) & 0x3) << 25) 53 #define DSIM_BYTE_CLK_SRC_MASK (0x3 << 25) 54 #define DSIM_PLL_BYPASS BIT(27) 55 56 /* DSIM_CONFIG */ 57 #define DSIM_LANE_EN_CLK BIT(0) 58 #define DSIM_LANE_EN(x) (((x) & 0xf) << 1) 59 #define DSIM_NUM_OF_DATA_LANE(x) (((x) & 0x3) << 5) 60 #define DSIM_SUB_PIX_FORMAT(x) (((x) & 0x7) << 8) 61 #define DSIM_MAIN_PIX_FORMAT_MASK (0x7 << 12) 62 #define DSIM_MAIN_PIX_FORMAT_RGB888 (0x7 << 12) 63 #define DSIM_MAIN_PIX_FORMAT_RGB666 (0x6 << 12) 64 #define DSIM_MAIN_PIX_FORMAT_RGB666_P (0x5 << 12) 65 #define DSIM_MAIN_PIX_FORMAT_RGB565 (0x4 << 12) 66 #define DSIM_SUB_VC (((x) & 0x3) << 16) 67 #define DSIM_MAIN_VC (((x) & 0x3) << 18) 68 #define DSIM_HSA_DISABLE_MODE BIT(20) 69 #define DSIM_HBP_DISABLE_MODE BIT(21) 70 #define DSIM_HFP_DISABLE_MODE BIT(22) 71 /* 72 * The i.MX 8M Mini Applications Processor Reference Manual, 73 * Rev. 3, 11/2020 Page 4091 74 * The i.MX 8M Nano Applications Processor Reference Manual, 75 * Rev. 2, 07/2022 Page 3058 76 * The i.MX 8M Plus Applications Processor Reference Manual, 77 * Rev. 1, 06/2021 Page 5436 78 * all claims this bit is 'HseDisableMode' with the definition 79 * 0 = Disables transfer 80 * 1 = Enables transfer 81 * 82 * This clearly states that HSE is not a disabled bit. 83 * 84 * The naming convention follows as per the manual and the 85 * driver logic is based on the MIPI_DSI_MODE_VIDEO_HSE flag. 86 */ 87 #define DSIM_HSE_DISABLE_MODE BIT(23) 88 #define DSIM_AUTO_MODE BIT(24) 89 #define DSIM_BURST_MODE BIT(26) 90 #define DSIM_SYNC_INFORM BIT(27) 91 #define DSIM_EOT_DISABLE BIT(28) 92 #define DSIM_MFLUSH_VS BIT(29) 93 /* This flag is valid only for exynos3250/3472/5260/5430 */ 94 #define DSIM_CLKLANE_STOP BIT(30) 95 #define DSIM_NON_CONTINUOUS_CLKLANE BIT(31) 96 97 /* DSIM_ESCMODE */ 98 #define DSIM_TX_TRIGGER_RST BIT(4) 99 #define DSIM_TX_LPDT_LP BIT(6) 100 #define DSIM_CMD_LPDT_LP BIT(7) 101 #define DSIM_FORCE_BTA BIT(16) 102 #define DSIM_FORCE_STOP_STATE BIT(20) 103 #define DSIM_STOP_STATE_CNT(x) (((x) & 0x7ff) << 21) 104 #define DSIM_STOP_STATE_CNT_MASK (0x7ff << 21) 105 106 /* DSIM_MDRESOL */ 107 #define DSIM_MAIN_STAND_BY BIT(31) 108 #define DSIM_MAIN_VRESOL(x, num_bits) (((x) & ((1 << (num_bits)) - 1)) << 16) 109 #define DSIM_MAIN_HRESOL(x, num_bits) (((x) & ((1 << (num_bits)) - 1)) << 0) 110 111 /* DSIM_MVPORCH */ 112 #define DSIM_CMD_ALLOW(x) ((x) << 28) 113 #define DSIM_STABLE_VFP(x) ((x) << 16) 114 #define DSIM_MAIN_VBP(x) ((x) << 0) 115 #define DSIM_CMD_ALLOW_MASK (0xf << 28) 116 #define DSIM_STABLE_VFP_MASK (0x7ff << 16) 117 #define DSIM_MAIN_VBP_MASK (0x7ff << 0) 118 119 /* DSIM_MHPORCH */ 120 #define DSIM_MAIN_HFP(x) ((x) << 16) 121 #define DSIM_MAIN_HBP(x) ((x) << 0) 122 #define DSIM_MAIN_HFP_MASK ((0xffff) << 16) 123 #define DSIM_MAIN_HBP_MASK ((0xffff) << 0) 124 125 /* DSIM_MSYNC */ 126 #define DSIM_MAIN_VSA(x, offset) ((x) << offset) 127 #define DSIM_MAIN_HSA(x) ((x) << 0) 128 #define DSIM_MAIN_VSA_MASK(offset) ((0x3ff) << offset) 129 #define DSIM_MAIN_HSA_MASK ((0xffff) << 0) 130 131 /* DSIM_SDRESOL */ 132 #define DSIM_SUB_STANDY(x) ((x) << 31) 133 #define DSIM_SUB_VRESOL(x) ((x) << 16) 134 #define DSIM_SUB_HRESOL(x) ((x) << 0) 135 #define DSIM_SUB_STANDY_MASK ((0x1) << 31) 136 #define DSIM_SUB_VRESOL_MASK ((0x7ff) << 16) 137 #define DSIM_SUB_HRESOL_MASK ((0x7ff) << 0) 138 139 /* DSIM_INTSRC */ 140 #define DSIM_INT_PLL_STABLE BIT(31) 141 #define DSIM_INT_SW_RST_RELEASE BIT(30) 142 #define DSIM_INT_SFR_FIFO_EMPTY BIT(29) 143 #define DSIM_INT_SFR_HDR_FIFO_EMPTY BIT(28) 144 #define DSIM_INT_BTA BIT(25) 145 #define DSIM_INT_FRAME_DONE BIT(24) 146 #define DSIM_INT_RX_TIMEOUT BIT(21) 147 #define DSIM_INT_BTA_TIMEOUT BIT(20) 148 #define DSIM_INT_RX_DONE BIT(18) 149 #define DSIM_INT_RX_TE BIT(17) 150 #define DSIM_INT_RX_ACK BIT(16) 151 #define DSIM_INT_RX_ECC_ERR BIT(15) 152 #define DSIM_INT_RX_CRC_ERR BIT(14) 153 154 /* DSIM_SFRCTRL */ 155 #define DSIM_SFR_CTRL_STAND_BY BIT(4) 156 #define DSIM_SFR_CTRL_SHADOW_UPDATE BIT(1) 157 #define DSIM_SFR_CTRL_SHADOW_EN BIT(0) 158 159 /* DSIM_FIFOCTRL */ 160 #define DSIM_RX_DATA_FULL BIT(25) 161 #define DSIM_RX_DATA_EMPTY BIT(24) 162 #define DSIM_SFR_HEADER_FULL BIT(23) 163 #define DSIM_SFR_HEADER_EMPTY BIT(22) 164 #define DSIM_SFR_PAYLOAD_FULL BIT(21) 165 #define DSIM_SFR_PAYLOAD_EMPTY BIT(20) 166 #define DSIM_I80_HEADER_FULL BIT(19) 167 #define DSIM_I80_HEADER_EMPTY BIT(18) 168 #define DSIM_I80_PAYLOAD_FULL BIT(17) 169 #define DSIM_I80_PAYLOAD_EMPTY BIT(16) 170 #define DSIM_SD_HEADER_FULL BIT(15) 171 #define DSIM_SD_HEADER_EMPTY BIT(14) 172 #define DSIM_SD_PAYLOAD_FULL BIT(13) 173 #define DSIM_SD_PAYLOAD_EMPTY BIT(12) 174 #define DSIM_MD_HEADER_FULL BIT(11) 175 #define DSIM_MD_HEADER_EMPTY BIT(10) 176 #define DSIM_MD_PAYLOAD_FULL BIT(9) 177 #define DSIM_MD_PAYLOAD_EMPTY BIT(8) 178 #define DSIM_RX_FIFO BIT(4) 179 #define DSIM_SFR_FIFO BIT(3) 180 #define DSIM_I80_FIFO BIT(2) 181 #define DSIM_SD_FIFO BIT(1) 182 #define DSIM_MD_FIFO BIT(0) 183 184 /* DSIM_PHYACCHR */ 185 #define DSIM_AFC_EN BIT(14) 186 #define DSIM_AFC_CTL(x) (((x) & 0x7) << 5) 187 188 /* DSIM_PLLCTRL */ 189 #define DSIM_PLL_DPDNSWAP_CLK (1 << 25) 190 #define DSIM_PLL_DPDNSWAP_DAT (1 << 24) 191 #define DSIM_FREQ_BAND(x) ((x) << 24) 192 #define DSIM_PLL_EN BIT(23) 193 #define DSIM_PLL(x, offset) ((x) << (offset)) 194 195 /* DSIM_PHYCTRL */ 196 #define DSIM_PHYCTRL_ULPS_EXIT(x) (((x) & 0x1ff) << 0) 197 #define DSIM_PHYCTRL_B_DPHYCTL_VREG_LP BIT(30) 198 #define DSIM_PHYCTRL_B_DPHYCTL_SLEW_UP BIT(14) 199 200 /* DSIM_PHYTIMING */ 201 #define DSIM_PHYTIMING_LPX(x) ((x) << 8) 202 #define DSIM_PHYTIMING_HS_EXIT(x) ((x) << 0) 203 204 /* DSIM_PHYTIMING1 */ 205 #define DSIM_PHYTIMING1_CLK_PREPARE(x) ((x) << 24) 206 #define DSIM_PHYTIMING1_CLK_ZERO(x) ((x) << 16) 207 #define DSIM_PHYTIMING1_CLK_POST(x) ((x) << 8) 208 #define DSIM_PHYTIMING1_CLK_TRAIL(x) ((x) << 0) 209 210 /* DSIM_PHYTIMING2 */ 211 #define DSIM_PHYTIMING2_HS_PREPARE(x) ((x) << 16) 212 #define DSIM_PHYTIMING2_HS_ZERO(x) ((x) << 8) 213 #define DSIM_PHYTIMING2_HS_TRAIL(x) ((x) << 0) 214 215 #define DSI_MAX_BUS_WIDTH 4 216 #define DSI_NUM_VIRTUAL_CHANNELS 4 217 #define DSI_TX_FIFO_SIZE 2048 218 #define DSI_RX_FIFO_SIZE 256 219 #define DSI_XFER_TIMEOUT_MS 100 220 #define DSI_RX_FIFO_EMPTY 0x30800002 221 222 #define PS_TO_CYCLE(ps, hz) DIV64_U64_ROUND_CLOSEST(((ps) * (hz)), 1000000000000ULL) 223 224 enum samsung_dsim_transfer_type { 225 EXYNOS_DSI_TX, 226 EXYNOS_DSI_RX, 227 }; 228 229 static struct clk_bulk_data exynos3_clk_bulk_data[] = { 230 { .id = "bus_clk" }, 231 { .id = "pll_clk" }, 232 }; 233 234 static struct clk_bulk_data exynos4_clk_bulk_data[] = { 235 { .id = "bus_clk" }, 236 { .id = "sclk_mipi" }, 237 }; 238 239 static struct clk_bulk_data exynos5433_clk_bulk_data[] = { 240 { .id = "bus_clk" }, 241 { .id = "sclk_mipi" }, 242 { .id = "phyclk_mipidphy0_bitclkdiv8" }, 243 { .id = "phyclk_mipidphy0_rxclkesc0" }, 244 { .id = "sclk_rgb_vclk_to_dsim0" }, 245 }; 246 247 static struct clk_bulk_data exynos7870_clk_bulk_data[] = { 248 { .id = "bus" }, 249 { .id = "pll" }, 250 { .id = "byte" }, 251 { .id = "esc" }, 252 }; 253 254 enum reg_idx { 255 DSIM_STATUS_REG, /* Status register (legacy) */ 256 DSIM_LINK_STATUS_REG, /* Link status register */ 257 DSIM_DPHY_STATUS_REG, /* D-PHY status register */ 258 DSIM_SWRST_REG, /* Software reset register */ 259 DSIM_CLKCTRL_REG, /* Clock control register */ 260 DSIM_TIMEOUT_REG, /* Time out register */ 261 DSIM_CONFIG_REG, /* Configuration register */ 262 DSIM_ESCMODE_REG, /* Escape mode register */ 263 DSIM_MDRESOL_REG, 264 DSIM_MVPORCH_REG, /* Main display Vporch register */ 265 DSIM_MHPORCH_REG, /* Main display Hporch register */ 266 DSIM_MSYNC_REG, /* Main display sync area register */ 267 DSIM_INTSRC_REG, /* Interrupt source register */ 268 DSIM_INTMSK_REG, /* Interrupt mask register */ 269 DSIM_PKTHDR_REG, /* Packet Header FIFO register */ 270 DSIM_PAYLOAD_REG, /* Payload FIFO register */ 271 DSIM_RXFIFO_REG, /* Read FIFO register */ 272 DSIM_SFRCTRL_REG, /* SFR standby and shadow control register */ 273 DSIM_FIFOCTRL_REG, /* FIFO status and control register */ 274 DSIM_PLLCTRL_REG, /* PLL control register */ 275 DSIM_PHYCTRL_REG, 276 DSIM_PHYTIMING_REG, 277 DSIM_PHYTIMING1_REG, 278 DSIM_PHYTIMING2_REG, 279 NUM_REGS 280 }; 281 282 static const unsigned int exynos_reg_ofs[] = { 283 [DSIM_STATUS_REG] = 0x00, 284 [DSIM_SWRST_REG] = 0x04, 285 [DSIM_CLKCTRL_REG] = 0x08, 286 [DSIM_TIMEOUT_REG] = 0x0c, 287 [DSIM_CONFIG_REG] = 0x10, 288 [DSIM_ESCMODE_REG] = 0x14, 289 [DSIM_MDRESOL_REG] = 0x18, 290 [DSIM_MVPORCH_REG] = 0x1c, 291 [DSIM_MHPORCH_REG] = 0x20, 292 [DSIM_MSYNC_REG] = 0x24, 293 [DSIM_INTSRC_REG] = 0x2c, 294 [DSIM_INTMSK_REG] = 0x30, 295 [DSIM_PKTHDR_REG] = 0x34, 296 [DSIM_PAYLOAD_REG] = 0x38, 297 [DSIM_RXFIFO_REG] = 0x3c, 298 [DSIM_FIFOCTRL_REG] = 0x44, 299 [DSIM_PLLCTRL_REG] = 0x4c, 300 [DSIM_PHYCTRL_REG] = 0x5c, 301 [DSIM_PHYTIMING_REG] = 0x64, 302 [DSIM_PHYTIMING1_REG] = 0x68, 303 [DSIM_PHYTIMING2_REG] = 0x6c, 304 }; 305 306 static const unsigned int exynos5433_reg_ofs[] = { 307 [DSIM_STATUS_REG] = 0x04, 308 [DSIM_SWRST_REG] = 0x0C, 309 [DSIM_CLKCTRL_REG] = 0x10, 310 [DSIM_TIMEOUT_REG] = 0x14, 311 [DSIM_CONFIG_REG] = 0x18, 312 [DSIM_ESCMODE_REG] = 0x1C, 313 [DSIM_MDRESOL_REG] = 0x20, 314 [DSIM_MVPORCH_REG] = 0x24, 315 [DSIM_MHPORCH_REG] = 0x28, 316 [DSIM_MSYNC_REG] = 0x2C, 317 [DSIM_INTSRC_REG] = 0x34, 318 [DSIM_INTMSK_REG] = 0x38, 319 [DSIM_PKTHDR_REG] = 0x3C, 320 [DSIM_PAYLOAD_REG] = 0x40, 321 [DSIM_RXFIFO_REG] = 0x44, 322 [DSIM_FIFOCTRL_REG] = 0x4C, 323 [DSIM_PLLCTRL_REG] = 0x94, 324 [DSIM_PHYCTRL_REG] = 0xA4, 325 [DSIM_PHYTIMING_REG] = 0xB4, 326 [DSIM_PHYTIMING1_REG] = 0xB8, 327 [DSIM_PHYTIMING2_REG] = 0xBC, 328 }; 329 330 static const unsigned int exynos7870_reg_ofs[] = { 331 [DSIM_LINK_STATUS_REG] = 0x04, 332 [DSIM_DPHY_STATUS_REG] = 0x08, 333 [DSIM_SWRST_REG] = 0x0C, 334 [DSIM_CLKCTRL_REG] = 0x10, 335 [DSIM_TIMEOUT_REG] = 0x14, 336 [DSIM_ESCMODE_REG] = 0x1C, 337 [DSIM_MDRESOL_REG] = 0x20, 338 [DSIM_MVPORCH_REG] = 0x24, 339 [DSIM_MHPORCH_REG] = 0x28, 340 [DSIM_MSYNC_REG] = 0x2C, 341 [DSIM_CONFIG_REG] = 0x30, 342 [DSIM_INTSRC_REG] = 0x34, 343 [DSIM_INTMSK_REG] = 0x38, 344 [DSIM_PKTHDR_REG] = 0x3C, 345 [DSIM_PAYLOAD_REG] = 0x40, 346 [DSIM_RXFIFO_REG] = 0x44, 347 [DSIM_SFRCTRL_REG] = 0x48, 348 [DSIM_FIFOCTRL_REG] = 0x4C, 349 [DSIM_PLLCTRL_REG] = 0x94, 350 [DSIM_PHYCTRL_REG] = 0xA4, 351 [DSIM_PHYTIMING_REG] = 0xB4, 352 [DSIM_PHYTIMING1_REG] = 0xB8, 353 [DSIM_PHYTIMING2_REG] = 0xBC, 354 }; 355 356 enum reg_value_idx { 357 RESET_TYPE, 358 PLL_TIMER, 359 STOP_STATE_CNT, 360 PHYCTRL_ULPS_EXIT, 361 PHYCTRL_VREG_LP, 362 PHYCTRL_SLEW_UP, 363 PHYTIMING_LPX, 364 PHYTIMING_HS_EXIT, 365 PHYTIMING_CLK_PREPARE, 366 PHYTIMING_CLK_ZERO, 367 PHYTIMING_CLK_POST, 368 PHYTIMING_CLK_TRAIL, 369 PHYTIMING_HS_PREPARE, 370 PHYTIMING_HS_ZERO, 371 PHYTIMING_HS_TRAIL 372 }; 373 374 static const unsigned int reg_values[] = { 375 [RESET_TYPE] = DSIM_SWRST, 376 [PLL_TIMER] = 500, 377 [STOP_STATE_CNT] = 0xf, 378 [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0x0af), 379 [PHYCTRL_VREG_LP] = 0, 380 [PHYCTRL_SLEW_UP] = 0, 381 [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x06), 382 [PHYTIMING_HS_EXIT] = DSIM_PHYTIMING_HS_EXIT(0x0b), 383 [PHYTIMING_CLK_PREPARE] = DSIM_PHYTIMING1_CLK_PREPARE(0x07), 384 [PHYTIMING_CLK_ZERO] = DSIM_PHYTIMING1_CLK_ZERO(0x27), 385 [PHYTIMING_CLK_POST] = DSIM_PHYTIMING1_CLK_POST(0x0d), 386 [PHYTIMING_CLK_TRAIL] = DSIM_PHYTIMING1_CLK_TRAIL(0x08), 387 [PHYTIMING_HS_PREPARE] = DSIM_PHYTIMING2_HS_PREPARE(0x09), 388 [PHYTIMING_HS_ZERO] = DSIM_PHYTIMING2_HS_ZERO(0x0d), 389 [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0b), 390 }; 391 392 static const unsigned int exynos5422_reg_values[] = { 393 [RESET_TYPE] = DSIM_SWRST, 394 [PLL_TIMER] = 500, 395 [STOP_STATE_CNT] = 0xf, 396 [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0xaf), 397 [PHYCTRL_VREG_LP] = 0, 398 [PHYCTRL_SLEW_UP] = 0, 399 [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x08), 400 [PHYTIMING_HS_EXIT] = DSIM_PHYTIMING_HS_EXIT(0x0d), 401 [PHYTIMING_CLK_PREPARE] = DSIM_PHYTIMING1_CLK_PREPARE(0x09), 402 [PHYTIMING_CLK_ZERO] = DSIM_PHYTIMING1_CLK_ZERO(0x30), 403 [PHYTIMING_CLK_POST] = DSIM_PHYTIMING1_CLK_POST(0x0e), 404 [PHYTIMING_CLK_TRAIL] = DSIM_PHYTIMING1_CLK_TRAIL(0x0a), 405 [PHYTIMING_HS_PREPARE] = DSIM_PHYTIMING2_HS_PREPARE(0x0c), 406 [PHYTIMING_HS_ZERO] = DSIM_PHYTIMING2_HS_ZERO(0x11), 407 [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0d), 408 }; 409 410 static const unsigned int exynos5433_reg_values[] = { 411 [RESET_TYPE] = DSIM_FUNCRST, 412 [PLL_TIMER] = 22200, 413 [STOP_STATE_CNT] = 0xa, 414 [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0x190), 415 [PHYCTRL_VREG_LP] = DSIM_PHYCTRL_B_DPHYCTL_VREG_LP, 416 [PHYCTRL_SLEW_UP] = DSIM_PHYCTRL_B_DPHYCTL_SLEW_UP, 417 [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x07), 418 [PHYTIMING_HS_EXIT] = DSIM_PHYTIMING_HS_EXIT(0x0c), 419 [PHYTIMING_CLK_PREPARE] = DSIM_PHYTIMING1_CLK_PREPARE(0x09), 420 [PHYTIMING_CLK_ZERO] = DSIM_PHYTIMING1_CLK_ZERO(0x2d), 421 [PHYTIMING_CLK_POST] = DSIM_PHYTIMING1_CLK_POST(0x0e), 422 [PHYTIMING_CLK_TRAIL] = DSIM_PHYTIMING1_CLK_TRAIL(0x09), 423 [PHYTIMING_HS_PREPARE] = DSIM_PHYTIMING2_HS_PREPARE(0x0b), 424 [PHYTIMING_HS_ZERO] = DSIM_PHYTIMING2_HS_ZERO(0x10), 425 [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0c), 426 }; 427 428 static const unsigned int exynos7870_reg_values[] = { 429 [RESET_TYPE] = DSIM_SWRST, 430 [PLL_TIMER] = 80000, 431 [STOP_STATE_CNT] = 0xa, 432 [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0x177), 433 [PHYCTRL_VREG_LP] = 0, 434 [PHYCTRL_SLEW_UP] = 0, 435 [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x07), 436 [PHYTIMING_HS_EXIT] = DSIM_PHYTIMING_HS_EXIT(0x0c), 437 [PHYTIMING_CLK_PREPARE] = DSIM_PHYTIMING1_CLK_PREPARE(0x08), 438 [PHYTIMING_CLK_ZERO] = DSIM_PHYTIMING1_CLK_ZERO(0x2b), 439 [PHYTIMING_CLK_POST] = DSIM_PHYTIMING1_CLK_POST(0x0d), 440 [PHYTIMING_CLK_TRAIL] = DSIM_PHYTIMING1_CLK_TRAIL(0x09), 441 [PHYTIMING_HS_PREPARE] = DSIM_PHYTIMING2_HS_PREPARE(0x09), 442 [PHYTIMING_HS_ZERO] = DSIM_PHYTIMING2_HS_ZERO(0x0f), 443 [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0c), 444 }; 445 446 static const unsigned int imx8mm_dsim_reg_values[] = { 447 [RESET_TYPE] = DSIM_SWRST, 448 [PLL_TIMER] = 500, 449 [STOP_STATE_CNT] = 0xf, 450 [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0xaf), 451 [PHYCTRL_VREG_LP] = 0, 452 [PHYCTRL_SLEW_UP] = 0, 453 [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x06), 454 [PHYTIMING_HS_EXIT] = DSIM_PHYTIMING_HS_EXIT(0x0b), 455 [PHYTIMING_CLK_PREPARE] = DSIM_PHYTIMING1_CLK_PREPARE(0x07), 456 [PHYTIMING_CLK_ZERO] = DSIM_PHYTIMING1_CLK_ZERO(0x26), 457 [PHYTIMING_CLK_POST] = DSIM_PHYTIMING1_CLK_POST(0x0d), 458 [PHYTIMING_CLK_TRAIL] = DSIM_PHYTIMING1_CLK_TRAIL(0x08), 459 [PHYTIMING_HS_PREPARE] = DSIM_PHYTIMING2_HS_PREPARE(0x08), 460 [PHYTIMING_HS_ZERO] = DSIM_PHYTIMING2_HS_ZERO(0x0d), 461 [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0b), 462 }; 463 464 static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = { 465 .reg_ofs = exynos_reg_ofs, 466 .plltmr_reg = 0x50, 467 .has_legacy_status_reg = 1, 468 .has_freqband = 1, 469 .has_clklane_stop = 1, 470 .clk_data = exynos3_clk_bulk_data, 471 .num_clks = ARRAY_SIZE(exynos3_clk_bulk_data), 472 .max_freq = 1000, 473 .wait_for_hdr_fifo = 1, 474 .wait_for_reset = 1, 475 .num_bits_resol = 11, 476 .video_mode_bit = 25, 477 .pll_stable_bit = 31, 478 .esc_clken_bit = 28, 479 .byte_clken_bit = 24, 480 .tx_req_hsclk_bit = 31, 481 .lane_esc_clk_bit = 19, 482 .lane_esc_data_offset = 20, 483 .pll_p_offset = 13, 484 .pll_m_offset = 4, 485 .pll_s_offset = 1, 486 .main_vsa_offset = 22, 487 .reg_values = reg_values, 488 .pll_fin_min = 6, 489 .pll_fin_max = 12, 490 .m_min = 41, 491 .m_max = 125, 492 .min_freq = 500, 493 .has_broken_fifoctrl_emptyhdr = 1, 494 }; 495 496 static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = { 497 .reg_ofs = exynos_reg_ofs, 498 .plltmr_reg = 0x50, 499 .has_legacy_status_reg = 1, 500 .has_freqband = 1, 501 .has_clklane_stop = 1, 502 .clk_data = exynos4_clk_bulk_data, 503 .num_clks = ARRAY_SIZE(exynos4_clk_bulk_data), 504 .max_freq = 1000, 505 .wait_for_hdr_fifo = 1, 506 .wait_for_reset = 1, 507 .num_bits_resol = 11, 508 .video_mode_bit = 25, 509 .pll_stable_bit = 31, 510 .esc_clken_bit = 28, 511 .byte_clken_bit = 24, 512 .tx_req_hsclk_bit = 31, 513 .lane_esc_clk_bit = 19, 514 .lane_esc_data_offset = 20, 515 .pll_p_offset = 13, 516 .pll_m_offset = 4, 517 .pll_s_offset = 1, 518 .main_vsa_offset = 22, 519 .reg_values = reg_values, 520 .pll_fin_min = 6, 521 .pll_fin_max = 12, 522 .m_min = 41, 523 .m_max = 125, 524 .min_freq = 500, 525 .has_broken_fifoctrl_emptyhdr = 1, 526 }; 527 528 static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = { 529 .reg_ofs = exynos_reg_ofs, 530 .plltmr_reg = 0x58, 531 .has_legacy_status_reg = 1, 532 .clk_data = exynos3_clk_bulk_data, 533 .num_clks = ARRAY_SIZE(exynos3_clk_bulk_data), 534 .max_freq = 1000, 535 .wait_for_hdr_fifo = 1, 536 .wait_for_reset = 1, 537 .num_bits_resol = 11, 538 .video_mode_bit = 25, 539 .pll_stable_bit = 31, 540 .esc_clken_bit = 28, 541 .byte_clken_bit = 24, 542 .tx_req_hsclk_bit = 31, 543 .lane_esc_clk_bit = 19, 544 .lane_esc_data_offset = 20, 545 .pll_p_offset = 13, 546 .pll_m_offset = 4, 547 .pll_s_offset = 1, 548 .main_vsa_offset = 22, 549 .reg_values = reg_values, 550 .pll_fin_min = 6, 551 .pll_fin_max = 12, 552 .m_min = 41, 553 .m_max = 125, 554 .min_freq = 500, 555 }; 556 557 static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = { 558 .reg_ofs = exynos5433_reg_ofs, 559 .plltmr_reg = 0xa0, 560 .has_legacy_status_reg = 1, 561 .has_clklane_stop = 1, 562 .clk_data = exynos5433_clk_bulk_data, 563 .num_clks = ARRAY_SIZE(exynos5433_clk_bulk_data), 564 .max_freq = 1500, 565 .wait_for_hdr_fifo = 1, 566 .wait_for_reset = 0, 567 .num_bits_resol = 12, 568 .video_mode_bit = 25, 569 .pll_stable_bit = 31, 570 .esc_clken_bit = 28, 571 .byte_clken_bit = 24, 572 .tx_req_hsclk_bit = 31, 573 .lane_esc_clk_bit = 19, 574 .lane_esc_data_offset = 20, 575 .pll_p_offset = 13, 576 .pll_m_offset = 4, 577 .pll_s_offset = 1, 578 .main_vsa_offset = 22, 579 .reg_values = exynos5433_reg_values, 580 .pll_fin_min = 6, 581 .pll_fin_max = 12, 582 .m_min = 41, 583 .m_max = 125, 584 .min_freq = 500, 585 }; 586 587 static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = { 588 .reg_ofs = exynos5433_reg_ofs, 589 .plltmr_reg = 0xa0, 590 .has_legacy_status_reg = 1, 591 .has_clklane_stop = 1, 592 .clk_data = exynos3_clk_bulk_data, 593 .num_clks = ARRAY_SIZE(exynos3_clk_bulk_data), 594 .max_freq = 1500, 595 .wait_for_hdr_fifo = 1, 596 .wait_for_reset = 1, 597 .num_bits_resol = 12, 598 .video_mode_bit = 25, 599 .pll_stable_bit = 31, 600 .esc_clken_bit = 28, 601 .byte_clken_bit = 24, 602 .tx_req_hsclk_bit = 31, 603 .lane_esc_clk_bit = 19, 604 .lane_esc_data_offset = 20, 605 .pll_p_offset = 13, 606 .pll_m_offset = 4, 607 .pll_s_offset = 1, 608 .main_vsa_offset = 22, 609 .reg_values = exynos5422_reg_values, 610 .pll_fin_min = 6, 611 .pll_fin_max = 12, 612 .m_min = 41, 613 .m_max = 125, 614 .min_freq = 500, 615 }; 616 617 static const struct samsung_dsim_driver_data exynos7870_dsi_driver_data = { 618 .reg_ofs = exynos7870_reg_ofs, 619 .plltmr_reg = 0xa0, 620 .has_clklane_stop = 1, 621 .has_sfrctrl = 1, 622 .clk_data = exynos7870_clk_bulk_data, 623 .num_clks = ARRAY_SIZE(exynos7870_clk_bulk_data), 624 .max_freq = 1500, 625 .wait_for_hdr_fifo = 0, 626 .wait_for_reset = 1, 627 .num_bits_resol = 12, 628 .video_mode_bit = 18, 629 .pll_stable_bit = 24, 630 .esc_clken_bit = 16, 631 .byte_clken_bit = 17, 632 .tx_req_hsclk_bit = 20, 633 .lane_esc_clk_bit = 8, 634 .lane_esc_data_offset = 9, 635 .pll_p_offset = 13, 636 .pll_m_offset = 3, 637 .pll_s_offset = 0, 638 .main_vsa_offset = 16, 639 .reg_values = exynos7870_reg_values, 640 .pll_fin_min = 6, 641 .pll_fin_max = 12, 642 .m_min = 41, 643 .m_max = 125, 644 .min_freq = 500, 645 }; 646 647 static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = { 648 .reg_ofs = exynos5433_reg_ofs, 649 .plltmr_reg = 0xa0, 650 .has_legacy_status_reg = 1, 651 .has_clklane_stop = 1, 652 .clk_data = exynos4_clk_bulk_data, 653 .num_clks = ARRAY_SIZE(exynos4_clk_bulk_data), 654 .max_freq = 2100, 655 .wait_for_hdr_fifo = 1, 656 .wait_for_reset = 0, 657 .num_bits_resol = 12, 658 .video_mode_bit = 25, 659 .pll_stable_bit = 31, 660 .esc_clken_bit = 28, 661 .byte_clken_bit = 24, 662 .tx_req_hsclk_bit = 31, 663 .lane_esc_clk_bit = 19, 664 .lane_esc_data_offset = 20, 665 /* 666 * Unlike Exynos, PLL_P(PMS_P) offset 14 is used in i.MX8M Mini/Nano/Plus 667 * downstream driver - drivers/gpu/drm/bridge/sec-dsim.c 668 */ 669 .pll_p_offset = 14, 670 .pll_m_offset = 4, 671 .pll_s_offset = 1, 672 .main_vsa_offset = 22, 673 .reg_values = imx8mm_dsim_reg_values, 674 .pll_fin_min = 2, 675 .pll_fin_max = 30, 676 .m_min = 64, 677 .m_max = 1023, 678 .min_freq = 1050, 679 }; 680 681 static const struct samsung_dsim_driver_data * 682 samsung_dsim_types[DSIM_TYPE_COUNT] = { 683 [DSIM_TYPE_EXYNOS3250] = &exynos3_dsi_driver_data, 684 [DSIM_TYPE_EXYNOS4210] = &exynos4_dsi_driver_data, 685 [DSIM_TYPE_EXYNOS5410] = &exynos5_dsi_driver_data, 686 [DSIM_TYPE_EXYNOS5422] = &exynos5422_dsi_driver_data, 687 [DSIM_TYPE_EXYNOS5433] = &exynos5433_dsi_driver_data, 688 [DSIM_TYPE_EXYNOS7870] = &exynos7870_dsi_driver_data, 689 [DSIM_TYPE_IMX8MM] = &imx8mm_dsi_driver_data, 690 [DSIM_TYPE_IMX8MP] = &imx8mm_dsi_driver_data, 691 }; 692 693 static inline struct samsung_dsim *host_to_dsi(struct mipi_dsi_host *h) 694 { 695 return container_of(h, struct samsung_dsim, dsi_host); 696 } 697 698 static inline struct samsung_dsim *bridge_to_dsi(struct drm_bridge *b) 699 { 700 return container_of(b, struct samsung_dsim, bridge); 701 } 702 703 static inline void samsung_dsim_write(struct samsung_dsim *dsi, 704 enum reg_idx idx, u32 val) 705 { 706 writel(val, dsi->reg_base + dsi->driver_data->reg_ofs[idx]); 707 } 708 709 static inline u32 samsung_dsim_read(struct samsung_dsim *dsi, enum reg_idx idx) 710 { 711 return readl(dsi->reg_base + dsi->driver_data->reg_ofs[idx]); 712 } 713 714 static void samsung_dsim_wait_for_reset(struct samsung_dsim *dsi) 715 { 716 if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300))) 717 return; 718 719 dev_err(dsi->dev, "timeout waiting for reset\n"); 720 } 721 722 static void samsung_dsim_reset(struct samsung_dsim *dsi) 723 { 724 u32 reset_val = dsi->driver_data->reg_values[RESET_TYPE]; 725 726 reinit_completion(&dsi->completed); 727 samsung_dsim_write(dsi, DSIM_SWRST_REG, reset_val); 728 } 729 730 static unsigned long samsung_dsim_pll_find_pms(struct samsung_dsim *dsi, 731 unsigned long fin, 732 unsigned long fout, 733 u8 *p, u16 *m, u8 *s) 734 { 735 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; 736 unsigned long best_freq = 0; 737 u32 min_delta = 0xffffffff; 738 u8 p_min, p_max; 739 u8 _p, best_p; 740 u16 _m, best_m; 741 u8 _s, best_s; 742 743 p_min = DIV_ROUND_UP(fin, (driver_data->pll_fin_max * HZ_PER_MHZ)); 744 p_max = fin / (driver_data->pll_fin_min * HZ_PER_MHZ); 745 746 for (_p = p_min; _p <= p_max; ++_p) { 747 for (_s = 0; _s <= 5; ++_s) { 748 u64 tmp; 749 u32 delta; 750 751 tmp = (u64)fout * (_p << _s); 752 do_div(tmp, fin); 753 _m = tmp; 754 if (_m < driver_data->m_min || _m > driver_data->m_max) 755 continue; 756 757 tmp = (u64)_m * fin; 758 do_div(tmp, _p); 759 if (tmp < driver_data->min_freq * HZ_PER_MHZ || 760 tmp > driver_data->max_freq * HZ_PER_MHZ) 761 continue; 762 763 tmp = (u64)_m * fin; 764 do_div(tmp, _p << _s); 765 766 delta = abs(fout - tmp); 767 if (delta < min_delta) { 768 best_p = _p; 769 best_m = _m; 770 best_s = _s; 771 min_delta = delta; 772 best_freq = tmp; 773 } 774 } 775 } 776 777 if (best_freq) { 778 *p = best_p; 779 *m = best_m; 780 *s = best_s; 781 } 782 783 return best_freq; 784 } 785 786 static unsigned long samsung_dsim_set_pll(struct samsung_dsim *dsi, 787 unsigned long freq) 788 { 789 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; 790 unsigned long fin, fout; 791 int timeout; 792 u8 p, s; 793 u16 m; 794 u32 reg; 795 796 if (dsi->pll_clk) { 797 /* 798 * Ensure that the reference clock is generated with a power of 799 * two divider from its parent, but close to the PLLs upper 800 * limit. 801 */ 802 fin = clk_get_rate(clk_get_parent(dsi->pll_clk)); 803 while (fin > driver_data->pll_fin_max * HZ_PER_MHZ) 804 fin /= 2; 805 clk_set_rate(dsi->pll_clk, fin); 806 807 fin = clk_get_rate(dsi->pll_clk); 808 } else { 809 fin = dsi->pll_clk_rate; 810 } 811 dev_dbg(dsi->dev, "PLL ref clock freq %lu\n", fin); 812 813 fout = samsung_dsim_pll_find_pms(dsi, fin, freq, &p, &m, &s); 814 if (!fout) { 815 dev_err(dsi->dev, 816 "failed to find PLL PMS for requested frequency\n"); 817 return 0; 818 } 819 dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s); 820 821 writel(driver_data->reg_values[PLL_TIMER], 822 dsi->reg_base + driver_data->plltmr_reg); 823 824 reg = DSIM_PLL_EN | DSIM_PLL(p, driver_data->pll_p_offset) 825 | DSIM_PLL(m, driver_data->pll_m_offset) 826 | DSIM_PLL(s, driver_data->pll_s_offset); 827 828 if (driver_data->has_freqband) { 829 static const unsigned long freq_bands[] = { 830 100 * HZ_PER_MHZ, 120 * HZ_PER_MHZ, 160 * HZ_PER_MHZ, 831 200 * HZ_PER_MHZ, 270 * HZ_PER_MHZ, 320 * HZ_PER_MHZ, 832 390 * HZ_PER_MHZ, 450 * HZ_PER_MHZ, 510 * HZ_PER_MHZ, 833 560 * HZ_PER_MHZ, 640 * HZ_PER_MHZ, 690 * HZ_PER_MHZ, 834 770 * HZ_PER_MHZ, 870 * HZ_PER_MHZ, 950 * HZ_PER_MHZ, 835 }; 836 int band; 837 838 for (band = 0; band < ARRAY_SIZE(freq_bands); ++band) 839 if (fout < freq_bands[band]) 840 break; 841 842 dev_dbg(dsi->dev, "band %d\n", band); 843 844 reg |= DSIM_FREQ_BAND(band); 845 } 846 847 if (dsi->swap_dn_dp_clk) 848 reg |= DSIM_PLL_DPDNSWAP_CLK; 849 if (dsi->swap_dn_dp_data) 850 reg |= DSIM_PLL_DPDNSWAP_DAT; 851 852 samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg); 853 854 timeout = 3000; 855 do { 856 if (timeout-- == 0) { 857 dev_err(dsi->dev, "PLL failed to stabilize\n"); 858 return 0; 859 } 860 if (driver_data->has_legacy_status_reg) 861 reg = samsung_dsim_read(dsi, DSIM_STATUS_REG); 862 else 863 reg = samsung_dsim_read(dsi, DSIM_LINK_STATUS_REG); 864 } while ((reg & BIT(driver_data->pll_stable_bit)) == 0); 865 866 dsi->hs_clock = fout; 867 868 return fout; 869 } 870 871 static int samsung_dsim_enable_clock(struct samsung_dsim *dsi) 872 { 873 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; 874 unsigned long hs_clk, byte_clk, esc_clk, pix_clk; 875 unsigned long esc_div; 876 u32 reg; 877 struct drm_display_mode *m = &dsi->mode; 878 int bpp = mipi_dsi_pixel_format_to_bpp(dsi->format); 879 880 /* m->clock is in KHz */ 881 pix_clk = m->clock * 1000; 882 883 /* Use burst_clk_rate if available, otherwise use the pix_clk */ 884 if (dsi->burst_clk_rate) 885 hs_clk = samsung_dsim_set_pll(dsi, dsi->burst_clk_rate); 886 else 887 hs_clk = samsung_dsim_set_pll(dsi, DIV_ROUND_UP(pix_clk * bpp, dsi->lanes)); 888 889 if (!hs_clk) { 890 dev_err(dsi->dev, "failed to configure DSI PLL\n"); 891 return -EFAULT; 892 } 893 894 byte_clk = hs_clk / 8; 895 esc_div = DIV_ROUND_UP(byte_clk, dsi->esc_clk_rate); 896 esc_clk = byte_clk / esc_div; 897 898 if (esc_clk > 20 * HZ_PER_MHZ) { 899 ++esc_div; 900 esc_clk = byte_clk / esc_div; 901 } 902 903 dev_dbg(dsi->dev, "hs_clk = %lu, byte_clk = %lu, esc_clk = %lu\n", 904 hs_clk, byte_clk, esc_clk); 905 906 reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG); 907 reg &= ~(DSIM_ESC_PRESCALER_MASK | BIT(driver_data->lane_esc_clk_bit) 908 | DSIM_LANE_ESC_CLK_EN_DATA_MASK(driver_data->lane_esc_data_offset) 909 | DSIM_PLL_BYPASS 910 | DSIM_BYTE_CLK_SRC_MASK); 911 reg |= BIT(driver_data->esc_clken_bit) | BIT(driver_data->byte_clken_bit) 912 | DSIM_ESC_PRESCALER(esc_div) 913 | BIT(driver_data->lane_esc_clk_bit) 914 | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1, 915 driver_data->lane_esc_data_offset) 916 | DSIM_BYTE_CLK_SRC(0) 917 | BIT(driver_data->tx_req_hsclk_bit); 918 samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg); 919 920 return 0; 921 } 922 923 static void samsung_dsim_set_phy_ctrl(struct samsung_dsim *dsi) 924 { 925 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; 926 const unsigned int *reg_values = driver_data->reg_values; 927 u32 reg; 928 struct phy_configure_opts_mipi_dphy cfg; 929 int clk_prepare, lpx, clk_zero, clk_post, clk_trail; 930 int hs_exit, hs_prepare, hs_zero, hs_trail; 931 unsigned long long byte_clock = dsi->hs_clock / 8; 932 933 if (driver_data->has_freqband) 934 return; 935 936 phy_mipi_dphy_get_default_config_for_hsclk(dsi->hs_clock, 937 dsi->lanes, &cfg); 938 939 /* 940 * TODO: 941 * The tech Applications Processor manuals for i.MX8M Mini, Nano, 942 * and Plus don't state what the definition of the PHYTIMING 943 * bits are beyond their address and bit position. 944 * After reviewing NXP's downstream code, it appears 945 * that the various PHYTIMING registers take the number 946 * of cycles and use various dividers on them. This 947 * calculation does not result in an exact match to the 948 * downstream code, but it is very close to the values 949 * generated by their lookup table, and it appears 950 * to sync at a variety of resolutions. If someone 951 * can get a more accurate mathematical equation needed 952 * for these registers, this should be updated. 953 */ 954 955 lpx = PS_TO_CYCLE(cfg.lpx, byte_clock); 956 hs_exit = PS_TO_CYCLE(cfg.hs_exit, byte_clock); 957 clk_prepare = PS_TO_CYCLE(cfg.clk_prepare, byte_clock); 958 clk_zero = PS_TO_CYCLE(cfg.clk_zero, byte_clock); 959 clk_post = PS_TO_CYCLE(cfg.clk_post, byte_clock); 960 clk_trail = PS_TO_CYCLE(cfg.clk_trail, byte_clock); 961 hs_prepare = PS_TO_CYCLE(cfg.hs_prepare, byte_clock); 962 hs_zero = PS_TO_CYCLE(cfg.hs_zero, byte_clock); 963 hs_trail = PS_TO_CYCLE(cfg.hs_trail, byte_clock); 964 965 /* B D-PHY: D-PHY Master & Slave Analog Block control */ 966 reg = reg_values[PHYCTRL_ULPS_EXIT] | reg_values[PHYCTRL_VREG_LP] | 967 reg_values[PHYCTRL_SLEW_UP]; 968 969 samsung_dsim_write(dsi, DSIM_PHYCTRL_REG, reg); 970 971 /* 972 * T LPX: Transmitted length of any Low-Power state period 973 * T HS-EXIT: Time that the transmitter drives LP-11 following a HS 974 * burst 975 */ 976 977 reg = DSIM_PHYTIMING_LPX(lpx) | DSIM_PHYTIMING_HS_EXIT(hs_exit); 978 979 samsung_dsim_write(dsi, DSIM_PHYTIMING_REG, reg); 980 981 /* 982 * T CLK-PREPARE: Time that the transmitter drives the Clock Lane LP-00 983 * Line state immediately before the HS-0 Line state starting the 984 * HS transmission 985 * T CLK-ZERO: Time that the transmitter drives the HS-0 state prior to 986 * transmitting the Clock. 987 * T CLK_POST: Time that the transmitter continues to send HS clock 988 * after the last associated Data Lane has transitioned to LP Mode 989 * Interval is defined as the period from the end of T HS-TRAIL to 990 * the beginning of T CLK-TRAIL 991 * T CLK-TRAIL: Time that the transmitter drives the HS-0 state after 992 * the last payload clock bit of a HS transmission burst 993 */ 994 995 reg = DSIM_PHYTIMING1_CLK_PREPARE(clk_prepare) | 996 DSIM_PHYTIMING1_CLK_ZERO(clk_zero) | 997 DSIM_PHYTIMING1_CLK_POST(clk_post) | 998 DSIM_PHYTIMING1_CLK_TRAIL(clk_trail); 999 1000 samsung_dsim_write(dsi, DSIM_PHYTIMING1_REG, reg); 1001 1002 /* 1003 * T HS-PREPARE: Time that the transmitter drives the Data Lane LP-00 1004 * Line state immediately before the HS-0 Line state starting the 1005 * HS transmission 1006 * T HS-ZERO: Time that the transmitter drives the HS-0 state prior to 1007 * transmitting the Sync sequence. 1008 * T HS-TRAIL: Time that the transmitter drives the flipped differential 1009 * state after last payload data bit of a HS transmission burst 1010 */ 1011 1012 reg = DSIM_PHYTIMING2_HS_PREPARE(hs_prepare) | 1013 DSIM_PHYTIMING2_HS_ZERO(hs_zero) | 1014 DSIM_PHYTIMING2_HS_TRAIL(hs_trail); 1015 1016 samsung_dsim_write(dsi, DSIM_PHYTIMING2_REG, reg); 1017 } 1018 1019 static void samsung_dsim_disable_clock(struct samsung_dsim *dsi) 1020 { 1021 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; 1022 u32 reg; 1023 1024 reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG); 1025 reg &= ~(BIT(driver_data->lane_esc_clk_bit) 1026 | DSIM_LANE_ESC_CLK_EN_DATA_MASK(driver_data->lane_esc_data_offset) 1027 | BIT(driver_data->esc_clken_bit) 1028 | BIT(driver_data->byte_clken_bit)); 1029 samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg); 1030 1031 reg = samsung_dsim_read(dsi, DSIM_PLLCTRL_REG); 1032 reg &= ~DSIM_PLL_EN; 1033 samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg); 1034 } 1035 1036 static void samsung_dsim_enable_lane(struct samsung_dsim *dsi, u32 lane) 1037 { 1038 u32 reg = samsung_dsim_read(dsi, DSIM_CONFIG_REG); 1039 1040 reg |= (DSIM_NUM_OF_DATA_LANE(dsi->lanes - 1) | DSIM_LANE_EN_CLK | 1041 DSIM_LANE_EN(lane)); 1042 samsung_dsim_write(dsi, DSIM_CONFIG_REG, reg); 1043 } 1044 1045 static int samsung_dsim_init_link(struct samsung_dsim *dsi) 1046 { 1047 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; 1048 int timeout; 1049 u32 reg; 1050 u32 lanes_mask; 1051 1052 /* Initialize FIFO pointers */ 1053 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG); 1054 reg &= ~0x1f; 1055 samsung_dsim_write(dsi, DSIM_FIFOCTRL_REG, reg); 1056 1057 usleep_range(9000, 11000); 1058 1059 reg |= 0x1f; 1060 samsung_dsim_write(dsi, DSIM_FIFOCTRL_REG, reg); 1061 usleep_range(9000, 11000); 1062 1063 /* DSI configuration */ 1064 reg = 0; 1065 1066 /* 1067 * The first bit of mode_flags specifies display configuration. 1068 * If this bit is set[= MIPI_DSI_MODE_VIDEO], dsi will support video 1069 * mode, otherwise it will support command mode. 1070 */ 1071 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { 1072 reg |= BIT(driver_data->video_mode_bit); 1073 1074 /* 1075 * The user manual describes that following bits are ignored in 1076 * command mode. 1077 */ 1078 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) 1079 reg |= DSIM_SYNC_INFORM; 1080 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) 1081 reg |= DSIM_BURST_MODE; 1082 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_AUTO_VERT) 1083 reg |= DSIM_AUTO_MODE; 1084 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HSE) 1085 reg |= DSIM_HSE_DISABLE_MODE; 1086 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HFP) 1087 reg |= DSIM_HFP_DISABLE_MODE; 1088 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HBP) 1089 reg |= DSIM_HBP_DISABLE_MODE; 1090 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HSA) 1091 reg |= DSIM_HSA_DISABLE_MODE; 1092 } 1093 1094 if (dsi->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET) 1095 reg |= DSIM_EOT_DISABLE; 1096 1097 switch (dsi->format) { 1098 case MIPI_DSI_FMT_RGB888: 1099 reg |= DSIM_MAIN_PIX_FORMAT_RGB888; 1100 break; 1101 case MIPI_DSI_FMT_RGB666: 1102 reg |= DSIM_MAIN_PIX_FORMAT_RGB666; 1103 break; 1104 case MIPI_DSI_FMT_RGB666_PACKED: 1105 reg |= DSIM_MAIN_PIX_FORMAT_RGB666_P; 1106 break; 1107 case MIPI_DSI_FMT_RGB565: 1108 reg |= DSIM_MAIN_PIX_FORMAT_RGB565; 1109 break; 1110 default: 1111 dev_err(dsi->dev, "invalid pixel format\n"); 1112 return -EINVAL; 1113 } 1114 1115 /* 1116 * Use non-continuous clock mode if the periparal wants and 1117 * host controller supports 1118 * 1119 * In non-continous clock mode, host controller will turn off 1120 * the HS clock between high-speed transmissions to reduce 1121 * power consumption. 1122 */ 1123 if (driver_data->has_clklane_stop && 1124 dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) { 1125 if (!samsung_dsim_hw_is_exynos(dsi->plat_data->hw_type)) 1126 reg |= DSIM_NON_CONTINUOUS_CLKLANE; 1127 1128 reg |= DSIM_CLKLANE_STOP; 1129 } 1130 samsung_dsim_write(dsi, DSIM_CONFIG_REG, reg); 1131 1132 lanes_mask = BIT(dsi->lanes) - 1; 1133 samsung_dsim_enable_lane(dsi, lanes_mask); 1134 1135 /* Check clock and data lane state are stop state */ 1136 timeout = 100; 1137 do { 1138 if (timeout-- == 0) { 1139 dev_err(dsi->dev, "waiting for bus lanes timed out\n"); 1140 return -EFAULT; 1141 } 1142 1143 if (driver_data->has_legacy_status_reg) 1144 reg = samsung_dsim_read(dsi, DSIM_STATUS_REG); 1145 else 1146 reg = samsung_dsim_read(dsi, DSIM_DPHY_STATUS_REG); 1147 if ((reg & DSIM_STOP_STATE_DAT(lanes_mask)) 1148 != DSIM_STOP_STATE_DAT(lanes_mask)) 1149 continue; 1150 } while (!(reg & (DSIM_STOP_STATE_CLK | DSIM_TX_READY_HS_CLK))); 1151 1152 reg = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); 1153 reg &= ~DSIM_STOP_STATE_CNT_MASK; 1154 reg |= DSIM_STOP_STATE_CNT(driver_data->reg_values[STOP_STATE_CNT]); 1155 samsung_dsim_write(dsi, DSIM_ESCMODE_REG, reg); 1156 1157 reg = DSIM_BTA_TIMEOUT(0xff) | DSIM_LPDR_TIMEOUT(0xffff); 1158 samsung_dsim_write(dsi, DSIM_TIMEOUT_REG, reg); 1159 1160 return 0; 1161 } 1162 1163 static void samsung_dsim_set_display_mode(struct samsung_dsim *dsi) 1164 { 1165 struct drm_display_mode *m = &dsi->mode; 1166 unsigned int num_bits_resol = dsi->driver_data->num_bits_resol; 1167 unsigned int main_vsa_offset = dsi->driver_data->main_vsa_offset; 1168 u32 reg; 1169 1170 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { 1171 u64 byte_clk = dsi->hs_clock / 8; 1172 u64 pix_clk = m->clock * 1000; 1173 1174 int hfp = DIV64_U64_ROUND_UP((m->hsync_start - m->hdisplay) * byte_clk, pix_clk); 1175 int hbp = DIV64_U64_ROUND_UP((m->htotal - m->hsync_end) * byte_clk, pix_clk); 1176 int hsa = DIV64_U64_ROUND_UP((m->hsync_end - m->hsync_start) * byte_clk, pix_clk); 1177 1178 /* remove packet overhead when possible */ 1179 hfp = max(hfp - 6, 0); 1180 hbp = max(hbp - 6, 0); 1181 hsa = max(hsa - 6, 0); 1182 1183 dev_dbg(dsi->dev, "calculated hfp: %u, hbp: %u, hsa: %u", 1184 hfp, hbp, hsa); 1185 1186 reg = DSIM_CMD_ALLOW(0xf) 1187 | DSIM_STABLE_VFP(m->vsync_start - m->vdisplay) 1188 | DSIM_MAIN_VBP(m->vtotal - m->vsync_end); 1189 samsung_dsim_write(dsi, DSIM_MVPORCH_REG, reg); 1190 1191 reg = DSIM_MAIN_HFP(hfp) | DSIM_MAIN_HBP(hbp); 1192 samsung_dsim_write(dsi, DSIM_MHPORCH_REG, reg); 1193 1194 reg = DSIM_MAIN_VSA(m->vsync_end - m->vsync_start, main_vsa_offset) 1195 | DSIM_MAIN_HSA(hsa); 1196 samsung_dsim_write(dsi, DSIM_MSYNC_REG, reg); 1197 } 1198 reg = DSIM_MAIN_HRESOL(m->hdisplay, num_bits_resol) | 1199 DSIM_MAIN_VRESOL(m->vdisplay, num_bits_resol); 1200 1201 samsung_dsim_write(dsi, DSIM_MDRESOL_REG, reg); 1202 1203 dev_dbg(dsi->dev, "LCD size = %dx%d\n", m->hdisplay, m->vdisplay); 1204 } 1205 1206 static void samsung_dsim_set_display_enable(struct samsung_dsim *dsi, bool enable) 1207 { 1208 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; 1209 u32 reg; 1210 1211 reg = samsung_dsim_read(dsi, DSIM_MDRESOL_REG); 1212 if (enable) 1213 reg |= DSIM_MAIN_STAND_BY; 1214 else 1215 reg &= ~DSIM_MAIN_STAND_BY; 1216 samsung_dsim_write(dsi, DSIM_MDRESOL_REG, reg); 1217 1218 if (driver_data->has_sfrctrl) { 1219 reg = samsung_dsim_read(dsi, DSIM_SFRCTRL_REG); 1220 if (enable) 1221 reg |= DSIM_SFR_CTRL_STAND_BY; 1222 else 1223 reg &= ~DSIM_SFR_CTRL_STAND_BY; 1224 samsung_dsim_write(dsi, DSIM_SFRCTRL_REG, reg); 1225 } 1226 } 1227 1228 static int samsung_dsim_wait_for_hdr_fifo(struct samsung_dsim *dsi) 1229 { 1230 int timeout = 2000; 1231 1232 do { 1233 u32 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG); 1234 1235 if (!dsi->driver_data->has_broken_fifoctrl_emptyhdr) { 1236 if (reg & DSIM_SFR_HEADER_EMPTY) 1237 return 0; 1238 } else { 1239 if (!(reg & DSIM_SFR_HEADER_FULL)) { 1240 /* 1241 * Wait a little bit, so the pending data can 1242 * actually leave the FIFO to avoid overflow. 1243 */ 1244 if (!cond_resched()) 1245 usleep_range(950, 1050); 1246 return 0; 1247 } 1248 } 1249 1250 if (!cond_resched()) 1251 usleep_range(950, 1050); 1252 } while (--timeout); 1253 1254 return -ETIMEDOUT; 1255 } 1256 1257 static void samsung_dsim_set_cmd_lpm(struct samsung_dsim *dsi, bool lpm) 1258 { 1259 u32 v = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); 1260 1261 if (lpm) 1262 v |= DSIM_CMD_LPDT_LP; 1263 else 1264 v &= ~DSIM_CMD_LPDT_LP; 1265 1266 samsung_dsim_write(dsi, DSIM_ESCMODE_REG, v); 1267 } 1268 1269 static void samsung_dsim_force_bta(struct samsung_dsim *dsi) 1270 { 1271 u32 v = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); 1272 1273 v |= DSIM_FORCE_BTA; 1274 samsung_dsim_write(dsi, DSIM_ESCMODE_REG, v); 1275 } 1276 1277 static void samsung_dsim_send_to_fifo(struct samsung_dsim *dsi, 1278 struct samsung_dsim_transfer *xfer) 1279 { 1280 struct device *dev = dsi->dev; 1281 struct mipi_dsi_packet *pkt = &xfer->packet; 1282 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; 1283 const u8 *payload = pkt->payload + xfer->tx_done; 1284 u16 length = pkt->payload_length - xfer->tx_done; 1285 bool first = !xfer->tx_done; 1286 u32 reg; 1287 1288 dev_dbg(dev, "< xfer %p: tx len %u, done %u, rx len %u, done %u\n", 1289 xfer, length, xfer->tx_done, xfer->rx_len, xfer->rx_done); 1290 1291 if (length > DSI_TX_FIFO_SIZE) 1292 length = DSI_TX_FIFO_SIZE; 1293 1294 xfer->tx_done += length; 1295 1296 /* Send payload */ 1297 while (length >= 4) { 1298 reg = get_unaligned_le32(payload); 1299 samsung_dsim_write(dsi, DSIM_PAYLOAD_REG, reg); 1300 payload += 4; 1301 length -= 4; 1302 } 1303 1304 reg = 0; 1305 switch (length) { 1306 case 3: 1307 reg |= payload[2] << 16; 1308 fallthrough; 1309 case 2: 1310 reg |= payload[1] << 8; 1311 fallthrough; 1312 case 1: 1313 reg |= payload[0]; 1314 samsung_dsim_write(dsi, DSIM_PAYLOAD_REG, reg); 1315 break; 1316 } 1317 1318 /* Send packet header */ 1319 if (!first) 1320 return; 1321 1322 reg = get_unaligned_le32(pkt->header); 1323 if (driver_data->wait_for_hdr_fifo) { 1324 if (samsung_dsim_wait_for_hdr_fifo(dsi)) { 1325 dev_err(dev, "waiting for header FIFO timed out\n"); 1326 return; 1327 } 1328 } 1329 1330 if (NEQV(xfer->flags & MIPI_DSI_MSG_USE_LPM, 1331 dsi->state & DSIM_STATE_CMD_LPM)) { 1332 samsung_dsim_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM); 1333 dsi->state ^= DSIM_STATE_CMD_LPM; 1334 } 1335 1336 samsung_dsim_write(dsi, DSIM_PKTHDR_REG, reg); 1337 1338 if (xfer->flags & MIPI_DSI_MSG_REQ_ACK) 1339 samsung_dsim_force_bta(dsi); 1340 } 1341 1342 static void samsung_dsim_read_from_fifo(struct samsung_dsim *dsi, 1343 struct samsung_dsim_transfer *xfer) 1344 { 1345 u8 *payload = xfer->rx_payload + xfer->rx_done; 1346 bool first = !xfer->rx_done; 1347 struct device *dev = dsi->dev; 1348 u16 length; 1349 u32 reg; 1350 1351 if (first) { 1352 reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); 1353 1354 switch (reg & 0x3f) { 1355 case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_2BYTE: 1356 case MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_2BYTE: 1357 if (xfer->rx_len >= 2) { 1358 payload[1] = reg >> 16; 1359 ++xfer->rx_done; 1360 } 1361 fallthrough; 1362 case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_1BYTE: 1363 case MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_1BYTE: 1364 payload[0] = reg >> 8; 1365 ++xfer->rx_done; 1366 xfer->rx_len = xfer->rx_done; 1367 xfer->result = 0; 1368 goto clear_fifo; 1369 case MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT: 1370 dev_err(dev, "DSI Error Report: 0x%04x\n", (reg >> 8) & 0xffff); 1371 xfer->result = 0; 1372 goto clear_fifo; 1373 } 1374 1375 length = (reg >> 8) & 0xffff; 1376 if (length > xfer->rx_len) { 1377 dev_err(dev, 1378 "response too long (%u > %u bytes), stripping\n", 1379 xfer->rx_len, length); 1380 length = xfer->rx_len; 1381 } else if (length < xfer->rx_len) { 1382 xfer->rx_len = length; 1383 } 1384 } 1385 1386 length = xfer->rx_len - xfer->rx_done; 1387 xfer->rx_done += length; 1388 1389 /* Receive payload */ 1390 while (length >= 4) { 1391 reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); 1392 payload[0] = (reg >> 0) & 0xff; 1393 payload[1] = (reg >> 8) & 0xff; 1394 payload[2] = (reg >> 16) & 0xff; 1395 payload[3] = (reg >> 24) & 0xff; 1396 payload += 4; 1397 length -= 4; 1398 } 1399 1400 if (length) { 1401 reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); 1402 switch (length) { 1403 case 3: 1404 payload[2] = (reg >> 16) & 0xff; 1405 fallthrough; 1406 case 2: 1407 payload[1] = (reg >> 8) & 0xff; 1408 fallthrough; 1409 case 1: 1410 payload[0] = reg & 0xff; 1411 } 1412 } 1413 1414 if (xfer->rx_done == xfer->rx_len) 1415 xfer->result = 0; 1416 1417 clear_fifo: 1418 length = DSI_RX_FIFO_SIZE / 4; 1419 do { 1420 reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); 1421 if (reg == DSI_RX_FIFO_EMPTY) 1422 break; 1423 } while (--length); 1424 } 1425 1426 static void samsung_dsim_transfer_start(struct samsung_dsim *dsi) 1427 { 1428 unsigned long flags; 1429 struct samsung_dsim_transfer *xfer; 1430 1431 spin_lock_irqsave(&dsi->transfer_lock, flags); 1432 1433 while (!list_empty(&dsi->transfer_list)) { 1434 xfer = list_first_entry(&dsi->transfer_list, 1435 struct samsung_dsim_transfer, list); 1436 1437 spin_unlock_irqrestore(&dsi->transfer_lock, flags); 1438 1439 if (xfer->packet.payload_length && 1440 xfer->tx_done == xfer->packet.payload_length) 1441 /* waiting for RX */ 1442 return; 1443 1444 samsung_dsim_send_to_fifo(dsi, xfer); 1445 1446 if (xfer->packet.payload_length || xfer->rx_len) 1447 return; 1448 1449 xfer->result = 0; 1450 complete(&xfer->completed); 1451 1452 spin_lock_irqsave(&dsi->transfer_lock, flags); 1453 1454 list_del_init(&xfer->list); 1455 } 1456 1457 spin_unlock_irqrestore(&dsi->transfer_lock, flags); 1458 } 1459 1460 static bool samsung_dsim_transfer_finish(struct samsung_dsim *dsi) 1461 { 1462 struct samsung_dsim_transfer *xfer; 1463 unsigned long flags; 1464 bool start = true; 1465 1466 spin_lock_irqsave(&dsi->transfer_lock, flags); 1467 1468 if (list_empty(&dsi->transfer_list)) { 1469 spin_unlock_irqrestore(&dsi->transfer_lock, flags); 1470 return false; 1471 } 1472 1473 xfer = list_first_entry(&dsi->transfer_list, 1474 struct samsung_dsim_transfer, list); 1475 1476 spin_unlock_irqrestore(&dsi->transfer_lock, flags); 1477 1478 dev_dbg(dsi->dev, 1479 "> xfer %p, tx_len %zu, tx_done %u, rx_len %u, rx_done %u\n", 1480 xfer, xfer->packet.payload_length, xfer->tx_done, xfer->rx_len, 1481 xfer->rx_done); 1482 1483 if (xfer->tx_done != xfer->packet.payload_length) 1484 return true; 1485 1486 if (xfer->rx_done != xfer->rx_len) 1487 samsung_dsim_read_from_fifo(dsi, xfer); 1488 1489 if (xfer->rx_done != xfer->rx_len) 1490 return true; 1491 1492 spin_lock_irqsave(&dsi->transfer_lock, flags); 1493 1494 list_del_init(&xfer->list); 1495 start = !list_empty(&dsi->transfer_list); 1496 1497 spin_unlock_irqrestore(&dsi->transfer_lock, flags); 1498 1499 if (!xfer->rx_len) 1500 xfer->result = 0; 1501 complete(&xfer->completed); 1502 1503 return start; 1504 } 1505 1506 static void samsung_dsim_remove_transfer(struct samsung_dsim *dsi, 1507 struct samsung_dsim_transfer *xfer) 1508 { 1509 unsigned long flags; 1510 bool start; 1511 1512 spin_lock_irqsave(&dsi->transfer_lock, flags); 1513 1514 if (!list_empty(&dsi->transfer_list) && 1515 xfer == list_first_entry(&dsi->transfer_list, 1516 struct samsung_dsim_transfer, list)) { 1517 list_del_init(&xfer->list); 1518 start = !list_empty(&dsi->transfer_list); 1519 spin_unlock_irqrestore(&dsi->transfer_lock, flags); 1520 if (start) 1521 samsung_dsim_transfer_start(dsi); 1522 return; 1523 } 1524 1525 list_del_init(&xfer->list); 1526 1527 spin_unlock_irqrestore(&dsi->transfer_lock, flags); 1528 } 1529 1530 static int samsung_dsim_transfer(struct samsung_dsim *dsi, 1531 struct samsung_dsim_transfer *xfer) 1532 { 1533 unsigned long flags; 1534 bool stopped; 1535 1536 xfer->tx_done = 0; 1537 xfer->rx_done = 0; 1538 xfer->result = -ETIMEDOUT; 1539 init_completion(&xfer->completed); 1540 1541 spin_lock_irqsave(&dsi->transfer_lock, flags); 1542 1543 stopped = list_empty(&dsi->transfer_list); 1544 list_add_tail(&xfer->list, &dsi->transfer_list); 1545 1546 spin_unlock_irqrestore(&dsi->transfer_lock, flags); 1547 1548 if (stopped) 1549 samsung_dsim_transfer_start(dsi); 1550 1551 wait_for_completion_timeout(&xfer->completed, 1552 msecs_to_jiffies(DSI_XFER_TIMEOUT_MS)); 1553 if (xfer->result == -ETIMEDOUT) { 1554 struct mipi_dsi_packet *pkt = &xfer->packet; 1555 1556 samsung_dsim_remove_transfer(dsi, xfer); 1557 dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 4, pkt->header, 1558 (int)pkt->payload_length, pkt->payload); 1559 return -ETIMEDOUT; 1560 } 1561 1562 /* Also covers hardware timeout condition */ 1563 return xfer->result; 1564 } 1565 1566 static irqreturn_t samsung_dsim_irq(int irq, void *dev_id) 1567 { 1568 struct samsung_dsim *dsi = dev_id; 1569 u32 status; 1570 1571 status = samsung_dsim_read(dsi, DSIM_INTSRC_REG); 1572 if (!status) { 1573 static unsigned long j; 1574 1575 if (printk_timed_ratelimit(&j, 500)) 1576 dev_warn(dsi->dev, "spurious interrupt\n"); 1577 return IRQ_HANDLED; 1578 } 1579 samsung_dsim_write(dsi, DSIM_INTSRC_REG, status); 1580 1581 if (status & DSIM_INT_SW_RST_RELEASE) { 1582 unsigned long mask = ~(DSIM_INT_RX_DONE | 1583 DSIM_INT_SFR_FIFO_EMPTY | 1584 DSIM_INT_SFR_HDR_FIFO_EMPTY | 1585 DSIM_INT_RX_ECC_ERR | 1586 DSIM_INT_SW_RST_RELEASE); 1587 samsung_dsim_write(dsi, DSIM_INTMSK_REG, mask); 1588 complete(&dsi->completed); 1589 return IRQ_HANDLED; 1590 } 1591 1592 if (!(status & (DSIM_INT_RX_DONE | DSIM_INT_SFR_FIFO_EMPTY | 1593 DSIM_INT_PLL_STABLE))) 1594 return IRQ_HANDLED; 1595 1596 if (samsung_dsim_transfer_finish(dsi)) 1597 samsung_dsim_transfer_start(dsi); 1598 1599 return IRQ_HANDLED; 1600 } 1601 1602 static void samsung_dsim_enable_irq(struct samsung_dsim *dsi) 1603 { 1604 enable_irq(dsi->irq); 1605 1606 if (dsi->te_gpio) 1607 enable_irq(gpiod_to_irq(dsi->te_gpio)); 1608 } 1609 1610 static void samsung_dsim_disable_irq(struct samsung_dsim *dsi) 1611 { 1612 if (dsi->te_gpio) 1613 disable_irq(gpiod_to_irq(dsi->te_gpio)); 1614 1615 disable_irq(dsi->irq); 1616 } 1617 1618 static int samsung_dsim_init(struct samsung_dsim *dsi) 1619 { 1620 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; 1621 1622 if (dsi->state & DSIM_STATE_INITIALIZED) 1623 return 0; 1624 1625 samsung_dsim_reset(dsi); 1626 samsung_dsim_enable_irq(dsi); 1627 1628 if (driver_data->reg_values[RESET_TYPE] == DSIM_FUNCRST) 1629 samsung_dsim_enable_lane(dsi, BIT(dsi->lanes) - 1); 1630 1631 samsung_dsim_enable_clock(dsi); 1632 if (driver_data->wait_for_reset) 1633 samsung_dsim_wait_for_reset(dsi); 1634 samsung_dsim_set_phy_ctrl(dsi); 1635 samsung_dsim_init_link(dsi); 1636 1637 dsi->state |= DSIM_STATE_INITIALIZED; 1638 1639 return 0; 1640 } 1641 1642 static void samsung_dsim_atomic_pre_enable(struct drm_bridge *bridge, 1643 struct drm_atomic_state *state) 1644 { 1645 struct samsung_dsim *dsi = bridge_to_dsi(bridge); 1646 int ret; 1647 1648 if (dsi->state & DSIM_STATE_ENABLED) 1649 return; 1650 1651 ret = pm_runtime_resume_and_get(dsi->dev); 1652 if (ret < 0) { 1653 dev_err(dsi->dev, "failed to enable DSI device.\n"); 1654 return; 1655 } 1656 1657 dsi->state |= DSIM_STATE_ENABLED; 1658 1659 /* 1660 * For Exynos-DSIM the downstream bridge, or panel are expecting 1661 * the host initialization during DSI transfer. 1662 */ 1663 if (!samsung_dsim_hw_is_exynos(dsi->plat_data->hw_type)) { 1664 ret = samsung_dsim_init(dsi); 1665 if (ret) 1666 return; 1667 } 1668 } 1669 1670 static void samsung_dsim_atomic_enable(struct drm_bridge *bridge, 1671 struct drm_atomic_state *state) 1672 { 1673 struct samsung_dsim *dsi = bridge_to_dsi(bridge); 1674 1675 samsung_dsim_set_display_mode(dsi); 1676 samsung_dsim_set_display_enable(dsi, true); 1677 1678 dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE; 1679 } 1680 1681 static void samsung_dsim_atomic_disable(struct drm_bridge *bridge, 1682 struct drm_atomic_state *state) 1683 { 1684 struct samsung_dsim *dsi = bridge_to_dsi(bridge); 1685 1686 if (!(dsi->state & DSIM_STATE_ENABLED)) 1687 return; 1688 1689 samsung_dsim_set_display_enable(dsi, false); 1690 dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE; 1691 } 1692 1693 static void samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, 1694 struct drm_atomic_state *state) 1695 { 1696 struct samsung_dsim *dsi = bridge_to_dsi(bridge); 1697 1698 dsi->state &= ~DSIM_STATE_ENABLED; 1699 pm_runtime_put_sync(dsi->dev); 1700 } 1701 1702 /* 1703 * This pixel output formats list referenced from, 1704 * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 1705 * 3.7.4 Pixel formats 1706 * Table 14. DSI pixel packing formats 1707 */ 1708 static const u32 samsung_dsim_pixel_output_fmts[] = { 1709 MEDIA_BUS_FMT_YUYV10_1X20, 1710 MEDIA_BUS_FMT_YUYV12_1X24, 1711 MEDIA_BUS_FMT_UYVY8_1X16, 1712 MEDIA_BUS_FMT_RGB101010_1X30, 1713 MEDIA_BUS_FMT_RGB121212_1X36, 1714 MEDIA_BUS_FMT_RGB565_1X16, 1715 MEDIA_BUS_FMT_RGB666_1X18, 1716 MEDIA_BUS_FMT_RGB888_1X24, 1717 }; 1718 1719 static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) 1720 { 1721 int i; 1722 1723 if (fmt == MEDIA_BUS_FMT_FIXED) 1724 return false; 1725 1726 for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { 1727 if (samsung_dsim_pixel_output_fmts[i] == fmt) 1728 return true; 1729 } 1730 1731 return false; 1732 } 1733 1734 static u32 * 1735 samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, 1736 struct drm_bridge_state *bridge_state, 1737 struct drm_crtc_state *crtc_state, 1738 struct drm_connector_state *conn_state, 1739 u32 output_fmt, 1740 unsigned int *num_input_fmts) 1741 { 1742 u32 *input_fmts; 1743 1744 input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); 1745 if (!input_fmts) 1746 return NULL; 1747 1748 if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) 1749 /* 1750 * Some bridge/display drivers are still not able to pass the 1751 * correct format, so handle those pipelines by falling back 1752 * to the default format till the supported formats finalized. 1753 */ 1754 output_fmt = MEDIA_BUS_FMT_RGB888_1X24; 1755 1756 input_fmts[0] = output_fmt; 1757 *num_input_fmts = 1; 1758 1759 return input_fmts; 1760 } 1761 1762 static int samsung_dsim_atomic_check(struct drm_bridge *bridge, 1763 struct drm_bridge_state *bridge_state, 1764 struct drm_crtc_state *crtc_state, 1765 struct drm_connector_state *conn_state) 1766 { 1767 struct samsung_dsim *dsi = bridge_to_dsi(bridge); 1768 struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode; 1769 1770 /* 1771 * The i.MX8M Mini/Nano glue logic between LCDIF and DSIM 1772 * inverts HS/VS/DE sync signals polarity, therefore, while 1773 * i.MX 8M Mini Applications Processor Reference Manual Rev. 3, 11/2020 1774 * 13.6.3.5.2 RGB interface 1775 * i.MX 8M Nano Applications Processor Reference Manual Rev. 2, 07/2022 1776 * 13.6.2.7.2 RGB interface 1777 * both claim "Vsync, Hsync, and VDEN are active high signals.", the 1778 * LCDIF must generate inverted HS/VS/DE signals, i.e. active LOW. 1779 * 1780 * The i.MX8M Plus glue logic between LCDIFv3 and DSIM does not 1781 * implement the same behavior, therefore LCDIFv3 must generate 1782 * HS/VS/DE signals active HIGH. 1783 */ 1784 if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MM) { 1785 adjusted_mode->flags |= (DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC); 1786 adjusted_mode->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); 1787 } else if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MP) { 1788 adjusted_mode->flags &= ~(DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC); 1789 adjusted_mode->flags |= (DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); 1790 } 1791 1792 /* 1793 * When using video sync pulses, the HFP, HBP, and HSA are divided between 1794 * the available lanes if there is more than one lane. For certain 1795 * timings and lane configurations, the HFP may not be evenly divisible. 1796 * If the HFP is rounded down, it ends up being too small which can cause 1797 * some monitors to not sync properly. In these instances, adjust htotal 1798 * and hsync to round the HFP up, and recalculate the htotal. Through trial 1799 * and error, it appears that the HBP and HSA do not appearto need the same 1800 * correction that HFP does. 1801 */ 1802 if (dsi->lanes > 1) { 1803 int hfp = adjusted_mode->hsync_start - adjusted_mode->hdisplay; 1804 int remainder = hfp % dsi->lanes; 1805 1806 if (remainder) { 1807 adjusted_mode->hsync_start += remainder; 1808 adjusted_mode->hsync_end += remainder; 1809 adjusted_mode->htotal += remainder; 1810 } 1811 } 1812 1813 return 0; 1814 } 1815 1816 static void samsung_dsim_mode_set(struct drm_bridge *bridge, 1817 const struct drm_display_mode *mode, 1818 const struct drm_display_mode *adjusted_mode) 1819 { 1820 struct samsung_dsim *dsi = bridge_to_dsi(bridge); 1821 1822 drm_mode_copy(&dsi->mode, adjusted_mode); 1823 } 1824 1825 static int samsung_dsim_attach(struct drm_bridge *bridge, 1826 struct drm_encoder *encoder, 1827 enum drm_bridge_attach_flags flags) 1828 { 1829 struct samsung_dsim *dsi = bridge_to_dsi(bridge); 1830 1831 return drm_bridge_attach(encoder, dsi->out_bridge, bridge, 1832 flags); 1833 } 1834 1835 static const struct drm_bridge_funcs samsung_dsim_bridge_funcs = { 1836 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, 1837 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, 1838 .atomic_reset = drm_atomic_helper_bridge_reset, 1839 .atomic_get_input_bus_fmts = samsung_dsim_atomic_get_input_bus_fmts, 1840 .atomic_check = samsung_dsim_atomic_check, 1841 .atomic_pre_enable = samsung_dsim_atomic_pre_enable, 1842 .atomic_enable = samsung_dsim_atomic_enable, 1843 .atomic_disable = samsung_dsim_atomic_disable, 1844 .atomic_post_disable = samsung_dsim_atomic_post_disable, 1845 .mode_set = samsung_dsim_mode_set, 1846 .attach = samsung_dsim_attach, 1847 }; 1848 1849 static irqreturn_t samsung_dsim_te_irq_handler(int irq, void *dev_id) 1850 { 1851 struct samsung_dsim *dsi = (struct samsung_dsim *)dev_id; 1852 const struct samsung_dsim_plat_data *pdata = dsi->plat_data; 1853 1854 if (pdata->host_ops && pdata->host_ops->te_irq_handler) 1855 return pdata->host_ops->te_irq_handler(dsi); 1856 1857 return IRQ_HANDLED; 1858 } 1859 1860 static int samsung_dsim_register_te_irq(struct samsung_dsim *dsi, struct device *dev) 1861 { 1862 int te_gpio_irq; 1863 int ret; 1864 1865 dsi->te_gpio = devm_gpiod_get_optional(dev, "te", GPIOD_IN); 1866 if (!dsi->te_gpio) 1867 return 0; 1868 else if (IS_ERR(dsi->te_gpio)) 1869 return dev_err_probe(dev, PTR_ERR(dsi->te_gpio), "failed to get te GPIO\n"); 1870 1871 te_gpio_irq = gpiod_to_irq(dsi->te_gpio); 1872 1873 ret = request_threaded_irq(te_gpio_irq, samsung_dsim_te_irq_handler, NULL, 1874 IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN, "TE", dsi); 1875 if (ret) { 1876 dev_err(dsi->dev, "request interrupt failed with %d\n", ret); 1877 gpiod_put(dsi->te_gpio); 1878 return ret; 1879 } 1880 1881 return 0; 1882 } 1883 1884 static int samsung_dsim_host_attach(struct mipi_dsi_host *host, 1885 struct mipi_dsi_device *device) 1886 { 1887 struct samsung_dsim *dsi = host_to_dsi(host); 1888 const struct samsung_dsim_plat_data *pdata = dsi->plat_data; 1889 struct device *dev = dsi->dev; 1890 struct device_node *np = dev->of_node; 1891 struct device_node *remote; 1892 struct drm_panel *panel; 1893 int ret; 1894 1895 /* 1896 * Devices can also be child nodes when we also control that device 1897 * through the upstream device (ie, MIPI-DCS for a MIPI-DSI device). 1898 * 1899 * Lookup for a child node of the given parent that isn't either port 1900 * or ports. 1901 */ 1902 for_each_available_child_of_node(np, remote) { 1903 if (of_node_name_eq(remote, "port") || 1904 of_node_name_eq(remote, "ports")) 1905 continue; 1906 1907 goto of_find_panel_or_bridge; 1908 } 1909 1910 /* 1911 * of_graph_get_remote_node() produces a noisy error message if port 1912 * node isn't found and the absence of the port is a legit case here, 1913 * so at first we silently check whether graph presents in the 1914 * device-tree node. 1915 */ 1916 if (!of_graph_is_present(np)) 1917 return -ENODEV; 1918 1919 remote = of_graph_get_remote_node(np, 1, 0); 1920 1921 of_find_panel_or_bridge: 1922 if (!remote) 1923 return -ENODEV; 1924 1925 panel = of_drm_find_panel(remote); 1926 if (!IS_ERR(panel)) { 1927 dsi->out_bridge = devm_drm_panel_bridge_add(dev, panel); 1928 } else { 1929 dsi->out_bridge = of_drm_find_bridge(remote); 1930 if (!dsi->out_bridge) 1931 dsi->out_bridge = ERR_PTR(-EINVAL); 1932 } 1933 1934 of_node_put(remote); 1935 1936 if (IS_ERR(dsi->out_bridge)) { 1937 ret = PTR_ERR(dsi->out_bridge); 1938 DRM_DEV_ERROR(dev, "failed to find the bridge: %d\n", ret); 1939 return ret; 1940 } 1941 1942 DRM_DEV_INFO(dev, "Attached %s device (lanes:%d bpp:%d mode-flags:0x%lx)\n", 1943 device->name, device->lanes, 1944 mipi_dsi_pixel_format_to_bpp(device->format), 1945 device->mode_flags); 1946 1947 drm_bridge_add(&dsi->bridge); 1948 1949 /* 1950 * This is a temporary solution and should be made by more generic way. 1951 * 1952 * If attached panel device is for command mode one, dsi should register 1953 * TE interrupt handler. 1954 */ 1955 if (!(device->mode_flags & MIPI_DSI_MODE_VIDEO)) { 1956 ret = samsung_dsim_register_te_irq(dsi, &device->dev); 1957 if (ret) 1958 return ret; 1959 } 1960 1961 if (pdata->host_ops && pdata->host_ops->attach) { 1962 ret = pdata->host_ops->attach(dsi, device); 1963 if (ret) 1964 return ret; 1965 } 1966 1967 dsi->lanes = device->lanes; 1968 dsi->format = device->format; 1969 dsi->mode_flags = device->mode_flags; 1970 1971 return 0; 1972 } 1973 1974 static void samsung_dsim_unregister_te_irq(struct samsung_dsim *dsi) 1975 { 1976 if (dsi->te_gpio) { 1977 free_irq(gpiod_to_irq(dsi->te_gpio), dsi); 1978 gpiod_put(dsi->te_gpio); 1979 } 1980 } 1981 1982 static int samsung_dsim_host_detach(struct mipi_dsi_host *host, 1983 struct mipi_dsi_device *device) 1984 { 1985 struct samsung_dsim *dsi = host_to_dsi(host); 1986 const struct samsung_dsim_plat_data *pdata = dsi->plat_data; 1987 1988 dsi->out_bridge = NULL; 1989 1990 if (pdata->host_ops && pdata->host_ops->detach) 1991 pdata->host_ops->detach(dsi, device); 1992 1993 samsung_dsim_unregister_te_irq(dsi); 1994 1995 drm_bridge_remove(&dsi->bridge); 1996 1997 return 0; 1998 } 1999 2000 static ssize_t samsung_dsim_host_transfer(struct mipi_dsi_host *host, 2001 const struct mipi_dsi_msg *msg) 2002 { 2003 struct samsung_dsim *dsi = host_to_dsi(host); 2004 struct samsung_dsim_transfer xfer; 2005 int ret; 2006 2007 if (!(dsi->state & DSIM_STATE_ENABLED)) 2008 return -EINVAL; 2009 2010 ret = samsung_dsim_init(dsi); 2011 if (ret) 2012 return ret; 2013 2014 ret = mipi_dsi_create_packet(&xfer.packet, msg); 2015 if (ret < 0) 2016 return ret; 2017 2018 xfer.rx_len = msg->rx_len; 2019 xfer.rx_payload = msg->rx_buf; 2020 xfer.flags = msg->flags; 2021 2022 ret = samsung_dsim_transfer(dsi, &xfer); 2023 return (ret < 0) ? ret : xfer.rx_done; 2024 } 2025 2026 static const struct mipi_dsi_host_ops samsung_dsim_ops = { 2027 .attach = samsung_dsim_host_attach, 2028 .detach = samsung_dsim_host_detach, 2029 .transfer = samsung_dsim_host_transfer, 2030 }; 2031 2032 static int samsung_dsim_of_read_u32(const struct device_node *np, 2033 const char *propname, u32 *out_value, bool optional) 2034 { 2035 int ret = of_property_read_u32(np, propname, out_value); 2036 2037 if (ret < 0 && !optional) 2038 pr_err("%pOF: failed to get '%s' property\n", np, propname); 2039 2040 return ret; 2041 } 2042 2043 static int samsung_dsim_parse_dt(struct samsung_dsim *dsi) 2044 { 2045 struct device *dev = dsi->dev; 2046 struct device_node *node = dev->of_node; 2047 u32 lane_polarities[5] = { 0 }; 2048 struct device_node *endpoint; 2049 int i, nr_lanes, ret; 2050 2051 ret = samsung_dsim_of_read_u32(node, "samsung,pll-clock-frequency", 2052 &dsi->pll_clk_rate, 1); 2053 /* If it doesn't exist, read it from the clock instead of failing */ 2054 if (ret < 0) { 2055 dev_dbg(dev, "Using sclk_mipi for pll clock frequency\n"); 2056 dsi->pll_clk = devm_clk_get(dev, "sclk_mipi"); 2057 if (IS_ERR(dsi->pll_clk)) 2058 return PTR_ERR(dsi->pll_clk); 2059 } 2060 2061 /* If it doesn't exist, use pixel clock instead of failing */ 2062 ret = samsung_dsim_of_read_u32(node, "samsung,burst-clock-frequency", 2063 &dsi->burst_clk_rate, 1); 2064 if (ret < 0) { 2065 dev_dbg(dev, "Using pixel clock for HS clock frequency\n"); 2066 dsi->burst_clk_rate = 0; 2067 } 2068 2069 ret = samsung_dsim_of_read_u32(node, "samsung,esc-clock-frequency", 2070 &dsi->esc_clk_rate, 0); 2071 if (ret < 0) 2072 return ret; 2073 2074 endpoint = of_graph_get_endpoint_by_regs(node, 1, -1); 2075 nr_lanes = of_property_count_u32_elems(endpoint, "data-lanes"); 2076 if (nr_lanes > 0 && nr_lanes <= 4) { 2077 /* Polarity 0 is clock lane, 1..4 are data lanes. */ 2078 of_property_read_u32_array(endpoint, "lane-polarities", 2079 lane_polarities, nr_lanes + 1); 2080 for (i = 1; i <= nr_lanes; i++) { 2081 if (lane_polarities[1] != lane_polarities[i]) 2082 DRM_DEV_ERROR(dsi->dev, "Data lanes polarities do not match"); 2083 } 2084 if (lane_polarities[0]) 2085 dsi->swap_dn_dp_clk = true; 2086 if (lane_polarities[1]) 2087 dsi->swap_dn_dp_data = true; 2088 } 2089 2090 return 0; 2091 } 2092 2093 static int generic_dsim_register_host(struct samsung_dsim *dsi) 2094 { 2095 return mipi_dsi_host_register(&dsi->dsi_host); 2096 } 2097 2098 static void generic_dsim_unregister_host(struct samsung_dsim *dsi) 2099 { 2100 mipi_dsi_host_unregister(&dsi->dsi_host); 2101 } 2102 2103 static const struct samsung_dsim_host_ops generic_dsim_host_ops = { 2104 .register_host = generic_dsim_register_host, 2105 .unregister_host = generic_dsim_unregister_host, 2106 }; 2107 2108 static const struct drm_bridge_timings samsung_dsim_bridge_timings_de_high = { 2109 .input_bus_flags = DRM_BUS_FLAG_DE_HIGH, 2110 }; 2111 2112 static const struct drm_bridge_timings samsung_dsim_bridge_timings_de_low = { 2113 .input_bus_flags = DRM_BUS_FLAG_DE_LOW, 2114 }; 2115 2116 int samsung_dsim_probe(struct platform_device *pdev) 2117 { 2118 struct device *dev = &pdev->dev; 2119 struct samsung_dsim *dsi; 2120 int ret; 2121 2122 dsi = devm_drm_bridge_alloc(dev, struct samsung_dsim, bridge, &samsung_dsim_bridge_funcs); 2123 if (IS_ERR(dsi)) 2124 return PTR_ERR(dsi); 2125 2126 init_completion(&dsi->completed); 2127 spin_lock_init(&dsi->transfer_lock); 2128 INIT_LIST_HEAD(&dsi->transfer_list); 2129 2130 dsi->dsi_host.ops = &samsung_dsim_ops; 2131 dsi->dsi_host.dev = dev; 2132 2133 dsi->dev = dev; 2134 dsi->plat_data = of_device_get_match_data(dev); 2135 dsi->driver_data = samsung_dsim_types[dsi->plat_data->hw_type]; 2136 2137 dsi->supplies[0].supply = "vddcore"; 2138 dsi->supplies[1].supply = "vddio"; 2139 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies), 2140 dsi->supplies); 2141 if (ret) 2142 return dev_err_probe(dev, ret, "failed to get regulators\n"); 2143 2144 ret = devm_clk_bulk_get(dev, dsi->driver_data->num_clks, 2145 dsi->driver_data->clk_data); 2146 if (ret) { 2147 dev_err(dev, "failed to get clocks in bulk (%d)\n", ret); 2148 return ret; 2149 } 2150 2151 dsi->reg_base = devm_platform_ioremap_resource(pdev, 0); 2152 if (IS_ERR(dsi->reg_base)) 2153 return PTR_ERR(dsi->reg_base); 2154 2155 dsi->phy = devm_phy_optional_get(dev, "dsim"); 2156 if (IS_ERR(dsi->phy)) { 2157 dev_info(dev, "failed to get dsim phy\n"); 2158 return PTR_ERR(dsi->phy); 2159 } 2160 2161 dsi->irq = platform_get_irq(pdev, 0); 2162 if (dsi->irq < 0) 2163 return dsi->irq; 2164 2165 ret = devm_request_threaded_irq(dev, dsi->irq, NULL, 2166 samsung_dsim_irq, 2167 IRQF_ONESHOT | IRQF_NO_AUTOEN, 2168 dev_name(dev), dsi); 2169 if (ret) { 2170 dev_err(dev, "failed to request dsi irq\n"); 2171 return ret; 2172 } 2173 2174 ret = samsung_dsim_parse_dt(dsi); 2175 if (ret) 2176 return ret; 2177 2178 platform_set_drvdata(pdev, dsi); 2179 2180 pm_runtime_enable(dev); 2181 2182 dsi->bridge.of_node = dev->of_node; 2183 dsi->bridge.type = DRM_MODE_CONNECTOR_DSI; 2184 2185 /* DE_LOW: i.MX8M Mini/Nano LCDIF-DSIM glue logic inverts HS/VS/DE */ 2186 if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MM) 2187 dsi->bridge.timings = &samsung_dsim_bridge_timings_de_low; 2188 else 2189 dsi->bridge.timings = &samsung_dsim_bridge_timings_de_high; 2190 2191 if (dsi->plat_data->host_ops && dsi->plat_data->host_ops->register_host) { 2192 ret = dsi->plat_data->host_ops->register_host(dsi); 2193 if (ret) 2194 goto err_disable_runtime; 2195 } 2196 2197 return 0; 2198 2199 err_disable_runtime: 2200 pm_runtime_disable(dev); 2201 2202 return ret; 2203 } 2204 EXPORT_SYMBOL_GPL(samsung_dsim_probe); 2205 2206 void samsung_dsim_remove(struct platform_device *pdev) 2207 { 2208 struct samsung_dsim *dsi = platform_get_drvdata(pdev); 2209 2210 pm_runtime_disable(&pdev->dev); 2211 2212 if (dsi->plat_data->host_ops && dsi->plat_data->host_ops->unregister_host) 2213 dsi->plat_data->host_ops->unregister_host(dsi); 2214 } 2215 EXPORT_SYMBOL_GPL(samsung_dsim_remove); 2216 2217 static int samsung_dsim_suspend(struct device *dev) 2218 { 2219 struct samsung_dsim *dsi = dev_get_drvdata(dev); 2220 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; 2221 int ret; 2222 2223 usleep_range(10000, 20000); 2224 2225 if (dsi->state & DSIM_STATE_INITIALIZED) { 2226 dsi->state &= ~DSIM_STATE_INITIALIZED; 2227 2228 samsung_dsim_disable_clock(dsi); 2229 2230 samsung_dsim_disable_irq(dsi); 2231 } 2232 2233 dsi->state &= ~DSIM_STATE_CMD_LPM; 2234 2235 phy_power_off(dsi->phy); 2236 2237 clk_bulk_disable_unprepare(driver_data->num_clks, driver_data->clk_data); 2238 2239 ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); 2240 if (ret < 0) 2241 dev_err(dsi->dev, "cannot disable regulators %d\n", ret); 2242 2243 return 0; 2244 } 2245 2246 static int samsung_dsim_resume(struct device *dev) 2247 { 2248 struct samsung_dsim *dsi = dev_get_drvdata(dev); 2249 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; 2250 int ret; 2251 2252 ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies); 2253 if (ret < 0) { 2254 dev_err(dsi->dev, "cannot enable regulators %d\n", ret); 2255 return ret; 2256 } 2257 2258 ret = clk_bulk_prepare_enable(driver_data->num_clks, driver_data->clk_data); 2259 if (ret < 0) 2260 goto err_clk; 2261 2262 ret = phy_power_on(dsi->phy); 2263 if (ret < 0) { 2264 dev_err(dsi->dev, "cannot enable phy %d\n", ret); 2265 goto err_clk; 2266 } 2267 2268 return 0; 2269 2270 err_clk: 2271 clk_bulk_disable_unprepare(driver_data->num_clks, driver_data->clk_data); 2272 regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); 2273 2274 return ret; 2275 } 2276 2277 const struct dev_pm_ops samsung_dsim_pm_ops = { 2278 RUNTIME_PM_OPS(samsung_dsim_suspend, samsung_dsim_resume, NULL) 2279 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, 2280 pm_runtime_force_resume) 2281 }; 2282 EXPORT_SYMBOL_GPL(samsung_dsim_pm_ops); 2283 2284 static const struct samsung_dsim_plat_data samsung_dsim_imx8mm_pdata = { 2285 .hw_type = DSIM_TYPE_IMX8MM, 2286 .host_ops = &generic_dsim_host_ops, 2287 }; 2288 2289 static const struct samsung_dsim_plat_data samsung_dsim_imx8mp_pdata = { 2290 .hw_type = DSIM_TYPE_IMX8MP, 2291 .host_ops = &generic_dsim_host_ops, 2292 }; 2293 2294 static const struct of_device_id samsung_dsim_of_match[] = { 2295 { 2296 .compatible = "fsl,imx8mm-mipi-dsim", 2297 .data = &samsung_dsim_imx8mm_pdata, 2298 }, 2299 { 2300 .compatible = "fsl,imx8mp-mipi-dsim", 2301 .data = &samsung_dsim_imx8mp_pdata, 2302 }, 2303 { /* sentinel. */ } 2304 }; 2305 MODULE_DEVICE_TABLE(of, samsung_dsim_of_match); 2306 2307 static struct platform_driver samsung_dsim_driver = { 2308 .probe = samsung_dsim_probe, 2309 .remove = samsung_dsim_remove, 2310 .driver = { 2311 .name = "samsung-dsim", 2312 .pm = pm_ptr(&samsung_dsim_pm_ops), 2313 .of_match_table = samsung_dsim_of_match, 2314 }, 2315 }; 2316 2317 module_platform_driver(samsung_dsim_driver); 2318 2319 MODULE_AUTHOR("Jagan Teki <jagan@amarulasolutions.com>"); 2320 MODULE_DESCRIPTION("Samsung MIPI DSIM controller bridge"); 2321 MODULE_LICENSE("GPL"); 2322