[kernel/f17] Linux v3.8.1

Justin M. Forbes jforbes at fedoraproject.org
Mon Mar 4 06:11:50 UTC 2013


commit ec583c93beb38932497d03dba5cd90a391f64cff
Author: Justin M. Forbes <jforbes at redhat.com>
Date:   Mon Mar 4 00:05:01 2013 -0600

    Linux v3.8.1

 ...dd-support-for-atheros-04ca-3004-device-t.patch |   47 -
 8139cp-re-enable-interrupts-after-tx-timeout.patch |   29 -
 ...set-ring-address-before-enabling-receiver.patch |   64 -
 ...cp-set-ring-address-after-enabling-C-mode.patch |  100 -
 Makefile.config                                    |    9 +-
 USB-report-submission-of-active-URBs.patch         |   46 -
 acpi-debug-infinite-loop.patch                     |   25 +
 ....6-acpi-video-dos.patch => acpi-video-dos.patch |    0
 alps-v2-3.7.patch                                  | 2494 --------------------
 alps.patch                                         | 1405 +++++++++++
 arm-tegra-sdhci-module-fix.patch                   |    2 +-
 brcmsmac-updates-rhbz892428.patch                  |   28 -
 ...-2.6-compile-fixes.patch => compile-fixes.patch |    0
 config-arm-generic                                 |   13 +
 config-arm-kirkwood                                |   12 +-
 config-arm-omap                                    |   61 +-
 config-arm-tegra                                   |   19 +-
 config-armv7                                       |   82 +-
 config-generic                                     |   72 +-
 config-powerpc-generic                             |    7 +-
 config-s390x                                       |   21 +-
 config-sparc64-generic                             |  217 --
 config-x86-32-generic                              |    5 +
 config-x86-generic                                 |    3 +
 config-x86_64-generic                              |    4 +
 linux-2.6-crash-driver.patch => crash-driver.patch |    0
 ...s-acpi-video.patch => defaults-acpi-video.patch |    0
 dmar-disable-when-ricoh-multifunction.patch        |    2 +-
 drm-i915-lvds-reclock-fix.patch                    |   72 -
 exec-use-eloop-for-max-recursion-depth.patch       |  144 --
 ...sages.patch => input-kill-stupid-messages.patch |    0
 kernel.spec                                        |  158 +-
 linux-2.6-e1000-ich9-montevina.patch               |   46 -
 ...e-after_link.patch => makefile-after_link.patch |    0
 net-fix-infinite-loop-in-__skb_recv_datagram.patch |   53 -
 ...spkr-modalias.patch => no-pcspkr-modalias.patch |    0
 power-x86-destdir.patch                            |   35 -
 ...-2.6-serial-460800.patch => serial-460800.patch |    0
 ...blacklist.patch => silence-acpi-blacklist.patch |    0
 silence-brcmsmac-warning.patch                     |   14 -
 ...ce-fbcon-logo.patch => silence-fbcon-logo.patch |    0
 ...-2.6-silence-noise.patch => silence-noise.patch |    2 +-
 silence-tty-null.patch                             |   13 +
 sources                                            |    4 +-
 ...pstream-reverts.patch => upstream-reverts.patch |    0
 usb-cypress-supertop.patch                         |   38 -
 userns-avoid-recursion-in-put_user_ns.patch        |   53 +-
 47 files changed, 1785 insertions(+), 3614 deletions(-)
---
diff --git a/Makefile.config b/Makefile.config
index 2ac1fa9..015f834 100644
--- a/Makefile.config
+++ b/Makefile.config
@@ -14,10 +14,9 @@ CONFIGFILES	= \
 	$(CFG)-armv7l-omap.config $(CFG)-armv7hl-omap.config \
 	$(CFG)-armv7l-tegra.config $(CFG)-armv7hl-tegra.config \
 	$(CFG)-ppc.config $(CFG)-ppc-smp.config \
-	$(CFG)-sparc64.config  \
 	$(CFG)-ppc64.config $(CFG)-ppc64-debug.config
 
-PLATFORMS	= x86 x86_64 powerpc powerpc32 powerpc64 s390x sparc64 arm
+PLATFORMS	= x86 x86_64 powerpc powerpc32 powerpc64 s390x arm
 TEMPFILES	= $(addprefix temp-, $(addsuffix -generic, $(PLATFORMS)))
 
 configs: $(CONFIGFILES)
@@ -68,9 +67,6 @@ temp-x86_64-generic: temp-x86-64 temp-generic
 temp-x86_64-debug-generic: temp-x86-64 temp-debug-generic
 	perl merge.pl $^  > $@
 
-temp-sparc64-generic: config-sparc64-generic temp-generic
-	perl merge.pl $^  > $@
-
 temp-powerpc-generic: config-powerpc-generic temp-generic
 	perl merge.pl $^  > $@
 
@@ -101,9 +97,6 @@ kernel-$(VERSION)-x86_64.config: /dev/null temp-x86_64-generic
 kernel-$(VERSION)-x86_64-debug.config: /dev/null temp-x86_64-debug-generic
 	perl merge.pl $^ x86_64 > $@
 
-kernel-$(VERSION)-sparc64.config: /dev/null temp-sparc64-generic
-	perl merge.pl $^ sparc64 > $@
-
 kernel-$(VERSION)-ppc64.config: config-powerpc64 temp-powerpc-generic
 	perl merge.pl $^ powerpc > $@
 
diff --git a/acpi-debug-infinite-loop.patch b/acpi-debug-infinite-loop.patch
new file mode 100644
index 0000000..f2cc1a5
--- /dev/null
+++ b/acpi-debug-infinite-loop.patch
@@ -0,0 +1,25 @@
+--- linux-2.6.34.noarch/include/acpi/acconfig.h~	2010-07-01 14:49:03.000000000 -0400
++++ linux-2.6.34.noarch/include/acpi/acconfig.h		2010-07-01 14:49:17.000000000 -0400
+@@ -117,7 +117,7 @@
+ 
+ /* Maximum number of While() loop iterations before forced abort */
+ 
+-#define ACPI_MAX_LOOP_ITERATIONS        0xFFFF
++#define ACPI_MAX_LOOP_ITERATIONS        0xFFFFFF
+ 
+ /* Maximum sleep allowed via Sleep() operator */
+ 
+--- a/drivers/acpi/acpica/dscontrol.c
++++ b/drivers/acpi/acpica/dscontrol.c
+@@ -212,6 +212,11 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
+ 			 * loop does not implement a timeout.
+ 			 */
+ 			control_state->control.loop_count++;
++			if ((control_state->control.loop_count > 1) &&
++			    (control_state->control.loop_count % 0xffff == 0))
++				printk("ACPI: While loop taking a really long time. loop_count=0x%x\n",
++				       control_state->control.loop_count);
++
+ 			if (control_state->control.loop_count >
+ 			    ACPI_MAX_LOOP_ITERATIONS) {
+ 				status = AE_AML_INFINITE_LOOP;
diff --git a/linux-2.6-acpi-video-dos.patch b/acpi-video-dos.patch
similarity index 100%
rename from linux-2.6-acpi-video-dos.patch
rename to acpi-video-dos.patch
diff --git a/alps.patch b/alps.patch
new file mode 100644
index 0000000..83d3cfe
--- /dev/null
+++ b/alps.patch
@@ -0,0 +1,1405 @@
+diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
+index e229fa3..7b99fc7 100644
+--- a/drivers/input/mouse/alps.c
++++ b/drivers/input/mouse/alps.c
+@@ -27,14 +27,11 @@
+ /*
+  * Definitions for ALPS version 3 and 4 command mode protocol
+  */
+-#define ALPS_V3_X_MAX	2000
+-#define ALPS_V3_Y_MAX	1400
+-
+-#define ALPS_BITMAP_X_BITS	15
+-#define ALPS_BITMAP_Y_BITS	11
+-
+ #define ALPS_CMD_NIBBLE_10	0x01f2
+ 
++#define ALPS_REG_BASE_RUSHMORE	0xc2c0
++#define ALPS_REG_BASE_PINNACLE	0x0000
++
+ static const struct alps_nibble_commands alps_v3_nibble_commands[] = {
+ 	{ PSMOUSE_CMD_SETPOLL,		0x00 }, /* 0 */
+ 	{ PSMOUSE_CMD_RESET_DIS,	0x00 }, /* 1 */
+@@ -109,11 +106,14 @@ static const struct alps_model_info alps_model_data[] = {
+ 	{ { 0x73, 0x02, 0x50 }, 0x00, ALPS_PROTO_V2, 0xcf, 0xcf, ALPS_FOUR_BUTTONS },		/* Dell Vostro 1400 */
+ 	{ { 0x52, 0x01, 0x14 }, 0x00, ALPS_PROTO_V2, 0xff, 0xff,
+ 		ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED },				/* Toshiba Tecra A11-11L */
+-	{ { 0x73, 0x02, 0x64 },	0x9b, ALPS_PROTO_V3, 0x8f, 0x8f, ALPS_DUALPOINT },
+-	{ { 0x73, 0x02, 0x64 },	0x9d, ALPS_PROTO_V3, 0x8f, 0x8f, ALPS_DUALPOINT },
+ 	{ { 0x73, 0x02, 0x64 },	0x8a, ALPS_PROTO_V4, 0x8f, 0x8f, 0 },
+ };
+ 
++static void alps_set_abs_params_st(struct alps_data *priv,
++				   struct input_dev *dev1);
++static void alps_set_abs_params_mt(struct alps_data *priv,
++				   struct input_dev *dev1);
++
+ /*
+  * XXX - this entry is suspicious. First byte has zero lower nibble,
+  * which is what a normal mouse would report. Also, the value 0x0e
+@@ -122,10 +122,10 @@ static const struct alps_model_info alps_model_data[] = {
+ 
+ /* Packet formats are described in Documentation/input/alps.txt */
+ 
+-static bool alps_is_valid_first_byte(const struct alps_model_info *model,
++static bool alps_is_valid_first_byte(struct alps_data *priv,
+ 				     unsigned char data)
+ {
+-	return (data & model->mask0) == model->byte0;
++	return (data & priv->mask0) == priv->byte0;
+ }
+ 
+ static void alps_report_buttons(struct psmouse *psmouse,
+@@ -158,14 +158,13 @@ static void alps_report_buttons(struct psmouse *psmouse,
+ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
+ {
+ 	struct alps_data *priv = psmouse->private;
+-	const struct alps_model_info *model = priv->i;
+ 	unsigned char *packet = psmouse->packet;
+ 	struct input_dev *dev = psmouse->dev;
+ 	struct input_dev *dev2 = priv->dev2;
+ 	int x, y, z, ges, fin, left, right, middle;
+ 	int back = 0, forward = 0;
+ 
+-	if (model->proto_version == ALPS_PROTO_V1) {
++	if (priv->proto_version == ALPS_PROTO_V1) {
+ 		left = packet[2] & 0x10;
+ 		right = packet[2] & 0x08;
+ 		middle = 0;
+@@ -181,12 +180,12 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
+ 		z = packet[5];
+ 	}
+ 
+-	if (model->flags & ALPS_FW_BK_1) {
++	if (priv->flags & ALPS_FW_BK_1) {
+ 		back = packet[0] & 0x10;
+ 		forward = packet[2] & 4;
+ 	}
+ 
+-	if (model->flags & ALPS_FW_BK_2) {
++	if (priv->flags & ALPS_FW_BK_2) {
+ 		back = packet[3] & 4;
+ 		forward = packet[2] & 4;
+ 		if ((middle = forward && back))
+@@ -196,7 +195,7 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
+ 	ges = packet[2] & 1;
+ 	fin = packet[2] & 2;
+ 
+-	if ((model->flags & ALPS_DUALPOINT) && z == 127) {
++	if ((priv->flags & ALPS_DUALPOINT) && z == 127) {
+ 		input_report_rel(dev2, REL_X,  (x > 383 ? (x - 768) : x));
+ 		input_report_rel(dev2, REL_Y, -(y > 255 ? (y - 512) : y));
+ 
+@@ -239,15 +238,15 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
+ 	input_report_abs(dev, ABS_PRESSURE, z);
+ 	input_report_key(dev, BTN_TOOL_FINGER, z > 0);
+ 
+-	if (model->flags & ALPS_WHEEL)
++	if (priv->flags & ALPS_WHEEL)
+ 		input_report_rel(dev, REL_WHEEL, ((packet[2] << 1) & 0x08) - ((packet[0] >> 4) & 0x07));
+ 
+-	if (model->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) {
++	if (priv->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) {
+ 		input_report_key(dev, BTN_FORWARD, forward);
+ 		input_report_key(dev, BTN_BACK, back);
+ 	}
+ 
+-	if (model->flags & ALPS_FOUR_BUTTONS) {
++	if (priv->flags & ALPS_FOUR_BUTTONS) {
+ 		input_report_key(dev, BTN_0, packet[2] & 4);
+ 		input_report_key(dev, BTN_1, packet[0] & 0x10);
+ 		input_report_key(dev, BTN_2, packet[3] & 4);
+@@ -267,7 +266,8 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
+  * These points are returned in x1, y1, x2, and y2 when the return value
+  * is greater than 0.
+  */
+-static int alps_process_bitmap(unsigned int x_map, unsigned int y_map,
++static int alps_process_bitmap(struct alps_data *priv,
++			       unsigned int x_map, unsigned int y_map,
+ 			       int *x1, int *y1, int *x2, int *y2)
+ {
+ 	struct alps_bitmap_point {
+@@ -309,7 +309,7 @@ static int alps_process_bitmap(unsigned int x_map, unsigned int y_map,
+ 	 * y bitmap is reversed for what we need (lower positions are in
+ 	 * higher bits), so we process from the top end.
+ 	 */
+-	y_map = y_map << (sizeof(y_map) * BITS_PER_BYTE - ALPS_BITMAP_Y_BITS);
++	y_map = y_map << (sizeof(y_map) * BITS_PER_BYTE - priv->y_bits);
+ 	prev_bit = 0;
+ 	point = &y_low;
+ 	for (i = 0; y_map != 0; i++, y_map <<= 1) {
+@@ -355,16 +355,18 @@ static int alps_process_bitmap(unsigned int x_map, unsigned int y_map,
+ 		}
+ 	}
+ 
+-	*x1 = (ALPS_V3_X_MAX * (2 * x_low.start_bit + x_low.num_bits - 1)) /
+-	      (2 * (ALPS_BITMAP_X_BITS - 1));
+-	*y1 = (ALPS_V3_Y_MAX * (2 * y_low.start_bit + y_low.num_bits - 1)) /
+-	      (2 * (ALPS_BITMAP_Y_BITS - 1));
++	*x1 = (priv->x_max * (2 * x_low.start_bit + x_low.num_bits - 1)) /
++	      (2 * (priv->x_bits - 1));
++	*y1 = (priv->y_max * (2 * y_low.start_bit + y_low.num_bits - 1)) /
++	      (2 * (priv->y_bits - 1));
+ 
+ 	if (fingers > 1) {
+-		*x2 = (ALPS_V3_X_MAX * (2 * x_high.start_bit + x_high.num_bits - 1)) /
+-		      (2 * (ALPS_BITMAP_X_BITS - 1));
+-		*y2 = (ALPS_V3_Y_MAX * (2 * y_high.start_bit + y_high.num_bits - 1)) /
+-		      (2 * (ALPS_BITMAP_Y_BITS - 1));
++		*x2 = (priv->x_max *
++		       (2 * x_high.start_bit + x_high.num_bits - 1)) /
++		      (2 * (priv->x_bits - 1));
++		*y2 = (priv->y_max *
++		       (2 * y_high.start_bit + y_high.num_bits - 1)) /
++		      (2 * (priv->y_bits - 1));
+ 	}
+ 
+ 	return fingers;
+@@ -448,17 +450,57 @@ static void alps_process_trackstick_packet_v3(struct psmouse *psmouse)
+ 	return;
+ }
+ 
++static void alps_decode_buttons_v3(struct alps_fields *f, unsigned char *p)
++{
++	f->left = !!(p[3] & 0x01);
++	f->right = !!(p[3] & 0x02);
++	f->middle = !!(p[3] & 0x04);
++
++	f->ts_left = !!(p[3] & 0x10);
++	f->ts_right = !!(p[3] & 0x20);
++	f->ts_middle = !!(p[3] & 0x40);
++}
++
++static void alps_decode_pinnacle(struct alps_fields *f, unsigned char *p)
++{
++	f->first_mp = !!(p[4] & 0x40);
++	f->is_mp = !!(p[0] & 0x40);
++
++	f->fingers = (p[5] & 0x3) + 1;
++	f->x_map = ((p[4] & 0x7e) << 8) |
++		   ((p[1] & 0x7f) << 2) |
++		   ((p[0] & 0x30) >> 4);
++	f->y_map = ((p[3] & 0x70) << 4) |
++		   ((p[2] & 0x7f) << 1) |
++		   (p[4] & 0x01);
++
++	f->x = ((p[1] & 0x7f) << 4) | ((p[4] & 0x30) >> 2) |
++	       ((p[0] & 0x30) >> 4);
++	f->y = ((p[2] & 0x7f) << 4) | (p[4] & 0x0f);
++	f->z = p[5] & 0x7f;
++
++	alps_decode_buttons_v3(f, p);
++}
++
++static void alps_decode_rushmore(struct alps_fields *f, unsigned char *p)
++{
++	alps_decode_pinnacle(f, p);
++
++	f->x_map |= (p[5] & 0x10) << 11;
++	f->y_map |= (p[5] & 0x20) << 6;
++}
++
+ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
+ {
+ 	struct alps_data *priv = psmouse->private;
+ 	unsigned char *packet = psmouse->packet;
+ 	struct input_dev *dev = psmouse->dev;
+ 	struct input_dev *dev2 = priv->dev2;
+-	int x, y, z;
+-	int left, right, middle;
+ 	int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
+ 	int fingers = 0, bmap_fingers;
+-	unsigned int x_bitmap, y_bitmap;
++	struct alps_fields f;
++
++	priv->decode_fields(&f, packet);
+ 
+ 	/*
+ 	 * There's no single feature of touchpad position and bitmap packets
+@@ -473,16 +515,10 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
+ 		 * packet. Check for this, and when it happens process the
+ 		 * position packet as usual.
+ 		 */
+-		if (packet[0] & 0x40) {
+-			fingers = (packet[5] & 0x3) + 1;
+-			x_bitmap = ((packet[4] & 0x7e) << 8) |
+-				   ((packet[1] & 0x7f) << 2) |
+-				   ((packet[0] & 0x30) >> 4);
+-			y_bitmap = ((packet[3] & 0x70) << 4) |
+-				   ((packet[2] & 0x7f) << 1) |
+-				   (packet[4] & 0x01);
+-
+-			bmap_fingers = alps_process_bitmap(x_bitmap, y_bitmap,
++		if (f.is_mp) {
++			fingers = f.fingers;
++			bmap_fingers = alps_process_bitmap(priv,
++							   f.x_map, f.y_map,
+ 							   &x1, &y1, &x2, &y2);
+ 
+ 			/*
+@@ -493,7 +529,7 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
+ 				fingers = bmap_fingers;
+ 
+ 			/* Now process position packet */
+-			packet = priv->multi_data;
++			priv->decode_fields(&f, priv->multi_data);
+ 		} else {
+ 			priv->multi_packet = 0;
+ 		}
+@@ -507,10 +543,10 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
+ 	 * out misidentified bitmap packets, we reject anything with this
+ 	 * bit set.
+ 	 */
+-	if (packet[0] & 0x40)
++	if (f.is_mp)
+ 		return;
+ 
+-	if (!priv->multi_packet && (packet[4] & 0x40)) {
++	if (!priv->multi_packet && f.first_mp) {
+ 		priv->multi_packet = 1;
+ 		memcpy(priv->multi_data, packet, sizeof(priv->multi_data));
+ 		return;
+@@ -518,22 +554,13 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
+ 
+ 	priv->multi_packet = 0;
+ 
+-	left = packet[3] & 0x01;
+-	right = packet[3] & 0x02;
+-	middle = packet[3] & 0x04;
+-
+-	x = ((packet[1] & 0x7f) << 4) | ((packet[4] & 0x30) >> 2) |
+-	    ((packet[0] & 0x30) >> 4);
+-	y = ((packet[2] & 0x7f) << 4) | (packet[4] & 0x0f);
+-	z = packet[5] & 0x7f;
+-
+ 	/*
+ 	 * Sometimes the hardware sends a single packet with z = 0
+ 	 * in the middle of a stream. Real releases generate packets
+ 	 * with x, y, and z all zero, so these seem to be flukes.
+ 	 * Ignore them.
+ 	 */
+-	if (x && y && !z)
++	if (f.x && f.y && !f.z)
+ 		return;
+ 
+ 	/*
+@@ -541,12 +568,12 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
+ 	 * to rely on ST data.
+ 	 */
+ 	if (!fingers) {
+-		x1 = x;
+-		y1 = y;
+-		fingers = z > 0 ? 1 : 0;
++		x1 = f.x;
++		y1 = f.y;
++		fingers = f.z > 0 ? 1 : 0;
+ 	}
+ 
+-	if (z >= 64)
++	if (f.z >= 64)
+ 		input_report_key(dev, BTN_TOUCH, 1);
+ 	else
+ 		input_report_key(dev, BTN_TOUCH, 0);
+@@ -555,26 +582,22 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
+ 
+ 	input_mt_report_finger_count(dev, fingers);
+ 
+-	input_report_key(dev, BTN_LEFT, left);
+-	input_report_key(dev, BTN_RIGHT, right);
+-	input_report_key(dev, BTN_MIDDLE, middle);
++	input_report_key(dev, BTN_LEFT, f.left);
++	input_report_key(dev, BTN_RIGHT, f.right);
++	input_report_key(dev, BTN_MIDDLE, f.middle);
+ 
+-	if (z > 0) {
+-		input_report_abs(dev, ABS_X, x);
+-		input_report_abs(dev, ABS_Y, y);
++	if (f.z > 0) {
++		input_report_abs(dev, ABS_X, f.x);
++		input_report_abs(dev, ABS_Y, f.y);
+ 	}
+-	input_report_abs(dev, ABS_PRESSURE, z);
++	input_report_abs(dev, ABS_PRESSURE, f.z);
+ 
+ 	input_sync(dev);
+ 
+ 	if (!(priv->quirks & ALPS_QUIRK_TRACKSTICK_BUTTONS)) {
+-		left = packet[3] & 0x10;
+-		right = packet[3] & 0x20;
+-		middle = packet[3] & 0x40;
+-
+-		input_report_key(dev2, BTN_LEFT, left);
+-		input_report_key(dev2, BTN_RIGHT, right);
+-		input_report_key(dev2, BTN_MIDDLE, middle);
++		input_report_key(dev2, BTN_LEFT, f.ts_left);
++		input_report_key(dev2, BTN_RIGHT, f.ts_right);
++		input_report_key(dev2, BTN_MIDDLE, f.ts_middle);
+ 		input_sync(dev2);
+ 	}
+ }
+@@ -639,7 +662,7 @@ static void alps_process_packet_v4(struct psmouse *psmouse)
+ 			   ((priv->multi_data[3] & 0x1f) << 5) |
+ 			    (priv->multi_data[1] & 0x1f);
+ 
+-		fingers = alps_process_bitmap(x_bitmap, y_bitmap,
++		fingers = alps_process_bitmap(priv, x_bitmap, y_bitmap,
+ 					      &x1, &y1, &x2, &y2);
+ 
+ 		/* Store MT data.*/
+@@ -696,25 +719,6 @@ static void alps_process_packet_v4(struct psmouse *psmouse)
+ 	input_sync(dev);
+ }
+ 
+-static void alps_process_packet(struct psmouse *psmouse)
+-{
+-	struct alps_data *priv = psmouse->private;
+-	const struct alps_model_info *model = priv->i;
+-
+-	switch (model->proto_version) {
+-	case ALPS_PROTO_V1:
+-	case ALPS_PROTO_V2:
+-		alps_process_packet_v1_v2(psmouse);
+-		break;
+-	case ALPS_PROTO_V3:
+-		alps_process_packet_v3(psmouse);
+-		break;
+-	case ALPS_PROTO_V4:
+-		alps_process_packet_v4(psmouse);
+-		break;
+-	}
+-}
+-
+ static void alps_report_bare_ps2_packet(struct psmouse *psmouse,
+ 					unsigned char packet[],
+ 					bool report_buttons)
+@@ -765,14 +769,14 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)
+ 		if (((psmouse->packet[3] |
+ 		      psmouse->packet[4] |
+ 		      psmouse->packet[5]) & 0x80) ||
+-		    (!alps_is_valid_first_byte(priv->i, psmouse->packet[6]))) {
++		    (!alps_is_valid_first_byte(priv, psmouse->packet[6]))) {
+ 			psmouse_dbg(psmouse,
+ 				    "refusing packet %4ph (suspected interleaved ps/2)\n",
+ 				    psmouse->packet + 3);
+ 			return PSMOUSE_BAD_DATA;
+ 		}
+ 
+-		alps_process_packet(psmouse);
++		priv->process_packet(psmouse);
+ 
+ 		/* Continue with the next packet */
+ 		psmouse->packet[0] = psmouse->packet[6];
+@@ -816,6 +820,7 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)
+ static void alps_flush_packet(unsigned long data)
+ {
+ 	struct psmouse *psmouse = (struct psmouse *)data;
++	struct alps_data *priv = psmouse->private;
+ 
+ 	serio_pause_rx(psmouse->ps2dev.serio);
+ 
+@@ -833,7 +838,7 @@ static void alps_flush_packet(unsigned long data)
+ 				    "refusing packet %3ph (suspected interleaved ps/2)\n",
+ 				    psmouse->packet + 3);
+ 		} else {
+-			alps_process_packet(psmouse);
++			priv->process_packet(psmouse);
+ 		}
+ 		psmouse->pktcnt = 0;
+ 	}
+@@ -844,7 +849,6 @@ static void alps_flush_packet(unsigned long data)
+ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
+ {
+ 	struct alps_data *priv = psmouse->private;
+-	const struct alps_model_info *model = priv->i;
+ 
+ 	if ((psmouse->packet[0] & 0xc8) == 0x08) { /* PS/2 packet */
+ 		if (psmouse->pktcnt == 3) {
+@@ -857,15 +861,15 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
+ 
+ 	/* Check for PS/2 packet stuffed in the middle of ALPS packet. */
+ 
+-	if ((model->flags & ALPS_PS2_INTERLEAVED) &&
++	if ((priv->flags & ALPS_PS2_INTERLEAVED) &&
+ 	    psmouse->pktcnt >= 4 && (psmouse->packet[3] & 0x0f) == 0x0f) {
+ 		return alps_handle_interleaved_ps2(psmouse);
+ 	}
+ 
+-	if (!alps_is_valid_first_byte(model, psmouse->packet[0])) {
++	if (!alps_is_valid_first_byte(priv, psmouse->packet[0])) {
+ 		psmouse_dbg(psmouse,
+ 			    "refusing packet[0] = %x (mask0 = %x, byte0 = %x)\n",
+-			    psmouse->packet[0], model->mask0, model->byte0);
++			    psmouse->packet[0], priv->mask0, priv->byte0);
+ 		return PSMOUSE_BAD_DATA;
+ 	}
+ 
+@@ -879,7 +883,7 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
+ 	}
+ 
+ 	if (psmouse->pktcnt == psmouse->pktsize) {
+-		alps_process_packet(psmouse);
++		priv->process_packet(psmouse);
+ 		return PSMOUSE_FULL_PACKET;
+ 	}
+ 
+@@ -967,24 +971,42 @@ static int alps_command_mode_write_reg(struct psmouse *psmouse, int addr,
+ 	return __alps_command_mode_write_reg(psmouse, value);
+ }
+ 
++static int alps_rpt_cmd(struct psmouse *psmouse, int init_command,
++			int repeated_command, unsigned char *param)
++{
++	struct ps2dev *ps2dev = &psmouse->ps2dev;
++
++	param[0] = 0;
++	if (init_command && ps2_command(ps2dev, param, init_command))
++		return -EIO;
++
++	if (ps2_command(ps2dev,  NULL, repeated_command) ||
++	    ps2_command(ps2dev,  NULL, repeated_command) ||
++	    ps2_command(ps2dev,  NULL, repeated_command))
++		return -EIO;
++
++	param[0] = param[1] = param[2] = 0xff;
++	if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
++		return -EIO;
++
++	psmouse_dbg(psmouse, "%2.2X report: %2.2x %2.2x %2.2x\n",
++		    repeated_command, param[0], param[1], param[2]);
++	return 0;
++}
++
+ static int alps_enter_command_mode(struct psmouse *psmouse,
+ 				   unsigned char *resp)
+ {
+ 	unsigned char param[4];
+-	struct ps2dev *ps2dev = &psmouse->ps2dev;
+ 
+-	if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) ||
+-	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) ||
+-	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) ||
+-	    ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
++	if (alps_rpt_cmd(psmouse, 0, PSMOUSE_CMD_RESET_WRAP, param)) {
+ 		psmouse_err(psmouse, "failed to enter command mode\n");
+ 		return -1;
+ 	}
+ 
+-	if (param[0] != 0x88 && param[1] != 0x07) {
++	if (param[0] != 0x88 || (param[1] != 0x07 && param[1] != 0x08)) {
+ 		psmouse_dbg(psmouse,
+-			    "unknown response while entering command mode: %2.2x %2.2x %2.2x\n",
+-			    param[0], param[1], param[2]);
++			    "unknown response while entering command mode\n");
+ 		return -1;
+ 	}
+ 
+@@ -1001,99 +1023,6 @@ static inline int alps_exit_command_mode(struct psmouse *psmouse)
+ 	return 0;
+ }
+ 
+-static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int *version)
+-{
+-	struct ps2dev *ps2dev = &psmouse->ps2dev;
+-	static const unsigned char rates[] = { 0, 10, 20, 40, 60, 80, 100, 200 };
+-	unsigned char param[4];
+-	const struct alps_model_info *model = NULL;
+-	int i;
+-
+-	/*
+-	 * First try "E6 report".
+-	 * ALPS should return 0,0,10 or 0,0,100 if no buttons are pressed.
+-	 * The bits 0-2 of the first byte will be 1s if some buttons are
+-	 * pressed.
+-	 */
+-	param[0] = 0;
+-	if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) ||
+-	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11) ||
+-	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11) ||
+-	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11))
+-		return NULL;
+-
+-	param[0] = param[1] = param[2] = 0xff;
+-	if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
+-		return NULL;
+-
+-	psmouse_dbg(psmouse, "E6 report: %2.2x %2.2x %2.2x",
+-		    param[0], param[1], param[2]);
+-
+-	if ((param[0] & 0xf8) != 0 || param[1] != 0 ||
+-	    (param[2] != 10 && param[2] != 100))
+-		return NULL;
+-
+-	/*
+-	 * Now try "E7 report". Allowed responses are in
+-	 * alps_model_data[].signature
+-	 */
+-	param[0] = 0;
+-	if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) ||
+-	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE21) ||
+-	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE21) ||
+-	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE21))
+-		return NULL;
+-
+-	param[0] = param[1] = param[2] = 0xff;
+-	if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
+-		return NULL;
+-
+-	psmouse_dbg(psmouse, "E7 report: %2.2x %2.2x %2.2x",
+-		    param[0], param[1], param[2]);
+-
+-	if (version) {
+-		for (i = 0; i < ARRAY_SIZE(rates) && param[2] != rates[i]; i++)
+-			/* empty */;
+-		*version = (param[0] << 8) | (param[1] << 4) | i;
+-	}
+-
+-	for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) {
+-		if (!memcmp(param, alps_model_data[i].signature,
+-			    sizeof(alps_model_data[i].signature))) {
+-			model = alps_model_data + i;
+-			break;
+-		}
+-	}
+-
+-	if (model && model->proto_version > ALPS_PROTO_V2) {
+-		/*
+-		 * Need to check command mode response to identify
+-		 * model
+-		 */
+-		model = NULL;
+-		if (alps_enter_command_mode(psmouse, param)) {
+-			psmouse_warn(psmouse,
+-				     "touchpad failed to enter command mode\n");
+-		} else {
+-			for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) {
+-				if (alps_model_data[i].proto_version > ALPS_PROTO_V2 &&
+-				    alps_model_data[i].command_mode_resp == param[0]) {
+-					model = alps_model_data + i;
+-					break;
+-				}
+-			}
+-			alps_exit_command_mode(psmouse);
+-
+-			if (!model)
+-				psmouse_dbg(psmouse,
+-					    "Unknown command mode response %2.2x\n",
+-					    param[0]);
+-		}
+-	}
+-
+-	return model;
+-}
+-
+ /*
+  * For DualPoint devices select the device that should respond to
+  * subsequent commands. It looks like glidepad is behind stickpointer,
+@@ -1137,18 +1066,10 @@ static int alps_absolute_mode_v1_v2(struct psmouse *psmouse)
+ 
+ static int alps_get_status(struct psmouse *psmouse, char *param)
+ {
+-	struct ps2dev *ps2dev = &psmouse->ps2dev;
+-
+ 	/* Get status: 0xF5 0xF5 0xF5 0xE9 */
+-	if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||
+-	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||
+-	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||
+-	    ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
++	if (alps_rpt_cmd(psmouse, 0, PSMOUSE_CMD_DISABLE, param))
+ 		return -1;
+ 
+-	psmouse_dbg(psmouse, "Status: %2.2x %2.2x %2.2x",
+-		    param[0], param[1], param[2]);
+-
+ 	return 0;
+ }
+ 
+@@ -1190,16 +1111,16 @@ static int alps_poll(struct psmouse *psmouse)
+ 	unsigned char buf[sizeof(psmouse->packet)];
+ 	bool poll_failed;
+ 
+-	if (priv->i->flags & ALPS_PASS)
++	if (priv->flags & ALPS_PASS)
+ 		alps_passthrough_mode_v2(psmouse, true);
+ 
+ 	poll_failed = ps2_command(&psmouse->ps2dev, buf,
+ 				  PSMOUSE_CMD_POLL | (psmouse->pktsize << 8)) < 0;
+ 
+-	if (priv->i->flags & ALPS_PASS)
++	if (priv->flags & ALPS_PASS)
+ 		alps_passthrough_mode_v2(psmouse, false);
+ 
+-	if (poll_failed || (buf[0] & priv->i->mask0) != priv->i->byte0)
++	if (poll_failed || (buf[0] & priv->mask0) != priv->byte0)
+ 		return -1;
+ 
+ 	if ((psmouse->badbyte & 0xc8) == 0x08) {
+@@ -1217,9 +1138,8 @@ static int alps_poll(struct psmouse *psmouse)
+ static int alps_hw_init_v1_v2(struct psmouse *psmouse)
+ {
+ 	struct alps_data *priv = psmouse->private;
+-	const struct alps_model_info *model = priv->i;
+ 
+-	if ((model->flags & ALPS_PASS) &&
++	if ((priv->flags & ALPS_PASS) &&
+ 	    alps_passthrough_mode_v2(psmouse, true)) {
+ 		return -1;
+ 	}
+@@ -1234,7 +1154,7 @@ static int alps_hw_init_v1_v2(struct psmouse *psmouse)
+ 		return -1;
+ 	}
+ 
+-	if ((model->flags & ALPS_PASS) &&
++	if ((priv->flags & ALPS_PASS) &&
+ 	    alps_passthrough_mode_v2(psmouse, false)) {
+ 		return -1;
+ 	}
+@@ -1249,26 +1169,31 @@ static int alps_hw_init_v1_v2(struct psmouse *psmouse)
+ }
+ 
+ /*
+- * Enable or disable passthrough mode to the trackstick. Must be in
+- * command mode when calling this function.
++ * Enable or disable passthrough mode to the trackstick.
+  */
+-static int alps_passthrough_mode_v3(struct psmouse *psmouse, bool enable)
++static int alps_passthrough_mode_v3(struct psmouse *psmouse,
++				    int reg_base, bool enable)
+ {
+-	int reg_val;
++	int reg_val, ret = -1;
+ 
+-	reg_val = alps_command_mode_read_reg(psmouse, 0x0008);
+-	if (reg_val == -1)
++	if (alps_enter_command_mode(psmouse, NULL))
+ 		return -1;
+ 
++	reg_val = alps_command_mode_read_reg(psmouse, reg_base + 0x0008);
++	if (reg_val == -1)
++		goto error;
++
+ 	if (enable)
+ 		reg_val |= 0x01;
+ 	else
+ 		reg_val &= ~0x01;
+ 
+-	if (__alps_command_mode_write_reg(psmouse, reg_val))
+-		return -1;
++	ret = __alps_command_mode_write_reg(psmouse, reg_val);
+ 
+-	return 0;
++error:
++	if (alps_exit_command_mode(psmouse))
++		ret = -1;
++	return ret;
+ }
+ 
+ /* Must be in command mode when calling this function */
+@@ -1287,73 +1212,102 @@ static int alps_absolute_mode_v3(struct psmouse *psmouse)
+ 	return 0;
+ }
+ 
+-static int alps_hw_init_v3(struct psmouse *psmouse)
++static int alps_probe_trackstick_v3(struct psmouse *psmouse, int reg_base)
+ {
+-	struct alps_data *priv = psmouse->private;
+-	struct ps2dev *ps2dev = &psmouse->ps2dev;
+-	int reg_val;
+-	unsigned char param[4];
+-
+-	priv->nibble_commands = alps_v3_nibble_commands;
+-	priv->addr_command = PSMOUSE_CMD_RESET_WRAP;
++	int ret = -EIO, reg_val;
+ 
+ 	if (alps_enter_command_mode(psmouse, NULL))
+ 		goto error;
+ 
+-	/* Check for trackstick */
+-	reg_val = alps_command_mode_read_reg(psmouse, 0x0008);
++	reg_val = alps_command_mode_read_reg(psmouse, reg_base + 0x08);
+ 	if (reg_val == -1)
+ 		goto error;
+-	if (reg_val & 0x80) {
+-		if (alps_passthrough_mode_v3(psmouse, true))
+-			goto error;
+-		if (alps_exit_command_mode(psmouse))
+-			goto error;
++
++	/* bit 7: trackstick is present */
++	ret = reg_val & 0x80 ? 0 : -ENODEV;
++
++error:
++	alps_exit_command_mode(psmouse);
++	return ret;
++}
++
++static int alps_setup_trackstick_v3(struct psmouse *psmouse, int reg_base)
++{
++	struct ps2dev *ps2dev = &psmouse->ps2dev;
++	int ret = 0;
++	unsigned char param[4];
++
++	if (alps_passthrough_mode_v3(psmouse, reg_base, true))
++		return -EIO;
++
++	/*
++	 * E7 report for the trackstick
++	 *
++	 * There have been reports of failures to seem to trace back
++	 * to the above trackstick check failing. When these occur
++	 * this E7 report fails, so when that happens we continue
++	 * with the assumption that there isn't a trackstick after
++	 * all.
++	 */
++	if (alps_rpt_cmd(psmouse, 0, PSMOUSE_CMD_SETSCALE21, param)) {
++		psmouse_warn(psmouse, "trackstick E7 report failed\n");
++		ret = -ENODEV;
++	} else {
++		psmouse_dbg(psmouse,
++			    "trackstick E7 report: %2.2x %2.2x %2.2x\n",
++			    param[0], param[1], param[2]);
+ 
+ 		/*
+-		 * E7 report for the trackstick
+-		 *
+-		 * There have been reports of failures to seem to trace back
+-		 * to the above trackstick check failing. When these occur
+-		 * this E7 report fails, so when that happens we continue
+-		 * with the assumption that there isn't a trackstick after
+-		 * all.
++		 * Not sure what this does, but it is absolutely
++		 * essential. Without it, the touchpad does not
++		 * work at all and the trackstick just emits normal
++		 * PS/2 packets.
+ 		 */
+-		param[0] = 0x64;
+-		if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
+-		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
+-		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
+-		    ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
+-			psmouse_warn(psmouse, "trackstick E7 report failed\n");
+-		} else {
+-			psmouse_dbg(psmouse,
+-				    "trackstick E7 report: %2.2x %2.2x %2.2x\n",
+-				    param[0], param[1], param[2]);
+-
+-			/*
+-			 * Not sure what this does, but it is absolutely
+-			 * essential. Without it, the touchpad does not
+-			 * work at all and the trackstick just emits normal
+-			 * PS/2 packets.
+-			 */
+-			if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
+-			    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
+-			    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
+-			    alps_command_mode_send_nibble(psmouse, 0x9) ||
+-			    alps_command_mode_send_nibble(psmouse, 0x4)) {
+-				psmouse_err(psmouse,
+-					    "Error sending magic E6 sequence\n");
+-				goto error_passthrough;
+-			}
++		if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
++		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
++		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
++		    alps_command_mode_send_nibble(psmouse, 0x9) ||
++		    alps_command_mode_send_nibble(psmouse, 0x4)) {
++			psmouse_err(psmouse,
++				    "Error sending magic E6 sequence\n");
++			ret = -EIO;
++			goto error;
+ 		}
+ 
+-		if (alps_enter_command_mode(psmouse, NULL))
+-			goto error_passthrough;
+-		if (alps_passthrough_mode_v3(psmouse, false))
+-			goto error;
++		/*
++		 * This ensures the trackstick packets are in the format
++		 * supported by this driver. If bit 1 isn't set the packet
++		 * format is different.
++		 */
++		if (alps_enter_command_mode(psmouse, NULL) ||
++		    alps_command_mode_write_reg(psmouse,
++						reg_base + 0x08, 0x82) ||
++		    alps_exit_command_mode(psmouse))
++			ret = -EIO;
+ 	}
+ 
+-	if (alps_absolute_mode_v3(psmouse)) {
++error:
++	if (alps_passthrough_mode_v3(psmouse, reg_base, false))
++		ret = -EIO;
++
++	return ret;
++}
++
++static int alps_hw_init_v3(struct psmouse *psmouse)
++{
++	struct ps2dev *ps2dev = &psmouse->ps2dev;
++	int reg_val;
++	unsigned char param[4];
++
++	reg_val = alps_probe_trackstick_v3(psmouse, ALPS_REG_BASE_PINNACLE);
++	if (reg_val == -EIO)
++		goto error;
++	if (reg_val == 0 &&
++	    alps_setup_trackstick_v3(psmouse, ALPS_REG_BASE_PINNACLE) == -EIO)
++		goto error;
++
++	if (alps_enter_command_mode(psmouse, NULL) ||
++	    alps_absolute_mode_v3(psmouse)) {
+ 		psmouse_err(psmouse, "Failed to enter absolute mode\n");
+ 		goto error;
+ 	}
+@@ -1390,14 +1344,6 @@ static int alps_hw_init_v3(struct psmouse *psmouse)
+ 	if (alps_command_mode_write_reg(psmouse, 0x0162, 0x04))
+ 		goto error;
+ 
+-	/*
+-	 * This ensures the trackstick packets are in the format
+-	 * supported by this driver. If bit 1 isn't set the packet
+-	 * format is different.
+-	 */
+-	if (alps_command_mode_write_reg(psmouse, 0x0008, 0x82))
+-		goto error;
+-
+ 	alps_exit_command_mode(psmouse);
+ 
+ 	/* Set rate and enable data reporting */
+@@ -1410,10 +1356,6 @@ static int alps_hw_init_v3(struct psmouse *psmouse)
+ 
+ 	return 0;
+ 
+-error_passthrough:
+-	/* Something failed while in passthrough mode, so try to get out */
+-	if (!alps_enter_command_mode(psmouse, NULL))
+-		alps_passthrough_mode_v3(psmouse, false);
+ error:
+ 	/*
+ 	 * Leaving the touchpad in command mode will essentially render
+@@ -1424,6 +1366,50 @@ error:
+ 	return -1;
+ }
+ 
++static int alps_hw_init_rushmore_v3(struct psmouse *psmouse)
++{
++	struct alps_data *priv = psmouse->private;
++	struct ps2dev *ps2dev = &psmouse->ps2dev;
++	int reg_val, ret = -1;
++
++	if (priv->flags & ALPS_DUALPOINT) {
++		reg_val = alps_setup_trackstick_v3(psmouse,
++						   ALPS_REG_BASE_RUSHMORE);
++		if (reg_val == -EIO)
++			goto error;
++		if (reg_val == -ENODEV)
++			priv->flags &= ~ALPS_DUALPOINT;
++	}
++
++	if (alps_enter_command_mode(psmouse, NULL) ||
++	    alps_command_mode_read_reg(psmouse, 0xc2d9) == -1 ||
++	    alps_command_mode_write_reg(psmouse, 0xc2cb, 0x00))
++		goto error;
++
++	reg_val = alps_command_mode_read_reg(psmouse, 0xc2c6);
++	if (reg_val == -1)
++		goto error;
++	if (__alps_command_mode_write_reg(psmouse, reg_val & 0xfd))
++		goto error;
++
++	if (alps_command_mode_write_reg(psmouse, 0xc2c9, 0x64))
++		goto error;
++
++	/* enter absolute mode */
++	reg_val = alps_command_mode_read_reg(psmouse, 0xc2c4);
++	if (reg_val == -1)
++		goto error;
++	if (__alps_command_mode_write_reg(psmouse, reg_val | 0x02))
++		goto error;
++
++	alps_exit_command_mode(psmouse);
++	return ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE);
++
++error:
++	alps_exit_command_mode(psmouse);
++	return ret;
++}
++
+ /* Must be in command mode when calling this function */
+ static int alps_absolute_mode_v4(struct psmouse *psmouse)
+ {
+@@ -1442,13 +1428,9 @@ static int alps_absolute_mode_v4(struct psmouse *psmouse)
+ 
+ static int alps_hw_init_v4(struct psmouse *psmouse)
+ {
+-	struct alps_data *priv = psmouse->private;
+ 	struct ps2dev *ps2dev = &psmouse->ps2dev;
+ 	unsigned char param[4];
+ 
+-	priv->nibble_commands = alps_v4_nibble_commands;
+-	priv->addr_command = PSMOUSE_CMD_DISABLE;
+-
+ 	if (alps_enter_command_mode(psmouse, NULL))
+ 		goto error;
+ 
+@@ -1517,39 +1499,140 @@ error:
+ 	return -1;
+ }
+ 
+-static int alps_hw_init(struct psmouse *psmouse)
++static void alps_set_defaults(struct alps_data *priv)
+ {
+-	struct alps_data *priv = psmouse->private;
+-	const struct alps_model_info *model = priv->i;
+-	int ret = -1;
++	priv->byte0 = 0x8f;
++	priv->mask0 = 0x8f;
++	priv->flags = ALPS_DUALPOINT;
++
++	priv->x_max = 2000;
++	priv->y_max = 1400;
++	priv->x_bits = 15;
++	priv->y_bits = 11;
+ 
+-	switch (model->proto_version) {
++	switch (priv->proto_version) {
+ 	case ALPS_PROTO_V1:
+ 	case ALPS_PROTO_V2:
+-		ret = alps_hw_init_v1_v2(psmouse);
++		priv->hw_init = alps_hw_init_v1_v2;
++		priv->process_packet = alps_process_packet_v1_v2;
++		priv->set_abs_params = alps_set_abs_params_st;
+ 		break;
+ 	case ALPS_PROTO_V3:
+-		ret = alps_hw_init_v3(psmouse);
++		priv->hw_init = alps_hw_init_v3;
++		priv->process_packet = alps_process_packet_v3;
++		priv->set_abs_params = alps_set_abs_params_mt;
++		priv->decode_fields = alps_decode_pinnacle;
++		priv->nibble_commands = alps_v3_nibble_commands;
++		priv->addr_command = PSMOUSE_CMD_RESET_WRAP;
+ 		break;
+ 	case ALPS_PROTO_V4:
+-		ret = alps_hw_init_v4(psmouse);
++		priv->hw_init = alps_hw_init_v4;
++		priv->process_packet = alps_process_packet_v4;
++		priv->set_abs_params = alps_set_abs_params_mt;
++		priv->nibble_commands = alps_v4_nibble_commands;
++		priv->addr_command = PSMOUSE_CMD_DISABLE;
+ 		break;
+ 	}
++}
+ 
+-	return ret;
++static int alps_match_table(struct psmouse *psmouse, struct alps_data *priv,
++			    unsigned char *e7, unsigned char *ec)
++{
++	const struct alps_model_info *model;
++	int i;
++
++	for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) {
++		model = &alps_model_data[i];
++
++		if (!memcmp(e7, model->signature, sizeof(model->signature)) &&
++		    (!model->command_mode_resp ||
++		     model->command_mode_resp == ec[2])) {
++
++			priv->proto_version = model->proto_version;
++			alps_set_defaults(priv);
++
++			priv->flags = model->flags;
++			priv->byte0 = model->byte0;
++			priv->mask0 = model->mask0;
++
++			return 0;
++		}
++	}
++
++	return -EINVAL;
++}
++
++static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)
++{
++	unsigned char e6[4], e7[4], ec[4];
++
++	/*
++	 * First try "E6 report".
++	 * ALPS should return 0,0,10 or 0,0,100 if no buttons are pressed.
++	 * The bits 0-2 of the first byte will be 1s if some buttons are
++	 * pressed.
++	 */
++	if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES,
++			 PSMOUSE_CMD_SETSCALE11, e6))
++		return -EIO;
++
++	if ((e6[0] & 0xf8) != 0 || e6[1] != 0 || (e6[2] != 10 && e6[2] != 100))
++		return -EINVAL;
++
++	/*
++	 * Now get the "E7" and "EC" reports.  These will uniquely identify
++	 * most ALPS touchpads.
++	 */
++	if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES,
++			 PSMOUSE_CMD_SETSCALE21, e7) ||
++	    alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES,
++			 PSMOUSE_CMD_RESET_WRAP, ec) ||
++	    alps_exit_command_mode(psmouse))
++		return -EIO;
++
++	if (alps_match_table(psmouse, priv, e7, ec) == 0) {
++		return 0;
++	} else if (ec[0] == 0x88 && ec[1] == 0x08) {
++		priv->proto_version = ALPS_PROTO_V3;
++		alps_set_defaults(priv);
++
++		priv->hw_init = alps_hw_init_rushmore_v3;
++		priv->decode_fields = alps_decode_rushmore;
++		priv->x_bits = 16;
++		priv->y_bits = 12;
++
++		/* hack to make addr_command, nibble_command available */
++		psmouse->private = priv;
++
++		if (alps_probe_trackstick_v3(psmouse, ALPS_REG_BASE_RUSHMORE))
++			priv->flags &= ~ALPS_DUALPOINT;
++
++		return 0;
++	} else if (ec[0] == 0x88 && ec[1] == 0x07 &&
++		   ec[2] >= 0x90 && ec[2] <= 0x9d) {
++		priv->proto_version = ALPS_PROTO_V3;
++		alps_set_defaults(priv);
++
++		return 0;
++	}
++
++	psmouse_info(psmouse,
++		"Unknown ALPS touchpad: E7=%2.2x %2.2x %2.2x, EC=%2.2x %2.2x %2.2x\n",
++		e7[0], e7[1], e7[2], ec[0], ec[1], ec[2]);
++
++	return -EINVAL;
+ }
+ 
+ static int alps_reconnect(struct psmouse *psmouse)
+ {
+-	const struct alps_model_info *model;
++	struct alps_data *priv = psmouse->private;
+ 
+ 	psmouse_reset(psmouse);
+ 
+-	model = alps_get_model(psmouse, NULL);
+-	if (!model)
++	if (alps_identify(psmouse, priv) < 0)
+ 		return -1;
+ 
+-	return alps_hw_init(psmouse);
++	return priv->hw_init(psmouse);
+ }
+ 
+ static void alps_disconnect(struct psmouse *psmouse)
+@@ -1562,12 +1645,33 @@ static void alps_disconnect(struct psmouse *psmouse)
+ 	kfree(priv);
+ }
+ 
++static void alps_set_abs_params_st(struct alps_data *priv,
++				   struct input_dev *dev1)
++{
++	input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0);
++	input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0);
++}
++
++static void alps_set_abs_params_mt(struct alps_data *priv,
++				   struct input_dev *dev1)
++{
++	set_bit(INPUT_PROP_SEMI_MT, dev1->propbit);
++	input_mt_init_slots(dev1, 2, 0);
++	input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, priv->x_max, 0, 0);
++	input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, priv->y_max, 0, 0);
++
++	set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit);
++	set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit);
++	set_bit(BTN_TOOL_QUADTAP, dev1->keybit);
++
++	input_set_abs_params(dev1, ABS_X, 0, priv->x_max, 0, 0);
++	input_set_abs_params(dev1, ABS_Y, 0, priv->y_max, 0, 0);
++}
++
+ int alps_init(struct psmouse *psmouse)
+ {
+ 	struct alps_data *priv;
+-	const struct alps_model_info *model;
+ 	struct input_dev *dev1 = psmouse->dev, *dev2;
+-	int version;
+ 
+ 	priv = kzalloc(sizeof(struct alps_data), GFP_KERNEL);
+ 	dev2 = input_allocate_device();
+@@ -1581,13 +1685,10 @@ int alps_init(struct psmouse *psmouse)
+ 
+ 	psmouse_reset(psmouse);
+ 
+-	model = alps_get_model(psmouse, &version);
+-	if (!model)
++	if (alps_identify(psmouse, priv) < 0)
+ 		goto init_fail;
+ 
+-	priv->i = model;
+-
+-	if (alps_hw_init(psmouse))
++	if (priv->hw_init(psmouse))
+ 		goto init_fail;
+ 
+ 	/*
+@@ -1609,41 +1710,20 @@ int alps_init(struct psmouse *psmouse)
+ 
+ 	dev1->evbit[BIT_WORD(EV_ABS)] |= BIT_MASK(EV_ABS);
+ 
+-	switch (model->proto_version) {
+-	case ALPS_PROTO_V1:
+-	case ALPS_PROTO_V2:
+-		input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0);
+-		input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0);
+-		break;
+-	case ALPS_PROTO_V3:
+-	case ALPS_PROTO_V4:
+-		set_bit(INPUT_PROP_SEMI_MT, dev1->propbit);
+-		input_mt_init_slots(dev1, 2, 0);
+-		input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, ALPS_V3_X_MAX, 0, 0);
+-		input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, ALPS_V3_Y_MAX, 0, 0);
+-
+-		set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit);
+-		set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit);
+-		set_bit(BTN_TOOL_QUADTAP, dev1->keybit);
+-
+-		input_set_abs_params(dev1, ABS_X, 0, ALPS_V3_X_MAX, 0, 0);
+-		input_set_abs_params(dev1, ABS_Y, 0, ALPS_V3_Y_MAX, 0, 0);
+-		break;
+-	}
+-
++	priv->set_abs_params(priv, dev1);
+ 	input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0);
+ 
+-	if (model->flags & ALPS_WHEEL) {
++	if (priv->flags & ALPS_WHEEL) {
+ 		dev1->evbit[BIT_WORD(EV_REL)] |= BIT_MASK(EV_REL);
+ 		dev1->relbit[BIT_WORD(REL_WHEEL)] |= BIT_MASK(REL_WHEEL);
+ 	}
+ 
+-	if (model->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) {
++	if (priv->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) {
+ 		dev1->keybit[BIT_WORD(BTN_FORWARD)] |= BIT_MASK(BTN_FORWARD);
+ 		dev1->keybit[BIT_WORD(BTN_BACK)] |= BIT_MASK(BTN_BACK);
+ 	}
+ 
+-	if (model->flags & ALPS_FOUR_BUTTONS) {
++	if (priv->flags & ALPS_FOUR_BUTTONS) {
+ 		dev1->keybit[BIT_WORD(BTN_0)] |= BIT_MASK(BTN_0);
+ 		dev1->keybit[BIT_WORD(BTN_1)] |= BIT_MASK(BTN_1);
+ 		dev1->keybit[BIT_WORD(BTN_2)] |= BIT_MASK(BTN_2);
+@@ -1654,7 +1734,8 @@ int alps_init(struct psmouse *psmouse)
+ 
+ 	snprintf(priv->phys, sizeof(priv->phys), "%s/input1", psmouse->ps2dev.serio->phys);
+ 	dev2->phys = priv->phys;
+-	dev2->name = (model->flags & ALPS_DUALPOINT) ? "DualPoint Stick" : "PS/2 Mouse";
++	dev2->name = (priv->flags & ALPS_DUALPOINT) ?
++		     "DualPoint Stick" : "PS/2 Mouse";
+ 	dev2->id.bustype = BUS_I8042;
+ 	dev2->id.vendor  = 0x0002;
+ 	dev2->id.product = PSMOUSE_ALPS;
+@@ -1673,7 +1754,7 @@ int alps_init(struct psmouse *psmouse)
+ 	psmouse->poll = alps_poll;
+ 	psmouse->disconnect = alps_disconnect;
+ 	psmouse->reconnect = alps_reconnect;
+-	psmouse->pktsize = model->proto_version == ALPS_PROTO_V4 ? 8 : 6;
++	psmouse->pktsize = priv->proto_version == ALPS_PROTO_V4 ? 8 : 6;
+ 
+ 	/* We are having trouble resyncing ALPS touchpads so disable it for now */
+ 	psmouse->resync_time = 0;
+@@ -1690,18 +1771,16 @@ init_fail:
+ 
+ int alps_detect(struct psmouse *psmouse, bool set_properties)
+ {
+-	int version;
+-	const struct alps_model_info *model;
++	struct alps_data dummy;
+ 
+-	model = alps_get_model(psmouse, &version);
+-	if (!model)
++	if (alps_identify(psmouse, &dummy) < 0)
+ 		return -1;
+ 
+ 	if (set_properties) {
+ 		psmouse->vendor = "ALPS";
+-		psmouse->name = model->flags & ALPS_DUALPOINT ?
++		psmouse->name = dummy.flags & ALPS_DUALPOINT ?
+ 				"DualPoint TouchPad" : "GlidePoint";
+-		psmouse->model = version;
++		psmouse->model = dummy.proto_version << 8;
+ 	}
+ 	return 0;
+ }
+diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h
+index ae1ac35..9704805 100644
+--- a/drivers/input/mouse/alps.h
++++ b/drivers/input/mouse/alps.h
+@@ -12,35 +12,146 @@
+ #ifndef _ALPS_H
+ #define _ALPS_H
+ 
+-#define ALPS_PROTO_V1	0
+-#define ALPS_PROTO_V2	1
+-#define ALPS_PROTO_V3	2
+-#define ALPS_PROTO_V4	3
++#define ALPS_PROTO_V1	1
++#define ALPS_PROTO_V2	2
++#define ALPS_PROTO_V3	3
++#define ALPS_PROTO_V4	4
+ 
++/**
++ * struct alps_model_info - touchpad ID table
++ * @signature: E7 response string to match.
++ * @command_mode_resp: For V3/V4 touchpads, the final byte of the EC response
++ *   (aka command mode response) identifies the firmware minor version.  This
++ *   can be used to distinguish different hardware models which are not
++ *   uniquely identifiable through their E7 responses.
++ * @proto_version: Indicates V1/V2/V3/...
++ * @byte0: Helps figure out whether a position report packet matches the
++ *   known format for this model.  The first byte of the report, ANDed with
++ *   mask0, should match byte0.
++ * @mask0: The mask used to check the first byte of the report.
++ * @flags: Additional device capabilities (passthrough port, trackstick, etc.).
++ *
++ * Many (but not all) ALPS touchpads can be identified by looking at the
++ * values returned in the "E7 report" and/or the "EC report."  This table
++ * lists a number of such touchpads.
++ */
+ struct alps_model_info {
+-        unsigned char signature[3];
+-	unsigned char command_mode_resp; /* v3/v4 only */
++	unsigned char signature[3];
++	unsigned char command_mode_resp;
+ 	unsigned char proto_version;
+-        unsigned char byte0, mask0;
+-        unsigned char flags;
++	unsigned char byte0, mask0;
++	unsigned char flags;
+ };
+ 
++/**
++ * struct alps_nibble_commands - encodings for register accesses
++ * @command: PS/2 command used for the nibble
++ * @data: Data supplied as an argument to the PS/2 command, if applicable
++ *
++ * The ALPS protocol uses magic sequences to transmit binary data to the
++ * touchpad, as it is generally not OK to send arbitrary bytes out the
++ * PS/2 port.  Each of the sequences in this table sends one nibble of the
++ * register address or (write) data.  Different versions of the ALPS protocol
++ * use slightly different encodings.
++ */
+ struct alps_nibble_commands {
+ 	int command;
+ 	unsigned char data;
+ };
+ 
++/**
++ * struct alps_fields - decoded version of the report packet
++ * @x_map: Bitmap of active X positions for MT.
++ * @y_map: Bitmap of active Y positions for MT.
++ * @fingers: Number of fingers for MT.
++ * @x: X position for ST.
++ * @y: Y position for ST.
++ * @z: Z position for ST.
++ * @first_mp: Packet is the first of a multi-packet report.
++ * @is_mp: Packet is part of a multi-packet report.
++ * @left: Left touchpad button is active.
++ * @right: Right touchpad button is active.
++ * @middle: Middle touchpad button is active.
++ * @ts_left: Left trackstick button is active.
++ * @ts_right: Right trackstick button is active.
++ * @ts_middle: Middle trackstick button is active.
++ */
++struct alps_fields {
++	unsigned int x_map;
++	unsigned int y_map;
++	unsigned int fingers;
++	unsigned int x;
++	unsigned int y;
++	unsigned int z;
++	unsigned int first_mp:1;
++	unsigned int is_mp:1;
++
++	unsigned int left:1;
++	unsigned int right:1;
++	unsigned int middle:1;
++
++	unsigned int ts_left:1;
++	unsigned int ts_right:1;
++	unsigned int ts_middle:1;
++};
++
++/**
++ * struct alps_data - private data structure for the ALPS driver
++ * @dev2: "Relative" device used to report trackstick or mouse activity.
++ * @phys: Physical path for the relative device.
++ * @nibble_commands: Command mapping used for touchpad register accesses.
++ * @addr_command: Command used to tell the touchpad that a register address
++ *   follows.
++ * @proto_version: Indicates V1/V2/V3/...
++ * @byte0: Helps figure out whether a position report packet matches the
++ *   known format for this model.  The first byte of the report, ANDed with
++ *   mask0, should match byte0.
++ * @mask0: The mask used to check the first byte of the report.
++ * @flags: Additional device capabilities (passthrough port, trackstick, etc.).
++ * @x_max: Largest possible X position value.
++ * @y_max: Largest possible Y position value.
++ * @x_bits: Number of X bits in the MT bitmap.
++ * @y_bits: Number of Y bits in the MT bitmap.
++ * @hw_init: Protocol-specific hardware init function.
++ * @process_packet: Protocol-specific function to process a report packet.
++ * @decode_fields: Protocol-specific function to read packet bitfields.
++ * @set_abs_params: Protocol-specific function to configure the input_dev.
++ * @prev_fin: Finger bit from previous packet.
++ * @multi_packet: Multi-packet data in progress.
++ * @multi_data: Saved multi-packet data.
++ * @x1: First X coordinate from last MT report.
++ * @x2: Second X coordinate from last MT report.
++ * @y1: First Y coordinate from last MT report.
++ * @y2: Second Y coordinate from last MT report.
++ * @fingers: Number of fingers from last MT report.
++ * @quirks: Bitmap of ALPS_QUIRK_*.
++ * @timer: Timer for flushing out the final report packet in the stream.
++ */
+ struct alps_data {
+-	struct input_dev *dev2;		/* Relative device */
+-	char phys[32];			/* Phys */
+-	const struct alps_model_info *i;/* Info */
++	struct input_dev *dev2;
++	char phys[32];
++
++	/* these are autodetected when the device is identified */
+ 	const struct alps_nibble_commands *nibble_commands;
+-	int addr_command;		/* Command to set register address */
+-	int prev_fin;			/* Finger bit from previous packet */
+-	int multi_packet;		/* Multi-packet data in progress */
+-	unsigned char multi_data[6];	/* Saved multi-packet data */
+-	int x1, x2, y1, y2;		/* Coordinates from last MT report */
+-	int fingers;			/* Number of fingers from MT report */
++	int addr_command;
++	unsigned char proto_version;
++	unsigned char byte0, mask0;
++	unsigned char flags;
++	int x_max;
++	int y_max;
++	int x_bits;
++	int y_bits;
++
++	int (*hw_init)(struct psmouse *psmouse);
++	void (*process_packet)(struct psmouse *psmouse);
++	void (*decode_fields)(struct alps_fields *f, unsigned char *p);
++	void (*set_abs_params)(struct alps_data *priv, struct input_dev *dev1);
++
++	int prev_fin;
++	int multi_packet;
++	unsigned char multi_data[6];
++	int x1, x2, y1, y2;
++	int fingers;
+ 	u8 quirks;
+ 	struct timer_list timer;
+ };
diff --git a/arm-tegra-sdhci-module-fix.patch b/arm-tegra-sdhci-module-fix.patch
index 24ba278..0c5d244 100644
--- a/arm-tegra-sdhci-module-fix.patch
+++ b/arm-tegra-sdhci-module-fix.patch
@@ -7,5 +7,5 @@
 -MODULE_DEVICE_TABLE(of, sdhci_dt_ids);
 +MODULE_DEVICE_TABLE(of, sdhci_tegra_dt_match);
  
- static struct tegra_sdhci_platform_data * __devinit sdhci_tegra_dt_parse_pdata(
+ static struct tegra_sdhci_platform_data * sdhci_tegra_dt_parse_pdata(
  						struct platform_device *pdev)
diff --git a/linux-2.6-compile-fixes.patch b/compile-fixes.patch
similarity index 100%
rename from linux-2.6-compile-fixes.patch
rename to compile-fixes.patch
diff --git a/config-arm-generic b/config-arm-generic
index 92e3e5c..5cd466e 100644
--- a/config-arm-generic
+++ b/config-arm-generic
@@ -64,6 +64,7 @@ CONFIG_SCHED_SMT=y
 CONFIG_RCU_FANOUT=32
 
 CONFIG_CPU_IDLE=y
+# CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set
 # CONFIG_CPU_IDLE_GOV_LADDER is not set
 CONFIG_CPU_IDLE_GOV_MENU=y
 
@@ -110,6 +111,7 @@ CONFIG_RFKILL_GPIO=m
 CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
 CONFIG_GPIO_GENERIC_PLATFORM=m
 CONFIG_PINCTRL_SINGLE=m
+CONFIG_POWER_RESET_GPIO=y
 
 CONFIG_USB_ULPI=y
 
@@ -135,7 +137,9 @@ CONFIG_SERIO_AMBAKMI=m
 CONFIG_I2C_NOMADIK=m
 CONFIG_ARM_SP805_WATCHDOG=m
 CONFIG_FB_ARMCLCD=m
+CONFIG_FB_SSD1307=m
 CONFIG_MPCORE_WATCHDOG=m
+CONFIG_BACKLIGHT_PWM=m
 
 CONFIG_MMC_ARMMMCI=m
 CONFIG_MMC_SDHCI_PLTFM=m
@@ -256,6 +260,7 @@ CONFIG_HW_RANDOM_ATMEL=m
 CONFIG_HW_RANDOM_EXYNOS=m
 
 # Device tree
+CONFIG_DTC=y
 CONFIG_OF=y
 CONFIG_USE_OF=y
 CONFIG_OF_DEVICE=y
@@ -351,6 +356,8 @@ CONFIG_MFD_88PM805=m
 CONFIG_MFD_ARIZONA_SPI=m
 CONFIG_MFD_MC13XXX_SPI=m
 CONFIG_MFD_SYSCON=y
+# CONFIG_MFD_TPS80031 is not set
+# CONFIG_MFD_AS3711 is not set
 # CONFIG_MFD_WM5102 is not set
 # CONFIG_MFD_WM5110 is not set
 # CONFIG_MFD_TPS65912_SPI is not set
@@ -362,19 +369,23 @@ CONFIG_MFD_SYSCON=y
 
 CONFIG_REGULATOR_VIRTUAL_CONSUMER=m
 CONFIG_REGULATOR_USERSPACE_CONSUMER=m
+# CONFIG_REGULATOR_DUMMY is not set
 CONFIG_REGULATOR_GPIO=m
 CONFIG_REGULATOR_AD5398=m
 CONFIG_REGULATOR_ANATOP=m
 CONFIG_REGULATOR_ARIZONA=m
 CONFIG_REGULATOR_FAN53555=m
 CONFIG_REGULATOR_ISL6271A=m
+CONFIG_REGULATOR_LP3972=m
 CONFIG_REGULATOR_MAX1586=m
 CONFIG_REGULATOR_MAX8649=m
 CONFIG_REGULATOR_MAX8660=m
 CONFIG_REGULATOR_MAX8952=m
+CONFIG_REGULATOR_MAX8973=m
 CONFIG_REGULATOR_MC13783=m
 CONFIG_REGULATOR_MC13892=m
 CONFIG_REGULATOR_LP3971=m
+CONFIG_REGULATOR_TPS51632=m
 CONFIG_REGULATOR_TPS62360=m
 CONFIG_REGULATOR_TPS65023=m
 CONFIG_REGULATOR_TPS6524X=m
@@ -395,6 +406,7 @@ CONFIG_IEEE802154_MRF24J40=m
 
 # CONFIG_ARM_VIRT_EXT is not set
 # CONFIG_PINCTRL_EXYNOS4 is not set
+# CONFIG_PINCTRL_EXYNOS5440 is not set
 
 # CONFIG_AUTO_ZRELADDR is not set
 # CONFIG_ASYMMETRIC_KEY_TYPE is not set
@@ -488,6 +500,7 @@ CONFIG_TOUCHSCREEN_MC13783=m
 # CONFIG_NET_VENDOR_MICROCHIP is not set
 # CONFIG_CS89x0 is not set
 # CONFIG_DVB_USB_PCTV452E is not set
+# CONFIG_PINCTRL_EXYNOS is not set
 
 # CONFIG_EZX_PCAP is not set
 
diff --git a/config-arm-kirkwood b/config-arm-kirkwood
index d729e75..9f80aaf 100644
--- a/config-arm-kirkwood
+++ b/config-arm-kirkwood
@@ -15,20 +15,29 @@ CONFIG_MACH_GURUPLUG=y
 CONFIG_MACH_ICONNECT_DT=y
 CONFIG_MACH_IB62X0_DT=y
 CONFIG_MACH_INETSPACE_V2=y
+CONFIG_MACH_INETSPACE_V2_DT=y
 CONFIG_MACH_IOMEGA_IX2_200_DT=y
 CONFIG_MACH_KM_KIRKWOOD_DT=y
 CONFIG_MACH_LSXL_DT=y
+CONFIG_MACH_MPLCEC4_DT=y
 CONFIG_MACH_MV88F6281GTW_GE=y
-CONFIG_MACH_NETSPACE_V2=y
+CONFIG_MACH_NETSPACE_LITE_V2_DT=y
 CONFIG_MACH_NETSPACE_MAX_V2=y
+CONFIG_MACH_NETSPACE_MAX_V2_DT=y
+CONFIG_MACH_NETSPACE_MINI_V2_DT=y
+CONFIG_MACH_NETSPACE_V2=y
+CONFIG_MACH_NETSPACE_V2_DT=y
 CONFIG_MACH_NET2BIG_V2=y
 CONFIG_MACH_NET5BIG_V2=y
+CONFIG_MACH_NSA310_DT=y
+CONFIG_MACH_OPENBLOCKS_A6_DT=y
 CONFIG_MACH_OPENRD_BASE=y
 CONFIG_MACH_OPENRD_CLIENT=y
 CONFIG_MACH_OPENRD_ULTIMATE=y
 CONFIG_MACH_RD88F6192_NAS=y
 CONFIG_MACH_RD88F6281=y
 CONFIG_MACH_SHEEVAPLUG=y
+CONFIG_MACH_TOPKICK_DT=y
 CONFIG_MACH_TS219=y
 CONFIG_MACH_TS219_DT=y
 CONFIG_MACH_TS41X=y
@@ -52,6 +61,7 @@ CONFIG_LEDS_NETXBIG=m
 CONFIG_RTC_DRV_MV=y
 CONFIG_MV_XOR=y
 CONFIG_CRYPTO_DEV_MV_CESA=m
+# CONFIG_PINCTRL_EXYNOS is not set
 CONFIG_PINCTRL_MVEBU=y
 CONFIG_PINCTRL_KIRKWOOD=y
 
diff --git a/config-arm-omap b/config-arm-omap
index 7e27075..554ce05 100644
--- a/config-arm-omap
+++ b/config-arm-omap
@@ -41,7 +41,7 @@ CONFIG_SOC_OMAP3430=y
 CONFIG_SOC_TI81XX=y
 CONFIG_SOC_AM33XX=y
 CONFIG_SOC_OMAPTI816X=y
-CONFIG_SOC_OMAP5=y
+# CONFIG_SOC_OMAP5 is not set
 CONFIG_OMAP_PACKAGE_CBB=y
 CONFIG_OMAP_PACKAGE_CBL=y
 CONFIG_OMAP_PACKAGE_CBS=y
@@ -174,6 +174,7 @@ CONFIG_TOUCHSCREEN_TI_TSCADC=m
 CONFIG_SERIAL_OMAP=y
 CONFIG_SERIAL_OMAP_CONSOLE=y
 CONFIG_OMAP_WATCHDOG=y
+CONFIG_CLK_TWL6040=m
 CONFIG_TWL4030_CORE=y
 CONFIG_TWL4030_MADC=m
 CONFIG_TWL4030_POWER=y
@@ -185,6 +186,7 @@ CONFIG_CHARGER_TWL4030=m
 CONFIG_TWL6030_PWM=m
 CONFIG_TWL6040_CORE=y
 CONFIG_SENSORS_TWL4030_MADC=m
+CONFIG_SENSORS_LIS3_I2C=m
 CONFIG_TI_DAVINCI_EMAC=m
 CONFIG_TI_DAVINCI_MDIO=m
 CONFIG_TI_DAVINCI_CPDMA=m
@@ -194,12 +196,16 @@ CONFIG_LEDS_LP8788=m
 CONFIG_MTD_ONENAND_OMAP2=y
 CONFIG_HDQ_MASTER_OMAP=m
 CONFIG_I2C_OMAP=m
-CONFIG_SPI_OMAP24XX=y
+CONFIG_SPI_OMAP24XX=m
 CONFIG_MFD_OMAP_USB_HOST=y
 CONFIG_MFD_WL1273_CORE=m
 CONFIG_MFD_LP8788=y
+CONFIG_MFD_TPS65910=y
+CONFIG_GPIO_TPS65910=y
 CONFIG_REGULATOR_TWL4030=y
 CONFIG_REGULATOR_LP8788=y
+CONFIG_REGULATOR_TPS65217=y
+CONFIG_REGULATOR_TPS65910=y
 # Enable V4L2 drivers for OMAP2+
 CONFIG_MEDIA_CONTROLLER=y
 CONFIG_VIDEO_V4L2_SUBDEV_API=y
@@ -236,20 +242,24 @@ CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=0
 CONFIG_OMAP2_DSS_SLEEP_BEFORE_RESET=y
 CONFIG_OMAP2_DSS_SLEEP_AFTER_VENC_RESET=y
 
+CONFIG_FB_DA8XX=m
+CONFIG_FB_DA8XX_CONSISTENT_DMA_SIZE=5
+
+CONFIG_LCD_CLASS_DEVICE=m
+CONFIG_PANEL_GENERIC_DPI=m
 CONFIG_PANEL_TFP410=m
 CONFIG_PANEL_TAAL=m
 CONFIG_PANEL_PICODLP=m
+CONFIG_PANEL_SHARP_LS037V7DW01=m
+CONFIG_PANEL_NEC_NL8048HL11_01B=m
+CONFIG_PANEL_TPO_TD043MTEA1=m
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=m
+CONFIG_BACKLIGHT_PWM=m
 CONFIG_BACKLIGHT_PANDORA=m
 
-#
-# OMAP2/3 Display Device Drivers
-#
-CONFIG_PANEL_GENERIC_DPI=y
-CONFIG_PANEL_SHARP_LS037V7DW01=y
-CONFIG_PANEL_NEC_NL8048HL11_01B=y
-CONFIG_PANEL_TPO_TD043MTEA1=y
-
 CONFIG_SND_OMAP_SOC=y
+CONFIG_SND_OMAP_SOC_DMIC=m
 CONFIG_SND_OMAP_SOC_MCBSP=m
 CONFIG_SND_OMAP_SOC_MCPDM=m
 CONFIG_SND_OMAP_SOC_OVERO=m
@@ -260,20 +270,18 @@ CONFIG_SND_OMAP_SOC_SDP4430=m
 CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m
 CONFIG_SND_OMAP_SOC_OMAP3_BEAGLE=m
 CONFIG_SND_OMAP_SOC_ZOOM2=m
-CONFIG_SND_OMAP_SOC_IGEP0020=y
-CONFIG_SND_OMAP_SOC_OMAP_HDMI=y
-# Because alsa is modular http://www.spinics.net/lists/linux-omap/msg67307.html
-# CONFIG_SND_OMAP_SOC_OMAP4_HDMI is not set
+CONFIG_SND_OMAP_SOC_IGEP0020=m
+CONFIG_SND_OMAP_SOC_OMAP_HDMI=m
 CONFIG_SND_OMAP_SOC_OMAP_ABE_TWL6040=m
 CONFIG_SND_OMAP_SOC_OMAP_TWL4030=m
 CONFIG_SND_SOC_I2C_AND_SPI=y
 # CONFIG_SND_OMAP_SOC_RX51 is not set
 # CONFIG_SND_SOC_ALL_CODECS is not set
-CONFIG_SND_SOC_TLV320AIC23=y
-CONFIG_SND_SOC_TLV320AIC3X=y
-CONFIG_SND_SOC_TWL4030=y
-CONFIG_SND_SOC_TWL6040=y
-CONFIG_RADIO_WL128X
+CONFIG_SND_SOC_TLV320AIC23=m
+CONFIG_SND_SOC_TLV320AIC3X=m
+CONFIG_SND_SOC_TWL4030=m
+CONFIG_SND_SOC_TWL6040=m
+CONFIG_RADIO_WL128X=m
 
 CONFIG_USB_OTG=y
 CONFIG_USB_EHCI_HCD_OMAP=y
@@ -301,9 +309,17 @@ CONFIG_MMC_OMAP=y
 CONFIG_MMC_OMAP_HS=y
 CONFIG_TWL4030_USB=y
 CONFIG_TWL6030_USB=y
+CONFIG_RTC_DRV_OMAP=m
 CONFIG_RTC_DRV_TWL4030=y
+CONFIG_RTC_DRV_TPS65910=m
+
+CONFIG_PWM_TIECAP=m
+CONFIG_PWM_TIEHRPWM=m
+CONFIG_PWM_TWL=m
+CONFIG_PWM_TWL_LED=m
 
-CONFIG_IR_RX51=m
+# CONFIG_IR_RX51 is not set
+# CONFIG_BATTERY_RX51 is not set
 
 # CONFIG_TIDSPBRIDGE is not set
 # CONFIG_TIDSPBRIDGE_MEMPOOL_SIZE=0x600000
@@ -317,6 +333,7 @@ CONFIG_IR_RX51=m
 
 # CONFIG_OMAP_REMOTEPROC is not set
 # CONFIG_OMAP_BANDGAP is not set
+# CONFIG_OMAP_BANDGAP is not set
 # CONFIG_OMAP_IOVMM is not set
 
 CONFIG_CRYPTO_DEV_OMAP_SHAM=m
@@ -324,7 +341,6 @@ CONFIG_CRYPTO_DEV_OMAP_AES=m
 
 # CONFIG_NET_VENDOR_BROADCOM is not set
 # CONFIG_MTD_NAND_OMAP_BCH is not set
-# CONFIG_MFD_TPS65910 is not set
 # CONFIG_MFD_TPS65912_I2C is not set
 # CONFIG_PMIC_DA903X is not set
 # CONFIG_MFD_DA9052_I2C is not set
@@ -337,7 +353,8 @@ CONFIG_CRYPTO_DEV_OMAP_AES=m
 # CONFIG_MFD_AAT2870_CORE is not set
 # CONFIG_MFD_RC5T583 is not set
 # CONFIG_MFD_PALMAS is not set
-# CONFIG_REGULATOR_DUMMY is not set
 # CONFIG_REGULATOR_LP3972 is not set
 # CONFIG_REGULATOR_LP872X is not set
 
+# CONFIG_OMAP2_DSS_DEBUG is not set
+# CONFIG_OMAP2_DSS_DEBUGFS is not set
diff --git a/config-arm-tegra b/config-arm-tegra
index f74f579..30f2493 100644
--- a/config-arm-tegra
+++ b/config-arm-tegra
@@ -3,7 +3,6 @@ CONFIG_ARCH_TEGRA=y
 CONFIG_ARCH_TEGRA_2x_SOC=y
 # CONFIG_ARCH_TEGRA_3x_SOC is not set
 # CONFIG_ARM_LPAE is not set
-CONFIG_TEGRA_PCI=y
 
 CONFIG_VFP=y
 CONFIG_VFPv3=y
@@ -20,6 +19,7 @@ CONFIG_MACH_VENTANA=y
 CONFIG_TEGRA_DEBUG_UARTD=y
 CONFIG_ARM_CPU_TOPOLOGY=y
 
+CONFIG_TEGRA_PCI=y
 CONFIG_TEGRA_IOMMU_GART=y
 CONFIG_TEGRA_IOMMU_SMMU=y
 
@@ -76,10 +76,12 @@ CONFIG_SND_SOC_TEGRA_ALC5632=m
 CONFIG_SND_SOC_TEGRA_WM8753=m
 CONFIG_SND_SOC_TEGRA_WM8903=m
 CONFIG_SND_SOC_TEGRA_TRIMSLICE=m
-# CONFIG_SND_SOC_TEGRA30_AHUB is not set
-# CONFIG_SND_SOC_TEGRA30_I2S is not set
+CONFIG_SND_SOC_TEGRA30_AHUB=m
+CONFIG_SND_SOC_TEGRA30_I2S=m
 
-CONFIG_MFD_NVEC=y
+# AC100 (PAZ00)
+# CONFIG_MFD_NVEC is not set
+CONFIG_MFD_TPS80031=y
 CONFIG_KEYBOARD_NVEC=y
 CONFIG_SERIO_NVEC_PS2=y
 CONFIG_NVEC_POWER=y
@@ -87,6 +89,13 @@ CONFIG_POWER_SUPPLY=y
 CONFIG_NVEC_LEDS=y
 CONFIG_NVEC_PAZ00=y
 
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_RTC_DRV_TPS6586X is not set
+
+CONFIG_PWM_TEGRA=m
+
+CONFIG_DRM_TEGRA=m
+
 CONFIG_CPU_PM=y
 CONFIG_ARM_CPU_SUSPEND=y
 
@@ -101,6 +110,8 @@ CONFIG_OF_GPIO=y
 CONFIG_OF_PCI=y
 CONFIG_OF_PCI_IRQ=y
 
+# CONFIG_DRM_TEGRA_DEBUG is not set
+
 # CONFIG_TI_DAC7512 is not set
 # CONFIG_SPI_TOPCLIFF_PCH is not set
 # CONFIG_SPI_DW_PCI is not set
diff --git a/config-armv7 b/config-armv7
index 3a8c5b6..bbb64ec 100644
--- a/config-armv7
+++ b/config-armv7
@@ -5,12 +5,18 @@ CONFIG_CPU_V7=y
 # CONFIG_ARCH_MULTI_V6 is not set
 CONFIG_ARCH_MULTI_V6_V7=y
 CONFIG_ARCH_MULTI_V7=y
-CONFIG_ARCH_MVEBU=y
+# This is V6 so we'll eventually support it in v5 unified kernels
+# CONFIG_ARCH_BCM is not set
 CONFIG_ARCH_HIGHBANK=y
+CONFIG_ARCH_MVEBU=y
+# CONFIG_ARCH_MXC is not set
 CONFIG_ARCH_PICOXCELL=y
 CONFIG_ARCH_SOCFPGA=y
+CONFIG_ARCH_SUNXI=y
 CONFIG_ARCH_VEXPRESS_CA9X4=y
 CONFIG_ARCH_VEXPRESS_DT=y
+# not enabling first round
+# CONFIG_ARCH_ZYNQ is not set
 
 CONFIG_MACH_ARMADA_370_XP=y
 CONFIG_MACH_ARMADA_370=y
@@ -49,6 +55,7 @@ CONFIG_HIGHPTE=y
 # CONFIG_THUMB2_KERNEL is not set
 # CONFIG_XEN is not set
 CONFIG_HVC_DCC=y
+# CONFIG_VIRTIO_CONSOLE is not set
 
 # CONFIG_ARM_VIRT_EXT is not set
 
@@ -89,6 +96,7 @@ CONFIG_RCU_FANOUT_LEAF=16
 CONFIG_CPU_IDLE=y
 # CONFIG_CPU_IDLE_GOV_LADDER is not set
 CONFIG_CPU_IDLE_GOV_MENU=y
+CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y
 
 CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
 CONFIG_LSM_MMAP_MIN_ADDR=32768
@@ -148,6 +156,8 @@ CONFIG_AMBA_PL08X=y
 CONFIG_ARM_SP805_WATCHDOG=m
 
 # highbank
+CONFIG_CPU_IDLE_CALXEDA=y
+
 CONFIG_EDAC_HIGHBANK_MC=m
 CONFIG_EDAC_HIGHBANK_L2=m
 
@@ -166,6 +176,7 @@ CONFIG_TOUCHSCREEN_ADS7846=m
 CONFIG_I2C_VERSATILE=m
 CONFIG_OC_ETM=y
 CONFIG_ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA=y
+CONFIG_SENSORS_VEXPRESS=m
 
 # unknown and needs review
 CONFIG_ARM_AMBA=y
@@ -177,9 +188,67 @@ CONFIG_CRYPTO_DEV_MV_CESA=m
 CONFIG_MV643XX_ETH=m
 CONFIG_I2C_MV64XXX=m
 CONFIG_PINCTRL_MVEBU=y
+CONFIG_PINCTRL_ARMADA_370=y
+CONFIG_PINCTRL_ARMADA_XP=y
+CONFIG_PINCTRL_DOVE=y
+CONFIG_EDAC_MV64X60=m
+CONFIG_MVNETA=m
+CONFIG_SATA_MV=m
+CONFIG_MARVELL_PHY=m
+CONFIG_RTC_DRV_S35390A=y
+CONFIG_USB_EHCI_MV=m
+
+# Allwinner a1x
+# CONFIG_SUNXI_RFKILL=y
+# CONFIG_SUNXI_NAND=y
+# CONFIG_SUNXI_DBGREG=m
+# CONFIG_WEMAC_SUN4I=y
+# CONFIG_KEYBOARD_SUN4IKEYPAD=m
+# CONFIG_KEYBOARD_SUN4I_KEYBOARD=m
+# CONFIG_IR_SUN4I=m
+# CONFIG_TOUCHSCREEN_SUN4I_TS=m
+# CONFIG_SUN4I_G2D=y
+# CONFIG_I2C_SUN4I=y
+# CONFIG_DRM_MALI=m
+# CONFIG_MALI=m
+# CONFIG_FB_SUNXI=m
+# CONFIG_FB_SUNXI_UMP=y
+# CONFIG_FB_SUNXI_LCD=m
+# CONFIG_FB_SUNXI_HDMI=m
+# CONFIG_SOUND_SUN4I=y
+# CONFIG_SND_SUN4I_SOC_CODEC=y
+# CONFIG_SND_SUN4I_SOC_HDMIAUDIO=y
+# CONFIG_SND_SUN4I_SOC_SPDIF=m
+# CONFIG_SND_SUN4I_SOC_I2S_INTERFACE=m
+# CONFIG_SND_SOC_I2C_AND_SPI=y
+# CONFIG_USB_SW_SUN4I_HCD=y
+# CONFIG_USB_SW_SUN4I_HCD0=y
+# CONFIG_USB_SW_SUN4I_HCI=y
+# CONFIG_USB_SW_SUN4I_EHCI0=y
+# CONFIG_USB_SW_SUN4I_EHCI1=y
+# CONFIG_USB_SW_SUN4I_OHCI0=y
+# CONFIG_USB_SW_SUN4I_OHCI1=y
+# CONFIG_USB_SW_SUN4I_USB=y
+# CONFIG_USB_SW_SUN4I_USB_MANAGER=y
+# CONFIG_MMC_SUNXI_POWER_CONTROL=y
+# CONFIG_MMC_SUNXI=y
+# CONFIG_RTC_DRV_SUN4I=y
+
+# imx 
+CONFIG_BACKLIGHT_PWM=m
+# CONFIG_DRM_IMX is not set
+# CONFIG_DRM_IMX_FB_HELPER=m
+# CONFIG_DRM_IMX_PARALLEL_DISPLAY=m
+# CONFIG_DRM_IMX_IPUV3_CORE=m
+# CONFIG_DRM_IMX_IPUV3=m
+# CONFIG_VIDEO_CODA is not set
+
+CONFIG_INPUT_PWM_BEEPER=m
 
 # exynos
 # CONFIG_DRM_EXYNOS is not set
+# CONFIG_PINCTRL_EXYNOS5440 is not set
+# CONFIG_PINCTRL_EXYNOS is not set
 
 # picoxcell
 CONFIG_CRYPTO_DEV_PICOXCELL=m
@@ -187,8 +256,12 @@ CONFIG_CRYPTO_DEV_PICOXCELL=m
 # ST Ericsson
 # CONFIG_I2C_NOMADIK is not set
 
+# OMAP
+# CONFIG_SENSORS_LIS3_I2C is not set
+
 # General ARM drivers
 # Device tree
+CONFIG_DTC=y
 CONFIG_OF=y
 CONFIG_USE_OF=y
 CONFIG_OF_DEVICE=y
@@ -256,6 +329,7 @@ CONFIG_EDAC_LEGACY_SYSFS=y
 CONFIG_MPCORE_WATCHDOG=m
 
 # Multi function devices
+CONFIG_MFD_CORE=m
 CONFIG_MFD_T7L66XB=y
 CONFIG_MFD_TC6387XB=y
 CONFIG_MFD_SYSCON=y
@@ -278,6 +352,7 @@ CONFIG_GPIO_GENERIC_PLATFORM=m
 CONFIG_GPIO_EM=m
 CONFIG_GPIO_ADNP=m
 CONFIG_GPIO_MCP23S08=m
+CONFIG_POWER_RESET_GPIO=y
 CONFIG_RFKILL_GPIO=m
 CONFIG_SERIAL_8250_EM=m
 CONFIG_INPUT_GP2A=m
@@ -288,6 +363,9 @@ CONFIG_MDIO_BUS_MUX_MMIOREG=m
 CONFIG_MTD_OF_PARTS=y
 # CONFIG_MG_DISK is not set
 
+# Framebuffers
+CONFIG_FB_SSD1307=m
+
 # Regulator drivers
 CONFIG_REGULATOR_FAN53555=m
 # Needs work/investigation
@@ -333,6 +411,7 @@ CONFIG_PERF_EVENTS=y
 # CONFIG_VIDEO_DM6446_CCDC is not set
 # CONFIG_PANEL_TAAL is not set
 # CONFIG_IR_RX51 is not set
+# CONFIG_DRM_OMAP is not set
 
 # CONFIG_GENERIC_CPUFREQ_CPU0 is not set
 # CONFIG_GPIO_TWL6040 is not set
@@ -342,7 +421,6 @@ CONFIG_PERF_EVENTS=y
 # CONFIG_MFD_MAX8907 is not set
 # CONFIG_REGULATOR_FAN53555 is not set
 # CONFIG_REGULATOR_ANATOP is not set
-# CONFIG_IR_RX51 is not set
 # CONFIG_VIDEO_DM6446_CCDC is not set
 # CONFIG_PANEL_TAAL is not set
 # CONFIG_SND_OMAP_SOC_OMAP_TWL4030 is not set
diff --git a/config-generic b/config-generic
index 88f6ff1..0c7e209 100644
--- a/config-generic
+++ b/config-generic
@@ -4,6 +4,8 @@
 CONFIG_MMU=y
 CONFIG_SMP=y
 CONFIG_HOTPLUG_CPU=y
+# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set
+# CONFIG_DEBUG_HOTPLUG_CPU0 is not set
 CONFIG_LOCALVERSION=""
 CONFIG_CROSS_COMPILE=""
 CONFIG_DEFAULT_HOSTNAME="(none)"
@@ -52,6 +54,8 @@ CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
 CONFIG_CFQ_GROUP_IOSCHED=y
 CONFIG_DEFAULT_CFQ=y
+# CONFIG_CHECKPOINT_RESTORE is not set
+CONFIG_NAMESPACES=y
 CONFIG_PID_NS=y
 CONFIG_UTS_NS=y
 CONFIG_IPC_NS=y
@@ -124,6 +128,7 @@ CONFIG_MMC_BLOCK_MINORS=8
 CONFIG_MMC_BLOCK_BOUNCE=y
 CONFIG_MMC_SDHCI=m
 CONFIG_MMC_SDHCI_PCI=m
+CONFIG_MMC_SDHCI_ACPI=m
 CONFIG_MMC_SDRICOH_CS=m
 CONFIG_MMC_TIFM_SD=m
 CONFIG_MMC_WBSD=m
@@ -132,6 +137,7 @@ CONFIG_MMC_SDHCI_PLTFM=m
 CONFIG_MMC_CB710=m
 CONFIG_MMC_RICOH_MMC=y
 CONFIG_MMC_USHC=m
+CONFIG_MMC_REALTEK_PCI=m
 CONFIG_MMC_VUB300=m
 
 CONFIG_CB710_CORE=m
@@ -340,6 +346,7 @@ CONFIG_SCSI_SRP=m
 CONFIG_SCSI_SRP_ATTRS=m
 CONFIG_SCSI_TGT=m
 CONFIG_SCSI_ISCI=m
+CONFIG_SCSI_CHELSIO_FCOE=m
 
 CONFIG_SCSI_DH=y
 CONFIG_SCSI_DH_RDAC=m
@@ -416,6 +423,9 @@ CONFIG_SCSI_MVSAS_TASKLET=y
 CONFIG_SCSI_MPT2SAS=m
 CONFIG_SCSI_MPT2SAS_MAX_SGE=128
 CONFIG_SCSI_MPT2SAS_LOGGING=y
+CONFIG_SCSI_MPT3SAS=m
+CONFIG_SCSI_MPT3SAS_MAX_SGE=128
+CONFIG_SCSI_MPT3SAS_LOGGING=y
 
 CONFIG_SCSI_UFSHCD=m
 
@@ -607,6 +617,7 @@ CONFIG_FIREWIRE_SBP2=m
 CONFIG_FIREWIRE_NET=m
 CONFIG_FIREWIRE_OHCI_DEBUG=y
 CONFIG_FIREWIRE_NOSY=m
+CONFIG_FIREWIRE_SERIAL=m
 # CONFIG_FIREWIRE_OHCI_REMOTE_DMA is not set
 
 #
@@ -977,9 +988,11 @@ CONFIG_IP_SCTP=m
 CONFIG_NET_SCTPPROBE=m
 # CONFIG_SCTP_DBG_MSG is not set
 # CONFIG_SCTP_DBG_OBJCNT is not set
-# CONFIG_SCTP_HMAC_NONE is not set
-CONFIG_SCTP_HMAC_SHA1=y
-# CONFIG_SCTP_HMAC_MD5 is not set
+CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1=y
+# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5 is not set
+# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set
+CONFIG_SCTP_COOKIE_HMAC_MD5=y
+CONFIG_SCTP_COOKIE_HMAC_SHA1=y
 CONFIG_ATM=m
 CONFIG_VLAN_8021Q=m
 CONFIG_VLAN_8021Q_GVRP=y
@@ -1077,6 +1090,7 @@ CONFIG_DCB=y
 CONFIG_DNS_RESOLVER=m
 CONFIG_BATMAN_ADV=m
 CONFIG_BATMAN_ADV_BLA=y
+CONFIG_BATMAN_ADV_DAT=y
 # CONFIG_BATMAN_ADV_DEBUG is not set
 CONFIG_OPENVSWITCH=m
 CONFIG_NETPRIO_CGROUP=m
@@ -1187,6 +1201,9 @@ CONFIG_ATL2=m
 CONFIG_ATL1=m
 CONFIG_ATL1C=m
 CONFIG_ATL1E=m
+CONFIG_NET_CADENCE=y
+CONFIG_ARM_AT91_ETHER=m
+CONFIG_MACB=m
 
 CONFIG_NET_VENDOR_BROCADE=y
 CONFIG_BNA=m
@@ -1257,6 +1274,7 @@ CONFIG_IXGBE_PTP=y
 
 # CONFIG_NET_VENDOR_I825XX is not set
 CONFIG_NET_VENDOR_MARVELL=y
+CONFIG_MVMDIO=m
 CONFIG_SKGE=m
 # CONFIG_SKGE_DEBUG is not set
 CONFIG_SKGE_GENESIS=y
@@ -1483,6 +1501,7 @@ CONFIG_WIMAX_I2400M_DEBUG_LEVEL=8
 
 # CONFIG_ADM8211 is not set
 CONFIG_ATH_COMMON=m
+CONFIG_ATH_CARDS=m
 CONFIG_ATH5K=m
 CONFIG_ATH5K_DEBUG=y
 # CONFIG_ATH5K_TRACER is not set
@@ -1490,6 +1509,7 @@ CONFIG_ATH6KL=m
 CONFIG_ATH6KL_DEBUG=y
 CONFIG_ATH6KL_SDIO=m
 CONFIG_ATH6KL_USB=m
+CONFIG_AR5523=m
 CONFIG_ATH9K=m
 CONFIG_ATH9K_PCI=y
 CONFIG_ATH9K_AHB=y
@@ -1500,6 +1520,8 @@ CONFIG_ATH9K_HTC=m
 CONFIG_ATH9K_BTCOEX_SUPPORT=y
 # CONFIG_ATH9K_HTC_DEBUGFS is not set
 CONFIG_ATH9K_RATE_CONTROL=y
+CONFIG_WIL6210=m
+CONFIG_WIL6210_ISR_COR=y
 CONFIG_CARL9170=m
 CONFIG_CARL9170_LEDS=y
 # CONFIG_CARL9170_HWRNG is not set
@@ -1530,6 +1552,7 @@ CONFIG_BRCMFMAC=m
 CONFIG_BRCMFMAC_SDIO=y
 CONFIG_BRCMFMAC_SDIO_OOB=y
 CONFIG_BRCMFMAC_USB=y
+# CONFIG_BRCM_TRACING is not set
 # CONFIG_BRCMISCAN is not set
 # CONFIG_BRCMDBG is not set
 CONFIG_HERMES=m
@@ -1622,6 +1645,7 @@ CONFIG_RTL8192CE=m
 CONFIG_RTL8192SE=m
 CONFIG_RTL8192CU=m
 CONFIG_RTL8192DE=m
+CONFIG_RTL8723AE=m
 
 CONFIG_MWIFIEX=m
 CONFIG_MWIFIEX_SDIO=m
@@ -1932,6 +1956,7 @@ CONFIG_SERIO_SERPORT=y
 CONFIG_SERIO_RAW=m
 CONFIG_SERIO_ALTERA_PS2=m
 # CONFIG_SERIO_PS2MULT is not set
+CONFIG_SERIO_ARC_PS2=m
 
 # CONFIG_SERIO_CT82C710 is not set
 # CONFIG_SERIO_PARKBD is not set
@@ -2043,9 +2068,12 @@ CONFIG_TOUCHSCREEN_W90X900=m
 CONFIG_TOUCHSCREEN_ST1232=m
 CONFIG_TOUCHSCREEN_ATMEL_MXT=m
 # CONFIG_TOUCHSCREEN_MAX11801 is not set
+CONFIG_TOUCHSCREEN_AUO_PIXCIR=m
+CONFIG_TOUCHSCREEN_TI_AM335X_TSC=m
 
 CONFIG_INPUT_MISC=y
 CONFIG_INPUT_PCSPKR=m
+CONFIG_INPUT_RETU_PWRBUTTON=m
 CONFIG_INPUT_UINPUT=m
 CONFIG_INPUT_WISTRON_BTNS=m
 CONFIG_INPUT_ATLAS_BTNS=m
@@ -2169,6 +2197,8 @@ CONFIG_I2C_ALGOPCA=m
 # CONFIG_I2C_NFORCE2_S4985 is not set
 # CONFIG_I2C_INTEL_MID is not set
 # CONFIG_I2C_EG20T is not set
+# CONFIG_I2C_CBUS_GPIO is not set
+CONFIG_I2C_VIPERBOARD=m
 
 CONFIG_EEPROM_AT24=m
 CONFIG_EEPROM_LEGACY=m
@@ -2339,6 +2369,8 @@ CONFIG_SENSORS_MAX197=m
 # CONFIG_PCH_PHUB is not set
 # CONFIG_SERIAL_PCH_UART is not set
 # CONFIG_USB_SWITCH_FSA9480 is not set
+CONFIG_SERIAL_ARC=m
+CONFIG_SERIAL_ARC_NR_PORTS=1
 
 CONFIG_W1=m
 CONFIG_W1_CON=y
@@ -2451,6 +2483,7 @@ CONFIG_RTC_DRV_RS5C372=m
 # CONFIG_RTC_DRV_SA1100 is not set
 # CONFIG_RTC_DRV_TEST is not set
 CONFIG_RTC_DRV_X1205=m
+CONFIG_RTC_DRV_PCF8523=m
 CONFIG_RTC_DRV_V3020=m
 CONFIG_RTC_DRV_DS2404=m
 CONFIG_RTC_DRV_STK17TA8=m
@@ -2671,6 +2704,7 @@ CONFIG_DVB_BT8XX=m
 CONFIG_DVB_BUDGET_CORE=m
 CONFIG_DVB_PLUTO2=m
 CONFIG_SMS_SIANO_MDTV=m
+CONFIG_SMS_SIANO_RC=y
 CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
 CONFIG_SMS_USB_DRV=m
 CONFIG_SMS_SDIO_DRV=m
@@ -3044,6 +3078,7 @@ CONFIG_SND_USB_6FIRE=m
 CONFIG_SND_FIREWIRE=y
 CONFIG_SND_FIREWIRE_SPEAKERS=m
 CONFIG_SND_ISIGHT=m
+CONFIG_SND_SCS1X=m
 
 #
 # Open Sound System
@@ -3131,6 +3166,7 @@ CONFIG_USB_HID=y
 CONFIG_HID_SUPPORT=y
 
 CONFIG_HID=y
+CONFIG_I2C_HID=m
 CONFIG_HID_BATTERY_STRENGTH=y
 # debugging default is y upstream now
 CONFIG_HIDRAW=y
@@ -3161,6 +3197,7 @@ CONFIG_HID_PS3REMOTE=m
 CONFIG_HID_PRODIKEYS=m
 CONFIG_HID_DRAGONRISE=m
 CONFIG_HID_GYRATION=m
+CONFIG_HID_ICADE=m
 CONFIG_HID_TWINHAN=m
 CONFIG_HID_ORTEK=m
 CONFIG_HID_PANTHERLORD=m
@@ -3292,6 +3329,7 @@ CONFIG_USB_NET_RNDIS_HOST=m
 CONFIG_USB_NET_CDC_SUBSET=m
 CONFIG_USB_NET_CDC_EEM=m
 CONFIG_USB_NET_CDC_NCM=m
+CONFIG_USB_NET_CDC_MBIM=m
 CONFIG_USB_NET_ZAURUS=m
 CONFIG_USB_NET_CX82310_ETH=m
 CONFIG_USB_NET_INT51X1=m
@@ -3411,6 +3449,7 @@ CONFIG_USB_SEVSEG=m
 CONFIG_USB_ALI_M5632=y
 CONFIG_USB_APPLEDISPLAY=m
 # CONFIG_OMAP_USB2 is not set
+CONFIG_USB_RCAR_PHY=m
 CONFIG_USB_ATM=m
 CONFIG_USB_CXACRU=m
 # CONFIG_USB_C67X00_HCD is not set
@@ -3471,6 +3510,7 @@ CONFIG_SSB_PCMCIAHOST=y
 # CONFIG_SSB_SILENT is not set
 # CONFIG_SSB_DEBUG is not set
 CONFIG_SSB_DRIVER_PCICORE=y
+CONFIG_SSB_DRIVER_GPIO=y
 
 # Multifunction USB devices
 # CONFIG_MFD_PCF50633 is not set
@@ -3487,6 +3527,10 @@ CONFIG_MFD_SUPPORT=y
 CONFIG_MFD_VX855=m
 CONFIG_MFD_SM501=m
 CONFIG_MFD_SM501_GPIO=y
+CONFIG_MFD_RTSX_PCI=m
+# CONFIG_MFD_TI_AM335X_TSCADC is not set
+CONFIG_MFD_VIPERBOARD=m
+# CONFIG_MFD_RETU is not set
 # CONFIG_MFD_TC6393XB is not set
 # CONFIG_MFD_WM8400 is not set
 # CONFIG_MFD_WM8350_I2C is not set
@@ -3648,6 +3692,7 @@ CONFIG_9P_FS_POSIX_ACL=y
 CONFIG_FUSE_FS=m
 # CONFIG_OMFS_FS is not set
 CONFIG_CUSE=m
+# CONFIG_F2FS_FS is not set
 
 #
 # Network File Systems
@@ -3687,6 +3732,7 @@ CONFIG_CIFS_POSIX=y
 CONFIG_CIFS_FSCACHE=y
 CONFIG_CIFS_ACL=y
 CONFIG_CIFS_WEAK_PW_HASH=y
+CONFIG_CIFS_DEBUG=y
 # CONFIG_CIFS_DEBUG2 is not set
 CONFIG_CIFS_DFS_UPCALL=y
 CONFIG_CIFS_NFSD_EXPORT=y
@@ -4069,6 +4115,11 @@ CONFIG_KEXEC=y
 CONFIG_HWMON=y
 # CONFIG_HWMON_DEBUG_CHIP is not set
 CONFIG_THERMAL_HWMON=y
+# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
+# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
+CONFIG_FAIR_SHARE=y
+CONFIG_STEP_WISE=y
+# CONFIG_USER_SPACE is not set
 # CONFIG_CPU_THERMAL is not set
 
 CONFIG_INOTIFY=y
@@ -4145,6 +4196,7 @@ CONFIG_SND_INDIGOIOX=m
 CONFIG_SND_INDIGODJX=m
 # CONFIG_SND_SOC is not set
 
+CONFIG_BALLOON_COMPACTION=y
 CONFIG_COMPACTION=y
 CONFIG_MIGRATION=y
 CONFIG_NEW_LEDS=y
@@ -4256,6 +4308,8 @@ CONFIG_APM_POWER=m
 # CONFIG_CHARGER_LP8727 is not set
 # CONFIG_CHARGER_GPIO is not set
 # CONFIG_CHARGER_PCF50633 is not set
+# CONFIG_CHARGER_BQ2415X is not set
+CONFIG_POWER_RESET=y
 
 # CONFIG_PDA_POWER is not set
 
@@ -4265,6 +4319,7 @@ CONFIG_UIO=m
 CONFIG_UIO_CIF=m
 # CONFIG_UIO_PDRV is not set
 # CONFIG_UIO_PDRV_GENIRQ is not set
+# CONFIG_UIO_DMEM_GENIRQ is not set
 CONFIG_UIO_AEC=m
 CONFIG_UIO_SERCOS3=m
 CONFIG_UIO_PCI_GENERIC=m
@@ -4299,6 +4354,8 @@ CONFIG_NOZOMI=m
 # CONFIG_TPS65010 is not set
 
 CONFIG_INPUT_APANEL=m
+CONFIG_INPUT_GP2A=m
+# CONFIG_INPUT_GPIO_TILT_POLLED is not set
 
 # CONFIG_INTEL_MENLOW is not set
 CONFIG_ENCLOSURE_SERVICES=m
@@ -4312,6 +4369,7 @@ CONFIG_MSPRO_BLOCK=m
 CONFIG_MEMSTICK_TIFM_MS=m
 CONFIG_MEMSTICK_JMICRON_38X=m
 CONFIG_MEMSTICK_R592=m
+CONFIG_MEMSTICK_REALTEK_PCI=m
 
 CONFIG_ACCESSIBILITY=y
 CONFIG_A11Y_BRAILLE_CONSOLE=y
@@ -4432,6 +4490,7 @@ CONFIG_ALTERA_STAPL=m
 # CONFIG_BPCTL is not set
 # CONFIG_CED1401 is not set
 # CONFIG_DGRP is not set
+# CONFIG_SB105X is not set
 # END OF STAGING
 
 #
@@ -4459,8 +4518,9 @@ CONFIG_LSM_MMAP_MIN_ADDR=65536
 CONFIG_STRIP_ASM_SYMS=y
 
 # CONFIG_RCU_FANOUT_EXACT is not set
-# FIXME: Revisit FAST_NO_HZ after 3.5
+# FIXME: Revisit FAST_NO_HZ after it's fixed
 # CONFIG_RCU_FAST_NO_HZ is not set
+# CONFIG_RCU_NOCB_CPU is not set
 CONFIG_RCU_CPU_STALL_TIMEOUT=60
 # CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_RCU_TRACE is not set
@@ -4517,6 +4577,9 @@ CONFIG_GPIO_SYSFS=y
 # CONFIG_GPIO_CS5535 is not set
 # CONFIG_GPIO_ADP5588 is not set
 # CONFIG_GPIO_IT8761E is not set
+# CONFIG SB105x is not set
+# CONFIG_GPIO_TS5500 is not set
+CONFIG_GPIO_VIPERBOARD=m
 # CONFIG_GPIO_MAX7300 is not set
 # CONFIG_UCB1400_CORE is not set
 # CONFIG_TPS6105X is not set
@@ -4568,6 +4631,7 @@ CONFIG_BCMA_BLOCKIO=y
 CONFIG_BCMA_HOST_PCI_POSSIBLE=y
 CONFIG_BCMA_HOST_PCI=y
 CONFIG_BCMA_DRIVER_GMAC_CMN=y
+CONFIG_BCMA_DRIVER_GPIO=y
 # CONFIG_BCMA_DEBUG is not set
 
 # CONFIG_GOOGLE_FIRMWARE is not set
diff --git a/config-powerpc-generic b/config-powerpc-generic
index a6ef1c4..902dccd 100644
--- a/config-powerpc-generic
+++ b/config-powerpc-generic
@@ -313,7 +313,7 @@ CONFIG_SPARSE_IRQ=y
 # CONFIG_PPC_MPC5200_LPBFIFO is not set
 # CONFIG_CAN_MSCAN is not set
 # CONFIG_CAN_MPC5XXX is not set
-CONFIG_PATA_MACIO=m
+CONFIG_PATA_MACIO=y
 CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m
 # CONFIG_PMIC_ADP5520 is not set
 # CONFIG_MFD_88PM8607 is not set
@@ -380,3 +380,8 @@ CONFIG_RCU_FANOUT_LEAF=16
 # CONFIG_RTC_DRV_SNVS is not set
 # CONFIG_ASYMMETRIC_KEY_TYPE is not set
 
+CONFIG_POWER_RESET_GPIO=y
+CONFIG_FB_SSD1307=m
+CONFIG_INPUT_PWM_BEEPER=m
+CONFIG_BACKLIGHT_PWM=m
+CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=n
diff --git a/config-s390x b/config-s390x
index 41e41c5..c0ae0aa 100644
--- a/config-s390x
+++ b/config-s390x
@@ -244,9 +244,22 @@ CONFIG_ETHERNET=y
 
 CONFIG_BPF_JIT=y
 # CONFIG_TRANSPARENT_HUGEPAGE is not set
-# CONFIG_SCM_BUS is not set
-# CONFIG_EADM_SCH is not set
-# CONFIG_SCM_BLOCK is not set
-# CONFIG_SCM_BLOCK_CLUSTER_WRITE is not set
+CONFIG_SCM_BUS=y
+CONFIG_EADM_SCH=m
+CONFIG_SCM_BLOCK=m
+CONFIG_SCM_BLOCK_CLUSTER_WRITE=y
 # CONFIG_S390_PTDUMP is not set
 # CONFIG_ASYMMETRIC_KEY_TYPE is not set
+CONFIG_PCI_NR_FUNCTIONS=64
+CONFIG_HOTPLUG_PCI=m
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+# CONFIG_HOTPLUG_PCI_SHPC is not set
+CONFIG_HOTPLUG_PCI_S390=m
+# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_GPIO_GENERIC_PLATFORM is not set
+# CONFIG_GPIO_MCP23S08 is not set
+
+# CONFIG_PCI is not set
+# CONFIG_NET_VENDOR_MARVELL is not set
+# CONFIG_PTP_1588_CLOCK_PCH is not set
diff --git a/config-x86-32-generic b/config-x86-32-generic
index 3273fd1..f1a9b51 100644
--- a/config-x86-32-generic
+++ b/config-x86-32-generic
@@ -53,6 +53,8 @@ CONFIG_FB_GEODE_LX=y
 CONFIG_FB_GEODE_GX=y
 # CONFIG_FB_GEODE_GX1 is not set
 
+CONFIG_FB_SSD1307=m
+
 # CONFIG_PCI_GOBIOS is not set
 # CONFIG_PCI_GODIRECT is not set
 # CONFIG_PCI_GOMMCONFIG is not set
@@ -181,6 +183,7 @@ CONFIG_XO1_RFKILL=m
 
 CONFIG_X86_32_IRIS=m
 
+CONFIG_POWER_RESET_GPIO=y
 
 CONFIG_MTD_OF_PARTS=y
 CONFIG_MTD_PHYSMAP_OF=m
@@ -203,6 +206,8 @@ CONFIG_I2O_CONFIG=y
 CONFIG_I2O_EXT_ADAPTEC=y
 CONFIG_I2O_CONFIG_OLD_IOCTL=y
 CONFIG_I2O_BUS=m
+CONFIG_INPUT_PWM_BEEPER=m
+CONFIG_BACKLIGHT_PWM=m
 
 # CONFIG_EDAC_SBRIDGE is not set
 
diff --git a/config-x86-generic b/config-x86-generic
index 6e13303..cdf46b3 100644
--- a/config-x86-generic
+++ b/config-x86-generic
@@ -78,6 +78,7 @@ CONFIG_ACPI_SLEEP=y
 CONFIG_ACPI_THERMAL=y
 CONFIG_ACPI_TOSHIBA=m
 CONFIG_ACPI_VIDEO=m
+CONFIG_ACPI_INITRD_TABLE_OVERRIDE=y
 # FIXME: Next two are deprecated. Remove them when they disappear upstream
 # CONFIG_ACPI_PROCFS_POWER is not set
 # CONFIG_ACPI_PROC_EVENT is not set
@@ -282,6 +283,7 @@ CONFIG_MTD_CK804XROM=m
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_CPU_IDLE=y
+# CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set
 # CONFIG_CPU_IDLE_GOV_LADDER is not set
 CONFIG_CPU_IDLE_GOV_MENU=y
 
@@ -409,6 +411,7 @@ CONFIG_HYPERV_UTILS=m
 CONFIG_HID_HYPERV_MOUSE=m
 CONFIG_HYPERV_NET=m
 CONFIG_HYPERV_STORAGE=m
+CONFIG_HYPERV_BALLOON=m
 
 # Depends on HOTPLUG_PCI_PCIE
 CONFIG_BLK_DEV_PCIESSD_MTIP32XX=m
diff --git a/config-x86_64-generic b/config-x86_64-generic
index 2e4195d..bcea67e 100644
--- a/config-x86_64-generic
+++ b/config-x86_64-generic
@@ -13,6 +13,8 @@ CONFIG_AMD_NUMA=y
 CONFIG_X86_64_ACPI_NUMA=y
 # CONFIG_NUMA_EMU is not set
 # CONFIG_X86_NUMACHIP is not set
+CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y
+CONFIG_NUMA_BALANCING=y
 
 CONFIG_NR_CPUS=128
 CONFIG_PHYSICAL_START=0x1000000
@@ -52,6 +54,7 @@ CONFIG_CRYPTO_CAST5_AVX_X86_64=m
 CONFIG_CRYPTO_CAST6_AVX_X86_64=m
 CONFIG_CRYPTO_SERPENT_AVX_X86_64=m
 CONFIG_CRYPTO_TWOFISH_AVX_X86_64=m
+CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=m
 
 # CONFIG_I2C_ALI1535 is not set
 # CONFIG_I2C_ALI1563 is not set
@@ -71,6 +74,7 @@ CONFIG_SPARSEMEM=y
 CONFIG_HAVE_MEMORY_PRESENT=y
 CONFIG_SPARSEMEM_EXTREME=y
 CONFIG_SPARSEMEM_VMEMMAP=y
+# CONFIG_MOVABLE_NODE is not set
 # CONFIG_MEMORY_HOTPLUG is not set
 # CONFIG_MEMORY_HOTREMOVE is not set
 
diff --git a/linux-2.6-crash-driver.patch b/crash-driver.patch
similarity index 100%
rename from linux-2.6-crash-driver.patch
rename to crash-driver.patch
diff --git a/linux-2.6-defaults-acpi-video.patch b/defaults-acpi-video.patch
similarity index 100%
rename from linux-2.6-defaults-acpi-video.patch
rename to defaults-acpi-video.patch
diff --git a/dmar-disable-when-ricoh-multifunction.patch b/dmar-disable-when-ricoh-multifunction.patch
index a452861..839db59 100644
--- a/dmar-disable-when-ricoh-multifunction.patch
+++ b/dmar-disable-when-ricoh-multifunction.patch
@@ -16,7 +16,7 @@ index 4789f8e..5923914 100644
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x006a, quirk_calpella_no_shadow_gtt);
  
 +/* https://bugzilla.redhat.com/show_bug.cgi?id=605888 */
-+static void __devinit quirk_ricoh_multifunction(struct pci_dev *dev)
++static void quirk_ricoh_multifunction(struct pci_dev *dev)
 +{
 +	dmar_disabled = 1;
 +}
diff --git a/linux-2.6-input-kill-stupid-messages.patch b/input-kill-stupid-messages.patch
similarity index 100%
rename from linux-2.6-input-kill-stupid-messages.patch
rename to input-kill-stupid-messages.patch
diff --git a/kernel.spec b/kernel.spec
index ba729b0..6a7241b 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -54,19 +54,19 @@ Summary: The Linux kernel
 # For non-released -rc kernels, this will be appended after the rcX and
 # gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
 #
-%global baserelease 102
+%global baserelease 101
 %global fedora_build %{baserelease}
 
 # base_sublevel is the kernel version we're starting with and patching
 # on top of -- for example, 2.6.22-rc7-git1 starts with a 2.6.21 base,
 # which yields a base_sublevel of 21.
-%define base_sublevel 7
+%define base_sublevel 8
 
 ## If this is a released kernel ##
 %if 0%{?released_kernel}
 
 # Do we have a -stable update to apply?
-%define stable_update 10
+%define stable_update 1
 # Is it a -stable RC?
 %define stable_rc 0
 # Set rpm version accordingly
@@ -325,8 +325,8 @@ Summary: The Linux kernel
 %define with_bootwrapper 0
 %endif
 
-# sparse blows up on ppc64 and sparc64
-%ifarch ppc64 ppc sparc64
+# sparse blows up on ppc64
+%ifarch ppc64 ppc
 %define with_sparse 0
 %endif
 
@@ -367,19 +367,6 @@ Summary: The Linux kernel
 %define with_tools 0
 %endif
 
-%ifarch sparc64
-%define asmarch sparc
-%define all_arch_configs kernel-%{version}-sparc64*.config
-%define make_target vmlinux
-%define kernel_image vmlinux
-%define image_install_path boot
-%define with_tools 0
-%endif
-
-%ifarch sparcv9
-%define hdrarch sparc
-%endif
-
 %ifarch ppc
 %define asmarch powerpc
 %define hdrarch powerpc
@@ -424,7 +411,7 @@ Summary: The Linux kernel
 # Which is a BadThing(tm).
 
 # We only build kernel-headers on the following...
-%define nobuildarches i386 s390 sparc sparcv9
+%define nobuildarches i386 s390
 
 %ifarch %nobuildarches
 %define with_up 0
@@ -512,7 +499,7 @@ Version: %{rpmversion}
 Release: %{pkg_release}
 # DO NOT CHANGE THE 'ExclusiveArch' LINE TO TEMPORARILY EXCLUDE AN ARCHITECTURE BUILD.
 # SET %%nobuildarches (ABOVE) INSTEAD
-ExclusiveArch: noarch %{all_x86} x86_64 ppc ppc64 %{sparc} s390 s390x %{arm}
+ExclusiveArch: noarch %{all_x86} x86_64 ppc ppc64 s390 s390x %{arm}
 ExclusiveOS: Linux
 
 %kernel_reqprovconf
@@ -568,8 +555,6 @@ Source53: config-powerpc64
 
 Source70: config-s390x
 
-Source90: config-sparc64-generic
-
 # Unified ARM kernels
 Source100: config-armv7
 
@@ -622,18 +607,16 @@ Patch00: patch-3.%{base_sublevel}-git%{gitrev}.bz2
 %endif
 
 # we also need compile fixes for -vanilla
-Patch04: linux-2.6-compile-fixes.patch
+Patch04: compile-fixes.patch
 
 # build tweak for build ID magic, even for -vanilla
-Patch05: linux-2.6-makefile-after_link.patch
-
-Patch06: power-x86-destdir.patch
+Patch05: makefile-after_link.patch
 
 %if !%{nopatches}
 
 
 # revert upstream patches we get via other methods
-Patch09: linux-2.6-upstream-reverts.patch
+Patch09: upstream-reverts.patch
 # Git trees.
 
 # Standalone patches
@@ -643,27 +626,26 @@ Patch101: taint-rss.patch
 
 Patch110: vmbugon-warnon.patch
 
-Patch390: linux-2.6-defaults-acpi-video.patch
-Patch391: linux-2.6-acpi-video-dos.patch
-Patch394: linux-2.6-acpi-debug-infinite-loop.patch
+Patch390: defaults-acpi-video.patch
+Patch391: acpi-video-dos.patch
+Patch394: acpi-debug-infinite-loop.patch
 Patch396: acpi-sony-nonvs-blacklist.patch
 
-Patch450: linux-2.6-input-kill-stupid-messages.patch
-Patch452: linux-2.6.30-no-pcspkr-modalias.patch
+Patch450: input-kill-stupid-messages.patch
+Patch452: no-pcspkr-modalias.patch
 
-Patch460: linux-2.6-serial-460800.patch
+Patch460: serial-460800.patch
 
 Patch470: die-floppy-die.patch
 
-Patch510: linux-2.6-silence-noise.patch
+Patch510: silence-noise.patch
 Patch520: quite-apm.patch
 
-Patch530: linux-2.6-silence-fbcon-logo.patch
+Patch530: silence-fbcon-logo.patch
 Patch540: silence-empty-ipi-mask-warning.patch
+Patch541: silence-tty-null.patch
 
-Patch700: linux-2.6-e1000-ich9-montevina.patch
-
-Patch800: linux-2.6-crash-driver.patch
+Patch800: crash-driver.patch
 
 # crypto/
 
@@ -681,14 +663,12 @@ Patch1825: drm-i915-dp-stfu.patch
 # mustard patch to shut abrt up. please drop (and notify ajax) whenever it
 # fails to apply
 Patch1826: drm-i915-tv-detect-hush.patch
-# d-i-n backport for https://bugzilla.redhat.com/show_bug.cgi?id=901951
-Patch1827: drm-i915-lvds-reclock-fix.patch
 
 Patch1900: linux-2.6-intel-iommu-igfx.patch
 
 # Quiet boot fixes
 # silence the ACPI blacklist code
-Patch2802: linux-2.6-silence-acpi-blacklist.patch
+Patch2802: silence-acpi-blacklist.patch
 
 # media patches
 Patch2901: drivers-media-update.patch
@@ -738,20 +718,6 @@ Patch22014: efifb-skip-DMI-checks-if-bootloader-knows.patch
 #rhbz 857324
 Patch22070: net-tcp-bz857324.patch
 
-#rhbz 871078
-Patch22112: USB-report-submission-of-active-URBs.patch
-
-#rhbz CVE-2012-4530 868285 880147
-Patch22229: exec-use-eloop-for-max-recursion-depth.patch
-
-#rhbz 851278
-Patch22231: 8139cp-revert-set-ring-address-before-enabling-receiver.patch
-Patch22232: 8139cp-set-ring-address-after-enabling-C-mode.patch
-Patch22233: 8139cp-re-enable-interrupts-after-tx-timeout.patch
-
-#rhbz 892428
-Patch22238: brcmsmac-updates-rhbz892428.patch
-
 #rhbz 799564
 Patch22240: Input-increase-struct-ps2dev-cmdbuf-to-8-bytes.patch
 Patch22242: Input-add-support-for-Cypress-PS2-Trackpads.patch
@@ -759,15 +725,6 @@ Patch22242: Input-add-support-for-Cypress-PS2-Trackpads.patch
 #rhbz 892811
 Patch22247: ath9k_rx_dma_stop_check.patch
 
-#rhbz 909591
-Patch22255: usb-cypress-supertop.patch
-
-#rhbz 911479 911473 CVE-2013-0290
-Patch22256: net-fix-infinite-loop-in-__skb_recv_datagram.patch
-
-#rhbz 844750
-Patch22257: 0001-bluetooth-Add-support-for-atheros-04ca-3004-device-t.patch
-
 #rhbz 903192
 Patch22261: 0001-kmsg-Honor-dmesg_restrict-sysctl-on-dev-kmsg.patch
 
@@ -778,10 +735,8 @@ Patch22262: x86-mm-Fix-vmalloc_fault-oops-during-lazy-MMU-updates.patch
 Patch22263: 0001-svcrpc-make-svc_age_temp_xprts-enqueue-under-sv_lock.patch
 Patch22264: 0002-svcrpc-fix-rpc-server-shutdown-races.patch
 
-Patch23000: silence-brcmsmac-warning.patch
-
 #rhbz 812111
-Patch24000: alps-v2-3.7.patch
+Patch24000: alps.patch
 
 Patch24100: userns-avoid-recursion-in-put_user_ns.patch
 
@@ -1312,19 +1267,17 @@ do
 done
 %endif
 
-ApplyPatch linux-2.6-makefile-after_link.patch
+ApplyPatch makefile-after_link.patch
 
 #
 # misc small stuff to make things compile
 #
-ApplyOptionalPatch linux-2.6-compile-fixes.patch
-
-ApplyPatch power-x86-destdir.patch
+ApplyOptionalPatch compile-fixes.patch
 
 %if !%{nopatches}
 
 # revert patches from upstream that conflict or that we get via other means
-ApplyOptionalPatch linux-2.6-upstream-reverts.patch -R
+ApplyOptionalPatch upstream-reverts.patch -R
 
 ApplyPatch taint-vbox.patch
 ApplyPatch taint-rss.patch
@@ -1339,9 +1292,9 @@ ApplyPatch vmbugon-warnon.patch
 #
 #ApplyPatch arm-read_current_timer.patch
 #ApplyPatch arm-fix-omapdrm.patch
-ApplyPatch arm-tegra-nvec-kconfig.patch
+#ApplyPatch arm-tegra-nvec-kconfig.patch
 ApplyPatch arm-tegra-usb-no-reset-linux33.patch
-ApplyPatch arm-tegra-sdhci-module-fix.patch
+#ApplyPatch arm-tegra-sdhci-module-fix.patch
 ApplyPatch arm-alignment-faults.patch
 
 #
@@ -1364,9 +1317,9 @@ ApplyPatch arm-alignment-faults.patch
 # WMI
 
 # ACPI
-ApplyPatch linux-2.6-defaults-acpi-video.patch
-ApplyPatch linux-2.6-acpi-video-dos.patch
-ApplyPatch linux-2.6-acpi-debug-infinite-loop.patch
+ApplyPatch defaults-acpi-video.patch
+ApplyPatch acpi-video-dos.patch
+ApplyPatch acpi-debug-infinite-loop.patch
 ApplyPatch acpi-sony-nonvs-blacklist.patch
 
 #
@@ -1385,33 +1338,31 @@ ApplyPatch acpi-sony-nonvs-blacklist.patch
 
 # Misc fixes
 # The input layer spews crap no-one cares about.
-ApplyPatch linux-2.6-input-kill-stupid-messages.patch
+ApplyPatch input-kill-stupid-messages.patch
 
 # stop floppy.ko from autoloading during udev...
 ApplyPatch die-floppy-die.patch
 
-ApplyPatch linux-2.6.30-no-pcspkr-modalias.patch
+ApplyPatch no-pcspkr-modalias.patch
 
 # Allow to use 480600 baud on 16C950 UARTs
-ApplyPatch linux-2.6-serial-460800.patch
+ApplyPatch serial-460800.patch
 
 # Silence some useless messages that still get printed with 'quiet'
-ApplyPatch linux-2.6-silence-noise.patch
+ApplyPatch silence-noise.patch
 
 # Make fbcon not show the penguins with 'quiet'
-ApplyPatch linux-2.6-silence-fbcon-logo.patch
+ApplyPatch silence-fbcon-logo.patch
 
 # No-one cares about these warnings
 ApplyPatch silence-empty-ipi-mask-warning.patch
+ApplyPatch silence-tty-null.patch
 
 # Changes to upstream defaults.
 
 
 # /dev/crash driver.
-ApplyPatch linux-2.6-crash-driver.patch
-
-# Hack e1000e to work on Montevina SDV
-ApplyPatch linux-2.6-e1000-ich9-montevina.patch
+ApplyPatch crash-driver.patch
 
 # crypto/
 
@@ -1427,12 +1378,11 @@ ApplyPatch linux-2.6-e1000-ich9-montevina.patch
 ApplyOptionalPatch drm-intel-next.patch
 ApplyPatch drm-i915-dp-stfu.patch
 ApplyPatch drm-i915-tv-detect-hush.patch
-ApplyPatch drm-i915-lvds-reclock-fix.patch
 
 ApplyPatch linux-2.6-intel-iommu-igfx.patch
 
 # silence the ACPI blacklist code
-ApplyPatch linux-2.6-silence-acpi-blacklist.patch
+ApplyPatch silence-acpi-blacklist.patch
 ApplyPatch quite-apm.patch
 
 # Media (V4L/DVB/IR) updates/fixes/experimental drivers
@@ -1469,20 +1419,6 @@ ApplyPatch selinux-apply-different-permission-to-ptrace-child.patch
 #rhbz 857324
 ApplyPatch net-tcp-bz857324.patch
 
-#rhbz 871078
-ApplyPatch USB-report-submission-of-active-URBs.patch
-
-#rhbz CVE-2012-4530 868285 880147
-ApplyPatch exec-use-eloop-for-max-recursion-depth.patch
-
-#rhbz 851278
-ApplyPatch 8139cp-revert-set-ring-address-before-enabling-receiver.patch -R
-ApplyPatch 8139cp-set-ring-address-after-enabling-C-mode.patch
-ApplyPatch 8139cp-re-enable-interrupts-after-tx-timeout.patch
-
-#rhbz 892428
-ApplyPatch brcmsmac-updates-rhbz892428.patch
-
 #rhbz 799564
 ApplyPatch Input-increase-struct-ps2dev-cmdbuf-to-8-bytes.patch
 ApplyPatch Input-add-support-for-Cypress-PS2-Trackpads.patch
@@ -1490,19 +1426,8 @@ ApplyPatch Input-add-support-for-Cypress-PS2-Trackpads.patch
 #rhbz 892811
 ApplyPatch ath9k_rx_dma_stop_check.patch
 
-ApplyPatch silence-brcmsmac-warning.patch
-
-#rhbz 909591
-ApplyPatch usb-cypress-supertop.patch
-
-#rhbz 911479 911473 CVE-2013-0290
-ApplyPatch net-fix-infinite-loop-in-__skb_recv_datagram.patch
-
-#rhbz 844750
-ApplyPatch 0001-bluetooth-Add-support-for-atheros-04ca-3004-device-t.patch
-
 #rhbz 812111
-ApplyPatch alps-v2-3.7.patch
+ApplyPatch alps.patch
 
 #rhbz 903192
 ApplyPatch 0001-kmsg-Honor-dmesg_restrict-sysctl-on-dev-kmsg.patch
@@ -2371,6 +2296,11 @@ fi
 #    '-'      |  |
 #              '-'
 %changelog
+* Fri Mar 01 2013 Justin M. Forbes <jforbes at redhat.com> - 3.8.1-101
+- Linux v3.8.1
+- Drop SPARC64 support
+- Silence "tty is NULL" trace.
+
 * Fri Mar 01 2013 Josh Boyer <jwboyer at redhat.com>
 - Add patches to fix sunrpc panic (rhbz 904870)
 
diff --git a/linux-2.6-makefile-after_link.patch b/makefile-after_link.patch
similarity index 100%
rename from linux-2.6-makefile-after_link.patch
rename to makefile-after_link.patch
diff --git a/linux-2.6.30-no-pcspkr-modalias.patch b/no-pcspkr-modalias.patch
similarity index 100%
rename from linux-2.6.30-no-pcspkr-modalias.patch
rename to no-pcspkr-modalias.patch
diff --git a/linux-2.6-serial-460800.patch b/serial-460800.patch
similarity index 100%
rename from linux-2.6-serial-460800.patch
rename to serial-460800.patch
diff --git a/linux-2.6-silence-acpi-blacklist.patch b/silence-acpi-blacklist.patch
similarity index 100%
rename from linux-2.6-silence-acpi-blacklist.patch
rename to silence-acpi-blacklist.patch
diff --git a/linux-2.6-silence-fbcon-logo.patch b/silence-fbcon-logo.patch
similarity index 100%
rename from linux-2.6-silence-fbcon-logo.patch
rename to silence-fbcon-logo.patch
diff --git a/linux-2.6-silence-noise.patch b/silence-noise.patch
similarity index 97%
rename from linux-2.6-silence-noise.patch
rename to silence-noise.patch
index 1e4d7c5..bcd5baa 100644
--- a/linux-2.6-silence-noise.patch
+++ b/silence-noise.patch
@@ -14,7 +14,7 @@ diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
 index 170f71e..4f3e632 100644
 --- a/drivers/input/serio/i8042.c
 +++ b/drivers/input/serio/i8042.c
-@@ -701,10 +701,8 @@ static int __devinit i8042_check_aux(void)
+@@ -701,10 +701,8 @@ static int i8042_check_aux(void)
  
  static int i8042_controller_check(void)
  {
diff --git a/silence-tty-null.patch b/silence-tty-null.patch
new file mode 100644
index 0000000..00f6423
--- /dev/null
+++ b/silence-tty-null.patch
@@ -0,0 +1,13 @@
+This should be fixed in 3.9, but is unlikely to be backported.
+
+--- linux-3.8.1-201.fc18.x86_64/drivers/tty/tty_buffer.c~	2013-03-01 11:07:37.498291384 -0500
++++ linux-3.8.1-201.fc18.x86_64/drivers/tty/tty_buffer.c	2013-03-01 11:08:11.088250537 -0500
+@@ -473,7 +473,7 @@ static void flush_to_ldisc(struct work_s
+ 	struct tty_ldisc *disc;
+ 
+ 	tty = port->itty;
+-	if (WARN_RATELIMIT(tty == NULL, "tty is NULL\n"))
++	if (tty == NULL)
+ 		return;
+ 
+ 	disc = tty_ldisc_ref(tty);
diff --git a/sources b/sources
index 7b85431..52a9095 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
-21223369d682bcf44bcdfe1521095983  linux-3.7.tar.xz
-ffc885cf2fdedf1792b999d4ab5b8ba8  patch-3.7.10.xz
+1c738edfc54e7c65faeb90c436104e2f  linux-3.8.tar.xz
+50a68679086c346dddb34dedccfae7ee  patch-3.8.1.xz
diff --git a/linux-2.6-upstream-reverts.patch b/upstream-reverts.patch
similarity index 100%
rename from linux-2.6-upstream-reverts.patch
rename to upstream-reverts.patch
diff --git a/userns-avoid-recursion-in-put_user_ns.patch b/userns-avoid-recursion-in-put_user_ns.patch
index d364e79..c3bb604 100644
--- a/userns-avoid-recursion-in-put_user_ns.patch
+++ b/userns-avoid-recursion-in-put_user_ns.patch
@@ -27,8 +27,10 @@ Date:   Fri Dec 28 18:58:39 2012 -0800
     Pointed-out-by: Vasily Kulikov <segoon at openwall.com>
     Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
 
---- linux-3.7.9-105.fc17.noarch/include/linux/user_namespace.h	2013-02-14 11:29:49.757652513 -0600
-+++ linux-3.7.9-105.fc17.user_ns/include/linux/user_namespace.h	2013-02-26 15:19:40.696782035 -0600
+diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h
+index b9bd2e6..4ce0093 100644
+--- a/include/linux/user_namespace.h
++++ b/include/linux/user_namespace.h
 @@ -21,7 +21,7 @@ struct user_namespace {
  	struct uid_gid_map	uid_map;
  	struct uid_gid_map	gid_map;
@@ -38,7 +40,7 @@ Date:   Fri Dec 28 18:58:39 2012 -0800
  	struct user_namespace	*parent;
  	kuid_t			owner;
  	kgid_t			group;
-@@ -34,17 +34,17 @@ extern struct user_namespace init_user_n
+@@ -35,18 +35,18 @@ extern struct user_namespace init_user_ns;
  static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
  {
  	if (ns)
@@ -46,11 +48,12 @@ Date:   Fri Dec 28 18:58:39 2012 -0800
 +		atomic_inc(&ns->count);
  	return ns;
  }
- 
+
  extern int create_user_ns(struct cred *new);
+ extern int unshare_userns(unsigned long unshare_flags, struct cred **new_cred);
 -extern void free_user_ns(struct kref *kref);
 +extern void free_user_ns(struct user_namespace *ns);
- 
+
  static inline void put_user_ns(struct user_namespace *ns)
  {
 -	if (ns)
@@ -58,11 +61,13 @@ Date:   Fri Dec 28 18:58:39 2012 -0800
 +	if (ns && atomic_dec_and_test(&ns->count))
 +		free_user_ns(ns);
  }
- 
+
  struct seq_operations;
---- linux-3.7.9-105.fc17.noarch/kernel/user.c	2013-02-14 11:29:46.675652732 -0600
-+++ linux-3.7.9-105.fc17.user_ns/kernel/user.c	2013-02-26 15:16:12.347796824 -0600
-@@ -46,9 +46,7 @@ struct user_namespace init_user_ns = {
+diff --git a/kernel/user.c b/kernel/user.c
+index 33acb5e..57ebfd4 100644
+--- a/kernel/user.c
++++ b/kernel/user.c
+@@ -47,9 +47,7 @@ struct user_namespace init_user_ns = {
  			.count = 4294967295U,
  		},
  	},
@@ -72,37 +77,41 @@ Date:   Fri Dec 28 18:58:39 2012 -0800
 +	.count = ATOMIC_INIT(3),
  	.owner = GLOBAL_ROOT_UID,
  	.group = GLOBAL_ROOT_GID,
- };
---- linux-3.7.9-105.fc17.noarch/kernel/user_namespace.c	2013-02-14 11:29:46.690652731 -0600
-+++ linux-3.7.9-105.fc17.user_ns/kernel/user_namespace.c	2013-02-26 15:24:47.984760224 -0600
-@@ -52,7 +52,7 @@ int create_user_ns(struct cred *new)
- 	if (!ns)
- 		return -ENOMEM;
- 
+ 	.proc_inum = PROC_USER_INIT_INO,
+diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
+index 2b042c4..24f8ec3 100644
+--- a/kernel/user_namespace.c
++++ b/kernel/user_namespace.c
+@@ -78,7 +78,7 @@ int create_user_ns(struct cred *new)
+ 		return ret;
+ 	}
+
 -	kref_init(&ns->kref);
 +	atomic_set(&ns->count, 1);
+ 	/* Leave the new->user_ns reference with the new user namespace. */
  	ns->parent = parent_ns;
  	ns->owner = owner;
- 	ns->group = group;
-@@ -78,14 +78,15 @@ int create_user_ns(struct cred *new)
- 	return 0;
+@@ -104,15 +104,16 @@ int unshare_userns(unsigned long unshare_flags, struct cred **new_cred)
+ 	return create_user_ns(cred);
  }
- 
+
 -void free_user_ns(struct kref *kref)
 +void free_user_ns(struct user_namespace *ns)
  {
 -	struct user_namespace *parent, *ns =
 -		container_of(kref, struct user_namespace, kref);
 +	struct user_namespace *parent;
- 
+
 -	parent = ns->parent;
+-	proc_free_inum(ns->proc_inum);
 -	kmem_cache_free(user_ns_cachep, ns);
 -	put_user_ns(parent);
 +	do {
 +		parent = ns->parent;
++		proc_free_inum(ns->proc_inum);
 +		kmem_cache_free(user_ns_cachep, ns);
 +		ns = parent;
 +	} while (atomic_dec_and_test(&parent->count));
  }
  EXPORT_SYMBOL(free_user_ns);
- 
+


More information about the scm-commits mailing list