All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Shevchenko <andy.shevchenko@gmail.com>
To: Wolfram Sang <wsa+renesas@sang-engineering.com>
Cc: linux-i2c <linux-i2c@vger.kernel.org>,
	Linux-Renesas <linux-renesas-soc@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	linux-arm Mailing List <linux-arm-kernel@lists.infradead.org>,
	Peter Rosin <peda@axentia.se>,
	Stefan Lengfeld <contact@stefanchrist.eu>,
	Linux OMAP Mailing List <linux-omap@vger.kernel.org>,
	linux-tegra@vger.kernel.org,
	Linus Walleij <linus.walleij@linaro.org>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Subject: Re: [PATCH 03/12] i2c: core: introduce callbacks for atomic transfers
Date: Mon, 15 Apr 2019 15:39:25 +0300	[thread overview]
Message-ID: <CAHp75VfmwPHvyryqHiA+SLPd7f9VS7zMBQ98bU8YRcZNx6dCrw@mail.gmail.com> (raw)
In-Reply-To: <20190403124019.8947-4-wsa+renesas@sang-engineering.com>

On Wed, Apr 3, 2019 at 3:43 PM Wolfram Sang
<wsa+renesas@sang-engineering.com> wrote:
>
> We had the request to access devices very late when interrupts are not
> available anymore multiple times now. Mostly to prepare shutdown or
> reboot. Allow adapters to specify a specific callback for this case.
> Note that we fall back to the generic {master|smbus}_xfer callback if
> this new atomic one is not present. This is intentional to preserve the
> previous behaviour and avoid regressions. Because there are drivers not
> using interrupts or because it might have worked "accidently" before.
>

Reviewed-by Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
> ---
>  drivers/i2c/i2c-core-base.c  |  6 +++++-
>  drivers/i2c/i2c-core-smbus.c | 18 ++++++++++++++----
>  drivers/i2c/i2c-core.h       |  7 +++++--
>  include/linux/i2c.h          | 15 ++++++++++++---
>  4 files changed, 36 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
> index ad14f38a67e4..4e6300dc2c4e 100644
> --- a/drivers/i2c/i2c-core-base.c
> +++ b/drivers/i2c/i2c-core-base.c
> @@ -1890,7 +1890,11 @@ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
>         /* Retry automatically on arbitration loss */
>         orig_jiffies = jiffies;
>         for (ret = 0, try = 0; try <= adap->retries; try++) {
> -               ret = adap->algo->master_xfer(adap, msgs, num);
> +               if (i2c_in_atomic_xfer_mode() && adap->algo->master_xfer_atomic)
> +                       ret = adap->algo->master_xfer_atomic(adap, msgs, num);
> +               else
> +                       ret = adap->algo->master_xfer(adap, msgs, num);
> +
>                 if (ret != -EAGAIN)
>                         break;
>                 if (time_after(jiffies, orig_jiffies + adap->timeout))
> diff --git a/drivers/i2c/i2c-core-smbus.c b/drivers/i2c/i2c-core-smbus.c
> index 357e083e8f45..fdb0fb9fb9aa 100644
> --- a/drivers/i2c/i2c-core-smbus.c
> +++ b/drivers/i2c/i2c-core-smbus.c
> @@ -548,6 +548,9 @@ s32 __i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
>                      unsigned short flags, char read_write,
>                      u8 command, int protocol, union i2c_smbus_data *data)
>  {
> +       int (*xfer_func)(struct i2c_adapter *adap, u16 addr,
> +                        unsigned short flags, char read_write,
> +                        u8 command, int size, union i2c_smbus_data *data);
>         unsigned long orig_jiffies;
>         int try;
>         s32 res;
> @@ -562,13 +565,20 @@ s32 __i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
>
>         flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB;
>
> -       if (adapter->algo->smbus_xfer) {
> +       xfer_func = adapter->algo->smbus_xfer;
> +       if (i2c_in_atomic_xfer_mode()) {
> +               if (adapter->algo->smbus_xfer_atomic)
> +                       xfer_func = adapter->algo->smbus_xfer_atomic;
> +               else if (adapter->algo->master_xfer_atomic)
> +                       xfer_func = NULL; /* fallback to I2C emulation */
> +       }
> +
> +       if (xfer_func) {
>                 /* Retry automatically on arbitration loss */
>                 orig_jiffies = jiffies;
>                 for (res = 0, try = 0; try <= adapter->retries; try++) {
> -                       res = adapter->algo->smbus_xfer(adapter, addr, flags,
> -                                                       read_write, command,
> -                                                       protocol, data);
> +                       res = xfer_func(adapter, addr, flags, read_write,
> +                                       command, protocol, data);
>                         if (res != -EAGAIN)
>                                 break;
>                         if (time_after(jiffies,
> diff --git a/drivers/i2c/i2c-core.h b/drivers/i2c/i2c-core.h
> index deea47c576e5..f9d0c417b5a5 100644
> --- a/drivers/i2c/i2c-core.h
> +++ b/drivers/i2c/i2c-core.h
> @@ -43,10 +43,13 @@ static inline int __i2c_lock_bus_helper(struct i2c_adapter *adap)
>  {
>         int ret = 0;
>
> -       if (i2c_in_atomic_xfer_mode())
> +       if (i2c_in_atomic_xfer_mode()) {
> +               WARN(!adap->algo->master_xfer_atomic && !adap->algo->smbus_xfer_atomic,
> +                    "No atomic I2C transfer handler for '%s'\n", dev_name(&adap->dev));
>                 ret = i2c_trylock_bus(adap, I2C_LOCK_SEGMENT) ? 0 : -EAGAIN;
> -       else
> +       } else {
>                 i2c_lock_bus(adap, I2C_LOCK_SEGMENT);
> +       }
>
>         return ret;
>  }
> diff --git a/include/linux/i2c.h b/include/linux/i2c.h
> index 758a6db864c9..03755d4c9229 100644
> --- a/include/linux/i2c.h
> +++ b/include/linux/i2c.h
> @@ -499,9 +499,13 @@ i2c_register_board_info(int busnum, struct i2c_board_info const *info,
>   * @master_xfer: Issue a set of i2c transactions to the given I2C adapter
>   *   defined by the msgs array, with num messages available to transfer via
>   *   the adapter specified by adap.
> + * @master_xfer_atomic: same as @master_xfer. Yet, only using atomic context
> + *   so e.g. PMICs can be accessed very late before shutdown. Optional.
>   * @smbus_xfer: Issue smbus transactions to the given I2C adapter. If this
>   *   is not present, then the bus layer will try and convert the SMBus calls
>   *   into I2C transfers instead.
> + * @smbus_xfer_atomic: same as @smbus_xfer. Yet, only using atomic context
> + *   so e.g. PMICs can be accessed very late before shutdown. Optional.
>   * @functionality: Return the flags that this algorithm/adapter pair supports
>   *   from the I2C_FUNC_* flags.
>   * @reg_slave: Register given client to I2C slave mode of this adapter
> @@ -512,9 +516,9 @@ i2c_register_board_info(int busnum, struct i2c_board_info const *info,
>   * be addressed using the same bus algorithms - i.e. bit-banging or the PCF8584
>   * to name two of the most common.
>   *
> - * The return codes from the @master_xfer field should indicate the type of
> - * error code that occurred during the transfer, as documented in the kernel
> - * Documentation file Documentation/i2c/fault-codes.
> + * The return codes from the @master_xfer{_atomic} fields should indicate the
> + * type of error code that occurred during the transfer, as documented in the
> + * Kernel Documentation file Documentation/i2c/fault-codes.
>   */
>  struct i2c_algorithm {
>         /*
> @@ -528,9 +532,14 @@ struct i2c_algorithm {
>          */
>         int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,
>                            int num);
> +       int (*master_xfer_atomic)(struct i2c_adapter *adap,
> +                                  struct i2c_msg *msgs, int num);
>         int (*smbus_xfer)(struct i2c_adapter *adap, u16 addr,
>                           unsigned short flags, char read_write,
>                           u8 command, int size, union i2c_smbus_data *data);
> +       int (*smbus_xfer_atomic)(struct i2c_adapter *adap, u16 addr,
> +                                unsigned short flags, char read_write,
> +                                u8 command, int size, union i2c_smbus_data *data);
>
>         /* To determine what the adapter supports */
>         u32 (*functionality)(struct i2c_adapter *adap);
> --
> 2.11.0
>


-- 
With Best Regards,
Andy Shevchenko

WARNING: multiple messages have this Message-ID (diff)
From: Andy Shevchenko <andy.shevchenko@gmail.com>
To: Wolfram Sang <wsa+renesas@sang-engineering.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Linus Walleij <linus.walleij@linaro.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Linux-Renesas <linux-renesas-soc@vger.kernel.org>,
	linux-i2c <linux-i2c@vger.kernel.org>,
	linux-tegra@vger.kernel.org,
	Stefan Lengfeld <contact@stefanchrist.eu>,
	Linux OMAP Mailing List <linux-omap@vger.kernel.org>,
	Peter Rosin <peda@axentia.se>,
	linux-arm Mailing List <linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH 03/12] i2c: core: introduce callbacks for atomic transfers
Date: Mon, 15 Apr 2019 15:39:25 +0300	[thread overview]
Message-ID: <CAHp75VfmwPHvyryqHiA+SLPd7f9VS7zMBQ98bU8YRcZNx6dCrw@mail.gmail.com> (raw)
In-Reply-To: <20190403124019.8947-4-wsa+renesas@sang-engineering.com>

On Wed, Apr 3, 2019 at 3:43 PM Wolfram Sang
<wsa+renesas@sang-engineering.com> wrote:
>
> We had the request to access devices very late when interrupts are not
> available anymore multiple times now. Mostly to prepare shutdown or
> reboot. Allow adapters to specify a specific callback for this case.
> Note that we fall back to the generic {master|smbus}_xfer callback if
> this new atomic one is not present. This is intentional to preserve the
> previous behaviour and avoid regressions. Because there are drivers not
> using interrupts or because it might have worked "accidently" before.
>

Reviewed-by Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
> ---
>  drivers/i2c/i2c-core-base.c  |  6 +++++-
>  drivers/i2c/i2c-core-smbus.c | 18 ++++++++++++++----
>  drivers/i2c/i2c-core.h       |  7 +++++--
>  include/linux/i2c.h          | 15 ++++++++++++---
>  4 files changed, 36 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
> index ad14f38a67e4..4e6300dc2c4e 100644
> --- a/drivers/i2c/i2c-core-base.c
> +++ b/drivers/i2c/i2c-core-base.c
> @@ -1890,7 +1890,11 @@ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
>         /* Retry automatically on arbitration loss */
>         orig_jiffies = jiffies;
>         for (ret = 0, try = 0; try <= adap->retries; try++) {
> -               ret = adap->algo->master_xfer(adap, msgs, num);
> +               if (i2c_in_atomic_xfer_mode() && adap->algo->master_xfer_atomic)
> +                       ret = adap->algo->master_xfer_atomic(adap, msgs, num);
> +               else
> +                       ret = adap->algo->master_xfer(adap, msgs, num);
> +
>                 if (ret != -EAGAIN)
>                         break;
>                 if (time_after(jiffies, orig_jiffies + adap->timeout))
> diff --git a/drivers/i2c/i2c-core-smbus.c b/drivers/i2c/i2c-core-smbus.c
> index 357e083e8f45..fdb0fb9fb9aa 100644
> --- a/drivers/i2c/i2c-core-smbus.c
> +++ b/drivers/i2c/i2c-core-smbus.c
> @@ -548,6 +548,9 @@ s32 __i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
>                      unsigned short flags, char read_write,
>                      u8 command, int protocol, union i2c_smbus_data *data)
>  {
> +       int (*xfer_func)(struct i2c_adapter *adap, u16 addr,
> +                        unsigned short flags, char read_write,
> +                        u8 command, int size, union i2c_smbus_data *data);
>         unsigned long orig_jiffies;
>         int try;
>         s32 res;
> @@ -562,13 +565,20 @@ s32 __i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
>
>         flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB;
>
> -       if (adapter->algo->smbus_xfer) {
> +       xfer_func = adapter->algo->smbus_xfer;
> +       if (i2c_in_atomic_xfer_mode()) {
> +               if (adapter->algo->smbus_xfer_atomic)
> +                       xfer_func = adapter->algo->smbus_xfer_atomic;
> +               else if (adapter->algo->master_xfer_atomic)
> +                       xfer_func = NULL; /* fallback to I2C emulation */
> +       }
> +
> +       if (xfer_func) {
>                 /* Retry automatically on arbitration loss */
>                 orig_jiffies = jiffies;
>                 for (res = 0, try = 0; try <= adapter->retries; try++) {
> -                       res = adapter->algo->smbus_xfer(adapter, addr, flags,
> -                                                       read_write, command,
> -                                                       protocol, data);
> +                       res = xfer_func(adapter, addr, flags, read_write,
> +                                       command, protocol, data);
>                         if (res != -EAGAIN)
>                                 break;
>                         if (time_after(jiffies,
> diff --git a/drivers/i2c/i2c-core.h b/drivers/i2c/i2c-core.h
> index deea47c576e5..f9d0c417b5a5 100644
> --- a/drivers/i2c/i2c-core.h
> +++ b/drivers/i2c/i2c-core.h
> @@ -43,10 +43,13 @@ static inline int __i2c_lock_bus_helper(struct i2c_adapter *adap)
>  {
>         int ret = 0;
>
> -       if (i2c_in_atomic_xfer_mode())
> +       if (i2c_in_atomic_xfer_mode()) {
> +               WARN(!adap->algo->master_xfer_atomic && !adap->algo->smbus_xfer_atomic,
> +                    "No atomic I2C transfer handler for '%s'\n", dev_name(&adap->dev));
>                 ret = i2c_trylock_bus(adap, I2C_LOCK_SEGMENT) ? 0 : -EAGAIN;
> -       else
> +       } else {
>                 i2c_lock_bus(adap, I2C_LOCK_SEGMENT);
> +       }
>
>         return ret;
>  }
> diff --git a/include/linux/i2c.h b/include/linux/i2c.h
> index 758a6db864c9..03755d4c9229 100644
> --- a/include/linux/i2c.h
> +++ b/include/linux/i2c.h
> @@ -499,9 +499,13 @@ i2c_register_board_info(int busnum, struct i2c_board_info const *info,
>   * @master_xfer: Issue a set of i2c transactions to the given I2C adapter
>   *   defined by the msgs array, with num messages available to transfer via
>   *   the adapter specified by adap.
> + * @master_xfer_atomic: same as @master_xfer. Yet, only using atomic context
> + *   so e.g. PMICs can be accessed very late before shutdown. Optional.
>   * @smbus_xfer: Issue smbus transactions to the given I2C adapter. If this
>   *   is not present, then the bus layer will try and convert the SMBus calls
>   *   into I2C transfers instead.
> + * @smbus_xfer_atomic: same as @smbus_xfer. Yet, only using atomic context
> + *   so e.g. PMICs can be accessed very late before shutdown. Optional.
>   * @functionality: Return the flags that this algorithm/adapter pair supports
>   *   from the I2C_FUNC_* flags.
>   * @reg_slave: Register given client to I2C slave mode of this adapter
> @@ -512,9 +516,9 @@ i2c_register_board_info(int busnum, struct i2c_board_info const *info,
>   * be addressed using the same bus algorithms - i.e. bit-banging or the PCF8584
>   * to name two of the most common.
>   *
> - * The return codes from the @master_xfer field should indicate the type of
> - * error code that occurred during the transfer, as documented in the kernel
> - * Documentation file Documentation/i2c/fault-codes.
> + * The return codes from the @master_xfer{_atomic} fields should indicate the
> + * type of error code that occurred during the transfer, as documented in the
> + * Kernel Documentation file Documentation/i2c/fault-codes.
>   */
>  struct i2c_algorithm {
>         /*
> @@ -528,9 +532,14 @@ struct i2c_algorithm {
>          */
>         int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,
>                            int num);
> +       int (*master_xfer_atomic)(struct i2c_adapter *adap,
> +                                  struct i2c_msg *msgs, int num);
>         int (*smbus_xfer)(struct i2c_adapter *adap, u16 addr,
>                           unsigned short flags, char read_write,
>                           u8 command, int size, union i2c_smbus_data *data);
> +       int (*smbus_xfer_atomic)(struct i2c_adapter *adap, u16 addr,
> +                                unsigned short flags, char read_write,
> +                                u8 command, int size, union i2c_smbus_data *data);
>
>         /* To determine what the adapter supports */
>         u32 (*functionality)(struct i2c_adapter *adap);
> --
> 2.11.0
>


-- 
With Best Regards,
Andy Shevchenko

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2019-04-15 12:39 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-03 12:40 [PATCH 00/12] i2c: core: introduce atomic transfers Wolfram Sang
2019-04-03 12:40 ` Wolfram Sang
2019-04-03 12:40 ` [PATCH 01/12] i2c: remove use of in_atomic() Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-15 12:40   ` Andy Shevchenko
2019-04-15 12:40     ` Andy Shevchenko
2019-04-15 21:55   ` Stefan Lengfeld
2019-04-15 21:55     ` Stefan Lengfeld
2019-04-15 21:55     ` Stefan Lengfeld
2019-04-16 10:48     ` Wolfram Sang
2019-04-16 10:48       ` Wolfram Sang
2019-04-03 12:40 ` [PATCH 02/12] i2c: core: use I2C locking behaviour also for SMBUS Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-15 12:39   ` Andy Shevchenko
2019-04-15 12:39     ` Andy Shevchenko
2019-04-15 12:39     ` Andy Shevchenko
2019-04-03 12:40 ` [PATCH 03/12] i2c: core: introduce callbacks for atomic transfers Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-15 12:39   ` Andy Shevchenko [this message]
2019-04-15 12:39     ` Andy Shevchenko
2019-04-15 21:57   ` Stefan Lengfeld
2019-04-15 21:57     ` Stefan Lengfeld
2019-04-03 12:40 ` [PATCH 04/12] i2c: mux: populate the new *_atomic callbacks Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-03 15:17   ` Peter Rosin
2019-04-03 15:17     ` Peter Rosin
2019-04-03 15:17     ` Peter Rosin
2019-04-15 12:04     ` Wolfram Sang
2019-04-15 12:04       ` Wolfram Sang
2019-04-15 12:04       ` Wolfram Sang
2019-04-15 12:44   ` Andy Shevchenko
2019-04-15 12:44     ` Andy Shevchenko
2019-04-03 12:40 ` [PATCH 05/12] i2c: demux: handle the new atomic callbacks Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-15 12:37   ` Andy Shevchenko
2019-04-15 12:37     ` Andy Shevchenko
2019-04-03 12:40 ` [PATCH 06/12] i2c: omap: Add the master_xfer_irqless hook Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-15 22:05   ` Stefan Lengfeld
2019-04-15 22:05     ` Stefan Lengfeld
2019-04-16 10:52     ` Wolfram Sang
2019-04-16 10:52       ` Wolfram Sang
2019-04-03 12:40 ` [PATCH 07/12] i2c: tegra-bpmp: convert to use new atomic callbacks Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-03 12:40 ` [PATCH 08/12] i2c: ocores: refactor setup for polling Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-05 15:09   ` Peter Korsgaard
2019-04-05 15:09     ` Peter Korsgaard
2019-04-05 19:00   ` Andrew Lunn
2019-04-05 19:00     ` Andrew Lunn
2019-04-03 12:40 ` [PATCH 09/12] i2c: ocores: enable atomic xfers Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-05 19:20   ` Andrew Lunn
2019-04-05 19:20     ` Andrew Lunn
2019-04-03 12:40 ` [PATCH 10/12] i2c: stu300: use xfer_atomic callback to bail out early Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-04 15:38   ` Linus Walleij
2019-04-04 15:38     ` Linus Walleij
2019-04-03 12:40 ` [PATCH 11/12] i2c: algo: bit: add flag to whitelist atomic transfers Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-03 12:40 ` [PATCH 12/12] i2c: gpio: flag atomic capability if possible Wolfram Sang
2019-04-03 12:40   ` Wolfram Sang
2019-04-04 15:40   ` Linus Walleij
2019-04-04 15:40     ` Linus Walleij
2019-04-15 12:38   ` Andy Shevchenko
2019-04-15 12:38     ` Andy Shevchenko
2019-04-03 13:15 ` [PATCH 00/12] i2c: core: introduce atomic transfers Andy Shevchenko
2019-04-03 13:15   ` Andy Shevchenko
2019-04-15 12:06   ` Wolfram Sang
2019-04-15 12:06     ` Wolfram Sang
2019-04-15 12:35     ` Andy Shevchenko
2019-04-15 12:35       ` Andy Shevchenko
2019-04-15 12:48       ` Andy Shevchenko
2019-04-15 12:48         ` Andy Shevchenko
2019-04-15 12:50         ` Wolfram Sang
2019-04-15 12:50           ` Wolfram Sang
2019-04-15 12:10 ` Wolfram Sang
2019-04-15 12:10   ` Wolfram Sang

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=CAHp75VfmwPHvyryqHiA+SLPd7f9VS7zMBQ98bU8YRcZNx6dCrw@mail.gmail.com \
    --to=andy.shevchenko@gmail.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=contact@stefanchrist.eu \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=peda@axentia.se \
    --cc=wsa+renesas@sang-engineering.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.