Commit 94a81cac authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branches 'acpi-battery' and 'acpi-video'

* acpi-battery:
  ACPI / AC: recheck adapter status upon battery status changes
  ACPI / battery: call ACPI notifier chain in acpi_battery_notify
  ACPI / battery: move some ACPI_BATTERY_* definitions to header

* acpi-video:
  video / output: Drop display output class support
  fujitsu-laptop: Drop unneeded include
  acer-wmi: Stop selecting VIDEO_OUTPUT_CONTROL
  ACPI / gpu / drm: Stop selecting VIDEO_OUTPUT_CONTROL
  ACPI / video: fix ACPI_VIDEO dependencies
...@@ -102,7 +102,7 @@ config ACPI_BUTTON ...@@ -102,7 +102,7 @@ config ACPI_BUTTON
config ACPI_VIDEO config ACPI_VIDEO
tristate "Video" tristate "Video"
depends on X86 && BACKLIGHT_CLASS_DEVICE && VIDEO_OUTPUT_CONTROL depends on X86 && BACKLIGHT_CLASS_DEVICE
depends on INPUT depends on INPUT
select THERMAL select THERMAL
help help
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/acpi.h> #include <linux/acpi.h>
#include "battery.h"
#define PREFIX "ACPI: " #define PREFIX "ACPI: "
...@@ -57,6 +58,7 @@ struct acpi_ac { ...@@ -57,6 +58,7 @@ struct acpi_ac {
struct power_supply charger; struct power_supply charger;
struct platform_device *pdev; struct platform_device *pdev;
unsigned long long state; unsigned long long state;
struct notifier_block battery_nb;
}; };
#define to_acpi_ac(x) container_of(x, struct acpi_ac, charger) #define to_acpi_ac(x) container_of(x, struct acpi_ac, charger)
...@@ -152,6 +154,26 @@ static void acpi_ac_notify_handler(acpi_handle handle, u32 event, void *data) ...@@ -152,6 +154,26 @@ static void acpi_ac_notify_handler(acpi_handle handle, u32 event, void *data)
return; return;
} }
static int acpi_ac_battery_notify(struct notifier_block *nb,
unsigned long action, void *data)
{
struct acpi_ac *ac = container_of(nb, struct acpi_ac, battery_nb);
struct acpi_bus_event *event = (struct acpi_bus_event *)data;
/*
* On HP Pavilion dv6-6179er AC status notifications aren't triggered
* when adapter is plugged/unplugged. However, battery status
* notifcations are triggered when battery starts charging or
* discharging. Re-reading AC status triggers lost AC notifications,
* if AC status has changed.
*/
if (strcmp(event->device_class, ACPI_BATTERY_CLASS) == 0 &&
event->type == ACPI_BATTERY_NOTIFY_STATUS)
acpi_ac_get_state(ac);
return NOTIFY_OK;
}
static int thinkpad_e530_quirk(const struct dmi_system_id *d) static int thinkpad_e530_quirk(const struct dmi_system_id *d)
{ {
ac_sleep_before_get_state_ms = 1000; ac_sleep_before_get_state_ms = 1000;
...@@ -215,6 +237,8 @@ static int acpi_ac_probe(struct platform_device *pdev) ...@@ -215,6 +237,8 @@ static int acpi_ac_probe(struct platform_device *pdev)
acpi_device_name(adev), acpi_device_bid(adev), acpi_device_name(adev), acpi_device_bid(adev),
ac->state ? "on-line" : "off-line"); ac->state ? "on-line" : "off-line");
ac->battery_nb.notifier_call = acpi_ac_battery_notify;
register_acpi_notifier(&ac->battery_nb);
end: end:
if (result) if (result)
kfree(ac); kfree(ac);
...@@ -261,6 +285,7 @@ static int acpi_ac_remove(struct platform_device *pdev) ...@@ -261,6 +285,7 @@ static int acpi_ac_remove(struct platform_device *pdev)
ac = platform_get_drvdata(pdev); ac = platform_get_drvdata(pdev);
if (ac->charger.dev) if (ac->charger.dev)
power_supply_unregister(&ac->charger); power_supply_unregister(&ac->charger);
unregister_acpi_notifier(&ac->battery_nb);
kfree(ac); kfree(ac);
......
...@@ -39,15 +39,13 @@ ...@@ -39,15 +39,13 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include "battery.h"
#define PREFIX "ACPI: " #define PREFIX "ACPI: "
#define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF
#define ACPI_BATTERY_CLASS "battery"
#define ACPI_BATTERY_DEVICE_NAME "Battery" #define ACPI_BATTERY_DEVICE_NAME "Battery"
#define ACPI_BATTERY_NOTIFY_STATUS 0x80
#define ACPI_BATTERY_NOTIFY_INFO 0x81
#define ACPI_BATTERY_NOTIFY_THRESHOLD 0x82
/* Battery power unit: 0 means mW, 1 means mA */ /* Battery power unit: 0 means mW, 1 means mA */
#define ACPI_BATTERY_POWER_UNIT_MA 1 #define ACPI_BATTERY_POWER_UNIT_MA 1
...@@ -736,6 +734,7 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event) ...@@ -736,6 +734,7 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
acpi_bus_generate_netlink_event(device->pnp.device_class, acpi_bus_generate_netlink_event(device->pnp.device_class,
dev_name(&device->dev), event, dev_name(&device->dev), event,
acpi_battery_present(battery)); acpi_battery_present(battery));
acpi_notifier_call_chain(device, event, acpi_battery_present(battery));
/* acpi_battery_update could remove power_supply object */ /* acpi_battery_update could remove power_supply object */
if (old && battery->bat.dev) if (old && battery->bat.dev)
power_supply_changed(&battery->bat); power_supply_changed(&battery->bat);
......
#ifndef __ACPI_BATTERY_H
#define __ACPI_BATTERY_H
#define ACPI_BATTERY_CLASS "battery"
#define ACPI_BATTERY_NOTIFY_STATUS 0x80
#define ACPI_BATTERY_NOTIFY_INFO 0x81
#define ACPI_BATTERY_NOTIFY_THRESHOLD 0x82
#endif
...@@ -37,12 +37,12 @@ ...@@ -37,12 +37,12 @@
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include "sbshc.h" #include "sbshc.h"
#include "battery.h"
#define PREFIX "ACPI: " #define PREFIX "ACPI: "
#define ACPI_SBS_CLASS "sbs" #define ACPI_SBS_CLASS "sbs"
#define ACPI_AC_CLASS "ac_adapter" #define ACPI_AC_CLASS "ac_adapter"
#define ACPI_BATTERY_CLASS "battery"
#define ACPI_SBS_DEVICE_NAME "Smart Battery System" #define ACPI_SBS_DEVICE_NAME "Smart Battery System"
#define ACPI_SBS_FILE_INFO "info" #define ACPI_SBS_FILE_INFO "info"
#define ACPI_SBS_FILE_STATE "state" #define ACPI_SBS_FILE_STATE "state"
......
...@@ -10,7 +10,6 @@ config DRM_GMA500 ...@@ -10,7 +10,6 @@ config DRM_GMA500
# GMA500 depends on ACPI_VIDEO when ACPI is enabled, just like i915 # GMA500 depends on ACPI_VIDEO when ACPI is enabled, just like i915
select ACPI_VIDEO if ACPI select ACPI_VIDEO if ACPI
select BACKLIGHT_CLASS_DEVICE if ACPI select BACKLIGHT_CLASS_DEVICE if ACPI
select VIDEO_OUTPUT_CONTROL if ACPI
select INPUT if ACPI select INPUT if ACPI
help help
Say yes for an experimental 2D KMS framebuffer driver for the Say yes for an experimental 2D KMS framebuffer driver for the
......
...@@ -14,7 +14,6 @@ config DRM_I915 ...@@ -14,7 +14,6 @@ config DRM_I915
# but for select to work, need to select ACPI_VIDEO's dependencies, ick # but for select to work, need to select ACPI_VIDEO's dependencies, ick
select BACKLIGHT_LCD_SUPPORT if ACPI select BACKLIGHT_LCD_SUPPORT if ACPI
select BACKLIGHT_CLASS_DEVICE if ACPI select BACKLIGHT_CLASS_DEVICE if ACPI
select VIDEO_OUTPUT_CONTROL if ACPI
select INPUT if ACPI select INPUT if ACPI
select ACPI_VIDEO if ACPI select ACPI_VIDEO if ACPI
select ACPI_BUTTON if ACPI select ACPI_BUTTON if ACPI
......
...@@ -11,7 +11,7 @@ config DRM_NOUVEAU ...@@ -11,7 +11,7 @@ config DRM_NOUVEAU
select FB select FB
select FRAMEBUFFER_CONSOLE if !EXPERT select FRAMEBUFFER_CONSOLE if !EXPERT
select FB_BACKLIGHT if DRM_NOUVEAU_BACKLIGHT select FB_BACKLIGHT if DRM_NOUVEAU_BACKLIGHT
select ACPI_VIDEO if ACPI && X86 && BACKLIGHT_CLASS_DEVICE && VIDEO_OUTPUT_CONTROL && INPUT select ACPI_VIDEO if ACPI && X86 && BACKLIGHT_CLASS_DEVICE && INPUT
select X86_PLATFORM_DEVICES if ACPI && X86 select X86_PLATFORM_DEVICES if ACPI && X86
select ACPI_WMI if ACPI && X86 select ACPI_WMI if ACPI && X86
select MXM_WMI if ACPI && X86 select MXM_WMI if ACPI && X86
...@@ -19,7 +19,6 @@ config DRM_NOUVEAU ...@@ -19,7 +19,6 @@ config DRM_NOUVEAU
# Similar to i915, we need to select ACPI_VIDEO and it's dependencies # Similar to i915, we need to select ACPI_VIDEO and it's dependencies
select BACKLIGHT_LCD_SUPPORT if ACPI && X86 select BACKLIGHT_LCD_SUPPORT if ACPI && X86
select BACKLIGHT_CLASS_DEVICE if ACPI && X86 select BACKLIGHT_CLASS_DEVICE if ACPI && X86
select VIDEO_OUTPUT_CONTROL if ACPI && X86
select INPUT if ACPI && X86 select INPUT if ACPI && X86
select THERMAL if ACPI && X86 select THERMAL if ACPI && X86
select ACPI_VIDEO if ACPI && X86 select ACPI_VIDEO if ACPI && X86
......
...@@ -27,8 +27,6 @@ config ACER_WMI ...@@ -27,8 +27,6 @@ config ACER_WMI
depends on ACPI_WMI depends on ACPI_WMI
select INPUT_SPARSEKMAP select INPUT_SPARSEKMAP
# Acer WMI depends on ACPI_VIDEO when ACPI is enabled # Acer WMI depends on ACPI_VIDEO when ACPI is enabled
# but for select to work, need to select ACPI_VIDEO's dependencies, ick
select VIDEO_OUTPUT_CONTROL if ACPI
select ACPI_VIDEO if ACPI select ACPI_VIDEO if ACPI
---help--- ---help---
This is a driver for newer Acer (and Wistron) laptops. It adds This is a driver for newer Acer (and Wistron) laptops. It adds
......
...@@ -66,7 +66,6 @@ ...@@ -66,7 +66,6 @@
#include <linux/backlight.h> #include <linux/backlight.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/kfifo.h> #include <linux/kfifo.h>
#include <linux/video_output.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/slab.h> #include <linux/slab.h>
#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
......
...@@ -27,12 +27,6 @@ config VGASTATE ...@@ -27,12 +27,6 @@ config VGASTATE
tristate tristate
default n default n
config VIDEO_OUTPUT_CONTROL
tristate "Lowlevel video output switch controls"
help
This framework adds support for low-level control of the video
output switch.
config VIDEOMODE_HELPERS config VIDEOMODE_HELPERS
bool bool
......
...@@ -172,8 +172,6 @@ obj-$(CONFIG_FB_SIMPLE) += simplefb.o ...@@ -172,8 +172,6 @@ obj-$(CONFIG_FB_SIMPLE) += simplefb.o
# the test framebuffer is last # the test framebuffer is last
obj-$(CONFIG_FB_VIRTUAL) += vfb.o obj-$(CONFIG_FB_VIRTUAL) += vfb.o
#video output switch sysfs driver
obj-$(CONFIG_VIDEO_OUTPUT_CONTROL) += output.o
obj-$(CONFIG_VIDEOMODE_HELPERS) += display_timing.o videomode.o obj-$(CONFIG_VIDEOMODE_HELPERS) += display_timing.o videomode.o
ifeq ($(CONFIG_OF),y) ifeq ($(CONFIG_OF),y)
obj-$(CONFIG_VIDEOMODE_HELPERS) += of_display_timing.o of_videomode.o obj-$(CONFIG_VIDEOMODE_HELPERS) += of_display_timing.o of_videomode.o
......
/*
* output.c - Display Output Switch driver
*
* Copyright (C) 2006 Luming Yu <luming.yu@intel.com>
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
#include <linux/module.h>
#include <linux/video_output.h>
#include <linux/slab.h>
#include <linux/err.h>
#include <linux/ctype.h>
MODULE_DESCRIPTION("Display Output Switcher Lowlevel Control Abstraction");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Luming Yu <luming.yu@intel.com>");
static ssize_t state_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
ssize_t ret_size = 0;
struct output_device *od = to_output_device(dev);
if (od->props)
ret_size = sprintf(buf,"%.8x\n",od->props->get_status(od));
return ret_size;
}
static ssize_t state_store(struct device *dev, struct device_attribute *attr,
const char *buf,size_t count)
{
char *endp;
struct output_device *od = to_output_device(dev);
int request_state = simple_strtoul(buf,&endp,0);
size_t size = endp - buf;
if (isspace(*endp))
size++;
if (size != count)
return -EINVAL;
if (od->props) {
od->request_state = request_state;
od->props->set_state(od);
}
return count;
}
static DEVICE_ATTR_RW(state);
static void video_output_release(struct device *dev)
{
struct output_device *od = to_output_device(dev);
kfree(od);
}
static struct attribute *video_output_attrs[] = {
&dev_attr_state.attr,
NULL,
};
ATTRIBUTE_GROUPS(video_output);
static struct class video_output_class = {
.name = "video_output",
.dev_release = video_output_release,
.dev_groups = video_output_groups,
};
struct output_device *video_output_register(const char *name,
struct device *dev,
void *devdata,
struct output_properties *op)
{
struct output_device *new_dev;
int ret_code = 0;
new_dev = kzalloc(sizeof(struct output_device),GFP_KERNEL);
if (!new_dev) {
ret_code = -ENOMEM;
goto error_return;
}
new_dev->props = op;
new_dev->dev.class = &video_output_class;
new_dev->dev.parent = dev;
dev_set_name(&new_dev->dev, "%s", name);
dev_set_drvdata(&new_dev->dev, devdata);
ret_code = device_register(&new_dev->dev);
if (ret_code) {
kfree(new_dev);
goto error_return;
}
return new_dev;
error_return:
return ERR_PTR(ret_code);
}
EXPORT_SYMBOL(video_output_register);
void video_output_unregister(struct output_device *dev)
{
if (!dev)
return;
device_unregister(&dev->dev);
}
EXPORT_SYMBOL(video_output_unregister);
static void __exit video_output_class_exit(void)
{
class_unregister(&video_output_class);
}
static int __init video_output_class_init(void)
{
return class_register(&video_output_class);
}
postcore_initcall(video_output_class_init);
module_exit(video_output_class_exit);
/*
*
* Copyright (C) 2006 Luming Yu <luming.yu@intel.com>
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
#ifndef _LINUX_VIDEO_OUTPUT_H
#define _LINUX_VIDEO_OUTPUT_H
#include <linux/device.h>
#include <linux/err.h>
struct output_device;
struct output_properties {
int (*set_state)(struct output_device *);
int (*get_status)(struct output_device *);
};
struct output_device {
int request_state;
struct output_properties *props;
struct device dev;
};
#define to_output_device(obj) container_of(obj, struct output_device, dev)
#if defined(CONFIG_VIDEO_OUTPUT_CONTROL) || defined(CONFIG_VIDEO_OUTPUT_CONTROL_MODULE)
struct output_device *video_output_register(const char *name,
struct device *dev,
void *devdata,
struct output_properties *op);
void video_output_unregister(struct output_device *dev);
#else
static struct output_device *video_output_register(const char *name,
struct device *dev,
void *devdata,
struct output_properties *op)
{
return ERR_PTR(-ENODEV);
}
static void video_output_unregister(struct output_device *dev)
{
return;
}
#endif
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment