Thank you JerryChang, that command does indeed work as expected without side-effects.
While looking closer at my camera driver implementation, I noticed that I never check that I can communicate with the camera during X_board_setup
. This has a nice side-effect for me, it guarantees that the /dev/video* order is always the same and matching sensor-id order. I’m just not sure whether there’s a negative side-effect as I now understand that this design doesn’t follow what other camera drivers are doing.
Using nv_imx219
as an example, here is its board_setup
function:
static int imx219_board_setup(struct imx219 *priv)
{
struct camera_common_data *s_data = priv->s_data;
struct camera_common_pdata *pdata = s_data->pdata;
struct device *dev = s_data->dev;
u8 reg_val[2];
int err = 0;
if (pdata->mclk_name) {
err = camera_common_mclk_enable(s_data);
if (err) {
dev_err(dev, "error turning on mclk (%d)\n", err);
goto done;
}
}
err = imx219_power_on(s_data);
if (err) {
dev_err(dev, "error during power on sensor (%d)\n", err);
goto err_power_on;
}
/* Probe sensor model id registers */
err = imx219_read_reg(s_data, IMX219_MODEL_ID_ADDR_MSB, ®_val[0]);
if (err) {
dev_err(dev, "%s: error during i2c read probe (%d)\n",
__func__, err);
goto err_reg_probe;
}
err = imx219_read_reg(s_data, IMX219_MODEL_ID_ADDR_LSB, ®_val[1]);
if (err) {
dev_err(dev, "%s: error during i2c read probe (%d)\n",
__func__, err);
goto err_reg_probe;
}
if (!((reg_val[0] == 0x02) && reg_val[1] == 0x19))
dev_err(dev, "%s: invalid sensor model id: %x%x\n",
__func__, reg_val[0], reg_val[1]);
/* Sensor fine integration time */
err = imx219_get_fine_integ_time(priv, &priv->fine_integ_time);
if (err)
dev_err(dev, "%s: error querying sensor fine integ. time\n",
__func__);
err_reg_probe:
imx219_power_off(s_data);
err_power_on:
if (pdata->mclk_name)
camera_common_mclk_disable(s_data);
done:
return err;
}
Are there any negative side-effects if I would not probe the registers? like this:
static int imx219_board_setup(struct imx219 *priv)
{
struct camera_common_data *s_data = priv->s_data;
struct camera_common_pdata *pdata = s_data->pdata;
struct device *dev = s_data->dev;
u8 reg_val[2];
int err = 0;
if (pdata->mclk_name) {
err = camera_common_mclk_enable(s_data);
if (err) {
dev_err(dev, "error turning on mclk (%d)\n", err);
goto done;
}
}
err = imx219_power_on(s_data);
if (err) {
dev_err(dev, "error during power on sensor (%d)\n", err);
goto err_power_on;
}
imx219_power_off(s_data);
err_power_on:
if (pdata->mclk_name)
camera_common_mclk_disable(s_data);
done:
return err;
}