lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sat, 08 Nov 2008 16:18:54 +1000 From: Adam Nielsen <a.nielsen@...kadi.net> To: Jiri Slaby <jirislaby@...il.com> CC: LKML Mailinglist <linux-kernel@...r.kernel.org> Subject: hid class and sysfs/hwmon (was: led and hid class - hid_device vs led_classdev) >> static void my_led_set(struct led_classdev *led_cdev, >> enum led_brightness value) >> { >> /* How do I get my_data back? */ >> } >> > > my_led should by part of my_data, then you do > my_data = container_of(led_cdev, /*typeof(my_data)*/, my_led); That did the trick, thanks! I hadn't realised what container_of() was meant to be for - that's quite a useful little macro! I got that working (can switch the LED on and off via the led device) but now I'm stuck trying to implement a hwmon interface for the device's sensors. As far as I can tell I'm doing everything fine, but for some reason the hwmon interface gets created but with no files inside it (apart from a few defaults.) It's supposed to have files like "temp1_input" to report temperatures, but these files never appear. The only thing that I'm unsure of is the first parameter to sysfs_create_group(). All the other drivers use something like i2c_client.dev.kobj or platform_device.dev.kobj, but I'm using hid_device.dev.kobj. I'm guessing that should work just as well, but I can't figure out why else the sysfs files never appear in the new hwmon folder in /sys/class/hwmon/ Here is the code so far, if it's useful: (I've omitted all the error checking code for clarity, all the functions called here return success) -------------------------------------------- static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); static struct attribute *odin_attributes[] = { &sensor_dev_attr_temp1_input.dev_attr.attr, NULL }; static const struct attribute_group odin_attr_group = { .attrs = odin_attributes, }; static int odin_probe(struct hid_device *hdev, const struct hid_device_id *id) { hid_parse(hdev); hid_hw_start(hdev, HID_CONNECT_DEFAULT); odin_psu = kzalloc(sizeof(struct odin_psu_device), GFP_KERNEL); odin_psu->hdev = hdev; hid_set_drvdata(hdev, odin_psu); sysfs_create_group(&hdev->dev.kobj, &odin_attr_group); odin_psu->hwmon_dev = hwmon_device_register(&hdev->dev); return 0; } -------------------------------------------- $ ls /sys/class/hwmon/hwmon5/ total 0 drwxr-xr-x 3 root root 0 2008-11-08 14:50 . drwxr-xr-x 8 root root 0 2008-11-08 14:50 .. lrwxrwxrwx 1 root root 0 2008-11-08 14:50 device -> ../../../devices/pci0000:00/0000:00:1d.2/usb8/8-1/8-1:1.0/0003:1044:4001.0001 drwxr-xr-x 2 root root 0 2008-11-08 14:50 power lrwxrwxrwx 1 root root 0 2008-11-08 14:50 subsystem -> ../../hwmon -rw-r--r-- 1 root root 4.0K 2008-11-08 14:50 uevent -------------------------------------------- If anyone can see why this might result in no sysfs files, please let me know! I previously had most of this code working with a platform_device instead of the hid_device, which is what makes me wonder about hdev->dev.kobj. (Not sure how to test if that variable is accurate, either.) Or perhaps it has already been used elsewhere and it can only be used once? Thanks, Adam. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists