mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
media: imx355: Use v4l2_link_freq_to_bitmap helper
Use the v4l2_link_freq_to_bitmap() helper to figure out which driver-supported link freq can be used on a given system. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
726a09c1b6
commit
f19cd26566
1 changed files with 14 additions and 39 deletions
|
@ -56,7 +56,7 @@
|
|||
#define IMX355_REG_ORIENTATION 0x0101
|
||||
|
||||
/* default link frequency and external clock */
|
||||
#define IMX355_LINK_FREQ_DEFAULT 360000000
|
||||
#define IMX355_LINK_FREQ_DEFAULT 360000000LL
|
||||
#define IMX355_EXT_CLK 19200000
|
||||
#define IMX355_LINK_FREQ_INDEX 0
|
||||
|
||||
|
@ -93,8 +93,7 @@ struct imx355_mode {
|
|||
|
||||
struct imx355_hwcfg {
|
||||
u32 ext_clk; /* sensor external clk */
|
||||
s64 *link_freqs; /* CSI-2 link frequencies */
|
||||
unsigned int nr_of_link_freqs;
|
||||
unsigned long link_freq_bitmap;
|
||||
};
|
||||
|
||||
struct imx355 {
|
||||
|
@ -115,7 +114,6 @@ struct imx355 {
|
|||
const struct imx355_mode *cur_mode;
|
||||
|
||||
struct imx355_hwcfg *hwcfg;
|
||||
s64 link_def_freq; /* CSI-2 link default frequency */
|
||||
|
||||
/*
|
||||
* Mutex for serialized access:
|
||||
|
@ -879,7 +877,10 @@ static const char * const imx355_test_pattern_menu[] = {
|
|||
"Pseudorandom Sequence (PN9)",
|
||||
};
|
||||
|
||||
/* supported link frequencies */
|
||||
/*
|
||||
* When adding more than the one below, make sure the disallowed ones will
|
||||
* actually be disabled in the LINK_FREQ control.
|
||||
*/
|
||||
static const s64 link_freq_menu_items[] = {
|
||||
IMX355_LINK_FREQ_DEFAULT,
|
||||
};
|
||||
|
@ -1356,7 +1357,7 @@ imx355_set_pad_format(struct v4l2_subdev *sd,
|
|||
*framefmt = fmt->format;
|
||||
} else {
|
||||
imx355->cur_mode = mode;
|
||||
pixel_rate = imx355->link_def_freq * 2 * 4;
|
||||
pixel_rate = IMX355_LINK_FREQ_DEFAULT * 2 * 4;
|
||||
do_div(pixel_rate, 10);
|
||||
__v4l2_ctrl_s_ctrl_int64(imx355->pixel_rate, pixel_rate);
|
||||
/* Update limits and set FPS to default */
|
||||
|
@ -1543,7 +1544,7 @@ static int imx355_init_controls(struct imx355 *imx355)
|
|||
imx355->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
||||
|
||||
/* pixel_rate = link_freq * 2 * nr_of_lanes / bits_per_sample */
|
||||
pixel_rate = imx355->link_def_freq * 2 * 4;
|
||||
pixel_rate = IMX355_LINK_FREQ_DEFAULT * 2 * 4;
|
||||
do_div(pixel_rate, 10);
|
||||
/* By default, PIXEL_RATE is read only */
|
||||
imx355->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops,
|
||||
|
@ -1620,7 +1621,6 @@ static struct imx355_hwcfg *imx355_get_hwcfg(struct device *dev)
|
|||
};
|
||||
struct fwnode_handle *ep;
|
||||
struct fwnode_handle *fwnode = dev_fwnode(dev);
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
if (!fwnode)
|
||||
|
@ -1652,23 +1652,13 @@ static struct imx355_hwcfg *imx355_get_hwcfg(struct device *dev)
|
|||
goto out_err;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "num of link freqs: %d", bus_cfg.nr_of_link_frequencies);
|
||||
if (!bus_cfg.nr_of_link_frequencies) {
|
||||
dev_warn(dev, "no link frequencies defined");
|
||||
ret = v4l2_link_freq_to_bitmap(dev, bus_cfg.link_frequencies,
|
||||
bus_cfg.nr_of_link_frequencies,
|
||||
link_freq_menu_items,
|
||||
ARRAY_SIZE(link_freq_menu_items),
|
||||
&cfg->link_freq_bitmap);
|
||||
if (ret)
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
cfg->nr_of_link_freqs = bus_cfg.nr_of_link_frequencies;
|
||||
cfg->link_freqs = devm_kcalloc(dev,
|
||||
bus_cfg.nr_of_link_frequencies + 1,
|
||||
sizeof(*cfg->link_freqs), GFP_KERNEL);
|
||||
if (!cfg->link_freqs)
|
||||
goto out_err;
|
||||
|
||||
for (i = 0; i < bus_cfg.nr_of_link_frequencies; i++) {
|
||||
cfg->link_freqs[i] = bus_cfg.link_frequencies[i];
|
||||
dev_dbg(dev, "link_freq[%d] = %lld", i, cfg->link_freqs[i]);
|
||||
}
|
||||
|
||||
v4l2_fwnode_endpoint_free(&bus_cfg);
|
||||
fwnode_handle_put(ep);
|
||||
|
@ -1684,7 +1674,6 @@ static int imx355_probe(struct i2c_client *client)
|
|||
{
|
||||
struct imx355 *imx355;
|
||||
int ret;
|
||||
u32 i;
|
||||
|
||||
imx355 = devm_kzalloc(&client->dev, sizeof(*imx355), GFP_KERNEL);
|
||||
if (!imx355)
|
||||
|
@ -1709,20 +1698,6 @@ static int imx355_probe(struct i2c_client *client)
|
|||
goto error_probe;
|
||||
}
|
||||
|
||||
imx355->link_def_freq = link_freq_menu_items[IMX355_LINK_FREQ_INDEX];
|
||||
for (i = 0; i < imx355->hwcfg->nr_of_link_freqs; i++) {
|
||||
if (imx355->hwcfg->link_freqs[i] == imx355->link_def_freq) {
|
||||
dev_dbg(&client->dev, "link freq index %d matched", i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == imx355->hwcfg->nr_of_link_freqs) {
|
||||
dev_err(&client->dev, "no link frequency supported");
|
||||
ret = -EINVAL;
|
||||
goto error_probe;
|
||||
}
|
||||
|
||||
/* Set default mode to max resolution */
|
||||
imx355->cur_mode = &supported_modes[0];
|
||||
|
||||
|
|
Loading…
Reference in a new issue