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