drivers/leds/flash/leds-rt4505.c

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

File Facts

System
Linux kernel
Corpus path
drivers/leds/flash/leds-rt4505.c
Extension
.c
Size
11196 bytes
Lines
431
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 rt4505_priv {
	struct device *dev;
	struct regmap *regmap;
	struct mutex lock;
	struct led_classdev_flash flash;
	struct v4l2_flash *v4l2_flash;
};

static int rt4505_torch_brightness_set(struct led_classdev *lcdev,
				       enum led_brightness level)
{
	struct rt4505_priv *priv =
		container_of(lcdev, struct rt4505_priv, flash.led_cdev);
	u32 val = 0;
	int ret;

	mutex_lock(&priv->lock);

	if (level != LED_OFF) {
		ret = regmap_update_bits(priv->regmap,
					 RT4505_REG_ILED, RT4505_ITORCH_MASK,
					 (level - 1) << RT4505_ITORCH_SHIFT);
		if (ret)
			goto unlock;

		val = RT4505_TORCH_SET;
	}

	ret = regmap_update_bits(priv->regmap, RT4505_REG_ENABLE,
				 RT4505_ENABLE_MASK, val);

unlock:
	mutex_unlock(&priv->lock);
	return ret;
}

static enum led_brightness rt4505_torch_brightness_get(
						struct led_classdev *lcdev)
{
	struct rt4505_priv *priv =
		container_of(lcdev, struct rt4505_priv, flash.led_cdev);
	u32 val;
	int ret;

	mutex_lock(&priv->lock);

	ret = regmap_read(priv->regmap, RT4505_REG_ENABLE, &val);
	if (ret) {
		dev_err(lcdev->dev, "Failed to get LED enable\n");
		ret = LED_OFF;
		goto unlock;
	}

	if ((val & RT4505_ENABLE_MASK) != RT4505_TORCH_SET) {
		ret = LED_OFF;
		goto unlock;
	}

	ret = regmap_read(priv->regmap, RT4505_REG_ILED, &val);
	if (ret) {
		dev_err(lcdev->dev, "Failed to get LED brightness\n");
		ret = LED_OFF;
		goto unlock;
	}

	ret = ((val & RT4505_ITORCH_MASK) >> RT4505_ITORCH_SHIFT) + 1;

unlock:
	mutex_unlock(&priv->lock);
	return ret;
}

static int rt4505_flash_brightness_set(struct led_classdev_flash *fled_cdev,
				       u32 brightness)
{
	struct rt4505_priv *priv =
		container_of(fled_cdev, struct rt4505_priv, flash);
	struct led_flash_setting *s = &fled_cdev->brightness;
	u32 val = (brightness - s->min) / s->step;
	int ret;

	mutex_lock(&priv->lock);
	ret = regmap_update_bits(priv->regmap, RT4505_REG_ILED,
				 RT4505_IFLASH_MASK, val);
	mutex_unlock(&priv->lock);

	return ret;
}

static int rt4505_flash_strobe_set(struct led_classdev_flash *fled_cdev,

Annotation

Implementation Notes