Commit 67408494 authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Linus Torvalds

[PATCH] s390: module alias support.

Add module alias support for ccw devices.
parent 0b1a47c2
...@@ -11,39 +11,12 @@ ...@@ -11,39 +11,12 @@
#define _S390_CCWDEV_H_ #define _S390_CCWDEV_H_
#include <linux/device.h> #include <linux/device.h>
#include <linux/mod_devicetable.h>
/* structs from asm/cio.h */ /* structs from asm/cio.h */
struct irb; struct irb;
struct ccw1; struct ccw1;
/* the id is used to identify what hardware a device driver supports. It
* is used both by the ccw subsystem driver for probing and from
* user space for automatic module loading.
*
* References:
* - struct usb_device_id (include/linux/usb.h)
* - devreg_hc_t (include/linux/s390dyn.h)
* - chandev_model_info (drivers/s390/misc/chandev.c)
*/
struct ccw_device_id {
__u16 match_flags; /* which fields to match against */
__u16 cu_type; /* control unit type */
__u16 dev_type; /* device type */
__u8 cu_model; /* control unit model */
__u8 dev_model; /* device model */
unsigned long driver_info;
};
enum match_flag {
CCW_DEVICE_ID_MATCH_CU_TYPE = 0x01,
CCW_DEVICE_ID_MATCH_CU_MODEL = 0x02,
CCW_DEVICE_ID_MATCH_DEVICE_TYPE = 0x04,
CCW_DEVICE_ID_MATCH_DEVICE_MODEL = 0x08,
/* CCW_DEVICE_ID_MATCH_ANY = 0x10, */
};
/* simplified initializers for struct ccw_device: /* simplified initializers for struct ccw_device:
* CCW_DEVICE and CCW_DEVICE_DEVTYPE initialize one * CCW_DEVICE and CCW_DEVICE_DEVTYPE initialize one
* entry in your MODULE_DEVICE_TABLE and set the match_flag correctly */ * entry in your MODULE_DEVICE_TABLE and set the match_flag correctly */
......
...@@ -130,4 +130,22 @@ struct usb_device_id { ...@@ -130,4 +130,22 @@ struct usb_device_id {
#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100 #define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100
#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200 #define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200
/* s390 CCW devices */
struct ccw_device_id {
__u16 match_flags; /* which fields to match against */
__u16 cu_type; /* control unit type */
__u16 dev_type; /* device type */
__u8 cu_model; /* control unit model */
__u8 dev_model; /* device model */
kernel_ulong_t driver_info;
};
#define CCW_DEVICE_ID_MATCH_CU_TYPE 0x01
#define CCW_DEVICE_ID_MATCH_CU_MODEL 0x02
#define CCW_DEVICE_ID_MATCH_DEVICE_TYPE 0x04
#define CCW_DEVICE_ID_MATCH_DEVICE_MODEL 0x08
#endif /* LINUX_MOD_DEVICETABLE_H */ #endif /* LINUX_MOD_DEVICETABLE_H */
...@@ -147,6 +147,28 @@ static int do_pci_entry(const char *filename, ...@@ -147,6 +147,28 @@ static int do_pci_entry(const char *filename,
return 1; return 1;
} }
/* looks like: "ccw:tNmNdtNdmN" */
static int do_ccw_entry(const char *filename,
struct ccw_device_id *id, char *alias)
{
id->match_flags = TO_NATIVE(id->match_flags);
id->cu_type = TO_NATIVE(id->cu_type);
id->cu_model = TO_NATIVE(id->cu_model);
id->dev_type = TO_NATIVE(id->dev_type);
id->dev_model = TO_NATIVE(id->dev_model);
strcpy(alias, "ccw:");
ADD(alias, "t", id->match_flags&CCW_DEVICE_ID_MATCH_CU_TYPE,
id->cu_type);
ADD(alias, "m", id->match_flags&CCW_DEVICE_ID_MATCH_CU_MODEL,
id->cu_model);
ADD(alias, "dt", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_TYPE,
id->dev_type);
ADD(alias, "dm", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_TYPE,
id->dev_model);
return 1;
}
/* Ignore any prefix, eg. v850 prepends _ */ /* Ignore any prefix, eg. v850 prepends _ */
static inline int sym_is(const char *symbol, const char *name) static inline int sym_is(const char *symbol, const char *name)
{ {
...@@ -210,6 +232,9 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, ...@@ -210,6 +232,9 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
else if (sym_is(symname, "__mod_ieee1394_device_table")) else if (sym_is(symname, "__mod_ieee1394_device_table"))
do_table(symval, sym->st_size, sizeof(struct ieee1394_device_id), do_table(symval, sym->st_size, sizeof(struct ieee1394_device_id),
do_ieee1394_entry, mod); do_ieee1394_entry, mod);
else if (sym_is(symname, "__mod_ccw_device_table"))
do_table(symval, sym->st_size, sizeof(struct ccw_device_id),
do_ccw_entry, mod);
} }
/* Now add out buffered information to the generated C source */ /* Now add out buffered information to the generated C source */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment