drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
Source file repositories/reference/linux-study-clean/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c- Extension
.c- Size
- 23080 bytes
- Lines
- 873
- 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_runtime.hlinux/regmap.hmedia/v4l2-device.hmedia/v4l2-fwnode.hsun6i_csi.hsun6i_csi_bridge.hsun6i_csi_reg.h
Detected Declarations
function sun6i_csi_bridge_dimensionsfunction sun6i_csi_bridge_formatfunction sun6i_csi_bridge_format_findfunction sun6i_csi_bridge_irq_enablefunction sun6i_csi_bridge_irq_disablefunction sun6i_csi_bridge_irq_clearfunction sun6i_csi_bridge_enablefunction sun6i_csi_bridge_disablefunction sun6i_csi_bridge_configure_parallelfunction sun6i_csi_bridge_configure_mipi_csi2function sun6i_csi_bridge_configure_formatfunction sun6i_csi_bridge_configurefunction sun6i_csi_bridge_s_streamfunction sun6i_csi_bridge_mbus_format_preparefunction sun6i_csi_bridge_init_statefunction sun6i_csi_bridge_enum_mbus_codefunction sun6i_csi_bridge_get_fmtfunction sun6i_csi_bridge_set_fmtfunction sun6i_csi_bridge_linkfunction sun6i_csi_bridge_notifier_boundfunction sun6i_csi_bridge_notifier_completefunction sun6i_csi_bridge_source_setupfunction sun6i_csi_bridge_setupfunction sun6i_csi_bridge_cleanup
Annotated Snippet
if (endpoint->bus_type == bus_types[i]) {
valid = true;
break;
}
}
if (!valid) {
dev_err(dev, "unsupported bus type for port %d\n",
port);
ret = -EINVAL;
goto complete;
}
}
bridge_async_subdev =
v4l2_async_nf_add_fwnode_remote(notifier, handle,
struct
sun6i_csi_bridge_async_subdev);
if (IS_ERR(bridge_async_subdev)) {
ret = PTR_ERR(bridge_async_subdev);
goto complete;
}
bridge_async_subdev->source = source;
source->expected = true;
complete:
fwnode_handle_put(handle);
return ret;
}
int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi_dev)
{
struct device *dev = csi_dev->dev;
struct sun6i_csi_bridge *bridge = &csi_dev->bridge;
struct v4l2_device *v4l2_dev = csi_dev->v4l2_dev;
struct v4l2_subdev *subdev = &bridge->subdev;
struct v4l2_async_notifier *notifier = &bridge->notifier;
struct media_pad *pads = bridge->pads;
enum v4l2_mbus_type parallel_mbus_types[] = {
V4L2_MBUS_PARALLEL,
V4L2_MBUS_BT656,
V4L2_MBUS_INVALID
};
int ret;
mutex_init(&bridge->lock);
/* V4L2 Subdev */
v4l2_subdev_init(subdev, &sun6i_csi_bridge_subdev_ops);
subdev->internal_ops = &sun6i_csi_bridge_internal_ops;
strscpy(subdev->name, SUN6I_CSI_BRIDGE_NAME, sizeof(subdev->name));
subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
subdev->owner = THIS_MODULE;
subdev->dev = dev;
v4l2_set_subdevdata(subdev, csi_dev);
/* Media Entity */
subdev->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
subdev->entity.ops = &sun6i_csi_bridge_entity_ops;
/* Media Pads */
pads[SUN6I_CSI_BRIDGE_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
pads[SUN6I_CSI_BRIDGE_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE |
MEDIA_PAD_FL_MUST_CONNECT;
ret = media_entity_pads_init(&subdev->entity,
SUN6I_CSI_BRIDGE_PAD_COUNT, pads);
if (ret < 0)
return ret;
/* V4L2 Subdev */
if (csi_dev->isp_available)
ret = v4l2_async_register_subdev(subdev);
else
ret = v4l2_device_register_subdev(v4l2_dev, subdev);
if (ret) {
dev_err(dev, "failed to register v4l2 subdev: %d\n", ret);
goto error_media_entity;
}
/* V4L2 Async */
Annotation
- Immediate include surface: `linux/pm_runtime.h`, `linux/regmap.h`, `media/v4l2-device.h`, `media/v4l2-fwnode.h`, `sun6i_csi.h`, `sun6i_csi_bridge.h`, `sun6i_csi_reg.h`.
- Detected declarations: `function sun6i_csi_bridge_dimensions`, `function sun6i_csi_bridge_format`, `function sun6i_csi_bridge_format_find`, `function sun6i_csi_bridge_irq_enable`, `function sun6i_csi_bridge_irq_disable`, `function sun6i_csi_bridge_irq_clear`, `function sun6i_csi_bridge_enable`, `function sun6i_csi_bridge_disable`, `function sun6i_csi_bridge_configure_parallel`, `function sun6i_csi_bridge_configure_mipi_csi2`.
- 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.