0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/clk.h>
0009 #include <linux/delay.h>
0010 #include <linux/io.h>
0011 #include <linux/iopoll.h>
0012 #include <linux/module.h>
0013 #include <linux/of.h>
0014 #include <linux/of_device.h>
0015 #include <linux/of_graph.h>
0016 #include <linux/platform_device.h>
0017 #include <linux/reset.h>
0018 #include <linux/slab.h>
0019
0020 #include <drm/drm_atomic.h>
0021 #include <drm/drm_atomic_helper.h>
0022 #include <drm/drm_bridge.h>
0023 #include <drm/drm_mipi_dsi.h>
0024 #include <drm/drm_of.h>
0025 #include <drm/drm_panel.h>
0026 #include <drm/drm_probe_helper.h>
0027
0028 #include "rcar_mipi_dsi_regs.h"
0029
0030 struct rcar_mipi_dsi {
0031 struct device *dev;
0032 const struct rcar_mipi_dsi_device_info *info;
0033 struct reset_control *rstc;
0034
0035 struct mipi_dsi_host host;
0036 struct drm_bridge bridge;
0037 struct drm_bridge *next_bridge;
0038 struct drm_connector connector;
0039
0040 void __iomem *mmio;
0041 struct {
0042 struct clk *mod;
0043 struct clk *pll;
0044 struct clk *dsi;
0045 } clocks;
0046
0047 enum mipi_dsi_pixel_format format;
0048 unsigned int num_data_lanes;
0049 unsigned int lanes;
0050 };
0051
0052 static inline struct rcar_mipi_dsi *
0053 bridge_to_rcar_mipi_dsi(struct drm_bridge *bridge)
0054 {
0055 return container_of(bridge, struct rcar_mipi_dsi, bridge);
0056 }
0057
0058 static inline struct rcar_mipi_dsi *
0059 host_to_rcar_mipi_dsi(struct mipi_dsi_host *host)
0060 {
0061 return container_of(host, struct rcar_mipi_dsi, host);
0062 }
0063
0064 static const u32 phtw[] = {
0065 0x01020114, 0x01600115,
0066 0x01030116, 0x0102011d,
0067 0x011101a4, 0x018601a4,
0068 0x014201a0, 0x010001a3,
0069 0x0101011f,
0070 };
0071
0072 static const u32 phtw2[] = {
0073 0x010c0130, 0x010c0140,
0074 0x010c0150, 0x010c0180,
0075 0x010c0190,
0076 0x010a0160, 0x010a0170,
0077 0x01800164, 0x01800174,
0078 };
0079
0080 static const u32 hsfreqrange_table[][2] = {
0081 { 80000000U, 0x00 }, { 90000000U, 0x10 }, { 100000000U, 0x20 },
0082 { 110000000U, 0x30 }, { 120000000U, 0x01 }, { 130000000U, 0x11 },
0083 { 140000000U, 0x21 }, { 150000000U, 0x31 }, { 160000000U, 0x02 },
0084 { 170000000U, 0x12 }, { 180000000U, 0x22 }, { 190000000U, 0x32 },
0085 { 205000000U, 0x03 }, { 220000000U, 0x13 }, { 235000000U, 0x23 },
0086 { 250000000U, 0x33 }, { 275000000U, 0x04 }, { 300000000U, 0x14 },
0087 { 325000000U, 0x25 }, { 350000000U, 0x35 }, { 400000000U, 0x05 },
0088 { 450000000U, 0x16 }, { 500000000U, 0x26 }, { 550000000U, 0x37 },
0089 { 600000000U, 0x07 }, { 650000000U, 0x18 }, { 700000000U, 0x28 },
0090 { 750000000U, 0x39 }, { 800000000U, 0x09 }, { 850000000U, 0x19 },
0091 { 900000000U, 0x29 }, { 950000000U, 0x3a }, { 1000000000U, 0x0a },
0092 { 1050000000U, 0x1a }, { 1100000000U, 0x2a }, { 1150000000U, 0x3b },
0093 { 1200000000U, 0x0b }, { 1250000000U, 0x1b }, { 1300000000U, 0x2b },
0094 { 1350000000U, 0x3c }, { 1400000000U, 0x0c }, { 1450000000U, 0x1c },
0095 { 1500000000U, 0x2c }, { 1550000000U, 0x3d }, { 1600000000U, 0x0d },
0096 { 1650000000U, 0x1d }, { 1700000000U, 0x2e }, { 1750000000U, 0x3e },
0097 { 1800000000U, 0x0e }, { 1850000000U, 0x1e }, { 1900000000U, 0x2f },
0098 { 1950000000U, 0x3f }, { 2000000000U, 0x0f }, { 2050000000U, 0x40 },
0099 { 2100000000U, 0x41 }, { 2150000000U, 0x42 }, { 2200000000U, 0x43 },
0100 { 2250000000U, 0x44 }, { 2300000000U, 0x45 }, { 2350000000U, 0x46 },
0101 { 2400000000U, 0x47 }, { 2450000000U, 0x48 }, { 2500000000U, 0x49 },
0102 { },
0103 };
0104
0105 struct vco_cntrl_value {
0106 u32 min_freq;
0107 u32 max_freq;
0108 u16 value;
0109 };
0110
0111 static const struct vco_cntrl_value vco_cntrl_table[] = {
0112 { .min_freq = 40000000U, .max_freq = 55000000U, .value = 0x3f },
0113 { .min_freq = 52500000U, .max_freq = 80000000U, .value = 0x39 },
0114 { .min_freq = 80000000U, .max_freq = 110000000U, .value = 0x2f },
0115 { .min_freq = 105000000U, .max_freq = 160000000U, .value = 0x29 },
0116 { .min_freq = 160000000U, .max_freq = 220000000U, .value = 0x1f },
0117 { .min_freq = 210000000U, .max_freq = 320000000U, .value = 0x19 },
0118 { .min_freq = 320000000U, .max_freq = 440000000U, .value = 0x0f },
0119 { .min_freq = 420000000U, .max_freq = 660000000U, .value = 0x09 },
0120 { .min_freq = 630000000U, .max_freq = 1149000000U, .value = 0x03 },
0121 { .min_freq = 1100000000U, .max_freq = 1152000000U, .value = 0x01 },
0122 { .min_freq = 1150000000U, .max_freq = 1250000000U, .value = 0x01 },
0123 { },
0124 };
0125
0126 static void rcar_mipi_dsi_write(struct rcar_mipi_dsi *dsi, u32 reg, u32 data)
0127 {
0128 iowrite32(data, dsi->mmio + reg);
0129 }
0130
0131 static u32 rcar_mipi_dsi_read(struct rcar_mipi_dsi *dsi, u32 reg)
0132 {
0133 return ioread32(dsi->mmio + reg);
0134 }
0135
0136 static void rcar_mipi_dsi_clr(struct rcar_mipi_dsi *dsi, u32 reg, u32 clr)
0137 {
0138 rcar_mipi_dsi_write(dsi, reg, rcar_mipi_dsi_read(dsi, reg) & ~clr);
0139 }
0140
0141 static void rcar_mipi_dsi_set(struct rcar_mipi_dsi *dsi, u32 reg, u32 set)
0142 {
0143 rcar_mipi_dsi_write(dsi, reg, rcar_mipi_dsi_read(dsi, reg) | set);
0144 }
0145
0146 static int rcar_mipi_dsi_phtw_test(struct rcar_mipi_dsi *dsi, u32 phtw)
0147 {
0148 u32 status;
0149 int ret;
0150
0151 rcar_mipi_dsi_write(dsi, PHTW, phtw);
0152
0153 ret = read_poll_timeout(rcar_mipi_dsi_read, status,
0154 !(status & (PHTW_DWEN | PHTW_CWEN)),
0155 2000, 10000, false, dsi, PHTW);
0156 if (ret < 0) {
0157 dev_err(dsi->dev, "PHY test interface write timeout (0x%08x)\n",
0158 phtw);
0159 return ret;
0160 }
0161
0162 return ret;
0163 }
0164
0165
0166
0167
0168
0169 struct dsi_setup_info {
0170 unsigned long fout;
0171 u16 vco_cntrl;
0172 u16 prop_cntrl;
0173 u16 hsfreqrange;
0174 u16 div;
0175 unsigned int m;
0176 unsigned int n;
0177 };
0178
0179 static void rcar_mipi_dsi_parameters_calc(struct rcar_mipi_dsi *dsi,
0180 struct clk *clk, unsigned long target,
0181 struct dsi_setup_info *setup_info)
0182 {
0183
0184 const struct vco_cntrl_value *vco_cntrl;
0185 unsigned long fout_target;
0186 unsigned long fin, fout;
0187 unsigned long hsfreq;
0188 unsigned int best_err = -1;
0189 unsigned int divider;
0190 unsigned int n;
0191 unsigned int i;
0192 unsigned int err;
0193
0194
0195
0196
0197
0198 fout_target = target * mipi_dsi_pixel_format_to_bpp(dsi->format)
0199 / (2 * dsi->lanes);
0200 if (fout_target < 40000000 || fout_target > 1250000000)
0201 return;
0202
0203
0204 for (vco_cntrl = vco_cntrl_table; vco_cntrl->min_freq != 0; vco_cntrl++) {
0205 if (fout_target > vco_cntrl->min_freq &&
0206 fout_target <= vco_cntrl->max_freq) {
0207 setup_info->vco_cntrl = vco_cntrl->value;
0208 if (fout_target >= 1150000000)
0209 setup_info->prop_cntrl = 0x0c;
0210 else
0211 setup_info->prop_cntrl = 0x0b;
0212 break;
0213 }
0214 }
0215
0216
0217 setup_info->div = (setup_info->vco_cntrl & 0x30) >> 4;
0218
0219
0220 hsfreq = fout_target * 2;
0221 for (i = 0; i < ARRAY_SIZE(hsfreqrange_table); i++) {
0222 if (hsfreqrange_table[i][0] >= hsfreq) {
0223 setup_info->hsfreqrange = hsfreqrange_table[i][1];
0224 break;
0225 }
0226 }
0227
0228
0229
0230
0231
0232
0233 fin = clk_get_rate(clk);
0234 divider = 1 << setup_info->div;
0235 for (n = 3; n < 9; n++) {
0236 unsigned long fpfd;
0237 unsigned int m;
0238
0239 fpfd = fin / n;
0240
0241 for (m = 64; m < 626; m++) {
0242 fout = fpfd * m / divider;
0243 err = abs((long)(fout - fout_target) * 10000 /
0244 (long)fout_target);
0245 if (err < best_err) {
0246 setup_info->m = m - 2;
0247 setup_info->n = n - 1;
0248 setup_info->fout = fout;
0249 best_err = err;
0250 if (err == 0)
0251 goto done;
0252 }
0253 }
0254 }
0255
0256 done:
0257 dev_dbg(dsi->dev,
0258 "%pC %lu Hz -> Fout %lu Hz (target %lu Hz, error %d.%02u%%), PLL M/N/DIV %u/%u/%u\n",
0259 clk, fin, setup_info->fout, fout_target, best_err / 100,
0260 best_err % 100, setup_info->m, setup_info->n, setup_info->div);
0261 dev_dbg(dsi->dev,
0262 "vco_cntrl = 0x%x\tprop_cntrl = 0x%x\thsfreqrange = 0x%x\n",
0263 setup_info->vco_cntrl, setup_info->prop_cntrl,
0264 setup_info->hsfreqrange);
0265 }
0266
0267 static void rcar_mipi_dsi_set_display_timing(struct rcar_mipi_dsi *dsi,
0268 const struct drm_display_mode *mode)
0269 {
0270 u32 setr;
0271 u32 vprmset0r;
0272 u32 vprmset1r;
0273 u32 vprmset2r;
0274 u32 vprmset3r;
0275 u32 vprmset4r;
0276
0277
0278 if (mipi_dsi_pixel_format_to_bpp(dsi->format) == 24)
0279 rcar_mipi_dsi_write(dsi, TXVMPSPHSETR, TXVMPSPHSETR_DT_RGB24);
0280 else if (mipi_dsi_pixel_format_to_bpp(dsi->format) == 18)
0281 rcar_mipi_dsi_write(dsi, TXVMPSPHSETR, TXVMPSPHSETR_DT_RGB18);
0282 else if (mipi_dsi_pixel_format_to_bpp(dsi->format) == 16)
0283 rcar_mipi_dsi_write(dsi, TXVMPSPHSETR, TXVMPSPHSETR_DT_RGB16);
0284 else {
0285 dev_warn(dsi->dev, "unsupported format");
0286 return;
0287 }
0288
0289
0290 setr = TXVMSETR_HSABPEN_EN | TXVMSETR_HBPBPEN_EN
0291 | TXVMSETR_HFPBPEN_EN | TXVMSETR_SYNSEQ_PULSES
0292 | TXVMSETR_PIXWDTH | TXVMSETR_VSTPM;
0293 rcar_mipi_dsi_write(dsi, TXVMSETR, setr);
0294
0295
0296 vprmset0r = (mode->flags & DRM_MODE_FLAG_PVSYNC ?
0297 TXVMVPRMSET0R_VSPOL_HIG : TXVMVPRMSET0R_VSPOL_LOW)
0298 | (mode->flags & DRM_MODE_FLAG_PHSYNC ?
0299 TXVMVPRMSET0R_HSPOL_HIG : TXVMVPRMSET0R_HSPOL_LOW)
0300 | TXVMVPRMSET0R_CSPC_RGB | TXVMVPRMSET0R_BPP_24;
0301
0302 vprmset1r = TXVMVPRMSET1R_VACTIVE(mode->vdisplay)
0303 | TXVMVPRMSET1R_VSA(mode->vsync_end - mode->vsync_start);
0304
0305 vprmset2r = TXVMVPRMSET2R_VFP(mode->vsync_start - mode->vdisplay)
0306 | TXVMVPRMSET2R_VBP(mode->vtotal - mode->vsync_end);
0307
0308 vprmset3r = TXVMVPRMSET3R_HACTIVE(mode->hdisplay)
0309 | TXVMVPRMSET3R_HSA(mode->hsync_end - mode->hsync_start);
0310
0311 vprmset4r = TXVMVPRMSET4R_HFP(mode->hsync_start - mode->hdisplay)
0312 | TXVMVPRMSET4R_HBP(mode->htotal - mode->hsync_end);
0313
0314 rcar_mipi_dsi_write(dsi, TXVMVPRMSET0R, vprmset0r);
0315 rcar_mipi_dsi_write(dsi, TXVMVPRMSET1R, vprmset1r);
0316 rcar_mipi_dsi_write(dsi, TXVMVPRMSET2R, vprmset2r);
0317 rcar_mipi_dsi_write(dsi, TXVMVPRMSET3R, vprmset3r);
0318 rcar_mipi_dsi_write(dsi, TXVMVPRMSET4R, vprmset4r);
0319 }
0320
0321 static int rcar_mipi_dsi_startup(struct rcar_mipi_dsi *dsi,
0322 const struct drm_display_mode *mode)
0323 {
0324 struct dsi_setup_info setup_info = {};
0325 unsigned int timeout;
0326 int ret, i;
0327 int dsi_format;
0328 u32 phy_setup;
0329 u32 clockset2, clockset3;
0330 u32 ppisetr;
0331 u32 vclkset;
0332
0333
0334 dsi_format = mipi_dsi_pixel_format_to_bpp(dsi->format);
0335 if (dsi_format < 0) {
0336 dev_warn(dsi->dev, "invalid format");
0337 return -EINVAL;
0338 }
0339
0340
0341 rcar_mipi_dsi_parameters_calc(dsi, dsi->clocks.pll,
0342 mode->clock * 1000, &setup_info);
0343
0344
0345 rcar_mipi_dsi_set(dsi, LPCLKSET, LPCLKSET_CKEN);
0346
0347
0348 rcar_mipi_dsi_set(dsi, CFGCLKSET, CFGCLKSET_CKEN);
0349
0350 rcar_mipi_dsi_clr(dsi, PHYSETUP, PHYSETUP_RSTZ);
0351 rcar_mipi_dsi_clr(dsi, PHYSETUP, PHYSETUP_SHUTDOWNZ);
0352
0353 rcar_mipi_dsi_set(dsi, PHTC, PHTC_TESTCLR);
0354 rcar_mipi_dsi_clr(dsi, PHTC, PHTC_TESTCLR);
0355
0356
0357 phy_setup = rcar_mipi_dsi_read(dsi, PHYSETUP);
0358 phy_setup &= ~PHYSETUP_HSFREQRANGE_MASK;
0359 phy_setup |= PHYSETUP_HSFREQRANGE(setup_info.hsfreqrange);
0360 rcar_mipi_dsi_write(dsi, PHYSETUP, phy_setup);
0361
0362 for (i = 0; i < ARRAY_SIZE(phtw); i++) {
0363 ret = rcar_mipi_dsi_phtw_test(dsi, phtw[i]);
0364 if (ret < 0)
0365 return ret;
0366 }
0367
0368
0369 rcar_mipi_dsi_clr(dsi, CLOCKSET1, CLOCKSET1_SHADOW_CLEAR);
0370 rcar_mipi_dsi_set(dsi, CLOCKSET1, CLOCKSET1_SHADOW_CLEAR);
0371 rcar_mipi_dsi_clr(dsi, CLOCKSET1, CLOCKSET1_SHADOW_CLEAR);
0372
0373 clockset2 = CLOCKSET2_M(setup_info.m) | CLOCKSET2_N(setup_info.n)
0374 | CLOCKSET2_VCO_CNTRL(setup_info.vco_cntrl);
0375 clockset3 = CLOCKSET3_PROP_CNTRL(setup_info.prop_cntrl)
0376 | CLOCKSET3_INT_CNTRL(0)
0377 | CLOCKSET3_CPBIAS_CNTRL(0x10)
0378 | CLOCKSET3_GMP_CNTRL(1);
0379 rcar_mipi_dsi_write(dsi, CLOCKSET2, clockset2);
0380 rcar_mipi_dsi_write(dsi, CLOCKSET3, clockset3);
0381
0382 rcar_mipi_dsi_clr(dsi, CLOCKSET1, CLOCKSET1_UPDATEPLL);
0383 rcar_mipi_dsi_set(dsi, CLOCKSET1, CLOCKSET1_UPDATEPLL);
0384 udelay(10);
0385 rcar_mipi_dsi_clr(dsi, CLOCKSET1, CLOCKSET1_UPDATEPLL);
0386
0387 ppisetr = PPISETR_DLEN_3 | PPISETR_CLEN;
0388 rcar_mipi_dsi_write(dsi, PPISETR, ppisetr);
0389
0390 rcar_mipi_dsi_set(dsi, PHYSETUP, PHYSETUP_SHUTDOWNZ);
0391 rcar_mipi_dsi_set(dsi, PHYSETUP, PHYSETUP_RSTZ);
0392 usleep_range(400, 500);
0393
0394
0395 for (timeout = 10; timeout > 0; --timeout) {
0396 if ((rcar_mipi_dsi_read(dsi, PPICLSR) & PPICLSR_STPST) &&
0397 (rcar_mipi_dsi_read(dsi, PPIDLSR) & PPIDLSR_STPST) &&
0398 (rcar_mipi_dsi_read(dsi, CLOCKSET1) & CLOCKSET1_LOCK))
0399 break;
0400
0401 usleep_range(1000, 2000);
0402 }
0403
0404 if (!timeout) {
0405 dev_err(dsi->dev, "failed to enable PPI clock\n");
0406 return -ETIMEDOUT;
0407 }
0408
0409 for (i = 0; i < ARRAY_SIZE(phtw2); i++) {
0410 ret = rcar_mipi_dsi_phtw_test(dsi, phtw2[i]);
0411 if (ret < 0)
0412 return ret;
0413 }
0414
0415
0416 vclkset = VCLKSET_CKEN;
0417 rcar_mipi_dsi_set(dsi, VCLKSET, vclkset);
0418
0419 if (dsi_format == 24)
0420 vclkset |= VCLKSET_BPP_24;
0421 else if (dsi_format == 18)
0422 vclkset |= VCLKSET_BPP_18;
0423 else if (dsi_format == 16)
0424 vclkset |= VCLKSET_BPP_16;
0425 else {
0426 dev_warn(dsi->dev, "unsupported format");
0427 return -EINVAL;
0428 }
0429 vclkset |= VCLKSET_COLOR_RGB | VCLKSET_DIV(setup_info.div)
0430 | VCLKSET_LANE(dsi->lanes - 1);
0431
0432 rcar_mipi_dsi_set(dsi, VCLKSET, vclkset);
0433
0434
0435 rcar_mipi_dsi_set(dsi, VCLKEN, VCLKEN_CKEN);
0436
0437 dev_dbg(dsi->dev, "DSI device is started\n");
0438
0439 return 0;
0440 }
0441
0442 static void rcar_mipi_dsi_shutdown(struct rcar_mipi_dsi *dsi)
0443 {
0444 rcar_mipi_dsi_clr(dsi, PHYSETUP, PHYSETUP_RSTZ);
0445 rcar_mipi_dsi_clr(dsi, PHYSETUP, PHYSETUP_SHUTDOWNZ);
0446
0447 dev_dbg(dsi->dev, "DSI device is shutdown\n");
0448 }
0449
0450 static int rcar_mipi_dsi_clk_enable(struct rcar_mipi_dsi *dsi)
0451 {
0452 int ret;
0453
0454 reset_control_deassert(dsi->rstc);
0455
0456 ret = clk_prepare_enable(dsi->clocks.mod);
0457 if (ret < 0)
0458 goto err_reset;
0459
0460 ret = clk_prepare_enable(dsi->clocks.dsi);
0461 if (ret < 0)
0462 goto err_clock;
0463
0464 return 0;
0465
0466 err_clock:
0467 clk_disable_unprepare(dsi->clocks.mod);
0468 err_reset:
0469 reset_control_assert(dsi->rstc);
0470 return ret;
0471 }
0472
0473 static void rcar_mipi_dsi_clk_disable(struct rcar_mipi_dsi *dsi)
0474 {
0475 clk_disable_unprepare(dsi->clocks.dsi);
0476 clk_disable_unprepare(dsi->clocks.mod);
0477
0478 reset_control_assert(dsi->rstc);
0479 }
0480
0481 static int rcar_mipi_dsi_start_hs_clock(struct rcar_mipi_dsi *dsi)
0482 {
0483
0484
0485
0486
0487 u32 status;
0488 int ret;
0489
0490
0491 rcar_mipi_dsi_set(dsi, PPICLCR, PPICLCR_TXREQHS);
0492
0493 ret = read_poll_timeout(rcar_mipi_dsi_read, status,
0494 status & PPICLSR_TOHS,
0495 2000, 10000, false, dsi, PPICLSR);
0496 if (ret < 0) {
0497 dev_err(dsi->dev, "failed to enable HS clock\n");
0498 return ret;
0499 }
0500
0501 rcar_mipi_dsi_set(dsi, PPICLSCR, PPICLSCR_TOHS);
0502
0503 return 0;
0504 }
0505
0506 static int rcar_mipi_dsi_start_video(struct rcar_mipi_dsi *dsi)
0507 {
0508 u32 status;
0509 int ret;
0510
0511
0512 ret = read_poll_timeout(rcar_mipi_dsi_read, status,
0513 !(status & (LINKSR_LPBUSY | LINKSR_HSBUSY)),
0514 2000, 10000, false, dsi, LINKSR);
0515 if (ret < 0) {
0516 dev_err(dsi->dev, "Link failed to become ready\n");
0517 return ret;
0518 }
0519
0520
0521 rcar_mipi_dsi_clr(dsi, TXVMCR, TXVMCR_VFCLR);
0522
0523 ret = read_poll_timeout(rcar_mipi_dsi_read, status,
0524 status & TXVMSR_VFRDY,
0525 2000, 10000, false, dsi, TXVMSR);
0526 if (ret < 0) {
0527 dev_err(dsi->dev, "Failed to de-assert video FIFO clear\n");
0528 return ret;
0529 }
0530
0531
0532 rcar_mipi_dsi_set(dsi, TXVMCR, TXVMCR_EN_VIDEO);
0533
0534 ret = read_poll_timeout(rcar_mipi_dsi_read, status,
0535 status & TXVMSR_RDY,
0536 2000, 10000, false, dsi, TXVMSR);
0537 if (ret < 0) {
0538 dev_err(dsi->dev, "Failed to enable video transmission\n");
0539 return ret;
0540 }
0541
0542 return 0;
0543 }
0544
0545
0546
0547
0548
0549 static int rcar_mipi_dsi_attach(struct drm_bridge *bridge,
0550 enum drm_bridge_attach_flags flags)
0551 {
0552 struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge);
0553
0554 return drm_bridge_attach(bridge->encoder, dsi->next_bridge, bridge,
0555 flags);
0556 }
0557
0558 static void rcar_mipi_dsi_atomic_enable(struct drm_bridge *bridge,
0559 struct drm_bridge_state *old_bridge_state)
0560 {
0561 struct drm_atomic_state *state = old_bridge_state->base.state;
0562 struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge);
0563 const struct drm_display_mode *mode;
0564 struct drm_connector *connector;
0565 struct drm_crtc *crtc;
0566 int ret;
0567
0568 connector = drm_atomic_get_new_connector_for_encoder(state,
0569 bridge->encoder);
0570 crtc = drm_atomic_get_new_connector_state(state, connector)->crtc;
0571 mode = &drm_atomic_get_new_crtc_state(state, crtc)->adjusted_mode;
0572
0573 ret = rcar_mipi_dsi_clk_enable(dsi);
0574 if (ret < 0) {
0575 dev_err(dsi->dev, "failed to enable DSI clocks\n");
0576 return;
0577 }
0578
0579 ret = rcar_mipi_dsi_startup(dsi, mode);
0580 if (ret < 0)
0581 goto err_dsi_startup;
0582
0583 rcar_mipi_dsi_set_display_timing(dsi, mode);
0584
0585 ret = rcar_mipi_dsi_start_hs_clock(dsi);
0586 if (ret < 0)
0587 goto err_dsi_start_hs;
0588
0589 rcar_mipi_dsi_start_video(dsi);
0590
0591 return;
0592
0593 err_dsi_start_hs:
0594 rcar_mipi_dsi_shutdown(dsi);
0595 err_dsi_startup:
0596 rcar_mipi_dsi_clk_disable(dsi);
0597 }
0598
0599 static void rcar_mipi_dsi_atomic_disable(struct drm_bridge *bridge,
0600 struct drm_bridge_state *old_bridge_state)
0601 {
0602 struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge);
0603
0604 rcar_mipi_dsi_shutdown(dsi);
0605 rcar_mipi_dsi_clk_disable(dsi);
0606 }
0607
0608 static enum drm_mode_status
0609 rcar_mipi_dsi_bridge_mode_valid(struct drm_bridge *bridge,
0610 const struct drm_display_info *info,
0611 const struct drm_display_mode *mode)
0612 {
0613 if (mode->clock > 297000)
0614 return MODE_CLOCK_HIGH;
0615
0616 return MODE_OK;
0617 }
0618
0619 static const struct drm_bridge_funcs rcar_mipi_dsi_bridge_ops = {
0620 .attach = rcar_mipi_dsi_attach,
0621 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
0622 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
0623 .atomic_reset = drm_atomic_helper_bridge_reset,
0624 .atomic_enable = rcar_mipi_dsi_atomic_enable,
0625 .atomic_disable = rcar_mipi_dsi_atomic_disable,
0626 .mode_valid = rcar_mipi_dsi_bridge_mode_valid,
0627 };
0628
0629
0630
0631
0632
0633 static int rcar_mipi_dsi_host_attach(struct mipi_dsi_host *host,
0634 struct mipi_dsi_device *device)
0635 {
0636 struct rcar_mipi_dsi *dsi = host_to_rcar_mipi_dsi(host);
0637 int ret;
0638
0639 if (device->lanes > dsi->num_data_lanes)
0640 return -EINVAL;
0641
0642 dsi->lanes = device->lanes;
0643 dsi->format = device->format;
0644
0645 dsi->next_bridge = devm_drm_of_get_bridge(dsi->dev, dsi->dev->of_node,
0646 1, 0);
0647 if (IS_ERR(dsi->next_bridge)) {
0648 ret = PTR_ERR(dsi->next_bridge);
0649 dev_err(dsi->dev, "failed to get next bridge: %d\n", ret);
0650 return ret;
0651 }
0652
0653
0654 dsi->bridge.funcs = &rcar_mipi_dsi_bridge_ops;
0655 dsi->bridge.of_node = dsi->dev->of_node;
0656 drm_bridge_add(&dsi->bridge);
0657
0658 return 0;
0659 }
0660
0661 static int rcar_mipi_dsi_host_detach(struct mipi_dsi_host *host,
0662 struct mipi_dsi_device *device)
0663 {
0664 struct rcar_mipi_dsi *dsi = host_to_rcar_mipi_dsi(host);
0665
0666 drm_bridge_remove(&dsi->bridge);
0667
0668 return 0;
0669 }
0670
0671 static const struct mipi_dsi_host_ops rcar_mipi_dsi_host_ops = {
0672 .attach = rcar_mipi_dsi_host_attach,
0673 .detach = rcar_mipi_dsi_host_detach,
0674 };
0675
0676
0677
0678
0679
0680 static int rcar_mipi_dsi_parse_dt(struct rcar_mipi_dsi *dsi)
0681 {
0682 int ret;
0683
0684 ret = drm_of_get_data_lanes_count_ep(dsi->dev->of_node, 1, 0, 1, 4);
0685 if (ret < 0) {
0686 dev_err(dsi->dev, "missing or invalid data-lanes property\n");
0687 return ret;
0688 }
0689
0690 dsi->num_data_lanes = ret;
0691 return 0;
0692 }
0693
0694 static struct clk *rcar_mipi_dsi_get_clock(struct rcar_mipi_dsi *dsi,
0695 const char *name,
0696 bool optional)
0697 {
0698 struct clk *clk;
0699
0700 clk = devm_clk_get(dsi->dev, name);
0701 if (!IS_ERR(clk))
0702 return clk;
0703
0704 if (PTR_ERR(clk) == -ENOENT && optional)
0705 return NULL;
0706
0707 dev_err_probe(dsi->dev, PTR_ERR(clk), "failed to get %s clock\n",
0708 name ? name : "module");
0709
0710 return clk;
0711 }
0712
0713 static int rcar_mipi_dsi_get_clocks(struct rcar_mipi_dsi *dsi)
0714 {
0715 dsi->clocks.mod = rcar_mipi_dsi_get_clock(dsi, NULL, false);
0716 if (IS_ERR(dsi->clocks.mod))
0717 return PTR_ERR(dsi->clocks.mod);
0718
0719 dsi->clocks.pll = rcar_mipi_dsi_get_clock(dsi, "pll", true);
0720 if (IS_ERR(dsi->clocks.pll))
0721 return PTR_ERR(dsi->clocks.pll);
0722
0723 dsi->clocks.dsi = rcar_mipi_dsi_get_clock(dsi, "dsi", true);
0724 if (IS_ERR(dsi->clocks.dsi))
0725 return PTR_ERR(dsi->clocks.dsi);
0726
0727 if (!dsi->clocks.pll && !dsi->clocks.dsi) {
0728 dev_err(dsi->dev, "no input clock (pll, dsi)\n");
0729 return -EINVAL;
0730 }
0731
0732 return 0;
0733 }
0734
0735 static int rcar_mipi_dsi_probe(struct platform_device *pdev)
0736 {
0737 struct rcar_mipi_dsi *dsi;
0738 struct resource *mem;
0739 int ret;
0740
0741 dsi = devm_kzalloc(&pdev->dev, sizeof(*dsi), GFP_KERNEL);
0742 if (dsi == NULL)
0743 return -ENOMEM;
0744
0745 platform_set_drvdata(pdev, dsi);
0746
0747 dsi->dev = &pdev->dev;
0748 dsi->info = of_device_get_match_data(&pdev->dev);
0749
0750 ret = rcar_mipi_dsi_parse_dt(dsi);
0751 if (ret < 0)
0752 return ret;
0753
0754
0755 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
0756 dsi->mmio = devm_ioremap_resource(dsi->dev, mem);
0757 if (IS_ERR(dsi->mmio))
0758 return PTR_ERR(dsi->mmio);
0759
0760 ret = rcar_mipi_dsi_get_clocks(dsi);
0761 if (ret < 0)
0762 return ret;
0763
0764 dsi->rstc = devm_reset_control_get(dsi->dev, NULL);
0765 if (IS_ERR(dsi->rstc)) {
0766 dev_err(dsi->dev, "failed to get cpg reset\n");
0767 return PTR_ERR(dsi->rstc);
0768 }
0769
0770
0771 dsi->host.dev = dsi->dev;
0772 dsi->host.ops = &rcar_mipi_dsi_host_ops;
0773 ret = mipi_dsi_host_register(&dsi->host);
0774 if (ret < 0)
0775 return ret;
0776
0777 return 0;
0778 }
0779
0780 static int rcar_mipi_dsi_remove(struct platform_device *pdev)
0781 {
0782 struct rcar_mipi_dsi *dsi = platform_get_drvdata(pdev);
0783
0784 mipi_dsi_host_unregister(&dsi->host);
0785
0786 return 0;
0787 }
0788
0789 static const struct of_device_id rcar_mipi_dsi_of_table[] = {
0790 { .compatible = "renesas,r8a779a0-dsi-csi2-tx" },
0791 { }
0792 };
0793
0794 MODULE_DEVICE_TABLE(of, rcar_mipi_dsi_of_table);
0795
0796 static struct platform_driver rcar_mipi_dsi_platform_driver = {
0797 .probe = rcar_mipi_dsi_probe,
0798 .remove = rcar_mipi_dsi_remove,
0799 .driver = {
0800 .name = "rcar-mipi-dsi",
0801 .of_match_table = rcar_mipi_dsi_of_table,
0802 },
0803 };
0804
0805 module_platform_driver(rcar_mipi_dsi_platform_driver);
0806
0807 MODULE_DESCRIPTION("Renesas R-Car MIPI DSI Encoder Driver");
0808 MODULE_LICENSE("GPL");