[PATCH] i4l gigaset: move sysfs entry to tty class device
authorHansjoerg Lipp <hjlipp@web.de>
Sat, 22 Apr 2006 16:43:00 +0000 (18:43 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 21 Jun 2006 19:40:47 +0000 (12:40 -0700)
Using the class device pointer returned by tty_register_device() with
part 1 of the patch, attach the Gigaset drivers' "cidmode" sysfs entry
to its tty class device, where it can be found more easily by users
who do not know nor care which USB port the device is attached to.

Signed-off-by: Hansjoerg Lipp <hjlipp@web.de>
Signed-off-by: Tilman Schmidt <tilman@imap.cc>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Documentation/isdn/README.gigaset
drivers/isdn/gigaset/common.c
drivers/isdn/gigaset/gigaset.h
drivers/isdn/gigaset/interface.c
drivers/isdn/gigaset/proc.c

index 85a64defd3856eb24e97540d07f40dfae2c6b5f0..fa0d4cca964acc1ff3cc73a342ef9c3592ca3322 100644 (file)
@@ -124,7 +124,8 @@ GigaSet 307x Device Driver
 
      You can use some configuration tool of your distribution to configure this
      "modem" or configure pppd/wvdial manually. There are some example ppp
-     configuration files and chat scripts in the gigaset-VERSION/ppp directory.
+     configuration files and chat scripts in the gigaset-VERSION/ppp directory
+     in the driver packages from http://sourceforge.net/projects/gigaset307x/.
      Please note that the USB drivers are not able to change the state of the
      control lines (the M105 driver can be configured to use some undocumented
      control requests, if you really need the control lines, though). This means
@@ -164,8 +165,8 @@ GigaSet 307x Device Driver
 
      If you want both of these at once, you are out of luck.
 
-     You can also use /sys/module/<name>/parameters/cidmode for changing
-     the CID mode setting (<name> is usb_gigaset or bas_gigaset).
+     You can also use /sys/class/tty/ttyGxy/cidmode for changing the CID mode
+     setting (ttyGxy is ttyGU0 or ttyGB0).
 
 
 3.   Troubleshooting
index e55767b2ccd3cc8d3f8fab741aec3e37a900b8bf..acb7e2656780274cd32fc8f4e170f234c3357bc4 100644 (file)
@@ -460,6 +460,9 @@ void gigaset_freecs(struct cardstate *cs)
 
        switch (cs->cs_init) {
        default:
+               /* clear device sysfs */
+               gigaset_free_dev_sysfs(cs);
+
                gigaset_if_free(cs);
 
                gig_dbg(DEBUG_INIT, "clearing hw");
@@ -699,6 +702,7 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
        cs->open_count = 0;
        cs->dev = NULL;
        cs->tty = NULL;
+       cs->class = NULL;
        cs->cidmode = cidmode != 0;
 
        //if(onechannel) { //FIXME
@@ -760,6 +764,9 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
 
        gigaset_if_init(cs);
 
+       /* set up device sysfs */
+       gigaset_init_dev_sysfs(cs);
+
        spin_lock_irqsave(&cs->lock, flags);
        cs->running = 1;
        spin_unlock_irqrestore(&cs->lock, flags);
@@ -902,9 +909,6 @@ int gigaset_start(struct cardstate *cs)
 
        wait_event(cs->waitqueue, !cs->waiting);
 
-       /* set up device sysfs */
-       gigaset_init_dev_sysfs(cs);
-
        mutex_unlock(&cs->mutex);
        return 1;
 
@@ -969,9 +973,6 @@ void gigaset_stop(struct cardstate *cs)
                //FIXME
        }
 
-       /* clear device sysfs */
-       gigaset_free_dev_sysfs(cs);
-
        cleanup_cs(cs);
 
 exit:
index 22b9693f7c0a1623d007d77b492fb746cb32d157..8d63d822104fb53bad713ede2175016f800dba4f 100644 (file)
@@ -445,6 +445,7 @@ struct cardstate {
        struct gigaset_driver *driver;
        unsigned minor_index;
        struct device *dev;
+       struct class_device *class;
 
        const struct gigaset_ops *ops;
 
index 08e4c4eea14d985ecc186e99cc434f76b1334faf..74fd234956c8949ac2042161b9254456c87b0dda 100644 (file)
@@ -625,7 +625,14 @@ void gigaset_if_init(struct cardstate *cs)
                return;
 
        tasklet_init(&cs->if_wake_tasklet, &if_wake, (unsigned long) cs);
-       tty_register_device(drv->tty, cs->minor_index, NULL);
+       cs->class = tty_register_device(drv->tty, cs->minor_index, NULL);
+
+       if (!IS_ERR(cs->class))
+               class_set_devdata(cs->class, cs);
+       else {
+               warn("could not register device to the tty subsystem");
+               cs->class = NULL;
+       }
 }
 
 void gigaset_if_free(struct cardstate *cs)
@@ -638,6 +645,7 @@ void gigaset_if_free(struct cardstate *cs)
 
        tasklet_disable(&cs->if_wake_tasklet);
        tasklet_kill(&cs->if_wake_tasklet);
+       cs->class = NULL;
        tty_unregister_device(drv->tty, cs->minor_index);
 }
 
index d267a636b53c63cbd9558b73e57474248d5f9a16..9ae3a7f3e7b3724982ce68bc75a37ae215766a6a 100644 (file)
 #include "gigaset.h"
 #include <linux/ctype.h>
 
-static ssize_t show_cidmode(struct device *dev, struct device_attribute *attr,
-                           char *buf)
+static ssize_t show_cidmode(struct class_device *class, char *buf)
 {
        int ret;
        unsigned long flags;
-       struct cardstate *cs = dev_get_drvdata(dev);
+       struct cardstate *cs = class_get_devdata(class);
 
        spin_lock_irqsave(&cs->lock, flags);
        ret = sprintf(buf, "%u\n", cs->cidmode);
@@ -30,10 +29,10 @@ static ssize_t show_cidmode(struct device *dev, struct device_attribute *attr,
        return ret;
 }
 
-static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr,
+static ssize_t set_cidmode(struct class_device *class,
                           const char *buf, size_t count)
 {
-       struct cardstate *cs = dev_get_drvdata(dev);
+       struct cardstate *cs = class_get_devdata(class);
        long int value;
        char *end;
 
@@ -65,18 +64,24 @@ static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr,
        return count;
 }
 
-static DEVICE_ATTR(cidmode, S_IRUGO|S_IWUSR, show_cidmode, set_cidmode);
+static CLASS_DEVICE_ATTR(cidmode, S_IRUGO|S_IWUSR, show_cidmode, set_cidmode);
 
 /* free sysfs for device */
 void gigaset_free_dev_sysfs(struct cardstate *cs)
 {
+       if (!cs->class)
+               return;
+
        gig_dbg(DEBUG_INIT, "removing sysfs entries");
-       device_remove_file(cs->dev, &dev_attr_cidmode);
+       class_device_remove_file(cs->class, &class_device_attr_cidmode);
 }
 
 /* initialize sysfs for device */
 void gigaset_init_dev_sysfs(struct cardstate *cs)
 {
+       if (!cs->class)
+               return;
+
        gig_dbg(DEBUG_INIT, "setting up sysfs");
-       device_create_file(cs->dev, &dev_attr_cidmode);
+       class_device_create_file(cs->class, &class_device_attr_cidmode);
 }