All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gregory CLEMENT <gregory.clement-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
To: jean-jacques hiblot
	<jjhiblot-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: jean-jacques hiblot <jean-jacques.hiblot-qU79poH1Kb0@public.gmane.org>
Subject: Re: [PATCH v2 1/4] i2c: i2c-ibm-iic: cleanup.
Date: Fri, 22 Nov 2013 16:15:52 +0100	[thread overview]
Message-ID: <528F7528.70200@free-electrons.com> (raw)
In-Reply-To: <1385110686-4226-2-git-send-email-jean-jacques.hiblot-qU79poH1Kb0@public.gmane.org>

Hi Jean-Jacques,

On 22/11/2013 09:58, jean-jacques hiblot wrote:
> * removed unneeded 'volatile' qualifiers and casts
> * use the dev_dbg, dev_err etc. instead of printk
> * removed unneeded members for the driver's private data
> 
> Signed-off-by: jean-jacques hiblot <jjhiblot-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

This one was easy to review, and I didn't find any thing to say,
so you can add my:


Reviewed-by: Gregory CLEMENT <gregory.clement-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>


Thanks,

Gregory

> ---
>  drivers/i2c/busses/i2c-ibm_iic.c | 109 ++++++++++++++++++++-------------------
>  drivers/i2c/busses/i2c-ibm_iic.h |   9 ++--
>  2 files changed, 61 insertions(+), 57 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-ibm_iic.c b/drivers/i2c/busses/i2c-ibm_iic.c
> index ff3caa0..9cdef65 100644
> --- a/drivers/i2c/busses/i2c-ibm_iic.c
> +++ b/drivers/i2c/busses/i2c-ibm_iic.c
> @@ -69,21 +69,23 @@ MODULE_PARM_DESC(iic_force_fast, "Force fast mode (400 kHz)");
>  #endif
>  
>  #if DBG_LEVEL > 0
> -#  define DBG(f,x...)	printk(KERN_DEBUG "ibm-iic" f, ##x)
> +#  define DBG(dev, f, x...)	dev_dbg(dev->adap.dev.parent, f, ##x)
>  #else
> -#  define DBG(f,x...)	((void)0)
> +#  define DBG(dev, f, x...)	((void)0)
>  #endif
>  #if DBG_LEVEL > 1
> -#  define DBG2(f,x...) 	DBG(f, ##x)
> +#  define DBG2(dev, f, x...)	DBG(dev, f, ##x)
>  #else
> -#  define DBG2(f,x...) 	((void)0)
> +#  define DBG2(dev, f, x...)	((void)0)
>  #endif
>  #if DBG_LEVEL > 2
>  static void dump_iic_regs(const char* header, struct ibm_iic_private* dev)
>  {
> -	volatile struct iic_regs __iomem *iic = dev->vaddr;
> -	printk(KERN_DEBUG "ibm-iic%d: %s\n", dev->idx, header);
> -	printk(KERN_DEBUG
> +	struct iic_regs __iomem *iic = dev->vaddr;
> +	struct device *device = dev.adap.dev.parent;
> +
> +	dev_dbg(device, ": %s\n", header);
> +	dev_dbg(device,
>  	       "  cntl     = 0x%02x, mdcntl = 0x%02x\n"
>  	       "  sts      = 0x%02x, extsts = 0x%02x\n"
>  	       "  clkdiv   = 0x%02x, xfrcnt = 0x%02x\n"
> @@ -133,9 +135,9 @@ static inline void iic_interrupt_mode(struct ibm_iic_private* dev, int enable)
>   */
>  static void iic_dev_init(struct ibm_iic_private* dev)
>  {
> -	volatile struct iic_regs __iomem *iic = dev->vaddr;
> +	struct iic_regs __iomem *iic = dev->vaddr;
>  
> -	DBG("%d: init\n", dev->idx);
> +	DBG(dev, "init\n");
>  
>  	/* Clear master address */
>  	out_8(&iic->lmadr, 0);
> @@ -178,11 +180,11 @@ static void iic_dev_init(struct ibm_iic_private* dev)
>   */
>  static void iic_dev_reset(struct ibm_iic_private* dev)
>  {
> -	volatile struct iic_regs __iomem *iic = dev->vaddr;
> +	struct iic_regs __iomem *iic = dev->vaddr;
>  	int i;
>  	u8 dc;
>  
> -	DBG("%d: soft reset\n", dev->idx);
> +	DBG(dev, "soft reset\n");
>  	DUMP_REGS("reset", dev);
>  
>      	/* Place chip in the reset state */
> @@ -191,7 +193,7 @@ static void iic_dev_reset(struct ibm_iic_private* dev)
>  	/* Check if bus is free */
>  	dc = in_8(&iic->directcntl);
>  	if (!DIRCTNL_FREE(dc)){
> -		DBG("%d: trying to regain bus control\n", dev->idx);
> +		DBG(dev, "trying to regain bus control\n");
>  
>  		/* Try to set bus free state */
>  		out_8(&iic->directcntl, DIRCNTL_SDAC | DIRCNTL_SCC);
> @@ -226,7 +228,7 @@ static void iic_dev_reset(struct ibm_iic_private* dev)
>   */
>  
>  /* Wait for SCL and/or SDA to be high */
> -static int iic_dc_wait(volatile struct iic_regs __iomem *iic, u8 mask)
> +static int iic_dc_wait(struct iic_regs __iomem *iic, u8 mask)
>  {
>  	unsigned long x = jiffies + HZ / 28 + 2;
>  	while ((in_8(&iic->directcntl) & mask) != mask){
> @@ -239,19 +241,18 @@ static int iic_dc_wait(volatile struct iic_regs __iomem *iic, u8 mask)
>  
>  static int iic_smbus_quick(struct ibm_iic_private* dev, const struct i2c_msg* p)
>  {
> -	volatile struct iic_regs __iomem *iic = dev->vaddr;
> +	struct iic_regs __iomem *iic = dev->vaddr;
>  	const struct i2c_timings* t = &timings[dev->fast_mode ? 1 : 0];
>  	u8 mask, v, sda;
>  	int i, res;
>  
>  	/* Only 7-bit addresses are supported */
>  	if (unlikely(p->flags & I2C_M_TEN)){
> -		DBG("%d: smbus_quick - 10 bit addresses are not supported\n",
> -			dev->idx);
> +		DBG(dev, "smbus_quick - 10 bit addresses are not supported\n");
>  		return -EINVAL;
>  	}
>  
> -	DBG("%d: smbus_quick(0x%02x)\n", dev->idx, p->addr);
> +	DBG(dev, "smbus_quick(0x%02x)\n", p->addr);
>  
>  	/* Reset IIC interface */
>  	out_8(&iic->xtcntlss, XTCNTLSS_SRST);
> @@ -304,7 +305,7 @@ static int iic_smbus_quick(struct ibm_iic_private* dev, const struct i2c_msg* p)
>  
>  	ndelay(t->buf);
>  
> -	DBG("%d: smbus_quick -> %s\n", dev->idx, res ? "NACK" : "ACK");
> +	DBG(dev, "smbus_quick -> %s\n", res ? "NACK" : "ACK");
>  out:
>  	/* Remove reset */
>  	out_8(&iic->xtcntlss, 0);
> @@ -314,7 +315,7 @@ out:
>  
>  	return res;
>  err:
> -	DBG("%d: smbus_quick - bus is stuck\n", dev->idx);
> +	DBG(dev, "smbus_quick - bus is stuck\n");
>  	res = -EREMOTEIO;
>  	goto out;
>  }
> @@ -325,10 +326,10 @@ err:
>  static irqreturn_t iic_handler(int irq, void *dev_id)
>  {
>  	struct ibm_iic_private* dev = (struct ibm_iic_private*)dev_id;
> -	volatile struct iic_regs __iomem *iic = dev->vaddr;
> +	struct iic_regs __iomem *iic = dev->vaddr;
>  
> -	DBG2("%d: irq handler, STS = 0x%02x, EXTSTS = 0x%02x\n",
> -	     dev->idx, in_8(&iic->sts), in_8(&iic->extsts));
> +	DBG2(dev, "irq handler, STS = 0x%02x, EXTSTS = 0x%02x\n",
> +	     in_8(&iic->sts), in_8(&iic->extsts));
>  
>  	/* Acknowledge IRQ and wakeup iic_wait_for_tc */
>  	out_8(&iic->sts, STS_IRQA | STS_SCMP);
> @@ -343,10 +344,10 @@ static irqreturn_t iic_handler(int irq, void *dev_id)
>   */
>  static int iic_xfer_result(struct ibm_iic_private* dev)
>  {
> -	volatile struct iic_regs __iomem *iic = dev->vaddr;
> +	struct iic_regs __iomem *iic = dev->vaddr;
>  
>  	if (unlikely(in_8(&iic->sts) & STS_ERR)){
> -		DBG("%d: xfer error, EXTSTS = 0x%02x\n", dev->idx,
> +		DBG(dev, "xfer error, EXTSTS = 0x%02x\n",
>  			in_8(&iic->extsts));
>  
>  		/* Clear errors and possible pending IRQs */
> @@ -362,7 +363,7 @@ static int iic_xfer_result(struct ibm_iic_private* dev)
>  		 * state, the only way out - soft reset.
>  		 */
>  		if ((in_8(&iic->extsts) & EXTSTS_BCS_MASK) != EXTSTS_BCS_FREE){
> -			DBG("%d: bus is stuck, resetting\n", dev->idx);
> +			DBG(dev, "bus is stuck, resetting\n");
>  			iic_dev_reset(dev);
>  		}
>  		return -EREMOTEIO;
> @@ -376,10 +377,10 @@ static int iic_xfer_result(struct ibm_iic_private* dev)
>   */
>  static void iic_abort_xfer(struct ibm_iic_private* dev)
>  {
> -	volatile struct iic_regs __iomem *iic = dev->vaddr;
> +	struct iic_regs __iomem *iic = dev->vaddr;
>  	unsigned long x;
>  
> -	DBG("%d: iic_abort_xfer\n", dev->idx);
> +	DBG(dev, "iic_abort_xfer\n");
>  
>  	out_8(&iic->cntl, CNTL_HMT);
>  
> @@ -390,7 +391,7 @@ static void iic_abort_xfer(struct ibm_iic_private* dev)
>  	x = jiffies + 2;
>  	while ((in_8(&iic->extsts) & EXTSTS_BCS_MASK) != EXTSTS_BCS_FREE){
>  		if (time_after(jiffies, x)){
> -			DBG("%d: abort timeout, resetting...\n", dev->idx);
> +			DBG(dev, "abort timeout, resetting...\n");
>  			iic_dev_reset(dev);
>  			return;
>  		}
> @@ -408,7 +409,7 @@ static void iic_abort_xfer(struct ibm_iic_private* dev)
>   */
>  static int iic_wait_for_tc(struct ibm_iic_private* dev){
>  
> -	volatile struct iic_regs __iomem *iic = dev->vaddr;
> +	struct iic_regs __iomem *iic = dev->vaddr;
>  	int ret = 0;
>  
>  	if (dev->irq >= 0){
> @@ -417,9 +418,9 @@ static int iic_wait_for_tc(struct ibm_iic_private* dev){
>  			!(in_8(&iic->sts) & STS_PT), dev->adap.timeout);
>  
>  		if (unlikely(ret < 0))
> -			DBG("%d: wait interrupted\n", dev->idx);
> +			DBG(dev, "wait interrupted\n");
>  		else if (unlikely(in_8(&iic->sts) & STS_PT)){
> -			DBG("%d: wait timeout\n", dev->idx);
> +			DBG(dev, "wait timeout\n");
>  			ret = -ETIMEDOUT;
>  		}
>  	}
> @@ -429,13 +430,13 @@ static int iic_wait_for_tc(struct ibm_iic_private* dev){
>  
>  		while (in_8(&iic->sts) & STS_PT){
>  			if (unlikely(time_after(jiffies, x))){
> -				DBG("%d: poll timeout\n", dev->idx);
> +				DBG(dev, "poll timeout\n");
>  				ret = -ETIMEDOUT;
>  				break;
>  			}
>  
>  			if (unlikely(signal_pending(current))){
> -				DBG("%d: poll interrupted\n", dev->idx);
> +				DBG(dev, "poll interrupted\n");
>  				ret = -ERESTARTSYS;
>  				break;
>  			}
> @@ -448,7 +449,7 @@ static int iic_wait_for_tc(struct ibm_iic_private* dev){
>  	else
>  		ret = iic_xfer_result(dev);
>  
> -	DBG2("%d: iic_wait_for_tc -> %d\n", dev->idx, ret);
> +	DBG2(dev, "iic_wait_for_tc -> %d\n", ret);
>  
>  	return ret;
>  }
> @@ -459,7 +460,7 @@ static int iic_wait_for_tc(struct ibm_iic_private* dev){
>  static int iic_xfer_bytes(struct ibm_iic_private* dev, struct i2c_msg* pm,
>  			  int combined_xfer)
>  {
> -	volatile struct iic_regs __iomem *iic = dev->vaddr;
> +	struct iic_regs __iomem *iic = dev->vaddr;
>  	char* buf = pm->buf;
>  	int i, j, loops, ret = 0;
>  	int len = pm->len;
> @@ -475,14 +476,14 @@ static int iic_xfer_bytes(struct ibm_iic_private* dev, struct i2c_msg* pm,
>  
>  		if (!(cntl & CNTL_RW))
>  			for (j = 0; j < count; ++j)
> -				out_8((void __iomem *)&iic->mdbuf, *buf++);
> +				out_8(&iic->mdbuf, *buf++);
>  
>  		if (i < loops - 1)
>  			cmd |= CNTL_CHT;
>  		else if (combined_xfer)
>  			cmd |= CNTL_RPST;
>  
> -		DBG2("%d: xfer_bytes, %d, CNTL = 0x%02x\n", dev->idx, count, cmd);
> +		DBG2(dev, "xfer_bytes, %d, CNTL = 0x%02x\n", count, cmd);
>  
>  		/* Start transfer */
>  		out_8(&iic->cntl, cmd);
> @@ -493,8 +494,8 @@ static int iic_xfer_bytes(struct ibm_iic_private* dev, struct i2c_msg* pm,
>  		if (unlikely(ret < 0))
>  			break;
>  		else if (unlikely(ret != count)){
> -			DBG("%d: xfer_bytes, requested %d, transferred %d\n",
> -				dev->idx, count, ret);
> +			DBG(dev, "xfer_bytes, requested %d, transferred %d\n",
> +				count, ret);
>  
>  			/* If it's not a last part of xfer, abort it */
>  			if (combined_xfer || (i < loops - 1))
> @@ -506,7 +507,7 @@ static int iic_xfer_bytes(struct ibm_iic_private* dev, struct i2c_msg* pm,
>  
>  		if (cntl & CNTL_RW)
>  			for (j = 0; j < count; ++j)
> -				*buf++ = in_8((void __iomem *)&iic->mdbuf);
> +				*buf++ = in_8(&iic->mdbuf);
>  	}
>  
>  	return ret > 0 ? 0 : ret;
> @@ -517,10 +518,10 @@ static int iic_xfer_bytes(struct ibm_iic_private* dev, struct i2c_msg* pm,
>   */
>  static inline void iic_address(struct ibm_iic_private* dev, struct i2c_msg* msg)
>  {
> -	volatile struct iic_regs __iomem *iic = dev->vaddr;
> +	struct iic_regs __iomem *iic = dev->vaddr;
>  	u16 addr = msg->addr;
>  
> -	DBG2("%d: iic_address, 0x%03x (%d-bit)\n", dev->idx,
> +	DBG2(dev, "iic_address, 0x%03x (%d-bit)\n",
>  		addr, msg->flags & I2C_M_TEN ? 10 : 7);
>  
>  	if (msg->flags & I2C_M_TEN){
> @@ -553,10 +554,10 @@ static inline int iic_address_neq(const struct i2c_msg* p1,
>  static int iic_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
>  {
>      	struct ibm_iic_private* dev = (struct ibm_iic_private*)(i2c_get_adapdata(adap));
> -	volatile struct iic_regs __iomem *iic = dev->vaddr;
> +	struct iic_regs __iomem *iic = dev->vaddr;
>  	int i, ret = 0;
>  
> -	DBG2("%d: iic_xfer, %d msg(s)\n", dev->idx, num);
> +	DBG2(dev, "iic_xfer, %d msg(s)\n", num);
>  
>  	if (!num)
>  		return 0;
> @@ -565,7 +566,7 @@ static int iic_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
>  	 * Uhh, generic i2c layer is more suitable place for such code...
>  	 */
>  	if (unlikely(iic_invalid_address(&msgs[0]))){
> -		DBG("%d: invalid address 0x%03x (%d-bit)\n", dev->idx,
> +		DBG(dev, "invalid address 0x%03x (%d-bit)\n",
>  			msgs[0].addr, msgs[0].flags & I2C_M_TEN ? 10 : 7);
>  		return -EINVAL;
>  	}
> @@ -578,19 +579,19 @@ static int iic_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
>  				 */
>  				return iic_smbus_quick(dev, &msgs[0]);
>  			}
> -			DBG("%d: invalid len %d in msg[%d]\n", dev->idx,
> +			DBG(dev, "invalid len %d in msg[%d]\n",
>  				msgs[i].len, i);
>  			return -EINVAL;
>  		}
>  		if (unlikely(iic_address_neq(&msgs[0], &msgs[i]))){
> -			DBG("%d: invalid addr in msg[%d]\n", dev->idx, i);
> +			DBG(dev, "invalid addr in msg[%d]\n", i);
>  			return -EINVAL;
>  		}
>  	}
>  
>  	/* Check bus state */
>  	if (unlikely((in_8(&iic->extsts) & EXTSTS_BCS_MASK) != EXTSTS_BCS_FREE)){
> -		DBG("%d: iic_xfer, bus is not free\n", dev->idx);
> +		DBG(dev, "iic_xfer, bus is not free\n");
>  
>  		/* Usually it means something serious has happened.
>  		 * We *cannot* have unfinished previous transfer
> @@ -603,7 +604,7 @@ static int iic_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
>  		iic_dev_reset(dev);
>  
>  		if ((in_8(&iic->extsts) & EXTSTS_BCS_MASK) != EXTSTS_BCS_FREE){
> -			DBG("%d: iic_xfer, bus is still not free\n", dev->idx);
> +			DBG(dev, "iic_xfer, bus is still not free\n");
>  			return -EREMOTEIO;
>  		}
>  	}
> @@ -635,15 +636,17 @@ static const struct i2c_algorithm iic_algo = {
>  /*
>   * Calculates IICx_CLCKDIV value for a specific OPB clock frequency
>   */
> -static inline u8 iic_clckdiv(unsigned int opb)
> +static inline u8 iic_clckdiv(struct ibm_iic_private *dev, unsigned int opb)
>  {
> +	struct device *device = dev->adap.dev.parent;
> +
>  	/* Compatibility kludge, should go away after all cards
>  	 * are fixed to fill correct value for opbfreq.
>  	 * Previous driver version used hardcoded divider value 4,
>  	 * it corresponds to OPB frequency from the range (40, 50] MHz
>  	 */
>  	if (!opb){
> -		printk(KERN_WARNING "ibm-iic: using compatibility value for OPB freq,"
> +		dev_warn(device, "iic_clckdiv: using compatibility value for OPB freq,"
>  			" fix your board specific setup\n");
>  		opb = 50000000;
>  	}
> @@ -652,7 +655,7 @@ static inline u8 iic_clckdiv(unsigned int opb)
>  	opb /= 1000000;
>  
>  	if (opb < 20 || opb > 150){
> -		printk(KERN_WARNING "ibm-iic: invalid OPB clock frequency %u MHz\n",
> +		dev_warn(device, "iic_clckdiv: invalid OPB clock frequency %u MHz\n",
>  			opb);
>  		opb = opb < 20 ? 20 : 150;
>  	}
> @@ -733,7 +736,7 @@ static int iic_probe(struct platform_device *ofdev)
>  		}
>  	}
>  
> -	dev->clckdiv = iic_clckdiv(*freq);
> +	dev->clckdiv = iic_clckdiv(dev, *freq);
>  	dev_dbg(&ofdev->dev, "clckdiv = %d\n", dev->clckdiv);
>  
>  	/* Initialize IIC interface */
> diff --git a/drivers/i2c/busses/i2c-ibm_iic.h b/drivers/i2c/busses/i2c-ibm_iic.h
> index fdaa482..1efce5d 100644
> --- a/drivers/i2c/busses/i2c-ibm_iic.h
> +++ b/drivers/i2c/busses/i2c-ibm_iic.h
> @@ -25,8 +25,10 @@
>  #include <linux/i2c.h>
>  
>  struct iic_regs {
> -	u16 mdbuf;
> -	u16 sbbuf;
> +	u8 mdbuf;
> +	u8 reserved1;
> +	u8 sbbuf;
> +	u8 reserved2;
>  	u8 lmadr;
>  	u8 hmadr;
>  	u8 cntl;
> @@ -44,9 +46,8 @@ struct iic_regs {
>  
>  struct ibm_iic_private {
>  	struct i2c_adapter adap;
> -	volatile struct iic_regs __iomem *vaddr;
> +	struct iic_regs __iomem *vaddr;
>  	wait_queue_head_t wq;
> -	int idx;
>  	int irq;
>  	int fast_mode;
>  	u8  clckdiv;
> 


-- 
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

  parent reply	other threads:[~2013-11-22 15:15 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-22  8:58 [PATCH v2 0/4] i2c : i2c-ibm-iic : use interrupts to perform the data transfer jean-jacques hiblot
     [not found] ` <1385110686-4226-1-git-send-email-jean-jacques.hiblot-qU79poH1Kb0@public.gmane.org>
2013-11-22  8:58   ` [PATCH v2 1/4] i2c: i2c-ibm-iic: cleanup jean-jacques hiblot
     [not found]     ` <1385110686-4226-2-git-send-email-jean-jacques.hiblot-qU79poH1Kb0@public.gmane.org>
2013-11-22 15:15       ` Gregory CLEMENT [this message]
2013-11-22  8:58   ` [PATCH v2 2/4] i2c: i2c-ibm-iic: perform the transfer in the interrupt handler jean-jacques hiblot
     [not found]     ` <1385110686-4226-3-git-send-email-jean-jacques.hiblot-qU79poH1Kb0@public.gmane.org>
2013-11-22 15:16       ` Gregory CLEMENT
     [not found]         ` <528F7547.2070308-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2013-11-25  8:24           ` Jean-Jacques Hiblot
2013-11-22  8:58   ` [PATCH v2 3/4] i2c: i2c-ibm-iic: Implements transfer abortion jean-jacques hiblot
     [not found]     ` <1385110686-4226-4-git-send-email-jean-jacques.hiblot-qU79poH1Kb0@public.gmane.org>
2013-11-29 21:38       ` Gregory CLEMENT
2013-11-22  8:58   ` [PATCH v2 4/4] i2c: i2c-ibm-iic: Implements a polling mode jean-jacques hiblot
     [not found]     ` <1385110686-4226-5-git-send-email-jean-jacques.hiblot-qU79poH1Kb0@public.gmane.org>
2013-11-29 21:39       ` Gregory CLEMENT

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=528F7528.70200@free-electrons.com \
    --to=gregory.clement-wi1+55scjutkeb57/3fjtnbpr1lh4cv8@public.gmane.org \
    --cc=jean-jacques.hiblot-qU79poH1Kb0@public.gmane.org \
    --cc=jjhiblot-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.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.