drivers/leds/flash/leds-mt6360.c

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

File Facts

System
Linux kernel
Corpus path
drivers/leds/flash/leds-mt6360.c
Extension
.c
Size
22924 bytes
Lines
896
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 mt6360_led {
	union {
		struct led_classdev isnk;
		struct led_classdev_mc mc;
		struct led_classdev_flash flash;
	};
	struct v4l2_flash *v4l2_flash;
	struct mt6360_priv *priv;
	u32 led_no;
	enum led_default_state default_state;
};

struct mt6360_priv {
	struct device *dev;
	struct regmap *regmap;
	struct mutex lock;
	unsigned int fled_strobe_used;
	unsigned int fled_torch_used;
	unsigned int leds_active;
	unsigned int leds_count;
	struct mt6360_led leds[] __counted_by(leds_count);
};

static int mt6360_mc_brightness_set(struct led_classdev *lcdev,
				    enum led_brightness level)
{
	struct led_classdev_mc *mccdev = lcdev_to_mccdev(lcdev);
	struct mt6360_led *led = container_of(mccdev, struct mt6360_led, mc);
	struct mt6360_priv *priv = led->priv;
	u32 real_bright, enable_mask = 0, enable = 0;
	int i, ret;

	mutex_lock(&priv->lock);

	led_mc_calc_color_components(mccdev, level);

	for (i = 0; i < mccdev->num_colors; i++) {
		struct mc_subled *subled = mccdev->subled_info + i;

		real_bright = min(lcdev->max_brightness, subled->brightness);
		ret = regmap_update_bits(priv->regmap, MT6360_REG_ISNK(i),
					 MT6360_ISNK_MASK, real_bright);
		if (ret)
			goto out;

		enable_mask |= MT6360_ISNK_ENMASK(subled->channel);
		if (real_bright)
			enable |= MT6360_ISNK_ENMASK(subled->channel);
	}

	ret = regmap_update_bits(priv->regmap, MT6360_REG_RGBEN, enable_mask,
				 enable);

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

static int mt6360_isnk_brightness_set(struct led_classdev *lcdev,
				      enum led_brightness level)
{
	struct mt6360_led *led = container_of(lcdev, struct mt6360_led, isnk);
	struct mt6360_priv *priv = led->priv;
	u32 enable_mask = MT6360_ISNK_ENMASK(led->led_no);
	u32 val = level ? MT6360_ISNK_ENMASK(led->led_no) : 0;
	int ret;

	mutex_lock(&priv->lock);

	ret = regmap_update_bits(priv->regmap, MT6360_REG_ISNK(led->led_no),
				 MT6360_ISNK_MASK, level);
	if (ret)
		goto out;

	ret = regmap_update_bits(priv->regmap, MT6360_REG_RGBEN, enable_mask,
				 val);

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

static int mt6360_torch_brightness_set(struct led_classdev *lcdev,
				       enum led_brightness level)
{
	struct mt6360_led *led =
		container_of(lcdev, struct mt6360_led, flash.led_cdev);
	struct mt6360_priv *priv = led->priv;
	u32 enable_mask = MT6360_TORCHEN_MASK | MT6360_FLCSEN_MASK(led->led_no);
	u32 val = level ? MT6360_FLCSEN_MASK(led->led_no) : 0;

Annotation

Implementation Notes