blob: 1dbacdda637efaaa369fa441a3c819b9f4d97196 [file] [log] [blame]
Pratap Nirujogi6e759912018-01-17 17:51:17 +05301/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
Sundara Vinayagam16b4b352018-05-15 17:13:10 +053013#define SENSOR_DRIVER_I2C "camera"
Pratap Nirujogi6e759912018-01-17 17:51:17 +053014/* Header file declaration */
15#include "msm_sensor.h"
16#include "msm_sd.h"
17#include "camera.h"
18#include "msm_cci.h"
19#include "msm_camera_dt_util.h"
20#include "msm_sensor_driver.h"
frankcheng049cc9e2020-05-09 20:59:58 +080021#include "../actuator/msm_actuator.h"
Pratap Nirujogi6e759912018-01-17 17:51:17 +053022
23/* Logging macro */
24#undef CDBG
25#define CDBG(fmt, args...) pr_debug(fmt, ##args)
26
27#define SENSOR_MAX_MOUNTANGLE (360)
28
frankcheng049cc9e2020-05-09 20:59:58 +080029int nActuatorAK7374 = 0;
30int nActuatorDW9800 = 0;
31
Pratap Nirujogi6e759912018-01-17 17:51:17 +053032static struct v4l2_file_operations msm_sensor_v4l2_subdev_fops;
33static int32_t msm_sensor_driver_platform_probe(struct platform_device *pdev);
34
35/* Static declaration */
36static struct msm_sensor_ctrl_t *g_sctrl[MAX_CAMERAS];
37
38static int msm_sensor_platform_remove(struct platform_device *pdev)
39{
40 struct msm_sensor_ctrl_t *s_ctrl;
41
42 pr_err("%s: sensor FREE\n", __func__);
43
44 s_ctrl = g_sctrl[pdev->id];
45 if (!s_ctrl) {
46 pr_err("%s: sensor device is NULL\n", __func__);
47 return 0;
48 }
49
50 msm_sensor_free_sensor_data(s_ctrl);
51 kfree(s_ctrl->msm_sensor_mutex);
52 kfree(s_ctrl->sensor_i2c_client);
53 kfree(s_ctrl);
54 g_sctrl[pdev->id] = NULL;
55
56 return 0;
57}
58
59
60static const struct of_device_id msm_sensor_driver_dt_match[] = {
61 {.compatible = "qcom,camera"},
62 {}
63};
64
65MODULE_DEVICE_TABLE(of, msm_sensor_driver_dt_match);
66
67static struct platform_driver msm_sensor_platform_driver = {
68 .probe = msm_sensor_driver_platform_probe,
69 .driver = {
70 .name = "qcom,camera",
71 .owner = THIS_MODULE,
72 .of_match_table = msm_sensor_driver_dt_match,
73 },
74 .remove = msm_sensor_platform_remove,
75};
76
77static struct v4l2_subdev_info msm_sensor_driver_subdev_info[] = {
78 {
79 .code = MEDIA_BUS_FMT_SBGGR10_1X10,
80 .colorspace = V4L2_COLORSPACE_JPEG,
81 .fmt = 1,
82 .order = 0,
83 },
84};
85
86static int32_t msm_sensor_driver_create_i2c_v4l_subdev
87 (struct msm_sensor_ctrl_t *s_ctrl)
88{
89 int32_t rc = 0;
90 uint32_t session_id = 0;
91 struct i2c_client *client = s_ctrl->sensor_i2c_client->client;
92
93 CDBG("%s %s I2c probe succeeded\n", __func__, client->name);
94 if (s_ctrl->bypass_video_node_creation == 0) {
95 rc = camera_init_v4l2(&client->dev, &session_id);
96 if (rc < 0) {
97 pr_err("failed: camera_init_i2c_v4l2 rc %d", rc);
98 return rc;
99 }
100 }
101
102 CDBG("%s rc %d session_id %d\n", __func__, rc, session_id);
103 snprintf(s_ctrl->msm_sd.sd.name,
104 sizeof(s_ctrl->msm_sd.sd.name), "%s",
105 s_ctrl->sensordata->sensor_name);
106 v4l2_i2c_subdev_init(&s_ctrl->msm_sd.sd, client,
107 s_ctrl->sensor_v4l2_subdev_ops);
108 v4l2_set_subdevdata(&s_ctrl->msm_sd.sd, client);
109 s_ctrl->msm_sd.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
110 media_entity_pads_init(&s_ctrl->msm_sd.sd.entity, 0, NULL);
Trishansh Bhardwaj586ba082018-02-24 15:02:44 +0530111 s_ctrl->msm_sd.sd.entity.function = MSM_CAMERA_SUBDEV_SENSOR;
Pratap Nirujogi6e759912018-01-17 17:51:17 +0530112 s_ctrl->msm_sd.sd.entity.name = s_ctrl->msm_sd.sd.name;
113 s_ctrl->sensordata->sensor_info->session_id = session_id;
114 s_ctrl->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x3;
115 rc = msm_sd_register(&s_ctrl->msm_sd);
116 if (rc < 0) {
117 pr_err("failed: msm_sd_register rc %d", rc);
118 return rc;
119 }
120 msm_sensor_v4l2_subdev_fops = v4l2_subdev_fops;
121#ifdef CONFIG_COMPAT
122 msm_sensor_v4l2_subdev_fops.compat_ioctl32 =
123 msm_sensor_subdev_fops_ioctl;
124#endif
125 s_ctrl->msm_sd.sd.devnode->fops =
126 &msm_sensor_v4l2_subdev_fops;
127 CDBG("%s:%d\n", __func__, __LINE__);
128 return rc;
129}
130
131static int32_t msm_sensor_driver_create_v4l_subdev
132 (struct msm_sensor_ctrl_t *s_ctrl)
133{
134 int32_t rc = 0;
135 uint32_t session_id = 0;
136
137 if (s_ctrl->bypass_video_node_creation == 0) {
138 rc = camera_init_v4l2(&s_ctrl->pdev->dev, &session_id);
139 if (rc < 0) {
140 pr_err("failed: camera_init_v4l2 rc %d", rc);
141 return rc;
142 }
143 }
144
145 CDBG("rc %d session_id %d", rc, session_id);
146 s_ctrl->sensordata->sensor_info->session_id = session_id;
147
148 /* Create /dev/v4l-subdevX device */
149 v4l2_subdev_init(&s_ctrl->msm_sd.sd, s_ctrl->sensor_v4l2_subdev_ops);
150 snprintf(s_ctrl->msm_sd.sd.name, sizeof(s_ctrl->msm_sd.sd.name), "%s",
151 s_ctrl->sensordata->sensor_name);
152 v4l2_set_subdevdata(&s_ctrl->msm_sd.sd, s_ctrl->pdev);
153 s_ctrl->msm_sd.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
154 media_entity_pads_init(&s_ctrl->msm_sd.sd.entity, 0, NULL);
Trishansh Bhardwaj586ba082018-02-24 15:02:44 +0530155 s_ctrl->msm_sd.sd.entity.function = MSM_CAMERA_SUBDEV_SENSOR;
Pratap Nirujogi6e759912018-01-17 17:51:17 +0530156 s_ctrl->msm_sd.sd.entity.name = s_ctrl->msm_sd.sd.name;
157 s_ctrl->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x3;
158 rc = msm_sd_register(&s_ctrl->msm_sd);
159 if (rc < 0) {
160 pr_err("failed: msm_sd_register rc %d", rc);
161 return rc;
162 }
163 msm_cam_copy_v4l2_subdev_fops(&msm_sensor_v4l2_subdev_fops);
164#ifdef CONFIG_COMPAT
165 msm_sensor_v4l2_subdev_fops.compat_ioctl32 =
166 msm_sensor_subdev_fops_ioctl;
167#endif
168 s_ctrl->msm_sd.sd.devnode->fops =
169 &msm_sensor_v4l2_subdev_fops;
170
171 return rc;
172}
173
174static int32_t msm_sensor_fill_eeprom_subdevid_by_name(
175 struct msm_sensor_ctrl_t *s_ctrl)
176{
177 int32_t rc = 0;
178 const char *eeprom_name;
179 struct device_node *src_node = NULL;
180 uint32_t val = 0, eeprom_name_len;
181 int32_t *eeprom_subdev_id, i, userspace_probe = 0;
182 int32_t count = 0;
183 struct msm_sensor_info_t *sensor_info;
184 struct device_node *of_node = s_ctrl->of_node;
185 const void *p;
186
187 if (!s_ctrl->sensordata->eeprom_name || !of_node)
188 return -EINVAL;
189
190 eeprom_name_len = strlen(s_ctrl->sensordata->eeprom_name);
191 if (eeprom_name_len >= MAX_SENSOR_NAME)
192 return -EINVAL;
193
194 sensor_info = s_ctrl->sensordata->sensor_info;
195 eeprom_subdev_id = &sensor_info->subdev_id[SUB_MODULE_EEPROM];
196 /*
197 * string for eeprom name is valid, set sudev id to -1
198 * and try to found new id
199 */
200 *eeprom_subdev_id = -1;
201
202 if (eeprom_name_len == 0)
203 return 0;
204
205 p = of_get_property(of_node, "qcom,eeprom-src", &count);
206 if (!p || !count)
207 return 0;
208
209 count /= sizeof(uint32_t);
210 for (i = 0; i < count; i++) {
211 userspace_probe = 0;
212 eeprom_name = NULL;
213 src_node = of_parse_phandle(of_node, "qcom,eeprom-src", i);
214 if (!src_node) {
215 pr_err("eeprom src node NULL\n");
216 continue;
217 }
218 /* In the case of eeprom probe from kernel eeprom name
219 * should be present, Otherwise it will throw as errors
220 */
221 rc = of_property_read_string(src_node, "qcom,eeprom-name",
222 &eeprom_name);
223 if (rc < 0) {
224 pr_err("%s:%d Eeprom userspace probe for %s\n",
225 __func__, __LINE__,
226 s_ctrl->sensordata->eeprom_name);
227 of_node_put(src_node);
228 userspace_probe = 1;
229 if (count > 1)
230 return -EINVAL;
231 }
232 if (!userspace_probe &&
233 strcmp(eeprom_name, s_ctrl->sensordata->eeprom_name))
234 continue;
235
236 rc = of_property_read_u32(src_node, "cell-index", &val);
237 if (rc < 0) {
238 pr_err("%s qcom,eeprom cell index %d, rc %d\n",
239 __func__, val, rc);
240 of_node_put(src_node);
241 if (userspace_probe)
242 return -EINVAL;
243 continue;
244 }
245
246 *eeprom_subdev_id = val;
247 CDBG("%s:%d Eeprom subdevice id is %d\n",
248 __func__, __LINE__, val);
249 of_node_put(src_node);
250 src_node = NULL;
251 break;
252 }
253
254 return rc;
255}
256
257static int32_t msm_sensor_fill_actuator_subdevid_by_name(
258 struct msm_sensor_ctrl_t *s_ctrl)
259{
260 int32_t rc = 0;
261 struct device_node *src_node = NULL;
262 uint32_t val = 0, actuator_name_len;
263 int32_t *actuator_subdev_id;
264 struct msm_sensor_info_t *sensor_info;
265 struct device_node *of_node = s_ctrl->of_node;
266
267 if (!s_ctrl->sensordata->actuator_name || !of_node)
268 return -EINVAL;
269
270 actuator_name_len = strlen(s_ctrl->sensordata->actuator_name);
271 if (actuator_name_len >= MAX_SENSOR_NAME)
272 return -EINVAL;
273
274 sensor_info = s_ctrl->sensordata->sensor_info;
275 actuator_subdev_id = &sensor_info->subdev_id[SUB_MODULE_ACTUATOR];
276 /*
277 * string for actuator name is valid, set sudev id to -1
278 * and try to found new id
279 */
280 *actuator_subdev_id = -1;
281
282 if (actuator_name_len == 0)
283 return 0;
284
285 src_node = of_parse_phandle(of_node, "qcom,actuator-src", 0);
286 if (!src_node) {
287 CDBG("%s:%d src_node NULL\n", __func__, __LINE__);
288 } else {
289 rc = of_property_read_u32(src_node, "cell-index", &val);
290 CDBG("%s qcom,actuator cell index %d, rc %d\n", __func__,
291 val, rc);
292 if (rc < 0) {
293 pr_err("%s failed %d\n", __func__, __LINE__);
294 return -EINVAL;
295 }
296 *actuator_subdev_id = val;
297 of_node_put(src_node);
298 src_node = NULL;
299 }
300
301 return rc;
302}
303
304static int32_t msm_sensor_fill_laser_led_subdevid_by_name(
305 struct msm_sensor_ctrl_t *s_ctrl)
306{
307 int32_t rc = 0;
308 struct device_node *src_node = NULL;
309 uint32_t val = 0;
310 int32_t *laser_led_subdev_id;
311 struct msm_sensor_info_t *sensor_info;
312 struct device_node *of_node = s_ctrl->of_node;
313
314 if (!of_node)
315 return -EINVAL;
316
317 sensor_info = s_ctrl->sensordata->sensor_info;
318 laser_led_subdev_id = &sensor_info->subdev_id[SUB_MODULE_LASER_LED];
319 /* set sudev id to -1 and try to found new id */
320 *laser_led_subdev_id = -1;
321
322
323 src_node = of_parse_phandle(of_node, "qcom,laserled-src", 0);
324 if (!src_node) {
325 CDBG("%s:%d src_node NULL\n", __func__, __LINE__);
326 } else {
327 rc = of_property_read_u32(src_node, "cell-index", &val);
328 CDBG("%s qcom,laser led cell index %d, rc %d\n", __func__,
329 val, rc);
330 of_node_put(src_node);
331 src_node = NULL;
332 if (rc < 0) {
333 pr_err("%s cell index not found %d\n",
334 __func__, __LINE__);
335 return -EINVAL;
336 }
337 *laser_led_subdev_id = val;
338 }
339
340 return rc;
341}
342
343static int32_t msm_sensor_fill_flash_subdevid_by_name(
344 struct msm_sensor_ctrl_t *s_ctrl)
345{
346 int32_t rc = 0;
347 struct device_node *src_node = NULL;
348 uint32_t val = 0, flash_name_len;
349 int32_t *flash_subdev_id;
350 struct msm_sensor_info_t *sensor_info;
351 struct device_node *of_node = s_ctrl->of_node;
352
353 if (!of_node || !s_ctrl->sensordata->flash_name)
354 return -EINVAL;
355
356 sensor_info = s_ctrl->sensordata->sensor_info;
357 flash_subdev_id = &sensor_info->subdev_id[SUB_MODULE_LED_FLASH];
358
359 *flash_subdev_id = -1;
360
361 flash_name_len = strlen(s_ctrl->sensordata->flash_name);
362 if (flash_name_len >= MAX_SENSOR_NAME)
363 return -EINVAL;
364
365 if (flash_name_len == 0)
366 return 0;
367
368 src_node = of_parse_phandle(of_node, "qcom,led-flash-src", 0);
369 if (!src_node) {
370 CDBG("%s:%d src_node NULL\n", __func__, __LINE__);
371 } else {
372 rc = of_property_read_u32(src_node, "cell-index", &val);
373 CDBG("%s qcom,flash cell index %d, rc %d\n", __func__,
374 val, rc);
375 if (rc < 0) {
376 pr_err("%s failed %d\n", __func__, __LINE__);
377 return -EINVAL;
378 }
379 *flash_subdev_id = val;
380 of_node_put(src_node);
381 src_node = NULL;
382 }
383 return rc;
384}
385
386static int32_t msm_sensor_fill_ois_subdevid_by_name(
387 struct msm_sensor_ctrl_t *s_ctrl)
388{
389 int32_t rc = 0;
390 struct device_node *src_node = NULL;
391 uint32_t val = 0, ois_name_len;
392 int32_t *ois_subdev_id;
393 struct msm_sensor_info_t *sensor_info;
394 struct device_node *of_node = s_ctrl->of_node;
395
396 if (!s_ctrl->sensordata->ois_name || !of_node)
397 return -EINVAL;
398
399 ois_name_len = strlen(s_ctrl->sensordata->ois_name);
400 if (ois_name_len >= MAX_SENSOR_NAME)
401 return -EINVAL;
402
403 sensor_info = s_ctrl->sensordata->sensor_info;
404 ois_subdev_id = &sensor_info->subdev_id[SUB_MODULE_OIS];
405 /*
406 * string for ois name is valid, set sudev id to -1
407 * and try to found new id
408 */
409 *ois_subdev_id = -1;
410
411 if (ois_name_len == 0)
412 return 0;
413
414 src_node = of_parse_phandle(of_node, "qcom,ois-src", 0);
415 if (!src_node) {
416 CDBG("%s:%d src_node NULL\n", __func__, __LINE__);
417 } else {
418 rc = of_property_read_u32(src_node, "cell-index", &val);
419 CDBG("%s qcom,ois cell index %d, rc %d\n", __func__,
420 val, rc);
421 if (rc < 0) {
422 pr_err("%s failed %d\n", __func__, __LINE__);
423 return -EINVAL;
424 }
425 *ois_subdev_id = val;
426 of_node_put(src_node);
427 src_node = NULL;
428 }
429
430 return rc;
431}
432
433static int32_t msm_sensor_fill_slave_info_init_params(
434 struct msm_camera_sensor_slave_info *slave_info,
435 struct msm_sensor_info_t *sensor_info)
436{
437 struct msm_sensor_init_params *sensor_init_params;
438
439 if (!slave_info || !sensor_info)
440 return -EINVAL;
441
442 sensor_init_params = &slave_info->sensor_init_params;
443 if (sensor_init_params->position != INVALID_CAMERA_B)
444 sensor_info->position =
445 sensor_init_params->position;
446
447 if (sensor_init_params->sensor_mount_angle < SENSOR_MAX_MOUNTANGLE) {
448 sensor_info->sensor_mount_angle =
449 sensor_init_params->sensor_mount_angle;
450 sensor_info->is_mount_angle_valid = 1;
451 }
452
453 if (sensor_init_params->modes_supported != CAMERA_MODE_INVALID)
454 sensor_info->modes_supported =
455 sensor_init_params->modes_supported;
456
457 return 0;
458}
459
460
461static int32_t msm_sensor_validate_slave_info(
462 struct msm_sensor_info_t *sensor_info)
463{
464 if (sensor_info->position == INVALID_CAMERA_B) {
465 sensor_info->position = BACK_CAMERA_B;
466 CDBG("%s:%d Set default sensor position\n",
467 __func__, __LINE__);
468 }
469 if (sensor_info->modes_supported == CAMERA_MODE_INVALID) {
470 sensor_info->modes_supported = CAMERA_MODE_2D_B;
471 CDBG("%s:%d Set default sensor modes_supported\n",
472 __func__, __LINE__);
473 }
474 if (sensor_info->sensor_mount_angle >= SENSOR_MAX_MOUNTANGLE) {
475 sensor_info->sensor_mount_angle = 0;
476 CDBG("%s:%d Set default sensor mount angle\n",
477 __func__, __LINE__);
478 sensor_info->is_mount_angle_valid = 1;
479 }
480 return 0;
481}
482
483#ifdef CONFIG_COMPAT
484static int32_t msm_sensor_get_pw_settings_compat(
485 struct msm_sensor_power_setting *ps,
486 struct msm_sensor_power_setting *us_ps, uint32_t size)
487{
488 int32_t rc = 0, i = 0;
489 struct msm_sensor_power_setting32 *ps32 =
490 kzalloc(sizeof(*ps32) * size, GFP_KERNEL);
491
492 if (!ps32) {
493 pr_err("failed: no memory ps32");
494 return -ENOMEM;
495 }
496 if (copy_from_user(ps32, (void __user *)us_ps, sizeof(*ps32) * size)) {
497 pr_err("failed: copy_from_user");
498 kfree(ps32);
499 return -EFAULT;
500 }
501 for (i = 0; i < size; i++) {
502 ps[i].config_val = ps32[i].config_val;
503 ps[i].delay = ps32[i].delay;
504 ps[i].seq_type = ps32[i].seq_type;
505 ps[i].seq_val = ps32[i].seq_val;
506 }
507 kfree(ps32);
508 return rc;
509}
510#endif
511
512static int32_t msm_sensor_create_pd_settings(void *setting,
513 struct msm_sensor_power_setting *pd, uint32_t size_down,
514 struct msm_sensor_power_setting *pu)
515{
516 int32_t rc = 0;
517 int c, end;
518 struct msm_sensor_power_setting pd_tmp;
519
Zhaohong Chen25cb9eb2018-07-12 15:22:21 +0800520 pr_err("Generating power_down_setting\n");
Pratap Nirujogi6e759912018-01-17 17:51:17 +0530521
522#ifdef CONFIG_COMPAT
523 if (is_compat_task()) {
524 rc = msm_sensor_get_pw_settings_compat(
525 pd, pu, size_down);
526 if (rc < 0) {
527 pr_err("failed");
528 return -EFAULT;
529 }
530 } else
531#endif
532 {
533 if (copy_from_user(
534 pd, (void __user *)pu, sizeof(*pd) * size_down)) {
535 pr_err("failed: copy_from_user");
536 return -EFAULT;
537 }
538 }
539 /* reverse */
540 end = size_down - 1;
541 for (c = 0; c < size_down/2; c++) {
542 pd_tmp = pd[c];
543 pd[c] = pd[end];
544 pd[end] = pd_tmp;
545 end--;
546 }
547 return rc;
548}
549
550static int32_t msm_sensor_get_power_down_settings(void *setting,
551 struct msm_camera_sensor_slave_info *slave_info,
552 struct msm_camera_power_ctrl_t *power_info)
553{
554 int32_t rc = 0;
555 uint16_t size_down = 0;
556 uint16_t i = 0;
557 struct msm_sensor_power_setting *pd = NULL;
558
559 /* DOWN */
560 size_down = slave_info->power_setting_array.size_down;
561 if (!size_down || size_down > MAX_POWER_CONFIG)
562 size_down = slave_info->power_setting_array.size;
563 /* Validate size_down */
564 if (size_down > MAX_POWER_CONFIG) {
565 pr_err("failed: invalid size_down %d", size_down);
566 return -EINVAL;
567 }
568 /* Allocate memory for power down setting */
569 pd = kcalloc(size_down, sizeof(*pd), GFP_KERNEL);
570 if (!pd)
571 return -EFAULT;
572
573 if (slave_info->power_setting_array.power_down_setting) {
574#ifdef CONFIG_COMPAT
575 if (is_compat_task()) {
576 rc = msm_sensor_get_pw_settings_compat(
577 pd, slave_info->power_setting_array.
578 power_down_setting, size_down);
579 if (rc < 0) {
580 pr_err("failed");
581 kfree(pd);
582 return -EFAULT;
583 }
584 } else
585#endif
586 if (copy_from_user(
587 pd, (void __user *)slave_info->power_setting_array.
588 power_down_setting, sizeof(*pd) * size_down)) {
589 pr_err("failed: copy_from_user");
590 kfree(pd);
591 return -EFAULT;
592 }
593 } else {
594
595 rc = msm_sensor_create_pd_settings(setting, pd, size_down,
596 slave_info->power_setting_array.power_setting);
597 if (rc < 0) {
598 pr_err("failed");
599 kfree(pd);
600 return -EFAULT;
601 }
602 }
603
604 /* Fill power down setting and power down setting size */
605 power_info->power_down_setting = pd;
606 power_info->power_down_setting_size = size_down;
607
608 /* Print power setting */
609 for (i = 0; i < size_down; i++) {
Zhaohong Chen25cb9eb2018-07-12 15:22:21 +0800610 CDBG("DOWN seq_type %d seq_val %d config_val %ld delay %d\n",
Pratap Nirujogi6e759912018-01-17 17:51:17 +0530611 pd[i].seq_type, pd[i].seq_val,
612 pd[i].config_val, pd[i].delay);
613 }
614 return rc;
615}
616
617static int32_t msm_sensor_get_power_up_settings(void *setting,
618 struct msm_camera_sensor_slave_info *slave_info,
619 struct msm_camera_power_ctrl_t *power_info)
620{
621 int32_t rc = 0;
622 uint16_t size = 0;
623 uint16_t i = 0;
624 struct msm_sensor_power_setting *pu = NULL;
625
626 size = slave_info->power_setting_array.size;
627
628 /* Validate size */
629 if ((size == 0) || (size > MAX_POWER_CONFIG)) {
630 pr_err("failed: invalid power_setting size_up = %d\n", size);
631 return -EINVAL;
632 }
633
634 /* Allocate memory for power up setting */
635 pu = kcalloc(size, sizeof(*pu), GFP_KERNEL);
636 if (!pu)
637 return -ENOMEM;
638
639#ifdef CONFIG_COMPAT
640 if (is_compat_task()) {
641 rc = msm_sensor_get_pw_settings_compat(pu,
642 slave_info->power_setting_array.
643 power_setting, size);
644 if (rc < 0) {
645 pr_err("failed");
646 kfree(pu);
647 return -EFAULT;
648 }
649 } else
650#endif
651 {
652 if (copy_from_user(pu,
653 (void __user *)
654 slave_info->power_setting_array.power_setting,
655 sizeof(*pu) * size)) {
656 pr_err("failed: copy_from_user");
657 kfree(pu);
658 return -EFAULT;
659 }
660 }
661
662 /* Print power setting */
663 for (i = 0; i < size; i++) {
Zhaohong Chen25cb9eb2018-07-12 15:22:21 +0800664 CDBG("UP seq_type %d seq_val %d config_val %ld delay %d\n",
Pratap Nirujogi6e759912018-01-17 17:51:17 +0530665 pu[i].seq_type, pu[i].seq_val,
666 pu[i].config_val, pu[i].delay);
667 }
668
669
670 /* Fill power up setting and power up setting size */
671 power_info->power_setting = pu;
672 power_info->power_setting_size = size;
673
674 return rc;
675}
676
677static int32_t msm_sensor_get_power_settings(void *setting,
678 struct msm_camera_sensor_slave_info *slave_info,
679 struct msm_camera_power_ctrl_t *power_info)
680{
681 int32_t rc = 0;
682
683 rc = msm_sensor_get_power_up_settings(setting, slave_info, power_info);
684 if (rc < 0) {
685 pr_err("failed");
686 return -EINVAL;
687 }
688
689 rc = msm_sensor_get_power_down_settings(setting, slave_info,
690 power_info);
691 if (rc < 0) {
692 pr_err("failed");
693 return -EINVAL;
694 }
695 return rc;
696}
697
698static void msm_sensor_fill_sensor_info(struct msm_sensor_ctrl_t *s_ctrl,
699 struct msm_sensor_info_t *sensor_info, char *entity_name)
700{
701 uint32_t i;
702
703 if (!s_ctrl || !sensor_info) {
704 pr_err("%s:failed\n", __func__);
705 return;
706 }
707
708 strlcpy(sensor_info->sensor_name, s_ctrl->sensordata->sensor_name,
709 MAX_SENSOR_NAME);
710
711 sensor_info->session_id = s_ctrl->sensordata->sensor_info->session_id;
712
713 s_ctrl->sensordata->sensor_info->subdev_id[SUB_MODULE_SENSOR] =
714 s_ctrl->sensordata->sensor_info->session_id;
715 for (i = 0; i < SUB_MODULE_MAX; i++) {
716 sensor_info->subdev_id[i] =
717 s_ctrl->sensordata->sensor_info->subdev_id[i];
718 sensor_info->subdev_intf[i] =
719 s_ctrl->sensordata->sensor_info->subdev_intf[i];
720 }
721
722 sensor_info->is_mount_angle_valid =
723 s_ctrl->sensordata->sensor_info->is_mount_angle_valid;
724 sensor_info->sensor_mount_angle =
725 s_ctrl->sensordata->sensor_info->sensor_mount_angle;
726 sensor_info->modes_supported =
727 s_ctrl->sensordata->sensor_info->modes_supported;
728 sensor_info->position =
729 s_ctrl->sensordata->sensor_info->position;
730
731 strlcpy(entity_name, s_ctrl->msm_sd.sd.entity.name, MAX_SENSOR_NAME);
732}
733
734/* static function definition */
735static int32_t msm_sensor_driver_is_special_support(
736 struct msm_sensor_ctrl_t *s_ctrl,
737 char *sensor_name)
738{
739 int32_t rc = 0, i = 0;
740 struct msm_camera_sensor_board_info *sensordata = s_ctrl->sensordata;
741
742 for (i = 0; i < sensordata->special_support_size; i++) {
743 if (!strcmp(sensordata->special_support_sensors[i],
744 sensor_name)) {
745 rc = TRUE;
746 break;
747 }
748 }
749 return rc;
750}
751
752/* static function definition */
753int32_t msm_sensor_driver_probe(void *setting,
754 struct msm_sensor_info_t *probed_info, char *entity_name)
755{
756 int32_t rc = 0;
757 struct msm_sensor_ctrl_t *s_ctrl = NULL;
758 struct msm_camera_cci_client *cci_client = NULL;
759 struct msm_camera_sensor_slave_info *slave_info = NULL;
760 struct msm_camera_slave_info *camera_info = NULL;
761
762 unsigned long mount_pos = 0;
763 uint32_t is_yuv;
Vijay kumar Tumati13e62de2018-05-29 10:25:01 +0530764 struct msm_camera_i2c_reg_array *reg_setting = NULL;
765 struct msm_sensor_id_info_t *id_info = NULL;
Pratap Nirujogi6e759912018-01-17 17:51:17 +0530766
767 /* Validate input parameters */
768 if (!setting) {
769 pr_err("failed: slave_info %pK", setting);
770 return -EINVAL;
771 }
772
773 /* Allocate memory for slave info */
774 slave_info = kzalloc(sizeof(*slave_info), GFP_KERNEL);
775 if (!slave_info)
776 return -ENOMEM;
777#ifdef CONFIG_COMPAT
778 if (is_compat_task()) {
779 struct msm_camera_sensor_slave_info32 *slave_info32 =
780 kzalloc(sizeof(*slave_info32), GFP_KERNEL);
781 if (!slave_info32) {
782 pr_err("failed: no memory for slave_info32 %pK\n",
783 slave_info32);
784 rc = -ENOMEM;
785 goto free_slave_info;
786 }
787 if (copy_from_user(slave_info32, (void __user *)setting,
788 sizeof(*slave_info32))) {
789 pr_err("failed: copy_from_user");
790 rc = -EFAULT;
791 kfree(slave_info32);
792 goto free_slave_info;
793 }
794
795 strlcpy(slave_info->actuator_name, slave_info32->actuator_name,
796 sizeof(slave_info->actuator_name));
797
798 strlcpy(slave_info->eeprom_name, slave_info32->eeprom_name,
799 sizeof(slave_info->eeprom_name));
800
801 strlcpy(slave_info->sensor_name, slave_info32->sensor_name,
802 sizeof(slave_info->sensor_name));
803
804 strlcpy(slave_info->ois_name, slave_info32->ois_name,
805 sizeof(slave_info->ois_name));
806
807 strlcpy(slave_info->flash_name, slave_info32->flash_name,
808 sizeof(slave_info->flash_name));
809
810 slave_info->addr_type = slave_info32->addr_type;
811 slave_info->camera_id = slave_info32->camera_id;
812
813 slave_info->i2c_freq_mode = slave_info32->i2c_freq_mode;
Vijay kumar Tumati13e62de2018-05-29 10:25:01 +0530814 slave_info->sensor_id_info.sensor_id_reg_addr =
815 slave_info32->sensor_id_info.sensor_id_reg_addr;
816 slave_info->sensor_id_info.sensor_id_mask =
817 slave_info32->sensor_id_info.sensor_id_mask;
818 slave_info->sensor_id_info.sensor_id =
819 slave_info32->sensor_id_info.sensor_id;
820
821 slave_info->sensor_id_info.setting.addr_type =
822 slave_info32->sensor_id_info.setting.addr_type;
823 slave_info->sensor_id_info.setting.data_type =
824 slave_info32->sensor_id_info.setting.data_type;
825 slave_info->sensor_id_info.setting.delay =
826 slave_info32->sensor_id_info.setting.delay;
827 slave_info->sensor_id_info.setting.size =
828 slave_info32->sensor_id_info.setting.size;
829
830 if (!slave_info->sensor_id_info.setting.size ||
831 (slave_info->sensor_id_info.setting.size >
832 I2C_REG_DATA_MAX)) {
833 CDBG("%s:No writes needed to probe\n", __func__);
834 slave_info->sensor_id_info.setting.reg_setting = NULL;
835 } else {
836 id_info = &(slave_info->sensor_id_info);
837 reg_setting =
838 kzalloc(id_info->setting.size *
839 (sizeof
840 (struct msm_camera_i2c_reg_array)),
841 GFP_KERNEL);
842 if (!reg_setting) {
843 rc = -ENOMEM;
844 goto free_slave_info;
845 }
846 if (copy_from_user(reg_setting,
847 (void __user *)
848 compat_ptr(slave_info32->sensor_id_info.
849 setting.reg_setting),
850 slave_info->sensor_id_info.setting.size *
851 sizeof(struct msm_camera_i2c_reg_array))) {
852 pr_err("%s:%d: sensor id info copy failed\n",
853 __func__, __LINE__);
854 kfree(reg_setting);
855 rc = -EFAULT;
856 goto free_slave_info;
857 }
858
859 slave_info->sensor_id_info.setting.reg_setting =
860 reg_setting;
861 }
Pratap Nirujogi6e759912018-01-17 17:51:17 +0530862
863 slave_info->slave_addr = slave_info32->slave_addr;
864 slave_info->power_setting_array.size =
865 slave_info32->power_setting_array.size;
866 slave_info->power_setting_array.size_down =
867 slave_info32->power_setting_array.size_down;
868 slave_info->power_setting_array.size_down =
869 slave_info32->power_setting_array.size_down;
870
871 slave_info->power_setting_array.power_down_setting =
872 (__force struct msm_sensor_power_setting *)
873 (compat_ptr(slave_info32->
874 power_setting_array.power_down_setting));
875
876 slave_info->power_setting_array.power_setting =
877 (__force struct msm_sensor_power_setting *)
878 (compat_ptr(slave_info32->
879 power_setting_array.power_setting));
880
881 slave_info->sensor_init_params =
882 slave_info32->sensor_init_params;
883 slave_info->output_format =
884 slave_info32->output_format;
885 slave_info->bypass_video_node_creation =
886 !!slave_info32->bypass_video_node_creation;
887 kfree(slave_info32);
888 } else
889#endif
890 {
891 if (copy_from_user(slave_info,
892 (void __user *)setting, sizeof(*slave_info))) {
893 pr_err("failed: copy_from_user");
894 rc = -EFAULT;
895 goto free_slave_info;
896 }
Vijay kumar Tumati13e62de2018-05-29 10:25:01 +0530897 if (!slave_info->sensor_id_info.setting.size ||
898 slave_info->sensor_id_info.setting.size >
899 I2C_REG_DATA_MAX) {
900 CDBG("%s:No writes needed to probe\n", __func__);
901 slave_info->sensor_id_info.setting.reg_setting = NULL;
902 } else {
903 id_info = &(slave_info->sensor_id_info);
904 reg_setting =
905 kzalloc(id_info->setting.size *
906 (sizeof
907 (struct msm_camera_i2c_reg_array)),
908 GFP_KERNEL);
909 if (!reg_setting) {
910 rc = -ENOMEM;
911 goto free_slave_info;
912 }
913 if (copy_from_user(reg_setting,
914 (void __user *)
915 slave_info->sensor_id_info.setting.reg_setting,
916 slave_info->sensor_id_info.setting.size *
917 sizeof(struct msm_camera_i2c_reg_array))) {
918 pr_err("%s:%d: sensor id info copy failed\n",
919 __func__, __LINE__);
920 kfree(reg_setting);
921 rc = -EFAULT;
922 goto free_slave_info;
923 }
924
925 slave_info->sensor_id_info.setting.reg_setting =
926 reg_setting;
927 }
Pratap Nirujogi6e759912018-01-17 17:51:17 +0530928 }
929
930 if (strlen(slave_info->sensor_name) >= MAX_SENSOR_NAME ||
931 strlen(slave_info->eeprom_name) >= MAX_SENSOR_NAME ||
932 strlen(slave_info->actuator_name) >= MAX_SENSOR_NAME ||
933 strlen(slave_info->ois_name) >= MAX_SENSOR_NAME) {
934 pr_err("failed: name len greater than 32.\n");
935 pr_err("sensor name len:%zu, eeprom name len: %zu.\n",
936 strlen(slave_info->sensor_name),
937 strlen(slave_info->eeprom_name));
938 pr_err("actuator name len: %zu, ois name len:%zu.\n",
939 strlen(slave_info->actuator_name),
940 strlen(slave_info->ois_name));
941 rc = -EINVAL;
942 goto free_slave_info;
943 }
944
945 /* Print slave info */
946 CDBG("camera id %d Slave addr 0x%X addr_type %d\n",
947 slave_info->camera_id, slave_info->slave_addr,
948 slave_info->addr_type);
949 CDBG("sensor_id_reg_addr 0x%X sensor_id 0x%X sensor id mask %d",
950 slave_info->sensor_id_info.sensor_id_reg_addr,
951 slave_info->sensor_id_info.sensor_id,
952 slave_info->sensor_id_info.sensor_id_mask);
953 CDBG("power up size %d power down size %d\n",
954 slave_info->power_setting_array.size,
955 slave_info->power_setting_array.size_down);
956 CDBG("position %d",
957 slave_info->sensor_init_params.position);
958 CDBG("mount %d",
959 slave_info->sensor_init_params.sensor_mount_angle);
960 CDBG("bypass video node creation %d",
961 slave_info->bypass_video_node_creation);
962 /* Validate camera id */
963 if (slave_info->camera_id >= MAX_CAMERAS) {
964 pr_err("failed: invalid camera id %d max %d",
965 slave_info->camera_id, MAX_CAMERAS);
966 rc = -EINVAL;
967 goto free_slave_info;
968 }
969
970 /* Extract s_ctrl from camera id */
971 s_ctrl = g_sctrl[slave_info->camera_id];
972 if (!s_ctrl) {
973 pr_err("failed: s_ctrl %pK for camera_id %d", s_ctrl,
974 slave_info->camera_id);
975 rc = -EINVAL;
976 goto free_slave_info;
977 }
978
979 CDBG("s_ctrl[%d] %pK", slave_info->camera_id, s_ctrl);
980
981 if (s_ctrl->sensordata->special_support_size > 0) {
982 if (!msm_sensor_driver_is_special_support(s_ctrl,
983 slave_info->sensor_name)) {
984 pr_err("%s:%s is not support on this board\n",
985 __func__, slave_info->sensor_name);
986 rc = 0;
987 goto free_slave_info;
988 }
989 }
990
991 if (s_ctrl->is_probe_succeed == 1) {
992 /*
993 * Different sensor on this camera slot has been connected
994 * and probe already succeeded for that sensor. Ignore this
995 * probe
996 */
997 if (slave_info->sensor_id_info.sensor_id ==
998 s_ctrl->sensordata->cam_slave_info->
999 sensor_id_info.sensor_id &&
1000 !(strcmp(slave_info->sensor_name,
1001 s_ctrl->sensordata->cam_slave_info->sensor_name))) {
1002 pr_err("slot%d: sensor name: %s sensor id%d already probed\n",
1003 slave_info->camera_id,
1004 slave_info->sensor_name,
1005 s_ctrl->sensordata->cam_slave_info->
1006 sensor_id_info.sensor_id);
1007 msm_sensor_fill_sensor_info(s_ctrl,
1008 probed_info, entity_name);
1009 } else
1010 pr_err("slot %d has some other sensor\n",
1011 slave_info->camera_id);
1012
1013 rc = 0;
1014 goto free_slave_info;
1015 }
1016
1017 if (slave_info->power_setting_array.size == 0 &&
1018 slave_info->slave_addr == 0) {
1019 s_ctrl->is_csid_tg_mode = 1;
1020 goto CSID_TG;
1021 }
1022
1023 rc = msm_sensor_get_power_settings(setting, slave_info,
1024 &s_ctrl->sensordata->power_info);
1025 if (rc < 0) {
1026 pr_err("failed");
1027 goto free_slave_info;
1028 }
1029
1030
1031 camera_info = kzalloc(sizeof(struct msm_camera_slave_info), GFP_KERNEL);
1032 if (!camera_info)
1033 goto free_slave_info;
1034
1035 s_ctrl->sensordata->slave_info = camera_info;
1036
1037 /* Fill sensor slave info */
1038 camera_info->sensor_slave_addr = slave_info->slave_addr;
1039 camera_info->sensor_id_reg_addr =
1040 slave_info->sensor_id_info.sensor_id_reg_addr;
1041 camera_info->sensor_id = slave_info->sensor_id_info.sensor_id;
1042 camera_info->sensor_id_mask = slave_info->sensor_id_info.sensor_id_mask;
Vijay kumar Tumati13e62de2018-05-29 10:25:01 +05301043 camera_info->setting = &(slave_info->sensor_id_info.setting);
Pratap Nirujogi6e759912018-01-17 17:51:17 +05301044
1045 /* Fill CCI master, slave address and CCI default params */
1046 if (!s_ctrl->sensor_i2c_client) {
1047 pr_err("failed: sensor_i2c_client %pK",
1048 s_ctrl->sensor_i2c_client);
1049 rc = -EINVAL;
1050 goto free_camera_info;
1051 }
1052 /* Fill sensor address type */
1053 s_ctrl->sensor_i2c_client->addr_type = slave_info->addr_type;
1054 if (s_ctrl->sensor_i2c_client->client)
1055 s_ctrl->sensor_i2c_client->client->addr =
1056 camera_info->sensor_slave_addr;
1057
1058 cci_client = s_ctrl->sensor_i2c_client->cci_client;
1059 if (!cci_client) {
1060 pr_err("failed: cci_client %pK", cci_client);
1061 goto free_camera_info;
1062 }
1063 cci_client->cci_i2c_master = s_ctrl->cci_i2c_master;
1064 cci_client->sid = slave_info->slave_addr >> 1;
1065 cci_client->retries = 3;
1066 cci_client->id_map = 0;
1067 cci_client->i2c_freq_mode = slave_info->i2c_freq_mode;
1068
1069 /* Parse and fill vreg params for powerup settings */
1070 rc = msm_camera_fill_vreg_params(
1071 s_ctrl->sensordata->power_info.cam_vreg,
1072 s_ctrl->sensordata->power_info.num_vreg,
1073 s_ctrl->sensordata->power_info.power_setting,
1074 s_ctrl->sensordata->power_info.power_setting_size);
1075 if (rc < 0) {
1076 pr_err("failed: msm_camera_get_dt_power_setting_data rc %d",
1077 rc);
1078 goto free_camera_info;
1079 }
1080
1081 /* Parse and fill vreg params for powerdown settings*/
1082 rc = msm_camera_fill_vreg_params(
1083 s_ctrl->sensordata->power_info.cam_vreg,
1084 s_ctrl->sensordata->power_info.num_vreg,
1085 s_ctrl->sensordata->power_info.power_down_setting,
1086 s_ctrl->sensordata->power_info.power_down_setting_size);
1087 if (rc < 0) {
1088 pr_err("failed: msm_camera_fill_vreg_params for PDOWN rc %d",
1089 rc);
1090 goto free_camera_info;
1091 }
1092
1093CSID_TG:
1094 /* Update sensor, actuator and eeprom name in
1095 * sensor control structure
1096 */
1097 s_ctrl->sensordata->sensor_name = slave_info->sensor_name;
1098 s_ctrl->sensordata->eeprom_name = slave_info->eeprom_name;
1099 s_ctrl->sensordata->actuator_name = slave_info->actuator_name;
1100 s_ctrl->sensordata->ois_name = slave_info->ois_name;
1101 s_ctrl->sensordata->flash_name = slave_info->flash_name;
1102 /*
1103 * Update eeporm subdevice Id by input eeprom name
1104 */
1105 rc = msm_sensor_fill_eeprom_subdevid_by_name(s_ctrl);
1106 if (rc < 0) {
1107 pr_err("%s failed %d\n", __func__, __LINE__);
1108 goto free_camera_info;
1109 }
1110 /*
1111 * Update actuator subdevice Id by input actuator name
1112 */
1113 rc = msm_sensor_fill_actuator_subdevid_by_name(s_ctrl);
1114 if (rc < 0) {
1115 pr_err("%s failed %d\n", __func__, __LINE__);
1116 goto free_camera_info;
1117 }
1118 rc = msm_sensor_fill_laser_led_subdevid_by_name(s_ctrl);
1119 if (rc < 0) {
1120 pr_err("%s failed %d\n", __func__, __LINE__);
1121 goto free_camera_info;
1122 }
1123
1124 rc = msm_sensor_fill_ois_subdevid_by_name(s_ctrl);
1125 if (rc < 0) {
1126 pr_err("%s failed %d\n", __func__, __LINE__);
1127 goto free_camera_info;
1128 }
1129
1130 rc = msm_sensor_fill_flash_subdevid_by_name(s_ctrl);
1131 if (rc < 0) {
1132 pr_err("%s failed %d\n", __func__, __LINE__);
1133 goto free_camera_info;
1134 }
1135
1136 /* Power up and probe sensor */
1137 rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);
1138 if (rc < 0) {
1139 pr_err("%s power up failed", slave_info->sensor_name);
1140 goto free_camera_info;
1141 }
1142
frankcheng049cc9e2020-05-09 20:59:58 +08001143 pr_err("%s:%d s_ctrl->sensordata->actuator_name: %s\n",
1144 __func__, __LINE__,
1145 s_ctrl->sensordata->actuator_name);
1146 if(strcmp(s_ctrl->sensordata->actuator_name, "ak7374") == 0){
1147 nActuatorAK7374 = 1;
1148 pr_err("%s:%d nActuatorAK7374: %d\n",
1149 __func__, __LINE__,
1150 nActuatorAK7374);
1151 }else if(strcmp(s_ctrl->sensordata->actuator_name, "dw9800") == 0){
1152 nActuatorDW9800 = 1;
1153 pr_err("%s:%d nActuatorDW9800: %d\n",
1154 __func__, __LINE__,
1155 nActuatorDW9800);
1156 }
1157
Pratap Nirujogi6e759912018-01-17 17:51:17 +05301158 pr_err("%s probe succeeded", slave_info->sensor_name);
frankcheng049cc9e2020-05-09 20:59:58 +08001159 if(strcmp(slave_info->sensor_name, "imx363") == 0)pr_err("imx363 compare success");
Pratap Nirujogi6e759912018-01-17 17:51:17 +05301160
1161 s_ctrl->bypass_video_node_creation =
1162 slave_info->bypass_video_node_creation;
1163
1164 /*
1165 * Create /dev/videoX node, comment for now until dummy /dev/videoX
1166 * node is created and used by HAL
1167 */
1168
1169 if (s_ctrl->sensor_device_type == MSM_CAMERA_PLATFORM_DEVICE)
1170 rc = msm_sensor_driver_create_v4l_subdev(s_ctrl);
1171 else
1172 rc = msm_sensor_driver_create_i2c_v4l_subdev(s_ctrl);
1173 if (rc < 0) {
1174 pr_err("failed: camera creat v4l2 rc %d", rc);
1175 goto camera_power_down;
1176 }
1177
1178 /* Power down */
1179 s_ctrl->func_tbl->sensor_power_down(s_ctrl);
1180
1181 rc = msm_sensor_fill_slave_info_init_params(
1182 slave_info,
1183 s_ctrl->sensordata->sensor_info);
1184 if (rc < 0) {
1185 pr_err("%s Fill slave info failed", slave_info->sensor_name);
1186 goto free_camera_info;
1187 }
1188 rc = msm_sensor_validate_slave_info(s_ctrl->sensordata->sensor_info);
1189 if (rc < 0) {
1190 pr_err("%s Validate slave info failed",
1191 slave_info->sensor_name);
1192 goto free_camera_info;
1193 }
1194 /* Update sensor mount angle and position in media entity flag */
1195 is_yuv = (slave_info->output_format == MSM_SENSOR_YCBCR) ? 1 : 0;
1196 mount_pos = ((s_ctrl->is_secure & 0x1) << 26) | is_yuv << 25 |
1197 (s_ctrl->sensordata->sensor_info->position << 16) |
1198 ((s_ctrl->sensordata->
1199 sensor_info->sensor_mount_angle / 90) << 8);
1200
1201 s_ctrl->msm_sd.sd.entity.flags = mount_pos | MEDIA_ENT_FL_DEFAULT;
1202
1203 /*Save sensor info*/
1204 s_ctrl->sensordata->cam_slave_info = slave_info;
1205
1206 msm_sensor_fill_sensor_info(s_ctrl, probed_info, entity_name);
1207
1208 /*
1209 * Set probe succeeded flag to 1 so that no other camera shall
1210 * probed on this slot
1211 */
1212 s_ctrl->is_probe_succeed = 1;
1213 return rc;
1214
1215camera_power_down:
1216 s_ctrl->func_tbl->sensor_power_down(s_ctrl);
1217free_camera_info:
1218 kfree(camera_info);
1219free_slave_info:
Vijay kumar Tumati13e62de2018-05-29 10:25:01 +05301220 kfree(slave_info->sensor_id_info.setting.reg_setting);
Pratap Nirujogi6e759912018-01-17 17:51:17 +05301221 kfree(slave_info);
1222 return rc;
1223}
1224
1225static int32_t msm_sensor_driver_get_dt_data(struct msm_sensor_ctrl_t *s_ctrl)
1226{
1227 int32_t rc = 0, i = 0;
1228 struct msm_camera_sensor_board_info *sensordata = NULL;
1229 struct device_node *of_node = s_ctrl->of_node;
1230 uint32_t cell_id;
1231
1232 s_ctrl->sensordata = kzalloc(sizeof(*sensordata), GFP_KERNEL);
1233 if (!s_ctrl->sensordata)
1234 return -ENOMEM;
1235
1236 sensordata = s_ctrl->sensordata;
1237
1238 /*
1239 * Read cell index - this cell index will be the camera slot where
1240 * this camera will be mounted
1241 */
1242 rc = of_property_read_u32(of_node, "cell-index", &cell_id);
1243 if (rc < 0) {
1244 pr_err("failed: cell-index rc %d", rc);
1245 goto FREE_SENSOR_DATA;
1246 }
1247 s_ctrl->id = cell_id;
1248
1249 /* Validate cell_id */
1250 if (cell_id >= MAX_CAMERAS) {
1251 pr_err("failed: invalid cell_id %d", cell_id);
1252 rc = -EINVAL;
1253 goto FREE_SENSOR_DATA;
1254 }
1255
1256 /* Check whether g_sctrl is already filled for this cell_id */
1257 if (g_sctrl[cell_id]) {
1258 pr_err("failed: sctrl already filled for cell_id %d", cell_id);
1259 rc = -EINVAL;
1260 goto FREE_SENSOR_DATA;
1261 }
1262
1263 sensordata->special_support_size =
1264 of_property_count_strings(of_node,
1265 "qcom,special-support-sensors");
1266
1267 if (sensordata->special_support_size < 0)
1268 sensordata->special_support_size = 0;
1269
1270 if (sensordata->special_support_size > MAX_SPECIAL_SUPPORT_SIZE) {
1271 pr_debug("%s:support_size exceed max support size\n", __func__);
1272 sensordata->special_support_size = MAX_SPECIAL_SUPPORT_SIZE;
1273 }
1274
1275 if (sensordata->special_support_size) {
1276 for (i = 0; i < sensordata->special_support_size; i++) {
1277 rc = of_property_read_string_index(of_node,
1278 "qcom,special-support-sensors", i,
1279 &(sensordata->special_support_sensors[i]));
1280 if (rc < 0) {
1281 /* if read sensor support names failed,
1282 * set support all sensors, break;
1283 */
1284 sensordata->special_support_size = 0;
1285 break;
1286 }
1287 CDBG("%s special_support_sensors[%d] = %s\n", __func__,
1288 i, sensordata->special_support_sensors[i]);
1289 }
1290 }
1291
1292 /* Read subdev info */
1293 rc = msm_sensor_get_sub_module_index(of_node, &sensordata->sensor_info);
1294 if (rc < 0) {
1295 pr_err("failed");
1296 goto FREE_SENSOR_DATA;
1297 }
1298
1299 /* Read vreg information */
1300 rc = msm_camera_get_dt_vreg_data(of_node,
1301 &sensordata->power_info.cam_vreg,
1302 &sensordata->power_info.num_vreg);
1303 if (rc < 0) {
1304 pr_err("failed: msm_camera_get_dt_vreg_data rc %d", rc);
1305 goto FREE_SUB_MODULE_DATA;
1306 }
1307
1308 /* Read gpio information */
1309 rc = msm_sensor_driver_get_gpio_data
1310 (&(sensordata->power_info.gpio_conf), of_node);
1311 if (rc < 0) {
1312 pr_err("failed: msm_sensor_driver_get_gpio_data rc %d", rc);
1313 goto FREE_VREG_DATA;
1314 }
1315
1316 /* Get custom mode */
1317 rc = of_property_read_u32(of_node, "qcom,secure",
1318 &s_ctrl->is_secure);
1319 CDBG("qcom,secure = %d, rc %d", s_ctrl->is_secure, rc);
1320 if (rc < 0) {
1321 /* Set default to non-secure mode */
1322 s_ctrl->is_secure = 0;
1323 rc = 0;
1324 }
1325
1326 /* Get CCI master */
1327 rc = of_property_read_u32(of_node, "qcom,cci-master",
1328 &s_ctrl->cci_i2c_master);
1329 CDBG("qcom,cci-master %d, rc %d", s_ctrl->cci_i2c_master, rc);
1330 if (rc < 0) {
1331 /* Set default master 0 */
1332 s_ctrl->cci_i2c_master = MASTER_0;
1333 rc = 0;
1334 }
1335
1336 /* Get mount angle */
1337 if (of_property_read_u32(of_node, "qcom,mount-angle",
1338 &sensordata->sensor_info->sensor_mount_angle) < 0) {
1339 /* Invalidate mount angle flag */
1340 sensordata->sensor_info->is_mount_angle_valid = 0;
1341 sensordata->sensor_info->sensor_mount_angle = 0;
1342 } else {
1343 sensordata->sensor_info->is_mount_angle_valid = 1;
1344 }
1345 CDBG("%s qcom,mount-angle %d\n", __func__,
1346 sensordata->sensor_info->sensor_mount_angle);
1347 if (of_property_read_u32(of_node, "qcom,sensor-position",
1348 &sensordata->sensor_info->position) < 0) {
1349 CDBG("%s:%d Invalid sensor position\n", __func__, __LINE__);
1350 sensordata->sensor_info->position = INVALID_CAMERA_B;
1351 }
1352 if (of_property_read_u32(of_node, "qcom,sensor-mode",
1353 &sensordata->sensor_info->modes_supported) < 0) {
1354 CDBG("%s:%d Invalid sensor mode supported\n",
1355 __func__, __LINE__);
1356 sensordata->sensor_info->modes_supported = CAMERA_MODE_INVALID;
1357 }
1358 /* Get vdd-cx regulator */
1359 /*Optional property, don't return error if absent */
1360 of_property_read_string(of_node, "qcom,vdd-cx-name",
1361 &sensordata->misc_regulator);
1362 CDBG("qcom,misc_regulator %s", sensordata->misc_regulator);
1363
1364 s_ctrl->set_mclk_23880000 = of_property_read_bool(of_node,
1365 "qcom,mclk-23880000");
1366
1367 CDBG("%s qcom,mclk-23880000 = %d\n", __func__,
1368 s_ctrl->set_mclk_23880000);
1369
1370 return rc;
1371
1372FREE_VREG_DATA:
1373 kfree(sensordata->power_info.cam_vreg);
1374FREE_SUB_MODULE_DATA:
1375 kfree(sensordata->sensor_info);
1376FREE_SENSOR_DATA:
1377 kfree(sensordata);
1378 return rc;
1379}
1380
1381static int32_t msm_sensor_driver_parse(struct msm_sensor_ctrl_t *s_ctrl)
1382{
1383 int32_t rc = 0;
1384
1385 CDBG("Enter");
1386 /* Validate input parameters */
1387
1388
1389 /* Allocate memory for sensor_i2c_client */
1390 s_ctrl->sensor_i2c_client = kzalloc(sizeof(*s_ctrl->sensor_i2c_client),
1391 GFP_KERNEL);
1392 if (!s_ctrl->sensor_i2c_client)
1393 return -ENOMEM;
1394
1395 /* Allocate memory for mutex */
1396 s_ctrl->msm_sensor_mutex = kzalloc(sizeof(*s_ctrl->msm_sensor_mutex),
1397 GFP_KERNEL);
1398 if (!s_ctrl->msm_sensor_mutex) {
1399 rc = -ENOMEM;
1400 goto FREE_SENSOR_I2C_CLIENT;
1401 }
1402
1403 /* Parse dt information and store in sensor control structure */
1404 rc = msm_sensor_driver_get_dt_data(s_ctrl);
1405 if (rc < 0) {
1406 pr_err("failed: rc %d", rc);
1407 goto FREE_MUTEX;
1408 }
1409
1410 /* Initialize mutex */
1411 mutex_init(s_ctrl->msm_sensor_mutex);
1412
1413 /* Initialize v4l2 subdev info */
1414 s_ctrl->sensor_v4l2_subdev_info = msm_sensor_driver_subdev_info;
1415 s_ctrl->sensor_v4l2_subdev_info_size =
1416 ARRAY_SIZE(msm_sensor_driver_subdev_info);
1417
1418 /* Initialize default parameters */
1419 rc = msm_sensor_init_default_params(s_ctrl);
1420 if (rc < 0) {
1421 pr_err("failed: msm_sensor_init_default_params rc %d", rc);
1422 goto FREE_DT_DATA;
1423 }
1424
1425 /* Store sensor control structure in static database */
1426 g_sctrl[s_ctrl->id] = s_ctrl;
1427 CDBG("g_sctrl[%d] %pK", s_ctrl->id, g_sctrl[s_ctrl->id]);
1428
1429 return rc;
1430
1431FREE_DT_DATA:
1432 kfree(s_ctrl->sensordata->power_info.gpio_conf->gpio_num_info);
1433 kfree(s_ctrl->sensordata->power_info.gpio_conf->cam_gpio_req_tbl);
1434 kfree(s_ctrl->sensordata->power_info.gpio_conf);
1435 kfree(s_ctrl->sensordata->power_info.cam_vreg);
1436 kfree(s_ctrl->sensordata);
1437FREE_MUTEX:
1438 kfree(s_ctrl->msm_sensor_mutex);
1439FREE_SENSOR_I2C_CLIENT:
1440 kfree(s_ctrl->sensor_i2c_client);
1441 return rc;
1442}
1443
1444static int32_t msm_sensor_driver_platform_probe(struct platform_device *pdev)
1445{
1446 int32_t rc = 0;
1447 struct msm_sensor_ctrl_t *s_ctrl = NULL;
1448
1449 /* Create sensor control structure */
1450 s_ctrl = kzalloc(sizeof(*s_ctrl), GFP_KERNEL);
1451 if (!s_ctrl)
1452 return -ENOMEM;
1453
1454 platform_set_drvdata(pdev, s_ctrl);
1455
1456 /* Initialize sensor device type */
1457 s_ctrl->sensor_device_type = MSM_CAMERA_PLATFORM_DEVICE;
1458 s_ctrl->of_node = pdev->dev.of_node;
1459
1460 /*fill in platform device*/
1461 s_ctrl->pdev = pdev;
1462
1463 rc = msm_sensor_driver_parse(s_ctrl);
1464 if (rc < 0) {
1465 pr_err("failed: msm_sensor_driver_parse rc %d", rc);
1466 goto FREE_S_CTRL;
1467 }
1468
1469 /* Get clocks information */
1470 rc = msm_camera_get_clk_info(s_ctrl->pdev,
1471 &s_ctrl->sensordata->power_info.clk_info,
1472 &s_ctrl->sensordata->power_info.clk_ptr,
1473 &s_ctrl->sensordata->power_info.clk_info_size);
1474 if (rc < 0) {
1475 pr_err("failed: msm_camera_get_clk_info rc %d", rc);
1476 goto FREE_S_CTRL;
1477 }
1478
1479 /* Fill platform device id*/
1480 pdev->id = s_ctrl->id;
1481
1482 /* Fill device in power info */
1483 s_ctrl->sensordata->power_info.dev = &pdev->dev;
1484 return rc;
1485FREE_S_CTRL:
1486 kfree(s_ctrl);
1487 return rc;
1488}
1489
1490static int32_t msm_sensor_driver_i2c_probe(struct i2c_client *client,
1491 const struct i2c_device_id *id)
1492{
1493 int32_t rc = 0;
1494 struct msm_sensor_ctrl_t *s_ctrl;
1495
1496 CDBG("\n\nEnter: msm_sensor_driver_i2c_probe");
1497 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
1498 pr_err("%s %s i2c_check_functionality failed\n",
1499 __func__, client->name);
1500 rc = -EFAULT;
1501 return rc;
1502 }
1503
1504 /* Create sensor control structure */
1505 s_ctrl = kzalloc(sizeof(*s_ctrl), GFP_KERNEL);
1506 if (!s_ctrl)
1507 return -ENOMEM;
1508
1509 i2c_set_clientdata(client, s_ctrl);
1510
1511 /* Initialize sensor device type */
1512 s_ctrl->sensor_device_type = MSM_CAMERA_I2C_DEVICE;
1513 s_ctrl->of_node = client->dev.of_node;
1514
1515 rc = msm_sensor_driver_parse(s_ctrl);
1516 if (rc < 0) {
1517 pr_err("failed: msm_sensor_driver_parse rc %d", rc);
1518 goto FREE_S_CTRL;
1519 }
1520
1521 if (s_ctrl->sensor_i2c_client != NULL) {
1522 s_ctrl->sensor_i2c_client->client = client;
1523 s_ctrl->sensordata->power_info.dev = &client->dev;
1524
1525 /* Get clocks information */
1526 rc = msm_camera_i2c_dev_get_clk_info(
1527 &s_ctrl->sensor_i2c_client->client->dev,
1528 &s_ctrl->sensordata->power_info.clk_info,
1529 &s_ctrl->sensordata->power_info.clk_ptr,
1530 &s_ctrl->sensordata->power_info.clk_info_size);
1531 if (rc < 0) {
1532 pr_err("failed: msm_camera_i2c_dev_get_clk_info rc %d",
1533 rc);
1534 goto FREE_S_CTRL;
1535 }
1536 return rc;
1537 }
1538FREE_S_CTRL:
1539 kfree(s_ctrl);
1540 return rc;
1541}
1542
1543static int msm_sensor_driver_i2c_remove(struct i2c_client *client)
1544{
1545 struct msm_sensor_ctrl_t *s_ctrl = i2c_get_clientdata(client);
1546
1547 pr_err("%s: sensor FREE\n", __func__);
1548
1549 if (!s_ctrl) {
1550 pr_err("%s: sensor device is NULL\n", __func__);
1551 return 0;
1552 }
1553
1554 g_sctrl[s_ctrl->id] = NULL;
1555 msm_sensor_free_sensor_data(s_ctrl);
1556 kfree(s_ctrl->msm_sensor_mutex);
1557 kfree(s_ctrl->sensor_i2c_client);
1558 kfree(s_ctrl);
1559
1560 return 0;
1561}
1562
1563static const struct i2c_device_id i2c_id[] = {
1564 {SENSOR_DRIVER_I2C, (kernel_ulong_t)NULL},
1565 { }
1566};
1567
1568static struct i2c_driver msm_sensor_driver_i2c = {
1569 .id_table = i2c_id,
1570 .probe = msm_sensor_driver_i2c_probe,
1571 .remove = msm_sensor_driver_i2c_remove,
1572 .driver = {
1573 .name = SENSOR_DRIVER_I2C,
1574 },
1575};
1576
1577static int __init msm_sensor_driver_init(void)
1578{
1579 int32_t rc = 0;
1580
1581 CDBG("%s Enter\n", __func__);
1582 rc = platform_driver_register(&msm_sensor_platform_driver);
1583 if (rc)
1584 pr_err("%s platform_driver_register failed rc = %d",
1585 __func__, rc);
1586 rc = i2c_add_driver(&msm_sensor_driver_i2c);
1587 if (rc)
1588 pr_err("%s i2c_add_driver failed rc = %d", __func__, rc);
1589
1590 return rc;
1591}
1592
1593static void __exit msm_sensor_driver_exit(void)
1594{
1595 CDBG("Enter");
1596 platform_driver_unregister(&msm_sensor_platform_driver);
1597 i2c_del_driver(&msm_sensor_driver_i2c);
1598}
1599
1600module_init(msm_sensor_driver_init);
1601module_exit(msm_sensor_driver_exit);
1602MODULE_DESCRIPTION("msm_sensor_driver");
1603MODULE_LICENSE("GPL v2");