Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Johannes Thumshirn and committed by
Greg Kroah-Hartman
803f1ca6 18d28819

+103 -11
+29
Documentation/ABI/testing/sysfs-bus-mcb
··· 1 + What: /sys/bus/mcb/devices/mcb:X 2 + Date: March 2016 3 + KernelVersion: 4.7 4 + Contact: Johannes Thumshirn <jth@kernel.org> 5 + Description: Hardware chip or device hosting the MEN chameleon bus 6 + 7 + What: /sys/bus/mcb/devices/mcb:X/revision 8 + Date: March 2016 9 + KernelVersion: 4.7 10 + Contact: Johannes Thumshirn <jth@kernel.org> 11 + Description: The FPGA's revision number 12 + 13 + What: /sys/bus/mcb/devices/mcb:X/minor 14 + Date: March 2016 15 + KernelVersion: 4.7 16 + Contact: Johannes Thumshirn <jth@kernel.org> 17 + Description: The FPGA's minor number 18 + 19 + What: /sys/bus/mcb/devices/mcb:X/model 20 + Date: March 2016 21 + KernelVersion: 4.7 22 + Contact: Johannes Thumshirn <jth@kernel.org> 23 + Description: The FPGA's model number 24 + 25 + What: /sys/bus/mcb/devices/mcb:X/name 26 + Date: March 2016 27 + KernelVersion: 4.7 28 + Contact: Johannes Thumshirn <jth@kernel.org> 29 + Description: The FPGA's name
+60
drivers/mcb/mcb-core.c
··· 90 90 mdrv->shutdown(mdev); 91 91 } 92 92 93 + static 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 + } 100 + static DEVICE_ATTR_RO(revision); 101 + 102 + static 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 + } 109 + static DEVICE_ATTR_RO(model); 110 + 111 + static 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 + } 118 + static DEVICE_ATTR_RO(minor); 119 + 120 + static 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 + } 127 + static DEVICE_ATTR_RO(name); 128 + 129 + static 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 + 137 + static const struct attribute_group mcb_carrier_group = { 138 + .attrs = mcb_bus_attrs, 139 + }; 140 + 141 + static const struct attribute_group *mcb_carrier_groups[] = { 142 + &mcb_carrier_group, 143 + NULL, 144 + }; 145 + 146 + 93 147 static struct bus_type mcb_bus_type = { 94 148 .name = "mcb", 95 149 .match = mcb_match, ··· 151 97 .probe = mcb_probe, 152 98 .remove = mcb_remove, 153 99 .shutdown = mcb_shutdown, 100 + }; 101 + 102 + static struct device_type mcb_carrier_device_type = { 103 + .name = "mcb-carrier", 104 + .groups = mcb_carrier_groups, 154 105 }; 155 106 156 107 /** ··· 264 205 device_initialize(&bus->dev); 265 206 bus->dev.parent = carrier; 266 207 bus->dev.bus = &mcb_bus_type; 208 + bus->dev.type = &mcb_carrier_device_type; 267 209 268 210 dev_set_name(&bus->dev, "mcb:%d", bus_nr); 269 211 rc = device_add(&bus->dev);
-1
drivers/mcb/mcb-internal.h
··· 5 5 6 6 #define PCI_VENDOR_ID_MEN 0x1a88 7 7 #define PCI_DEVICE_ID_MEN_CHAMELEON 0x4d45 8 - #define CHAMELEON_FILENAME_LEN 12 9 8 #define CHAMELEONV2_MAGIC 0xabce 10 9 #define CHAM_HEADER_SIZE 0x200 11 10
+5 -10
drivers/mcb/mcb-parse.c
··· 113 113 } 114 114 p += hsize; 115 115 116 - pr_debug("header->revision = %d\n", header->revision); 117 - pr_debug("header->model = 0x%x ('%c')\n", header->model, 118 - header->model); 119 - pr_debug("header->minor = %d\n", header->minor); 120 - pr_debug("header->bus_type = 0x%x\n", header->bus_type); 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); 116 + bus->revision = header->revision; 117 + bus->model = header->model; 118 + bus->minor = header->minor; 119 + snprintf(bus->name, CHAMELEON_FILENAME_LEN + 1, "%s", 120 + header->filename); 126 121 127 122 for_each_chameleon_cell(dtype, p) { 128 123 switch (dtype) {
+9
include/linux/mcb.h
··· 15 15 #include <linux/device.h> 16 16 #include <linux/irqreturn.h> 17 17 18 + #define CHAMELEON_FILENAME_LEN 12 19 + 18 20 struct mcb_driver; 19 21 struct mcb_device; 20 22 ··· 27 25 * @carrier: pointer to carrier device 28 26 * @bus_nr: mcb bus number 29 27 * @get_irq: callback to get IRQ number 28 + * @revision: the FPGA's revision number 29 + * @model: the FPGA's model number 30 + * @filename: the FPGA's name 30 31 */ 31 32 struct mcb_bus { 32 33 struct device dev; 33 34 struct device *carrier; 34 35 int bus_nr; 36 + u8 revision; 37 + char model; 38 + u8 minor; 39 + char name[CHAMELEON_FILENAME_LEN + 1]; 35 40 int (*get_irq)(struct mcb_device *dev); 36 41 }; 37 42 #define to_mcb_bus(b) container_of((b), struct mcb_bus, dev)