1 // SPDX-License-Identifier: GPL-2.0-only
3 * These are the two Sharp GP2AP002 variants supported by this driver:
4 * GP2AP002A00F Ambient Light and Proximity Sensor
5 * GP2AP002S00F Proximity Sensor
7 * Copyright (C) 2020 Linaro Ltd.
8 * Author: Linus Walleij <linus.walleij@linaro.org>
10 * Based partly on the code in Sony Ericssons GP2AP00200F driver by
11 * Courtney Cavin and Oskar Andero in drivers/input/misc/gp2ap002a00f.c
12 * Based partly on a Samsung misc driver submitted by
13 * Donggeun Kim & Minkyu Kang in 2011:
14 * https://lore.kernel.org/lkml/1315556546-7445-1-git-send-email-dg77.kim@samsung.com/
15 * Based partly on a submission by
16 * Jonathan Bakker and Paweł Chmiel in january 2019:
17 * https://lore.kernel.org/linux-input/20190125175045.22576-1-pawel.mikolaj.chmiel@gmail.com/
18 * Based partly on code from the Samsung GT-S7710 by <mjchen@sta.samsung.com>
19 * Based partly on the code in LG Electronics GP2AP00200F driver by
20 * Kenobi Lee <sungyoung.lee@lge.com> and EunYoung Cho <ey.cho@lge.com>
22 #include <linux/module.h>
23 #include <linux/i2c.h>
24 #include <linux/regmap.h>
25 #include <linux/iio/iio.h>
26 #include <linux/iio/sysfs.h>
27 #include <linux/iio/events.h>
28 #include <linux/iio/consumer.h> /* To get our ADC channel */
29 #include <linux/iio/types.h> /* To deal with our ADC channel */
30 #include <linux/init.h>
31 #include <linux/delay.h>
32 #include <linux/regulator/consumer.h>
33 #include <linux/pm_runtime.h>
34 #include <linux/interrupt.h>
35 #include <linux/bits.h>
36 #include <linux/math64.h>
39 #define GP2AP002_PROX_CHANNEL 0
40 #define GP2AP002_ALS_CHANNEL 1
42 /* ------------------------------------------------------------------------ */
43 /* ADDRESS SYMBOL DATA Init R/W */
44 /* D7 D6 D5 D4 D3 D2 D1 D0 */
45 /* ------------------------------------------------------------------------ */
46 /* 0 PROX X X X X X X X VO H'00 R */
47 /* 1 GAIN X X X X LED0 X X X H'00 W */
48 /* 2 HYS HYSD HYSC1 HYSC0 X HYSF3 HYSF2 HYSF1 HYSF0 H'00 W */
49 /* 3 CYCLE X X CYCL2 CYCL1 CYCL0 OSC2 X X H'00 W */
50 /* 4 OPMOD X X X ASD X X VCON SSD H'00 W */
51 /* 6 CON X X X OCON1 OCON0 X X X H'00 W */
52 /* ------------------------------------------------------------------------ */
53 /* VO :Proximity sensing result(0: no detection, 1: detection) */
54 /* LED0 :Select switch for LED driver's On-registence(0:2x higher, 1:normal)*/
55 /* HYSD/HYSF :Adjusts the receiver sensitivity */
56 /* OSC :Select switch internal clocl frequency hoppling(0:effective) */
57 /* CYCL :Determine the detection cycle(typically 8ms, up to 128x) */
58 /* SSD :Software Shutdown function(0:shutdown, 1:operating) */
59 /* VCON :VOUT output method control(0:normal, 1:interrupt) */
60 /* ASD :Select switch for analog sleep function(0:ineffective, 1:effective)*/
61 /* OCON :Select switch for enabling/disabling VOUT (00:enable, 11:disable) */
63 #define GP2AP002_PROX 0x00
64 #define GP2AP002_GAIN 0x01
65 #define GP2AP002_HYS 0x02
66 #define GP2AP002_CYCLE 0x03
67 #define GP2AP002_OPMOD 0x04
68 #define GP2AP002_CON 0x06
70 #define GP2AP002_PROX_VO_DETECT BIT(0)
72 /* Setting this bit to 0 means 2x higher LED resistance */
73 #define GP2AP002_GAIN_LED_NORMAL BIT(3)
76 * These bits adjusts the proximity sensitivity, determining characteristics
77 * of the detection distance and its hysteresis.
79 #define GP2AP002_HYS_HYSD_SHIFT 7
80 #define GP2AP002_HYS_HYSD_MASK BIT(7)
81 #define GP2AP002_HYS_HYSC_SHIFT 5
82 #define GP2AP002_HYS_HYSC_MASK GENMASK(6, 5)
83 #define GP2AP002_HYS_HYSF_SHIFT 0
84 #define GP2AP002_HYS_HYSF_MASK GENMASK(3, 0)
85 #define GP2AP002_HYS_MASK (GP2AP002_HYS_HYSD_MASK | \
86 GP2AP002_HYS_HYSC_MASK | \
87 GP2AP002_HYS_HYSF_MASK)
90 * These values determine the detection cycle response time
91 * 0: 8ms, 1: 16ms, 2: 32ms, 3: 64ms, 4: 128ms,
92 * 5: 256ms, 6: 512ms, 7: 1024ms
94 #define GP2AP002_CYCLE_CYCL_SHIFT 3
95 #define GP2AP002_CYCLE_CYCL_MASK GENMASK(5, 3)
98 * Select switch for internal clock frequency hopping
102 #define GP2AP002_CYCLE_OSC_EFFECTIVE 0
103 #define GP2AP002_CYCLE_OSC_INEFFECTIVE BIT(2)
104 #define GP2AP002_CYCLE_OSC_MASK BIT(2)
106 /* Analog sleep effective */
107 #define GP2AP002_OPMOD_ASD BIT(4)
109 #define GP2AP002_OPMOD_SSD_OPERATING BIT(0)
111 #define GP2AP002_OPMOD_VCON_IRQ BIT(1)
112 #define GP2AP002_OPMOD_MASK (BIT(0) | BIT(1) | BIT(4))
115 * Select switch for enabling/disabling Vout pin
118 * 3: force to go High
120 #define GP2AP002_CON_OCON_SHIFT 3
121 #define GP2AP002_CON_OCON_ENABLE (0x0 << GP2AP002_CON_OCON_SHIFT)
122 #define GP2AP002_CON_OCON_LOW (0x2 << GP2AP002_CON_OCON_SHIFT)
123 #define GP2AP002_CON_OCON_HIGH (0x3 << GP2AP002_CON_OCON_SHIFT)
124 #define GP2AP002_CON_OCON_MASK (0x3 << GP2AP002_CON_OCON_SHIFT)
127 * struct gp2ap002 - GP2AP002 state
128 * @map: regmap pointer for the i2c regmap
129 * @dev: pointer to parent device
130 * @vdd: regulator controlling VDD
131 * @vio: regulator controlling VIO
132 * @alsout: IIO ADC channel to convert the ALSOUT signal
133 * @hys_far: hysteresis control from device tree
134 * @hys_close: hysteresis control from device tree
135 * @is_gp2ap002s00f: this is the GP2AP002F variant of the chip
136 * @irq: the IRQ line used by this device
137 * @enabled: we cannot read the status of the hardware so we need to
138 * keep track of whether the event is enabled using this state variable
143 struct regulator
*vdd
;
144 struct regulator
*vio
;
145 struct iio_channel
*alsout
;
148 bool is_gp2ap002s00f
;
153 static irqreturn_t
gp2ap002_prox_irq(int irq
, void *d
)
155 struct iio_dev
*indio_dev
= d
;
156 struct gp2ap002
*gp2ap002
= iio_priv(indio_dev
);
161 if (!gp2ap002
->enabled
)
164 ret
= regmap_read(gp2ap002
->map
, GP2AP002_PROX
, &val
);
166 dev_err(gp2ap002
->dev
, "error reading proximity\n");
170 if (val
& GP2AP002_PROX_VO_DETECT
) {
172 dev_dbg(gp2ap002
->dev
, "close\n");
173 ret
= regmap_write(gp2ap002
->map
, GP2AP002_HYS
,
176 dev_err(gp2ap002
->dev
,
177 "error setting up proximity hysteresis\n");
178 ev
= IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY
, GP2AP002_PROX_CHANNEL
,
179 IIO_EV_TYPE_THRESH
, IIO_EV_DIR_RISING
);
182 dev_dbg(gp2ap002
->dev
, "far\n");
183 ret
= regmap_write(gp2ap002
->map
, GP2AP002_HYS
,
184 gp2ap002
->hys_close
);
186 dev_err(gp2ap002
->dev
,
187 "error setting up proximity hysteresis\n");
188 ev
= IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY
, GP2AP002_PROX_CHANNEL
,
189 IIO_EV_TYPE_THRESH
, IIO_EV_DIR_FALLING
);
191 iio_push_event(indio_dev
, ev
, iio_get_time_ns(indio_dev
));
194 * After changing hysteresis, we need to wait for one detection
195 * cycle to see if anything changed, or we will just trigger the
196 * previous interrupt again. A detection cycle depends on the CYCLE
197 * register, we are hard-coding ~8 ms in probe() so wait some more
198 * than this, 20-30 ms.
200 usleep_range(20000, 30000);
203 ret
= regmap_write(gp2ap002
->map
, GP2AP002_CON
,
204 GP2AP002_CON_OCON_ENABLE
);
206 dev_err(gp2ap002
->dev
, "error setting up VOUT control\n");
212 * This array maps current and lux.
214 * Ambient light sensing range is 3 to 55000 lux.
216 * This mapping is based on the following formula.
217 * illuminance = 10 ^ (current[mA] / 10)
219 * When the ADC measures 0, return 0 lux.
221 static const u16 gp2ap002_illuminance_table
[] = {
222 0, 1, 1, 2, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 25, 32, 40, 50, 63, 79,
223 100, 126, 158, 200, 251, 316, 398, 501, 631, 794, 1000, 1259, 1585,
224 1995, 2512, 3162, 3981, 5012, 6310, 7943, 10000, 12589, 15849, 19953,
225 25119, 31623, 39811, 50119,
228 static int gp2ap002_get_lux(struct gp2ap002
*gp2ap002
)
233 ret
= iio_read_channel_processed(gp2ap002
->alsout
, &res
);
237 dev_dbg(gp2ap002
->dev
, "read %d mA from ADC\n", res
);
239 /* ensure we don't under/overflow */
240 res
= clamp(res
, 0, (int)ARRAY_SIZE(gp2ap002_illuminance_table
) - 1);
241 lux
= gp2ap002_illuminance_table
[res
];
246 static int gp2ap002_read_raw(struct iio_dev
*indio_dev
,
247 struct iio_chan_spec
const *chan
,
248 int *val
, int *val2
, long mask
)
250 struct gp2ap002
*gp2ap002
= iio_priv(indio_dev
);
253 pm_runtime_get_sync(gp2ap002
->dev
);
256 case IIO_CHAN_INFO_RAW
:
257 switch (chan
->type
) {
259 ret
= gp2ap002_get_lux(gp2ap002
);
274 pm_runtime_mark_last_busy(gp2ap002
->dev
);
275 pm_runtime_put_autosuspend(gp2ap002
->dev
);
280 static int gp2ap002_init(struct gp2ap002
*gp2ap002
)
284 /* Set up the IR LED resistance */
285 ret
= regmap_write(gp2ap002
->map
, GP2AP002_GAIN
,
286 GP2AP002_GAIN_LED_NORMAL
);
288 dev_err(gp2ap002
->dev
, "error setting up LED gain\n");
291 ret
= regmap_write(gp2ap002
->map
, GP2AP002_HYS
, gp2ap002
->hys_far
);
293 dev_err(gp2ap002
->dev
,
294 "error setting up proximity hysteresis\n");
298 /* Disable internal frequency hopping */
299 ret
= regmap_write(gp2ap002
->map
, GP2AP002_CYCLE
,
300 GP2AP002_CYCLE_OSC_INEFFECTIVE
);
302 dev_err(gp2ap002
->dev
,
303 "error setting up internal frequency hopping\n");
307 /* Enable chip and IRQ, disable analog sleep */
308 ret
= regmap_write(gp2ap002
->map
, GP2AP002_OPMOD
,
309 GP2AP002_OPMOD_SSD_OPERATING
|
310 GP2AP002_OPMOD_VCON_IRQ
);
312 dev_err(gp2ap002
->dev
, "error setting up operation mode\n");
316 /* Interrupt on VOUT enabled */
317 ret
= regmap_write(gp2ap002
->map
, GP2AP002_CON
,
318 GP2AP002_CON_OCON_ENABLE
);
320 dev_err(gp2ap002
->dev
, "error setting up VOUT control\n");
325 static int gp2ap002_read_event_config(struct iio_dev
*indio_dev
,
326 const struct iio_chan_spec
*chan
,
327 enum iio_event_type type
,
328 enum iio_event_direction dir
)
330 struct gp2ap002
*gp2ap002
= iio_priv(indio_dev
);
333 * We just keep track of this internally, as it is not possible to
334 * query the hardware.
336 return gp2ap002
->enabled
;
339 static int gp2ap002_write_event_config(struct iio_dev
*indio_dev
,
340 const struct iio_chan_spec
*chan
,
341 enum iio_event_type type
,
342 enum iio_event_direction dir
,
345 struct gp2ap002
*gp2ap002
= iio_priv(indio_dev
);
349 * This will bring the regulators up (unless they are on
350 * already) and reintialize the sensor by using runtime_pm
353 pm_runtime_get_sync(gp2ap002
->dev
);
354 gp2ap002
->enabled
= true;
356 pm_runtime_mark_last_busy(gp2ap002
->dev
);
357 pm_runtime_put_autosuspend(gp2ap002
->dev
);
358 gp2ap002
->enabled
= false;
364 static const struct iio_info gp2ap002_info
= {
365 .read_raw
= gp2ap002_read_raw
,
366 .read_event_config
= gp2ap002_read_event_config
,
367 .write_event_config
= gp2ap002_write_event_config
,
370 static const struct iio_event_spec gp2ap002_events
[] = {
372 .type
= IIO_EV_TYPE_THRESH
,
373 .dir
= IIO_EV_DIR_EITHER
,
374 .mask_separate
= BIT(IIO_EV_INFO_ENABLE
),
378 static const struct iio_chan_spec gp2ap002_channels
[] = {
380 .type
= IIO_PROXIMITY
,
381 .event_spec
= gp2ap002_events
,
382 .num_event_specs
= ARRAY_SIZE(gp2ap002_events
),
386 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
),
387 .channel
= GP2AP002_ALS_CHANNEL
,
392 * We need a special regmap because this hardware expects to
393 * write single bytes to registers but read a 16bit word on some
394 * variants and discard the lower 8 bits so combine
395 * i2c_smbus_read_word_data() with i2c_smbus_write_byte_data()
396 * selectively like this.
398 static int gp2ap002_regmap_i2c_read(void *context
, unsigned int reg
,
401 struct device
*dev
= context
;
402 struct i2c_client
*i2c
= to_i2c_client(dev
);
405 ret
= i2c_smbus_read_word_data(i2c
, reg
);
409 *val
= (ret
>> 8) & 0xFF;
414 static int gp2ap002_regmap_i2c_write(void *context
, unsigned int reg
,
417 struct device
*dev
= context
;
418 struct i2c_client
*i2c
= to_i2c_client(dev
);
420 return i2c_smbus_write_byte_data(i2c
, reg
, val
);
423 static struct regmap_bus gp2ap002_regmap_bus
= {
424 .reg_read
= gp2ap002_regmap_i2c_read
,
425 .reg_write
= gp2ap002_regmap_i2c_write
,
428 static int gp2ap002_probe(struct i2c_client
*client
,
429 const struct i2c_device_id
*id
)
431 struct gp2ap002
*gp2ap002
;
432 struct iio_dev
*indio_dev
;
433 struct device
*dev
= &client
->dev
;
434 enum iio_chan_type ch_type
;
435 static const struct regmap_config config
= {
438 .max_register
= GP2AP002_CON
,
440 struct regmap
*regmap
;
446 indio_dev
= devm_iio_device_alloc(dev
, sizeof(*gp2ap002
));
449 i2c_set_clientdata(client
, indio_dev
);
451 gp2ap002
= iio_priv(indio_dev
);
455 * Check the device compatible like this makes it possible to use
456 * ACPI PRP0001 for registering the sensor using device tree
459 ret
= device_property_read_string(dev
, "compatible", &compat
);
461 dev_err(dev
, "cannot check compatible\n");
464 gp2ap002
->is_gp2ap002s00f
= !strcmp(compat
, "sharp,gp2ap002s00f");
466 regmap
= devm_regmap_init(dev
, &gp2ap002_regmap_bus
, dev
, &config
);
467 if (IS_ERR(regmap
)) {
468 dev_err(dev
, "Failed to register i2c regmap %d\n",
469 (int)PTR_ERR(regmap
));
470 return PTR_ERR(regmap
);
472 gp2ap002
->map
= regmap
;
475 * The hysteresis settings are coded into the device tree as values
476 * to be written into the hysteresis register. The datasheet defines
477 * modes "A", "B1" and "B2" with fixed values to be use but vendor
478 * code trees for actual devices are tweaking these values and refer to
479 * modes named things like "B1.5". To be able to support any devices,
480 * we allow passing an arbitrary hysteresis setting for "near" and
484 /* Check the device tree for the IR LED hysteresis */
485 ret
= device_property_read_u8(dev
, "sharp,proximity-far-hysteresis",
488 dev_err(dev
, "failed to obtain proximity far setting\n");
491 dev_dbg(dev
, "proximity far setting %02x\n", val
);
492 gp2ap002
->hys_far
= val
;
494 ret
= device_property_read_u8(dev
, "sharp,proximity-close-hysteresis",
497 dev_err(dev
, "failed to obtain proximity close setting\n");
500 dev_dbg(dev
, "proximity close setting %02x\n", val
);
501 gp2ap002
->hys_close
= val
;
503 /* The GP2AP002A00F has a light sensor too */
504 if (!gp2ap002
->is_gp2ap002s00f
) {
505 gp2ap002
->alsout
= devm_iio_channel_get(dev
, "alsout");
506 if (IS_ERR(gp2ap002
->alsout
)) {
507 if (PTR_ERR(gp2ap002
->alsout
) == -ENODEV
) {
508 dev_err(dev
, "no ADC, deferring...\n");
509 return -EPROBE_DEFER
;
511 dev_err(dev
, "failed to get ALSOUT ADC channel\n");
512 return PTR_ERR(gp2ap002
->alsout
);
514 ret
= iio_get_channel_type(gp2ap002
->alsout
, &ch_type
);
517 if (ch_type
!= IIO_CURRENT
) {
519 "wrong type of IIO channel specified for ALSOUT\n");
524 gp2ap002
->vdd
= devm_regulator_get(dev
, "vdd");
525 if (IS_ERR(gp2ap002
->vdd
)) {
526 dev_err(dev
, "failed to get VDD regulator\n");
527 return PTR_ERR(gp2ap002
->vdd
);
529 gp2ap002
->vio
= devm_regulator_get(dev
, "vio");
530 if (IS_ERR(gp2ap002
->vio
)) {
531 dev_err(dev
, "failed to get VIO regulator\n");
532 return PTR_ERR(gp2ap002
->vio
);
535 /* Operating voltage 2.4V .. 3.6V according to datasheet */
536 ret
= regulator_set_voltage(gp2ap002
->vdd
, 2400000, 3600000);
538 dev_err(dev
, "failed to sett VDD voltage\n");
542 /* VIO should be between 1.65V and VDD */
543 ret
= regulator_get_voltage(gp2ap002
->vdd
);
545 dev_err(dev
, "failed to get VDD voltage\n");
548 ret
= regulator_set_voltage(gp2ap002
->vio
, 1650000, ret
);
550 dev_err(dev
, "failed to set VIO voltage\n");
554 ret
= regulator_enable(gp2ap002
->vdd
);
556 dev_err(dev
, "failed to enable VDD regulator\n");
559 ret
= regulator_enable(gp2ap002
->vio
);
561 dev_err(dev
, "failed to enable VIO regulator\n");
562 goto out_disable_vdd
;
568 * Initialize the device and signal to runtime PM that now we are
569 * definitely up and using power.
571 ret
= gp2ap002_init(gp2ap002
);
573 dev_err(dev
, "initialization failed\n");
574 goto out_disable_vio
;
576 pm_runtime_get_noresume(dev
);
577 pm_runtime_set_active(dev
);
578 pm_runtime_enable(dev
);
579 gp2ap002
->enabled
= false;
581 ret
= devm_request_threaded_irq(dev
, client
->irq
, NULL
,
582 gp2ap002_prox_irq
, IRQF_ONESHOT
,
583 "gp2ap002", indio_dev
);
585 dev_err(dev
, "unable to request IRQ\n");
586 goto out_disable_vio
;
588 gp2ap002
->irq
= client
->irq
;
591 * As the device takes 20 ms + regulator delay to come up with a fresh
592 * measurement after power-on, do not shut it down unnecessarily.
593 * Set autosuspend to a one second.
595 pm_runtime_set_autosuspend_delay(dev
, 1000);
596 pm_runtime_use_autosuspend(dev
);
599 indio_dev
->info
= &gp2ap002_info
;
600 indio_dev
->name
= "gp2ap002";
601 indio_dev
->channels
= gp2ap002_channels
;
602 /* Skip light channel for the proximity-only sensor */
603 num_chan
= ARRAY_SIZE(gp2ap002_channels
);
604 if (gp2ap002
->is_gp2ap002s00f
)
606 indio_dev
->num_channels
= num_chan
;
607 indio_dev
->modes
= INDIO_DIRECT_MODE
;
609 ret
= iio_device_register(indio_dev
);
612 dev_dbg(dev
, "Sharp GP2AP002 probed successfully\n");
617 pm_runtime_put_noidle(dev
);
618 pm_runtime_disable(dev
);
620 regulator_disable(gp2ap002
->vio
);
622 regulator_disable(gp2ap002
->vdd
);
626 static int gp2ap002_remove(struct i2c_client
*client
)
628 struct iio_dev
*indio_dev
= i2c_get_clientdata(client
);
629 struct gp2ap002
*gp2ap002
= iio_priv(indio_dev
);
630 struct device
*dev
= &client
->dev
;
632 pm_runtime_get_sync(dev
);
633 pm_runtime_put_noidle(dev
);
634 pm_runtime_disable(dev
);
635 iio_device_unregister(indio_dev
);
636 regulator_disable(gp2ap002
->vio
);
637 regulator_disable(gp2ap002
->vdd
);
642 static int __maybe_unused
gp2ap002_runtime_suspend(struct device
*dev
)
644 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
645 struct gp2ap002
*gp2ap002
= iio_priv(indio_dev
);
648 /* Deactivate the IRQ */
649 disable_irq(gp2ap002
->irq
);
651 /* Disable chip and IRQ, everything off */
652 ret
= regmap_write(gp2ap002
->map
, GP2AP002_OPMOD
, 0x00);
654 dev_err(gp2ap002
->dev
, "error setting up operation mode\n");
658 * As these regulators may be shared, at least we are now in
659 * sleep even if the regulators aren't really turned off.
661 regulator_disable(gp2ap002
->vio
);
662 regulator_disable(gp2ap002
->vdd
);
667 static int __maybe_unused
gp2ap002_runtime_resume(struct device
*dev
)
669 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
670 struct gp2ap002
*gp2ap002
= iio_priv(indio_dev
);
673 ret
= regulator_enable(gp2ap002
->vdd
);
675 dev_err(dev
, "failed to enable VDD regulator in resume path\n");
678 ret
= regulator_enable(gp2ap002
->vio
);
680 dev_err(dev
, "failed to enable VIO regulator in resume path\n");
686 ret
= gp2ap002_init(gp2ap002
);
688 dev_err(dev
, "re-initialization failed\n");
692 /* Re-activate the IRQ */
693 enable_irq(gp2ap002
->irq
);
698 static const struct dev_pm_ops gp2ap002_dev_pm_ops
= {
699 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend
,
700 pm_runtime_force_resume
)
701 SET_RUNTIME_PM_OPS(gp2ap002_runtime_suspend
,
702 gp2ap002_runtime_resume
, NULL
)
705 static const struct i2c_device_id gp2ap002_id_table
[] = {
709 MODULE_DEVICE_TABLE(i2c
, gp2ap002_id_table
);
711 static const struct of_device_id gp2ap002_of_match
[] = {
712 { .compatible
= "sharp,gp2ap002a00f" },
713 { .compatible
= "sharp,gp2ap002s00f" },
716 MODULE_DEVICE_TABLE(of
, gp2ap002_of_match
);
718 static struct i2c_driver gp2ap002_driver
= {
721 .of_match_table
= gp2ap002_of_match
,
722 .pm
= &gp2ap002_dev_pm_ops
,
724 .probe
= gp2ap002_probe
,
725 .remove
= gp2ap002_remove
,
726 .id_table
= gp2ap002_id_table
,
728 module_i2c_driver(gp2ap002_driver
);
730 MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>");
731 MODULE_DESCRIPTION("GP2AP002 ambient light and proximity sensor driver");
732 MODULE_LICENSE("GPL v2");