[PATCH v4 04/14] mfd: lm3533: Pass only regmap and light sensor presence to child devices
From: Svyatoslav Ryhel <hidden>
Date: 2026-06-06 04:58:19
Also in:
dri-devel, linux-devicetree, linux-iio, linux-leds, lkml
Subsystem:
backlight class/subsystem, framebuffer layer, iio subsystem and drivers, led subsystem, multifunction devices (mfd), the rest · Maintainers:
Lee Jones, Daniel Thompson, Jingoo Han, Helge Deller, Jonathan Cameron, Pavel Machek, Linus Torvalds
Instead of passing the entire lm3533 core data structure, only pass the regmap and the light sensor presence flag to child devices. Signed-off-by: Svyatoslav Ryhel <redacted> --- drivers/iio/light/lm3533-als.c | 32 ++++++++++++++--------------- drivers/leds/leds-lm3533.c | 32 ++++++++++++++++------------- drivers/mfd/lm3533-ctrlbank.c | 14 ++++++------- drivers/video/backlight/lm3533_bl.c | 19 +++++++++-------- include/linux/mfd/lm3533.h | 2 +- 5 files changed, 53 insertions(+), 46 deletions(-)
diff --git a/drivers/iio/light/lm3533-als.c b/drivers/iio/light/lm3533-als.c
index 44b104c2d77f..a9af8e2b965f 100644
--- a/drivers/iio/light/lm3533-als.c
+++ b/drivers/iio/light/lm3533-als.c@@ -49,7 +49,7 @@ struct lm3533_als { - struct lm3533 *lm3533; + struct regmap *regmap; struct platform_device *pdev; unsigned long flags;
@@ -73,7 +73,7 @@ static int lm3533_als_get_adc(struct iio_dev *indio_dev, bool average, else reg = LM3533_REG_ALS_READ_ADC_RAW; - ret = regmap_read(als->lm3533->regmap, reg, &val); + ret = regmap_read(als->regmap, reg, &val); if (ret) { dev_err(&indio_dev->dev, "failed to read adc\n"); return ret;
@@ -90,7 +90,7 @@ static int _lm3533_als_get_zone(struct iio_dev *indio_dev, u8 *zone) u32 val; int ret; - ret = regmap_read(als->lm3533->regmap, LM3533_REG_ALS_ZONE_INFO, &val); + ret = regmap_read(als->regmap, LM3533_REG_ALS_ZONE_INFO, &val); if (ret) { dev_err(&indio_dev->dev, "failed to read zone\n"); return ret;
@@ -141,7 +141,7 @@ static int lm3533_als_get_target(struct iio_dev *indio_dev, unsigned channel, return -EINVAL; reg = lm3533_als_get_target_reg(channel, zone); - ret = regmap_read(als->lm3533->regmap, reg, val); + ret = regmap_read(als->regmap, reg, val); if (ret) dev_err(&indio_dev->dev, "failed to get target current\n");
@@ -162,7 +162,7 @@ static int lm3533_als_set_target(struct iio_dev *indio_dev, unsigned channel, return -EINVAL; reg = lm3533_als_get_target_reg(channel, zone); - ret = regmap_write(als->lm3533->regmap, reg, val); + ret = regmap_write(als->regmap, reg, val); if (ret) dev_err(&indio_dev->dev, "failed to set target current\n");
@@ -274,7 +274,7 @@ static int lm3533_als_set_int_mode(struct iio_dev *indio_dev, int enable) struct lm3533_als *als = iio_priv(indio_dev); int ret; - ret = regmap_assign_bits(als->lm3533->regmap, LM3533_REG_ALS_ZONE_INFO, + ret = regmap_assign_bits(als->regmap, LM3533_REG_ALS_ZONE_INFO, LM3533_ALS_INT_ENABLE_MASK, enable); if (ret) { dev_err(&indio_dev->dev, "failed to set int mode %d\n",
@@ -290,7 +290,7 @@ static int lm3533_als_get_int_mode(struct iio_dev *indio_dev, int *enable) struct lm3533_als *als = iio_priv(indio_dev); int ret; - ret = regmap_test_bits(als->lm3533->regmap, LM3533_REG_ALS_ZONE_INFO, + ret = regmap_test_bits(als->regmap, LM3533_REG_ALS_ZONE_INFO, LM3533_ALS_INT_ENABLE_MASK); if (ret < 0) { dev_err(&indio_dev->dev, "failed to get int mode\n");
@@ -320,7 +320,7 @@ static int lm3533_als_get_threshold(struct iio_dev *indio_dev, unsigned nr, return -EINVAL; reg = lm3533_als_get_threshold_reg(nr, raising); - ret = regmap_read(als->lm3533->regmap, reg, val); + ret = regmap_read(als->regmap, reg, val); if (ret) dev_err(&indio_dev->dev, "failed to get threshold\n");
@@ -342,7 +342,7 @@ static int lm3533_als_set_threshold(struct iio_dev *indio_dev, unsigned nr, reg2 = lm3533_als_get_threshold_reg(nr, !raising); mutex_lock(&als->thresh_mutex); - ret = regmap_read(als->lm3533->regmap, reg2, &val2); + ret = regmap_read(als->regmap, reg2, &val2); if (ret) { dev_err(&indio_dev->dev, "failed to get threshold\n"); goto out;
@@ -357,7 +357,7 @@ static int lm3533_als_set_threshold(struct iio_dev *indio_dev, unsigned nr, goto out; } - ret = regmap_write(als->lm3533->regmap, reg, val); + ret = regmap_write(als->regmap, reg, val); if (ret) { dev_err(&indio_dev->dev, "failed to set threshold\n"); goto out;
@@ -712,7 +712,7 @@ static int lm3533_als_set_input_mode(struct lm3533_als *als, bool pwm_mode) { int ret; - ret = regmap_assign_bits(als->lm3533->regmap, LM3533_REG_ALS_CONF, + ret = regmap_assign_bits(als->regmap, LM3533_REG_ALS_CONF, LM3533_ALS_INPUT_MODE_MASK, pwm_mode); if (ret) { dev_err(&als->pdev->dev, "failed to set input mode %d\n",
@@ -732,7 +732,7 @@ static int lm3533_als_set_resistor(struct lm3533_als *als, u8 val) return -EINVAL; } - ret = regmap_write(als->lm3533->regmap, LM3533_REG_ALS_RESISTOR_SELECT, + ret = regmap_write(als->regmap, LM3533_REG_ALS_RESISTOR_SELECT, val); if (ret) { dev_err(&als->pdev->dev, "failed to set resistor\n");
@@ -766,7 +766,7 @@ static int lm3533_als_setup_irq(struct lm3533_als *als, void *dev) int ret; /* Make sure interrupts are disabled. */ - ret = regmap_clear_bits(als->lm3533->regmap, LM3533_REG_ALS_ZONE_INFO, + ret = regmap_clear_bits(als->regmap, LM3533_REG_ALS_ZONE_INFO, LM3533_ALS_INT_ENABLE_MASK); if (ret) { dev_err(&als->pdev->dev, "failed to disable interrupts\n");
@@ -789,7 +789,7 @@ static int lm3533_als_enable(struct lm3533_als *als) { int ret; - ret = regmap_set_bits(als->lm3533->regmap, LM3533_REG_ALS_CONF, + ret = regmap_set_bits(als->regmap, LM3533_REG_ALS_CONF, LM3533_ALS_ENABLE_MASK); if (ret) dev_err(&als->pdev->dev, "failed to enable ALS\n");
@@ -801,7 +801,7 @@ static int lm3533_als_disable(struct lm3533_als *als) { int ret; - ret = regmap_clear_bits(als->lm3533->regmap, LM3533_REG_ALS_CONF, + ret = regmap_clear_bits(als->regmap, LM3533_REG_ALS_CONF, LM3533_ALS_ENABLE_MASK); if (ret) dev_err(&als->pdev->dev, "failed to disable ALS\n");
@@ -845,7 +845,7 @@ static int lm3533_als_probe(struct platform_device *pdev) indio_dev->modes = INDIO_DIRECT_MODE; als = iio_priv(indio_dev); - als->lm3533 = lm3533; + als->regmap = lm3533->regmap; als->pdev = pdev; als->irq = lm3533->irq; atomic_set(&als->zone, 0);
diff --git a/drivers/leds/leds-lm3533.c b/drivers/leds/leds-lm3533.c
index a48991958eae..f57d97201816 100644
--- a/drivers/leds/leds-lm3533.c
+++ b/drivers/leds/leds-lm3533.c@@ -42,13 +42,15 @@ struct lm3533_led { - struct lm3533 *lm3533; + struct regmap *regmap; struct lm3533_ctrlbank cb; struct led_classdev cdev; int id; struct mutex mutex; unsigned long flags; + + bool have_als; };
@@ -96,7 +98,7 @@ static int lm3533_led_pattern_enable(struct lm3533_led *led, int enable) pattern = lm3533_led_get_pattern(led); mask = 1 << (2 * pattern); - ret = regmap_assign_bits(led->lm3533->regmap, + ret = regmap_assign_bits(led->regmap, LM3533_REG_PATTERN_ENABLE, mask, enable); if (ret) { dev_err(led->cdev.dev, "failed to enable pattern %d (%d)\n",
@@ -255,7 +257,7 @@ static u8 lm3533_led_delay_set(struct lm3533_led *led, u8 base, dev_dbg(led->cdev.dev, "%s - %lu: %u (0x%02x)\n", __func__, *delay, t, val); reg = lm3533_led_get_pattern_reg(led, base); - ret = regmap_write(led->lm3533->regmap, reg, val); + ret = regmap_write(led->regmap, reg, val); if (ret) dev_err(led->cdev.dev, "failed to set delay (%02x)\n", reg);
@@ -336,7 +338,7 @@ static ssize_t show_risefalltime(struct device *dev, u32 val; reg = lm3533_led_get_pattern_reg(led, base); - ret = regmap_read(led->lm3533->regmap, reg, &val); + ret = regmap_read(led->regmap, reg, &val); if (ret) return ret;
@@ -371,7 +373,7 @@ static ssize_t store_risefalltime(struct device *dev, return -EINVAL; reg = lm3533_led_get_pattern_reg(led, base); - ret = regmap_write(led->lm3533->regmap, reg, val); + ret = regmap_write(led->regmap, reg, val); if (ret) return ret;
@@ -405,7 +407,7 @@ static ssize_t show_als_channel(struct device *dev, int ret; reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE); - ret = regmap_read(led->lm3533->regmap, reg, &val); + ret = regmap_read(led->regmap, reg, &val); if (ret) return ret;
@@ -437,7 +439,7 @@ static ssize_t store_als_channel(struct device *dev, mask = LM3533_REG_CTRLBANK_BCONF_ALS_CHANNEL_MASK; val = channel - 1; - ret = regmap_update_bits(led->lm3533->regmap, reg, mask, val); + ret = regmap_update_bits(led->regmap, reg, mask, val); if (ret) return ret;
@@ -455,7 +457,7 @@ static ssize_t show_als_en(struct device *dev, int ret; reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE); - ret = regmap_read(led->lm3533->regmap, reg, &val); + ret = regmap_read(led->regmap, reg, &val); if (ret) return ret;
@@ -479,7 +481,7 @@ static ssize_t store_als_en(struct device *dev, reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE); - ret = regmap_assign_bits(led->lm3533->regmap, reg, + ret = regmap_assign_bits(led->regmap, reg, LM3533_REG_CTRLBANK_BCONF_ALS_EN_MASK, enable); if (ret) return ret;
@@ -498,7 +500,7 @@ static ssize_t show_linear(struct device *dev, int ret; reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE); - ret = regmap_read(led->lm3533->regmap, reg, &val); + ret = regmap_read(led->regmap, reg, &val); if (ret) return ret;
@@ -525,7 +527,7 @@ static ssize_t store_linear(struct device *dev, reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE); - ret = regmap_assign_bits(led->lm3533->regmap, reg, + ret = regmap_assign_bits(led->regmap, reg, LM3533_REG_CTRLBANK_BCONF_MAPPING_MASK, linear); if (ret) return ret;
@@ -597,7 +599,7 @@ static umode_t lm3533_led_attr_is_visible(struct kobject *kobj, if (attr == &dev_attr_als_channel.attr || attr == &dev_attr_als_en.attr) { - if (!led->lm3533->have_als) + if (!led->have_als) mode = 0; }
@@ -654,7 +656,9 @@ static int lm3533_led_probe(struct platform_device *pdev) if (!led) return -ENOMEM; - led->lm3533 = lm3533; + led->regmap = lm3533->regmap; + led->have_als = lm3533->have_als; + led->cdev.name = pdata->name; led->cdev.default_trigger = pdata->default_trigger; led->cdev.brightness_set_blocking = lm3533_led_set;
@@ -670,7 +674,7 @@ static int lm3533_led_probe(struct platform_device *pdev) * registration so use parent device (for error reporting) until * registered. */ - led->cb.lm3533 = lm3533; + led->cb.regmap = lm3533->regmap; led->cb.id = lm3533_led_get_ctrlbank_id(led); led->cb.dev = lm3533->dev;
diff --git a/drivers/mfd/lm3533-ctrlbank.c b/drivers/mfd/lm3533-ctrlbank.c
index b78c130d7712..07aec46e8c0a 100644
--- a/drivers/mfd/lm3533-ctrlbank.c
+++ b/drivers/mfd/lm3533-ctrlbank.c@@ -39,7 +39,7 @@ int lm3533_ctrlbank_enable(struct lm3533_ctrlbank *cb) dev_dbg(cb->dev, "%s - %d\n", __func__, cb->id); mask = 1 << cb->id; - ret = regmap_set_bits(cb->lm3533->regmap, LM3533_REG_CTRLBANK_ENABLE, + ret = regmap_set_bits(cb->regmap, LM3533_REG_CTRLBANK_ENABLE, mask); if (ret) dev_err(cb->dev, "failed to enable ctrlbank %d\n", cb->id);
@@ -56,7 +56,7 @@ int lm3533_ctrlbank_disable(struct lm3533_ctrlbank *cb) dev_dbg(cb->dev, "%s - %d\n", __func__, cb->id); mask = 1 << cb->id; - ret = regmap_clear_bits(cb->lm3533->regmap, LM3533_REG_CTRLBANK_ENABLE, + ret = regmap_clear_bits(cb->regmap, LM3533_REG_CTRLBANK_ENABLE, mask); if (ret) dev_err(cb->dev, "failed to disable ctrlbank %d\n", cb->id);
@@ -82,7 +82,7 @@ int lm3533_ctrlbank_set_max_current(struct lm3533_ctrlbank *cb, u16 imax) val = (imax - LM3533_MAX_CURRENT_MIN) / LM3533_MAX_CURRENT_STEP; reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_MAX_CURRENT_BASE); - ret = regmap_write(cb->lm3533->regmap, reg, val); + ret = regmap_write(cb->regmap, reg, val); if (ret) dev_err(cb->dev, "failed to set max current\n");
@@ -96,7 +96,7 @@ int lm3533_ctrlbank_set_brightness(struct lm3533_ctrlbank *cb, u8 val) int ret; reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_BRIGHTNESS_BASE); - ret = regmap_write(cb->lm3533->regmap, reg, val); + ret = regmap_write(cb->regmap, reg, val); if (ret) dev_err(cb->dev, "failed to set brightness\n");
@@ -110,7 +110,7 @@ int lm3533_ctrlbank_get_brightness(struct lm3533_ctrlbank *cb, u32 *val) int ret; reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_BRIGHTNESS_BASE); - ret = regmap_read(cb->lm3533->regmap, reg, val); + ret = regmap_read(cb->regmap, reg, val); if (ret) dev_err(cb->dev, "failed to get brightness\n");
@@ -137,7 +137,7 @@ int lm3533_ctrlbank_set_pwm(struct lm3533_ctrlbank *cb, u8 val) return -EINVAL; reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_PWM_BASE); - ret = regmap_write(cb->lm3533->regmap, reg, val); + ret = regmap_write(cb->regmap, reg, val); if (ret) dev_err(cb->dev, "failed to set PWM mask\n");
@@ -151,7 +151,7 @@ int lm3533_ctrlbank_get_pwm(struct lm3533_ctrlbank *cb, u32 *val) int ret; reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_PWM_BASE); - ret = regmap_read(cb->lm3533->regmap, reg, val); + ret = regmap_read(cb->regmap, reg, val); if (ret) dev_err(cb->dev, "failed to get PWM mask\n");
diff --git a/drivers/video/backlight/lm3533_bl.c b/drivers/video/backlight/lm3533_bl.c
index 03cce6aeb014..39f438114c48 100644
--- a/drivers/video/backlight/lm3533_bl.c
+++ b/drivers/video/backlight/lm3533_bl.c@@ -24,10 +24,12 @@ struct lm3533_bl { - struct lm3533 *lm3533; + struct regmap *regmap; struct lm3533_ctrlbank cb; struct backlight_device *bd; int id; + + bool have_als; };
@@ -88,7 +90,7 @@ static ssize_t show_als_en(struct device *dev, bool enable; int ret; - ret = regmap_read(bl->lm3533->regmap, LM3533_REG_CTRLBANK_AB_BCONF, &val); + ret = regmap_read(bl->regmap, LM3533_REG_CTRLBANK_AB_BCONF, &val); if (ret) return ret;
@@ -113,7 +115,7 @@ static ssize_t store_als_en(struct device *dev, mask = 1 << (2 * ctrlbank); - ret = regmap_assign_bits(bl->lm3533->regmap, LM3533_REG_CTRLBANK_AB_BCONF, + ret = regmap_assign_bits(bl->regmap, LM3533_REG_CTRLBANK_AB_BCONF, mask, enable); if (ret) return ret;
@@ -130,7 +132,7 @@ static ssize_t show_linear(struct device *dev, int linear; int ret; - ret = regmap_read(bl->lm3533->regmap, LM3533_REG_CTRLBANK_AB_BCONF, &val); + ret = regmap_read(bl->regmap, LM3533_REG_CTRLBANK_AB_BCONF, &val); if (ret) return ret;
@@ -158,7 +160,7 @@ static ssize_t store_linear(struct device *dev, mask = 1 << (2 * lm3533_bl_get_ctrlbank_id(bl) + 1); - ret = regmap_assign_bits(bl->lm3533->regmap, LM3533_REG_CTRLBANK_AB_BCONF, + ret = regmap_assign_bits(bl->regmap, LM3533_REG_CTRLBANK_AB_BCONF, mask, linear); if (ret) return ret;
@@ -223,7 +225,7 @@ static umode_t lm3533_bl_attr_is_visible(struct kobject *kobj, if (attr == &dev_attr_als_channel.attr || attr == &dev_attr_als_en.attr) { - if (!bl->lm3533->have_als) + if (!bl->have_als) mode = 0; }
@@ -277,10 +279,11 @@ static int lm3533_bl_probe(struct platform_device *pdev) if (!bl) return -ENOMEM; - bl->lm3533 = lm3533; + bl->regmap = lm3533->regmap; + bl->have_als = lm3533->have_als; bl->id = pdev->id; - bl->cb.lm3533 = lm3533; + bl->cb.regmap = lm3533->regmap; bl->cb.id = lm3533_bl_get_ctrlbank_id(bl); bl->cb.dev = NULL; /* until registered */
diff --git a/include/linux/mfd/lm3533.h b/include/linux/mfd/lm3533.h
index aab8f08dfcb0..696014deaa7c 100644
--- a/include/linux/mfd/lm3533.h
+++ b/include/linux/mfd/lm3533.h@@ -33,7 +33,7 @@ struct lm3533 { }; struct lm3533_ctrlbank { - struct lm3533 *lm3533; + struct regmap *regmap; struct device *dev; int id; };
--
2.53.0