drivers/leds/leds-da903x.c
Source file repositories/reference/linux-study-clean/drivers/leds/leds-da903x.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/leds/leds-da903x.c- Extension
.c- Size
- 3673 bytes
- Lines
- 146
- Domain
- Driver Families
- Bucket
- drivers/leds
- 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/module.hlinux/kernel.hlinux/platform_device.hlinux/leds.hlinux/mfd/da903x.hlinux/slab.h
Detected Declarations
struct da903x_ledfunction da903x_led_setfunction da903x_led_probefunction da903x_led_remove
Annotated Snippet
struct da903x_led {
struct led_classdev cdev;
struct device *master;
int id;
int flags;
};
#define DA9030_LED_OFFSET(id) ((id) - DA9030_ID_LED_1)
#define DA9034_LED_OFFSET(id) ((id) - DA9034_ID_LED_1)
static int da903x_led_set(struct led_classdev *led_cdev,
enum led_brightness value)
{
struct da903x_led *led =
container_of(led_cdev, struct da903x_led, cdev);
uint8_t val;
int offset, ret = -EINVAL;
switch (led->id) {
case DA9030_ID_LED_1:
case DA9030_ID_LED_2:
case DA9030_ID_LED_3:
case DA9030_ID_LED_4:
case DA9030_ID_LED_PC:
offset = DA9030_LED_OFFSET(led->id);
val = led->flags & ~0x87;
val |= value ? 0x80 : 0; /* EN bit */
val |= (0x7 - (value >> 5)) & 0x7; /* PWM<2:0> */
ret = da903x_write(led->master, DA9030_LED1_CONTROL + offset,
val);
break;
case DA9030_ID_VIBRA:
val = led->flags & ~0x80;
val |= value ? 0x80 : 0; /* EN bit */
ret = da903x_write(led->master, DA9030_MISC_CONTROL_A, val);
break;
case DA9034_ID_LED_1:
case DA9034_ID_LED_2:
offset = DA9034_LED_OFFSET(led->id);
val = (value * 0x5f / LED_FULL) & 0x7f;
val |= (led->flags & DA9034_LED_RAMP) ? 0x80 : 0;
ret = da903x_write(led->master, DA9034_LED1_CONTROL + offset,
val);
break;
case DA9034_ID_VIBRA:
val = value & 0xfe;
ret = da903x_write(led->master, DA9034_VIBRA, val);
break;
}
return ret;
}
static int da903x_led_probe(struct platform_device *pdev)
{
struct led_info *pdata = dev_get_platdata(&pdev->dev);
struct da903x_led *led;
int id, ret;
if (pdata == NULL)
return 0;
id = pdev->id;
if (!((id >= DA9030_ID_LED_1 && id <= DA9030_ID_VIBRA) ||
(id >= DA9034_ID_LED_1 && id <= DA9034_ID_VIBRA))) {
dev_err(&pdev->dev, "invalid LED ID (%d) specified\n", id);
return -EINVAL;
}
led = devm_kzalloc(&pdev->dev, sizeof(struct da903x_led), GFP_KERNEL);
if (!led)
return -ENOMEM;
led->cdev.name = pdata->name;
led->cdev.default_trigger = pdata->default_trigger;
led->cdev.brightness_set_blocking = da903x_led_set;
led->cdev.brightness = LED_OFF;
led->id = id;
led->flags = pdata->flags;
led->master = pdev->dev.parent;
ret = led_classdev_register(led->master, &led->cdev);
if (ret) {
dev_err(&pdev->dev, "failed to register LED %d\n", id);
return ret;
}
platform_set_drvdata(pdev, led);
Annotation
- Immediate include surface: `linux/module.h`, `linux/kernel.h`, `linux/platform_device.h`, `linux/leds.h`, `linux/mfd/da903x.h`, `linux/slab.h`.
- Detected declarations: `struct da903x_led`, `function da903x_led_set`, `function da903x_led_probe`, `function da903x_led_remove`.
- Atlas domain: Driver Families / drivers/leds.
- 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.