[kernel] r18263 - in dists/trunk/linux-2.6/debian: . config/kernelarch-x86 patches/features/x86 patches/series
Ben Hutchings
benh at alioth.debian.org
Sun Nov 13 19:14:24 UTC 2011
Author: benh
Date: Sun Nov 13 19:14:22 2011
New Revision: 18263
Log:
[x86] Add amilo-rfkill driver for some Fujitsu-Siemens Amilo laptops (Closes: #631664)
Added:
dists/trunk/linux-2.6/debian/patches/features/x86/x86-Add-amilo-rfkill-driver-for-some-Fujitsu-Siemens.patch
Modified:
dists/trunk/linux-2.6/debian/changelog
dists/trunk/linux-2.6/debian/config/kernelarch-x86/config
dists/trunk/linux-2.6/debian/patches/series/base
Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog Sun Nov 13 19:00:34 2011 (r18262)
+++ dists/trunk/linux-2.6/debian/changelog Sun Nov 13 19:14:22 2011 (r18263)
@@ -22,6 +22,8 @@
* vmscan: fix shrinker callback bug in fs/super.c
* [ia64] Add accept4() syscall, thanks to Émeric Maschino (Closes: #647825)
* block: Always check length of all iov entries in blk_rq_map_user_iov()
+ * [x86] Add amilo-rfkill driver for some Fujitsu-Siemens Amilo laptops
+ (Closes: #631664)
-- Ben Hutchings <ben at decadent.org.uk> Fri, 04 Nov 2011 15:05:47 +0000
Modified: dists/trunk/linux-2.6/debian/config/kernelarch-x86/config
==============================================================================
--- dists/trunk/linux-2.6/debian/config/kernelarch-x86/config Sun Nov 13 19:00:34 2011 (r18262)
+++ dists/trunk/linux-2.6/debian/config/kernelarch-x86/config Sun Nov 13 19:14:22 2011 (r18263)
@@ -981,6 +981,7 @@
CONFIG_DELL_LAPTOP=m
CONFIG_DELL_WMI=m
CONFIG_DELL_WMI_AIO=m
+CONFIG_AMILO_RFKILL=m
CONFIG_HP_ACCEL=m
CONFIG_SONYPI_COMPAT=y
CONFIG_IDEAPAD_LAPTOP=m
Added: dists/trunk/linux-2.6/debian/patches/features/x86/x86-Add-amilo-rfkill-driver-for-some-Fujitsu-Siemens.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/trunk/linux-2.6/debian/patches/features/x86/x86-Add-amilo-rfkill-driver-for-some-Fujitsu-Siemens.patch Sun Nov 13 19:14:22 2011 (r18263)
@@ -0,0 +1,241 @@
+From: Ben Hutchings <ben at decadent.org.uk>
+Date: Mon, 17 Oct 2011 04:13:27 +0100
+Subject: [PATCH] x86: Add amilo-rfkill driver for some Fujitsu-Siemens Amilo
+ laptops
+
+An rfkill driver based on the fsaa1655g and fsam7440 drivers for
+Fujitsu-Siemens Amilo A1655 and M7440 models found at:
+
+http://sourceforge.net/projects/fsaa1655g/
+http://sourceforge.net/projects/fsam7440/
+
+This adds DMI matching and replaces the procfs files with rfkill
+devices.
+
+Signed-off-by: Ben Hutchings <ben at decadent.org.uk>
+---
+ drivers/platform/x86/Kconfig | 7 ++
+ drivers/platform/x86/Makefile | 1 +
+ drivers/platform/x86/amilo-rfkill.c | 180 +++++++++++++++++++++++++++++++++++
+ 3 files changed, 188 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/platform/x86/amilo-rfkill.c
+
+diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
+index 7f43cf8..cb2c255 100644
+--- a/drivers/platform/x86/Kconfig
++++ b/drivers/platform/x86/Kconfig
+@@ -143,6 +143,13 @@ config FUJITSU_LAPTOP_DEBUG
+
+ If you are not sure, say N here.
+
++config AMILO_RFKILL
++ tristate "Fujitsu-Siemens Amilo rfkill support"
++ depends on RFKILL
++ ---help---
++ This is a driver for enabling wifi on some Fujitsu-Siemens Amilo
++ laptops.
++
+ config TC1100_WMI
+ tristate "HP Compaq TC1100 Tablet WMI Extras (EXPERIMENTAL)"
+ depends on !X86_64
+diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
+index 293a320..3acbaad 100644
+--- a/drivers/platform/x86/Makefile
++++ b/drivers/platform/x86/Makefile
+@@ -17,6 +17,7 @@ obj-$(CONFIG_ACER_WMI) += acer-wmi.o
+ obj-$(CONFIG_ACERHDF) += acerhdf.o
+ obj-$(CONFIG_HP_ACCEL) += hp_accel.o
+ obj-$(CONFIG_HP_WMI) += hp-wmi.o
++obj-$(CONFIG_AMILO_RFKILL) += amilo-rfkill.o
+ obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o
+ obj-$(CONFIG_SONY_LAPTOP) += sony-laptop.o
+ obj-$(CONFIG_IDEAPAD_LAPTOP) += ideapad-laptop.o
+diff --git a/drivers/platform/x86/amilo-rfkill.c b/drivers/platform/x86/amilo-rfkill.c
+new file mode 100644
+index 0000000..028d3ec
+--- /dev/null
++++ b/drivers/platform/x86/amilo-rfkill.c
+@@ -0,0 +1,180 @@
++/*
++ * Support for rfkill on some Fujitsu-Siemens Amilo laptops.
++ * Copyright 2011 Ben Hutchings.
++ *
++ * Based in part on the fsam7440 driver, which is:
++ * Copyright 2005 Alejandro Vidal Mata & Javier Vidal Mata.
++ * and on the fsaa1655g driver, which is:
++ * Copyright 2006 Martin Večeřa.
++ *
++ * 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.
++ */
++
++#include <linux/module.h>
++#include <linux/dmi.h>
++#include <linux/io.h>
++#include <linux/moduleparam.h>
++#include <linux/platform_device.h>
++#include <linux/rfkill.h>
++
++/*
++ * These values were obtained from disassembling and debugging the
++ * PM.exe program installed in the Fujitsu-Siemens AMILO A1655G
++ */
++#define A1655_STATE_PORT 0x64
++#define A1655_COMMAND_PORT 0x64
++#define A1655_DATA_PORT 0x60
++#define A1655_WIFI_COMMAND 0xC5
++#define A1655_WIFI_ON 0x25
++#define A1655_WIFI_OFF 0x45
++
++static int amilo_a1655_rfkill_set_block(void *data, bool blocked)
++{
++ u8 val;
++
++ do
++ val = inb(A1655_STATE_PORT);
++ while ((val & 2) == 2);
++ outb(A1655_WIFI_COMMAND, A1655_COMMAND_PORT);
++ do
++ val = inb(A1655_STATE_PORT);
++ while ((val & 2) == 2);
++ outb(blocked ? A1655_WIFI_OFF : A1655_WIFI_ON, A1655_DATA_PORT);
++
++ return 0;
++}
++
++static const struct rfkill_ops amilo_a1655_rfkill_ops = {
++ .set_block = amilo_a1655_rfkill_set_block
++};
++
++/*
++ * These values were obtained from disassembling the PM.exe program
++ * installed in the Fujitsu-Siemens AMILO M 7440
++ */
++#define M7440_PORT1 0x118f
++#define M7440_PORT2 0x118e
++#define M7440_RADIO_ON1 0x12
++#define M7440_RADIO_ON2 0x80
++#define M7440_RADIO_OFF1 0x10
++#define M7440_RADIO_OFF2 0x00
++
++static int amilo_m7440_rfkill_set_block(void *data, bool blocked)
++{
++ u8 val1 = blocked ? M7440_RADIO_OFF1 : M7440_RADIO_ON1;
++ u8 val2 = blocked ? M7440_RADIO_OFF2 : M7440_RADIO_ON2;
++
++ outb(val1, M7440_PORT1);
++ outb(val2, M7440_PORT2);
++
++ /* Check whether the state has changed correctly */
++ if (inb(M7440_PORT1) != val1 || inb(M7440_PORT2) != val2)
++ return -EIO;
++
++ return 0;
++}
++
++static const struct rfkill_ops amilo_m7440_rfkill_ops = {
++ .set_block = amilo_m7440_rfkill_set_block
++};
++
++static const struct dmi_system_id __devinitdata amilo_rfkill_id_table[] = {
++ {
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
++ DMI_MATCH(DMI_BOARD_NAME, "AMILO A1655"),
++ },
++ .driver_data = (void *)&amilo_a1655_rfkill_ops
++ },
++ {
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
++ DMI_MATCH(DMI_BOARD_NAME, "AMILO M7440"),
++ },
++ .driver_data = (void *)&amilo_m7440_rfkill_ops
++ },
++ {}
++};
++
++static struct platform_device *amilo_rfkill_pdev;
++static struct rfkill *amilo_rfkill_dev;
++
++static int __devinit amilo_rfkill_probe(struct platform_device *device)
++{
++ const struct dmi_system_id *system_id =
++ dmi_first_match(amilo_rfkill_id_table);
++ int rc;
++
++ amilo_rfkill_dev = rfkill_alloc(KBUILD_MODNAME, &device->dev,
++ RFKILL_TYPE_WLAN,
++ system_id->driver_data, NULL);
++ if (!amilo_rfkill_dev)
++ return -ENOMEM;
++
++ rc = rfkill_register(amilo_rfkill_dev);
++ if (rc)
++ goto fail;
++
++ return 0;
++
++fail:
++ rfkill_destroy(amilo_rfkill_dev);
++ return rc;
++}
++
++static int amilo_rfkill_remove(struct platform_device *device)
++{
++ rfkill_unregister(amilo_rfkill_dev);
++ rfkill_destroy(amilo_rfkill_dev);
++ return 0;
++}
++
++static struct platform_driver amilo_rfkill_driver = {
++ .driver = {
++ .name = KBUILD_MODNAME,
++ .owner = THIS_MODULE,
++ },
++ .probe = amilo_rfkill_probe,
++ .remove = amilo_rfkill_remove,
++};
++
++static int __init amilo_rfkill_init(void)
++{
++ int rc;
++
++ if (dmi_first_match(amilo_rfkill_id_table) == NULL)
++ return -ENODEV;
++
++ rc = platform_driver_register(&amilo_rfkill_driver);
++ if (rc)
++ return rc;
++
++ amilo_rfkill_pdev = platform_device_register_simple(KBUILD_MODNAME, -1,
++ NULL, 0);
++ if (IS_ERR(amilo_rfkill_pdev)) {
++ rc = PTR_ERR(amilo_rfkill_pdev);
++ goto fail;
++ }
++
++ return 0;
++
++fail:
++ platform_driver_unregister(&amilo_rfkill_driver);
++ return rc;
++}
++
++static void __exit amilo_rfkill_exit(void)
++{
++ platform_device_unregister(amilo_rfkill_pdev);
++ platform_driver_unregister(&amilo_rfkill_driver);
++}
++
++MODULE_AUTHOR("Ben Hutchings <ben at decadent.org.uk>");
++MODULE_LICENSE("GPL");
++MODULE_DEVICE_TABLE(dmi, amilo_rfkill_id_table);
++
++module_init(amilo_rfkill_init);
++module_exit(amilo_rfkill_exit);
+--
+1.7.7.2
+
Modified: dists/trunk/linux-2.6/debian/patches/series/base
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/base Sun Nov 13 19:00:34 2011 (r18262)
+++ dists/trunk/linux-2.6/debian/patches/series/base Sun Nov 13 19:14:22 2011 (r18263)
@@ -59,3 +59,4 @@
+ bugfix/all/vmscan-fix-shrinker-callback-bug-in-fs-super.c.patch
+ bugfix/ia64/ia64-Add-accept4-syscall.patch
+ bugfix/all/block-Always-check-length-of-all-iov-entries-in-blk_.patch
++ features/x86/x86-Add-amilo-rfkill-driver-for-some-Fujitsu-Siemens.patch
More information about the Kernel-svn-changes
mailing list