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>
You can use some configuration tool of your distribution to configure this
"modem" or configure pppd/wvdial manually. There are some example ppp
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
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
If you want both of these at once, you are out of luck.
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).
switch (cs->cs_init) {
default:
switch (cs->cs_init) {
default:
+ /* clear device sysfs */
+ gigaset_free_dev_sysfs(cs);
+
gigaset_if_free(cs);
gig_dbg(DEBUG_INIT, "clearing hw");
gigaset_if_free(cs);
gig_dbg(DEBUG_INIT, "clearing hw");
cs->open_count = 0;
cs->dev = NULL;
cs->tty = NULL;
cs->open_count = 0;
cs->dev = NULL;
cs->tty = NULL;
cs->cidmode = cidmode != 0;
//if(onechannel) { //FIXME
cs->cidmode = cidmode != 0;
//if(onechannel) { //FIXME
+ /* set up device sysfs */
+ gigaset_init_dev_sysfs(cs);
+
spin_lock_irqsave(&cs->lock, flags);
cs->running = 1;
spin_unlock_irqrestore(&cs->lock, flags);
spin_lock_irqsave(&cs->lock, flags);
cs->running = 1;
spin_unlock_irqrestore(&cs->lock, flags);
wait_event(cs->waitqueue, !cs->waiting);
wait_event(cs->waitqueue, !cs->waiting);
- /* set up device sysfs */
- gigaset_init_dev_sysfs(cs);
-
mutex_unlock(&cs->mutex);
return 1;
mutex_unlock(&cs->mutex);
return 1;
- /* clear device sysfs */
- gigaset_free_dev_sysfs(cs);
-
struct gigaset_driver *driver;
unsigned minor_index;
struct device *dev;
struct gigaset_driver *driver;
unsigned minor_index;
struct device *dev;
+ struct class_device *class;
const struct gigaset_ops *ops;
const struct gigaset_ops *ops;
return;
tasklet_init(&cs->if_wake_tasklet, &if_wake, (unsigned long) 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)
}
void gigaset_if_free(struct cardstate *cs)
tasklet_disable(&cs->if_wake_tasklet);
tasklet_kill(&cs->if_wake_tasklet);
tasklet_disable(&cs->if_wake_tasklet);
tasklet_kill(&cs->if_wake_tasklet);
tty_unregister_device(drv->tty, cs->minor_index);
}
tty_unregister_device(drv->tty, cs->minor_index);
}
#include "gigaset.h"
#include <linux/ctype.h>
#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;
{
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);
spin_lock_irqsave(&cs->lock, flags);
ret = sprintf(buf, "%u\n", cs->cidmode);
-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)
{
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;
long int value;
char *end;
-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)
{
/* free sysfs for device */
void gigaset_free_dev_sysfs(struct cardstate *cs)
{
+ if (!cs->class)
+ return;
+
gig_dbg(DEBUG_INIT, "removing sysfs entries");
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)
{
}
/* initialize sysfs for device */
void gigaset_init_dev_sysfs(struct cardstate *cs)
{
+ if (!cs->class)
+ return;
+
gig_dbg(DEBUG_INIT, "setting up sysfs");
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);