drivers/media/usb/dvb-usb-v2/dvbsky.c
Source file repositories/reference/linux-study-clean/drivers/media/usb/dvb-usb-v2/dvbsky.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/usb/dvb-usb-v2/dvbsky.c- Extension
.c- Size
- 22551 bytes
- Lines
- 830
- 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
dvb_usb.hm88ds3103.hts2020.hsp2.hsi2168.hsi2157.h
Detected Declarations
struct dvbsky_statefunction dvbsky_usb_generic_rwfunction dvbsky_stream_ctrlfunction dvbsky_streaming_ctrlfunction dvbsky_gpio_ctrlfunction dvbsky_i2c_xferfunction dvbsky_i2c_funcfunction dvbsky_rc_queryfunction dvbsky_get_rc_configfunction dvbsky_usb_set_voltagefunction dvbsky_read_mac_addrfunction dvbsky_usb_read_statusfunction dvbsky_s960_attachfunction dvbsky_usb_ci_set_voltagefunction dvbsky_ci_ctrlfunction dvbsky_s960c_attachfunction dvbsky_t680c_attachfunction dvbsky_t330_attachfunction dvbsky_mygica_t230c_attachfunction dvbsky_identify_statefunction dvbsky_initfunction dvbsky_frontend_detach
Annotated Snippet
struct dvbsky_state {
u8 ibuf[DVBSKY_BUF_LEN];
u8 obuf[DVBSKY_BUF_LEN];
u8 last_lock;
struct i2c_client *i2c_client_demod;
struct i2c_client *i2c_client_tuner;
struct i2c_client *i2c_client_ci;
/* fe hook functions*/
int (*fe_set_voltage)(struct dvb_frontend *fe,
enum fe_sec_voltage voltage);
int (*fe_read_status)(struct dvb_frontend *fe,
enum fe_status *status);
};
static int dvbsky_usb_generic_rw(struct dvb_usb_device *d,
u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen)
{
int ret;
struct dvbsky_state *state = d_to_priv(d);
mutex_lock(&d->usb_mutex);
if (wlen != 0)
memcpy(state->obuf, wbuf, wlen);
ret = dvb_usbv2_generic_rw_locked(d, state->obuf, wlen,
state->ibuf, rlen);
if (!ret && (rlen != 0))
memcpy(rbuf, state->ibuf, rlen);
mutex_unlock(&d->usb_mutex);
return ret;
}
static int dvbsky_stream_ctrl(struct dvb_usb_device *d, u8 onoff)
{
struct dvbsky_state *state = d_to_priv(d);
static const u8 obuf_pre[3] = { 0x37, 0, 0 };
static const u8 obuf_post[3] = { 0x36, 3, 0 };
int ret;
mutex_lock(&d->usb_mutex);
memcpy(state->obuf, obuf_pre, 3);
ret = dvb_usbv2_generic_write_locked(d, state->obuf, 3);
if (!ret && onoff) {
msleep(20);
memcpy(state->obuf, obuf_post, 3);
ret = dvb_usbv2_generic_write_locked(d, state->obuf, 3);
}
mutex_unlock(&d->usb_mutex);
return ret;
}
static int dvbsky_streaming_ctrl(struct dvb_frontend *fe, int onoff)
{
struct dvb_usb_device *d = fe_to_d(fe);
return dvbsky_stream_ctrl(d, (onoff == 0) ? 0 : 1);
}
/* GPIO */
static int dvbsky_gpio_ctrl(struct dvb_usb_device *d, u8 gport, u8 value)
{
int ret;
u8 obuf[3], ibuf[2];
obuf[0] = 0x0e;
obuf[1] = gport;
obuf[2] = value;
ret = dvbsky_usb_generic_rw(d, obuf, 3, ibuf, 1);
return ret;
}
/* I2C */
static int dvbsky_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
int num)
{
struct dvb_usb_device *d = i2c_get_adapdata(adap);
int ret = 0;
u8 ibuf[64], obuf[64];
if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
return -EAGAIN;
if (num > 2) {
dev_err(&d->udev->dev,
"too many i2c messages[%d], max 2.", num);
ret = -EOPNOTSUPP;
goto i2c_error;
Annotation
- Immediate include surface: `dvb_usb.h`, `m88ds3103.h`, `ts2020.h`, `sp2.h`, `si2168.h`, `si2157.h`.
- Detected declarations: `struct dvbsky_state`, `function dvbsky_usb_generic_rw`, `function dvbsky_stream_ctrl`, `function dvbsky_streaming_ctrl`, `function dvbsky_gpio_ctrl`, `function dvbsky_i2c_xfer`, `function dvbsky_i2c_func`, `function dvbsky_rc_query`, `function dvbsky_get_rc_config`, `function dvbsky_usb_set_voltage`.
- 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.