Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c8593884 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: (26 commits)
  cpuidle: remove unused exports
  acpi: remove double mention of Support for ACPI option
  ACPI: use select POWER_SUPPLY for AC, BATTERY and SBS
  ACPI: Battery: Allow extract string from integer
  ACPI: battery: Support for non-spec name for LiIon technology
  ACPI: battery: register power_supply subdevice only when battery is present
  suspend: MAINTAINERS update
  ACPI: update MAINTAINERS
  fujitsu-laptop.c: remove dead code
  cpuidle: unexport tick_nohz_get_sleep_length
  ACPI: battery: Update battery information upon sysfs read.
  fujitsu-laptop: make 2 functions static
  ACPI: EC: fix use-after-free
  ACPI: battery: remove dead code
  ACPI: Fan: Drop force_power_state acpi_device option
  ACPI: Fan: fan device does not need own structure
  ACPI: power: don't cache power resource state
  ACPI: EC: Output changes to operational mode
  ACPI: EC: Add workaround for "optimized" controllers
  ACPI: EC: Don't re-enable GPE for each transaction.
  ...
parents 4282b01e 1942971b
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -586,11 +586,6 @@ and is between 256 and 4096 characters. It is defined in the file

	eata=		[HW,SCSI]

	ec_intr=	[HW,ACPI] ACPI Embedded Controller interrupt mode
			Format: <int>
			0: polling mode
			non-0: interrupt mode (default)

	edd=		[EDD]
			Format: {"of[f]" | "sk[ipmbr]"}
			See comment in arch/i386/boot/edd.S
+10 −8
Original line number Diff line number Diff line
@@ -216,7 +216,7 @@ P: Len Brown
M:	len.brown@intel.com
M:	lenb@kernel.org
L:	linux-acpi@vger.kernel.org
W:	http://acpi.sourceforge.net/
W:	http://www.lesswatts.org/projects/acpi/
T:	git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
S:	Supported

@@ -235,8 +235,8 @@ W: http://acpi.sourceforge.net/
S:	Supported

ACPI FAN DRIVER
P:	Konstantin A. Karasyov
M:	konstantin.a.karasyov@intel.com
P:	Len Brown
M:	len.brown@intel.com
L:	linux-acpi@vger.kernel.org
W:	http://acpi.sourceforge.net/
S:	Supported
@@ -248,15 +248,15 @@ L: pcihpd-discuss@lists.sourceforge.net
S:	Supported

ACPI THERMAL DRIVER
P:	Konstantin A. Karasyov
M:	konstantin.a.karasyov@intel.com
P:	Len Brown
M:	len.brown@intel.com
L:	linux-acpi@vger.kernel.org
W:	http://acpi.sourceforge.net/
S:	Supported

ACPI VIDEO DRIVER
P:	Luming Yu
M:	luming.yu@intel.com
P:	Rui Zhang
M:	rui.zhang@intel.com
L:	linux-acpi@vger.kernel.org
W:	http://acpi.sourceforge.net/
S:	Supported
@@ -3472,12 +3472,14 @@ L: linux-pm@lists.linux-foundation.org
S:	Supported

SUSPEND TO RAM:
P:	Len Brown
M:	len.brown@intel.com
P:	Pavel Machek
M:	pavel@suse.cz
P:	Rafael J. Wysocki
M:	rjw@sisk.pl
L:	linux-pm@lists.linux-foundation.org
S:	Maintained
S:	Supported

SONIC NETWORK DRIVER
P:	Thomas Bogendoerfer
+6 −4
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
#

menuconfig ACPI
	bool "ACPI Support (Advanced Configuration and Power Interface) Support"
	bool "ACPI (Advanced Configuration and Power Interface) Support"
	depends on !X86_NUMAQ
	depends on !X86_VISWS
	depends on !IA64_HP_SIM
@@ -88,7 +88,8 @@ config ACPI_PROC_EVENT

config ACPI_AC
	tristate "AC Adapter"
	depends on X86 && POWER_SUPPLY
	depends on X86
	select POWER_SUPPLY
	default y
	help
	  This driver adds support for the AC Adapter object, which indicates
@@ -97,7 +98,8 @@ config ACPI_AC

config ACPI_BATTERY
	tristate "Battery"
	depends on X86 && POWER_SUPPLY
	depends on X86
	select POWER_SUPPLY
	default y
	help
	  This driver adds support for battery information through
@@ -352,7 +354,7 @@ config ACPI_HOTPLUG_MEMORY
config ACPI_SBS
	tristate "Smart Battery System"
	depends on X86
	depends on POWER_SUPPLY
	select POWER_SUPPLY
	help
	  This driver adds support for the Smart Battery System, another
	  type of access to battery information, found on some laptops.
+95 −69
Original line number Diff line number Diff line
@@ -125,11 +125,15 @@ static int acpi_battery_technology(struct acpi_battery *battery)
		return POWER_SUPPLY_TECHNOLOGY_NiMH;
	if (!strcasecmp("LION", battery->type))
		return POWER_SUPPLY_TECHNOLOGY_LION;
	if (!strcasecmp("LI-ION", battery->type))
		return POWER_SUPPLY_TECHNOLOGY_LION;
	if (!strcasecmp("LiP", battery->type))
		return POWER_SUPPLY_TECHNOLOGY_LIPO;
	return POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
}

static int acpi_battery_update(struct acpi_battery *battery);

static int acpi_battery_get_property(struct power_supply *psy,
				     enum power_supply_property psp,
				     union power_supply_propval *val)
@@ -139,6 +143,7 @@ static int acpi_battery_get_property(struct power_supply *psy,
	if ((!acpi_battery_present(battery)) &&
	     psp != POWER_SUPPLY_PROP_PRESENT)
		return -ENODEV;
	acpi_battery_update(battery);
	switch (psp) {
	case POWER_SUPPLY_PROP_STATUS:
		if (battery->state & 0x01)
@@ -257,7 +262,7 @@ static int extract_package(struct acpi_battery *battery,
			   union acpi_object *package,
			   struct acpi_offsets *offsets, int num)
{
	int i, *x;
	int i;
	union acpi_object *element;
	if (package->type != ACPI_TYPE_PACKAGE)
		return -EFAULT;
@@ -266,16 +271,21 @@ static int extract_package(struct acpi_battery *battery,
			return -EFAULT;
		element = &package->package.elements[i];
		if (offsets[i].mode) {
			if (element->type != ACPI_TYPE_STRING &&
			    element->type != ACPI_TYPE_BUFFER)
				return -EFAULT;
			strncpy((u8 *)battery + offsets[i].offset,
				element->string.pointer, 32);
			u8 *ptr = (u8 *)battery + offsets[i].offset;
			if (element->type == ACPI_TYPE_STRING ||
			    element->type == ACPI_TYPE_BUFFER)
				strncpy(ptr, element->string.pointer, 32);
			else if (element->type == ACPI_TYPE_INTEGER) {
				strncpy(ptr, (u8 *)&element->integer.value,
					sizeof(acpi_integer));
				ptr[sizeof(acpi_integer)] = 0;
			} else return -EFAULT;
		} else {
			if (element->type != ACPI_TYPE_INTEGER)
				return -EFAULT;
			x = (int *)((u8 *)battery + offsets[i].offset);
			if (element->type == ACPI_TYPE_INTEGER) {
				int *x = (int *)((u8 *)battery +
						offsets[i].offset);
				*x = element->integer.value;
			} else return -EFAULT;
		}
	}
	return 0;
@@ -385,16 +395,40 @@ static int acpi_battery_init_alarm(struct acpi_battery *battery)
	return acpi_battery_set_alarm(battery);
}

static int acpi_battery_update(struct acpi_battery *battery)
static ssize_t acpi_battery_alarm_show(struct device *dev,
					struct device_attribute *attr,
					char *buf)
{
	int saved_present = acpi_battery_present(battery);
	int result = acpi_battery_get_status(battery);
	if (result || !acpi_battery_present(battery))
		return result;
	if (saved_present != acpi_battery_present(battery) ||
	    !battery->update_time) {
	struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev));
	return sprintf(buf, "%d\n", battery->alarm * 1000);
}

static ssize_t acpi_battery_alarm_store(struct device *dev,
					struct device_attribute *attr,
					const char *buf, size_t count)
{
	unsigned long x;
	struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev));
	if (sscanf(buf, "%ld\n", &x) == 1)
		battery->alarm = x/1000;
	if (acpi_battery_present(battery))
		acpi_battery_set_alarm(battery);
	return count;
}

static struct device_attribute alarm_attr = {
	.attr = {.name = "alarm", .mode = 0644, .owner = THIS_MODULE},
	.show = acpi_battery_alarm_show,
	.store = acpi_battery_alarm_store,
};

static int sysfs_add_battery(struct acpi_battery *battery)
{
	int result;

	battery->update_time = 0;
	result = acpi_battery_get_info(battery);
	acpi_battery_init_alarm(battery);
	if (result)
		return result;
	if (battery->power_unit) {
@@ -406,8 +440,36 @@ static int acpi_battery_update(struct acpi_battery *battery)
		battery->bat.num_properties =
			ARRAY_SIZE(energy_battery_props);
	}
		acpi_battery_init_alarm(battery);

	battery->bat.name = acpi_device_bid(battery->device);
	battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
	battery->bat.get_property = acpi_battery_get_property;

	result = power_supply_register(&battery->device->dev, &battery->bat);
	if (result)
		return result;
	return device_create_file(battery->bat.dev, &alarm_attr);
}

static void sysfs_remove_battery(struct acpi_battery *battery)
{
	if (!battery->bat.dev)
		return;
	device_remove_file(battery->bat.dev, &alarm_attr);
	power_supply_unregister(&battery->bat);
}

static int acpi_battery_update(struct acpi_battery *battery)
{
	int result = acpi_battery_get_status(battery);
	if (result)
		return result;
	if (!acpi_battery_present(battery)) {
		sysfs_remove_battery(battery);
		return 0;
	}
	if (!battery->bat.dev)
		sysfs_add_battery(battery);
	return acpi_battery_get_state(battery);
}

@@ -554,10 +616,6 @@ static ssize_t acpi_battery_write_alarm(struct file *file,

	if (!battery || (count > sizeof(alarm_string) - 1))
		return -EINVAL;
	if (result) {
		result = -ENODEV;
		goto end;
	}
	if (!acpi_battery_present(battery)) {
		result = -ENODEV;
		goto end;
@@ -688,33 +746,6 @@ static void acpi_battery_remove_fs(struct acpi_device *device)

#endif

static ssize_t acpi_battery_alarm_show(struct device *dev,
					struct device_attribute *attr,
					char *buf)
{
	struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev));
	return sprintf(buf, "%d\n", battery->alarm * 1000);
}

static ssize_t acpi_battery_alarm_store(struct device *dev,
					struct device_attribute *attr,
					const char *buf, size_t count)
{
	unsigned long x;
	struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev));
	if (sscanf(buf, "%ld\n", &x) == 1)
		battery->alarm = x/1000;
	if (acpi_battery_present(battery))
		acpi_battery_set_alarm(battery);
	return count;
}

static struct device_attribute alarm_attr = {
	.attr = {.name = "alarm", .mode = 0644, .owner = THIS_MODULE},
	.show = acpi_battery_alarm_show,
	.store = acpi_battery_alarm_store,
};

/* --------------------------------------------------------------------------
                                 Driver Interface
   -------------------------------------------------------------------------- */
@@ -732,6 +763,8 @@ static void acpi_battery_notify(acpi_handle handle, u32 event, void *data)
	acpi_bus_generate_netlink_event(device->pnp.device_class,
					device->dev.bus_id, event,
					acpi_battery_present(battery));
	/* acpi_batter_update could remove power_supply object */
	if (battery->bat.dev)
		kobject_uevent(&battery->bat.dev->kobj, KOBJ_CHANGE);
}

@@ -756,11 +789,6 @@ static int acpi_battery_add(struct acpi_device *device)
	if (result)
		goto end;
#endif
	battery->bat.name = acpi_device_bid(device);
	battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
	battery->bat.get_property = acpi_battery_get_property;
	result = power_supply_register(&battery->device->dev, &battery->bat);
	result = device_create_file(battery->bat.dev, &alarm_attr);
	status = acpi_install_notify_handler(device->handle,
					     ACPI_ALL_NOTIFY,
					     acpi_battery_notify, battery);
@@ -796,10 +824,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type)
#ifdef CONFIG_ACPI_PROCFS
	acpi_battery_remove_fs(device);
#endif
	if (battery->bat.dev) {
		device_remove_file(battery->bat.dev, &alarm_attr);
		power_supply_unregister(&battery->bat);
	}
	sysfs_remove_battery(battery);
	mutex_destroy(&battery->lock);
	kfree(battery);
	return 0;
@@ -813,6 +838,7 @@ static int acpi_battery_resume(struct acpi_device *device)
		return -EINVAL;
	battery = acpi_driver_data(device);
	battery->update_time = 0;
	acpi_battery_update(battery);
	return 0;
}

+3 −5
Original line number Diff line number Diff line
@@ -198,12 +198,10 @@ int acpi_bus_set_power(acpi_handle handle, int state)
		return -ENODEV;
	}
	/*
	 * Get device's current power state if it's unknown
	 * This means device power state isn't initialized or previous setting failed
	 * Get device's current power state
	 */
	if ((device->power.state == ACPI_STATE_UNKNOWN) || device->flags.force_power_state)
	acpi_bus_get_power(device->handle, &device->power.state);
	if ((state == device->power.state) && !device->flags.force_power_state) {
	if (state == device->power.state) {
		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n",
				  state));
		return 0;
Loading