Re: [PATCH v2 035/106] ccs: Read CCS static data from firmware binaries

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Em Wed,  7 Oct 2020 11:44:48 +0300
Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> escreveu:

> Read the CCS static data for sensors and modules. The files are expected
> to be found in "ccs" directory.
> 
> Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>
> ---
>  drivers/media/i2c/ccs/ccs-core.c | 30 ++++++++++++++++++++++++++++++
>  drivers/media/i2c/ccs/ccs.h      |  2 ++
>  2 files changed, 32 insertions(+)
> 
> diff --git a/drivers/media/i2c/ccs/ccs-core.c b/drivers/media/i2c/ccs/ccs-core.c
> index 34e86ddbb06a..0cc6e7423f26 100644
> --- a/drivers/media/i2c/ccs/ccs-core.c
> +++ b/drivers/media/i2c/ccs/ccs-core.c
> @@ -16,6 +16,7 @@
>  #include <linux/clk.h>
>  #include <linux/delay.h>
>  #include <linux/device.h>
> +#include <linux/firmware.h>
>  #include <linux/gpio.h>
>  #include <linux/gpio/consumer.h>
>  #include <linux/module.h>
> @@ -2947,6 +2948,8 @@ static int ccs_get_hwconfig(struct ccs_sensor *sensor, struct device *dev)
>  static int ccs_probe(struct i2c_client *client)
>  {
>  	struct ccs_sensor *sensor;
> +	const struct firmware *fw;
> +	char filename[40];
>  	unsigned int i;
>  	int rval;
>  
> @@ -3036,6 +3039,31 @@ static int ccs_probe(struct i2c_client *client)
>  		goto out_power_off;
>  	}
>  
> +	WARN_ON(snprintf(filename, sizeof(filename),
> +			 "ccs/ccs-sensor-%4.4x-%4.4x-%4.4x.fw",
> +			 sensor->minfo.sensor_mipi_manufacturer_id,
> +			 sensor->minfo.sensor_model_id,
> +			 sensor->minfo.sensor_revision_number) >=
> +		sizeof(filename));

Nitpick: better to do something like:

	int len;

	len = snprintf(filename, sizeof(filename),
			 "ccs/ccs-sensor-%4.4x-%4.4x-%4.4x.fw",
			 sensor->minfo.sensor_mipi_manufacturer_id,
			 sensor->minfo.sensor_model_id,
			 sensor->minfo.sensor_revision_number);

	if (WARN_ON(len >= sizeof(filename))
		return -ENOMEM;


> +	rval = request_firmware(&fw, filename, &client->dev);
> +	if (!rval) {
> +		ccs_data_parse(&sensor->sdata, fw->data, fw->size, &client->dev,
> +			       true);
> +		release_firmware(fw);
> +	}
> +
> +	WARN_ON(snprintf(filename, sizeof(filename),
> +			 "ccs/ccs-module-%4.4x-%4.4x-%4.4x.fw",
> +			 sensor->minfo.mipi_manufacturer_id,
> +			 sensor->minfo.model_id,
> +			 sensor->minfo.revision_number) >= sizeof(filename));

Same here.

> +	rval = request_firmware(&fw, filename, &client->dev);
> +	if (!rval) {
> +		ccs_data_parse(&sensor->mdata, fw->data, fw->size, &client->dev,
> +			       true);
> +		release_firmware(fw);
> +	}
> +
>  	rval = ccs_read_all_limits(sensor);
>  	if (rval)
>  		goto out_power_off;
> @@ -3232,6 +3260,8 @@ static int ccs_remove(struct i2c_client *client)
>  	ccs_cleanup(sensor);
>  	mutex_destroy(&sensor->mutex);
>  	kfree(sensor->ccs_limits);
> +	kvfree(sensor->sdata.backing);
> +	kvfree(sensor->mdata.backing);
>  
>  	return 0;
>  }
> diff --git a/drivers/media/i2c/ccs/ccs.h b/drivers/media/i2c/ccs/ccs.h
> index ad2ff5a74424..cbcd93b519da 100644
> --- a/drivers/media/i2c/ccs/ccs.h
> +++ b/drivers/media/i2c/ccs/ccs.h
> @@ -16,6 +16,7 @@
>  #include <media/v4l2-ctrls.h>
>  #include <media/v4l2-subdev.h>
>  
> +#include "ccs-data.h"
>  #include "ccs-quirk.h"
>  #include "ccs-regs.h"
>  #include "ccs-reg-access.h"
> @@ -227,6 +228,7 @@ struct ccs_sensor {
>  	const struct ccs_csi_data_format *internal_csi_format;
>  	u32 default_mbus_frame_fmts;
>  	int default_pixel_order;
> +	struct ccs_data_container sdata, mdata;
>  
>  	u8 binning_horizontal;
>  	u8 binning_vertical;



Thanks,
Mauro



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux