File Index
Files and directories
Sign in
FILE

rzg2l_mipi_dsi.c

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c C
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * RZ/G2L MIPI DSI Encoder Driver
   4 *
   5 * Copyright (C) 2022 Renesas Electronics Corporation
   6 */
   7
   8#include <linux/bitfield.h>
   9#include <linux/clk.h>
  10#include <linux/delay.h>
  11#include <linux/dma-mapping.h>
  12#include <linux/io.h>
  13#include <linux/iopoll.h>
  14#include <linux/math.h>
  15#include <linux/module.h>
  16#include <linux/of.h>
  17#include <linux/of_graph.h>
  18#include <linux/platform_device.h>
  19#include <linux/pm_runtime.h>
  20#include <linux/reset.h>
  21#include <linux/slab.h>
  22#include <linux/units.h>
  23
  24#include <drm/drm_atomic.h>
  25#include <drm/drm_atomic_helper.h>
  26#include <drm/drm_bridge.h>
  27#include <drm/drm_mipi_dsi.h>
  28#include <drm/drm_of.h>
  29#include <drm/drm_panel.h>
  30#include <drm/drm_probe_helper.h>
  31#include <video/mipi_display.h>
  32
  33#include "rzg2l_mipi_dsi_regs.h"
  34
  35#define RZG2L_DCS_BUF_SIZE	128 /* Maximum DCS buffer size in external memory. */
  36
  37#define RZ_MIPI_DSI_FEATURE_16BPP	BIT(0)
  38
  39struct rzg2l_mipi_dsi;
  40
  41struct rzg2l_mipi_dsi_hw_info {
  42	int (*dphy_init)(struct rzg2l_mipi_dsi *dsi, u64 hsfreq_millihz);
  43	void (*dphy_startup_late_init)(struct rzg2l_mipi_dsi *dsi);
  44	void (*dphy_exit)(struct rzg2l_mipi_dsi *dsi);
  45	int (*dphy_conf_clks)(struct rzg2l_mipi_dsi *dsi, unsigned long mode_freq,
  46			      u64 *hsfreq_millihz);
  47	unsigned int (*dphy_mode_clk_check)(struct rzg2l_mipi_dsi *dsi,
  48					    unsigned long mode_freq);
  49	u32 phy_reg_offset;
  50	u32 link_reg_offset;
  51	unsigned long min_dclk;
  52	unsigned long max_dclk;
  53	u8 features;
  54};
  55
  56struct rzg2l_mipi_dsi {
  57	struct device *dev;
  58	void __iomem *mmio;
  59
  60	const struct rzg2l_mipi_dsi_hw_info *info;
  61
  62	struct reset_control *rstc;
  63	struct reset_control *arstc;
  64	struct reset_control *prstc;
  65
  66	struct mipi_dsi_host host;
  67	struct drm_bridge bridge;
  68	struct drm_bridge *next_bridge;
  69
  70	struct clk *vclk;
  71
  72	enum mipi_dsi_pixel_format format;
  73	unsigned int num_data_lanes;
  74	unsigned int lanes;
  75	unsigned long mode_flags;
  76
  77	/* DCS buffer pointers when using external memory. */
  78	dma_addr_t dcs_buf_phys;
  79	u8 *dcs_buf_virt;
  80};
  81
  82static inline struct rzg2l_mipi_dsi *
  83bridge_to_rzg2l_mipi_dsi(struct drm_bridge *bridge)
  84{
  85	return container_of(bridge, struct rzg2l_mipi_dsi, bridge);
  86}
  87
  88static inline struct rzg2l_mipi_dsi *
  89host_to_rzg2l_mipi_dsi(struct mipi_dsi_host *host)
  90{
  91	return container_of(host, struct rzg2l_mipi_dsi, host);
  92}
  93
  94struct rzg2l_mipi_dsi_timings {
  95	unsigned long hsfreq_max;
  96	u32 t_init;
  97	u32 tclk_prepare;
  98	u32 ths_prepare;
  99	u32 tclk_zero;
 100	u32 tclk_pre;
 101	u32 tclk_post;
 102	u32 tclk_trail;
 103	u32 ths_zero;
 104	u32 ths_trail;
 105	u32 ths_exit;
 106	u32 tlpx;
 107};
 108
 109static const struct rzg2l_mipi_dsi_timings rzg2l_mipi_dsi_global_timings[] = {
 110	{
 111		.hsfreq_max = 80000000,
 112		.t_init = 79801,
 113		.tclk_prepare = 8,
 114		.ths_prepare = 13,
 115		.tclk_zero = 33,
 116		.tclk_pre = 24,
 117		.tclk_post = 94,
 118		.tclk_trail = 10,
 119		.ths_zero = 23,
 120		.ths_trail = 17,
 121		.ths_exit = 13,
 122		.tlpx = 6,
 123	},
 124	{
 125		.hsfreq_max = 125000000,
 126		.t_init = 79801,
 127		.tclk_prepare = 8,
 128		.ths_prepare = 12,
 129		.tclk_zero = 33,
 130		.tclk_pre = 15,
 131		.tclk_post = 94,
 132		.tclk_trail = 10,
 133		.ths_zero = 23,
 134		.ths_trail = 17,
 135		.ths_exit = 13,
 136		.tlpx = 6,
 137	},
 138	{
 139		.hsfreq_max = 250000000,
 140		.t_init = 79801,
 141		.tclk_prepare = 8,
 142		.ths_prepare = 12,
 143		.tclk_zero = 33,
 144		.tclk_pre = 13,
 145		.tclk_post = 94,
 146		.tclk_trail = 10,
 147		.ths_zero = 23,
 148		.ths_trail = 16,
 149		.ths_exit = 13,
 150		.tlpx = 6,
 151	},
 152	{
 153		.hsfreq_max = 360000000,
 154		.t_init = 79801,
 155		.tclk_prepare = 8,
 156		.ths_prepare = 10,
 157		.tclk_zero = 33,
 158		.tclk_pre = 4,
 159		.tclk_post = 35,
 160		.tclk_trail = 7,
 161		.ths_zero = 16,
 162		.ths_trail = 9,
 163		.ths_exit = 13,
 164		.tlpx = 6,
 165	},
 166	{
 167		.hsfreq_max = 720000000,
 168		.t_init = 79801,
 169		.tclk_prepare = 8,
 170		.ths_prepare = 9,
 171		.tclk_zero = 33,
 172		.tclk_pre = 4,
 173		.tclk_post = 35,
 174		.tclk_trail = 7,
 175		.ths_zero = 16,
 176		.ths_trail = 9,
 177		.ths_exit = 13,
 178		.tlpx = 6,
 179	},
 180	{
 181		.hsfreq_max = 1500000000,
 182		.t_init = 79801,
 183		.tclk_prepare = 8,
 184		.ths_prepare = 9,
 185		.tclk_zero = 33,
 186		.tclk_pre = 4,
 187		.tclk_post = 35,
 188		.tclk_trail = 7,
 189		.ths_zero = 16,
 190		.ths_trail = 9,
 191		.ths_exit = 13,
 192		.tlpx = 6,
 193	},
 194};
 195
 196static void rzg2l_mipi_dsi_phy_write(struct rzg2l_mipi_dsi *dsi, u32 reg, u32 data)
 197{
 198	iowrite32(data, dsi->mmio + dsi->info->phy_reg_offset + reg);
 199}
 200
 201static void rzg2l_mipi_dsi_link_write(struct rzg2l_mipi_dsi *dsi, u32 reg, u32 data)
 202{
 203	iowrite32(data, dsi->mmio + dsi->info->link_reg_offset + reg);
 204}
 205
 206static u32 rzg2l_mipi_dsi_phy_read(struct rzg2l_mipi_dsi *dsi, u32 reg)
 207{
 208	return ioread32(dsi->mmio + dsi->info->phy_reg_offset + reg);
 209}
 210
 211static u32 rzg2l_mipi_dsi_link_read(struct rzg2l_mipi_dsi *dsi, u32 reg)
 212{
 213	return ioread32(dsi->mmio + dsi->info->link_reg_offset + reg);
 214}
 215
 216/* -----------------------------------------------------------------------------
 217 * Hardware Setup
 218 */
 219
 220static int rzg2l_mipi_dsi_dphy_init(struct rzg2l_mipi_dsi *dsi,
 221				    u64 hsfreq_millihz)
 222{
 223	unsigned long hsfreq = DIV_ROUND_CLOSEST_ULL(hsfreq_millihz, MILLI);
 224	const struct rzg2l_mipi_dsi_timings *dphy_timings;
 225	unsigned int i;
 226	u32 dphyctrl0;
 227	u32 dphytim0;
 228	u32 dphytim1;
 229	u32 dphytim2;
 230	u32 dphytim3;
 231	int ret;
 232
 233	/* All DSI global operation timings are set with recommended setting */
 234	for (i = 0; i < ARRAY_SIZE(rzg2l_mipi_dsi_global_timings); ++i) {
 235		dphy_timings = &rzg2l_mipi_dsi_global_timings[i];
 236		if (hsfreq <= dphy_timings->hsfreq_max)
 237			break;
 238	}
 239
 240	/* Initializing DPHY before accessing LINK */
 241	dphyctrl0 = DSIDPHYCTRL0_CAL_EN_HSRX_OFS | DSIDPHYCTRL0_CMN_MASTER_EN |
 242		    DSIDPHYCTRL0_RE_VDD_DETVCCQLV18 | DSIDPHYCTRL0_EN_BGR;
 243
 244	rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYCTRL0, dphyctrl0);
 245	usleep_range(20, 30);
 246
 247	dphyctrl0 |= DSIDPHYCTRL0_EN_LDO1200;
 248	rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYCTRL0, dphyctrl0);
 249	usleep_range(10, 20);
 250
 251	dphytim0 = DSIDPHYTIM0_TCLK_MISS(0) |
 252		   DSIDPHYTIM0_T_INIT(dphy_timings->t_init);
 253	dphytim1 = DSIDPHYTIM1_THS_PREPARE(dphy_timings->ths_prepare) |
 254		   DSIDPHYTIM1_TCLK_PREPARE(dphy_timings->tclk_prepare) |
 255		   DSIDPHYTIM1_THS_SETTLE(0) |
 256		   DSIDPHYTIM1_TCLK_SETTLE(0);
 257	dphytim2 = DSIDPHYTIM2_TCLK_TRAIL(dphy_timings->tclk_trail) |
 258		   DSIDPHYTIM2_TCLK_POST(dphy_timings->tclk_post) |
 259		   DSIDPHYTIM2_TCLK_PRE(dphy_timings->tclk_pre) |
 260		   DSIDPHYTIM2_TCLK_ZERO(dphy_timings->tclk_zero);
 261	dphytim3 = DSIDPHYTIM3_TLPX(dphy_timings->tlpx) |
 262		   DSIDPHYTIM3_THS_EXIT(dphy_timings->ths_exit) |
 263		   DSIDPHYTIM3_THS_TRAIL(dphy_timings->ths_trail) |
 264		   DSIDPHYTIM3_THS_ZERO(dphy_timings->ths_zero);
 265
 266	rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYTIM0, dphytim0);
 267	rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYTIM1, dphytim1);
 268	rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYTIM2, dphytim2);
 269	rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYTIM3, dphytim3);
 270
 271	ret = reset_control_deassert(dsi->rstc);
 272	if (ret < 0)
 273		return ret;
 274
 275	udelay(1);
 276
 277	return 0;
 278}
 279
 280static void rzg2l_mipi_dsi_dphy_exit(struct rzg2l_mipi_dsi *dsi)
 281{
 282	u32 dphyctrl0;
 283
 284	dphyctrl0 = rzg2l_mipi_dsi_phy_read(dsi, DSIDPHYCTRL0);
 285
 286	dphyctrl0 &= ~(DSIDPHYCTRL0_EN_LDO1200 | DSIDPHYCTRL0_EN_BGR);
 287	rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYCTRL0, dphyctrl0);
 288
 289	reset_control_assert(dsi->rstc);
 290}
 291
 292static int rzg2l_dphy_conf_clks(struct rzg2l_mipi_dsi *dsi, unsigned long mode_freq,
 293				u64 *hsfreq_millihz)
 294{
 295	unsigned long vclk_rate;
 296	unsigned int bpp;
 297
 298	clk_set_rate(dsi->vclk, mode_freq * KILO);
 299	vclk_rate = clk_get_rate(dsi->vclk);
 300	if (vclk_rate != mode_freq * KILO)
 301		dev_dbg(dsi->dev, "Requested vclk rate %lu, actual %lu mismatch\n",
 302			mode_freq * KILO, vclk_rate);
 303	/*
 304	 * Relationship between hsclk and vclk must follow
 305	 * vclk * bpp = hsclk * 8 * lanes
 306	 * where vclk: video clock (Hz)
 307	 *       bpp: video pixel bit depth
 308	 *       hsclk: DSI HS Byte clock frequency (Hz)
 309	 *       lanes: number of data lanes
 310	 *
 311	 * hsclk(bit) = hsclk(byte) * 8 = hsfreq
 312	 */
 313	bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
 314	*hsfreq_millihz = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(vclk_rate, bpp * MILLI),
 315						dsi->lanes);
 316
 317	return 0;
 318}
 319
 320static int rzg2l_mipi_dsi_startup(struct rzg2l_mipi_dsi *dsi,
 321				  const struct drm_display_mode *mode)
 322{
 323	unsigned long hsfreq;
 324	u64 hsfreq_millihz;
 325	u32 txsetr;
 326	u32 clstptsetr;
 327	u32 lptrnstsetr;
 328	u32 clkkpt;
 329	u32 clkbfht;
 330	u32 clkstpt;
 331	u32 golpbkt;
 332	u32 dsisetr;
 333	int ret;
 334
 335	ret = pm_runtime_resume_and_get(dsi->dev);
 336	if (ret < 0)
 337		return ret;
 338
 339	ret = dsi->info->dphy_conf_clks(dsi, mode->clock, &hsfreq_millihz);
 340	if (ret < 0)
 341		goto err_phy;
 342
 343	ret = dsi->info->dphy_init(dsi, hsfreq_millihz);
 344	if (ret < 0)
 345		goto err_phy;
 346
 347	/* Enable Data lanes and Clock lanes */
 348	txsetr = TXSETR_DLEN | TXSETR_NUMLANEUSE(dsi->lanes - 1) | TXSETR_CLEN;
 349	rzg2l_mipi_dsi_link_write(dsi, TXSETR, txsetr);
 350
 351	if (dsi->info->dphy_startup_late_init)
 352		dsi->info->dphy_startup_late_init(dsi);
 353
 354	hsfreq = DIV_ROUND_CLOSEST_ULL(hsfreq_millihz, MILLI);
 355	/*
 356	 * Global timings characteristic depends on high speed Clock Frequency
 357	 * Currently MIPI DSI-IF just supports maximum FHD@60 with:
 358	 * - videoclock = 148.5 (MHz)
 359	 * - bpp: maximum 24bpp
 360	 * - data lanes: maximum 4 lanes
 361	 * Therefore maximum hsclk will be 891 Mbps.
 362	 */
 363	if (hsfreq > 445500000) {
 364		clkkpt = 12;
 365		clkbfht = 15;
 366		clkstpt = 48;
 367		golpbkt = 75;
 368	} else if (hsfreq > 250000000) {
 369		clkkpt = 7;
 370		clkbfht = 8;
 371		clkstpt = 27;
 372		golpbkt = 40;
 373	} else {
 374		clkkpt = 8;
 375		clkbfht = 6;
 376		clkstpt = 24;
 377		golpbkt = 29;
 378	}
 379
 380	clstptsetr = CLSTPTSETR_CLKKPT(clkkpt) | CLSTPTSETR_CLKBFHT(clkbfht) |
 381		     CLSTPTSETR_CLKSTPT(clkstpt);
 382	rzg2l_mipi_dsi_link_write(dsi, CLSTPTSETR, clstptsetr);
 383
 384	lptrnstsetr = LPTRNSTSETR_GOLPBKT(golpbkt);
 385	rzg2l_mipi_dsi_link_write(dsi, LPTRNSTSETR, lptrnstsetr);
 386
 387	/*
 388	 * Increase MRPSZ as the default value of 1 will result in long read
 389	 * commands payload not being saved to memory.
 390	 */
 391	dsisetr = rzg2l_mipi_dsi_link_read(dsi, DSISETR);
 392	dsisetr &= ~DSISETR_MRPSZ;
 393	dsisetr |= FIELD_PREP(DSISETR_MRPSZ, RZG2L_DCS_BUF_SIZE);
 394	rzg2l_mipi_dsi_link_write(dsi, DSISETR, dsisetr);
 395
 396	return 0;
 397
 398err_phy:
 399	dsi->info->dphy_exit(dsi);
 400	pm_runtime_put(dsi->dev);
 401
 402	return ret;
 403}
 404
 405static void rzg2l_mipi_dsi_stop(struct rzg2l_mipi_dsi *dsi)
 406{
 407	dsi->info->dphy_exit(dsi);
 408	pm_runtime_put(dsi->dev);
 409}
 410
 411static void rzg2l_mipi_dsi_set_display_timing(struct rzg2l_mipi_dsi *dsi,
 412					      const struct drm_display_mode *mode)
 413{
 414	u32 vich1ppsetr;
 415	u32 vich1vssetr;
 416	u32 vich1vpsetr;
 417	u32 vich1hssetr;
 418	u32 vich1hpsetr;
 419	int dsi_format;
 420	u32 delay[2];
 421	u8 index;
 422
 423	/* Configuration for Pixel Packet */
 424	dsi_format = mipi_dsi_pixel_format_to_bpp(dsi->format);
 425	switch (dsi_format) {
 426	case 24:
 427		vich1ppsetr = VICH1PPSETR_DT_RGB24;
 428		break;
 429	case 18:
 430		vich1ppsetr = VICH1PPSETR_DT_RGB18;
 431		break;
 432	}
 433
 434	if ((dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) &&
 435	    !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST))
 436		vich1ppsetr |= VICH1PPSETR_TXESYNC_PULSE;
 437
 438	rzg2l_mipi_dsi_link_write(dsi, VICH1PPSETR, vich1ppsetr);
 439
 440	/* Configuration for Video Parameters */
 441	vich1vssetr = VICH1VSSETR_VACTIVE(mode->vdisplay) |
 442		      VICH1VSSETR_VSA(mode->vsync_end - mode->vsync_start);
 443	vich1vssetr |= (mode->flags & DRM_MODE_FLAG_PVSYNC) ?
 444			VICH1VSSETR_VSPOL_HIGH : VICH1VSSETR_VSPOL_LOW;
 445
 446	vich1vpsetr = VICH1VPSETR_VFP(mode->vsync_start - mode->vdisplay) |
 447		      VICH1VPSETR_VBP(mode->vtotal - mode->vsync_end);
 448
 449	vich1hssetr = VICH1HSSETR_HACTIVE(mode->hdisplay) |
 450		      VICH1HSSETR_HSA(mode->hsync_end - mode->hsync_start);
 451	vich1hssetr |= (mode->flags & DRM_MODE_FLAG_PHSYNC) ?
 452			VICH1HSSETR_HSPOL_HIGH : VICH1HSSETR_HSPOL_LOW;
 453
 454	vich1hpsetr = VICH1HPSETR_HFP(mode->hsync_start - mode->hdisplay) |
 455		      VICH1HPSETR_HBP(mode->htotal - mode->hsync_end);
 456
 457	rzg2l_mipi_dsi_link_write(dsi, VICH1VSSETR, vich1vssetr);
 458	rzg2l_mipi_dsi_link_write(dsi, VICH1VPSETR, vich1vpsetr);
 459	rzg2l_mipi_dsi_link_write(dsi, VICH1HSSETR, vich1hssetr);
 460	rzg2l_mipi_dsi_link_write(dsi, VICH1HPSETR, vich1hpsetr);
 461
 462	/*
 463	 * Configuration for Delay Value
 464	 * Delay value based on 2 ranges of video clock.
 465	 * 74.25MHz is videoclock of HD@60p or FHD@30p
 466	 */
 467	if (mode->clock > 74250) {
 468		delay[0] = 231;
 469		delay[1] = 216;
 470	} else {
 471		delay[0] = 220;
 472		delay[1] = 212;
 473	}
 474
 475	if (dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS)
 476		index = 0;
 477	else
 478		index = 1;
 479
 480	rzg2l_mipi_dsi_link_write(dsi, VICH1SET1R,
 481				  VICH1SET1R_DLY(delay[index]));
 482}
 483
 484static int rzg2l_mipi_dsi_start_hs_clock(struct rzg2l_mipi_dsi *dsi)
 485{
 486	bool is_clk_cont;
 487	u32 hsclksetr;
 488	u32 status;
 489	int ret;
 490
 491	is_clk_cont = !(dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS);
 492
 493	/* Start HS clock */
 494	hsclksetr = HSCLKSETR_HSCLKRUN_HS | (is_clk_cont ?
 495					     HSCLKSETR_HSCLKMODE_CONT :
 496					     HSCLKSETR_HSCLKMODE_NON_CONT);
 497	rzg2l_mipi_dsi_link_write(dsi, HSCLKSETR, hsclksetr);
 498
 499	if (is_clk_cont) {
 500		ret = read_poll_timeout(rzg2l_mipi_dsi_link_read, status,
 501					status & PLSR_CLLP2HS,
 502					2000, 20000, false, dsi, PLSR);
 503		if (ret < 0) {
 504			dev_err(dsi->dev, "failed to start HS clock\n");
 505			return ret;
 506		}
 507	}
 508
 509	dev_dbg(dsi->dev, "Start High Speed Clock with %s clock mode",
 510		is_clk_cont ? "continuous" : "non-continuous");
 511
 512	return 0;
 513}
 514
 515static int rzg2l_mipi_dsi_stop_hs_clock(struct rzg2l_mipi_dsi *dsi)
 516{
 517	bool is_clk_cont;
 518	u32 status;
 519	int ret;
 520
 521	is_clk_cont = !(dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS);
 522
 523	/* Stop HS clock */
 524	rzg2l_mipi_dsi_link_write(dsi, HSCLKSETR,
 525				  is_clk_cont ? HSCLKSETR_HSCLKMODE_CONT :
 526				  HSCLKSETR_HSCLKMODE_NON_CONT);
 527
 528	if (is_clk_cont) {
 529		ret = read_poll_timeout(rzg2l_mipi_dsi_link_read, status,
 530					status & PLSR_CLHS2LP,
 531					2000, 20000, false, dsi, PLSR);
 532		if (ret < 0) {
 533			dev_err(dsi->dev, "failed to stop HS clock\n");
 534			return ret;
 535		}
 536	}
 537
 538	return 0;
 539}
 540
 541static int rzg2l_mipi_dsi_start_video(struct rzg2l_mipi_dsi *dsi)
 542{
 543	u32 vich1set0r;
 544	u32 status;
 545	int ret;
 546
 547	/* Configuration for Blanking sequence and start video input */
 548	vich1set0r = VICH1SET0R_HFPNOLP | VICH1SET0R_HBPNOLP |
 549		     VICH1SET0R_HSANOLP | VICH1SET0R_VSTART;
 550	rzg2l_mipi_dsi_link_write(dsi, VICH1SET0R, vich1set0r);
 551
 552	ret = read_poll_timeout(rzg2l_mipi_dsi_link_read, status,
 553				status & VICH1SR_VIRDY,
 554				2000, 20000, false, dsi, VICH1SR);
 555	if (ret < 0)
 556		dev_err(dsi->dev, "Failed to start video signal input\n");
 557
 558	return ret;
 559}
 560
 561static int rzg2l_mipi_dsi_stop_video(struct rzg2l_mipi_dsi *dsi)
 562{
 563	u32 status;
 564	int ret;
 565
 566	rzg2l_mipi_dsi_link_write(dsi, VICH1SET0R, VICH1SET0R_VSTPAFT);
 567	ret = read_poll_timeout(rzg2l_mipi_dsi_link_read, status,
 568				(status & VICH1SR_STOP) && (!(status & VICH1SR_RUNNING)),
 569				2000, 20000, false, dsi, VICH1SR);
 570	if (ret < 0)
 571		goto err;
 572
 573	ret = read_poll_timeout(rzg2l_mipi_dsi_link_read, status,
 574				!(status & LINKSR_HSBUSY),
 575				2000, 20000, false, dsi, LINKSR);
 576	if (ret < 0)
 577		goto err;
 578
 579	return 0;
 580
 581err:
 582	dev_err(dsi->dev, "Failed to stop video signal input\n");
 583	return ret;
 584}
 585
 586/* -----------------------------------------------------------------------------
 587 * Bridge
 588 */
 589
 590static int rzg2l_mipi_dsi_attach(struct drm_bridge *bridge,
 591				 struct drm_encoder *encoder,
 592				 enum drm_bridge_attach_flags flags)
 593{
 594	struct rzg2l_mipi_dsi *dsi = bridge_to_rzg2l_mipi_dsi(bridge);
 595
 596	return drm_bridge_attach(encoder, dsi->next_bridge, bridge,
 597				 flags);
 598}
 599
 600static void rzg2l_mipi_dsi_atomic_pre_enable(struct drm_bridge *bridge,
 601					     struct drm_atomic_state *state)
 602{
 603	struct rzg2l_mipi_dsi *dsi = bridge_to_rzg2l_mipi_dsi(bridge);
 604	const struct drm_display_mode *mode;
 605	struct drm_connector *connector;
 606	struct drm_crtc *crtc;
 607	int ret;
 608
 609	connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder);
 610	crtc = drm_atomic_get_new_connector_state(state, connector)->crtc;
 611	mode = &drm_atomic_get_new_crtc_state(state, crtc)->adjusted_mode;
 612
 613	ret = rzg2l_mipi_dsi_startup(dsi, mode);
 614	if (ret < 0)
 615		return;
 616
 617	rzg2l_mipi_dsi_set_display_timing(dsi, mode);
 618}
 619
 620static void rzg2l_mipi_dsi_atomic_enable(struct drm_bridge *bridge,
 621					 struct drm_atomic_state *state)
 622{
 623	struct rzg2l_mipi_dsi *dsi = bridge_to_rzg2l_mipi_dsi(bridge);
 624	int ret;
 625
 626	ret = rzg2l_mipi_dsi_start_hs_clock(dsi);
 627	if (ret < 0)
 628		goto err_stop;
 629
 630	ret = rzg2l_mipi_dsi_start_video(dsi);
 631	if (ret < 0)
 632		goto err_stop_clock;
 633
 634	return;
 635
 636err_stop_clock:
 637	rzg2l_mipi_dsi_stop_hs_clock(dsi);
 638err_stop:
 639	rzg2l_mipi_dsi_stop(dsi);
 640}
 641
 642static void rzg2l_mipi_dsi_atomic_disable(struct drm_bridge *bridge,
 643					  struct drm_atomic_state *state)
 644{
 645	struct rzg2l_mipi_dsi *dsi = bridge_to_rzg2l_mipi_dsi(bridge);
 646
 647	rzg2l_mipi_dsi_stop_video(dsi);
 648	rzg2l_mipi_dsi_stop_hs_clock(dsi);
 649}
 650
 651static void rzg2l_mipi_dsi_atomic_post_disable(struct drm_bridge *bridge,
 652					       struct drm_atomic_state *state)
 653{
 654	struct rzg2l_mipi_dsi *dsi = bridge_to_rzg2l_mipi_dsi(bridge);
 655
 656	rzg2l_mipi_dsi_stop(dsi);
 657}
 658
 659static enum drm_mode_status
 660rzg2l_mipi_dsi_bridge_mode_valid(struct drm_bridge *bridge,
 661				 const struct drm_display_info *info,
 662				 const struct drm_display_mode *mode)
 663{
 664	struct rzg2l_mipi_dsi *dsi = bridge_to_rzg2l_mipi_dsi(bridge);
 665
 666	if (mode->clock > dsi->info->max_dclk)
 667		return MODE_CLOCK_HIGH;
 668
 669	if (mode->clock < dsi->info->min_dclk)
 670		return MODE_CLOCK_LOW;
 671
 672	if (dsi->info->dphy_mode_clk_check) {
 673		enum drm_mode_status status;
 674
 675		status = dsi->info->dphy_mode_clk_check(dsi, mode->clock);
 676		if (status != MODE_OK)
 677			return status;
 678	}
 679
 680	return MODE_OK;
 681}
 682
 683static const struct drm_bridge_funcs rzg2l_mipi_dsi_bridge_ops = {
 684	.attach = rzg2l_mipi_dsi_attach,
 685	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
 686	.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
 687	.atomic_reset = drm_atomic_helper_bridge_reset,
 688	.atomic_pre_enable = rzg2l_mipi_dsi_atomic_pre_enable,
 689	.atomic_enable = rzg2l_mipi_dsi_atomic_enable,
 690	.atomic_disable = rzg2l_mipi_dsi_atomic_disable,
 691	.atomic_post_disable = rzg2l_mipi_dsi_atomic_post_disable,
 692	.mode_valid = rzg2l_mipi_dsi_bridge_mode_valid,
 693};
 694
 695/* -----------------------------------------------------------------------------
 696 * Host setting
 697 */
 698
 699static int rzg2l_mipi_dsi_host_attach(struct mipi_dsi_host *host,
 700				      struct mipi_dsi_device *device)
 701{
 702	struct rzg2l_mipi_dsi *dsi = host_to_rzg2l_mipi_dsi(host);
 703	int ret;
 704
 705	if (device->lanes > dsi->num_data_lanes) {
 706		dev_err(dsi->dev,
 707			"Number of lines of device (%u) exceeds host (%u)\n",
 708			device->lanes, dsi->num_data_lanes);
 709		return -EINVAL;
 710	}
 711
 712	switch (mipi_dsi_pixel_format_to_bpp(device->format)) {
 713	case 24:
 714		break;
 715	case 18:
 716		break;
 717	case 16:
 718		if (!(dsi->info->features & RZ_MIPI_DSI_FEATURE_16BPP)) {
 719			dev_err(dsi->dev, "Unsupported format 0x%04x\n",
 720				device->format);
 721			return -EINVAL;
 722		}
 723		break;
 724	default:
 725		dev_err(dsi->dev, "Unsupported format 0x%04x\n", device->format);
 726		return -EINVAL;
 727	}
 728
 729	dsi->lanes = device->lanes;
 730	dsi->format = device->format;
 731	dsi->mode_flags = device->mode_flags;
 732
 733	dsi->next_bridge = devm_drm_of_get_bridge(dsi->dev, dsi->dev->of_node,
 734						  1, 0);
 735	if (IS_ERR(dsi->next_bridge)) {
 736		ret = PTR_ERR(dsi->next_bridge);
 737		dev_err(dsi->dev, "failed to get next bridge: %d\n", ret);
 738		return ret;
 739	}
 740
 741	drm_bridge_add(&dsi->bridge);
 742
 743	return 0;
 744}
 745
 746static int rzg2l_mipi_dsi_host_detach(struct mipi_dsi_host *host,
 747				      struct mipi_dsi_device *device)
 748{
 749	struct rzg2l_mipi_dsi *dsi = host_to_rzg2l_mipi_dsi(host);
 750
 751	drm_bridge_remove(&dsi->bridge);
 752
 753	return 0;
 754}
 755
 756static ssize_t rzg2l_mipi_dsi_read_response(struct rzg2l_mipi_dsi *dsi,
 757					    const struct mipi_dsi_msg *msg)
 758{
 759	u8 *msg_rx = msg->rx_buf;
 760	u8 datatype;
 761	u32 result;
 762	u16 size;
 763
 764	result = rzg2l_mipi_dsi_link_read(dsi, RXRSS0R);
 765	if (result & RXRSS0R_RXPKTDFAIL) {
 766		dev_err(dsi->dev, "packet rx data did not save correctly\n");
 767		return -EPROTO;
 768	}
 769
 770	if (result & RXRSS0R_RXFAIL) {
 771		dev_err(dsi->dev, "packet rx failure\n");
 772		return -EPROTO;
 773	}
 774
 775	if (!(result & RXRSS0R_RXSUC))
 776		return -EPROTO;
 777
 778	datatype = FIELD_GET(RXRSS0R_DT, result);
 779
 780	switch (datatype) {
 781	case 0:
 782		dev_dbg(dsi->dev, "ACK\n");
 783		return 0;
 784	case MIPI_DSI_RX_END_OF_TRANSMISSION:
 785		dev_dbg(dsi->dev, "EoTp\n");
 786		return 0;
 787	case MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT:
 788		dev_dbg(dsi->dev, "Acknowledge and error report: $%02x%02x\n",
 789			(u8)FIELD_GET(RXRSS0R_DATA1, result),
 790			(u8)FIELD_GET(RXRSS0R_DATA0, result));
 791		return 0;
 792	case MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_1BYTE:
 793	case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_1BYTE:
 794		msg_rx[0] = FIELD_GET(RXRSS0R_DATA0, result);
 795		return 1;
 796	case MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_2BYTE:
 797	case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_2BYTE:
 798		msg_rx[0] = FIELD_GET(RXRSS0R_DATA0, result);
 799		msg_rx[1] = FIELD_GET(RXRSS0R_DATA1, result);
 800		return 2;
 801	case MIPI_DSI_RX_GENERIC_LONG_READ_RESPONSE:
 802	case MIPI_DSI_RX_DCS_LONG_READ_RESPONSE:
 803		size = FIELD_GET(RXRSS0R_WC, result);
 804
 805		if (size > msg->rx_len) {
 806			dev_err(dsi->dev, "rx buffer too small");
 807			return -ENOSPC;
 808		}
 809
 810		memcpy(msg_rx, dsi->dcs_buf_virt, size);
 811		return size;
 812	default:
 813		dev_err(dsi->dev, "unhandled response type: %02x\n", datatype);
 814		return -EPROTO;
 815	}
 816}
 817
 818static ssize_t rzg2l_mipi_dsi_host_transfer(struct mipi_dsi_host *host,
 819					    const struct mipi_dsi_msg *msg)
 820{
 821	struct rzg2l_mipi_dsi *dsi = host_to_rzg2l_mipi_dsi(host);
 822	struct mipi_dsi_packet packet;
 823	bool need_bta;
 824	u32 value;
 825	int ret;
 826
 827	ret = mipi_dsi_create_packet(&packet, msg);
 828	if (ret < 0)
 829		return ret;
 830
 831	/* Terminate operation after this descriptor is finished */
 832	value = SQCH0DSC0AR_NXACT_TERM;
 833
 834	if (msg->flags & MIPI_DSI_MSG_REQ_ACK) {
 835		need_bta = true; /* Message with explicitly requested ACK */
 836		value |= FIELD_PREP(SQCH0DSC0AR_BTA, SQCH0DSC0AR_BTA_NON_READ);
 837	} else if (msg->rx_buf && msg->rx_len > 0) {
 838		need_bta = true; /* Read request */
 839		value |= FIELD_PREP(SQCH0DSC0AR_BTA, SQCH0DSC0AR_BTA_READ);
 840	} else {
 841		need_bta = false;
 842		value |= FIELD_PREP(SQCH0DSC0AR_BTA, SQCH0DSC0AR_BTA_NONE);
 843	}
 844
 845	/* Set transmission speed */
 846	if (msg->flags & MIPI_DSI_MSG_USE_LPM)
 847		value |= SQCH0DSC0AR_SPD_LOW;
 848	else
 849		value |= SQCH0DSC0AR_SPD_HIGH;
 850
 851	/* Write TX packet header */
 852	value |= FIELD_PREP(SQCH0DSC0AR_DT, packet.header[0]) |
 853		FIELD_PREP(SQCH0DSC0AR_DATA0, packet.header[1]) |
 854		FIELD_PREP(SQCH0DSC0AR_DATA1, packet.header[2]);
 855
 856	if (mipi_dsi_packet_format_is_long(msg->type)) {
 857		value |= SQCH0DSC0AR_FMT_LONG;
 858
 859		if (packet.payload_length > RZG2L_DCS_BUF_SIZE) {
 860			dev_err(dsi->dev, "Packet Tx payload size (%d) too large",
 861				(unsigned int)packet.payload_length);
 862			return -ENOSPC;
 863		}
 864
 865		/* Copy TX packet payload data to memory space */
 866		memcpy(dsi->dcs_buf_virt, packet.payload, packet.payload_length);
 867	} else {
 868		value |= SQCH0DSC0AR_FMT_SHORT;
 869	}
 870
 871	rzg2l_mipi_dsi_link_write(dsi, SQCH0DSC0AR, value);
 872
 873	/*
 874	 * Write: specify payload data source location, only used for
 875	 *        long packet.
 876	 * Read:  specify payload data storage location of response
 877	 *        packet. Note: a read packet is always a short packet.
 878	 *        If the response packet is a short packet or a long packet
 879	 *        with WC = 0 (no payload), DTSEL is meaningless.
 880	 */
 881	rzg2l_mipi_dsi_link_write(dsi, SQCH0DSC0BR, SQCH0DSC0BR_DTSEL_MEM_SPACE);
 882
 883	/*
 884	 * Set SQCHxSR.AACTFIN bit when descriptor actions are finished.
 885	 * Read: set Rx result save slot number to 0 (ACTCODE).
 886	 */
 887	rzg2l_mipi_dsi_link_write(dsi, SQCH0DSC0CR, SQCH0DSC0CR_FINACT);
 888
 889	/* Set rx/tx payload data address, only relevant for long packet. */
 890	rzg2l_mipi_dsi_link_write(dsi, SQCH0DSC0DR, (u32)dsi->dcs_buf_phys);
 891
 892	/* Start sequence 0 operation */
 893	value = rzg2l_mipi_dsi_link_read(dsi, SQCH0SET0R);
 894	value |= SQCH0SET0R_START;
 895	rzg2l_mipi_dsi_link_write(dsi, SQCH0SET0R, value);
 896
 897	/* Wait for operation to finish */
 898	ret = read_poll_timeout(rzg2l_mipi_dsi_link_read,
 899				value, value & SQCH0SR_ADESFIN,
 900				2000, 20000, false, dsi, SQCH0SR);
 901	if (ret == 0) {
 902		/* Success: clear status bit */
 903		rzg2l_mipi_dsi_link_write(dsi, SQCH0SCR, SQCH0SCR_ADESFIN);
 904
 905		if (need_bta)
 906			ret = rzg2l_mipi_dsi_read_response(dsi, msg);
 907		else
 908			ret = packet.payload_length;
 909	}
 910
 911	return ret;
 912}
 913
 914static const struct mipi_dsi_host_ops rzg2l_mipi_dsi_host_ops = {
 915	.attach = rzg2l_mipi_dsi_host_attach,
 916	.detach = rzg2l_mipi_dsi_host_detach,
 917	.transfer = rzg2l_mipi_dsi_host_transfer,
 918};
 919
 920/* -----------------------------------------------------------------------------
 921 * Power Management
 922 */
 923
 924static int rzg2l_mipi_pm_runtime_suspend(struct device *dev)
 925{
 926	struct rzg2l_mipi_dsi *dsi = dev_get_drvdata(dev);
 927
 928	reset_control_assert(dsi->prstc);
 929	reset_control_assert(dsi->arstc);
 930
 931	return 0;
 932}
 933
 934static int rzg2l_mipi_pm_runtime_resume(struct device *dev)
 935{
 936	struct rzg2l_mipi_dsi *dsi = dev_get_drvdata(dev);
 937	int ret;
 938
 939	ret = reset_control_deassert(dsi->arstc);
 940	if (ret < 0)
 941		return ret;
 942
 943	ret = reset_control_deassert(dsi->prstc);
 944	if (ret < 0)
 945		reset_control_assert(dsi->arstc);
 946
 947	return ret;
 948}
 949
 950static const struct dev_pm_ops rzg2l_mipi_pm_ops = {
 951	RUNTIME_PM_OPS(rzg2l_mipi_pm_runtime_suspend, rzg2l_mipi_pm_runtime_resume, NULL)
 952};
 953
 954/* -----------------------------------------------------------------------------
 955 * Probe & Remove
 956 */
 957
 958static int rzg2l_mipi_dsi_probe(struct platform_device *pdev)
 959{
 960	unsigned int num_data_lanes;
 961	struct rzg2l_mipi_dsi *dsi;
 962	u32 txsetr;
 963	int ret;
 964
 965	dsi = devm_drm_bridge_alloc(&pdev->dev, struct rzg2l_mipi_dsi, bridge,
 966				    &rzg2l_mipi_dsi_bridge_ops);
 967	if (IS_ERR(dsi))
 968		return PTR_ERR(dsi);
 969
 970	platform_set_drvdata(pdev, dsi);
 971	dsi->dev = &pdev->dev;
 972
 973	dsi->info = of_device_get_match_data(&pdev->dev);
 974
 975	ret = drm_of_get_data_lanes_count_ep(dsi->dev->of_node, 1, 0, 1, 4);
 976	if (ret < 0)
 977		return dev_err_probe(dsi->dev, ret,
 978				     "missing or invalid data-lanes property\n");
 979
 980	num_data_lanes = ret;
 981
 982	dsi->mmio = devm_platform_ioremap_resource(pdev, 0);
 983	if (IS_ERR(dsi->mmio))
 984		return PTR_ERR(dsi->mmio);
 985
 986	dsi->vclk = devm_clk_get(dsi->dev, "vclk");
 987	if (IS_ERR(dsi->vclk))
 988		return PTR_ERR(dsi->vclk);
 989
 990	dsi->rstc = devm_reset_control_get_optional_exclusive(dsi->dev, "rst");
 991	if (IS_ERR(dsi->rstc))
 992		return dev_err_probe(dsi->dev, PTR_ERR(dsi->rstc),
 993				     "failed to get rst\n");
 994
 995	dsi->arstc = devm_reset_control_get_exclusive(dsi->dev, "arst");
 996	if (IS_ERR(dsi->arstc))
 997		return dev_err_probe(&pdev->dev, PTR_ERR(dsi->arstc),
 998				     "failed to get arst\n");
 999
1000	dsi->prstc = devm_reset_control_get_exclusive(dsi->dev, "prst");
1001	if (IS_ERR(dsi->prstc))
1002		return dev_err_probe(dsi->dev, PTR_ERR(dsi->prstc),
1003				     "failed to get prst\n");
1004
1005	platform_set_drvdata(pdev, dsi);
1006
1007	pm_runtime_enable(dsi->dev);
1008
1009	ret = pm_runtime_resume_and_get(dsi->dev);
1010	if (ret < 0)
1011		goto err_pm_disable;
1012
1013	/*
1014	 * TXSETR register can be read only after DPHY init. But during probe
1015	 * mode->clock and format are not available. So initialize DPHY with
1016	 * timing parameters for 80Mbps.
1017	 */
1018	ret = dsi->info->dphy_init(dsi, 80000000ULL * MILLI);
1019	if (ret < 0)
1020		goto err_phy;
1021
1022	txsetr = rzg2l_mipi_dsi_link_read(dsi, TXSETR);
1023	dsi->num_data_lanes = min(((txsetr >> 16) & 3) + 1, num_data_lanes);
1024	dsi->info->dphy_exit(dsi);
1025	pm_runtime_put(dsi->dev);
1026
1027	/* Initialize the DRM bridge. */
1028	dsi->bridge.of_node = dsi->dev->of_node;
1029
1030	/* Init host device */
1031	dsi->host.dev = dsi->dev;
1032	dsi->host.ops = &rzg2l_mipi_dsi_host_ops;
1033	ret = mipi_dsi_host_register(&dsi->host);
1034	if (ret < 0)
1035		goto err_pm_disable;
1036
1037	dsi->dcs_buf_virt = dma_alloc_coherent(dsi->host.dev, RZG2L_DCS_BUF_SIZE,
1038					       &dsi->dcs_buf_phys, GFP_KERNEL);
1039	if (!dsi->dcs_buf_virt)
1040		return -ENOMEM;
1041
1042	return 0;
1043
1044err_phy:
1045	dsi->info->dphy_exit(dsi);
1046	pm_runtime_put(dsi->dev);
1047err_pm_disable:
1048	pm_runtime_disable(dsi->dev);
1049	return ret;
1050}
1051
1052static void rzg2l_mipi_dsi_remove(struct platform_device *pdev)
1053{
1054	struct rzg2l_mipi_dsi *dsi = platform_get_drvdata(pdev);
1055
1056	dma_free_coherent(dsi->host.dev, RZG2L_DCS_BUF_SIZE, dsi->dcs_buf_virt,
1057			  dsi->dcs_buf_phys);
1058	mipi_dsi_host_unregister(&dsi->host);
1059	pm_runtime_disable(&pdev->dev);
1060}
1061
1062static const struct rzg2l_mipi_dsi_hw_info rzg2l_mipi_dsi_info = {
1063	.dphy_init = rzg2l_mipi_dsi_dphy_init,
1064	.dphy_exit = rzg2l_mipi_dsi_dphy_exit,
1065	.dphy_conf_clks = rzg2l_dphy_conf_clks,
1066	.link_reg_offset = 0x10000,
1067	.min_dclk = 5803,
1068	.max_dclk = 148500,
1069};
1070
1071static const struct of_device_id rzg2l_mipi_dsi_of_table[] = {
1072	{ .compatible = "renesas,rzg2l-mipi-dsi", .data = &rzg2l_mipi_dsi_info, },
1073	{ /* sentinel */ }
1074};
1075
1076MODULE_DEVICE_TABLE(of, rzg2l_mipi_dsi_of_table);
1077
1078static struct platform_driver rzg2l_mipi_dsi_platform_driver = {
1079	.probe	= rzg2l_mipi_dsi_probe,
1080	.remove = rzg2l_mipi_dsi_remove,
1081	.driver	= {
1082		.name = "rzg2l-mipi-dsi",
1083		.pm = pm_ptr(&rzg2l_mipi_pm_ops),
1084		.of_match_table = rzg2l_mipi_dsi_of_table,
1085	},
1086};
1087
1088module_platform_driver(rzg2l_mipi_dsi_platform_driver);
1089
1090MODULE_AUTHOR("Biju Das <biju.das.jz@bp.renesas.com>");
1091MODULE_DESCRIPTION("Renesas RZ/G2L MIPI DSI Encoder Driver");
1092MODULE_LICENSE("GPL");
~/ Read-only file preview.