Combined both kernels and updated to 5.19.12
This commit is contained in:
		@@ -0,0 +1,48 @@
 | 
			
		||||
From: Arnaud Ferraris <arnaud.ferraris@gmail.com>
 | 
			
		||||
Date: Wed, 8 Dec 2021 23:43:08 +0100
 | 
			
		||||
Subject: arm64: dts: rk3399-pinephone-pro: add modem RI pin
 | 
			
		||||
 | 
			
		||||
Taht way the modem can wake the phone on incoming calls/messages.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Arnaud Ferraris <arnaud.ferraris@gmail.com>
 | 
			
		||||
---
 | 
			
		||||
 arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts | 19 +++++++++++++++++++
 | 
			
		||||
 1 file changed, 19 insertions(+)
 | 
			
		||||
 | 
			
		||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts b/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts
 | 
			
		||||
index de07518..91687f6 100644
 | 
			
		||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts
 | 
			
		||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts
 | 
			
		||||
@@ -160,6 +160,21 @@ power {
 | 
			
		||||
 		};
 | 
			
		||||
 	};
 | 
			
		||||
 
 | 
			
		||||
+	gpio-key-ri {
 | 
			
		||||
+		compatible = "gpio-keys";
 | 
			
		||||
+		pinctrl-names = "default";
 | 
			
		||||
+		pinctrl-0 = <&ri_pin>;
 | 
			
		||||
+
 | 
			
		||||
+		ring_indicator: ring-indicator {
 | 
			
		||||
+			label = "ring-indicator";
 | 
			
		||||
+			linux,can-disable;
 | 
			
		||||
+			linux,code = <KEY_WAKEUP>;
 | 
			
		||||
+			gpios = <&gpio0 RK_PA1 GPIO_ACTIVE_LOW>;
 | 
			
		||||
+			wakeup-event-action = <EV_ACT_ASSERTED>;
 | 
			
		||||
+			wakeup-source;
 | 
			
		||||
+		};
 | 
			
		||||
+	};
 | 
			
		||||
+
 | 
			
		||||
 	// in1  - digital mic daughhterboard
 | 
			
		||||
 	// in2  - headset mic
 | 
			
		||||
 	// in3  - modem output  (muxed with mono)
 | 
			
		||||
@@ -1127,6 +1142,10 @@ flash_pins: flash-pins {
 | 
			
		||||
 	};
 | 
			
		||||
 
 | 
			
		||||
 	modem {
 | 
			
		||||
+		ri_pin: ri-pin {
 | 
			
		||||
+			rockchip,pins = <0 RK_PA1 RK_FUNC_GPIO &pcfg_pull_up>;
 | 
			
		||||
+		};
 | 
			
		||||
+
 | 
			
		||||
 		vcc_4g_5v_en: vcc-4g-5v-en-pin {
 | 
			
		||||
 			rockchip,pins = <1 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>;
 | 
			
		||||
 		};
 | 
			
		||||
@@ -0,0 +1,21 @@
 | 
			
		||||
From 94ee175a91b2c132ca3068ee04cb2766c9f47cd7 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Hendrik Borghorst <hendrikborghorst@gmail.com>
 | 
			
		||||
Date: Fri, 10 Jun 2022 15:36:29 +0200
 | 
			
		||||
Subject: [PATCH] PPP: Add reset resume to usb_wwan
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 drivers/usb/serial/option.c | 1 +
 | 
			
		||||
 1 file changed, 1 insertion(+)
 | 
			
		||||
 | 
			
		||||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
 | 
			
		||||
index e60425bbf53764..08fb844c534bf6 100644
 | 
			
		||||
--- a/drivers/usb/serial/option.c
 | 
			
		||||
+++ b/drivers/usb/serial/option.c
 | 
			
		||||
@@ -2176,6 +2176,7 @@ static struct usb_serial_driver option_1port_device = {
 | 
			
		||||
 #ifdef CONFIG_PM
 | 
			
		||||
 	.suspend           = usb_wwan_suspend,
 | 
			
		||||
 	.resume            = usb_wwan_resume,
 | 
			
		||||
+	.reset_resume            = usb_wwan_resume,
 | 
			
		||||
 #endif
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
From f57b0185c93bc94c3fedbcbb274d3e032972301a Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Hendrik Borghorst <hendrikborghorst@gmail.com>
 | 
			
		||||
Date: Fri, 10 Jun 2022 09:19:39 +0200
 | 
			
		||||
Subject: [PATCH] Revert "usb: quirks: Add USB_QUIRK_RESET for Quectel EG25G
 | 
			
		||||
 Modem"
 | 
			
		||||
 | 
			
		||||
This reverts commit 62867934f6251349e1352a345f827ba8de514a36.
 | 
			
		||||
---
 | 
			
		||||
 drivers/usb/core/quirks.c | 3 ---
 | 
			
		||||
 1 file changed, 3 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
 | 
			
		||||
index 17c3d472fb1304..f99a65a64588fe 100644
 | 
			
		||||
--- a/drivers/usb/core/quirks.c
 | 
			
		||||
+++ b/drivers/usb/core/quirks.c
 | 
			
		||||
@@ -519,9 +519,6 @@ static const struct usb_device_id usb_quirk_list[] = {
 | 
			
		||||
 	/* INTEL VALUE SSD */
 | 
			
		||||
 	{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
 | 
			
		||||
 
 | 
			
		||||
-	/* Quectel EG25G Modem */
 | 
			
		||||
-	{ USB_DEVICE(0x2c7c, 0x0125), .driver_info = USB_QUIRK_RESET },
 | 
			
		||||
-
 | 
			
		||||
 	{ }  /* terminating entry must be last */
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,11 @@
 | 
			
		||||
--- a/drivers/power/supply/rk818_charger.c	2022-01-28 17:51:57.000000000 +0100
 | 
			
		||||
+++ b/drivers/power/supply/rk818_charger.c	2022-02-02 15:06:51.303222817 +0100
 | 
			
		||||
@@ -522,7 +522,7 @@ static enum power_supply_property rk818_
 | 
			
		||||
  */
 | 
			
		||||
 static const struct power_supply_desc rk818_charger_desc = {
 | 
			
		||||
 	.name			= "rk818-charger",
 | 
			
		||||
-	.type			= POWER_SUPPLY_TYPE_MAINS,
 | 
			
		||||
+	.type			= POWER_SUPPLY_TYPE_BATTERY,
 | 
			
		||||
 	.properties		= rk818_charger_props,
 | 
			
		||||
 	.num_properties		= ARRAY_SIZE(rk818_charger_props),
 | 
			
		||||
 	.property_is_writeable	= rk818_charger_prop_writeable,
 | 
			
		||||
@@ -0,0 +1,29 @@
 | 
			
		||||
From 5f41055235786657509233557a3ca2950c401ec5 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: marcin <marcin@ipv8.pl>
 | 
			
		||||
Date: Wed, 15 Jun 2022 03:46:13 +0200
 | 
			
		||||
Subject: [PATCH] sound/rockchip/i2s: Don't disable mclk on suspend
 | 
			
		||||
 | 
			
		||||
This is a workaround to fix an issue with high-pitch sound after
 | 
			
		||||
suspend.
 | 
			
		||||
 | 
			
		||||
This patch is actually authored by Biktorgj
 | 
			
		||||
---
 | 
			
		||||
 sound/soc/rockchip/rockchip_i2s.c | 2 +-
 | 
			
		||||
 1 file changed, 1 insertion(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
 | 
			
		||||
index 4ce5d2579387..1f9d4e5e36b2 100644
 | 
			
		||||
--- a/sound/soc/rockchip/rockchip_i2s.c
 | 
			
		||||
+++ b/sound/soc/rockchip/rockchip_i2s.c
 | 
			
		||||
@@ -61,7 +61,7 @@ static int i2s_runtime_suspend(struct device *dev)
 | 
			
		||||
 	struct rk_i2s_dev *i2s = dev_get_drvdata(dev);
 | 
			
		||||
 
 | 
			
		||||
 	regcache_cache_only(i2s->regmap, true);
 | 
			
		||||
-	clk_disable_unprepare(i2s->mclk);
 | 
			
		||||
+	//clk_disable_unprepare(i2s->mclk);
 | 
			
		||||
 
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
-- 
 | 
			
		||||
GitLab
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,150 @@
 | 
			
		||||
--- b/drivers/video/fbdev/core/bitblit.c
 | 
			
		||||
+++ a/drivers/video/fbdev/core/bitblit.c
 | 
			
		||||
@@ -234,7 +234,7 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		||||
+		       int softback_lines, int fg, int bg)
 | 
			
		||||
-		       int fg, int bg)
 | 
			
		||||
 {
 | 
			
		||||
 	struct fb_cursor cursor;
 | 
			
		||||
 	struct fbcon_ops *ops = info->fbcon_par;
 | 
			
		||||
@@ -247,6 +247,15 @@
 | 
			
		||||
 
 | 
			
		||||
 	cursor.set = 0;
 | 
			
		||||
 
 | 
			
		||||
+	if (softback_lines) {
 | 
			
		||||
+		if (y + softback_lines >= vc->vc_rows) {
 | 
			
		||||
+			mode = CM_ERASE;
 | 
			
		||||
+			ops->cursor_flash = 0;
 | 
			
		||||
+			return;
 | 
			
		||||
+		} else
 | 
			
		||||
+			y += softback_lines;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
  	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		||||
 	attribute = get_attribute(info, c);
 | 
			
		||||
 	src = vc->vc_font.data + ((c & charmask) * (w * vc->vc_font.height));
 | 
			
		||||
--- b/drivers/video/fbdev/core/fbcon.c
 | 
			
		||||
+++ a/drivers/video/fbdev/core/fbcon.c
 | 
			
		||||
@@ -394,7 +394,7 @@
 | 
			
		||||
 	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		||||
 	mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
 | 
			
		||||
 		CM_ERASE : CM_DRAW;
 | 
			
		||||
+	ops->cursor(vc, info, mode, 0, get_color(vc, info, c, 1),
 | 
			
		||||
-	ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
 | 
			
		||||
 		    get_color(vc, info, c, 0));
 | 
			
		||||
 	console_unlock();
 | 
			
		||||
 }
 | 
			
		||||
@@ -1345,7 +1345,7 @@
 | 
			
		||||
 
 | 
			
		||||
 	ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
 | 
			
		||||
 
 | 
			
		||||
+	ops->cursor(vc, info, mode, 0, get_color(vc, info, c, 1),
 | 
			
		||||
-	ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
 | 
			
		||||
 		    get_color(vc, info, c, 0));
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
--- b/drivers/video/fbdev/core/fbcon.h
 | 
			
		||||
+++ a/drivers/video/fbdev/core/fbcon.h
 | 
			
		||||
@@ -62,7 +62,7 @@
 | 
			
		||||
 	void (*clear_margins)(struct vc_data *vc, struct fb_info *info,
 | 
			
		||||
 			      int color, int bottom_only);
 | 
			
		||||
 	void (*cursor)(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		||||
+		       int softback_lines, int fg, int bg);
 | 
			
		||||
-		       int fg, int bg);
 | 
			
		||||
 	int  (*update_start)(struct fb_info *info);
 | 
			
		||||
 	int  (*rotate_font)(struct fb_info *info, struct vc_data *vc);
 | 
			
		||||
 	struct fb_var_screeninfo var;  /* copy of the current fb_var_screeninfo */
 | 
			
		||||
--- b/drivers/video/fbdev/core/fbcon_ccw.c
 | 
			
		||||
+++ a/drivers/video/fbdev/core/fbcon_ccw.c
 | 
			
		||||
@@ -219,7 +219,7 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		||||
+		       int softback_lines, int fg, int bg)
 | 
			
		||||
-		       int fg, int bg)
 | 
			
		||||
 {
 | 
			
		||||
 	struct fb_cursor cursor;
 | 
			
		||||
 	struct fbcon_ops *ops = info->fbcon_par;
 | 
			
		||||
@@ -236,6 +236,15 @@
 | 
			
		||||
 
 | 
			
		||||
 	cursor.set = 0;
 | 
			
		||||
 
 | 
			
		||||
+	if (softback_lines) {
 | 
			
		||||
+		if (y + softback_lines >= vc->vc_rows) {
 | 
			
		||||
+			mode = CM_ERASE;
 | 
			
		||||
+			ops->cursor_flash = 0;
 | 
			
		||||
+			return;
 | 
			
		||||
+		} else
 | 
			
		||||
+			y += softback_lines;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
  	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		||||
 	attribute = get_attribute(info, c);
 | 
			
		||||
 	src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
 | 
			
		||||
--- b/drivers/video/fbdev/core/fbcon_cw.c
 | 
			
		||||
+++ a/drivers/video/fbdev/core/fbcon_cw.c
 | 
			
		||||
@@ -202,7 +202,7 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		||||
+		      int softback_lines, int fg, int bg)
 | 
			
		||||
-		      int fg, int bg)
 | 
			
		||||
 {
 | 
			
		||||
 	struct fb_cursor cursor;
 | 
			
		||||
 	struct fbcon_ops *ops = info->fbcon_par;
 | 
			
		||||
@@ -219,6 +219,15 @@
 | 
			
		||||
 
 | 
			
		||||
 	cursor.set = 0;
 | 
			
		||||
 
 | 
			
		||||
+	if (softback_lines) {
 | 
			
		||||
+		if (y + softback_lines >= vc->vc_rows) {
 | 
			
		||||
+			mode = CM_ERASE;
 | 
			
		||||
+			ops->cursor_flash = 0;
 | 
			
		||||
+			return;
 | 
			
		||||
+		} else
 | 
			
		||||
+			y += softback_lines;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
  	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		||||
 	attribute = get_attribute(info, c);
 | 
			
		||||
 	src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
 | 
			
		||||
--- b/drivers/video/fbdev/core/fbcon_ud.c
 | 
			
		||||
+++ a/drivers/video/fbdev/core/fbcon_ud.c
 | 
			
		||||
@@ -249,7 +249,7 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		||||
+		      int softback_lines, int fg, int bg)
 | 
			
		||||
-		      int fg, int bg)
 | 
			
		||||
 {
 | 
			
		||||
 	struct fb_cursor cursor;
 | 
			
		||||
 	struct fbcon_ops *ops = info->fbcon_par;
 | 
			
		||||
@@ -267,6 +267,15 @@
 | 
			
		||||
 
 | 
			
		||||
 	cursor.set = 0;
 | 
			
		||||
 
 | 
			
		||||
+	if (softback_lines) {
 | 
			
		||||
+		if (y + softback_lines >= vc->vc_rows) {
 | 
			
		||||
+			mode = CM_ERASE;
 | 
			
		||||
+			ops->cursor_flash = 0;
 | 
			
		||||
+			return;
 | 
			
		||||
+		} else
 | 
			
		||||
+			y += softback_lines;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
  	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		||||
 	attribute = get_attribute(info, c);
 | 
			
		||||
 	src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.height));
 | 
			
		||||
--- b/drivers/video/fbdev/core/tileblit.c
 | 
			
		||||
+++ a/drivers/video/fbdev/core/tileblit.c
 | 
			
		||||
@@ -80,7 +80,7 @@
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void tile_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		||||
+			int softback_lines, int fg, int bg)
 | 
			
		||||
-			int fg, int bg)
 | 
			
		||||
 {
 | 
			
		||||
 	struct fb_tilecursor cursor;
 | 
			
		||||
 	int use_sw = (vc->vc_cursor_type & 0x10);
 | 
			
		||||
@@ -0,0 +1,31 @@
 | 
			
		||||
--- b/drivers/video/fbdev/core/fbcon.c
 | 
			
		||||
+++ a/drivers/video/fbdev/core/fbcon.c
 | 
			
		||||
@@ -163,6 +163,8 @@
 | 
			
		||||
 
 | 
			
		||||
 #define advance_row(p, delta) (unsigned short *)((unsigned long)(p) + (delta) * vc->vc_size_row)
 | 
			
		||||
 
 | 
			
		||||
+static int fbcon_set_origin(struct vc_data *);
 | 
			
		||||
+
 | 
			
		||||
 static int fbcon_cursor_noblink;
 | 
			
		||||
 
 | 
			
		||||
 #define divides(a, b)	((!(a) || (b)%(a)) ? 0 : 1)
 | 
			
		||||
@@ -2633,6 +2635,11 @@
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+static int fbcon_set_origin(struct vc_data *vc)
 | 
			
		||||
+{
 | 
			
		||||
+	return 0;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 void fbcon_suspended(struct fb_info *info)
 | 
			
		||||
 {
 | 
			
		||||
 	struct vc_data *vc = NULL;
 | 
			
		||||
@@ -3103,6 +3110,7 @@
 | 
			
		||||
 	.con_font_default	= fbcon_set_def_font,
 | 
			
		||||
 	.con_font_copy 		= fbcon_copy_font,
 | 
			
		||||
 	.con_set_palette 	= fbcon_set_palette,
 | 
			
		||||
+	.con_set_origin 	= fbcon_set_origin,
 | 
			
		||||
 	.con_invert_region 	= fbcon_invert_region,
 | 
			
		||||
 	.con_screen_pos 	= fbcon_screen_pos,
 | 
			
		||||
 	.con_getxy 		= fbcon_getxy,
 | 
			
		||||
@@ -0,0 +1,500 @@
 | 
			
		||||
--- b/drivers/video/fbdev/core/fbcon.c
 | 
			
		||||
+++ a/drivers/video/fbdev/core/fbcon.c
 | 
			
		||||
@@ -124,6 +124,12 @@ static int logo_lines;
 | 
			
		||||
 /* logo_shown is an index to vc_cons when >= 0; otherwise follows FBCON_LOGO
 | 
			
		||||
    enums.  */
 | 
			
		||||
 static int logo_shown = FBCON_LOGO_CANSHOW;
 | 
			
		||||
+/* Software scrollback */
 | 
			
		||||
+static int fbcon_softback_size = 32768;
 | 
			
		||||
+static unsigned long softback_buf, softback_curr;
 | 
			
		||||
+static unsigned long softback_in;
 | 
			
		||||
+static unsigned long softback_top, softback_end;
 | 
			
		||||
+static int softback_lines;
 | 
			
		||||
 /* console mappings */
 | 
			
		||||
 static unsigned int first_fb_vc;
 | 
			
		||||
 static unsigned int last_fb_vc = MAX_NR_CONSOLES - 1;
 | 
			
		||||
@@ -163,6 +169,8 @@ static int margin_color;
 | 
			
		||||
 
 | 
			
		||||
 static const struct consw fb_con;
 | 
			
		||||
 
 | 
			
		||||
+#define CM_SOFTBACK	(8)
 | 
			
		||||
+
 | 
			
		||||
 #define advance_row(p, delta) (unsigned short *)((unsigned long)(p) + (delta) * vc->vc_size_row)
 | 
			
		||||
 
 | 
			
		||||
 static int fbcon_set_origin(struct vc_data *);
 | 
			
		||||
@@ -347,6 +355,18 @@ static int get_color(struct vc_data *vc,
 | 
			
		||||
 	return color;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+static void fbcon_update_softback(struct vc_data *vc)
 | 
			
		||||
+{
 | 
			
		||||
+	int l = fbcon_softback_size / vc->vc_size_row;
 | 
			
		||||
+
 | 
			
		||||
+	if (l > 5)
 | 
			
		||||
+		softback_end = softback_buf + l * vc->vc_size_row;
 | 
			
		||||
+	else
 | 
			
		||||
+		/* Smaller scrollback makes no sense, and 0 would screw
 | 
			
		||||
+		   the operation totally */
 | 
			
		||||
+		softback_top = 0;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 static void fb_flashcursor(struct work_struct *work)
 | 
			
		||||
 {
 | 
			
		||||
 	struct fbcon_ops *ops = container_of(work, struct fbcon_ops, cursor_work.work);
 | 
			
		||||
@@ -379,7 +399,7 @@ static void fb_flashcursor(struct work_s
 | 
			
		||||
 	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		||||
 	mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
 | 
			
		||||
 		CM_ERASE : CM_DRAW;
 | 
			
		||||
-	ops->cursor(vc, info, mode, 0, get_color(vc, info, c, 1),
 | 
			
		||||
+	ops->cursor(vc, info, mode, softback_lines, get_color(vc, info, c, 1),
 | 
			
		||||
 		    get_color(vc, info, c, 0));
 | 
			
		||||
 	console_unlock();
 | 
			
		||||
 
 | 
			
		||||
@@ -419,7 +439,13 @@ static int __init fb_console_setup(char
 | 
			
		||||
 		}
 | 
			
		||||
 		
 | 
			
		||||
 		if (!strncmp(options, "scrollback:", 11)) {
 | 
			
		||||
-			pr_warn("Ignoring scrollback size option\n");
 | 
			
		||||
+			options += 11;
 | 
			
		||||
+			if (*options) {
 | 
			
		||||
+				fbcon_softback_size = simple_strtoul(options, &options, 0);
 | 
			
		||||
+				if (*options == 'k' || *options == 'K') {
 | 
			
		||||
+					fbcon_softback_size *= 1024;
 | 
			
		||||
+				}
 | 
			
		||||
+			}
 | 
			
		||||
 			continue;
 | 
			
		||||
 		}
 | 
			
		||||
 		
 | 
			
		||||
@@ -959,6 +985,31 @@ static const char *fbcon_startup(void)
 | 
			
		||||
 
 | 
			
		||||
 	set_blitting_type(vc, info);
 | 
			
		||||
 
 | 
			
		||||
+	if (info->fix.type != FB_TYPE_TEXT) {
 | 
			
		||||
+		if (fbcon_softback_size) {
 | 
			
		||||
+			if (!softback_buf) {
 | 
			
		||||
+				softback_buf =
 | 
			
		||||
+				    (unsigned long)
 | 
			
		||||
+				    kvmalloc(fbcon_softback_size,
 | 
			
		||||
+					    GFP_KERNEL);
 | 
			
		||||
+				if (!softback_buf) {
 | 
			
		||||
+					fbcon_softback_size = 0;
 | 
			
		||||
+					softback_top = 0;
 | 
			
		||||
+				}
 | 
			
		||||
+			}
 | 
			
		||||
+		} else {
 | 
			
		||||
+			if (softback_buf) {
 | 
			
		||||
+				kvfree((void *) softback_buf);
 | 
			
		||||
+				softback_buf = 0;
 | 
			
		||||
+				softback_top = 0;
 | 
			
		||||
+			}
 | 
			
		||||
+		}
 | 
			
		||||
+		if (softback_buf)
 | 
			
		||||
+			softback_in = softback_top = softback_curr =
 | 
			
		||||
+			    softback_buf;
 | 
			
		||||
+		softback_lines = 0;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
 	/* Setup default font */
 | 
			
		||||
 	if (!p->fontdata && !vc->vc_font.data) {
 | 
			
		||||
 		if (!fontname[0] || !(font = find_font(fontname)))
 | 
			
		||||
@@ -1129,6 +1180,9 @@ static void fbcon_init(struct vc_data *v
 | 
			
		||||
 	if (logo)
 | 
			
		||||
 		fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows);
 | 
			
		||||
 
 | 
			
		||||
+	if (vc == svc && softback_buf)
 | 
			
		||||
+		fbcon_update_softback(vc);
 | 
			
		||||
+
 | 
			
		||||
 	if (ops->rotate_font && ops->rotate_font(info, vc)) {
 | 
			
		||||
 		ops->rotate = FB_ROTATE_UR;
 | 
			
		||||
 		set_blitting_type(vc, info);
 | 
			
		||||
@@ -1152,6 +1206,9 @@ static void fbcon_release_all(void)
 | 
			
		||||
 	struct fb_info *info;
 | 
			
		||||
 	int i, j, mapped;
 | 
			
		||||
 
 | 
			
		||||
+	kvfree((void *)softback_buf);
 | 
			
		||||
+	softback_buf = 0UL;
 | 
			
		||||
+
 | 
			
		||||
 	fbcon_for_each_registered_fb(i) {
 | 
			
		||||
 		mapped = 0;
 | 
			
		||||
 		info = fbcon_registered_fb[i];
 | 
			
		||||
@@ -1312,6 +1369,7 @@ static void fbcon_cursor(struct vc_data
 | 
			
		||||
 {
 | 
			
		||||
 	struct fb_info *info = fbcon_info_from_console(vc->vc_num);
 | 
			
		||||
 	struct fbcon_ops *ops = info->fbcon_par;
 | 
			
		||||
+	int y;
 | 
			
		||||
  	int c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		||||
 
 | 
			
		||||
 	ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
 | 
			
		||||
@@ -1325,11 +1383,19 @@ static void fbcon_cursor(struct vc_data
 | 
			
		||||
 		fbcon_add_cursor_work(info);
 | 
			
		||||
 
 | 
			
		||||
 	ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
 | 
			
		||||
+	if (mode & CM_SOFTBACK) {
 | 
			
		||||
+		mode &= ~CM_SOFTBACK;
 | 
			
		||||
+		y = softback_lines;
 | 
			
		||||
+	} else {
 | 
			
		||||
+		if (softback_lines)
 | 
			
		||||
+			fbcon_set_origin(vc);
 | 
			
		||||
+		y = 0;
 | 
			
		||||
+	}
 | 
			
		||||
 
 | 
			
		||||
 	if (!ops->cursor)
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
-	ops->cursor(vc, info, mode, 0, get_color(vc, info, c, 1),
 | 
			
		||||
+	ops->cursor(vc, info, mode, y, get_color(vc, info, c, 1),
 | 
			
		||||
 		    get_color(vc, info, c, 0));
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -1399,6 +1465,8 @@ static void fbcon_set_disp(struct fb_inf
 | 
			
		||||
 
 | 
			
		||||
 	if (con_is_visible(vc)) {
 | 
			
		||||
 		update_screen(vc);
 | 
			
		||||
+		if (softback_buf)
 | 
			
		||||
+			fbcon_update_softback(vc);
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -1536,6 +1604,99 @@ static __inline__ void ypan_down_redraw(
 | 
			
		||||
 	scrollback_current = 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+static void fbcon_redraw_softback(struct vc_data *vc, struct fbcon_display *p,
 | 
			
		||||
+				  long delta)
 | 
			
		||||
+{
 | 
			
		||||
+	int count = vc->vc_rows;
 | 
			
		||||
+	unsigned short *d, *s;
 | 
			
		||||
+	unsigned long n;
 | 
			
		||||
+	int line = 0;
 | 
			
		||||
+
 | 
			
		||||
+	d = (u16 *) softback_curr;
 | 
			
		||||
+	if (d == (u16 *) softback_in)
 | 
			
		||||
+		d = (u16 *) vc->vc_origin;
 | 
			
		||||
+	n = softback_curr + delta * vc->vc_size_row;
 | 
			
		||||
+	softback_lines -= delta;
 | 
			
		||||
+	if (delta < 0) {
 | 
			
		||||
+		if (softback_curr < softback_top && n < softback_buf) {
 | 
			
		||||
+			n += softback_end - softback_buf;
 | 
			
		||||
+			if (n < softback_top) {
 | 
			
		||||
+				softback_lines -=
 | 
			
		||||
+				    (softback_top - n) / vc->vc_size_row;
 | 
			
		||||
+				n = softback_top;
 | 
			
		||||
+			}
 | 
			
		||||
+		} else if (softback_curr >= softback_top
 | 
			
		||||
+			   && n < softback_top) {
 | 
			
		||||
+			softback_lines -=
 | 
			
		||||
+			    (softback_top - n) / vc->vc_size_row;
 | 
			
		||||
+			n = softback_top;
 | 
			
		||||
+		}
 | 
			
		||||
+	} else {
 | 
			
		||||
+		if (softback_curr > softback_in && n >= softback_end) {
 | 
			
		||||
+			n += softback_buf - softback_end;
 | 
			
		||||
+			if (n > softback_in) {
 | 
			
		||||
+				n = softback_in;
 | 
			
		||||
+				softback_lines = 0;
 | 
			
		||||
+			}
 | 
			
		||||
+		} else if (softback_curr <= softback_in && n > softback_in) {
 | 
			
		||||
+			n = softback_in;
 | 
			
		||||
+			softback_lines = 0;
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+	if (n == softback_curr)
 | 
			
		||||
+		return;
 | 
			
		||||
+	softback_curr = n;
 | 
			
		||||
+	s = (u16 *) softback_curr;
 | 
			
		||||
+	if (s == (u16 *) softback_in)
 | 
			
		||||
+		s = (u16 *) vc->vc_origin;
 | 
			
		||||
+	while (count--) {
 | 
			
		||||
+		unsigned short *start;
 | 
			
		||||
+		unsigned short *le;
 | 
			
		||||
+		unsigned short c;
 | 
			
		||||
+		int x = 0;
 | 
			
		||||
+		unsigned short attr = 1;
 | 
			
		||||
+
 | 
			
		||||
+		start = s;
 | 
			
		||||
+		le = advance_row(s, 1);
 | 
			
		||||
+		do {
 | 
			
		||||
+			c = scr_readw(s);
 | 
			
		||||
+			if (attr != (c & 0xff00)) {
 | 
			
		||||
+				attr = c & 0xff00;
 | 
			
		||||
+				if (s > start) {
 | 
			
		||||
+					fbcon_putcs(vc, start, s - start,
 | 
			
		||||
+						    line, x);
 | 
			
		||||
+					x += s - start;
 | 
			
		||||
+					start = s;
 | 
			
		||||
+				}
 | 
			
		||||
+			}
 | 
			
		||||
+			if (c == scr_readw(d)) {
 | 
			
		||||
+				if (s > start) {
 | 
			
		||||
+					fbcon_putcs(vc, start, s - start,
 | 
			
		||||
+						    line, x);
 | 
			
		||||
+					x += s - start + 1;
 | 
			
		||||
+					start = s + 1;
 | 
			
		||||
+				} else {
 | 
			
		||||
+					x++;
 | 
			
		||||
+					start++;
 | 
			
		||||
+				}
 | 
			
		||||
+			}
 | 
			
		||||
+			s++;
 | 
			
		||||
+			d++;
 | 
			
		||||
+		} while (s < le);
 | 
			
		||||
+		if (s > start)
 | 
			
		||||
+			fbcon_putcs(vc, start, s - start, line, x);
 | 
			
		||||
+		line++;
 | 
			
		||||
+		if (d == (u16 *) softback_end)
 | 
			
		||||
+			d = (u16 *) softback_buf;
 | 
			
		||||
+		if (d == (u16 *) softback_in)
 | 
			
		||||
+			d = (u16 *) vc->vc_origin;
 | 
			
		||||
+		if (s == (u16 *) softback_end)
 | 
			
		||||
+			s = (u16 *) softback_buf;
 | 
			
		||||
+		if (s == (u16 *) softback_in)
 | 
			
		||||
+			s = (u16 *) vc->vc_origin;
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 static void fbcon_redraw_move(struct vc_data *vc, struct fbcon_display *p,
 | 
			
		||||
 			      int line, int count, int dy)
 | 
			
		||||
 {
 | 
			
		||||
@@ -1740,6 +1901,31 @@ static void fbcon_bmove(struct vc_data *
 | 
			
		||||
 			p->vrows - p->yscroll);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+static inline void fbcon_softback_note(struct vc_data *vc, int t,
 | 
			
		||||
+				       int count)
 | 
			
		||||
+{
 | 
			
		||||
+	unsigned short *p;
 | 
			
		||||
+
 | 
			
		||||
+	if (vc->vc_num != fg_console)
 | 
			
		||||
+		return;
 | 
			
		||||
+	p = (unsigned short *) (vc->vc_origin + t * vc->vc_size_row);
 | 
			
		||||
+
 | 
			
		||||
+	while (count) {
 | 
			
		||||
+		scr_memcpyw((u16 *) softback_in, p, vc->vc_size_row);
 | 
			
		||||
+		count--;
 | 
			
		||||
+		p = advance_row(p, 1);
 | 
			
		||||
+		softback_in += vc->vc_size_row;
 | 
			
		||||
+		if (softback_in == softback_end)
 | 
			
		||||
+			softback_in = softback_buf;
 | 
			
		||||
+		if (softback_in == softback_top) {
 | 
			
		||||
+			softback_top += vc->vc_size_row;
 | 
			
		||||
+			if (softback_top == softback_end)
 | 
			
		||||
+				softback_top = softback_buf;
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+	softback_curr = softback_in;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
 | 
			
		||||
 		enum con_scroll dir, unsigned int count)
 | 
			
		||||
 {
 | 
			
		||||
@@ -1762,6 +1948,8 @@ static bool fbcon_scroll(struct vc_data
 | 
			
		||||
 	case SM_UP:
 | 
			
		||||
 		if (count > vc->vc_rows)	/* Maximum realistic size */
 | 
			
		||||
 			count = vc->vc_rows;
 | 
			
		||||
+		if (softback_top)
 | 
			
		||||
+			fbcon_softback_note(vc, t, count);
 | 
			
		||||
 		switch (fb_scrollmode(p)) {
 | 
			
		||||
 		case SCROLL_MOVE:
 | 
			
		||||
 			fbcon_redraw_blit(vc, info, p, t, b - t - count,
 | 
			
		||||
@@ -2076,6 +2264,14 @@ static int fbcon_switch(struct vc_data *
 | 
			
		||||
 	info = fbcon_info_from_console(vc->vc_num);
 | 
			
		||||
 	ops = info->fbcon_par;
 | 
			
		||||
 
 | 
			
		||||
+	if (softback_top) {
 | 
			
		||||
+		if (softback_lines)
 | 
			
		||||
+			fbcon_set_origin(vc);
 | 
			
		||||
+		softback_top = softback_curr = softback_in = softback_buf;
 | 
			
		||||
+		softback_lines = 0;
 | 
			
		||||
+		fbcon_update_softback(vc);
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
 	if (logo_shown >= 0) {
 | 
			
		||||
 		struct vc_data *conp2 = vc_cons[logo_shown].d;
 | 
			
		||||
 
 | 
			
		||||
@@ -2406,6 +2602,9 @@ static int fbcon_do_set_font(struct vc_d
 | 
			
		||||
 	int resize;
 | 
			
		||||
 	char *old_data = NULL;
 | 
			
		||||
 
 | 
			
		||||
+	if (con_is_visible(vc) && softback_lines)
 | 
			
		||||
+		fbcon_set_origin(vc);
 | 
			
		||||
+
 | 
			
		||||
 	resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);
 | 
			
		||||
 	if (p->userfont)
 | 
			
		||||
 		old_data = vc->vc_font.data;
 | 
			
		||||
@@ -2436,6 +2635,8 @@ static int fbcon_do_set_font(struct vc_d
 | 
			
		||||
 		ret = vc_resize(vc, cols, rows);
 | 
			
		||||
 		if (ret)
 | 
			
		||||
 			goto err_out;
 | 
			
		||||
+		if (con_is_visible(vc) && softback_buf)
 | 
			
		||||
+			fbcon_update_softback(vc);
 | 
			
		||||
 	} else if (con_is_visible(vc)
 | 
			
		||||
 		   && vc->vc_mode == KD_TEXT) {
 | 
			
		||||
 		fbcon_clear_margins(vc, 0);
 | 
			
		||||
@@ -2582,7 +2783,19 @@ static void fbcon_set_palette(struct vc_
 | 
			
		||||
 
 | 
			
		||||
 static u16 *fbcon_screen_pos(const struct vc_data *vc, int offset)
 | 
			
		||||
 {
 | 
			
		||||
-	return (u16 *) (vc->vc_origin + offset);
 | 
			
		||||
+	unsigned long p;
 | 
			
		||||
+	int line;
 | 
			
		||||
+	
 | 
			
		||||
+	if (vc->vc_num != fg_console || !softback_lines)
 | 
			
		||||
+		return (u16 *) (vc->vc_origin + offset);
 | 
			
		||||
+	line = offset / vc->vc_size_row;
 | 
			
		||||
+	if (line >= softback_lines)
 | 
			
		||||
+		return (u16 *) (vc->vc_origin + offset -
 | 
			
		||||
+				softback_lines * vc->vc_size_row);
 | 
			
		||||
+	p = softback_curr + offset;
 | 
			
		||||
+	if (p >= softback_end)
 | 
			
		||||
+		p += softback_buf - softback_end;
 | 
			
		||||
+	return (u16 *) p;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
 | 
			
		||||
@@ -2596,7 +2809,22 @@ static unsigned long fbcon_getxy(struct
 | 
			
		||||
 
 | 
			
		||||
 		x = offset % vc->vc_cols;
 | 
			
		||||
 		y = offset / vc->vc_cols;
 | 
			
		||||
+		if (vc->vc_num == fg_console)
 | 
			
		||||
+			y += softback_lines;
 | 
			
		||||
+		ret = pos + (vc->vc_cols - x) * 2;
 | 
			
		||||
+	} else if (vc->vc_num == fg_console && softback_lines) {
 | 
			
		||||
+		unsigned long offset = pos - softback_curr;
 | 
			
		||||
+
 | 
			
		||||
+		if (pos < softback_curr)
 | 
			
		||||
+			offset += softback_end - softback_buf;
 | 
			
		||||
+		offset /= 2;
 | 
			
		||||
+		x = offset % vc->vc_cols;
 | 
			
		||||
+		y = offset / vc->vc_cols;
 | 
			
		||||
 		ret = pos + (vc->vc_cols - x) * 2;
 | 
			
		||||
+		if (ret == softback_end)
 | 
			
		||||
+			ret = softback_buf;
 | 
			
		||||
+		if (ret == softback_in)
 | 
			
		||||
+			ret = vc->vc_origin;
 | 
			
		||||
 	} else {
 | 
			
		||||
 		/* Should not happen */
 | 
			
		||||
 		x = y = 0;
 | 
			
		||||
@@ -2624,11 +2852,106 @@ static void fbcon_invert_region(struct v
 | 
			
		||||
 			a = ((a) & 0x88ff) | (((a) & 0x7000) >> 4) |
 | 
			
		||||
 			    (((a) & 0x0700) << 4);
 | 
			
		||||
 		scr_writew(a, p++);
 | 
			
		||||
+		if (p == (u16 *) softback_end)
 | 
			
		||||
+			p = (u16 *) softback_buf;
 | 
			
		||||
+		if (p == (u16 *) softback_in)
 | 
			
		||||
+			p = (u16 *) vc->vc_origin;
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static void fbcon_scrolldelta(struct vc_data *vc, int lines)
 | 
			
		||||
+{
 | 
			
		||||
+	struct fb_info *info = registered_fb[con2fb_map[fg_console]];
 | 
			
		||||
+	struct fbcon_ops *ops = info->fbcon_par;
 | 
			
		||||
+	struct fbcon_display *disp = &fb_display[fg_console];
 | 
			
		||||
+	int offset, limit, scrollback_old;
 | 
			
		||||
+
 | 
			
		||||
+	if (softback_top) {
 | 
			
		||||
+		if (vc->vc_num != fg_console)
 | 
			
		||||
+			return;
 | 
			
		||||
+		if (vc->vc_mode != KD_TEXT || !lines)
 | 
			
		||||
+			return;
 | 
			
		||||
+		if (logo_shown >= 0) {
 | 
			
		||||
+			struct vc_data *conp2 = vc_cons[logo_shown].d;
 | 
			
		||||
+
 | 
			
		||||
+			if (conp2->vc_top == logo_lines
 | 
			
		||||
+			    && conp2->vc_bottom == conp2->vc_rows)
 | 
			
		||||
+				conp2->vc_top = 0;
 | 
			
		||||
+			if (logo_shown == vc->vc_num) {
 | 
			
		||||
+				unsigned long p, q;
 | 
			
		||||
+				int i;
 | 
			
		||||
+
 | 
			
		||||
+				p = softback_in;
 | 
			
		||||
+				q = vc->vc_origin +
 | 
			
		||||
+				    logo_lines * vc->vc_size_row;
 | 
			
		||||
+				for (i = 0; i < logo_lines; i++) {
 | 
			
		||||
+					if (p == softback_top)
 | 
			
		||||
+						break;
 | 
			
		||||
+					if (p == softback_buf)
 | 
			
		||||
+						p = softback_end;
 | 
			
		||||
+					p -= vc->vc_size_row;
 | 
			
		||||
+					q -= vc->vc_size_row;
 | 
			
		||||
+					scr_memcpyw((u16 *) q, (u16 *) p,
 | 
			
		||||
+						    vc->vc_size_row);
 | 
			
		||||
+				}
 | 
			
		||||
+				softback_in = softback_curr = p;
 | 
			
		||||
+				update_region(vc, vc->vc_origin,
 | 
			
		||||
+					      logo_lines * vc->vc_cols);
 | 
			
		||||
+			}
 | 
			
		||||
+			logo_shown = FBCON_LOGO_CANSHOW;
 | 
			
		||||
+		}
 | 
			
		||||
+		fbcon_cursor(vc, CM_ERASE | CM_SOFTBACK);
 | 
			
		||||
+		fbcon_redraw_softback(vc, disp, lines);
 | 
			
		||||
+		fbcon_cursor(vc, CM_DRAW | CM_SOFTBACK);
 | 
			
		||||
+		return;
 | 
			
		||||
 	}
 | 
			
		||||
+
 | 
			
		||||
+	if (!scrollback_phys_max)
 | 
			
		||||
+		return;
 | 
			
		||||
+
 | 
			
		||||
+	scrollback_old = scrollback_current;
 | 
			
		||||
+	scrollback_current -= lines;
 | 
			
		||||
+	if (scrollback_current < 0)
 | 
			
		||||
+		scrollback_current = 0;
 | 
			
		||||
+	else if (scrollback_current > scrollback_max)
 | 
			
		||||
+		scrollback_current = scrollback_max;
 | 
			
		||||
+	if (scrollback_current == scrollback_old)
 | 
			
		||||
+		return;
 | 
			
		||||
+
 | 
			
		||||
+	if (fbcon_is_inactive(vc, info))
 | 
			
		||||
+		return;
 | 
			
		||||
+
 | 
			
		||||
+	fbcon_cursor(vc, CM_ERASE);
 | 
			
		||||
+
 | 
			
		||||
+	offset = disp->yscroll - scrollback_current;
 | 
			
		||||
+	limit = disp->vrows;
 | 
			
		||||
+	switch (disp->scrollmode) {
 | 
			
		||||
+	case SCROLL_WRAP_MOVE:
 | 
			
		||||
+		info->var.vmode |= FB_VMODE_YWRAP;
 | 
			
		||||
+		break;
 | 
			
		||||
+	case SCROLL_PAN_MOVE:
 | 
			
		||||
+	case SCROLL_PAN_REDRAW:
 | 
			
		||||
+		limit -= vc->vc_rows;
 | 
			
		||||
+		info->var.vmode &= ~FB_VMODE_YWRAP;
 | 
			
		||||
+		break;
 | 
			
		||||
+	}
 | 
			
		||||
+	if (offset < 0)
 | 
			
		||||
+		offset += limit;
 | 
			
		||||
+	else if (offset >= limit)
 | 
			
		||||
+		offset -= limit;
 | 
			
		||||
+
 | 
			
		||||
+	ops->var.xoffset = 0;
 | 
			
		||||
+	ops->var.yoffset = offset * vc->vc_font.height;
 | 
			
		||||
+	ops->update_start(info);
 | 
			
		||||
+
 | 
			
		||||
+	if (!scrollback_current)
 | 
			
		||||
+		fbcon_cursor(vc, CM_DRAW);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static int fbcon_set_origin(struct vc_data *vc)
 | 
			
		||||
 {
 | 
			
		||||
+	if (softback_lines)
 | 
			
		||||
+		fbcon_scrolldelta(vc, softback_lines);
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -2692,6 +3015,8 @@ static void fbcon_modechanged(struct fb_
 | 
			
		||||
 
 | 
			
		||||
 		fbcon_set_palette(vc, color_table);
 | 
			
		||||
 		update_screen(vc);
 | 
			
		||||
+		if (softback_buf)
 | 
			
		||||
+			fbcon_update_softback(vc);
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -3154,6 +3479,7 @@ static const struct consw fb_con = {
 | 
			
		||||
 	.con_font_get 		= fbcon_get_font,
 | 
			
		||||
 	.con_font_default	= fbcon_set_def_font,
 | 
			
		||||
 	.con_set_palette 	= fbcon_set_palette,
 | 
			
		||||
+	.con_scrolldelta 	= fbcon_scrolldelta,
 | 
			
		||||
 	.con_set_origin 	= fbcon_set_origin,
 | 
			
		||||
 	.con_invert_region 	= fbcon_invert_region,
 | 
			
		||||
 	.con_screen_pos 	= fbcon_screen_pos,
 | 
			
		||||
							
								
								
									
										1231
									
								
								sys-kernel/pinephone-sources/files/5.19.10-11.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1231
									
								
								sys-kernel/pinephone-sources/files/5.19.10-11.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										9776
									
								
								sys-kernel/pinephone-sources/files/5.19.11-12.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9776
									
								
								sys-kernel/pinephone-sources/files/5.19.11-12.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										8234
									
								
								sys-kernel/pinephone-sources/files/5.19.8-9.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8234
									
								
								sys-kernel/pinephone-sources/files/5.19.8-9.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1723
									
								
								sys-kernel/pinephone-sources/files/5.19.9-10.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1723
									
								
								sys-kernel/pinephone-sources/files/5.19.9-10.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										6942
									
								
								sys-kernel/pinephone-sources/files/config-ppp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										6942
									
								
								sys-kernel/pinephone-sources/files/config-ppp
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										6723
									
								
								sys-kernel/pinephone-sources/files/config-ppp-old
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6723
									
								
								sys-kernel/pinephone-sources/files/config-ppp-old
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										8
									
								
								sys-kernel/pinephone-sources/files/dracut-ppp.conf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										8
									
								
								sys-kernel/pinephone-sources/files/dracut-ppp.conf
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
# load kernel modules that's needed to run accelarated osk SDL
 | 
			
		||||
force_drivers+=" lima gpu_sched evdev rockchipdrm panel_simple pwm_bl "
 | 
			
		||||
# pmic
 | 
			
		||||
force_drivers+=" axp20x-pek axp20x_adc "
 | 
			
		||||
# force feedback
 | 
			
		||||
force_drivers+=" gpio-vibra "
 | 
			
		||||
# encryption module
 | 
			
		||||
force_drivers+=" crc-t10dif "
 | 
			
		||||
@@ -1,176 +0,0 @@
 | 
			
		||||
From d1d849cae12db71aa81ceedaedc1b17a34790367 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Samuel Holland <samuel@sholland.org>
 | 
			
		||||
Date: Sat, 19 Jun 2021 18:36:05 -0500
 | 
			
		||||
Subject: [PATCH] Input: kb151 - Add a driver for the KB151 keyboard
 | 
			
		||||
 | 
			
		||||
This keyboard is found in the official Pine64 PinePhone keyboard case.
 | 
			
		||||
It is connected over I2C and runs a libre firmware.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
 | 
			
		||||
---
 | 
			
		||||
 .../dts/allwinner/sun50i-a64-pinephone.dtsi   |  64 +++++
 | 
			
		||||
 drivers/input/keyboard/Kconfig                |  10 +
 | 
			
		||||
 drivers/input/keyboard/Makefile               |   1 +
 | 
			
		||||
 drivers/input/keyboard/kb151.c                | 246 ++++++++++++++++++
 | 
			
		||||
 4 files changed, 321 insertions(+)
 | 
			
		||||
 create mode 100644 drivers/input/keyboard/kb151.c
 | 
			
		||||
 | 
			
		||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
 | 
			
		||||
index 4ede9fe66020c..0bdc6eceec609 100644
 | 
			
		||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
 | 
			
		||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
 | 
			
		||||
@@ -551,6 +551,70 @@
 | 
			
		||||
 /* Connected to pogo pins (external spring based pinheader for user addons) */
 | 
			
		||||
 &i2c2 {
 | 
			
		||||
 	status = "okay";
 | 
			
		||||
+
 | 
			
		||||
+	keyboard@15 {
 | 
			
		||||
+		compatible = "pine64,kb151";
 | 
			
		||||
+		reg = <0x15>;
 | 
			
		||||
+		interrupt-parent = <&r_pio>;
 | 
			
		||||
+		interrupts = <0 12 IRQ_TYPE_EDGE_FALLING>; /* PL12 */
 | 
			
		||||
+		keypad,num-rows = <6>;
 | 
			
		||||
+		keypad,num-columns = <12>;
 | 
			
		||||
+		linux,keymap = <MATRIX_KEY(0,  0, KEY_ESC)
 | 
			
		||||
+				MATRIX_KEY(0,  1, KEY_1)
 | 
			
		||||
+				MATRIX_KEY(0,  2, KEY_2)
 | 
			
		||||
+				MATRIX_KEY(0,  3, KEY_3)
 | 
			
		||||
+				MATRIX_KEY(0,  4, KEY_4)
 | 
			
		||||
+				MATRIX_KEY(0,  5, KEY_5)
 | 
			
		||||
+				MATRIX_KEY(0,  6, KEY_6)
 | 
			
		||||
+				MATRIX_KEY(0,  7, KEY_7)
 | 
			
		||||
+				MATRIX_KEY(0,  8, KEY_8)
 | 
			
		||||
+				MATRIX_KEY(0,  9, KEY_9)
 | 
			
		||||
+				MATRIX_KEY(0, 10, KEY_0)
 | 
			
		||||
+				MATRIX_KEY(0, 11, KEY_BACKSPACE)
 | 
			
		||||
+				MATRIX_KEY(1,  0, KEY_TAB)
 | 
			
		||||
+				MATRIX_KEY(1,  1, KEY_Q)
 | 
			
		||||
+				MATRIX_KEY(1,  2, KEY_W)
 | 
			
		||||
+				MATRIX_KEY(1,  3, KEY_E)
 | 
			
		||||
+				MATRIX_KEY(1,  4, KEY_R)
 | 
			
		||||
+				MATRIX_KEY(1,  5, KEY_T)
 | 
			
		||||
+				MATRIX_KEY(1,  6, KEY_Y)
 | 
			
		||||
+				MATRIX_KEY(1,  7, KEY_U)
 | 
			
		||||
+				MATRIX_KEY(1,  8, KEY_I)
 | 
			
		||||
+				MATRIX_KEY(1,  9, KEY_O)
 | 
			
		||||
+				MATRIX_KEY(1, 10, KEY_P)
 | 
			
		||||
+				MATRIX_KEY(1, 11, KEY_ENTER)
 | 
			
		||||
+				MATRIX_KEY(2,  0, KEY_LEFTMETA)
 | 
			
		||||
+				MATRIX_KEY(2,  1, KEY_A)
 | 
			
		||||
+				MATRIX_KEY(2,  2, KEY_S)
 | 
			
		||||
+				MATRIX_KEY(2,  3, KEY_D)
 | 
			
		||||
+				MATRIX_KEY(2,  4, KEY_F)
 | 
			
		||||
+				MATRIX_KEY(2,  5, KEY_G)
 | 
			
		||||
+				MATRIX_KEY(2,  6, KEY_H)
 | 
			
		||||
+				MATRIX_KEY(2,  7, KEY_J)
 | 
			
		||||
+				MATRIX_KEY(2,  8, KEY_K)
 | 
			
		||||
+				MATRIX_KEY(2,  9, KEY_L)
 | 
			
		||||
+				MATRIX_KEY(2, 10, KEY_SEMICOLON)
 | 
			
		||||
+				MATRIX_KEY(3,  0, KEY_LEFTSHIFT)
 | 
			
		||||
+				MATRIX_KEY(3,  1, KEY_Z)
 | 
			
		||||
+				MATRIX_KEY(3,  2, KEY_X)
 | 
			
		||||
+				MATRIX_KEY(3,  3, KEY_C)
 | 
			
		||||
+				MATRIX_KEY(3,  4, KEY_V)
 | 
			
		||||
+				MATRIX_KEY(3,  5, KEY_B)
 | 
			
		||||
+				MATRIX_KEY(3,  6, KEY_N)
 | 
			
		||||
+				MATRIX_KEY(3,  7, KEY_M)
 | 
			
		||||
+				MATRIX_KEY(3,  8, KEY_COMMA)
 | 
			
		||||
+				MATRIX_KEY(3,  9, KEY_DOT)
 | 
			
		||||
+				MATRIX_KEY(3, 10, KEY_SLASH)
 | 
			
		||||
+				MATRIX_KEY(4,  1, KEY_LEFTCTRL)
 | 
			
		||||
+				MATRIX_KEY(4,  4, KEY_SPACE)
 | 
			
		||||
+				MATRIX_KEY(4,  6, KEY_APOSTROPHE)
 | 
			
		||||
+				MATRIX_KEY(4,  8, KEY_RIGHTBRACE)
 | 
			
		||||
+				MATRIX_KEY(4,  9, KEY_LEFTBRACE)
 | 
			
		||||
+				MATRIX_KEY(5,  2, KEY_FN)
 | 
			
		||||
+				MATRIX_KEY(5,  3, KEY_LEFTALT)
 | 
			
		||||
+				MATRIX_KEY(5,  5, KEY_RIGHTALT)>;
 | 
			
		||||
+		wakeup-source;
 | 
			
		||||
+	};
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 &i2s2 {
 | 
			
		||||
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
 | 
			
		||||
index 40a070a2e7f5b..0259e9133f469 100644
 | 
			
		||||
--- a/drivers/input/keyboard/Kconfig
 | 
			
		||||
+++ b/drivers/input/keyboard/Kconfig
 | 
			
		||||
@@ -353,6 +353,16 @@ config KEYBOARD_HP7XX
 | 
			
		||||
 	  To compile this driver as a module, choose M here: the
 | 
			
		||||
 	  module will be called jornada720_kbd.
 | 
			
		||||
 
 | 
			
		||||
+config KEYBOARD_KB151
 | 
			
		||||
+	tristate "Pine64 KB151 Keyboard"
 | 
			
		||||
+	depends on I2C
 | 
			
		||||
+	select CRC8
 | 
			
		||||
+	select INPUT_MATRIXKMAP
 | 
			
		||||
+	help
 | 
			
		||||
+	  Say Y here to enable support for the KB151 keyboard used in the
 | 
			
		||||
+	  Pine64 PinePhone keyboard case. This driver supports the FLOSS
 | 
			
		||||
+	  firmware available at https://megous.com/git/pinephone-keyboard/
 | 
			
		||||
+
 | 
			
		||||
 config KEYBOARD_LM8323
 | 
			
		||||
 	tristate "LM8323 keypad chip"
 | 
			
		||||
 	depends on I2C
 | 
			
		||||
From 2423aac2d6f5db55da99e11fd799ee66fe6f54c6 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Samuel Holland <samuel@sholland.org>
 | 
			
		||||
Date: Mon, 9 Aug 2021 19:30:18 -0500
 | 
			
		||||
Subject: [PATCH] Input: kb151 - Add support for the FN layer
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
 | 
			
		||||
---
 | 
			
		||||
 .../dts/allwinner/sun50i-a64-pinephone.dtsi   | 34 +++++++++++++++++--
 | 
			
		||||
 drivers/input/keyboard/kb151.c                | 33 ++++++++++--------
 | 
			
		||||
 2 files changed, 51 insertions(+), 16 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
 | 
			
		||||
index 0bdc6eceec609..68f5730cf164c 100644
 | 
			
		||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
 | 
			
		||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
 | 
			
		||||
@@ -557,7 +557,7 @@
 | 
			
		||||
 		reg = <0x15>;
 | 
			
		||||
 		interrupt-parent = <&r_pio>;
 | 
			
		||||
 		interrupts = <0 12 IRQ_TYPE_EDGE_FALLING>; /* PL12 */
 | 
			
		||||
-		keypad,num-rows = <6>;
 | 
			
		||||
+		keypad,num-rows = <12>;
 | 
			
		||||
 		keypad,num-columns = <12>;
 | 
			
		||||
 		linux,keymap = <MATRIX_KEY(0,  0, KEY_ESC)
 | 
			
		||||
 				MATRIX_KEY(0,  1, KEY_1)
 | 
			
		||||
@@ -612,7 +612,37 @@
 | 
			
		||||
 				MATRIX_KEY(4,  9, KEY_LEFTBRACE)
 | 
			
		||||
 				MATRIX_KEY(5,  2, KEY_FN)
 | 
			
		||||
 				MATRIX_KEY(5,  3, KEY_LEFTALT)
 | 
			
		||||
-				MATRIX_KEY(5,  5, KEY_RIGHTALT)>;
 | 
			
		||||
+				MATRIX_KEY(5,  5, KEY_RIGHTALT)
 | 
			
		||||
+
 | 
			
		||||
+				/* FN layer */
 | 
			
		||||
+				MATRIX_KEY(6,  1, KEY_BACKSLASH)
 | 
			
		||||
+				MATRIX_KEY(6,  2, KEY_BACKSLASH)
 | 
			
		||||
+				MATRIX_KEY(6,  3, KEY_DOLLAR)
 | 
			
		||||
+				MATRIX_KEY(6,  4, KEY_EURO)
 | 
			
		||||
+				MATRIX_KEY(6,  5, KEY_GRAVE)
 | 
			
		||||
+				MATRIX_KEY(6,  6, KEY_GRAVE)
 | 
			
		||||
+				MATRIX_KEY(6,  7, KEY_MINUS)
 | 
			
		||||
+				MATRIX_KEY(6,  8, KEY_EQUAL)
 | 
			
		||||
+				MATRIX_KEY(6,  9, KEY_MINUS)
 | 
			
		||||
+				MATRIX_KEY(6, 10, KEY_EQUAL)
 | 
			
		||||
+				MATRIX_KEY(6, 11, KEY_DELETE)
 | 
			
		||||
+
 | 
			
		||||
+				MATRIX_KEY(8,  0, KEY_SYSRQ)
 | 
			
		||||
+				MATRIX_KEY(8, 10, KEY_INSERT)
 | 
			
		||||
+
 | 
			
		||||
+				MATRIX_KEY(9,  0, KEY_LEFTSHIFT)
 | 
			
		||||
+				MATRIX_KEY(9,  8, KEY_HOME)
 | 
			
		||||
+				MATRIX_KEY(9,  9, KEY_UP)
 | 
			
		||||
+				MATRIX_KEY(9, 10, KEY_END)
 | 
			
		||||
+
 | 
			
		||||
+				MATRIX_KEY(10, 1, KEY_LEFTCTRL)
 | 
			
		||||
+				MATRIX_KEY(10, 6, KEY_LEFT)
 | 
			
		||||
+				MATRIX_KEY(10, 8, KEY_RIGHT)
 | 
			
		||||
+				MATRIX_KEY(10, 9, KEY_DOWN)
 | 
			
		||||
+
 | 
			
		||||
+				MATRIX_KEY(11, 2, KEY_FN)
 | 
			
		||||
+				MATRIX_KEY(11, 3, KEY_LEFTALT)
 | 
			
		||||
+				MATRIX_KEY(11, 5, KEY_RIGHTALT)>;
 | 
			
		||||
 		wakeup-source;
 | 
			
		||||
 	};
 | 
			
		||||
 };
 | 
			
		||||
		Reference in New Issue
	
	Block a user