drivers/media/platform/amd/isp4/isp4_subdev.c
Source file repositories/reference/linux-study-clean/drivers/media/platform/amd/isp4/isp4_subdev.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/platform/amd/isp4/isp4_subdev.c- Extension
.c- Size
- 29750 bytes
- Lines
- 1048
- 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/pm_domain.hlinux/units.hisp4.hisp4_debug.hisp4_fw_cmd_resp.hisp4_interface.h
Detected Declarations
function isp4sd_module_enablefunction isp4sd_setup_fw_mem_poolfunction isp4sd_set_stream_pathfunction isp4sd_send_meta_buffunction isp4sd_get_str_out_propfunction isp4sd_kickoff_streamfunction isp4sd_setup_outputfunction isp4sd_init_streamfunction isp4sd_uninit_streamfunction isp4sd_fw_resp_cmd_donefunction isp4sd_get_meta_by_mcfunction isp4sd_send_meta_infofunction isp4sd_fw_resp_frame_donefunction isp4sd_fw_resp_funcfunction isp4sd_fw_resp_threadfunction isp4sd_stop_resp_proc_threadsfunction isp4sd_start_resp_proc_threadsfunction isp4sd_pwroff_and_deinitfunction isp4sd_pwron_and_initfunction isp4sd_stop_streamfunction isp4sd_start_streamfunction isp4sd_ioc_send_img_buffunction isp4sd_set_pad_formatfunction isp4sd_enable_streamsfunction isp4sd_disable_streamsfunction isp4sd_initfunction isp4sd_deinit
Annotated Snippet
if (!meta_info_buf) {
dev_err(dev, "fail for no meta info buf(%u)\n", i);
return -ENOMEM;
}
buf_type.buffer_type = ISP4FW_BUFFER_TYPE_META_INFO;
buf_type.buffer.vmid_space.bit.space =
ISP4FW_ADDR_SPACE_TYPE_GPU_VA;
isp4if_split_addr64(meta_info_buf->gpu_mc_addr,
&buf_type.buffer.buf_base_a_lo,
&buf_type.buffer.buf_base_a_hi);
buf_type.buffer.buf_size_a = meta_info_buf->mem_size;
ret = isp4if_send_command(ispif, ISP4FW_CMD_ID_SEND_BUFFER,
&buf_type, sizeof(buf_type));
if (ret) {
dev_err(dev, "send meta info(%u) fail\n", i);
return ret;
}
}
dev_dbg(dev, "send meta info suc\n");
return 0;
}
static bool isp4sd_get_str_out_prop(struct isp4_subdev *isp_subdev,
struct isp4fw_image_prop *out_prop,
struct v4l2_subdev_state *state, u32 pad)
{
struct device *dev = isp_subdev->dev;
struct v4l2_mbus_framefmt *format;
format = v4l2_subdev_state_get_format(state, pad, 0);
if (!format) {
dev_err(dev, "fail get subdev state format\n");
return false;
}
switch (format->code) {
case MEDIA_BUS_FMT_YUYV8_1_5X8:
out_prop->image_format = ISP4FW_IMAGE_FORMAT_NV12;
out_prop->width = format->width;
out_prop->height = format->height;
out_prop->luma_pitch = format->width;
out_prop->chroma_pitch = out_prop->width;
break;
case MEDIA_BUS_FMT_YUYV8_1X16:
out_prop->image_format = ISP4FW_IMAGE_FORMAT_YUV422INTERLEAVED;
out_prop->width = format->width;
out_prop->height = format->height;
out_prop->luma_pitch = format->width * 2;
out_prop->chroma_pitch = 0;
break;
default:
dev_err(dev, "fail for bad image format:0x%x\n",
format->code);
return false;
}
if (!out_prop->width || !out_prop->height)
return false;
return true;
}
static int isp4sd_kickoff_stream(struct isp4_subdev *isp_subdev, u32 w, u32 h)
{
struct isp4sd_sensor_info *sensor_info = &isp_subdev->sensor_info;
struct isp4_interface *ispif = &isp_subdev->ispif;
struct device *dev = isp_subdev->dev;
if (sensor_info->status == ISP4SD_START_STATUS_STARTED)
return 0;
if (sensor_info->status == ISP4SD_START_STATUS_START_FAIL) {
dev_err(dev, "fail for previous start fail\n");
return -EINVAL;
}
dev_dbg(dev, "w:%u,h:%u\n", w, h);
if (isp4sd_send_meta_buf(isp_subdev)) {
dev_err(dev, "fail to send meta buf\n");
sensor_info->status = ISP4SD_START_STATUS_START_FAIL;
return -EINVAL;
}
sensor_info->status = ISP4SD_START_STATUS_OFF;
if (!sensor_info->start_stream_cmd_sent &&
sensor_info->buf_sent_cnt >= ISP4SD_MIN_BUF_CNT_BEF_START_STREAM) {
Annotation
- Immediate include surface: `linux/pm_domain.h`, `linux/units.h`, `isp4.h`, `isp4_debug.h`, `isp4_fw_cmd_resp.h`, `isp4_interface.h`.
- Detected declarations: `function isp4sd_module_enable`, `function isp4sd_setup_fw_mem_pool`, `function isp4sd_set_stream_path`, `function isp4sd_send_meta_buf`, `function isp4sd_get_str_out_prop`, `function isp4sd_kickoff_stream`, `function isp4sd_setup_output`, `function isp4sd_init_stream`, `function isp4sd_uninit_stream`, `function isp4sd_fw_resp_cmd_done`.
- 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.