drivers/media/dvb-frontends/isl6421.c
Source file repositories/reference/linux-study-clean/drivers/media/dvb-frontends/isl6421.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/dvb-frontends/isl6421.c- Extension
.c- Size
- 5192 bytes
- Lines
- 221
- Domain
- Driver Families
- Bucket
- drivers/media
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- 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/delay.hlinux/errno.hlinux/init.hlinux/kernel.hlinux/module.hlinux/string.hlinux/slab.hmedia/dvb_frontend.hisl6421.h
Detected Declarations
struct isl6421function isl6421_set_voltagefunction isl6421_enable_high_lnb_voltagefunction isl6421_set_tonefunction isl6421_releaseexport isl6421_attach
Annotated Snippet
struct isl6421 {
u8 config;
u8 override_or;
u8 override_and;
struct i2c_adapter *i2c;
u8 i2c_addr;
bool is_off;
};
static int isl6421_set_voltage(struct dvb_frontend *fe,
enum fe_sec_voltage voltage)
{
int ret;
u8 buf;
bool is_off;
struct isl6421 *isl6421 = (struct isl6421 *) fe->sec_priv;
struct i2c_msg msg[2] = {
{
.addr = isl6421->i2c_addr,
.flags = 0,
.buf = &isl6421->config,
.len = 1,
}, {
.addr = isl6421->i2c_addr,
.flags = I2C_M_RD,
.buf = &buf,
.len = 1,
}
};
isl6421->config &= ~(ISL6421_VSEL1 | ISL6421_EN1);
switch(voltage) {
case SEC_VOLTAGE_OFF:
is_off = true;
break;
case SEC_VOLTAGE_13:
is_off = false;
isl6421->config |= ISL6421_EN1;
break;
case SEC_VOLTAGE_18:
is_off = false;
isl6421->config |= (ISL6421_EN1 | ISL6421_VSEL1);
break;
default:
return -EINVAL;
}
/*
* If LNBf were not powered on, disable dynamic current limit, as,
* according with datasheet, highly capacitive load on the output may
* cause a difficult start-up.
*/
if (isl6421->is_off && !is_off)
isl6421->config |= ISL6421_DCL;
isl6421->config |= isl6421->override_or;
isl6421->config &= isl6421->override_and;
ret = i2c_transfer(isl6421->i2c, msg, 2);
if (ret < 0)
return ret;
if (ret != 2)
return -EIO;
/* Store off status now in case future commands fail */
isl6421->is_off = is_off;
/* On overflow, the device will try again after 900 ms (typically) */
if (!is_off && (buf & ISL6421_OLF1))
msleep(1000);
/* Re-enable dynamic current limit */
if ((isl6421->config & ISL6421_DCL) &&
!(isl6421->override_or & ISL6421_DCL)) {
isl6421->config &= ~ISL6421_DCL;
ret = i2c_transfer(isl6421->i2c, msg, 2);
if (ret < 0)
return ret;
if (ret != 2)
return -EIO;
}
/* Check if overload flag is active. If so, disable power */
if (!is_off && (buf & ISL6421_OLF1)) {
isl6421->config &= ~(ISL6421_VSEL1 | ISL6421_EN1);
ret = i2c_transfer(isl6421->i2c, msg, 1);
if (ret < 0)
Annotation
- Immediate include surface: `linux/delay.h`, `linux/errno.h`, `linux/init.h`, `linux/kernel.h`, `linux/module.h`, `linux/string.h`, `linux/slab.h`, `media/dvb_frontend.h`.
- Detected declarations: `struct isl6421`, `function isl6421_set_voltage`, `function isl6421_enable_high_lnb_voltage`, `function isl6421_set_tone`, `function isl6421_release`, `export isl6421_attach`.
- Atlas domain: Driver Families / drivers/media.
- Implementation status: integration 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.