aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Thumshirn <jthumshirn@suse.de>2016-05-03 03:46:23 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-05-03 18:07:35 -0400
commit803f1ca60d5c0107adfbce4e2d70488598b03a80 (patch)
tree763936d780406f59bef75b19d91f674a855345ba
parent18d28819809909c3f24bb72183a901c5e332a63d (diff)
mcb: export bus information via sysfs
Export information about the bus stored in the FPGA's header to userspace via sysfs, instead of hiding it in pr_debug()s from everyone. Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Andreas Werner <andreas.werner@men.de> Tested-by: Andreas Werner <andreas.werner@men.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--Documentation/ABI/testing/sysfs-bus-mcb29
-rw-r--r--drivers/mcb/mcb-core.c60
-rw-r--r--drivers/mcb/mcb-internal.h1
-rw-r--r--drivers/mcb/mcb-parse.c15
-rw-r--r--include/linux/mcb.h9
5 files changed, 103 insertions, 11 deletions
diff --git a/Documentation/ABI/testing/sysfs-bus-mcb b/Documentation/ABI/testing/sysfs-bus-mcb
new file mode 100644
index 000000000000..77947c509796
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-bus-mcb
@@ -0,0 +1,29 @@
1What: /sys/bus/mcb/devices/mcb:X
2Date: March 2016
3KernelVersion: 4.7
4Contact: Johannes Thumshirn <jth@kernel.org>
5Description: Hardware chip or device hosting the MEN chameleon bus
6
7What: /sys/bus/mcb/devices/mcb:X/revision
8Date: March 2016
9KernelVersion: 4.7
10Contact: Johannes Thumshirn <jth@kernel.org>
11Description: The FPGA's revision number
12
13What: /sys/bus/mcb/devices/mcb:X/minor
14Date: March 2016
15KernelVersion: 4.7
16Contact: Johannes Thumshirn <jth@kernel.org>
17Description: The FPGA's minor number
18
19What: /sys/bus/mcb/devices/mcb:X/model
20Date: March 2016
21KernelVersion: 4.7
22Contact: Johannes Thumshirn <jth@kernel.org>
23Description: The FPGA's model number
24
25What: /sys/bus/mcb/devices/mcb:X/name
26Date: March 2016
27KernelVersion: 4.7
28Contact: Johannes Thumshirn <jth@kernel.org>
29Description: The FPGA's name
diff --git a/drivers/mcb/mcb-core.c b/drivers/mcb/mcb-core.c
index 1e336cc56751..9ae4d15fc229 100644
--- a/drivers/mcb/mcb-core.c
+++ b/drivers/mcb/mcb-core.c
@@ -90,6 +90,60 @@ static void mcb_shutdown(struct device *dev)
90 mdrv->shutdown(mdev); 90 mdrv->shutdown(mdev);
91} 91}
92 92
93static ssize_t revision_show(struct device *dev, struct device_attribute *attr,
94 char *buf)
95{
96 struct mcb_bus *bus = to_mcb_bus(dev);
97
98 return scnprintf(buf, PAGE_SIZE, "%d\n", bus->revision);
99}
100static DEVICE_ATTR_RO(revision);
101
102static ssize_t model_show(struct device *dev, struct device_attribute *attr,
103 char *buf)
104{
105 struct mcb_bus *bus = to_mcb_bus(dev);
106
107 return scnprintf(buf, PAGE_SIZE, "%c\n", bus->model);
108}
109static DEVICE_ATTR_RO(model);
110
111static ssize_t minor_show(struct device *dev, struct device_attribute *attr,
112 char *buf)
113{
114 struct mcb_bus *bus = to_mcb_bus(dev);
115
116 return scnprintf(buf, PAGE_SIZE, "%d\n", bus->minor);
117}
118static DEVICE_ATTR_RO(minor);
119
120static ssize_t name_show(struct device *dev, struct device_attribute *attr,
121 char *buf)
122{
123 struct mcb_bus *bus = to_mcb_bus(dev);
124
125 return scnprintf(buf, PAGE_SIZE, "%s\n", bus->name);
126}
127static DEVICE_ATTR_RO(name);
128
129static struct attribute *mcb_bus_attrs[] = {
130 &dev_attr_revision.attr,
131 &dev_attr_model.attr,
132 &dev_attr_minor.attr,
133 &dev_attr_name.attr,
134 NULL,
135};
136
137static const struct attribute_group mcb_carrier_group = {
138 .attrs = mcb_bus_attrs,
139};
140
141static const struct attribute_group *mcb_carrier_groups[] = {
142 &mcb_carrier_group,
143 NULL,
144};
145
146
93static struct bus_type mcb_bus_type = { 147static struct bus_type mcb_bus_type = {
94 .name = "mcb", 148 .name = "mcb",
95 .match = mcb_match, 149 .match = mcb_match,
@@ -99,6 +153,11 @@ static struct bus_type mcb_bus_type = {
99 .shutdown = mcb_shutdown, 153 .shutdown = mcb_shutdown,
100}; 154};
101 155
156static struct device_type mcb_carrier_device_type = {
157 .name = "mcb-carrier",
158 .groups = mcb_carrier_groups,
159};
160
102/** 161/**
103 * __mcb_register_driver() - Register a @mcb_driver at the system 162 * __mcb_register_driver() - Register a @mcb_driver at the system
104 * @drv: The @mcb_driver 163 * @drv: The @mcb_driver
@@ -205,6 +264,7 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier)
205 device_initialize(&bus->dev); 264 device_initialize(&bus->dev);
206 bus->dev.parent = carrier; 265 bus->dev.parent = carrier;
207 bus->dev.bus = &mcb_bus_type; 266 bus->dev.bus = &mcb_bus_type;
267 bus->dev.type = &mcb_carrier_device_type;
208 268
209 dev_set_name(&bus->dev, "mcb:%d", bus_nr); 269 dev_set_name(&bus->dev, "mcb:%d", bus_nr);
210 rc = device_add(&bus->dev); 270 rc = device_add(&bus->dev);
diff --git a/drivers/mcb/mcb-internal.h b/drivers/mcb/mcb-internal.h
index fb7493dcfb79..5254e0285725 100644
--- a/drivers/mcb/mcb-internal.h
+++ b/drivers/mcb/mcb-internal.h
@@ -5,7 +5,6 @@
5 5
6#define PCI_VENDOR_ID_MEN 0x1a88 6#define PCI_VENDOR_ID_MEN 0x1a88
7#define PCI_DEVICE_ID_MEN_CHAMELEON 0x4d45 7#define PCI_DEVICE_ID_MEN_CHAMELEON 0x4d45
8#define CHAMELEON_FILENAME_LEN 12
9#define CHAMELEONV2_MAGIC 0xabce 8#define CHAMELEONV2_MAGIC 0xabce
10#define CHAM_HEADER_SIZE 0x200 9#define CHAM_HEADER_SIZE 0x200
11 10
diff --git a/drivers/mcb/mcb-parse.c b/drivers/mcb/mcb-parse.c
index 004926955263..35f385b59221 100644
--- a/drivers/mcb/mcb-parse.c
+++ b/drivers/mcb/mcb-parse.c
@@ -113,16 +113,11 @@ int chameleon_parse_cells(struct mcb_bus *bus, phys_addr_t mapbase,
113 } 113 }
114 p += hsize; 114 p += hsize;
115 115
116 pr_debug("header->revision = %d\n", header->revision); 116 bus->revision = header->revision;
117 pr_debug("header->model = 0x%x ('%c')\n", header->model, 117 bus->model = header->model;
118 header->model); 118 bus->minor = header->minor;
119 pr_debug("header->minor = %d\n", header->minor); 119 snprintf(bus->name, CHAMELEON_FILENAME_LEN + 1, "%s",
120 pr_debug("header->bus_type = 0x%x\n", header->bus_type); 120 header->filename);
121
122
123 pr_debug("header->magic = 0x%x\n", header->magic);
124 pr_debug("header->filename = \"%.*s\"\n", CHAMELEON_FILENAME_LEN,
125 header->filename);
126 121
127 for_each_chameleon_cell(dtype, p) { 122 for_each_chameleon_cell(dtype, p) {
128 switch (dtype) { 123 switch (dtype) {
diff --git a/include/linux/mcb.h b/include/linux/mcb.h
index 3efafbca166d..ead13d233a97 100644
--- a/include/linux/mcb.h
+++ b/include/linux/mcb.h
@@ -15,6 +15,8 @@
15#include <linux/device.h> 15#include <linux/device.h>
16#include <linux/irqreturn.h> 16#include <linux/irqreturn.h>
17 17
18#define CHAMELEON_FILENAME_LEN 12
19
18struct mcb_driver; 20struct mcb_driver;
19struct mcb_device; 21struct mcb_device;
20 22
@@ -25,11 +27,18 @@ struct mcb_device;
25 * @carrier: pointer to carrier device 27 * @carrier: pointer to carrier device
26 * @bus_nr: mcb bus number 28 * @bus_nr: mcb bus number
27 * @get_irq: callback to get IRQ number 29 * @get_irq: callback to get IRQ number
30 * @revision: the FPGA's revision number
31 * @model: the FPGA's model number
32 * @filename: the FPGA's name
28 */ 33 */
29struct mcb_bus { 34struct mcb_bus {
30 struct device dev; 35 struct device dev;
31 struct device *carrier; 36 struct device *carrier;
32 int bus_nr; 37 int bus_nr;
38 u8 revision;
39 char model;
40 u8 minor;
41 char name[CHAMELEON_FILENAME_LEN + 1];
33 int (*get_irq)(struct mcb_device *dev); 42 int (*get_irq)(struct mcb_device *dev);
34}; 43};
35#define to_mcb_bus(b) container_of((b), struct mcb_bus, dev) 44#define to_mcb_bus(b) container_of((b), struct mcb_bus, dev)