2 * Copyright (C) 2013 Samsung Electronics Co., Ltd.
3 * Author: Beomho Seo <beomho.seo@samsung.com>
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2, as published
7 * by the Free Software Foundation.
10 #include <linux/delay.h>
11 #include <linux/err.h>
12 #include <linux/i2c.h>
13 #include <linux/mutex.h>
14 #include <linux/module.h>
15 #include <linux/interrupt.h>
16 #include <linux/regulator/consumer.h>
17 #include <linux/iio/iio.h>
18 #include <linux/iio/sysfs.h>
19 #include <linux/iio/events.h>
21 /* Slave address 0x19 for PS of 7 bit addressing protocol for I2C */
22 #define CM36651_I2C_ADDR_PS 0x19
23 /* Alert Response Address */
24 #define CM36651_ARA 0x0C
26 /* Ambient light sensor */
27 #define CM36651_CS_CONF1 0x00
28 #define CM36651_CS_CONF2 0x01
29 #define CM36651_ALS_WH_M 0x02
30 #define CM36651_ALS_WH_L 0x03
31 #define CM36651_ALS_WL_M 0x04
32 #define CM36651_ALS_WL_L 0x05
33 #define CM36651_CS_CONF3 0x06
34 #define CM36651_CS_CONF_REG_NUM 0x02
36 /* Proximity sensor */
37 #define CM36651_PS_CONF1 0x00
38 #define CM36651_PS_THD 0x01
39 #define CM36651_PS_CANC 0x02
40 #define CM36651_PS_CONF2 0x03
41 #define CM36651_PS_REG_NUM 0x04
43 /* CS_CONF1 command code */
44 #define CM36651_ALS_ENABLE 0x00
45 #define CM36651_ALS_DISABLE 0x01
46 #define CM36651_ALS_INT_EN 0x02
47 #define CM36651_ALS_THRES 0x04
49 /* CS_CONF2 command code */
50 #define CM36651_CS_CONF2_DEFAULT_BIT 0x08
52 /* CS_CONF3 channel integration time */
53 #define CM36651_CS_IT1 0x00 /* Integration time 80000 usec */
54 #define CM36651_CS_IT2 0x40 /* Integration time 160000 usec */
55 #define CM36651_CS_IT3 0x80 /* Integration time 320000 usec */
56 #define CM36651_CS_IT4 0xC0 /* Integration time 640000 usec */
58 /* PS_CONF1 command code */
59 #define CM36651_PS_ENABLE 0x00
60 #define CM36651_PS_DISABLE 0x01
61 #define CM36651_PS_INT_EN 0x02
62 #define CM36651_PS_PERS2 0x04
63 #define CM36651_PS_PERS3 0x08
64 #define CM36651_PS_PERS4 0x0C
66 /* PS_CONF1 command code: integration time */
67 #define CM36651_PS_IT1 0x00 /* Integration time 320 usec */
68 #define CM36651_PS_IT2 0x10 /* Integration time 420 usec */
69 #define CM36651_PS_IT3 0x20 /* Integration time 520 usec */
70 #define CM36651_PS_IT4 0x30 /* Integration time 640 usec */
72 /* PS_CONF1 command code: duty ratio */
73 #define CM36651_PS_DR1 0x00 /* Duty ratio 1/80 */
74 #define CM36651_PS_DR2 0x40 /* Duty ratio 1/160 */
75 #define CM36651_PS_DR3 0x80 /* Duty ratio 1/320 */
76 #define CM36651_PS_DR4 0xC0 /* Duty ratio 1/640 */
78 /* PS_THD command code */
79 #define CM36651_PS_INITIAL_THD 0x05
81 /* PS_CANC command code */
82 #define CM36651_PS_CANC_DEFAULT 0x00
84 /* PS_CONF2 command code */
85 #define CM36651_PS_HYS1 0x00
86 #define CM36651_PS_HYS2 0x01
87 #define CM36651_PS_SMART_PERS_EN 0x02
88 #define CM36651_PS_DIR_INT 0x04
89 #define CM36651_PS_MS 0x10
91 #define CM36651_CS_COLOR_NUM 4
93 #define CM36651_CLOSE_PROXIMITY 0x32
94 #define CM36651_FAR_PROXIMITY 0x33
96 #define CM36651_CS_INT_TIME_AVAIL "80000 160000 320000 640000"
97 #define CM36651_PS_INT_TIME_AVAIL "320 420 520 640"
99 enum cm36651_operation_mode
{
101 CM36651_PROXIMITY_EN
,
102 CM36651_PROXIMITY_EV_EN
,
105 enum cm36651_light_channel_idx
{
106 CM36651_LIGHT_CHANNEL_IDX_RED
,
107 CM36651_LIGHT_CHANNEL_IDX_GREEN
,
108 CM36651_LIGHT_CHANNEL_IDX_BLUE
,
109 CM36651_LIGHT_CHANNEL_IDX_CLEAR
,
112 enum cm36651_command
{
113 CM36651_CMD_READ_RAW_LIGHT
,
114 CM36651_CMD_READ_RAW_PROXIMITY
,
115 CM36651_CMD_PROX_EV_EN
,
116 CM36651_CMD_PROX_EV_DIS
,
119 static const u8 cm36651_cs_reg
[CM36651_CS_CONF_REG_NUM
] = {
124 static const u8 cm36651_ps_reg
[CM36651_PS_REG_NUM
] = {
131 struct cm36651_data
{
132 const struct cm36651_platform_data
*pdata
;
133 struct i2c_client
*client
;
134 struct i2c_client
*ps_client
;
135 struct i2c_client
*ara_client
;
137 struct regulator
*vled_reg
;
139 int cs_int_time
[CM36651_CS_COLOR_NUM
];
141 u8 cs_ctrl_regs
[CM36651_CS_CONF_REG_NUM
];
142 u8 ps_ctrl_regs
[CM36651_PS_REG_NUM
];
143 u16 color
[CM36651_CS_COLOR_NUM
];
146 static int cm36651_setup_reg(struct cm36651_data
*cm36651
)
148 struct i2c_client
*client
= cm36651
->client
;
149 struct i2c_client
*ps_client
= cm36651
->ps_client
;
152 /* CS initialization */
153 cm36651
->cs_ctrl_regs
[CM36651_CS_CONF1
] = CM36651_ALS_ENABLE
|
155 cm36651
->cs_ctrl_regs
[CM36651_CS_CONF2
] = CM36651_CS_CONF2_DEFAULT_BIT
;
157 for (i
= 0; i
< CM36651_CS_CONF_REG_NUM
; i
++) {
158 ret
= i2c_smbus_write_byte_data(client
, cm36651_cs_reg
[i
],
159 cm36651
->cs_ctrl_regs
[i
]);
164 /* PS initialization */
165 cm36651
->ps_ctrl_regs
[CM36651_PS_CONF1
] = CM36651_PS_ENABLE
|
167 cm36651
->ps_ctrl_regs
[CM36651_PS_THD
] = CM36651_PS_INITIAL_THD
;
168 cm36651
->ps_ctrl_regs
[CM36651_PS_CANC
] = CM36651_PS_CANC_DEFAULT
;
169 cm36651
->ps_ctrl_regs
[CM36651_PS_CONF2
] = CM36651_PS_HYS2
|
170 CM36651_PS_DIR_INT
| CM36651_PS_SMART_PERS_EN
;
172 for (i
= 0; i
< CM36651_PS_REG_NUM
; i
++) {
173 ret
= i2c_smbus_write_byte_data(ps_client
, cm36651_ps_reg
[i
],
174 cm36651
->ps_ctrl_regs
[i
]);
179 /* Set shutdown mode */
180 ret
= i2c_smbus_write_byte_data(client
, CM36651_CS_CONF1
,
181 CM36651_ALS_DISABLE
);
185 ret
= i2c_smbus_write_byte_data(cm36651
->ps_client
,
186 CM36651_PS_CONF1
, CM36651_PS_DISABLE
);
193 static int cm36651_read_output(struct cm36651_data
*cm36651
,
194 struct iio_chan_spec
const *chan
, int *val
)
196 struct i2c_client
*client
= cm36651
->client
;
199 switch (chan
->type
) {
201 *val
= i2c_smbus_read_word_data(client
, chan
->address
);
205 ret
= i2c_smbus_write_byte_data(client
, CM36651_CS_CONF1
,
206 CM36651_ALS_DISABLE
);
213 *val
= i2c_smbus_read_byte(cm36651
->ps_client
);
217 if (!test_bit(CM36651_PROXIMITY_EV_EN
, &cm36651
->flags
)) {
218 ret
= i2c_smbus_write_byte_data(cm36651
->ps_client
,
219 CM36651_PS_CONF1
, CM36651_PS_DISABLE
);
233 static irqreturn_t
cm36651_irq_handler(int irq
, void *data
)
235 struct iio_dev
*indio_dev
= data
;
236 struct cm36651_data
*cm36651
= iio_priv(indio_dev
);
237 struct i2c_client
*client
= cm36651
->client
;
242 * The PS INT pin is an active low signal that PS INT move logic low
243 * when the object is detect. Once the MCU host received the PS INT
244 * "LOW" signal, the Host needs to read the data at Alert Response
245 * Address(ARA) to clear the PS INT signal. After clearing the PS
246 * INT pin, the PS INT signal toggles from low to high.
248 ret
= i2c_smbus_read_byte(cm36651
->ara_client
);
250 dev_err(&client
->dev
,
251 "%s: Data read failed: %d\n", __func__
, ret
);
255 case CM36651_CLOSE_PROXIMITY
:
256 ev_dir
= IIO_EV_DIR_RISING
;
258 case CM36651_FAR_PROXIMITY
:
259 ev_dir
= IIO_EV_DIR_FALLING
;
262 dev_err(&client
->dev
,
263 "%s: Data read wrong: %d\n", __func__
, ret
);
267 ev_code
= IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY
,
268 CM36651_CMD_READ_RAW_PROXIMITY
,
269 IIO_EV_TYPE_THRESH
, ev_dir
);
271 iio_push_event(indio_dev
, ev_code
, iio_get_time_ns());
276 static int cm36651_set_operation_mode(struct cm36651_data
*cm36651
, int cmd
)
278 struct i2c_client
*client
= cm36651
->client
;
279 struct i2c_client
*ps_client
= cm36651
->ps_client
;
283 case CM36651_CMD_READ_RAW_LIGHT
:
284 ret
= i2c_smbus_write_byte_data(client
, CM36651_CS_CONF1
,
285 cm36651
->cs_ctrl_regs
[CM36651_CS_CONF1
]);
287 case CM36651_CMD_READ_RAW_PROXIMITY
:
288 if (test_bit(CM36651_PROXIMITY_EV_EN
, &cm36651
->flags
))
289 return CM36651_PROXIMITY_EV_EN
;
291 ret
= i2c_smbus_write_byte_data(ps_client
, CM36651_PS_CONF1
,
292 cm36651
->ps_ctrl_regs
[CM36651_PS_CONF1
]);
294 case CM36651_CMD_PROX_EV_EN
:
295 if (test_bit(CM36651_PROXIMITY_EV_EN
, &cm36651
->flags
)) {
296 dev_err(&client
->dev
,
297 "Already proximity event enable state\n");
300 set_bit(CM36651_PROXIMITY_EV_EN
, &cm36651
->flags
);
302 ret
= i2c_smbus_write_byte_data(ps_client
,
303 cm36651_ps_reg
[CM36651_PS_CONF1
],
304 CM36651_PS_INT_EN
| CM36651_PS_PERS2
| CM36651_PS_IT2
);
307 dev_err(&client
->dev
, "Proximity enable event failed\n");
311 case CM36651_CMD_PROX_EV_DIS
:
312 if (!test_bit(CM36651_PROXIMITY_EV_EN
, &cm36651
->flags
)) {
313 dev_err(&client
->dev
,
314 "Already proximity event disable state\n");
317 clear_bit(CM36651_PROXIMITY_EV_EN
, &cm36651
->flags
);
318 ret
= i2c_smbus_write_byte_data(ps_client
,
319 CM36651_PS_CONF1
, CM36651_PS_DISABLE
);
324 dev_err(&client
->dev
, "Write register failed\n");
329 static int cm36651_read_channel(struct cm36651_data
*cm36651
,
330 struct iio_chan_spec
const *chan
, int *val
)
332 struct i2c_client
*client
= cm36651
->client
;
335 if (chan
->type
== IIO_LIGHT
)
336 cmd
= CM36651_CMD_READ_RAW_LIGHT
;
337 else if (chan
->type
== IIO_PROXIMITY
)
338 cmd
= CM36651_CMD_READ_RAW_PROXIMITY
;
342 ret
= cm36651_set_operation_mode(cm36651
, cmd
);
344 dev_err(&client
->dev
, "CM36651 set operation mode failed\n");
347 /* Delay for work after enable operation */
349 ret
= cm36651_read_output(cm36651
, chan
, val
);
351 dev_err(&client
->dev
, "CM36651 read output failed\n");
358 static int cm36651_read_int_time(struct cm36651_data
*cm36651
,
359 struct iio_chan_spec
const *chan
, int *val
)
361 switch (chan
->type
) {
363 if (cm36651
->cs_int_time
[chan
->address
] == CM36651_CS_IT1
)
365 else if (cm36651
->cs_int_time
[chan
->address
] == CM36651_CS_IT2
)
367 else if (cm36651
->cs_int_time
[chan
->address
] == CM36651_CS_IT3
)
369 else if (cm36651
->cs_int_time
[chan
->address
] == CM36651_CS_IT4
)
375 if (cm36651
->ps_int_time
== CM36651_PS_IT1
)
377 else if (cm36651
->ps_int_time
== CM36651_PS_IT2
)
379 else if (cm36651
->ps_int_time
== CM36651_PS_IT3
)
381 else if (cm36651
->ps_int_time
== CM36651_PS_IT4
)
393 static int cm36651_write_int_time(struct cm36651_data
*cm36651
,
394 struct iio_chan_spec
const *chan
, int val
)
396 struct i2c_client
*client
= cm36651
->client
;
397 struct i2c_client
*ps_client
= cm36651
->ps_client
;
400 switch (chan
->type
) {
403 int_time
= CM36651_CS_IT1
;
404 else if (val
== 160000)
405 int_time
= CM36651_CS_IT2
;
406 else if (val
== 320000)
407 int_time
= CM36651_CS_IT3
;
408 else if (val
== 640000)
409 int_time
= CM36651_CS_IT4
;
413 ret
= i2c_smbus_write_byte_data(client
, CM36651_CS_CONF3
,
414 int_time
>> 2 * (chan
->address
));
416 dev_err(&client
->dev
, "CS integration time write failed\n");
419 cm36651
->cs_int_time
[chan
->address
] = int_time
;
423 int_time
= CM36651_PS_IT1
;
425 int_time
= CM36651_PS_IT2
;
427 int_time
= CM36651_PS_IT3
;
429 int_time
= CM36651_PS_IT4
;
433 ret
= i2c_smbus_write_byte_data(ps_client
,
434 CM36651_PS_CONF1
, int_time
);
436 dev_err(&client
->dev
, "PS integration time write failed\n");
439 cm36651
->ps_int_time
= int_time
;
448 static int cm36651_read_raw(struct iio_dev
*indio_dev
,
449 struct iio_chan_spec
const *chan
,
450 int *val
, int *val2
, long mask
)
452 struct cm36651_data
*cm36651
= iio_priv(indio_dev
);
455 mutex_lock(&cm36651
->lock
);
458 case IIO_CHAN_INFO_RAW
:
459 ret
= cm36651_read_channel(cm36651
, chan
, val
);
461 case IIO_CHAN_INFO_INT_TIME
:
462 ret
= cm36651_read_int_time(cm36651
, chan
, val
);
468 mutex_unlock(&cm36651
->lock
);
473 static int cm36651_write_raw(struct iio_dev
*indio_dev
,
474 struct iio_chan_spec
const *chan
,
475 int val
, int val2
, long mask
)
477 struct cm36651_data
*cm36651
= iio_priv(indio_dev
);
478 struct i2c_client
*client
= cm36651
->client
;
481 if (mask
== IIO_CHAN_INFO_INT_TIME
) {
482 ret
= cm36651_write_int_time(cm36651
, chan
, val
);
484 dev_err(&client
->dev
, "Integration time write failed\n");
490 static int cm36651_read_prox_thresh(struct iio_dev
*indio_dev
,
491 const struct iio_chan_spec
*chan
,
492 enum iio_event_type type
,
493 enum iio_event_direction dir
,
494 enum iio_event_info info
,
497 struct cm36651_data
*cm36651
= iio_priv(indio_dev
);
499 *val
= cm36651
->ps_ctrl_regs
[CM36651_PS_THD
];
504 static int cm36651_write_prox_thresh(struct iio_dev
*indio_dev
,
505 const struct iio_chan_spec
*chan
,
506 enum iio_event_type type
,
507 enum iio_event_direction dir
,
508 enum iio_event_info info
,
511 struct cm36651_data
*cm36651
= iio_priv(indio_dev
);
512 struct i2c_client
*client
= cm36651
->client
;
515 if (val
< 3 || val
> 255)
518 cm36651
->ps_ctrl_regs
[CM36651_PS_THD
] = val
;
519 ret
= i2c_smbus_write_byte_data(cm36651
->ps_client
, CM36651_PS_THD
,
520 cm36651
->ps_ctrl_regs
[CM36651_PS_THD
]);
523 dev_err(&client
->dev
, "PS threshold write failed: %d\n", ret
);
530 static int cm36651_write_prox_event_config(struct iio_dev
*indio_dev
,
531 const struct iio_chan_spec
*chan
,
532 enum iio_event_type type
,
533 enum iio_event_direction dir
,
536 struct cm36651_data
*cm36651
= iio_priv(indio_dev
);
537 int cmd
, ret
= -EINVAL
;
539 mutex_lock(&cm36651
->lock
);
541 cmd
= state
? CM36651_CMD_PROX_EV_EN
: CM36651_CMD_PROX_EV_DIS
;
542 ret
= cm36651_set_operation_mode(cm36651
, cmd
);
544 mutex_unlock(&cm36651
->lock
);
549 static int cm36651_read_prox_event_config(struct iio_dev
*indio_dev
,
550 const struct iio_chan_spec
*chan
,
551 enum iio_event_type type
,
552 enum iio_event_direction dir
)
554 struct cm36651_data
*cm36651
= iio_priv(indio_dev
);
557 mutex_lock(&cm36651
->lock
);
559 event_en
= test_bit(CM36651_PROXIMITY_EV_EN
, &cm36651
->flags
);
561 mutex_unlock(&cm36651
->lock
);
566 #define CM36651_LIGHT_CHANNEL(_color, _idx) { \
568 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
569 BIT(IIO_CHAN_INFO_INT_TIME), \
572 .channel2 = IIO_MOD_LIGHT_##_color, \
575 static const struct iio_event_spec cm36651_event_spec[] = {
577 .type
= IIO_EV_TYPE_THRESH
,
578 .dir
= IIO_EV_DIR_EITHER
,
579 .mask_separate
= BIT(IIO_EV_INFO_VALUE
) |
580 BIT(IIO_EV_INFO_ENABLE
),
584 static const struct iio_chan_spec cm36651_channels
[] = {
586 .type
= IIO_PROXIMITY
,
587 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
) |
588 BIT(IIO_CHAN_INFO_INT_TIME
),
589 .event_spec
= cm36651_event_spec
,
590 .num_event_specs
= ARRAY_SIZE(cm36651_event_spec
),
592 CM36651_LIGHT_CHANNEL(RED
, CM36651_LIGHT_CHANNEL_IDX_RED
),
593 CM36651_LIGHT_CHANNEL(GREEN
, CM36651_LIGHT_CHANNEL_IDX_GREEN
),
594 CM36651_LIGHT_CHANNEL(BLUE
, CM36651_LIGHT_CHANNEL_IDX_BLUE
),
595 CM36651_LIGHT_CHANNEL(CLEAR
, CM36651_LIGHT_CHANNEL_IDX_CLEAR
),
598 static IIO_CONST_ATTR(in_illuminance_integration_time_available
,
599 CM36651_CS_INT_TIME_AVAIL
);
600 static IIO_CONST_ATTR(in_proximity_integration_time_available
,
601 CM36651_PS_INT_TIME_AVAIL
);
603 static struct attribute
*cm36651_attributes
[] = {
604 &iio_const_attr_in_illuminance_integration_time_available
.dev_attr
.attr
,
605 &iio_const_attr_in_proximity_integration_time_available
.dev_attr
.attr
,
609 static const struct attribute_group cm36651_attribute_group
= {
610 .attrs
= cm36651_attributes
613 static const struct iio_info cm36651_info
= {
614 .driver_module
= THIS_MODULE
,
615 .read_raw
= &cm36651_read_raw
,
616 .write_raw
= &cm36651_write_raw
,
617 .read_event_value
= &cm36651_read_prox_thresh
,
618 .write_event_value
= &cm36651_write_prox_thresh
,
619 .read_event_config
= &cm36651_read_prox_event_config
,
620 .write_event_config
= &cm36651_write_prox_event_config
,
621 .attrs
= &cm36651_attribute_group
,
624 static int cm36651_probe(struct i2c_client
*client
,
625 const struct i2c_device_id
*id
)
627 struct cm36651_data
*cm36651
;
628 struct iio_dev
*indio_dev
;
631 indio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*cm36651
));
635 cm36651
= iio_priv(indio_dev
);
637 cm36651
->vled_reg
= devm_regulator_get(&client
->dev
, "vled");
638 if (IS_ERR(cm36651
->vled_reg
)) {
639 dev_err(&client
->dev
, "get regulator vled failed\n");
640 return PTR_ERR(cm36651
->vled_reg
);
643 ret
= regulator_enable(cm36651
->vled_reg
);
645 dev_err(&client
->dev
, "enable regulator vled failed\n");
649 i2c_set_clientdata(client
, indio_dev
);
651 cm36651
->client
= client
;
652 cm36651
->ps_client
= i2c_new_dummy(client
->adapter
,
653 CM36651_I2C_ADDR_PS
);
654 cm36651
->ara_client
= i2c_new_dummy(client
->adapter
, CM36651_ARA
);
655 mutex_init(&cm36651
->lock
);
656 indio_dev
->dev
.parent
= &client
->dev
;
657 indio_dev
->channels
= cm36651_channels
;
658 indio_dev
->num_channels
= ARRAY_SIZE(cm36651_channels
);
659 indio_dev
->info
= &cm36651_info
;
660 indio_dev
->name
= id
->name
;
661 indio_dev
->modes
= INDIO_DIRECT_MODE
;
663 ret
= cm36651_setup_reg(cm36651
);
665 dev_err(&client
->dev
, "%s: register setup failed\n", __func__
);
666 goto error_disable_reg
;
669 ret
= request_threaded_irq(client
->irq
, NULL
, cm36651_irq_handler
,
670 IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
671 "cm36651", indio_dev
);
673 dev_err(&client
->dev
, "%s: request irq failed\n", __func__
);
674 goto error_disable_reg
;
677 ret
= iio_device_register(indio_dev
);
679 dev_err(&client
->dev
, "%s: regist device failed\n", __func__
);
686 free_irq(client
->irq
, indio_dev
);
688 regulator_disable(cm36651
->vled_reg
);
692 static int cm36651_remove(struct i2c_client
*client
)
694 struct iio_dev
*indio_dev
= i2c_get_clientdata(client
);
695 struct cm36651_data
*cm36651
= iio_priv(indio_dev
);
697 iio_device_unregister(indio_dev
);
698 regulator_disable(cm36651
->vled_reg
);
699 free_irq(client
->irq
, indio_dev
);
704 static const struct i2c_device_id cm36651_id
[] = {
709 MODULE_DEVICE_TABLE(i2c
, cm36651_id
);
711 static const struct of_device_id cm36651_of_match
[] = {
712 { .compatible
= "capella,cm36651" },
716 static struct i2c_driver cm36651_driver
= {
719 .of_match_table
= cm36651_of_match
,
720 .owner
= THIS_MODULE
,
722 .probe
= cm36651_probe
,
723 .remove
= cm36651_remove
,
724 .id_table
= cm36651_id
,
727 module_i2c_driver(cm36651_driver
);
729 MODULE_AUTHOR("Beomho Seo <beomho.seo@samsung.com>");
730 MODULE_DESCRIPTION("CM36651 proximity/ambient light sensor driver");
731 MODULE_LICENSE("GPL v2");