[PATCH] video: fbdev: remove dead old CLPS711x LCD support driver

STALE2863d

2 messages, 2 authors, 2018-10-09 · open the first message on its own page

[PATCH] video: fbdev: remove dead old CLPS711x LCD support driver

From: Bartlomiej Zolnierkiewicz <hidden>
Date: 2018-10-08 14:39:52

Since commit c86f51737f8d ("ARM: clps711x: Switch to MULTIPLATFORM")
ARCH_CLPS711X depends on ARCH_MULTIPLATFORM to be enabled so the old
CLPS711x LCD support driver (enabled by the FB_CLPS711X_OLD config
option) can't be selected any longer. Remove all FB_CLPS711XX_OLD
code as it has been dead for over 2 years now. Please note that the
new CLPS711x LCD support driver (enabled by the FB_CLPS711X config
option) is still available in the kernel tree.

Signed-off-by: Bartlomiej Zolnierkiewicz <redacted>
---
 drivers/video/fbdev/Kconfig      |    7 
 drivers/video/fbdev/Makefile     |    1 
 drivers/video/fbdev/clps711xfb.c |  314 ---------------------------------------
 3 files changed, 322 deletions(-)

Index: b/drivers/video/fbdev/Kconfig
=================================--- a/drivers/video/fbdev/Kconfig	2018-10-08 12:57:36.743642088 +0200
+++ b/drivers/video/fbdev/Kconfig	2018-10-08 16:05:55.075926618 +0200
@@ -8,12 +8,6 @@ config FB_CMDLINE
 config FB_NOTIFY
 	bool
 
-config FB_CLPS711X_OLD
-	tristate
-	select FB_CFB_FILLRECT
-	select FB_CFB_COPYAREA
-	select FB_CFB_IMAGEBLIT
-
 menuconfig FB
 	tristate "Support for frame buffer devices"
 	select FB_CMDLINE
@@ -338,7 +332,6 @@ config FB_ACORN
 config FB_CLPS711X
 	tristate "CLPS711X LCD support"
 	depends on FB && (ARCH_CLPS711X || COMPILE_TEST)
-	select FB_CLPS711X_OLD if ARCH_CLPS711X && !ARCH_MULTIPLATFORM
 	select BACKLIGHT_LCD_SUPPORT
 	select FB_MODE_HELPERS
 	select FB_SYS_FILLRECT
Index: b/drivers/video/fbdev/Makefile
=================================--- a/drivers/video/fbdev/Makefile	2018-09-03 18:11:52.693791712 +0200
+++ b/drivers/video/fbdev/Makefile	2018-10-08 16:05:33.391926072 +0200
@@ -14,7 +14,6 @@ obj-$(CONFIG_FB_WMT_GE_ROPS)   += wmt_ge
 obj-$(CONFIG_FB_AMIGA)            += amifb.o c2p_planar.o
 obj-$(CONFIG_FB_ARC)              += arcfb.o
 obj-$(CONFIG_FB_CLPS711X)	  += clps711x-fb.o
-obj-$(CONFIG_FB_CLPS711X_OLD)	  += clps711xfb.o
 obj-$(CONFIG_FB_CYBER2000)        += cyber2000fb.o
 obj-$(CONFIG_FB_GRVGA)            += grvga.o
 obj-$(CONFIG_FB_PM2)              += pm2fb.o
Index: b/drivers/video/fbdev/clps711xfb.c
=================================--- a/drivers/video/fbdev/clps711xfb.c	2018-09-03 18:11:52.705791712 +0200
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,314 +0,0 @@
-/*
- *  linux/drivers/video/clps711xfb.c
- *
- *  Copyright (C) 2000-2001 Deep Blue Solutions Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- *  Framebuffer driver for the CLPS7111 and EP7212 processors.
- */
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/fb.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/platform_device.h>
-
-#include <mach/hardware.h>
-#include <asm/mach-types.h>
-#include <linux/uaccess.h>
-
-struct fb_info	*cfb;
-
-#define CMAP_MAX_SIZE	16
-
-/*
- * LCD AC Prescale.  This comes from the LCD panel manufacturers specifications.
- * This determines how many clocks + 1 of CL1 before the M signal toggles.
- * The number of lines on the display must not be divisible by this number.
- */
-static unsigned int lcd_ac_prescale = 13;
-
-/*
- *    Set a single color register. Return != 0 for invalid regno.
- */
-static int
-clps7111fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-		     u_int transp, struct fb_info *info)
-{
-	unsigned int level, mask, shift, pal;
-
-	if (regno >= (1 << info->var.bits_per_pixel))
-		return 1;
-
-	/* gray = 0.30*R + 0.58*G + 0.11*B */
-	level = (red * 77 + green * 151 + blue * 28) >> 20;
-
-	/*
-	 * On an LCD, a high value is dark, while a low value is light. 
-	 * So we invert the level.
-	 *
-	 * This isn't true on all machines, so we only do it on EDB7211.
-	 *  --rmk
-	 */
-	if (machine_is_edb7211()) {
-		level = 15 - level;
-	}
-
-	shift = 4 * (regno & 7);
-	level <<= shift;
-	mask  = 15 << shift;
-	level &= mask;
-
-	regno = regno < 8 ? PALLSW : PALMSW;
-
-	pal = clps_readl(regno);
-	pal = (pal & ~mask) | level;
-	clps_writel(pal, regno);
-
-	return 0;
-}
-
-/*
- * Validate the purposed mode.
- */	
-static int
-clps7111fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
-{
-	var->transp.msb_right	= 0;
-	var->transp.offset	= 0;
-	var->transp.length	= 0;
-	var->red.msb_right	= 0;
-	var->red.offset		= 0;
-	var->red.length		= var->bits_per_pixel;
-	var->green		= var->red;
-	var->blue		= var->red;
-
-	if (var->bits_per_pixel > 4) 
-		return -EINVAL;
-
-	return 0;
-}
-
-/*
- * Set the hardware state.
- */ 
-static int 
-clps7111fb_set_par(struct fb_info *info)
-{
-	unsigned int lcdcon, syscon, pixclock;
-
-	switch (info->var.bits_per_pixel) {
-	case 1:
-		info->fix.visual = FB_VISUAL_MONO01;
-		break;
-	case 2:
-		info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
-		break;
-	case 4:
-		info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
-		break;
-	}
-
-	info->fix.line_length = info->var.xres_virtual * info->var.bits_per_pixel / 8;
-
-	lcdcon = (info->var.xres_virtual * info->var.yres_virtual * info->var.bits_per_pixel) / 128 - 1;
-	lcdcon |= ((info->var.xres_virtual / 16) - 1) << 13;
-	lcdcon |= lcd_ac_prescale << 25;
-
-	/*
-	 * Calculate pixel prescale value from the pixclock.  This is:
-	 *  36.864MHz / pixclock_mhz - 1.
-	 * However, pixclock is in picoseconds, so this ends up being:
-	 *  36864000 * pixclock_ps / 10^12 - 1
-	 * and this will overflow the 32-bit math.  We perform this as
-	 * (9 * 4096000 = 36864000):
-	 *  pixclock_ps * 9 * (4096000 / 10^12) - 1
-	 */
-	pixclock = 9 * info->var.pixclock / 244140 - 1;
-	lcdcon |= pixclock << 19;
-
-	if (info->var.bits_per_pixel = 4)
-		lcdcon |= LCDCON_GSMD;
-	if (info->var.bits_per_pixel >= 2)
-		lcdcon |= LCDCON_GSEN;
-
-	/*
-	 * LCDCON must only be changed while the LCD is disabled
-	 */
-	syscon = clps_readl(SYSCON1);
-	clps_writel(syscon & ~SYSCON1_LCDEN, SYSCON1);
-	clps_writel(lcdcon, LCDCON);
-	clps_writel(syscon | SYSCON1_LCDEN, SYSCON1);
-	return 0;
-}
-
-static int clps7111fb_blank(int blank, struct fb_info *info)
-{
-	/* Enable/Disable LCD controller. */
-	if (blank)
-		clps_writel(clps_readl(SYSCON1) & ~SYSCON1_LCDEN, SYSCON1);
-	else
-		clps_writel(clps_readl(SYSCON1) | SYSCON1_LCDEN, SYSCON1);
-
-	return 0;
-}
-
-static struct fb_ops clps7111fb_ops = {
-	.owner		= THIS_MODULE,
-	.fb_check_var	= clps7111fb_check_var,
-	.fb_set_par	= clps7111fb_set_par,
-	.fb_setcolreg	= clps7111fb_setcolreg,
-	.fb_blank	= clps7111fb_blank,
-	.fb_fillrect	= cfb_fillrect,
-	.fb_copyarea	= cfb_copyarea,
-	.fb_imageblit	= cfb_imageblit,
-};
-
-static void clps711x_guess_lcd_params(struct fb_info *info)
-{
-	unsigned int lcdcon, syscon, size;
-	unsigned long phys_base = PAGE_OFFSET;
-	void *virt_base = (void *)PAGE_OFFSET;
-
-	info->var.xres_virtual	 = 640;
-	info->var.yres_virtual	 = 240;
-	info->var.bits_per_pixel = 4;
-	info->var.activate	 = FB_ACTIVATE_NOW;
-	info->var.height	 = -1;
-	info->var.width		 = -1;
-	info->var.pixclock	 = 93006; /* 10.752MHz pixel clock */
-
-	/*
-	 * If the LCD controller is already running, decode the values
-	 * in LCDCON to xres/yres/bpp/pixclock/acprescale
-	 */
-	syscon = clps_readl(SYSCON1);
-	if (syscon & SYSCON1_LCDEN) {
-		lcdcon = clps_readl(LCDCON);
-
-		/*
-		 * Decode GSMD and GSEN bits to bits per pixel
-		 */
-		switch (lcdcon & (LCDCON_GSMD | LCDCON_GSEN)) {
-		case LCDCON_GSMD | LCDCON_GSEN:
-			info->var.bits_per_pixel = 4;
-			break;
-
-		case LCDCON_GSEN:
-			info->var.bits_per_pixel = 2;
-			break;
-
-		default:
-			info->var.bits_per_pixel = 1;
-			break;
-		}
-
-		/*
-		 * Decode xres/yres
-		 */
-		info->var.xres_virtual = (((lcdcon >> 13) & 0x3f) + 1) * 16;
-		info->var.yres_virtual = (((lcdcon & 0x1fff) + 1) * 128) /
-					  (info->var.xres_virtual *
-					   info->var.bits_per_pixel);
-
-		/*
-		 * Calculate pixclock
-		 */
-		info->var.pixclock = (((lcdcon >> 19) & 0x3f) + 1) * 244140 / 9;
-
-		/*
-		 * Grab AC prescale
-		 */
-		lcd_ac_prescale = (lcdcon >> 25) & 0x1f;
-	}
-
-	info->var.xres = info->var.xres_virtual;
-	info->var.yres = info->var.yres_virtual;
-	info->var.grayscale = info->var.bits_per_pixel > 1;
-
-	size = info->var.xres * info->var.yres * info->var.bits_per_pixel / 8;
-
-	/*
-	 * Might be worth checking to see if we can use the on-board
-	 * RAM if size here...
-	 * CLPS7110 - no on-board SRAM
-	 * EP7212   - 38400 bytes
-	 */
-	if (size <= 38400) {
-		printk(KERN_INFO "CLPS711xFB: could use on-board SRAM?\n");
-	}
-
-	if ((syscon & SYSCON1_LCDEN) = 0) {
-		/*
-		 * The display isn't running.  Ensure that
-		 * the display memory is empty.
-		 */
-		memset(virt_base, 0, size);
-	}
-
-	info->screen_base    = virt_base;
-	info->fix.smem_start = phys_base;
-	info->fix.smem_len   = PAGE_ALIGN(size);
-	info->fix.type       = FB_TYPE_PACKED_PIXELS;
-}
-
-static int clps711x_fb_probe(struct platform_device *pdev)
-{
-	int err = -ENOMEM;
-
-	if (fb_get_options("clps711xfb", NULL))
-		return -ENODEV;
-
-	cfb = kzalloc(sizeof(*cfb), GFP_KERNEL);
-	if (!cfb)
-		goto out;
-
-	strcpy(cfb->fix.id, "clps711x");
-
-	cfb->fbops		= &clps7111fb_ops;
-	cfb->flags		= FBINFO_DEFAULT;
-
-	clps711x_guess_lcd_params(cfb);
-
-	fb_alloc_cmap(&cfb->cmap, CMAP_MAX_SIZE, 0);
-
-	err = register_framebuffer(cfb);
-
-out:	return err;
-}
-
-static int clps711x_fb_remove(struct platform_device *pdev)
-{
-	unregister_framebuffer(cfb);
-	kfree(cfb);
-
-	return 0;
-}
-
-static struct platform_driver clps711x_fb_driver = {
-	.driver	= {
-		.name	= "video-clps711x",
-	},
-	.probe	= clps711x_fb_probe,
-	.remove	= clps711x_fb_remove,
-};
-module_platform_driver(clps711x_fb_driver);
-
-MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
-MODULE_DESCRIPTION("CLPS711X framebuffer driver");
-MODULE_LICENSE("GPL");

Re: [PATCH] video: fbdev: remove dead old CLPS711x LCD support driver

From: Alexander Shiyan <hidden>
Date: 2018-10-09 05:25:50

PlNpbmNlIGNvbW1pdCBjODZmNTE3MzdmOGQgKCJBUk06IGNscHM3MTF4OiBTd2l0Y2ggdG8gTVVM
VElQTEFURk9STSIpCj5BUkNIX0NMUFM3MTFYIGRlcGVuZHMgb24gQVJDSF9NVUxUSVBMQVRGT1JN
IHRvIGJlIGVuYWJsZWQgc28gdGhlIG9sZAo+Q0xQUzcxMXggTENEIHN1cHBvcnQgZHJpdmVyIChl
bmFibGVkIGJ5IHRoZSBGQl9DTFBTNzExWF9PTEQgY29uZmlnCj5vcHRpb24pIGNhbid0IGJlIHNl
bGVjdGVkIGFueSBsb25nZXIuIFJlbW92ZSBhbGwgRkJfQ0xQUzcxMVhYX09MRAo+Y29kZSBhcyBp
dCBoYXMgYmVlbiBkZWFkIGZvciBvdmVyIDIgeWVhcnMgbm93LiBQbGVhc2Ugbm90ZSB0aGF0IHRo
ZQo+bmV3IENMUFM3MTF4IExDRCBzdXBwb3J0IGRyaXZlciAoZW5hYmxlZCBieSB0aGUgRkJfQ0xQ
UzcxMVggY29uZmlnCj5vcHRpb24pIGlzIHN0aWxsIGF2YWlsYWJsZSBpbiB0aGUga2VybmVsIHRy
ZWUuCj4KPlNpZ25lZC1vZmYtYnk6IEJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPCBiLnpvbG5p
ZXJraWVAc2Ftc3VuZy5jb20gPgoKUmV2aWV3ZWQtYnk6IEFsZXhhbmRlciBTaGl5YW4gPHNoY193
b3JrQG1haWwucnU+Cgo+LS0tCj7CoGRyaXZlcnMvdmlkZW8vZmJkZXYvS2NvbmZpZyAgICAgIHwg
ICAgNyAKPsKgZHJpdmVycy92aWRlby9mYmRldi9NYWtlZmlsZSAgICAgfCAgICAxIAo+wqBkcml2
ZXJzL3ZpZGVvL2ZiZGV2L2NscHM3MTF4ZmIuYyB8ICAzMTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCj7CoDMgZmlsZXMgY2hhbmdlZCwgMzIyIGRlbGV0aW9ucygtKQo+
Cj5JbmRleDogYi9kcml2ZXJzL3ZpZGVvL2ZiZGV2L0tjb25maWcKPj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KPi0tLSBh
L2RyaXZlcnMvdmlkZW8vZmJkZXYvS2NvbmZpZzIwMTgtMTAtMDggMTI6NTc6MzYuNzQzNjQyMDg4
ICswMjAwCj4rKysgYi9kcml2ZXJzL3ZpZGVvL2ZiZGV2L0tjb25maWcyMDE4LTEwLTA4IDE2OjA1
OjU1LjA3NTkyNjYxOCArMDIwMAo+QEAgLTgsMTIgKzgsNiBAQCBjb25maWcgRkJfQ01ETElORQo+
wqBjb25maWcgRkJfTk9USUZZCj7CoGJvb2wKPsKgCj4tY29uZmlnIEZCX0NMUFM3MTFYX09MRAo+
LXRyaXN0YXRlCj4tc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAo+LXNlbGVjdCBGQl9DRkJfQ09QWUFS
RUEKPi1zZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAo+LQo+wqBtZW51Y29uZmlnIEZCCj7CoHRyaXN0
YXRlICJTdXBwb3J0IGZvciBmcmFtZSBidWZmZXIgZGV2aWNlcyIKPsKgc2VsZWN0IEZCX0NNRExJ
TkUKPkBAIC0zMzgsNyArMzMyLDYgQEAgY29uZmlnIEZCX0FDT1JOCj7CoGNvbmZpZyBGQl9DTFBT
NzExWAo+wqB0cmlzdGF0ZSAiQ0xQUzcxMVggTENEIHN1cHBvcnQiCj7CoGRlcGVuZHMgb24gRkIg
JiYgKEFSQ0hfQ0xQUzcxMVggfHwgQ09NUElMRV9URVNUKQo+LXNlbGVjdCBGQl9DTFBTNzExWF9P
TEQgaWYgQVJDSF9DTFBTNzExWCAmJiAhQVJDSF9NVUxUSVBMQVRGT1JNCj7CoHNlbGVjdCBCQUNL
TElHSFRfTENEX1NVUFBPUlQKPsKgc2VsZWN0IEZCX01PREVfSEVMUEVSUwo+wqBzZWxlY3QgRkJf
U1lTX0ZJTExSRUNUCj5JbmRleDogYi9kcml2ZXJzL3ZpZGVvL2ZiZGV2L01ha2VmaWxlCj49PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Cj4tLS0gYS9kcml2ZXJzL3ZpZGVvL2ZiZGV2L01ha2VmaWxlMjAxOC0wOS0wMyAxODox
MTo1Mi42OTM3OTE3MTIgKzAyMDAKPisrKyBiL2RyaXZlcnMvdmlkZW8vZmJkZXYvTWFrZWZpbGUy
MDE4LTEwLTA4IDE2OjA1OjMzLjM5MTkyNjA3MiArMDIwMAo+QEAgLTE0LDcgKzE0LDYgQEAgb2Jq
LSQoQ09ORklHX0ZCX1dNVF9HRV9ST1BTKSAgICs9IHdtdF9nZQo+wqBvYmotJChDT05GSUdfRkJf
QU1JR0EpICAgICAgICAgICAgKz0gYW1pZmIubyBjMnBfcGxhbmFyLm8KPsKgb2JqLSQoQ09ORklH
X0ZCX0FSQykgICAgICAgICAgICAgICs9IGFyY2ZiLm8KPsKgb2JqLSQoQ09ORklHX0ZCX0NMUFM3
MTFYKSAgKz0gY2xwczcxMXgtZmIubwo+LW9iai0kKENPTkZJR19GQl9DTFBTNzExWF9PTEQpICAr
PSBjbHBzNzExeGZiLm8KPsKgb2JqLSQoQ09ORklHX0ZCX0NZQkVSMjAwMCkgICAgICAgICs9IGN5
YmVyMjAwMGZiLm8KPsKgb2JqLSQoQ09ORklHX0ZCX0dSVkdBKSAgICAgICAgICAgICs9IGdydmdh
Lm8KPsKgb2JqLSQoQ09ORklHX0ZCX1BNMikgICAgICAgICAgICAgICs9IHBtMmZiLm8KPkluZGV4
OiBiL2RyaXZlcnMvdmlkZW8vZmJkZXYvY2xwczcxMXhmYi5jCj49PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cj4tLS0gYS9k
cml2ZXJzL3ZpZGVvL2ZiZGV2L2NscHM3MTF4ZmIuYzIwMTgtMDktMDMgMTg6MTE6NTIuNzA1Nzkx
NzEyICswMjAwCj4rKysgL2Rldi9udWxsMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAw
MDAKPkBAIC0xLDMxNCArMCwwIEBACj4tLyoKPi0gKiAgbGludXgvZHJpdmVycy92aWRlby9jbHBz
NzExeGZiLmMKPi0gKgo+LSAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBEZWVwIEJsdWUgU29s
dXRpb25zIEx0ZC4KPi0gKgo+LSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4tICogaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKPi0gKiB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvcgo+LSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4tICoKPi0g
KiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKPi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgo+LSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+LSAqCj4tICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKPi0gKiBhbG9uZyB3aXRo
IHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQo+LSAqIEZv
dW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAw
MjExMS0xMzA3ICBVU0EKPi0gKgo+LSAqICBGcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIHRoZSBDTFBT
NzExMSBhbmQgRVA3MjEyIHByb2Nlc3NvcnMuCj4tICovCj4tI2luY2x1ZGUgPGxpbnV4L21tLmg+
Cj4tI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+LSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4K
Pi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+LSNpbmNsdWRlIDxsaW51eC9mYi5oPgo+LSNpbmNs
dWRlIDxsaW51eC9pbml0Lmg+Cj4tI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4tI2luY2x1ZGUg
PGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+LQo+LSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+
Cj4tI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Cj4tI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3Mu
aD4KPi0KPi1zdHJ1Y3QgZmJfaW5mbypjZmI7Cj4tCj4tI2RlZmluZSBDTUFQX01BWF9TSVpFMTYK
Pi0KPi0vKgo+LSAqIExDRCBBQyBQcmVzY2FsZS4gIFRoaXMgY29tZXMgZnJvbSB0aGUgTENEIHBh
bmVsIG1hbnVmYWN0dXJlcnMgc3BlY2lmaWNhdGlvbnMuCj4tICogVGhpcyBkZXRlcm1pbmVzIGhv
dyBtYW55IGNsb2NrcyArIDEgb2YgQ0wxIGJlZm9yZSB0aGUgTSBzaWduYWwgdG9nZ2xlcy4KPi0g
KiBUaGUgbnVtYmVyIG9mIGxpbmVzIG9uIHRoZSBkaXNwbGF5IG11c3Qgbm90IGJlIGRpdmlzaWJs
ZSBieSB0aGlzIG51bWJlci4KPi0gKi8KPi1zdGF0aWMgdW5zaWduZWQgaW50IGxjZF9hY19wcmVz
Y2FsZSA9IDEzOwo+LQo+LS8qCj4tICogICAgU2V0IGEgc2luZ2xlIGNvbG9yIHJlZ2lzdGVyLiBS
ZXR1cm4gIT0gMCBmb3IgaW52YWxpZCByZWduby4KPi0gKi8KPi1zdGF0aWMgaW50Cj4tY2xwczcx
MTFmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50
IGJsdWUsCj4tICAgICB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQo+LXsKPi11
bnNpZ25lZCBpbnQgbGV2ZWwsIG1hc2ssIHNoaWZ0LCBwYWw7Cj4tCj4taWYgKHJlZ25vID49ICgx
IDw8IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkpCj4tcmV0dXJuIDE7Cj4tCj4tLyogZ3JheSA9
IDAuMzAqUiArIDAuNTgqRyArIDAuMTEqQiAqLwo+LWxldmVsID0gKHJlZCAqIDc3ICsgZ3JlZW4g
KiAxNTEgKyBibHVlICogMjgpID4+IDIwOwo+LQo+LS8qCj4tICogT24gYW4gTENELCBhIGhpZ2gg
dmFsdWUgaXMgZGFyaywgd2hpbGUgYSBsb3cgdmFsdWUgaXMgbGlnaHQuIAo+LSAqIFNvIHdlIGlu
dmVydCB0aGUgbGV2ZWwuCj4tICoKPi0gKiBUaGlzIGlzbid0IHRydWUgb24gYWxsIG1hY2hpbmVz
LCBzbyB3ZSBvbmx5IGRvIGl0IG9uIEVEQjcyMTEuCj4tICogIC0tcm1rCj4tICovCj4taWYgKG1h
Y2hpbmVfaXNfZWRiNzIxMSgpKSB7Cj4tbGV2ZWwgPSAxNSAtIGxldmVsOwo+LX0KPi0KPi1zaGlm
dCA9IDQgKiAocmVnbm8gJiA3KTsKPi1sZXZlbCA8PD0gc2hpZnQ7Cj4tbWFzayAgPSAxNSA8PCBz
aGlmdDsKPi1sZXZlbCAmPSBtYXNrOwo+LQo+LXJlZ25vID0gcmVnbm8gPCA4ID8gUEFMTFNXIDog
UEFMTVNXOwo+LQo+LXBhbCA9IGNscHNfcmVhZGwocmVnbm8pOwo+LXBhbCA9IChwYWwgJiB+bWFz
aykgfCBsZXZlbDsKPi1jbHBzX3dyaXRlbChwYWwsIHJlZ25vKTsKPi0KPi1yZXR1cm4gMDsKPi19
Cj4tCj4tLyoKPi0gKiBWYWxpZGF0ZSB0aGUgcHVycG9zZWQgbW9kZS4KPi0gKi8KPi1zdGF0aWMg
aW50Cj4tY2xwczcxMTFmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIs
IHN0cnVjdCBmYl9pbmZvICppbmZvKQo+LXsKPi12YXItPnRyYW5zcC5tc2JfcmlnaHQ9IDA7Cj4t
dmFyLT50cmFuc3Aub2Zmc2V0PSAwOwo+LXZhci0+dHJhbnNwLmxlbmd0aD0gMDsKPi12YXItPnJl
ZC5tc2JfcmlnaHQ9IDA7Cj4tdmFyLT5yZWQub2Zmc2V0PSAwOwo+LXZhci0+cmVkLmxlbmd0aD0g
dmFyLT5iaXRzX3Blcl9waXhlbDsKPi12YXItPmdyZWVuPSB2YXItPnJlZDsKPi12YXItPmJsdWU9
IHZhci0+cmVkOwo+LQo+LWlmICh2YXItPmJpdHNfcGVyX3BpeGVsID4gNCkgCj4tcmV0dXJuIC1F
SU5WQUw7Cj4tCj4tcmV0dXJuIDA7Cj4tfQo+LQo+LS8qCj4tICogU2V0IHRoZSBoYXJkd2FyZSBz
dGF0ZS4KPi0gKi8gCj4tc3RhdGljIGludCAKPi1jbHBzNzExMWZiX3NldF9wYXIoc3RydWN0IGZi
X2luZm8gKmluZm8pCj4tewo+LXVuc2lnbmVkIGludCBsY2Rjb24sIHN5c2NvbiwgcGl4Y2xvY2s7
Cj4tCj4tc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKPi1jYXNlIDE6Cj4taW5m
by0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9NT05PMDE7Cj4tYnJlYWs7Cj4tY2FzZSAyOgo+LWlu
Zm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7Cj4tYnJlYWs7Cj4tY2FzZSA0
Ogo+LWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7Cj4tYnJlYWs7Cj4t
fQo+LQo+LWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKiBp
bmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLyA4Owo+LQo+LWxjZGNvbiA9IChpbmZvLT52YXIueHJl
c192aXJ0dWFsICogaW5mby0+dmFyLnlyZXNfdmlydHVhbCAqIGluZm8tPnZhci5iaXRzX3Blcl9w
aXhlbCkgLyAxMjggLSAxOwo+LWxjZGNvbiB8PSAoKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgLyAx
NikgLSAxKSA8PCAxMzsKPi1sY2Rjb24gfD0gbGNkX2FjX3ByZXNjYWxlIDw8IDI1Owo+LQo+LS8q
Cj4tICogQ2FsY3VsYXRlIHBpeGVsIHByZXNjYWxlIHZhbHVlIGZyb20gdGhlIHBpeGNsb2NrLiAg
VGhpcyBpczoKPi0gKiAgMzYuODY0TUh6IC8gcGl4Y2xvY2tfbWh6IC0gMS4KPi0gKiBIb3dldmVy
LCBwaXhjbG9jayBpcyBpbiBwaWNvc2Vjb25kcywgc28gdGhpcyBlbmRzIHVwIGJlaW5nOgo+LSAq
ICAzNjg2NDAwMCAqIHBpeGNsb2NrX3BzIC8gMTBeMTIgLSAxCj4tICogYW5kIHRoaXMgd2lsbCBv
dmVyZmxvdyB0aGUgMzItYml0IG1hdGguICBXZSBwZXJmb3JtIHRoaXMgYXMKPi0gKiAoOSAqIDQw
OTYwMDAgPT0gMzY4NjQwMDApOgo+LSAqICBwaXhjbG9ja19wcyAqIDkgKiAoNDA5NjAwMCAvIDEw
XjEyKSAtIDEKPi0gKi8KPi1waXhjbG9jayA9IDkgKiBpbmZvLT52YXIucGl4Y2xvY2sgLyAyNDQx
NDAgLSAxOwo+LWxjZGNvbiB8PSBwaXhjbG9jayA8PCAxOTsKPi0KPi1pZiAoaW5mby0+dmFyLmJp
dHNfcGVyX3BpeGVsID09IDQpCj4tbGNkY29uIHw9IExDRENPTl9HU01EOwo+LWlmIChpbmZvLT52
YXIuYml0c19wZXJfcGl4ZWwgPj0gMikKPi1sY2Rjb24gfD0gTENEQ09OX0dTRU47Cj4tCj4tLyoK
Pi0gKiBMQ0RDT04gbXVzdCBvbmx5IGJlIGNoYW5nZWQgd2hpbGUgdGhlIExDRCBpcyBkaXNhYmxl
ZAo+LSAqLwo+LXN5c2NvbiA9IGNscHNfcmVhZGwoU1lTQ09OMSk7Cj4tY2xwc193cml0ZWwoc3lz
Y29uICYgflNZU0NPTjFfTENERU4sIFNZU0NPTjEpOwo+LWNscHNfd3JpdGVsKGxjZGNvbiwgTENE
Q09OKTsKPi1jbHBzX3dyaXRlbChzeXNjb24gfCBTWVNDT04xX0xDREVOLCBTWVNDT04xKTsKPi1y
ZXR1cm4gMDsKPi19Cj4tCj4tc3RhdGljIGludCBjbHBzNzExMWZiX2JsYW5rKGludCBibGFuaywg
c3RydWN0IGZiX2luZm8gKmluZm8pCj4tewo+LS8qIEVuYWJsZS9EaXNhYmxlIExDRCBjb250cm9s
bGVyLiAqLwo+LWlmIChibGFuaykKPi1jbHBzX3dyaXRlbChjbHBzX3JlYWRsKFNZU0NPTjEpICYg
flNZU0NPTjFfTENERU4sIFNZU0NPTjEpOwo+LWVsc2UKPi1jbHBzX3dyaXRlbChjbHBzX3JlYWRs
KFNZU0NPTjEpIHwgU1lTQ09OMV9MQ0RFTiwgU1lTQ09OMSk7Cj4tCj4tcmV0dXJuIDA7Cj4tfQo+
LQo+LXN0YXRpYyBzdHJ1Y3QgZmJfb3BzIGNscHM3MTExZmJfb3BzID0gewo+LS5vd25lcj0gVEhJ
U19NT0RVTEUsCj4tLmZiX2NoZWNrX3Zhcj0gY2xwczcxMTFmYl9jaGVja192YXIsCj4tLmZiX3Nl
dF9wYXI9IGNscHM3MTExZmJfc2V0X3BhciwKPi0uZmJfc2V0Y29scmVnPSBjbHBzNzExMWZiX3Nl
dGNvbHJlZywKPi0uZmJfYmxhbms9IGNscHM3MTExZmJfYmxhbmssCj4tLmZiX2ZpbGxyZWN0PSBj
ZmJfZmlsbHJlY3QsCj4tLmZiX2NvcHlhcmVhPSBjZmJfY29weWFyZWEsCj4tLmZiX2ltYWdlYmxp
dD0gY2ZiX2ltYWdlYmxpdCwKPi19Owo+LQo+LXN0YXRpYyB2b2lkIGNscHM3MTF4X2d1ZXNzX2xj
ZF9wYXJhbXMoc3RydWN0IGZiX2luZm8gKmluZm8pCj4tewo+LXVuc2lnbmVkIGludCBsY2Rjb24s
IHN5c2Nvbiwgc2l6ZTsKPi11bnNpZ25lZCBsb25nIHBoeXNfYmFzZSA9IFBBR0VfT0ZGU0VUOwo+
LXZvaWQgKnZpcnRfYmFzZSA9ICh2b2lkICopUEFHRV9PRkZTRVQ7Cj4tCj4taW5mby0+dmFyLnhy
ZXNfdmlydHVhbCA9IDY0MDsKPi1pbmZvLT52YXIueXJlc192aXJ0dWFsID0gMjQwOwo+LWluZm8t
PnZhci5iaXRzX3Blcl9waXhlbCA9IDQ7Cj4taW5mby0+dmFyLmFjdGl2YXRlID0gRkJfQUNUSVZB
VEVfTk9XOwo+LWluZm8tPnZhci5oZWlnaHQgPSAtMTsKPi1pbmZvLT52YXIud2lkdGggPSAtMTsK
Pi1pbmZvLT52YXIucGl4Y2xvY2sgPSA5MzAwNjsgLyogMTAuNzUyTUh6IHBpeGVsIGNsb2NrICov
Cj4tCj4tLyoKPi0gKiBJZiB0aGUgTENEIGNvbnRyb2xsZXIgaXMgYWxyZWFkeSBydW5uaW5nLCBk
ZWNvZGUgdGhlIHZhbHVlcwo+LSAqIGluIExDRENPTiB0byB4cmVzL3lyZXMvYnBwL3BpeGNsb2Nr
L2FjcHJlc2NhbGUKPi0gKi8KPi1zeXNjb24gPSBjbHBzX3JlYWRsKFNZU0NPTjEpOwo+LWlmIChz
eXNjb24gJiBTWVNDT04xX0xDREVOKSB7Cj4tbGNkY29uID0gY2xwc19yZWFkbChMQ0RDT04pOwo+
LQo+LS8qCj4tICogRGVjb2RlIEdTTUQgYW5kIEdTRU4gYml0cyB0byBiaXRzIHBlciBwaXhlbAo+
LSAqLwo+LXN3aXRjaCAobGNkY29uICYgKExDRENPTl9HU01EIHwgTENEQ09OX0dTRU4pKSB7Cj4t
Y2FzZSBMQ0RDT05fR1NNRCB8IExDRENPTl9HU0VOOgo+LWluZm8tPnZhci5iaXRzX3Blcl9waXhl
bCA9IDQ7Cj4tYnJlYWs7Cj4tCj4tY2FzZSBMQ0RDT05fR1NFTjoKPi1pbmZvLT52YXIuYml0c19w
ZXJfcGl4ZWwgPSAyOwo+LWJyZWFrOwo+LQo+LWRlZmF1bHQ6Cj4taW5mby0+dmFyLmJpdHNfcGVy
X3BpeGVsID0gMTsKPi1icmVhazsKPi19Cj4tCj4tLyoKPi0gKiBEZWNvZGUgeHJlcy95cmVzCj4t
ICovCj4taW5mby0+dmFyLnhyZXNfdmlydHVhbCA9ICgoKGxjZGNvbiA+PiAxMykgJiAweDNmKSAr
IDEpICogMTY7Cj4taW5mby0+dmFyLnlyZXNfdmlydHVhbCA9ICgoKGxjZGNvbiAmIDB4MWZmZikg
KyAxKSAqIDEyOCkgLwo+LSAgKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKgo+LSAgIGluZm8tPnZh
ci5iaXRzX3Blcl9waXhlbCk7Cj4tCj4tLyoKPi0gKiBDYWxjdWxhdGUgcGl4Y2xvY2sKPi0gKi8K
Pi1pbmZvLT52YXIucGl4Y2xvY2sgPSAoKChsY2Rjb24gPj4gMTkpICYgMHgzZikgKyAxKSAqIDI0
NDE0MCAvIDk7Cj4tCj4tLyoKPi0gKiBHcmFiIEFDIHByZXNjYWxlCj4tICovCj4tbGNkX2FjX3By
ZXNjYWxlID0gKGxjZGNvbiA+PiAyNSkgJiAweDFmOwo+LX0KPi0KPi1pbmZvLT52YXIueHJlcyA9
IGluZm8tPnZhci54cmVzX3ZpcnR1YWw7Cj4taW5mby0+dmFyLnlyZXMgPSBpbmZvLT52YXIueXJl
c192aXJ0dWFsOwo+LWluZm8tPnZhci5ncmF5c2NhbGUgPSBpbmZvLT52YXIuYml0c19wZXJfcGl4
ZWwgPiAxOwo+LQo+LXNpemUgPSBpbmZvLT52YXIueHJlcyAqIGluZm8tPnZhci55cmVzICogaW5m
by0+dmFyLmJpdHNfcGVyX3BpeGVsIC8gODsKPi0KPi0vKgo+LSAqIE1pZ2h0IGJlIHdvcnRoIGNo
ZWNraW5nIHRvIHNlZSBpZiB3ZSBjYW4gdXNlIHRoZSBvbi1ib2FyZAo+LSAqIFJBTSBpZiBzaXpl
IGhlcmUuLi4KPi0gKiBDTFBTNzExMCAtIG5vIG9uLWJvYXJkIFNSQU0KPi0gKiBFUDcyMTIgICAt
IDM4NDAwIGJ5dGVzCj4tICovCj4taWYgKHNpemUgPD0gMzg0MDApIHsKPi1wcmludGsoS0VSTl9J
TkZPICJDTFBTNzExeEZCOiBjb3VsZCB1c2Ugb24tYm9hcmQgU1JBTT9cbiIpOwo+LX0KPi0KPi1p
ZiAoKHN5c2NvbiAmIFNZU0NPTjFfTENERU4pID09IDApIHsKPi0vKgo+LSAqIFRoZSBkaXNwbGF5
IGlzbid0IHJ1bm5pbmcuICBFbnN1cmUgdGhhdAo+LSAqIHRoZSBkaXNwbGF5IG1lbW9yeSBpcyBl
bXB0eS4KPi0gKi8KPi1tZW1zZXQodmlydF9iYXNlLCAwLCBzaXplKTsKPi19Cj4tCj4taW5mby0+
c2NyZWVuX2Jhc2UgICAgPSB2aXJ0X2Jhc2U7Cj4taW5mby0+Zml4LnNtZW1fc3RhcnQgPSBwaHlz
X2Jhc2U7Cj4taW5mby0+Zml4LnNtZW1fbGVuICAgPSBQQUdFX0FMSUdOKHNpemUpOwo+LWluZm8t
PmZpeC50eXBlICAgICAgID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOwo+LX0KPi0KPi1zdGF0aWMg
aW50IGNscHM3MTF4X2ZiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4tewo+
LWludCBlcnIgPSAtRU5PTUVNOwo+LQo+LWlmIChmYl9nZXRfb3B0aW9ucygiY2xwczcxMXhmYiIs
IE5VTEwpKQo+LXJldHVybiAtRU5PREVWOwo+LQo+LWNmYiA9IGt6YWxsb2Moc2l6ZW9mKCpjZmIp
LCBHRlBfS0VSTkVMKTsKPi1pZiAoIWNmYikKPi1nb3RvIG91dDsKPi0KPi1zdHJjcHkoY2ZiLT5m
aXguaWQsICJjbHBzNzExeCIpOwo+LQo+LWNmYi0+ZmJvcHM9ICZjbHBzNzExMWZiX29wczsKPi1j
ZmItPmZsYWdzPSBGQklORk9fREVGQVVMVDsKPi0KPi1jbHBzNzExeF9ndWVzc19sY2RfcGFyYW1z
KGNmYik7Cj4tCj4tZmJfYWxsb2NfY21hcCgmY2ZiLT5jbWFwLCBDTUFQX01BWF9TSVpFLCAwKTsK
Pi0KPi1lcnIgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihjZmIpOwo+LQo+LW91dDpyZXR1cm4gZXJy
Owo+LX0KPi0KPi1zdGF0aWMgaW50IGNscHM3MTF4X2ZiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1f
ZGV2aWNlICpwZGV2KQo+LXsKPi11bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGNmYik7Cj4ta2ZyZWUo
Y2ZiKTsKPi0KPi1yZXR1cm4gMDsKPi19Cj4tCj4tc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2
ZXIgY2xwczcxMXhfZmJfZHJpdmVyID0gewo+LS5kcml2ZXI9IHsKPi0ubmFtZT0gInZpZGVvLWNs
cHM3MTF4IiwKPi19LAo+LS5wcm9iZT0gY2xwczcxMXhfZmJfcHJvYmUsCj4tLnJlbW92ZT0gY2xw
czcxMXhfZmJfcmVtb3ZlLAo+LX07Cj4tbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihjbHBzNzExeF9m
Yl9kcml2ZXIpOwo+LQo+LU1PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyA8IHJta0Bhcm0ubGlu
dXgub3JnLnVrID4iKTsKPi1NT0RVTEVfREVTQ1JJUFRJT04oIkNMUFM3MTFYIGZyYW1lYnVmZmVy
IGRyaXZlciIpOwo+LU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCgotLS0K
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help