diff -druNp linux-libre-3.4.48-gnu1/arch/powerpc/platforms/pseries/eeh_pseries.c linux-libre-3.4.49-gnu1/arch/powerpc/platforms/pseries/eeh_pseries.c
--- linux-libre-3.4.48-gnu1/arch/powerpc/platforms/pseries/eeh_pseries.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/arch/powerpc/platforms/pseries/eeh_pseries.c	2013-06-13 12:48:06.000000000 -0400
@@ -83,7 +83,11 @@ static int pseries_eeh_init(void)
 	ibm_configure_pe		= rtas_token("ibm,configure-pe");
 	ibm_configure_bridge		= rtas_token ("ibm,configure-bridge");
 
-	/* necessary sanity check */
+	/*
+	 * Necessary sanity check. We needn't check "get-config-addr-info"
+	 * and its variant since the old firmware probably support address
+	 * of domain/bus/slot/function for EEH RTAS operations.
+	 */
 	if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE) {
 		pr_warning("%s: RTAS service <ibm,set-eeh-option> invalid\n",
 			__func__);
@@ -102,12 +106,6 @@ static int pseries_eeh_init(void)
 		pr_warning("%s: RTAS service <ibm,slot-error-detail> invalid\n",
 			__func__);
 		return -EINVAL;
-	} else if (ibm_get_config_addr_info2 == RTAS_UNKNOWN_SERVICE &&
-		   ibm_get_config_addr_info == RTAS_UNKNOWN_SERVICE) {
-		pr_warning("%s: RTAS service <ibm,get-config-addr-info2> and "
-			"<ibm,get-config-addr-info> invalid\n",
-			__func__);
-		return -EINVAL;
 	} else if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE &&
 		   ibm_configure_bridge == RTAS_UNKNOWN_SERVICE) {
 		pr_warning("%s: RTAS service <ibm,configure-pe> and "
diff -druNp linux-libre-3.4.48-gnu1/drivers/acpi/video.c linux-libre-3.4.49-gnu1/drivers/acpi/video.c
--- linux-libre-3.4.48-gnu1/drivers/acpi/video.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/acpi/video.c	2013-06-13 12:48:06.000000000 -0400
@@ -447,6 +447,22 @@ static struct dmi_system_id video_dmi_ta
 		DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13 - 2000 Notebook PC"),
 		},
 	},
+	{
+	 .callback = video_ignore_initial_backlight,
+	 .ident = "HP Pavilion g6 Notebook PC",
+	 .matches = {
+		 DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
+		 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"),
+		},
+	},
+	{
+	 .callback = video_ignore_initial_backlight,
+	 .ident = "HP Pavilion m4",
+	 .matches = {
+		DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
+		DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"),
+		},
+	},
 	{}
 };
 
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/drm_irq.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/drm_irq.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/drm_irq.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/drm_irq.c	2013-06-13 12:48:06.000000000 -0400
@@ -981,7 +981,7 @@ EXPORT_SYMBOL(drm_vblank_off);
  */
 void drm_vblank_pre_modeset(struct drm_device *dev, int crtc)
 {
-	/* vblank is not initialized (IRQ not installed ?) */
+	/* vblank is not initialized (IRQ not installed ?), or has been freed */
 	if (!dev->num_crtcs)
 		return;
 	/*
@@ -1003,6 +1003,10 @@ void drm_vblank_post_modeset(struct drm_
 {
 	unsigned long irqflags;
 
+	/* vblank is not initialized (IRQ not installed ?), or has been freed */
+	if (!dev->num_crtcs)
+		return;
+
 	if (dev->vblank_inmodeset[crtc]) {
 		spin_lock_irqsave(&dev->vbl_lock, irqflags);
 		dev->vblank_disable_allowed = 1;
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/gma500/framebuffer.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/gma500/framebuffer.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/gma500/framebuffer.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/gma500/framebuffer.c	2013-06-13 12:48:06.000000000 -0400
@@ -782,8 +782,8 @@ void psb_modeset_init(struct drm_device
 	for (i = 0; i < dev_priv->num_pipe; i++)
 		psb_intel_crtc_init(dev, i, mode_dev);
 
-	dev->mode_config.max_width = 2048;
-	dev->mode_config.max_height = 2048;
+	dev->mode_config.max_width = 4096;
+	dev->mode_config.max_height = 4096;
 
 	psb_setup_outputs(dev);
 }
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/i915/intel_lvds.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/i915/intel_lvds.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/i915/intel_lvds.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/i915/intel_lvds.c	2013-06-13 12:48:06.000000000 -0400
@@ -747,10 +747,10 @@ static const struct dmi_system_id intel_
 	},
 	{
 		.callback = intel_no_lvds_dmi_callback,
-		.ident = "Hewlett-Packard HP t5740e Thin Client",
+		.ident = "Hewlett-Packard HP t5740",
 		.matches = {
 			DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
-			DMI_MATCH(DMI_PRODUCT_NAME, "HP t5740e Thin Client"),
+			DMI_MATCH(DMI_PRODUCT_NAME, " t5740"),
 		},
 	},
 	{
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/i915/intel_sdvo.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/i915/intel_sdvo.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/i915/intel_sdvo.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/i915/intel_sdvo.c	2013-06-13 12:48:06.000000000 -0400
@@ -1581,7 +1581,7 @@ static void intel_sdvo_get_lvds_modes(st
 	 * Assume that the preferred modes are
 	 * arranged in priority order.
 	 */
-	intel_ddc_get_modes(connector, intel_sdvo->i2c);
+	intel_ddc_get_modes(connector, &intel_sdvo->ddc);
 	if (list_empty(&connector->probed_modes) == false)
 		goto end;
 
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/atombios_encoders.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/atombios_encoders.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/atombios_encoders.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/atombios_encoders.c	2013-06-13 12:48:06.000000000 -0400
@@ -396,6 +396,8 @@ atombios_digital_setup(struct drm_encode
 int
 atombios_get_encoder_mode(struct drm_encoder *encoder)
 {
+	struct drm_device *dev = encoder->dev;
+	struct radeon_device *rdev = dev->dev_private;
 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
 	struct drm_connector *connector;
 	struct radeon_connector *radeon_connector;
@@ -421,7 +423,8 @@ atombios_get_encoder_mode(struct drm_enc
 	case DRM_MODE_CONNECTOR_DVII:
 	case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */
 		if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
-		    radeon_audio)
+		    radeon_audio &&
+		    !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
 			return ATOM_ENCODER_MODE_HDMI;
 		else if (radeon_connector->use_digital)
 			return ATOM_ENCODER_MODE_DVI;
@@ -432,7 +435,8 @@ atombios_get_encoder_mode(struct drm_enc
 	case DRM_MODE_CONNECTOR_HDMIA:
 	default:
 		if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
-		    radeon_audio)
+		    radeon_audio &&
+		    !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
 			return ATOM_ENCODER_MODE_HDMI;
 		else
 			return ATOM_ENCODER_MODE_DVI;
@@ -446,7 +450,8 @@ atombios_get_encoder_mode(struct drm_enc
 		    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
 			return ATOM_ENCODER_MODE_DP;
 		else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
-			 radeon_audio)
+			 radeon_audio &&
+			 !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
 			return ATOM_ENCODER_MODE_HDMI;
 		else
 			return ATOM_ENCODER_MODE_DVI;
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/evergreen.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/evergreen.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/evergreen.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/evergreen.c	2013-06-13 12:48:06.000000000 -0400
@@ -3258,6 +3258,12 @@ static int evergreen_startup(struct rade
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	r = r600_irq_init(rdev);
 	if (r) {
 		DRM_ERROR("radeon: IH init failed (%d).\n", r);
@@ -3409,10 +3415,6 @@ int evergreen_init(struct radeon_device
 	if (r)
 		return r;
 
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
-
 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
 	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
 
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/ni.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/ni.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/ni.c	2013-06-07 17:57:47.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/ni.c	2013-06-13 13:53:04.000000000 -0400
@@ -1570,6 +1570,12 @@ static int cayman_startup(struct radeon_
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	r = r600_irq_init(rdev);
 	if (r) {
 		DRM_ERROR("radeon: IH init failed (%d).\n", r);
@@ -1700,10 +1706,6 @@ int cayman_init(struct radeon_device *rd
 	if (r)
 		return r;
 
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
-
 	ring->ring_obj = NULL;
 	r600_ring_init(rdev, ring, 1024 * 1024);
 
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/r100.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/r100.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/r100.c	2013-06-07 17:57:38.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/r100.c	2013-06-13 13:52:55.000000000 -0400
@@ -3946,6 +3946,12 @@ static int r100_startup(struct radeon_de
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	r100_irq_set(rdev);
 	rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
 	/* 1M ring buffer */
@@ -4107,9 +4113,6 @@ int r100_init(struct radeon_device *rdev
 	r = radeon_fence_driver_init(rdev);
 	if (r)
 		return r;
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
 	/* Memory manager */
 	r = radeon_bo_init(rdev);
 	if (r)
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/r300.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/r300.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/r300.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/r300.c	2013-06-13 12:48:06.000000000 -0400
@@ -1405,6 +1405,12 @@ static int r300_startup(struct radeon_de
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	r100_irq_set(rdev);
 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
 	/* 1M ring buffer */
@@ -1545,9 +1551,6 @@ int r300_init(struct radeon_device *rdev
 	r = radeon_fence_driver_init(rdev);
 	if (r)
 		return r;
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
 	/* Memory manager */
 	r = radeon_bo_init(rdev);
 	if (r)
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/r420.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/r420.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/r420.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/r420.c	2013-06-13 12:48:06.000000000 -0400
@@ -265,6 +265,12 @@ static int r420_startup(struct radeon_de
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	r100_irq_set(rdev);
 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
 	/* 1M ring buffer */
@@ -417,10 +423,6 @@ int r420_init(struct radeon_device *rdev
 	if (r) {
 		return r;
 	}
-	r = radeon_irq_kms_init(rdev);
-	if (r) {
-		return r;
-	}
 	/* Memory manager */
 	r = radeon_bo_init(rdev);
 	if (r) {
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/r520.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/r520.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/r520.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/r520.c	2013-06-13 12:48:06.000000000 -0400
@@ -194,6 +194,12 @@ static int r520_startup(struct radeon_de
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	rs600_irq_set(rdev);
 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
 	/* 1M ring buffer */
@@ -301,9 +307,6 @@ int r520_init(struct radeon_device *rdev
 	r = radeon_fence_driver_init(rdev);
 	if (r)
 		return r;
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
 	/* Memory manager */
 	r = radeon_bo_init(rdev);
 	if (r)
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/r600.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/r600.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/r600.c	2013-06-07 17:57:41.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/r600.c	2013-06-13 13:52:59.000000000 -0400
@@ -2430,6 +2430,12 @@ int r600_startup(struct radeon_device *r
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	r = r600_irq_init(rdev);
 	if (r) {
 		DRM_ERROR("radeon: IH init failed (%d).\n", r);
@@ -2584,10 +2590,6 @@ int r600_init(struct radeon_device *rdev
 	if (r)
 		return r;
 
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
-
 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
 	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
 
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/rs400.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/rs400.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/rs400.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/rs400.c	2013-06-13 12:48:06.000000000 -0400
@@ -417,6 +417,12 @@ static int rs400_startup(struct radeon_d
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	r100_irq_set(rdev);
 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
 	/* 1M ring buffer */
@@ -541,9 +547,6 @@ int rs400_init(struct radeon_device *rde
 	r = radeon_fence_driver_init(rdev);
 	if (r)
 		return r;
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
 	/* Memory manager */
 	r = radeon_bo_init(rdev);
 	if (r)
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/rs600.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/rs600.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/rs600.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/rs600.c	2013-06-13 12:48:06.000000000 -0400
@@ -864,6 +864,12 @@ static int rs600_startup(struct radeon_d
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	rs600_irq_set(rdev);
 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
 	/* 1M ring buffer */
@@ -994,9 +1000,6 @@ int rs600_init(struct radeon_device *rde
 	r = radeon_fence_driver_init(rdev);
 	if (r)
 		return r;
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
 	/* Memory manager */
 	r = radeon_bo_init(rdev);
 	if (r)
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/rs690.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/rs690.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/rs690.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/rs690.c	2013-06-13 12:48:06.000000000 -0400
@@ -628,6 +628,12 @@ static int rs690_startup(struct radeon_d
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	rs600_irq_set(rdev);
 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
 	/* 1M ring buffer */
@@ -759,9 +765,6 @@ int rs690_init(struct radeon_device *rde
 	r = radeon_fence_driver_init(rdev);
 	if (r)
 		return r;
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
 	/* Memory manager */
 	r = radeon_bo_init(rdev);
 	if (r)
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/rv515.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/rv515.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/rv515.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/rv515.c	2013-06-13 12:48:06.000000000 -0400
@@ -386,6 +386,12 @@ static int rv515_startup(struct radeon_d
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	rs600_irq_set(rdev);
 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
 	/* 1M ring buffer */
@@ -520,9 +526,6 @@ int rv515_init(struct radeon_device *rde
 	r = radeon_fence_driver_init(rdev);
 	if (r)
 		return r;
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
 	/* Memory manager */
 	r = radeon_bo_init(rdev);
 	if (r)
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/rv770.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/rv770.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/rv770.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/rv770.c	2013-06-13 12:48:06.000000000 -0400
@@ -1099,6 +1099,12 @@ static int rv770_startup(struct radeon_d
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	r = r600_irq_init(rdev);
 	if (r) {
 		DRM_ERROR("radeon: IH init failed (%d).\n", r);
@@ -1237,10 +1243,6 @@ int rv770_init(struct radeon_device *rde
 	if (r)
 		return r;
 
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
-
 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
 	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
 
diff -druNp linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/si.c linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/si.c
--- linux-libre-3.4.48-gnu1/drivers/gpu/drm/radeon/si.c	2013-06-07 17:57:50.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/gpu/drm/radeon/si.c	2013-06-13 13:53:07.000000000 -0400
@@ -3862,6 +3862,12 @@ static int si_startup(struct radeon_devi
 	}
 
 	/* Enable IRQ */
+	if (!rdev->irq.installed) {
+		r = radeon_irq_kms_init(rdev);
+		if (r)
+			return r;
+	}
+
 	r = si_irq_init(rdev);
 	if (r) {
 		DRM_ERROR("radeon: IH init failed (%d).\n", r);
@@ -4030,10 +4036,6 @@ int si_init(struct radeon_device *rdev)
 	if (r)
 		return r;
 
-	r = radeon_irq_kms_init(rdev);
-	if (r)
-		return r;
-
 	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
 	ring->ring_obj = NULL;
 	r600_ring_init(rdev, ring, 1024 * 1024);
diff -druNp linux-libre-3.4.48-gnu1/drivers/hwmon/adm1021.c linux-libre-3.4.49-gnu1/drivers/hwmon/adm1021.c
--- linux-libre-3.4.48-gnu1/drivers/hwmon/adm1021.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/hwmon/adm1021.c	2013-06-13 12:48:06.000000000 -0400
@@ -332,26 +332,68 @@ static int adm1021_detect(struct i2c_cli
 	man_id = i2c_smbus_read_byte_data(client, ADM1021_REG_MAN_ID);
 	dev_id = i2c_smbus_read_byte_data(client, ADM1021_REG_DEV_ID);
 
+	if (man_id < 0 || dev_id < 0)
+		return -ENODEV;
+
 	if (man_id == 0x4d && dev_id == 0x01)
 		type_name = "max1617a";
 	else if (man_id == 0x41) {
 		if ((dev_id & 0xF0) == 0x30)
 			type_name = "adm1023";
-		else
+		else if ((dev_id & 0xF0) == 0x00)
 			type_name = "adm1021";
+		else
+			return -ENODEV;
 	} else if (man_id == 0x49)
 		type_name = "thmc10";
 	else if (man_id == 0x23)
 		type_name = "gl523sm";
 	else if (man_id == 0x54)
 		type_name = "mc1066";
-	/* LM84 Mfr ID in a different place, and it has more unused bits */
-	else if (conv_rate == 0x00
-		 && (config & 0x7F) == 0x00
-		 && (status & 0xAB) == 0x00)
-		type_name = "lm84";
-	else
-		type_name = "max1617";
+	else {
+		int lte, rte, lhi, rhi, llo, rlo;
+
+		/* extra checks for LM84 and MAX1617 to avoid misdetections */
+
+		llo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(0));
+		rlo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(1));
+
+		/* fail if any of the additional register reads failed */
+		if (llo < 0 || rlo < 0)
+			return -ENODEV;
+
+		lte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(0));
+		rte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(1));
+		lhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(0));
+		rhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(1));
+
+		/*
+		 * Fail for negative temperatures and negative high limits.
+		 * This check also catches read errors on the tested registers.
+		 */
+		if ((s8)lte < 0 || (s8)rte < 0 || (s8)lhi < 0 || (s8)rhi < 0)
+			return -ENODEV;
+
+		/* fail if all registers hold the same value */
+		if (lte == rte && lte == lhi && lte == rhi && lte == llo
+		    && lte == rlo)
+			return -ENODEV;
+
+		/*
+		 * LM84 Mfr ID is in a different place,
+		 * and it has more unused bits.
+		 */
+		if (conv_rate == 0x00
+		    && (config & 0x7F) == 0x00
+		    && (status & 0xAB) == 0x00) {
+			type_name = "lm84";
+		} else {
+			/* fail if low limits are larger than high limits */
+			if ((s8)llo > lhi || (s8)rlo > rhi)
+				return -ENODEV;
+			type_name = "max1617";
+		}
+	}
 
 	pr_debug("adm1021: Detected chip %s at adapter %d, address 0x%02x.\n",
 		 type_name, i2c_adapter_id(adapter), client->addr);
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/host/ehci-sched.c linux-libre-3.4.49-gnu1/drivers/usb/host/ehci-sched.c
--- linux-libre-3.4.48-gnu1/drivers/usb/host/ehci-sched.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/host/ehci-sched.c	2013-06-13 12:48:06.000000000 -0400
@@ -236,7 +236,7 @@ static inline unsigned char tt_start_ufr
 }
 
 static const unsigned char
-max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 125, 25 };
+max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 30, 0 };
 
 /* carryover low/fullspeed bandwidth that crosses uframe boundries */
 static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8])
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/host/xhci.c linux-libre-3.4.49-gnu1/drivers/usb/host/xhci.c
--- linux-libre-3.4.48-gnu1/drivers/usb/host/xhci.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/host/xhci.c	2013-06-13 12:48:06.000000000 -0400
@@ -947,6 +947,7 @@ int xhci_resume(struct xhci_hcd *xhci, b
 	struct usb_hcd		*hcd = xhci_to_hcd(xhci);
 	struct usb_hcd		*secondary_hcd;
 	int			retval = 0;
+	bool			comp_timer_running = false;
 
 	/* Wait a bit if either of the roothubs need to settle from the
 	 * transition into bus suspend.
@@ -984,6 +985,13 @@ int xhci_resume(struct xhci_hcd *xhci, b
 
 	/* If restore operation fails, re-initialize the HC during resume */
 	if ((temp & STS_SRE) || hibernated) {
+
+		if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
+				!(xhci_all_ports_seen_u0(xhci))) {
+			del_timer_sync(&xhci->comp_mode_recovery_timer);
+			xhci_dbg(xhci, "Compliance Mode Recovery Timer deleted!\n");
+		}
+
 		/* Let the USB core know _both_ roothubs lost power. */
 		usb_root_hub_lost_power(xhci->main_hcd->self.root_hub);
 		usb_root_hub_lost_power(xhci->shared_hcd->self.root_hub);
@@ -1026,6 +1034,8 @@ int xhci_resume(struct xhci_hcd *xhci, b
 		retval = xhci_init(hcd->primary_hcd);
 		if (retval)
 			return retval;
+		comp_timer_running = true;
+
 		xhci_dbg(xhci, "Start the primary HCD\n");
 		retval = xhci_run(hcd->primary_hcd);
 		if (!retval) {
@@ -1067,7 +1077,7 @@ int xhci_resume(struct xhci_hcd *xhci, b
 	 * to suffer the Compliance Mode issue again. It doesn't matter if
 	 * ports have entered previously to U0 before system's suspension.
 	 */
-	if (xhci->quirks & XHCI_COMP_MODE_QUIRK)
+	if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && !comp_timer_running)
 		compliance_mode_recovery_timer_init(xhci);
 
 	/* Re-enable port polling. */
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/host/xhci-mem.c linux-libre-3.4.49-gnu1/drivers/usb/host/xhci-mem.c
--- linux-libre-3.4.48-gnu1/drivers/usb/host/xhci-mem.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/host/xhci-mem.c	2013-06-13 12:48:06.000000000 -0400
@@ -1845,6 +1845,9 @@ void xhci_mem_cleanup(struct xhci_hcd *x
 	}
 	spin_unlock_irqrestore(&xhci->lock, flags);
 
+	if (!xhci->rh_bw)
+		goto no_bw;
+
 	num_ports = HCS_MAX_PORTS(xhci->hcs_params1);
 	for (i = 0; i < num_ports; i++) {
 		struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table;
@@ -1863,6 +1866,7 @@ void xhci_mem_cleanup(struct xhci_hcd *x
 		}
 	}
 
+no_bw:
 	xhci->num_usb2_ports = 0;
 	xhci->num_usb3_ports = 0;
 	xhci->num_active_eps = 0;
@@ -2274,6 +2278,9 @@ int xhci_mem_init(struct xhci_hcd *xhci,
 	u32 page_size, temp;
 	int i;
 
+	INIT_LIST_HEAD(&xhci->lpm_failed_devs);
+	INIT_LIST_HEAD(&xhci->cancel_cmd_list);
+
 	page_size = xhci_readl(xhci, &xhci->op_regs->page_size);
 	xhci_dbg(xhci, "Supported page size register = 0x%x\n", page_size);
 	for (i = 0; i < 16; i++) {
@@ -2352,7 +2359,6 @@ int xhci_mem_init(struct xhci_hcd *xhci,
 	xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags);
 	if (!xhci->cmd_ring)
 		goto fail;
-	INIT_LIST_HEAD(&xhci->cancel_cmd_list);
 	xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring);
 	xhci_dbg(xhci, "First segment DMA is 0x%llx\n",
 			(unsigned long long)xhci->cmd_ring->first_seg->dma);
@@ -2453,8 +2459,6 @@ int xhci_mem_init(struct xhci_hcd *xhci,
 	if (xhci_setup_port_arrays(xhci, flags))
 		goto fail;
 
-	INIT_LIST_HEAD(&xhci->lpm_failed_devs);
-
 	/* Enable USB 3.0 device notifications for function remote wake, which
 	 * is necessary for allowing USB 3.0 devices to do remote wakeup from
 	 * U3 (device suspend).
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/serial/ark3116.c linux-libre-3.4.49-gnu1/drivers/usb/serial/ark3116.c
--- linux-libre-3.4.48-gnu1/drivers/usb/serial/ark3116.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/serial/ark3116.c	2013-06-13 12:48:06.000000000 -0400
@@ -49,7 +49,7 @@ static bool debug;
 #define DRIVER_NAME "ark3116"
 
 /* usb timeout of 1 second */
-#define ARK_TIMEOUT (1*HZ)
+#define ARK_TIMEOUT 1000
 
 static const struct usb_device_id id_table[] = {
 	{ USB_DEVICE(0x6547, 0x0232) },
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/serial/cypress_m8.c linux-libre-3.4.49-gnu1/drivers/usb/serial/cypress_m8.c
--- linux-libre-3.4.48-gnu1/drivers/usb/serial/cypress_m8.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/serial/cypress_m8.c	2013-06-13 12:48:06.000000000 -0400
@@ -70,6 +70,7 @@ static const struct usb_device_id id_tab
 static const struct usb_device_id id_table_cyphidcomrs232[] = {
 	{ USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
 	{ USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) },
+	{ USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) },
 	{ }						/* Terminating entry */
 };
 
@@ -83,6 +84,7 @@ static const struct usb_device_id id_tab
 	{ USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) },
 	{ USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
 	{ USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) },
+	{ USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) },
 	{ USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) },
 	{ }						/* Terminating entry */
 };
@@ -243,6 +245,12 @@ static struct usb_serial_driver * const
  * Cypress serial helper functions
  *****************************************************************************/
 
+/* FRWD Dongle hidcom needs to skip reset and speed checks */
+static inline bool is_frwd(struct usb_device *dev)
+{
+	return ((le16_to_cpu(dev->descriptor.idVendor) == VENDOR_ID_FRWD) &&
+		(le16_to_cpu(dev->descriptor.idProduct) == PRODUCT_ID_CYPHIDCOM_FRWD));
+}
 
 static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate)
 {
@@ -252,6 +260,10 @@ static int analyze_baud_rate(struct usb_
 	if (unstable_bauds)
 		return new_rate;
 
+	/* FRWD Dongle uses 115200 bps */
+	if (is_frwd(port->serial->dev))
+		return new_rate;
+
 	/*
 	 * The general purpose firmware for the Cypress M8 allows for
 	 * a maximum speed of 57600bps (I have no idea whether DeLorme
@@ -465,7 +477,11 @@ static int generic_startup(struct usb_se
 	}
 	init_waitqueue_head(&priv->delta_msr_wait);
 
-	usb_reset_configuration(serial->dev);
+	/* Skip reset for FRWD device. It is a workaound:
+	   device hangs if it receives SET_CONFIGURE in Configured
+	   state. */
+	if (!is_frwd(serial->dev))
+		usb_reset_configuration(serial->dev);
 
 	priv->cmd_ctrl = 0;
 	priv->line_control = 0;
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/serial/cypress_m8.h linux-libre-3.4.49-gnu1/drivers/usb/serial/cypress_m8.h
--- linux-libre-3.4.48-gnu1/drivers/usb/serial/cypress_m8.h	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/serial/cypress_m8.h	2013-06-13 12:48:06.000000000 -0400
@@ -24,6 +24,10 @@
 #define VENDOR_ID_CYPRESS		0x04b4
 #define PRODUCT_ID_CYPHIDCOM		0x5500
 
+/* FRWD Dongle - a GPS sports watch */
+#define VENDOR_ID_FRWD			0x6737
+#define PRODUCT_ID_CYPHIDCOM_FRWD	0x0001
+
 /* Powercom UPS, chip CY7C63723 */
 #define VENDOR_ID_POWERCOM		0x0d9f
 #define PRODUCT_ID_UPS			0x0002
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/serial/ftdi_sio.c linux-libre-3.4.49-gnu1/drivers/usb/serial/ftdi_sio.c
--- linux-libre-3.4.48-gnu1/drivers/usb/serial/ftdi_sio.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/serial/ftdi_sio.c	2013-06-13 12:48:06.000000000 -0400
@@ -2173,7 +2173,7 @@ static void ftdi_set_termios(struct tty_
 
 	cflag = termios->c_cflag;
 
-	if (old_termios == 0)
+	if (!old_termios)
 		goto no_skip;
 
 	if (old_termios->c_cflag == termios->c_cflag
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/serial/iuu_phoenix.c linux-libre-3.4.49-gnu1/drivers/usb/serial/iuu_phoenix.c
--- linux-libre-3.4.48-gnu1/drivers/usb/serial/iuu_phoenix.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/serial/iuu_phoenix.c	2013-06-13 12:48:06.000000000 -0400
@@ -326,7 +326,7 @@ static int bulk_immediate(struct usb_ser
 	    usb_bulk_msg(serial->dev,
 			 usb_sndbulkpipe(serial->dev,
 					 port->bulk_out_endpointAddress), buf,
-			 count, &actual, HZ * 1);
+			 count, &actual, 1000);
 
 	if (status != IUU_OPERATION_OK)
 		dbg("%s - error = %2x", __func__, status);
@@ -349,7 +349,7 @@ static int read_immediate(struct usb_ser
 	    usb_bulk_msg(serial->dev,
 			 usb_rcvbulkpipe(serial->dev,
 					 port->bulk_in_endpointAddress), buf,
-			 count, &actual, HZ * 1);
+			 count, &actual, 1000);
 
 	if (status != IUU_OPERATION_OK)
 		dbg("%s - error = %2x", __func__, status);
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/serial/keyspan.c linux-libre-3.4.49-gnu1/drivers/usb/serial/keyspan.c
--- linux-libre-3.4.48-gnu1/drivers/usb/serial/keyspan.c	2013-06-07 18:07:19.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/serial/keyspan.c	2013-06-13 14:02:36.000000000 -0400
@@ -1705,7 +1705,7 @@ static int keyspan_usa26_send_setup(stru
 	d_details = s_priv->device_details;
 	device_port = port->number - port->serial->minor;
 
-	outcont_urb = d_details->outcont_endpoints[port->number];
+	outcont_urb = d_details->outcont_endpoints[device_port];
 	this_urb = p_priv->outcont_urb;
 
 	dbg("%s - endpoint %d", __func__, usb_pipeendpoint(this_urb->pipe));
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/serial/mos7720.c linux-libre-3.4.49-gnu1/drivers/usb/serial/mos7720.c
--- linux-libre-3.4.48-gnu1/drivers/usb/serial/mos7720.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/serial/mos7720.c	2013-06-13 12:48:06.000000000 -0400
@@ -44,7 +44,7 @@
 #define DRIVER_DESC "Moschip USB Serial Driver"
 
 /* default urb timeout */
-#define MOS_WDR_TIMEOUT	(HZ * 5)
+#define MOS_WDR_TIMEOUT	5000
 
 #define MOS_MAX_PORT	0x02
 #define MOS_WRITE	0x0E
@@ -234,11 +234,22 @@ static int read_mos_reg(struct usb_seria
 	__u8 requesttype = (__u8)0xc0;
 	__u16 index = get_reg_index(reg);
 	__u16 value = get_reg_value(reg, serial_portnum);
-	int status = usb_control_msg(usbdev, pipe, request, requesttype, value,
-				     index, data, 1, MOS_WDR_TIMEOUT);
-	if (status < 0)
+	u8 *buf;
+	int status;
+
+	buf = kmalloc(1, GFP_KERNEL);
+	if (!buf)
+		return -ENOMEM;
+
+	status = usb_control_msg(usbdev, pipe, request, requesttype, value,
+				     index, buf, 1, MOS_WDR_TIMEOUT);
+	if (status == 1)
+		*data = *buf;
+	else if (status < 0)
 		dev_err(&usbdev->dev,
 			"mos7720: usb_control_msg() failed: %d", status);
+	kfree(buf);
+
 	return status;
 }
 
@@ -1690,7 +1701,7 @@ static void change_port_settings(struct
 		mos7720_port->shadowMCR |= (UART_MCR_XONANY);
 		/* To set hardware flow control to the specified *
 		 * serial port, in SP1/2_CONTROL_REG             */
-		if (port->number)
+		if (port_number)
 			write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x01);
 		else
 			write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x02);
@@ -2094,7 +2105,7 @@ static int mos7720_startup(struct usb_se
 
 	/* setting configuration feature to one */
 	usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
-			(__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5*HZ);
+			(__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000);
 
 	/* start the interrupt urb */
 	ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL);
@@ -2139,7 +2150,7 @@ static void mos7720_release(struct usb_s
 		/* wait for synchronous usb calls to return */
 		if (mos_parport->msg_pending)
 			wait_for_completion_timeout(&mos_parport->syncmsg_compl,
-						    MOS_WDR_TIMEOUT);
+					    msecs_to_jiffies(MOS_WDR_TIMEOUT));
 
 		parport_remove_port(mos_parport->pp);
 		usb_set_serial_data(serial, NULL);
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/serial/option.c linux-libre-3.4.49-gnu1/drivers/usb/serial/option.c
--- linux-libre-3.4.48-gnu1/drivers/usb/serial/option.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/serial/option.c	2013-06-13 12:48:06.000000000 -0400
@@ -593,6 +593,8 @@ static const struct usb_device_id option
 		.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff),
 		.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
+	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x14ac, 0xff, 0xff, 0xff),	/* Huawei E1820 */
+		.driver_info = (kernel_ulong_t) &net_intf1_blacklist },
 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff),
 		.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
 	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0xff, 0xff) },
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/serial/visor.c linux-libre-3.4.49-gnu1/drivers/usb/serial/visor.c
--- linux-libre-3.4.48-gnu1/drivers/usb/serial/visor.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/serial/visor.c	2013-06-13 12:48:06.000000000 -0400
@@ -596,10 +596,19 @@ static int treo_attach(struct usb_serial
 	*/
 #define COPY_PORT(dest, src)						\
 	do { \
+		int i;							\
+									\
+		for (i = 0; i < ARRAY_SIZE(src->read_urbs); ++i) {	\
+			dest->read_urbs[i] = src->read_urbs[i];		\
+			dest->read_urbs[i]->context = dest;		\
+			dest->bulk_in_buffers[i] = src->bulk_in_buffers[i]; \
+		}							\
 		dest->read_urb = src->read_urb;				\
 		dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress;\
 		dest->bulk_in_buffer = src->bulk_in_buffer;		\
+		dest->bulk_in_size = src->bulk_in_size;			\
 		dest->interrupt_in_urb = src->interrupt_in_urb;		\
+		dest->interrupt_in_urb->context = dest;			\
 		dest->interrupt_in_endpointAddress = \
 					src->interrupt_in_endpointAddress;\
 		dest->interrupt_in_buffer = src->interrupt_in_buffer;	\
diff -druNp linux-libre-3.4.48-gnu1/drivers/usb/serial/whiteheat.c linux-libre-3.4.49-gnu1/drivers/usb/serial/whiteheat.c
--- linux-libre-3.4.48-gnu1/drivers/usb/serial/whiteheat.c	2013-06-07 18:07:44.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/usb/serial/whiteheat.c	2013-06-13 14:03:01.000000000 -0400
@@ -1154,7 +1154,7 @@ static void firm_setup_port(struct tty_s
 	struct whiteheat_port_settings port_settings;
 	unsigned int cflag = tty->termios->c_cflag;
 
-	port_settings.port = port->number + 1;
+	port_settings.port = port->number - port->serial->minor + 1;
 
 	/* get the byte size */
 	switch (cflag & CSIZE) {
diff -druNp linux-libre-3.4.48-gnu1/drivers/xen/xen-pciback/pciback_ops.c linux-libre-3.4.49-gnu1/drivers/xen/xen-pciback/pciback_ops.c
--- linux-libre-3.4.48-gnu1/drivers/xen/xen-pciback/pciback_ops.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/drivers/xen/xen-pciback/pciback_ops.c	2013-06-13 12:48:06.000000000 -0400
@@ -9,6 +9,8 @@
 #include <xen/events.h>
 #include <linux/sched.h>
 #include "pciback.h"
+#include <linux/ratelimit.h>
+#include <linux/printk.h>
 
 int verbose_request;
 module_param(verbose_request, int, 0644);
@@ -136,7 +138,6 @@ int xen_pcibk_enable_msi(struct xen_pcib
 			 struct pci_dev *dev, struct xen_pci_op *op)
 {
 	struct xen_pcibk_dev_data *dev_data;
-	int otherend = pdev->xdev->otherend_id;
 	int status;
 
 	if (unlikely(verbose_request))
@@ -145,8 +146,9 @@ int xen_pcibk_enable_msi(struct xen_pcib
 	status = pci_enable_msi(dev);
 
 	if (status) {
-		printk(KERN_ERR "error enable msi for guest %x status %x\n",
-			otherend, status);
+		pr_warn_ratelimited(DRV_NAME ": %s: error enabling MSI for guest %u: err %d\n",
+				    pci_name(dev), pdev->xdev->otherend_id,
+				    status);
 		op->value = 0;
 		return XEN_PCI_ERR_op_failed;
 	}
@@ -224,10 +226,10 @@ int xen_pcibk_enable_msix(struct xen_pci
 						pci_name(dev), i,
 						op->msix_entries[i].vector);
 		}
-	} else {
-		printk(KERN_WARNING DRV_NAME ": %s: failed to enable MSI-X: err %d!\n",
-			pci_name(dev), result);
-	}
+	} else
+		pr_warn_ratelimited(DRV_NAME ": %s: error enabling MSI-X for guest %u: err %d!\n",
+				    pci_name(dev), pdev->xdev->otherend_id,
+				    result);
 	kfree(entries);
 
 	op->value = result;
diff -druNp linux-libre-3.4.48-gnu1/include/linux/ftrace.h linux-libre-3.4.49-gnu1/include/linux/ftrace.h
--- linux-libre-3.4.48-gnu1/include/linux/ftrace.h	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/include/linux/ftrace.h	2013-06-13 12:48:06.000000000 -0400
@@ -299,7 +299,6 @@ ssize_t ftrace_filter_write(struct file
 			    size_t cnt, loff_t *ppos);
 ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf,
 			     size_t cnt, loff_t *ppos);
-loff_t ftrace_regex_lseek(struct file *file, loff_t offset, int origin);
 int ftrace_regex_release(struct inode *inode, struct file *file);
 
 void __init
@@ -420,6 +419,8 @@ static inline int
 ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; }
 #endif /* CONFIG_DYNAMIC_FTRACE */
 
+loff_t ftrace_filter_lseek(struct file *file, loff_t offset, int whence);
+
 /* totally disable ftrace - can not re-enable after this */
 void ftrace_kill(void);
 
diff -druNp linux-libre-3.4.48-gnu1/kernel/trace/ftrace.c linux-libre-3.4.49-gnu1/kernel/trace/ftrace.c
--- linux-libre-3.4.48-gnu1/kernel/trace/ftrace.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/kernel/trace/ftrace.c	2013-06-13 12:48:06.000000000 -0400
@@ -999,6 +999,19 @@ static __init void ftrace_profile_debugf
 
 static struct pid * const ftrace_swapper_pid = &init_struct_pid;
 
+loff_t
+ftrace_filter_lseek(struct file *file, loff_t offset, int whence)
+{
+	loff_t ret;
+
+	if (file->f_mode & FMODE_READ)
+		ret = seq_lseek(file, offset, whence);
+	else
+		file->f_pos = ret = 1;
+
+	return ret;
+}
+
 #ifdef CONFIG_DYNAMIC_FTRACE
 
 #ifndef CONFIG_FTRACE_MCOUNT_RECORD
@@ -2541,7 +2554,7 @@ static void ftrace_filter_reset(struct f
  * routine, you can use ftrace_filter_write() for the write
  * routine if @flag has FTRACE_ITER_FILTER set, or
  * ftrace_notrace_write() if @flag has FTRACE_ITER_NOTRACE set.
- * ftrace_regex_lseek() should be used as the lseek routine, and
+ * ftrace_filter_lseek() should be used as the lseek routine, and
  * release must call ftrace_regex_release().
  */
 int
@@ -2625,19 +2638,6 @@ ftrace_notrace_open(struct inode *inode,
 				 inode, file);
 }
 
-loff_t
-ftrace_regex_lseek(struct file *file, loff_t offset, int origin)
-{
-	loff_t ret;
-
-	if (file->f_mode & FMODE_READ)
-		ret = seq_lseek(file, offset, origin);
-	else
-		file->f_pos = ret = 1;
-
-	return ret;
-}
-
 static int ftrace_match(char *str, char *regex, int len, int type)
 {
 	int matched = 0;
@@ -3445,7 +3445,7 @@ static const struct file_operations ftra
 	.open = ftrace_filter_open,
 	.read = seq_read,
 	.write = ftrace_filter_write,
-	.llseek = ftrace_regex_lseek,
+	.llseek = ftrace_filter_lseek,
 	.release = ftrace_regex_release,
 };
 
@@ -3453,7 +3453,7 @@ static const struct file_operations ftra
 	.open = ftrace_notrace_open,
 	.read = seq_read,
 	.write = ftrace_notrace_write,
-	.llseek = ftrace_regex_lseek,
+	.llseek = ftrace_filter_lseek,
 	.release = ftrace_regex_release,
 };
 
@@ -3659,8 +3659,8 @@ static const struct file_operations ftra
 	.open		= ftrace_graph_open,
 	.read		= seq_read,
 	.write		= ftrace_graph_write,
+	.llseek		= ftrace_filter_lseek,
 	.release	= ftrace_graph_release,
-	.llseek		= seq_lseek,
 };
 #endif /* CONFIG_FUNCTION_GRAPH_TRACER */
 
@@ -4261,7 +4261,7 @@ static const struct file_operations ftra
 	.open		= ftrace_pid_open,
 	.write		= ftrace_pid_write,
 	.read		= seq_read,
-	.llseek		= seq_lseek,
+	.llseek		= ftrace_filter_lseek,
 	.release	= ftrace_pid_release,
 };
 
diff -druNp linux-libre-3.4.48-gnu1/kernel/trace/trace_stack.c linux-libre-3.4.49-gnu1/kernel/trace/trace_stack.c
--- linux-libre-3.4.48-gnu1/kernel/trace/trace_stack.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/kernel/trace/trace_stack.c	2013-06-13 12:48:06.000000000 -0400
@@ -384,7 +384,7 @@ static const struct file_operations stac
 	.open = stack_trace_filter_open,
 	.read = seq_read,
 	.write = ftrace_filter_write,
-	.llseek = ftrace_regex_lseek,
+	.llseek = ftrace_filter_lseek,
 	.release = ftrace_regex_release,
 };
 
diff -druNp linux-libre-3.4.48-gnu1/Makefile linux-libre-3.4.49-gnu1/Makefile
--- linux-libre-3.4.48-gnu1/Makefile	2013-06-07 17:56:45.000000000 -0400
+++ linux-libre-3.4.49-gnu1/Makefile	2013-06-13 13:51:49.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 4
-SUBLEVEL = 48
+SUBLEVEL = 49
 EXTRAVERSION =-gnu1
 NAME = Saber-toothed Squirrel
 
diff -druNp linux-libre-3.4.48-gnu1/sound/usb/mixer.c linux-libre-3.4.49-gnu1/sound/usb/mixer.c
--- linux-libre-3.4.48-gnu1/sound/usb/mixer.c	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/sound/usb/mixer.c	2013-06-13 12:48:06.000000000 -0400
@@ -822,6 +822,7 @@ static void volume_control_quirks(struct
 	case USB_ID(0x046d, 0x0808):
 	case USB_ID(0x046d, 0x0809):
 	case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */
+	case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */
 	case USB_ID(0x046d, 0x0991):
 	/* Most audio usb devices lie about volume resolution.
 	 * Most Logitech webcams have res = 384.
diff -druNp linux-libre-3.4.48-gnu1/sound/usb/quirks-table.h linux-libre-3.4.49-gnu1/sound/usb/quirks-table.h
--- linux-libre-3.4.48-gnu1/sound/usb/quirks-table.h	2013-06-07 15:50:29.000000000 -0400
+++ linux-libre-3.4.49-gnu1/sound/usb/quirks-table.h	2013-06-13 12:48:06.000000000 -0400
@@ -157,7 +157,13 @@
 	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
 },
 {
-	USB_DEVICE(0x046d, 0x0990),
+	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
+		       USB_DEVICE_ID_MATCH_INT_CLASS |
+		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
+	.idVendor = 0x046d,
+	.idProduct = 0x0990,
+	.bInterfaceClass = USB_CLASS_AUDIO,
+	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
 	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
 		.vendor_name = "Logitech, Inc.",
 		.product_name = "QuickCam Pro 9000",
@@ -1622,7 +1628,11 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 	USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108),
 	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
 		.ifnum = 0,
-		.type = QUIRK_MIDI_STANDARD_INTERFACE
+		.type = QUIRK_MIDI_FIXED_ENDPOINT,
+		.data = & (const struct snd_usb_midi_endpoint_info) {
+			.out_cables = 0x0007,
+			.in_cables  = 0x0007
+		}
 	}
 },
 {
