Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1/*
   2 * DRM driver for Pervasive Displays RePaper branded e-ink panels
   3 *
   4 * Copyright 2013-2017 Pervasive Displays, Inc.
   5 * Copyright 2017 Noralf Trønnes
   6 *
   7 * The driver supports:
   8 * Material Film: Aurora Mb (V231)
   9 * Driver IC: G2 (eTC)
  10 *
  11 * The controller code was taken from the userspace driver:
  12 * https://github.com/repaper/gratis
  13 *
  14 * This program is free software; you can redistribute it and/or modify
  15 * it under the terms of the GNU General Public License as published by
  16 * the Free Software Foundation; either version 2 of the License, or
  17 * (at your option) any later version.
  18 */
  19
  20#include <linux/delay.h>
  21#include <linux/dma-buf.h>
  22#include <linux/gpio/consumer.h>
  23#include <linux/module.h>
  24#include <linux/of_device.h>
  25#include <linux/sched/clock.h>
  26#include <linux/spi/spi.h>
  27#include <linux/thermal.h>
  28
  29#include <drm/drm_gem_framebuffer_helper.h>
  30#include <drm/tinydrm/tinydrm.h>
  31#include <drm/tinydrm/tinydrm-helpers.h>
  32
  33#define REPAPER_RID_G2_COG_ID	0x12
  34
  35enum repaper_model {
  36	E1144CS021 = 1,
  37	E1190CS021,
  38	E2200CS021,
  39	E2271CS021,
  40};
  41
  42enum repaper_stage {         /* Image pixel -> Display pixel */
  43	REPAPER_COMPENSATE,  /* B -> W, W -> B (Current Image) */
  44	REPAPER_WHITE,       /* B -> N, W -> W (Current Image) */
  45	REPAPER_INVERSE,     /* B -> N, W -> B (New Image) */
  46	REPAPER_NORMAL       /* B -> B, W -> W (New Image) */
  47};
  48
  49enum repaper_epd_border_byte {
  50	REPAPER_BORDER_BYTE_NONE,
  51	REPAPER_BORDER_BYTE_ZERO,
  52	REPAPER_BORDER_BYTE_SET,
  53};
  54
  55struct repaper_epd {
  56	struct tinydrm_device tinydrm;
  57	struct spi_device *spi;
  58
  59	struct gpio_desc *panel_on;
  60	struct gpio_desc *border;
  61	struct gpio_desc *discharge;
  62	struct gpio_desc *reset;
  63	struct gpio_desc *busy;
  64
  65	struct thermal_zone_device *thermal;
  66
  67	unsigned int height;
  68	unsigned int width;
  69	unsigned int bytes_per_scan;
  70	const u8 *channel_select;
  71	unsigned int stage_time;
  72	unsigned int factored_stage_time;
  73	bool middle_scan;
  74	bool pre_border_byte;
  75	enum repaper_epd_border_byte border_byte;
  76
  77	u8 *line_buffer;
  78	void *current_frame;
  79
  80	bool enabled;
  81	bool cleared;
  82	bool partial;
  83};
  84
  85static inline struct repaper_epd *
  86epd_from_tinydrm(struct tinydrm_device *tdev)
  87{
  88	return container_of(tdev, struct repaper_epd, tinydrm);
  89}
  90
  91static int repaper_spi_transfer(struct spi_device *spi, u8 header,
  92				const void *tx, void *rx, size_t len)
  93{
  94	void *txbuf = NULL, *rxbuf = NULL;
  95	struct spi_transfer tr[2] = {};
  96	u8 *headerbuf;
  97	int ret;
  98
  99	headerbuf = kmalloc(1, GFP_KERNEL);
 100	if (!headerbuf)
 101		return -ENOMEM;
 102
 103	headerbuf[0] = header;
 104	tr[0].tx_buf = headerbuf;
 105	tr[0].len = 1;
 106
 107	/* Stack allocated tx? */
 108	if (tx && len <= 32) {
 109		txbuf = kmalloc(len, GFP_KERNEL);
 110		if (!txbuf) {
 111			ret = -ENOMEM;
 112			goto out_free;
 113		}
 114		memcpy(txbuf, tx, len);
 115	}
 116
 117	if (rx) {
 118		rxbuf = kmalloc(len, GFP_KERNEL);
 119		if (!rxbuf) {
 120			ret = -ENOMEM;
 121			goto out_free;
 122		}
 123	}
 124
 125	tr[1].tx_buf = txbuf ? txbuf : tx;
 126	tr[1].rx_buf = rxbuf;
 127	tr[1].len = len;
 128
 129	ndelay(80);
 130	ret = spi_sync_transfer(spi, tr, 2);
 131	if (rx && !ret)
 132		memcpy(rx, rxbuf, len);
 133
 134out_free:
 135	kfree(headerbuf);
 136	kfree(txbuf);
 137	kfree(rxbuf);
 138
 139	return ret;
 140}
 141
 142static int repaper_write_buf(struct spi_device *spi, u8 reg,
 143			     const u8 *buf, size_t len)
 144{
 145	int ret;
 146
 147	ret = repaper_spi_transfer(spi, 0x70, &reg, NULL, 1);
 148	if (ret)
 149		return ret;
 150
 151	return repaper_spi_transfer(spi, 0x72, buf, NULL, len);
 152}
 153
 154static int repaper_write_val(struct spi_device *spi, u8 reg, u8 val)
 155{
 156	return repaper_write_buf(spi, reg, &val, 1);
 157}
 158
 159static int repaper_read_val(struct spi_device *spi, u8 reg)
 160{
 161	int ret;
 162	u8 val;
 163
 164	ret = repaper_spi_transfer(spi, 0x70, &reg, NULL, 1);
 165	if (ret)
 166		return ret;
 167
 168	ret = repaper_spi_transfer(spi, 0x73, NULL, &val, 1);
 169
 170	return ret ? ret : val;
 171}
 172
 173static int repaper_read_id(struct spi_device *spi)
 174{
 175	int ret;
 176	u8 id;
 177
 178	ret = repaper_spi_transfer(spi, 0x71, NULL, &id, 1);
 179
 180	return ret ? ret : id;
 181}
 182
 183static void repaper_spi_mosi_low(struct spi_device *spi)
 184{
 185	const u8 buf[1] = { 0 };
 186
 187	spi_write(spi, buf, 1);
 188}
 189
 190/* pixels on display are numbered from 1 so even is actually bits 1,3,5,... */
 191static void repaper_even_pixels(struct repaper_epd *epd, u8 **pp,
 192				const u8 *data, u8 fixed_value, const u8 *mask,
 193				enum repaper_stage stage)
 194{
 195	unsigned int b;
 196
 197	for (b = 0; b < (epd->width / 8); b++) {
 198		if (data) {
 199			u8 pixels = data[b] & 0xaa;
 200			u8 pixel_mask = 0xff;
 201			u8 p1, p2, p3, p4;
 202
 203			if (mask) {
 204				pixel_mask = (mask[b] ^ pixels) & 0xaa;
 205				pixel_mask |= pixel_mask >> 1;
 206			}
 207
 208			switch (stage) {
 209			case REPAPER_COMPENSATE: /* B -> W, W -> B (Current) */
 210				pixels = 0xaa | ((pixels ^ 0xaa) >> 1);
 211				break;
 212			case REPAPER_WHITE:      /* B -> N, W -> W (Current) */
 213				pixels = 0x55 + ((pixels ^ 0xaa) >> 1);
 214				break;
 215			case REPAPER_INVERSE:    /* B -> N, W -> B (New) */
 216				pixels = 0x55 | (pixels ^ 0xaa);
 217				break;
 218			case REPAPER_NORMAL:     /* B -> B, W -> W (New) */
 219				pixels = 0xaa | (pixels >> 1);
 220				break;
 221			}
 222
 223			pixels = (pixels & pixel_mask) | (~pixel_mask & 0x55);
 224			p1 = (pixels >> 6) & 0x03;
 225			p2 = (pixels >> 4) & 0x03;
 226			p3 = (pixels >> 2) & 0x03;
 227			p4 = (pixels >> 0) & 0x03;
 228			pixels = (p1 << 0) | (p2 << 2) | (p3 << 4) | (p4 << 6);
 229			*(*pp)++ = pixels;
 230		} else {
 231			*(*pp)++ = fixed_value;
 232		}
 233	}
 234}
 235
 236/* pixels on display are numbered from 1 so odd is actually bits 0,2,4,... */
 237static void repaper_odd_pixels(struct repaper_epd *epd, u8 **pp,
 238			       const u8 *data, u8 fixed_value, const u8 *mask,
 239			       enum repaper_stage stage)
 240{
 241	unsigned int b;
 242
 243	for (b = epd->width / 8; b > 0; b--) {
 244		if (data) {
 245			u8 pixels = data[b - 1] & 0x55;
 246			u8 pixel_mask = 0xff;
 247
 248			if (mask) {
 249				pixel_mask = (mask[b - 1] ^ pixels) & 0x55;
 250				pixel_mask |= pixel_mask << 1;
 251			}
 252
 253			switch (stage) {
 254			case REPAPER_COMPENSATE: /* B -> W, W -> B (Current) */
 255				pixels = 0xaa | (pixels ^ 0x55);
 256				break;
 257			case REPAPER_WHITE:      /* B -> N, W -> W (Current) */
 258				pixels = 0x55 + (pixels ^ 0x55);
 259				break;
 260			case REPAPER_INVERSE:    /* B -> N, W -> B (New) */
 261				pixels = 0x55 | ((pixels ^ 0x55) << 1);
 262				break;
 263			case REPAPER_NORMAL:     /* B -> B, W -> W (New) */
 264				pixels = 0xaa | pixels;
 265				break;
 266			}
 267
 268			pixels = (pixels & pixel_mask) | (~pixel_mask & 0x55);
 269			*(*pp)++ = pixels;
 270		} else {
 271			*(*pp)++ = fixed_value;
 272		}
 273	}
 274}
 275
 276/* interleave bits: (byte)76543210 -> (16 bit).7.6.5.4.3.2.1 */
 277static inline u16 repaper_interleave_bits(u16 value)
 278{
 279	value = (value | (value << 4)) & 0x0f0f;
 280	value = (value | (value << 2)) & 0x3333;
 281	value = (value | (value << 1)) & 0x5555;
 282
 283	return value;
 284}
 285
 286/* pixels on display are numbered from 1 */
 287static void repaper_all_pixels(struct repaper_epd *epd, u8 **pp,
 288			       const u8 *data, u8 fixed_value, const u8 *mask,
 289			       enum repaper_stage stage)
 290{
 291	unsigned int b;
 292
 293	for (b = epd->width / 8; b > 0; b--) {
 294		if (data) {
 295			u16 pixels = repaper_interleave_bits(data[b - 1]);
 296			u16 pixel_mask = 0xffff;
 297
 298			if (mask) {
 299				pixel_mask = repaper_interleave_bits(mask[b - 1]);
 300
 301				pixel_mask = (pixel_mask ^ pixels) & 0x5555;
 302				pixel_mask |= pixel_mask << 1;
 303			}
 304
 305			switch (stage) {
 306			case REPAPER_COMPENSATE: /* B -> W, W -> B (Current) */
 307				pixels = 0xaaaa | (pixels ^ 0x5555);
 308				break;
 309			case REPAPER_WHITE:      /* B -> N, W -> W (Current) */
 310				pixels = 0x5555 + (pixels ^ 0x5555);
 311				break;
 312			case REPAPER_INVERSE:    /* B -> N, W -> B (New) */
 313				pixels = 0x5555 | ((pixels ^ 0x5555) << 1);
 314				break;
 315			case REPAPER_NORMAL:     /* B -> B, W -> W (New) */
 316				pixels = 0xaaaa | pixels;
 317				break;
 318			}
 319
 320			pixels = (pixels & pixel_mask) | (~pixel_mask & 0x5555);
 321			*(*pp)++ = pixels >> 8;
 322			*(*pp)++ = pixels;
 323		} else {
 324			*(*pp)++ = fixed_value;
 325			*(*pp)++ = fixed_value;
 326		}
 327	}
 328}
 329
 330/* output one line of scan and data bytes to the display */
 331static void repaper_one_line(struct repaper_epd *epd, unsigned int line,
 332			     const u8 *data, u8 fixed_value, const u8 *mask,
 333			     enum repaper_stage stage)
 334{
 335	u8 *p = epd->line_buffer;
 336	unsigned int b;
 337
 338	repaper_spi_mosi_low(epd->spi);
 339
 340	if (epd->pre_border_byte)
 341		*p++ = 0x00;
 342
 343	if (epd->middle_scan) {
 344		/* data bytes */
 345		repaper_odd_pixels(epd, &p, data, fixed_value, mask, stage);
 346
 347		/* scan line */
 348		for (b = epd->bytes_per_scan; b > 0; b--) {
 349			if (line / 4 == b - 1)
 350				*p++ = 0x03 << (2 * (line & 0x03));
 351			else
 352				*p++ = 0x00;
 353		}
 354
 355		/* data bytes */
 356		repaper_even_pixels(epd, &p, data, fixed_value, mask, stage);
 357	} else {
 358		/*
 359		 * even scan line, but as lines on display are numbered from 1,
 360		 * line: 1,3,5,...
 361		 */
 362		for (b = 0; b < epd->bytes_per_scan; b++) {
 363			if (0 != (line & 0x01) && line / 8 == b)
 364				*p++ = 0xc0 >> (line & 0x06);
 365			else
 366				*p++ = 0x00;
 367		}
 368
 369		/* data bytes */
 370		repaper_all_pixels(epd, &p, data, fixed_value, mask, stage);
 371
 372		/*
 373		 * odd scan line, but as lines on display are numbered from 1,
 374		 * line: 0,2,4,6,...
 375		 */
 376		for (b = epd->bytes_per_scan; b > 0; b--) {
 377			if (0 == (line & 0x01) && line / 8 == b - 1)
 378				*p++ = 0x03 << (line & 0x06);
 379			else
 380				*p++ = 0x00;
 381		}
 382	}
 383
 384	switch (epd->border_byte) {
 385	case REPAPER_BORDER_BYTE_NONE:
 386		break;
 387
 388	case REPAPER_BORDER_BYTE_ZERO:
 389		*p++ = 0x00;
 390		break;
 391
 392	case REPAPER_BORDER_BYTE_SET:
 393		switch (stage) {
 394		case REPAPER_COMPENSATE:
 395		case REPAPER_WHITE:
 396		case REPAPER_INVERSE:
 397			*p++ = 0x00;
 398			break;
 399		case REPAPER_NORMAL:
 400			*p++ = 0xaa;
 401			break;
 402		}
 403		break;
 404	}
 405
 406	repaper_write_buf(epd->spi, 0x0a, epd->line_buffer,
 407			  p - epd->line_buffer);
 408
 409	/* Output data to panel */
 410	repaper_write_val(epd->spi, 0x02, 0x07);
 411
 412	repaper_spi_mosi_low(epd->spi);
 413}
 414
 415static void repaper_frame_fixed(struct repaper_epd *epd, u8 fixed_value,
 416				enum repaper_stage stage)
 417{
 418	unsigned int line;
 419
 420	for (line = 0; line < epd->height; line++)
 421		repaper_one_line(epd, line, NULL, fixed_value, NULL, stage);
 422}
 423
 424static void repaper_frame_data(struct repaper_epd *epd, const u8 *image,
 425			       const u8 *mask, enum repaper_stage stage)
 426{
 427	unsigned int line;
 428
 429	if (!mask) {
 430		for (line = 0; line < epd->height; line++) {
 431			repaper_one_line(epd, line,
 432					 &image[line * (epd->width / 8)],
 433					 0, NULL, stage);
 434		}
 435	} else {
 436		for (line = 0; line < epd->height; line++) {
 437			size_t n = line * epd->width / 8;
 438
 439			repaper_one_line(epd, line, &image[n], 0, &mask[n],
 440					 stage);
 441		}
 442	}
 443}
 444
 445static void repaper_frame_fixed_repeat(struct repaper_epd *epd, u8 fixed_value,
 446				       enum repaper_stage stage)
 447{
 448	u64 start = local_clock();
 449	u64 end = start + (epd->factored_stage_time * 1000 * 1000);
 450
 451	do {
 452		repaper_frame_fixed(epd, fixed_value, stage);
 453	} while (local_clock() < end);
 454}
 455
 456static void repaper_frame_data_repeat(struct repaper_epd *epd, const u8 *image,
 457				      const u8 *mask, enum repaper_stage stage)
 458{
 459	u64 start = local_clock();
 460	u64 end = start + (epd->factored_stage_time * 1000 * 1000);
 461
 462	do {
 463		repaper_frame_data(epd, image, mask, stage);
 464	} while (local_clock() < end);
 465}
 466
 467static void repaper_get_temperature(struct repaper_epd *epd)
 468{
 469	int ret, temperature = 0;
 470	unsigned int factor10x;
 471
 472	if (!epd->thermal)
 473		return;
 474
 475	ret = thermal_zone_get_temp(epd->thermal, &temperature);
 476	if (ret) {
 477		DRM_DEV_ERROR(&epd->spi->dev, "Failed to get temperature (%d)\n", ret);
 478		return;
 479	}
 480
 481	temperature /= 1000;
 482
 483	if (temperature <= -10)
 484		factor10x = 170;
 485	else if (temperature <= -5)
 486		factor10x = 120;
 487	else if (temperature <= 5)
 488		factor10x = 80;
 489	else if (temperature <= 10)
 490		factor10x = 40;
 491	else if (temperature <= 15)
 492		factor10x = 30;
 493	else if (temperature <= 20)
 494		factor10x = 20;
 495	else if (temperature <= 40)
 496		factor10x = 10;
 497	else
 498		factor10x = 7;
 499
 500	epd->factored_stage_time = epd->stage_time * factor10x / 10;
 501}
 502
 503static void repaper_gray8_to_mono_reversed(u8 *buf, u32 width, u32 height)
 504{
 505	u8 *gray8 = buf, *mono = buf;
 506	int y, xb, i;
 507
 508	for (y = 0; y < height; y++)
 509		for (xb = 0; xb < width / 8; xb++) {
 510			u8 byte = 0x00;
 511
 512			for (i = 0; i < 8; i++) {
 513				int x = xb * 8 + i;
 514
 515				byte >>= 1;
 516				if (gray8[y * width + x] >> 7)
 517					byte |= BIT(7);
 518			}
 519			*mono++ = byte;
 520		}
 521}
 522
 523static int repaper_fb_dirty(struct drm_framebuffer *fb,
 524			    struct drm_file *file_priv,
 525			    unsigned int flags, unsigned int color,
 526			    struct drm_clip_rect *clips,
 527			    unsigned int num_clips)
 528{
 529	struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
 530	struct dma_buf_attachment *import_attach = cma_obj->base.import_attach;
 531	struct tinydrm_device *tdev = fb->dev->dev_private;
 532	struct repaper_epd *epd = epd_from_tinydrm(tdev);
 533	struct drm_clip_rect clip;
 534	u8 *buf = NULL;
 535	int ret = 0;
 536
 537	/* repaper can't do partial updates */
 538	clip.x1 = 0;
 539	clip.x2 = fb->width;
 540	clip.y1 = 0;
 541	clip.y2 = fb->height;
 542
 543	mutex_lock(&tdev->dirty_lock);
 544
 545	if (!epd->enabled)
 546		goto out_unlock;
 547
 548	/* fbdev can flush even when we're not interested */
 549	if (tdev->pipe.plane.fb != fb)
 550		goto out_unlock;
 551
 552	repaper_get_temperature(epd);
 553
 554	DRM_DEBUG("Flushing [FB:%d] st=%ums\n", fb->base.id,
 555		  epd->factored_stage_time);
 556
 557	buf = kmalloc(fb->width * fb->height, GFP_KERNEL);
 558	if (!buf) {
 559		ret = -ENOMEM;
 560		goto out_unlock;
 561	}
 562
 563	if (import_attach) {
 564		ret = dma_buf_begin_cpu_access(import_attach->dmabuf,
 565					       DMA_FROM_DEVICE);
 566		if (ret)
 567			goto out_unlock;
 568	}
 569
 570	tinydrm_xrgb8888_to_gray8(buf, cma_obj->vaddr, fb, &clip);
 571
 572	if (import_attach) {
 573		ret = dma_buf_end_cpu_access(import_attach->dmabuf,
 574					     DMA_FROM_DEVICE);
 575		if (ret)
 576			goto out_unlock;
 577	}
 578
 579	repaper_gray8_to_mono_reversed(buf, fb->width, fb->height);
 580
 581	if (epd->partial) {
 582		repaper_frame_data_repeat(epd, buf, epd->current_frame,
 583					  REPAPER_NORMAL);
 584	} else if (epd->cleared) {
 585		repaper_frame_data_repeat(epd, epd->current_frame, NULL,
 586					  REPAPER_COMPENSATE);
 587		repaper_frame_data_repeat(epd, epd->current_frame, NULL,
 588					  REPAPER_WHITE);
 589		repaper_frame_data_repeat(epd, buf, NULL, REPAPER_INVERSE);
 590		repaper_frame_data_repeat(epd, buf, NULL, REPAPER_NORMAL);
 591
 592		epd->partial = true;
 593	} else {
 594		/* Clear display (anything -> white) */
 595		repaper_frame_fixed_repeat(epd, 0xff, REPAPER_COMPENSATE);
 596		repaper_frame_fixed_repeat(epd, 0xff, REPAPER_WHITE);
 597		repaper_frame_fixed_repeat(epd, 0xaa, REPAPER_INVERSE);
 598		repaper_frame_fixed_repeat(epd, 0xaa, REPAPER_NORMAL);
 599
 600		/* Assuming a clear (white) screen output an image */
 601		repaper_frame_fixed_repeat(epd, 0xaa, REPAPER_COMPENSATE);
 602		repaper_frame_fixed_repeat(epd, 0xaa, REPAPER_WHITE);
 603		repaper_frame_data_repeat(epd, buf, NULL, REPAPER_INVERSE);
 604		repaper_frame_data_repeat(epd, buf, NULL, REPAPER_NORMAL);
 605
 606		epd->cleared = true;
 607		epd->partial = true;
 608	}
 609
 610	memcpy(epd->current_frame, buf, fb->width * fb->height / 8);
 611
 612	/*
 613	 * An extra frame write is needed if pixels are set in the bottom line,
 614	 * or else grey lines rises up from the pixels
 615	 */
 616	if (epd->pre_border_byte) {
 617		unsigned int x;
 618
 619		for (x = 0; x < (fb->width / 8); x++)
 620			if (buf[x + (fb->width * (fb->height - 1) / 8)]) {
 621				repaper_frame_data_repeat(epd, buf,
 622							  epd->current_frame,
 623							  REPAPER_NORMAL);
 624				break;
 625			}
 626	}
 627
 628out_unlock:
 629	mutex_unlock(&tdev->dirty_lock);
 630
 631	if (ret)
 632		DRM_DEV_ERROR(fb->dev->dev, "Failed to update display (%d)\n", ret);
 633	kfree(buf);
 634
 635	return ret;
 636}
 637
 638static const struct drm_framebuffer_funcs repaper_fb_funcs = {
 639	.destroy	= drm_gem_fb_destroy,
 640	.create_handle	= drm_gem_fb_create_handle,
 641	.dirty		= repaper_fb_dirty,
 642};
 643
 644static void power_off(struct repaper_epd *epd)
 645{
 646	/* Turn off power and all signals */
 647	gpiod_set_value_cansleep(epd->reset, 0);
 648	gpiod_set_value_cansleep(epd->panel_on, 0);
 649	if (epd->border)
 650		gpiod_set_value_cansleep(epd->border, 0);
 651
 652	/* Ensure SPI MOSI and CLOCK are Low before CS Low */
 653	repaper_spi_mosi_low(epd->spi);
 654
 655	/* Discharge pulse */
 656	gpiod_set_value_cansleep(epd->discharge, 1);
 657	msleep(150);
 658	gpiod_set_value_cansleep(epd->discharge, 0);
 659}
 660
 661static void repaper_pipe_enable(struct drm_simple_display_pipe *pipe,
 662				struct drm_crtc_state *crtc_state)
 663{
 664	struct tinydrm_device *tdev = pipe_to_tinydrm(pipe);
 665	struct repaper_epd *epd = epd_from_tinydrm(tdev);
 666	struct spi_device *spi = epd->spi;
 667	struct device *dev = &spi->dev;
 668	bool dc_ok = false;
 669	int i, ret;
 670
 671	DRM_DEBUG_DRIVER("\n");
 672
 673	/* Power up sequence */
 674	gpiod_set_value_cansleep(epd->reset, 0);
 675	gpiod_set_value_cansleep(epd->panel_on, 0);
 676	gpiod_set_value_cansleep(epd->discharge, 0);
 677	if (epd->border)
 678		gpiod_set_value_cansleep(epd->border, 0);
 679	repaper_spi_mosi_low(spi);
 680	usleep_range(5000, 10000);
 681
 682	gpiod_set_value_cansleep(epd->panel_on, 1);
 683	/*
 684	 * This delay comes from the repaper.org userspace driver, it's not
 685	 * mentioned in the datasheet.
 686	 */
 687	usleep_range(10000, 15000);
 688	gpiod_set_value_cansleep(epd->reset, 1);
 689	if (epd->border)
 690		gpiod_set_value_cansleep(epd->border, 1);
 691	usleep_range(5000, 10000);
 692	gpiod_set_value_cansleep(epd->reset, 0);
 693	usleep_range(5000, 10000);
 694	gpiod_set_value_cansleep(epd->reset, 1);
 695	usleep_range(5000, 10000);
 696
 697	/* Wait for COG to become ready */
 698	for (i = 100; i > 0; i--) {
 699		if (!gpiod_get_value_cansleep(epd->busy))
 700			break;
 701
 702		usleep_range(10, 100);
 703	}
 704
 705	if (!i) {
 706		DRM_DEV_ERROR(dev, "timeout waiting for panel to become ready.\n");
 707		power_off(epd);
 708		return;
 709	}
 710
 711	repaper_read_id(spi);
 712	ret = repaper_read_id(spi);
 713	if (ret != REPAPER_RID_G2_COG_ID) {
 714		if (ret < 0)
 715			dev_err(dev, "failed to read chip (%d)\n", ret);
 716		else
 717			dev_err(dev, "wrong COG ID 0x%02x\n", ret);
 718		power_off(epd);
 719		return;
 720	}
 721
 722	/* Disable OE */
 723	repaper_write_val(spi, 0x02, 0x40);
 724
 725	ret = repaper_read_val(spi, 0x0f);
 726	if (ret < 0 || !(ret & 0x80)) {
 727		if (ret < 0)
 728			DRM_DEV_ERROR(dev, "failed to read chip (%d)\n", ret);
 729		else
 730			DRM_DEV_ERROR(dev, "panel is reported broken\n");
 731		power_off(epd);
 732		return;
 733	}
 734
 735	/* Power saving mode */
 736	repaper_write_val(spi, 0x0b, 0x02);
 737	/* Channel select */
 738	repaper_write_buf(spi, 0x01, epd->channel_select, 8);
 739	/* High power mode osc */
 740	repaper_write_val(spi, 0x07, 0xd1);
 741	/* Power setting */
 742	repaper_write_val(spi, 0x08, 0x02);
 743	/* Vcom level */
 744	repaper_write_val(spi, 0x09, 0xc2);
 745	/* Power setting */
 746	repaper_write_val(spi, 0x04, 0x03);
 747	/* Driver latch on */
 748	repaper_write_val(spi, 0x03, 0x01);
 749	/* Driver latch off */
 750	repaper_write_val(spi, 0x03, 0x00);
 751	usleep_range(5000, 10000);
 752
 753	/* Start chargepump */
 754	for (i = 0; i < 4; ++i) {
 755		/* Charge pump positive voltage on - VGH/VDL on */
 756		repaper_write_val(spi, 0x05, 0x01);
 757		msleep(240);
 758
 759		/* Charge pump negative voltage on - VGL/VDL on */
 760		repaper_write_val(spi, 0x05, 0x03);
 761		msleep(40);
 762
 763		/* Charge pump Vcom on - Vcom driver on */
 764		repaper_write_val(spi, 0x05, 0x0f);
 765		msleep(40);
 766
 767		/* check DC/DC */
 768		ret = repaper_read_val(spi, 0x0f);
 769		if (ret < 0) {
 770			DRM_DEV_ERROR(dev, "failed to read chip (%d)\n", ret);
 771			power_off(epd);
 772			return;
 773		}
 774
 775		if (ret & 0x40) {
 776			dc_ok = true;
 777			break;
 778		}
 779	}
 780
 781	if (!dc_ok) {
 782		DRM_DEV_ERROR(dev, "dc/dc failed\n");
 783		power_off(epd);
 784		return;
 785	}
 786
 787	/*
 788	 * Output enable to disable
 789	 * The userspace driver sets this to 0x04, but the datasheet says 0x06
 790	 */
 791	repaper_write_val(spi, 0x02, 0x04);
 792
 793	epd->enabled = true;
 794	epd->partial = false;
 795}
 796
 797static void repaper_pipe_disable(struct drm_simple_display_pipe *pipe)
 798{
 799	struct tinydrm_device *tdev = pipe_to_tinydrm(pipe);
 800	struct repaper_epd *epd = epd_from_tinydrm(tdev);
 801	struct spi_device *spi = epd->spi;
 802	unsigned int line;
 803
 804	DRM_DEBUG_DRIVER("\n");
 805
 806	mutex_lock(&tdev->dirty_lock);
 807	epd->enabled = false;
 808	mutex_unlock(&tdev->dirty_lock);
 809
 810	/* Nothing frame */
 811	for (line = 0; line < epd->height; line++)
 812		repaper_one_line(epd, 0x7fffu, NULL, 0x00, NULL,
 813				 REPAPER_COMPENSATE);
 814
 815	/* 2.7" */
 816	if (epd->border) {
 817		/* Dummy line */
 818		repaper_one_line(epd, 0x7fffu, NULL, 0x00, NULL,
 819				 REPAPER_COMPENSATE);
 820		msleep(25);
 821		gpiod_set_value_cansleep(epd->border, 0);
 822		msleep(200);
 823		gpiod_set_value_cansleep(epd->border, 1);
 824	} else {
 825		/* Border dummy line */
 826		repaper_one_line(epd, 0x7fffu, NULL, 0x00, NULL,
 827				 REPAPER_NORMAL);
 828		msleep(200);
 829	}
 830
 831	/* not described in datasheet */
 832	repaper_write_val(spi, 0x0b, 0x00);
 833	/* Latch reset turn on */
 834	repaper_write_val(spi, 0x03, 0x01);
 835	/* Power off charge pump Vcom */
 836	repaper_write_val(spi, 0x05, 0x03);
 837	/* Power off charge pump neg voltage */
 838	repaper_write_val(spi, 0x05, 0x01);
 839	msleep(120);
 840	/* Discharge internal */
 841	repaper_write_val(spi, 0x04, 0x80);
 842	/* turn off all charge pumps */
 843	repaper_write_val(spi, 0x05, 0x00);
 844	/* Turn off osc */
 845	repaper_write_val(spi, 0x07, 0x01);
 846	msleep(50);
 847
 848	power_off(epd);
 849}
 850
 851static const struct drm_simple_display_pipe_funcs repaper_pipe_funcs = {
 852	.enable = repaper_pipe_enable,
 853	.disable = repaper_pipe_disable,
 854	.update = tinydrm_display_pipe_update,
 855	.prepare_fb = tinydrm_display_pipe_prepare_fb,
 856};
 857
 858static const uint32_t repaper_formats[] = {
 859	DRM_FORMAT_XRGB8888,
 860};
 861
 862static const struct drm_display_mode repaper_e1144cs021_mode = {
 863	TINYDRM_MODE(128, 96, 29, 22),
 864};
 865
 866static const u8 repaper_e1144cs021_cs[] = { 0x00, 0x00, 0x00, 0x00,
 867					    0x00, 0x0f, 0xff, 0x00 };
 868
 869static const struct drm_display_mode repaper_e1190cs021_mode = {
 870	TINYDRM_MODE(144, 128, 36, 32),
 871};
 872
 873static const u8 repaper_e1190cs021_cs[] = { 0x00, 0x00, 0x00, 0x03,
 874					    0xfc, 0x00, 0x00, 0xff };
 875
 876static const struct drm_display_mode repaper_e2200cs021_mode = {
 877	TINYDRM_MODE(200, 96, 46, 22),
 878};
 879
 880static const u8 repaper_e2200cs021_cs[] = { 0x00, 0x00, 0x00, 0x00,
 881					    0x01, 0xff, 0xe0, 0x00 };
 882
 883static const struct drm_display_mode repaper_e2271cs021_mode = {
 884	TINYDRM_MODE(264, 176, 57, 38),
 885};
 886
 887static const u8 repaper_e2271cs021_cs[] = { 0x00, 0x00, 0x00, 0x7f,
 888					    0xff, 0xfe, 0x00, 0x00 };
 889
 890DEFINE_DRM_GEM_CMA_FOPS(repaper_fops);
 891
 892static struct drm_driver repaper_driver = {
 893	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
 894				  DRIVER_ATOMIC,
 895	.fops			= &repaper_fops,
 896	TINYDRM_GEM_DRIVER_OPS,
 897	.name			= "repaper",
 898	.desc			= "Pervasive Displays RePaper e-ink panels",
 899	.date			= "20170405",
 900	.major			= 1,
 901	.minor			= 0,
 902};
 903
 904static const struct of_device_id repaper_of_match[] = {
 905	{ .compatible = "pervasive,e1144cs021", .data = (void *)E1144CS021 },
 906	{ .compatible = "pervasive,e1190cs021", .data = (void *)E1190CS021 },
 907	{ .compatible = "pervasive,e2200cs021", .data = (void *)E2200CS021 },
 908	{ .compatible = "pervasive,e2271cs021", .data = (void *)E2271CS021 },
 909	{},
 910};
 911MODULE_DEVICE_TABLE(of, repaper_of_match);
 912
 913static const struct spi_device_id repaper_id[] = {
 914	{ "e1144cs021", E1144CS021 },
 915	{ "e1190cs021", E1190CS021 },
 916	{ "e2200cs021", E2200CS021 },
 917	{ "e2271cs021", E2271CS021 },
 918	{ },
 919};
 920MODULE_DEVICE_TABLE(spi, repaper_id);
 921
 922static int repaper_probe(struct spi_device *spi)
 923{
 924	const struct drm_display_mode *mode;
 925	const struct spi_device_id *spi_id;
 926	const struct of_device_id *match;
 927	struct device *dev = &spi->dev;
 928	struct tinydrm_device *tdev;
 929	enum repaper_model model;
 930	const char *thermal_zone;
 931	struct repaper_epd *epd;
 932	size_t line_buffer_size;
 933	int ret;
 934
 935	match = of_match_device(repaper_of_match, dev);
 936	if (match) {
 937		model = (enum repaper_model)match->data;
 938	} else {
 939		spi_id = spi_get_device_id(spi);
 940		model = spi_id->driver_data;
 941	}
 942
 943	/* The SPI device is used to allocate dma memory */
 944	if (!dev->coherent_dma_mask) {
 945		ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32));
 946		if (ret) {
 947			dev_warn(dev, "Failed to set dma mask %d\n", ret);
 948			return ret;
 949		}
 950	}
 951
 952	epd = devm_kzalloc(dev, sizeof(*epd), GFP_KERNEL);
 953	if (!epd)
 954		return -ENOMEM;
 955
 956	epd->spi = spi;
 957
 958	epd->panel_on = devm_gpiod_get(dev, "panel-on", GPIOD_OUT_LOW);
 959	if (IS_ERR(epd->panel_on)) {
 960		ret = PTR_ERR(epd->panel_on);
 961		if (ret != -EPROBE_DEFER)
 962			DRM_DEV_ERROR(dev, "Failed to get gpio 'panel-on'\n");
 963		return ret;
 964	}
 965
 966	epd->discharge = devm_gpiod_get(dev, "discharge", GPIOD_OUT_LOW);
 967	if (IS_ERR(epd->discharge)) {
 968		ret = PTR_ERR(epd->discharge);
 969		if (ret != -EPROBE_DEFER)
 970			DRM_DEV_ERROR(dev, "Failed to get gpio 'discharge'\n");
 971		return ret;
 972	}
 973
 974	epd->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
 975	if (IS_ERR(epd->reset)) {
 976		ret = PTR_ERR(epd->reset);
 977		if (ret != -EPROBE_DEFER)
 978			DRM_DEV_ERROR(dev, "Failed to get gpio 'reset'\n");
 979		return ret;
 980	}
 981
 982	epd->busy = devm_gpiod_get(dev, "busy", GPIOD_IN);
 983	if (IS_ERR(epd->busy)) {
 984		ret = PTR_ERR(epd->busy);
 985		if (ret != -EPROBE_DEFER)
 986			DRM_DEV_ERROR(dev, "Failed to get gpio 'busy'\n");
 987		return ret;
 988	}
 989
 990	if (!device_property_read_string(dev, "pervasive,thermal-zone",
 991					 &thermal_zone)) {
 992		epd->thermal = thermal_zone_get_zone_by_name(thermal_zone);
 993		if (IS_ERR(epd->thermal)) {
 994			DRM_DEV_ERROR(dev, "Failed to get thermal zone: %s\n", thermal_zone);
 995			return PTR_ERR(epd->thermal);
 996		}
 997	}
 998
 999	switch (model) {
1000	case E1144CS021:
1001		mode = &repaper_e1144cs021_mode;
1002		epd->channel_select = repaper_e1144cs021_cs;
1003		epd->stage_time = 480;
1004		epd->bytes_per_scan = 96 / 4;
1005		epd->middle_scan = true; /* data-scan-data */
1006		epd->pre_border_byte = false;
1007		epd->border_byte = REPAPER_BORDER_BYTE_ZERO;
1008		break;
1009
1010	case E1190CS021:
1011		mode = &repaper_e1190cs021_mode;
1012		epd->channel_select = repaper_e1190cs021_cs;
1013		epd->stage_time = 480;
1014		epd->bytes_per_scan = 128 / 4 / 2;
1015		epd->middle_scan = false; /* scan-data-scan */
1016		epd->pre_border_byte = false;
1017		epd->border_byte = REPAPER_BORDER_BYTE_SET;
1018		break;
1019
1020	case E2200CS021:
1021		mode = &repaper_e2200cs021_mode;
1022		epd->channel_select = repaper_e2200cs021_cs;
1023		epd->stage_time = 480;
1024		epd->bytes_per_scan = 96 / 4;
1025		epd->middle_scan = true; /* data-scan-data */
1026		epd->pre_border_byte = true;
1027		epd->border_byte = REPAPER_BORDER_BYTE_NONE;
1028		break;
1029
1030	case E2271CS021:
1031		epd->border = devm_gpiod_get(dev, "border", GPIOD_OUT_LOW);
1032		if (IS_ERR(epd->border)) {
1033			ret = PTR_ERR(epd->border);
1034			if (ret != -EPROBE_DEFER)
1035				DRM_DEV_ERROR(dev, "Failed to get gpio 'border'\n");
1036			return ret;
1037		}
1038
1039		mode = &repaper_e2271cs021_mode;
1040		epd->channel_select = repaper_e2271cs021_cs;
1041		epd->stage_time = 630;
1042		epd->bytes_per_scan = 176 / 4;
1043		epd->middle_scan = true; /* data-scan-data */
1044		epd->pre_border_byte = true;
1045		epd->border_byte = REPAPER_BORDER_BYTE_NONE;
1046		break;
1047
1048	default:
1049		return -ENODEV;
1050	}
1051
1052	epd->width = mode->hdisplay;
1053	epd->height = mode->vdisplay;
1054	epd->factored_stage_time = epd->stage_time;
1055
1056	line_buffer_size = 2 * epd->width / 8 + epd->bytes_per_scan + 2;
1057	epd->line_buffer = devm_kzalloc(dev, line_buffer_size, GFP_KERNEL);
1058	if (!epd->line_buffer)
1059		return -ENOMEM;
1060
1061	epd->current_frame = devm_kzalloc(dev, epd->width * epd->height / 8,
1062					  GFP_KERNEL);
1063	if (!epd->current_frame)
1064		return -ENOMEM;
1065
1066	tdev = &epd->tinydrm;
1067
1068	ret = devm_tinydrm_init(dev, tdev, &repaper_fb_funcs, &repaper_driver);
1069	if (ret)
1070		return ret;
1071
1072	ret = tinydrm_display_pipe_init(tdev, &repaper_pipe_funcs,
1073					DRM_MODE_CONNECTOR_VIRTUAL,
1074					repaper_formats,
1075					ARRAY_SIZE(repaper_formats), mode, 0);
1076	if (ret)
1077		return ret;
1078
1079	drm_mode_config_reset(tdev->drm);
1080	spi_set_drvdata(spi, tdev);
1081
1082	DRM_DEBUG_DRIVER("SPI speed: %uMHz\n", spi->max_speed_hz / 1000000);
1083
1084	return devm_tinydrm_register(tdev);
1085}
1086
1087static void repaper_shutdown(struct spi_device *spi)
1088{
1089	struct tinydrm_device *tdev = spi_get_drvdata(spi);
1090
1091	tinydrm_shutdown(tdev);
1092}
1093
1094static struct spi_driver repaper_spi_driver = {
1095	.driver = {
1096		.name = "repaper",
1097		.owner = THIS_MODULE,
1098		.of_match_table = repaper_of_match,
1099	},
1100	.id_table = repaper_id,
1101	.probe = repaper_probe,
1102	.shutdown = repaper_shutdown,
1103};
1104module_spi_driver(repaper_spi_driver);
1105
1106MODULE_DESCRIPTION("Pervasive Displays RePaper DRM driver");
1107MODULE_AUTHOR("Noralf Trønnes");
1108MODULE_LICENSE("GPL");