drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c
Source file repositories/reference/linux-study-clean/drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c- Extension
.c- Size
- 13355 bytes
- Lines
- 508
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/device.hlinux/errno.hlinux/kernel.hlinux/minmax.hlinux/regmap.hlinux/slab.hlinux/string.hlinux/types.hmedia/media-entity.hmedia/v4l2-subdev.himx8-isi-core.h
Detected Declarations
function Copyrightfunction mxc_isi_crossbar_gasket_enablefunction mxc_isi_crossbar_gasket_disablefunction __mxc_isi_crossbar_set_routingfunction mxc_isi_crossbar_xlate_streamsfunction v4l2_subdev_state_xlate_streamsfunction mxc_isi_crossbar_init_statefunction mxc_isi_crossbar_enum_mbus_codefunction mxc_isi_crossbar_set_fmtfunction mxc_isi_crossbar_set_routingfunction mxc_isi_crossbar_enable_streamsfunction mxc_isi_crossbar_disable_streamsfunction mxc_isi_crossbar_initfunction mxc_isi_crossbar_cleanupfunction mxc_isi_crossbar_registerfunction mxc_isi_crossbar_unregister
Annotated Snippet
if (ret) {
dev_err(xbar->isi->dev,
"failed to enable streams 0x%llx on '%s':%u: %d\n",
sink_streams, remote_sd->name, remote_pad, ret);
mxc_isi_crossbar_gasket_disable(xbar, sink_pad);
return ret;
}
}
input->enable_count++;
return 0;
}
static int mxc_isi_crossbar_disable_streams(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
u32 pad, u64 streams_mask)
{
struct mxc_isi_crossbar *xbar = to_isi_crossbar(sd);
struct v4l2_subdev *remote_sd;
struct mxc_isi_input *input;
u64 sink_streams;
u32 sink_pad;
u32 remote_pad;
int ret = 0;
remote_sd = mxc_isi_crossbar_xlate_streams(xbar, state, pad, streams_mask,
&sink_pad, &sink_streams,
&remote_pad);
if (IS_ERR(remote_sd))
return PTR_ERR(remote_sd);
input = &xbar->inputs[sink_pad];
input->enable_count--;
if (!input->enable_count) {
ret = v4l2_subdev_disable_streams(remote_sd, remote_pad,
sink_streams);
if (ret)
dev_err(xbar->isi->dev,
"failed to disable streams 0x%llx on '%s':%u: %d\n",
sink_streams, remote_sd->name, remote_pad, ret);
mxc_isi_crossbar_gasket_disable(xbar, sink_pad);
}
return ret;
}
static const struct v4l2_subdev_pad_ops mxc_isi_crossbar_subdev_pad_ops = {
.enum_mbus_code = mxc_isi_crossbar_enum_mbus_code,
.get_fmt = v4l2_subdev_get_fmt,
.set_fmt = mxc_isi_crossbar_set_fmt,
.set_routing = mxc_isi_crossbar_set_routing,
.enable_streams = mxc_isi_crossbar_enable_streams,
.disable_streams = mxc_isi_crossbar_disable_streams,
};
static const struct v4l2_subdev_ops mxc_isi_crossbar_subdev_ops = {
.pad = &mxc_isi_crossbar_subdev_pad_ops,
};
static const struct v4l2_subdev_internal_ops mxc_isi_crossbar_internal_ops = {
.init_state = mxc_isi_crossbar_init_state,
};
static const struct media_entity_operations mxc_isi_cross_entity_ops = {
.get_fwnode_pad = v4l2_subdev_get_fwnode_pad_1_to_1,
.link_validate = v4l2_subdev_link_validate,
.has_pad_interdep = v4l2_subdev_has_pad_interdep,
};
/* -----------------------------------------------------------------------------
* Init & cleanup
*/
int mxc_isi_crossbar_init(struct mxc_isi_dev *isi)
{
struct mxc_isi_crossbar *xbar = &isi->crossbar;
struct v4l2_subdev *sd = &xbar->sd;
unsigned int num_pads;
unsigned int i;
int ret;
xbar->isi = isi;
v4l2_subdev_init(sd, &mxc_isi_crossbar_subdev_ops);
sd->internal_ops = &mxc_isi_crossbar_internal_ops;
sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS;
Annotation
- Immediate include surface: `linux/device.h`, `linux/errno.h`, `linux/kernel.h`, `linux/minmax.h`, `linux/regmap.h`, `linux/slab.h`, `linux/string.h`, `linux/types.h`.
- Detected declarations: `function Copyright`, `function mxc_isi_crossbar_gasket_enable`, `function mxc_isi_crossbar_gasket_disable`, `function __mxc_isi_crossbar_set_routing`, `function mxc_isi_crossbar_xlate_streams`, `function v4l2_subdev_state_xlate_streams`, `function mxc_isi_crossbar_init_state`, `function mxc_isi_crossbar_enum_mbus_code`, `function mxc_isi_crossbar_set_fmt`, `function mxc_isi_crossbar_set_routing`.
- Atlas domain: Driver Families / drivers/media.
- Implementation status: source implementation candidate.
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.