summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-01-18 18:34:31 -0800
committerLinus Torvalds <torvalds@home.osdl.org>2004-01-18 18:34:31 -0800
commit65e5c5021998d7ce0a1541c9fdc7cfbb0991d8ae (patch)
tree2648d40a908fba0282e337252de330d3ad3f8de9 /include/linux
parentdb5ed140740a652a288df89d8a724fc0e96a0eec (diff)
[PATCH] Zorro sysfs/driver model
From: Geert Uytterhoeven <geert@linux-m68k.org> Zorro bus: Add support for sysfs and the new driver model
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/zorro.h147
1 files changed, 132 insertions, 15 deletions
diff --git a/include/linux/zorro.h b/include/linux/zorro.h
index 04df7f115c51..ba5b72768bbe 100644
--- a/include/linux/zorro.h
+++ b/include/linux/zorro.h
@@ -1,7 +1,7 @@
/*
* linux/zorro.h -- Amiga AutoConfig (Zorro) Bus Definitions
*
- * Copyright (C) 1995--2000 Geert Uytterhoeven
+ * Copyright (C) 1995--2003 Geert Uytterhoeven
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive
@@ -13,6 +13,9 @@
#ifndef __ASSEMBLY__
+#include <linux/device.h>
+
+
/*
* Each Zorro board has a 32-bit ID of the form
*
@@ -96,17 +99,17 @@ struct ExpansionRom {
#define ERTF_MEMLIST (1<<5)
struct ConfigDev {
- struct Node cd_Node;
- __u8 cd_Flags; /* (read/write) */
- __u8 cd_Pad; /* reserved */
- struct ExpansionRom cd_Rom; /* copy of board's expansion ROM */
+ struct Node cd_Node;
+ __u8 cd_Flags; /* (read/write) */
+ __u8 cd_Pad; /* reserved */
+ struct ExpansionRom cd_Rom; /* copy of board's expansion ROM */
void *cd_BoardAddr; /* where in memory the board was placed */
- __u32 cd_BoardSize; /* size of board in bytes */
- __u16 cd_SlotAddr; /* which slot number (PRIVATE) */
- __u16 cd_SlotSize; /* number of slots (PRIVATE) */
+ __u32 cd_BoardSize; /* size of board in bytes */
+ __u16 cd_SlotAddr; /* which slot number (PRIVATE) */
+ __u16 cd_SlotSize; /* number of slots (PRIVATE) */
void *cd_Driver; /* pointer to node of driver */
struct ConfigDev *cd_NextCD; /* linked list of drivers to config */
- __u32 cd_Unused[4]; /* for whatever the driver wants */
+ __u32 cd_Unused[4]; /* for whatever the driver wants */
} __attribute__ ((packed));
#else /* __ASSEMBLY__ */
@@ -157,15 +160,81 @@ CD_sizeof = CD_Unused+(4*4)
#include <asm/zorro.h>
+
+ /*
+ * Zorro devices
+ */
+
struct zorro_dev {
struct ExpansionRom rom;
zorro_id id;
+ struct zorro_driver *driver; /* which driver has allocated this device */
+ struct device dev; /* Generic device interface */
u16 slotaddr;
u16 slotsize;
char name[64];
struct resource resource;
};
+#define to_zorro_dev(n) container_of(n, struct zorro_dev, dev)
+
+
+ /*
+ * Zorro bus
+ */
+
+struct zorro_bus {
+ struct list_head devices; /* list of devices on this bus */
+ unsigned int num_resources; /* number of resources */
+ struct resource resources[4]; /* address space routed to this bus */
+ struct device dev;
+ char name[10];
+};
+
+extern struct zorro_bus zorro_bus; /* single Zorro bus */
+extern struct bus_type zorro_bus_type;
+
+
+ /*
+ * Zorro device IDs
+ */
+
+struct zorro_device_id {
+ zorro_id id; /* Device ID or ZORRO_WILDCARD */
+ unsigned long driver_data; /* Data private to the driver */
+};
+
+
+ /*
+ * Zorro device drivers
+ */
+
+struct zorro_driver {
+ struct list_head node;
+ char *name;
+ const struct zorro_device_id *id_table; /* NULL if wants all devices */
+ int (*probe)(struct zorro_dev *z, const struct zorro_device_id *id); /* New device inserted */
+ void (*remove)(struct zorro_dev *z); /* Device removed (NULL if not a hot-plug capable driver) */
+ struct device_driver driver;
+};
+
+#define to_zorro_driver(drv) container_of(drv, struct zorro_driver, driver)
+
+
+#define zorro_for_each_dev(dev) \
+ for (dev = &zorro_autocon[0]; dev < zorro_autocon+zorro_num_autocon; dev++)
+
+
+/* New-style probing */
+extern int zorro_register_driver(struct zorro_driver *);
+extern void zorro_unregister_driver(struct zorro_driver *);
+extern const struct zorro_device_id *zorro_match_device(const struct zorro_device_id *ids, const struct zorro_dev *z);
+static inline struct zorro_driver *zorro_dev_driver(const struct zorro_dev *z)
+{
+ return z->driver;
+}
+
+
extern unsigned int zorro_num_autocon; /* # of autoconfig devices found */
extern struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO];
@@ -174,17 +243,65 @@ extern struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO];
* Zorro Functions
*/
-extern void zorro_name_device(struct zorro_dev *dev);
-
extern struct zorro_dev *zorro_find_device(zorro_id id,
struct zorro_dev *from);
+#define zorro_resource_start(z) ((z)->resource.start)
+#define zorro_resource_end(z) ((z)->resource.end)
+#define zorro_resource_len(z) ((z)->resource.end-(z)->resource.start+1)
+#define zorro_resource_flags(z) ((z)->resource.flags)
+
#define zorro_request_device(z, name) \
- request_mem_region((z)->resource.start, \
- (z)->resource.end-(z)->resource.start+1, (name))
+ request_mem_region(zorro_resource_start(z), zorro_resource_len(z), name)
#define zorro_release_device(z) \
- release_mem_region((z)->resource.start, \
- (z)->resource.end-(z)->resource.start+1)
+ release_mem_region(zorro_resource_start(z), zorro_resource_len(z))
+
+/* Similar to the helpers above, these manipulate per-zorro_dev
+ * driver-specific data. They are really just a wrapper around
+ * the generic device structure functions of these calls.
+ */
+static inline void *zorro_get_drvdata (struct zorro_dev *z)
+{
+ return dev_get_drvdata(&z->dev);
+}
+
+static inline void zorro_set_drvdata (struct zorro_dev *z, void *data)
+{
+ dev_set_drvdata(&z->dev, data);
+}
+
+
+/*
+ * A helper function which helps ensure correct zorro_driver
+ * setup and cleanup for commonly-encountered hotplug/modular cases
+ *
+ * This MUST stay in a header, as it checks for -DMODULE
+ */
+static inline int zorro_module_init(struct zorro_driver *drv)
+{
+ int rc = zorro_register_driver(drv);
+
+ if (rc > 0)
+ return 0;
+
+ /* iff CONFIG_HOTPLUG and built into kernel, we should
+ * leave the driver around for future hotplug events.
+ * For the module case, a hotplug daemon of some sort
+ * should load a module in response to an insert event. */
+#if defined(CONFIG_HOTPLUG) && !defined(MODULE)
+ if (rc == 0)
+ return 0;
+#else
+ if (rc == 0)
+ rc = -ENODEV;
+#endif
+
+ /* if we get here, we need to clean up Zorro driver instance
+ * and return some sort of error */
+ zorro_unregister_driver(drv);
+
+ return rc;
+}
/*