root/drivers/iio/light/apds9960.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. apds9960_set_it_time
  2. apds9960_set_pxs_gain
  3. apds9960_set_als_gain
  4. apds9960_set_power_state
  5. apds9960_set_power_state
  6. apds9960_read_raw
  7. apds9960_write_raw
  8. apds9960_get_thres_reg
  9. apds9960_read_event
  10. apds9960_write_event
  11. apds9960_read_event_config
  12. apds9960_write_event_config
  13. apds9660_fifo_is_empty
  14. apds9960_read_gesture_fifo
  15. apds9960_interrupt_handler
  16. apds9960_set_powermode
  17. apds9960_buffer_postenable
  18. apds9960_buffer_predisable
  19. apds9960_regfield_init
  20. apds9960_chip_init
  21. apds9960_probe
  22. apds9960_remove
  23. apds9960_runtime_suspend
  24. apds9960_runtime_resume

   1 // SPDX-License-Identifier: GPL-2.0+
   2 /*
   3  * apds9960.c - Support for Avago APDS9960 gesture/RGB/ALS/proximity sensor
   4  *
   5  * Copyright (C) 2015, 2018
   6  * Author: Matt Ranostay <matt.ranostay@konsulko.com>
   7  *
   8  * TODO: gesture + proximity calib offsets
   9  */
  10 
  11 #include <linux/module.h>
  12 #include <linux/init.h>
  13 #include <linux/interrupt.h>
  14 #include <linux/delay.h>
  15 #include <linux/mutex.h>
  16 #include <linux/err.h>
  17 #include <linux/irq.h>
  18 #include <linux/gpio.h>
  19 #include <linux/i2c.h>
  20 #include <linux/pm_runtime.h>
  21 #include <linux/regmap.h>
  22 #include <linux/iio/iio.h>
  23 #include <linux/iio/buffer.h>
  24 #include <linux/iio/events.h>
  25 #include <linux/iio/kfifo_buf.h>
  26 #include <linux/iio/sysfs.h>
  27 #include <linux/of_gpio.h>
  28 
  29 #define APDS9960_REGMAP_NAME    "apds9960_regmap"
  30 #define APDS9960_DRV_NAME       "apds9960"
  31 
  32 #define APDS9960_REG_RAM_START  0x00
  33 #define APDS9960_REG_RAM_END    0x7f
  34 
  35 #define APDS9960_REG_ENABLE     0x80
  36 #define APDS9960_REG_ATIME      0x81
  37 #define APDS9960_REG_WTIME      0x83
  38 
  39 #define APDS9960_REG_AILTL      0x84
  40 #define APDS9960_REG_AILTH      0x85
  41 #define APDS9960_REG_AIHTL      0x86
  42 #define APDS9960_REG_AIHTH      0x87
  43 
  44 #define APDS9960_REG_PILT       0x89
  45 #define APDS9960_REG_PIHT       0x8b
  46 #define APDS9960_REG_PERS       0x8c
  47 
  48 #define APDS9960_REG_CONFIG_1   0x8d
  49 #define APDS9960_REG_PPULSE     0x8e
  50 
  51 #define APDS9960_REG_CONTROL    0x8f
  52 #define APDS9960_REG_CONTROL_AGAIN_MASK         0x03
  53 #define APDS9960_REG_CONTROL_PGAIN_MASK         0x0c
  54 #define APDS9960_REG_CONTROL_AGAIN_MASK_SHIFT   0
  55 #define APDS9960_REG_CONTROL_PGAIN_MASK_SHIFT   2
  56 
  57 #define APDS9960_REG_CONFIG_2   0x90
  58 #define APDS9960_REG_CONFIG_2_GGAIN_MASK        0x60
  59 #define APDS9960_REG_CONFIG_2_GGAIN_MASK_SHIFT  5
  60 
  61 #define APDS9960_REG_ID         0x92
  62 
  63 #define APDS9960_REG_STATUS     0x93
  64 #define APDS9960_REG_STATUS_PS_INT      BIT(5)
  65 #define APDS9960_REG_STATUS_ALS_INT     BIT(4)
  66 #define APDS9960_REG_STATUS_GINT        BIT(2)
  67 
  68 #define APDS9960_REG_PDATA      0x9c
  69 #define APDS9960_REG_POFFSET_UR 0x9d
  70 #define APDS9960_REG_POFFSET_DL 0x9e
  71 #define APDS9960_REG_CONFIG_3   0x9f
  72 
  73 #define APDS9960_REG_GPENTH     0xa0
  74 #define APDS9960_REG_GEXTH      0xa1
  75 
  76 #define APDS9960_REG_GCONF_1    0xa2
  77 #define APDS9960_REG_GCONF_1_GFIFO_THRES_MASK           0xc0
  78 #define APDS9960_REG_GCONF_1_GFIFO_THRES_MASK_SHIFT     6
  79 
  80 #define APDS9960_REG_GCONF_2    0xa3
  81 #define APDS9960_REG_GOFFSET_U  0xa4
  82 #define APDS9960_REG_GOFFSET_D  0xa5
  83 #define APDS9960_REG_GPULSE     0xa6
  84 #define APDS9960_REG_GOFFSET_L  0xa7
  85 #define APDS9960_REG_GOFFSET_R  0xa9
  86 #define APDS9960_REG_GCONF_3    0xaa
  87 
  88 #define APDS9960_REG_GCONF_4    0xab
  89 #define APDS9960_REG_GFLVL      0xae
  90 #define APDS9960_REG_GSTATUS    0xaf
  91 
  92 #define APDS9960_REG_IFORCE     0xe4
  93 #define APDS9960_REG_PICLEAR    0xe5
  94 #define APDS9960_REG_CICLEAR    0xe6
  95 #define APDS9960_REG_AICLEAR    0xe7
  96 
  97 #define APDS9960_DEFAULT_PERS   0x33
  98 #define APDS9960_DEFAULT_GPENTH 0x50
  99 #define APDS9960_DEFAULT_GEXTH  0x40
 100 
 101 #define APDS9960_MAX_PXS_THRES_VAL      255
 102 #define APDS9960_MAX_ALS_THRES_VAL      0xffff
 103 #define APDS9960_MAX_INT_TIME_IN_US     1000000
 104 
 105 enum apds9960_als_channel_idx {
 106         IDX_ALS_CLEAR, IDX_ALS_RED, IDX_ALS_GREEN, IDX_ALS_BLUE,
 107 };
 108 
 109 #define APDS9960_REG_ALS_BASE   0x94
 110 #define APDS9960_REG_ALS_CHANNEL(_colour) \
 111         (APDS9960_REG_ALS_BASE + (IDX_ALS_##_colour * 2))
 112 
 113 enum apds9960_gesture_channel_idx {
 114         IDX_DIR_UP, IDX_DIR_DOWN, IDX_DIR_LEFT, IDX_DIR_RIGHT,
 115 };
 116 
 117 #define APDS9960_REG_GFIFO_BASE 0xfc
 118 #define APDS9960_REG_GFIFO_DIR(_dir) \
 119         (APDS9960_REG_GFIFO_BASE + IDX_DIR_##_dir)
 120 
 121 struct apds9960_data {
 122         struct i2c_client *client;
 123         struct iio_dev *indio_dev;
 124         struct mutex lock;
 125 
 126         /* regmap fields */
 127         struct regmap *regmap;
 128         struct regmap_field *reg_int_als;
 129         struct regmap_field *reg_int_ges;
 130         struct regmap_field *reg_int_pxs;
 131 
 132         struct regmap_field *reg_enable_als;
 133         struct regmap_field *reg_enable_ges;
 134         struct regmap_field *reg_enable_pxs;
 135 
 136         /* state */
 137         int als_int;
 138         int pxs_int;
 139         int gesture_mode_running;
 140 
 141         /* gain values */
 142         int als_gain;
 143         int pxs_gain;
 144 
 145         /* integration time value in us */
 146         int als_adc_int_us;
 147 
 148         /* gesture buffer */
 149         u8 buffer[4]; /* 4 8-bit channels */
 150 };
 151 
 152 static const struct reg_default apds9960_reg_defaults[] = {
 153         /* Default ALS integration time = 2.48ms */
 154         { APDS9960_REG_ATIME, 0xff },
 155 };
 156 
 157 static const struct regmap_range apds9960_volatile_ranges[] = {
 158         regmap_reg_range(APDS9960_REG_STATUS,
 159                                 APDS9960_REG_PDATA),
 160         regmap_reg_range(APDS9960_REG_GFLVL,
 161                                 APDS9960_REG_GSTATUS),
 162         regmap_reg_range(APDS9960_REG_GFIFO_DIR(UP),
 163                                 APDS9960_REG_GFIFO_DIR(RIGHT)),
 164         regmap_reg_range(APDS9960_REG_IFORCE,
 165                                 APDS9960_REG_AICLEAR),
 166 };
 167 
 168 static const struct regmap_access_table apds9960_volatile_table = {
 169         .yes_ranges     = apds9960_volatile_ranges,
 170         .n_yes_ranges   = ARRAY_SIZE(apds9960_volatile_ranges),
 171 };
 172 
 173 static const struct regmap_range apds9960_precious_ranges[] = {
 174         regmap_reg_range(APDS9960_REG_RAM_START, APDS9960_REG_RAM_END),
 175 };
 176 
 177 static const struct regmap_access_table apds9960_precious_table = {
 178         .yes_ranges     = apds9960_precious_ranges,
 179         .n_yes_ranges   = ARRAY_SIZE(apds9960_precious_ranges),
 180 };
 181 
 182 static const struct regmap_range apds9960_readable_ranges[] = {
 183         regmap_reg_range(APDS9960_REG_ENABLE,
 184                                 APDS9960_REG_GSTATUS),
 185         regmap_reg_range(APDS9960_REG_GFIFO_DIR(UP),
 186                                 APDS9960_REG_GFIFO_DIR(RIGHT)),
 187 };
 188 
 189 static const struct regmap_access_table apds9960_readable_table = {
 190         .yes_ranges     = apds9960_readable_ranges,
 191         .n_yes_ranges   = ARRAY_SIZE(apds9960_readable_ranges),
 192 };
 193 
 194 static const struct regmap_range apds9960_writeable_ranges[] = {
 195         regmap_reg_range(APDS9960_REG_ENABLE, APDS9960_REG_CONFIG_2),
 196         regmap_reg_range(APDS9960_REG_POFFSET_UR, APDS9960_REG_GCONF_4),
 197         regmap_reg_range(APDS9960_REG_IFORCE, APDS9960_REG_AICLEAR),
 198 };
 199 
 200 static const struct regmap_access_table apds9960_writeable_table = {
 201         .yes_ranges     = apds9960_writeable_ranges,
 202         .n_yes_ranges   = ARRAY_SIZE(apds9960_writeable_ranges),
 203 };
 204 
 205 static const struct regmap_config apds9960_regmap_config = {
 206         .name = APDS9960_REGMAP_NAME,
 207         .reg_bits = 8,
 208         .val_bits = 8,
 209         .use_single_read = true,
 210         .use_single_write = true,
 211 
 212         .volatile_table = &apds9960_volatile_table,
 213         .precious_table = &apds9960_precious_table,
 214         .rd_table = &apds9960_readable_table,
 215         .wr_table = &apds9960_writeable_table,
 216 
 217         .reg_defaults = apds9960_reg_defaults,
 218         .num_reg_defaults = ARRAY_SIZE(apds9960_reg_defaults),
 219         .max_register = APDS9960_REG_GFIFO_DIR(RIGHT),
 220         .cache_type = REGCACHE_RBTREE,
 221 };
 222 
 223 static const struct iio_event_spec apds9960_pxs_event_spec[] = {
 224         {
 225                 .type = IIO_EV_TYPE_THRESH,
 226                 .dir = IIO_EV_DIR_RISING,
 227                 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
 228                         BIT(IIO_EV_INFO_ENABLE),
 229         },
 230         {
 231                 .type = IIO_EV_TYPE_THRESH,
 232                 .dir = IIO_EV_DIR_FALLING,
 233                 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
 234                         BIT(IIO_EV_INFO_ENABLE),
 235         },
 236 };
 237 
 238 static const struct iio_event_spec apds9960_als_event_spec[] = {
 239         {
 240                 .type = IIO_EV_TYPE_THRESH,
 241                 .dir = IIO_EV_DIR_RISING,
 242                 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
 243                         BIT(IIO_EV_INFO_ENABLE),
 244         },
 245         {
 246                 .type = IIO_EV_TYPE_THRESH,
 247                 .dir = IIO_EV_DIR_FALLING,
 248                 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
 249                         BIT(IIO_EV_INFO_ENABLE),
 250         },
 251 };
 252 
 253 #define APDS9960_GESTURE_CHANNEL(_dir, _si) { \
 254         .type = IIO_PROXIMITY, \
 255         .channel = _si + 1, \
 256         .scan_index = _si, \
 257         .indexed = 1, \
 258         .scan_type = { \
 259                 .sign = 'u', \
 260                 .realbits = 8, \
 261                 .storagebits = 8, \
 262         }, \
 263 }
 264 
 265 #define APDS9960_INTENSITY_CHANNEL(_colour) { \
 266         .type = IIO_INTENSITY, \
 267         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
 268         .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
 269                         BIT(IIO_CHAN_INFO_INT_TIME), \
 270         .channel2 = IIO_MOD_LIGHT_##_colour, \
 271         .address = APDS9960_REG_ALS_CHANNEL(_colour), \
 272         .modified = 1, \
 273         .scan_index = -1, \
 274 }
 275 
 276 static const unsigned long apds9960_scan_masks[] = {0xf, 0};
 277 
 278 static const struct iio_chan_spec apds9960_channels[] = {
 279         {
 280                 .type = IIO_PROXIMITY,
 281                 .address = APDS9960_REG_PDATA,
 282                 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
 283                 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
 284                 .channel = 0,
 285                 .indexed = 0,
 286                 .scan_index = -1,
 287 
 288                 .event_spec = apds9960_pxs_event_spec,
 289                 .num_event_specs = ARRAY_SIZE(apds9960_pxs_event_spec),
 290         },
 291         /* Gesture Sensor */
 292         APDS9960_GESTURE_CHANNEL(UP, 0),
 293         APDS9960_GESTURE_CHANNEL(DOWN, 1),
 294         APDS9960_GESTURE_CHANNEL(LEFT, 2),
 295         APDS9960_GESTURE_CHANNEL(RIGHT, 3),
 296         /* ALS */
 297         {
 298                 .type = IIO_INTENSITY,
 299                 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
 300                 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |
 301                         BIT(IIO_CHAN_INFO_INT_TIME),
 302                 .channel2 = IIO_MOD_LIGHT_CLEAR,
 303                 .address = APDS9960_REG_ALS_CHANNEL(CLEAR),
 304                 .modified = 1,
 305                 .scan_index = -1,
 306 
 307                 .event_spec = apds9960_als_event_spec,
 308                 .num_event_specs = ARRAY_SIZE(apds9960_als_event_spec),
 309         },
 310         /* RGB Sensor */
 311         APDS9960_INTENSITY_CHANNEL(RED),
 312         APDS9960_INTENSITY_CHANNEL(GREEN),
 313         APDS9960_INTENSITY_CHANNEL(BLUE),
 314 };
 315 
 316 /* integration time in us */
 317 static const int apds9960_int_time[][2] = {
 318         { 28000, 246},
 319         {100000, 219},
 320         {200000, 182},
 321         {700000,   0}
 322 };
 323 
 324 /* gain mapping */
 325 static const int apds9960_pxs_gain_map[] = {1, 2, 4, 8};
 326 static const int apds9960_als_gain_map[] = {1, 4, 16, 64};
 327 
 328 static IIO_CONST_ATTR(proximity_scale_available, "1 2 4 8");
 329 static IIO_CONST_ATTR(intensity_scale_available, "1 4 16 64");
 330 static IIO_CONST_ATTR_INT_TIME_AVAIL("0.028 0.1 0.2 0.7");
 331 
 332 static struct attribute *apds9960_attributes[] = {
 333         &iio_const_attr_proximity_scale_available.dev_attr.attr,
 334         &iio_const_attr_intensity_scale_available.dev_attr.attr,
 335         &iio_const_attr_integration_time_available.dev_attr.attr,
 336         NULL,
 337 };
 338 
 339 static const struct attribute_group apds9960_attribute_group = {
 340         .attrs = apds9960_attributes,
 341 };
 342 
 343 static const struct reg_field apds9960_reg_field_int_als =
 344                                 REG_FIELD(APDS9960_REG_ENABLE, 4, 4);
 345 
 346 static const struct reg_field apds9960_reg_field_int_ges =
 347                                 REG_FIELD(APDS9960_REG_GCONF_4, 1, 1);
 348 
 349 static const struct reg_field apds9960_reg_field_int_pxs =
 350                                 REG_FIELD(APDS9960_REG_ENABLE, 5, 5);
 351 
 352 static const struct reg_field apds9960_reg_field_enable_als =
 353                                 REG_FIELD(APDS9960_REG_ENABLE, 1, 1);
 354 
 355 static const struct reg_field apds9960_reg_field_enable_ges =
 356                                 REG_FIELD(APDS9960_REG_ENABLE, 6, 6);
 357 
 358 static const struct reg_field apds9960_reg_field_enable_pxs =
 359                                 REG_FIELD(APDS9960_REG_ENABLE, 2, 2);
 360 
 361 static int apds9960_set_it_time(struct apds9960_data *data, int val2)
 362 {
 363         int ret = -EINVAL;
 364         int idx;
 365 
 366         for (idx = 0; idx < ARRAY_SIZE(apds9960_int_time); idx++) {
 367                 if (apds9960_int_time[idx][0] == val2) {
 368                         mutex_lock(&data->lock);
 369                         ret = regmap_write(data->regmap, APDS9960_REG_ATIME,
 370                                                  apds9960_int_time[idx][1]);
 371                         if (!ret)
 372                                 data->als_adc_int_us = val2;
 373                         mutex_unlock(&data->lock);
 374                         break;
 375                 }
 376         }
 377 
 378         return ret;
 379 }
 380 
 381 static int apds9960_set_pxs_gain(struct apds9960_data *data, int val)
 382 {
 383         int ret = -EINVAL;
 384         int idx;
 385 
 386         for (idx = 0; idx < ARRAY_SIZE(apds9960_pxs_gain_map); idx++) {
 387                 if (apds9960_pxs_gain_map[idx] == val) {
 388                         /* pxs + gesture gains are mirrored */
 389                         mutex_lock(&data->lock);
 390                         ret = regmap_update_bits(data->regmap,
 391                                 APDS9960_REG_CONTROL,
 392                                 APDS9960_REG_CONTROL_PGAIN_MASK,
 393                                 idx << APDS9960_REG_CONTROL_PGAIN_MASK_SHIFT);
 394                         if (ret) {
 395                                 mutex_unlock(&data->lock);
 396                                 break;
 397                         }
 398 
 399                         ret = regmap_update_bits(data->regmap,
 400                                 APDS9960_REG_CONFIG_2,
 401                                 APDS9960_REG_CONFIG_2_GGAIN_MASK,
 402                                 idx << APDS9960_REG_CONFIG_2_GGAIN_MASK_SHIFT);
 403                         if (!ret)
 404                                 data->pxs_gain = idx;
 405                         mutex_unlock(&data->lock);
 406                         break;
 407                 }
 408         }
 409 
 410         return ret;
 411 }
 412 
 413 static int apds9960_set_als_gain(struct apds9960_data *data, int val)
 414 {
 415         int ret = -EINVAL;
 416         int idx;
 417 
 418         for (idx = 0; idx < ARRAY_SIZE(apds9960_als_gain_map); idx++) {
 419                 if (apds9960_als_gain_map[idx] == val) {
 420                         mutex_lock(&data->lock);
 421                         ret = regmap_update_bits(data->regmap,
 422                                         APDS9960_REG_CONTROL,
 423                                         APDS9960_REG_CONTROL_AGAIN_MASK, idx);
 424                         if (!ret)
 425                                 data->als_gain = idx;
 426                         mutex_unlock(&data->lock);
 427                         break;
 428                 }
 429         }
 430 
 431         return ret;
 432 }
 433 
 434 #ifdef CONFIG_PM
 435 static int apds9960_set_power_state(struct apds9960_data *data, bool on)
 436 {
 437         struct device *dev = &data->client->dev;
 438         int ret = 0;
 439 
 440         mutex_lock(&data->lock);
 441 
 442         if (on) {
 443                 int suspended;
 444 
 445                 suspended = pm_runtime_suspended(dev);
 446                 ret = pm_runtime_get_sync(dev);
 447 
 448                 /* Allow one integration cycle before allowing a reading */
 449                 if (suspended)
 450                         usleep_range(data->als_adc_int_us,
 451                                      APDS9960_MAX_INT_TIME_IN_US);
 452         } else {
 453                 pm_runtime_mark_last_busy(dev);
 454                 ret = pm_runtime_put_autosuspend(dev);
 455         }
 456 
 457         mutex_unlock(&data->lock);
 458 
 459         return ret;
 460 }
 461 #else
 462 static int apds9960_set_power_state(struct apds9960_data *data, bool on)
 463 {
 464         return 0;
 465 }
 466 #endif
 467 
 468 static int apds9960_read_raw(struct iio_dev *indio_dev,
 469                              struct iio_chan_spec const *chan,
 470                              int *val, int *val2, long mask)
 471 {
 472         struct apds9960_data *data = iio_priv(indio_dev);
 473         __le16 buf;
 474         int ret = -EINVAL;
 475 
 476         if (data->gesture_mode_running)
 477                 return -EBUSY;
 478 
 479         switch (mask) {
 480         case IIO_CHAN_INFO_RAW:
 481                 apds9960_set_power_state(data, true);
 482                 switch (chan->type) {
 483                 case IIO_PROXIMITY:
 484                         ret = regmap_read(data->regmap, chan->address, val);
 485                         if (!ret)
 486                                 ret = IIO_VAL_INT;
 487                         break;
 488                 case IIO_INTENSITY:
 489                         ret = regmap_bulk_read(data->regmap, chan->address,
 490                                                &buf, 2);
 491                         if (!ret) {
 492                                 ret = IIO_VAL_INT;
 493                                 *val = le16_to_cpu(buf);
 494                         }
 495                         break;
 496                 default:
 497                         ret = -EINVAL;
 498                 }
 499                 apds9960_set_power_state(data, false);
 500                 break;
 501         case IIO_CHAN_INFO_INT_TIME:
 502                 /* RGB + ALS sensors only have integration time */
 503                 mutex_lock(&data->lock);
 504                 switch (chan->type) {
 505                 case IIO_INTENSITY:
 506                         *val = 0;
 507                         *val2 = data->als_adc_int_us;
 508                         ret = IIO_VAL_INT_PLUS_MICRO;
 509                         break;
 510                 default:
 511                         ret = -EINVAL;
 512                 }
 513                 mutex_unlock(&data->lock);
 514                 break;
 515         case IIO_CHAN_INFO_SCALE:
 516                 mutex_lock(&data->lock);
 517                 switch (chan->type) {
 518                 case IIO_PROXIMITY:
 519                         *val = apds9960_pxs_gain_map[data->pxs_gain];
 520                         ret = IIO_VAL_INT;
 521                         break;
 522                 case IIO_INTENSITY:
 523                         *val = apds9960_als_gain_map[data->als_gain];
 524                         ret = IIO_VAL_INT;
 525                         break;
 526                 default:
 527                         ret = -EINVAL;
 528                 }
 529                 mutex_unlock(&data->lock);
 530                 break;
 531         }
 532 
 533         return ret;
 534 };
 535 
 536 static int apds9960_write_raw(struct iio_dev *indio_dev,
 537                              struct iio_chan_spec const *chan,
 538                              int val, int val2, long mask)
 539 {
 540         struct apds9960_data *data = iio_priv(indio_dev);
 541 
 542         switch (mask) {
 543         case IIO_CHAN_INFO_INT_TIME:
 544                 /* RGB + ALS sensors only have int time */
 545                 switch (chan->type) {
 546                 case IIO_INTENSITY:
 547                         if (val != 0)
 548                                 return -EINVAL;
 549                         return apds9960_set_it_time(data, val2);
 550                 default:
 551                         return -EINVAL;
 552                 }
 553         case IIO_CHAN_INFO_SCALE:
 554                 if (val2 != 0)
 555                         return -EINVAL;
 556                 switch (chan->type) {
 557                 case IIO_PROXIMITY:
 558                         return apds9960_set_pxs_gain(data, val);
 559                 case IIO_INTENSITY:
 560                         return apds9960_set_als_gain(data, val);
 561                 default:
 562                         return -EINVAL;
 563                 }
 564         default:
 565                 return -EINVAL;
 566         };
 567 
 568         return 0;
 569 }
 570 
 571 static inline int apds9960_get_thres_reg(const struct iio_chan_spec *chan,
 572                                          enum iio_event_direction dir,
 573                                          u8 *reg)
 574 {
 575         switch (dir) {
 576         case IIO_EV_DIR_RISING:
 577                 switch (chan->type) {
 578                 case IIO_PROXIMITY:
 579                         *reg = APDS9960_REG_PIHT;
 580                         break;
 581                 case IIO_INTENSITY:
 582                         *reg = APDS9960_REG_AIHTL;
 583                         break;
 584                 default:
 585                         return -EINVAL;
 586                 }
 587                 break;
 588         case IIO_EV_DIR_FALLING:
 589                 switch (chan->type) {
 590                 case IIO_PROXIMITY:
 591                         *reg = APDS9960_REG_PILT;
 592                         break;
 593                 case IIO_INTENSITY:
 594                         *reg = APDS9960_REG_AILTL;
 595                         break;
 596                 default:
 597                         return -EINVAL;
 598                 }
 599                 break;
 600         default:
 601                 return -EINVAL;
 602         }
 603 
 604         return 0;
 605 }
 606 
 607 static int apds9960_read_event(struct iio_dev *indio_dev,
 608                                const struct iio_chan_spec *chan,
 609                                enum iio_event_type type,
 610                                enum iio_event_direction dir,
 611                                enum iio_event_info info,
 612                                int *val, int *val2)
 613 {
 614         u8 reg;
 615         __le16 buf;
 616         int ret = 0;
 617         struct apds9960_data *data = iio_priv(indio_dev);
 618 
 619         if (info != IIO_EV_INFO_VALUE)
 620                 return -EINVAL;
 621 
 622         ret = apds9960_get_thres_reg(chan, dir, &reg);
 623         if (ret < 0)
 624                 return ret;
 625 
 626         if (chan->type == IIO_PROXIMITY) {
 627                 ret = regmap_read(data->regmap, reg, val);
 628                 if (ret < 0)
 629                         return ret;
 630         } else if (chan->type == IIO_INTENSITY) {
 631                 ret = regmap_bulk_read(data->regmap, reg, &buf, 2);
 632                 if (ret < 0)
 633                         return ret;
 634                 *val = le16_to_cpu(buf);
 635         } else
 636                 return -EINVAL;
 637 
 638         *val2 = 0;
 639 
 640         return IIO_VAL_INT;
 641 }
 642 
 643 static int apds9960_write_event(struct iio_dev *indio_dev,
 644                                 const struct iio_chan_spec *chan,
 645                                 enum iio_event_type type,
 646                                 enum iio_event_direction dir,
 647                                 enum iio_event_info info,
 648                                 int val, int val2)
 649 {
 650         u8 reg;
 651         __le16 buf;
 652         int ret = 0;
 653         struct apds9960_data *data = iio_priv(indio_dev);
 654 
 655         if (info != IIO_EV_INFO_VALUE)
 656                 return -EINVAL;
 657 
 658         ret = apds9960_get_thres_reg(chan, dir, &reg);
 659         if (ret < 0)
 660                 return ret;
 661 
 662         if (chan->type == IIO_PROXIMITY) {
 663                 if (val < 0 || val > APDS9960_MAX_PXS_THRES_VAL)
 664                         return -EINVAL;
 665                 ret = regmap_write(data->regmap, reg, val);
 666                 if (ret < 0)
 667                         return ret;
 668         } else if (chan->type == IIO_INTENSITY) {
 669                 if (val < 0 || val > APDS9960_MAX_ALS_THRES_VAL)
 670                         return -EINVAL;
 671                 buf = cpu_to_le16(val);
 672                 ret = regmap_bulk_write(data->regmap, reg, &buf, 2);
 673                 if (ret < 0)
 674                         return ret;
 675         } else
 676                 return -EINVAL;
 677 
 678         return 0;
 679 }
 680 
 681 static int apds9960_read_event_config(struct iio_dev *indio_dev,
 682                                       const struct iio_chan_spec *chan,
 683                                       enum iio_event_type type,
 684                                       enum iio_event_direction dir)
 685 {
 686         struct apds9960_data *data = iio_priv(indio_dev);
 687 
 688         switch (chan->type) {
 689         case IIO_PROXIMITY:
 690                 return data->pxs_int;
 691         case IIO_INTENSITY:
 692                 return data->als_int;
 693         default:
 694                 return -EINVAL;
 695         }
 696 
 697         return 0;
 698 }
 699 
 700 static int apds9960_write_event_config(struct iio_dev *indio_dev,
 701                                        const struct iio_chan_spec *chan,
 702                                        enum iio_event_type type,
 703                                        enum iio_event_direction dir,
 704                                        int state)
 705 {
 706         struct apds9960_data *data = iio_priv(indio_dev);
 707         int ret;
 708 
 709         state = !!state;
 710 
 711         switch (chan->type) {
 712         case IIO_PROXIMITY:
 713                 if (data->pxs_int == state)
 714                         return -EINVAL;
 715 
 716                 ret = regmap_field_write(data->reg_int_pxs, state);
 717                 if (ret)
 718                         return ret;
 719                 data->pxs_int = state;
 720                 apds9960_set_power_state(data, state);
 721                 break;
 722         case IIO_INTENSITY:
 723                 if (data->als_int == state)
 724                         return -EINVAL;
 725 
 726                 ret = regmap_field_write(data->reg_int_als, state);
 727                 if (ret)
 728                         return ret;
 729                 data->als_int = state;
 730                 apds9960_set_power_state(data, state);
 731                 break;
 732         default:
 733                 return -EINVAL;
 734         }
 735 
 736         return 0;
 737 }
 738 
 739 static const struct iio_info apds9960_info = {
 740         .attrs = &apds9960_attribute_group,
 741         .read_raw = apds9960_read_raw,
 742         .write_raw = apds9960_write_raw,
 743         .read_event_value = apds9960_read_event,
 744         .write_event_value = apds9960_write_event,
 745         .read_event_config = apds9960_read_event_config,
 746         .write_event_config = apds9960_write_event_config,
 747 
 748 };
 749 
 750 static inline int apds9660_fifo_is_empty(struct apds9960_data *data)
 751 {
 752         int cnt;
 753         int ret;
 754 
 755         ret = regmap_read(data->regmap, APDS9960_REG_GFLVL, &cnt);
 756         if (ret)
 757                 return ret;
 758 
 759         return cnt;
 760 }
 761 
 762 static void apds9960_read_gesture_fifo(struct apds9960_data *data)
 763 {
 764         int ret, cnt = 0;
 765 
 766         mutex_lock(&data->lock);
 767         data->gesture_mode_running = 1;
 768 
 769         while (cnt || (cnt = apds9660_fifo_is_empty(data) > 0)) {
 770                 ret = regmap_bulk_read(data->regmap, APDS9960_REG_GFIFO_BASE,
 771                                       &data->buffer, 4);
 772 
 773                 if (ret)
 774                         goto err_read;
 775 
 776                 iio_push_to_buffers(data->indio_dev, data->buffer);
 777                 cnt--;
 778         }
 779 
 780 err_read:
 781         data->gesture_mode_running = 0;
 782         mutex_unlock(&data->lock);
 783 }
 784 
 785 static irqreturn_t apds9960_interrupt_handler(int irq, void *private)
 786 {
 787         struct iio_dev *indio_dev = private;
 788         struct apds9960_data *data = iio_priv(indio_dev);
 789         int ret, status;
 790 
 791         ret = regmap_read(data->regmap, APDS9960_REG_STATUS, &status);
 792         if (ret < 0) {
 793                 dev_err(&data->client->dev, "irq status reg read failed\n");
 794                 return IRQ_HANDLED;
 795         }
 796 
 797         if ((status & APDS9960_REG_STATUS_ALS_INT) && data->als_int) {
 798                 iio_push_event(indio_dev,
 799                                IIO_UNMOD_EVENT_CODE(IIO_INTENSITY, 0,
 800                                                     IIO_EV_TYPE_THRESH,
 801                                                     IIO_EV_DIR_EITHER),
 802                                iio_get_time_ns(indio_dev));
 803                 regmap_write(data->regmap, APDS9960_REG_CICLEAR, 1);
 804         }
 805 
 806         if ((status & APDS9960_REG_STATUS_PS_INT) && data->pxs_int) {
 807                 iio_push_event(indio_dev,
 808                                IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 0,
 809                                                     IIO_EV_TYPE_THRESH,
 810                                                     IIO_EV_DIR_EITHER),
 811                                iio_get_time_ns(indio_dev));
 812                 regmap_write(data->regmap, APDS9960_REG_PICLEAR, 1);
 813         }
 814 
 815         if (status & APDS9960_REG_STATUS_GINT)
 816                 apds9960_read_gesture_fifo(data);
 817 
 818         return IRQ_HANDLED;
 819 }
 820 
 821 static int apds9960_set_powermode(struct apds9960_data *data, bool state)
 822 {
 823         return regmap_update_bits(data->regmap, APDS9960_REG_ENABLE, 1, state);
 824 }
 825 
 826 static int apds9960_buffer_postenable(struct iio_dev *indio_dev)
 827 {
 828         struct apds9960_data *data = iio_priv(indio_dev);
 829         int ret;
 830 
 831         ret = regmap_field_write(data->reg_int_ges, 1);
 832         if (ret)
 833                 return ret;
 834 
 835         ret = regmap_field_write(data->reg_enable_ges, 1);
 836         if (ret)
 837                 return ret;
 838 
 839         pm_runtime_get_sync(&data->client->dev);
 840 
 841         return 0;
 842 }
 843 
 844 static int apds9960_buffer_predisable(struct iio_dev *indio_dev)
 845 {
 846         struct apds9960_data *data = iio_priv(indio_dev);
 847         int ret;
 848 
 849         ret = regmap_field_write(data->reg_enable_ges, 0);
 850         if (ret)
 851                 return ret;
 852 
 853         ret = regmap_field_write(data->reg_int_ges, 0);
 854         if (ret)
 855                 return ret;
 856 
 857         pm_runtime_put_autosuspend(&data->client->dev);
 858 
 859         return 0;
 860 }
 861 
 862 static const struct iio_buffer_setup_ops apds9960_buffer_setup_ops = {
 863         .postenable = apds9960_buffer_postenable,
 864         .predisable = apds9960_buffer_predisable,
 865 };
 866 
 867 static int apds9960_regfield_init(struct apds9960_data *data)
 868 {
 869         struct device *dev = &data->client->dev;
 870         struct regmap *regmap = data->regmap;
 871 
 872         data->reg_int_als = devm_regmap_field_alloc(dev, regmap,
 873                                                 apds9960_reg_field_int_als);
 874         if (IS_ERR(data->reg_int_als)) {
 875                 dev_err(dev, "INT ALS reg field init failed\n");
 876                 return PTR_ERR(data->reg_int_als);
 877         }
 878 
 879         data->reg_int_ges = devm_regmap_field_alloc(dev, regmap,
 880                                                 apds9960_reg_field_int_ges);
 881         if (IS_ERR(data->reg_int_ges)) {
 882                 dev_err(dev, "INT gesture reg field init failed\n");
 883                 return PTR_ERR(data->reg_int_ges);
 884         }
 885 
 886         data->reg_int_pxs = devm_regmap_field_alloc(dev, regmap,
 887                                                 apds9960_reg_field_int_pxs);
 888         if (IS_ERR(data->reg_int_pxs)) {
 889                 dev_err(dev, "INT pxs reg field init failed\n");
 890                 return PTR_ERR(data->reg_int_pxs);
 891         }
 892 
 893         data->reg_enable_als = devm_regmap_field_alloc(dev, regmap,
 894                                                 apds9960_reg_field_enable_als);
 895         if (IS_ERR(data->reg_enable_als)) {
 896                 dev_err(dev, "Enable ALS reg field init failed\n");
 897                 return PTR_ERR(data->reg_enable_als);
 898         }
 899 
 900         data->reg_enable_ges = devm_regmap_field_alloc(dev, regmap,
 901                                                 apds9960_reg_field_enable_ges);
 902         if (IS_ERR(data->reg_enable_ges)) {
 903                 dev_err(dev, "Enable gesture reg field init failed\n");
 904                 return PTR_ERR(data->reg_enable_ges);
 905         }
 906 
 907         data->reg_enable_pxs = devm_regmap_field_alloc(dev, regmap,
 908                                                 apds9960_reg_field_enable_pxs);
 909         if (IS_ERR(data->reg_enable_pxs)) {
 910                 dev_err(dev, "Enable PXS reg field init failed\n");
 911                 return PTR_ERR(data->reg_enable_pxs);
 912         }
 913 
 914         return 0;
 915 }
 916 
 917 static int apds9960_chip_init(struct apds9960_data *data)
 918 {
 919         int ret;
 920 
 921         /* Default IT for ALS of 28 ms */
 922         ret = apds9960_set_it_time(data, 28000);
 923         if (ret)
 924                 return ret;
 925 
 926         /* Ensure gesture interrupt is OFF */
 927         ret = regmap_field_write(data->reg_int_ges, 0);
 928         if (ret)
 929                 return ret;
 930 
 931         /* Disable gesture sensor, since polling is useless from user-space */
 932         ret = regmap_field_write(data->reg_enable_ges, 0);
 933         if (ret)
 934                 return ret;
 935 
 936         /* Ensure proximity interrupt is OFF */
 937         ret = regmap_field_write(data->reg_int_pxs, 0);
 938         if (ret)
 939                 return ret;
 940 
 941         /* Enable proximity sensor for polling */
 942         ret = regmap_field_write(data->reg_enable_pxs, 1);
 943         if (ret)
 944                 return ret;
 945 
 946         /* Ensure ALS interrupt is OFF */
 947         ret = regmap_field_write(data->reg_int_als, 0);
 948         if (ret)
 949                 return ret;
 950 
 951         /* Enable ALS sensor for polling */
 952         ret = regmap_field_write(data->reg_enable_als, 1);
 953         if (ret)
 954                 return ret;
 955         /*
 956          * When enabled trigger an interrupt after 3 readings
 957          * outside threshold for ALS + PXS
 958          */
 959         ret = regmap_write(data->regmap, APDS9960_REG_PERS,
 960                            APDS9960_DEFAULT_PERS);
 961         if (ret)
 962                 return ret;
 963 
 964         /*
 965          * Wait for 4 event outside gesture threshold to prevent interrupt
 966          * flooding.
 967          */
 968         ret = regmap_update_bits(data->regmap, APDS9960_REG_GCONF_1,
 969                         APDS9960_REG_GCONF_1_GFIFO_THRES_MASK,
 970                         BIT(0) << APDS9960_REG_GCONF_1_GFIFO_THRES_MASK_SHIFT);
 971         if (ret)
 972                 return ret;
 973 
 974         /* Default ENTER and EXIT thresholds for the GESTURE engine. */
 975         ret = regmap_write(data->regmap, APDS9960_REG_GPENTH,
 976                            APDS9960_DEFAULT_GPENTH);
 977         if (ret)
 978                 return ret;
 979 
 980         ret = regmap_write(data->regmap, APDS9960_REG_GEXTH,
 981                            APDS9960_DEFAULT_GEXTH);
 982         if (ret)
 983                 return ret;
 984 
 985         return apds9960_set_powermode(data, 1);
 986 }
 987 
 988 static int apds9960_probe(struct i2c_client *client,
 989                           const struct i2c_device_id *id)
 990 {
 991         struct apds9960_data *data;
 992         struct iio_buffer *buffer;
 993         struct iio_dev *indio_dev;
 994         int ret;
 995 
 996         indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
 997         if (!indio_dev)
 998                 return -ENOMEM;
 999 
1000         buffer = devm_iio_kfifo_allocate(&client->dev);
1001         if (!buffer)
1002                 return -ENOMEM;
1003 
1004         iio_device_attach_buffer(indio_dev, buffer);
1005 
1006         indio_dev->dev.parent = &client->dev;
1007         indio_dev->info = &apds9960_info;
1008         indio_dev->name = APDS9960_DRV_NAME;
1009         indio_dev->channels = apds9960_channels;
1010         indio_dev->num_channels = ARRAY_SIZE(apds9960_channels);
1011         indio_dev->available_scan_masks = apds9960_scan_masks;
1012         indio_dev->modes = (INDIO_BUFFER_SOFTWARE | INDIO_DIRECT_MODE);
1013         indio_dev->setup_ops = &apds9960_buffer_setup_ops;
1014 
1015         data = iio_priv(indio_dev);
1016         i2c_set_clientdata(client, indio_dev);
1017 
1018         data->regmap = devm_regmap_init_i2c(client, &apds9960_regmap_config);
1019         if (IS_ERR(data->regmap)) {
1020                 dev_err(&client->dev, "regmap initialization failed.\n");
1021                 return PTR_ERR(data->regmap);
1022         }
1023 
1024         data->client = client;
1025         data->indio_dev = indio_dev;
1026         mutex_init(&data->lock);
1027 
1028         ret = pm_runtime_set_active(&client->dev);
1029         if (ret)
1030                 goto error_power_down;
1031 
1032         pm_runtime_enable(&client->dev);
1033         pm_runtime_set_autosuspend_delay(&client->dev, 5000);
1034         pm_runtime_use_autosuspend(&client->dev);
1035 
1036         apds9960_set_power_state(data, true);
1037 
1038         ret = apds9960_regfield_init(data);
1039         if (ret)
1040                 goto error_power_down;
1041 
1042         ret = apds9960_chip_init(data);
1043         if (ret)
1044                 goto error_power_down;
1045 
1046         if (client->irq <= 0) {
1047                 dev_err(&client->dev, "no valid irq defined\n");
1048                 ret = -EINVAL;
1049                 goto error_power_down;
1050         }
1051         ret = devm_request_threaded_irq(&client->dev, client->irq,
1052                                         NULL, apds9960_interrupt_handler,
1053                                         IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1054                                         "apds9960_event",
1055                                         indio_dev);
1056         if (ret) {
1057                 dev_err(&client->dev, "request irq (%d) failed\n", client->irq);
1058                 goto error_power_down;
1059         }
1060 
1061         ret = iio_device_register(indio_dev);
1062         if (ret)
1063                 goto error_power_down;
1064 
1065         apds9960_set_power_state(data, false);
1066 
1067         return 0;
1068 
1069 error_power_down:
1070         apds9960_set_power_state(data, false);
1071 
1072         return ret;
1073 }
1074 
1075 static int apds9960_remove(struct i2c_client *client)
1076 {
1077         struct iio_dev *indio_dev = i2c_get_clientdata(client);
1078         struct apds9960_data *data = iio_priv(indio_dev);
1079 
1080         iio_device_unregister(indio_dev);
1081         pm_runtime_disable(&client->dev);
1082         pm_runtime_set_suspended(&client->dev);
1083         apds9960_set_powermode(data, 0);
1084 
1085         return 0;
1086 }
1087 
1088 #ifdef CONFIG_PM
1089 static int apds9960_runtime_suspend(struct device *dev)
1090 {
1091         struct apds9960_data *data =
1092                         iio_priv(i2c_get_clientdata(to_i2c_client(dev)));
1093 
1094         return apds9960_set_powermode(data, 0);
1095 }
1096 
1097 static int apds9960_runtime_resume(struct device *dev)
1098 {
1099         struct apds9960_data *data =
1100                         iio_priv(i2c_get_clientdata(to_i2c_client(dev)));
1101 
1102         return apds9960_set_powermode(data, 1);
1103 }
1104 #endif
1105 
1106 static const struct dev_pm_ops apds9960_pm_ops = {
1107         SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
1108                                 pm_runtime_force_resume)
1109         SET_RUNTIME_PM_OPS(apds9960_runtime_suspend,
1110                            apds9960_runtime_resume, NULL)
1111 };
1112 
1113 static const struct i2c_device_id apds9960_id[] = {
1114         { "apds9960", 0 },
1115         {}
1116 };
1117 MODULE_DEVICE_TABLE(i2c, apds9960_id);
1118 
1119 static const struct of_device_id apds9960_of_match[] = {
1120         { .compatible = "avago,apds9960" },
1121         { }
1122 };
1123 MODULE_DEVICE_TABLE(of, apds9960_of_match);
1124 
1125 static struct i2c_driver apds9960_driver = {
1126         .driver = {
1127                 .name   = APDS9960_DRV_NAME,
1128                 .of_match_table = apds9960_of_match,
1129                 .pm     = &apds9960_pm_ops,
1130         },
1131         .probe          = apds9960_probe,
1132         .remove         = apds9960_remove,
1133         .id_table       = apds9960_id,
1134 };
1135 module_i2c_driver(apds9960_driver);
1136 
1137 MODULE_AUTHOR("Matt Ranostay <matt.ranostay@konsulko.com>");
1138 MODULE_DESCRIPTION("APDS9960 Gesture/RGB/ALS/Proximity sensor");
1139 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */