drivers/gpu/drm/bridge/sii902x.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/bridge/sii902x.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/bridge/sii902x.c- Extension
.c- Size
- 35881 bytes
- Lines
- 1259
- Domain
- Driver Families
- Bucket
- drivers/gpu
- 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.
- 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/gpio/consumer.hlinux/i2c-mux.hlinux/i2c.hlinux/media-bus-format.hlinux/module.hlinux/regmap.hlinux/regulator/consumer.hlinux/clk.hdrm/drm_atomic_helper.hdrm/drm_bridge.hdrm/drm_drv.hdrm/drm_edid.hdrm/drm_print.hdrm/drm_probe_helper.hsound/hdmi-codec.h
Detected Declarations
struct sii902xstruct sii902x_audiofunction sii902x_read_unlockedfunction sii902x_write_unlockedfunction sii902x_update_bits_unlockedfunction sii902x_resetfunction sii902x_detectfunction sii902x_connector_detectfunction sii902x_get_modesfunction sii902x_bridge_atomic_disablefunction sii902x_bridge_atomic_enablefunction sii902x_bridge_mode_setfunction sii902x_bridge_attachfunction sii902x_bridge_detectfunction sii902x_bridge_atomic_checkfunction sii902x_bridge_mode_validfunction sii902x_mutefunction sii902x_select_mclk_divfunction sii902x_audio_hw_paramsfunction sii902x_audio_shutdownfunction sii902x_audio_mutefunction sii902x_audio_get_eldfunction sii902x_audio_get_dai_idfunction sii902x_audio_codec_initfunction sii902x_interruptfunction sii902x_i2c_bypass_selectfunction sii902x_i2c_bypass_deselectfunction sii902x_initfunction sii902x_probefunction sii902x_remove
Annotated Snippet
struct sii902x {
struct i2c_client *i2c;
struct regmap *regmap;
struct drm_bridge bridge;
struct drm_connector connector;
struct gpio_desc *reset_gpio;
struct i2c_mux_core *i2cmux;
u32 bus_width;
/*
* Mutex protects audio and video functions from interfering
* each other, by keeping their i2c command sequences atomic.
*/
struct mutex mutex;
struct sii902x_audio {
struct platform_device *pdev;
struct clk *mclk;
u32 i2s_fifo_sequence[4];
} audio;
};
static int sii902x_read_unlocked(struct i2c_client *i2c, u8 reg, u8 *val)
{
union i2c_smbus_data data;
int ret;
ret = __i2c_smbus_xfer(i2c->adapter, i2c->addr, i2c->flags,
I2C_SMBUS_READ, reg, I2C_SMBUS_BYTE_DATA, &data);
if (ret < 0)
return ret;
*val = data.byte;
return 0;
}
static int sii902x_write_unlocked(struct i2c_client *i2c, u8 reg, u8 val)
{
union i2c_smbus_data data;
data.byte = val;
return __i2c_smbus_xfer(i2c->adapter, i2c->addr, i2c->flags,
I2C_SMBUS_WRITE, reg, I2C_SMBUS_BYTE_DATA,
&data);
}
static int sii902x_update_bits_unlocked(struct i2c_client *i2c, u8 reg, u8 mask,
u8 val)
{
int ret;
u8 status;
ret = sii902x_read_unlocked(i2c, reg, &status);
if (ret)
return ret;
status &= ~mask;
status |= val & mask;
return sii902x_write_unlocked(i2c, reg, status);
}
static inline struct sii902x *bridge_to_sii902x(struct drm_bridge *bridge)
{
return container_of(bridge, struct sii902x, bridge);
}
static inline struct sii902x *connector_to_sii902x(struct drm_connector *con)
{
return container_of(con, struct sii902x, connector);
}
static void sii902x_reset(struct sii902x *sii902x)
{
if (!sii902x->reset_gpio)
return;
gpiod_set_value_cansleep(sii902x->reset_gpio, 1);
/* The datasheet says treset-min = 100us. Make it 150us to be sure. */
usleep_range(150, 200);
gpiod_set_value_cansleep(sii902x->reset_gpio, 0);
}
static enum drm_connector_status sii902x_detect(struct sii902x *sii902x)
{
unsigned int status;
mutex_lock(&sii902x->mutex);
Annotation
- Immediate include surface: `linux/gpio/consumer.h`, `linux/i2c-mux.h`, `linux/i2c.h`, `linux/media-bus-format.h`, `linux/module.h`, `linux/regmap.h`, `linux/regulator/consumer.h`, `linux/clk.h`.
- Detected declarations: `struct sii902x`, `struct sii902x_audio`, `function sii902x_read_unlocked`, `function sii902x_write_unlocked`, `function sii902x_update_bits_unlocked`, `function sii902x_reset`, `function sii902x_detect`, `function sii902x_connector_detect`, `function sii902x_get_modes`, `function sii902x_bridge_atomic_disable`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- 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.