2004-10-28 10:04:07

by Stelian Pop

[permalink] [raw]
Subject: [PATCH 0/8] sonypi driver update

Hi,

The following patches update the sonypi driver to the latest version.

The main changes in those patches are:
- migrate to module_param();
- power management: switch to a platform device, drop old PM code;
- add full input support for the special keys;
- whitespace, coding style related changes.

Full changelog below, the patches will be send as followups to this one.

Please apply.

Thanks,

Stelian.


PATCH 1/8: sonypi: module related fixes
* use module_param() instead of MODULE_PARM() and __setup()
* use MODULE_VERSION()

PATCH 2/8: sonypi: replace homebrew queue with kfifo

PATCH 3/8: sonypi: power management related fixes
* switch from a sysdev to a platform device
* drop old style PM code
* use pci_get_device()/pci_dev_put() instead of pci_find_device()

PATCH 4/8: sonypi: rework input support
* feed most of special keys through the input subsystem
* initialize two separate input devices: a mouse like one for
the jogdial and a keyboard like one for the special keys
* add support for SONYPI_EVENT_FNKEY_RELEASED

PATCH 5/8: sonypi: make CONFIG_SONYPI depend on CONFIG_INPUT since the latter is no more
optional.

PATCH 6/8: sonypi: don't suppose the bluetooth subsystem is initialy off,
leave the choice to the user.

PATCH 7/8: sonypi: whitespace and coding style fixes

PATCH 8/8: sonypi: bump up the version number

--
Stelian Pop <[email protected]>


2004-10-28 10:08:14

by Stelian Pop

[permalink] [raw]
Subject: [PATCH 1/8] sonypi: module related fixes

===================================================================

[email protected], 2004-10-27 16:28:44+02:00, [email protected]
sonypi: module related fixes
* use module_param() instead of MODULE_PARM() and __setup()
* use MODULE_VERSION()

Signed-off-by: Stelian Pop <[email protected]>

===================================================================

Documentation/kernel-parameters.txt | 4
Documentation/sonypi.txt | 11 --
drivers/char/sonypi.c | 147 ++++++++++++++++++------------------
drivers/char/sonypi.h | 32 -------
4 files changed, 84 insertions(+), 110 deletions(-)

===================================================================

diff -Nru a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
--- a/Documentation/kernel-parameters.txt 2004-10-28 11:01:10 +02:00
+++ b/Documentation/kernel-parameters.txt 2004-10-28 11:01:10 +02:00
@@ -1217,8 +1217,8 @@
sonycd535= [HW,CD]
Format: <io>[,<irq>]

- sonypi= [HW] Sony Programmable I/O Control Device driver
- Format: <minor>,<verbose>,<fnkeyinit>,<camera>,<compat>,<nojogdial>
+ sonypi.*= [HW] Sony Programmable I/O Control Device driver
+ See Documentation/sonypi.txt

specialix= [HW,SERIAL] Specialix multi-serial port adapter
See Documentation/specialix.txt.
diff -Nru a/Documentation/sonypi.txt b/Documentation/sonypi.txt
--- a/Documentation/sonypi.txt 2004-10-28 11:01:09 +02:00
+++ b/Documentation/sonypi.txt 2004-10-28 11:01:09 +02:00
@@ -42,13 +42,10 @@
Driver options:
---------------

-Several options can be passed to the sonypi driver, either by adding them
-to /etc/modprobe.conf file, when the driver is compiled as a module or by
-adding the following to the kernel command line (in your bootloader):
-
- sonypi=minor[,verbose[,fnkeyinit[,camera[,compat[,mask[,useinput]]]]]]
-
-where:
+Several options can be passed to the sonypi driver using the standard
+module argument syntax (<param>=<value> when passing the option to the
+module or sonypi.<param>=<value> on the kernel boot line when sonypi is
+statically linked into the kernel). Those options are:

minor: minor number of the misc device /dev/sonypi,
default is -1 (automatic allocation, see /proc/misc
diff -Nru a/drivers/char/sonypi.c b/drivers/char/sonypi.c
--- a/drivers/char/sonypi.c 2004-10-28 11:01:10 +02:00
+++ b/drivers/char/sonypi.c 2004-10-28 11:01:10 +02:00
@@ -50,18 +50,80 @@
#include <asm/io.h>
#include <asm/system.h>

-static int verbose; /* = 0 */
-
#include "sonypi.h"
#include <linux/sonypi.h>

-static struct sonypi_device sonypi_device;
+MODULE_AUTHOR("Stelian Pop <[email protected]>");
+MODULE_DESCRIPTION("Sony Programmable I/O Control Device driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(SONYPI_DRIVER_VERSION);
+
static int minor = -1;
-static int fnkeyinit; /* = 0 */
-static int camera; /* = 0 */
-static int compat; /* = 0 */
-static int useinput = 1;
+module_param(minor, int, 0);
+MODULE_PARM_DESC(minor,
+ "minor number of the misc device, default is -1 (automatic)");
+
+static int verbose; /* = 0 */
+module_param(verbose, int, 0644);
+MODULE_PARM_DESC(verbose, "be verbose, default is 0 (no)");
+
+static int fnkeyinit; /* = 0 */
+module_param(fnkeyinit, int, 0444);
+MODULE_PARM_DESC(fnkeyinit,
+ "set this if your Fn keys do not generate any event");
+
+static int camera; /* = 0 */
+module_param(camera, int, 0444);
+MODULE_PARM_DESC(camera,
+ "set this if you have a MotionEye camera (PictureBook series)");
+
+static int compat; /* = 0 */
+module_param(compat, int, 0444);
+MODULE_PARM_DESC(compat,
+ "set this if you want to enable backward compatibility mode");
+
static unsigned long mask = 0xffffffff;
+module_param(mask, ulong, 0644);
+MODULE_PARM_DESC(mask,
+ "set this to the mask of event you want to enable (see doc)");
+
+static int useinput = 1;
+module_param(useinput, int, 0444);
+MODULE_PARM_DESC(useinput,
+ "set this if you would like sonypi to feed events to the input subsystem");
+
+static struct sonypi_device sonypi_device;
+
+static int sonypi_ec_write(u8 addr, u8 value)
+{
+#ifdef CONFIG_ACPI_EC
+ if (SONYPI_ACPI_ACTIVE)
+ return ec_write(addr, value);
+#endif
+ wait_on_command(1, inb_p(SONYPI_CST_IOPORT) & 3, ITERATIONS_LONG);
+ outb_p(0x81, SONYPI_CST_IOPORT);
+ wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2, ITERATIONS_LONG);
+ outb_p(addr, SONYPI_DATA_IOPORT);
+ wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2, ITERATIONS_LONG);
+ outb_p(value, SONYPI_DATA_IOPORT);
+ wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2, ITERATIONS_LONG);
+ return 0;
+}
+
+static int sonypi_ec_read(u8 addr, u8 *value)
+{
+#ifdef CONFIG_ACPI_EC
+ if (SONYPI_ACPI_ACTIVE)
+ return ec_read(addr, value);
+#endif
+ wait_on_command(1, inb_p(SONYPI_CST_IOPORT) & 3, ITERATIONS_LONG);
+ outb_p(0x80, SONYPI_CST_IOPORT);
+ wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2, ITERATIONS_LONG);
+ outb_p(addr, SONYPI_DATA_IOPORT);
+ wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2, ITERATIONS_LONG);
+ *value = inb_p(SONYPI_DATA_IOPORT);
+ return 0;
+}

/* Inits the queue */
static inline void sonypi_initq(void) {
@@ -437,6 +499,8 @@
return ret;
}

+EXPORT_SYMBOL(sonypi_camera_command);
+
static int sonypi_misc_fasync(int fd, struct file *filp, int on) {
int retval;

@@ -780,9 +844,8 @@
if (!SONYPI_ACPI_ACTIVE && fnkeyinit)
outb(0xf0, 0xb2);

- printk(KERN_INFO "sonypi: Sony Programmable I/O Controller Driver v%d.%d.\n",
- SONYPI_DRIVER_MAJORVERSION,
- SONYPI_DRIVER_MINORVERSION);
+ printk(KERN_INFO "sonypi: Sony Programmable I/O Controller Driver v%s.\n",
+ SONYPI_DRIVER_VERSION);
printk(KERN_INFO "sonypi: detected %s model, "
"verbose = %d, fnkeyinit = %s, camera = %s, "
"compat = %s, mask = 0x%08lx, useinput = %s, acpi = %s\n",
@@ -887,7 +950,7 @@
{ }
};

-static int __init sonypi_init_module(void)
+static int __init sonypi_init(void)
{
struct pci_dev *pcidev = NULL;
if (dmi_check_system(sonypi_dmi_table)) {
@@ -900,65 +963,9 @@
return -ENODEV;
}

-static void __exit sonypi_cleanup_module(void) {
+static void __exit sonypi_exit(void) {
sonypi_remove();
}

-#ifndef MODULE
-static int __init sonypi_setup(char *str) {
- int ints[8];
-
- str = get_options(str, ARRAY_SIZE(ints), ints);
- if (ints[0] <= 0)
- goto out;
- minor = ints[1];
- if (ints[0] == 1)
- goto out;
- verbose = ints[2];
- if (ints[0] == 2)
- goto out;
- fnkeyinit = ints[3];
- if (ints[0] == 3)
- goto out;
- camera = ints[4];
- if (ints[0] == 4)
- goto out;
- compat = ints[5];
- if (ints[0] == 5)
- goto out;
- mask = ints[6];
- if (ints[0] == 6)
- goto out;
- useinput = ints[7];
-out:
- return 1;
-}
-
-__setup("sonypi=", sonypi_setup);
-#endif /* !MODULE */
-
-/* Module entry points */
-module_init(sonypi_init_module);
-module_exit(sonypi_cleanup_module);
-
-MODULE_AUTHOR("Stelian Pop <[email protected]>");
-MODULE_DESCRIPTION("Sony Programmable I/O Control Device driver");
-MODULE_LICENSE("GPL");
-
-
-MODULE_PARM(minor,"i");
-MODULE_PARM_DESC(minor, "minor number of the misc device, default is -1 (automatic)");
-MODULE_PARM(verbose,"i");
-MODULE_PARM_DESC(verbose, "be verbose, default is 0 (no)");
-MODULE_PARM(fnkeyinit,"i");
-MODULE_PARM_DESC(fnkeyinit, "set this if your Fn keys do not generate any event");
-MODULE_PARM(camera,"i");
-MODULE_PARM_DESC(camera, "set this if you have a MotionEye camera (PictureBook series)");
-MODULE_PARM(compat,"i");
-MODULE_PARM_DESC(compat, "set this if you want to enable backward compatibility mode");
-MODULE_PARM(mask, "i");
-MODULE_PARM_DESC(mask, "set this to the mask of event you want to enable (see doc)");
-MODULE_PARM(useinput, "i");
-MODULE_PARM_DESC(useinput, "if you have a jogdial, set this if you would like it to use the modern Linux Input Driver system");
-
-EXPORT_SYMBOL(sonypi_camera_command);
+module_init(sonypi_init);
+module_exit(sonypi_exit);
diff -Nru a/drivers/char/sonypi.h b/drivers/char/sonypi.h
--- a/drivers/char/sonypi.h 2004-10-28 11:01:10 +02:00
+++ b/drivers/char/sonypi.h 2004-10-28 11:01:10 +02:00
@@ -36,8 +36,7 @@

#ifdef __KERNEL__

-#define SONYPI_DRIVER_MAJORVERSION 1
-#define SONYPI_DRIVER_MINORVERSION 23
+#define SONYPI_DRIVER_VERSION "1.23"

#define SONYPI_DEVICE_MODEL_TYPE1 1
#define SONYPI_DEVICE_MODEL_TYPE2 2
@@ -400,35 +399,6 @@
#else
#define SONYPI_ACPI_ACTIVE 0
#endif /* CONFIG_ACPI */
-
-static inline int sonypi_ec_write(u8 addr, u8 value) {
-#ifdef CONFIG_ACPI_EC
- if (SONYPI_ACPI_ACTIVE)
- return ec_write(addr, value);
-#endif
- wait_on_command(1, inb_p(SONYPI_CST_IOPORT) & 3, ITERATIONS_LONG);
- outb_p(0x81, SONYPI_CST_IOPORT);
- wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2, ITERATIONS_LONG);
- outb_p(addr, SONYPI_DATA_IOPORT);
- wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2, ITERATIONS_LONG);
- outb_p(value, SONYPI_DATA_IOPORT);
- wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2, ITERATIONS_LONG);
- return 0;
-}
-
-static inline int sonypi_ec_read(u8 addr, u8 *value) {
-#ifdef CONFIG_ACPI_EC
- if (SONYPI_ACPI_ACTIVE)
- return ec_read(addr, value);
-#endif
- wait_on_command(1, inb_p(SONYPI_CST_IOPORT) & 3, ITERATIONS_LONG);
- outb_p(0x80, SONYPI_CST_IOPORT);
- wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2, ITERATIONS_LONG);
- outb_p(addr, SONYPI_DATA_IOPORT);
- wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2, ITERATIONS_LONG);
- *value = inb_p(SONYPI_DATA_IOPORT);
- return 0;
-}

#endif /* __KERNEL__ */

2004-10-28 10:11:45

by Stelian Pop

[permalink] [raw]
Subject: [PATCH 3/8] sonypi: power management related fixes

===================================================================

[email protected], 2004-10-27 17:16:12+02:00, [email protected]
sonypi: power management related fixes
* switch from a sysdev to a platform device
* drop old style PM code
* use pci_get_device()/pci_dev_put() instead of pci_find_device()

Patch originaly from Dmitry Torokhov <[email protected]>.

Signed-off-by: Stelian Pop <[email protected]>

===================================================================

sonypi.c | 216 +++++++++++++++++++++++++++------------------------------------
sonypi.h | 5 -
2 files changed, 95 insertions(+), 126 deletions(-)

===================================================================

diff -Nru a/drivers/char/sonypi.c b/drivers/char/sonypi.c
--- a/drivers/char/sonypi.c 2004-10-28 11:03:43 +02:00
+++ b/drivers/char/sonypi.c 2004-10-28 11:03:43 +02:00
@@ -44,7 +44,7 @@
#include <linux/wait.h>
#include <linux/acpi.h>
#include <linux/dmi.h>
-#include <linux/sysdev.h>
+#include <linux/err.h>

#include <asm/uaccess.h>
#include <asm/io.h>
@@ -608,81 +608,91 @@
-1, "sonypi", &sonypi_misc_fops
};

-#ifdef CONFIG_PM
-static int old_camera_power;
-
-static int sonypi_suspend(struct sys_device *dev, u32 state) {
- sonypi_call2(0x81, 0); /* make sure we don't get any more events */
- if (camera) {
- old_camera_power = sonypi_device.camera_power;
- sonypi_camera_off();
- }
+static void sonypi_enable(unsigned int camera_on)
+{
if (sonypi_device.model == SONYPI_DEVICE_MODEL_TYPE2)
- sonypi_type2_dis();
+ sonypi_type2_srs();
else
- sonypi_type1_dis();
- /* disable ACPI mode */
- if (!SONYPI_ACPI_ACTIVE && fnkeyinit)
- outb(0xf1, 0xb2);
- return 0;
-}
+ sonypi_type1_srs();
+
+ sonypi_call1(0x82);
+ sonypi_call2(0x81, 0xff);
+ sonypi_call1(compat ? 0x92 : 0x82);

-static int sonypi_resume(struct sys_device *dev) {
/* Enable ACPI mode to get Fn key events */
if (!SONYPI_ACPI_ACTIVE && fnkeyinit)
outb(0xf0, 0xb2);
+
+ if (camera && camera_on)
+ sonypi_camera_on();
+}
+
+static int sonypi_disable(void)
+{
+ sonypi_call2(0x81, 0); /* make sure we don't get any more events */
+ if (camera)
+ sonypi_camera_off();
+
+ /* disable ACPI mode */
+ if (!SONYPI_ACPI_ACTIVE && fnkeyinit)
+ outb(0xf1, 0xb2);
+
if (sonypi_device.model == SONYPI_DEVICE_MODEL_TYPE2)
- sonypi_type2_srs();
- else
- sonypi_type1_srs();
- sonypi_call1(0x82);
- sonypi_call2(0x81, 0xff);
- if (compat)
- sonypi_call1(0x92);
+ sonypi_type2_dis();
else
- sonypi_call1(0x82);
- if (camera && old_camera_power)
- sonypi_camera_on();
+ sonypi_type1_dis();
return 0;
}

-/* Old PM scheme */
-static int sonypi_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data) {
+#ifdef CONFIG_PM
+static int old_camera_power;

- switch (rqst) {
- case PM_SUSPEND:
- sonypi_suspend(NULL, 0);
- break;
- case PM_RESUME:
- sonypi_resume(NULL);
- break;
+static int sonypi_suspend(struct device *dev, u32 state, u32 level)
+{
+ if (level == SUSPEND_DISABLE) {
+ old_camera_power = sonypi_device.camera_power;
+ sonypi_disable();
}
return 0;
}

-/* New PM scheme (device model) */
-static struct sysdev_class sonypi_sysclass = {
- set_kset_name("sonypi"),
- .suspend = sonypi_suspend,
- .resume = sonypi_resume,
-};
+static int sonypi_resume(struct device *dev, u32 level)
+{
+ if (level == RESUME_ENABLE)
+ sonypi_enable(old_camera_power);
+ return 0;
+}
+#endif

-static struct sys_device sonypi_sysdev = {
- .id = 0,
- .cls = &sonypi_sysclass,
-};
+static void sonypi_shutdown(struct device *dev)
+{
+ sonypi_disable();
+}
+
+static struct device_driver sonypi_driver = {
+ .name = "sonypi",
+ .bus = &platform_bus_type,
+#ifdef CONFIG_PM
+ .suspend = sonypi_suspend,
+ .resume = sonypi_resume,
#endif
+ .shutdown = sonypi_shutdown,
+};

-static int __devinit sonypi_probe(struct pci_dev *pcidev) {
+static int __devinit sonypi_probe(void)
+{
int i, ret;
struct sonypi_ioport_list *ioport_list;
struct sonypi_irq_list *irq_list;
+ struct pci_dev *pcidev;
+
+ pcidev = pci_get_device(PCI_VENDOR_ID_INTEL,
+ PCI_DEVICE_ID_INTEL_82371AB_3, NULL);

sonypi_device.dev = pcidev;
- if (pcidev)
- sonypi_device.model = SONYPI_DEVICE_MODEL_TYPE1;
- else
- sonypi_device.model = SONYPI_DEVICE_MODEL_TYPE2;
+ sonypi_device.model = pcidev ?
+ SONYPI_DEVICE_MODEL_TYPE1 : SONYPI_DEVICE_MODEL_TYPE2;
+
sonypi_device.fifo_lock = SPIN_LOCK_UNLOCKED;
sonypi_device.fifo = kfifo_alloc(SONYPI_BUF_SIZE, GFP_KERNEL,
&sonypi_device.fifo_lock);
@@ -743,29 +753,9 @@
sonypi_device.irq = irq_list[i].irq;
sonypi_device.bits = irq_list[i].bits;

- /* Enable sonypi IRQ settings */
- if (sonypi_device.model == SONYPI_DEVICE_MODEL_TYPE2)
- sonypi_type2_srs();
- else
- sonypi_type1_srs();
-
- sonypi_call1(0x82);
- sonypi_call2(0x81, 0xff);
- if (compat)
- sonypi_call1(0x92);
- else
- sonypi_call1(0x82);
-
- /* Now try requesting the irq from the system */
- if (!request_irq(sonypi_device.irq, sonypi_irq,
+ if (!request_irq(sonypi_device.irq, sonypi_irq,
SA_SHIRQ, "sonypi", sonypi_irq))
break;
-
- /* If request_irq failed, disable sonypi IRQ settings */
- if (sonypi_device.model == SONYPI_DEVICE_MODEL_TYPE2)
- sonypi_type2_dis();
- else
- sonypi_type1_dis();
}

if (!irq_list[i].irq) {
@@ -774,24 +764,14 @@
goto out3;
}

-#ifdef CONFIG_PM
- sonypi_device.pm = pm_register(PM_PCI_DEV, 0, sonypi_pm_callback);
-
- if (sysdev_class_register(&sonypi_sysclass) != 0) {
- printk(KERN_ERR "sonypi: sysdev_class_register failed\n");
- ret = -ENODEV;
- goto out4;
- }
- if (sysdev_register(&sonypi_sysdev) != 0) {
- printk(KERN_ERR "sonypi: sysdev_register failed\n");
- ret = -ENODEV;
- goto out5;
+ sonypi_device.pdev = platform_device_register_simple("sonypi", -1,
+ NULL, 0);
+ if (IS_ERR(sonypi_device.pdev)) {
+ ret = PTR_ERR(sonypi_device.pdev);
+ goto out_platformdev;
}
-#endif

- /* Enable ACPI mode to get Fn key events */
- if (!SONYPI_ACPI_ACTIVE && fnkeyinit)
- outb(0xf0, 0xb2);
+ sonypi_enable(0);

printk(KERN_INFO "sonypi: Sony Programmable I/O Controller Driver v%s.\n",
SONYPI_DRIVER_VERSION);
@@ -834,12 +814,7 @@

return 0;

-#ifdef CONFIG_PM
-out5:
- sysdev_class_unregister(&sonypi_sysclass);
-out4:
- free_irq(sonypi_device.irq, sonypi_irq);
-#endif
+out_platformdev:
out3:
release_region(sonypi_device.ioport1, sonypi_device.region_size);
out2:
@@ -847,20 +822,16 @@
out1:
kfifo_free(sonypi_device.fifo);
out_fifo:
+ pci_dev_put(sonypi_device.dev);
return ret;
}

-static void __devexit sonypi_remove(void) {
-
-#ifdef CONFIG_PM
- pm_unregister(sonypi_device.pm);
+static void __devexit sonypi_remove(void)
+{
+ sonypi_disable();

- sysdev_unregister(&sonypi_sysdev);
- sysdev_class_unregister(&sonypi_sysclass);
-#endif
+ platform_device_unregister(sonypi_device.pdev);

- sonypi_call2(0x81, 0); /* make sure we don't get any more events */
-
#ifdef SONYPI_USE_INPUT
if (useinput) {
input_unregister_device(&sonypi_device.jog_dev);
@@ -868,19 +839,13 @@
}
#endif /* SONYPI_USE_INPUT */

- if (camera)
- sonypi_camera_off();
- if (sonypi_device.model == SONYPI_DEVICE_MODEL_TYPE2)
- sonypi_type2_dis();
- else
- sonypi_type1_dis();
- /* disable ACPI mode */
- if (!SONYPI_ACPI_ACTIVE && fnkeyinit)
- outb(0xf1, 0xb2);
free_irq(sonypi_device.irq, sonypi_irq);
release_region(sonypi_device.ioport1, sonypi_device.region_size);
misc_deregister(&sonypi_misc_device);
+ if (sonypi_device.dev)
+ pci_disable_device(sonypi_device.dev);
kfifo_free(sonypi_device.fifo);
+ pci_dev_put(sonypi_device.dev);
printk(KERN_INFO "sonypi: removed.\n");
}

@@ -904,18 +869,25 @@

static int __init sonypi_init(void)
{
- struct pci_dev *pcidev = NULL;
- if (dmi_check_system(sonypi_dmi_table)) {
- pcidev = pci_find_device(PCI_VENDOR_ID_INTEL,
- PCI_DEVICE_ID_INTEL_82371AB_3,
- NULL);
- return sonypi_probe(pcidev);
- }
- else
+ int ret;
+
+ if (!dmi_check_system(sonypi_dmi_table))
return -ENODEV;
+
+ ret = driver_register(&sonypi_driver);
+ if (ret)
+ return ret;
+
+ ret = sonypi_probe();
+ if (ret)
+ driver_unregister(&sonypi_driver);
+
+ return ret;
}

-static void __exit sonypi_exit(void) {
+static void __exit sonypi_exit(void)
+{
+ driver_unregister(&sonypi_driver);
sonypi_remove();
}

diff -Nru a/drivers/char/sonypi.h b/drivers/char/sonypi.h
--- a/drivers/char/sonypi.h 2004-10-28 11:03:43 +02:00
+++ b/drivers/char/sonypi.h 2004-10-28 11:03:43 +02:00
@@ -45,7 +45,6 @@
#include <linux/types.h>
#include <linux/pci.h>
#include <linux/input.h>
-#include <linux/pm.h>
#include <linux/acpi.h>
#include <linux/kfifo.h>
#include <linux/sonypi.h>
@@ -355,6 +354,7 @@

struct sonypi_device {
struct pci_dev *dev;
+ struct platform_device *pdev;
u16 irq;
u16 bits;
u16 ioport1;
@@ -372,9 +372,6 @@
int model;
#ifdef SONYPI_USE_INPUT
struct input_dev jog_dev;
-#endif
-#ifdef CONFIG_PM
- struct pm_dev *pm;
#endif
};

2004-10-28 10:11:33

by Stelian Pop

[permalink] [raw]
Subject: [PATCH 2/8] sonypi: replace homebrew queue with kfifo

===================================================================

[email protected], 2004-10-27 16:52:48+02:00, [email protected]
sonypi: replace homebrew queue with kfifo

Signed-off-by: Stelian Pop <[email protected]>

===================================================================

sonypi.c | 132 ++++++++++++++++++++-------------------------------------------
sonypi.h | 17 ++------
2 files changed, 48 insertions(+), 101 deletions(-)

===================================================================

diff -Nru a/drivers/char/sonypi.c b/drivers/char/sonypi.c
--- a/drivers/char/sonypi.c 2004-10-28 11:01:57 +02:00
+++ b/drivers/char/sonypi.c 2004-10-28 11:01:57 +02:00
@@ -125,64 +125,6 @@
return 0;
}

-/* Inits the queue */
-static inline void sonypi_initq(void) {
- sonypi_device.queue.head = sonypi_device.queue.tail = 0;
- sonypi_device.queue.len = 0;
- sonypi_device.queue.s_lock = SPIN_LOCK_UNLOCKED;
- init_waitqueue_head(&sonypi_device.queue.proc_list);
-}
-
-/* Pulls an event from the queue */
-static inline unsigned char sonypi_pullq(void) {
- unsigned char result;
- unsigned long flags;
-
- spin_lock_irqsave(&sonypi_device.queue.s_lock, flags);
- if (!sonypi_device.queue.len) {
- spin_unlock_irqrestore(&sonypi_device.queue.s_lock, flags);
- return 0;
- }
- result = sonypi_device.queue.buf[sonypi_device.queue.head];
- sonypi_device.queue.head++;
- sonypi_device.queue.head &= (SONYPI_BUF_SIZE - 1);
- sonypi_device.queue.len--;
- spin_unlock_irqrestore(&sonypi_device.queue.s_lock, flags);
- return result;
-}
-
-/* Pushes an event into the queue */
-static inline void sonypi_pushq(unsigned char event) {
- unsigned long flags;
-
- spin_lock_irqsave(&sonypi_device.queue.s_lock, flags);
- if (sonypi_device.queue.len == SONYPI_BUF_SIZE) {
- /* remove the first element */
- sonypi_device.queue.head++;
- sonypi_device.queue.head &= (SONYPI_BUF_SIZE - 1);
- sonypi_device.queue.len--;
- }
- sonypi_device.queue.buf[sonypi_device.queue.tail] = event;
- sonypi_device.queue.tail++;
- sonypi_device.queue.tail &= (SONYPI_BUF_SIZE - 1);
- sonypi_device.queue.len++;
-
- kill_fasync(&sonypi_device.queue.fasync, SIGIO, POLL_IN);
- wake_up_interruptible(&sonypi_device.queue.proc_list);
- spin_unlock_irqrestore(&sonypi_device.queue.s_lock, flags);
-}
-
-/* Tests if the queue is empty */
-static inline int sonypi_emptyq(void) {
- int result;
- unsigned long flags;
-
- spin_lock_irqsave(&sonypi_device.queue.s_lock, flags);
- result = (sonypi_device.queue.len == 0);
- spin_unlock_irqrestore(&sonypi_device.queue.s_lock, flags);
- return result;
-}
-
static int ec_read16(u8 addr, u16 *value) {
u8 val_lb, val_hb;
if (sonypi_ec_read(addr, &val_lb))
@@ -419,7 +361,11 @@
input_sync(jog_dev);
}
#endif /* SONYPI_USE_INPUT */
- sonypi_pushq(event);
+
+ kfifo_put(sonypi_device.fifo, (unsigned char *)&event, sizeof(event));
+ kill_fasync(&sonypi_device.fifo_async, SIGIO, POLL_IN);
+ wake_up_interruptible(&sonypi_device.fifo_proc_list);
+
return IRQ_HANDLED;
}

@@ -504,7 +450,7 @@
static int sonypi_misc_fasync(int fd, struct file *filp, int on) {
int retval;

- retval = fasync_helper(fd, filp, on, &sonypi_device.queue.fasync);
+ retval = fasync_helper(fd, filp, on, &sonypi_device.fifo_async);
if (retval < 0)
return retval;
return 0;
@@ -522,7 +468,7 @@
down(&sonypi_device.lock);
/* Flush input queue on first open */
if (!sonypi_device.open_count)
- sonypi_initq();
+ kfifo_reset(sonypi_device.fifo);
sonypi_device.open_count++;
up(&sonypi_device.lock);
return 0;
@@ -531,40 +477,34 @@
static ssize_t sonypi_misc_read(struct file * file, char __user * buf,
size_t count, loff_t *pos)
{
- DECLARE_WAITQUEUE(wait, current);
- ssize_t i = count;
+ ssize_t ret;
unsigned char c;

- if (sonypi_emptyq()) {
- if (file->f_flags & O_NONBLOCK)
- return -EAGAIN;
- add_wait_queue(&sonypi_device.queue.proc_list, &wait);
-repeat:
- set_current_state(TASK_INTERRUPTIBLE);
- if (sonypi_emptyq() && !signal_pending(current)) {
- schedule();
- goto repeat;
- }
- current->state = TASK_RUNNING;
- remove_wait_queue(&sonypi_device.queue.proc_list, &wait);
- }
- while (i > 0 && !sonypi_emptyq()) {
- c = sonypi_pullq();
- put_user(c, buf++);
- i--;
- }
- if (count - i) {
- file->f_dentry->d_inode->i_atime = CURRENT_TIME;
- return count-i;
+ if ((kfifo_len(sonypi_device.fifo) == 0) &&
+ (file->f_flags & O_NONBLOCK))
+ return -EAGAIN;
+
+ ret = wait_event_interruptible(sonypi_device.fifo_proc_list,
+ kfifo_len(sonypi_device.fifo) != 0);
+ if (ret)
+ return ret;
+
+ while (ret < count &&
+ (kfifo_get(sonypi_device.fifo, &c, sizeof(c)) == sizeof(c))) {
+ if (put_user(c, buf++))
+ return -EFAULT;
+ ret++;
}
- if (signal_pending(current))
- return -ERESTARTSYS;
- return 0;
+
+ if (ret > 0)
+ file->f_dentry->d_inode->i_atime = CURRENT_TIME;
+
+ return ret;
}

static unsigned int sonypi_misc_poll(struct file *file, poll_table * wait) {
- poll_wait(file, &sonypi_device.queue.proc_list, wait);
- if (!sonypi_emptyq())
+ poll_wait(file, &sonypi_device.fifo_proc_list, wait);
+ if (kfifo_len(sonypi_device.fifo))
return POLLIN | POLLRDNORM;
return 0;
}
@@ -743,7 +683,16 @@
sonypi_device.model = SONYPI_DEVICE_MODEL_TYPE1;
else
sonypi_device.model = SONYPI_DEVICE_MODEL_TYPE2;
- sonypi_initq();
+ sonypi_device.fifo_lock = SPIN_LOCK_UNLOCKED;
+ sonypi_device.fifo = kfifo_alloc(SONYPI_BUF_SIZE, GFP_KERNEL,
+ &sonypi_device.fifo_lock);
+ if (IS_ERR(sonypi_device.fifo)) {
+ printk(KERN_ERR "sonypi: kfifo_alloc failed\n");
+ ret = PTR_ERR(sonypi_device.fifo);
+ goto out_fifo;
+ }
+
+ init_waitqueue_head(&sonypi_device.fifo_proc_list);
init_MUTEX(&sonypi_device.lock);
sonypi_device.bluetooth_power = 0;

@@ -896,6 +845,8 @@
out2:
misc_deregister(&sonypi_misc_device);
out1:
+ kfifo_free(sonypi_device.fifo);
+out_fifo:
return ret;
}

@@ -929,6 +880,7 @@
free_irq(sonypi_device.irq, sonypi_irq);
release_region(sonypi_device.ioport1, sonypi_device.region_size);
misc_deregister(&sonypi_misc_device);
+ kfifo_free(sonypi_device.fifo);
printk(KERN_INFO "sonypi: removed.\n");
}

diff -Nru a/drivers/char/sonypi.h b/drivers/char/sonypi.h
--- a/drivers/char/sonypi.h 2004-10-28 11:01:57 +02:00
+++ b/drivers/char/sonypi.h 2004-10-28 11:01:57 +02:00
@@ -47,7 +47,8 @@
#include <linux/input.h>
#include <linux/pm.h>
#include <linux/acpi.h>
-#include "linux/sonypi.h"
+#include <linux/kfifo.h>
+#include <linux/sonypi.h>

/* type1 models use those */
#define SONYPI_IRQ_PORT 0x8034
@@ -339,15 +340,6 @@
};

#define SONYPI_BUF_SIZE 128
-struct sonypi_queue {
- unsigned long head;
- unsigned long tail;
- unsigned long len;
- spinlock_t s_lock;
- wait_queue_head_t proc_list;
- struct fasync_struct *fasync;
- unsigned char buf[SONYPI_BUF_SIZE];
-};

/* We enable input subsystem event forwarding if the input
* subsystem is compiled in, but only if sonypi is not into the
@@ -372,7 +364,10 @@
int camera_power;
int bluetooth_power;
struct semaphore lock;
- struct sonypi_queue queue;
+ struct kfifo *fifo;
+ spinlock_t fifo_lock;
+ wait_queue_head_t fifo_proc_list;
+ struct fasync_struct *fifo_async;
int open_count;
int model;
#ifdef SONYPI_USE_INPUT

2004-10-28 10:17:42

by Stelian Pop

[permalink] [raw]
Subject: [PATCH 5/8] sonypi: make CONFIG_SONYPI depend on CONFIG_INPUT

===================================================================

[email protected], 2004-10-28 10:23:13+02:00, [email protected]
sonypi: make CONFIG_SONYPI depend on CONFIG_INPUT since the latter is no more optional.

Signed-off-by: Stelian Pop <[email protected]>

===================================================================

Kconfig | 2 +-
1 files changed, 1 insertion(+), 1 deletion(-)

===================================================================

diff -Nru a/drivers/char/Kconfig b/drivers/char/Kconfig
--- a/drivers/char/Kconfig 2004-10-28 11:09:18 +02:00
+++ b/drivers/char/Kconfig 2004-10-28 11:09:18 +02:00
@@ -835,7 +835,7 @@

config SONYPI
tristate "Sony Vaio Programmable I/O Control Device support (EXPERIMENTAL)"
- depends on EXPERIMENTAL && X86 && PCI && !64BIT
+ depends on EXPERIMENTAL && X86 && PCI && INPUT && !64BIT
---help---
This driver enables access to the Sony Programmable I/O Control
Device which can be found in many (all ?) Sony Vaio laptops.

2004-10-28 10:17:43

by Stelian Pop

[permalink] [raw]
Subject: [PATCH 6/8] sonypi: don't suppose the bluetooth subsystem is initialy off

===================================================================

[email protected], 2004-10-28 10:40:18+02:00, [email protected]
sonypi: don't suppose the bluetooth subsystem is initialy off,
leave the choice to the user.

Signed-off-by: Stelian Pop <[email protected]>

===================================================================

sonypi.c | 2 +-
1 files changed, 1 insertion(+), 1 deletion(-)

===================================================================

diff -Nru a/drivers/char/sonypi.c b/drivers/char/sonypi.c
--- a/drivers/char/sonypi.c 2004-10-28 11:13:37 +02:00
+++ b/drivers/char/sonypi.c 2004-10-28 11:13:37 +02:00
@@ -754,7 +754,7 @@

init_waitqueue_head(&sonypi_device.fifo_proc_list);
init_MUTEX(&sonypi_device.lock);
- sonypi_device.bluetooth_power = 0;
+ sonypi_device.bluetooth_power = -1;

if (pcidev && pci_enable_device(pcidev)) {
printk(KERN_ERR "sonypi: pci_enable_device failed\n");

2004-10-28 10:17:42

by Stelian Pop

[permalink] [raw]
Subject: [PATCH 4/8] sonypi: rework input support

===================================================================

[email protected], 2004-10-27 17:32:21+02:00, [email protected]
sonypi: rework input support
* feed most of special keys through the input subsystem
* initialize two separate input devices: a mouse like one for
the jogdial and a keyboard like one for the special keys
* add support for SONYPI_EVENT_FNKEY_RELEASED

Many people participated in a way or another to this patch,
including Daniel K. <[email protected]>, Bastien Nocera <[email protected]>,
Dmitry Torokhov <[email protected]> and Vojtech Pavlik <[email protected]>.

Signed-off-by: Stelian Pop <[email protected]>

===================================================================

drivers/char/sonypi.c | 169 ++++++++++++++++++++++++++++++++++++++-----------
drivers/char/sonypi.h | 62 +++++++++++++----
include/linux/input.h | 22 ++++++
include/linux/sonypi.h | 1
4 files changed, 205 insertions(+), 49 deletions(-)

===================================================================

diff -Nru a/drivers/char/sonypi.c b/drivers/char/sonypi.c
--- a/drivers/char/sonypi.c 2004-10-28 11:06:42 +02:00
+++ b/drivers/char/sonypi.c 2004-10-28 11:06:42 +02:00
@@ -309,6 +309,27 @@
sonypi_device.bluetooth_power = state;
}

+static void input_keyrelease(void *data)
+{
+ struct input_dev *input_dev;
+ int key;
+
+ while (1) {
+ if (kfifo_get(sonypi_device.input_fifo,
+ (unsigned char *)&input_dev,
+ sizeof(input_dev)) != sizeof(input_dev))
+ return;
+ if (kfifo_get(sonypi_device.input_fifo,
+ (unsigned char *)&key,
+ sizeof(key)) != sizeof(key))
+ return;
+
+ msleep(10);
+ input_report_key(input_dev, key, 0);
+ input_sync(input_dev);
+ }
+}
+
/* Interrupt handler: some event is available */
static irqreturn_t sonypi_irq(int irq, void *dev_id, struct pt_regs *regs) {
u8 v1, v2, event = 0;
@@ -345,22 +366,51 @@
printk(KERN_INFO
"sonypi: event port1=0x%02x,port2=0x%02x\n", v1, v2);

-#ifdef SONYPI_USE_INPUT
if (useinput) {
- struct input_dev *jog_dev = &sonypi_device.jog_dev;
- if (event == SONYPI_EVENT_JOGDIAL_PRESSED)
- input_report_key(jog_dev, BTN_MIDDLE, 1);
- else if (event == SONYPI_EVENT_ANYBUTTON_RELEASED)
- input_report_key(jog_dev, BTN_MIDDLE, 0);
- else if ((event == SONYPI_EVENT_JOGDIAL_UP) ||
- (event == SONYPI_EVENT_JOGDIAL_UP_PRESSED))
- input_report_rel(jog_dev, REL_WHEEL, 1);
- else if ((event == SONYPI_EVENT_JOGDIAL_DOWN) ||
- (event == SONYPI_EVENT_JOGDIAL_DOWN_PRESSED))
- input_report_rel(jog_dev, REL_WHEEL, -1);
- input_sync(jog_dev);
+ struct input_dev *input_jog_dev = &sonypi_device.input_jog_dev;
+ struct input_dev *input_key_dev = &sonypi_device.input_key_dev;
+ switch (event) {
+ case SONYPI_EVENT_JOGDIAL_UP:
+ case SONYPI_EVENT_JOGDIAL_UP_PRESSED:
+ input_report_rel(input_jog_dev, REL_WHEEL, 1);
+ break;
+ case SONYPI_EVENT_JOGDIAL_DOWN:
+ case SONYPI_EVENT_JOGDIAL_DOWN_PRESSED:
+ input_report_rel(input_jog_dev, REL_WHEEL, -1);
+ break;
+ case SONYPI_EVENT_JOGDIAL_PRESSED: {
+ int key = BTN_MIDDLE;
+ input_report_key(input_jog_dev, key, 1);
+ kfifo_put(sonypi_device.input_fifo,
+ (unsigned char *)&input_jog_dev,
+ sizeof(input_jog_dev));
+ kfifo_put(sonypi_device.input_fifo,
+ (unsigned char *)&key, sizeof(key));
+ break;
+ }
+ case SONYPI_EVENT_FNKEY_RELEASED:
+ /* Nothing, not all VAIOs generate this event */
+ break;
+ }
+ input_sync(input_jog_dev);
+
+ for (i = 0; sonypi_inputkeys[i].sonypiev; i++) {
+ int key;
+
+ if (event != sonypi_inputkeys[i].sonypiev)
+ continue;
+
+ key = sonypi_inputkeys[i].inputev;
+ input_report_key(input_key_dev, key, 1);
+ kfifo_put(sonypi_device.input_fifo,
+ (unsigned char *)&input_key_dev,
+ sizeof(input_key_dev));
+ kfifo_put(sonypi_device.input_fifo,
+ (unsigned char *)&key, sizeof(key));
+ }
+ input_sync(input_key_dev);
+ schedule_work(&sonypi_device.input_work);
}
-#endif /* SONYPI_USE_INPUT */

kfifo_put(sonypi_device.fifo, (unsigned char *)&event, sizeof(event));
kill_fasync(&sonypi_device.fifo_async, SIGIO, POLL_IN);
@@ -764,6 +814,62 @@
goto out3;
}

+ if (useinput) {
+ /* Initialize the Input Drivers: jogdial */
+ int i;
+ sonypi_device.input_jog_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
+ sonypi_device.input_jog_dev.keybit[LONG(BTN_MOUSE)] =
+ BIT(BTN_MIDDLE);
+ sonypi_device.input_jog_dev.relbit[0] = BIT(REL_WHEEL);
+ sonypi_device.input_jog_dev.name =
+ (char *) kmalloc(sizeof(SONYPI_JOG_INPUTNAME), GFP_KERNEL);
+ if (!sonypi_device.input_jog_dev.name) {
+ printk(KERN_ERR "sonypi: kmalloc failed\n");
+ ret = -ENOMEM;
+ goto out_inkmallocinput1;
+ }
+ sprintf(sonypi_device.input_jog_dev.name, SONYPI_JOG_INPUTNAME);
+ sonypi_device.input_jog_dev.id.bustype = BUS_ISA;
+ sonypi_device.input_jog_dev.id.vendor = PCI_VENDOR_ID_SONY;
+
+ input_register_device(&sonypi_device.input_jog_dev);
+ printk(KERN_INFO "%s input method installed.\n",
+ sonypi_device.input_jog_dev.name);
+
+ /* Initialize the Input Drivers: special keys */
+ sonypi_device.input_key_dev.evbit[0] = BIT(EV_KEY);
+ for (i = 0; sonypi_inputkeys[i].sonypiev; i++)
+ if (sonypi_inputkeys[i].inputev)
+ set_bit(sonypi_inputkeys[i].inputev,
+ sonypi_device.input_key_dev.keybit);
+ sonypi_device.input_key_dev.name =
+ (char *) kmalloc(sizeof(SONYPI_KEY_INPUTNAME), GFP_KERNEL);
+ if (!sonypi_device.input_key_dev.name) {
+ printk(KERN_ERR "sonypi: kmalloc failed\n");
+ ret = -ENOMEM;
+ goto out_inkmallocinput2;
+ }
+ sprintf(sonypi_device.input_key_dev.name, SONYPI_KEY_INPUTNAME);
+ sonypi_device.input_key_dev.id.bustype = BUS_ISA;
+ sonypi_device.input_key_dev.id.vendor = PCI_VENDOR_ID_SONY;
+
+ input_register_device(&sonypi_device.input_key_dev);
+ printk(KERN_INFO "%s input method installed.\n",
+ sonypi_device.input_key_dev.name);
+
+ sonypi_device.input_fifo_lock = SPIN_LOCK_UNLOCKED;
+ sonypi_device.input_fifo =
+ kfifo_alloc(SONYPI_BUF_SIZE, GFP_KERNEL,
+ &sonypi_device.input_fifo_lock);
+ if (IS_ERR(sonypi_device.input_fifo)) {
+ printk(KERN_ERR "sonypi: kfifo_alloc failed\n");
+ ret = PTR_ERR(sonypi_device.input_fifo);
+ goto out_infifo;
+ }
+
+ INIT_WORK(&sonypi_device.input_work, input_keyrelease, NULL);
+ }
+
sonypi_device.pdev = platform_device_register_simple("sonypi", -1,
NULL, 0);
if (IS_ERR(sonypi_device.pdev)) {
@@ -795,26 +901,18 @@
printk(KERN_INFO "sonypi: device allocated minor is %d\n",
sonypi_misc_device.minor);

-#ifdef SONYPI_USE_INPUT
- if (useinput) {
- /* Initialize the Input Drivers: */
- sonypi_device.jog_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
- sonypi_device.jog_dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_MIDDLE);
- sonypi_device.jog_dev.relbit[0] = BIT(REL_WHEEL);
- sonypi_device.jog_dev.name = (char *) kmalloc(
- sizeof(SONYPI_INPUTNAME), GFP_KERNEL);
- sprintf(sonypi_device.jog_dev.name, SONYPI_INPUTNAME);
- sonypi_device.jog_dev.id.bustype = BUS_ISA;
- sonypi_device.jog_dev.id.vendor = PCI_VENDOR_ID_SONY;
-
- input_register_device(&sonypi_device.jog_dev);
- printk(KERN_INFO "%s installed.\n", sonypi_device.jog_dev.name);
- }
-#endif /* SONYPI_USE_INPUT */
-
return 0;

out_platformdev:
+ kfifo_free(sonypi_device.input_fifo);
+out_infifo:
+ input_unregister_device(&sonypi_device.input_key_dev);
+ kfree(sonypi_device.input_key_dev.name);
+out_inkmallocinput2:
+ input_unregister_device(&sonypi_device.input_jog_dev);
+ kfree(sonypi_device.input_jog_dev.name);
+out_inkmallocinput1:
+ free_irq(sonypi_device.irq, sonypi_irq);
out3:
release_region(sonypi_device.ioport1, sonypi_device.region_size);
out2:
@@ -832,12 +930,13 @@

platform_device_unregister(sonypi_device.pdev);

-#ifdef SONYPI_USE_INPUT
if (useinput) {
- input_unregister_device(&sonypi_device.jog_dev);
- kfree(sonypi_device.jog_dev.name);
+ input_unregister_device(&sonypi_device.input_key_dev);
+ kfree(sonypi_device.input_key_dev.name);
+ input_unregister_device(&sonypi_device.input_jog_dev);
+ kfree(sonypi_device.input_jog_dev.name);
+ kfifo_free(sonypi_device.input_fifo);
}
-#endif /* SONYPI_USE_INPUT */

free_irq(sonypi_device.irq, sonypi_irq);
release_region(sonypi_device.ioport1, sonypi_device.region_size);
diff -Nru a/drivers/char/sonypi.h b/drivers/char/sonypi.h
--- a/drivers/char/sonypi.h 2004-10-28 11:06:42 +02:00
+++ b/drivers/char/sonypi.h 2004-10-28 11:06:42 +02:00
@@ -222,6 +222,7 @@
{ 0x1a, SONYPI_EVENT_FNKEY_F10 },
{ 0x1b, SONYPI_EVENT_FNKEY_F11 },
{ 0x1c, SONYPI_EVENT_FNKEY_F12 },
+ { 0x1f, SONYPI_EVENT_FNKEY_RELEASED },
{ 0x21, SONYPI_EVENT_FNKEY_1 },
{ 0x22, SONYPI_EVENT_FNKEY_2 },
{ 0x31, SONYPI_EVENT_FNKEY_D },
@@ -340,17 +341,48 @@

#define SONYPI_BUF_SIZE 128

-/* We enable input subsystem event forwarding if the input
- * subsystem is compiled in, but only if sonypi is not into the
- * kernel and input as a module... */
-#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
-#if ! (defined(CONFIG_SONYPI) && defined(CONFIG_INPUT_MODULE))
-#define SONYPI_USE_INPUT
-#endif
-#endif
-
-/* The name of the Jog Dial for the input device drivers */
-#define SONYPI_INPUTNAME "Sony VAIO Jog Dial"
+/* The name of the devices for the input device drivers */
+#define SONYPI_JOG_INPUTNAME "Sony Vaio Jogdial"
+#define SONYPI_KEY_INPUTNAME "Sony Vaio Keys"
+
+/* Correspondance table between sonypi events and input layer events */
+struct {
+ int sonypiev;
+ int inputev;
+} sonypi_inputkeys[] = {
+ { SONYPI_EVENT_CAPTURE_PRESSED, KEY_CAMERA },
+ { SONYPI_EVENT_FNKEY_ONLY, KEY_FN },
+ { SONYPI_EVENT_FNKEY_ESC, KEY_FN_ESC },
+ { SONYPI_EVENT_FNKEY_F1, KEY_FN_F1 },
+ { SONYPI_EVENT_FNKEY_F2, KEY_FN_F2 },
+ { SONYPI_EVENT_FNKEY_F3, KEY_FN_F3 },
+ { SONYPI_EVENT_FNKEY_F4, KEY_FN_F4 },
+ { SONYPI_EVENT_FNKEY_F5, KEY_FN_F5 },
+ { SONYPI_EVENT_FNKEY_F6, KEY_FN_F6 },
+ { SONYPI_EVENT_FNKEY_F7, KEY_FN_F7 },
+ { SONYPI_EVENT_FNKEY_F8, KEY_FN_F8 },
+ { SONYPI_EVENT_FNKEY_F9, KEY_FN_F9 },
+ { SONYPI_EVENT_FNKEY_F10, KEY_FN_F10 },
+ { SONYPI_EVENT_FNKEY_F11, KEY_FN_F11 },
+ { SONYPI_EVENT_FNKEY_F12, KEY_FN_F12 },
+ { SONYPI_EVENT_FNKEY_1, KEY_FN_1 },
+ { SONYPI_EVENT_FNKEY_2, KEY_FN_2 },
+ { SONYPI_EVENT_FNKEY_D, KEY_FN_D },
+ { SONYPI_EVENT_FNKEY_E, KEY_FN_E },
+ { SONYPI_EVENT_FNKEY_F, KEY_FN_F },
+ { SONYPI_EVENT_FNKEY_S, KEY_FN_S },
+ { SONYPI_EVENT_FNKEY_B, KEY_FN_B },
+ { SONYPI_EVENT_BLUETOOTH_PRESSED, KEY_BLUE },
+ { SONYPI_EVENT_BLUETOOTH_ON, KEY_BLUE },
+ { SONYPI_EVENT_PKEY_P1, KEY_PROG1 },
+ { SONYPI_EVENT_PKEY_P2, KEY_PROG2 },
+ { SONYPI_EVENT_PKEY_P3, KEY_PROG3 },
+ { SONYPI_EVENT_BACK_PRESSED, KEY_BACK },
+ { SONYPI_EVENT_HELP_PRESSED, KEY_HELP },
+ { SONYPI_EVENT_ZOOM_PRESSED, KEY_ZOOM },
+ { SONYPI_EVENT_THUMBPHRASE_PRESSED, BTN_THUMB },
+ { 0, 0 },
+};

struct sonypi_device {
struct pci_dev *dev;
@@ -370,9 +402,11 @@
struct fasync_struct *fifo_async;
int open_count;
int model;
-#ifdef SONYPI_USE_INPUT
- struct input_dev jog_dev;
-#endif
+ struct input_dev input_jog_dev;
+ struct input_dev input_key_dev;
+ struct work_struct input_work;
+ struct kfifo *input_fifo;
+ spinlock_t input_fifo_lock;
};

#define ITERATIONS_LONG 10000
diff -Nru a/include/linux/input.h b/include/linux/input.h
--- a/include/linux/input.h 2004-10-28 11:06:42 +02:00
+++ b/include/linux/input.h 2004-10-28 11:06:42 +02:00
@@ -473,6 +473,28 @@
#define KEY_INS_LINE 0x1c2
#define KEY_DEL_LINE 0x1c3

+#define KEY_FN 0x1d0
+#define KEY_FN_ESC 0x1d1
+#define KEY_FN_F1 0x1d2
+#define KEY_FN_F2 0x1d3
+#define KEY_FN_F3 0x1d4
+#define KEY_FN_F4 0x1d5
+#define KEY_FN_F5 0x1d6
+#define KEY_FN_F6 0x1d7
+#define KEY_FN_F7 0x1d8
+#define KEY_FN_F8 0x1d9
+#define KEY_FN_F9 0x1da
+#define KEY_FN_F10 0x1db
+#define KEY_FN_F11 0x1dc
+#define KEY_FN_F12 0x1dd
+#define KEY_FN_1 0x1de
+#define KEY_FN_2 0x1df
+#define KEY_FN_D 0x1e0
+#define KEY_FN_E 0x1e1
+#define KEY_FN_F 0x1e2
+#define KEY_FN_S 0x1e3
+#define KEY_FN_B 0x1e4
+
#define KEY_MAX 0x1ff

/*
diff -Nru a/include/linux/sonypi.h b/include/linux/sonypi.h
--- a/include/linux/sonypi.h 2004-10-28 11:06:42 +02:00
+++ b/include/linux/sonypi.h 2004-10-28 11:06:42 +02:00
@@ -96,6 +96,7 @@
#define SONYPI_EVENT_ANYBUTTON_RELEASED 56
#define SONYPI_EVENT_BATTERY_INSERT 57
#define SONYPI_EVENT_BATTERY_REMOVE 58
+#define SONYPI_EVENT_FNKEY_RELEASED 59

/* get/set brightness */
#define SONYPI_IOCGBRT _IOR('v', 0, __u8)

2004-10-28 10:28:11

by Stelian Pop

[permalink] [raw]
Subject: [PATCH 8/8] sonypi: bump up the version number

===================================================================

[email protected], 2004-10-28 10:54:14+02:00, [email protected]
sonypi: bump up the version number

Signed-off-by: Stelian Pop <[email protected]>

===================================================================

sonypi.h | 2 +-
1 files changed, 1 insertion(+), 1 deletion(-)

===================================================================

diff -Nru a/drivers/char/sonypi.h b/drivers/char/sonypi.h
--- a/drivers/char/sonypi.h 2004-10-28 11:20:55 +02:00
+++ b/drivers/char/sonypi.h 2004-10-28 11:20:55 +02:00
@@ -36,7 +36,7 @@

#ifdef __KERNEL__

-#define SONYPI_DRIVER_VERSION "1.23"
+#define SONYPI_DRIVER_VERSION "1.24"

#define SONYPI_DEVICE_MODEL_TYPE1 1
#define SONYPI_DEVICE_MODEL_TYPE2 2

2004-10-28 10:34:53

by Stelian Pop

[permalink] [raw]
Subject: [PATCH 7/8] sonypi: whitespace and coding style fixes

===================================================================

[email protected], 2004-10-28 10:52:05+02:00, [email protected]
sonypi: whitespace and coding style fixes

Signed-off-by: Stelian Pop <[email protected]>

===================================================================

drivers/char/sonypi.c | 285 ++++++++++++++++++++++++++-----------------------
drivers/char/sonypi.h | 18 +--
include/linux/sonypi.h | 16 +-
3 files changed, 172 insertions(+), 147 deletions(-)

===================================================================

diff -Nru a/drivers/char/sonypi.c b/drivers/char/sonypi.c
--- a/drivers/char/sonypi.c 2004-10-28 11:18:59 +02:00
+++ b/drivers/char/sonypi.c 2004-10-28 11:18:59 +02:00
@@ -1,7 +1,7 @@
/*
* Sony Programmable I/O Control Device driver for VAIO
*
- * Copyright (C) 2001-2003 Stelian Pop <[email protected]>
+ * Copyright (C) 2001-2004 Stelian Pop <[email protected]>
*
* Copyright (C) 2001-2002 Alc?ve <http://www.alcove.com>
*
@@ -19,12 +19,12 @@
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
@@ -125,7 +125,8 @@
return 0;
}

-static int ec_read16(u8 addr, u16 *value) {
+static int ec_read16(u8 addr, u16 *value)
+{
u8 val_lb, val_hb;
if (sonypi_ec_read(addr, &val_lb))
return -1;
@@ -136,21 +137,22 @@
}

/* Initializes the device - this comes from the AML code in the ACPI bios */
-static void sonypi_type1_srs(void) {
+static void sonypi_type1_srs(void)
+{
u32 v;

pci_read_config_dword(sonypi_device.dev, SONYPI_G10A, &v);
- v = (v & 0xFFFF0000) | ((u32)sonypi_device.ioport1);
+ v = (v & 0xFFFF0000) | ((u32) sonypi_device.ioport1);
pci_write_config_dword(sonypi_device.dev, SONYPI_G10A, v);

pci_read_config_dword(sonypi_device.dev, SONYPI_G10A, &v);
- v = (v & 0xFFF0FFFF) |
- (((u32)sonypi_device.ioport1 ^ sonypi_device.ioport2) << 16);
+ v = (v & 0xFFF0FFFF) |
+ (((u32) sonypi_device.ioport1 ^ sonypi_device.ioport2) << 16);
pci_write_config_dword(sonypi_device.dev, SONYPI_G10A, v);

v = inl(SONYPI_IRQ_PORT);
- v &= ~(((u32)0x3) << SONYPI_IRQ_SHIFT);
- v |= (((u32)sonypi_device.bits) << SONYPI_IRQ_SHIFT);
+ v &= ~(((u32) 0x3) << SONYPI_IRQ_SHIFT);
+ v |= (((u32) sonypi_device.bits) << SONYPI_IRQ_SHIFT);
outl(v, SONYPI_IRQ_PORT);

pci_read_config_dword(sonypi_device.dev, SONYPI_G10A, &v);
@@ -158,18 +160,20 @@
pci_write_config_dword(sonypi_device.dev, SONYPI_G10A, v);
}

-static void sonypi_type2_srs(void) {
+static void sonypi_type2_srs(void)
+{
if (sonypi_ec_write(SONYPI_SHIB, (sonypi_device.ioport1 & 0xFF00) >> 8))
printk(KERN_WARNING "ec_write failed\n");
- if (sonypi_ec_write(SONYPI_SLOB, sonypi_device.ioport1 & 0x00FF))
+ if (sonypi_ec_write(SONYPI_SLOB, sonypi_device.ioport1 & 0x00FF))
printk(KERN_WARNING "ec_write failed\n");
- if (sonypi_ec_write(SONYPI_SIRQ, sonypi_device.bits))
+ if (sonypi_ec_write(SONYPI_SIRQ, sonypi_device.bits))
printk(KERN_WARNING "ec_write failed\n");
udelay(10);
}

/* Disables the device - this comes from the AML code in the ACPI bios */
-static void sonypi_type1_dis(void) {
+static void sonypi_type1_dis(void)
+{
u32 v;

pci_read_config_dword(sonypi_device.dev, SONYPI_G10A, &v);
@@ -181,7 +185,8 @@
outl(v, SONYPI_IRQ_PORT);
}

-static void sonypi_type2_dis(void) {
+static void sonypi_type2_dis(void)
+{
if (sonypi_ec_write(SONYPI_SHIB, 0))
printk(KERN_WARNING "ec_write failed\n");
if (sonypi_ec_write(SONYPI_SLOB, 0))
@@ -190,7 +195,8 @@
printk(KERN_WARNING "ec_write failed\n");
}

-static u8 sonypi_call1(u8 dev) {
+static u8 sonypi_call1(u8 dev)
+{
u8 v1, v2;

wait_on_command(0, inb_p(sonypi_device.ioport2) & 2, ITERATIONS_LONG);
@@ -200,7 +206,8 @@
return v2;
}

-static u8 sonypi_call2(u8 dev, u8 fn) {
+static u8 sonypi_call2(u8 dev, u8 fn)
+{
u8 v1;

wait_on_command(0, inb_p(sonypi_device.ioport2) & 2, ITERATIONS_LONG);
@@ -211,7 +218,8 @@
return v1;
}

-static u8 sonypi_call3(u8 dev, u8 fn, u8 v) {
+static u8 sonypi_call3(u8 dev, u8 fn, u8 v)
+{
u8 v1;

wait_on_command(0, inb_p(sonypi_device.ioport2) & 2, ITERATIONS_LONG);
@@ -224,7 +232,8 @@
return v1;
}

-static u8 sonypi_read(u8 fn) {
+static u8 sonypi_read(u8 fn)
+{
u8 v1, v2;
int n = 100;

@@ -238,13 +247,14 @@
}

/* Set brightness, hue etc */
-static void sonypi_set(u8 fn, u8 v) {
-
+static void sonypi_set(u8 fn, u8 v)
+{
wait_on_command(0, sonypi_call3(0x90, fn, v), ITERATIONS_SHORT);
}

/* Tests if the camera is ready */
-static int sonypi_camera_ready(void) {
+static int sonypi_camera_ready(void)
+{
u8 v;

v = sonypi_call2(0x8f, SONYPI_CAMERA_STATUS);
@@ -252,19 +262,20 @@
}

/* Turns the camera off */
-static void sonypi_camera_off(void) {
-
+static void sonypi_camera_off(void)
+{
sonypi_set(SONYPI_CAMERA_PICTURE, SONYPI_CAMERA_MUTE_MASK);

if (!sonypi_device.camera_power)
return;

- sonypi_call2(0x91, 0);
+ sonypi_call2(0x91, 0);
sonypi_device.camera_power = 0;
}

/* Turns the camera on */
-static void sonypi_camera_on(void) {
+static void sonypi_camera_on(void)
+{
int i, j;

if (sonypi_device.camera_power)
@@ -287,7 +298,7 @@
if (i)
break;
}
-
+
if (j == 0) {
printk(KERN_WARNING "sonypi: failed to power on camera\n");
return;
@@ -298,12 +309,13 @@
}

/* sets the bluetooth subsystem power state */
-static void sonypi_setbluetoothpower(u8 state) {
-
+static void sonypi_setbluetoothpower(u8 state)
+{
state = !!state;
- if (sonypi_device.bluetooth_power == state)
+
+ if (sonypi_device.bluetooth_power == state)
return;
-
+
sonypi_call2(0x96, state);
sonypi_call1(0x82);
sonypi_device.bluetooth_power = state;
@@ -331,7 +343,8 @@
}

/* Interrupt handler: some event is available */
-static irqreturn_t sonypi_irq(int irq, void *dev_id, struct pt_regs *regs) {
+static irqreturn_t sonypi_irq(int irq, void *dev_id, struct pt_regs *regs)
+{
u8 v1, v2, event = 0;
int i, j;

@@ -341,9 +354,10 @@
for (i = 0; sonypi_eventtypes[i].model; i++) {
if (sonypi_device.model != sonypi_eventtypes[i].model)
continue;
- if ((v2 & sonypi_eventtypes[i].data) != sonypi_eventtypes[i].data)
+ if ((v2 & sonypi_eventtypes[i].data) !=
+ sonypi_eventtypes[i].data)
continue;
- if (! (mask & sonypi_eventtypes[i].mask))
+ if (!(mask & sonypi_eventtypes[i].mask))
continue;
for (j = 0; sonypi_eventtypes[i].events[j].event; j++) {
if (v1 == sonypi_eventtypes[i].events[j].data) {
@@ -354,16 +368,17 @@
}

if (verbose)
- printk(KERN_WARNING
- "sonypi: unknown event port1=0x%02x,port2=0x%02x\n",v1,v2);
+ printk(KERN_WARNING
+ "sonypi: unknown event port1=0x%02x,port2=0x%02x\n",
+ v1, v2);
/* We need to return IRQ_HANDLED here because there *are*
- * events belonging to the sonypi device we don't know about,
+ * events belonging to the sonypi device we don't know about,
* but we still don't want those to pollute the logs... */
return IRQ_HANDLED;

found:
if (verbose > 1)
- printk(KERN_INFO
+ printk(KERN_INFO
"sonypi: event port1=0x%02x,port2=0x%02x\n", v1, v2);

if (useinput) {
@@ -420,7 +435,8 @@
}

/* External camera command (exported to the motion eye v4l driver) */
-u8 sonypi_camera_command(int command, u8 value) {
+u8 sonypi_camera_command(int command, u8 value)
+{
u8 ret = 0;

if (!camera)
@@ -428,68 +444,68 @@

down(&sonypi_device.lock);

- switch(command) {
- case SONYPI_COMMAND_GETCAMERA:
- ret = sonypi_camera_ready();
- break;
- case SONYPI_COMMAND_SETCAMERA:
- if (value)
- sonypi_camera_on();
- else
- sonypi_camera_off();
- break;
- case SONYPI_COMMAND_GETCAMERABRIGHTNESS:
- ret = sonypi_read(SONYPI_CAMERA_BRIGHTNESS);
- break;
- case SONYPI_COMMAND_SETCAMERABRIGHTNESS:
- sonypi_set(SONYPI_CAMERA_BRIGHTNESS, value);
- break;
- case SONYPI_COMMAND_GETCAMERACONTRAST:
- ret = sonypi_read(SONYPI_CAMERA_CONTRAST);
- break;
- case SONYPI_COMMAND_SETCAMERACONTRAST:
- sonypi_set(SONYPI_CAMERA_CONTRAST, value);
- break;
- case SONYPI_COMMAND_GETCAMERAHUE:
- ret = sonypi_read(SONYPI_CAMERA_HUE);
- break;
- case SONYPI_COMMAND_SETCAMERAHUE:
- sonypi_set(SONYPI_CAMERA_HUE, value);
- break;
- case SONYPI_COMMAND_GETCAMERACOLOR:
- ret = sonypi_read(SONYPI_CAMERA_COLOR);
- break;
- case SONYPI_COMMAND_SETCAMERACOLOR:
- sonypi_set(SONYPI_CAMERA_COLOR, value);
- break;
- case SONYPI_COMMAND_GETCAMERASHARPNESS:
- ret = sonypi_read(SONYPI_CAMERA_SHARPNESS);
- break;
- case SONYPI_COMMAND_SETCAMERASHARPNESS:
- sonypi_set(SONYPI_CAMERA_SHARPNESS, value);
- break;
- case SONYPI_COMMAND_GETCAMERAPICTURE:
- ret = sonypi_read(SONYPI_CAMERA_PICTURE);
- break;
- case SONYPI_COMMAND_SETCAMERAPICTURE:
- sonypi_set(SONYPI_CAMERA_PICTURE, value);
- break;
- case SONYPI_COMMAND_GETCAMERAAGC:
- ret = sonypi_read(SONYPI_CAMERA_AGC);
- break;
- case SONYPI_COMMAND_SETCAMERAAGC:
- sonypi_set(SONYPI_CAMERA_AGC, value);
- break;
- case SONYPI_COMMAND_GETCAMERADIRECTION:
- ret = sonypi_read(SONYPI_CAMERA_STATUS);
- ret &= SONYPI_DIRECTION_BACKWARDS;
- break;
- case SONYPI_COMMAND_GETCAMERAROMVERSION:
- ret = sonypi_read(SONYPI_CAMERA_ROMVERSION);
- break;
- case SONYPI_COMMAND_GETCAMERAREVISION:
- ret = sonypi_read(SONYPI_CAMERA_REVISION);
- break;
+ switch (command) {
+ case SONYPI_COMMAND_GETCAMERA:
+ ret = sonypi_camera_ready();
+ break;
+ case SONYPI_COMMAND_SETCAMERA:
+ if (value)
+ sonypi_camera_on();
+ else
+ sonypi_camera_off();
+ break;
+ case SONYPI_COMMAND_GETCAMERABRIGHTNESS:
+ ret = sonypi_read(SONYPI_CAMERA_BRIGHTNESS);
+ break;
+ case SONYPI_COMMAND_SETCAMERABRIGHTNESS:
+ sonypi_set(SONYPI_CAMERA_BRIGHTNESS, value);
+ break;
+ case SONYPI_COMMAND_GETCAMERACONTRAST:
+ ret = sonypi_read(SONYPI_CAMERA_CONTRAST);
+ break;
+ case SONYPI_COMMAND_SETCAMERACONTRAST:
+ sonypi_set(SONYPI_CAMERA_CONTRAST, value);
+ break;
+ case SONYPI_COMMAND_GETCAMERAHUE:
+ ret = sonypi_read(SONYPI_CAMERA_HUE);
+ break;
+ case SONYPI_COMMAND_SETCAMERAHUE:
+ sonypi_set(SONYPI_CAMERA_HUE, value);
+ break;
+ case SONYPI_COMMAND_GETCAMERACOLOR:
+ ret = sonypi_read(SONYPI_CAMERA_COLOR);
+ break;
+ case SONYPI_COMMAND_SETCAMERACOLOR:
+ sonypi_set(SONYPI_CAMERA_COLOR, value);
+ break;
+ case SONYPI_COMMAND_GETCAMERASHARPNESS:
+ ret = sonypi_read(SONYPI_CAMERA_SHARPNESS);
+ break;
+ case SONYPI_COMMAND_SETCAMERASHARPNESS:
+ sonypi_set(SONYPI_CAMERA_SHARPNESS, value);
+ break;
+ case SONYPI_COMMAND_GETCAMERAPICTURE:
+ ret = sonypi_read(SONYPI_CAMERA_PICTURE);
+ break;
+ case SONYPI_COMMAND_SETCAMERAPICTURE:
+ sonypi_set(SONYPI_CAMERA_PICTURE, value);
+ break;
+ case SONYPI_COMMAND_GETCAMERAAGC:
+ ret = sonypi_read(SONYPI_CAMERA_AGC);
+ break;
+ case SONYPI_COMMAND_SETCAMERAAGC:
+ sonypi_set(SONYPI_CAMERA_AGC, value);
+ break;
+ case SONYPI_COMMAND_GETCAMERADIRECTION:
+ ret = sonypi_read(SONYPI_CAMERA_STATUS);
+ ret &= SONYPI_DIRECTION_BACKWARDS;
+ break;
+ case SONYPI_COMMAND_GETCAMERAROMVERSION:
+ ret = sonypi_read(SONYPI_CAMERA_ROMVERSION);
+ break;
+ case SONYPI_COMMAND_GETCAMERAREVISION:
+ ret = sonypi_read(SONYPI_CAMERA_REVISION);
+ break;
}
up(&sonypi_device.lock);
return ret;
@@ -497,7 +513,8 @@

EXPORT_SYMBOL(sonypi_camera_command);

-static int sonypi_misc_fasync(int fd, struct file *filp, int on) {
+static int sonypi_misc_fasync(int fd, struct file *filp, int on)
+{
int retval;

retval = fasync_helper(fd, filp, on, &sonypi_device.fifo_async);
@@ -506,7 +523,8 @@
return 0;
}

-static int sonypi_misc_release(struct inode * inode, struct file * file) {
+static int sonypi_misc_release(struct inode *inode, struct file *file)
+{
sonypi_misc_fasync(-1, file, 0);
down(&sonypi_device.lock);
sonypi_device.open_count--;
@@ -514,7 +532,8 @@
return 0;
}

-static int sonypi_misc_open(struct inode * inode, struct file * file) {
+static int sonypi_misc_open(struct inode *inode, struct file *file)
+{
down(&sonypi_device.lock);
/* Flush input queue on first open */
if (!sonypi_device.open_count)
@@ -524,8 +543,8 @@
return 0;
}

-static ssize_t sonypi_misc_read(struct file * file, char __user * buf,
- size_t count, loff_t *pos)
+static ssize_t sonypi_misc_read(struct file *file, char __user *buf,
+ size_t count, loff_t *pos)
{
ssize_t ret;
unsigned char c;
@@ -552,15 +571,17 @@
return ret;
}

-static unsigned int sonypi_misc_poll(struct file *file, poll_table * wait) {
+static unsigned int sonypi_misc_poll(struct file *file, poll_table *wait)
+{
poll_wait(file, &sonypi_device.fifo_proc_list, wait);
if (kfifo_len(sonypi_device.fifo))
return POLLIN | POLLRDNORM;
return 0;
}

-static int sonypi_misc_ioctl(struct inode *ip, struct file *fp,
- unsigned int cmd, unsigned long arg) {
+static int sonypi_misc_ioctl(struct inode *ip, struct file *fp,
+ unsigned int cmd, unsigned long arg)
+{
int ret = 0;
void __user *argp = (void __user *)arg;
u8 val8;
@@ -655,7 +676,9 @@
};

struct miscdevice sonypi_misc_device = {
- -1, "sonypi", &sonypi_misc_fops
+ .minor = -1,
+ .name = "sonypi",
+ .fops = &sonypi_misc_fops,
};

static void sonypi_enable(unsigned int camera_on)
@@ -755,18 +778,17 @@
init_waitqueue_head(&sonypi_device.fifo_proc_list);
init_MUTEX(&sonypi_device.lock);
sonypi_device.bluetooth_power = -1;
-
+
if (pcidev && pci_enable_device(pcidev)) {
printk(KERN_ERR "sonypi: pci_enable_device failed\n");
ret = -EIO;
- goto out1;
+ goto out_pcienable;
}

- sonypi_misc_device.minor = (minor == -1) ?
- MISC_DYNAMIC_MINOR : minor;
+ sonypi_misc_device.minor = (minor == -1) ? MISC_DYNAMIC_MINOR : minor;
if ((ret = misc_register(&sonypi_misc_device))) {
printk(KERN_ERR "sonypi: misc_register failed\n");
- goto out1;
+ goto out_miscreg;
}

if (sonypi_device.model == SONYPI_DEVICE_MODEL_TYPE2) {
@@ -774,8 +796,7 @@
sonypi_device.region_size = SONYPI_TYPE2_REGION_SIZE;
sonypi_device.evtype_offset = SONYPI_TYPE2_EVTYPE_OFFSET;
irq_list = sonypi_type2_irq_list;
- }
- else {
+ } else {
ioport_list = sonypi_type1_ioport_list;
sonypi_device.region_size = SONYPI_TYPE1_REGION_SIZE;
sonypi_device.evtype_offset = SONYPI_TYPE1_EVTYPE_OFFSET;
@@ -783,8 +804,8 @@
}

for (i = 0; ioport_list[i].port1; i++) {
- if (request_region(ioport_list[i].port1,
- sonypi_device.region_size,
+ if (request_region(ioport_list[i].port1,
+ sonypi_device.region_size,
"Sony Programable I/O Device")) {
/* get the ioport */
sonypi_device.ioport1 = ioport_list[i].port1;
@@ -795,7 +816,7 @@
if (!sonypi_device.ioport1) {
printk(KERN_ERR "sonypi: request_region failed\n");
ret = -ENODEV;
- goto out2;
+ goto out_reqreg;
}

for (i = 0; irq_list[i].irq; i++) {
@@ -811,18 +832,19 @@
if (!irq_list[i].irq) {
printk(KERN_ERR "sonypi: request_irq failed\n");
ret = -ENODEV;
- goto out3;
+ goto out_reqirq;
}

if (useinput) {
/* Initialize the Input Drivers: jogdial */
int i;
- sonypi_device.input_jog_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
+ sonypi_device.input_jog_dev.evbit[0] =
+ BIT(EV_KEY) | BIT(EV_REL);
sonypi_device.input_jog_dev.keybit[LONG(BTN_MOUSE)] =
BIT(BTN_MIDDLE);
sonypi_device.input_jog_dev.relbit[0] = BIT(REL_WHEEL);
sonypi_device.input_jog_dev.name =
- (char *) kmalloc(sizeof(SONYPI_JOG_INPUTNAME), GFP_KERNEL);
+ kmalloc(sizeof(SONYPI_JOG_INPUTNAME), GFP_KERNEL);
if (!sonypi_device.input_jog_dev.name) {
printk(KERN_ERR "sonypi: kmalloc failed\n");
ret = -ENOMEM;
@@ -843,7 +865,7 @@
set_bit(sonypi_inputkeys[i].inputev,
sonypi_device.input_key_dev.keybit);
sonypi_device.input_key_dev.name =
- (char *) kmalloc(sizeof(SONYPI_KEY_INPUTNAME), GFP_KERNEL);
+ kmalloc(sizeof(SONYPI_KEY_INPUTNAME), GFP_KERNEL);
if (!sonypi_device.input_key_dev.name) {
printk(KERN_ERR "sonypi: kmalloc failed\n");
ret = -ENOMEM;
@@ -879,8 +901,8 @@

sonypi_enable(0);

- printk(KERN_INFO "sonypi: Sony Programmable I/O Controller Driver v%s.\n",
- SONYPI_DRIVER_VERSION);
+ printk(KERN_INFO "sonypi: Sony Programmable I/O Controller Driver"
+ "v%s.\n", SONYPI_DRIVER_VERSION);
printk(KERN_INFO "sonypi: detected %s model, "
"verbose = %d, fnkeyinit = %s, camera = %s, "
"compat = %s, mask = 0x%08lx, useinput = %s, acpi = %s\n",
@@ -894,7 +916,7 @@
useinput ? "on" : "off",
SONYPI_ACPI_ACTIVE ? "on" : "off");
printk(KERN_INFO "sonypi: enabled at irq=%d, port1=0x%x, port2=0x%x\n",
- sonypi_device.irq,
+ sonypi_device.irq,
sonypi_device.ioport1, sonypi_device.ioport2);

if (minor == -1)
@@ -913,11 +935,14 @@
kfree(sonypi_device.input_jog_dev.name);
out_inkmallocinput1:
free_irq(sonypi_device.irq, sonypi_irq);
-out3:
+out_reqirq:
release_region(sonypi_device.ioport1, sonypi_device.region_size);
-out2:
+out_reqreg:
misc_deregister(&sonypi_misc_device);
-out1:
+out_miscreg:
+ if (pcidev)
+ pci_disable_device(pcidev);
+out_pcienable:
kfifo_free(sonypi_device.fifo);
out_fifo:
pci_dev_put(sonypi_device.dev);
diff -Nru a/drivers/char/sonypi.h b/drivers/char/sonypi.h
--- a/drivers/char/sonypi.h 2004-10-28 11:18:59 +02:00
+++ b/drivers/char/sonypi.h 2004-10-28 11:18:59 +02:00
@@ -1,7 +1,7 @@
-/*
+/*
* Sony Programmable I/O Control Device driver for VAIO
*
- * Copyright (C) 2001-2003 Stelian Pop <[email protected]>
+ * Copyright (C) 2001-2004 Stelian Pop <[email protected]>
*
* Copyright (C) 2001-2002 Alc?ve <http://www.alcove.com>
*
@@ -14,24 +14,24 @@
* Copyright (C) 2000 Andrew Tridgell <[email protected]>
*
* Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras.
- *
+ *
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/

-#ifndef _SONYPI_PRIV_H_
+#ifndef _SONYPI_PRIV_H_
#define _SONYPI_PRIV_H_

#ifdef __KERNEL__
@@ -424,8 +424,8 @@
#define SONYPI_ACPI_ACTIVE (!acpi_disabled)
#else
#define SONYPI_ACPI_ACTIVE 0
-#endif /* CONFIG_ACPI */
+#endif /* CONFIG_ACPI */

-#endif /* __KERNEL__ */
+#endif /* __KERNEL__ */

-#endif /* _SONYPI_PRIV_H_ */
+#endif /* _SONYPI_PRIV_H_ */
diff -Nru a/include/linux/sonypi.h b/include/linux/sonypi.h
--- a/include/linux/sonypi.h 2004-10-28 11:18:59 +02:00
+++ b/include/linux/sonypi.h 2004-10-28 11:18:59 +02:00
@@ -1,7 +1,7 @@
-/*
+/*
* Sony Programmable I/O Control Device driver for VAIO
*
- * Copyright (C) 2001-2003 Stelian Pop <[email protected]>
+ * Copyright (C) 2001-2004 Stelian Pop <[email protected]>
*
* Copyright (C) 2001-2002 Alc?ve <http://www.alcove.com>
*
@@ -14,24 +14,24 @@
* Copyright (C) 2000 Andrew Tridgell <[email protected]>
*
* Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras.
- *
+ *
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/

-#ifndef _SONYPI_H_
+#ifndef _SONYPI_H_
#define _SONYPI_H_

#include <linux/types.h>
@@ -144,6 +144,6 @@

u8 sonypi_camera_command(int command, u8 value);

-#endif /* __KERNEL__ */
+#endif /* __KERNEL__ */

-#endif /* _SONYPI_H_ */
+#endif /* _SONYPI_H_ */

2004-10-29 10:11:42

by Pavel Machek

[permalink] [raw]
Subject: Re: [PATCH 4/8] sonypi: rework input support

Hi!

> +/* Correspondance table between sonypi events and input layer events */
> +struct {
> + int sonypiev;
> + int inputev;
> +} sonypi_inputkeys[] = {
> + { SONYPI_EVENT_CAPTURE_PRESSED, KEY_CAMERA },
> + { SONYPI_EVENT_FNKEY_ONLY, KEY_FN },
> + { SONYPI_EVENT_FNKEY_ESC, KEY_FN_ESC },
> + { SONYPI_EVENT_FNKEY_F1, KEY_FN_F1 },
> + { SONYPI_EVENT_FNKEY_F2, KEY_FN_F2 },
> + { SONYPI_EVENT_FNKEY_F3, KEY_FN_F3 },
> + { SONYPI_EVENT_FNKEY_F4, KEY_FN_F4 },
> + { SONYPI_EVENT_FNKEY_F5, KEY_FN_F5 },
> + { SONYPI_EVENT_FNKEY_F6, KEY_FN_F6 },
> + { SONYPI_EVENT_FNKEY_F7, KEY_FN_F7 },
> + { SONYPI_EVENT_FNKEY_F8, KEY_FN_F8 },
> + { SONYPI_EVENT_FNKEY_F9, KEY_FN_F9 },
> + { SONYPI_EVENT_FNKEY_F10, KEY_FN_F10 },
> + { SONYPI_EVENT_FNKEY_F11, KEY_FN_F11 },
> + { SONYPI_EVENT_FNKEY_F12, KEY_FN_F12 },
> + { SONYPI_EVENT_FNKEY_1, KEY_FN_1 },
> + { SONYPI_EVENT_FNKEY_2, KEY_FN_2 },
> + { SONYPI_EVENT_FNKEY_D, KEY_FN_D },
> + { SONYPI_EVENT_FNKEY_E, KEY_FN_E },
> + { SONYPI_EVENT_FNKEY_F, KEY_FN_F },
> + { SONYPI_EVENT_FNKEY_S, KEY_FN_S },
> + { SONYPI_EVENT_FNKEY_B, KEY_FN_B },
> + { SONYPI_EVENT_BLUETOOTH_PRESSED, KEY_BLUE },
> + { SONYPI_EVENT_BLUETOOTH_ON, KEY_BLUE },
> + { SONYPI_EVENT_PKEY_P1, KEY_PROG1 },
> + { SONYPI_EVENT_PKEY_P2, KEY_PROG2 },
> + { SONYPI_EVENT_PKEY_P3, KEY_PROG3 },
> + { SONYPI_EVENT_BACK_PRESSED, KEY_BACK },
> + { SONYPI_EVENT_HELP_PRESSED, KEY_HELP },
> + { SONYPI_EVENT_ZOOM_PRESSED, KEY_ZOOM },
> + { SONYPI_EVENT_THUMBPHRASE_PRESSED, BTN_THUMB },
> + { 0, 0 },
> +};
>

KEY_FN_D does not sound too usefull (similar for FN_F1..FN_F12). Are
there some pictures on those keys? Mapping FN_F3 to for example
KEY_SUSPEND would be usefull...
Pavel
--
People were complaining that M$ turns users into beta-testers...
...jr ghea gurz vagb qrirybcref, naq gurl frrz gb yvxr vg gung jnl!

2004-10-29 10:41:38

by Stelian Pop

[permalink] [raw]
Subject: Re: [PATCH 4/8] sonypi: rework input support

On Fri, Oct 29, 2004 at 12:10:50PM +0200, Pavel Machek wrote:

> > + { SONYPI_EVENT_FNKEY_F1, KEY_FN_F1 },
> > + { SONYPI_EVENT_FNKEY_F2, KEY_FN_F2 },
> > + { SONYPI_EVENT_FNKEY_F3, KEY_FN_F3 },
[...]

> KEY_FN_D does not sound too usefull (similar for FN_F1..FN_F12). Are
> there some pictures on those keys?

Some of them have pictures (Fn-Esc for suspend to ram, Fn-F12 for
suspend to disk, Fn-F3 for mute, Fn-F4 for launching the volume
controls, Fn-F5 for launching the brightness controls, Fn-F7/F8 for
changing from LCD to external monitor or TV). All the others have
no pictures on them.

> Mapping FN_F3 to for example
> KEY_SUSPEND would be usefull...

This sound like policy to me and should not be done into the
kernel but somewhere you can configure it, like in a keyboard
keymap or something like that.

Stelian.
--
Stelian Pop <[email protected]>

2004-10-31 11:48:46

by Pavel Machek

[permalink] [raw]
Subject: Re: [PATCH 4/8] sonypi: rework input support

Hi!

> > > + { SONYPI_EVENT_FNKEY_F1, KEY_FN_F1 },
> > > + { SONYPI_EVENT_FNKEY_F2, KEY_FN_F2 },
> > > + { SONYPI_EVENT_FNKEY_F3, KEY_FN_F3 },
> [...]
>
> > KEY_FN_D does not sound too usefull (similar for FN_F1..FN_F12). Are
> > there some pictures on those keys?
>
> Some of them have pictures (Fn-Esc for suspend to ram, Fn-F12 for
> suspend to disk, Fn-F3 for mute, Fn-F4 for launching the volume
> controls, Fn-F5 for launching the brightness controls, Fn-F7/F8 for
> changing from LCD to external monitor or TV). All the others have
> no pictures on them.

In such case I'd assign meaningfull events at least to keys with
labels?

> > Mapping FN_F3 to for example
> > KEY_SUSPEND would be usefull...
>
> This sound like policy to me and should not be done into the
> kernel but somewhere you can configure it, like in a keyboard
> keymap or something like that.

Eh? You are basically doing arbitrary mapping between sony events to
linux keycodes. You might as well make the mapping usefull while you
are at it.
Pavel
--
People were complaining that M$ turns users into beta-testers...
...jr ghea gurz vagb qrirybcref, naq gurl frrz gb yvxr vg gung jnl!