2 * Samsung Exynos5 SoC series Sensor driver
5 * Copyright (c) 2018 Samsung Electronics Co., Ltd
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/i2c.h>
13 #include <linux/time.h>
14 #include <linux/slab.h>
15 #include <linux/module.h>
16 #include <linux/videodev2.h>
17 #include <linux/videodev2_exynos_camera.h>
18 #include <media/v4l2-ctrls.h>
19 #include <media/v4l2-device.h>
20 #include <media/v4l2-subdev.h>
22 #include <exynos-fimc-is-sensor.h>
23 #include "fimc-is-sensor-eeprom-16885c.h"
24 #include "fimc-is-sensor-eeprom.h"
25 #include "fimc-is-device-sensor.h"
26 #include "fimc-is-device-sensor-peri.h"
27 #include "fimc-is-core.h"
29 #define SENSOR_EEPROM_NAME "16885C"
31 int fimc_is_eeprom_16885c_check_all_crc(struct v4l2_subdev
*subdev
)
34 struct fimc_is_module_enum
*module
;
35 struct fimc_is_eeprom
*eeprom
= NULL
;
36 struct fimc_is_device_sensor
*sensor
= NULL
;
42 module
= (struct fimc_is_module_enum
*)v4l2_get_subdev_hostdata(subdev
);
44 eeprom
= (struct fimc_is_eeprom
*)v4l2_get_subdevdata(subdev
);
49 sensor
= (struct fimc_is_device_sensor
*)v4l2_get_subdev_hostdata(module
->subdev
);
51 err("device sensor is NULL");
56 /* Check CRC to Address cal data */
57 ret
= CALL_EEPROMOPS(eeprom
, eeprom_check_address
, subdev
);
59 err("%s(): 16885C EEPROM Address section CRC check fail(%d)", __func__
, ret
);
61 /* All calibration data is zero set only Address section is invalid CRC */
62 fimc_is_eeprom_cal_data_set(eeprom
->data
, "all",
63 EEPROM_ADD_CRC_FST
, EEPROM_DATA_SIZE
, 0xff);
65 /*Set all cal_status to ERROR if Address cal data invalid*/
66 for (i
= 0; i
< CAMERA_CRC_INDEX_MAX
; i
++)
67 sensor
->cal_status
[i
] = CRC_ERROR
;
71 info("16885C EEPROM Address section CRC check success\n");
73 /* Check CRC to Information cal data */
74 ret
= CALL_EEPROMOPS(eeprom
, eeprom_check_info
, subdev
);
77 err("%s(): 16885C EEPROM Information CRC section check fail(%d)", __func__
, ret
);
79 /* All calibration data is 0xff set but exception Address section */
80 fimc_is_eeprom_cal_data_set(eeprom
->data
, "Information - End",
81 EEPROM_INFO_CRC_FST
, EEPROM_ADD_CAL_SIZE
, 0xff);
83 sensor
->cal_status
[CAMERA_CRC_INDEX_MNF
] = CRC_ERROR
;
86 info("16885C EEPROM Informaion section CRC check success\n");
88 sensor
->cal_status
[CAMERA_CRC_INDEX_MNF
] = CRC_NO_ERROR
;
91 /* Check CRC to AWB cal data */
92 ret
= CALL_EEPROMOPS(eeprom
, eeprom_check_awb
, subdev
);
95 err("%s(): 16885C EEPROM AWB section CRC check fail(%d)", __func__
, ret
);
97 fimc_is_eeprom_cal_data_set(eeprom
->data
, "AWB",
98 EEPROM_AWB_CRC_FST
, EEPROM_AWB_CAL_SIZE
, 0xff);
100 sensor
->cal_status
[CAMERA_CRC_INDEX_AWB
] = CRC_ERROR
;
103 info("16885C EEPROM AWB section CRC check success\n");
105 sensor
->cal_status
[CAMERA_CRC_INDEX_AWB
] = CRC_NO_ERROR
;
107 ret
= fimc_is_sensor_eeprom_check_awb_ratio(&eeprom
->data
[EEPROM_AWB_UNIT_OFFSET
],
108 &eeprom
->data
[EEPROM_AWB_GOLDEN_OFFSET
],&eeprom
->data
[EEPROM_AWB_LIMIT_OFFSET
]);
110 err("%s(): 16885C EEPROM AWB ratio out of limit(%d)", __func__
, ret
);
112 sensor
->cal_status
[CAMERA_CRC_INDEX_AWB
] = LIMIT_FAILURE
;
116 /* Check CRC to LSC cal data */
117 ret
= CALL_EEPROMOPS(eeprom
, eeprom_check_lsc
, subdev
);
120 err("%s(): 16885C EEPROM LSC section CRC check fail(%d)", __func__
, ret
);
122 fimc_is_eeprom_cal_data_set(eeprom
->data
, "LSC",
123 EEPROM_LSC_CRC_FST
, EEPROM_LSC_CAL_SIZE
, 0xff);
126 info("16885C EEPROM LSC section CRC check success\n");
128 /* Check CRC to SFR cal data */
129 ret
= CALL_EEPROMOPS(eeprom
, eeprom_check_sfr
, subdev
);
132 err("%s(): EEPROM SFR section CRC check fail(%d)", __func__
, ret
);
134 fimc_is_eeprom_cal_data_set(eeprom
->data
, "SFR",
135 EEPROM_SFR_CRC_FST
, EEPROM_SFR_CAL_SIZE
, 0xff);
138 info("16885C EEPROM SFR section CRC check success\n");
143 static int fimc_is_eeprom_16885c_check_address(struct v4l2_subdev
*subdev
)
148 struct fimc_is_eeprom
*eeprom
= NULL
;
152 eeprom
= (struct fimc_is_eeprom
*)v4l2_get_subdevdata(subdev
);
156 crc_value
= ((eeprom
->data
[EEPROM_ADD_CRC_SEC
] << 8) | (eeprom
->data
[EEPROM_ADD_CRC_FST
]));
158 crc16
= fimc_is_sensor_eeprom_check_crc(&eeprom
->data
[EEPROM_ADD_CRC_CHK_START
], EEPROM_ADD_CRC_CHK_SIZE
);
159 if (crc_value
!= crc16
) {
160 err("Error to ADD CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16
, crc_value
);
164 info("ADD CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16
, crc_value
);
169 static int fimc_is_eeprom_16885c_check_info(struct v4l2_subdev
*subdev
)
174 struct fimc_is_eeprom
*eeprom
= NULL
;
178 eeprom
= (struct fimc_is_eeprom
*)v4l2_get_subdevdata(subdev
);
182 crc_value
= ((eeprom
->data
[EEPROM_INFO_CRC_SEC
] << 8) | (eeprom
->data
[EEPROM_INFO_CRC_FST
]));
184 crc16
= fimc_is_sensor_eeprom_check_crc(&eeprom
->data
[EEPROM_INFO_CRC_CHK_START
], EEPROM_INFO_CRC_CHK_SIZE
);
185 if (crc_value
!= crc16
) {
186 err("Error to INFO CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16
, crc_value
);
190 info("INFO CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16
, crc_value
);
195 static int fimc_is_eeprom_16885c_check_awb(struct v4l2_subdev
*subdev
)
200 struct fimc_is_eeprom
*eeprom
= NULL
;
204 eeprom
= (struct fimc_is_eeprom
*)v4l2_get_subdevdata(subdev
);
208 crc_value
= ((eeprom
->data
[EEPROM_AWB_CRC_SEC
] << 8) | (eeprom
->data
[EEPROM_AWB_CRC_FST
]));
210 crc16
= fimc_is_sensor_eeprom_check_crc(&eeprom
->data
[EEPROM_AWB_CRC_CHK_START
], EEPROM_AWB_CRC_CHK_SIZE
);
211 if (crc_value
!= crc16
) {
212 err("Error to AWB CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16
, crc_value
);
216 info("AWB CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16
, crc_value
);
221 static int fimc_is_eeprom_16885c_check_lsc(struct v4l2_subdev
*subdev
)
226 struct fimc_is_eeprom
*eeprom
= NULL
;
230 eeprom
= (struct fimc_is_eeprom
*)v4l2_get_subdevdata(subdev
);
234 crc_value
= ((eeprom
->data
[EEPROM_LSC_CRC_SEC
] << 8) | (eeprom
->data
[EEPROM_LSC_CRC_FST
]));
236 crc16
= fimc_is_sensor_eeprom_check_crc(&eeprom
->data
[EEPROM_LSC_CRC_CHK_START
], EEPROM_LSC_CRC_CHK_SIZE
);
237 if (crc_value
!= crc16
) {
238 err("Error to LSC CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16
, crc_value
);
242 info("LSC CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16
, crc_value
);
247 static int fimc_is_eeprom_16885c_check_sfr(struct v4l2_subdev
*subdev
)
252 struct fimc_is_eeprom
*eeprom
= NULL
;
256 eeprom
= (struct fimc_is_eeprom
*)v4l2_get_subdevdata(subdev
);
260 crc_value
= ((eeprom
->data
[EEPROM_SFR_CRC_SEC
] << 8) | (eeprom
->data
[EEPROM_SFR_CRC_FST
]));
262 crc16
= fimc_is_sensor_eeprom_check_crc(&eeprom
->data
[EEPROM_SFR_CRC_CHK_START
], EEPROM_SFR_CRC_CHK_SIZE
);
263 if (crc_value
!= crc16
) {
264 err("Error to SFR CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16
, crc_value
);
268 info("SFR CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16
, crc_value
);
273 int fimc_is_eeprom_16885c_get_cal_data(struct v4l2_subdev
*subdev
)
276 struct fimc_is_eeprom
*eeprom
;
277 struct i2c_client
*client
;
281 eeprom
= (struct fimc_is_eeprom
*)v4l2_get_subdevdata(subdev
);
285 client
= eeprom
->client
;
286 if (unlikely(!client
)) {
287 err("client is NULL");
293 * EEPROM data file(.bin) will be deleted at every reboot
294 * so, when eeprom->file_write is zero, there is no eeprom data file
296 if (!eeprom
->file_write
) {
297 I2C_MUTEX_LOCK(eeprom
->i2c_lock
);
298 /* I2C read to Sensor EEPROM cal data */
299 ret
= fimc_is_eeprom_module_read(client
, EEPROM_ADD_CRC_FST
, eeprom
->data
, EEPROM_DATA_SIZE
);
301 err("%s(): eeprom i2c read failed(%d)\n", __func__
, ret
);
302 I2C_MUTEX_UNLOCK(eeprom
->i2c_lock
);
305 I2C_MUTEX_UNLOCK(eeprom
->i2c_lock
);
307 /* CRC check to each section cal data */
308 ret
= CALL_EEPROMOPS(eeprom
, eeprom_check_all_crc
, subdev
);
310 err("%s(): eeprom data invalid(%d)\n", __func__
, ret
);
312 /* Write file to Cal data */
313 ret
= fimc_is_eeprom_file_write(EEPROM_DATA_PATH
, (void *)eeprom
->data
, EEPROM_DATA_SIZE
);
315 err("%s(), eeprom file write fail(%d)\n", __func__
, ret
);
318 eeprom
->file_write
= 1;
320 ret
= CALL_EEPROMOPS(eeprom
, eeprom_check_all_crc
, subdev
);
322 err("%s(): eeprom data invalid(%d)\n", __func__
, ret
);
323 err("retry to read data from eeprom module and update file\n");
325 I2C_MUTEX_LOCK(eeprom
->i2c_lock
);
326 /* I2C read to Sensor EEPROM cal data */
327 ret
= fimc_is_eeprom_module_read(client
, EEPROM_ADD_CRC_FST
, eeprom
->data
, EEPROM_DATA_SIZE
);
329 err("%s(): eeprom i2c read failed(%d)\n", __func__
, ret
);
330 I2C_MUTEX_UNLOCK(eeprom
->i2c_lock
);
333 I2C_MUTEX_UNLOCK(eeprom
->i2c_lock
);
335 /* CRC check to each section cal data */
336 ret
= CALL_EEPROMOPS(eeprom
, eeprom_check_all_crc
, subdev
);
338 err("%s(): eeprom data invalid(%d)\n", __func__
, ret
);
345 static struct fimc_is_eeprom_ops sensor_eeprom_ops
= {
346 .eeprom_read
= fimc_is_eeprom_16885c_get_cal_data
,
347 .eeprom_check_all_crc
= fimc_is_eeprom_16885c_check_all_crc
,
348 .eeprom_check_address
= fimc_is_eeprom_16885c_check_address
,
349 .eeprom_check_info
= fimc_is_eeprom_16885c_check_info
,
350 .eeprom_check_awb
= fimc_is_eeprom_16885c_check_awb
,
351 .eeprom_check_lsc
= fimc_is_eeprom_16885c_check_lsc
,
352 .eeprom_check_sfr
= fimc_is_eeprom_16885c_check_sfr
,
355 static int sensor_eeprom_16885c_probe(struct i2c_client
*client
,
356 const struct i2c_device_id
*id
)
359 struct fimc_is_core
*core
;
360 struct v4l2_subdev
*subdev_eeprom
= NULL
;
361 struct fimc_is_eeprom
*eeprom
= NULL
;
362 struct fimc_is_device_sensor
*device
;
364 struct device_node
*dnode
;
368 FIMC_BUG(!fimc_is_dev
);
370 core
= (struct fimc_is_core
*)dev_get_drvdata(fimc_is_dev
);
372 probe_info("core device is not yet probed");
373 return -EPROBE_DEFER
;
377 dnode
= dev
->of_node
;
379 ret
= of_property_read_u32(dnode
, "id", &sensor_id
);
381 probe_info("core device is not yet probed");
382 return -EPROBE_DEFER
;
385 device
= &core
->sensor
[sensor_id
];
387 err("sensor device is NULL");
392 eeprom
= kzalloc(sizeof(struct fimc_is_eeprom
), GFP_KERNEL
);
394 err("eeprom is NULL");
399 subdev_eeprom
= kzalloc(sizeof(struct v4l2_subdev
), GFP_KERNEL
);
400 if (!subdev_eeprom
) {
401 probe_err("subdev_cis NULL");
406 eeprom
->data
= kzalloc(EEPROM_DATA_SIZE
, GFP_KERNEL
);
413 eeprom
->id
= EEPROM_NAME_16885C
;
414 eeprom
->subdev
= subdev_eeprom
;
415 eeprom
->device
= sensor_id
;
416 eeprom
->client
= client
;
417 eeprom
->i2c_lock
= NULL
;
418 eeprom
->total_size
= EEPROM_DATA_SIZE
;
419 eeprom
->eeprom_ops
= &sensor_eeprom_ops
;
421 for (i
= 0; i
< CAMERA_CRC_INDEX_MAX
; i
++)
422 device
->cal_status
[i
] = CRC_NO_ERROR
;
424 device
->subdev_eeprom
= subdev_eeprom
;
425 device
->eeprom
= eeprom
;
427 v4l2_set_subdevdata(subdev_eeprom
, eeprom
);
428 v4l2_set_subdev_hostdata(subdev_eeprom
, device
);
430 snprintf(subdev_eeprom
->name
, V4L2_SUBDEV_NAME_SIZE
, "eeprom-subdev.%d", eeprom
->id
);
432 probe_info("%s done\n", __func__
);
438 static const struct of_device_id sensor_eeprom_16885c_match
[] = {
440 .compatible
= "samsung,exynos5-fimc-is-sensor-eeprom-16885c",
444 MODULE_DEVICE_TABLE(of
, sensor_eeprom_16885c_match
);
446 static const struct i2c_device_id sensor_eeprom_16885c_idt
[] = {
447 { SENSOR_EEPROM_NAME
, 0 },
451 static struct i2c_driver sensor_eeprom_16885c_driver
= {
452 .probe
= sensor_eeprom_16885c_probe
,
454 .name
= SENSOR_EEPROM_NAME
,
455 .owner
= THIS_MODULE
,
456 .of_match_table
= sensor_eeprom_16885c_match
,
457 .suppress_bind_attrs
= true,
459 .id_table
= sensor_eeprom_16885c_idt
462 static int __init
sensor_eeprom_16885c_init(void)
466 ret
= i2c_add_driver(&sensor_eeprom_16885c_driver
);
468 err("failed to add %s driver: %d\n",
469 sensor_eeprom_16885c_driver
.driver
.name
, ret
);
473 late_initcall_sync(sensor_eeprom_16885c_init
);