All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
To: Antti Palosaari <crope@iki.fi>
Cc: linux-media@vger.kernel.org
Subject: Re: [PATCH 05/66] rtl2830: convert driver to kernel I2C model
Date: Tue, 27 Jan 2015 11:10:04 -0200	[thread overview]
Message-ID: <20150127111004.795c40ca@recife.lan> (raw)
In-Reply-To: <1419367799-14263-5-git-send-email-crope@iki.fi>

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

> Convert driver to kernel I2C model. Old DVB proprietary model is
> still left there also.
> 
> Signed-off-by: Antti Palosaari <crope@iki.fi>
> ---
>  drivers/media/dvb-frontends/Kconfig        |   2 +-
>  drivers/media/dvb-frontends/rtl2830.c      | 167 +++++++++++++++++++++++++++++
>  drivers/media/dvb-frontends/rtl2830.h      |  31 ++++++
>  drivers/media/dvb-frontends/rtl2830_priv.h |   2 +
>  4 files changed, 201 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/dvb-frontends/Kconfig b/drivers/media/dvb-frontends/Kconfig
> index 6c75418..e8827fc 100644
> --- a/drivers/media/dvb-frontends/Kconfig
> +++ b/drivers/media/dvb-frontends/Kconfig
> @@ -443,7 +443,7 @@ config DVB_CXD2820R
>  
>  config DVB_RTL2830
>  	tristate "Realtek RTL2830 DVB-T"
> -	depends on DVB_CORE && I2C
> +	depends on DVB_CORE && I2C && I2C_MUX
>  	default m if !MEDIA_SUBDRV_AUTOSELECT
>  	help
>  	  Say Y when you want to support this frontend.
> diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
> index 50e8b63..ec4a19c 100644
> --- a/drivers/media/dvb-frontends/rtl2830.c
> +++ b/drivers/media/dvb-frontends/rtl2830.c
> @@ -767,6 +767,173 @@ static struct dvb_frontend_ops rtl2830_ops = {
>  	.read_signal_strength = rtl2830_read_signal_strength,
>  };
>  
> +/*
> + * I2C gate/repeater logic
> + * We must use unlocked i2c_transfer() here because I2C lock is already taken
> + * by tuner driver. Gate is closed automatically after single I2C xfer.
> + */
> +static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
> +{
> +	struct i2c_client *client = mux_priv;
> +	struct rtl2830_priv *priv = i2c_get_clientdata(client);
> +	struct i2c_msg select_reg_page_msg[1] = {
> +		{
> +			.addr = priv->cfg.i2c_addr,
> +			.flags = 0,
> +			.len = 2,
> +			.buf = "\x00\x01",
> +		}
> +	};
> +	struct i2c_msg gate_open_msg[1] = {
> +		{
> +			.addr = priv->cfg.i2c_addr,
> +			.flags = 0,
> +			.len = 2,
> +			.buf = "\x01\x08",
> +		}
> +	};
> +	int ret;
> +
> +	/* select register page */
> +	ret = __i2c_transfer(adap, select_reg_page_msg, 1);
> +	if (ret != 1) {
> +		dev_warn(&client->dev, "i2c write failed %d\n", ret);
> +		if (ret >= 0)
> +			ret = -EREMOTEIO;
> +		goto err;
> +	}
> +
> +	priv->page = 1;
> +
> +	/* open tuner I2C repeater for 1 xfer, closes automatically */
> +	ret = __i2c_transfer(adap, gate_open_msg, 1);
> +	if (ret != 1) {
> +		dev_warn(&client->dev, "i2c write failed %d\n", ret);
> +		if (ret >= 0)
> +			ret = -EREMOTEIO;
> +		goto err;
> +	}
> +
> +	return 0;
> +
> +err:
> +	dev_dbg(&client->dev, "%s: failed=%d\n", __func__, ret);
> +	return ret;
> +}
> +
> +static struct dvb_frontend *rtl2830_get_dvb_frontend(struct i2c_client *client)
> +{
> +	struct rtl2830_priv *priv = i2c_get_clientdata(client);
> +
> +	dev_dbg(&client->dev, "\n");
> +
> +	return &priv->fe;
> +}
> +
> +static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
> +{
> +	struct rtl2830_priv *priv = i2c_get_clientdata(client);
> +
> +	dev_dbg(&client->dev, "\n");
> +
> +	return priv->adapter;
> +}
> +
> +static int rtl2830_probe(struct i2c_client *client,
> +		const struct i2c_device_id *id)
> +{
> +	struct rtl2830_platform_data *pdata = client->dev.platform_data;
> +	struct i2c_adapter *i2c = client->adapter;
> +	struct rtl2830_priv *priv;
> +	int ret;
> +	u8 u8tmp;
> +
> +	dev_dbg(&client->dev, "\n");
> +
> +	if (pdata == NULL) {
> +		ret = -EINVAL;
> +		goto err;
> +	}
> +
> +	/* allocate memory for the internal state */
> +	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
> +	if (priv == NULL) {
> +		ret = -ENOMEM;
> +		goto err;
> +	}
> +
> +	/* setup the state */
> +	i2c_set_clientdata(client, priv);
> +	priv->i2c = i2c;
> +	priv->sleeping = true;
> +	priv->cfg.i2c_addr = client->addr;
> +	priv->cfg.xtal = pdata->clk;
> +	priv->cfg.spec_inv = pdata->spec_inv;
> +	priv->cfg.vtop = pdata->vtop;
> +	priv->cfg.krf = pdata->krf;
> +	priv->cfg.agc_targ_val = pdata->agc_targ_val;
> +
> +	/* check if the demod is there */
> +	ret = rtl2830_rd_reg(priv, 0x000, &u8tmp);
> +	if (ret)
> +		goto err_kfree;
> +
> +	/* create muxed i2c adapter for tuner */
> +	priv->adapter = i2c_add_mux_adapter(client->adapter, &client->dev,
> +			client, 0, 0, 0, rtl2830_select, NULL);
> +	if (priv->adapter == NULL) {
> +		ret = -ENODEV;
> +		goto err_kfree;
> +	}
> +
> +	/* create dvb frontend */
> +	memcpy(&priv->fe.ops, &rtl2830_ops, sizeof(priv->fe.ops));
> +	priv->fe.ops.release = NULL;
> +	priv->fe.demodulator_priv = priv;
> +
> +	/* setup callbacks */
> +	pdata->get_dvb_frontend = rtl2830_get_dvb_frontend;
> +	pdata->get_i2c_adapter = rtl2830_get_i2c_adapter;
> +
> +	dev_info(&client->dev, "Realtek RTL2830 successfully attached\n");
> +	return 0;
> +
> +err_kfree:
> +	kfree(priv);
> +err:
> +	dev_dbg(&client->dev, "failed=%d\n", ret);
> +	return ret;
> +}
> +
> +static int rtl2830_remove(struct i2c_client *client)
> +{
> +	struct rtl2830_priv *priv = i2c_get_clientdata(client);
> +
> +	dev_dbg(&client->dev, "\n");
> +
> +	i2c_del_mux_adapter(priv->adapter);
> +	kfree(priv);
> +	return 0;
> +}
> +
> +static const struct i2c_device_id rtl2830_id_table[] = {
> +	{"rtl2830", 0},
> +	{}
> +};
> +MODULE_DEVICE_TABLE(i2c, rtl2830_id_table);
> +
> +static struct i2c_driver rtl2830_driver = {
> +	.driver = {
> +		.owner	= THIS_MODULE,
> +		.name	= "rtl2830",
> +	},
> +	.probe		= rtl2830_probe,
> +	.remove		= rtl2830_remove,
> +	.id_table	= rtl2830_id_table,
> +};
> +
> +module_i2c_driver(rtl2830_driver);
> +
>  MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
>  MODULE_DESCRIPTION("Realtek RTL2830 DVB-T demodulator driver");
>  MODULE_LICENSE("GPL");
> diff --git a/drivers/media/dvb-frontends/rtl2830.h b/drivers/media/dvb-frontends/rtl2830.h
> index 3313847..b925ea5 100644
> --- a/drivers/media/dvb-frontends/rtl2830.h
> +++ b/drivers/media/dvb-frontends/rtl2830.h
> @@ -24,6 +24,37 @@
>  #include <linux/kconfig.h>
>  #include <linux/dvb/frontend.h>
>  
> +struct rtl2830_platform_data {
> +	/*
> +	 * Clock frequency.
> +	 * Hz
> +	 * 4000000, 16000000, 25000000, 28800000
> +	 */
> +	u32 clk;
> +
> +	/*
> +	 * Spectrum inversion.
> +	 */
> +	bool spec_inv;
> +
> +	/*
> +	 */
> +	u8 vtop;
> +
> +	/*
> +	 */
> +	u8 krf;
> +
> +	/*
> +	 */
> +	u8 agc_targ_val;
> +
> +	/*
> +	 */
> +	struct dvb_frontend* (*get_dvb_frontend)(struct i2c_client *);
> +	struct i2c_adapter* (*get_i2c_adapter)(struct i2c_client *);
> +};

Please fix this to follow the Kernel CodingStyle for struct/function/...
documentation:
	Documentation/kernel-doc-nano-HOWTO.txt

Sometimes, I just leave things like that to pass, but the above one is too
ugly, with empty multiple line comments, uncommented arguments, etc.


> +
>  struct rtl2830_config {
>  	/*
>  	 * Demodulator I2C address.
> diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
> index fab10ec..1a78351 100644
> --- a/drivers/media/dvb-frontends/rtl2830_priv.h
> +++ b/drivers/media/dvb-frontends/rtl2830_priv.h
> @@ -24,8 +24,10 @@
>  #include "dvb_frontend.h"
>  #include "dvb_math.h"
>  #include "rtl2830.h"
> +#include <linux/i2c-mux.h>
>  
>  struct rtl2830_priv {
> +	struct i2c_adapter *adapter;
>  	struct i2c_adapter *i2c;
>  	struct dvb_frontend fe;
>  	struct rtl2830_config cfg;

  reply	other threads:[~2015-01-27 13:10 UTC|newest]

Thread overview: 85+ 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 [this message]
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
     [not found]     ` <20150202180726.454dc878-+RedX5hVuTR+urZeOPWqwQ@public.gmane.org>
2015-02-02 20:23       ` Antti Palosaari
2015-02-02 20:23         ` Antti Palosaari
     [not found]         ` <54CFDCCC.3030006-X3B1VOXEql0@public.gmane.org>
2015-02-02 20:33           ` Wolfram Sang
2015-02-02 20:33             ` Wolfram Sang
2015-02-02 20:47             ` Lars-Peter Clausen
2015-02-03 17:53             ` Mauro Carvalho Chehab
     [not found]               ` <20150203155301.7ba63776-+RedX5hVuTR+urZeOPWqwQ@public.gmane.org>
2015-02-03 18:34                 ` Antti Palosaari
2015-02-03 18:34                   ` Antti Palosaari
     [not found]                   ` <54D11499.6080800-X3B1VOXEql0@public.gmane.org>
2015-02-04 10:47                     ` Mark Brown
2015-02-04 10:47                       ` Mark Brown
2015-02-02 20:56     ` Jean Delvare
     [not found]       ` <20150202215623.5e289f24-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2015-02-02 21:13         ` Antti Palosaari
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=20150127111004.795c40ca@recife.lan \
    --to=mchehab@osg.samsung.com \
    --cc=crope@iki.fi \
    --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.