Input: tsc2005 - hide selftest attribute if we can't reset
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 17 Mar 2011 05:10:37 +0000 (22:10 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 17 Mar 2011 06:29:00 +0000 (23:29 -0700)
If implementation to perform self-test/reset has not been provided by the
platform code hide 'selftest' sysfs attribute instead of returning error
when someone tries to use it.

Tested-by: Aaro Koskinen <aaro.koskinen@nokia.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/touchscreen/tsc2005.c

index de170e9dc54ac4fa842d4f2d49b36fa6ee179603..bc7e2f974b7ee1c0ee36ca338e4016f3972ad769 100644 (file)
@@ -411,13 +411,6 @@ static ssize_t tsc2005_selftest_show(struct device *dev,
        u16 temp_high_test;
        unsigned int result;
 
-       if (!ts->set_reset) {
-               dev_warn(&ts->spi->dev,
-                        "unable to selftest: no reset function\n");
-               result = 0;
-               goto out;
-       }
-
        mutex_lock(&ts->mutex);
 
        /*
@@ -451,11 +444,38 @@ static ssize_t tsc2005_selftest_show(struct device *dev,
 
        mutex_unlock(&ts->mutex);
 
-out:
        return sprintf(buf, "%u\n", result);
 }
+
 static DEVICE_ATTR(selftest, S_IRUGO, tsc2005_selftest_show, NULL);
 
+static struct attribute *tsc2005_attrs[] = {
+       &dev_attr_disable.attr,
+       &dev_attr_selftest.attr,
+       NULL
+};
+
+static mode_t tsc2005_attr_is_visible(struct kobject *kobj,
+                                     struct attribute *attr, int n)
+{
+       struct device *dev = container_of(kobj, struct device, kobj);
+       struct spi_device *spi = to_spi_device(dev);
+       struct tsc2005 *ts = spi_get_drvdata(spi);
+       mode_t mode = attr->mode;
+
+       if (attr == &dev_attr_selftest.attr) {
+               if (!ts->set_reset)
+                       mode = 0;
+       }
+
+       return mode;
+}
+
+static const struct attribute_group tsc2005_attr_group = {
+       .is_visible     = tsc2005_attr_is_visible,
+       .attrs          = tsc2005_attrs,
+};
+
 static void tsc2005_esd_timer(unsigned long data)
 {
        struct tsc2005 *ts = (struct tsc2005 *)data;
@@ -495,16 +515,6 @@ out:
        mutex_unlock(&ts->mutex);
 }
 
-static struct attribute *tsc2005_attrs[] = {
-       &dev_attr_disable.attr,
-       &dev_attr_selftest.attr,
-       NULL
-};
-
-static struct attribute_group tsc2005_attr_group = {
-       .attrs = tsc2005_attrs,
-};
-
 static void __devinit tsc2005_setup_spi_xfer(struct tsc2005 *ts)
 {
        tsc2005_setup_read(&ts->spi_x, TSC2005_REG_X, 0);