From: Sri Krishna chowdary Date: Thu, 7 Aug 2014 09:16:57 +0000 (+0530) Subject: staging: iio: light: iqsxx: Add sysfs for SAR tool X-Git-Tag: daily-2014.10.01.0_rel-st8-r2.5-partner~6 X-Git-Url: http://rtime.felk.cvut.cz/gitweb/sojka/nv-tegra/linux-3.10.git/commitdiff_plain/4d1e4041479279f58ea4e5c7ef06f6b6eb3ba774 staging: iio: light: iqsxx: Add sysfs for SAR tool Add read only sysfs "name" and "proximity_status" to enable SAR debug tool query the proximity status. Bug 1538707 Change-Id: I9260160278aa2716ebb4dff324893f0cfdcfefc8 Signed-off-by: Sri Krishna chowdary (cherry picked from commit efeaa73777886c1aa7c4e293ae522036e853b56d) Reviewed-on: http://git-master/r/496127 Reviewed-by: Shylender Gaddamwar Reviewed-by: Todd Poynter Tested-by: Todd Poynter --- diff --git a/drivers/staging/iio/light/iqs253.c b/drivers/staging/iio/light/iqs253.c index a551f826909..0d15dc1d8d6 100644 --- a/drivers/staging/iio/light/iqs253.c +++ b/drivers/staging/iio/light/iqs253.c @@ -478,10 +478,10 @@ static void iqs253_sar_proximity_detect_work(struct work_struct *ws) goto finish; /* provide input to SAR */ if (chip->value/2) { - pr_info("%s :<-- undetect -->\n", __func__); + /* pr_info("%s :<-- undetect -->\n", __func__); */ gpio_direction_output(chip->sar_gpio, 1); } else { - pr_info("%s :--> detect <--\n", __func__); + /* pr_info("%s :--> detect <--\n", __func__); */ gpio_direction_output(chip->sar_gpio, 0); } } else { @@ -506,6 +506,42 @@ finish: queue_delayed_work(chip->sar_wq, &chip->sar_dw, msecs_to_jiffies(1000)); } +static ssize_t show_proximity_status(struct device * dev, + struct device_attribute *attr, char *buf) +{ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct iqs253_chip *chip = iio_priv(indio_dev); + if (chip->version == 253) { + if (chip->value / 2) + return sprintf(buf, "1"); /* undetect */ + return sprintf(buf, "0"); /* detect */ + } else { + if ((chip->value & 0x04) != 0) + return sprintf(buf, "0"); /* detect */ + return sprintf(buf, "1"); /* undetect */ + } + return sprintf(buf, "invalid iqs sensor version..\n"); +} + +static IIO_CONST_ATTR(name, "iqs_sar_sensor"); +static IIO_DEVICE_ATTR(proximity_status, S_IRUGO, show_proximity_status, + NULL, 0); + +static struct attribute *iqs253_iio_attr[] = { + &iio_dev_attr_proximity_status.dev_attr.attr, + &iio_const_attr_name.dev_attr.attr, + NULL +}; + +static const struct attribute_group iqs253_iio_attr_grp = { + .attrs = iqs253_iio_attr, +}; + +static const struct iio_info iqs253_iio_info = { + .attrs = &iqs253_iio_attr_grp, + .driver_module = THIS_MODULE, +}; + static int iqs253_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -603,11 +639,21 @@ static int iqs253_probe(struct i2c_client *client, queue_delayed_work(iqs253_chip->sar_wq, &iqs253_chip->sar_dw, 0); + indio_dev->info = &iqs253_iio_info; + indio_dev->dev.parent = &client->dev; + indio_dev->modes = INDIO_DIRECT_MODE; + ret = iio_device_register(indio_dev); + if (ret) { + dev_err(&client->dev, "%s iio_device_register err\n", __func__); + goto err_iio_register; + } + dev_info(&client->dev, "devname:%s func:%s line:%d probe success\n", id->name, __func__, __LINE__); return 0; +err_iio_register: err_gpio_request: if (iqs253_chip->sar_wq) destroy_workqueue(iqs253_chip->sar_wq);