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

Configure Feed

Select the types of activity you want to include in your feed.

at v3.10-rc4 145 lines 4.7 kB view raw
1/* 2 * 3 * TWL4030 MADC Hwmon driver-This driver monitors the real time 4 * conversion of analog signals like battery temperature, 5 * battery type, battery level etc. User can ask for the conversion on a 6 * particular channel using the sysfs nodes. 7 * 8 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ 9 * J Keerthy <j-keerthy@ti.com> 10 * 11 * This program is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU General Public License 13 * version 2 as published by the Free Software Foundation. 14 * 15 * This program is distributed in the hope that it will be useful, but 16 * WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 23 * 02110-1301 USA 24 * 25 */ 26#include <linux/init.h> 27#include <linux/module.h> 28#include <linux/kernel.h> 29#include <linux/i2c/twl.h> 30#include <linux/device.h> 31#include <linux/platform_device.h> 32#include <linux/i2c/twl4030-madc.h> 33#include <linux/hwmon.h> 34#include <linux/hwmon-sysfs.h> 35#include <linux/stddef.h> 36#include <linux/sysfs.h> 37#include <linux/err.h> 38#include <linux/types.h> 39 40/* 41 * sysfs hook function 42 */ 43static ssize_t madc_read(struct device *dev, 44 struct device_attribute *devattr, char *buf) 45{ 46 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 47 struct twl4030_madc_request req = { 48 .channels = 1 << attr->index, 49 .method = TWL4030_MADC_SW2, 50 .type = TWL4030_MADC_WAIT, 51 }; 52 long val; 53 54 val = twl4030_madc_conversion(&req); 55 if (val < 0) 56 return val; 57 58 return sprintf(buf, "%d\n", req.rbuf[attr->index]); 59} 60 61/* sysfs nodes to read individual channels from user side */ 62static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, madc_read, NULL, 0); 63static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, madc_read, NULL, 1); 64static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, madc_read, NULL, 2); 65static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, madc_read, NULL, 3); 66static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, madc_read, NULL, 4); 67static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, madc_read, NULL, 5); 68static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, madc_read, NULL, 6); 69static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, madc_read, NULL, 7); 70static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, madc_read, NULL, 8); 71static SENSOR_DEVICE_ATTR(in9_input, S_IRUGO, madc_read, NULL, 9); 72static SENSOR_DEVICE_ATTR(curr10_input, S_IRUGO, madc_read, NULL, 10); 73static SENSOR_DEVICE_ATTR(in11_input, S_IRUGO, madc_read, NULL, 11); 74static SENSOR_DEVICE_ATTR(in12_input, S_IRUGO, madc_read, NULL, 12); 75static SENSOR_DEVICE_ATTR(in15_input, S_IRUGO, madc_read, NULL, 15); 76 77static struct attribute *twl4030_madc_attributes[] = { 78 &sensor_dev_attr_in0_input.dev_attr.attr, 79 &sensor_dev_attr_temp1_input.dev_attr.attr, 80 &sensor_dev_attr_in2_input.dev_attr.attr, 81 &sensor_dev_attr_in3_input.dev_attr.attr, 82 &sensor_dev_attr_in4_input.dev_attr.attr, 83 &sensor_dev_attr_in5_input.dev_attr.attr, 84 &sensor_dev_attr_in6_input.dev_attr.attr, 85 &sensor_dev_attr_in7_input.dev_attr.attr, 86 &sensor_dev_attr_in8_input.dev_attr.attr, 87 &sensor_dev_attr_in9_input.dev_attr.attr, 88 &sensor_dev_attr_curr10_input.dev_attr.attr, 89 &sensor_dev_attr_in11_input.dev_attr.attr, 90 &sensor_dev_attr_in12_input.dev_attr.attr, 91 &sensor_dev_attr_in15_input.dev_attr.attr, 92 NULL 93}; 94 95static const struct attribute_group twl4030_madc_group = { 96 .attrs = twl4030_madc_attributes, 97}; 98 99static int twl4030_madc_hwmon_probe(struct platform_device *pdev) 100{ 101 int ret; 102 struct device *hwmon; 103 104 ret = sysfs_create_group(&pdev->dev.kobj, &twl4030_madc_group); 105 if (ret) 106 goto err_sysfs; 107 hwmon = hwmon_device_register(&pdev->dev); 108 if (IS_ERR(hwmon)) { 109 dev_err(&pdev->dev, "hwmon_device_register failed.\n"); 110 ret = PTR_ERR(hwmon); 111 goto err_reg; 112 } 113 114 return 0; 115 116err_reg: 117 sysfs_remove_group(&pdev->dev.kobj, &twl4030_madc_group); 118err_sysfs: 119 120 return ret; 121} 122 123static int twl4030_madc_hwmon_remove(struct platform_device *pdev) 124{ 125 hwmon_device_unregister(&pdev->dev); 126 sysfs_remove_group(&pdev->dev.kobj, &twl4030_madc_group); 127 128 return 0; 129} 130 131static struct platform_driver twl4030_madc_hwmon_driver = { 132 .probe = twl4030_madc_hwmon_probe, 133 .remove = twl4030_madc_hwmon_remove, 134 .driver = { 135 .name = "twl4030_madc_hwmon", 136 .owner = THIS_MODULE, 137 }, 138}; 139 140module_platform_driver(twl4030_madc_hwmon_driver); 141 142MODULE_DESCRIPTION("TWL4030 ADC Hwmon driver"); 143MODULE_LICENSE("GPL"); 144MODULE_AUTHOR("J Keerthy"); 145MODULE_ALIAS("platform:twl4030_madc_hwmon");