[PATCH] isdn4linux: Siemens Gigaset drivers: sysfs usage
authorTilman Schmidt <tilman@imap.cc>
Tue, 11 Apr 2006 05:55:07 +0000 (22:55 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Tue, 11 Apr 2006 13:18:49 +0000 (06:18 -0700)
With Hansjoerg Lipp <hjlipp@web.de>

Correct the way the Gigaset drivers create their sysfs entries.

Signed-off-by: Hansjoerg Lipp <hjlipp@web.de>
Signed-off-by: Tilman Schmidt <tilman@imap.cc>
Cc: Karsten Keil <kkeil@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/isdn/gigaset/bas-gigaset.c
drivers/isdn/gigaset/common.c
drivers/isdn/gigaset/gigaset.h
drivers/isdn/gigaset/proc.c
drivers/isdn/gigaset/usb-gigaset.c

index 580831d9dba16f616e003b628e5d39e70848d988..1cf48cfad1de5ae7ecaae3105b77385f54bcba77 100644 (file)
@@ -2217,7 +2217,7 @@ static int gigaset_probe(struct usb_interface *interface,
        usb_get_dev(udev);
        ucs->udev = udev;
        ucs->interface = interface;
-       cs->dev = &udev->dev;
+       cs->dev = &interface->dev;
 
        /* allocate URBs:
         * - one for the interrupt pipe
@@ -2289,14 +2289,13 @@ static int gigaset_probe(struct usb_interface *interface,
        /* tell common part that the device is ready */
        if (startmode == SM_LOCKED)
                atomic_set(&cs->mstate, MS_LOCKED);
-       if (!gigaset_start(cs))
-               goto error;
 
        /* save address of controller structure */
        usb_set_intfdata(interface, cs);
 
-       /* set up device sysfs */
-       gigaset_init_dev_sysfs(interface);
+       if (!gigaset_start(cs))
+               goto error;
+
        return 0;
 
 error:
@@ -2313,23 +2312,24 @@ static void gigaset_disconnect(struct usb_interface *interface)
        struct cardstate *cs;
        struct bas_cardstate *ucs;
 
-       /* clear device sysfs */
-       gigaset_free_dev_sysfs(interface);
-
        cs = usb_get_intfdata(interface);
-       usb_set_intfdata(interface, NULL);
 
        IFNULLRET(cs);
        ucs = cs->hw.bas;
        IFNULLRET(ucs);
 
-       dev_info(cs->dev, "disconnecting GigaSet base");
+       dev_info(cs->dev, "disconnecting Gigaset base\n");
        gigaset_stop(cs);
        freeurbs(cs);
+       usb_set_intfdata(interface, NULL);
        kfree(ucs->rcvbuf);
        ucs->rcvbuf = NULL;
        ucs->rcvbuf_size = 0;
        atomic_set(&ucs->basstate, 0);
+       usb_put_dev(ucs->udev);
+       ucs->interface = NULL;
+       ucs->udev = NULL;
+       cs->dev = NULL;
        gigaset_unassign(cs);
 }
 
index fb5cf703133fbfeae74536e98f68980cf839f5b9..2ea4976aa02a63e4711acefdda2acc41cfcbcab1 100644 (file)
@@ -833,6 +833,9 @@ int gigaset_start(struct cardstate *cs)
 
        wait_event(cs->waitqueue, !cs->waiting);
 
+       /* set up device sysfs */
+       gigaset_init_dev_sysfs(cs);
+
        up(&cs->sem);
        return 1;
 
@@ -882,6 +885,9 @@ void gigaset_stop(struct cardstate *cs)
 {
        down(&cs->sem);
 
+       /* clear device sysfs */
+       gigaset_free_dev_sysfs(cs);
+
        atomic_set(&cs->connected, 0);
 
        cs->waiting = 1;
index d77588de7eb7473c6e56301674397e25bea8d156..04457571923d15e892739ca032e0b015d019bd1a 100644 (file)
@@ -778,8 +778,8 @@ void gigaset_handle_modem_response(struct cardstate *cs);
  */
 
 /* initialize sysfs for device */
-void gigaset_init_dev_sysfs(struct usb_interface *interface);
-void gigaset_free_dev_sysfs(struct usb_interface *interface);
+void gigaset_init_dev_sysfs(struct cardstate *cs);
+void gigaset_free_dev_sysfs(struct cardstate *cs);
 
 /* ===========================================================================
  *  Functions implemented in common.c/gigaset.h
index 695495ad0668273efa6313ffa53721b6c60b128b..912fed6707423a4b423f3c9e21df2fc03eb8137f 100644 (file)
 static ssize_t show_cidmode(struct device *dev, struct device_attribute *attr,
                            char *buf)
 {
-       struct usb_interface *intf = to_usb_interface(dev);
-       struct cardstate *cs = usb_get_intfdata(intf);
+       struct cardstate *cs = dev_get_drvdata(dev);
        return sprintf(buf, "%d\n", atomic_read(&cs->cidmode));
 }
 
 static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr,
                           const char *buf, size_t count)
 {
-       struct usb_interface *intf = to_usb_interface(dev);
-       struct cardstate *cs = usb_get_intfdata(intf);
+       struct cardstate *cs = dev_get_drvdata(dev);
        long int value;
        char *end;
 
@@ -63,17 +61,15 @@ static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr,
 static DEVICE_ATTR(cidmode, S_IRUGO|S_IWUSR, show_cidmode, set_cidmode);
 
 /* free sysfs for device */
-void gigaset_free_dev_sysfs(struct usb_interface *interface)
+void gigaset_free_dev_sysfs(struct cardstate *cs)
 {
        gig_dbg(DEBUG_INIT, "removing sysfs entries");
-       device_remove_file(&interface->dev, &dev_attr_cidmode);
+       device_remove_file(cs->dev, &dev_attr_cidmode);
 }
-EXPORT_SYMBOL_GPL(gigaset_free_dev_sysfs);
 
 /* initialize sysfs for device */
-void gigaset_init_dev_sysfs(struct usb_interface *interface)
+void gigaset_init_dev_sysfs(struct cardstate *cs)
 {
        gig_dbg(DEBUG_INIT, "setting up sysfs");
-       device_create_file(&interface->dev, &dev_attr_cidmode);
+       device_create_file(cs->dev, &dev_attr_cidmode);
 }
-EXPORT_SYMBOL_GPL(gigaset_init_dev_sysfs);
index f09d821b6e89113bbe35e1fdfd8c79a29dc2a3d1..a977dd5707516c1e8d3ac30b7d596eb3f5b12a43 100644 (file)
@@ -748,7 +748,10 @@ static int gigaset_probe(struct usb_interface *interface,
        usb_get_dev(udev);
        ucs->udev = udev;
        ucs->interface = interface;
-       cs->dev = &udev->dev;
+       cs->dev = &interface->dev;
+
+       /* save address of controller structure */
+       usb_set_intfdata(interface, cs); // dev_set_drvdata(&interface->dev, cs);
 
        endpoint = &hostif->endpoint[0].desc;
 
@@ -805,17 +808,12 @@ static int gigaset_probe(struct usb_interface *interface,
        /* tell common part that the device is ready */
        if (startmode == SM_LOCKED)
                atomic_set(&cs->mstate, MS_LOCKED);
+
        if (!gigaset_start(cs)) {
                tasklet_kill(&cs->write_tasklet);
                retval = -ENODEV; //FIXME
                goto error;
        }
-
-       /* save address of controller structure */
-       usb_set_intfdata(interface, cs);
-
-       /* set up device sysfs */
-       gigaset_init_dev_sysfs(interface);
        return 0;
 
 error:
@@ -827,6 +825,7 @@ error:
        kfree(cs->inbuf[0].rcvbuf);
        if (ucs->read_urb != NULL)
                usb_free_urb(ucs->read_urb);
+       usb_set_intfdata(interface, NULL);
        ucs->read_urb = ucs->bulk_out_urb = NULL;
        cs->inbuf[0].rcvbuf = ucs->bulk_out_buffer = NULL;
        usb_put_dev(ucs->udev);
@@ -845,16 +844,12 @@ static void gigaset_disconnect(struct usb_interface *interface)
        struct usb_cardstate *ucs;
 
        cs = usb_get_intfdata(interface);
-
-       /* clear device sysfs */
-       gigaset_free_dev_sysfs(interface);
-
-       usb_set_intfdata(interface, NULL);
        ucs = cs->hw.usb;
        usb_kill_urb(ucs->read_urb);
 
        gigaset_stop(cs);
 
+       usb_set_intfdata(interface, NULL);
        tasklet_kill(&cs->write_tasklet);
 
        usb_kill_urb(ucs->bulk_out_urb);        /* FIXME: only if active? */
@@ -868,6 +863,10 @@ static void gigaset_disconnect(struct usb_interface *interface)
        ucs->read_urb = ucs->bulk_out_urb = NULL;
        cs->inbuf[0].rcvbuf = ucs->bulk_out_buffer = NULL;
 
+       usb_put_dev(ucs->udev);
+       ucs->interface = NULL;
+       ucs->udev = NULL;
+       cs->dev = NULL;
        gigaset_unassign(cs);
 }