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