* [PATCH 0/5] media: i2c: imx214: Add some style improvements
@ 2025-06-29 14:49 André Apitzsch via B4 Relay
2025-06-29 14:49 ` [PATCH 1/5] media: i2c: imx214: Remove unneeded parentheses André Apitzsch via B4 Relay
` (4 more replies)
0 siblings, 5 replies; 12+ messages in thread
From: André Apitzsch via B4 Relay @ 2025-06-29 14:49 UTC (permalink / raw)
To: Sakari Ailus, Ricardo Ribalda, Mauro Carvalho Chehab, Laurent Pinchart
Cc: ~postmarketos/upstreaming, phone-devel, linux-media,
linux-kernel, André Apitzsch
The following changes have be suggested by Laurent in [1]. But the
related series had already be applied. That's why they are addressed in
this series.
[1] https://lore.kernel.org/linux-media/20250621181751.GA9125@pendragon.ideasonboard.com/
Signed-off-by: André Apitzsch <git@apitzsch.eu>
---
André Apitzsch (5):
media: i2c: imx214: Remove unneeded parentheses
media: i2c: imx214: Drop dev argument from imx214_parse_fwnode()
media: i2c: imx214: Use __free(fwnode_handle)
media: i2c: imx214: Move imx214_pll_update to imx214_ctrls_init
media: i2c: imx214: Separat legacy link frequency check from PLL calculation
drivers/media/i2c/imx214.c | 245 ++++++++++++++++++++++-----------------------
1 file changed, 121 insertions(+), 124 deletions(-)
---
base-commit: 5e2562c1e46d3623fbdef77693f374eade075840
change-id: 20250623-imx214_fixes-123f285f5b62
Best regards,
--
André Apitzsch <git@apitzsch.eu>
^ permalink raw reply [flat|nested] 12+ messages in thread* [PATCH 1/5] media: i2c: imx214: Remove unneeded parentheses 2025-06-29 14:49 [PATCH 0/5] media: i2c: imx214: Add some style improvements André Apitzsch via B4 Relay @ 2025-06-29 14:49 ` André Apitzsch via B4 Relay 2025-06-29 16:56 ` Laurent Pinchart 2025-06-29 14:49 ` [PATCH 2/5] media: i2c: imx214: Drop dev argument from imx214_parse_fwnode() André Apitzsch via B4 Relay ` (3 subsequent siblings) 4 siblings, 1 reply; 12+ messages in thread From: André Apitzsch via B4 Relay @ 2025-06-29 14:49 UTC (permalink / raw) To: Sakari Ailus, Ricardo Ribalda, Mauro Carvalho Chehab, Laurent Pinchart Cc: ~postmarketos/upstreaming, phone-devel, linux-media, linux-kernel, André Apitzsch From: André Apitzsch <git@apitzsch.eu> The parentheses are not needed to calculate bit_rate_mbps. Signed-off-by: André Apitzsch <git@apitzsch.eu> --- drivers/media/i2c/imx214.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c index a0cef9e61b41be8ea76a6d6e4b8c9fc4060cfa0f..8e9b5c9c93b0888f3d6be857168711edaf050db3 100644 --- a/drivers/media/i2c/imx214.c +++ b/drivers/media/i2c/imx214.c @@ -1029,8 +1029,8 @@ static int imx214_start_streaming(struct imx214 *imx214) return ret; } - bit_rate_mbps = (imx214->pll.pixel_rate_csi / 1000000) - * imx214->pll.bits_per_pixel; + bit_rate_mbps = imx214->pll.pixel_rate_csi / 1000000 + * imx214->pll.bits_per_pixel; ret = cci_write(imx214->regmap, IMX214_REG_REQ_LINK_BIT_RATE, IMX214_LINK_BIT_RATE_MBPS(bit_rate_mbps), NULL); if (ret) { -- 2.50.0 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/5] media: i2c: imx214: Remove unneeded parentheses 2025-06-29 14:49 ` [PATCH 1/5] media: i2c: imx214: Remove unneeded parentheses André Apitzsch via B4 Relay @ 2025-06-29 16:56 ` Laurent Pinchart 0 siblings, 0 replies; 12+ messages in thread From: Laurent Pinchart @ 2025-06-29 16:56 UTC (permalink / raw) To: git Cc: Sakari Ailus, Ricardo Ribalda, Mauro Carvalho Chehab, ~postmarketos/upstreaming, phone-devel, linux-media, linux-kernel On Sun, Jun 29, 2025 at 04:49:20PM +0200, André Apitzsch via B4 Relay wrote: > From: André Apitzsch <git@apitzsch.eu> > > The parentheses are not needed to calculate bit_rate_mbps. > > Signed-off-by: André Apitzsch <git@apitzsch.eu> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > drivers/media/i2c/imx214.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c > index a0cef9e61b41be8ea76a6d6e4b8c9fc4060cfa0f..8e9b5c9c93b0888f3d6be857168711edaf050db3 100644 > --- a/drivers/media/i2c/imx214.c > +++ b/drivers/media/i2c/imx214.c > @@ -1029,8 +1029,8 @@ static int imx214_start_streaming(struct imx214 *imx214) > return ret; > } > > - bit_rate_mbps = (imx214->pll.pixel_rate_csi / 1000000) > - * imx214->pll.bits_per_pixel; > + bit_rate_mbps = imx214->pll.pixel_rate_csi / 1000000 > + * imx214->pll.bits_per_pixel; > ret = cci_write(imx214->regmap, IMX214_REG_REQ_LINK_BIT_RATE, > IMX214_LINK_BIT_RATE_MBPS(bit_rate_mbps), NULL); > if (ret) { -- Regards, Laurent Pinchart ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2/5] media: i2c: imx214: Drop dev argument from imx214_parse_fwnode() 2025-06-29 14:49 [PATCH 0/5] media: i2c: imx214: Add some style improvements André Apitzsch via B4 Relay 2025-06-29 14:49 ` [PATCH 1/5] media: i2c: imx214: Remove unneeded parentheses André Apitzsch via B4 Relay @ 2025-06-29 14:49 ` André Apitzsch via B4 Relay 2025-06-29 16:57 ` Laurent Pinchart 2025-06-29 14:49 ` [PATCH 3/5] media: i2c: imx214: Use __free(fwnode_handle) André Apitzsch via B4 Relay ` (2 subsequent siblings) 4 siblings, 1 reply; 12+ messages in thread From: André Apitzsch via B4 Relay @ 2025-06-29 14:49 UTC (permalink / raw) To: Sakari Ailus, Ricardo Ribalda, Mauro Carvalho Chehab, Laurent Pinchart Cc: ~postmarketos/upstreaming, phone-devel, linux-media, linux-kernel, André Apitzsch From: André Apitzsch <git@apitzsch.eu> The device can be accessed from struct imx214. Signed-off-by: André Apitzsch <git@apitzsch.eu> --- drivers/media/i2c/imx214.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c index 8e9b5c9c93b0888f3d6be857168711edaf050db3..d9193bafa3cbb8fec2679200c38d30077d1b11bd 100644 --- a/drivers/media/i2c/imx214.c +++ b/drivers/media/i2c/imx214.c @@ -1324,10 +1324,11 @@ static int imx214_identify_module(struct imx214 *imx214) return 0; } -static int imx214_parse_fwnode(struct device *dev, struct imx214 *imx214) +static int imx214_parse_fwnode(struct imx214 *imx214) { struct v4l2_fwnode_endpoint *bus_cfg = &imx214->bus_cfg; struct fwnode_handle *endpoint; + struct device *dev = imx214->dev; unsigned int i; int ret; @@ -1415,7 +1416,7 @@ static int imx214_probe(struct i2c_client *client) return dev_err_probe(dev, PTR_ERR(imx214->regmap), "failed to initialize CCI\n"); - ret = imx214_parse_fwnode(dev, imx214); + ret = imx214_parse_fwnode(imx214); if (ret) return ret; -- 2.50.0 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/5] media: i2c: imx214: Drop dev argument from imx214_parse_fwnode() 2025-06-29 14:49 ` [PATCH 2/5] media: i2c: imx214: Drop dev argument from imx214_parse_fwnode() André Apitzsch via B4 Relay @ 2025-06-29 16:57 ` Laurent Pinchart 0 siblings, 0 replies; 12+ messages in thread From: Laurent Pinchart @ 2025-06-29 16:57 UTC (permalink / raw) To: git Cc: Sakari Ailus, Ricardo Ribalda, Mauro Carvalho Chehab, ~postmarketos/upstreaming, phone-devel, linux-media, linux-kernel On Sun, Jun 29, 2025 at 04:49:21PM +0200, André Apitzsch via B4 Relay wrote: > From: André Apitzsch <git@apitzsch.eu> > > The device can be accessed from struct imx214. > > Signed-off-by: André Apitzsch <git@apitzsch.eu> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > drivers/media/i2c/imx214.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c > index 8e9b5c9c93b0888f3d6be857168711edaf050db3..d9193bafa3cbb8fec2679200c38d30077d1b11bd 100644 > --- a/drivers/media/i2c/imx214.c > +++ b/drivers/media/i2c/imx214.c > @@ -1324,10 +1324,11 @@ static int imx214_identify_module(struct imx214 *imx214) > return 0; > } > > -static int imx214_parse_fwnode(struct device *dev, struct imx214 *imx214) > +static int imx214_parse_fwnode(struct imx214 *imx214) > { > struct v4l2_fwnode_endpoint *bus_cfg = &imx214->bus_cfg; > struct fwnode_handle *endpoint; > + struct device *dev = imx214->dev; > unsigned int i; > int ret; > > @@ -1415,7 +1416,7 @@ static int imx214_probe(struct i2c_client *client) > return dev_err_probe(dev, PTR_ERR(imx214->regmap), > "failed to initialize CCI\n"); > > - ret = imx214_parse_fwnode(dev, imx214); > + ret = imx214_parse_fwnode(imx214); > if (ret) > return ret; > -- Regards, Laurent Pinchart ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 3/5] media: i2c: imx214: Use __free(fwnode_handle) 2025-06-29 14:49 [PATCH 0/5] media: i2c: imx214: Add some style improvements André Apitzsch via B4 Relay 2025-06-29 14:49 ` [PATCH 1/5] media: i2c: imx214: Remove unneeded parentheses André Apitzsch via B4 Relay 2025-06-29 14:49 ` [PATCH 2/5] media: i2c: imx214: Drop dev argument from imx214_parse_fwnode() André Apitzsch via B4 Relay @ 2025-06-29 14:49 ` André Apitzsch via B4 Relay 2025-06-29 17:16 ` Laurent Pinchart 2025-06-29 14:49 ` [PATCH 4/5] media: i2c: imx214: Move imx214_pll_update to imx214_ctrls_init André Apitzsch via B4 Relay 2025-06-29 14:49 ` [PATCH 5/5] media: i2c: imx214: Separat legacy link frequency check from PLL calculation André Apitzsch via B4 Relay 4 siblings, 1 reply; 12+ messages in thread From: André Apitzsch via B4 Relay @ 2025-06-29 14:49 UTC (permalink / raw) To: Sakari Ailus, Ricardo Ribalda, Mauro Carvalho Chehab, Laurent Pinchart Cc: ~postmarketos/upstreaming, phone-devel, linux-media, linux-kernel, André Apitzsch From: André Apitzsch <git@apitzsch.eu> Use the __free(fwnode_handle) hook to free the endpoint when the function exits to simplify the error path. While at it, simplify return if parsing endpoint node failed. Signed-off-by: André Apitzsch <git@apitzsch.eu> --- drivers/media/i2c/imx214.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c index d9193bafa3cbb8fec2679200c38d30077d1b11bd..b84197ee5177d609b1395e14e1404ffa5b9a6dbf 100644 --- a/drivers/media/i2c/imx214.c +++ b/drivers/media/i2c/imx214.c @@ -1326,8 +1326,8 @@ static int imx214_identify_module(struct imx214 *imx214) static int imx214_parse_fwnode(struct imx214 *imx214) { + struct fwnode_handle *endpoint __free(fwnode_handle) = NULL; struct v4l2_fwnode_endpoint *bus_cfg = &imx214->bus_cfg; - struct fwnode_handle *endpoint; struct device *dev = imx214->dev; unsigned int i; int ret; @@ -1338,11 +1338,8 @@ static int imx214_parse_fwnode(struct imx214 *imx214) bus_cfg->bus_type = V4L2_MBUS_CSI2_DPHY; ret = v4l2_fwnode_endpoint_alloc_parse(endpoint, bus_cfg); - fwnode_handle_put(endpoint); - if (ret) { - dev_err_probe(dev, ret, "parsing endpoint node failed\n"); - goto error; - } + if (ret) + return dev_err_probe(dev, ret, "parsing endpoint node failed\n"); /* Check the number of MIPI CSI2 data lanes */ if (bus_cfg->bus.mipi_csi2.num_data_lanes != 4) { -- 2.50.0 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 3/5] media: i2c: imx214: Use __free(fwnode_handle) 2025-06-29 14:49 ` [PATCH 3/5] media: i2c: imx214: Use __free(fwnode_handle) André Apitzsch via B4 Relay @ 2025-06-29 17:16 ` Laurent Pinchart 0 siblings, 0 replies; 12+ messages in thread From: Laurent Pinchart @ 2025-06-29 17:16 UTC (permalink / raw) To: git Cc: Sakari Ailus, Ricardo Ribalda, Mauro Carvalho Chehab, ~postmarketos/upstreaming, phone-devel, linux-media, linux-kernel Hi André, Thank you for the patch. On Sun, Jun 29, 2025 at 04:49:22PM +0200, André Apitzsch via B4 Relay wrote: > From: André Apitzsch <git@apitzsch.eu> > > Use the __free(fwnode_handle) hook to free the endpoint when the > function exits to simplify the error path. > > While at it, simplify return if parsing endpoint node failed. I think I'd drop this sentence, I don't see where the patch brings a simplification beside the error path simplification mentioned in the previous sentence. > > Signed-off-by: André Apitzsch <git@apitzsch.eu> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > drivers/media/i2c/imx214.c | 9 +++------ > 1 file changed, 3 insertions(+), 6 deletions(-) > > diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c > index d9193bafa3cbb8fec2679200c38d30077d1b11bd..b84197ee5177d609b1395e14e1404ffa5b9a6dbf 100644 > --- a/drivers/media/i2c/imx214.c > +++ b/drivers/media/i2c/imx214.c > @@ -1326,8 +1326,8 @@ static int imx214_identify_module(struct imx214 *imx214) > > static int imx214_parse_fwnode(struct imx214 *imx214) > { > + struct fwnode_handle *endpoint __free(fwnode_handle) = NULL; > struct v4l2_fwnode_endpoint *bus_cfg = &imx214->bus_cfg; > - struct fwnode_handle *endpoint; > struct device *dev = imx214->dev; > unsigned int i; > int ret; > @@ -1338,11 +1338,8 @@ static int imx214_parse_fwnode(struct imx214 *imx214) > > bus_cfg->bus_type = V4L2_MBUS_CSI2_DPHY; > ret = v4l2_fwnode_endpoint_alloc_parse(endpoint, bus_cfg); > - fwnode_handle_put(endpoint); > - if (ret) { > - dev_err_probe(dev, ret, "parsing endpoint node failed\n"); > - goto error; > - } > + if (ret) > + return dev_err_probe(dev, ret, "parsing endpoint node failed\n"); > > /* Check the number of MIPI CSI2 data lanes */ > if (bus_cfg->bus.mipi_csi2.num_data_lanes != 4) { -- Regards, Laurent Pinchart ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/5] media: i2c: imx214: Move imx214_pll_update to imx214_ctrls_init 2025-06-29 14:49 [PATCH 0/5] media: i2c: imx214: Add some style improvements André Apitzsch via B4 Relay ` (2 preceding siblings ...) 2025-06-29 14:49 ` [PATCH 3/5] media: i2c: imx214: Use __free(fwnode_handle) André Apitzsch via B4 Relay @ 2025-06-29 14:49 ` André Apitzsch via B4 Relay 2025-06-29 17:18 ` Laurent Pinchart 2025-06-29 14:49 ` [PATCH 5/5] media: i2c: imx214: Separat legacy link frequency check from PLL calculation André Apitzsch via B4 Relay 4 siblings, 1 reply; 12+ messages in thread From: André Apitzsch via B4 Relay @ 2025-06-29 14:49 UTC (permalink / raw) To: Sakari Ailus, Ricardo Ribalda, Mauro Carvalho Chehab, Laurent Pinchart Cc: ~postmarketos/upstreaming, phone-devel, linux-media, linux-kernel, André Apitzsch From: André Apitzsch <git@apitzsch.eu> It is more logical to call the PLL update in imx214_ctrls_init(). So let's move it there. Signed-off-by: André Apitzsch <git@apitzsch.eu> --- drivers/media/i2c/imx214.c | 219 +++++++++++++++++++++++---------------------- 1 file changed, 110 insertions(+), 109 deletions(-) diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c index b84197ee5177d609b1395e14e1404ffa5b9a6dbf..63cf30acdc241de2f9ab3db339590da4af3d5102 100644 --- a/drivers/media/i2c/imx214.c +++ b/drivers/media/i2c/imx214.c @@ -881,6 +881,109 @@ static const struct v4l2_ctrl_ops imx214_ctrl_ops = { .s_ctrl = imx214_set_ctrl, }; +static int imx214_pll_calculate(struct imx214 *imx214, struct ccs_pll *pll, + unsigned int link_freq) +{ + struct ccs_pll_limits limits = { + .min_ext_clk_freq_hz = 6000000, + .max_ext_clk_freq_hz = 27000000, + + .vt_fr = { + .min_pre_pll_clk_div = 1, + .max_pre_pll_clk_div = 15, + /* Value is educated guess as we don't have a spec */ + .min_pll_ip_clk_freq_hz = 6000000, + /* Value is educated guess as we don't have a spec */ + .max_pll_ip_clk_freq_hz = 12000000, + .min_pll_multiplier = 12, + .max_pll_multiplier = 1200, + .min_pll_op_clk_freq_hz = 338000000, + .max_pll_op_clk_freq_hz = 1200000000, + }, + .vt_bk = { + .min_sys_clk_div = 2, + .max_sys_clk_div = 4, + .min_pix_clk_div = 5, + .max_pix_clk_div = 10, + .min_pix_clk_freq_hz = 30000000, + .max_pix_clk_freq_hz = 120000000, + }, + .op_bk = { + .min_sys_clk_div = 1, + .max_sys_clk_div = 2, + .min_pix_clk_div = 6, + .max_pix_clk_div = 10, + .min_pix_clk_freq_hz = 30000000, + .max_pix_clk_freq_hz = 120000000, + }, + + .min_line_length_pck_bin = IMX214_PPL_DEFAULT, + .min_line_length_pck = IMX214_PPL_DEFAULT, + }; + unsigned int num_lanes = imx214->bus_cfg.bus.mipi_csi2.num_data_lanes; + + /* + * There are no documented constraints on the sys clock frequency, for + * either branch. Recover them based on the PLL output clock frequency + * and sys_clk_div limits on one hand, and the pix clock frequency and + * the pix_clk_div limits on the other hand. + */ + limits.vt_bk.min_sys_clk_freq_hz = + max(limits.vt_fr.min_pll_op_clk_freq_hz / limits.vt_bk.max_sys_clk_div, + limits.vt_bk.min_pix_clk_freq_hz * limits.vt_bk.min_pix_clk_div); + limits.vt_bk.max_sys_clk_freq_hz = + min(limits.vt_fr.max_pll_op_clk_freq_hz / limits.vt_bk.min_sys_clk_div, + limits.vt_bk.max_pix_clk_freq_hz * limits.vt_bk.max_pix_clk_div); + + limits.op_bk.min_sys_clk_freq_hz = + max(limits.vt_fr.min_pll_op_clk_freq_hz / limits.op_bk.max_sys_clk_div, + limits.op_bk.min_pix_clk_freq_hz * limits.op_bk.min_pix_clk_div); + limits.op_bk.max_sys_clk_freq_hz = + min(limits.vt_fr.max_pll_op_clk_freq_hz / limits.op_bk.min_sys_clk_div, + limits.op_bk.max_pix_clk_freq_hz * limits.op_bk.max_pix_clk_div); + + memset(pll, 0, sizeof(*pll)); + + pll->bus_type = CCS_PLL_BUS_TYPE_CSI2_DPHY; + pll->op_lanes = num_lanes; + pll->vt_lanes = num_lanes; + pll->csi2.lanes = num_lanes; + + pll->binning_horizontal = 1; + pll->binning_vertical = 1; + pll->scale_m = 1; + pll->scale_n = 1; + pll->bits_per_pixel = + IMX214_CSI_DATA_FORMAT_RAW10 & IMX214_BITS_PER_PIXEL_MASK; + pll->flags = CCS_PLL_FLAG_LANE_SPEED_MODEL; + pll->link_freq = link_freq; + pll->ext_clk_freq_hz = clk_get_rate(imx214->xclk); + + return ccs_pll_calculate(imx214->dev, &limits, pll); +} + +static int imx214_pll_update(struct imx214 *imx214) +{ + u64 link_freq; + int ret; + + link_freq = imx214->bus_cfg.link_frequencies[imx214->link_freq->val]; + ret = imx214_pll_calculate(imx214, &imx214->pll, link_freq); + if (ret) { + dev_err(imx214->dev, "PLL calculations failed: %d\n", ret); + return ret; + } + + ret = v4l2_ctrl_s_ctrl_int64(imx214->pixel_rate, + imx214->pll.pixel_rate_pixel_array); + if (ret) { + dev_err(imx214->dev, "failed to set pixel rate\n"); + return ret; + } + + return 0; +} + static int imx214_ctrls_init(struct imx214 *imx214) { static const struct v4l2_area unit_size = { @@ -1003,6 +1106,13 @@ static int imx214_ctrls_init(struct imx214 *imx214) return ret; } + ret = imx214_pll_update(imx214); + if (ret < 0) { + v4l2_ctrl_handler_free(ctrl_hdlr); + dev_err(imx214->dev, "failed to update PLL\n"); + return ret; + } + imx214->sd.ctrl_handler = ctrl_hdlr; return 0; @@ -1115,109 +1225,6 @@ static int imx214_s_stream(struct v4l2_subdev *subdev, int enable) return ret; } -static int imx214_pll_calculate(struct imx214 *imx214, struct ccs_pll *pll, - unsigned int link_freq) -{ - struct ccs_pll_limits limits = { - .min_ext_clk_freq_hz = 6000000, - .max_ext_clk_freq_hz = 27000000, - - .vt_fr = { - .min_pre_pll_clk_div = 1, - .max_pre_pll_clk_div = 15, - /* Value is educated guess as we don't have a spec */ - .min_pll_ip_clk_freq_hz = 6000000, - /* Value is educated guess as we don't have a spec */ - .max_pll_ip_clk_freq_hz = 12000000, - .min_pll_multiplier = 12, - .max_pll_multiplier = 1200, - .min_pll_op_clk_freq_hz = 338000000, - .max_pll_op_clk_freq_hz = 1200000000, - }, - .vt_bk = { - .min_sys_clk_div = 2, - .max_sys_clk_div = 4, - .min_pix_clk_div = 5, - .max_pix_clk_div = 10, - .min_pix_clk_freq_hz = 30000000, - .max_pix_clk_freq_hz = 120000000, - }, - .op_bk = { - .min_sys_clk_div = 1, - .max_sys_clk_div = 2, - .min_pix_clk_div = 6, - .max_pix_clk_div = 10, - .min_pix_clk_freq_hz = 30000000, - .max_pix_clk_freq_hz = 120000000, - }, - - .min_line_length_pck_bin = IMX214_PPL_DEFAULT, - .min_line_length_pck = IMX214_PPL_DEFAULT, - }; - unsigned int num_lanes = imx214->bus_cfg.bus.mipi_csi2.num_data_lanes; - - /* - * There are no documented constraints on the sys clock frequency, for - * either branch. Recover them based on the PLL output clock frequency - * and sys_clk_div limits on one hand, and the pix clock frequency and - * the pix_clk_div limits on the other hand. - */ - limits.vt_bk.min_sys_clk_freq_hz = - max(limits.vt_fr.min_pll_op_clk_freq_hz / limits.vt_bk.max_sys_clk_div, - limits.vt_bk.min_pix_clk_freq_hz * limits.vt_bk.min_pix_clk_div); - limits.vt_bk.max_sys_clk_freq_hz = - min(limits.vt_fr.max_pll_op_clk_freq_hz / limits.vt_bk.min_sys_clk_div, - limits.vt_bk.max_pix_clk_freq_hz * limits.vt_bk.max_pix_clk_div); - - limits.op_bk.min_sys_clk_freq_hz = - max(limits.vt_fr.min_pll_op_clk_freq_hz / limits.op_bk.max_sys_clk_div, - limits.op_bk.min_pix_clk_freq_hz * limits.op_bk.min_pix_clk_div); - limits.op_bk.max_sys_clk_freq_hz = - min(limits.vt_fr.max_pll_op_clk_freq_hz / limits.op_bk.min_sys_clk_div, - limits.op_bk.max_pix_clk_freq_hz * limits.op_bk.max_pix_clk_div); - - memset(pll, 0, sizeof(*pll)); - - pll->bus_type = CCS_PLL_BUS_TYPE_CSI2_DPHY; - pll->op_lanes = num_lanes; - pll->vt_lanes = num_lanes; - pll->csi2.lanes = num_lanes; - - pll->binning_horizontal = 1; - pll->binning_vertical = 1; - pll->scale_m = 1; - pll->scale_n = 1; - pll->bits_per_pixel = - IMX214_CSI_DATA_FORMAT_RAW10 & IMX214_BITS_PER_PIXEL_MASK; - pll->flags = CCS_PLL_FLAG_LANE_SPEED_MODEL; - pll->link_freq = link_freq; - pll->ext_clk_freq_hz = clk_get_rate(imx214->xclk); - - return ccs_pll_calculate(imx214->dev, &limits, pll); -} - -static int imx214_pll_update(struct imx214 *imx214) -{ - u64 link_freq; - int ret; - - link_freq = imx214->bus_cfg.link_frequencies[imx214->link_freq->val]; - ret = imx214_pll_calculate(imx214, &imx214->pll, link_freq); - if (ret) { - dev_err(imx214->dev, "PLL calculations failed: %d\n", ret); - return ret; - } - - ret = v4l2_ctrl_s_ctrl_int64(imx214->pixel_rate, - imx214->pll.pixel_rate_pixel_array); - if (ret) { - dev_err(imx214->dev, "failed to set pixel rate\n"); - return ret; - } - - return 0; -} - static int imx214_get_frame_interval(struct v4l2_subdev *subdev, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_frame_interval *fival) @@ -1457,12 +1464,6 @@ static int imx214_probe(struct i2c_client *client) pm_runtime_set_active(imx214->dev); pm_runtime_enable(imx214->dev); - ret = imx214_pll_update(imx214); - if (ret < 0) { - dev_err_probe(dev, ret, "failed to update PLL\n"); - goto error_subdev_cleanup; - } - ret = v4l2_async_register_subdev_sensor(&imx214->sd); if (ret < 0) { dev_err_probe(dev, ret, -- 2.50.0 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 4/5] media: i2c: imx214: Move imx214_pll_update to imx214_ctrls_init 2025-06-29 14:49 ` [PATCH 4/5] media: i2c: imx214: Move imx214_pll_update to imx214_ctrls_init André Apitzsch via B4 Relay @ 2025-06-29 17:18 ` Laurent Pinchart 0 siblings, 0 replies; 12+ messages in thread From: Laurent Pinchart @ 2025-06-29 17:18 UTC (permalink / raw) To: git Cc: Sakari Ailus, Ricardo Ribalda, Mauro Carvalho Chehab, ~postmarketos/upstreaming, phone-devel, linux-media, linux-kernel On Sun, Jun 29, 2025 at 04:49:23PM +0200, André Apitzsch via B4 Relay wrote: > From: André Apitzsch <git@apitzsch.eu> > > It is more logical to call the PLL update in imx214_ctrls_init(). So > let's move it there. > > Signed-off-by: André Apitzsch <git@apitzsch.eu> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > drivers/media/i2c/imx214.c | 219 +++++++++++++++++++++++---------------------- > 1 file changed, 110 insertions(+), 109 deletions(-) > > diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c > index b84197ee5177d609b1395e14e1404ffa5b9a6dbf..63cf30acdc241de2f9ab3db339590da4af3d5102 100644 > --- a/drivers/media/i2c/imx214.c > +++ b/drivers/media/i2c/imx214.c > @@ -881,6 +881,109 @@ static const struct v4l2_ctrl_ops imx214_ctrl_ops = { > .s_ctrl = imx214_set_ctrl, > }; > > +static int imx214_pll_calculate(struct imx214 *imx214, struct ccs_pll *pll, > + unsigned int link_freq) > +{ > + struct ccs_pll_limits limits = { > + .min_ext_clk_freq_hz = 6000000, > + .max_ext_clk_freq_hz = 27000000, > + > + .vt_fr = { > + .min_pre_pll_clk_div = 1, > + .max_pre_pll_clk_div = 15, > + /* Value is educated guess as we don't have a spec */ > + .min_pll_ip_clk_freq_hz = 6000000, > + /* Value is educated guess as we don't have a spec */ > + .max_pll_ip_clk_freq_hz = 12000000, > + .min_pll_multiplier = 12, > + .max_pll_multiplier = 1200, > + .min_pll_op_clk_freq_hz = 338000000, > + .max_pll_op_clk_freq_hz = 1200000000, > + }, > + .vt_bk = { > + .min_sys_clk_div = 2, > + .max_sys_clk_div = 4, > + .min_pix_clk_div = 5, > + .max_pix_clk_div = 10, > + .min_pix_clk_freq_hz = 30000000, > + .max_pix_clk_freq_hz = 120000000, > + }, > + .op_bk = { > + .min_sys_clk_div = 1, > + .max_sys_clk_div = 2, > + .min_pix_clk_div = 6, > + .max_pix_clk_div = 10, > + .min_pix_clk_freq_hz = 30000000, > + .max_pix_clk_freq_hz = 120000000, > + }, > + > + .min_line_length_pck_bin = IMX214_PPL_DEFAULT, > + .min_line_length_pck = IMX214_PPL_DEFAULT, > + }; > + unsigned int num_lanes = imx214->bus_cfg.bus.mipi_csi2.num_data_lanes; > + > + /* > + * There are no documented constraints on the sys clock frequency, for > + * either branch. Recover them based on the PLL output clock frequency > + * and sys_clk_div limits on one hand, and the pix clock frequency and > + * the pix_clk_div limits on the other hand. > + */ > + limits.vt_bk.min_sys_clk_freq_hz = > + max(limits.vt_fr.min_pll_op_clk_freq_hz / limits.vt_bk.max_sys_clk_div, > + limits.vt_bk.min_pix_clk_freq_hz * limits.vt_bk.min_pix_clk_div); > + limits.vt_bk.max_sys_clk_freq_hz = > + min(limits.vt_fr.max_pll_op_clk_freq_hz / limits.vt_bk.min_sys_clk_div, > + limits.vt_bk.max_pix_clk_freq_hz * limits.vt_bk.max_pix_clk_div); > + > + limits.op_bk.min_sys_clk_freq_hz = > + max(limits.vt_fr.min_pll_op_clk_freq_hz / limits.op_bk.max_sys_clk_div, > + limits.op_bk.min_pix_clk_freq_hz * limits.op_bk.min_pix_clk_div); > + limits.op_bk.max_sys_clk_freq_hz = > + min(limits.vt_fr.max_pll_op_clk_freq_hz / limits.op_bk.min_sys_clk_div, > + limits.op_bk.max_pix_clk_freq_hz * limits.op_bk.max_pix_clk_div); > + > + memset(pll, 0, sizeof(*pll)); > + > + pll->bus_type = CCS_PLL_BUS_TYPE_CSI2_DPHY; > + pll->op_lanes = num_lanes; > + pll->vt_lanes = num_lanes; > + pll->csi2.lanes = num_lanes; > + > + pll->binning_horizontal = 1; > + pll->binning_vertical = 1; > + pll->scale_m = 1; > + pll->scale_n = 1; > + pll->bits_per_pixel = > + IMX214_CSI_DATA_FORMAT_RAW10 & IMX214_BITS_PER_PIXEL_MASK; > + pll->flags = CCS_PLL_FLAG_LANE_SPEED_MODEL; > + pll->link_freq = link_freq; > + pll->ext_clk_freq_hz = clk_get_rate(imx214->xclk); > + > + return ccs_pll_calculate(imx214->dev, &limits, pll); > +} > + > +static int imx214_pll_update(struct imx214 *imx214) > +{ > + u64 link_freq; > + int ret; > + > + link_freq = imx214->bus_cfg.link_frequencies[imx214->link_freq->val]; > + ret = imx214_pll_calculate(imx214, &imx214->pll, link_freq); > + if (ret) { > + dev_err(imx214->dev, "PLL calculations failed: %d\n", ret); > + return ret; > + } > + > + ret = v4l2_ctrl_s_ctrl_int64(imx214->pixel_rate, > + imx214->pll.pixel_rate_pixel_array); > + if (ret) { > + dev_err(imx214->dev, "failed to set pixel rate\n"); > + return ret; > + } > + > + return 0; > +} > + > static int imx214_ctrls_init(struct imx214 *imx214) > { > static const struct v4l2_area unit_size = { > @@ -1003,6 +1106,13 @@ static int imx214_ctrls_init(struct imx214 *imx214) > return ret; > } > > + ret = imx214_pll_update(imx214); > + if (ret < 0) { > + v4l2_ctrl_handler_free(ctrl_hdlr); > + dev_err(imx214->dev, "failed to update PLL\n"); > + return ret; > + } > + > imx214->sd.ctrl_handler = ctrl_hdlr; > > return 0; > @@ -1115,109 +1225,6 @@ static int imx214_s_stream(struct v4l2_subdev *subdev, int enable) > return ret; > } > > -static int imx214_pll_calculate(struct imx214 *imx214, struct ccs_pll *pll, > - unsigned int link_freq) > -{ > - struct ccs_pll_limits limits = { > - .min_ext_clk_freq_hz = 6000000, > - .max_ext_clk_freq_hz = 27000000, > - > - .vt_fr = { > - .min_pre_pll_clk_div = 1, > - .max_pre_pll_clk_div = 15, > - /* Value is educated guess as we don't have a spec */ > - .min_pll_ip_clk_freq_hz = 6000000, > - /* Value is educated guess as we don't have a spec */ > - .max_pll_ip_clk_freq_hz = 12000000, > - .min_pll_multiplier = 12, > - .max_pll_multiplier = 1200, > - .min_pll_op_clk_freq_hz = 338000000, > - .max_pll_op_clk_freq_hz = 1200000000, > - }, > - .vt_bk = { > - .min_sys_clk_div = 2, > - .max_sys_clk_div = 4, > - .min_pix_clk_div = 5, > - .max_pix_clk_div = 10, > - .min_pix_clk_freq_hz = 30000000, > - .max_pix_clk_freq_hz = 120000000, > - }, > - .op_bk = { > - .min_sys_clk_div = 1, > - .max_sys_clk_div = 2, > - .min_pix_clk_div = 6, > - .max_pix_clk_div = 10, > - .min_pix_clk_freq_hz = 30000000, > - .max_pix_clk_freq_hz = 120000000, > - }, > - > - .min_line_length_pck_bin = IMX214_PPL_DEFAULT, > - .min_line_length_pck = IMX214_PPL_DEFAULT, > - }; > - unsigned int num_lanes = imx214->bus_cfg.bus.mipi_csi2.num_data_lanes; > - > - /* > - * There are no documented constraints on the sys clock frequency, for > - * either branch. Recover them based on the PLL output clock frequency > - * and sys_clk_div limits on one hand, and the pix clock frequency and > - * the pix_clk_div limits on the other hand. > - */ > - limits.vt_bk.min_sys_clk_freq_hz = > - max(limits.vt_fr.min_pll_op_clk_freq_hz / limits.vt_bk.max_sys_clk_div, > - limits.vt_bk.min_pix_clk_freq_hz * limits.vt_bk.min_pix_clk_div); > - limits.vt_bk.max_sys_clk_freq_hz = > - min(limits.vt_fr.max_pll_op_clk_freq_hz / limits.vt_bk.min_sys_clk_div, > - limits.vt_bk.max_pix_clk_freq_hz * limits.vt_bk.max_pix_clk_div); > - > - limits.op_bk.min_sys_clk_freq_hz = > - max(limits.vt_fr.min_pll_op_clk_freq_hz / limits.op_bk.max_sys_clk_div, > - limits.op_bk.min_pix_clk_freq_hz * limits.op_bk.min_pix_clk_div); > - limits.op_bk.max_sys_clk_freq_hz = > - min(limits.vt_fr.max_pll_op_clk_freq_hz / limits.op_bk.min_sys_clk_div, > - limits.op_bk.max_pix_clk_freq_hz * limits.op_bk.max_pix_clk_div); > - > - memset(pll, 0, sizeof(*pll)); > - > - pll->bus_type = CCS_PLL_BUS_TYPE_CSI2_DPHY; > - pll->op_lanes = num_lanes; > - pll->vt_lanes = num_lanes; > - pll->csi2.lanes = num_lanes; > - > - pll->binning_horizontal = 1; > - pll->binning_vertical = 1; > - pll->scale_m = 1; > - pll->scale_n = 1; > - pll->bits_per_pixel = > - IMX214_CSI_DATA_FORMAT_RAW10 & IMX214_BITS_PER_PIXEL_MASK; > - pll->flags = CCS_PLL_FLAG_LANE_SPEED_MODEL; > - pll->link_freq = link_freq; > - pll->ext_clk_freq_hz = clk_get_rate(imx214->xclk); > - > - return ccs_pll_calculate(imx214->dev, &limits, pll); > -} > - > -static int imx214_pll_update(struct imx214 *imx214) > -{ > - u64 link_freq; > - int ret; > - > - link_freq = imx214->bus_cfg.link_frequencies[imx214->link_freq->val]; > - ret = imx214_pll_calculate(imx214, &imx214->pll, link_freq); > - if (ret) { > - dev_err(imx214->dev, "PLL calculations failed: %d\n", ret); > - return ret; > - } > - > - ret = v4l2_ctrl_s_ctrl_int64(imx214->pixel_rate, > - imx214->pll.pixel_rate_pixel_array); > - if (ret) { > - dev_err(imx214->dev, "failed to set pixel rate\n"); > - return ret; > - } > - > - return 0; > -} > - > static int imx214_get_frame_interval(struct v4l2_subdev *subdev, > struct v4l2_subdev_state *sd_state, > struct v4l2_subdev_frame_interval *fival) > @@ -1457,12 +1464,6 @@ static int imx214_probe(struct i2c_client *client) > pm_runtime_set_active(imx214->dev); > pm_runtime_enable(imx214->dev); > > - ret = imx214_pll_update(imx214); > - if (ret < 0) { > - dev_err_probe(dev, ret, "failed to update PLL\n"); > - goto error_subdev_cleanup; > - } > - > ret = v4l2_async_register_subdev_sensor(&imx214->sd); > if (ret < 0) { > dev_err_probe(dev, ret, -- Regards, Laurent Pinchart ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 5/5] media: i2c: imx214: Separat legacy link frequency check from PLL calculation 2025-06-29 14:49 [PATCH 0/5] media: i2c: imx214: Add some style improvements André Apitzsch via B4 Relay ` (3 preceding siblings ...) 2025-06-29 14:49 ` [PATCH 4/5] media: i2c: imx214: Move imx214_pll_update to imx214_ctrls_init André Apitzsch via B4 Relay @ 2025-06-29 14:49 ` André Apitzsch via B4 Relay 2025-06-29 17:05 ` Markus Elfring 2025-06-29 17:20 ` Laurent Pinchart 4 siblings, 2 replies; 12+ messages in thread From: André Apitzsch via B4 Relay @ 2025-06-29 14:49 UTC (permalink / raw) To: Sakari Ailus, Ricardo Ribalda, Mauro Carvalho Chehab, Laurent Pinchart Cc: ~postmarketos/upstreaming, phone-devel, linux-media, linux-kernel, André Apitzsch From: André Apitzsch <git@apitzsch.eu> This makes it easier to drop this legacy support from the driver later. Signed-off-by: André Apitzsch <git@apitzsch.eu> --- drivers/media/i2c/imx214.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c index 63cf30acdc241de2f9ab3db339590da4af3d5102..52433775e9baddd8ab988e866a83387d53c1fd5c 100644 --- a/drivers/media/i2c/imx214.c +++ b/drivers/media/i2c/imx214.c @@ -1362,18 +1362,16 @@ static int imx214_parse_fwnode(struct imx214 *imx214) u64 freq = bus_cfg->link_frequencies[i]; struct ccs_pll pll; - if (!imx214_pll_calculate(imx214, &pll, freq)) - break; if (freq == IMX214_DEFAULT_LINK_FREQ_LEGACY) { dev_warn(dev, "link-frequencies %d not supported, please review your DT. Continuing anyway\n", IMX214_DEFAULT_LINK_FREQ); freq = IMX214_DEFAULT_LINK_FREQ; - if (imx214_pll_calculate(imx214, &pll, freq)) - continue; bus_cfg->link_frequencies[i] = freq; - break; } + + if (!imx214_pll_calculate(imx214, &pll, freq)) + break; } if (i == bus_cfg->nr_of_link_frequencies) -- 2.50.0 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 5/5] media: i2c: imx214: Separat legacy link frequency check from PLL calculation 2025-06-29 14:49 ` [PATCH 5/5] media: i2c: imx214: Separat legacy link frequency check from PLL calculation André Apitzsch via B4 Relay @ 2025-06-29 17:05 ` Markus Elfring 2025-06-29 17:20 ` Laurent Pinchart 1 sibling, 0 replies; 12+ messages in thread From: Markus Elfring @ 2025-06-29 17:05 UTC (permalink / raw) To: André Apitzsch, linux-media, phone-devel Cc: LKML, ~postmarketos/upstreaming, Laurent Pinchart, Mauro Carvalho Chehab, Ricardo Ribalda Delgado, Sakari Ailus > This makes it easier to drop this legacy support from the driver later. How do you think about to avoid a typo in the summary phrase? See also: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.16-rc3#n94 Regards, Markus ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 5/5] media: i2c: imx214: Separat legacy link frequency check from PLL calculation 2025-06-29 14:49 ` [PATCH 5/5] media: i2c: imx214: Separat legacy link frequency check from PLL calculation André Apitzsch via B4 Relay 2025-06-29 17:05 ` Markus Elfring @ 2025-06-29 17:20 ` Laurent Pinchart 1 sibling, 0 replies; 12+ messages in thread From: Laurent Pinchart @ 2025-06-29 17:20 UTC (permalink / raw) To: git Cc: Sakari Ailus, Ricardo Ribalda, Mauro Carvalho Chehab, ~postmarketos/upstreaming, phone-devel, linux-media, linux-kernel Hi André, Thank you for the patch. s/Separat/Separate/ in the subject line. On Sun, Jun 29, 2025 at 04:49:24PM +0200, André Apitzsch via B4 Relay wrote: > From: André Apitzsch <git@apitzsch.eu> > > This makes it easier to drop this legacy support from the driver later. > > Signed-off-by: André Apitzsch <git@apitzsch.eu> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > drivers/media/i2c/imx214.c | 8 +++----- > 1 file changed, 3 insertions(+), 5 deletions(-) > > diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c > index 63cf30acdc241de2f9ab3db339590da4af3d5102..52433775e9baddd8ab988e866a83387d53c1fd5c 100644 > --- a/drivers/media/i2c/imx214.c > +++ b/drivers/media/i2c/imx214.c > @@ -1362,18 +1362,16 @@ static int imx214_parse_fwnode(struct imx214 *imx214) > u64 freq = bus_cfg->link_frequencies[i]; > struct ccs_pll pll; > > - if (!imx214_pll_calculate(imx214, &pll, freq)) > - break; > if (freq == IMX214_DEFAULT_LINK_FREQ_LEGACY) { > dev_warn(dev, > "link-frequencies %d not supported, please review your DT. Continuing anyway\n", > IMX214_DEFAULT_LINK_FREQ); > freq = IMX214_DEFAULT_LINK_FREQ; > - if (imx214_pll_calculate(imx214, &pll, freq)) > - continue; > bus_cfg->link_frequencies[i] = freq; > - break; > } > + > + if (!imx214_pll_calculate(imx214, &pll, freq)) > + break; > } > > if (i == bus_cfg->nr_of_link_frequencies) -- Regards, Laurent Pinchart ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2025-06-29 17:20 UTC | newest] Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-06-29 14:49 [PATCH 0/5] media: i2c: imx214: Add some style improvements André Apitzsch via B4 Relay 2025-06-29 14:49 ` [PATCH 1/5] media: i2c: imx214: Remove unneeded parentheses André Apitzsch via B4 Relay 2025-06-29 16:56 ` Laurent Pinchart 2025-06-29 14:49 ` [PATCH 2/5] media: i2c: imx214: Drop dev argument from imx214_parse_fwnode() André Apitzsch via B4 Relay 2025-06-29 16:57 ` Laurent Pinchart 2025-06-29 14:49 ` [PATCH 3/5] media: i2c: imx214: Use __free(fwnode_handle) André Apitzsch via B4 Relay 2025-06-29 17:16 ` Laurent Pinchart 2025-06-29 14:49 ` [PATCH 4/5] media: i2c: imx214: Move imx214_pll_update to imx214_ctrls_init André Apitzsch via B4 Relay 2025-06-29 17:18 ` Laurent Pinchart 2025-06-29 14:49 ` [PATCH 5/5] media: i2c: imx214: Separat legacy link frequency check from PLL calculation André Apitzsch via B4 Relay 2025-06-29 17:05 ` Markus Elfring 2025-06-29 17:20 ` Laurent Pinchart
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®