mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
media: imx319: 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
afa6f62e46
commit
726a09c1b6
1 changed files with 14 additions and 39 deletions
|
@ -70,7 +70,7 @@
|
|||
#define IMX319_REG_ORIENTATION 0x0101
|
||||
|
||||
/* default link frequency and external clock */
|
||||
#define IMX319_LINK_FREQ_DEFAULT 482400000
|
||||
#define IMX319_LINK_FREQ_DEFAULT 482400000LL
|
||||
#define IMX319_EXT_CLK 19200000
|
||||
#define IMX319_LINK_FREQ_INDEX 0
|
||||
|
||||
|
@ -107,8 +107,7 @@ struct imx319_mode {
|
|||
|
||||
struct imx319_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 imx319 {
|
||||
|
@ -129,7 +128,6 @@ struct imx319 {
|
|||
const struct imx319_mode *cur_mode;
|
||||
|
||||
struct imx319_hwcfg *hwcfg;
|
||||
s64 link_def_freq; /* CSI-2 link default frequency */
|
||||
|
||||
/*
|
||||
* Mutex for serialized access:
|
||||
|
@ -1654,7 +1652,10 @@ static const char * const imx319_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[] = {
|
||||
IMX319_LINK_FREQ_DEFAULT,
|
||||
};
|
||||
|
@ -2058,7 +2059,7 @@ imx319_set_pad_format(struct v4l2_subdev *sd,
|
|||
*framefmt = fmt->format;
|
||||
} else {
|
||||
imx319->cur_mode = mode;
|
||||
pixel_rate = imx319->link_def_freq * 2 * 4;
|
||||
pixel_rate = IMX319_LINK_FREQ_DEFAULT * 2 * 4;
|
||||
do_div(pixel_rate, 10);
|
||||
__v4l2_ctrl_s_ctrl_int64(imx319->pixel_rate, pixel_rate);
|
||||
/* Update limits and set FPS to default */
|
||||
|
@ -2255,7 +2256,7 @@ static int imx319_init_controls(struct imx319 *imx319)
|
|||
imx319->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
||||
|
||||
/* pixel_rate = link_freq * 2 * nr_of_lanes / bits_per_sample */
|
||||
pixel_rate = imx319->link_def_freq * 2 * 4;
|
||||
pixel_rate = IMX319_LINK_FREQ_DEFAULT * 2 * 4;
|
||||
do_div(pixel_rate, 10);
|
||||
/* By default, PIXEL_RATE is read only */
|
||||
imx319->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
|
||||
|
@ -2332,7 +2333,6 @@ static struct imx319_hwcfg *imx319_get_hwcfg(struct device *dev)
|
|||
};
|
||||
struct fwnode_handle *ep;
|
||||
struct fwnode_handle *fwnode = dev_fwnode(dev);
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
if (!fwnode)
|
||||
|
@ -2364,23 +2364,13 @@ static struct imx319_hwcfg *imx319_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);
|
||||
|
@ -2397,7 +2387,6 @@ static int imx319_probe(struct i2c_client *client)
|
|||
struct imx319 *imx319;
|
||||
bool full_power;
|
||||
int ret;
|
||||
u32 i;
|
||||
|
||||
imx319 = devm_kzalloc(&client->dev, sizeof(*imx319), GFP_KERNEL);
|
||||
if (!imx319)
|
||||
|
@ -2425,20 +2414,6 @@ static int imx319_probe(struct i2c_client *client)
|
|||
goto error_probe;
|
||||
}
|
||||
|
||||
imx319->link_def_freq = link_freq_menu_items[IMX319_LINK_FREQ_INDEX];
|
||||
for (i = 0; i < imx319->hwcfg->nr_of_link_freqs; i++) {
|
||||
if (imx319->hwcfg->link_freqs[i] == imx319->link_def_freq) {
|
||||
dev_dbg(&client->dev, "link freq index %d matched", i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == imx319->hwcfg->nr_of_link_freqs) {
|
||||
dev_err(&client->dev, "no link frequency supported");
|
||||
ret = -EINVAL;
|
||||
goto error_probe;
|
||||
}
|
||||
|
||||
/* Set default mode to max resolution */
|
||||
imx319->cur_mode = &supported_modes[0];
|
||||
|
||||
|
|
Loading…
Reference in a new issue