blob: 0aaf8b0c28ea4bbc613c8b8c39232c7f79953c9e [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 *)
Shankar Ravib6f86fd2017-08-11 16:31:33 +053070 flash_ctrl->soc_info.soc_private;
Jigarkumar Zala35226272017-04-19 16:05:24 -070071
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)) {
Shankar Ravib6f86fd2017-08-11 16:31:33 +0530352 /* Turn On Torch */
Jigarkumar Zala35226272017-04-19 16:05:24 -0700353 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
Shankar Ravib6f86fd2017-08-11 16:31:33 +0530430 if (config.offset > len_of_buffer) {
431 CAM_ERR(CAM_FLASH,
432 "offset is out of bounds: offset: %lld len: %zu",
433 config.offset, len_of_buffer);
434 return -EINVAL;
435 }
436
437 /* Add offset to the flash csl header */
438 csl_packet = (struct cam_packet *)(generic_ptr + config.offset);
Jigarkumar Zala35226272017-04-19 16:05:24 -0700439
440 switch (csl_packet->header.op_code & 0xFFFFFF) {
441 case CAM_FLASH_PACKET_OPCODE_INIT: {
442 /* INIT packet*/
443 offset = (uint32_t *)((uint8_t *)&csl_packet->payload +
444 csl_packet->cmd_buf_offset);
445 fctrl->flash_init_setting.cmn_attr.request_id = 0;
446 fctrl->flash_init_setting.cmn_attr.is_settings_valid = true;
447 cmd_desc = (struct cam_cmd_buf_desc *)(offset);
448 rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle,
449 (uint64_t *)&generic_ptr, &len_of_buffer);
450 cmd_buf = (uint32_t *)((uint8_t *)generic_ptr +
451 cmd_desc->offset);
452 cam_flash_info = (struct cam_flash_init *)cmd_buf;
453
454 switch (cam_flash_info->cmd_type) {
455 case CAMERA_SENSOR_FLASH_CMD_TYPE_INIT:
456 fctrl->flash_type = cam_flash_info->flash_type;
457 fctrl->is_regulator_enabled = false;
458 fctrl->nrt_info.cmn_attr.cmd_type =
459 CAMERA_SENSOR_FLASH_CMD_TYPE_INIT;
460 break;
461 default:
462 CAM_ERR(CAM_FLASH, "Wrong cmd_type = %d",
463 cam_flash_info->cmd_type);
464 return -EINVAL;
465 }
466 break;
467 }
468 case CAM_FLASH_PACKET_OPCODE_SET_OPS: {
469 offset = (uint32_t *)((uint8_t *)&csl_packet->payload +
470 csl_packet->cmd_buf_offset);
471 frame_offset = csl_packet->header.request_id %
472 MAX_PER_FRAME_ARRAY;
473 fctrl->per_frame[frame_offset].cmn_attr.request_id =
474 csl_packet->header.request_id;
475 fctrl->per_frame[frame_offset].cmn_attr.is_settings_valid =
476 true;
477 cmd_desc = (struct cam_cmd_buf_desc *)(offset);
478 rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle,
479 (uint64_t *)&generic_ptr, &len_of_buffer);
480 cmd_buf = (uint32_t *)((uint8_t *)generic_ptr +
481 cmd_desc->offset);
482 cmn_hdr = (struct common_header *)cmd_buf;
483
484 switch (cmn_hdr->cmd_type) {
485 case CAMERA_SENSOR_FLASH_CMD_TYPE_FIRE: {
486 CAM_DBG(CAM_FLASH,
487 "CAMERA_FLASH_CMD_TYPE_OPS case called");
488 flash_operation_info =
489 (struct cam_flash_set_on_off *) cmd_buf;
490 fctrl->per_frame[frame_offset].opcode =
491 flash_operation_info->opcode;
492 fctrl->per_frame[frame_offset].cmn_attr.count =
493 flash_operation_info->count;
494 for (i = 0; i < flash_operation_info->count; i++)
495 fctrl->per_frame[frame_offset].led_current_ma[i]
496 = flash_operation_info->
497 led_current_ma[i];
498 break;
499 }
500 default:
501 CAM_ERR(CAM_FLASH, "Wrong cmd_type = %d",
502 cmn_hdr->cmd_type);
503 return -EINVAL;
504 }
505
506 break;
507 }
508 case CAM_FLASH_PACKET_OPCODE_NON_REALTIME_SET_OPS: {
509 offset = (uint32_t *)((uint8_t *)&csl_packet->payload +
510 csl_packet->cmd_buf_offset);
511 fctrl->nrt_info.cmn_attr.is_settings_valid = true;
512 cmd_desc = (struct cam_cmd_buf_desc *)(offset);
513 rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle,
514 (uint64_t *)&generic_ptr, &len_of_buffer);
515 cmd_buf = (uint32_t *)((uint8_t *)generic_ptr +
516 cmd_desc->offset);
517 cmn_hdr = (struct common_header *)cmd_buf;
518
519 switch (cmn_hdr->cmd_type) {
520 case CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET: {
521 CAM_DBG(CAM_FLASH, "Widget Flash Operation");
522 flash_operation_info =
523 (struct cam_flash_set_on_off *) cmd_buf;
524 fctrl->nrt_info.cmn_attr.count =
525 flash_operation_info->count;
526 fctrl->nrt_info.cmn_attr.request_id = 0;
527 fctrl->nrt_info.opcode =
528 flash_operation_info->opcode;
529 fctrl->nrt_info.cmn_attr.cmd_type =
530 CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET;
531
532 for (i = 0; i < flash_operation_info->count; i++)
533 fctrl->nrt_info.led_current_ma[i] =
534 flash_operation_info->led_current_ma[i];
535
536 mutex_lock(&fctrl->flash_wq_mutex);
537 rc = cam_flash_apply_setting(fctrl, 0);
538 if (rc)
539 CAM_ERR(CAM_FLASH, "Apply setting failed: %d",
540 rc);
541 mutex_unlock(&fctrl->flash_wq_mutex);
542 return rc;
543 }
544 case CAMERA_SENSOR_FLASH_CMD_TYPE_QUERYCURR: {
545 int query_curr_ma = 0;
546
547 flash_query_info =
548 (struct cam_flash_query_curr *)cmd_buf;
549
550 rc = qpnp_flash_led_prepare(fctrl->switch_trigger,
551 QUERY_MAX_CURRENT, &query_curr_ma);
552 CAM_DBG(CAM_FLASH, "query_curr_ma = %d",
553 query_curr_ma);
554 if (rc) {
555 CAM_ERR(CAM_FLASH,
556 "Query current failed with rc=%d", rc);
557 return rc;
558 }
559 flash_query_info->query_current_ma = query_curr_ma;
560 break;
561 }
562 case CAMERA_SENSOR_FLASH_CMD_TYPE_RER: {
563 rc = 0;
564 flash_rer_info = (struct cam_flash_set_rer *)cmd_buf;
565 fctrl->nrt_info.cmn_attr.cmd_type =
566 CAMERA_SENSOR_FLASH_CMD_TYPE_RER;
567 fctrl->nrt_info.opcode = flash_rer_info->opcode;
568 fctrl->nrt_info.cmn_attr.count = flash_rer_info->count;
569 fctrl->nrt_info.cmn_attr.request_id = 0;
570 fctrl->nrt_info.num_iterations =
571 flash_rer_info->num_iteration;
572 fctrl->nrt_info.led_on_delay_ms =
573 flash_rer_info->led_on_delay_ms;
574 fctrl->nrt_info.led_off_delay_ms =
575 flash_rer_info->led_off_delay_ms;
576
577 for (i = 0; i < flash_rer_info->count; i++)
578 fctrl->nrt_info.led_current_ma[i] =
579 flash_rer_info->led_current_ma[i];
580
581
582 mutex_lock(&fctrl->flash_wq_mutex);
583 rc = cam_flash_apply_setting(fctrl, 0);
584 if (rc)
585 CAM_ERR(CAM_FLASH, "apply_setting failed: %d",
586 rc);
587 mutex_unlock(&fctrl->flash_wq_mutex);
588 return rc;
589 }
590 default:
591 CAM_ERR(CAM_FLASH, "Wrong cmd_type : %d",
592 cmn_hdr->cmd_type);
593 return -EINVAL;
594 }
595
596 break;
597 }
598 case CAM_PKT_NOP_OPCODE: {
599 goto update_req_mgr;
600 }
601 default:
602 CAM_ERR(CAM_FLASH, "Wrong Opcode : %d",
603 (csl_packet->header.op_code & 0xFFFFFF));
604 return -EINVAL;
605 }
606update_req_mgr:
607 if (((csl_packet->header.op_code & 0xFFFFF) ==
608 CAM_PKT_NOP_OPCODE) ||
609 ((csl_packet->header.op_code & 0xFFFFF) ==
610 CAM_FLASH_PACKET_OPCODE_SET_OPS)) {
611 add_req.link_hdl = fctrl->bridge_intf.link_hdl;
612 add_req.req_id = csl_packet->header.request_id;
613 add_req.dev_hdl = fctrl->bridge_intf.device_hdl;
614 if (fctrl->bridge_intf.crm_cb &&
615 fctrl->bridge_intf.crm_cb->add_req)
616 fctrl->bridge_intf.crm_cb->add_req(&add_req);
617 CAM_DBG(CAM_FLASH, "add req to req_mgr= %lld", add_req.req_id);
618 }
619
620 return rc;
621}
622
623int cam_flash_publish_dev_info(struct cam_req_mgr_device_info *info)
624{
625 info->dev_id = CAM_REQ_MGR_DEVICE_FLASH;
626 strlcpy(info->name, CAM_FLASH_NAME, sizeof(info->name));
627 info->p_delay = CAM_FLASH_PIPELINE_DELAY;
Junzhe Zou2df84502017-05-26 13:20:23 -0700628 info->trigger = CAM_TRIGGER_POINT_EOF;
Jigarkumar Zala35226272017-04-19 16:05:24 -0700629 return 0;
630}
631
632int cam_flash_establish_link(struct cam_req_mgr_core_dev_link_setup *link)
633{
634 struct cam_flash_ctrl *fctrl = NULL;
635
636 if (!link)
637 return -EINVAL;
638
639 fctrl = (struct cam_flash_ctrl *)cam_get_device_priv(link->dev_hdl);
640 if (!fctrl) {
641 CAM_ERR(CAM_FLASH, " Device data is NULL");
642 return -EINVAL;
643 }
644
645 if (link->link_enable) {
646 fctrl->bridge_intf.link_hdl = link->link_hdl;
647 fctrl->bridge_intf.crm_cb = link->crm_cb;
648 } else {
649 fctrl->bridge_intf.link_hdl = -1;
650 fctrl->bridge_intf.crm_cb = NULL;
651 }
652
653 return 0;
654}
655
656static int cam_flash_flush_nrt(struct cam_flash_ctrl *fctrl)
657{
658 int j = 0;
659 struct cam_flash_frame_setting *nrt_settings;
660
661 if (!fctrl)
662 return -EINVAL;
663
664 nrt_settings = &fctrl->nrt_info;
665
666 if (nrt_settings->cmn_attr.cmd_type ==
667 CAMERA_SENSOR_FLASH_CMD_TYPE_INIT) {
668 fctrl->flash_init_setting.cmn_attr.is_settings_valid = false;
669 } else if ((nrt_settings->cmn_attr.cmd_type ==
670 CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET) ||
671 (nrt_settings->cmn_attr.cmd_type ==
672 CAMERA_SENSOR_FLASH_CMD_TYPE_RER)) {
673 fctrl->nrt_info.cmn_attr.is_settings_valid = false;
674 fctrl->nrt_info.cmn_attr.count = 0;
675 fctrl->nrt_info.num_iterations = 0;
676 fctrl->nrt_info.led_on_delay_ms = 0;
677 fctrl->nrt_info.led_off_delay_ms = 0;
678 for (j = 0; j < CAM_FLASH_MAX_LED_TRIGGERS; j++)
679 fctrl->nrt_info.led_current_ma[j] = 0;
680 }
681
682 return 0;
683}
684
685int cam_flash_flush_request(struct cam_req_mgr_flush_request *flush)
686{
687 int rc = 0;
688 int i = 0, j = 0;
689 struct cam_flash_ctrl *fctrl = NULL;
690 int frame_offset = 0;
691
692 fctrl = (struct cam_flash_ctrl *) cam_get_device_priv(flush->dev_hdl);
693 if (!fctrl) {
694 CAM_ERR(CAM_FLASH, "Device data is NULL");
695 return -EINVAL;
696 }
697
698 if (flush->type == CAM_REQ_MGR_FLUSH_TYPE_ALL) {
699 /* flush all requests*/
700 for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) {
701 fctrl->per_frame[i].cmn_attr.request_id = 0;
702 fctrl->per_frame[i].cmn_attr.is_settings_valid = false;
703 fctrl->per_frame[i].cmn_attr.count = 0;
704 for (j = 0; j < CAM_FLASH_MAX_LED_TRIGGERS; j++)
705 fctrl->per_frame[i].led_current_ma[j] = 0;
706 }
707
708 rc = cam_flash_flush_nrt(fctrl);
709 if (rc)
710 CAM_ERR(CAM_FLASH, "NonRealTime flush error");
711 } else if (flush->type == CAM_REQ_MGR_FLUSH_TYPE_CANCEL_REQ) {
712 /* flush request with req_id*/
713 frame_offset = flush->req_id % MAX_PER_FRAME_ARRAY;
714 fctrl->per_frame[frame_offset].cmn_attr.request_id = 0;
715 fctrl->per_frame[frame_offset].cmn_attr.is_settings_valid =
716 false;
717 fctrl->per_frame[frame_offset].cmn_attr.count = 0;
718 for (i = 0; i < CAM_FLASH_MAX_LED_TRIGGERS; i++)
719 fctrl->per_frame[frame_offset].led_current_ma[i] = 0;
720 }
721 return rc;
722}
723
724int cam_flash_apply_request(struct cam_req_mgr_apply_request *apply)
725{
726 int rc = 0;
727 struct cam_flash_ctrl *fctrl = NULL;
728
729 if (!apply)
730 return -EINVAL;
731
732 fctrl = (struct cam_flash_ctrl *) cam_get_device_priv(apply->dev_hdl);
733 if (!fctrl) {
734 CAM_ERR(CAM_FLASH, "Device data is NULL");
735 rc = -EINVAL;
736 goto free_resource;
737 }
738
739 if (!(apply->report_if_bubble)) {
740 mutex_lock(&fctrl->flash_wq_mutex);
741 rc = cam_flash_apply_setting(fctrl, apply->request_id);
742 if (rc)
743 CAM_ERR(CAM_FLASH, "apply_setting failed with rc=%d",
744 rc);
745 mutex_unlock(&fctrl->flash_wq_mutex);
746 }
747
748free_resource:
749 return rc;
750}