blob: 5c6445174c57ded510548cb5b60b7d3ce357fb86 [file] [log] [blame]
Jigarkumar Zala35226272017-04-19 16:05:24 -07001/* Copyright (c) 2017, 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
13#include <linux/module.h>
14
15#include "cam_sensor_cmn_header.h"
16#include "cam_flash_core.h"
17
18int cam_flash_prepare(struct cam_flash_ctrl *flash_ctrl,
19 enum cam_flash_state state)
20{
21 int rc = 0;
22
23 if (!(flash_ctrl->switch_trigger)) {
24 CAM_ERR(CAM_FLASH, "Invalid argument");
25 return -EINVAL;
26 }
27
28 if ((state == CAM_FLASH_STATE_INIT) &&
29 (flash_ctrl->is_regulator_enabled == false)) {
30 rc = qpnp_flash_led_prepare(flash_ctrl->switch_trigger,
31 ENABLE_REGULATOR, NULL);
32 if (rc) {
33 CAM_ERR(CAM_FLASH, "regulator enable failed rc = %d",
34 rc);
35 return rc;
36 }
37 flash_ctrl->is_regulator_enabled = true;
38 } else if ((state == CAM_FLASH_STATE_RELEASE) &&
39 (flash_ctrl->is_regulator_enabled == true)) {
40 rc = qpnp_flash_led_prepare(flash_ctrl->switch_trigger,
41 DISABLE_REGULATOR, NULL);
42 if (rc) {
43 CAM_ERR(CAM_FLASH, "regulator disable failed rc = %d",
44 rc);
45 return rc;
46 }
47 flash_ctrl->is_regulator_enabled = false;
48 } else {
49 CAM_ERR(CAM_FLASH, "Wrong Flash State : %d",
50 flash_ctrl->flash_state);
51 rc = -EINVAL;
52 }
53
54 return rc;
55}
56
57static int cam_flash_ops(struct cam_flash_ctrl *flash_ctrl,
58 struct cam_flash_frame_setting *flash_data, enum camera_flash_opcode op)
59{
60 uint32_t curr = 0, max_current = 0;
61 struct cam_flash_private_soc *soc_private = NULL;
62 int i = 0;
63
64 if (!flash_ctrl || !flash_data) {
65 CAM_ERR(CAM_FLASH, "Fctrl or Data NULL");
66 return -EINVAL;
67 }
68
69 soc_private = (struct cam_flash_private_soc *)
70 &flash_ctrl->soc_info.soc_private;
71
72 if (op == CAMERA_SENSOR_FLASH_OP_FIRELOW) {
73 for (i = 0; i < flash_ctrl->torch_num_sources; i++) {
74 if (flash_ctrl->torch_trigger[i]) {
75 max_current = soc_private->torch_max_current[i];
76
77 if (flash_data->led_current_ma[i] <=
78 max_current)
79 curr = flash_data->led_current_ma[i];
80 else
81 curr = soc_private->torch_op_current[i];
82
83 CAM_DBG(CAM_FLASH,
84 "Led_Current[%d] = %d", i, curr);
85 led_trigger_event(flash_ctrl->torch_trigger[i],
86 curr);
87 }
88 }
89 } else if (op == CAMERA_SENSOR_FLASH_OP_FIREHIGH) {
90 for (i = 0; i < flash_ctrl->flash_num_sources; i++) {
91 if (flash_ctrl->flash_trigger[i]) {
92 max_current = soc_private->flash_max_current[i];
93
94 if (flash_data->led_current_ma[i] <=
95 max_current)
96 curr = flash_data->led_current_ma[i];
97 else
98 curr = soc_private->flash_op_current[i];
99
100 CAM_DBG(CAM_FLASH, "LED flash_current[%d]: %d",
101 i, curr);
102 led_trigger_event(flash_ctrl->flash_trigger[i],
103 curr);
104 }
105 }
106 } else {
107 CAM_ERR(CAM_FLASH, "Wrong Operation: %d", op);
108 return -EINVAL;
109 }
110
111 if (flash_ctrl->switch_trigger)
112 led_trigger_event(flash_ctrl->switch_trigger, LED_SWITCH_ON);
113
114 return 0;
115}
116
117int cam_flash_off(struct cam_flash_ctrl *flash_ctrl)
118{
119 int i = 0;
120
121 if (!flash_ctrl) {
122 CAM_ERR(CAM_FLASH, "Flash control Null");
123 return -EINVAL;
124 }
125
126 for (i = 0; i < flash_ctrl->flash_num_sources; i++)
127 if (flash_ctrl->flash_trigger[i])
128 led_trigger_event(flash_ctrl->flash_trigger[i],
129 LED_OFF);
130
131 for (i = 0; i < flash_ctrl->torch_num_sources; i++)
132 if (flash_ctrl->torch_trigger[i])
133 led_trigger_event(flash_ctrl->torch_trigger[i],
134 LED_OFF);
135
136 if (flash_ctrl->switch_trigger)
137 led_trigger_event(flash_ctrl->switch_trigger,
138 LED_SWITCH_OFF);
139
140 return 0;
141}
142
143static int cam_flash_low(
144 struct cam_flash_ctrl *flash_ctrl,
145 struct cam_flash_frame_setting *flash_data)
146{
147 int i = 0, rc = 0;
148
149 if (!flash_data) {
150 CAM_ERR(CAM_FLASH, "Flash Data Null");
151 return -EINVAL;
152 }
153
154 for (i = 0; i < flash_ctrl->flash_num_sources; i++)
155 if (flash_ctrl->flash_trigger[i])
156 led_trigger_event(flash_ctrl->flash_trigger[i],
157 LED_OFF);
158
159 rc = cam_flash_ops(flash_ctrl, flash_data,
160 CAMERA_SENSOR_FLASH_OP_FIRELOW);
161 if (rc)
162 CAM_ERR(CAM_FLASH, "Fire Torch failed: %d", rc);
163
164 return rc;
165}
166
167static int cam_flash_high(
168 struct cam_flash_ctrl *flash_ctrl,
169 struct cam_flash_frame_setting *flash_data)
170{
171 int i = 0, rc = 0;
172
173 if (!flash_data) {
174 CAM_ERR(CAM_FLASH, "Flash Data Null");
175 return -EINVAL;
176 }
177
178 for (i = 0; i < flash_ctrl->torch_num_sources; i++)
179 if (flash_ctrl->torch_trigger[i])
180 led_trigger_event(flash_ctrl->torch_trigger[i],
181 LED_OFF);
182
183 rc = cam_flash_ops(flash_ctrl, flash_data,
184 CAMERA_SENSOR_FLASH_OP_FIREHIGH);
185 if (rc)
186 CAM_ERR(CAM_FLASH, "Fire Flash Failed: %d", rc);
187
188 return rc;
189}
190
191static int delete_req(struct cam_flash_ctrl *fctrl, uint64_t req_id)
192{
193 int i = 0;
194 int frame_offset = 0;
195 struct cam_flash_frame_setting *flash_data = NULL;
196
197 if (req_id == 0) {
198 flash_data = &fctrl->nrt_info;
199 if ((fctrl->nrt_info.cmn_attr.cmd_type ==
200 CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET) ||
201 (fctrl->nrt_info.cmn_attr.cmd_type ==
202 CAMERA_SENSOR_FLASH_CMD_TYPE_RER)) {
203 flash_data->cmn_attr.is_settings_valid = false;
204 for (i = 0; i < flash_data->cmn_attr.count; i++)
205 flash_data->led_current_ma[i] = 0;
206 } else {
207 fctrl->flash_init_setting.cmn_attr.
208 is_settings_valid = false;
209 }
210 } else {
211 frame_offset = (req_id + MAX_PER_FRAME_ARRAY -
212 CAM_FLASH_PIPELINE_DELAY) % 8;
213 flash_data = &fctrl->per_frame[frame_offset];
214 if (req_id > flash_data->cmn_attr.request_id) {
215 flash_data->cmn_attr.request_id = 0;
216 flash_data->cmn_attr.is_settings_valid = false;
217 for (i = 0; i < flash_data->cmn_attr.count; i++)
218 flash_data->led_current_ma[i] = 0;
219 }
220 }
221
222 return 0;
223}
224
225int cam_flash_apply_setting(struct cam_flash_ctrl *fctrl,
226 uint64_t req_id)
227{
228 int rc = 0, i = 0;
229 int frame_offset = 0;
230 uint16_t num_iterations;
231 struct cam_flash_frame_setting *flash_data = NULL;
232
Soundrapandian Jeyaprakashafdca892017-07-27 15:23:13 -0700233 if (req_id == 0) {
Jigarkumar Zala35226272017-04-19 16:05:24 -0700234 if (fctrl->nrt_info.cmn_attr.cmd_type ==
235 CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET) {
236 flash_data = &fctrl->nrt_info;
237 if (flash_data->opcode ==
238 CAMERA_SENSOR_FLASH_OP_FIRELOW) {
239 if (!(fctrl->is_regulator_enabled)) {
240 rc = cam_flash_prepare(fctrl,
241 CAM_FLASH_STATE_INIT);
242 if (rc) {
243 CAM_ERR(CAM_FLASH,
244 "Reg Enable Failed %d",
245 rc);
246 goto nrt_del_req;
247 }
248 fctrl->flash_state =
249 CAM_FLASH_STATE_INIT;
250 rc = cam_flash_low(fctrl, flash_data);
251 if (rc) {
252 CAM_ERR(CAM_FLASH,
253 "Torch ON failed : %d",
254 rc);
255 goto nrt_del_req;
256 }
257 fctrl->flash_state =
258 CAM_FLASH_STATE_LOW;
259 }
260 } else if (flash_data->opcode ==
261 CAMERA_SENSOR_FLASH_OP_OFF) {
262 if (fctrl->flash_state !=
263 CAM_FLASH_STATE_INIT) {
264 rc = cam_flash_off(fctrl);
265 if (rc)
266 CAM_ERR(CAM_FLASH,
267 "LED off failed: %d",
268 rc);
269 }
270
271 rc = cam_flash_prepare(fctrl,
272 CAM_FLASH_STATE_RELEASE);
273 if (rc) {
274 CAM_ERR(CAM_FLASH,
275 "Regulator Disable failed %d",
276 rc);
277 goto nrt_del_req;
278 }
279
280 fctrl->flash_state =
281 CAM_FLASH_STATE_RELEASE;
282 fctrl->is_regulator_enabled = false;
283 }
284 } else if (fctrl->nrt_info.cmn_attr.cmd_type ==
285 CAMERA_SENSOR_FLASH_CMD_TYPE_RER) {
286 flash_data = &fctrl->nrt_info;
287
288 if (fctrl->flash_state != CAM_FLASH_STATE_INIT) {
289 rc = cam_flash_off(fctrl);
290 if (rc) {
291 CAM_ERR(CAM_FLASH,
292 "Flash off failed: %d",
293 rc);
294 } else {
295 fctrl->flash_state =
296 CAM_FLASH_STATE_INIT;
297 }
298 }
299
300 num_iterations = flash_data->num_iterations;
301 for (i = 0; i < num_iterations; i++) {
302 /* Turn On Torch */
303 if (fctrl->flash_state ==
304 CAM_FLASH_STATE_INIT) {
305 rc = cam_flash_low(fctrl, flash_data);
306 if (rc) {
307 CAM_ERR(CAM_FLASH,
308 "Fire Torch Failed");
309 goto nrt_del_req;
310 }
311 fctrl->flash_state =
312 CAM_FLASH_STATE_LOW;
313 }
314 usleep_range(
315 flash_data->led_on_delay_ms * 1000,
316 flash_data->led_on_delay_ms * 1000 + 100);
317
318 /* Turn Off Torch */
319 rc = cam_flash_off(fctrl);
320 if (rc) {
321 CAM_ERR(CAM_FLASH,
322 "Flash off failed: %d",
323 rc);
324 continue;
325 }
326 fctrl->flash_state = CAM_FLASH_STATE_INIT;
327 usleep_range(
328 flash_data->led_off_delay_ms * 1000,
329 flash_data->led_off_delay_ms * 1000 + 100);
330 }
331 }
332 } else {
333 frame_offset = req_id % MAX_PER_FRAME_ARRAY;
334 flash_data = &fctrl->per_frame[frame_offset];
335
336 if ((flash_data->opcode == CAMERA_SENSOR_FLASH_OP_FIREHIGH) &&
337 (flash_data->cmn_attr.is_settings_valid)) {
338 /* Turn On Flash */
339 if (fctrl->flash_state == CAM_FLASH_STATE_INIT) {
340 rc = cam_flash_high(fctrl, flash_data);
341 if (rc) {
342 CAM_ERR(CAM_FLASH,
343 "Flash ON failed: rc= %d",
344 rc);
345 goto apply_setting_err;
346 }
347 fctrl->flash_state = CAM_FLASH_STATE_HIGH;
348 }
349 } else if ((flash_data->opcode ==
350 CAMERA_SENSOR_FLASH_OP_FIRELOW) &&
351 (flash_data->cmn_attr.is_settings_valid)) {
352 /* Turn Off Flash */
353 if (fctrl->flash_state == CAM_FLASH_STATE_INIT) {
354 rc = cam_flash_low(fctrl, flash_data);
355 if (rc) {
356 CAM_ERR(CAM_FLASH,
357 "Torch ON failed: rc= %d",
358 rc);
359 goto apply_setting_err;
360 }
361 fctrl->flash_state = CAM_FLASH_STATE_LOW;
362 }
363 } else if ((flash_data->opcode == CAMERA_SENSOR_FLASH_OP_OFF) &&
364 (flash_data->cmn_attr.is_settings_valid)) {
365 if ((fctrl->flash_state != CAM_FLASH_STATE_RELEASE) ||
366 (fctrl->flash_state != CAM_FLASH_STATE_INIT)) {
367 rc = cam_flash_off(fctrl);
368 if (rc) {
369 CAM_ERR(CAM_FLASH,
370 "Flash off failed %d", rc);
371 } else {
372 fctrl->flash_state =
373 CAM_FLASH_STATE_INIT;
374 }
375 }
376 } else {
377 CAM_ERR(CAM_FLASH, "Wrong opcode : %d",
378 flash_data->opcode);
379 rc = -EINVAL;
380 goto apply_setting_err;
381 }
382 }
383
384nrt_del_req:
385 delete_req(fctrl, req_id);
386apply_setting_err:
387 return rc;
388}
389
390int cam_flash_parser(struct cam_flash_ctrl *fctrl, void *arg)
391{
392 int rc = 0, i = 0;
393 uint64_t generic_ptr;
394 uint32_t *cmd_buf = NULL;
395 uint32_t *offset = NULL;
396 uint32_t frame_offset = 0;
397 size_t len_of_buffer;
398 struct cam_control *ioctl_ctrl = NULL;
399 struct cam_packet *csl_packet = NULL;
400 struct cam_cmd_buf_desc *cmd_desc = NULL;
401 struct common_header *cmn_hdr;
402 struct cam_config_dev_cmd config;
403 struct cam_req_mgr_add_request add_req;
404 struct cam_flash_init *cam_flash_info = NULL;
405 struct cam_flash_set_rer *flash_rer_info = NULL;
406 struct cam_flash_set_on_off *flash_operation_info = NULL;
407 struct cam_flash_query_curr *flash_query_info = NULL;
408
409 if (!fctrl || !arg) {
410 CAM_ERR(CAM_FLASH, "fctrl/arg is NULL");
411 return -EINVAL;
412 }
413 /* getting CSL Packet */
414 ioctl_ctrl = (struct cam_control *)arg;
415
416 if (copy_from_user((&config), (void __user *) ioctl_ctrl->handle,
417 sizeof(config))) {
418 CAM_ERR(CAM_FLASH, "Copy cmd handle from user failed");
419 rc = -EFAULT;
420 return rc;
421 }
422
423 rc = cam_mem_get_cpu_buf(config.packet_handle,
424 (uint64_t *)&generic_ptr, &len_of_buffer);
425 if (rc) {
426 CAM_ERR(CAM_FLASH, "Failed in getting the buffer : %d", rc);
427 return rc;
428 }
429
430 csl_packet = (struct cam_packet *)generic_ptr;
431
432 switch (csl_packet->header.op_code & 0xFFFFFF) {
433 case CAM_FLASH_PACKET_OPCODE_INIT: {
434 /* INIT packet*/
435 offset = (uint32_t *)((uint8_t *)&csl_packet->payload +
436 csl_packet->cmd_buf_offset);
437 fctrl->flash_init_setting.cmn_attr.request_id = 0;
438 fctrl->flash_init_setting.cmn_attr.is_settings_valid = true;
439 cmd_desc = (struct cam_cmd_buf_desc *)(offset);
440 rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle,
441 (uint64_t *)&generic_ptr, &len_of_buffer);
442 cmd_buf = (uint32_t *)((uint8_t *)generic_ptr +
443 cmd_desc->offset);
444 cam_flash_info = (struct cam_flash_init *)cmd_buf;
445
446 switch (cam_flash_info->cmd_type) {
447 case CAMERA_SENSOR_FLASH_CMD_TYPE_INIT:
448 fctrl->flash_type = cam_flash_info->flash_type;
449 fctrl->is_regulator_enabled = false;
450 fctrl->nrt_info.cmn_attr.cmd_type =
451 CAMERA_SENSOR_FLASH_CMD_TYPE_INIT;
452 break;
453 default:
454 CAM_ERR(CAM_FLASH, "Wrong cmd_type = %d",
455 cam_flash_info->cmd_type);
456 return -EINVAL;
457 }
458 break;
459 }
460 case CAM_FLASH_PACKET_OPCODE_SET_OPS: {
461 offset = (uint32_t *)((uint8_t *)&csl_packet->payload +
462 csl_packet->cmd_buf_offset);
463 frame_offset = csl_packet->header.request_id %
464 MAX_PER_FRAME_ARRAY;
465 fctrl->per_frame[frame_offset].cmn_attr.request_id =
466 csl_packet->header.request_id;
467 fctrl->per_frame[frame_offset].cmn_attr.is_settings_valid =
468 true;
469 cmd_desc = (struct cam_cmd_buf_desc *)(offset);
470 rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle,
471 (uint64_t *)&generic_ptr, &len_of_buffer);
472 cmd_buf = (uint32_t *)((uint8_t *)generic_ptr +
473 cmd_desc->offset);
474 cmn_hdr = (struct common_header *)cmd_buf;
475
476 switch (cmn_hdr->cmd_type) {
477 case CAMERA_SENSOR_FLASH_CMD_TYPE_FIRE: {
478 CAM_DBG(CAM_FLASH,
479 "CAMERA_FLASH_CMD_TYPE_OPS case called");
480 flash_operation_info =
481 (struct cam_flash_set_on_off *) cmd_buf;
482 fctrl->per_frame[frame_offset].opcode =
483 flash_operation_info->opcode;
484 fctrl->per_frame[frame_offset].cmn_attr.count =
485 flash_operation_info->count;
486 for (i = 0; i < flash_operation_info->count; i++)
487 fctrl->per_frame[frame_offset].led_current_ma[i]
488 = flash_operation_info->
489 led_current_ma[i];
490 break;
491 }
492 default:
493 CAM_ERR(CAM_FLASH, "Wrong cmd_type = %d",
494 cmn_hdr->cmd_type);
495 return -EINVAL;
496 }
497
498 break;
499 }
500 case CAM_FLASH_PACKET_OPCODE_NON_REALTIME_SET_OPS: {
501 offset = (uint32_t *)((uint8_t *)&csl_packet->payload +
502 csl_packet->cmd_buf_offset);
503 fctrl->nrt_info.cmn_attr.is_settings_valid = true;
504 cmd_desc = (struct cam_cmd_buf_desc *)(offset);
505 rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle,
506 (uint64_t *)&generic_ptr, &len_of_buffer);
507 cmd_buf = (uint32_t *)((uint8_t *)generic_ptr +
508 cmd_desc->offset);
509 cmn_hdr = (struct common_header *)cmd_buf;
510
511 switch (cmn_hdr->cmd_type) {
512 case CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET: {
513 CAM_DBG(CAM_FLASH, "Widget Flash Operation");
514 flash_operation_info =
515 (struct cam_flash_set_on_off *) cmd_buf;
516 fctrl->nrt_info.cmn_attr.count =
517 flash_operation_info->count;
518 fctrl->nrt_info.cmn_attr.request_id = 0;
519 fctrl->nrt_info.opcode =
520 flash_operation_info->opcode;
521 fctrl->nrt_info.cmn_attr.cmd_type =
522 CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET;
523
524 for (i = 0; i < flash_operation_info->count; i++)
525 fctrl->nrt_info.led_current_ma[i] =
526 flash_operation_info->led_current_ma[i];
527
528 mutex_lock(&fctrl->flash_wq_mutex);
529 rc = cam_flash_apply_setting(fctrl, 0);
530 if (rc)
531 CAM_ERR(CAM_FLASH, "Apply setting failed: %d",
532 rc);
533 mutex_unlock(&fctrl->flash_wq_mutex);
534 return rc;
535 }
536 case CAMERA_SENSOR_FLASH_CMD_TYPE_QUERYCURR: {
537 int query_curr_ma = 0;
538
539 flash_query_info =
540 (struct cam_flash_query_curr *)cmd_buf;
541
542 rc = qpnp_flash_led_prepare(fctrl->switch_trigger,
543 QUERY_MAX_CURRENT, &query_curr_ma);
544 CAM_DBG(CAM_FLASH, "query_curr_ma = %d",
545 query_curr_ma);
546 if (rc) {
547 CAM_ERR(CAM_FLASH,
548 "Query current failed with rc=%d", rc);
549 return rc;
550 }
551 flash_query_info->query_current_ma = query_curr_ma;
552 break;
553 }
554 case CAMERA_SENSOR_FLASH_CMD_TYPE_RER: {
555 rc = 0;
556 flash_rer_info = (struct cam_flash_set_rer *)cmd_buf;
557 fctrl->nrt_info.cmn_attr.cmd_type =
558 CAMERA_SENSOR_FLASH_CMD_TYPE_RER;
559 fctrl->nrt_info.opcode = flash_rer_info->opcode;
560 fctrl->nrt_info.cmn_attr.count = flash_rer_info->count;
561 fctrl->nrt_info.cmn_attr.request_id = 0;
562 fctrl->nrt_info.num_iterations =
563 flash_rer_info->num_iteration;
564 fctrl->nrt_info.led_on_delay_ms =
565 flash_rer_info->led_on_delay_ms;
566 fctrl->nrt_info.led_off_delay_ms =
567 flash_rer_info->led_off_delay_ms;
568
569 for (i = 0; i < flash_rer_info->count; i++)
570 fctrl->nrt_info.led_current_ma[i] =
571 flash_rer_info->led_current_ma[i];
572
573
574 mutex_lock(&fctrl->flash_wq_mutex);
575 rc = cam_flash_apply_setting(fctrl, 0);
576 if (rc)
577 CAM_ERR(CAM_FLASH, "apply_setting failed: %d",
578 rc);
579 mutex_unlock(&fctrl->flash_wq_mutex);
580 return rc;
581 }
582 default:
583 CAM_ERR(CAM_FLASH, "Wrong cmd_type : %d",
584 cmn_hdr->cmd_type);
585 return -EINVAL;
586 }
587
588 break;
589 }
590 case CAM_PKT_NOP_OPCODE: {
591 goto update_req_mgr;
592 }
593 default:
594 CAM_ERR(CAM_FLASH, "Wrong Opcode : %d",
595 (csl_packet->header.op_code & 0xFFFFFF));
596 return -EINVAL;
597 }
598update_req_mgr:
599 if (((csl_packet->header.op_code & 0xFFFFF) ==
600 CAM_PKT_NOP_OPCODE) ||
601 ((csl_packet->header.op_code & 0xFFFFF) ==
602 CAM_FLASH_PACKET_OPCODE_SET_OPS)) {
603 add_req.link_hdl = fctrl->bridge_intf.link_hdl;
604 add_req.req_id = csl_packet->header.request_id;
605 add_req.dev_hdl = fctrl->bridge_intf.device_hdl;
606 if (fctrl->bridge_intf.crm_cb &&
607 fctrl->bridge_intf.crm_cb->add_req)
608 fctrl->bridge_intf.crm_cb->add_req(&add_req);
609 CAM_DBG(CAM_FLASH, "add req to req_mgr= %lld", add_req.req_id);
610 }
611
612 return rc;
613}
614
615int cam_flash_publish_dev_info(struct cam_req_mgr_device_info *info)
616{
617 info->dev_id = CAM_REQ_MGR_DEVICE_FLASH;
618 strlcpy(info->name, CAM_FLASH_NAME, sizeof(info->name));
619 info->p_delay = CAM_FLASH_PIPELINE_DELAY;
Junzhe Zou2df84502017-05-26 13:20:23 -0700620 info->trigger = CAM_TRIGGER_POINT_EOF;
Jigarkumar Zala35226272017-04-19 16:05:24 -0700621 return 0;
622}
623
624int cam_flash_establish_link(struct cam_req_mgr_core_dev_link_setup *link)
625{
626 struct cam_flash_ctrl *fctrl = NULL;
627
628 if (!link)
629 return -EINVAL;
630
631 fctrl = (struct cam_flash_ctrl *)cam_get_device_priv(link->dev_hdl);
632 if (!fctrl) {
633 CAM_ERR(CAM_FLASH, " Device data is NULL");
634 return -EINVAL;
635 }
636
637 if (link->link_enable) {
638 fctrl->bridge_intf.link_hdl = link->link_hdl;
639 fctrl->bridge_intf.crm_cb = link->crm_cb;
640 } else {
641 fctrl->bridge_intf.link_hdl = -1;
642 fctrl->bridge_intf.crm_cb = NULL;
643 }
644
645 return 0;
646}
647
648static int cam_flash_flush_nrt(struct cam_flash_ctrl *fctrl)
649{
650 int j = 0;
651 struct cam_flash_frame_setting *nrt_settings;
652
653 if (!fctrl)
654 return -EINVAL;
655
656 nrt_settings = &fctrl->nrt_info;
657
658 if (nrt_settings->cmn_attr.cmd_type ==
659 CAMERA_SENSOR_FLASH_CMD_TYPE_INIT) {
660 fctrl->flash_init_setting.cmn_attr.is_settings_valid = false;
661 } else if ((nrt_settings->cmn_attr.cmd_type ==
662 CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET) ||
663 (nrt_settings->cmn_attr.cmd_type ==
664 CAMERA_SENSOR_FLASH_CMD_TYPE_RER)) {
665 fctrl->nrt_info.cmn_attr.is_settings_valid = false;
666 fctrl->nrt_info.cmn_attr.count = 0;
667 fctrl->nrt_info.num_iterations = 0;
668 fctrl->nrt_info.led_on_delay_ms = 0;
669 fctrl->nrt_info.led_off_delay_ms = 0;
670 for (j = 0; j < CAM_FLASH_MAX_LED_TRIGGERS; j++)
671 fctrl->nrt_info.led_current_ma[j] = 0;
672 }
673
674 return 0;
675}
676
677int cam_flash_flush_request(struct cam_req_mgr_flush_request *flush)
678{
679 int rc = 0;
680 int i = 0, j = 0;
681 struct cam_flash_ctrl *fctrl = NULL;
682 int frame_offset = 0;
683
684 fctrl = (struct cam_flash_ctrl *) cam_get_device_priv(flush->dev_hdl);
685 if (!fctrl) {
686 CAM_ERR(CAM_FLASH, "Device data is NULL");
687 return -EINVAL;
688 }
689
690 if (flush->type == CAM_REQ_MGR_FLUSH_TYPE_ALL) {
691 /* flush all requests*/
692 for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) {
693 fctrl->per_frame[i].cmn_attr.request_id = 0;
694 fctrl->per_frame[i].cmn_attr.is_settings_valid = false;
695 fctrl->per_frame[i].cmn_attr.count = 0;
696 for (j = 0; j < CAM_FLASH_MAX_LED_TRIGGERS; j++)
697 fctrl->per_frame[i].led_current_ma[j] = 0;
698 }
699
700 rc = cam_flash_flush_nrt(fctrl);
701 if (rc)
702 CAM_ERR(CAM_FLASH, "NonRealTime flush error");
703 } else if (flush->type == CAM_REQ_MGR_FLUSH_TYPE_CANCEL_REQ) {
704 /* flush request with req_id*/
705 frame_offset = flush->req_id % MAX_PER_FRAME_ARRAY;
706 fctrl->per_frame[frame_offset].cmn_attr.request_id = 0;
707 fctrl->per_frame[frame_offset].cmn_attr.is_settings_valid =
708 false;
709 fctrl->per_frame[frame_offset].cmn_attr.count = 0;
710 for (i = 0; i < CAM_FLASH_MAX_LED_TRIGGERS; i++)
711 fctrl->per_frame[frame_offset].led_current_ma[i] = 0;
712 }
713 return rc;
714}
715
716int cam_flash_apply_request(struct cam_req_mgr_apply_request *apply)
717{
718 int rc = 0;
719 struct cam_flash_ctrl *fctrl = NULL;
720
721 if (!apply)
722 return -EINVAL;
723
724 fctrl = (struct cam_flash_ctrl *) cam_get_device_priv(apply->dev_hdl);
725 if (!fctrl) {
726 CAM_ERR(CAM_FLASH, "Device data is NULL");
727 rc = -EINVAL;
728 goto free_resource;
729 }
730
731 if (!(apply->report_if_bubble)) {
732 mutex_lock(&fctrl->flash_wq_mutex);
733 rc = cam_flash_apply_setting(fctrl, apply->request_id);
734 if (rc)
735 CAM_ERR(CAM_FLASH, "apply_setting failed with rc=%d",
736 rc);
737 mutex_unlock(&fctrl->flash_wq_mutex);
738 }
739
740free_resource:
741 return rc;
742}