static ssize_t tsc2005_disable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct tsc2005 *ts = dev_get_drvdata(dev); unsigned long res; int i; if (strict_strtoul(buf, 10, &res) < 0) return -EINVAL; i = res ? 1 : 0; mutex_lock(&ts->mutex); if (i == ts->disabled) goto out; ts->disabled = i; if (i) tsc2005_disable(ts); else tsc2005_enable(ts); out: mutex_unlock(&ts->mutex); return count; }
static int tsc2005_suspend(struct spi_device *spi, pm_message_t mesg) { struct tsc2005 *ts = dev_get_drvdata(&spi->dev); mutex_lock(&ts->mutex); tsc2005_disable(ts); mutex_unlock(&ts->mutex); return 0; }
static ssize_t tsc2005_ctrl_selftest_show(struct device *dev, struct device_attribute *attr, char *buf) { u16 temp_high_orig, temp_high_test, temp_high; unsigned int result = 1; struct tsc2005 *ts = dev_get_drvdata(dev); if (!ts->set_reset) { dev_warn(&ts->spi->dev, "unable to selftest: reset not configured\n"); result = 0; goto out; } mutex_lock(&ts->mutex); tsc2005_disable(ts); /* Test ctrl communications via temp high / low registers */ tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high_orig); temp_high_test = (temp_high_orig - 1) & 0x0FFF; tsc2005_write(ts, TSC2005_REG_TEMP_HIGH, temp_high_test); tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high); if (temp_high != temp_high_test) { result = 0; dev_warn(dev, "selftest failed: %d != %d\n", temp_high, temp_high_test); } /* HW Reset */ ts->set_reset(0); msleep(1); /* only 10us required */ ts->set_reset(1); tsc2005_enable(ts); /* Test that reset really happened */ tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high); if (temp_high != temp_high_orig) { result = 0; dev_warn(dev, "selftest failed after reset: " "%d != %d\n", temp_high, temp_high_orig); } mutex_unlock(&ts->mutex); out: return sprintf(buf, "%u\n", result); }
static ssize_t tsc2005_selftest_show(struct device *dev, struct device_attribute *attr, char *buf) { struct tsc2005 *ts = dev_get_drvdata(dev); u16 temp_high; u16 temp_high_orig; 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); /* * Test TSC2005 communications via temp high register. */ tsc2005_disable(ts); result = 1; tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high_orig); temp_high_test = (temp_high_orig - 1) & MAX_12BIT; tsc2005_write(ts, TSC2005_REG_TEMP_HIGH, temp_high_test); tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high); if (temp_high != temp_high_test) { dev_warn(dev, "selftest failed: %d != %d\n", temp_high, temp_high_test); result = 0; } /* hardware reset */ ts->set_reset(0); msleep(1); /* only 10us required */ ts->set_reset(1); tsc2005_enable(ts); /* test that the reset really happened */ tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high); if (temp_high != temp_high_orig) { dev_warn(dev, "selftest failed after reset: %d != %d\n", temp_high, temp_high_orig); result = 0; } mutex_unlock(&ts->mutex); out: return sprintf(buf, "%u\n", result); }
static int __devexit tsc2005_remove(struct spi_device *spi) { struct tsc2005 *ts = dev_get_drvdata(&spi->dev); mutex_lock(&ts->mutex); tsc2005_disable(ts); mutex_unlock(&ts->mutex); device_remove_file(&ts->spi->dev, &dev_attr_disable_ts); device_remove_file(&ts->spi->dev, &dev_attr_pen_down); device_remove_file(&ts->spi->dev, &dev_attr_ts_ctrl_selftest); free_irq(ts->spi->irq, ts); input_unregister_device(ts->idev); if (ts->esd_timeout) del_timer(&ts->esd_timer); kfree(ts); return 0; }
static int __devexit tsc2005_remove(struct spi_device *spi) { struct tsc2005 *ts = dev_get_drvdata(&spi->dev); mutex_lock(&ts->mutex); tsc2005_disable(ts); mutex_unlock(&ts->mutex); if (ts->esd_timeout) del_timer_sync(&ts->esd_timer); del_timer_sync(&ts->penup_timer); flush_work(&ts->esd_work); flush_work(&ts->penup_work); sysfs_remove_group(&ts->spi->dev.kobj, &tsc2005_attr_group); free_irq(ts->spi->irq, ts); input_unregister_device(ts->idev); kfree(ts); return 0; }