aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2011-03-17 01:10:37 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2011-03-17 02:29:00 -0400
commit8dbcc432c2b4adf4ff7183afc5f2b42276b2a987 (patch)
treef944bc8f99c380c2fe9090a038d4a0ebeb5ea60c
parent99bb892d8a3f4f384d61e5d20499247a7cdd3d74 (diff)
Input: tsc2005 - hide selftest attribute if we can't reset
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>
-rw-r--r--drivers/input/touchscreen/tsc2005.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/drivers/input/touchscreen/tsc2005.c b/drivers/input/touchscreen/tsc2005.c
index de170e9dc54a..bc7e2f974b7e 100644
--- a/drivers/input/touchscreen/tsc2005.c
+++ b/drivers/input/touchscreen/tsc2005.c
@@ -411,13 +411,6 @@ static ssize_t tsc2005_selftest_show(struct device *dev,
411 u16 temp_high_test; 411 u16 temp_high_test;
412 unsigned int result; 412 unsigned int result;
413 413
414 if (!ts->set_reset) {
415 dev_warn(&ts->spi->dev,
416 "unable to selftest: no reset function\n");
417 result = 0;
418 goto out;
419 }
420
421 mutex_lock(&ts->mutex); 414 mutex_lock(&ts->mutex);
422 415
423 /* 416 /*
@@ -451,11 +444,38 @@ static ssize_t tsc2005_selftest_show(struct device *dev,
451 444
452 mutex_unlock(&ts->mutex); 445 mutex_unlock(&ts->mutex);
453 446
454out:
455 return sprintf(buf, "%u\n", result); 447 return sprintf(buf, "%u\n", result);
456} 448}
449
457static DEVICE_ATTR(selftest, S_IRUGO, tsc2005_selftest_show, NULL); 450static DEVICE_ATTR(selftest, S_IRUGO, tsc2005_selftest_show, NULL);
458 451
452static struct attribute *tsc2005_attrs[] = {
453 &dev_attr_disable.attr,
454 &dev_attr_selftest.attr,
455 NULL
456};
457
458static mode_t tsc2005_attr_is_visible(struct kobject *kobj,
459 struct attribute *attr, int n)
460{
461 struct device *dev = container_of(kobj, struct device, kobj);
462 struct spi_device *spi = to_spi_device(dev);
463 struct tsc2005 *ts = spi_get_drvdata(spi);
464 mode_t mode = attr->mode;
465
466 if (attr == &dev_attr_selftest.attr) {
467 if (!ts->set_reset)
468 mode = 0;
469 }
470
471 return mode;
472}
473
474static const struct attribute_group tsc2005_attr_group = {
475 .is_visible = tsc2005_attr_is_visible,
476 .attrs = tsc2005_attrs,
477};
478
459static void tsc2005_esd_timer(unsigned long data) 479static void tsc2005_esd_timer(unsigned long data)
460{ 480{
461 struct tsc2005 *ts = (struct tsc2005 *)data; 481 struct tsc2005 *ts = (struct tsc2005 *)data;
@@ -495,16 +515,6 @@ out:
495 mutex_unlock(&ts->mutex); 515 mutex_unlock(&ts->mutex);
496} 516}
497 517
498static struct attribute *tsc2005_attrs[] = {
499 &dev_attr_disable.attr,
500 &dev_attr_selftest.attr,
501 NULL
502};
503
504static struct attribute_group tsc2005_attr_group = {
505 .attrs = tsc2005_attrs,
506};
507
508static void __devinit tsc2005_setup_spi_xfer(struct tsc2005 *ts) 518static void __devinit tsc2005_setup_spi_xfer(struct tsc2005 *ts)
509{ 519{
510 tsc2005_setup_read(&ts->spi_x, TSC2005_REG_X, 0); 520 tsc2005_setup_read(&ts->spi_x, TSC2005_REG_X, 0);