mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 01:51:34 +00:00
rapidio: add udev notification
Add RapidIO-specific modalias generation to enable udev notifications about RapidIO-specific events. The RapidIO modalias string format is shown below: "rapidio:vNNNNdNNNNavNNNNadNNNN" Where: v - Device Vendor ID (16 bit), d - Device ID (16 bit), av - Assembly Vendor ID (16 bit), ad - Assembly ID (16 bit), as they are reported in corresponding Capability Registers (CARs) of each RapidIO device. Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com> Cc: Matt Porter <mporter@kernel.crashing.org> Cc: Li Yang <leoli@freescale.com> Cc: Kumar Gala <galak@kernel.crashing.org> Cc: Andre van Herk <andre.van.herk@Prodrive.nl> Cc: Micha Nelissen <micha.nelissen@Prodrive.nl> Cc: Stef van Os <stef.van.os@Prodrive.nl> Cc: Jean Delvare <jdelvare@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
fdf90abc00
commit
3bdbb62fe9
@ -199,6 +199,23 @@ static int rio_match_bus(struct device *dev, struct device_driver *drv)
|
|||||||
out:return 0;
|
out:return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rio_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||||
|
{
|
||||||
|
struct rio_dev *rdev;
|
||||||
|
|
||||||
|
if (!dev)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
rdev = to_rio_dev(dev);
|
||||||
|
if (!rdev)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
if (add_uevent_var(env, "MODALIAS=rapidio:v%04Xd%04Xav%04Xad%04X",
|
||||||
|
rdev->vid, rdev->did, rdev->asm_vid, rdev->asm_did))
|
||||||
|
return -ENOMEM;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct device rio_bus = {
|
struct device rio_bus = {
|
||||||
.init_name = "rapidio",
|
.init_name = "rapidio",
|
||||||
};
|
};
|
||||||
@ -210,6 +227,7 @@ struct bus_type rio_bus_type = {
|
|||||||
.bus_attrs = rio_bus_attrs,
|
.bus_attrs = rio_bus_attrs,
|
||||||
.probe = rio_device_probe,
|
.probe = rio_device_probe,
|
||||||
.remove = rio_device_remove,
|
.remove = rio_device_remove,
|
||||||
|
.uevent = rio_uevent,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -84,6 +84,15 @@ static ssize_t lnext_show(struct device *dev,
|
|||||||
return str - buf;
|
return str - buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t modalias_show(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct rio_dev *rdev = to_rio_dev(dev);
|
||||||
|
|
||||||
|
return sprintf(buf, "rapidio:v%04Xd%04Xav%04Xad%04X\n",
|
||||||
|
rdev->vid, rdev->did, rdev->asm_vid, rdev->asm_did);
|
||||||
|
}
|
||||||
|
|
||||||
struct device_attribute rio_dev_attrs[] = {
|
struct device_attribute rio_dev_attrs[] = {
|
||||||
__ATTR_RO(did),
|
__ATTR_RO(did),
|
||||||
__ATTR_RO(vid),
|
__ATTR_RO(vid),
|
||||||
@ -93,6 +102,7 @@ struct device_attribute rio_dev_attrs[] = {
|
|||||||
__ATTR_RO(asm_rev),
|
__ATTR_RO(asm_rev),
|
||||||
__ATTR_RO(lprev),
|
__ATTR_RO(lprev),
|
||||||
__ATTR_RO(destid),
|
__ATTR_RO(destid),
|
||||||
|
__ATTR_RO(modalias),
|
||||||
__ATTR_NULL,
|
__ATTR_NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -579,4 +579,23 @@ struct mei_cl_device_id {
|
|||||||
kernel_ulong_t driver_info;
|
kernel_ulong_t driver_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* RapidIO */
|
||||||
|
|
||||||
|
#define RIO_ANY_ID 0xffff
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct rio_device_id - RIO device identifier
|
||||||
|
* @did: RapidIO device ID
|
||||||
|
* @vid: RapidIO vendor ID
|
||||||
|
* @asm_did: RapidIO assembly device ID
|
||||||
|
* @asm_vid: RapidIO assembly vendor ID
|
||||||
|
*
|
||||||
|
* Identifies a RapidIO device based on both the device/vendor IDs and
|
||||||
|
* the assembly device/vendor IDs.
|
||||||
|
*/
|
||||||
|
struct rio_device_id {
|
||||||
|
__u16 did, vid;
|
||||||
|
__u16 asm_did, asm_vid;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* LINUX_MOD_DEVICETABLE_H */
|
#endif /* LINUX_MOD_DEVICETABLE_H */
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/rio_regs.h>
|
#include <linux/rio_regs.h>
|
||||||
|
#include <linux/mod_devicetable.h>
|
||||||
#ifdef CONFIG_RAPIDIO_DMA_ENGINE
|
#ifdef CONFIG_RAPIDIO_DMA_ENGINE
|
||||||
#include <linux/dmaengine.h>
|
#include <linux/dmaengine.h>
|
||||||
#endif
|
#endif
|
||||||
@ -396,21 +397,6 @@ struct rio_driver {
|
|||||||
|
|
||||||
#define to_rio_driver(drv) container_of(drv,struct rio_driver, driver)
|
#define to_rio_driver(drv) container_of(drv,struct rio_driver, driver)
|
||||||
|
|
||||||
/**
|
|
||||||
* struct rio_device_id - RIO device identifier
|
|
||||||
* @did: RIO device ID
|
|
||||||
* @vid: RIO vendor ID
|
|
||||||
* @asm_did: RIO assembly device ID
|
|
||||||
* @asm_vid: RIO assembly vendor ID
|
|
||||||
*
|
|
||||||
* Identifies a RIO device based on both the device/vendor IDs and
|
|
||||||
* the assembly device/vendor IDs.
|
|
||||||
*/
|
|
||||||
struct rio_device_id {
|
|
||||||
u16 did, vid;
|
|
||||||
u16 asm_did, asm_vid;
|
|
||||||
};
|
|
||||||
|
|
||||||
union rio_pw_msg {
|
union rio_pw_msg {
|
||||||
struct {
|
struct {
|
||||||
u32 comptag; /* Component Tag CSR */
|
u32 comptag; /* Component Tag CSR */
|
||||||
|
@ -13,8 +13,6 @@
|
|||||||
#ifndef LINUX_RIO_IDS_H
|
#ifndef LINUX_RIO_IDS_H
|
||||||
#define LINUX_RIO_IDS_H
|
#define LINUX_RIO_IDS_H
|
||||||
|
|
||||||
#define RIO_ANY_ID 0xffff
|
|
||||||
|
|
||||||
#define RIO_VID_FREESCALE 0x0002
|
#define RIO_VID_FREESCALE 0x0002
|
||||||
#define RIO_DID_MPC8560 0x0003
|
#define RIO_DID_MPC8560 0x0003
|
||||||
|
|
||||||
|
@ -177,5 +177,11 @@ int main(void)
|
|||||||
DEVID(mei_cl_device_id);
|
DEVID(mei_cl_device_id);
|
||||||
DEVID_FIELD(mei_cl_device_id, name);
|
DEVID_FIELD(mei_cl_device_id, name);
|
||||||
|
|
||||||
|
DEVID(rio_device_id);
|
||||||
|
DEVID_FIELD(rio_device_id, did);
|
||||||
|
DEVID_FIELD(rio_device_id, vid);
|
||||||
|
DEVID_FIELD(rio_device_id, asm_did);
|
||||||
|
DEVID_FIELD(rio_device_id, asm_vid);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1145,6 +1145,26 @@ static int do_mei_entry(const char *filename, void *symval,
|
|||||||
}
|
}
|
||||||
ADD_TO_DEVTABLE("mei", mei_cl_device_id, do_mei_entry);
|
ADD_TO_DEVTABLE("mei", mei_cl_device_id, do_mei_entry);
|
||||||
|
|
||||||
|
/* Looks like: rapidio:vNdNavNadN */
|
||||||
|
static int do_rio_entry(const char *filename,
|
||||||
|
void *symval, char *alias)
|
||||||
|
{
|
||||||
|
DEF_FIELD(symval, rio_device_id, did);
|
||||||
|
DEF_FIELD(symval, rio_device_id, vid);
|
||||||
|
DEF_FIELD(symval, rio_device_id, asm_did);
|
||||||
|
DEF_FIELD(symval, rio_device_id, asm_vid);
|
||||||
|
|
||||||
|
strcpy(alias, "rapidio:");
|
||||||
|
ADD(alias, "v", vid != RIO_ANY_ID, vid);
|
||||||
|
ADD(alias, "d", did != RIO_ANY_ID, did);
|
||||||
|
ADD(alias, "av", asm_vid != RIO_ANY_ID, asm_vid);
|
||||||
|
ADD(alias, "ad", asm_did != RIO_ANY_ID, asm_did);
|
||||||
|
|
||||||
|
add_wildcard(alias);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
ADD_TO_DEVTABLE("rapidio", rio_device_id, do_rio_entry);
|
||||||
|
|
||||||
/* Does namelen bytes of name exactly match the symbol? */
|
/* Does namelen bytes of name exactly match the symbol? */
|
||||||
static bool sym_is(const char *name, unsigned namelen, const char *symbol)
|
static bool sym_is(const char *name, unsigned namelen, const char *symbol)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user