drivers/video/backlight/ktz8866.c
Source file repositories/reference/linux-study-clean/drivers/video/backlight/ktz8866.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/video/backlight/ktz8866.c- Extension
.c- Size
- 5675 bytes
- Lines
- 210
- Domain
- Driver Families
- Bucket
- drivers/video
- 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.
- 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/backlight.hlinux/err.hlinux/gpio/consumer.hlinux/i2c.hlinux/module.hlinux/of.hlinux/regmap.h
Detected Declarations
struct ktz8866function ktz8866_writefunction ktz8866_update_bitsfunction ktz8866_backlight_update_statusfunction ktz8866_initfunction ktz8866_probefunction ktz8866_remove
Annotated Snippet
struct ktz8866 {
struct i2c_client *client;
struct regmap *regmap;
bool led_on;
struct gpio_desc *enable_gpio;
};
static const struct regmap_config ktz8866_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
.max_register = REG_MAX,
};
static int ktz8866_write(struct ktz8866 *ktz, unsigned int reg,
unsigned int val)
{
return regmap_write(ktz->regmap, reg, val);
}
static int ktz8866_update_bits(struct ktz8866 *ktz, unsigned int reg,
unsigned int mask, unsigned int val)
{
return regmap_update_bits(ktz->regmap, reg, mask, val);
}
static int ktz8866_backlight_update_status(struct backlight_device *backlight_dev)
{
struct ktz8866 *ktz = bl_get_data(backlight_dev);
unsigned int brightness = backlight_get_brightness(backlight_dev);
if (!ktz->led_on && brightness > 0) {
ktz8866_update_bits(ktz, BL_EN, BL_EN_BIT, BL_EN_BIT);
ktz->led_on = true;
} else if (brightness == 0) {
ktz8866_update_bits(ktz, BL_EN, BL_EN_BIT, 0);
ktz->led_on = false;
}
/* Set brightness */
ktz8866_write(ktz, BL_BRT_LSB, brightness & 0x7);
ktz8866_write(ktz, BL_BRT_MSB, (brightness >> 3) & 0xFF);
return 0;
}
static const struct backlight_ops ktz8866_backlight_ops = {
.options = BL_CORE_SUSPENDRESUME,
.update_status = ktz8866_backlight_update_status,
};
static void ktz8866_init(struct ktz8866 *ktz)
{
unsigned int val = 0;
if (!of_property_read_u32(ktz->client->dev.of_node, "current-num-sinks", &val))
ktz8866_write(ktz, BL_EN, BIT(val) - 1);
else
/* Enable all 6 current sinks if the number of current sinks isn't specified. */
ktz8866_write(ktz, BL_EN, BIT(6) - 1);
if (!of_property_read_u32(ktz->client->dev.of_node, "kinetic,current-ramp-delay-ms", &val)) {
if (val <= 128)
ktz8866_write(ktz, BL_CFG2, BIT(7) | (ilog2(val) << 3) | PWM_HYST);
else
ktz8866_write(ktz, BL_CFG2, BIT(7) | ((5 + val / 64) << 3) | PWM_HYST);
}
if (!of_property_read_u32(ktz->client->dev.of_node, "kinetic,led-enable-ramp-delay-ms", &val)) {
if (val == 0)
ktz8866_write(ktz, BL_DIMMING, 0);
else {
unsigned int ramp_off_time = ilog2(val) + 1;
unsigned int ramp_on_time = ramp_off_time << 4;
ktz8866_write(ktz, BL_DIMMING, ramp_on_time | ramp_off_time);
}
}
if (of_property_read_bool(ktz->client->dev.of_node, "kinetic,enable-lcd-bias"))
ktz8866_write(ktz, LCD_BIAS_CFG1, LCD_BIAS_EN);
}
static int ktz8866_probe(struct i2c_client *client)
{
struct backlight_device *backlight_dev;
struct backlight_properties props;
struct ktz8866 *ktz;
int ret = 0;
ktz = devm_kzalloc(&client->dev, sizeof(*ktz), GFP_KERNEL);
if (!ktz)
Annotation
- Immediate include surface: `linux/backlight.h`, `linux/err.h`, `linux/gpio/consumer.h`, `linux/i2c.h`, `linux/module.h`, `linux/of.h`, `linux/regmap.h`.
- Detected declarations: `struct ktz8866`, `function ktz8866_write`, `function ktz8866_update_bits`, `function ktz8866_backlight_update_status`, `function ktz8866_init`, `function ktz8866_probe`, `function ktz8866_remove`.
- Atlas domain: Driver Families / drivers/video.
- Implementation status: source 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.