diff -Nru a/drivers/char/tty_io.c b/drivers/char/tty_io.c
--- a/drivers/char/tty_io.c Tue Apr 22 13:07:51 2003
+++ b/drivers/char/tty_io.c Tue Apr 22 13:07:51 2003
@@ -2133,18 +2133,94 @@
# define tty_register_devfs(driver, minor) do { } while (0)
# define tty_unregister_devfs(driver, minor) do { } while (0)
#endif /* CONFIG_DEVFS_FS */
+static struct class tty_class = {
+ .name = "tty",
+};
+
+struct tty_dev {
+ struct list_head node;
+ struct tty_driver *driver;
+ unsigned minor;
+ struct class_device class_dev;
+};
+#define to_tty_dev(d) container_of(d, struct tty_dev, class_dev)
+
+static LIST_HEAD(tty_dev_list);
+
+static ssize_t show_dev (struct class_device *class_dev, char *buf)
+{
+ struct tty_dev *tty_dev = to_tty_dev(class_dev);
+ dev_t base;
+
+ base = MKDEV(tty_dev->driver->major, tty_dev->minor);
+ return sprintf(buf, "%04x\n", base);
+}
+static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
/*
* Register a tty device described by <driver>, with minor number <minor>.
*/
-void tty_register_device(struct tty_driver *driver, unsigned minor)
+void tty_register_device (struct tty_driver *driver, unsigned minor, struct device *dev)
{
+ struct tty_dev *tty_dev = NULL;
+ char *name = NULL;
+ char *temp;
+ int retval;
+
tty_register_devfs(driver, minor);
+
+ tty_dev = kmalloc(sizeof(*tty_dev), GFP_KERNEL);
+ if (!tty_dev)
+ return;
+ memset(tty_dev, 0x00, sizeof(*tty_dev));
+ name = kmalloc(DEVICE_NAME_SIZE, GFP_KERNEL);
+ if (!name)
+ goto error;
+
+ /* stupid '%' in tty name strings... */
+ strncpy(name, driver->name, DEVICE_NAME_SIZE);
+ temp = strchr(name, '%');
+ if (temp)
+ *temp = 0x00;
+
+ tty_dev->class_dev.dev = dev;
+ tty_dev->class_dev.class = &tty_class;
+ snprintf(tty_dev->class_dev.class_id, BUS_ID_SIZE, "%s%d", name,
+ minor - driver->minor_start);
+ retval = class_device_register(&tty_dev->class_dev);
+ if (retval)
+ goto error;
+ class_device_create_file (&tty_dev->class_dev, &class_device_attr_dev);
+ tty_dev->driver = driver;
+ tty_dev->minor = minor;
+ list_add(&tty_dev->node, &tty_dev_list);
+ return;
+error:
+ kfree(name);
+ kfree(tty_dev);
}
void tty_unregister_device(struct tty_driver *driver, unsigned minor)
{
+ struct tty_dev *tty_dev = NULL;
+ struct list_head *tmp;
+ int found = 0;
+
tty_unregister_devfs(driver, minor);
+
+ list_for_each (tmp, &tty_dev_list) {
+ tty_dev = list_entry(tmp, struct tty_dev, node);
+ if ((tty_dev->driver == driver) &&
+ (tty_dev->minor == minor)) {
+ found = 1;
+ break;
+ }
+ }
+ if (found) {
+ list_del(&tty_dev->node);
+ class_device_unregister(&tty_dev->class_dev);
+ kfree(tty_dev);
+ }
}
EXPORT_SYMBOL(tty_register_device);
@@ -2175,7 +2251,7 @@
if ( !(driver->flags & TTY_DRIVER_NO_DEVFS) ) {
for(i = 0; i < driver->num; i++)
- tty_register_device(driver, driver->minor_start + i);
+ tty_register_device(driver, driver->minor_start + i, NULL);
}
proc_tty_register_driver(driver);
return error;
@@ -2263,14 +2339,9 @@
extern int vty_init(void);
#endif
-struct device_class tty_devclass = {
- .name = "tty",
-};
-EXPORT_SYMBOL(tty_devclass);
-
static int __init tty_devclass_init(void)
{
- return devclass_register(&tty_devclass);
+ return class_register(&tty_class);
}
postcore_initcall(tty_devclass_init);
diff -Nru a/drivers/char/vt.c b/drivers/char/vt.c
--- a/drivers/char/vt.c Tue Apr 22 13:07:51 2003
+++ b/drivers/char/vt.c Tue Apr 22 13:07:51 2003
@@ -2665,7 +2665,7 @@
for (i = 0; i < console_driver.num; i++)
tty_register_device (&console_driver,
- console_driver.minor_start + i);
+ console_driver.minor_start + i, NULL);
}
/*
diff -Nru a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
--- a/drivers/serial/8250_pci.c Tue Apr 22 13:08:02 2003
+++ b/drivers/serial/8250_pci.c Tue Apr 22 13:08:02 2003
@@ -2043,9 +2043,6 @@
.suspend = pciserial_suspend_one,
.resume = pciserial_resume_one,
.id_table = serial_pci_tbl,
- .driver = {
- .devclass = &tty_devclass,
- },
};
static int __init serial8250_pci_init(void)
diff -Nru a/drivers/serial/core.c b/drivers/serial/core.c
--- a/drivers/serial/core.c Tue Apr 22 13:07:50 2003
+++ b/drivers/serial/core.c Tue Apr 22 13:07:50 2003
@@ -2231,7 +2231,7 @@
* Register the port whether it's detected or not. This allows
* setserial to be used to alter this ports parameters.
*/
- tty_register_device(drv->tty_driver, drv->minor + port->line);
+ tty_register_device(drv->tty_driver, drv->minor + port->line, NULL);
out:
up(&port_sem);
diff -Nru a/drivers/usb/class/bluetty.c b/drivers/usb/class/bluetty.c
--- a/drivers/usb/class/bluetty.c Tue Apr 22 13:07:53 2003
+++ b/drivers/usb/class/bluetty.c Tue Apr 22 13:07:53 2003
@@ -1198,7 +1198,7 @@
bluetooth, endpoint->bInterval);
/* initialize the devfs nodes for this device and let the user know what bluetooths we are bound to */
- tty_register_device (&bluetooth_tty_driver, minor);
+ tty_register_device (&bluetooth_tty_driver, minor, &intf->dev);
info("Bluetooth converter now attached to ttyUB%d (or usb/ttub/%d for devfs)", minor, minor);
bluetooth_table[minor] = bluetooth;
diff -Nru a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
--- a/drivers/usb/class/cdc-acm.c Tue Apr 22 13:08:03 2003
+++ b/drivers/usb/class/cdc-acm.c Tue Apr 22 13:08:03 2003
@@ -649,7 +649,7 @@
usb_driver_claim_interface(&acm_driver, acm->iface + 0, acm);
usb_driver_claim_interface(&acm_driver, acm->iface + 1, acm);
- tty_register_device(&acm_tty_driver, minor);
+ tty_register_device(&acm_tty_driver, minor, &intf->dev);
acm_table[minor] = acm;
usb_set_intfdata (intf, acm);
diff -Nru a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c
--- a/drivers/usb/serial/bus.c Tue Apr 22 13:07:48 2003
+++ b/drivers/usb/serial/bus.c Tue Apr 22 13:07:48 2003
@@ -23,18 +23,6 @@
#include "usb-serial.h"
-static ssize_t show_dev (struct device *dev, char *buf)
-{
- struct usb_serial_port *port= to_usb_serial_port(dev);
- dev_t base;
-
- port = to_usb_serial_port(dev);
-
- base = MKDEV(SERIAL_TTY_MAJOR, port->number);
- return sprintf(buf, "%04x\n", base);
-}
-static DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
-
static int usb_serial_device_match (struct device *dev, struct device_driver *drv)
{
struct usb_serial_device_type *driver;
@@ -88,10 +76,7 @@
}
minor = port->number;
-
- tty_register_device (&usb_serial_tty_driver, minor);
- device_create_file (dev, &dev_attr_dev);
-
+ tty_register_device (&usb_serial_tty_driver, minor, dev);
dev_info(&port->serial->dev->dev,
"%s converter now attached to ttyUSB%d (or usb/tts/%d for devfs)\n",
driver->name, minor, minor);
@@ -142,7 +127,6 @@
device->driver.bus = &usb_serial_bus_type;
device->driver.probe = usb_serial_device_probe;
device->driver.remove = usb_serial_device_remove;
- device->driver.devclass = &tty_devclass;
retval = driver_register(&device->driver);
diff -Nru a/include/linux/tty.h b/include/linux/tty.h
--- a/include/linux/tty.h Tue Apr 22 13:07:48 2003
+++ b/include/linux/tty.h Tue Apr 22 13:07:48 2003
@@ -243,6 +243,7 @@
#define L_PENDIN(tty) _L_FLAG((tty),PENDIN)
#define L_IEXTEN(tty) _L_FLAG((tty),IEXTEN)
+struct device;
/*
* Where all of the state associated with a tty is kept while the tty
* is open. Since the termios state should be kept even if the tty
@@ -378,7 +379,7 @@
extern int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc);
extern int tty_register_driver(struct tty_driver *driver);
extern int tty_unregister_driver(struct tty_driver *driver);
-extern void tty_register_device(struct tty_driver *driver, unsigned minor);
+extern void tty_register_device(struct tty_driver *driver, unsigned minor, struct device *dev);
extern void tty_unregister_device(struct tty_driver *driver, unsigned minor);
extern int tty_read_raw_data(struct tty_struct *tty, unsigned char *bufp,
int buflen);
diff -Nru a/include/linux/tty_driver.h b/include/linux/tty_driver.h
--- a/include/linux/tty_driver.h Tue Apr 22 13:07:53 2003
+++ b/include/linux/tty_driver.h Tue Apr 22 13:07:53 2003
@@ -231,6 +231,4 @@
#define SERIAL_TYPE_NORMAL 1
#define SERIAL_TYPE_CALLOUT 2
-extern struct device_class tty_devclass;
-
#endif /* #ifdef _LINUX_TTY_DRIVER_H */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/