From: Len Brown <lenb@kernel.org>
To: Matthew Garrett <mjg59@srcf.ucam.org>
Cc: "Brian S. Julin" <bri@abrij.org>,
linux-acpi@vger.kernel.org,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
greg@kroah.com
Subject: (unknown)
Date: Fri, 09 Jan 2009 17:34:08 -0500 (EST) [thread overview]
Message-ID: <alpine.LFD.2.00.0901091731540.20020@localhost.localdomain> (raw)
In-Reply-To: <alpine.LFD.2.00.0901090112190.4091@localhost.localdomain>
From: Matthew Garrett <mjg59@srcf.ucam.org>
Matthew,
Here is the version in my tree -- refreshed to live in
drivers/platform/x86/.
cheers,
-Len
oqo-wmi provides a WMI-based interface to backlight and rfkill control on
model 2 OQO devices. It was originally written by Brian Julin
(<bri@abrij.org>) - I've ported it to the rfkill layer and tidied it up a
little.
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Signed-off-by: Len Brown <len.brown@intel.com>
---
MAINTAINERS | 5 +
drivers/platform/x86/Kconfig | 13 +
drivers/platform/x86/Makefile | 1 +
drivers/platform/x86/oqo-wmi.c | 941 ++++++++++++++++++++++++++++++++++++++++
4 files changed, 960 insertions(+), 0 deletions(-)
create mode 100644 drivers/platform/x86/oqo-wmi.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 57e0309..fef4adb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3239,6 +3239,11 @@ M: robert.richter@amd.com
L: oprofile-list@lists.sf.net
S: Maintained
+OQO WMI EXTRAS DRIVER
+P: Matthew Garrett
+M: mjg59@srcf.ucam.org
+S: Maintained
+
ORACLE CLUSTER FILESYSTEM 2 (OCFS2)
P: Mark Fasheh
M: mfasheh@suse.com
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index 9e8f948..017fb81 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -132,6 +132,19 @@ config MSI_LAPTOP
If you have an MSI S270 laptop, say Y or M here.
+config OQO_WMI
+ tristate "OQO WMI extras"
+ depends on ACPI_WMI
+ depends on INPUT
+ depends on RFKILL
+ depends on BACKLIGHT_CLASS_DEVICE
+ help
+ Say Y here if you want to support rfkill and backlight control on
+ series 2 OQO handheld devices.
+
+ To compile this driver as a module, choose M here: the module will
+ be called oqo-wmi.
+
config PANASONIC_LAPTOP
tristate "Panasonic Laptop Extras"
depends on INPUT && ACPI
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
index e290651..37ac07f 100644
--- a/drivers/platform/x86/Makefile
+++ b/drivers/platform/x86/Makefile
@@ -13,6 +13,7 @@ obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o
obj-$(CONFIG_SONY_LAPTOP) += sony-laptop.o
obj-$(CONFIG_THINKPAD_ACPI) += thinkpad_acpi.o
obj-$(CONFIG_FUJITSU_LAPTOP) += fujitsu-laptop.o
+obj-$(CONFIG_OQO_WMI) += oqo-wmi.o
obj-$(CONFIG_PANASONIC_LAPTOP) += panasonic-laptop.o
obj-$(CONFIG_INTEL_MENLOW) += intel_menlow.o
obj-$(CONFIG_ACPI_WMI) += wmi.o
diff --git a/drivers/platform/x86/oqo-wmi.c b/drivers/platform/x86/oqo-wmi.c
new file mode 100644
index 0000000..940e605
--- /dev/null
+++ b/drivers/platform/x86/oqo-wmi.c
@@ -0,0 +1,941 @@
+/*
+ * OQO WMI UPMC Extras
+ *
+ * Copyright (C) 2008 Brian S. Julin <bri@abrij.org>
+ *
+ * Based on acer-wmi:
+ * Copyright (C) 2007-2008 Carlos Corbacho <cathectic@gmail.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
+ */
+
+/*
+ * NOTE: You need to turn SMI on in BIOS (if dmidecode works, you already have)
+ * NOTE: acpi-wmi support mandatory
+ * NOTE: backlight and inputdev support a must, ifdefs will come later
+ */
+
+/*
+ *
+ * 0.3: added WLAN enable switch, restore settings on unload,
+ * resume/suspend handling
+ * 0.2: Still not production-ready, but added ambient light sensor,
+ * backlight, and it prints the unit serial number to dmesg (do
+ * not know where to make that available to userspace yet.)
+ * 0.1: This is a first cut. Plan to reboot after playing with this.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/dmi.h>
+#include <linux/backlight.h>
+#include <linux/leds.h>
+#include <linux/platform_device.h>
+#include <linux/acpi.h>
+#include <linux/i8042.h>
+#include <linux/input-polldev.h>
+#include <linux/rfkill.h>
+
+#include <acpi/acpi_drivers.h>
+
+MODULE_AUTHOR("Brian Julin");
+MODULE_DESCRIPTION("OQO UPMC WMI Extras Driver");
+MODULE_LICENSE("GPL");
+
+#define OQO_LOGPREFIX "oqo-wmi: "
+#define OQO_ERR KERN_ERR OQO_LOGPREFIX
+#define OQO_NOTICE KERN_NOTICE OQO_LOGPREFIX
+#define OQO_INFO KERN_INFO OQO_LOGPREFIX
+
+#define OQO_KINE_MAXTRY 3
+
+/* Store defined devices globally since we only have one instance. */
+static struct platform_device *oqo_platform_device;
+static struct backlight_device *oqo_backlight_device;
+static struct rfkill *oqo_rfkill;
+static struct input_dev *oqo_kine;
+static struct input_polled_dev *oqo_kine_polled;
+
+/* Likewise store current and original settings globally. */
+struct oqo_settings {
+ int lid_wakes; /* not sure if ACPI handles/needs help here */
+ int kine_itvl;
+ int bl_bright;
+};
+
+static struct oqo_settings orig, curr;
+
+/* Some of this code is left like in acer-wmi so we can add the older
+ Model 01 and any future models more easily, but we should not expect
+ it to be as complicated as Acer given each model is a leap rather than
+ a subtle variant on the last, so we aren't using "quirks" perse. Not
+ sure if there is any real difference for our purposes between the o2
+ and e2.
+*/
+struct oqo_model {
+ const char *model;
+ u16 model_subs;
+};
+#define MODEL_SUB_OQO_O2_SMB0 3
+
+static struct oqo_model oqo_models[] = {
+ {
+ .model = "Model 2",
+ .model_subs = MODEL_SUB_OQO_O2_SMB0,
+ },
+ {}
+};
+
+static struct oqo_model *model;
+
+static int force;
+module_param(force, bool, 0644);
+MODULE_PARM_DESC(force, "Force WMI detection even if DMI detection failed");
+
+/*
+ * OQO Model 2 SMBUS registers
+ * We are just using WMI to read the Cx700 smbus, to share the
+ * ACPI mutex (what may also eventually work in VMs/win32)
+ * Using i2c-viapro directly could interfere with PM.
+ */
+
+#define OQO_O2_SMB0_WWAN_DSBL_ADDR 0x19
+#define OQO_O2_SMB0_WWAN_DSBL_MASK 0x02
+#define OQO_O2_SMB0_LUMIN_LO 0x20
+#define OQO_O2_SMB0_LUMIN_HI 0x21
+#define OQO_O2_SMB0_BL_LO 0x26
+#define OQO_O2_SMB0_BL_HI 0x27
+#define OQO_O2_SMB0_ACCEL_POLL_ITVL 0x45
+#define OQO_O2_SMB0_ACCEL_XLO 0x50
+#define OQO_O2_SMB0_ACCEL_XHI 0x51
+#define OQO_O2_SMB0_ACCEL_YLO 0x52
+#define OQO_O2_SMB0_ACCEL_YHI 0x53
+#define OQO_O2_SMB0_ACCEL_ZLO 0x54
+#define OQO_O2_SMB0_ACCEL_ZHI 0x55
+/* These may be handled by ACPI not sure yet. */
+#define OQO_O2_SMB0_LID_WAKES_ADDR 0x58
+#define OQO_O2_SMB0_LID_WAKES_MASK 0x08
+
+#define OQO_O2_SMB0_SERIAL_START 0x70
+#define OQO_O2_SMB0_SERIAL_LEN 11
+
+static char oqo_sn[OQO_O2_SMB0_SERIAL_LEN + 1];
+
+/* Other addresses I have noticed used on the 02 SMBUS (from DSDT and whatnot)
+ *
+ * These are not used because the linux ACPI drivers work fine on them
+ *
+ * 0x0A -- processor sleep mode?
+ * 0x0C -- ACPI events, probably clears when read.
+ * 0x30 -- thermal zone
+ * There is something going on at 0x31 through 0x34 which is likely
+ * also thermal. The values change over time. Have not figured that
+ * out yet.
+ * 0x41 -- AC detect
+ * 0x42 -- LID button ACTUALLY THIS DOES NOT WORK AND NEEDS TO BE FIXED
+ * 0xa0 and 0xa1 -- battery something (presence? state?)
+ * 0xa4 to 0xcf -- battery info (0xc8-0xca contains "OQO")
+ * 0xd4 to 0xef -- other battery stats
+ */
+
+/*
+ * OQO method GUIDs
+ */
+#define OQO_O2_AMW0_GUID "ABBC0F6D-8EA1-11D1-00A0-C90629100000"
+MODULE_ALIAS("wmi:ABBC0F6D-8EA1-11D1-00A0-C90629100000");
+
+/*
+ * Interface type flags
+ */
+enum interface_type {
+ OQO_O2_AMW0,
+};
+
+/* Each low-level interface must define at least some of the following */
+struct wmi_interface {
+ /* The WMI device type */
+ u32 type;
+};
+
+static struct wmi_interface AMW0_interface = {
+ .type = OQO_O2_AMW0,
+};
+
+/* The detected/chosen interface */
+static struct wmi_interface *interface;
+
+static int dmi_matched(const struct dmi_system_id *dmi)
+{
+ model = dmi->driver_data;
+ /*
+ * Detect which ACPI-WMI interface we're using.
+ */
+ if (wmi_has_guid(OQO_O2_AMW0_GUID))
+ interface = &AMW0_interface;
+
+ return 0;
+}
+
+static struct dmi_system_id oqo_dmis[] = {
+ {
+ .callback = dmi_matched,
+ .ident = "OQO 02",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "OQO Inc."),
+ DMI_MATCH(DMI_PRODUCT_NAME, "OQO Model 2"),
+ },
+ .driver_data = oqo_models + 0,
+ },
+ {}
+};
+
+/*
+ * AMW0 (V1) interface on OQO Model 2
+ *
+ * wmba: has four functions selected by int arg 1. arg2 is 3 byte buffer.
+ * 1: performs GETB method on the SMBUS using bytes 0, 1 of Arg2
+ * returns a buffer object containing a single byte
+ * 2: performs SETB on SMBUS using bytes 0, 1, 2 of Arg2
+ * returns 0 as int.
+ * 3: dumps 256 values into a given SMBUS register (not used here)
+ * returns 0 as int.
+ * 4: puts byte 0 of arg2 into some sort of busy flag. Some ACPI
+ * funcs check this (==0) to decide if SMBUS operations are safe.
+ * returns 0 as int.
+ * wmbb: simply returns the busy flag set by wmba #4
+ */
+static acpi_status oqo_smbus_getb(u8 addr, u8 *result)
+{
+ struct acpi_buffer input, res;
+ acpi_status status;
+ union acpi_object *obj;
+ u32 arg2;
+
+ input.length = 4;
+ input.pointer = &arg2;
+ res.length = ACPI_ALLOCATE_BUFFER;
+ res.pointer = NULL;
+
+ arg2 = addr;
+ arg2 <<= 8;
+ arg2 |= 0x12; /* HOSTCMD */
+
+ status = wmi_evaluate_method(OQO_O2_AMW0_GUID, 1, 1, &input, &res);
+
+ if (status != AE_OK)
+ return status;
+
+ obj = (union acpi_object *)res.pointer;
+ if (!obj)
+ return AE_NULL_OBJECT;
+
+ if (obj->type != ACPI_TYPE_BUFFER
+ || obj->buffer.length != 1 || obj->buffer.pointer == NULL) {
+ kfree(obj);
+ return AE_TYPE;
+ }
+ *result = ((u8 *) (obj->buffer.pointer))[0];
+ kfree(obj);
+ return status;
+}
+
+static acpi_status oqo_smbus_setb(u8 addr, u8 val)
+{
+ struct acpi_buffer input, res;
+ acpi_status status;
+ union acpi_object *obj;
+ u32 arg2;
+
+ input.length = 4;
+ input.pointer = &arg2;
+ res.length = ACPI_ALLOCATE_BUFFER;
+ res.pointer = NULL;
+
+ arg2 = val;
+ arg2 <<= 8;
+ arg2 |= addr;
+ arg2 <<= 8;
+ arg2 |= 0x12; /* HOSTCMD */
+
+ status = wmi_evaluate_method(OQO_O2_AMW0_GUID, 1, 2, &input, &res);
+
+ if (status != AE_OK)
+ return status;
+
+ obj = (union acpi_object *)res.pointer;
+ if (!obj)
+ return AE_NULL_OBJECT;
+
+ if (obj->type != ACPI_TYPE_INTEGER) {
+ kfree(obj);
+ return AE_TYPE;
+ }
+ kfree(obj);
+ return status;
+}
+
+/*
+ * We assume we are the only one using this ...ahem... "lock" on
+ * the SMBUS because it would be pathetically noneffective otherwise.
+ *
+ * Nonzero silly_lock will keep certain ACPI routines away from the
+ * SMBUS (if they aren't already on it when you call it.) Zero
+ * silly_lock will let them back on
+ *
+ * This is probably useful before sleeping the system, and one
+ * waits until any ACPI funcs would have long finished before
+ * proceeding. It seems harmless enough and will work to wrap
+ * more accesses with it.
+ */
+static acpi_status oqo_lock_smbus(int silly_lock)
+{
+ struct acpi_buffer input, res;
+ acpi_status status;
+ union acpi_object *obj;
+ u32 arg2;
+
+ input.length = 4;
+ input.pointer = &arg2;
+ res.length = ACPI_ALLOCATE_BUFFER;
+ res.pointer = NULL;
+
+ arg2 = !!silly_lock;
+
+ status = wmi_evaluate_method(OQO_O2_AMW0_GUID, 1, 4, &input, &res);
+
+ if (status != AE_OK)
+ return status;
+
+ obj = (union acpi_object *)res.pointer;
+ if (!obj)
+ return AE_NULL_OBJECT;
+
+ if (obj->type != ACPI_TYPE_INTEGER) {
+ kfree(obj);
+ return AE_TYPE;
+ }
+ kfree(obj);
+ return status;
+}
+
+static int smread_s16(u8 hi_addr, u8 lo_addr)
+{
+ s16 ret = -1;
+ acpi_status status;
+ u8 r;
+
+ /* Keep some ACPI routines off the SMBUS */
+ status = oqo_lock_smbus(1);
+ if (ACPI_FAILURE(status))
+ goto skip;
+
+ status = oqo_smbus_getb(hi_addr, &r);
+ if (ACPI_FAILURE(status))
+ goto skip;
+
+ ret = r;
+ ret <<= 8;
+
+ status = oqo_smbus_getb(lo_addr, &r);
+ if (ACPI_FAILURE(status)) {
+ ret = -1;
+ goto skip;
+ }
+
+ ret |= r;
+ ret &= 0x7fff;
+skip:
+ /* Let ACPI routines back on the SMBUS */
+ status = oqo_lock_smbus(0);
+ if (ACPI_FAILURE(status))
+ return -1;
+ return (int)ret;
+}
+
+static int smwrite_s16(u8 hi_addr, u8 lo_addr, s16 val)
+{
+ acpi_status status;
+ u8 r;
+ int ret = -1;
+
+ status = oqo_lock_smbus(1);
+ if (ACPI_FAILURE(status))
+ goto skip;
+
+ r = (val >> 8) & 0x7f;
+ status = oqo_smbus_setb(hi_addr, r);
+ if (ACPI_FAILURE(status))
+ goto skip;
+
+ r = val & 0xff;
+ status = oqo_smbus_setb(lo_addr, r);
+ if (ACPI_FAILURE(status))
+ goto skip;
+
+ ret = 0;
+skip:
+ status = oqo_lock_smbus(0);
+ if (ACPI_FAILURE(status))
+ return -1;
+ return ret;
+}
+
+static int smread_u8(u8 addr)
+{
+ int ret = -1;
+ acpi_status status;
+ u8 r;
+
+ status = oqo_lock_smbus(1);
+ if (ACPI_FAILURE(status))
+ goto skip;
+
+ status = oqo_smbus_getb(addr, &r);
+ if (ACPI_FAILURE(status))
+ goto skip;
+
+ ret = r;
+skip:
+ status = oqo_lock_smbus(0);
+ if (ACPI_FAILURE(status))
+ return -1;
+ return (int)ret;
+}
+
+static int smwrite_u8(u8 addr, u8 val)
+{
+ acpi_status status;
+ int ret = -1;
+
+ status = oqo_lock_smbus(1);
+ if (ACPI_FAILURE(status))
+ goto skip;
+
+ status = oqo_smbus_setb(addr, val);
+ if (ACPI_FAILURE(status))
+ goto skip;
+
+ ret = 0;
+skip:
+ status = oqo_lock_smbus(0);
+ if (ACPI_FAILURE(status))
+ return -1;
+ return ret;
+}
+
+/*
+ * Accelerometer inputdev
+ */
+
+/*
+ * Get a reading of the accelerometer from the firwmware and push
+ * it to an inputdev.
+ *
+ * Also the ambient light detector hitch-hikes on the inputdev, since
+ * it could be useful in some of the same applications for accelerometers.
+ *
+ * Available information and a bit of poking have not found a
+ * way to freeze a snapshot of the accelerometer data, so we have
+ * to do consistency checks to reduce the odds that we mix low
+ * and high bytes from different updates.
+ *
+ * Unfortunately SMBUS access is very slow (11ms) and the firmware API
+ * does not provide 2-byte transfers, so mixed readings happen and
+ * have to be corrected a lot. (Do not know why; it should be a
+ * multi-kHz.. bus and the reads take only a hundred-ish cycles/byte.
+ * It is not the ACPI function -- it is slow on i2c-viapro as well.)
+ *
+ * Since there is such a big time lag between readings, the axis
+ * are decoupled and reported separately on different timelines as
+ * different events rather than as a set.
+ */
+static acpi_status oqo_read_kine(int *good, s16 *x, s16 *y, s16 *z,
+ u16 *lumin)
+{
+ u8 hiregs[4] = { OQO_O2_SMB0_ACCEL_XHI,
+ OQO_O2_SMB0_ACCEL_YHI,
+ OQO_O2_SMB0_ACCEL_ZHI,
+ OQO_O2_SMB0_LUMIN_HI
+ };
+ u8 loregs[4] = { OQO_O2_SMB0_ACCEL_XLO,
+ OQO_O2_SMB0_ACCEL_YLO,
+ OQO_O2_SMB0_ACCEL_ZLO,
+ OQO_O2_SMB0_LUMIN_LO
+ };
+
+ short ax[4] = { ABS_X, ABS_Y, ABS_Z, ABS_MISC };
+ u8 realgood = 0;
+ u16 res[4];
+ acpi_status status;
+ int i;
+
+ *good = 0;
+
+ /* Routine: Starting with the lo byte, read lo/hi bytes
+ alternately until two lo byte readings, match. Then
+ take that reading and combine it with the hi reading
+ sandwiched between. Errors can still happen when
+ jittering at wrap boundaries, but should be rare.
+
+ Don't use this for missile guidance.
+
+ Userspace post-processing error detection encouraged.
+ */
+ for (i = 0; i < 4; i++) {
+ int maxtry;
+ u32 log;
+ u8 r, lo, hi;
+
+ lo = loregs[i];
+ hi = hiregs[i];
+ log = 0;
+
+#define LOGRES(reg) do { \
+ status = oqo_smbus_getb(reg, &r); \
+ log <<= 8; log |= r; log &= 0xffffff; \
+ if (ACPI_FAILURE(status)) \
+ goto leave; \
+ } while (0)
+
+ maxtry = OQO_KINE_MAXTRY + 1;
+ while (maxtry) {
+ LOGRES(lo);
+ if (maxtry <= OQO_KINE_MAXTRY &&
+ (log >> 16) == (log & 0xff)) {
+ *(res + i) = log & 0xffff;
+ break;
+ }
+ LOGRES(hi);
+ maxtry--;
+ }
+
+ if (maxtry == OQO_KINE_MAXTRY)
+ realgood |= 1 << i;
+
+ if (maxtry) {
+ *good |= 1 << i;
+ /* JIC CYA: this bit may be reserved */
+ res[3] &= 0x7fff;
+ input_report_abs(oqo_kine, ax[i], (s16) res[i]);
+ }
+ /* else we had trouble getting the reading to lock
+ and we skip reporting this axis.
+ */
+ }
+
+ *x = (u16) res[0];
+ *y = (u16) res[1];
+ *z = (u16) res[2];
+ *lumin = (u16) res[3];
+ return status;
+leave:
+ return status;
+}
+
+/*
+ * Generic Device (interface-independent)
+ */
+
+static void oqo_kine_poll(struct input_polled_dev *dev)
+{
+ s16 x, y, z;
+ u16 lumin;
+ int good;
+ /* struct timeval tv1, tv2; */
+
+ if (dev != oqo_kine_polled)
+ return;
+ if (orig.kine_itvl < 0)
+ return;
+
+ x = y = z = 0;
+ oqo_read_kine(&good, &x, &y, &z, &lumin);
+}
+
+static int __devinit oqo_kine_init(void)
+{
+ int err;
+
+ oqo_kine = input_allocate_device();
+ if (!oqo_kine)
+ return -ENOMEM;
+
+ oqo_kine->name = "OQO embedded accelerometer";
+ oqo_kine->phys = "platform:oqo-wmi:kine";
+ oqo_kine->id.bustype = 0;
+ oqo_kine->id.vendor = 0;
+ oqo_kine->id.product = 2;
+ oqo_kine->id.version = 0;
+ oqo_kine->evbit[0] = BIT_MASK(EV_ABS);
+ set_bit(ABS_X, oqo_kine->absbit);
+ set_bit(ABS_Y, oqo_kine->absbit);
+ set_bit(ABS_Z, oqo_kine->absbit);
+ set_bit(ABS_MISC, oqo_kine->absbit);
+ oqo_kine->absmin[ABS_X] =
+ oqo_kine->absmin[ABS_Y] =
+ oqo_kine->absmin[ABS_Z] = oqo_kine->absmin[ABS_MISC] = -32768;
+ oqo_kine->absmax[ABS_X] =
+ oqo_kine->absmax[ABS_Y] =
+ oqo_kine->absmax[ABS_Z] = oqo_kine->absmax[ABS_MISC] = 32767;
+
+ memcpy(oqo_kine->dev.bus_id, "kine", 4);
+
+ oqo_kine_polled = input_allocate_polled_device();
+ if (!oqo_kine_polled) {
+ err = -ENOMEM;
+ goto bail0;
+ }
+
+ oqo_kine_polled->poll = oqo_kine_poll;
+ oqo_kine_polled->poll_interval = 250;
+ oqo_kine_polled->input = oqo_kine;
+
+ orig.kine_itvl = -1; /* prevent callback from running */
+ err = input_register_polled_device(oqo_kine_polled);
+ if (err) {
+ printk(OQO_ERR "Failed to register OQO kine input\n");
+ goto bail1;
+ }
+
+ /* This will allow the callback to run now if successful. */
+ orig.kine_itvl = smread_u8(OQO_O2_SMB0_ACCEL_POLL_ITVL);
+ smwrite_u8(OQO_O2_SMB0_ACCEL_POLL_ITVL, 250);
+ curr.kine_itvl = smread_u8(OQO_O2_SMB0_ACCEL_POLL_ITVL);
+ if (orig.kine_itvl < 0 || curr.kine_itvl != 250) {
+ printk(OQO_ERR "Test communication with kine sensor failed\n");
+ err = -ENODEV;
+ goto bail2;
+ }
+
+ printk(OQO_INFO "Created OQO kine input.\n");
+ printk(OQO_INFO "Firmware interval %ims, driver interval %ims\n",
+ curr.kine_itvl, oqo_kine_polled->poll_interval);
+ return 0;
+bail2:
+ input_unregister_polled_device(oqo_kine_polled);
+bail1:
+ input_free_polled_device(oqo_kine_polled); /* frees oqo_kine */
+ return err;
+bail0:
+ input_free_device(oqo_kine);
+ return err;
+}
+
+static void __devexit oqo_kine_fini(void)
+{
+ smwrite_u8(OQO_O2_SMB0_ACCEL_POLL_ITVL, orig.kine_itvl);
+ input_unregister_polled_device(oqo_kine_polled);
+ input_free_polled_device(oqo_kine_polled);
+}
+
+/*
+ * Backlight device
+ */
+static int read_brightness(struct backlight_device *bd)
+{
+ return (int)smread_s16(OQO_O2_SMB0_BL_HI, OQO_O2_SMB0_BL_LO);
+}
+
+static int update_bl_status(struct backlight_device *bd)
+{
+ return smwrite_s16(OQO_O2_SMB0_BL_HI,
+ OQO_O2_SMB0_BL_LO, (s16) bd->props.brightness);
+}
+
+static struct backlight_ops oqo_bl_ops = {
+ .get_brightness = read_brightness,
+ .update_status = update_bl_status,
+};
+
+static int __devinit oqo_backlight_init(struct device *dev)
+{
+ struct backlight_device *bd;
+
+ /*
+ * It would be nice if someone would figure out how backlights
+ * like these, which are not driven through the video hardware,
+ * are supposed to find their associated fb and bind to it (and
+ * rebind when fb drivers change.
+ *
+ * Most extras backlights just shove a junk name in like we do here,
+ * and don't end up integrated with fbcon sysfs as a result.
+ */
+ bd = backlight_device_register("oqo-bl", dev, NULL, &oqo_bl_ops);
+
+ if (IS_ERR(bd)) {
+ printk(OQO_ERR "Could not register OQO backlight device\n");
+ oqo_backlight_device = NULL;
+ return PTR_ERR(bd);
+ }
+
+ oqo_backlight_device = bd;
+ bd->props.max_brightness = 0x7fff;
+ curr.bl_bright = orig.bl_bright = bd->props.brightness =
+ read_brightness(NULL);
+
+ if (bd->props.brightness < 0)
+ goto fail;
+
+ backlight_update_status(bd);
+ printk(OQO_INFO "Found backlight set at %i\n", bd->props.brightness);
+ return 0;
+
+fail:
+ backlight_device_unregister(oqo_backlight_device);
+ oqo_backlight_device = NULL;
+ return -ENODEV;
+}
+
+static void __devexit oqo_backlight_fini(void)
+{
+ if (!oqo_backlight_device)
+ return;
+ oqo_backlight_device->props.brightness = orig.bl_bright;
+ backlight_update_status(oqo_backlight_device);
+ backlight_device_unregister(oqo_backlight_device);
+}
+
+/*
+ * RFKill device
+ */
+
+static int oqo_rfkill_get(void *data, enum rfkill_state *state)
+{
+ int res;
+
+ res = smread_u8(OQO_O2_SMB0_WWAN_DSBL_ADDR);
+ if (res < 0)
+ return res;
+
+ res &= OQO_O2_SMB0_WWAN_DSBL_MASK;
+
+ if (res)
+ *state = RFKILL_STATE_SOFT_BLOCKED;
+ else
+ *state = RFKILL_STATE_UNBLOCKED;
+
+ return 0;
+}
+
+static int oqo_rfkill_toggle(void *data, enum rfkill_state state)
+{
+ int res;
+
+ res = smread_u8(OQO_O2_SMB0_WWAN_DSBL_ADDR);
+
+ if (state == RFKILL_STATE_UNBLOCKED)
+ res &= ~OQO_O2_SMB0_WWAN_DSBL_MASK;
+ else
+ res |= OQO_O2_SMB0_WWAN_DSBL_MASK;
+
+ return smwrite_u8(OQO_O2_SMB0_WWAN_DSBL_ADDR, res);
+}
+
+static int __devinit oqo_rfkill_init(struct device *dev)
+{
+ int res;
+
+ oqo_rfkill = rfkill_allocate(dev, RFKILL_TYPE_WWAN);
+ if (!oqo_rfkill)
+ return -ENODEV;
+
+ res = smread_u8(OQO_O2_SMB0_WWAN_DSBL_ADDR);
+ res &= OQO_O2_SMB0_WWAN_DSBL_MASK;
+
+ oqo_rfkill->name = "oqo-wwan";
+ if (res)
+ oqo_rfkill->state = RFKILL_STATE_SOFT_BLOCKED;
+ else
+ oqo_rfkill->state = RFKILL_STATE_UNBLOCKED;
+
+ oqo_rfkill->get_state = oqo_rfkill_get;
+ oqo_rfkill->toggle_radio = oqo_rfkill_toggle;
+ oqo_rfkill->user_claim_unsupported = 1;
+
+ res = rfkill_register(oqo_rfkill);
+
+ if (res)
+ rfkill_free(oqo_rfkill);
+
+ return res;
+}
+
+static void __devexit oqo_rfkill_fini(void)
+{
+ if (!oqo_rfkill)
+ return;
+ rfkill_unregister(oqo_rfkill);
+}
+
+/*
+ * Platform device
+ */
+
+static int __devinit oqo_platform_probe(struct platform_device *device)
+{
+ int err;
+ int i;
+ char *troubleok = "trouble, but continuing.\n";
+
+ memset(oqo_sn, 0, OQO_O2_SMB0_SERIAL_LEN + 1);
+ for (i = 0; i < OQO_O2_SMB0_SERIAL_LEN; i++) {
+ err = oqo_smbus_getb(OQO_O2_SMB0_SERIAL_START + i, oqo_sn + i);
+ if (err) {
+ printk(OQO_ERR "Serial number check failed.\n");
+ return err;
+ }
+ }
+ printk(OQO_INFO "Found OQO with serial number %s.\n", oqo_sn);
+
+ err = oqo_backlight_init(&device->dev);
+ if (err)
+ printk(OQO_ERR "Backlight init %s", troubleok);
+
+ err = oqo_rfkill_init(&device->dev);
+ if (err)
+ printk(OQO_ERR "RFKill init %s", troubleok);
+
+ /* LID does not work at all yet, and this may be taken
+ care of by ACPI.
+ */
+ orig.lid_wakes = smread_u8(OQO_O2_SMB0_LID_WAKES_ADDR);
+ orig.lid_wakes &= OQO_O2_SMB0_LID_WAKES_MASK;
+ orig.lid_wakes = curr.lid_wakes = !!orig.lid_wakes;
+ if (orig.lid_wakes < 0) {
+ printk(OQO_ERR "Wake on LID event %s", troubleok);
+ } else {
+ printk(OQO_INFO "Wake on LID is %s.\n",
+ (orig.lid_wakes ? "on" : "off"));
+ }
+
+ err = oqo_kine_init();
+ return err;
+}
+
+static int oqo_platform_remove(struct platform_device *device)
+{
+ oqo_backlight_fini();
+ oqo_rfkill_fini();
+ oqo_kine_fini();
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+
+static int oqo_platform_suspend(struct platform_device *dev, pm_message_t state)
+{
+ if (!interface)
+ return -ENOMEM;
+
+ /* This sticks during boot so do not turn it entirely off */
+ if (oqo_backlight_device) {
+ curr.bl_bright = read_brightness(oqo_backlight_device);
+ smwrite_s16(OQO_O2_SMB0_BL_HI, OQO_O2_SMB0_BL_LO, 256);
+ }
+ return 0;
+}
+
+static int oqo_platform_resume(struct platform_device *device)
+{
+ if (!interface)
+ return -ENOMEM;
+
+ if (oqo_backlight_device) {
+ smwrite_s16(OQO_O2_SMB0_BL_HI,
+ OQO_O2_SMB0_BL_LO, curr.bl_bright);
+ }
+
+ return 0;
+}
+
+#else
+#define oqo_platform_suspend NULL
+#define oqo_platform_resume NULL
+#endif
+
+static struct platform_driver oqo_platform_driver = {
+ .driver = {
+ .name = "oqo-wmi",
+ .owner = THIS_MODULE,
+ },
+ .probe = oqo_platform_probe,
+ .remove = oqo_platform_remove,
+ .suspend = oqo_platform_suspend,
+ .resume = oqo_platform_resume,
+};
+
+static int __init oqo_wmi_init(void)
+{
+ int err;
+
+ dmi_check_system(oqo_dmis);
+
+ if (!interface && force) {
+ model = oqo_models;
+ if (wmi_has_guid(OQO_O2_AMW0_GUID))
+ interface = &AMW0_interface;
+ }
+
+ if (!interface) {
+ printk(OQO_ERR "No or unsupported WMI interface. Aborting.\n");
+ printk(OQO_ERR "Hint: Get dmidecode working and try again.\n");
+ printk(OQO_ERR "(Check \"System Management BIOS\" in BIOS)\n");
+ if (!force)
+ printk(OQO_ERR "Use the force option to skip DMI"
+ " checking\n");
+ return -ENODEV;
+ }
+
+ err = platform_driver_register(&oqo_platform_driver);
+ if (err) {
+ printk(OQO_ERR "platform_driver_register gave %d.\n", err);
+ goto bail0;
+ }
+
+ oqo_platform_device = platform_device_alloc("oqo-wmi", -1);
+ if (!oqo_platform_device) {
+ printk(OQO_ERR "Could not allocate platform device.\n");
+ err = -ENOMEM;
+ goto bail1;
+ }
+
+ err = platform_device_add(oqo_platform_device);
+ if (err) {
+ printk(OQO_ERR "platform_device_add gave %d.\n", err);
+ platform_device_put(oqo_platform_device);
+ goto bail1;
+ }
+
+ return 0;
+
+bail1:
+ platform_driver_unregister(&oqo_platform_driver);
+bail0:
+ return err;
+}
+
+static void __exit oqo_wmi_fini(void)
+{
+ platform_device_del(oqo_platform_device);
+ platform_driver_unregister(&oqo_platform_driver);
+
+ return;
+}
+
+module_init(oqo_wmi_init);
+module_exit(oqo_wmi_fini);
--
1.6.1.76.gc123b
next prev parent reply other threads:[~2009-01-09 22:34 UTC|newest]
Thread overview: 136+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-27 19:05 [PATCH] misc: Add oqo-wmi driver for model 2 OQO backlight and rfkill control Matthew Garrett
2008-11-28 19:31 ` Len Brown
2008-11-29 3:35 ` Brian S. Julin
2008-11-29 4:50 ` Matthew Garrett
2008-12-03 19:55 ` Matthew Garrett
2008-12-03 22:55 ` Sven Wegener
2008-12-03 23:00 ` Andrew Morton
2008-12-04 1:28 ` Brian S. Julin
2009-01-09 6:13 ` Len Brown
2009-01-09 12:35 ` Matthew Garrett
2009-01-09 20:09 ` Len Brown
2009-01-09 22:34 ` Len Brown [this message]
-- strict thread matches above, loose matches on Subject: below --
2019-04-05 2:38 (unknown) Changbin Du
2018-02-12 1:39 (unknown), Alfred Cheuk Chow
2017-11-12 15:09 (unknown), Friedrich Mayrhofer
2017-10-17 7:00 (unknown), lswedroe
2017-10-15 22:07 (unknown), info
2017-10-11 19:29 (unknown), info
2017-10-09 6:17 (unknown), durrant
2017-10-06 11:55 (unknown), info
2017-10-02 20:31 (unknown), kchristopher
2017-09-29 21:29 (unknown), info
2017-09-07 7:05 (unknown), tabiadhawatef
2017-09-05 14:02 (unknown), ecaterinasuciu09
2017-08-14 16:53 (unknown), durrant
2017-08-12 1:11 (unknown), lizdebeth_
2017-08-11 9:18 (unknown), jonathan.malihan
2017-08-11 4:42 (unknown), lizdebeth_
2017-08-09 0:04 (unknown), h.piontek
2017-08-06 23:55 (unknown), webmaster
2017-08-04 5:04 (unknown), durrant
2017-08-02 1:05 (unknown), lizdebeth_
2017-08-01 4:40 (unknown), durrant
2017-07-31 11:49 (unknown), kchristopher
2017-07-18 20:28 (unknown), lizdebeth_
2017-07-17 23:02 (unknown), h.piontek
2017-07-03 1:28 (unknown), h.piontek
2017-07-02 20:26 (unknown), tabiadhawatef
2017-06-29 10:39 (unknown), lizdebeth_
2017-06-22 2:13 (unknown), ecaterinasuciu09
2017-06-20 0:47 (unknown), durrant
2017-06-15 8:37 (unknown), ecaterinasuciu09
2017-06-14 1:06 (unknown), durrant
2017-06-13 9:59 (unknown), lizdebeth_
2017-06-12 7:28 (unknown), webmaster
2017-06-10 14:34 (unknown), kbennett
2017-06-09 1:31 (unknown), durrant
2017-06-01 2:25 (unknown), kbennett
2017-05-20 8:14 (unknown), ecaterinasuciu09
2017-04-21 17:44 (unknown), Mr.Jerry Smith
2017-04-18 2:53 (unknown), h.piontek
2017-04-16 8:52 (unknown), geir.nuland
[not found] <1771828252.1867143.1486725329404.ref@mail.yahoo.com>
[not found] ` <1771828252.1867143.1486725329404@mail.yahoo.com>
[not found] ` <362116259.1841028.1486725756488@mail.yahoo.com>
[not found] ` <1418971482.1876011.1486725827782@mail.yahoo.com>
[not found] ` <781770619.1914371.1486725880495@mail.yahoo.com>
[not found] ` <1842722123.458239.1486738412986@mail.yahoo.com>
[not found] ` <1988971450.1919957.1486738465269@mail.yahoo.com>
[not found] ` <2009483472.1959807.1486738532101@mail.yahoo.com>
[not found] ` <700044894.458801.1486738592344@mail.yahoo.com>
[not found] ` <1679468659.1943183.1486738646052@mail.yahoo.com>
[not found] ` <162360655.2032263.1486743641678@mail.yahoo.com>
[not found] ` <1111317252.1888703.1486743688716@mail.yahoo.com>
[not found] ` <845911663.2021263.1486743732973@mail.yahoo.com>
[not found] ` <2098808266.2026487.1486743776423@mail.yahoo.com>
[not found] ` <568782206.2040087.1486743821882@mail.yahoo.com>
[not found] ` <19843461.2458888.1486807264129@mail.yahoo .com>
[not found] ` <641276465.2418779.1486807323305@mail.yahoo.com>
[not found] ` <390323133.2325381.1486807369870@mail.yahoo.com>
[not found] ` <1403941115.2453941.1486807413560@mail.yahoo.com>
[not found] ` <1277591292.2446250.1486807455917@mail.yahoo.com>
[not found] ` <1213689794.2466613.1486815359337@mail.yahoo.com>
[not found] ` <329782595.2476773.1486815413044@mail.yahoo.com>
[not found] ` <1973633957.2390033.1486815459726@mail.yahoo.com>
[not found] ` <1477693835.2468079.1486815506109@mail.yahoo.com>
[not found] ` <1808615318.2452083.1486815556720@mail.yahoo.com>
[not found] ` <603828148.2508650.1486823074184@mail.yahoo.com>
[not found] ` <1787007361.2513644.1486823124149@mail.yahoo.com>
[not found] ` <845262684.2377129.1486823170993@mail.yahoo.com>
[not found] ` <419777068.2512512.1486823225012@mail.yahoo.com>
[not found] ` <232385099.2515850.1486830177167@mail.yahoo.com>
[not found] ` <218971376.2576178.1486830217194@mail.yahoo.com>
[not found] ` <2021140041.2546157.1486830247344@mail.yahoo.com>
[not found] ` <448230626.2487309.1486830282386@mail.yahoo.com>
[not found] ` <2079672177.2544802.1486830312151@mail.yahoo.com>
[not found] ` <1630849281.2540966.1486902595035@mail.yahoo.com>
[not found] ` <1763670160.2830682.1486902646696@mail.yahoo.com>
[not found] ` <964451657.2841851.1486902695591@mail.yahoo.com>
[not found] ` <516693761.2834417.1486902743162@mail.yahoo.com>
[not found] ` <461796533.2811268.1486902801495@mail.yahoo.com>
[not found] ` <713444900.2811703.1486907914861@mail.yahoo.com>
[not found] ` <302588613.2808166.1486907951385@mail.yahoo.com>
[not found] ` <1622557777.1213917.1486907992370@mail.yahoo.com>
[not found] ` <2064564951.2810235.1486908043751@mail.yahoo.com>
[not found] ` <442326396.3090755.1486973430527@mail.yahoo.com>
[not found] ` <518762456.3172842.1486973474413@mail.yahoo.com>
[not found] ` <522771675.3250061.1486973515470@mail.yahoo.com>
[not found] ` <1528572129.3231295.1486973562972@mail.yahoo.com>
[not found] ` <1997972092.3216726.1486973619057@mail.yahoo.com>
[not found] ` <172315 5515.3200469.1486978792361@mail.yahoo.com>
[not found] ` <1535140240.3250394.1486978848738@mail.yahoo.com>
[not found] ` <1684778328.3209409.1486978901145@mail.yahoo.com>
[not found] ` <1677088215.3214109.1486978951402@mail.yahoo.com>
[not found] ` <864043271.2969648.1486979004523@mail.yahoo.com>
[not found] ` <1363436970.3248457.1486985168733@mail.yahoo.com>
[not found] ` <988334087.3285220.1486985218306@mail.yahoo.com>
[not found] ` <1927028744.3292897.1486985258054@mail.yahoo.com>
[not found] ` <841727306.3314561.1486985306658@mail.yahoo.com>
[not found] ` <1530267099.3983583.1487060768443@mail.yahoo.com>
[not found] ` <739265803.3926080.1487060816047@mail.yahoo.com>
[not found] ` <1513400527.3968180.1487060856715@mail.yahoo.com>
[not found] ` <531389155.4002715.1487060905075@mail.yahoo.com>
[not found] ` <895049946.4061735.1487060954342@mail.yahoo.com>
[not found] ` <1784122856.4044434.1487065908235@mail.yahoo.com>
[not found] ` <1407078631.4020482.1487065957415@mail.yahoo.com>
[not found] ` <1839327034 .4067597.1487065997225@mail.yahoo.com>
[not found] ` <810244449.4029107.1487066033810@mail.yahoo.com>
[not found] ` <1095781515.608534.1487066088438@mail.yahoo.com>
[not found] ` <106819403.4076657.1487073151896@mail.yahoo.com>
[not found] ` <389117608.4110828.1487073193205@mail.yahoo.com>
[not found] ` <386158465.4086294.1487073241229@mail.yahoo.com>
[not found] ` <955001158.3929300.1487073321885@mail.yahoo.com>
[not found] ` <701155907.390358.1487239942052@mail.yahoo.com>
[not found] ` <83923247.405083.1487239972689@mail.yahoo.com>
[not found] ` <1733323291.394405.1487240008443@mail.yahoo.com>
[not found] ` <1295161698.440984.1487248883658@mail.yahoo.com>
[not found] ` <1210050213.428345.1487248904890@mail.yahoo.com>
[not found] ` <631568915.469124.1487248931915@mail.yahoo.com>
[not found] ` <287722.487339.1487248955653@mail.yahoo.com>
[not found] ` <1417564216.1088735.1487316834261@mail.yahoo.com>
[not found] ` <713636483.1053558.1487316903911@mail.yahoo.com>
[not found] ` <763613544.2280970.1487739924449@mail.yahoo.com>
2017-02-22 5:06 ` (unknown) DR ANDASON PHILLIP
2017-01-11 12:54 (unknown), info
2017-01-11 2:43 (unknown), info
2016-12-14 9:45 (unknown), Mr Friedrich Mayrhofer
2016-12-03 17:18 (unknown), lswedroe
2016-11-29 5:51 (unknown), h.piontek
2016-05-16 15:47 (unknown), kchristopher
[not found] <1230452577.2656353.1452358502257.JavaMail.yahoo.ref@mail.yahoo.com>
[not found] ` <1230452577.2656353.1452358502257.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1716277561.2658732.1452358529527.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1968105255.2669152.1452358552424.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1793717263.2678134.1452358585833.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <104083555.2657451.1452358609611.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1076601057.3198277.1452516604891.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <41508990.3349881.1452516637416.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <819791717.3309213.1452516666178.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1859844893.3359033.1452516703329.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1209900645.3363940.1452516734366.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <722407557.4055610.1452598179301.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <15338576 12.3999360.1452598216321.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1217152484.4000448.1452598253742.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1959197406.3852824.1452598286434.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1013645440.3980510.1452598322091.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <95607198.4055649.1452605534361.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1194909989.4116724.1452605572069.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1872344360.3900958.1452605601355.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1767520438.4020646.1452605627006.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1255893341.4037472.1452605666412.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1820757037.4080667.1452611491583.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <814472098.3998614.1452611520894.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <23225522.4108865.1452611548069.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <236986486.3890202.1452611577845 .JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1340761007.4094730.1452611613509.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <439573249.4578557.1452672949962.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <293944960.4600324.1452672974687.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <897301602.4582950.1452672999040.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <363180375.4633257.1452673107225.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <350602177.974245.1452673141911.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <2022702308.4673139.1452680322610.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1610020632.4629393.1452680350391.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <333140794.4700519.1452680379371.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <902983052.4645436.1452680417052.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <125862452.4636825.1452680441734.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1094615852.4555477.1452693216093.JavaMail.yahoo@mail.yahoo. com>
[not found] ` <1867966714.4704436.1452693251194.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1255931484.4715204.1452693303099.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <676467399.4479337.1452693338710.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1072618565.4705486.1452693387868.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <349706432.5276940.1452761261680.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1552663378.5301783.1452761333744.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <630829133.5235320.1452761390703.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <907595456.4817500.1452761429539.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <479694266.4655689.1452761465958.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <370060311.5056220.1452767015476.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <264912373.5348086.1452767045383.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1437672429.5335947.1452767075562.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <519394679.5322836.1 452767124717.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <936190297.5397294.1452767167196.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1476994894.5354271.1452774514304.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <541683891.5389976.1452774549771.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1394137301.5340313.1452774577917.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <390399949.605337.1452774618458.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1993563799.5413836.1452774647836.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1588997907.5378977.1452782998199.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1636012964.5460028.1452783074623.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <115120680.5365813.1452783117293.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1623632786.5437831.1452783145983.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <301407935.5573640.1452853835667.JavaMail.yahoo@mail.yahoo.com>
[not found] ` <1222680849.4926598.1455622523774.JavaMail.yahoo@mail.yahoo.com>
2016-02-16 11:36 ` (unknown) WESTERN UNION MONEY TRANSFER
2015-09-27 10:22 (unknown), Alan Beamer
2015-09-23 17:16 (unknown), funds1222222
2015-09-07 19:34 (unknown), Mary Williams
2015-08-20 7:12 (unknown), Mark Singer
2015-07-01 11:53 (unknown), Sasnett_Karen
2015-04-14 2:06 (unknown) Joan
2015-03-12 11:49 (unknown), pepa6.es
2015-03-09 4:09 (unknown), Mrs. Olga
2014-11-20 2:49 (unknown), James Rodriguez
[not found] <1570038211.167595.1414613146892.JavaMail.yahoo@jws10056.mail.ne1.yahoo.com>
[not found] ` <1835234304.171617.1414613165674.JavaMail.yahoo@jws10089.mail.ne1.yahoo.com>
[not found] ` <1938862685.172387.1414613200459.JavaMail.yahoo@jws100180.mail.ne1.yahoo.com>
[not found] ` <705402329.170339.1414613213653.JavaMail.yahoo@jws10087.mail.ne1.yahoo.com>
[not found] ` <760168749.169371.1414613227586.JavaMail.yahoo@jws10082.mail.ne1.yahoo.com>
[not found] ` <1233923671.167957.1414613439879.JavaMail.yahoo@jws10091.mail.ne1.yahoo.com>
[not found] ` <925985882.172122.1414613520734.JavaMail.yahoo@jws100207.mail.ne1.yahoo.com>
[not found] ` <1216694778.172990.1414613570775.JavaMail.yahoo@jws100152.mail.ne1.yahoo.com>
[not found] ` <1213035306.169838.1414613612716.JavaMail.yahoo@jws10097.mail.ne1.yahoo.com>
[not found] ` <2058591563.172973.1414613668636.JavaMail.yahoo@jws10089.mail.ne1.yahoo.com>
[not found] ` <1202030640.175493 .1414613712352.JavaMail.yahoo@jws10036.mail.ne1.yahoo.com>
[not found] ` <1111049042.175610.1414613739099.JavaMail.yahoo@jws100165.mail.ne1.yahoo.com>
[not found] ` <574125160.175950.1414613784216.JavaMail.yahoo@jws100158.mail.ne1.yahoo.com>
[not found] ` <1726966600.175552.1414613846198.JavaMail.yahoo@jws100190.mail.ne1.yahoo.com>
[not found] ` <976499752.219775.1414613888129.JavaMail.yahoo@jws100101.mail.ne1.yahoo.com>
[not found] ` <1400960529.171566.1414613936238.JavaMail.yahoo@jws10059.mail.ne1.yahoo.com>
[not found] ` <1333619289.175040.1414613999304.JavaMail.yahoo@jws100196.mail.ne1.yahoo.com>
[not found] ` <1038759122.176173.1414614054070.JavaMail.yahoo@jws100138.mail.ne1.yahoo.com>
[not found] ` <1109995533.176150.1414614101940.JavaMail.yahoo@jws100140.mail.ne1.yahoo.com>
[not found] ` <809474730.174920.1414614143971.JavaMail.yahoo@jws100154.mail.ne1.yahoo.com>
[not found] ` <1234226428.170349.1414614189490.JavaMail .yahoo@jws10056.mail.ne1.yahoo.com>
[not found] ` <1122464611.177103.1414614228916.JavaMail.yahoo@jws100161.mail.ne1.yahoo.com>
[not found] ` <1350859260.174219.1414614279095.JavaMail.yahoo@jws100176.mail.ne1.yahoo.com>
[not found] ` <1730751880.171557.1414614322033.JavaMail.yahoo@jws10060.mail.ne1.yahoo.com>
[not found] ` <642429550.177328.1414614367628.JavaMail.yahoo@jws100165.mail.ne1.yahoo.com>
[not found] ` <1400780243.20511.1414614418178.JavaMail.yahoo@jws100162.mail.ne1.yahoo.com>
[not found] ` <2025652090.173204.1414614462119.JavaMail.yahoo@jws10087.mail.ne1.yahoo.com>
[not found] ` <859211720.180077.1414614521867.JavaMail.yahoo@jws100147.mail.ne1.yahoo.com>
[not found] ` <258705675.173585.1414614563057.JavaMail.yahoo@jws10078.mail.ne1.yahoo.com>
[not found] ` <1773234186.173687.1414614613736.JavaMail.yahoo@jws10078.mail.ne1.yahoo.com>
[not found] ` <1132079010.173033.1414614645153.JavaMail.yahoo@jws10066.mail.ne1.ya hoo.com>
[not found] ` <1972302405.176488.1414614708676.JavaMail.yahoo@jws100166.mail.ne1.yahoo.com>
[not found] ` <1713123000.176308.1414614771694.JavaMail.yahoo@jws10045.mail.ne1.yahoo.com>
[not found] ` <299800233.173413.1414614817575.JavaMail.yahoo@jws10066.mail.ne1.yahoo.com>
[not found] ` <494469968.179875.1414614903152.JavaMail.yahoo@jws100144.mail.ne1.yahoo.com>
[not found] ` <2136945987.171995.1414614942776.JavaMail.yahoo@jws10091.mail.ne1.yahoo.com>
[not found] ` <257674219.177708.1414615022592.JavaMail.yahoo@jws100181.mail.ne1.yahoo.com>
[not found] ` <716927833.181664.1414615075308.JavaMail.yahoo@jws100145.mail.ne1.yahoo.com>
[not found] ` <874940984.178797.1414615132802.JavaMail.yahoo@jws100157.mail.ne1.yahoo.com>
[not found] ` <1283488887.176736.1414615187657.JavaMail.yahoo@jws100183.mail.ne1.yahoo.com>
[not found] ` <777665713.175887.1414615236293.JavaMail.yahoo@jws10083.mail.ne1.yahoo.com>
[not found] ` <585395776.176325.1 414615298260.JavaMail.yahoo@jws10033.mail.ne1.yahoo.com>
[not found] ` <178352191.221832.1414615355071.JavaMail.yahoo@jws100104.mail.ne1.yahoo.com>
[not found] ` <108454213.176606.1414615522058.JavaMail.yahoo@jws10053.mail.ne1.yahoo.com>
[not found] ` <1617229176.177502.1414615563724.JavaMail.yahoo@jws10030.mail.ne1.yahoo.com>
[not found] ` <324334617.178254.1414615625247.JavaMail.yahoo@jws10089.mail.ne1.yahoo.com>
[not found] ` <567135865.82376.1414615664442.JavaMail.yahoo@jws100136.mail.ne1.yahoo.com>
[not found] ` <764758300.179669.1414615711821.JavaMail.yahoo@jws100107.mail.ne1.yahoo.com>
[not found] ` <1072855470.183388.1414615775798.JavaMail.yahoo@jws100147.mail.ne1.yahoo.com>
[not found] ` <2134283632.173314.1414615831322.JavaMail.yahoo@jws10094.mail.ne1.yahoo.com>
[not found] ` <1454491902.178612.1414615875076.JavaMail.yahoo@jws100209.mail.ne1.yahoo.com>
[not found] ` <1480763910.146593.1414958012342.JavaMail.yahoo@jws10033.mail.ne1.yahoo.com>
2014-11-02 19:54 ` (unknown) MRS GRACE MANDA
[not found] <379159348.236010.1414136194059.JavaMail.yahoo@jws100115.mail.ne1.yahoo.com>
[not found] ` <2105581186.226848.1414136236806.JavaMail.yahoo@jws10075.mail.ne1.yahoo.com>
[not found] ` <1051957008.227483.1414136297815.JavaMail.yahoo@jws10029.mail.ne1.yahoo.com>
[not found] ` <1990094002.223892.1414136333799.JavaMail.yahoo@jws10070.mail.ne1.yahoo.com>
[not found] ` <1126356209.227508.1414136378165.JavaMail.yahoo@jws10065.mail.ne1.yahoo.com>
[not found] ` <1809025612.238459.1414136438121.JavaMail.yahoo@jws100132.mail.ne1.yahoo.com>
[not found] ` <182198586.235758.1414136460637.JavaMail.yahoo@jws100111.mail.ne1.yahoo.com>
[not found] ` <909433265.227445.1414136497085.JavaMail.yahoo@jws10076.mail.ne1.yahoo.com>
[not found] ` <2067346387.228592.1414136531032.JavaMail.yahoo@jws10059.mail.ne1.yahoo.com>
[not found] ` <1338634683.232208.1414136563767.JavaMail.yahoo@jws100154.mail.ne1.yahoo.com>
[not found] ` <449338023.228287 .1414136671979.JavaMail.yahoo@jws10041.mail.ne1.yahoo.com>
[not found] ` <873633883.236777.1414136837141.JavaMail.yahoo@jws100144.mail.ne1.yahoo.com>
[not found] ` <1450865537.233065.1414136867203.JavaMail.yahoo@jws100202.mail.ne1.yahoo.com>
[not found] ` <894047528.238337.1414136909054.JavaMail.yahoo@jws100124.mail.ne1.yahoo.com>
[not found] ` <2129271673.233931.1414137070348.JavaMail.yahoo@jws100170.mail.ne1.yahoo.com>
[not found] ` <936824743.234404.1414137120292.JavaMail.yahoo@jws100177.mail.ne1.yahoo.com>
[not found] ` <412094225.227214.1414137242898.JavaMail.yahoo@jws10049.mail.ne1.yahoo.com>
[not found] ` <94250903.229372.1414137339459.JavaMail.yahoo@jws100196.mail.ne1.yahoo.com>
[not found] ` <991907733.235702.1414137504062.JavaMail.yahoo@jws100138.mail.ne1.yahoo.com>
[not found] ` <1552034677.229828.1414137605003.JavaMail.yahoo@jws10051.mail.ne1.yahoo.com>
[not found] ` <362591792.236894.1414137654764.JavaMail.yahoo @jws100107.mail.ne1.yahoo.com>
[not found] ` <1596010505.233988.1414137723340.JavaMail.yahoo@jws100167.mail.ne1.yahoo.com>
[not found] ` <1056969615.239752.1414137798638.JavaMail.yahoo@jws100100.mail.ne1.yahoo.com>
[not found] ` <535130348.238991.1414137929077.JavaMail.yahoo@jws100133.mail.ne1.yahoo.com>
[not found] ` <653289865.229391.1414137978245.JavaMail.yahoo@jws10040.mail.ne1.yahoo.com>
[not found] ` <1959086951.235165.1414138040411.JavaMail.yahoo@jws100184.mail.ne1.yahoo.com>
[not found] ` <731191736.229846.1414138093768.JavaMail.yahoo@jws10055.mail.ne1.yahoo.com>
[not found] ` <434432133.231415.1414138139665.JavaMail.yahoo@jws10091.mail.ne1.yahoo.com>
[not found] ` <2012248480.229472.1414138205807.JavaMail.yahoo@jws10075.mail.ne1.yahoo.com>
[not found] ` <731434736.231447.1414138253699.JavaMail.yahoo@jws10031.mail.ne1.yahoo.com>
[not found] ` <451657850.237728.1414138304825.JavaMail.yahoo@jws100117.mail.ne1.yahoo.com >
[not found] ` <662951596.240326.1414138359171.JavaMail.yahoo@jws100126.mail.ne1.yahoo.com>
[not found] ` <1040659277.229506.1414138423348.JavaMail.yahoo@jws10077.mail.ne1.yahoo.com>
[not found] ` <441533089.228987.1414138547174.JavaMail.yahoo@jws10049.mail.ne1.yahoo.com>
[not found] ` <1974760882.229277.1414138585111.JavaMail.yahoo@jws10033.mail.ne1.yahoo.com>
[not found] ` <276341592.162417.1414157383319.JavaMail.yahoo@jws100181.mail.ne1.yahoo.com>
[not found] ` <2095882099.75102.1414157435417.JavaMail.yahoo@jws100123.mail.ne1.yahoo.com>
[not found] ` <1233471366.270903.1414157467817.JavaMail.yahoo@jws100126.mail.ne1.yahoo.com>
[not found] ` <1439410171.268594.1414157540720.JavaMail.yahoo@jws100169.mail.ne1.yahoo.com>
[not found] ` <1005333160.265385.1414157597386.JavaMail.yahoo@jws100167.mail.ne1.yahoo.com>
[not found] ` <460982177.261014.1414157965646.JavaMail.yahoo@jws10093.mail.ne1.yahoo.com>
[not found] ` <46274119.268852.14141580 93889.JavaMail.yahoo@jws100107.mail.ne1.yahoo.com>
[not found] ` <212519260.375090.1414220897917.JavaMail.yahoo@jws100152.mail.ne1.yahoo.com>
[not found] ` <302834607.370076.1414221156462.JavaMail.yahoo@jws10086.mail.ne1.yahoo.com>
[not found] ` <1335716414.378514.1414221244370.JavaMail.yahoo@jws100141.mail.ne1.yahoo.com>
[not found] ` <1298331734.378549.1414221279424.JavaMail.yahoo@jws100141.mail.ne1.yahoo.com>
[not found] ` <1032654278.369386.1414221328045.JavaMail.yahoo@jws10072.mail.ne1.yahoo.com>
[not found] ` <1656851567.374878.1414221358827.JavaMail.yahoo@jws100203.mail.ne1.yahoo.com>
[not found] ` <1827004888.381323.1414221389496.JavaMail.yahoo@jws100113.mail.ne1.yahoo.com>
[not found] ` <165227956.371393.1414221427540.JavaMail.yahoo@jws10028.mail.ne1.yahoo.com>
[not found] ` <1854435824.367889.1414221461749.JavaMail.yahoo@jws10046.mail.ne1.yahoo.com>
[not found] ` <1029456579.471640.1414325300884.JavaMail.yahoo@jws100103.mail.ne1.yahoo.com>
2014-10-26 12:08 ` (unknown) STANDARD BANK
2014-03-23 13:48 (unknown), Fiser, Sarah A.
2014-02-28 11:55 (unknown), Juanita Brunelle
2013-12-21 16:48 (unknown), Alex Barattini
2013-10-12 20:31 (unknown), Innocent Eleazu
2013-06-26 21:31 (unknown), Yinghai Lu
2013-05-02 8:51 (unknown), ..
2012-10-30 4:02 [PATCH v3 7/8] ACPI, PCI: add hostbridge removal function Bjorn Helgaas
2012-10-30 17:42 ` (unknown), Yinghai Lu
2012-08-03 5:31 (unknown), Lori Holden
2012-07-24 11:46 (unknown), roboth roli company
2012-05-25 13:45 (unknown), robothroli company
2012-05-05 18:59 (unknown), Mrs Sabah Halif
2012-02-15 17:47 (unknown), Ann Adams
2011-11-24 4:12 (unknown) Grenfell
2011-10-18 6:43 (unknown), Benjamin Albert
2011-09-16 4:35 (unknown) Bar Yasser
2011-08-16 14:56 (unknown), Mr.Vincent Cheng
2011-08-04 16:38 (unknown), Mr. Vincent Cheng
2011-07-21 15:52 (unknown), Mr.Vincent Cheng
2011-07-15 17:07 (unknown), Mr. Vincent Cheng Chuen
2011-06-15 17:28 (unknown), web.1
2011-05-03 16:05 (unknown), ken leo
2011-01-28 11:31 (unknown), ECOWAS/UNITED NATIONS
2011-01-19 0:47 (unknown), ECOWAS/UNITED NATIONS
2011-01-17 13:05 (unknown), Shougang Group
2011-01-09 18:06 (unknown), ECOWAS/UNITED NATIONS
2010-12-15 10:18 (unknown), Chen Gong
2010-11-28 12:47 (unknown) Euro Millions
2010-11-16 13:59 (unknown), , Ming-Yang Lee
2010-11-08 12:25 (unknown), MR. MERVYN KING
2010-10-24 18:24 (unknown), CHARITY DONATION & ECOWAS
2010-10-24 18:16 (unknown), CHARITY DONATION & ECOWAS
2010-10-15 9:06 (unknown), WESTERN UNION TRANSFER
2010-09-13 19:47 [PATCH 00/25] treewide-next: Use static const char arrays Joe Perches
2010-09-14 9:14 ` (unknown) David Howells
2010-09-10 13:39 (unknown) patrick.brunet
2010-08-16 22:16 (unknown) Peter Denison
2010-05-29 23:37 (unknown), John Lee
2010-03-25 0:01 (unknown), UBS International Holdings BV
2010-01-09 1:37 (unknown), Mrs Claire Page
2009-12-05 8:09 (unknown), United Nations
2009-09-24 22:19 (unknown), Joshua C.
2009-09-21 14:21 (unknown) Kelly Bowa
2009-07-27 16:23 (unknown) vivianofferplc013
2009-06-24 11:32 (unknown), Mahmood Naderan
2009-06-24 11:31 (unknown), Mahmood Naderan
2009-03-16 5:23 (unknown), Len Brown
2009-01-30 18:07 (unknown), Webmail Help Desk
2009-01-29 17:21 (unknown), prmo
2009-01-29 17:21 (unknown), prmo
2009-01-24 4:27 (unknown), Mrs. Caroline Bryan.
2009-01-06 21:34 (unknown) FTPAdmin Kernel.org
2008-12-28 11:24 (unknown) Toralf Förster
2008-09-24 3:29 (unknown) infobobby13
2008-09-16 14:26 (unknown), OXFAM GB - UK
2008-06-17 20:04 (unknown), tbo
2008-02-10 14:31 (unknown), Mateu Soler
2008-02-06 8:49 (unknown), Jurij
2007-07-26 13:26 (unknown) Frank
2006-12-12 14:42 (unknown), Michael.Eschweiler
2006-07-07 22:51 (unknown) thermal
2006-06-21 15:27 (unknown), Brown, Len
2006-05-19 9:28 (unknown), martin schneebacher
2006-05-06 6:39 (unknown), Protasevich, Natalie
2006-03-27 18:09 (unknown) CustomerDepartament
2006-01-09 8:58 (unknown) martin schneebacher
2006-01-05 8:17 (unknown) Johan Vromans
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.LFD.2.00.0901091731540.20020@localhost.localdomain \
--to=lenb@kernel.org \
--cc=bri@abrij.org \
--cc=greg@kroah.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mjg59@srcf.ucam.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox