#include <linux/init.h>
#include <linux/major.h>
#include <linux/device.h>
-#include <linux/devfs_fs_kernel.h>
#include <linux/miscdevice.h>
#include <linux/wait.h>
+#include <linux/mutex.h>
#define DRIVER_DESC "Raw serio driver"
struct list_head node;
};
-static DECLARE_MUTEX(serio_raw_sem);
+static DEFINE_MUTEX(serio_raw_mutex);
static LIST_HEAD(serio_raw_list);
static unsigned int serio_raw_no;
struct serio_raw_list *list;
int retval = 0;
- retval = down_interruptible(&serio_raw_sem);
+ retval = mutex_lock_interruptible(&serio_raw_mutex);
if (retval)
return retval;
goto out;
}
- if (!(list = kmalloc(sizeof(struct serio_raw_list), GFP_KERNEL))) {
+ if (!(list = kzalloc(sizeof(struct serio_raw_list), GFP_KERNEL))) {
retval = -ENOMEM;
goto out;
}
- memset(list, 0, sizeof(struct serio_raw_list));
list->serio_raw = serio_raw;
file->private_data = list;
list_add_tail(&list->node, &serio_raw->list);
out:
- up(&serio_raw_sem);
+ mutex_unlock(&serio_raw_mutex);
return retval;
}
struct serio_raw_list *list = file->private_data;
struct serio_raw *serio_raw = list->serio_raw;
- down(&serio_raw_sem);
+ mutex_lock(&serio_raw_mutex);
serio_raw_fasync(-1, file, 0);
serio_raw_cleanup(serio_raw);
- up(&serio_raw_sem);
+ mutex_unlock(&serio_raw_mutex);
return 0;
}
int retval;
unsigned char c;
- retval = down_interruptible(&serio_raw_sem);
+ retval = mutex_lock_interruptible(&serio_raw_mutex);
if (retval)
return retval;
};
out:
- up(&serio_raw_sem);
+ mutex_unlock(&serio_raw_mutex);
return written;
}
return 0;
}
-struct file_operations serio_raw_fops = {
+static struct file_operations serio_raw_fops = {
.owner = THIS_MODULE,
.open = serio_raw_open,
.release = serio_raw_release,
*********************************************************************/
static irqreturn_t serio_raw_interrupt(struct serio *serio, unsigned char data,
- unsigned int dfl, struct pt_regs *regs)
+ unsigned int dfl)
{
- struct serio_raw *serio_raw = serio->private;
+ struct serio_raw *serio_raw = serio_get_drvdata(serio);
struct serio_raw_list *list;
unsigned int head = serio_raw->head;
return IRQ_HANDLED;
}
-static void serio_raw_connect(struct serio *serio, struct serio_driver *drv)
+static int serio_raw_connect(struct serio *serio, struct serio_driver *drv)
{
struct serio_raw *serio_raw;
int err;
- if ((serio->type & SERIO_TYPE) != SERIO_8042)
- return;
-
- if (!(serio_raw = kmalloc(sizeof(struct serio_raw), GFP_KERNEL))) {
+ if (!(serio_raw = kzalloc(sizeof(struct serio_raw), GFP_KERNEL))) {
printk(KERN_ERR "serio_raw.c: can't allocate memory for a device\n");
- return;
+ return -ENOMEM;
}
- down(&serio_raw_sem);
+ mutex_lock(&serio_raw_mutex);
- memset(serio_raw, 0, sizeof(struct serio_raw));
snprintf(serio_raw->name, sizeof(serio_raw->name), "serio_raw%d", serio_raw_no++);
serio_raw->refcnt = 1;
serio_raw->serio = serio;
INIT_LIST_HEAD(&serio_raw->list);
init_waitqueue_head(&serio_raw->wait);
- serio->private = serio_raw;
- if (serio_open(serio, drv))
+ serio_set_drvdata(serio, serio_raw);
+
+ err = serio_open(serio, drv);
+ if (err)
goto out_free;
list_add_tail(&serio_raw->node, &serio_raw_list);
serio_raw->dev.minor = PSMOUSE_MINOR;
serio_raw->dev.name = serio_raw->name;
+ serio_raw->dev.parent = &serio->dev;
serio_raw->dev.fops = &serio_raw_fops;
err = misc_register(&serio_raw->dev);
serio_close(serio);
list_del_init(&serio_raw->node);
out_free:
- serio->private = NULL;
+ serio_set_drvdata(serio, NULL);
kfree(serio_raw);
out:
- up(&serio_raw_sem);
+ mutex_unlock(&serio_raw_mutex);
+ return err;
}
static int serio_raw_reconnect(struct serio *serio)
{
- struct serio_raw *serio_raw = serio->private;
+ struct serio_raw *serio_raw = serio_get_drvdata(serio);
struct serio_driver *drv = serio->drv;
if (!drv || !serio_raw) {
{
struct serio_raw *serio_raw;
- down(&serio_raw_sem);
+ mutex_lock(&serio_raw_mutex);
- serio_raw = serio->private;
+ serio_raw = serio_get_drvdata(serio);
serio_close(serio);
- serio->private = NULL;
+ serio_set_drvdata(serio, NULL);
serio_raw->serio = NULL;
if (!serio_raw_cleanup(serio_raw))
wake_up_interruptible(&serio_raw->wait);
- up(&serio_raw_sem);
+ mutex_unlock(&serio_raw_mutex);
}
+static struct serio_device_id serio_raw_serio_ids[] = {
+ {
+ .type = SERIO_8042,
+ .proto = SERIO_ANY,
+ .id = SERIO_ANY,
+ .extra = SERIO_ANY,
+ },
+ { 0 }
+};
+
+MODULE_DEVICE_TABLE(serio, serio_raw_serio_ids);
+
static struct serio_driver serio_raw_drv = {
.driver = {
.name = "serio_raw",
},
.description = DRIVER_DESC,
+ .id_table = serio_raw_serio_ids,
.interrupt = serio_raw_interrupt,
.connect = serio_raw_connect,
.reconnect = serio_raw_reconnect,
.manual_bind = 1,
};
-int __init serio_raw_init(void)
+static int __init serio_raw_init(void)
{
- serio_register_driver(&serio_raw_drv);
- return 0;
+ return serio_register_driver(&serio_raw_drv);
}
-void __exit serio_raw_exit(void)
+static void __exit serio_raw_exit(void)
{
serio_unregister_driver(&serio_raw_drv);
}