Message ID | 20250522143512.112043-8-mathis.foerst@mt.com |
---|---|
State | New |
Headers | show |
Series | MT9M114 driver bugfix and improvements | expand |
Hi Mathis, On Thu, May 22, 2025 at 04:35:11PM +0200, Mathis Foerst wrote: > 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> > --- > drivers/media/i2c/mt9m114.c | 26 +++++++++++++++++++++++--- > 1 file changed, 23 insertions(+), 3 deletions(-) > > diff --git a/drivers/media/i2c/mt9m114.c b/drivers/media/i2c/mt9m114.c > index 9ff46c72dbc1..f3f9ecc0866c 100644 > --- a/drivers/media/i2c/mt9m114.c > +++ b/drivers/media/i2c/mt9m114.c > @@ -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 { > @@ -650,9 +655,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 }, > }; > > /* ----------------------------------------------------------------------------- > @@ -784,6 +786,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; Please drop the redundant parentheses. > + 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; > @@ -2398,6 +2407,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:
diff --git a/drivers/media/i2c/mt9m114.c b/drivers/media/i2c/mt9m114.c index 9ff46c72dbc1..f3f9ecc0866c 100644 --- a/drivers/media/i2c/mt9m114.c +++ b/drivers/media/i2c/mt9m114.c @@ -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 { @@ -650,9 +655,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 }, }; /* ----------------------------------------------------------------------------- @@ -784,6 +786,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; @@ -2398,6 +2407,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: