Skip to contentSkip to conversation

Driver Core patches for 2.6.9-rc1

PATCH New Greg KH 3 participants 20 messages Aug 25, 2004 – Aug 27, 2004

Subsystems (11)
Documentation SCSI USB PCI +7 more subsystems
lore
Share & tools
lore

Greg KH

author
#0 lore raw

PATCH 1/1 Driver Core patches for 2.6.9-rc1

Hi,

Here are some driver core patches for 2.6.9-rc1. They fix a few minor error paths, and shrink down the kref code enough to be able to use it in a kobject. All of the driver patches have been in the patch few -mm releases.

I've also put 4 minor I2C patches, and two PCI patches as they need to make it into the mainline tree soon.

Please pull from:

	bk://kernel.bkbits.net/gregkh/linux/driver-2.6

thanks,

greg k-h

p.s. I'll send these as patches in response to this email to lkml for those who want to see them.

 CREDITS                            |    6 +
 Documentation/driver-model/bus.txt |   78 ++++++----------------
 Documentation/i2c/sysfs-interface  |    2 
 MAINTAINERS                        |   30 ++++++++
 drivers/base/class.c               |    9 +-
 drivers/char/tty_io.c              |   44 +++++++++---
 drivers/i2c/busses/i2c-keywest.c   |    2 
 drivers/i2c/chips/asb100.c         |    4 -
 drivers/i2c/chips/it87.c           |    4 -
 drivers/i2c/chips/lm78.c           |    4 -
 drivers/i2c/chips/lm85.c           |    4 -
 drivers/i2c/chips/w83627hf.c       |    4 -
 drivers/i2c/chips/w83781d.c        |    4 -
 drivers/pci/pci-driver.c           |    7 -
 drivers/pci/probe.c                |    6 +
 drivers/pci/remove.c               |   20 +++--
 drivers/scsi/sd.c                  |  117 +++++++++++++++++++--------------
 drivers/scsi/sr.c                  |   14 +--
 drivers/usb/core/config.c          |    7 +
 drivers/usb/core/message.c         |    4 -
 drivers/usb/core/urb.c             |    8 +-
 drivers/usb/core/usb.h             |    1 
 drivers/usb/host/ehci-mem.c        |    4 -
 drivers/usb/serial/usb-serial.c    |  130 +++++++++++++++++--------------------
 include/linux/device.h             |    1 
 include/linux/kobject.h            |    5 +
 include/linux/kref.h               |    9 --
 include/linux/pci.h                |    2 
 lib/Makefile                       |    7 -
 lib/kobject.c                      |   57 ++++++++++------
 lib/kref.c                         |   29 +++-----
 31 files changed, 346 insertions(+), 277 deletions(-)

-----

<thomas.koeller:baslerweb.com>:
o Driver Core: fix minor class reference counting issue on the error path

Dmitry Torokhov:
o kobject: fix kobject_set_name comment

Fran�ois Romieu:
o pci-driver: function documentation fix

Greg Kroah-Hartman:
o kobject: convert struct kobject use kref
o KREF: make kref_get() return void as it makes sense to do so
o KREF: fix up the current kref users for the changed api
o KREF: shrink the size of struct kref down to just a single atomic_t

Jean Delvare:
o I2C: update kernel credits/maintainers
o I2C: rename in0_ref to cpu0_vid
o I2C: keywest class

John Rose:
o PCI Hotplug: create pci_remove_bus()

Jonathan Corbet:
o Remove struct bus_type->add()

Olaf Hering:
o export legacy pty info via sysfs

Robert Love:
o KOBJECT: add kobject_get_path

author
#1 lore raw

PATCH 1/1 Driver Core patches for 2.6.9-rc1

ChangeSet 1.1803.60.1, 2004/08/02 17:02:58-07:00, [email protected]

KREF: shrink the size of struct kref down to just a single atomic_t

This was based on a patch from Kiran, but tweaked further by me.

 include/linux/kref.h |    7 ++-----
 lib/kref.c           |   26 ++++++++++++--------------
 2 files changed, 14 insertions(+), 19 deletions(-)
include/linux/kref.h +2 -5
diff -Nru a/include/linux/kref.h b/include/linux/kref.h
@@ -18,15 +18,12 @@
 #include <linux/types.h>
 #include <asm/atomic.h>
 
-
 struct kref {
 	atomic_t refcount;
-	void (*release)(struct kref *kref);
 };
 
-void kref_init(struct kref *kref, void (*release)(struct kref *));
+void kref_init(struct kref *kref);
 struct kref *kref_get(struct kref *kref);
-void kref_put(struct kref *kref);
-
+void kref_put(struct kref *kref, void (*release) (struct kref *kref));
 
 #endif /* _KREF_H_ */
lib/kref.c +12 -14
diff -Nru a/lib/kref.c b/lib/kref.c
@@ -11,23 +11,16 @@
  *
  */
 
-/* #define DEBUG */
-
 #include <linux/kref.h>
 #include <linux/module.h>
 
 /**
  * kref_init - initialize object.
  * @kref: object in question.
- * @release: pointer to a function that will clean up the object
- *	     when the last reference to the object is released.
- *	     This pointer is required.
  */
-void kref_init(struct kref *kref, void (*release)(struct kref *kref))
+void kref_init(struct kref *kref)
 {
-	WARN_ON(release == NULL);
 	atomic_set(&kref->refcount,1);
-	kref->release = release;
 }
 
 /**
@@ -44,15 +37,20 @@
 /**
  * kref_put - decrement refcount for object.
  * @kref: object.
+ * @release: pointer to the function that will clean up the object when the
+ *	     last reference to the object is released.
+ *	     This pointer is required, and it is not acceptable to pass kfree
+ *	     in as this function.
  *
- * Decrement the refcount, and if 0, call kref->release().
+ * Decrement the refcount, and if 0, call release().
  */
-void kref_put(struct kref *kref)
+void kref_put(struct kref *kref, void (*release) (struct kref *kref))
 {
-	if (atomic_dec_and_test(&kref->refcount)) {
-		pr_debug("kref cleaning up\n");
-		kref->release(kref);
-	}
+	WARN_ON(release == NULL);
+	WARN_ON(release == (void (*)(struct kref *))kfree);
+
+	if (atomic_dec_and_test(&kref->refcount))
+		release(kref);
 }
 
 EXPORT_SYMBOL(kref_init);
author
#2 lore raw

ChangeSet 1.1803.60.2, 2004/08/02 17:08:20-07:00, [email protected]

KREF: fix up the current kref users for the changed api.

Based on work from Kiran, but fixed up by me to actually build and link properly.

 drivers/scsi/sd.c               |    8 +-
 drivers/scsi/sr.c               |    8 +-
 drivers/usb/core/config.c       |    7 +-
 drivers/usb/core/message.c      |    2 
 drivers/usb/core/urb.c          |    4 -
 drivers/usb/core/usb.h          |    1 
 drivers/usb/host/ehci-mem.c     |    4 -
 drivers/usb/serial/usb-serial.c |  130 +++++++++++++++++++---------------------
 8 files changed, 80 insertions(+), 84 deletions(-)
drivers/scsi/sd.c +4 -4
diff -Nru a/drivers/scsi/sd.c b/drivers/scsi/sd.c
@@ -188,7 +188,7 @@
 	return sdkp;
 
  out_put:
-	kref_put(&sdkp->kref);
+	kref_put(&sdkp->kref, scsi_disk_release);
  out_sdkp:
 	sdkp = NULL;
  out:
@@ -200,7 +200,7 @@
 {
 	down(&sd_ref_sem);
 	scsi_device_put(sdkp->device);
-	kref_put(&sdkp->kref);
+	kref_put(&sdkp->kref, scsi_disk_release);
 	up(&sd_ref_sem);
 }
 
@@ -1362,7 +1362,7 @@
 		goto out;
 
 	memset (sdkp, 0, sizeof(*sdkp));
-	kref_init(&sdkp->kref, scsi_disk_release);
+	kref_init(&sdkp->kref);
 
 	/* Note: We can accomodate 64 partitions, but the genhd code
 	 * assumes partitions allocate consecutive minors, which they don't.
@@ -1464,7 +1464,7 @@
 	del_gendisk(sdkp->disk);
 	sd_shutdown(dev);
 	down(&sd_ref_sem);
-	kref_put(&sdkp->kref);
+	kref_put(&sdkp->kref, scsi_disk_release);
 	up(&sd_ref_sem);
 
 	return 0;
drivers/scsi/sr.c +4 -4
diff -Nru a/drivers/scsi/sr.c b/drivers/scsi/sr.c
@@ -147,7 +147,7 @@
 	goto out;
 
  out_put:
-	kref_put(&cd->kref);
+	kref_put(&cd->kref, sr_kref_release);
  out_null:
 	cd = NULL;
  out:
@@ -159,7 +159,7 @@
 {
 	down(&sr_ref_sem);
 	scsi_device_put(cd->device);
-	kref_put(&cd->kref);
+	kref_put(&cd->kref, sr_kref_release);
 	up(&sr_ref_sem);
 }
 
@@ -576,7 +576,7 @@
 		goto fail;
 	memset(cd, 0, sizeof(*cd));
 
-	kref_init(&cd->kref, sr_kref_release);
+	kref_init(&cd->kref);
 
 	disk = alloc_disk(1);
 	if (!disk)
@@ -937,7 +937,7 @@
 	del_gendisk(cd->disk);
 
 	down(&sr_ref_sem);
-	kref_put(&cd->kref);
+	kref_put(&cd->kref, sr_kref_release);
 	up(&sr_ref_sem);
 
 	return 0;
drivers/usb/core/config.c +4 -3
diff -Nru a/drivers/usb/core/config.c b/drivers/usb/core/config.c
@@ -106,7 +106,7 @@
 	return buffer - buffer0 + i;
 }
 
-static void usb_release_interface_cache(struct kref *ref)
+void usb_release_interface_cache(struct kref *ref)
 {
 	struct usb_interface_cache *intfc = ref_to_usb_interface_cache(ref);
 	int j;
@@ -356,7 +356,7 @@
 		if (!intfc)
 			return -ENOMEM;
 		memset(intfc, 0, len);
-		kref_init(&intfc->ref, usb_release_interface_cache);
+		kref_init(&intfc->ref);
 	}
 
 	/* Skip over any Class Specific or Vendor Specific descriptors;
@@ -422,7 +422,8 @@
 
 		for (i = 0; i < cf->desc.bNumInterfaces; i++) {
 			if (cf->intf_cache[i])
-				kref_put(&cf->intf_cache[i]->ref);
+				kref_put(&cf->intf_cache[i]->ref, 
+					  usb_release_interface_cache);
 		}
 	}
 	kfree(dev->config);
drivers/usb/core/message.c +1 -1
diff -Nru a/drivers/usb/core/message.c b/drivers/usb/core/message.c
@@ -1195,7 +1195,7 @@
 	struct usb_interface_cache *intfc =
 			altsetting_to_usb_interface_cache(intf->altsetting);
 
-	kref_put(&intfc->ref);
+	kref_put(&intfc->ref, usb_release_interface_cache);
 	kfree(intf);
 }
 
drivers/usb/core/urb.c +2 -2
diff -Nru a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
@@ -39,7 +39,7 @@
 {
 	if (urb) {
 		memset(urb, 0, sizeof(*urb));
-		kref_init(&urb->kref, urb_destroy);
+		kref_init(&urb->kref);
 		spin_lock_init(&urb->lock);
 	}
 }
@@ -88,7 +88,7 @@
 void usb_free_urb(struct urb *urb)
 {
 	if (urb)
-		kref_put(&urb->kref);
+		kref_put(&urb->kref, urb_destroy);
 }
 
 /**
drivers/usb/core/usb.h +1 -0
diff -Nru a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
@@ -10,6 +10,7 @@
 extern void usb_disable_endpoint (struct usb_device *dev, unsigned int epaddr);
 extern void usb_disable_interface (struct usb_device *dev,
 		struct usb_interface *intf);
+extern void usb_release_interface_cache(struct kref *ref);
 extern void usb_disable_device (struct usb_device *dev, int skip_ep0);
 
 extern void usb_enable_endpoint (struct usb_device *dev,
drivers/usb/host/ehci-mem.c +2 -2
diff -Nru a/drivers/usb/host/ehci-mem.c b/drivers/usb/host/ehci-mem.c
@@ -114,7 +114,7 @@
 		return qh;
 
 	memset (qh, 0, sizeof *qh);
-	kref_init(&qh->kref, qh_destroy);
+	kref_init(&qh->kref);
 	qh->ehci = ehci;
 	qh->qh_dma = dma;
 	// INIT_LIST_HEAD (&qh->qh_list);
@@ -139,7 +139,7 @@
 
 static inline void qh_put (struct ehci_qh *qh)
 {
-	kref_put(&qh->kref);
+	kref_put(&qh->kref, qh_destroy);
 }
 
 /*-------------------------------------------------------------------------*/
drivers/usb/serial/usb-serial.c +62 -68

178 lines not on this page · raw message

author
#3 lore raw

ChangeSet 1.1803.64.2, 2004/08/06 14:18:50-07:00, [email protected]

[PATCH] KOBJECT: add kobject_get_path

Add a new kobject helper, kobject_get_path(), which is the greatest function ever.

 include/linux/kobject.h |    2 ++
 lib/kobject.c           |   36 +++++++++++++++++++++++++++---------
 2 files changed, 29 insertions(+), 9 deletions(-)
include/linux/kobject.h +2 -0
diff -Nru a/include/linux/kobject.h b/include/linux/kobject.h
@@ -58,6 +58,8 @@
 
 extern void kobject_hotplug(const char *action, struct kobject *);
 
+extern char * kobject_get_path(struct kset *, struct kobject *, int);
+
 struct kobj_type {
 	void (*release)(struct kobject *);
 	struct sysfs_ops	* sysfs_ops;
lib/kobject.c +27 -9
diff -Nru a/lib/kobject.c b/lib/kobject.c
@@ -58,14 +58,11 @@
 	return error;
 }
 
-
 static inline struct kobject * to_kobj(struct list_head * entry)
 {
 	return container_of(entry,struct kobject,entry);
 }
 
-
-#ifdef CONFIG_HOTPLUG
 static int get_kobj_path_length(struct kset *kset, struct kobject *kobj)
 {
 	int length = 1;
@@ -98,6 +95,31 @@
 	pr_debug("%s: path = '%s'\n",__FUNCTION__,path);
 }
 
+/**
+ * kobject_get_path - generate and return the path associated with a given kobj
+ * and kset pair.  The result must be freed by the caller with kfree().
+ *
+ * @kset:	kset in question, with which to build the path
+ * @kobj:	kobject in question, with which to build the path
+ * @gfp_mask:	the allocation type used to allocate the path
+ */
+char * kobject_get_path(struct kset *kset, struct kobject *kobj, int gfp_mask)
+{
+	char *path;
+	int len;
+
+	len = get_kobj_path_length(kset, kobj);
+	path = kmalloc(len, gfp_mask);
+	if (!path)
+		return NULL;
+	memset(path, 0x00, len);
+	fill_kobj_path(kset, kobj, path, len);
+
+	return path;
+}
+
+#ifdef CONFIG_HOTPLUG
+
 #define BUFFER_SIZE	1024	/* should be enough memory for the env */
 #define NUM_ENVP	32	/* number of env pointers */
 static unsigned long sequence_num;
@@ -112,7 +134,6 @@
 	char *scratch;
 	int i = 0;
 	int retval;
-	int kobj_path_length;
 	char *kobj_path = NULL;
 	char *name = NULL;
 	unsigned long seq;
@@ -163,12 +184,9 @@
 	envp [i++] = scratch;
 	scratch += sprintf(scratch, "SEQNUM=%ld", seq) + 1;
 
-	kobj_path_length = get_kobj_path_length (kset, kobj);
-	kobj_path = kmalloc (kobj_path_length, GFP_KERNEL);
+	kobj_path = kobject_get_path(kset, kobj, GFP_KERNEL);
 	if (!kobj_path)
 		goto exit;
-	memset (kobj_path, 0x00, kobj_path_length);
-	fill_kobj_path (kset, kobj, kobj_path, kobj_path_length);
 
 	envp [i++] = scratch;
 	scratch += sprintf (scratch, "DEVPATH=%s", kobj_path) + 1;
@@ -626,7 +644,7 @@
 	}
 }
 
-
+EXPORT_SYMBOL(kobject_get_path);
 EXPORT_SYMBOL(kobject_init);
 EXPORT_SYMBOL(kobject_register);
 EXPORT_SYMBOL(kobject_unregister);
author
#4 lore raw

ChangeSet 1.1803.64.3, 2004/08/10 14:47:24-07:00, [email protected]

[PATCH] export legacy pty info via sysfs

You missed that one last year.

export the legacy pty/tty device nodes via sysfs, so udev has a chance to create them if /dev is in tmpfs.

 drivers/char/tty_io.c |   22 ++++++++++++++++------
 1 files changed, 16 insertions(+), 6 deletions(-)
drivers/char/tty_io.c +16 -6
diff -Nru a/drivers/char/tty_io.c b/drivers/char/tty_io.c
@@ -766,6 +766,17 @@
 	return tty_write(file, buf, count, ppos);
 }
 
+static char ptychar[] = "pqrstuvwxyzabcde";
+
+static inline void pty_line_name(struct tty_driver *driver, int index, char *p)
+{
+	int i = index + driver->name_base;
+	/* ->name is initialized to "ttyp", but "tty" is expected */
+	sprintf(p, "%s%c%x",
+			driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
+			ptychar[i >> 4 & 0xf], i & 0xf);
+}
+
 static inline void tty_line_name(struct tty_driver *driver, int index, char *p)
 {
 	sprintf(p, "%s%d", driver->name, index + driver->name_base);
@@ -2170,6 +2181,7 @@
 void tty_register_device(struct tty_driver *driver, unsigned index,
 			 struct device *device)
 {
+	char name[64];
 	dev_t dev = MKDEV(driver->major, driver->minor_start) + index;
 
 	if (index >= driver->num) {
@@ -2181,13 +2193,11 @@
 	devfs_mk_cdev(dev, S_IFCHR | S_IRUSR | S_IWUSR,
 			"%s%d", driver->devfs_name, index + driver->name_base);
 
-	/* we don't care about the ptys */
-	/* how nice to hide this behind some crappy interface.. */
-	if (driver->type != TTY_DRIVER_TYPE_PTY) {
-		char name[64];
+	if (driver->type == TTY_DRIVER_TYPE_PTY)
+		pty_line_name(driver, index, name);
+	else
 		tty_line_name(driver, index, name);
-		class_simple_device_add(tty_class, dev, device, name);
-	}
+	class_simple_device_add(tty_class, dev, device, name);
 }
 
 /**
author
#5 lore raw

ChangeSet 1.1803.64.4, 2004/08/10 14:49:28-07:00, [email protected]

[PATCH] Driver Core: fix minor class reference counting issue on the error path

 drivers/base/class.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)
drivers/base/class.c +7 -2
diff -Nru a/drivers/base/class.c b/drivers/base/class.c
@@ -349,13 +349,18 @@
 
 int class_device_add(struct class_device *class_dev)
 {
-	struct class * parent;
+	struct class * parent = NULL;
 	struct class_interface * class_intf;
 	int error;
 
 	class_dev = class_device_get(class_dev);
-	if (!class_dev || !strlen(class_dev->class_id))
+	if (!class_dev)
 		return -EINVAL;
+
+	if (!strlen(class_dev->class_id)) {
+		error = -EINVAL;
+		goto register_done;
+	}
 
 	parent = class_get(class_dev->class);
 
author
#6 lore raw

ChangeSet 1.1803.64.5, 2004/08/23 13:17:08-07:00, [email protected]

KREF: make kref_get() return void as it makes sense to do so.

Thanks to Kiran for bugging me to do this.

 drivers/scsi/sd.c    |    4 +---
 drivers/scsi/sr.c    |    4 +---
 include/linux/kref.h |    2 +-
 lib/kref.c           |    3 +--
 4 files changed, 4 insertions(+), 9 deletions(-)
drivers/scsi/sd.c +1 -3
diff -Nru a/drivers/scsi/sd.c b/drivers/scsi/sd.c
@@ -180,8 +180,7 @@
 	if (disk->private_data == NULL)
 		goto out;
 	sdkp = scsi_disk(disk);
-	if (!kref_get(&sdkp->kref))
-		goto out_sdkp;
+	kref_get(&sdkp->kref);
 	if (scsi_device_get(sdkp->device))
 		goto out_put;
 	up(&sd_ref_sem);
@@ -189,7 +188,6 @@
 
  out_put:
 	kref_put(&sdkp->kref, scsi_disk_release);
- out_sdkp:
 	sdkp = NULL;
  out:
 	up(&sd_ref_sem);
drivers/scsi/sr.c +1 -3
diff -Nru a/drivers/scsi/sr.c b/drivers/scsi/sr.c
@@ -140,15 +140,13 @@
 	if (disk->private_data == NULL)
 		goto out;
 	cd = scsi_cd(disk);
-	if (!kref_get(&cd->kref))
-		goto out_null;
+	kref_get(&cd->kref);
 	if (scsi_device_get(cd->device))
 		goto out_put;
 	goto out;
 
  out_put:
 	kref_put(&cd->kref, sr_kref_release);
- out_null:
 	cd = NULL;
  out:
 	up(&sr_ref_sem);
include/linux/kref.h +1 -1
diff -Nru a/include/linux/kref.h b/include/linux/kref.h
@@ -23,7 +23,7 @@
 };
 
 void kref_init(struct kref *kref);
-struct kref *kref_get(struct kref *kref);
+void kref_get(struct kref *kref);
 void kref_put(struct kref *kref, void (*release) (struct kref *kref));
 
 #endif /* _KREF_H_ */
lib/kref.c +1 -2
diff -Nru a/lib/kref.c b/lib/kref.c
@@ -27,11 +27,10 @@
  * kref_get - increment refcount for object.
  * @kref: object.
  */
-struct kref *kref_get(struct kref *kref)
+void kref_get(struct kref *kref)
 {
 	WARN_ON(!atomic_read(&kref->refcount));
 	atomic_inc(&kref->refcount);
-	return kref;
 }
 
 /**
author
#7 lore raw

ChangeSet 1.1803.64.6, 2004/08/24 00:09:55-07:00, [email protected]

[PATCH] Remove struct bus_type->add()

I recently went looking for users of the add() method in struct bus_type, only to discover that there are none. A query to Pat confirmed that it is surplus and should come out. So here's a patch that does it.

While I was at it, I updated Documentation/driver-model/bus.txt to at least get rid of the blatantly untrue stuff; it is still rather far from being up to date, however. I may be able to fix that later on.

 Documentation/driver-model/bus.txt |   78 ++++++++++---------------------------
 include/linux/device.h             |    1 
 2 files changed, 23 insertions(+), 56 deletions(-)
Documentation/driver-model/bus.txt +23 -55
diff -Nru a/Documentation/driver-model/bus.txt b/Documentation/driver-model/bus.txt
@@ -5,20 +5,21 @@
 ~~~~~~~~~~
 
 struct bus_type {
-        char                    * name;
-        rwlock_t                lock;
-        atomic_t                refcount;
-
-        struct list_head        node;
-        struct list_head        devices;
-        struct list_head        drivers;
-
-        struct driver_dir_entry dir;
-        struct driver_dir_entry device_dir;
-        struct driver_dir_entry driver_dir;
+	char			* name;
 
-        int     (*match)        (struct device * dev, struct device_driver * drv);
-	struct device (*add)	(struct device * parent, char * bus_id);
+	struct subsystem	subsys;
+	struct kset		drivers;
+	struct kset		devices;
+
+	struct bus_attribute	* bus_attrs;
+	struct device_attribute	* dev_attrs;
+	struct driver_attribute	* drv_attrs;
+
+	int		(*match)(struct device * dev, struct device_driver * drv);
+	int		(*hotplug) (struct device *dev, char **envp, 
+				    int num_envp, char *buffer, int buffer_size);
+	int		(*suspend)(struct device * dev, u32 state);
+	int		(*resume)(struct device * dev);
 };
 
 int bus_register(struct bus_type * bus);
@@ -47,7 +48,7 @@
 When a bus driver is initialized, it calls bus_register. This
 initializes the rest of the fields in the bus object and inserts it
 into a global list of bus types. Once the bus object is registered, 
-the fields in it (e.g. the rwlock_t) are usable by the bus driver. 
+the fields in it are usable by the bus driver. 
 
 
 Callbacks
@@ -71,40 +72,6 @@
 iterated over, and the match callback is called for each device that
 does not have a driver associated with it. 
 
-add(): Adding a child device
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The add callback is available to notify the bus about a child device
-at a particular location. 
-
-The parent parameter is the parent device of the child to be added. If
-parent == NULL, the bus should add the device as a child of a default
-parent device or as a child of the root. This policy decision is up to
-the bus driver.
-
-The format of the bus_id field should be consistent with the format of
-the bus_id field of the rest of the devices on the bus. This requires
-the caller to know the format.
-
-On return, the bus driver should return a pointer to the device that
-was created. If the device was not created, the bus driver should
-return an appropriate error code. Refer to include/linux/err.h for
-helper functions to encode errors. Some sample code:
-
-struct device * pci_bus_add(struct device * parent, char * bus_id)
-{
-	...
-	/* the device already exists */
-	return ERR_PTR(-EEXIST);
-	...
-}
-
-The caller can check the return value using IS_ERR():
-
-    struct device * newdev = pci_bus_type.add(parent,bus_id);
-    if (IS_ERR(newdev)) {
-	...
-    }
 
 
 Device and Driver Lists
@@ -118,10 +85,11 @@
 
 The LDM core provides helper functions for iterating over each list.
 
-int bus_for_each_dev(struct bus_type * bus, void * data, 
-		     int (*callback)(struct device * dev, void * data));
-int bus_for_each_drv(struct bus_type * bus, void * data,
-		     int (*callback)(struct device_driver * drv, void * data));
+int bus_for_each_dev(struct bus_type * bus, struct device * start, void * data,
+		     int (*fn)(struct device *, void *));
+
+int bus_for_each_drv(struct bus_type * bus, struct device_driver * start, 
+		     void * data, int (*fn)(struct device_driver *, void *));
 
 These helpers iterate over the respective list, and call the callback
 for each device or driver in the list. All list accesses are
@@ -168,9 +136,9 @@
 Exporting Attributes
 ~~~~~~~~~~~~~~~~~~~~
 struct bus_attribute {
-        struct attribute        attr;
-        ssize_t (*show)(struct bus_type *, char * buf, size_t count, loff_t off);
-        ssize_t (*store)(struct bus_type *, const char * buf, size_t count, loff_t off);
+	struct attribute	attr;
+	ssize_t (*show)(struct bus_type *, char * buf);
+	ssize_t (*store)(struct bus_type *, const char * buf, size_t count);
 };
 
 Bus drivers can export attributes using the BUS_ATTR macro that works
include/linux/device.h +0 -1
diff -Nru a/include/linux/device.h b/include/linux/device.h
@@ -59,7 +59,6 @@
 	struct driver_attribute	* drv_attrs;
 
 	int		(*match)(struct device * dev, struct device_driver * drv);
-	struct device * (*add)	(struct device * parent, char * bus_id);
 	int		(*hotplug) (struct device *dev, char **envp, 
 				    int num_envp, char *buffer, int buffer_size);
 	int		(*suspend)(struct device * dev, u32 state);
author
#8 lore raw

ChangeSet 1.1803.64.7, 2004/08/24 16:19:31-07:00, [email protected]

[PATCH] kobject: fix kobject_set_name comment.

 lib/kobject.c |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)
lib/kobject.c +1 -1
diff -Nru a/lib/kobject.c b/lib/kobject.c
@@ -343,7 +343,7 @@
  *	@kobj:	object.
  *	@name:	name. 
  *
- *	If strlen(name) < KOBJ_NAME_LEN, then use a dynamically allocated
+ *	If strlen(name) >= KOBJ_NAME_LEN, then use a dynamically allocated
  *	string that @kobj->k_name points to. Otherwise, use the static 
  *	@kobj->name array.
  */
author
#9 lore raw

ChangeSet 1.1803.64.8, 2004/08/25 12:30:41-07:00, [email protected]

kobject: convert struct kobject use kref.

 include/linux/kobject.h |    3 ++-
 lib/Makefile            |    5 +----
 lib/kobject.c           |   19 ++++++++++---------
 3 files changed, 13 insertions(+), 14 deletions(-)
include/linux/kobject.h +2 -1
diff -Nru a/include/linux/kobject.h b/include/linux/kobject.h
@@ -19,6 +19,7 @@
 #include <linux/list.h>
 #include <linux/sysfs.h>
 #include <linux/rwsem.h>
+#include <linux/kref.h>
 #include <asm/atomic.h>
 
 #define KOBJ_NAME_LEN	20
@@ -26,7 +27,7 @@
 struct kobject {
 	char			* k_name;
 	char			name[KOBJ_NAME_LEN];
-	atomic_t		refcount;
+	struct kref		kref;
 	struct list_head	entry;
 	struct kobject		* parent;
 	struct kset		* kset;
lib/Makefile +1 -4
diff -Nru a/lib/Makefile b/lib/Makefile
@@ -5,11 +5,8 @@
 
 lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \
 	 bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \
-	 kobject.o idr.o div64.o parser.o int_sqrt.o \
+	 kobject.o kref.o idr.o div64.o parser.o int_sqrt.o \
 	 bitmap.o extable.o
-
-# hack for now till some static code uses krefs, then it can move up above...
-obj-y += kref.o
 
 lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
 lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
lib/kobject.c +10 -9
diff -Nru a/lib/kobject.c b/lib/kobject.c
@@ -243,10 +243,9 @@
  *	kobject_init - initialize object.
  *	@kobj:	object in question.
  */
-
 void kobject_init(struct kobject * kobj)
 {
-	atomic_set(&kobj->refcount,1);
+ 	kref_init(&kobj->kref);
 	INIT_LIST_HEAD(&kobj->entry);
 	kobj->kset = kset_get(kobj->kset);
 }
@@ -447,10 +446,8 @@
 
 struct kobject * kobject_get(struct kobject * kobj)
 {
-	if (kobj) {
-		WARN_ON(!atomic_read(&kobj->refcount));
-		atomic_inc(&kobj->refcount);
-	}
+	if (kobj)
+		kref_get(&kobj->kref);
 	return kobj;
 }
 
@@ -477,17 +474,21 @@
 		kobject_put(parent);
 }
 
+static void kobject_release(struct kref *kref)
+{
+	kobject_cleanup(container_of(kref, struct kobject, kref));
+}
+
 /**
  *	kobject_put - decrement refcount for object.
  *	@kobj:	object.
  *
  *	Decrement the refcount, and if 0, call kobject_cleanup().
  */
-
 void kobject_put(struct kobject * kobj)
 {
-	if (atomic_dec_and_test(&kobj->refcount))
-		kobject_cleanup(kobj);
+	if (kobj)
+		kref_put(&kobj->kref, kobject_release);
 }
 
 
author
#10 lore raw

ChangeSet 1.1873, 2004/08/25 13:21:22-07:00, [email protected]

[PATCH] I2C: keywest class

This is needed for iBook2 owners to be able to use their ADM1030 hardware monitoring chip. Successfully tested by one user.

 drivers/i2c/busses/i2c-keywest.c |    2 ++
 1 files changed, 2 insertions(+)
drivers/i2c/busses/i2c-keywest.c +2 -0
diff -Nru a/drivers/i2c/busses/i2c-keywest.c b/drivers/i2c/busses/i2c-keywest.c
@@ -618,6 +618,8 @@
 		chan->iface = iface;
 		chan->chan_no = i;
 		chan->adapter.id = I2C_ALGO_SMBUS;
+		if (i==1)
+			chan->adapter.class = I2C_CLASS_HWMON;
 		chan->adapter.algo = &keywest_algorithm;
 		chan->adapter.algo_data = NULL;
 		chan->adapter.client_register = NULL;
author
#11 lore raw

ChangeSet 1.1874, 2004/08/25 13:21:59-07:00, [email protected]

[PATCH] I2C: rename in0_ref to cpu0_vid

This patch changes all the i2c chip drivers and documentation to use the name "cpu0_vid" instead of "in0_ref". The name "in0_ref" was an error in the first place as motherboard manufacturers may fail to follow the chip manufacturer's recommendation about which "in" channel to use for VCore monitoring.

The new name leaves room for chips able to monitor more than 1 vid value, such as the LM93 and, to a lesser extent, the PC87360 family (all by National Semiconductor). These chips are typically designed for dual-CPU motherboards.

This breaks the interface (obviously) so libsensors has been updated to support both names.

 Documentation/i2c/sysfs-interface |    2 +-
 drivers/i2c/chips/asb100.c        |    4 ++--
 drivers/i2c/chips/it87.c          |    4 ++--
 drivers/i2c/chips/lm78.c          |    4 ++--
 drivers/i2c/chips/lm85.c          |    4 ++--
 drivers/i2c/chips/w83627hf.c      |    4 ++--
 drivers/i2c/chips/w83781d.c       |    4 ++--
 7 files changed, 13 insertions(+), 13 deletions(-)
Documentation/i2c/sysfs-interface +1 -1
diff -Nru a/Documentation/i2c/sysfs-interface b/Documentation/i2c/sysfs-interface
@@ -104,7 +104,7 @@
 			in7_*	varies
 			in8_*	varies
 
-in0_ref		CPU core reference voltage.
+cpu[0-1]_vid	CPU core reference voltage.
 		Unit: millivolt
 		Read only.
 		Not always correct.
drivers/i2c/chips/asb100.c +2 -2
diff -Nru a/drivers/i2c/chips/asb100.c b/drivers/i2c/chips/asb100.c
@@ -520,9 +520,9 @@
 	return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
 }
 
-static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid, NULL);
+static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 #define device_create_file_vid(client) \
-device_create_file(&client->dev, &dev_attr_in0_ref)
+device_create_file(&client->dev, &dev_attr_cpu0_vid)
 
 /* VRM */
 static ssize_t show_vrm(struct device *dev, char *buf)
drivers/i2c/chips/it87.c +2 -2
diff -Nru a/drivers/i2c/chips/it87.c b/drivers/i2c/chips/it87.c
@@ -571,9 +571,9 @@
 	struct it87_data *data = it87_update_device(dev);
 	return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
 }
-static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL);
+static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
 #define device_create_file_vid(client) \
-device_create_file(&client->dev, &dev_attr_in0_ref)
+device_create_file(&client->dev, &dev_attr_cpu0_vid)
 
 /* This function is called when:
      * it87_driver is inserted (when this module is loaded), for each
drivers/i2c/chips/lm78.c +2 -2
diff -Nru a/drivers/i2c/chips/lm78.c b/drivers/i2c/chips/lm78.c
@@ -423,7 +423,7 @@
 	struct lm78_data *data = lm78_update_device(dev);
 	return sprintf(buf, "%d\n", VID_FROM_REG(data->vid));
 }
-static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid, NULL);
+static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 
 /* Alarms */
 static ssize_t show_alarms(struct device *dev, char *buf)
@@ -615,7 +615,7 @@
 	device_create_file(&new_client->dev, &dev_attr_fan3_min);
 	device_create_file(&new_client->dev, &dev_attr_fan3_div);
 	device_create_file(&new_client->dev, &dev_attr_alarms);
-	device_create_file(&new_client->dev, &dev_attr_in0_ref);
+	device_create_file(&new_client->dev, &dev_attr_cpu0_vid);
 
 	return 0;
 
drivers/i2c/chips/lm85.c +2 -2
diff -Nru a/drivers/i2c/chips/lm85.c b/drivers/i2c/chips/lm85.c
@@ -465,7 +465,7 @@
 	return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
 }
 
-static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL);
+static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
 
 static ssize_t show_vrm_reg(struct device *dev, char *buf)
 {
@@ -874,7 +874,7 @@
 	device_create_file(&new_client->dev, &dev_attr_temp2_max);
 	device_create_file(&new_client->dev, &dev_attr_temp3_max);
 	device_create_file(&new_client->dev, &dev_attr_vrm);
-	device_create_file(&new_client->dev, &dev_attr_in0_ref);
+	device_create_file(&new_client->dev, &dev_attr_cpu0_vid);
 	device_create_file(&new_client->dev, &dev_attr_alarms);
 
 	return 0;
drivers/i2c/chips/w83627hf.c +2 -2
diff -Nru a/drivers/i2c/chips/w83627hf.c b/drivers/i2c/chips/w83627hf.c
@@ -635,9 +635,9 @@
 	struct w83627hf_data *data = w83627hf_update_device(dev);
 	return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
 }
-static DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL);
+static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
 #define device_create_file_vid(client) \
-device_create_file(&client->dev, &dev_attr_in0_ref)
+device_create_file(&client->dev, &dev_attr_cpu0_vid)
 
 static ssize_t
 show_vrm_reg(struct device *dev, char *buf)
drivers/i2c/chips/w83781d.c +2 -2
diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c
@@ -503,9 +503,9 @@
 }
 
 static
-DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL);
+DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
 #define device_create_file_vid(client) \
-device_create_file(&client->dev, &dev_attr_in0_ref);
+device_create_file(&client->dev, &dev_attr_cpu0_vid);
 static ssize_t
 show_vrm_reg(struct device *dev, char *buf)
 {
author
#12 lore raw

ChangeSet 1.1875, 2004/08/25 13:22:38-07:00, [email protected]

[PATCH] I2C: update kernel credits/maintainers

 CREDITS     |    6 ++++++
 MAINTAINERS |   30 ++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)
CREDITS +6 -0
diff -Nru a/CREDITS b/CREDITS
@@ -735,6 +735,12 @@
 S: D-69231 Rauenberg
 S: Germany
 
+N: Jean Delvare
+E: [email protected]
+W: http://khali.linux-fr.org/
+D: Several hardware monitoring drivers
+S: France
+
 N: Peter Denison
 E: [email protected]
 W: http://www.pnd-pc.demon.co.uk/promise/
MAINTAINERS +30 -0
diff -Nru a/MAINTAINERS b/MAINTAINERS
@@ -199,6 +199,12 @@
 W:	http://linux.thorsten-knabe.de
 S:	Maintained
 
+ADM1025 HARDWARE MONITOR DRIVER
+P:	Jean Delvare
+M:	[email protected]
+L:	[email protected]
+S:	Maintained
+
 ADT746X FAN DRIVER
 P:	Colin Leroy
 M:	[email protected]
@@ -1327,6 +1333,18 @@
 W:	http://lsm.immunix.org
 S:	Supported
 
+LM83 HARDWARE MONITOR DRIVER
+P:	Jean Delvare
+M:	[email protected]
+L:	[email protected]
+S:	Maintained
+
+LM90 HARDWARE MONITOR DRIVER
+P:	Jean Delvare
+M:	[email protected]
+L:	[email protected]
+S:	Maintained
+
 LOGICAL DISK MANAGER SUPPORT (LDM, Windows 2000/XP Dynamic Disks)
 P:	Richard Russon (FlatCap)
 M:	[email protected]
@@ -1906,6 +1924,12 @@
 W:	http://www.winischhofer.net/linuxsisvga.shtml
 S:	Maintained	
 
+SMSC47M1 HARDWARE MONITOR DRIVER
+P:	Jean Delvare
+M:	[email protected]
+L:	[email protected]
+S:	Odd Fixes
+
 SMB FILESYSTEM
 P:	Urban Widmark
 M:	[email protected]
@@ -2409,6 +2433,12 @@
 M:	[email protected]
 L:	[email protected]
 S:	Maintained
+
+W83L785TS HARDWARE MONITOR DRIVER
+P:	Jean Delvare
+M:	[email protected]
+L:	[email protected]
+S:	Odd Fixes
 
 WAN ROUTER & SANGOMA WANPIPE DRIVERS & API (X.25, FRAME RELAY, PPP, CISCO HDLC)
 P:	Nenad Corbic
author
#13 lore raw

ChangeSet 1.1876, 2004/08/25 13:23:15-07:00, [email protected]

[PATCH] pci-driver: function documentation fix

The returned value can not be null. Yet its description suggests differently.

From: Francois Romieu <[email protected]>

 drivers/pci/pci-driver.c |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)
drivers/pci/pci-driver.c +3 -4
diff -Nru a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
@@ -390,10 +390,9 @@
  * pci_register_driver - register a new pci driver
  * @drv: the driver structure to register
  * 
- * Adds the driver structure to the list of registered drivers
- * Returns the number of pci devices which were claimed by the driver
- * during registration.  The driver remains registered even if the
- * return value is zero.
+ * Adds the driver structure to the list of registered drivers.
+ * Returns a negative value on error. The driver remains registered
+ * even if no device was claimed during registration.
  */
 int
 pci_register_driver(struct pci_driver *drv)
author
#14 lore raw

ChangeSet 1.1877, 2004/08/25 13:23:54-07:00, [email protected]

[PATCH] PCI Hotplug: create pci_remove_bus()

The following patch implements a pci_remove_bus() that can be used by hotplug drivers for the removal of root buses. It also defines a release function that frees the device struct for pci_bus->bridge when a root bus class device is unregistered.

 drivers/pci/probe.c  |    6 ++++++
 drivers/pci/remove.c |   20 +++++++++++++-------
 include/linux/pci.h  |    2 +-
 3 files changed, 20 insertions(+), 8 deletions(-)
drivers/pci/probe.c +6 -0
diff -Nru a/drivers/pci/probe.c b/drivers/pci/probe.c
@@ -571,6 +571,11 @@
 	return PCI_CFG_SPACE_SIZE;
 }
 
+static void pci_release_bus_bridge_dev(struct device *dev)
+{
+	kfree(dev);
+}
+
 /*
  * Read the config data for a PCI device, sanity-check it
  * and fill in the dev structure...
@@ -772,6 +777,7 @@
 
 	memset(dev, 0, sizeof(*dev));
 	dev->parent = parent;
+	dev->release = pci_release_bus_bridge_dev;
 	sprintf(dev->bus_id, "pci%04x:%02x", pci_domain_nr(b), bus);
 	device_register(dev);
 	b->bridge = get_device(dev);
drivers/pci/remove.c +13 -7
diff -Nru a/drivers/pci/remove.c b/drivers/pci/remove.c
@@ -59,6 +59,18 @@
 }
 EXPORT_SYMBOL(pci_remove_device_safe);
 
+void pci_remove_bus(struct pci_bus *b)
+{
+	pci_proc_detach_bus(b);
+
+	spin_lock(&pci_bus_lock);
+	list_del(&b->node);
+	spin_unlock(&pci_bus_lock);
+
+	class_device_unregister(&b->class_dev);
+}
+EXPORT_SYMBOL(pci_remove_bus);
+
 /**
  * pci_remove_bus_device - remove a PCI device and any children
  * @dev: the device to remove
@@ -77,13 +89,7 @@
 		struct pci_bus *b = dev->subordinate;
 
 		pci_remove_behind_bridge(dev);
-		pci_proc_detach_bus(b);
-
-		spin_lock(&pci_bus_lock);
-		list_del(&b->node);
-		spin_unlock(&pci_bus_lock);
-
-		class_device_unregister(&b->class_dev);
+		pci_remove_bus(b);
 		dev->subordinate = NULL;
 	}
 
include/linux/pci.h +1 -1
diff -Nru a/include/linux/pci.h b/include/linux/pci.h
@@ -712,7 +712,7 @@
 int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge);
 extern struct pci_dev *pci_dev_get(struct pci_dev *dev);
 extern void pci_dev_put(struct pci_dev *dev);
-
+extern void pci_remove_bus(struct pci_bus *b);
 extern void pci_remove_bus_device(struct pci_dev *dev);
 
 /* Generic PCI functions exported to card drivers */
#15 lore raw
In reply to Greg KH
Quoted 6 lines · Greg KH

ChangeSet 1.1873, 2004/08/25 13:21:22-07:00, [email protected]

[PATCH] I2C: keywest class

This is needed for iBook2 owners to be able to use their ADM1030 hardware monitoring chip. Successfully tested by one user.

Vetoed until I get a proper explanation on what that is supposed to do, I don't want random stuff mucking around the i2c busses on those machines, only specifically written drivers for the chips in there.

Please, do NOT apply.

Ben.

author
#16 lore raw
Quoted 5 lines · Benjamin Herrenschmidt
Quoted 4 lines · Greg KH

ChangeSet 1.1873, 2004/08/25 13:21:22-07:00, [email protected]

[PATCH] I2C: keywest class

Quoted 8 lines
Quoted 2 lines

This is needed for iBook2 owners to be able to use their ADM1030 hardware monitoring chip. Successfully tested by one user.

Vetoed until I get a proper explanation on what that is supposed to do, I don't want random stuff mucking around the i2c busses on those machines, only specifically written drivers for the chips in there.

Please, do NOT apply.

Oops, sorry, already in :(

Anyway, sensors people, any further info on this patch?

thanks,

greg k-h

#17 lore raw

Hi Benjamin, hi Greg,

Quoted 11 lines
Quoted 11 lines
Quoted 6 lines

ChangeSet 1.1873, 2004/08/25 13:21:22-07:00, [email protected]

[PATCH] I2C: keywest class

This is needed for iBook2 owners to be able to use their ADM1030 hardware monitoring chip. Successfully tested by one user.

Vetoed until I get a proper explanation on what that is supposed to do, I don't want random stuff mucking around the i2c busses on those machines, only specifically written drivers for the chips in there.

Quoted 5 lines
Quoted 1 line

Please, do NOT apply.

Oops, sorry, already in :(

Anyway, sensors people, any further info on this patch?

Sure. I2C adapters have a class bitfield which is used to define which kind of clients the bus is known to host (video, hardware monitoring, etc...). Most client drivers do check the class before probing clients on any given bus. [There is a plan to move the check to i2c-core so as to enforce the checking instead of relying on the client's good will, but this hasn't been completed yet.]

The i2c-keywest driver doesn't define any class for any of its I2C busses. All hardware monitoring chips [1] do check the class, so they wont possibly probe any chip on the i2c-keywest busses. It happens that on the iBook2, the second I2C bus hosts an Analog Devices ADM1030 monitoring chip, for which a driver has been developped recently. Without adding the correct class bit (I2C_CLASS_HWMON) to the second bus of i2c-keywest, iBook2 users can't get the adm1031 driver to handle their ADM1030 chip.

One iBook2 user came to me, wondering why he couldn't get the adm1031 driver to work, and we noticed the problem. I had him test a patch and it worked. I then sent the patch to Greg, who in turn sent it to Linus, and here we are.

Benjamin, you seem to guard the i2c-keywest driver very closely. Is there anything special about this driver? My patch was rather simple and non-intrusive, and probably not worth reverting within the hour. Much ado about nothing, if you want my opinion, with all due respect.

Could you please explain why my patch doesn't make sense? Similar changes were made to several i2c bus drivers already [2] [3], and it never caused any problem.

At any rate, I may redirect i2c-keywest users to you from now on, if you prefer to handle it yourself.

Thanks.

[1] Except lm85, but this should be fixed.
[2] http://marc.theaimsgroup.com/?l=bk-commits-head&m=107943782219511&w=2
[3] http://marc.theaimsgroup.com/?l=bk-commits-head&m=107943868728036&w=2

Signature · 2 lines
Jean "Khali" Delvare
http://khali.linux-fr.org/
#18 lore raw
Quoted 7 lines · Jean Delvare

The i2c-keywest driver doesn't define any class for any of its I2C busses. All hardware monitoring chips [1] do check the class, so they wont possibly probe any chip on the i2c-keywest busses. It happens that on the iBook2, the second I2C bus hosts an Analog Devices ADM1030 monitoring chip, for which a driver has been developped recently. Without adding the correct class bit (I2C_CLASS_HWMON) to the second bus of i2c-keywest, iBook2 users can't get the adm1031 driver to handle their ADM1030 chip.

That bus also contains other stuffs, I'd prefer the in-kernel specific driver for this model to be used rather than some generic stuff.

Quoted 8 lines

One iBook2 user came to me, wondering why he couldn't get the adm1031 driver to work, and we noticed the problem. I had him test a patch and it worked. I then sent the patch to Greg, who in turn sent it to Linus, and here we are.

Benjamin, you seem to guard the i2c-keywest driver very closely. Is there anything special about this driver? My patch was rather simple and non-intrusive, and probably not worth reverting within the hour. Much ado about nothing, if you want my opinion, with all due respect.

It was wrong to check on the bus number like that. i2c-keywest is used on a variety of models to driver totally different i2c busses, and at this point, we can't arbitrarily say "bus 1 is HW monitoring". It totally depends on the machine model. Besides, I don't like generic drivers playing with those thermal control stuffs, I prefer drivers that have been tuned for those specific machine models.

Quoted 2 lines

Could you please explain why my patch doesn't make sense? Similar changes were made to several i2c bus drivers already [2] [3], and it never caused any problem.

As I wrote earlier. Just testing the bus number and arbitrarily deciding bus 1 is HWMON makes no sense.

Quoted 8 lines

At any rate, I may redirect i2c-keywest users to you from now on, if you prefer to handle it yourself.

Thanks.

[1] Except lm85, but this should be fixed.
[2] http://marc.theaimsgroup.com/?l=bk-commits-head&m=107943782219511&w=2
[3] http://marc.theaimsgroup.com/?l=bk-commits-head&m=107943868728036&w=2

Signature · 1 line
Benjamin Herrenschmidt <[email protected]>
#19 lore raw
Quoted 10 lines
Quoted 7 lines

The i2c-keywest driver doesn't define any class for any of its I2C busses. All hardware monitoring chips [1] do check the class, so they wont possibly probe any chip on the i2c-keywest busses. It happens that on the iBook2, the second I2C bus hosts an Analog Devices ADM1030 monitoring chip, for which a driver has been developped recently. Without adding the correct class bit (I2C_CLASS_HWMON) to the second bus of i2c-keywest, iBook2 users can't get the adm1031 driver to handle their ADM1030 chip.

That bus also contains other stuffs, I'd prefer the in-kernel specific driver for this model to be used rather than some generic stuff.

Does such a driver exist already? How does it differ from i2c/chips/adm1031.c?

Quoted 9 lines
Quoted 4 lines

Benjamin, you seem to guard the i2c-keywest driver very closely. Is there anything special about this driver? My patch was rather simple and non-intrusive, and probably not worth reverting within the hour. Much ado about nothing, if you want my opinion, with all due respect.

It was wrong to check on the bus number like that. i2c-keywest is used on a variety of models to driver totally different i2c busses, and at this point, we can't arbitrarily say "bus 1 is HW monitoring". It totally depends on the machine model.

It's not quite what the patch did. It's more like "bus 1 *may* host hardware monitoring chips". It doesn't prevent non-hardware monitoring chips from working. It simply allows hardware-monitoring chip drivers to probe that bus when loaded.

I admit it does this for all systems using i2c-keywest, while only the iBook2 is known to actually have a hardware monitoring chip on that bus. However, I would guess that future iBooks are likely to have it as well. And probing the bus when no hardware monitoring chip is present shouldn't harm.

The fact that bus probing is needed is a known weakness of the I2C/SMBus protocol. This isn't i2c-keywest-specific, and works rather well (now). Refined detection methods and the new class bitfield are doing well.

Quoted 3 lines

Besides, I don't like generic drivers playing with those thermal control stuffs, I prefer drivers that have been tuned for those specific machine models.

Again, please tell me what your specific driver will do that ours don't (or the other way around). I don't much enjoy the idea of having two different drivers for the same chip.

Quoted 6 lines
Quoted 3 lines

Could you please explain why my patch doesn't make sense? Similar changes were made to several i2c bus drivers already [2] [3], and it never caused any problem.

As I wrote earlier. Just testing the bus number and arbitrarily deciding bus 1 is HWMON makes no sense.

If this is the problem, and if you have a way to set the class to I2C_CLASS_HWMON if and only if the system is an iBook2, that's fine with me (although I don't think it is necessary to be that restrictive).

Thanks,

Signature · 2 lines
Jean "Khali" Delvare
http://khali.linux-fr.org/