isl29028.c 17.0 KB
Newer Older
1 2 3 4 5
/*
 * IIO driver for the light sensor ISL29028.
 * ISL29028 is Concurrent Ambient Light and Proximity Sensor
 *
 * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
6
 * Copyright (c) 2016-2017 Brian Masney <masneyb@onstation.org>
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <linux/mutex.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/regmap.h>
28 29
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
30
#include <linux/pm_runtime.h>
31

32
#define ISL29028_CONV_TIME_MS			100
33

34
#define ISL29028_REG_CONFIGURE			0x01
35

36 37 38
#define ISL29028_CONF_ALS_IR_MODE_ALS		0
#define ISL29028_CONF_ALS_IR_MODE_IR		BIT(0)
#define ISL29028_CONF_ALS_IR_MODE_MASK		BIT(0)
39

40
#define ISL29028_CONF_ALS_RANGE_LOW_LUX		0
41
#define ISL29028_CONF_ALS_RANGE_HIGH_LUX	BIT(1)
42
#define ISL29028_CONF_ALS_RANGE_MASK		BIT(1)
43

44 45 46
#define ISL29028_CONF_ALS_DIS			0
#define ISL29028_CONF_ALS_EN			BIT(2)
#define ISL29028_CONF_ALS_EN_MASK		BIT(2)
47

48 49
#define ISL29028_CONF_PROX_SLP_SH		4
#define ISL29028_CONF_PROX_SLP_MASK		(7 << ISL29028_CONF_PROX_SLP_SH)
50

51 52
#define ISL29028_CONF_PROX_EN			BIT(7)
#define ISL29028_CONF_PROX_EN_MASK		BIT(7)
53

54
#define ISL29028_REG_INTERRUPT			0x02
55

56 57 58
#define ISL29028_REG_PROX_DATA			0x08
#define ISL29028_REG_ALSIR_L			0x09
#define ISL29028_REG_ALSIR_U			0x0A
59

60 61
#define ISL29028_REG_TEST1_MODE			0x0E
#define ISL29028_REG_TEST2_MODE			0x0F
62

63
#define ISL29028_NUM_REGS			(ISL29028_REG_TEST2_MODE + 1)
64

65 66
#define ISL29028_POWER_OFF_DELAY_MS		2000

67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
struct isl29028_prox_data {
	int sampling_int;
	int sampling_fract;
	int sleep_time;
};

static const struct isl29028_prox_data isl29028_prox_data[] = {
	{   1, 250000, 800 },
	{   2, 500000, 400 },
	{   5,      0, 200 },
	{  10,      0, 100 },
	{  13, 300000,  75 },
	{  20,      0,  50 },
	{  80,      0,  13 }, /*
			       * Note: Data sheet lists 12.5 ms sleep time.
			       * Round up a half millisecond for msleep().
			       */
	{ 100,  0,   0 }
};
86

87 88 89 90
enum isl29028_als_ir_mode {
	ISL29028_MODE_NONE = 0,
	ISL29028_MODE_ALS,
	ISL29028_MODE_IR,
91 92 93
};

struct isl29028_chip {
94 95
	struct mutex			lock;
	struct regmap			*regmap;
96 97
	int				prox_sampling_int;
	int				prox_sampling_frac;
98 99
	bool				enable_prox;
	int				lux_scale;
100
	enum isl29028_als_ir_mode	als_ir_mode;
101 102
};

103
static int isl29028_find_prox_sleep_index(int sampling_int, int sampling_fract)
104
{
105
	int i;
106

107 108 109 110
	for (i = 0; i < ARRAY_SIZE(isl29028_prox_data); ++i) {
		if (isl29028_prox_data[i].sampling_int == sampling_int &&
		    isl29028_prox_data[i].sampling_fract == sampling_fract)
			return i;
111
	}
112

113
	return -EINVAL;
114 115 116
}

static int isl29028_set_proxim_sampling(struct isl29028_chip *chip,
117
					int sampling_int, int sampling_fract)
118 119 120 121
{
	struct device *dev = regmap_get_device(chip->regmap);
	int sleep_index, ret;

122 123 124 125 126
	sleep_index = isl29028_find_prox_sleep_index(sampling_int,
						     sampling_fract);
	if (sleep_index < 0)
		return sleep_index;

127 128
	ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
				 ISL29028_CONF_PROX_SLP_MASK,
129
				 sleep_index << ISL29028_CONF_PROX_SLP_SH);
130 131 132 133 134 135 136

	if (ret < 0) {
		dev_err(dev, "%s(): Error %d setting the proximity sampling\n",
			__func__, ret);
		return ret;
	}

137 138
	chip->prox_sampling_int = sampling_int;
	chip->prox_sampling_frac = sampling_fract;
139 140

	return ret;
141 142
}

143
static int isl29028_enable_proximity(struct isl29028_chip *chip)
144
{
145
	int prox_index, ret;
146

147 148
	ret = isl29028_set_proxim_sampling(chip, chip->prox_sampling_int,
					   chip->prox_sampling_frac);
149 150 151
	if (ret < 0)
		return ret;

152
	ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
153 154
				 ISL29028_CONF_PROX_EN_MASK,
				 ISL29028_CONF_PROX_EN);
155 156 157 158
	if (ret < 0)
		return ret;

	/* Wait for conversion to be complete for first sample */
159 160 161 162 163 164
	prox_index = isl29028_find_prox_sleep_index(chip->prox_sampling_int,
						    chip->prox_sampling_frac);
	if (prox_index < 0)
		return prox_index;

	msleep(isl29028_prox_data[prox_index].sleep_time);
165

166 167 168 169 170
	return 0;
}

static int isl29028_set_als_scale(struct isl29028_chip *chip, int lux_scale)
{
171
	struct device *dev = regmap_get_device(chip->regmap);
172 173
	int val = (lux_scale == 2000) ? ISL29028_CONF_ALS_RANGE_HIGH_LUX :
					ISL29028_CONF_ALS_RANGE_LOW_LUX;
174 175 176 177 178 179 180 181 182 183 184
	int ret;

	ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
				 ISL29028_CONF_ALS_RANGE_MASK, val);
	if (ret < 0) {
		dev_err(dev, "%s(): Error %d setting the ALS scale\n", __func__,
			ret);
		return ret;
	}

	chip->lux_scale = lux_scale;
185

186
	return ret;
187 188 189
}

static int isl29028_set_als_ir_mode(struct isl29028_chip *chip,
190
				    enum isl29028_als_ir_mode mode)
191
{
192
	int ret;
193

194 195 196
	if (chip->als_ir_mode == mode)
		return 0;

197 198 199 200
	ret = isl29028_set_als_scale(chip, chip->lux_scale);
	if (ret < 0)
		return ret;

201
	switch (mode) {
202
	case ISL29028_MODE_ALS:
203
		ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
204 205
					 ISL29028_CONF_ALS_IR_MODE_MASK,
					 ISL29028_CONF_ALS_IR_MODE_ALS);
206 207 208 209
		if (ret < 0)
			return ret;

		ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
210 211
					 ISL29028_CONF_ALS_RANGE_MASK,
					 ISL29028_CONF_ALS_RANGE_HIGH_LUX);
212
		break;
213
	case ISL29028_MODE_IR:
214
		ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
215 216
					 ISL29028_CONF_ALS_IR_MODE_MASK,
					 ISL29028_CONF_ALS_IR_MODE_IR);
217
		break;
218
	case ISL29028_MODE_NONE:
219
		return regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
220 221
					  ISL29028_CONF_ALS_EN_MASK,
					  ISL29028_CONF_ALS_DIS);
222 223 224 225 226 227 228
	}

	if (ret < 0)
		return ret;

	/* Enable the ALS/IR */
	ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
229 230
				 ISL29028_CONF_ALS_EN_MASK,
				 ISL29028_CONF_ALS_EN);
231 232 233 234
	if (ret < 0)
		return ret;

	/* Need to wait for conversion time if ALS/IR mode enabled */
235
	msleep(ISL29028_CONV_TIME_MS);
236 237 238

	chip->als_ir_mode = mode;

239 240 241 242 243
	return 0;
}

static int isl29028_read_als_ir(struct isl29028_chip *chip, int *als_ir)
{
244
	struct device *dev = regmap_get_device(chip->regmap);
245 246 247 248 249 250
	unsigned int lsb;
	unsigned int msb;
	int ret;

	ret = regmap_read(chip->regmap, ISL29028_REG_ALSIR_L, &lsb);
	if (ret < 0) {
251
		dev_err(dev,
252 253
			"%s(): Error %d reading register ALSIR_L\n",
			__func__, ret);
254 255 256 257 258
		return ret;
	}

	ret = regmap_read(chip->regmap, ISL29028_REG_ALSIR_U, &msb);
	if (ret < 0) {
259
		dev_err(dev,
260 261
			"%s(): Error %d reading register ALSIR_U\n",
			__func__, ret);
262 263 264 265
		return ret;
	}

	*als_ir = ((msb & 0xF) << 8) | (lsb & 0xFF);
266

267 268 269 270 271
	return 0;
}

static int isl29028_read_proxim(struct isl29028_chip *chip, int *prox)
{
272
	struct device *dev = regmap_get_device(chip->regmap);
273 274 275
	unsigned int data;
	int ret;

276
	if (!chip->enable_prox) {
277
		ret = isl29028_enable_proximity(chip);
278 279
		if (ret < 0)
			return ret;
280

281 282 283
		chip->enable_prox = true;
	}

284 285
	ret = regmap_read(chip->regmap, ISL29028_REG_PROX_DATA, &data);
	if (ret < 0) {
286 287
		dev_err(dev, "%s(): Error %d reading register PROX_DATA\n",
			__func__, ret);
288 289
		return ret;
	}
290

291
	*prox = data;
292

293 294 295 296 297
	return 0;
}

static int isl29028_als_get(struct isl29028_chip *chip, int *als_data)
{
298
	struct device *dev = regmap_get_device(chip->regmap);
299 300 301
	int ret;
	int als_ir_data;

302 303
	ret = isl29028_set_als_ir_mode(chip, ISL29028_MODE_ALS);
	if (ret < 0) {
304 305
		dev_err(dev, "%s(): Error %d enabling ALS mode\n", __func__,
			ret);
306
		return ret;
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
	}

	ret = isl29028_read_als_ir(chip, &als_ir_data);
	if (ret < 0)
		return ret;

	/*
	 * convert als data count to lux.
	 * if lux_scale = 125,  lux = count * 0.031
	 * if lux_scale = 2000, lux = count * 0.49
	 */
	if (chip->lux_scale == 125)
		als_ir_data = (als_ir_data * 31) / 1000;
	else
		als_ir_data = (als_ir_data * 49) / 100;

	*als_data = als_ir_data;
324

325 326 327 328 329
	return 0;
}

static int isl29028_ir_get(struct isl29028_chip *chip, int *ir_data)
{
330
	struct device *dev = regmap_get_device(chip->regmap);
331 332
	int ret;

333 334
	ret = isl29028_set_als_ir_mode(chip, ISL29028_MODE_IR);
	if (ret < 0) {
335 336
		dev_err(dev, "%s(): Error %d enabling IR mode\n", __func__,
			ret);
337
		return ret;
338
	}
339

340 341 342
	return isl29028_read_als_ir(chip, ir_data);
}

343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
static int isl29028_set_pm_runtime_busy(struct isl29028_chip *chip, bool on)
{
	struct device *dev = regmap_get_device(chip->regmap);
	int ret;

	if (on) {
		ret = pm_runtime_get_sync(dev);
		if (ret < 0)
			pm_runtime_put_noidle(dev);
	} else {
		pm_runtime_mark_last_busy(dev);
		ret = pm_runtime_put_autosuspend(dev);
	}

	return ret;
}

360 361
/* Channel IO */
static int isl29028_write_raw(struct iio_dev *indio_dev,
362 363
			      struct iio_chan_spec const *chan,
			      int val, int val2, long mask)
364 365
{
	struct isl29028_chip *chip = iio_priv(indio_dev);
366
	struct device *dev = regmap_get_device(chip->regmap);
367 368 369 370 371
	int ret;

	ret = isl29028_set_pm_runtime_busy(chip, true);
	if (ret < 0)
		return ret;
372 373

	mutex_lock(&chip->lock);
374 375

	ret = -EINVAL;
376 377
	switch (chan->type) {
	case IIO_PROXIMITY:
378
		if (mask != IIO_CHAN_INFO_SAMP_FREQ) {
379
			dev_err(dev,
380 381
				"%s(): proximity: Mask value 0x%08lx is not supported\n",
				__func__, mask);
382 383
			break;
		}
384

385
		if (val < 1 || val > 100) {
386
			dev_err(dev,
387 388
				"%s(): proximity: Sampling frequency %d is not in the range [1:100]\n",
				__func__, val);
389 390
			break;
		}
391

392
		ret = isl29028_set_proxim_sampling(chip, val, val2);
393 394
		break;
	case IIO_LIGHT:
395
		if (mask != IIO_CHAN_INFO_SCALE) {
396
			dev_err(dev,
397 398
				"%s(): light: Mask value 0x%08lx is not supported\n",
				__func__, mask);
399 400
			break;
		}
401

402
		if (val != 125 && val != 2000) {
403
			dev_err(dev,
404 405
				"%s(): light: Lux scale %d is not in the set {125, 2000}\n",
				__func__, val);
406 407
			break;
		}
408

409 410 411
		ret = isl29028_set_als_scale(chip, val);
		break;
	default:
412 413
		dev_err(dev, "%s(): Unsupported channel type %x\n",
			__func__, chan->type);
414 415
		break;
	}
416

417
	mutex_unlock(&chip->lock);
418

419 420 421 422 423 424 425
	if (ret < 0)
		return ret;

	ret = isl29028_set_pm_runtime_busy(chip, false);
	if (ret < 0)
		return ret;

426 427 428 429
	return ret;
}

static int isl29028_read_raw(struct iio_dev *indio_dev,
430 431
			     struct iio_chan_spec const *chan,
			     int *val, int *val2, long mask)
432 433
{
	struct isl29028_chip *chip = iio_priv(indio_dev);
434
	struct device *dev = regmap_get_device(chip->regmap);
435 436 437 438 439
	int ret, pm_ret;

	ret = isl29028_set_pm_runtime_busy(chip, true);
	if (ret < 0)
		return ret;
440 441

	mutex_lock(&chip->lock);
442 443

	ret = -EINVAL;
444
	switch (mask) {
445 446
	case IIO_CHAN_INFO_RAW:
	case IIO_CHAN_INFO_PROCESSED:
447 448 449 450 451 452 453 454
		switch (chan->type) {
		case IIO_LIGHT:
			ret = isl29028_als_get(chip, val);
			break;
		case IIO_INTENSITY:
			ret = isl29028_ir_get(chip, val);
			break;
		case IIO_PROXIMITY:
455
			ret = isl29028_read_proxim(chip, val);
456 457 458 459
			break;
		default:
			break;
		}
460

461 462
		if (ret < 0)
			break;
463

464 465
		ret = IIO_VAL_INT;
		break;
466
	case IIO_CHAN_INFO_SAMP_FREQ:
467 468
		if (chan->type != IIO_PROXIMITY)
			break;
469

470 471
		*val = chip->prox_sampling_int;
		*val2 = chip->prox_sampling_frac;
472 473
		ret = IIO_VAL_INT;
		break;
474
	case IIO_CHAN_INFO_SCALE:
475 476 477 478 479 480
		if (chan->type != IIO_LIGHT)
			break;
		*val = chip->lux_scale;
		ret = IIO_VAL_INT;
		break;
	default:
481 482
		dev_err(dev, "%s(): mask value 0x%08lx is not supported\n",
			__func__, mask);
483 484
		break;
	}
485

486
	mutex_unlock(&chip->lock);
487

488 489 490 491 492 493 494 495 496 497 498 499
	if (ret < 0)
		return ret;

	/**
	 * Preserve the ret variable if the call to
	 * isl29028_set_pm_runtime_busy() is successful so the reading
	 * (if applicable) is returned to user space.
	 */
	pm_ret = isl29028_set_pm_runtime_busy(chip, false);
	if (pm_ret < 0)
		return pm_ret;

500 501 502 503
	return ret;
}

static IIO_CONST_ATTR(in_proximity_sampling_frequency_available,
504
				"1.25 2.5 5 10 13.3 20 80 100");
505
static IIO_CONST_ATTR(in_illuminance_scale_available, "125 2000");
506 507 508 509 510 511 512 513 514 515 516 517 518 519 520

#define ISL29028_CONST_ATTR(name) (&iio_const_attr_##name.dev_attr.attr)
static struct attribute *isl29028_attributes[] = {
	ISL29028_CONST_ATTR(in_proximity_sampling_frequency_available),
	ISL29028_CONST_ATTR(in_illuminance_scale_available),
	NULL,
};

static const struct attribute_group isl29108_group = {
	.attrs = isl29028_attributes,
};

static const struct iio_chan_spec isl29028_channels[] = {
	{
		.type = IIO_LIGHT,
521 522
		.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
		BIT(IIO_CHAN_INFO_SCALE),
523 524
	}, {
		.type = IIO_INTENSITY,
525
		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
526 527
	}, {
		.type = IIO_PROXIMITY,
528 529
		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
		BIT(IIO_CHAN_INFO_SAMP_FREQ),
530 531 532 533 534 535
	}
};

static const struct iio_info isl29028_info = {
	.attrs = &isl29108_group,
	.driver_module = THIS_MODULE,
536 537
	.read_raw = isl29028_read_raw,
	.write_raw = isl29028_write_raw,
538 539
};

540
static int isl29028_clear_configure_reg(struct isl29028_chip *chip)
541
{
542
	struct device *dev = regmap_get_device(chip->regmap);
543 544 545
	int ret;

	ret = regmap_write(chip->regmap, ISL29028_REG_CONFIGURE, 0x0);
546
	if (ret < 0)
547 548
		dev_err(dev, "%s(): Error %d clearing the CONFIGURE register\n",
			__func__, ret);
549 550 551

	chip->als_ir_mode = ISL29028_MODE_NONE;
	chip->enable_prox = false;
552

553
	return ret;
554 555
}

556
static bool isl29028_is_volatile_reg(struct device *dev, unsigned int reg)
557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
{
	switch (reg) {
	case ISL29028_REG_INTERRUPT:
	case ISL29028_REG_PROX_DATA:
	case ISL29028_REG_ALSIR_L:
	case ISL29028_REG_ALSIR_U:
		return true;
	default:
		return false;
	}
}

static const struct regmap_config isl29028_regmap_config = {
	.reg_bits = 8,
	.val_bits = 8,
572
	.volatile_reg = isl29028_is_volatile_reg,
573 574 575 576 577
	.max_register = ISL29028_NUM_REGS - 1,
	.num_reg_defaults_raw = ISL29028_NUM_REGS,
	.cache_type = REGCACHE_RBTREE,
};

578
static int isl29028_probe(struct i2c_client *client,
579
			  const struct i2c_device_id *id)
580 581 582 583 584
{
	struct isl29028_chip *chip;
	struct iio_dev *indio_dev;
	int ret;

585
	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip));
586
	if (!indio_dev)
587 588 589 590 591 592 593 594 595 596
		return -ENOMEM;

	chip = iio_priv(indio_dev);

	i2c_set_clientdata(client, indio_dev);
	mutex_init(&chip->lock);

	chip->regmap = devm_regmap_init_i2c(client, &isl29028_regmap_config);
	if (IS_ERR(chip->regmap)) {
		ret = PTR_ERR(chip->regmap);
597 598
		dev_err(&client->dev, "%s: Error %d initializing regmap\n",
			__func__, ret);
599
		return ret;
600 601
	}

602
	chip->enable_prox  = false;
603 604
	chip->prox_sampling_int = 20;
	chip->prox_sampling_frac = 0;
605 606 607 608 609
	chip->lux_scale = 2000;

	ret = regmap_write(chip->regmap, ISL29028_REG_TEST1_MODE, 0x0);
	if (ret < 0) {
		dev_err(&client->dev,
610 611
			"%s(): Error %d writing to TEST1_MODE register\n",
			__func__, ret);
612 613
		return ret;
	}
614

615 616 617
	ret = regmap_write(chip->regmap, ISL29028_REG_TEST2_MODE, 0x0);
	if (ret < 0) {
		dev_err(&client->dev,
618 619
			"%s(): Error %d writing to TEST2_MODE register\n",
			__func__, ret);
620 621 622
		return ret;
	}

623
	ret = isl29028_clear_configure_reg(chip);
624
	if (ret < 0)
625
		return ret;
626 627 628 629 630 631 632

	indio_dev->info = &isl29028_info;
	indio_dev->channels = isl29028_channels;
	indio_dev->num_channels = ARRAY_SIZE(isl29028_channels);
	indio_dev->name = id->name;
	indio_dev->dev.parent = &client->dev;
	indio_dev->modes = INDIO_DIRECT_MODE;
633

634 635 636 637 638
	pm_runtime_enable(&client->dev);
	pm_runtime_set_autosuspend_delay(&client->dev,
					 ISL29028_POWER_OFF_DELAY_MS);
	pm_runtime_use_autosuspend(&client->dev);

639
	ret = devm_iio_device_register(indio_dev->dev.parent, indio_dev);
640
	if (ret < 0) {
641
		dev_err(&client->dev,
642 643
			"%s(): iio registration failed with error %d\n",
			__func__, ret);
644
		return ret;
645
	}
646

647 648 649
	return 0;
}

650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689
static int isl29028_remove(struct i2c_client *client)
{
	struct iio_dev *indio_dev = i2c_get_clientdata(client);
	struct isl29028_chip *chip = iio_priv(indio_dev);

	iio_device_unregister(indio_dev);

	pm_runtime_disable(&client->dev);
	pm_runtime_set_suspended(&client->dev);
	pm_runtime_put_noidle(&client->dev);

	return isl29028_clear_configure_reg(chip);
}

static int __maybe_unused isl29028_suspend(struct device *dev)
{
	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
	struct isl29028_chip *chip = iio_priv(indio_dev);
	int ret;

	mutex_lock(&chip->lock);

	ret = isl29028_clear_configure_reg(chip);

	mutex_unlock(&chip->lock);

	return ret;
}

static int __maybe_unused isl29028_resume(struct device *dev)
{
	/**
	 * The specific component (ALS/IR or proximity) will enable itself as
	 * needed the next time that the user requests a reading. This is done
	 * above in isl29028_set_als_ir_mode() and isl29028_enable_proximity().
	 */
	return 0;
}

static const struct dev_pm_ops isl29028_pm_ops = {
690 691
	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
				pm_runtime_force_resume)
692 693 694
	SET_RUNTIME_PM_OPS(isl29028_suspend, isl29028_resume, NULL)
};

695 696 697 698 699 700 701
static const struct i2c_device_id isl29028_id[] = {
	{"isl29028", 0},
	{}
};
MODULE_DEVICE_TABLE(i2c, isl29028_id);

static const struct of_device_id isl29028_of_match[] = {
702 703
	{ .compatible = "isl,isl29028", }, /* for backward compat., don't use */
	{ .compatible = "isil,isl29028", },
704 705 706 707 708 709 710
	{ },
};
MODULE_DEVICE_TABLE(of, isl29028_of_match);

static struct i2c_driver isl29028_driver = {
	.driver  = {
		.name = "isl29028",
711
		.pm = &isl29028_pm_ops,
712 713 714
		.of_match_table = isl29028_of_match,
	},
	.probe	 = isl29028_probe,
715
	.remove  = isl29028_remove,
716 717 718 719 720 721 722 723
	.id_table = isl29028_id,
};

module_i2c_driver(isl29028_driver);

MODULE_DESCRIPTION("ISL29028 Ambient Light and Proximity Sensor driver");
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");