#include "linux/module.h" #include "linux/kernel.h" #include #include "linux/i2c.h" static int ina260_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, long *val) { return 0; } static int ina260_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, long val) { return 0; } static umode_t ina260_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr, int channel){ return 0444; } #define HWMON_CHANNEL_INFO(stype, ...) \ (&(struct hwmon_channel_info) { \ .type = hwmon_##stype, \ .config = (u32 []) { \ __VA_ARGS__, 0 \ } \ }) static const struct hwmon_channel_info * ina260_info[] = { HWMON_CHANNEL_INFO(power,HWMON_P_INPUT), NULL }; static const struct hwmon_ops ina260_hwmon_ops = { .is_visible = ina260_is_visible, .read = ina260_read, .write = ina260_write, }; static const struct hwmon_chip_info ina260_chip_info = { .ops = &ina260_hwmon_ops, .info = ina260_info, }; /*const struct attribute_group *extra_groups[] = { NULL };*/ static int ina260_probe_new(struct i2c_client *client){ struct device *hwmon_dev; hwmon_dev=hwmon_device_register_with_info(&client->dev,client->name,NULL, &ina260_chip_info,NULL); if (IS_ERR(hwmon_dev)) return PTR_ERR(hwmon_dev); return 0; } static int ina260_remove(struct i2c_client *client){ hwmon_device_unregister(&client->dev); return 0; } static const struct i2c_device_id ina260_ids[] = { { "ina260", 0 }, { } }; MODULE_DEVICE_TABLE(i2c,ina260_ids); static struct i2c_driver ina260_driver = { .class = I2C_CLASS_HWMON, .driver = { .name = "ina260HWMON" }, .probe_new = ina260_probe_new, .remove = ina260_remove, .id_table = ina260_ids }; static int __init ina260_init(void){ printk("Init\n"); i2c_add_driver(&ina260_driver); return 0; } static void __exit ina260_exit(void){ printk("Quit\n"); i2c_del_driver(&ina260_driver); } module_init(ina260_init); module_exit(ina260_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Loïc Guegan"); MODULE_DESCRIPTION("INA260 Texas Instruments"); MODULE_VERSION("1.0");