[PATCH] isdn4linux: Siemens Gigaset drivers: sysfs usage
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>
This commit is contained in:
Родитель
784d5858aa
Коммит
b1d47464c9
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -19,16 +19,14 @@
|
|||
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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче