1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * dcam_param.c
29  *
30  * dcam1394 driver.  Device parameter access.
31  */
32 
33 #include <sys/1394/targets/dcam1394/dcam.h>
34 #include <sys/1394/targets/dcam1394/dcam_param.h>
35 #include <sys/1394/targets/dcam1394/dcam_reg.h>
36 
37 /* index by vid_mode */
38 int g_frame_num_bytes[] = {
39 	57600,  /* vid mode 0 */
40 	153600, /* vid mode 1 */
41 	460800, /* vid mode 2 */
42 	614400, /* vid mode 3 */
43 	921600, /* vid mode 4 */
44 	307200  /* vid mode 5 */
45 };
46 
47 
48 static uint_t feature_csr_val_construct(uint_t subparam, uint_t param_val,
49     uint_t init_val);
50 static uint_t feature_csr_val_subparam_extract(uint_t subparam,
51     uint_t feature_csr_val);
52 static uint_t feature_elm_inq_reg_val_subparam_extract(uint_t subparam,
53     uint_t reg_val);
54 
55 
56 /*
57  * param_attr_init
58  */
59 int
param_attr_init(dcam_state_t * softc_p,dcam1394_param_attr_t param_attr)60 param_attr_init(dcam_state_t *softc_p, dcam1394_param_attr_t param_attr)
61 {
62 	int	err, ret_err;
63 	uint_t	attr_bmap, cap_on_off, cap_power_ctrl, cap_read;
64 	uint_t	param, presence, subparam;
65 
66 	bzero(param_attr, sizeof (dcam1394_param_attr_t));
67 
68 	ret_err = DDI_SUCCESS;
69 
70 	/*
71 	 * power ctrl cap
72 	 */
73 	param = DCAM1394_PARAM_CAP_POWER_CTRL;
74 	subparam = DCAM1394_SUBPARAM_NONE;
75 	attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
76 	param_attr_set(param_attr, param, subparam, attr_bmap);
77 
78 	/*
79 	 * video mode cap
80 	 */
81 	param = DCAM1394_PARAM_CAP_VID_MODE;
82 	attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
83 
84 	for (subparam = DCAM1394_SUBPARAM_VID_MODE_0;
85 	    subparam <= DCAM1394_SUBPARAM_VID_MODE_5; subparam++) {
86 		param_attr_set(param_attr, param, subparam, attr_bmap);
87 	}
88 
89 	/*
90 	 * frame rate cap
91 	 */
92 	attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
93 
94 	for (param = DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_0;
95 	    param <= DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_5; param++) {
96 
97 		for (subparam = DCAM1394_SUBPARAM_FRAME_RATE_0;
98 		    subparam <= DCAM1394_SUBPARAM_FRAME_RATE_4; subparam++) {
99 			param_attr_set(param_attr, param, subparam, attr_bmap);
100 		}
101 	}
102 
103 	/*
104 	 * power
105 	 */
106 	param = DCAM1394_PARAM_POWER;
107 	subparam = DCAM1394_SUBPARAM_NONE;
108 	err = dcam1394_param_get(softc_p, DCAM1394_PARAM_CAP_POWER_CTRL,
109 	    DCAM1394_SUBPARAM_NONE, &cap_power_ctrl);
110 	attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
111 
112 	if (cap_power_ctrl) {
113 		attr_bmap |= CAP_SET;
114 	}
115 	param_attr_set(param_attr, param, subparam, attr_bmap);
116 
117 	/*
118 	 * video mode
119 	 */
120 	param = DCAM1394_PARAM_VID_MODE;
121 	subparam = DCAM1394_SUBPARAM_NONE;
122 	attr_bmap = IS_VALID | IS_PRESENT | CAP_GET | CAP_SET;
123 	param_attr_set(param_attr, param, subparam, attr_bmap);
124 
125 	/*
126 	 * frame rate
127 	 */
128 	param = DCAM1394_PARAM_FRAME_RATE;
129 	subparam = DCAM1394_SUBPARAM_NONE;
130 	attr_bmap = IS_VALID | IS_PRESENT | CAP_GET | CAP_SET;
131 	param_attr_set(param_attr, param, subparam, attr_bmap);
132 
133 	/*
134 	 * ring buffer capacity
135 	 */
136 	param = DCAM1394_PARAM_RING_BUFF_CAPACITY;
137 	subparam = DCAM1394_SUBPARAM_NONE;
138 	attr_bmap = IS_VALID | IS_PRESENT | CAP_GET | CAP_SET;
139 	param_attr_set(param_attr, param, subparam, attr_bmap);
140 
141 	/*
142 	 * ring buffer: num frames ready
143 	 */
144 	param = DCAM1394_PARAM_RING_BUFF_NUM_FRAMES_READY;
145 	subparam = DCAM1394_SUBPARAM_NONE;
146 	attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
147 	param_attr_set(param_attr, param, subparam, attr_bmap);
148 
149 	/*
150 	 * ring buffer: read ptr increment stride
151 	 */
152 	param = DCAM1394_PARAM_RING_BUFF_READ_PTR_INCR;
153 	subparam = DCAM1394_SUBPARAM_NONE;
154 	attr_bmap = IS_VALID | IS_PRESENT | CAP_GET | CAP_SET;
155 	param_attr_set(param_attr, param, subparam, attr_bmap);
156 
157 	/*
158 	 * frame size
159 	 */
160 	param = DCAM1394_PARAM_FRAME_NUM_BYTES;
161 	subparam = DCAM1394_SUBPARAM_NONE;
162 	attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
163 	param_attr_set(param_attr, param, subparam, attr_bmap);
164 
165 	/*
166 	 * cam status
167 	 */
168 	param = DCAM1394_PARAM_STATUS;
169 	subparam = DCAM1394_SUBPARAM_NONE;
170 	attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
171 	param_attr_set(param_attr, param, subparam, attr_bmap);
172 
173 	/*
174 	 * features
175 	 */
176 	for (param = DCAM1394_PARAM_BRIGHTNESS; param <= DCAM1394_PARAM_TILT;
177 	    param++) {
178 
179 		/*
180 		 * get feature presence
181 		 * If the operation to read the parameter fails, then act as
182 		 * though the feature is not implemented (because it isn't),
183 		 * don't report a DDI failure (as was previously done).
184 		 */
185 		err = dcam1394_param_get(softc_p, param,
186 		    DCAM1394_SUBPARAM_PRESENCE, &presence);
187 
188 		if (!err) {
189 			/* feature presence */
190 			subparam  = DCAM1394_SUBPARAM_PRESENCE;
191 			attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
192 			param_attr_set(param_attr, param, subparam, attr_bmap);
193 
194 			if (presence) {
195 				/* feature cap read */
196 				subparam  = DCAM1394_SUBPARAM_CAP_READ;
197 				attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
198 				param_attr_set(param_attr, param,
199 				    subparam, attr_bmap);
200 
201 				/* feature cap on/off */
202 				subparam  = DCAM1394_SUBPARAM_CAP_ON_OFF;
203 				attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
204 				param_attr_set(param_attr, param,
205 				    subparam, attr_bmap);
206 
207 				/* feature cap ctrl auto */
208 				subparam  = DCAM1394_SUBPARAM_CAP_CTRL_AUTO;
209 				attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
210 				param_attr_set(param_attr, param,
211 				    subparam, attr_bmap);
212 
213 				/* feature cap ctrl manual */
214 				subparam  = DCAM1394_SUBPARAM_CAP_CTRL_MANUAL;
215 				attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
216 				param_attr_set(param_attr, param,
217 				    subparam, attr_bmap);
218 
219 				/* feature min val */
220 				subparam  = DCAM1394_SUBPARAM_MIN_VAL;
221 				attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
222 				param_attr_set(param_attr, param,
223 				    subparam, attr_bmap);
224 
225 				/* feature max val */
226 				subparam  = DCAM1394_SUBPARAM_MAX_VAL;
227 				attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
228 				param_attr_set(param_attr, param,
229 				    subparam, attr_bmap);
230 
231 				/* feature on/off */
232 				subparam = DCAM1394_SUBPARAM_ON_OFF;
233 
234 				err = dcam1394_param_get(softc_p, param,
235 				    DCAM1394_SUBPARAM_CAP_ON_OFF, &cap_on_off);
236 
237 				attr_bmap = IS_VALID | IS_PRESENT | CAP_GET;
238 
239 				if (cap_on_off) {
240 					attr_bmap |= (CAP_SET | CAP_CTRL_SET);
241 				}
242 
243 				param_attr_set(param_attr, param,
244 				    subparam, attr_bmap);
245 
246 				/* feature control mode */
247 				subparam = DCAM1394_SUBPARAM_CTRL_MODE;
248 				attr_bmap = IS_VALID | IS_PRESENT | CAP_GET |
249 				    CAP_SET | CAP_CTRL_SET;
250 
251 				param_attr_set(param_attr, param,
252 				    subparam, attr_bmap);
253 
254 				/* get value read-out capability */
255 				err  = dcam1394_param_get(softc_p, param,
256 				    DCAM1394_SUBPARAM_CAP_READ,
257 				    &cap_read);
258 
259 				if (param == DCAM1394_PARAM_WHITE_BALANCE) {
260 					/*
261 					 * white balance feature: u, v value
262 					 */
263 					subparam = DCAM1394_SUBPARAM_U_VALUE;
264 					attr_bmap = IS_VALID | IS_PRESENT |
265 					    CAP_SET | CAP_CTRL_SET;
266 
267 					if (cap_read) {
268 						attr_bmap |= CAP_GET;
269 					}
270 
271 					param_attr_set(param_attr, param,
272 					    subparam, attr_bmap);
273 
274 					subparam = DCAM1394_SUBPARAM_V_VALUE;
275 					attr_bmap = IS_VALID | IS_PRESENT |
276 					    CAP_SET | CAP_CTRL_SET;
277 
278 					if (cap_read) {
279 						attr_bmap |= CAP_GET;
280 					}
281 
282 					param_attr_set(param_attr, param,
283 					    subparam, attr_bmap);
284 
285 				} else {
286 					/* feature value */
287 					subparam = DCAM1394_SUBPARAM_VALUE;
288 					attr_bmap = IS_VALID | IS_PRESENT |
289 					    CAP_SET | CAP_CTRL_SET;
290 
291 					if (cap_read) {
292 						attr_bmap |= CAP_GET;
293 					}
294 
295 					param_attr_set(param_attr, param,
296 					    subparam, attr_bmap);
297 				}
298 
299 			}
300 
301 		}
302 	}
303 
304 	return (ret_err);
305 }
306 
307 
308 /*
309  * param_attr_set
310  */
311 void
param_attr_set(dcam1394_param_attr_t param_attr,uint_t param,uint_t subparam,uint_t attr_bmap)312 param_attr_set(dcam1394_param_attr_t  param_attr, uint_t param,
313     uint_t subparam, uint_t attr_bmap)
314 {
315 	param_attr[param][subparam] = attr_bmap;
316 }
317 
318 
319 /*
320  * dcam1394_ioctl_param_get
321  *
322  * softc's param_attr field must be initialized via param_attr_init()
323  * before using this function.
324  */
325 int
dcam1394_ioctl_param_get(dcam_state_t * softc_p,dcam1394_param_list_t param_list)326 dcam1394_ioctl_param_get(dcam_state_t *softc_p,
327     dcam1394_param_list_t param_list)
328 {
329 	int err, ret_err;
330 	int param, subparam;
331 	uint_t cap_get, is_present, is_valid, val;
332 
333 	ret_err = 0;
334 
335 	for (param = 0; param < DCAM1394_NUM_PARAM; param++) {
336 		for (subparam = 0;
337 		    subparam < DCAM1394_NUM_SUBPARAM;
338 		    subparam++) {
339 
340 			if (param_list[param][subparam].flag) {
341 				is_valid =
342 				    softc_p->param_attr[param][subparam] &
343 				    IS_VALID;
344 				is_present =
345 				    softc_p->param_attr[param][subparam] &
346 				    IS_PRESENT;
347 				cap_get =
348 				    softc_p->param_attr[param][subparam] &
349 				    CAP_GET;
350 
351 				if (is_valid && is_present && cap_get) {
352 					if (err = dcam1394_param_get(softc_p,
353 					    param, subparam, &val)) {
354 
355 					    param_list[param][subparam].err = 1;
356 					    ret_err = 1;
357 					}
358 
359 					if (!err) {
360 					    param_list[param][subparam].val =
361 						val;
362 					}
363 				} else {
364 					param_list[param][subparam].err = 1;
365 					ret_err = 1;
366 				}
367 			}
368 		}
369 	}
370 
371 	return (ret_err);
372 }
373 
374 
375 /*
376  * dcam1394_ioctl_param_set
377  * softc's param_attr field must be initialized via param_attr_init()
378  * before using this function.
379  */
380 int
dcam1394_ioctl_param_set(dcam_state_t * softc_p,int is_ctrl_file,dcam1394_param_list_t param_list)381 dcam1394_ioctl_param_set(dcam_state_t *softc_p, int is_ctrl_file,
382     dcam1394_param_list_t param_list)
383 {
384 	int param, subparam;
385 	int ret_err;
386 	uint_t cap_set, is_present, is_valid, val;
387 
388 	ret_err = 0;
389 
390 	for (param = 0; param < DCAM1394_NUM_PARAM; param++) {
391 		for (subparam = 0;
392 		    subparam < DCAM1394_NUM_SUBPARAM;
393 		    subparam++) {
394 			if (param_list[param][subparam].flag) {
395 				is_valid =
396 				    softc_p->param_attr[param][subparam] &
397 				    IS_VALID;
398 				is_present =
399 				    softc_p->param_attr[param][subparam] &
400 				    IS_PRESENT;
401 
402 				cap_set = is_ctrl_file ?
403 				    (softc_p->param_attr[param][subparam]
404 				    & CAP_CTRL_SET) :
405 				    (softc_p->param_attr[param][subparam]
406 				    & CAP_SET);
407 
408 				if (is_valid && is_present && cap_set) {
409 					val = param_list[param][subparam].val;
410 
411 					if (dcam1394_param_set(softc_p,
412 					    param, subparam, val)) {
413 
414 					    param_list[param][subparam].err = 1;
415 					    ret_err = 1;
416 					}
417 				} else {
418 					param_list[param][subparam].err = 1;
419 					ret_err = 1;
420 				}
421 			}
422 		}
423 	}
424 
425 	return (ret_err);
426 }
427 
428 
429 /*
430  * dcam1394_param_get
431  */
432 int
dcam1394_param_get(dcam_state_t * softc_p,uint_t param,uint_t subparam,uint_t * val_p)433 dcam1394_param_get(dcam_state_t  *softc_p, uint_t param, uint_t subparam,
434     uint_t *val_p)
435 {
436 	int err;
437 
438 	switch (param) {
439 
440 	case DCAM1394_PARAM_CAP_POWER_CTRL:
441 		err = param_cap_power_ctrl_get(softc_p, val_p);
442 		break;
443 
444 	case DCAM1394_PARAM_CAP_VID_MODE:
445 		err = param_cap_vid_mode_get(softc_p, subparam, val_p);
446 		break;
447 
448 	case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_0:
449 	case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_1:
450 	case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_2:
451 	case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_3:
452 	case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_4:
453 	case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_5:
454 		err = param_cap_frame_rate_get(softc_p, param, subparam, val_p);
455 		break;
456 
457 	case DCAM1394_PARAM_POWER:
458 		err = param_power_get(softc_p, val_p);
459 		break;
460 
461 	case DCAM1394_PARAM_VID_MODE:
462 		err = param_vid_mode_get(softc_p, val_p);
463 		break;
464 
465 	case DCAM1394_PARAM_FRAME_RATE:
466 		err = param_frame_rate_get(softc_p, val_p);
467 		break;
468 
469 	case DCAM1394_PARAM_RING_BUFF_CAPACITY:
470 		err = param_ring_buff_capacity_get(softc_p, val_p);
471 		break;
472 
473 	case DCAM1394_PARAM_RING_BUFF_NUM_FRAMES_READY:
474 		err = param_ring_buff_num_frames_ready_get(softc_p, val_p);
475 		break;
476 
477 	case DCAM1394_PARAM_RING_BUFF_READ_PTR_INCR:
478 		err = param_ring_buff_read_ptr_incr_get(softc_p, val_p);
479 		break;
480 
481 	case DCAM1394_PARAM_FRAME_NUM_BYTES:
482 		err = param_frame_num_bytes_get(softc_p, val_p);
483 		break;
484 
485 	case DCAM1394_PARAM_STATUS:
486 		err = param_status_get(softc_p, val_p);
487 		break;
488 
489 	case DCAM1394_PARAM_BRIGHTNESS:
490 		err = param_brightness_get(softc_p, subparam, val_p);
491 		break;
492 
493 	case DCAM1394_PARAM_EXPOSURE:
494 		err = param_exposure_get(softc_p, subparam, val_p);
495 		break;
496 
497 	case DCAM1394_PARAM_SHARPNESS:
498 		err = param_sharpness_get(softc_p, subparam, val_p);
499 		break;
500 
501 	case DCAM1394_PARAM_WHITE_BALANCE:
502 		err = param_white_balance_get(softc_p, subparam, val_p);
503 		break;
504 
505 	case DCAM1394_PARAM_HUE:
506 		err = param_hue_get(softc_p, subparam, val_p);
507 		break;
508 
509 	case DCAM1394_PARAM_SATURATION:
510 		err = param_saturation_get(softc_p, subparam, val_p);
511 		break;
512 
513 	case DCAM1394_PARAM_GAMMA:
514 		err = param_gamma_get(softc_p, subparam, val_p);
515 		break;
516 
517 	case DCAM1394_PARAM_SHUTTER:
518 		err = param_shutter_get(softc_p, subparam, val_p);
519 		break;
520 
521 	case DCAM1394_PARAM_GAIN:
522 		err = param_gain_get(softc_p, subparam, val_p);
523 		break;
524 
525 	case DCAM1394_PARAM_IRIS:
526 		err = param_iris_get(softc_p, subparam, val_p);
527 		break;
528 
529 	case DCAM1394_PARAM_FOCUS:
530 		err = param_focus_get(softc_p, subparam, val_p);
531 		break;
532 
533 	case DCAM1394_PARAM_ZOOM:
534 		err = param_zoom_get(softc_p, subparam, val_p);
535 		break;
536 
537 	case DCAM1394_PARAM_PAN:
538 		err = param_pan_get(softc_p, subparam, val_p);
539 		break;
540 
541 	case DCAM1394_PARAM_TILT:
542 		err = param_tilt_get(softc_p, subparam, val_p);
543 		break;
544 
545 	default:
546 		err = 1;
547 		break;
548 	}
549 
550 	return (err);
551 }
552 
553 
554 /*
555  * dcam1394_param_set
556  */
557 int
dcam1394_param_set(dcam_state_t * softc_p,uint_t param,uint_t subparam,uint_t val)558 dcam1394_param_set(dcam_state_t *softc_p, uint_t param, uint_t subparam,
559     uint_t val)
560 {
561 	int err;
562 
563 	switch (param) {
564 
565 	case DCAM1394_PARAM_POWER:
566 		err = param_power_set(softc_p, val);
567 		break;
568 
569 	case DCAM1394_PARAM_VID_MODE:
570 		err = param_vid_mode_set(softc_p, val);
571 		break;
572 
573 	case DCAM1394_PARAM_FRAME_RATE:
574 		err = param_frame_rate_set(softc_p, val);
575 		break;
576 
577 	case DCAM1394_PARAM_RING_BUFF_CAPACITY:
578 		err = param_ring_buff_capacity_set(softc_p, val);
579 		break;
580 
581 	case DCAM1394_PARAM_RING_BUFF_READ_PTR_INCR:
582 		err = param_ring_buff_read_ptr_incr_set(softc_p, val);
583 		break;
584 
585 	case DCAM1394_PARAM_BRIGHTNESS:
586 		err = param_brightness_set(softc_p, subparam, val);
587 		break;
588 
589 	case DCAM1394_PARAM_EXPOSURE:
590 		err = param_exposure_set(softc_p, subparam, val);
591 		break;
592 
593 	case DCAM1394_PARAM_SHARPNESS:
594 		err = param_sharpness_set(softc_p, subparam, val);
595 		break;
596 
597 	case DCAM1394_PARAM_WHITE_BALANCE:
598 		err = param_white_balance_set(softc_p, subparam, val);
599 		break;
600 
601 	case DCAM1394_PARAM_HUE:
602 		err = param_hue_set(softc_p, subparam, val);
603 		break;
604 
605 	case DCAM1394_PARAM_SATURATION:
606 		err = param_saturation_set(softc_p, subparam, val);
607 		break;
608 
609 	case DCAM1394_PARAM_GAMMA:
610 		err = param_gamma_set(softc_p, subparam, val);
611 		break;
612 
613 	case DCAM1394_PARAM_SHUTTER:
614 		err = param_shutter_set(softc_p, subparam, val);
615 		break;
616 
617 	case DCAM1394_PARAM_GAIN:
618 		err = param_gain_set(softc_p, subparam, val);
619 		break;
620 
621 	case DCAM1394_PARAM_IRIS:
622 		err = param_iris_set(softc_p, subparam, val);
623 		break;
624 
625 	case DCAM1394_PARAM_FOCUS:
626 		err = param_focus_set(softc_p, subparam, val);
627 		break;
628 
629 	case DCAM1394_PARAM_ZOOM:
630 		err = param_zoom_set(softc_p, subparam, val);
631 		break;
632 
633 	case DCAM1394_PARAM_PAN:
634 		err = param_pan_set(softc_p, subparam, val);
635 		break;
636 
637 	case DCAM1394_PARAM_TILT:
638 		err = param_tilt_set(softc_p, subparam, val);
639 		break;
640 
641 	default:
642 		err = 1;
643 		break;
644 	}
645 
646 	return (err);
647 }
648 
649 
650 /*
651  * feature_get
652  */
653 int
feature_get(dcam_state_t * softc_p,uint_t feature_csr_offs,uint_t feature_elm_inq_reg_offs,uint_t subparam,uint_t * val_p)654 feature_get(dcam_state_t *softc_p, uint_t feature_csr_offs,
655     uint_t feature_elm_inq_reg_offs, uint_t subparam, uint_t *val_p)
656 {
657 	dcam1394_reg_io_t	reg_io;
658 	uint_t			val;
659 
660 	switch (subparam) {
661 
662 	case DCAM1394_SUBPARAM_PRESENCE:
663 	case DCAM1394_SUBPARAM_ON_OFF:
664 	case DCAM1394_SUBPARAM_CTRL_MODE:
665 	case DCAM1394_SUBPARAM_VALUE:
666 	case DCAM1394_SUBPARAM_U_VALUE:
667 	case DCAM1394_SUBPARAM_V_VALUE:
668 		reg_io.offs = feature_csr_offs +
669 		    DCAM1394_REG_OFFS_FEATURE_CSR_BASE;
670 
671 		if (dcam_reg_read(softc_p, &reg_io)) {
672 			return (1);
673 		}
674 
675 		val = feature_csr_val_subparam_extract(subparam, reg_io.val);
676 		break;
677 
678 	case DCAM1394_SUBPARAM_CAP_READ:
679 	case DCAM1394_SUBPARAM_CAP_ON_OFF:
680 	case DCAM1394_SUBPARAM_CAP_CTRL_AUTO:
681 	case DCAM1394_SUBPARAM_CAP_CTRL_MANUAL:
682 	case DCAM1394_SUBPARAM_MIN_VAL:
683 	case DCAM1394_SUBPARAM_MAX_VAL:
684 		reg_io.offs = feature_elm_inq_reg_offs +
685 		    DCAM1394_REG_OFFS_FEATURE_ELM_INQ_BASE;
686 
687 		if (dcam_reg_read(softc_p, &reg_io)) {
688 			return (1);
689 		}
690 
691 		val = feature_elm_inq_reg_val_subparam_extract(subparam,
692 		    reg_io.val);
693 
694 		break;
695 
696 	default:
697 		return (1);
698 	}
699 
700 	*val_p = val;
701 
702 	return (0);
703 }
704 
705 
706 /*
707  * feature_set
708  */
709 int
feature_set(dcam_state_t * softc_p,uint_t feature_csr_offs,uint_t subparam,uint_t val)710 feature_set(dcam_state_t *softc_p, uint_t feature_csr_offs,
711     uint_t subparam, uint_t val)
712 {
713 	dcam1394_reg_io_t  reg_io;
714 
715 	reg_io.offs = feature_csr_offs + DCAM1394_REG_OFFS_FEATURE_CSR_BASE;
716 
717 	if (dcam_reg_read(softc_p, &reg_io)) {
718 		return (1);
719 	}
720 
721 	reg_io.val = feature_csr_val_construct(subparam, val, reg_io.val);
722 
723 	if (dcam_reg_write(softc_p, &reg_io)) {
724 		return (1);
725 	}
726 
727 	return (0);
728 }
729 
730 
731 /*
732  * param_cap_power_ctrl_get
733  */
734 int
param_cap_power_ctrl_get(dcam_state_t * softc_p,uint_t * val_p)735 param_cap_power_ctrl_get(dcam_state_t *softc_p, uint_t *val_p)
736 {
737 	dcam1394_reg_io_t reg_io;
738 
739 	reg_io.offs = DCAM1394_REG_OFFS_BASIC_FUNC_INQ;
740 
741 	if (dcam_reg_read(softc_p, &reg_io)) {
742 		return (1);
743 	}
744 
745 	*val_p = (reg_io.val & DCAM1394_MASK_CAM_POWER_CTRL) >>
746 	    DCAM1394_SHIFT_CAM_POWER_CTRL;
747 
748 	return (0);
749 }
750 
751 
752 /*
753  * param_cap_vid_mode_get
754  * dcam spec: sec 1.2.1.1
755  */
756 int
param_cap_vid_mode_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)757 param_cap_vid_mode_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
758 {
759 	dcam1394_reg_io_t	reg_io;
760 	uint_t			mask, shift, vid_mode;
761 
762 	vid_mode    = subparam - DCAM1394_SUBPARAM_VID_MODE_0;
763 	reg_io.offs = DCAM1394_REG_OFFS_VID_MODE_INQ;
764 
765 	if (dcam_reg_read(softc_p, &reg_io)) {
766 		return (1);
767 	}
768 
769 	mask  = 1 << (31 - vid_mode);
770 	shift = 31 - vid_mode;
771 
772 	*val_p = (reg_io.val & mask) >> shift;
773 
774 	return (0);
775 }
776 
777 
778 /*
779  * param_cap_frame_rate_get()
780  * dcam spec: sec 1.2.2
781  */
782 int
param_cap_frame_rate_get(dcam_state_t * softc_p,uint_t param,uint_t subparam,uint_t * val_p)783 param_cap_frame_rate_get(dcam_state_t *softc_p, uint_t param,
784     uint_t subparam, uint_t *val_p)
785 {
786 	dcam1394_reg_io_t	reg_io;
787 	uint_t			frame_rate, mask, shift, vid_mode;
788 
789 	vid_mode   = param - DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_0;
790 	frame_rate = subparam - DCAM1394_SUBPARAM_FRAME_RATE_0;
791 
792 	reg_io.offs = DCAM1394_REG_OFFS_FRAME_RATE_INQ_BASE + (4 * vid_mode);
793 
794 	if (dcam_reg_read(softc_p, &reg_io)) {
795 		return (1);
796 	}
797 
798 	mask = 1 << (31 - (frame_rate + 1));
799 	shift = 31 - (frame_rate + 1);
800 
801 	*val_p = (reg_io.val & mask) >> shift;
802 
803 	return (0);
804 }
805 
806 
807 /*
808  * param_power_get
809  */
810 int
param_power_get(dcam_state_t * softc_p,uint_t * val_p)811 param_power_get(dcam_state_t *softc_p, uint_t *val_p)
812 {
813 	dcam1394_reg_io_t reg_io;
814 
815 	reg_io.offs = DCAM1394_REG_OFFS_CAMERA_POWER;
816 
817 	if (dcam_reg_read(softc_p, &reg_io)) {
818 		return (1);
819 	}
820 
821 	*val_p = reg_io.val >> DCAM1394_SHIFT_CAMERA_POWER;
822 
823 	return (0);
824 }
825 
826 
827 /*
828  * param_power_set()
829  */
830 int
param_power_set(dcam_state_t * softc_p,uint_t val)831 param_power_set(dcam_state_t *softc_p, uint_t val)
832 {
833 	dcam1394_reg_io_t reg_io;
834 
835 	reg_io.offs = DCAM1394_REG_OFFS_CAMERA_POWER;
836 	reg_io.val = val << DCAM1394_SHIFT_CAMERA_POWER;
837 
838 	if (dcam_reg_write(softc_p, &reg_io)) {
839 		return (1);
840 	}
841 
842 	return (0);
843 }
844 
845 
846 /*
847  * param_vid_mode_get
848  */
849 int
param_vid_mode_get(dcam_state_t * softc_p,uint_t * val_p)850 param_vid_mode_get(dcam_state_t *softc_p, uint_t *val_p)
851 {
852 	dcam1394_reg_io_t  reg_io;
853 
854 	reg_io.offs = DCAM1394_REG_OFFS_CUR_V_MODE;
855 
856 	if (dcam_reg_read(softc_p, &reg_io)) {
857 		return (1);
858 	}
859 
860 	*val_p = reg_io.val >> DCAM1394_SHIFT_CUR_V_MODE;
861 
862 	return (0);
863 }
864 
865 
866 /*
867  * param_vid_mode_set
868  */
869 int
param_vid_mode_set(dcam_state_t * softc_p,uint_t val)870 param_vid_mode_set(dcam_state_t *softc_p, uint_t val)
871 {
872 	dcam1394_reg_io_t	reg_io;
873 	uint_t			vid_mode;
874 
875 	vid_mode = val - DCAM1394_VID_MODE_0;
876 
877 	reg_io.offs = DCAM1394_REG_OFFS_CUR_V_MODE;
878 	reg_io.val  = vid_mode << DCAM1394_SHIFT_CUR_V_MODE;
879 
880 	if (dcam_reg_write(softc_p, &reg_io)) {
881 		return (1);
882 	}
883 
884 	softc_p->cur_vid_mode = val;
885 
886 	/*
887 	 * if we are currently receiving frames, we need to do a restart
888 	 * so that the new vid mode value takes effect
889 	 */
890 	if (softc_p->flags & DCAM1394_FLAG_FRAME_RCV_INIT) {
891 		(void) dcam_frame_rcv_stop(softc_p);
892 		(void) dcam1394_ioctl_frame_rcv_start(softc_p);
893 	}
894 
895 	return (0);
896 }
897 
898 
899 /*
900  * param_frame_rate_get
901  */
902 int
param_frame_rate_get(dcam_state_t * softc_p,uint_t * val_p)903 param_frame_rate_get(dcam_state_t *softc_p, uint_t *val_p)
904 {
905 	dcam1394_reg_io_t	reg_io;
906 	uint_t			frame_rate;
907 
908 	reg_io.offs = DCAM1394_REG_OFFS_CUR_V_FRM_RATE;
909 
910 	if (dcam_reg_read(softc_p, &reg_io)) {
911 		return (1);
912 	}
913 
914 	frame_rate = reg_io.val >> DCAM1394_SHIFT_CUR_V_FRM_RATE;
915 
916 	*val_p = frame_rate - 1 + DCAM1394_FRAME_RATE_0;
917 
918 	return (0);
919 }
920 
921 
922 /*
923  * param_frame_rate_set
924  */
925 int
param_frame_rate_set(dcam_state_t * softc_p,uint_t val)926 param_frame_rate_set(dcam_state_t *softc_p, uint_t val)
927 {
928 	dcam1394_reg_io_t	reg_io;
929 	uint_t			frame_rate;
930 
931 	/* if we are currently receiving frames, stop the camera */
932 	if (softc_p->flags & DCAM1394_FLAG_FRAME_RCV_INIT) {
933 		(void) dcam_frame_rcv_stop(softc_p);
934 
935 		frame_rate = val - DCAM1394_FRAME_RATE_0 + 1;
936 
937 		reg_io.offs = DCAM1394_REG_OFFS_CUR_V_FRM_RATE;
938 		reg_io.val  = frame_rate << DCAM1394_SHIFT_CUR_V_FRM_RATE;
939 
940 		if (dcam_reg_write(softc_p, &reg_io)) {
941 			return (1);
942 		}
943 
944 		/*
945 		 * Update the state info.
946 		 * note: the driver maintains frame rate in an array
947 		 * whereas the the camera uses predefined values whose
948 		 * lowest frame rate starts at 6
949 		 */
950 		softc_p->cur_frame_rate = val - 6;
951 
952 		/* restart the camera */
953 		(void) dcam1394_ioctl_frame_rcv_start(softc_p);
954 	} else {
955 		frame_rate = val - DCAM1394_FRAME_RATE_0 + 1;
956 
957 		reg_io.offs = DCAM1394_REG_OFFS_CUR_V_FRM_RATE;
958 		reg_io.val  = frame_rate << DCAM1394_SHIFT_CUR_V_FRM_RATE;
959 
960 		if (dcam_reg_write(softc_p, &reg_io)) {
961 			return (1);
962 		}
963 
964 		/* see note above re skewing of value by 6 */
965 		softc_p->cur_frame_rate = val - 6;
966 	}
967 
968 	return (0);
969 }
970 
971 
972 /*
973  * param_ring_buff_capacity_get()
974  */
975 int
param_ring_buff_capacity_get(dcam_state_t * softc_p,uint_t * val_p)976 param_ring_buff_capacity_get(dcam_state_t *softc_p, uint_t *val_p)
977 {
978 	*val_p = softc_p->cur_ring_buff_capacity;
979 
980 	return (0);
981 }
982 
983 
984 /*
985  * param_ring_buff_capacity_set
986  */
987 int
param_ring_buff_capacity_set(dcam_state_t * softc_p,uint_t val)988 param_ring_buff_capacity_set(dcam_state_t *softc_p, uint_t val)
989 {
990 	/* bounds check */
991 	if ((val < 2) || (val > 30)) {
992 		return (1);
993 	}
994 
995 	/* update our state info */
996 	softc_p->cur_ring_buff_capacity = val;
997 
998 
999 	/*
1000 	 * if we are currently receiving frames, we need to do a restart
1001 	 * so that the new buff_capacity value takes effect
1002 	 */
1003 	if (softc_p->flags & DCAM1394_FLAG_FRAME_RCV_INIT) {
1004 		(void) dcam_frame_rcv_stop(softc_p);
1005 		(void) dcam1394_ioctl_frame_rcv_start(softc_p);
1006 	}
1007 	return (0);
1008 }
1009 
1010 
1011 /*
1012  * param_ring_buff_num_frames_ready_get()
1013  */
1014 int
param_ring_buff_num_frames_ready_get(dcam_state_t * softc_p,uint_t * val_p)1015 param_ring_buff_num_frames_ready_get(dcam_state_t *softc_p, uint_t *val_p)
1016 {
1017 	size_t read_pos, write_pos;
1018 
1019 	/*
1020 	 * note: currently we support only one read_ptr_id, so the
1021 	 * following logic will work. If multiple read_ptr_id's are
1022 	 * supported, this function call will need to receive a
1023 	 * read_ptr_id
1024 	 */
1025 
1026 	if (softc_p->ring_buff_p == NULL) {
1027 		return (1);
1028 	}
1029 
1030 	mutex_enter(&softc_p->dcam_frame_is_done_mutex);
1031 
1032 	read_pos  = ring_buff_read_ptr_pos_get(softc_p->ring_buff_p, 0);
1033 	write_pos = ring_buff_write_ptr_pos_get(softc_p->ring_buff_p);
1034 
1035 	if (read_pos < write_pos) {
1036 		*val_p = write_pos - read_pos;
1037 	} else {
1038 		*val_p = (softc_p->ring_buff_p->num_buffs + write_pos) -
1039 		    read_pos;
1040 	}
1041 
1042 	mutex_exit(&softc_p->dcam_frame_is_done_mutex);
1043 
1044 	return (0);
1045 }
1046 
1047 
1048 /*
1049  * param_ring_buff_read_ptr_incr_get()
1050  */
1051 
1052 int
param_ring_buff_read_ptr_incr_get(dcam_state_t * softc_p,uint_t * val_p)1053 param_ring_buff_read_ptr_incr_get(dcam_state_t *softc_p, uint_t *val_p)
1054 {
1055 	if (softc_p->ring_buff_p == NULL) {
1056 		return (1);
1057 	}
1058 
1059 	*val_p = softc_p->ring_buff_p->read_ptr_incr_val;
1060 
1061 	return (0);
1062 }
1063 
1064 
1065 /*
1066  * param_ring_buff_read_ptr_incr_set
1067  */
1068 int
param_ring_buff_read_ptr_incr_set(dcam_state_t * softc_p,uint_t val)1069 param_ring_buff_read_ptr_incr_set(dcam_state_t *softc_p, uint_t val)
1070 {
1071 	if (softc_p->ring_buff_p == NULL) {
1072 		return (1);
1073 	}
1074 
1075 	softc_p->ring_buff_p->read_ptr_incr_val = val;
1076 
1077 	return (0);
1078 }
1079 
1080 
1081 /*
1082  * param_frame_num_bytes_get
1083  */
1084 int
param_frame_num_bytes_get(dcam_state_t * softc_p,uint_t * val_p)1085 param_frame_num_bytes_get(dcam_state_t *softc_p, uint_t *val_p)
1086 {
1087 	if (softc_p == NULL) {
1088 		return (1);
1089 	}
1090 
1091 	*val_p = g_frame_num_bytes[softc_p->cur_vid_mode];
1092 
1093 	return (0);
1094 }
1095 
1096 
1097 /*
1098  * param_status_get()
1099  */
1100 
1101 int
param_status_get(dcam_state_t * softc_p,uint_t * val_p)1102 param_status_get(dcam_state_t *softc_p, uint_t *val_p)
1103 {
1104 	mutex_enter(&softc_p->dcam_frame_is_done_mutex);
1105 
1106 	*val_p = softc_p->param_status;
1107 	softc_p->param_status = 0;
1108 
1109 	mutex_exit(&softc_p->dcam_frame_is_done_mutex);
1110 
1111 	return (0);
1112 }
1113 
1114 
1115 /*
1116  * param_brightness_get
1117  */
1118 int
param_brightness_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1119 param_brightness_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1120 {
1121 	int	ret_val;
1122 	uint_t	feature_csr_offs;
1123 	uint_t	feature_elm_inq_reg_offs;
1124 
1125 	feature_csr_offs = DCAM1394_REG_OFFS_BRIGHTNESS_CSR;
1126 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_BRIGHTNESS_INQ;
1127 
1128 	ret_val = feature_get(softc_p, feature_csr_offs,
1129 	    feature_elm_inq_reg_offs, subparam, val_p);
1130 
1131 	return (ret_val);
1132 }
1133 
1134 
1135 /*
1136  * param_brightness_set()
1137  */
1138 int
param_brightness_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1139 param_brightness_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1140 {
1141 	int	ret_val;
1142 	uint_t feature_csr_offs;
1143 
1144 	feature_csr_offs = DCAM1394_REG_OFFS_BRIGHTNESS_CSR;
1145 
1146 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1147 
1148 	return (ret_val);
1149 }
1150 
1151 
1152 /*
1153  * param_exposure_get
1154  */
1155 int
param_exposure_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1156 param_exposure_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1157 {
1158 	int	ret_val;
1159 	uint_t	feature_csr_offs;
1160 	uint_t	feature_elm_inq_reg_offs;
1161 
1162 	feature_csr_offs = DCAM1394_REG_OFFS_EXPOSURE_CSR;
1163 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_EXPOSURE_INQ;
1164 
1165 	ret_val = feature_get(softc_p, feature_csr_offs,
1166 	    feature_elm_inq_reg_offs, subparam, val_p);
1167 
1168 	return (ret_val);
1169 }
1170 
1171 
1172 /*
1173  * param_exposure_set
1174  */
1175 int
param_exposure_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1176 param_exposure_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1177 {
1178 	int	ret_val;
1179 	uint_t	feature_csr_offs;
1180 
1181 	feature_csr_offs = DCAM1394_REG_OFFS_EXPOSURE_CSR;
1182 
1183 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1184 
1185 	return (ret_val);
1186 }
1187 
1188 
1189 /*
1190  * param_sharpness_get
1191  */
1192 int
param_sharpness_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1193 param_sharpness_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1194 {
1195 	int	ret_val;
1196 	uint_t	feature_csr_offs;
1197 	uint_t	feature_elm_inq_reg_offs;
1198 
1199 	feature_csr_offs = DCAM1394_REG_OFFS_SHARPNESS_CSR;
1200 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_SHARPNESS_INQ;
1201 
1202 	ret_val = feature_get(softc_p, feature_csr_offs,
1203 	    feature_elm_inq_reg_offs, subparam, val_p);
1204 
1205 	return (ret_val);
1206 }
1207 
1208 
1209 /*
1210  * param_sharpness_set
1211  */
1212 int
param_sharpness_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1213 param_sharpness_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1214 {
1215 	int	ret_val;
1216 	uint_t	feature_csr_offs;
1217 
1218 	feature_csr_offs = DCAM1394_REG_OFFS_SHARPNESS_CSR;
1219 
1220 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1221 
1222 	return (ret_val);
1223 }
1224 
1225 
1226 /*
1227  * param_white_balance_get
1228  */
1229 int
param_white_balance_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1230 param_white_balance_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1231 {
1232 	int	ret_val;
1233 	uint_t	feature_csr_offs;
1234 	uint_t	feature_elm_inq_reg_offs;
1235 
1236 	feature_csr_offs = DCAM1394_REG_OFFS_WHITE_BALANCE_CSR;
1237 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_WHITE_BALANCE_INQ;
1238 
1239 	ret_val = feature_get(softc_p, feature_csr_offs,
1240 	    feature_elm_inq_reg_offs, subparam, val_p);
1241 
1242 	return (ret_val);
1243 }
1244 
1245 
1246 /*
1247  * param_white_balance_set
1248  */
1249 int
param_white_balance_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1250 param_white_balance_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1251 {
1252 	int	ret_val;
1253 	uint_t	feature_csr_offs;
1254 
1255 	feature_csr_offs = DCAM1394_REG_OFFS_WHITE_BALANCE_CSR;
1256 
1257 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1258 
1259 	return (ret_val);
1260 }
1261 
1262 
1263 /*
1264  * param_hue_get
1265  */
1266 int
param_hue_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1267 param_hue_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1268 {
1269 	int	ret_val;
1270 	uint_t	feature_csr_offs;
1271 	uint_t	feature_elm_inq_reg_offs;
1272 
1273 	feature_csr_offs = DCAM1394_REG_OFFS_HUE_CSR;
1274 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_HUE_INQ;
1275 
1276 	ret_val = feature_get(softc_p, feature_csr_offs,
1277 	    feature_elm_inq_reg_offs, subparam, val_p);
1278 
1279 	return (ret_val);
1280 }
1281 
1282 
1283 /*
1284  * param_hue_set
1285  */
1286 int
param_hue_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1287 param_hue_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1288 {
1289 	int	ret_val;
1290 	uint_t	feature_csr_offs;
1291 
1292 	feature_csr_offs = DCAM1394_REG_OFFS_HUE_CSR;
1293 
1294 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1295 
1296 	return (ret_val);
1297 }
1298 
1299 
1300 /*
1301  * param_saturation_get
1302  */
1303 int
param_saturation_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1304 param_saturation_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1305 {
1306 	int	ret_val;
1307 	uint_t	feature_csr_offs;
1308 	uint_t	feature_elm_inq_reg_offs;
1309 
1310 	feature_csr_offs = DCAM1394_REG_OFFS_SATURATION_CSR;
1311 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_SATURATION_INQ;
1312 
1313 	ret_val = feature_get(softc_p, feature_csr_offs,
1314 	    feature_elm_inq_reg_offs, subparam, val_p);
1315 
1316 	return (ret_val);
1317 }
1318 
1319 
1320 /*
1321  * param_saturation_set
1322  */
1323 int
param_saturation_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1324 param_saturation_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1325 {
1326 	int	ret_val;
1327 	uint_t	feature_csr_offs;
1328 
1329 	feature_csr_offs = DCAM1394_REG_OFFS_SATURATION_CSR;
1330 
1331 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1332 
1333 	return (ret_val);
1334 }
1335 
1336 
1337 /*
1338  * param_gamma_get
1339  */
1340 int
param_gamma_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1341 param_gamma_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1342 {
1343 	int	ret_val;
1344 	uint_t	feature_csr_offs;
1345 	uint_t	feature_elm_inq_reg_offs;
1346 
1347 	feature_csr_offs = DCAM1394_REG_OFFS_GAMMA_CSR;
1348 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_GAMMA_INQ;
1349 
1350 	ret_val = feature_get(softc_p, feature_csr_offs,
1351 	    feature_elm_inq_reg_offs, subparam, val_p);
1352 
1353 	return (ret_val);
1354 }
1355 
1356 
1357 /*
1358  * param_gamma_set
1359  */
1360 int
param_gamma_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1361 param_gamma_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1362 {
1363 	int	ret_val;
1364 	uint_t	feature_csr_offs;
1365 
1366 	feature_csr_offs = DCAM1394_REG_OFFS_GAMMA_CSR;
1367 
1368 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1369 
1370 	return (ret_val);
1371 }
1372 
1373 
1374 /*
1375  * param_shutter_get
1376  */
1377 int
param_shutter_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1378 param_shutter_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1379 {
1380 	int	ret_val;
1381 	uint_t	feature_csr_offs;
1382 	uint_t	feature_elm_inq_reg_offs;
1383 
1384 	feature_csr_offs = DCAM1394_REG_OFFS_SHUTTER_CSR;
1385 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_SHUTTER_INQ;
1386 
1387 	ret_val = feature_get(softc_p, feature_csr_offs,
1388 	    feature_elm_inq_reg_offs, subparam, val_p);
1389 
1390 	return (ret_val);
1391 }
1392 
1393 
1394 /*
1395  * param_shutter_set
1396  */
1397 int
param_shutter_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1398 param_shutter_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1399 {
1400 	int	ret_val;
1401 	uint_t	feature_csr_offs;
1402 
1403 	feature_csr_offs = DCAM1394_REG_OFFS_SHUTTER_CSR;
1404 
1405 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1406 
1407 	return (ret_val);
1408 }
1409 
1410 
1411 /*
1412  * param_gain_get
1413  */
1414 int
param_gain_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1415 param_gain_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1416 {
1417 	int	ret_val;
1418 	uint_t	feature_csr_offs;
1419 	uint_t	feature_elm_inq_reg_offs;
1420 
1421 	feature_csr_offs = DCAM1394_REG_OFFS_GAIN_CSR;
1422 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_GAIN_INQ;
1423 
1424 	ret_val = feature_get(softc_p, feature_csr_offs,
1425 	    feature_elm_inq_reg_offs, subparam, val_p);
1426 
1427 	return (ret_val);
1428 }
1429 
1430 
1431 /*
1432  * param_gain_set
1433  */
1434 int
param_gain_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1435 param_gain_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1436 {
1437 	int	ret_val;
1438 	uint_t	feature_csr_offs;
1439 
1440 	feature_csr_offs = DCAM1394_REG_OFFS_GAIN_CSR;
1441 
1442 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1443 
1444 	return (ret_val);
1445 }
1446 
1447 
1448 /*
1449  * param_iris_get
1450  */
1451 int
param_iris_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1452 param_iris_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1453 {
1454 	int	ret_val;
1455 	uint_t	feature_csr_offs;
1456 	uint_t	feature_elm_inq_reg_offs;
1457 
1458 	feature_csr_offs = DCAM1394_REG_OFFS_IRIS_CSR;
1459 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_IRIS_INQ;
1460 
1461 	ret_val = feature_get(softc_p, feature_csr_offs,
1462 	    feature_elm_inq_reg_offs, subparam, val_p);
1463 
1464 	switch (subparam) {
1465 		case DCAM1394_SUBPARAM_PRESENCE:
1466 			*val_p = 0;
1467 			break;
1468 		case DCAM1394_SUBPARAM_ON_OFF:
1469 			*val_p = 1;
1470 			break;
1471 		case DCAM1394_SUBPARAM_MIN_VAL:
1472 		case DCAM1394_SUBPARAM_MAX_VAL:
1473 		case DCAM1394_SUBPARAM_VALUE:
1474 			*val_p = 4;
1475 			break;
1476 		default:
1477 			break;
1478 	}
1479 
1480 	return (ret_val);
1481 }
1482 
1483 
1484 /*
1485  * param_iris_set
1486  */
1487 int
param_iris_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1488 param_iris_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1489 {
1490 	int	ret_val;
1491 	uint_t	feature_csr_offs;
1492 
1493 	feature_csr_offs = DCAM1394_REG_OFFS_IRIS_CSR;
1494 
1495 	if (subparam == DCAM1394_SUBPARAM_ON_OFF) {
1496 		val = 1;
1497 	} else if (subparam == DCAM1394_SUBPARAM_VALUE) {
1498 		val = 4;
1499 	}
1500 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1501 
1502 	return (ret_val);
1503 }
1504 
1505 
1506 /*
1507  * param_focus_get
1508  */
1509 int
param_focus_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1510 param_focus_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1511 {
1512 	int	ret_val;
1513 	uint_t	feature_csr_offs;
1514 	uint_t	feature_elm_inq_reg_offs;
1515 
1516 	feature_csr_offs = DCAM1394_REG_OFFS_FOCUS_CSR;
1517 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_FOCUS_INQ;
1518 
1519 	ret_val = feature_get(softc_p, feature_csr_offs,
1520 	    feature_elm_inq_reg_offs, subparam, val_p);
1521 
1522 	return (ret_val);
1523 }
1524 
1525 
1526 /*
1527  * param_focus_set
1528  */
1529 int
param_focus_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1530 param_focus_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1531 {
1532 	int	ret_val;
1533 	uint_t	feature_csr_offs;
1534 
1535 	feature_csr_offs = DCAM1394_REG_OFFS_FOCUS_CSR;
1536 
1537 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1538 
1539 	return (ret_val);
1540 }
1541 
1542 
1543 /*
1544  * param_zoom_get
1545  */
1546 int
param_zoom_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1547 param_zoom_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1548 {
1549 	int	ret_val;
1550 	uint_t	feature_csr_offs;
1551 	uint_t	feature_elm_inq_reg_offs;
1552 
1553 	feature_csr_offs = DCAM1394_REG_OFFS_ZOOM_CSR;
1554 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_ZOOM_INQ;
1555 
1556 	ret_val = feature_get(softc_p, feature_csr_offs,
1557 	    feature_elm_inq_reg_offs, subparam, val_p);
1558 
1559 	return (ret_val);
1560 }
1561 
1562 
1563 /*
1564  * param_zoom_set
1565  */
1566 int
param_zoom_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1567 param_zoom_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1568 {
1569 	int	ret_val;
1570 	uint_t	feature_csr_offs;
1571 
1572 	feature_csr_offs = DCAM1394_REG_OFFS_ZOOM_CSR;
1573 
1574 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1575 
1576 	return (ret_val);
1577 }
1578 
1579 
1580 /*
1581  * param_pan_get
1582  */
1583 int
param_pan_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1584 param_pan_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1585 {
1586 	int	ret_val;
1587 	uint_t	feature_csr_offs;
1588 	uint_t	feature_elm_inq_reg_offs;
1589 
1590 	feature_csr_offs = DCAM1394_REG_OFFS_PAN_CSR;
1591 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_PAN_INQ;
1592 
1593 	ret_val = feature_get(softc_p, feature_csr_offs,
1594 	    feature_elm_inq_reg_offs, subparam, val_p);
1595 
1596 	return (ret_val);
1597 }
1598 
1599 
1600 /*
1601  * param_pan_set
1602  */
1603 int
param_pan_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1604 param_pan_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1605 {
1606 	int	ret_val;
1607 	uint_t	feature_csr_offs;
1608 
1609 	feature_csr_offs = DCAM1394_REG_OFFS_PAN_CSR;
1610 
1611 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1612 
1613 	return (ret_val);
1614 }
1615 
1616 
1617 /*
1618  * param_tilt_get
1619  */
1620 int
param_tilt_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)1621 param_tilt_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p)
1622 {
1623 	int	ret_val;
1624 	uint_t	feature_csr_offs;
1625 	uint_t	feature_elm_inq_reg_offs;
1626 
1627 	feature_csr_offs = DCAM1394_REG_OFFS_TILT_CSR;
1628 	feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_TILT_INQ;
1629 
1630 	ret_val = feature_get(softc_p, feature_csr_offs,
1631 	    feature_elm_inq_reg_offs, subparam, val_p);
1632 
1633 	return (ret_val);
1634 }
1635 
1636 
1637 /*
1638  * param_tilt_set
1639  */
1640 int
param_tilt_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)1641 param_tilt_set(dcam_state_t *softc_p, uint_t subparam, uint_t val)
1642 {
1643 	int	ret_val;
1644 	uint_t	feature_csr_offs;
1645 
1646 	feature_csr_offs = DCAM1394_REG_OFFS_TILT_CSR;
1647 
1648 	ret_val = feature_set(softc_p, feature_csr_offs, subparam, val);
1649 
1650 	return (ret_val);
1651 }
1652 
1653 
1654 /*
1655  * feature_csr_val_construct
1656  */
1657 static uint_t
feature_csr_val_construct(uint_t subparam,uint_t param_val,uint_t init_val)1658 feature_csr_val_construct(uint_t subparam, uint_t param_val, uint_t init_val)
1659 {
1660 	uint_t ret_val;
1661 
1662 	switch (subparam) {
1663 
1664 	case DCAM1394_SUBPARAM_ON_OFF:
1665 		ret_val = (init_val & ~(DCAM1394_MASK_ON_OFF)) |
1666 		    (param_val << DCAM1394_SHIFT_ON_OFF);
1667 		break;
1668 
1669 	case DCAM1394_SUBPARAM_CTRL_MODE:
1670 		ret_val = (init_val & ~(DCAM1394_MASK_A_M_MODE)) |
1671 		    (param_val << DCAM1394_SHIFT_A_M_MODE);
1672 		break;
1673 
1674 	case DCAM1394_SUBPARAM_VALUE:
1675 		ret_val = (init_val & ~(DCAM1394_MASK_VALUE)) |
1676 		    (param_val << DCAM1394_SHIFT_VALUE);
1677 		break;
1678 
1679 	case DCAM1394_SUBPARAM_U_VALUE:
1680 		ret_val = (init_val & ~(DCAM1394_MASK_U_VALUE)) |
1681 		    (param_val << DCAM1394_SHIFT_U_VALUE);
1682 		break;
1683 
1684 	case DCAM1394_SUBPARAM_V_VALUE:
1685 		ret_val = (init_val & ~(DCAM1394_MASK_V_VALUE)) |
1686 		    (param_val << DCAM1394_SHIFT_V_VALUE);
1687 		break;
1688 
1689 	default:
1690 		break;
1691 
1692 	}
1693 
1694 	return (ret_val);
1695 }
1696 
1697 
1698 /*
1699  * feature_csr_val_subparam_extract
1700  */
1701 static uint_t
feature_csr_val_subparam_extract(uint_t subparam,uint_t reg_val)1702 feature_csr_val_subparam_extract(uint_t subparam, uint_t reg_val)
1703 {
1704 	uint_t ret_val;
1705 
1706 	switch (subparam) {
1707 
1708 	case DCAM1394_SUBPARAM_PRESENCE:
1709 		ret_val = (reg_val & DCAM1394_MASK_PRESENCE_INQ) >>
1710 		    DCAM1394_SHIFT_PRESENCE_INQ;
1711 		break;
1712 
1713 	case DCAM1394_SUBPARAM_ON_OFF:
1714 		ret_val = (reg_val & DCAM1394_MASK_ON_OFF) >>
1715 		    DCAM1394_SHIFT_ON_OFF;
1716 		break;
1717 
1718 	case DCAM1394_SUBPARAM_CTRL_MODE:
1719 		ret_val = (reg_val & DCAM1394_MASK_A_M_MODE) >>
1720 		    DCAM1394_SHIFT_A_M_MODE;
1721 		break;
1722 
1723 	case DCAM1394_SUBPARAM_VALUE:
1724 		ret_val = (reg_val & DCAM1394_MASK_VALUE) >>
1725 		    DCAM1394_SHIFT_VALUE;
1726 		break;
1727 
1728 	case DCAM1394_SUBPARAM_U_VALUE:
1729 		ret_val = (reg_val & DCAM1394_MASK_U_VALUE) >>
1730 		    DCAM1394_SHIFT_U_VALUE;
1731 		break;
1732 
1733 	case DCAM1394_SUBPARAM_V_VALUE:
1734 
1735 		ret_val = (reg_val & DCAM1394_MASK_V_VALUE) >>
1736 		    DCAM1394_SHIFT_V_VALUE;
1737 		break;
1738 
1739 	default:
1740 
1741 		ret_val = 0;
1742 
1743 		break;
1744 
1745 	}
1746 
1747 	return (ret_val);
1748 
1749 }
1750 
1751 
1752 /*
1753  * feature_elm_inq_reg_val_subparam_extract
1754  */
1755 static uint_t
feature_elm_inq_reg_val_subparam_extract(uint_t subparam,uint_t reg_val)1756 feature_elm_inq_reg_val_subparam_extract(uint_t subparam,
1757     uint_t reg_val)
1758 {
1759 	uint_t ret_val;
1760 
1761 	switch (subparam) {
1762 
1763 	case DCAM1394_SUBPARAM_CAP_READ:
1764 		ret_val = (reg_val & DCAM1394_MASK_READOUT_INQ) >>
1765 		    DCAM1394_SHIFT_READOUT_INQ;
1766 		break;
1767 
1768 	case DCAM1394_SUBPARAM_CAP_ON_OFF:
1769 		ret_val = (reg_val & DCAM1394_MASK_ON_OFF_INQ) >>
1770 		    DCAM1394_SHIFT_ON_OFF_INQ;
1771 		break;
1772 
1773 	case DCAM1394_SUBPARAM_CAP_CTRL_AUTO:
1774 		ret_val = (reg_val & DCAM1394_MASK_AUTO_INQ) >>
1775 		    DCAM1394_SHIFT_AUTO_INQ;
1776 		break;
1777 
1778 	case DCAM1394_SUBPARAM_CAP_CTRL_MANUAL:
1779 		ret_val = (reg_val & DCAM1394_MASK_MANUAL_INQ) >>
1780 		    DCAM1394_SHIFT_MANUAL_INQ;
1781 		break;
1782 
1783 	case DCAM1394_SUBPARAM_MIN_VAL:
1784 		ret_val = (reg_val & DCAM1394_MASK_MIN_VAL) >>
1785 		    DCAM1394_SHIFT_MIN_VAL;
1786 		break;
1787 
1788 	case DCAM1394_SUBPARAM_MAX_VAL:
1789 		ret_val = (reg_val & DCAM1394_MASK_MAX_VAL) >>
1790 		    DCAM1394_SHIFT_MAX_VAL;
1791 		break;
1792 
1793 	default:
1794 		ret_val = 0;
1795 		break;
1796 
1797 	}
1798 
1799 	return (ret_val);
1800 }
1801