drivers/media/i2c/s5c73m3/s5c73m3-core.c
Source file repositories/reference/linux-study-clean/drivers/media/i2c/s5c73m3/s5c73m3-core.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/i2c/s5c73m3/s5c73m3-core.c- Extension
.c- Size
- 42647 bytes
- Lines
- 1759
- 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.
- 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/clk.hlinux/delay.hlinux/firmware.hlinux/gpio/consumer.hlinux/i2c.hlinux/init.hlinux/media.hlinux/module.hlinux/of_graph.hlinux/regulator/consumer.hlinux/sizes.hlinux/slab.hlinux/spi/spi.hlinux/videodev2.hmedia/media-entity.hmedia/v4l2-ctrls.hmedia/v4l2-device.hmedia/v4l2-subdev.hmedia/v4l2-mediabus.hmedia/v4l2-fwnode.hs5c73m3.h
Detected Declarations
function s5c73m3_fill_mbus_fmtfunction s5c73m3_i2c_writefunction s5c73m3_i2c_readfunction s5c73m3_writefunction s5c73m3_readfunction s5c73m3_check_statusfunction s5c73m3_isp_commandfunction s5c73m3_isp_comm_resultfunction s5c73m3_set_af_softlandingfunction s5c73m3_load_fwfunction s5c73m3_set_frame_sizefunction s5c73m3_set_frame_ratefunction __s5c73m3_s_streamfunction s5c73m3_oif_s_streamfunction s5c73m3_system_status_waitfunction s5c73m3_read_fw_versionfunction s5c73m3_fw_update_fromfunction s5c73m3_spi_bootfunction s5c73m3_set_timing_register_for_vddfunction s5c73m3_set_fw_file_versionfunction s5c73m3_get_fw_versionfunction s5c73m3_rom_bootfunction s5c73m3_isp_initfunction s5c73m3_oif_try_formatfunction s5c73m3_try_formatfunction s5c73m3_oif_get_frame_intervalfunction __s5c73m3_set_frame_intervalfunction s5c73m3_oif_set_frame_intervalfunction s5c73m3_oif_enum_frame_intervalfunction s5c73m3_oif_get_pad_codefunction s5c73m3_get_fmtfunction s5c73m3_oif_get_fmtfunction s5c73m3_set_fmtfunction s5c73m3_oif_set_fmtfunction s5c73m3_oif_get_frame_descfunction s5c73m3_oif_set_frame_descfunction s5c73m3_enum_mbus_codefunction s5c73m3_oif_enum_mbus_codefunction s5c73m3_enum_frame_sizefunction s5c73m3_oif_enum_frame_sizefunction s5c73m3_oif_log_statusfunction s5c73m3_openfunction s5c73m3_oif_openfunction __s5c73m3_power_onfunction __s5c73m3_power_offfunction __s5c73m3_power_offfunction s5c73m3_oif_set_powerfunction s5c73m3_oif_registered
Annotated Snippet
if (ret < 0) {
state->i2c_write_address = 0;
return ret;
}
}
if ((addr ^ state->i2c_write_address) & 0xffff) {
ret = s5c73m3_i2c_write(client, REG_CMDWR_ADDRL, addr & 0xffff);
if (ret < 0) {
state->i2c_write_address = 0;
return ret;
}
}
state->i2c_write_address = addr;
ret = s5c73m3_i2c_write(client, REG_CMDBUF_ADDR, data);
if (ret < 0)
return ret;
state->i2c_write_address += 2;
return ret;
}
int s5c73m3_read(struct s5c73m3 *state, u32 addr, u16 *data)
{
struct i2c_client *client = state->i2c_client;
int ret;
if ((addr ^ state->i2c_read_address) & 0xffff0000) {
ret = s5c73m3_i2c_write(client, REG_CMDRD_ADDRH, addr >> 16);
if (ret < 0) {
state->i2c_read_address = 0;
return ret;
}
}
if ((addr ^ state->i2c_read_address) & 0xffff) {
ret = s5c73m3_i2c_write(client, REG_CMDRD_ADDRL, addr & 0xffff);
if (ret < 0) {
state->i2c_read_address = 0;
return ret;
}
}
state->i2c_read_address = addr;
ret = s5c73m3_i2c_read(client, REG_CMDBUF_ADDR, data);
if (ret < 0)
return ret;
state->i2c_read_address += 2;
return ret;
}
static int s5c73m3_check_status(struct s5c73m3 *state, unsigned int value)
{
unsigned long start = jiffies;
unsigned long end = start + msecs_to_jiffies(2000);
int ret;
u16 status;
int count = 0;
do {
ret = s5c73m3_read(state, REG_STATUS, &status);
if (ret < 0 || status == value)
break;
usleep_range(500, 1000);
++count;
} while (time_is_after_jiffies(end));
if (count > 0)
v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd,
"status check took %dms\n",
jiffies_to_msecs(jiffies - start));
if (ret == 0 && status != value) {
u16 i2c_status = 0;
u16 i2c_seq_status = 0;
s5c73m3_read(state, REG_I2C_STATUS, &i2c_status);
s5c73m3_read(state, REG_I2C_SEQ_STATUS, &i2c_seq_status);
v4l2_err(&state->sensor_sd,
"wrong status %#x, expected: %#x, i2c_status: %#x/%#x\n",
status, value, i2c_status, i2c_seq_status);
return -ETIMEDOUT;
Annotation
- Immediate include surface: `linux/clk.h`, `linux/delay.h`, `linux/firmware.h`, `linux/gpio/consumer.h`, `linux/i2c.h`, `linux/init.h`, `linux/media.h`, `linux/module.h`.
- Detected declarations: `function s5c73m3_fill_mbus_fmt`, `function s5c73m3_i2c_write`, `function s5c73m3_i2c_read`, `function s5c73m3_write`, `function s5c73m3_read`, `function s5c73m3_check_status`, `function s5c73m3_isp_command`, `function s5c73m3_isp_comm_result`, `function s5c73m3_set_af_softlanding`, `function s5c73m3_load_fw`.
- 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.