drivers/leds/leds-lm3697.c

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

File Facts

System
Linux kernel
Corpus path
drivers/leds/leds-lm3697.c
Extension
.c
Size
9646 bytes
Lines
382
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

struct lm3697_led {
	u32 hvled_strings[LM3697_MAX_LED_STRINGS];
	char label[LED_MAX_NAME_SIZE];
	struct led_classdev led_dev;
	struct lm3697 *priv;
	struct ti_lmu_bank lmu_data;
	int control_bank;
	int enabled;
	int num_leds;
};

/**
 * struct lm3697 -
 * @enable_gpio: Hardware enable gpio
 * @regulator: LED supply regulator pointer
 * @client: Pointer to the I2C client
 * @regmap: Devices register map
 * @dev: Pointer to the devices device struct
 * @lock: Lock for reading/writing the device
 * @leds: Array of LED strings
 * @bank_cfg: OUTPUT_CONFIG register values
 * @num_banks: Number of control banks
 */
struct lm3697 {
	struct gpio_desc *enable_gpio;
	struct regulator *regulator;
	struct i2c_client *client;
	struct regmap *regmap;
	struct device *dev;
	struct mutex lock;

	int bank_cfg;
	int num_banks;

	struct lm3697_led leds[] __counted_by(num_banks);
};

static const struct reg_default lm3697_reg_defs[] = {
	{LM3697_OUTPUT_CONFIG, 0x6},
	{LM3697_CTRL_A_RAMP, 0x0},
	{LM3697_CTRL_B_RAMP, 0x0},
	{LM3697_CTRL_A_B_RT_RAMP, 0x0},
	{LM3697_CTRL_A_B_RAMP_CFG, 0x0},
	{LM3697_CTRL_A_B_BRT_CFG, 0x0},
	{LM3697_CTRL_A_FS_CURR_CFG, 0x13},
	{LM3697_CTRL_B_FS_CURR_CFG, 0x13},
	{LM3697_PWM_CFG, 0xc},
	{LM3697_CTRL_A_BRT_LSB, 0x0},
	{LM3697_CTRL_A_BRT_MSB, 0x0},
	{LM3697_CTRL_B_BRT_LSB, 0x0},
	{LM3697_CTRL_B_BRT_MSB, 0x0},
	{LM3697_CTRL_ENABLE, 0x0},
};

static const struct regmap_config lm3697_regmap_config = {
	.reg_bits = 8,
	.val_bits = 8,

	.max_register = LM3697_CTRL_ENABLE,
	.reg_defaults = lm3697_reg_defs,
	.num_reg_defaults = ARRAY_SIZE(lm3697_reg_defs),
	.cache_type = REGCACHE_FLAT,
};

static int lm3697_brightness_set(struct led_classdev *led_cdev,
				enum led_brightness brt_val)
{
	struct lm3697_led *led = container_of(led_cdev, struct lm3697_led,
					      led_dev);
	int ctrl_en_val = (1 << led->control_bank);
	struct device *dev = led->priv->dev;
	int ret;

	mutex_lock(&led->priv->lock);

	if (brt_val == LED_OFF) {
		ret = regmap_update_bits(led->priv->regmap, LM3697_CTRL_ENABLE,
					 ctrl_en_val, ~ctrl_en_val);
		if (ret) {
			dev_err(dev, "Cannot write ctrl register\n");
			goto brightness_out;
		}

		led->enabled = LED_OFF;
	} else {
		ret = ti_lmu_common_set_brightness(&led->lmu_data, brt_val);
		if (ret) {
			dev_err(dev, "Cannot write brightness\n");
			goto brightness_out;
		}

Annotation

Implementation Notes