]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: mt9m114: Set pad-slew-rate
authorMathis Foerst <mathis.foerst@mt.com>
Mon, 14 Jul 2025 07:59:27 +0000 (09:59 +0200)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Mon, 25 Aug 2025 13:40:38 +0000 (15:40 +0200)
The MT9M114 supports the different slew rates (0 to 7) on the output pads.
At the moment, this is hardcoded to 7 (the fastest rate).
The user might want to change this values due to EMC requirements.

Read the 'slew-rate' from the DT and configure the pad slew rates of
the output pads accordingly in mt9m114_initialize().
Remove the hardcoded slew rate setting from the mt9m114_init table.

Signed-off-by: Mathis Foerst <mathis.foerst@mt.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/i2c/mt9m114.c

index 54de62b46f40bbafbfc2ac74223182a37fae5451..21e5bb94cd0a04bbef3a652b7b870da4b9f71934 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/pm_runtime.h>
+#include <linux/property.h>
 #include <linux/regmap.h>
 #include <linux/regulator/consumer.h>
 #include <linux/types.h>
@@ -42,6 +43,9 @@
 #define MT9M114_RESET_AND_MISC_CONTROL                 CCI_REG16(0x001a)
 #define MT9M114_RESET_SOC                                      BIT(0)
 #define MT9M114_PAD_SLEW                               CCI_REG16(0x001e)
+#define MT9M114_PAD_SLEW_MIN                                   0
+#define MT9M114_PAD_SLEW_MAX                                   7
+#define MT9M114_PAD_SLEW_DEFAULT                               7
 #define MT9M114_PAD_CONTROL                            CCI_REG16(0x0032)
 
 /* XDMA registers */
@@ -388,6 +392,7 @@ struct mt9m114 {
 
        unsigned int pixrate;
        bool streaming;
+       u32 pad_slew_rate;
 
        /* Pixel Array */
        struct {
@@ -645,9 +650,6 @@ static const struct cci_reg_sequence mt9m114_init[] = {
        { MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MAX,   1459 },
        { MT9M114_CAM_SENSOR_CFG_FINE_CORRECTION,       96 },
        { MT9M114_CAM_SENSOR_CFG_REG_0_DATA,            32 },
-
-       /* Miscellaneous settings */
-       { MT9M114_PAD_SLEW,                             0x0777 },
 };
 
 /* -----------------------------------------------------------------------------
@@ -779,6 +781,13 @@ static int mt9m114_initialize(struct mt9m114 *sensor)
        if (ret < 0)
                return ret;
 
+       value = sensor->pad_slew_rate
+             | sensor->pad_slew_rate << 4
+             | sensor->pad_slew_rate << 8;
+       cci_write(sensor->regmap, MT9M114_PAD_SLEW, value, &ret);
+       if (ret < 0)
+               return ret;
+
        ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE);
        if (ret < 0)
                return ret;
@@ -2382,6 +2391,17 @@ static int mt9m114_parse_dt(struct mt9m114 *sensor)
                goto error;
        }
 
+       sensor->pad_slew_rate = MT9M114_PAD_SLEW_DEFAULT;
+       device_property_read_u32(&sensor->client->dev, "slew-rate",
+                                &sensor->pad_slew_rate);
+
+       if (sensor->pad_slew_rate < MT9M114_PAD_SLEW_MIN ||
+           sensor->pad_slew_rate > MT9M114_PAD_SLEW_MAX) {
+               dev_err(&sensor->client->dev, "Invalid slew-rate %u\n",
+                       sensor->pad_slew_rate);
+               return -EINVAL;
+       }
+
        return 0;
 
 error: