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.
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/errno.hlinux/kernel.hlinux/videodev2.hmedia/v4l2-event.hmedia/v4l2-common.hvivid-core.hvivid-vid-cap.hvivid-vid-out.hvivid-vid-common.hvivid-radio-common.hvivid-osd.hvivid-ctrls.h
Detected Declarations
function vivid_unregister_devfunction vivid_user_gen_s_ctrlfunction vivid_fb_s_ctrlfunction vivid_user_vid_g_volatile_ctrlfunction vivid_user_vid_s_ctrlfunction vivid_update_power_presentfunction vivid_vid_cap_s_ctrlfunction vivid_vbi_cap_s_ctrlfunction vivid_vid_out_s_ctrlfunction vivid_streaming_s_ctrlfunction vivid_sdtv_cap_s_ctrlfunction vivid_radio_rx_s_ctrlfunction vivid_radio_tx_s_ctrlfunction vivid_sdr_cap_s_ctrlfunction vivid_meta_cap_s_ctrlfunction vivid_create_controlsfunction vivid_free_controls
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
- Immediate include surface: `linux/errno.h`, `linux/kernel.h`, `linux/videodev2.h`, `media/v4l2-event.h`, `media/v4l2-common.h`, `vivid-core.h`, `vivid-vid-cap.h`, `vivid-vid-out.h`.
- Detected declarations: `function vivid_unregister_dev`, `function vivid_user_gen_s_ctrl`, `function vivid_fb_s_ctrl`, `function vivid_user_vid_g_volatile_ctrl`, `function vivid_user_vid_s_ctrl`, `function vivid_update_power_present`, `function vivid_vid_cap_s_ctrl`, `function vivid_vbi_cap_s_ctrl`, `function vivid_vid_out_s_ctrl`, `function vivid_streaming_s_ctrl`.
- Atlas domain: Driver Families / drivers/media.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.