public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* driverfs support for motherboard devices
@ 2002-02-05 17:39 Pavel Machek
  2002-02-05 18:11 ` Xavier Bestel
                   ` (3 more replies)
  0 siblings, 4 replies; 29+ messages in thread
From: Pavel Machek @ 2002-02-05 17:39 UTC (permalink / raw)
  To: kernel list, Patrick Mochel

Hi!

This patch adds support for motherboard devices, so that you can see
them in driverfs.

Should ide be presented to driverfs as bus with two devices on it?

What about "legacy" bus? It is not in this release, and I'm not 100%
sure who should generate it. Many architectures will need such bus so
maybe it belongs in drivers/base in order to avoid duplicate code?

								Pavel


--- clean/arch/i386/kernel/i8259.c	Thu Jan 31 23:42:10 2002
+++ linux-dm/arch/i386/kernel/i8259.c	Tue Feb  5 18:20:43 2002
@@ -11,6 +11,7 @@
 #include <linux/smp_lock.h>
 #include <linux/init.h>
 #include <linux/kernel_stat.h>
+#include <linux/device.h>
 
 #include <asm/atomic.h>
 #include <asm/system.h>
@@ -333,6 +334,18 @@
 		goto handle_real_irq;
 	}
 }
+
+static struct device device_i8259A;
+
+static void __init init_8259A_devicefs(void)
+{
+	device_register(&device_i8259A);
+	strcpy(device_i8259A.name, "i8259A");
+	strcpy(device_i8259A.bus_id, "0020");
+	device_i8259A.parent = &sys_iobus;
+}
+
+__initcall(init_8259A_devicefs);
 
 void __init init_8259A(int auto_eoi)
 {
--- clean/arch/i386/kernel/time.c	Thu Jan 31 23:42:10 2002
+++ linux-dm/arch/i386/kernel/time.c	Tue Feb  5 18:21:34 2002
@@ -41,6 +41,7 @@
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/smp.h>
+#include <linux/device.h>
 
 #include <asm/io.h>
 #include <asm/smp.h>
@@ -633,6 +634,18 @@
 bad_ctc:
 	return 0;
 }
+
+static struct device device_i8253;
+
+static void time_init_driverfs(void)
+{
+	strcpy(device_i8253.name, "i8253");
+	strcpy(device_i8253.bus_id, "0040");
+	device_i8253.parent = &sys_iobus;
+	device_register(&device_i8253);
+}
+
+__initcall(time_init_driverfs);
 
 void __init time_init(void)
 {
--- clean/drivers/base/core.c	Thu Jan 31 23:42:12 2002
+++ linux-dm/drivers/base/core.c	Tue Feb  5 18:19:42 2002
@@ -182,6 +182,16 @@
 	return iobus_register(&device_root);
 }
 
+
+struct iobus sys_iobus;
+
+void __init device_init_sys(void)
+{
+     sprintf(sys_iobus.name,"Bus for motherboard and strange devices");
+     sprintf(sys_iobus.bus_id,"sys");
+     iobus_register(&sys_iobus);
+}
+
 int __init device_driver_init(void)
 {
 	int error = 0;
@@ -203,6 +213,7 @@
 		return error;
 	}
 
+	device_init_sys();
 	DBG("DEV: Done Initialising\n");
 	return error;
 }
--- clean/drivers/block/floppy.c	Sun Jan 20 22:36:55 2002
+++ linux-dm/drivers/block/floppy.c	Mon Feb  4 23:05:09 2002
@@ -167,6 +167,7 @@
 #include <linux/interrupt.h>
 #include <linux/init.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
 
 /*
  * PS/2 floppies have much slower step rates than regular floppies.
@@ -4148,11 +4149,16 @@
 
 static int have_no_fdc= -ENODEV;
 
+static struct device device_floppy;
 
 int __init floppy_init(void)
 {
 	int i,unit,drive;
 
+	strcpy(device_floppy.name, "floppy");
+	strcpy(device_floppy.bus_id, "03?0");
+	device_floppy.parent = &sys_iobus;
+	device_register(&device_floppy);
 
 	raw_cmd = NULL;
 
--- clean/drivers/ide/ide-disk.c	Thu Jan 31 23:42:14 2002
+++ linux-dm/drivers/ide/ide-disk.c	Mon Feb  4 23:05:09 2002
@@ -818,6 +818,23 @@
 
 #endif	/* CONFIG_PROC_FS */
 
+static int idedisk_suspend (ide_drive_t *drive, u32 state, u32 stage)
+{
+	/* During S4, interrupt might be pending over resume. If it hits us and we 
+	   think it is completion interrupt from something started between suspend,
+	   we'll destroy data. Don't do that. */
+	if (state == 4)
+		return -EINVAL;
+	return 0;
+}
+
+static int idedisk_resume (ide_drive_t *drive, u32 stage)
+{
+	return 0;
+}
+
+
+
 /*
  * This is tightly woven into the driver->do_special can not touch.
  * DON'T do it again until a total personality rewrite is committed.
@@ -1082,6 +1099,8 @@
 	special:		idedisk_special,
 	proc:			idedisk_proc,
 	driver_reinit:		idedisk_reinit,
+	suspend:		idedisk_suspend,
+	resume:			idedisk_resume,
 };
 
 int idedisk_init (void);
--- clean/drivers/ide/ide-probe.c	Thu Jan 31 23:42:14 2002
+++ linux-dm/drivers/ide/ide-probe.c	Tue Feb  5 18:26:42 2002
@@ -467,8 +467,39 @@
 	return(region_errors);
 }
 
+int ide_hwif_suspend(struct device * dev, u32 state, u32 stage)
+{
+	int i, res = 0;
+	ide_hwif_t *hwif = dev->driver_data;
+
+	for (i=0; i<MAX_DRIVES; i++) {
+		if (hwif->drives[i].driver->suspend)
+			res = hwif->drives[i].driver->suspend(hwif->drives+i, state, stage);
+		if (res)
+			return res;
+	}
+	return 0;
+}
+
+int ide_hwif_resume(struct device * dev, u32 stage)
+{
+	ide_hwif_t *hwif = dev->driver_data;
+	return 0;
+}
+
+struct device_driver ide_device_driver = {
+	suspend:	ide_hwif_suspend,
+	resume:		ide_hwif_resume,	
+};
+
 static void hwif_register (ide_hwif_t *hwif)
 {
+	sprintf(hwif->device.bus_id, "%04x", hwif->io_ports[IDE_DATA_OFFSET]);
+	sprintf(hwif->device.name, "ide");
+	hwif->device.driver = &ide_device_driver;
+	hwif->device.driver_data = hwif;
+	hwif->device.parent = &sys_iobus;
+	device_register(&hwif->device);
 	if (((unsigned long)hwif->io_ports[IDE_DATA_OFFSET] | 7) ==
 	    ((unsigned long)hwif->io_ports[IDE_STATUS_OFFSET])) {
 		ide_request_region(hwif->io_ports[IDE_DATA_OFFSET], 8, hwif->name);
--- clean/drivers/ide/ide-proc.c	Thu Jan 31 23:42:14 2002
+++ linux-dm/drivers/ide/ide-proc.c	Mon Feb  4 23:05:09 2002
@@ -591,13 +591,13 @@
 	(char *page, char **start, off_t off, int count, int *eof, void *data)
 {
 	ide_drive_t	*drive = (ide_drive_t *) data;
-	ide_driver_t    *driver = (ide_driver_t *) drive->driver;
+	ide_driver_t    *driver = drive->driver;
 	int		len;
 
 	if (!driver)
 		len = sprintf(page, "(none)\n");
         else
-		len = sprintf(page,"%llu\n", (__u64) ((ide_driver_t *)drive->driver)->capacity(drive));
+		len = sprintf(page,"%llu\n", (__u64) drive->driver->capacity(drive));
 	PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
 }
 
@@ -629,7 +629,7 @@
 	(char *page, char **start, off_t off, int count, int *eof, void *data)
 {
 	ide_drive_t	*drive = (ide_drive_t *) data;
-	ide_driver_t	*driver = (ide_driver_t *) drive->driver;
+	ide_driver_t	*driver = drive->driver;
 	int		len;
 
 	if (!driver)

diff -ur -x .dep* -x .hdep* -x *.[oas] -x *~ -x #* -x *CVS* -x *.orig -x *.rej -x *.old -x .menu* -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkeymap.c -x uni_hash.tbl -x zImage -x vmlinux -x vmlinuz -x TAGS -x bootsect -x *RCS* -x conmakehash -x map -x build -x build -x configure -x *target* -x *.flags -x *.bak clean/include/linux/device.h linux-dm/include/linux/device.h
--- clean/include/linux/device.h	Thu Jan 31 23:42:28 2002
+++ linux-dm/include/linux/device.h	Mon Feb  4 23:05:09 2002
@@ -209,5 +209,6 @@
 }
 
 extern void put_iobus(struct iobus * iobus);
+extern struct iobus sys_iobus;
 
 #endif /* _DEVICE_H_ */
diff -ur -x .dep* -x .hdep* -x *.[oas] -x *~ -x #* -x *CVS* -x *.orig -x *.rej -x *.old -x .menu* -x asm -x local.h -x System.map -x autoconf.h -x compile.h -x version.h -x .version -x defkeymap.c -x uni_hash.tbl -x zImage -x vmlinux -x vmlinuz -x TAGS -x bootsect -x *RCS* -x conmakehash -x map -x build -x build -x configure -x *target* -x *.flags -x *.bak clean/include/linux/ide.h linux-dm/include/linux/ide.h
--- clean/include/linux/ide.h	Thu Jan 31 23:42:29 2002
+++ linux-dm/include/linux/ide.h	Mon Feb  4 23:05:09 2002
@@ -14,6 +14,7 @@
 #include <linux/blkdev.h>
 #include <linux/proc_fs.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
 #include <asm/hdreg.h>
 
 /*
@@ -424,12 +425,12 @@
 	unsigned long	capacity;	/* total number of sectors */
 	unsigned long long capacity48;	/* total number of sectors */
 	unsigned int	drive_data;	/* for use by tuneproc/selectproc as needed */
-	void		  *hwif;	/* actually (ide_hwif_t *) */
+	struct ide_hwif_s *hwif;	/* actually (ide_hwif_t *) */
 	wait_queue_head_t wqueue;	/* used to wait for drive in open() */
 	struct hd_driveid *id;		/* drive model identification info */
 	struct hd_struct  *part;	/* drive partition table */
 	char		name[4];	/* drive name, such as "hda" */
-	void 		*driver;	/* (ide_driver_t *) */
+	struct ide_driver_s *driver;	/* (ide_driver_t *) */
 	void		*driver_data;	/* extra driver data */
 	devfs_handle_t	de;		/* directory for device */
 	struct proc_dir_entry *proc;	/* /proc/ide/ directory entry */
@@ -580,6 +581,7 @@
 	void		*hwif_data;	/* extra hwif data */
 	ide_busproc_t	*busproc;	/* driver soft-power interface */
 	byte		bus_state;	/* power state of the IDE bus */
+	struct device	device;
 } ide_hwif_t;
 
 /*
@@ -718,6 +720,8 @@
 typedef ide_startstop_t	(ide_special_proc)(ide_drive_t *);
 typedef void		(ide_setting_proc)(ide_drive_t *);
 typedef int		(ide_driver_reinit_proc)(ide_drive_t *);
+typedef int		(ide_suspend_proc)(ide_drive_t *, u32 state, u32 stage);
+typedef int		(ide_resume_proc)(ide_drive_t *, u32 stage);
 
 typedef struct ide_driver_s {
 	const char			*name;
@@ -741,6 +745,8 @@
 	ide_special_proc		*special;
 	ide_proc_entry_t		*proc;
 	ide_driver_reinit_proc		*driver_reinit;
+	ide_suspend_proc		*suspend;
+	ide_resume_proc			*resume;
 } ide_driver_t;
 
 #define DRIVER(drive)		((ide_driver_t *)((drive)->driver))

-- 
(about SSSCA) "I don't say this lightly.  However, I really think that the U.S.
no longer is classifiable as a democracy, but rather as a plutocracy." --hpa

^ permalink raw reply	[flat|nested] 29+ messages in thread
* Re: driverfs support for motherboard devices
@ 2002-02-07 18:18 Thomas Hood
  2002-02-07 18:28 ` Patrick Mochel
  0 siblings, 1 reply; 29+ messages in thread
From: Thomas Hood @ 2002-02-07 18:18 UTC (permalink / raw)
  To: linux-kernel

I have put the two documents
   pnpbios.rtf
   biosclar.rtf
up on my web page
   http://panopticon.csustan.edu/thood/pnpbios.html




^ permalink raw reply	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2002-02-08 21:14 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-02-05 17:39 driverfs support for motherboard devices Pavel Machek
2002-02-05 18:11 ` Xavier Bestel
2002-02-06  7:28   ` Zwane Mwaikambo
2002-02-05 18:36 ` Jeff Garzik
2002-02-05 18:43 ` Patrick Mochel
2002-02-05 20:47   ` Russell King
2002-02-05 22:46     ` Andre Hedrick
2002-02-05 23:06       ` Joel Jaeggli
2002-02-05 23:30         ` Alan Cox
2002-02-05 23:25           ` Patrick Mochel
2002-02-05 23:08       ` Patrick Mochel
2002-02-05 23:17         ` Joel Jaeggli
2002-02-06 12:22         ` Pavel Machek
2002-02-06 23:34           ` Patrick Mochel
2002-02-07 13:03             ` Pavel Machek
2002-02-07  0:38           ` Alan Cox
2002-02-07 12:31             ` Pavel Machek
2002-02-07 13:23               ` Dave Jones
2002-02-07 17:26                 ` Patrick Mochel
2002-02-07 17:28                   ` Dave Jones
2002-02-07 18:32                   ` Gunther Mayer
2002-02-07 23:03                 ` Pavel Machek
2002-02-06  7:33   ` Zwane Mwaikambo
2002-02-06  7:24 ` Zwane Mwaikambo
2002-02-06 12:16   ` Pavel Machek
2002-02-06 20:54   ` Patrick Mochel
2002-02-07 20:21     ` Pavel Machek
  -- strict thread matches above, loose matches on Subject: below --
2002-02-07 18:18 Thomas Hood
2002-02-07 18:28 ` Patrick Mochel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox