Input: ads7846 - convert to hwmon_device_register_with_groups()
authorGuenter Roeck <linux@roeck-us.net>
Thu, 28 Nov 2013 04:08:33 +0000 (20:08 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 16 Dec 2013 10:13:26 +0000 (02:13 -0800)
Simplify the code and create mandatory 'name' attribute by using
new hwmon API.

Also use is_visible to determine visible attributes instead of creating
several different attribute groups.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/ads7846.c

index 569578638233b6b49bd638916cfc5eb1ea55c13e..f91592ab2f3aac006889068e91f842b07accb73c 100644 (file)
@@ -102,7 +102,6 @@ struct ads7846 {
        struct regulator        *reg;
 
 #if IS_ENABLED(CONFIG_HWMON)
-       struct attribute_group  *attr_group;
        struct device           *hwmon;
 #endif
 
@@ -479,42 +478,36 @@ static inline unsigned vbatt_adjust(struct ads7846 *ts, ssize_t v)
 SHOW(in0_input, vaux, vaux_adjust)
 SHOW(in1_input, vbatt, vbatt_adjust)
 
-static struct attribute *ads7846_attributes[] = {
-       &dev_attr_temp0.attr,
-       &dev_attr_temp1.attr,
-       &dev_attr_in0_input.attr,
-       &dev_attr_in1_input.attr,
-       NULL,
-};
-
-static struct attribute_group ads7846_attr_group = {
-       .attrs = ads7846_attributes,
-};
+static umode_t ads7846_is_visible(struct kobject *kobj, struct attribute *attr,
+                                 int index)
+{
+       struct device *dev = container_of(kobj, struct device, kobj);
+       struct ads7846 *ts = dev_get_drvdata(dev);
 
-static struct attribute *ads7843_attributes[] = {
-       &dev_attr_in0_input.attr,
-       &dev_attr_in1_input.attr,
-       NULL,
-};
+       if (ts->model == 7843 && index < 2)     /* in0, in1 */
+               return 0;
+       if (ts->model == 7845 && index != 2)    /* in0 */
+               return 0;
 
-static struct attribute_group ads7843_attr_group = {
-       .attrs = ads7843_attributes,
-};
+       return attr->mode;
+}
 
-static struct attribute *ads7845_attributes[] = {
-       &dev_attr_in0_input.attr,
+static struct attribute *ads7846_attributes[] = {
+       &dev_attr_temp0.attr,           /* 0 */
+       &dev_attr_temp1.attr,           /* 1 */
+       &dev_attr_in0_input.attr,       /* 2 */
+       &dev_attr_in1_input.attr,       /* 3 */
        NULL,
 };
 
-static struct attribute_group ads7845_attr_group = {
-       .attrs = ads7845_attributes,
+static struct attribute_group ads7846_attr_group = {
+       .attrs = ads7846_attributes,
+       .is_visible = ads7846_is_visible,
 };
+__ATTRIBUTE_GROUPS(ads7846_attr);
 
 static int ads784x_hwmon_register(struct spi_device *spi, struct ads7846 *ts)
 {
-       struct device *hwmon;
-       int err;
-
        /* hwmon sensors need a reference voltage */
        switch (ts->model) {
        case 7846:
@@ -535,43 +528,19 @@ static int ads784x_hwmon_register(struct spi_device *spi, struct ads7846 *ts)
                break;
        }
 
-       /* different chips have different sensor groups */
-       switch (ts->model) {
-       case 7846:
-               ts->attr_group = &ads7846_attr_group;
-               break;
-       case 7845:
-               ts->attr_group = &ads7845_attr_group;
-               break;
-       case 7843:
-               ts->attr_group = &ads7843_attr_group;
-               break;
-       default:
-               dev_dbg(&spi->dev, "ADS%d not recognized\n", ts->model);
-               return 0;
-       }
-
-       err = sysfs_create_group(&spi->dev.kobj, ts->attr_group);
-       if (err)
-               return err;
-
-       hwmon = hwmon_device_register(&spi->dev);
-       if (IS_ERR(hwmon)) {
-               sysfs_remove_group(&spi->dev.kobj, ts->attr_group);
-               return PTR_ERR(hwmon);
-       }
+       ts->hwmon = hwmon_device_register_with_groups(&spi->dev, spi->modalias,
+                                                     ts, ads7846_attr_groups);
+       if (IS_ERR(ts->hwmon))
+               return PTR_ERR(ts->hwmon);
 
-       ts->hwmon = hwmon;
        return 0;
 }
 
 static void ads784x_hwmon_unregister(struct spi_device *spi,
                                     struct ads7846 *ts)
 {
-       if (ts->hwmon) {
-               sysfs_remove_group(&spi->dev.kobj, ts->attr_group);
+       if (ts->hwmon)
                hwmon_device_unregister(ts->hwmon);
-       }
 }
 
 #else