drivers/media/test-drivers/vivid/vivid-ctrls.c

Source file repositories/reference/linux-study-clean/drivers/media/test-drivers/vivid/vivid-ctrls.c

File Facts

System
Linux kernel
Corpus path
drivers/media/test-drivers/vivid/vivid-ctrls.c
Extension
.c
Size
67363 bytes
Lines
2121
Domain
Driver Families
Bucket
drivers/media
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (output_inst) {
			output_inst->output_to_input_instance[index] = NULL;
			vivid_update_outputs(output_inst);
			cec_phys_addr_invalidate(output_inst->cec_tx_adap[index]);
		}
		if (ctrl->val >= FIXED_MENU_ITEMS) {
			output_inst = vivid_ctrl_hdmi_to_output_instance[ctrl->val];
			index = vivid_ctrl_hdmi_to_output_index[ctrl->val];
			output_inst->output_to_input_instance[index] = dev;
			output_inst->output_to_input_index[index] =
				dev->hdmi_index_to_input_index[hdmi_index];
		}
		spin_lock(&hdmi_output_skip_mask_lock);
		hdmi_to_output_menu_skip_mask &= ~(1ULL << ctrl->cur.val);
		if (ctrl->val >= FIXED_MENU_ITEMS)
			hdmi_to_output_menu_skip_mask |= 1ULL << ctrl->val;
		spin_unlock(&hdmi_output_skip_mask_lock);
		vivid_update_power_present(dev);
		vivid_update_quality(dev);
		vivid_send_input_source_change(dev, dev->hdmi_index_to_input_index[hdmi_index]);
		if (ctrl->val < FIXED_MENU_ITEMS && ctrl->cur.val < FIXED_MENU_ITEMS)
			break;
		spin_lock(&hdmi_output_skip_mask_lock);
		hdmi_input_update_outputs_mask |= 1 << dev->inst;
		spin_unlock(&hdmi_output_skip_mask_lock);
		queue_work(update_hdmi_ctrls_workqueue, &dev->update_hdmi_ctrl_work);
		break;
	case VIVID_CID_SVID_IS_CONNECTED_TO_OUTPUT(0) ... VIVID_CID_SVID_IS_CONNECTED_TO_OUTPUT(15):
		svid_index = ctrl->id - VIVID_CID_SVID_IS_CONNECTED_TO_OUTPUT(0);
		output_inst = vivid_ctrl_svid_to_output_instance[ctrl->cur.val];
		index = vivid_ctrl_svid_to_output_index[ctrl->cur.val];
		input_index = dev->svid_index_to_input_index[svid_index];
		dev->input_is_connected_to_output[input_index] = ctrl->val;

		if (output_inst)
			output_inst->output_to_input_instance[index] = NULL;
		if (ctrl->val >= FIXED_MENU_ITEMS) {
			output_inst = vivid_ctrl_svid_to_output_instance[ctrl->val];
			index = vivid_ctrl_svid_to_output_index[ctrl->val];
			output_inst->output_to_input_instance[index] = dev;
			output_inst->output_to_input_index[index] =
				dev->svid_index_to_input_index[svid_index];
		}
		spin_lock(&svid_output_skip_mask_lock);
		svid_to_output_menu_skip_mask &= ~(1ULL << ctrl->cur.val);
		if (ctrl->val >= FIXED_MENU_ITEMS)
			svid_to_output_menu_skip_mask |= 1ULL << ctrl->val;
		spin_unlock(&svid_output_skip_mask_lock);
		vivid_update_quality(dev);
		vivid_send_input_source_change(dev, dev->svid_index_to_input_index[svid_index]);
		if (ctrl->val < FIXED_MENU_ITEMS && ctrl->cur.val < FIXED_MENU_ITEMS)
			break;
		queue_work(update_svid_ctrls_workqueue, &dev->update_svid_ctrl_work);
		break;
	}
	return 0;
}

static const struct v4l2_ctrl_ops vivid_vid_cap_ctrl_ops = {
	.s_ctrl = vivid_vid_cap_s_ctrl,
};

static const char * const vivid_ctrl_hor_movement_strings[] = {
	"Move Left Fast",
	"Move Left",
	"Move Left Slow",
	"No Movement",
	"Move Right Slow",
	"Move Right",
	"Move Right Fast",
	NULL,
};

static const struct v4l2_ctrl_config vivid_ctrl_hor_movement = {
	.ops = &vivid_vid_cap_ctrl_ops,
	.id = VIVID_CID_HOR_MOVEMENT,
	.name = "Horizontal Movement",
	.type = V4L2_CTRL_TYPE_MENU,
	.max = TPG_MOVE_POS_FAST,
	.def = TPG_MOVE_NONE,
	.qmenu = vivid_ctrl_hor_movement_strings,
};

static const char * const vivid_ctrl_vert_movement_strings[] = {
	"Move Up Fast",
	"Move Up",
	"Move Up Slow",
	"No Movement",
	"Move Down Slow",
	"Move Down",

Annotation

Implementation Notes