linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
To: Antti Palosaari <crope@iki.fi>, Mark Brown <broonie@kernel.org>,
	Lars-Peter Clausen <lars@metafoo.de>,
	linux-i2c@vger.kernel.org
Cc: linux-media@vger.kernel.org, Jean Delvare <jdelvare@suse.de>
Subject: Re: [PATCH 21/66] rtl2830: implement own I2C locking
Date: Mon, 2 Feb 2015 18:07:26 -0200	[thread overview]
Message-ID: <20150202180726.454dc878@recife.lan> (raw)
In-Reply-To: <1419367799-14263-21-git-send-email-crope@iki.fi>

Em Tue, 23 Dec 2014 22:49:14 +0200
Antti Palosaari <crope@iki.fi> escreveu:

> Own I2C locking is needed due to two special reasons:
> 1) Chips uses multiple register pages/banks on single I2C slave.
> Page is changed via I2C register access.
> 2) Chip offers muxed/gated I2C adapter for tuner. Gate/mux is
> controlled by I2C register access.
> 
> Due to these reasons, I2C locking did not fit very well.

I don't like the idea of calling __i2c_transfer() without calling first
i2c_lock_adapter(). This can be dangerous, as the I2C core itself uses
the lock for its own usage.

Ok, this may eventually work ok for now, but a further change at the I2C
core could easily break it. So, we need to double check about such
patch with the I2C maintainer.

Jean,

Are you ok with such patch? If so, please ack.

Regards,
Mauro
> 
> Signed-off-by: Antti Palosaari <crope@iki.fi>
> ---
>  drivers/media/dvb-frontends/rtl2830.c      | 45 +++++++++++++++++++++++++-----
>  drivers/media/dvb-frontends/rtl2830_priv.h |  1 +
>  2 files changed, 39 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
> index 8abaca6..3a9e4e9 100644
> --- a/drivers/media/dvb-frontends/rtl2830.c
> +++ b/drivers/media/dvb-frontends/rtl2830.c
> @@ -43,7 +43,7 @@ static int rtl2830_wr(struct i2c_client *client, u8 reg, const u8 *val, int len)
>  	buf[0] = reg;
>  	memcpy(&buf[1], val, len);
>  
> -	ret = i2c_transfer(client->adapter, msg, 1);
> +	ret = __i2c_transfer(client->adapter, msg, 1);
>  	if (ret == 1) {
>  		ret = 0;
>  	} else {
> @@ -73,7 +73,7 @@ static int rtl2830_rd(struct i2c_client *client, u8 reg, u8 *val, int len)
>  		}
>  	};
>  
> -	ret = i2c_transfer(client->adapter, msg, 2);
> +	ret = __i2c_transfer(client->adapter, msg, 2);
>  	if (ret == 2) {
>  		ret = 0;
>  	} else {
> @@ -93,16 +93,23 @@ static int rtl2830_wr_regs(struct i2c_client *client, u16 reg, const u8 *val, in
>  	u8 reg2 = (reg >> 0) & 0xff;
>  	u8 page = (reg >> 8) & 0xff;
>  
> +	mutex_lock(&dev->i2c_mutex);
> +
>  	/* switch bank if needed */
>  	if (page != dev->page) {
>  		ret = rtl2830_wr(client, 0x00, &page, 1);
>  		if (ret)
> -			return ret;
> +			goto err_mutex_unlock;
>  
>  		dev->page = page;
>  	}
>  
> -	return rtl2830_wr(client, reg2, val, len);
> +	ret = rtl2830_wr(client, reg2, val, len);
> +
> +err_mutex_unlock:
> +	mutex_unlock(&dev->i2c_mutex);
> +
> +	return ret;
>  }
>  
>  /* read multiple registers */
> @@ -113,16 +120,23 @@ static int rtl2830_rd_regs(struct i2c_client *client, u16 reg, u8 *val, int len)
>  	u8 reg2 = (reg >> 0) & 0xff;
>  	u8 page = (reg >> 8) & 0xff;
>  
> +	mutex_lock(&dev->i2c_mutex);
> +
>  	/* switch bank if needed */
>  	if (page != dev->page) {
>  		ret = rtl2830_wr(client, 0x00, &page, 1);
>  		if (ret)
> -			return ret;
> +			goto err_mutex_unlock;
>  
>  		dev->page = page;
>  	}
>  
> -	return rtl2830_rd(client, reg2, val, len);
> +	ret = rtl2830_rd(client, reg2, val, len);
> +
> +err_mutex_unlock:
> +	mutex_unlock(&dev->i2c_mutex);
> +
> +	return ret;
>  }
>  
>  /* read single register */
> @@ -815,6 +829,10 @@ static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
>  	};
>  	int ret;
>  
> +	dev_dbg(&client->dev, "\n");
> +
> +	mutex_lock(&dev->i2c_mutex);
> +
>  	/* select register page */
>  	ret = __i2c_transfer(client->adapter, select_reg_page_msg, 1);
>  	if (ret != 1) {
> @@ -841,6 +859,18 @@ err:
>  	return ret;
>  }
>  
> +static int rtl2830_deselect(struct i2c_adapter *adap, void *mux_priv, u32 chan)
> +{
> +	struct i2c_client *client = mux_priv;
> +	struct rtl2830_dev *dev = i2c_get_clientdata(client);
> +
> +	dev_dbg(&client->dev, "\n");
> +
> +	mutex_unlock(&dev->i2c_mutex);
> +
> +	return 0;
> +}
> +
>  static struct dvb_frontend *rtl2830_get_dvb_frontend(struct i2c_client *client)
>  {
>  	struct rtl2830_dev *dev = i2c_get_clientdata(client);
> @@ -886,6 +916,7 @@ static int rtl2830_probe(struct i2c_client *client,
>  	dev->client = client;
>  	dev->pdata = client->dev.platform_data;
>  	dev->sleeping = true;
> +	mutex_init(&dev->i2c_mutex);
>  	INIT_DELAYED_WORK(&dev->stat_work, rtl2830_stat_work);
>  
>  	/* check if the demod is there */
> @@ -895,7 +926,7 @@ static int rtl2830_probe(struct i2c_client *client,
>  
>  	/* create muxed i2c adapter for tuner */
>  	dev->adapter = i2c_add_mux_adapter(client->adapter, &client->dev,
> -			client, 0, 0, 0, rtl2830_select, NULL);
> +			client, 0, 0, 0, rtl2830_select, rtl2830_deselect);
>  	if (dev->adapter == NULL) {
>  		ret = -ENODEV;
>  		goto err_kfree;
> diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
> index 2931889..517758a 100644
> --- a/drivers/media/dvb-frontends/rtl2830_priv.h
> +++ b/drivers/media/dvb-frontends/rtl2830_priv.h
> @@ -30,6 +30,7 @@ struct rtl2830_dev {
>  	struct i2c_adapter *adapter;
>  	struct dvb_frontend fe;
>  	bool sleeping;
> +	struct mutex i2c_mutex;
>  	u8 page; /* active register page */
>  	unsigned long filters;
>  	struct delayed_work stat_work;

  reply	other threads:[~2015-02-02 20:07 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-23 20:48 [PATCH 01/66] dvb-usb-v2: add pointer to 'struct usb_interface' for driver usage Antti Palosaari
2014-12-23 20:48 ` [PATCH 02/66] rtl2832: convert driver to I2C binding Antti Palosaari
2014-12-23 20:48 ` [PATCH 03/66] rtl28xxu: switch rtl2832 demod attach " Antti Palosaari
2014-12-23 20:48 ` [PATCH 04/66] rtl28xxu: change module unregister order Antti Palosaari
2014-12-23 20:48 ` [PATCH 05/66] rtl2830: convert driver to kernel I2C model Antti Palosaari
2015-01-27 13:10   ` Mauro Carvalho Chehab
2015-02-02 17:50     ` Antti Palosaari
2014-12-23 20:48 ` [PATCH 06/66] rtl28xxu: use I2C binding for RTL2830 demod driver Antti Palosaari
2014-12-23 20:49 ` [PATCH 07/66] rtl2830: get rid of legacy DVB driver binding Antti Palosaari
2014-12-23 20:49 ` [PATCH 08/66] rtl2830: rename 'priv' to 'dev' Antti Palosaari
2014-12-23 20:49 ` [PATCH 09/66] rtl2830: carry pointer to I2C client for every function Antti Palosaari
2014-12-23 20:49 ` [PATCH 10/66] rtl2830: fix logging Antti Palosaari
2014-12-23 20:49 ` [PATCH 11/66] rtl2830: get rid of internal config data Antti Palosaari
2014-12-23 20:49 ` [PATCH 12/66] rtl2830: style related changes Antti Palosaari
2014-12-23 20:49 ` [PATCH 13/66] rtl2830: implement DVBv5 CNR statistic Antti Palosaari
2014-12-23 20:49 ` [PATCH 14/66] rtl2830: implement DVBv5 signal strength statistics Antti Palosaari
2014-12-23 20:49 ` [PATCH 15/66] rtl2830: implement DVBv5 BER statistic Antti Palosaari
2014-12-23 20:49 ` [PATCH 16/66] rtl2830: wrap DVBv5 signal strength to DVBv3 Antti Palosaari
2014-12-23 20:49 ` [PATCH 17/66] rtl2830: wrap DVBv5 BER " Antti Palosaari
2014-12-23 20:49 ` [PATCH 18/66] rtl2830: wrap DVBv5 CNR to DVBv3 SNR Antti Palosaari
2014-12-23 20:49 ` [PATCH 19/66] rtl2830: implement PID filter Antti Palosaari
2014-12-23 20:49 ` [PATCH 20/66] rtl28xxu: add support for RTL2831U/RTL2830 " Antti Palosaari
2014-12-23 20:49 ` [PATCH 21/66] rtl2830: implement own I2C locking Antti Palosaari
2015-02-02 20:07   ` Mauro Carvalho Chehab [this message]
2015-02-02 20:23     ` Antti Palosaari
2015-02-02 20:33       ` Wolfram Sang
2015-02-02 20:47         ` Lars-Peter Clausen
2015-02-03 17:53         ` Mauro Carvalho Chehab
2015-02-03 18:34           ` Antti Palosaari
2015-02-04 10:47             ` Mark Brown
2015-02-02 20:56     ` Jean Delvare
2015-02-02 21:13       ` Antti Palosaari
2014-12-23 20:49 ` [PATCH 22/66] rtl2830: convert to regmap API Antti Palosaari
2014-12-23 20:49 ` [PATCH 23/66] rtl2832: add platform data callbacks for exported resources Antti Palosaari
2014-12-23 20:49 ` [PATCH 24/66] rtl28xxu: use rtl2832 demod callbacks accessing its resources Antti Palosaari
2014-12-23 20:49 ` [PATCH 25/66] rtl2832: remove exported resources Antti Palosaari
2014-12-23 20:49 ` [PATCH 26/66] rtl2832: rename driver state variable from 'priv' to 'dev' Antti Palosaari
2014-12-23 20:49 ` [PATCH 27/66] rtl2832: enhance / fix logging Antti Palosaari
2014-12-23 20:49 ` [PATCH 28/66] rtl2832: move all configuration to platform data struct Antti Palosaari
2014-12-23 20:49 ` [PATCH 29/66] rtl28xxu: use platform data config for rtl2832 demod Antti Palosaari
2014-12-23 20:49 ` [PATCH 30/66] rtl2832: convert to regmap API Antti Palosaari
2014-12-23 20:49 ` [PATCH 31/66] rtl2832: implement DVBv5 CNR statistic Antti Palosaari
2014-12-23 20:49 ` [PATCH 32/66] rtl2832: implement DVBv5 BER statistic Antti Palosaari
2014-12-23 20:49 ` [PATCH 33/66] rtl2832: wrap DVBv5 CNR to DVBv3 SNR Antti Palosaari
2014-12-23 20:49 ` [PATCH 34/66] rtl2832: wrap DVBv5 BER to DVBv3 Antti Palosaari
2014-12-23 20:49 ` [PATCH 35/66] rtl2832: implement DVBv5 signal strength statistics Antti Palosaari
2014-12-23 20:49 ` [PATCH 36/66] rtl28xxu: use demod mux I2C adapter for every tuner Antti Palosaari
2014-12-23 20:49 ` [PATCH 37/66] rtl2832: drop FE i2c gate control support Antti Palosaari
2014-12-23 20:49 ` [PATCH 38/66] rtl2832: define more demod lock statuses Antti Palosaari
2014-12-23 20:49 ` [PATCH 39/66] rtl2832: implement PID filter Antti Palosaari
2014-12-23 20:49 ` [PATCH 40/66] rtl28xxu: add support for RTL2832U/RTL2832 " Antti Palosaari
2014-12-23 20:49 ` [PATCH 41/66] rtl2832: use regmap reg cache Antti Palosaari
2014-12-23 20:49 ` [PATCH 42/66] rtl2832: remove unneeded software reset from init() Antti Palosaari
2014-12-23 20:49 ` [PATCH 43/66] rtl2832: merge reg page as a part of reg address Antti Palosaari
2014-12-23 20:49 ` [PATCH 44/66] rtl2832: provide register IO callbacks Antti Palosaari
2014-12-23 20:49 ` [PATCH 45/66] rtl2832_sdr: rename state variable from 's' to 'dev' Antti Palosaari
2014-12-23 20:49 ` [PATCH 46/66] rtl2832_sdr: convert to platform driver Antti Palosaari
2014-12-23 20:49 ` [PATCH 47/66] rtl28xxu: switch SDR module " Antti Palosaari
2014-12-23 20:49 ` [PATCH 48/66] rtl28xxu: use master I2C adapter for slave demods Antti Palosaari
2014-12-24  0:45   ` Benjamin Larsson
2014-12-24 11:03     ` Antti Palosaari
2014-12-23 20:49 ` [PATCH 49/66] rtl2832_sdr: fix logging Antti Palosaari
2014-12-23 20:49 ` [PATCH 50/66] rtl2832_sdr: cleanups Antti Palosaari
2014-12-23 20:49 ` [PATCH 51/66] rtl2832: cleanups and minor changes Antti Palosaari
2014-12-23 20:49 ` [PATCH 52/66] rtl2832: claim copyright and module author Antti Palosaari
2014-12-23 20:49 ` [PATCH 53/66] rtl2832: implement sleep Antti Palosaari
2014-12-23 20:49 ` [PATCH 54/66] rtl28xxu: fix DVB FE callback Antti Palosaari
2014-12-23 20:49 ` [PATCH 55/66] rtl28xxu: simplify FE callback handling Antti Palosaari
2014-12-23 20:49 ` [PATCH 56/66] rtl28xxu: do not refcount rtl2832_sdr module Antti Palosaari
2014-12-23 20:49 ` [PATCH 57/66] rtl2832_sdr: refcount to rtl28xxu Antti Palosaari
2014-12-23 20:49 ` [PATCH 58/66] rtl2832: remove internal mux I2C adapter Antti Palosaari
2014-12-23 20:49 ` [PATCH 59/66] rtl28xxu: rename state variable 'priv' to 'dev' Antti Palosaari
2014-12-23 20:49 ` [PATCH 60/66] rtl28xxu: fix logging Antti Palosaari
2014-12-23 20:49 ` [PATCH 61/66] rtl28xxu: move usb buffers to state Antti Palosaari
2014-12-23 20:49 ` [PATCH 62/66] rtl28xxu: add heuristic to detect chip type Antti Palosaari
2014-12-23 20:49 ` [PATCH 63/66] rtl28xxu: merge chip type specific all callbacks Antti Palosaari
2014-12-23 20:49 ` [PATCH 64/66] rtl28xxu: merge rtl2831u and rtl2832u properties Antti Palosaari
2014-12-23 20:49 ` [PATCH 65/66] rtl28xxu: correct reg access routine name prefixes Antti Palosaari
2014-12-23 20:49 ` [PATCH 66/66] rtl2832: implement own lock for regmap Antti Palosaari
2015-01-19 12:49 ` [PATCH 01/66] dvb-usb-v2: add pointer to 'struct usb_interface' for driver usage 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=20150202180726.454dc878@recife.lan \
    --to=mchehab@osg.samsung.com \
    --cc=broonie@kernel.org \
    --cc=crope@iki.fi \
    --cc=jdelvare@suse.de \
    --cc=lars@metafoo.de \
    --cc=linux-i2c@vger.kernel.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).