Эх сурвалжийг харах

Merge branches 'acpi-video' and 'acpi-cppc'

* acpi-video:
  ACPI / video: only register backlight for LCD device
  ACPI / video: Add a quirk to force acpi-video backlight on Dell XPS L421X

* acpi-cppc:
  cpufreq: CPPC: Delete an unnecessary check before the function call kfree()
Rafael J. Wysocki 9 жил өмнө
parent
commit
3930f660b4

+ 66 - 12
drivers/acpi/acpi_video.c

@@ -77,6 +77,12 @@ module_param(allow_duplicates, bool, 0644);
 static int disable_backlight_sysfs_if = -1;
 static int disable_backlight_sysfs_if = -1;
 module_param(disable_backlight_sysfs_if, int, 0444);
 module_param(disable_backlight_sysfs_if, int, 0444);
 
 
+static bool device_id_scheme = false;
+module_param(device_id_scheme, bool, 0444);
+
+static bool only_lcd = false;
+module_param(only_lcd, bool, 0444);
+
 static int register_count;
 static int register_count;
 static DEFINE_MUTEX(register_count_mutex);
 static DEFINE_MUTEX(register_count_mutex);
 static struct mutex video_list_lock;
 static struct mutex video_list_lock;
@@ -394,6 +400,18 @@ static int video_disable_backlight_sysfs_if(
 	return 0;
 	return 0;
 }
 }
 
 
+static int video_set_device_id_scheme(const struct dmi_system_id *d)
+{
+	device_id_scheme = true;
+	return 0;
+}
+
+static int video_enable_only_lcd(const struct dmi_system_id *d)
+{
+	only_lcd = true;
+	return 0;
+}
+
 static struct dmi_system_id video_dmi_table[] = {
 static struct dmi_system_id video_dmi_table[] = {
 	/*
 	/*
 	 * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
 	 * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
@@ -455,6 +473,33 @@ static struct dmi_system_id video_dmi_table[] = {
 		DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R830"),
 		DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R830"),
 		},
 		},
 	},
 	},
+	/*
+	 * Some machine's _DOD IDs don't have bit 31(Device ID Scheme) set
+	 * but the IDs actually follow the Device ID Scheme.
+	 */
+	{
+	 /* https://bugzilla.kernel.org/show_bug.cgi?id=104121 */
+	 .callback = video_set_device_id_scheme,
+	 .ident = "ESPRIMO Mobile M9410",
+	 .matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+		DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile M9410"),
+		},
+	},
+	/*
+	 * Some machines have multiple video output devices, but only the one
+	 * that is the type of LCD can do the backlight control so we should not
+	 * register backlight interface for other video output devices.
+	 */
+	{
+	 /* https://bugzilla.kernel.org/show_bug.cgi?id=104121 */
+	 .callback = video_enable_only_lcd,
+	 .ident = "ESPRIMO Mobile M9410",
+	 .matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+		DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile M9410"),
+		},
+	},
 	{}
 	{}
 };
 };
 
 
@@ -1003,7 +1048,7 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
 
 
 	attribute = acpi_video_get_device_attr(video, device_id);
 	attribute = acpi_video_get_device_attr(video, device_id);
 
 
-	if (attribute && attribute->device_id_scheme) {
+	if (attribute && (attribute->device_id_scheme || device_id_scheme)) {
 		switch (attribute->display_type) {
 		switch (attribute->display_type) {
 		case ACPI_VIDEO_DISPLAY_CRT:
 		case ACPI_VIDEO_DISPLAY_CRT:
 			data->flags.crt = 1;
 			data->flags.crt = 1;
@@ -1568,15 +1613,6 @@ static void acpi_video_dev_register_backlight(struct acpi_video_device *device)
 	static int count;
 	static int count;
 	char *name;
 	char *name;
 
 
-	/*
-	 * Do not create backlight device for video output
-	 * device that is not in the enumerated list.
-	 */
-	if (!acpi_video_device_in_dod(device)) {
-		dev_dbg(&device->dev->dev, "not in _DOD list, ignore\n");
-		return;
-	}
-
 	result = acpi_video_init_brightness(device);
 	result = acpi_video_init_brightness(device);
 	if (result)
 	if (result)
 		return;
 		return;
@@ -1657,6 +1693,22 @@ static void acpi_video_run_bcl_for_osi(struct acpi_video_bus *video)
 	mutex_unlock(&video->device_list_lock);
 	mutex_unlock(&video->device_list_lock);
 }
 }
 
 
+static bool acpi_video_should_register_backlight(struct acpi_video_device *dev)
+{
+	/*
+	 * Do not create backlight device for video output
+	 * device that is not in the enumerated list.
+	 */
+	if (!acpi_video_device_in_dod(dev)) {
+		dev_dbg(&dev->dev->dev, "not in _DOD list, ignore\n");
+		return false;
+	}
+
+	if (only_lcd)
+		return dev->flags.lcd;
+	return true;
+}
+
 static int acpi_video_bus_register_backlight(struct acpi_video_bus *video)
 static int acpi_video_bus_register_backlight(struct acpi_video_bus *video)
 {
 {
 	struct acpi_video_device *dev;
 	struct acpi_video_device *dev;
@@ -1670,8 +1722,10 @@ static int acpi_video_bus_register_backlight(struct acpi_video_bus *video)
 		return 0;
 		return 0;
 
 
 	mutex_lock(&video->device_list_lock);
 	mutex_lock(&video->device_list_lock);
-	list_for_each_entry(dev, &video->video_device_list, entry)
-		acpi_video_dev_register_backlight(dev);
+	list_for_each_entry(dev, &video->video_device_list, entry) {
+		if (acpi_video_should_register_backlight(dev))
+			acpi_video_dev_register_backlight(dev);
+	}
 	mutex_unlock(&video->device_list_lock);
 	mutex_unlock(&video->device_list_lock);
 
 
 	video->backlight_registered = true;
 	video->backlight_registered = true;

+ 9 - 0
drivers/acpi/video_detect.c

@@ -232,6 +232,15 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
 			  "900X3C/900X3D/900X3E/900X4C/900X4D"),
 			  "900X3C/900X3D/900X3E/900X4C/900X4D"),
 		},
 		},
 	},
 	},
+	{
+	 /* https://bugzilla.redhat.com/show_bug.cgi?id=1272633 */
+	 .callback = video_detect_force_video,
+	 .ident = "Dell XPS14 L421X",
+	 .matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+		DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"),
+		},
+	},
 	{
 	{
 	 /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */
 	 /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */
 	 .callback = video_detect_force_video,
 	 .callback = video_detect_force_video,

+ 1 - 2
drivers/cpufreq/cppc_cpufreq.c

@@ -166,8 +166,7 @@ static int __init cppc_cpufreq_init(void)
 
 
 out:
 out:
 	for_each_possible_cpu(i)
 	for_each_possible_cpu(i)
-		if (all_cpu_data[i])
-			kfree(all_cpu_data[i]);
+		kfree(all_cpu_data[i]);
 
 
 	kfree(all_cpu_data);
 	kfree(all_cpu_data);
 	return -ENODEV;
 	return -ENODEV;