drivers/media/platform/qcom/camss/camss-csid.c
Source file repositories/reference/linux-study-clean/drivers/media/platform/qcom/camss/camss-csid.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/platform/qcom/camss/camss-csid.c- Extension
.c- Size
- 32307 bytes
- Lines
- 1447
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/clk.hlinux/completion.hlinux/interrupt.hlinux/io.hlinux/kernel.hlinux/of.hlinux/platform_device.hlinux/pm_runtime.hlinux/regulator/consumer.hmedia/media-entity.hmedia/mipi-csi2.hmedia/v4l2-device.hmedia/v4l2-event.hmedia/v4l2-subdev.hcamss-csid.hcamss-csid-gen1.hcamss.h
Detected Declarations
function csid_find_codefunction csid_set_clock_ratesfunction csid_hw_versionfunction csid_src_pad_codefunction csid_set_powerfunction csid_set_streamfunction __csid_get_formatfunction csid_try_formatfunction csid_enum_mbus_codefunction csid_enum_frame_sizefunction csid_get_formatfunction csid_set_formatfunction csid_init_formatsfunction csid_set_test_patternfunction csid_s_ctrlfunction msm_csid_subdev_initfunction msm_csid_get_csid_idfunction csid_get_lane_assignfunction csid_link_setupfunction msm_csid_register_entityfunction msm_csid_unregister_entityfunction csid_is_lite
Annotated Snippet
if (match_code) {
if (codes[i] == match_code)
return match_code;
} else {
if (i == match_format_idx)
return codes[i];
}
return codes[0];
}
const struct csid_format_info *csid_get_fmt_entry(const struct csid_format_info *formats,
unsigned int nformats,
u32 code)
{
unsigned int i;
for (i = 0; i < nformats; i++)
if (code == formats[i].code)
return &formats[i];
WARN(1, "Unknown format\n");
return &formats[0];
}
/*
* csid_set_clock_rates - Calculate and set clock rates on CSID module
* @csiphy: CSID device
*/
static int csid_set_clock_rates(struct csid_device *csid)
{
struct device *dev = csid->camss->dev;
const struct csid_format_info *fmt;
s64 link_freq;
int i, j;
int ret;
fmt = csid_get_fmt_entry(csid->res->formats->formats, csid->res->formats->nformats,
csid->fmt[MSM_CSIPHY_PAD_SINK].code);
link_freq = camss_get_link_freq(&csid->subdev.entity, fmt->bpp,
csid->phy.lane_cnt);
if (link_freq < 0)
link_freq = 0;
for (i = 0; i < csid->nclocks; i++) {
struct camss_clock *clock = &csid->clock[i];
if (!strcmp(clock->name, "csi0") ||
!strcmp(clock->name, "csi1") ||
!strcmp(clock->name, "csi2") ||
!strcmp(clock->name, "csi3")) {
u64 min_rate = link_freq / 4;
long rate;
camss_add_clock_margin(&min_rate);
for (j = 0; j < clock->nfreqs; j++)
if (min_rate < clock->freq[j])
break;
if (j == clock->nfreqs) {
dev_err(dev,
"Pixel clock is too high for CSID\n");
return -EINVAL;
}
/* if sensor pixel clock is not available */
/* set highest possible CSID clock rate */
if (min_rate == 0)
j = clock->nfreqs - 1;
rate = clk_round_rate(clock->clk, clock->freq[j]);
if (rate < 0) {
dev_err(dev, "clk round rate failed: %ld\n",
rate);
return -EINVAL;
}
ret = clk_set_rate(clock->clk, rate);
if (ret < 0) {
dev_err(dev, "clk set rate failed: %d\n", ret);
return ret;
}
} else if (clock->nfreqs) {
clk_set_rate(clock->clk, clock->freq[0]);
}
}
return 0;
Annotation
- Immediate include surface: `linux/clk.h`, `linux/completion.h`, `linux/interrupt.h`, `linux/io.h`, `linux/kernel.h`, `linux/of.h`, `linux/platform_device.h`, `linux/pm_runtime.h`.
- Detected declarations: `function csid_find_code`, `function csid_set_clock_rates`, `function csid_hw_version`, `function csid_src_pad_code`, `function csid_set_power`, `function csid_set_stream`, `function __csid_get_format`, `function csid_try_format`, `function csid_enum_mbus_code`, `function csid_enum_frame_size`.
- Atlas domain: Driver Families / drivers/media.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.