]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
staging: iio: light: iqsxx: Add sysfs for SAR tool
authorSri Krishna chowdary <schowdary@nvidia.com>
Thu, 7 Aug 2014 09:16:57 +0000 (14:46 +0530)
committerTodd Poynter <tpoynter@nvidia.com>
Fri, 5 Sep 2014 22:52:32 +0000 (15:52 -0700)
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 <schowdary@nvidia.com>
(cherry picked from commit efeaa73777886c1aa7c4e293ae522036e853b56d)
Reviewed-on: http://git-master/r/496127
Reviewed-by: Shylender Gaddamwar <sgaddamwar@nvidia.com>
Reviewed-by: Todd Poynter <tpoynter@nvidia.com>
Tested-by: Todd Poynter <tpoynter@nvidia.com>
drivers/staging/iio/light/iqs253.c

index a551f8269094e71a9457d4f154c63fb654be9f68..0d15dc1d8d687b9b8a46d36e3063dd28d5bcd986 100644 (file)
@@ -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);