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
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <49152F4E.5040003@shikadi.net>
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

Powered by Openwall GNU/*/Linux Powered by OpenVZ