drivers/leds/rgb/leds-lp5812.c

Source file repositories/reference/linux-study-clean/drivers/leds/rgb/leds-lp5812.c

File Facts

System
Linux kernel
Corpus path
drivers/leds/rgb/leds-lp5812.c
Extension
.c
Size
16042 bytes
Lines
643
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.

Dependency Surface

Detected Declarations

Annotated Snippet

switch (chip_mode_map[i].selection_led) {
		case LP5812_MODE_MIX_SELECT_LED_0:
			chip->drive_mode.bits.mix_sel_led_0 = true;
			break;
		case LP5812_MODE_MIX_SELECT_LED_1:
			chip->drive_mode.bits.mix_sel_led_1 = true;
			break;
		case LP5812_MODE_MIX_SELECT_LED_2:
			chip->drive_mode.bits.mix_sel_led_2 = true;
			break;
		case LP5812_MODE_MIX_SELECT_LED_3:
			chip->drive_mode.bits.mix_sel_led_3 = true;
			break;
		default:
			return -EINVAL;
		}

		return 0;
	}

	return -EINVAL;
}

static int lp5812_set_drive_mode_scan_order(struct lp5812_chip *chip)
{
	u8 val;
	int ret;

	val = chip->drive_mode.val;
	ret = lp5812_write(chip, LP5812_DEV_CONFIG1, val);
	if (ret)
		return ret;

	val = chip->scan_order.val;
	ret = lp5812_write(chip, LP5812_DEV_CONFIG2, val);

	return ret;
}

static int lp5812_set_led_mode(struct lp5812_chip *chip, int led_number,
			       enum control_mode mode)
{
	u8 reg_val;
	u16 reg;
	int ret;

	/*
	 * Select device configuration register.
	 * Reg3 for LED_0–LED_3, LED_A0–A2, LED_B0
	 * Reg4 for LED_B1–B2, LED_C0–C2, LED_D0–D2
	 */
	if (led_number < LP5812_NUMBER_LED_IN_REG)
		reg = LP5812_DEV_CONFIG3;
	else
		reg = LP5812_DEV_CONFIG4;

	ret = lp5812_read(chip, reg, &reg_val);
	if (ret)
		return ret;

	if (mode == LP5812_MODE_MANUAL)
		reg_val &= ~(LP5812_ENABLE << (led_number % LP5812_NUMBER_LED_IN_REG));
	else
		reg_val |= (LP5812_ENABLE << (led_number % LP5812_NUMBER_LED_IN_REG));

	ret = lp5812_write(chip, reg, reg_val);
	if (ret)
		return ret;

	ret = lp5812_update_regs_config(chip);

	return ret;
}

static int lp5812_manual_dc_pwm_control(struct lp5812_chip *chip, int led_number,
					u8 val, enum dimming_type dimming_type)
{
	u16 led_base_reg;
	int ret;

	if (dimming_type == LP5812_DIMMING_ANALOG)
		led_base_reg = LP5812_MANUAL_DC_BASE;
	else
		led_base_reg = LP5812_MANUAL_PWM_BASE;

	ret = lp5812_write(chip, led_base_reg + led_number, val);

	return ret;
}

Annotation

Implementation Notes