Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1d47464 authored by Tilman Schmidt's avatar Tilman Schmidt Committed by Linus Torvalds
Browse files

[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: default avatarHansjoerg Lipp <hjlipp@web.de>
Signed-off-by: default avatarTilman Schmidt <tilman@imap.cc>
Cc: Karsten Keil <kkeil@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 784d5858
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -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);
}

+6 −0
Original line number Diff line number Diff line
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -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
+6 −10
Original line number Diff line number Diff line
@@ -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);
+11 −12
Original line number Diff line number Diff line
@@ -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 @@ static int gigaset_probe(struct usb_interface *interface,
	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);
}