From: dean@sensoray.com
To: Hans Verkuil <hverkuil@xs4all.nl>
Cc: linux-media@vger.kernel.org
Subject: Re: [PATCH] media: usb: s2255: add serial number V4L2_CID
Date: Thu, 14 Dec 2023 16:21:42 -0600 [thread overview]
Message-ID: <fc12067f6de4efe01dcfc419bc3b9efd@sensoray.com> (raw)
In-Reply-To: <917c4e00-28bd-416f-9be7-b87717b3cf2f@xs4all.nl>
On 2023-12-13 04:03, Hans Verkuil wrote:
> Hi Dean,
>
> A few more comments below.
>
> BTW, when you post an new version of a patch, it is good practice to
> show that in the Subject line. So the next version should say:
> '[PATCHv3]'.
>
> That helps keeping track of versions.
>
> On 08/12/2023 23:38, Dean Anderson wrote:
>> Adding V4L2 read-only control id for serial number as hardware
>> does not support embedding the serial number in the USB device
>> descriptors.
>>
>> Signed-off-by: Dean Anderson <dean@sensoray.com>
>>
>> ---
>> drivers/media/usb/s2255/s2255drv.c | 46
>> ++++++++++++++++++++++++++++--
>> 1 file changed, 44 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/media/usb/s2255/s2255drv.c
>> b/drivers/media/usb/s2255/s2255drv.c
>> index 3c2627712fe9..5fdf12a6c47a 100644
>> --- a/drivers/media/usb/s2255/s2255drv.c
>> +++ b/drivers/media/usb/s2255/s2255drv.c
>> @@ -40,7 +40,7 @@
>> #include <media/v4l2-ctrls.h>
>> #include <media/v4l2-event.h>
>>
>> -#define S2255_VERSION "1.25.1"
>> +#define S2255_VERSION "1.26.1"
>
> Something for a separate patch: it is discouraged to have a driver
> specific
> version number.
>
> The version number as returned by VIDIOC_QUERYCAP is just filled with
> the
> kernel version, which is really what you need.
>
> In practice driver versions are rarely updated, and generally useless.
>
>> #define FIRMWARE_FILE_NAME "f2255usb.bin"
>>
>> /* default JPEG quality */
>> @@ -60,6 +60,7 @@
>> #define S2255_MIN_BUFS 2
>> #define S2255_SETMODE_TIMEOUT 500
>> #define S2255_VIDSTATUS_TIMEOUT 350
>> +#define S2255_MARKER_FIRMWARE cpu_to_le32(0xDDCCBBAAL)
>> #define S2255_MARKER_FRAME cpu_to_le32(0x2255DA4AL)
>> #define S2255_MARKER_RESPONSE cpu_to_le32(0x2255ACACL)
>> #define S2255_RESPONSE_SETMODE cpu_to_le32(0x01)
>> @@ -323,6 +324,7 @@ struct s2255_buffer {
>> #define S2255_V4L2_YC_ON 1
>> #define S2255_V4L2_YC_OFF 0
>> #define V4L2_CID_S2255_COLORFILTER (V4L2_CID_USER_S2255_BASE + 0)
>> +#define V4L2_CID_S2255_SERIALNUM (V4L2_CID_USER_S2255_BASE + 1)
>>
>> /* frame prefix size (sent once every frame) */
>> #define PREFIX_SIZE 512
>> @@ -1232,6 +1234,32 @@ static int s2255_s_ctrl(struct v4l2_ctrl *ctrl)
>> return 0;
>> }
>>
>> +/*
>> + * serial number is not used in usb device descriptors.
>> + * returns serial number from device, 0 if none found.
>> + */
>> +#define S2255_SERIALNUM_NONE 0
>> +static int s2255_g_serialnum(struct s2255_dev *dev)
>> +{
>> + u8 *buf;
>> + int serialnum = S2255_SERIALNUM_NONE;
>> +#define S2255_I2C_SIZE 16
>> + buf = kzalloc(S2255_I2C_SIZE, GFP_KERNEL);
>> + if (!buf)
>> + return serialnum;
>> +#define S2255_I2C_SERIALNUM 0xa2
>> +#define S2255_I2C_SERIALNUM_OFFSET 0x1ff0
>> +#define S2255_VENDOR_READREG 0x22
>
> Having these defines mixed in with the code is rather distracting.
>
> Just collect them and have them at the beginning of the function,
> right after the opening {.
>
>> + s2255_vendor_req(dev, S2255_VENDOR_READREG,
>> S2255_I2C_SERIALNUM_OFFSET,
>> + S2255_I2C_SERIALNUM >> 1, buf, S2255_I2C_SIZE, 0);
>> +
>> + /* verify marker code */
>> + if (*(__le32 *)buf == S2255_MARKER_FIRMWARE)
>> + serialnum = (buf[12] << 24) + (buf[13] << 16) + (buf[14] << 8) +
>> buf[15];
>> + kfree(buf);
>> + return serialnum;
>> +}
>> +
>> static int vidioc_g_jpegcomp(struct file *file, void *priv,
>> struct v4l2_jpegcompression *jc)
>> {
>> @@ -1581,6 +1609,17 @@ static const struct v4l2_ctrl_config
>> color_filter_ctrl = {
>> .def = 1,
>> };
>>
>> +static struct v4l2_ctrl_config v4l2_ctrl_serialnum = {
>
> This should be 'const'.
>
>> + .ops = &s2255_ctrl_ops,
>> + .name = "Serial Number",
>> + .id = V4L2_CID_S2255_SERIALNUM,
>> + .type = V4L2_CTRL_TYPE_INTEGER,
>> + .max = 0x7fffffff,
>> + .min = 0,
>> + .step = 1,
>> + .flags = V4L2_CTRL_FLAG_READ_ONLY,
>> +};
>> +
>> static int s2255_probe_v4l(struct s2255_dev *dev)
>> {
>> int ret;
>> @@ -1598,7 +1637,7 @@ static int s2255_probe_v4l(struct s2255_dev
>> *dev)
>> vc = &dev->vc[i];
>> INIT_LIST_HEAD(&vc->buf_list);
>>
>> - v4l2_ctrl_handler_init(&vc->hdl, 6);
>> + v4l2_ctrl_handler_init(&vc->hdl, 7);
>> v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
>> V4L2_CID_BRIGHTNESS, -127, 127, 1, DEF_BRIGHT);
>> v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
>> @@ -1615,6 +1654,9 @@ static int s2255_probe_v4l(struct s2255_dev
>> *dev)
>> (dev->pid != 0x2257 || vc->idx <= 1))
>> v4l2_ctrl_new_custom(&vc->hdl, &color_filter_ctrl,
>> NULL);
>> + v4l2_ctrl_serialnum.def = s2255_g_serialnum(dev);
>
> You can't do this, this could cause problems if you have multiple S2255
> devices connected.
>
v4l2_ctrl_new_custom copies out the default before calling
v4l2_ctrl_fill, but I agree about the scope. It also must be changed
with const added.
> Easiest is to do something like this:
>
> struct v4l2_ctrl_config tmp = v4l2_ctrl_serialnum;
>
> tmp.def = s2255_g_serialnum(dev);
>
> and then pass &tmp to v4l2_ctrl_new_custom below.
>
>> + v4l2_ctrl_new_custom(&vc->hdl, &v4l2_ctrl_serialnum,
>> + NULL);
>> if (vc->hdl.error) {
>> ret = vc->hdl.error;
>> v4l2_ctrl_handler_free(&vc->hdl);
>
> I never noticed this before, but there is a call to
> v4l2_ctrl_handler_setup() missing
> in this driver! That call ensures that s2255_s_ctrl() is called with
> the initial control
> values.
> It's probably something that should be added.
>
> Regards,
>
> Hans
next prev parent reply other threads:[~2023-12-14 22:23 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-08 22:38 [PATCH] media: usb: s2255: add serial number V4L2_CID Dean Anderson
2023-12-13 10:03 ` Hans Verkuil
2023-12-14 22:21 ` dean [this message]
2023-12-14 23:28 ` dean
2023-12-15 7:56 ` Hans Verkuil
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fc12067f6de4efe01dcfc419bc3b9efd@sensoray.com \
--to=dean@sensoray.com \
--cc=hverkuil@xs4all.nl \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.