media: mt9m114: Set pad-slew-rate

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>
This commit is contained in:
Mathis Foerst
2025-07-14 09:59:27 +02:00
committed by Hans Verkuil
parent b541288c51
commit 9db72db296

View 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: