All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Hans de Goede <hdegoede@redhat.com>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>,
	Sakari Ailus <sakari.ailus@linux.intel.com>,
	Tsuchiya Yuto <kitakar@gmail.com>,
	Andy Shevchenko <andy@kernel.org>,
	Yury Luneff <yury.lunev@gmail.com>,
	Nable <nable.maininbox@googlemail.com>,
	andrey.i.trufanov@gmail.com, Fabio Aiuto <fabioaiuto83@gmail.com>,
	linux-media@vger.kernel.org, linux-staging@lists.linux.dev
Subject: Re: [PATCH 28/57] media: Add ovxxxx_16bit_addr_reg_helpers.h
Date: Thu, 9 Feb 2023 18:11:12 +0200	[thread overview]
Message-ID: <Y+UbIAVQZ5U0/U5U@pendragon.ideasonboard.com> (raw)
In-Reply-To: <026272d3-88d7-a67f-4942-5cba6c3eab86@redhat.com>

Hi Hans,

On Thu, Feb 09, 2023 at 04:03:22PM +0100, Hans de Goede wrote:
> On 2/8/23 10:52, Laurent Pinchart wrote:
> > On Mon, Jan 23, 2023 at 01:51:36PM +0100, Hans de Goede wrote:
> >> The following drivers under drivers/media/i2c: ov08x40.c, ov13858.c,
> >> ov13b10.c, ov2680.c, ov2685.c, ov2740.c, ov4689.c, ov5670.c,
> >> ov5675.c, ov5695.c, ov8856.c, ov9282.c and ov9734.c,
> >>
> >> as well as various "atomisp" sensor drivers in drivers/staging, *all*
> >> use register access helpers with the following function prototypes:
> >>
> >> int ovxxxx_read_reg(struct ovxxxx_dev *sensor, u16 reg,
> >>                     unsigned int len, u32 *val);
> >>
> >> int ovxxxx_write_reg(struct ovxxxx_dev *sensor, u16 reg,
> >>                      unsigned int len, u32 val);
> >>
> >> To read/write registers on Omnivision OVxxxx image sensors wich expect
> >> a 16 bit register address in big-endian format and which have 1-3 byte
> >> wide registers, in big-endian format (for the higher width registers).
> >>
> >> Add a new ovxxxx_16bit_addr_reg_helpers.h header file with static inline
> >> versions of these register access helpers, so that this code duplication
> >> can be removed.
> > 
> > Any reason to hand-roll those instead of using regmap ?
> 
> These devices have a mix of 8 + 16 + 24 bit registers which regmap
> appears to not handle, a regmap has a single regmap_config struct
> with a single "@reg_bits: Number of bits in a register address, mandatory",
> so we would still need wrappers around regmap, at which point it
> really offers us very little.

We could extend regmap too, although that may be too much yak shaving.
It would be nice, but I won't push hard for it.

> Also I'm moving duplicate code present in many of the
> drivers/media/i2c/ov*.c files into a common header to remove
> duplicate code. The handrolling was already there before :)
> 
> My goal with the new ovxxxx_16bit_addr_reg_helpers.h file was to
> offer something which is as much of a drop-in replacement of the
> current handrolled code as possible (usable with just a few
> search-n-replaces) as possible.
> 
> Basically my idea here was to factor out code which I noticed was
> being repeated over and over again. My goal was not to completely
> redo how register accesses are done in these drivers.
> 
> I realize I have not yet converted any other drivers, that is because
> I don't really have a way to test most of the other drivers. OTOH
> with the current helpers most conversions should be fairly simply
> and remove a nice amount of code. So maybe I should just only compile
> test the conversions ?

Before you spend time converting drivers, I'd like to complete the
discussion regarding the design of those helpers. I'd rather avoid
mass-patching drivers now and doing it again in the next kernel release.

Sakari mentioned CCI (part of the CSI-2 specification). I think that
would be a good name to replace ov* here, as none of this is specific to
OmniVision.

> > Also, may I
> > suggest to have a look at drivers/media/i2c/imx290.c for an example of
> > how registers of different sizes can be handled in a less error-prone
> > way, using single read/write functions that adapt to the size
> > automatically ?
> 
> Yes I have seen this pattern in drivers/media/i2c/ov5693.c too
> (at least I assume it is the same pattern you are talking about).

Correct. Can we use something like that to merge all the ov*_write_reg()
variants into a single function ? Having to select the size manually in
each call (either by picking the function variant, or by passing a size
as a function parameter) is error-prone. Encoding the size in the
register macro is much safer, easing both development and review.

> >> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> >> ---
> >>  include/media/ovxxxx_16bit_addr_reg_helpers.h | 93 +++++++++++++++++++
> >>  1 file changed, 93 insertions(+)
> >>  create mode 100644 include/media/ovxxxx_16bit_addr_reg_helpers.h
> >>
> >> diff --git a/include/media/ovxxxx_16bit_addr_reg_helpers.h b/include/media/ovxxxx_16bit_addr_reg_helpers.h
> >> new file mode 100644
> >> index 000000000000..e2ffee3d797a
> >> --- /dev/null
> >> +++ b/include/media/ovxxxx_16bit_addr_reg_helpers.h
> >> @@ -0,0 +1,93 @@
> >> +/* SPDX-License-Identifier: GPL-2.0 */
> >> +/*
> >> + * I2C register access helpers for Omnivision OVxxxx image sensors which expect
> >> + * a 16 bit register address in big-endian format and which have 1-3 byte
> >> + * wide registers, in big-endian format (for the higher width registers).
> >> + *
> >> + * Based on the register helpers from drivers/media/i2c/ov2680.c which is:
> >> + * Copyright (C) 2018 Linaro Ltd
> >> + */
> >> +#ifndef __OVXXXX_16BIT_ADDR_REG_HELPERS_H
> >> +#define __OVXXXX_16BIT_ADDR_REG_HELPERS_H
> >> +
> >> +#include <asm/unaligned.h>
> >> +#include <linux/dev_printk.h>
> >> +#include <linux/i2c.h>
> >> +
> >> +static inline int ovxxxx_read_reg(struct i2c_client *client, u16 reg,
> >> +				  unsigned int len, u32 *val)
> >> +{
> >> +	struct i2c_msg msgs[2];
> >> +	u8 addr_buf[2] = { reg >> 8, reg & 0xff };
> >> +	u8 data_buf[4] = { 0, };
> >> +	int ret;
> >> +
> >> +	if (len > 4)
> >> +		return -EINVAL;
> >> +
> >> +	msgs[0].addr = client->addr;
> >> +	msgs[0].flags = 0;
> >> +	msgs[0].len = ARRAY_SIZE(addr_buf);
> >> +	msgs[0].buf = addr_buf;
> >> +
> >> +	msgs[1].addr = client->addr;
> >> +	msgs[1].flags = I2C_M_RD;
> >> +	msgs[1].len = len;
> >> +	msgs[1].buf = &data_buf[4 - len];
> >> +
> >> +	ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
> >> +	if (ret != ARRAY_SIZE(msgs)) {
> >> +		dev_err(&client->dev, "read error: reg=0x%4x: %d\n", reg, ret);
> >> +		return -EIO;
> >> +	}
> >> +
> >> +	*val = get_unaligned_be32(data_buf);
> >> +
> >> +	return 0;
> >> +}
> >> +
> >> +#define ovxxxx_read_reg8(s, r, v)	ovxxxx_read_reg(s, r, 1, v)
> >> +#define ovxxxx_read_reg16(s, r, v)	ovxxxx_read_reg(s, r, 2, v)
> >> +#define ovxxxx_read_reg24(s, r, v)	ovxxxx_read_reg(s, r, 3, v)
> >> +
> >> +static inline int ovxxxx_write_reg(struct i2c_client *client, u16 reg,
> >> +				   unsigned int len, u32 val)
> >> +{
> >> +	u8 buf[6];
> >> +	int ret;
> >> +
> >> +	if (len > 4)
> >> +		return -EINVAL;
> >> +
> >> +	put_unaligned_be16(reg, buf);
> >> +	put_unaligned_be32(val << (8 * (4 - len)), buf + 2);
> >> +	ret = i2c_master_send(client, buf, len + 2);
> >> +	if (ret != len + 2) {
> >> +		dev_err(&client->dev, "write error: reg=0x%4x: %d\n", reg, ret);
> >> +		return -EIO;
> >> +	}
> >> +
> >> +	return 0;
> >> +}
> >> +
> >> +#define ovxxxx_write_reg8(s, r, v)	ovxxxx_write_reg(s, r, 1, v)
> >> +#define ovxxxx_write_reg16(s, r, v)	ovxxxx_write_reg(s, r, 2, v)
> >> +#define ovxxxx_write_reg24(s, r, v)	ovxxxx_write_reg(s, r, 3, v)
> >> +
> >> +static inline int ovxxxx_mod_reg(struct i2c_client *client, u16 reg, u8 mask, u8 val)
> >> +{
> >> +	u32 readval;
> >> +	int ret;
> >> +
> >> +	ret = ovxxxx_read_reg8(client, reg, &readval);
> >> +	if (ret < 0)
> >> +		return ret;
> >> +
> >> +	readval &= ~mask;
> >> +	val &= mask;
> >> +	val |= readval;
> >> +
> >> +	return ovxxxx_write_reg8(client, reg, val);
> >> +}
> >> +
> >> +#endif

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2023-02-09 16:11 UTC|newest]

Thread overview: 168+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-23 12:51 [PATCH 00/57] media: atomisp: Big power-management changes + lots of fixes Hans de Goede
2023-01-23 12:51 ` [PATCH 01/57] media: atomisp: fix videobuf2 Kconfig depenendency Hans de Goede
2023-01-23 14:12   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 02/57] media: atomisp: use vb2_start_streaming_called() Hans de Goede
2023-01-23 12:51 ` [PATCH 03/57] media: atomisp: Remove atomisp_sw_contex struct Hans de Goede
2023-01-23 14:14   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 04/57] media: atomisp: Move power-management over to a custom pm-domain Hans de Goede
2023-01-23 12:51 ` [PATCH 05/57] media: atomisp: Silence "isys dma store at addr, val" debug messages Hans de Goede
2023-01-23 14:18   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 06/57] media: atomisp: Remove non working doorbell check from punit_ddr_dvfs_enable() Hans de Goede
2023-01-23 12:51 ` [PATCH 07/57] media: atomisp: Remove useless msleep(10) before power-on on BYT Hans de Goede
2023-01-23 14:40   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 08/57] media: atomisp: Remove custom ATOMISP_IOC_ISP_MAKERNOTE ioctl Hans de Goede
2023-01-23 14:30   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 09/57] media: atomisp: Remove custom ATOMISP_IOC_G_SENSOR_MODE_DATA ioctl Hans de Goede
2023-01-23 14:31   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 10/57] media: atomisp: Remove V4L2_CID_BIN_FACTOR_HORZ/_VERT Hans de Goede
2023-01-23 14:33   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 11/57] media: atomisp: Remove no longer used binning info from sensor resolution info Hans de Goede
2023-01-23 14:33   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 12/57] media: atomisp: Propagate set_fmt() errors in queue_setup() Hans de Goede
2023-01-23 14:35   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 13/57] media: atomisp: Remove deferred firmware loading support Hans de Goede
2023-01-23 14:37   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 14/57] media: atomisp: Check buffer index is in range inside atomisp_qbuf_wrapper() Hans de Goede
2023-01-23 14:38   ` Andy Shevchenko
2023-01-24 11:09     ` Hans de Goede
2023-01-23 12:51 ` [PATCH 15/57] media: atomisp: Drop atomisp_init_pipe() Hans de Goede
2023-01-23 15:30   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 16/57] media: atomisp: Remove unnecessary memset(foo, 0, sizeof(foo)) calls Hans de Goede
2023-01-23 17:41   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 17/57] media: atomisp: Only set default_run_mode on first open of a stream/asd Hans de Goede
2023-01-23 17:42   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 18/57] media: atomisp: Do not turn off sensor when the atomisp-sub-dev does not own it Hans de Goede
2023-01-23 12:51 ` [PATCH 19/57] media: atomisp: Allow sensor drivers without a s_power callback Hans de Goede
2023-01-23 17:49   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 20/57] media: atomisp: Fix regulator registers on BYT devices with CRC PMIC Hans de Goede
2023-01-23 17:51   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 21/57] media: atomisp: Remove atomisp_gmin_find_subdev() Hans de Goede
2023-01-23 17:53   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 22/57] media: atomisp: Add atomisp_register_sensor_no_gmin() helper Hans de Goede
2023-01-23 17:55   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 23/57] media: atomisp: Fix WARN() when the vb2 start_streaming callback fails Hans de Goede
2023-01-23 17:56   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 24/57] media: atomisp: Drop ffmt local var from atomisp_set_fmt() Hans de Goede
2023-01-23 12:51 ` [PATCH 25/57] media: atomisp: Stop overriding padding w/h to 12 on BYT Hans de Goede
2023-01-23 17:59   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 26/57] media: atomisp: Put sensor ACPI devices in D3 before disable ACPI power-resources Hans de Goede
2023-01-23 12:51 ` [PATCH 27/57] media: atomisp: Remove isp_subdev_link_setup() Hans de Goede
2023-01-23 18:02   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 28/57] media: Add ovxxxx_16bit_addr_reg_helpers.h Hans de Goede
2023-01-23 18:09   ` Andy Shevchenko
2023-01-24 11:21     ` Hans de Goede
2023-01-24 12:47       ` Andy Shevchenko
2023-01-23 18:15   ` Andy Shevchenko
2023-01-23 18:23   ` Andy Shevchenko
2023-01-24 11:25     ` Hans de Goede
2023-02-08  9:52   ` Laurent Pinchart
2023-02-08 11:27     ` Andy Shevchenko
2023-02-08 15:41       ` Laurent Pinchart
2023-02-08 15:50         ` Andy Shevchenko
2023-02-08 16:03           ` Laurent Pinchart
2023-02-08 17:31             ` Andy Shevchenko
2023-02-09 10:31               ` Laurent Pinchart
2023-02-09 15:03     ` Hans de Goede
2023-02-09 16:11       ` Laurent Pinchart [this message]
2023-02-10 10:21         ` Sakari Ailus
2023-02-10 10:29           ` Laurent Pinchart
2023-02-10 10:47             ` Sakari Ailus
2023-02-10 10:53               ` Andy Shevchenko
2023-02-10 11:05                 ` Laurent Pinchart
2023-02-10 15:35                   ` Andy Shevchenko
2023-02-10 16:01                     ` Hans de Goede
2023-02-10 11:19                 ` Hans de Goede
2023-02-10 11:35                   ` Laurent Pinchart
2023-02-10 12:01                     ` Hans de Goede
2023-02-10 11:04               ` Laurent Pinchart
2023-02-10 11:18                 ` Sakari Ailus
2023-02-10 11:34                   ` Laurent Pinchart
2023-02-10 11:20         ` Hans de Goede
2023-02-10 11:45           ` Laurent Pinchart
2023-02-10 11:56             ` Hans de Goede
2023-02-10 12:09               ` Laurent Pinchart
2023-02-10 12:17                 ` Sakari Ailus
2023-02-10 12:59                   ` Hans de Goede
2023-02-10 13:31                     ` Sakari Ailus
2023-02-10 12:47                 ` Hans de Goede
2023-02-10 13:18                   ` Sakari Ailus
2023-02-10 14:43                     ` Hans de Goede
2023-02-10 16:43                       ` Laurent Pinchart
2023-02-10 20:16                       ` Sakari Ailus
2023-02-10 12:26             ` Sakari Ailus
2023-02-10 15:42               ` Andy Shevchenko
2023-02-10 16:39                 ` Laurent Pinchart
2023-02-10 20:18                   ` Sakari Ailus
2023-02-10 16:40               ` Laurent Pinchart
2023-02-08 11:31   ` Sakari Ailus
2023-02-08 14:33     ` Mauro Carvalho Chehab
2023-02-08 15:39       ` Laurent Pinchart
2023-01-23 12:51 ` [PATCH 29/57] media: atomisp: ov2680: Use the new ovxxxx_16bit_addr_reg_helpers.h Hans de Goede
2023-01-23 18:13   ` Andy Shevchenko
2023-01-24 11:22     ` Hans de Goede
2023-01-23 12:51 ` [PATCH 30/57] media: atomisp: ov2680: Rework flip ctrls Hans de Goede
2023-01-23 18:33   ` Andy Shevchenko
2023-01-29  0:36   ` kernel test robot
2023-01-23 12:51 ` [PATCH 31/57] media: atomisp: ov2680: Drop custom ATOMISP_IOC_S_EXPOSURE support Hans de Goede
2023-01-23 18:35   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 32/57] media: atomisp: ov2680: Add exposure and gain controls Hans de Goede
2023-01-23 18:43   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 33/57] media: atomisp: ov2680: Add test pattern control Hans de Goede
2023-01-23 18:46   ` Andy Shevchenko
2023-01-24 11:27     ` Hans de Goede
2023-01-24 12:50       ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 34/57] media: atomisp: ov2680: Fix window settings and enable window for all resolutions Hans de Goede
2023-01-23 18:48   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 35/57] media: atomisp: ov2680: Make setting the modes algorithm based Hans de Goede
2023-01-24 10:37   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 36/57] media: atomisp: ov2680: Use defines for fps, lines-per-frame and skip-frames Hans de Goede
2023-01-24 10:40   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 37/57] media: atomisp: ov2680: Drop unused res member from struct ov2680_device Hans de Goede
2023-01-24 10:39   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 38/57] media: atomisp: ov2680: Fix ov2680_enum_frame_interval() Hans de Goede
2023-01-24 10:42   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 39/57] media: atomisp: ov2680: Drop v4l2_find_nearest_size() call from set_fmt() Hans de Goede
2023-01-24 10:43   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 40/57] media: atomisp: ov2680: Drop struct ov2680_resolution / ov2680_res_preview Hans de Goede
2023-01-24 10:44   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 41/57] media: atomisp: ov2680: Fix frame_size list Hans de Goede
2023-01-24 10:46   ` Andy Shevchenko
2023-01-24 11:29     ` Hans de Goede
2023-01-23 12:51 ` [PATCH 42/57] media: atomisp: ov2680: Remove unused data-types and defines from ov2680.h Hans de Goede
2023-01-24 10:46   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 43/57] media: atomisp: ov2680: Drop MAX_FMTS define Hans de Goede
2023-01-24 10:48   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 44/57] media: atomisp: ov2680: Consistently indent define values Hans de Goede
2023-01-24 10:49   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 45/57] media: atomisp: ov2680: Cleanup includes Hans de Goede
2023-01-24 10:50   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 46/57] media: atomisp: ov2680: Delay power-on till streaming is started Hans de Goede
2023-01-24 10:51   ` Andy Shevchenko
2023-01-24 11:31     ` Hans de Goede
2023-01-24 12:52       ` Andy Shevchenko
2023-01-24 13:35         ` Hans de Goede
2023-01-23 12:51 ` [PATCH 47/57] media: atomisp: ov2680: Add runtime-pm support Hans de Goede
2023-01-24 10:53   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 48/57] media: atomisp: ov2680: s/dev/sensor/ Hans de Goede
2023-01-24 10:54   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 49/57] media: atomisp: ov2680: Use devm_kzalloc() for sensor data struct Hans de Goede
2023-01-24 10:55   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 50/57] media: atomisp: ov2680: Switch over to ACPI powermanagement Hans de Goede
2023-01-24 10:59   ` Andy Shevchenko
2023-01-23 12:51 ` [PATCH 51/57] media: atomisp: ov2722: Call atomisp_gmin_remove_subdev() on probe failure Hans de Goede
2023-01-23 18:36   ` Andy Shevchenko
2023-01-23 12:52 ` [PATCH 52/57] media: atomisp: ov2722: Fix GPIO1 polarity Hans de Goede
2023-01-23 18:39   ` Andy Shevchenko
2023-01-23 18:40   ` Andy Shevchenko
2023-01-23 12:52 ` [PATCH 53/57] media: atomisp: ov2722: Don't take the input_lock for try_fmt calls Hans de Goede
2023-01-23 18:39   ` Andy Shevchenko
2023-01-23 12:52 ` [PATCH 54/57] media: atomisp: ov2722: Power on sensor from set_fmt() callback Hans de Goede
2023-01-23 18:42   ` Andy Shevchenko
2023-01-24 11:32     ` Hans de Goede
2023-01-23 12:52 ` [PATCH 55/57] media: atomisp: pci: Replace bytes macros with functions Hans de Goede
2023-01-23 12:52 ` [PATCH 56/57] media: atomisp: pci: hive_isp_css_common: host: vmem: Replace SUBWORD " Hans de Goede
2023-01-23 18:27   ` Andy Shevchenko
2023-01-23 18:29     ` Andy Shevchenko
2023-01-23 12:52 ` [PATCH 57/57] media: atomisp: pci: sh_css: Inline single invocation of macro STATS_ENABLED() Hans de Goede
2023-01-24 11:01 ` [PATCH 00/57] media: atomisp: Big power-management changes + lots of fixes Andy Shevchenko
2023-01-24 11:05   ` Hans de Goede

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=Y+UbIAVQZ5U0/U5U@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=andrey.i.trufanov@gmail.com \
    --cc=andy@kernel.org \
    --cc=fabioaiuto83@gmail.com \
    --cc=hdegoede@redhat.com \
    --cc=kitakar@gmail.com \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-staging@lists.linux.dev \
    --cc=mchehab@kernel.org \
    --cc=nable.maininbox@googlemail.com \
    --cc=sakari.ailus@linux.intel.com \
    --cc=yury.lunev@gmail.com \
    /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.