Skip to content

Commit

Permalink
rapidio: add udev notification
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Matt Porter <[email protected]>
Cc: Li Yang <[email protected]>
Cc: Kumar Gala <[email protected]>
Cc: Andre van Herk <[email protected]>
Cc: Micha Nelissen <[email protected]>
Cc: Stef van Os <[email protected]>
Cc: Jean Delvare <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Alexandre Bounine authored and torvalds committed Jul 3, 2013
1 parent fdf90ab commit 3bdbb62
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 17 deletions.
18 changes: 18 additions & 0 deletions drivers/rapidio/rio-driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,23 @@ static int rio_match_bus(struct device *dev, struct device_driver *drv)
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 = {
.init_name = "rapidio",
};
Expand All @@ -210,6 +227,7 @@ struct bus_type rio_bus_type = {
.bus_attrs = rio_bus_attrs,
.probe = rio_device_probe,
.remove = rio_device_remove,
.uevent = rio_uevent,
};

/**
Expand Down
10 changes: 10 additions & 0 deletions drivers/rapidio/rio-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,15 @@ static ssize_t lnext_show(struct device *dev,
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[] = {
__ATTR_RO(did),
__ATTR_RO(vid),
Expand All @@ -93,6 +102,7 @@ struct device_attribute rio_dev_attrs[] = {
__ATTR_RO(asm_rev),
__ATTR_RO(lprev),
__ATTR_RO(destid),
__ATTR_RO(modalias),
__ATTR_NULL,
};

Expand Down
19 changes: 19 additions & 0 deletions include/linux/mod_devicetable.h
Original file line number Diff line number Diff line change
Expand Up @@ -579,4 +579,23 @@ struct mei_cl_device_id {
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 */
16 changes: 1 addition & 15 deletions include/linux/rio.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <linux/errno.h>
#include <linux/device.h>
#include <linux/rio_regs.h>
#include <linux/mod_devicetable.h>
#ifdef CONFIG_RAPIDIO_DMA_ENGINE
#include <linux/dmaengine.h>
#endif
Expand Down Expand Up @@ -396,21 +397,6 @@ struct rio_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 {
struct {
u32 comptag; /* Component Tag CSR */
Expand Down
2 changes: 0 additions & 2 deletions include/linux/rio_ids.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@
#ifndef LINUX_RIO_IDS_H
#define LINUX_RIO_IDS_H

#define RIO_ANY_ID 0xffff

#define RIO_VID_FREESCALE 0x0002
#define RIO_DID_MPC8560 0x0003

Expand Down
6 changes: 6 additions & 0 deletions scripts/mod/devicetable-offsets.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,5 +177,11 @@ int main(void)
DEVID(mei_cl_device_id);
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;
}
20 changes: 20 additions & 0 deletions scripts/mod/file2alias.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

/* 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? */
static bool sym_is(const char *name, unsigned namelen, const char *symbol)
{
Expand Down

0 comments on commit 3bdbb62

Please sign in to comment.