1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2013 Capella Microsystems Inc.
4 * Author: Kevin Tsai <ktsai@capellamicro.com>
7 #include <linux/acpi.h>
8 #include <linux/delay.h>
10 #include <linux/i2c.h>
11 #include <linux/mutex.h>
12 #include <linux/module.h>
13 #include <linux/mod_devicetable.h>
14 #include <linux/interrupt.h>
15 #include <linux/regulator/consumer.h>
16 #include <linux/iio/iio.h>
17 #include <linux/iio/sysfs.h>
18 #include <linux/iio/events.h>
19 #include <linux/init.h>
21 /* Registers Address */
22 #define CM32181_REG_ADDR_CMD 0x00
23 #define CM32181_REG_ADDR_WH 0x01
24 #define CM32181_REG_ADDR_WL 0x02
25 #define CM32181_REG_ADDR_TEST 0x03
26 #define CM32181_REG_ADDR_ALS 0x04
27 #define CM32181_REG_ADDR_STATUS 0x06
28 #define CM32181_REG_ADDR_ID 0x07
30 /* Number of Configurable Registers */
31 #define CM32181_CONF_REG_NUM 4
34 #define CM32181_CMD_ALS_DISABLE BIT(0)
35 #define CM32181_CMD_ALS_INT_EN BIT(1)
36 #define CM32181_CMD_ALS_THRES_WINDOW BIT(2)
38 #define CM32181_CMD_ALS_PERS_SHIFT 4
39 #define CM32181_CMD_ALS_PERS_MASK (0x03 << CM32181_CMD_ALS_PERS_SHIFT)
40 #define CM32181_CMD_ALS_PERS_DEFAULT (0x01 << CM32181_CMD_ALS_PERS_SHIFT)
42 #define CM32181_CMD_ALS_IT_SHIFT 6
43 #define CM32181_CMD_ALS_IT_MASK (0x0F << CM32181_CMD_ALS_IT_SHIFT)
44 #define CM32181_CMD_ALS_IT_DEFAULT (0x00 << CM32181_CMD_ALS_IT_SHIFT)
46 #define CM32181_CMD_ALS_SM_SHIFT 11
47 #define CM32181_CMD_ALS_SM_MASK (0x03 << CM32181_CMD_ALS_SM_SHIFT)
48 #define CM32181_CMD_ALS_SM_DEFAULT (0x01 << CM32181_CMD_ALS_SM_SHIFT)
50 #define CM32181_LUX_PER_BIT 500 /* ALS_SM=01 IT=800ms */
51 #define CM32181_LUX_PER_BIT_RESOLUTION 100000
52 #define CM32181_LUX_PER_BIT_BASE_IT 800000 /* Based on IT=800ms */
53 #define CM32181_CALIBSCALE_DEFAULT 100000
54 #define CM32181_CALIBSCALE_RESOLUTION 100000
56 #define SMBUS_ALERT_RESPONSE_ADDRESS 0x0c
58 /* CPM0 Index 0: device-id (3218 or 32181), 1: Unknown, 2: init_regs_bitmap */
59 #define CPM0_REGS_BITMAP 2
60 #define CPM0_HEADER_SIZE 3
62 /* CPM1 Index 0: lux_per_bit, 1: calibscale, 2: resolution (100000) */
63 #define CPM1_LUX_PER_BIT 0
64 #define CPM1_CALIBSCALE 1
68 static const int cm3218_als_it_bits
[] = { 0, 1, 2, 3 };
69 static const int cm3218_als_it_values
[] = { 100000, 200000, 400000, 800000 };
72 static const int cm32181_als_it_bits
[] = { 12, 8, 0, 1, 2, 3 };
73 static const int cm32181_als_it_values
[] = {
74 25000, 50000, 100000, 200000, 400000, 800000
78 struct i2c_client
*client
;
81 u16 conf_regs
[CM32181_CONF_REG_NUM
];
82 unsigned long init_regs_bitmap
;
85 int lux_per_bit_base_it
;
87 const int *als_it_bits
;
88 const int *als_it_values
;
91 static int cm32181_read_als_it(struct cm32181_chip
*cm32181
, int *val2
);
95 * cm32181_acpi_get_cpm() - Get CPM object from ACPI
96 * @dev: pointer of struct device.
97 * @obj_name: pointer of ACPI object name.
98 * @values: pointer of array for return elements.
99 * @count: maximum size of return array.
101 * Convert ACPI CPM table to array.
103 * Return: -ENODEV for fail. Otherwise is number of elements.
105 static int cm32181_acpi_get_cpm(struct device
*dev
, char *obj_name
,
106 u64
*values
, int count
)
108 struct acpi_buffer buffer
= { ACPI_ALLOCATE_BUFFER
, NULL
};
109 union acpi_object
*cpm
, *elem
;
114 handle
= ACPI_HANDLE(dev
);
118 status
= acpi_evaluate_object(handle
, obj_name
, NULL
, &buffer
);
119 if (ACPI_FAILURE(status
)) {
120 dev_err(dev
, "object %s not found\n", obj_name
);
124 cpm
= buffer
.pointer
;
125 if (cpm
->package
.count
> count
)
126 dev_warn(dev
, "%s table contains %u values, only using first %d values\n",
127 obj_name
, cpm
->package
.count
, count
);
129 count
= min_t(int, cpm
->package
.count
, count
);
130 for (i
= 0; i
< count
; i
++) {
131 elem
= &(cpm
->package
.elements
[i
]);
132 values
[i
] = elem
->integer
.value
;
135 kfree(buffer
.pointer
);
140 static void cm32181_acpi_parse_cpm_tables(struct cm32181_chip
*cm32181
)
142 u64 vals
[CPM0_HEADER_SIZE
+ CM32181_CONF_REG_NUM
];
143 struct device
*dev
= cm32181
->dev
;
146 count
= cm32181_acpi_get_cpm(dev
, "CPM0", vals
, ARRAY_SIZE(vals
));
147 if (count
<= CPM0_HEADER_SIZE
)
150 count
-= CPM0_HEADER_SIZE
;
152 cm32181
->init_regs_bitmap
= vals
[CPM0_REGS_BITMAP
];
153 cm32181
->init_regs_bitmap
&= GENMASK(count
- 1, 0);
154 for_each_set_bit(i
, &cm32181
->init_regs_bitmap
, count
)
155 cm32181
->conf_regs
[i
] = vals
[CPM0_HEADER_SIZE
+ i
];
157 count
= cm32181_acpi_get_cpm(dev
, "CPM1", vals
, ARRAY_SIZE(vals
));
158 if (count
!= CPM1_SIZE
)
161 cm32181
->lux_per_bit
= vals
[CPM1_LUX_PER_BIT
];
163 /* Check for uncalibrated devices */
164 if (vals
[CPM1_CALIBSCALE
] == CM32181_CALIBSCALE_DEFAULT
)
167 cm32181
->calibscale
= vals
[CPM1_CALIBSCALE
];
168 /* CPM1 lux_per_bit is for the current it value */
169 cm32181_read_als_it(cm32181
, &cm32181
->lux_per_bit_base_it
);
172 static void cm32181_acpi_parse_cpm_tables(struct cm32181_chip
*cm32181
)
175 #endif /* CONFIG_ACPI */
178 * cm32181_reg_init() - Initialize CM32181 registers
179 * @cm32181: pointer of struct cm32181.
181 * Initialize CM32181 ambient light sensor register to default values.
183 * Return: 0 for success; otherwise for error code.
185 static int cm32181_reg_init(struct cm32181_chip
*cm32181
)
187 struct i2c_client
*client
= cm32181
->client
;
191 ret
= i2c_smbus_read_word_data(client
, CM32181_REG_ADDR_ID
);
195 /* check device ID */
196 switch (ret
& 0xFF) {
197 case 0x18: /* CM3218 */
198 cm32181
->num_als_it
= ARRAY_SIZE(cm3218_als_it_bits
);
199 cm32181
->als_it_bits
= cm3218_als_it_bits
;
200 cm32181
->als_it_values
= cm3218_als_it_values
;
202 case 0x81: /* CM32181 */
203 case 0x82: /* CM32182, fully compat. with CM32181 */
204 cm32181
->num_als_it
= ARRAY_SIZE(cm32181_als_it_bits
);
205 cm32181
->als_it_bits
= cm32181_als_it_bits
;
206 cm32181
->als_it_values
= cm32181_als_it_values
;
213 cm32181
->conf_regs
[CM32181_REG_ADDR_CMD
] =
214 CM32181_CMD_ALS_IT_DEFAULT
| CM32181_CMD_ALS_SM_DEFAULT
;
215 cm32181
->init_regs_bitmap
= BIT(CM32181_REG_ADDR_CMD
);
216 cm32181
->calibscale
= CM32181_CALIBSCALE_DEFAULT
;
217 cm32181
->lux_per_bit
= CM32181_LUX_PER_BIT
;
218 cm32181
->lux_per_bit_base_it
= CM32181_LUX_PER_BIT_BASE_IT
;
220 cm32181_acpi_parse_cpm_tables(cm32181
);
222 /* Initialize registers*/
223 for_each_set_bit(i
, &cm32181
->init_regs_bitmap
, CM32181_CONF_REG_NUM
) {
224 ret
= i2c_smbus_write_word_data(client
, i
,
225 cm32181
->conf_regs
[i
]);
234 * cm32181_read_als_it() - Get sensor integration time (ms)
235 * @cm32181: pointer of struct cm32181
236 * @val2: pointer of int to load the als_it value.
238 * Report the current integration time in milliseconds.
240 * Return: IIO_VAL_INT_PLUS_MICRO for success, otherwise -EINVAL.
242 static int cm32181_read_als_it(struct cm32181_chip
*cm32181
, int *val2
)
247 als_it
= cm32181
->conf_regs
[CM32181_REG_ADDR_CMD
];
248 als_it
&= CM32181_CMD_ALS_IT_MASK
;
249 als_it
>>= CM32181_CMD_ALS_IT_SHIFT
;
250 for (i
= 0; i
< cm32181
->num_als_it
; i
++) {
251 if (als_it
== cm32181
->als_it_bits
[i
]) {
252 *val2
= cm32181
->als_it_values
[i
];
253 return IIO_VAL_INT_PLUS_MICRO
;
261 * cm32181_write_als_it() - Write sensor integration time
262 * @cm32181: pointer of struct cm32181.
263 * @val: integration time by millisecond.
265 * Convert integration time (ms) to sensor value.
267 * Return: i2c_smbus_write_word_data command return value.
269 static int cm32181_write_als_it(struct cm32181_chip
*cm32181
, int val
)
271 struct i2c_client
*client
= cm32181
->client
;
275 n
= cm32181
->num_als_it
;
276 for (i
= 0; i
< n
; i
++)
277 if (val
<= cm32181
->als_it_values
[i
])
282 als_it
= cm32181
->als_it_bits
[i
];
283 als_it
<<= CM32181_CMD_ALS_IT_SHIFT
;
285 mutex_lock(&cm32181
->lock
);
286 cm32181
->conf_regs
[CM32181_REG_ADDR_CMD
] &=
287 ~CM32181_CMD_ALS_IT_MASK
;
288 cm32181
->conf_regs
[CM32181_REG_ADDR_CMD
] |=
290 ret
= i2c_smbus_write_word_data(client
, CM32181_REG_ADDR_CMD
,
291 cm32181
->conf_regs
[CM32181_REG_ADDR_CMD
]);
292 mutex_unlock(&cm32181
->lock
);
298 * cm32181_get_lux() - report current lux value
299 * @cm32181: pointer of struct cm32181.
301 * Convert sensor raw data to lux. It depends on integration
302 * time and calibscale variable.
304 * Return: Positive value is lux, otherwise is error code.
306 static int cm32181_get_lux(struct cm32181_chip
*cm32181
)
308 struct i2c_client
*client
= cm32181
->client
;
313 ret
= cm32181_read_als_it(cm32181
, &als_it
);
317 lux
= cm32181
->lux_per_bit
;
318 lux
*= cm32181
->lux_per_bit_base_it
;
319 lux
= div_u64(lux
, als_it
);
321 ret
= i2c_smbus_read_word_data(client
, CM32181_REG_ADDR_ALS
);
326 lux
*= cm32181
->calibscale
;
327 lux
= div_u64(lux
, CM32181_CALIBSCALE_RESOLUTION
);
328 lux
= div_u64(lux
, CM32181_LUX_PER_BIT_RESOLUTION
);
336 static int cm32181_read_raw(struct iio_dev
*indio_dev
,
337 struct iio_chan_spec
const *chan
,
338 int *val
, int *val2
, long mask
)
340 struct cm32181_chip
*cm32181
= iio_priv(indio_dev
);
344 case IIO_CHAN_INFO_PROCESSED
:
345 ret
= cm32181_get_lux(cm32181
);
350 case IIO_CHAN_INFO_CALIBSCALE
:
351 *val
= cm32181
->calibscale
;
353 case IIO_CHAN_INFO_INT_TIME
:
355 ret
= cm32181_read_als_it(cm32181
, val2
);
362 static int cm32181_write_raw(struct iio_dev
*indio_dev
,
363 struct iio_chan_spec
const *chan
,
364 int val
, int val2
, long mask
)
366 struct cm32181_chip
*cm32181
= iio_priv(indio_dev
);
370 case IIO_CHAN_INFO_CALIBSCALE
:
371 cm32181
->calibscale
= val
;
373 case IIO_CHAN_INFO_INT_TIME
:
374 ret
= cm32181_write_als_it(cm32181
, val2
);
382 * cm32181_get_it_available() - Get available ALS IT value
383 * @dev: pointer of struct device.
384 * @attr: pointer of struct device_attribute.
385 * @buf: pointer of return string buffer.
387 * Display the available integration time values by millisecond.
389 * Return: string length.
391 static ssize_t
cm32181_get_it_available(struct device
*dev
,
392 struct device_attribute
*attr
, char *buf
)
394 struct cm32181_chip
*cm32181
= iio_priv(dev_to_iio_dev(dev
));
397 n
= cm32181
->num_als_it
;
398 for (i
= 0, len
= 0; i
< n
; i
++)
399 len
+= sprintf(buf
+ len
, "0.%06u ", cm32181
->als_it_values
[i
]);
400 return len
+ sprintf(buf
+ len
, "\n");
403 static const struct iio_chan_spec cm32181_channels
[] = {
406 .info_mask_separate
=
407 BIT(IIO_CHAN_INFO_PROCESSED
) |
408 BIT(IIO_CHAN_INFO_CALIBSCALE
) |
409 BIT(IIO_CHAN_INFO_INT_TIME
),
413 static IIO_DEVICE_ATTR(in_illuminance_integration_time_available
,
414 S_IRUGO
, cm32181_get_it_available
, NULL
, 0);
416 static struct attribute
*cm32181_attributes
[] = {
417 &iio_dev_attr_in_illuminance_integration_time_available
.dev_attr
.attr
,
421 static const struct attribute_group cm32181_attribute_group
= {
422 .attrs
= cm32181_attributes
425 static const struct iio_info cm32181_info
= {
426 .read_raw
= &cm32181_read_raw
,
427 .write_raw
= &cm32181_write_raw
,
428 .attrs
= &cm32181_attribute_group
,
431 static void cm32181_unregister_dummy_client(void *data
)
433 struct i2c_client
*client
= data
;
435 /* Unregister the dummy client */
436 i2c_unregister_device(client
);
439 static int cm32181_probe(struct i2c_client
*client
)
441 struct device
*dev
= &client
->dev
;
442 struct cm32181_chip
*cm32181
;
443 struct iio_dev
*indio_dev
;
446 indio_dev
= devm_iio_device_alloc(dev
, sizeof(*cm32181
));
450 i2c_set_clientdata(client
, indio_dev
);
453 * Some ACPI systems list 2 I2C resources for the CM3218 sensor, the
454 * SMBus Alert Response Address (ARA, 0x0c) and the actual I2C address.
455 * Detect this and take the following step to deal with it:
456 * 1. When a SMBus Alert capable sensor has an Alert asserted, it will
457 * not respond on its actual I2C address. Read a byte from the ARA
458 * to clear any pending Alerts.
459 * 2. Create a "dummy" client for the actual I2C address and
460 * use that client to communicate with the sensor.
462 if (ACPI_HANDLE(dev
) && client
->addr
== SMBUS_ALERT_RESPONSE_ADDRESS
) {
463 struct i2c_board_info board_info
= { .type
= "dummy" };
465 i2c_smbus_read_byte(client
);
467 client
= i2c_acpi_new_device(dev
, 1, &board_info
);
469 return PTR_ERR(client
);
471 ret
= devm_add_action_or_reset(dev
, cm32181_unregister_dummy_client
, client
);
476 cm32181
= iio_priv(indio_dev
);
477 cm32181
->client
= client
;
480 mutex_init(&cm32181
->lock
);
481 indio_dev
->channels
= cm32181_channels
;
482 indio_dev
->num_channels
= ARRAY_SIZE(cm32181_channels
);
483 indio_dev
->info
= &cm32181_info
;
484 indio_dev
->name
= dev_name(dev
);
485 indio_dev
->modes
= INDIO_DIRECT_MODE
;
487 ret
= cm32181_reg_init(cm32181
);
489 dev_err(dev
, "%s: register init failed\n", __func__
);
493 ret
= devm_iio_device_register(dev
, indio_dev
);
495 dev_err(dev
, "%s: regist device failed\n", __func__
);
502 static int cm32181_suspend(struct device
*dev
)
504 struct cm32181_chip
*cm32181
= iio_priv(dev_get_drvdata(dev
));
505 struct i2c_client
*client
= cm32181
->client
;
507 return i2c_smbus_write_word_data(client
, CM32181_REG_ADDR_CMD
,
508 CM32181_CMD_ALS_DISABLE
);
511 static int cm32181_resume(struct device
*dev
)
513 struct cm32181_chip
*cm32181
= iio_priv(dev_get_drvdata(dev
));
514 struct i2c_client
*client
= cm32181
->client
;
516 return i2c_smbus_write_word_data(client
, CM32181_REG_ADDR_CMD
,
517 cm32181
->conf_regs
[CM32181_REG_ADDR_CMD
]);
520 static DEFINE_SIMPLE_DEV_PM_OPS(cm32181_pm_ops
, cm32181_suspend
, cm32181_resume
);
522 static const struct of_device_id cm32181_of_match
[] = {
523 { .compatible
= "capella,cm3218" },
524 { .compatible
= "capella,cm32181" },
527 MODULE_DEVICE_TABLE(of
, cm32181_of_match
);
530 static const struct acpi_device_id cm32181_acpi_match
[] = {
534 MODULE_DEVICE_TABLE(acpi
, cm32181_acpi_match
);
537 static struct i2c_driver cm32181_driver
= {
540 .acpi_match_table
= ACPI_PTR(cm32181_acpi_match
),
541 .of_match_table
= cm32181_of_match
,
542 .pm
= pm_sleep_ptr(&cm32181_pm_ops
),
544 .probe
= cm32181_probe
,
547 module_i2c_driver(cm32181_driver
);
549 MODULE_AUTHOR("Kevin Tsai <ktsai@capellamicro.com>");
550 MODULE_DESCRIPTION("CM32181 ambient light sensor driver");
551 MODULE_LICENSE("GPL");