All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 01/18] rtl2830: convert driver to kernel I2C model
@ 2014-12-14  8:28 Antti Palosaari
  2014-12-14  8:28 ` [PATCH 02/18] rtl28xxu: use I2C binding for RTL2830 demod driver Antti Palosaari
                   ` (16 more replies)
  0 siblings, 17 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

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 *);
+};
+
 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;
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 02/18] rtl28xxu: use I2C binding for RTL2830 demod driver
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 03/18] rtl2830: get rid of legacy DVB driver binding Antti Palosaari
                   ` (15 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

rtl2830 driver supports now I2C model too. Start using it.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 80 +++++++++++++++------------------
 drivers/media/usb/dvb-usb-v2/rtl28xxu.h | 17 +++++++
 2 files changed, 54 insertions(+), 43 deletions(-)

diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
index 93bb7c9..4f94e0e 100644
--- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
+++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
@@ -22,23 +22,6 @@
 
 #include "rtl28xxu.h"
 
-#include "rtl2830.h"
-#include "rtl2832.h"
-#include "rtl2832_sdr.h"
-#include "mn88472.h"
-#include "mn88473.h"
-
-#include "qt1010.h"
-#include "mt2060.h"
-#include "mxl5005s.h"
-#include "fc0012.h"
-#include "fc0013.h"
-#include "e4000.h"
-#include "fc2580.h"
-#include "tua9001.h"
-#include "r820t.h"
-
-
 #ifdef CONFIG_MEDIA_ATTACH
 #define dvb_attach_sdr(FUNCTION, ARGS...) ({ \
 	void *__r = NULL; \
@@ -572,10 +555,8 @@ err:
 	return ret;
 }
 
-static const struct rtl2830_config rtl28xxu_rtl2830_mt2060_config = {
-	.i2c_addr = 0x10, /* 0x20 */
-	.xtal = 28800000,
-	.ts_mode = 0,
+static const struct rtl2830_platform_data rtl2830_mt2060_platform_data = {
+	.clk = 28800000,
 	.spec_inv = 1,
 	.vtop = 0x20,
 	.krf = 0x04,
@@ -583,20 +564,16 @@ static const struct rtl2830_config rtl28xxu_rtl2830_mt2060_config = {
 
 };
 
-static const struct rtl2830_config rtl28xxu_rtl2830_qt1010_config = {
-	.i2c_addr = 0x10, /* 0x20 */
-	.xtal = 28800000,
-	.ts_mode = 0,
+static const struct rtl2830_platform_data rtl2830_qt1010_platform_data = {
+	.clk = 28800000,
 	.spec_inv = 1,
 	.vtop = 0x20,
 	.krf = 0x04,
 	.agc_targ_val = 0x2d,
 };
 
-static const struct rtl2830_config rtl28xxu_rtl2830_mxl5005s_config = {
-	.i2c_addr = 0x10, /* 0x20 */
-	.xtal = 28800000,
-	.ts_mode = 0,
+static const struct rtl2830_platform_data rtl2830_mxl5005s_platform_data = {
+	.clk = 28800000,
 	.spec_inv = 0,
 	.vtop = 0x3f,
 	.krf = 0x04,
@@ -607,20 +584,22 @@ static int rtl2831u_frontend_attach(struct dvb_usb_adapter *adap)
 {
 	struct dvb_usb_device *d = adap_to_d(adap);
 	struct rtl28xxu_priv *priv = d_to_priv(d);
-	const struct rtl2830_config *rtl2830_config;
+	struct rtl2830_platform_data *pdata = &priv->rtl2830_platform_data;
+	struct i2c_board_info board_info;
+	struct i2c_client *client;
 	int ret;
 
 	dev_dbg(&d->udev->dev, "%s:\n", __func__);
 
 	switch (priv->tuner) {
 	case TUNER_RTL2830_QT1010:
-		rtl2830_config = &rtl28xxu_rtl2830_qt1010_config;
+		*pdata = rtl2830_qt1010_platform_data;
 		break;
 	case TUNER_RTL2830_MT2060:
-		rtl2830_config = &rtl28xxu_rtl2830_mt2060_config;
+		*pdata = rtl2830_mt2060_platform_data;
 		break;
 	case TUNER_RTL2830_MXL5005S:
-		rtl2830_config = &rtl28xxu_rtl2830_mxl5005s_config;
+		*pdata = rtl2830_mxl5005s_platform_data;
 		break;
 	default:
 		dev_err(&d->udev->dev, "%s: unknown tuner=%s\n",
@@ -630,12 +609,28 @@ static int rtl2831u_frontend_attach(struct dvb_usb_adapter *adap)
 	}
 
 	/* attach demodulator */
-	adap->fe[0] = dvb_attach(rtl2830_attach, rtl2830_config, &d->i2c_adap);
-	if (!adap->fe[0]) {
+	memset(&board_info, 0, sizeof(board_info));
+	strlcpy(board_info.type, "rtl2830", I2C_NAME_SIZE);
+	board_info.addr = 0x10;
+	board_info.platform_data = pdata;
+	request_module("%s", board_info.type);
+	client = i2c_new_device(&d->i2c_adap, &board_info);
+	if (client == NULL || client->dev.driver == NULL) {
 		ret = -ENODEV;
 		goto err;
 	}
 
+	if (!try_module_get(client->dev.driver->owner)) {
+		i2c_unregister_device(client);
+		ret = -ENODEV;
+		goto err;
+	}
+
+	adap->fe[0] = pdata->get_dvb_frontend(client);
+	priv->demod_i2c_adapter = pdata->get_i2c_adapter(client);
+
+	priv->i2c_client_demod = client;
+
 	return 0;
 err:
 	dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret);
@@ -972,27 +967,25 @@ static int rtl2831u_tuner_attach(struct dvb_usb_adapter *adap)
 	int ret;
 	struct dvb_usb_device *d = adap_to_d(adap);
 	struct rtl28xxu_priv *priv = d_to_priv(d);
-	struct i2c_adapter *rtl2830_tuner_i2c;
 	struct dvb_frontend *fe;
 
 	dev_dbg(&d->udev->dev, "%s:\n", __func__);
 
-	/* use rtl2830 driver I2C adapter, for more info see rtl2830 driver */
-	rtl2830_tuner_i2c = rtl2830_get_tuner_i2c_adapter(adap->fe[0]);
-
 	switch (priv->tuner) {
 	case TUNER_RTL2830_QT1010:
 		fe = dvb_attach(qt1010_attach, adap->fe[0],
-				rtl2830_tuner_i2c, &rtl28xxu_qt1010_config);
+				priv->demod_i2c_adapter,
+				&rtl28xxu_qt1010_config);
 		break;
 	case TUNER_RTL2830_MT2060:
 		fe = dvb_attach(mt2060_attach, adap->fe[0],
-				rtl2830_tuner_i2c, &rtl28xxu_mt2060_config,
-				1220);
+				priv->demod_i2c_adapter,
+				&rtl28xxu_mt2060_config, 1220);
 		break;
 	case TUNER_RTL2830_MXL5005S:
 		fe = dvb_attach(mxl5005s_attach, adap->fe[0],
-				rtl2830_tuner_i2c, &rtl28xxu_mxl5005s_config);
+				priv->demod_i2c_adapter,
+				&rtl28xxu_mxl5005s_config);
 		break;
 	default:
 		fe = NULL;
@@ -1585,6 +1578,7 @@ static const struct dvb_usb_device_properties rtl2831u_props = {
 	.i2c_algo = &rtl28xxu_i2c_algo,
 	.read_config = rtl2831u_read_config,
 	.frontend_attach = rtl2831u_frontend_attach,
+	.frontend_detach = rtl2832u_frontend_detach,
 	.tuner_attach = rtl2831u_tuner_attach,
 	.init = rtl28xxu_init,
 	.get_rc_config = rtl2831u_get_rc_config,
diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.h b/drivers/media/usb/dvb-usb-v2/rtl28xxu.h
index e52a2b7..3f630c8 100644
--- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.h
+++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.h
@@ -24,6 +24,22 @@
 
 #include "dvb_usb.h"
 
+#include "rtl2830.h"
+#include "rtl2832.h"
+#include "rtl2832_sdr.h"
+#include "mn88472.h"
+#include "mn88473.h"
+
+#include "qt1010.h"
+#include "mt2060.h"
+#include "mxl5005s.h"
+#include "fc0012.h"
+#include "fc0013.h"
+#include "e4000.h"
+#include "fc2580.h"
+#include "tua9001.h"
+#include "r820t.h"
+
 /*
  * USB commands
  * (usb_control_msg() index parameter)
@@ -64,6 +80,7 @@ struct rtl28xxu_priv {
 	#define SLAVE_DEMOD_MN88472        1
 	#define SLAVE_DEMOD_MN88473        2
 	unsigned int slave_demod:2;
+	struct rtl2830_platform_data rtl2830_platform_data;
 };
 
 enum rtl28xxu_chip_id {
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 03/18] rtl2830: get rid of legacy DVB driver binding
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
  2014-12-14  8:28 ` [PATCH 02/18] rtl28xxu: use I2C binding for RTL2830 demod driver Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 04/18] rtl2830: rename 'priv' to 'dev' Antti Palosaari
                   ` (14 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Remove legacy DVB binding as all users are using I2C binding.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c      | 101 -----------------------------
 drivers/media/dvb-frontends/rtl2830.h      |  63 ------------------
 drivers/media/dvb-frontends/rtl2830_priv.h |   9 +++
 3 files changed, 9 insertions(+), 164 deletions(-)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index ec4a19c..541e244 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -631,104 +631,6 @@ err:
 	return ret;
 }
 
-static struct dvb_frontend_ops rtl2830_ops;
-
-static u32 rtl2830_tuner_i2c_func(struct i2c_adapter *adapter)
-{
-	return I2C_FUNC_I2C;
-}
-
-static int rtl2830_tuner_i2c_xfer(struct i2c_adapter *i2c_adap,
-	struct i2c_msg msg[], int num)
-{
-	struct rtl2830_priv *priv = i2c_get_adapdata(i2c_adap);
-	int ret;
-
-	/* open i2c-gate */
-	ret = rtl2830_wr_reg_mask(priv, 0x101, 0x08, 0x08);
-	if (ret)
-		goto err;
-
-	ret = i2c_transfer(priv->i2c, msg, num);
-	if (ret < 0)
-		dev_warn(&priv->i2c->dev, "%s: tuner i2c failed=%d\n",
-			KBUILD_MODNAME, ret);
-
-	return ret;
-err:
-	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
-	return ret;
-}
-
-static struct i2c_algorithm rtl2830_tuner_i2c_algo = {
-	.master_xfer   = rtl2830_tuner_i2c_xfer,
-	.functionality = rtl2830_tuner_i2c_func,
-};
-
-struct i2c_adapter *rtl2830_get_tuner_i2c_adapter(struct dvb_frontend *fe)
-{
-	struct rtl2830_priv *priv = fe->demodulator_priv;
-	return &priv->tuner_i2c_adapter;
-}
-EXPORT_SYMBOL(rtl2830_get_tuner_i2c_adapter);
-
-static void rtl2830_release(struct dvb_frontend *fe)
-{
-	struct rtl2830_priv *priv = fe->demodulator_priv;
-
-	i2c_del_adapter(&priv->tuner_i2c_adapter);
-	kfree(priv);
-}
-
-struct dvb_frontend *rtl2830_attach(const struct rtl2830_config *cfg,
-	struct i2c_adapter *i2c)
-{
-	struct rtl2830_priv *priv = NULL;
-	int ret = 0;
-	u8 tmp;
-
-	/* allocate memory for the internal state */
-	priv = kzalloc(sizeof(struct rtl2830_priv), GFP_KERNEL);
-	if (priv == NULL)
-		goto err;
-
-	/* setup the priv */
-	priv->i2c = i2c;
-	memcpy(&priv->cfg, cfg, sizeof(struct rtl2830_config));
-
-	/* check if the demod is there */
-	ret = rtl2830_rd_reg(priv, 0x000, &tmp);
-	if (ret)
-		goto err;
-
-	/* create dvb_frontend */
-	memcpy(&priv->fe.ops, &rtl2830_ops, sizeof(struct dvb_frontend_ops));
-	priv->fe.demodulator_priv = priv;
-
-	/* create tuner i2c adapter */
-	strlcpy(priv->tuner_i2c_adapter.name, "RTL2830 tuner I2C adapter",
-		sizeof(priv->tuner_i2c_adapter.name));
-	priv->tuner_i2c_adapter.algo = &rtl2830_tuner_i2c_algo;
-	priv->tuner_i2c_adapter.algo_data = NULL;
-	priv->tuner_i2c_adapter.dev.parent = &i2c->dev;
-	i2c_set_adapdata(&priv->tuner_i2c_adapter, priv);
-	if (i2c_add_adapter(&priv->tuner_i2c_adapter) < 0) {
-		dev_err(&i2c->dev,
-				"%s: tuner i2c bus could not be initialized\n",
-				KBUILD_MODNAME);
-		goto err;
-	}
-
-	priv->sleeping = true;
-
-	return &priv->fe;
-err:
-	dev_dbg(&i2c->dev, "%s: failed=%d\n", __func__, ret);
-	kfree(priv);
-	return NULL;
-}
-EXPORT_SYMBOL(rtl2830_attach);
-
 static struct dvb_frontend_ops rtl2830_ops = {
 	.delsys = { SYS_DVBT },
 	.info = {
@@ -750,8 +652,6 @@ static struct dvb_frontend_ops rtl2830_ops = {
 			FE_CAN_MUTE_TS
 	},
 
-	.release = rtl2830_release,
-
 	.init = rtl2830_init,
 	.sleep = rtl2830_sleep,
 
@@ -888,7 +788,6 @@ static int rtl2830_probe(struct i2c_client *client,
 
 	/* 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 */
diff --git a/drivers/media/dvb-frontends/rtl2830.h b/drivers/media/dvb-frontends/rtl2830.h
index b925ea5..1d7784d 100644
--- a/drivers/media/dvb-frontends/rtl2830.h
+++ b/drivers/media/dvb-frontends/rtl2830.h
@@ -55,67 +55,4 @@ struct rtl2830_platform_data {
 	struct i2c_adapter* (*get_i2c_adapter)(struct i2c_client *);
 };
 
-struct rtl2830_config {
-	/*
-	 * Demodulator I2C address.
-	 */
-	u8 i2c_addr;
-
-	/*
-	 * Xtal frequency.
-	 * Hz
-	 * 4000000, 16000000, 25000000, 28800000
-	 */
-	u32 xtal;
-
-	/*
-	 * TS output mode.
-	 */
-	u8 ts_mode;
-
-	/*
-	 * Spectrum inversion.
-	 */
-	bool spec_inv;
-
-	/*
-	 */
-	u8 vtop;
-
-	/*
-	 */
-	u8 krf;
-
-	/*
-	 */
-	u8 agc_targ_val;
-};
-
-#if IS_ENABLED(CONFIG_DVB_RTL2830)
-extern struct dvb_frontend *rtl2830_attach(
-	const struct rtl2830_config *config,
-	struct i2c_adapter *i2c
-);
-
-extern struct i2c_adapter *rtl2830_get_tuner_i2c_adapter(
-	struct dvb_frontend *fe
-);
-#else
-static inline struct dvb_frontend *rtl2830_attach(
-	const struct rtl2830_config *config,
-	struct i2c_adapter *i2c
-)
-{
-	pr_warn("%s: driver disabled by Kconfig\n", __func__);
-	return NULL;
-}
-
-static inline struct i2c_adapter *rtl2830_get_tuner_i2c_adapter(
-	struct dvb_frontend *fe
-)
-{
-	return NULL;
-}
-#endif
-
 #endif /* RTL2830_H */
diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
index 1a78351..545907a 100644
--- a/drivers/media/dvb-frontends/rtl2830_priv.h
+++ b/drivers/media/dvb-frontends/rtl2830_priv.h
@@ -26,6 +26,15 @@
 #include "rtl2830.h"
 #include <linux/i2c-mux.h>
 
+struct rtl2830_config {
+	u8 i2c_addr;
+	u32 xtal;
+	bool spec_inv;
+	u8 vtop;
+	u8 krf;
+	u8 agc_targ_val;
+};
+
 struct rtl2830_priv {
 	struct i2c_adapter *adapter;
 	struct i2c_adapter *i2c;
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 04/18] rtl2830: rename 'priv' to 'dev'
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
  2014-12-14  8:28 ` [PATCH 02/18] rtl28xxu: use I2C binding for RTL2830 demod driver Antti Palosaari
  2014-12-14  8:28 ` [PATCH 03/18] rtl2830: get rid of legacy DVB driver binding Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 05/18] rtl2830: carry pointer to I2C client for every function Antti Palosaari
                   ` (13 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Use name 'dev' for device state instance as it is more common and
also one letter shorter.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c      | 212 ++++++++++++++---------------
 drivers/media/dvb-frontends/rtl2830_priv.h |   2 +-
 2 files changed, 107 insertions(+), 107 deletions(-)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index 541e244..44643d9 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -31,13 +31,13 @@
 #define MAX_XFER_SIZE  64
 
 /* write multiple hardware registers */
-static int rtl2830_wr(struct rtl2830_priv *priv, u8 reg, const u8 *val, int len)
+static int rtl2830_wr(struct rtl2830_dev *dev, u8 reg, const u8 *val, int len)
 {
 	int ret;
 	u8 buf[MAX_XFER_SIZE];
 	struct i2c_msg msg[1] = {
 		{
-			.addr = priv->cfg.i2c_addr,
+			.addr = dev->cfg.i2c_addr,
 			.flags = 0,
 			.len = 1 + len,
 			.buf = buf,
@@ -45,7 +45,7 @@ static int rtl2830_wr(struct rtl2830_priv *priv, u8 reg, const u8 *val, int len)
 	};
 
 	if (1 + len > sizeof(buf)) {
-		dev_warn(&priv->i2c->dev,
+		dev_warn(&dev->i2c->dev,
 			 "%s: i2c wr reg=%04x: len=%d is too big!\n",
 			 KBUILD_MODNAME, reg, len);
 		return -EINVAL;
@@ -54,11 +54,11 @@ static int rtl2830_wr(struct rtl2830_priv *priv, u8 reg, const u8 *val, int len)
 	buf[0] = reg;
 	memcpy(&buf[1], val, len);
 
-	ret = i2c_transfer(priv->i2c, msg, 1);
+	ret = i2c_transfer(dev->i2c, msg, 1);
 	if (ret == 1) {
 		ret = 0;
 	} else {
-		dev_warn(&priv->i2c->dev, "%s: i2c wr failed=%d reg=%02x " \
+		dev_warn(&dev->i2c->dev, "%s: i2c wr failed=%d reg=%02x " \
 				"len=%d\n", KBUILD_MODNAME, ret, reg, len);
 		ret = -EREMOTEIO;
 	}
@@ -66,28 +66,28 @@ static int rtl2830_wr(struct rtl2830_priv *priv, u8 reg, const u8 *val, int len)
 }
 
 /* read multiple hardware registers */
-static int rtl2830_rd(struct rtl2830_priv *priv, u8 reg, u8 *val, int len)
+static int rtl2830_rd(struct rtl2830_dev *dev, u8 reg, u8 *val, int len)
 {
 	int ret;
 	struct i2c_msg msg[2] = {
 		{
-			.addr = priv->cfg.i2c_addr,
+			.addr = dev->cfg.i2c_addr,
 			.flags = 0,
 			.len = 1,
 			.buf = &reg,
 		}, {
-			.addr = priv->cfg.i2c_addr,
+			.addr = dev->cfg.i2c_addr,
 			.flags = I2C_M_RD,
 			.len = len,
 			.buf = val,
 		}
 	};
 
-	ret = i2c_transfer(priv->i2c, msg, 2);
+	ret = i2c_transfer(dev->i2c, msg, 2);
 	if (ret == 2) {
 		ret = 0;
 	} else {
-		dev_warn(&priv->i2c->dev, "%s: i2c rd failed=%d reg=%02x " \
+		dev_warn(&dev->i2c->dev, "%s: i2c rd failed=%d reg=%02x " \
 				"len=%d\n", KBUILD_MODNAME, ret, reg, len);
 		ret = -EREMOTEIO;
 	}
@@ -95,7 +95,7 @@ static int rtl2830_rd(struct rtl2830_priv *priv, u8 reg, u8 *val, int len)
 }
 
 /* write multiple registers */
-static int rtl2830_wr_regs(struct rtl2830_priv *priv, u16 reg, const u8 *val,
+static int rtl2830_wr_regs(struct rtl2830_dev *dev, u16 reg, const u8 *val,
 		int len)
 {
 	int ret;
@@ -103,51 +103,51 @@ static int rtl2830_wr_regs(struct rtl2830_priv *priv, u16 reg, const u8 *val,
 	u8 page = (reg >> 8) & 0xff;
 
 	/* switch bank if needed */
-	if (page != priv->page) {
-		ret = rtl2830_wr(priv, 0x00, &page, 1);
+	if (page != dev->page) {
+		ret = rtl2830_wr(dev, 0x00, &page, 1);
 		if (ret)
 			return ret;
 
-		priv->page = page;
+		dev->page = page;
 	}
 
-	return rtl2830_wr(priv, reg2, val, len);
+	return rtl2830_wr(dev, reg2, val, len);
 }
 
 /* read multiple registers */
-static int rtl2830_rd_regs(struct rtl2830_priv *priv, u16 reg, u8 *val, int len)
+static int rtl2830_rd_regs(struct rtl2830_dev *dev, u16 reg, u8 *val, int len)
 {
 	int ret;
 	u8 reg2 = (reg >> 0) & 0xff;
 	u8 page = (reg >> 8) & 0xff;
 
 	/* switch bank if needed */
-	if (page != priv->page) {
-		ret = rtl2830_wr(priv, 0x00, &page, 1);
+	if (page != dev->page) {
+		ret = rtl2830_wr(dev, 0x00, &page, 1);
 		if (ret)
 			return ret;
 
-		priv->page = page;
+		dev->page = page;
 	}
 
-	return rtl2830_rd(priv, reg2, val, len);
+	return rtl2830_rd(dev, reg2, val, len);
 }
 
 /* read single register */
-static int rtl2830_rd_reg(struct rtl2830_priv *priv, u16 reg, u8 *val)
+static int rtl2830_rd_reg(struct rtl2830_dev *dev, u16 reg, u8 *val)
 {
-	return rtl2830_rd_regs(priv, reg, val, 1);
+	return rtl2830_rd_regs(dev, reg, val, 1);
 }
 
 /* write single register with mask */
-static int rtl2830_wr_reg_mask(struct rtl2830_priv *priv, u16 reg, u8 val, u8 mask)
+static int rtl2830_wr_reg_mask(struct rtl2830_dev *dev, u16 reg, u8 val, u8 mask)
 {
 	int ret;
 	u8 tmp;
 
 	/* no need for read if whole reg is written */
 	if (mask != 0xff) {
-		ret = rtl2830_rd_regs(priv, reg, &tmp, 1);
+		ret = rtl2830_rd_regs(dev, reg, &tmp, 1);
 		if (ret)
 			return ret;
 
@@ -156,16 +156,16 @@ static int rtl2830_wr_reg_mask(struct rtl2830_priv *priv, u16 reg, u8 val, u8 ma
 		val |= tmp;
 	}
 
-	return rtl2830_wr_regs(priv, reg, &val, 1);
+	return rtl2830_wr_regs(dev, reg, &val, 1);
 }
 
 /* read single register with mask */
-static int rtl2830_rd_reg_mask(struct rtl2830_priv *priv, u16 reg, u8 *val, u8 mask)
+static int rtl2830_rd_reg_mask(struct rtl2830_dev *dev, u16 reg, u8 *val, u8 mask)
 {
 	int ret, i;
 	u8 tmp;
 
-	ret = rtl2830_rd_regs(priv, reg, &tmp, 1);
+	ret = rtl2830_rd_regs(dev, reg, &tmp, 1);
 	if (ret)
 		return ret;
 
@@ -183,7 +183,7 @@ static int rtl2830_rd_reg_mask(struct rtl2830_priv *priv, u16 reg, u8 *val, u8 m
 
 static int rtl2830_init(struct dvb_frontend *fe)
 {
-	struct rtl2830_priv *priv = fe->demodulator_priv;
+	struct rtl2830_dev *dev = fe->demodulator_priv;
 	int ret, i;
 	struct rtl2830_reg_val_mask tab[] = {
 		{ 0x00d, 0x01, 0x03 },
@@ -204,10 +204,10 @@ static int rtl2830_init(struct dvb_frontend *fe)
 		{ 0x2f1, 0x20, 0xf8 },
 		{ 0x16d, 0x00, 0x01 },
 		{ 0x1a6, 0x00, 0x80 },
-		{ 0x106, priv->cfg.vtop, 0x3f },
-		{ 0x107, priv->cfg.krf, 0x3f },
+		{ 0x106, dev->cfg.vtop, 0x3f },
+		{ 0x107, dev->cfg.krf, 0x3f },
 		{ 0x112, 0x28, 0xff },
-		{ 0x103, priv->cfg.agc_targ_val, 0xff },
+		{ 0x103, dev->cfg.agc_targ_val, 0xff },
 		{ 0x00a, 0x02, 0x07 },
 		{ 0x140, 0x0c, 0x3c },
 		{ 0x140, 0x40, 0xc0 },
@@ -215,7 +215,7 @@ static int rtl2830_init(struct dvb_frontend *fe)
 		{ 0x15b, 0x28, 0x38 },
 		{ 0x15c, 0x05, 0x07 },
 		{ 0x15c, 0x28, 0x38 },
-		{ 0x115, priv->cfg.spec_inv, 0x01 },
+		{ 0x115, dev->cfg.spec_inv, 0x01 },
 		{ 0x16f, 0x01, 0x07 },
 		{ 0x170, 0x18, 0x38 },
 		{ 0x172, 0x0f, 0x0f },
@@ -225,17 +225,17 @@ static int rtl2830_init(struct dvb_frontend *fe)
 	};
 
 	for (i = 0; i < ARRAY_SIZE(tab); i++) {
-		ret = rtl2830_wr_reg_mask(priv, tab[i].reg, tab[i].val,
+		ret = rtl2830_wr_reg_mask(dev, tab[i].reg, tab[i].val,
 			tab[i].mask);
 		if (ret)
 			goto err;
 	}
 
-	ret = rtl2830_wr_regs(priv, 0x18f, "\x28\x00", 2);
+	ret = rtl2830_wr_regs(dev, 0x18f, "\x28\x00", 2);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_wr_regs(priv, 0x195,
+	ret = rtl2830_wr_regs(dev, 0x195,
 		"\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
 	if (ret)
 		goto err;
@@ -243,26 +243,26 @@ static int rtl2830_init(struct dvb_frontend *fe)
 	/* TODO: spec init */
 
 	/* soft reset */
-	ret = rtl2830_wr_reg_mask(priv, 0x101, 0x04, 0x04);
+	ret = rtl2830_wr_reg_mask(dev, 0x101, 0x04, 0x04);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_wr_reg_mask(priv, 0x101, 0x00, 0x04);
+	ret = rtl2830_wr_reg_mask(dev, 0x101, 0x00, 0x04);
 	if (ret)
 		goto err;
 
-	priv->sleeping = false;
+	dev->sleeping = false;
 
 	return ret;
 err:
-	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
 	return ret;
 }
 
 static int rtl2830_sleep(struct dvb_frontend *fe)
 {
-	struct rtl2830_priv *priv = fe->demodulator_priv;
-	priv->sleeping = true;
+	struct rtl2830_dev *dev = fe->demodulator_priv;
+	dev->sleeping = true;
 	return 0;
 }
 
@@ -278,7 +278,7 @@ static int rtl2830_get_tune_settings(struct dvb_frontend *fe,
 
 static int rtl2830_set_frontend(struct dvb_frontend *fe)
 {
-	struct rtl2830_priv *priv = fe->demodulator_priv;
+	struct rtl2830_dev *dev = fe->demodulator_priv;
 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 	int ret, i;
 	u64 num;
@@ -308,7 +308,7 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 		{0xae, 0xba, 0xf3, 0x26, 0x66, 0x64}, /* 8 MHz */
 	};
 
-	dev_dbg(&priv->i2c->dev,
+	dev_dbg(&dev->i2c->dev,
 			"%s: frequency=%d bandwidth_hz=%d inversion=%d\n",
 			__func__, c->frequency, c->bandwidth_hz, c->inversion);
 
@@ -327,11 +327,11 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 		i = 2;
 		break;
 	default:
-		dev_dbg(&priv->i2c->dev, "%s: invalid bandwidth\n", __func__);
+		dev_dbg(&dev->i2c->dev, "%s: invalid bandwidth\n", __func__);
 		return -EINVAL;
 	}
 
-	ret = rtl2830_wr_reg_mask(priv, 0x008, i << 1, 0x06);
+	ret = rtl2830_wr_reg_mask(dev, 0x008, i << 1, 0x06);
 	if (ret)
 		goto err;
 
@@ -344,15 +344,15 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 	if (ret < 0)
 		goto err;
 
-	num = if_frequency % priv->cfg.xtal;
+	num = if_frequency % dev->cfg.xtal;
 	num *= 0x400000;
-	num = div_u64(num, priv->cfg.xtal);
+	num = div_u64(num, dev->cfg.xtal);
 	num = -num;
 	if_ctl = num & 0x3fffff;
-	dev_dbg(&priv->i2c->dev, "%s: if_frequency=%d if_ctl=%08x\n",
+	dev_dbg(&dev->i2c->dev, "%s: if_frequency=%d if_ctl=%08x\n",
 			__func__, if_frequency, if_ctl);
 
-	ret = rtl2830_rd_reg_mask(priv, 0x119, &tmp, 0xc0); /* b[7:6] */
+	ret = rtl2830_rd_reg_mask(dev, 0x119, &tmp, 0xc0); /* b[7:6] */
 	if (ret)
 		goto err;
 
@@ -361,49 +361,49 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 	buf[1] = (if_ctl >>  8) & 0xff;
 	buf[2] = (if_ctl >>  0) & 0xff;
 
-	ret = rtl2830_wr_regs(priv, 0x119, buf, 3);
+	ret = rtl2830_wr_regs(dev, 0x119, buf, 3);
 	if (ret)
 		goto err;
 
 	/* 1/2 split I2C write */
-	ret = rtl2830_wr_regs(priv, 0x11c, &bw_params1[i][0], 17);
+	ret = rtl2830_wr_regs(dev, 0x11c, &bw_params1[i][0], 17);
 	if (ret)
 		goto err;
 
 	/* 2/2 split I2C write */
-	ret = rtl2830_wr_regs(priv, 0x12d, &bw_params1[i][17], 17);
+	ret = rtl2830_wr_regs(dev, 0x12d, &bw_params1[i][17], 17);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_wr_regs(priv, 0x19d, bw_params2[i], 6);
+	ret = rtl2830_wr_regs(dev, 0x19d, bw_params2[i], 6);
 	if (ret)
 		goto err;
 
 	return ret;
 err:
-	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
 	return ret;
 }
 
 static int rtl2830_get_frontend(struct dvb_frontend *fe)
 {
-	struct rtl2830_priv *priv = fe->demodulator_priv;
+	struct rtl2830_dev *dev = fe->demodulator_priv;
 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 	int ret;
 	u8 buf[3];
 
-	if (priv->sleeping)
+	if (dev->sleeping)
 		return 0;
 
-	ret = rtl2830_rd_regs(priv, 0x33c, buf, 2);
+	ret = rtl2830_rd_regs(dev, 0x33c, buf, 2);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_rd_reg(priv, 0x351, &buf[2]);
+	ret = rtl2830_rd_reg(dev, 0x351, &buf[2]);
 	if (ret)
 		goto err;
 
-	dev_dbg(&priv->i2c->dev, "%s: TPS=%*ph\n", __func__, 3, buf);
+	dev_dbg(&dev->i2c->dev, "%s: TPS=%*ph\n", __func__, 3, buf);
 
 	switch ((buf[0] >> 2) & 3) {
 	case 0:
@@ -493,21 +493,21 @@ static int rtl2830_get_frontend(struct dvb_frontend *fe)
 
 	return 0;
 err:
-	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
 	return ret;
 }
 
 static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status)
 {
-	struct rtl2830_priv *priv = fe->demodulator_priv;
+	struct rtl2830_dev *dev = fe->demodulator_priv;
 	int ret;
 	u8 tmp;
 	*status = 0;
 
-	if (priv->sleeping)
+	if (dev->sleeping)
 		return 0;
 
-	ret = rtl2830_rd_reg_mask(priv, 0x351, &tmp, 0x78); /* [6:3] */
+	ret = rtl2830_rd_reg_mask(dev, 0x351, &tmp, 0x78); /* [6:3] */
 	if (ret)
 		goto err;
 
@@ -521,13 +521,13 @@ static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status)
 
 	return ret;
 err:
-	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
 	return ret;
 }
 
 static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
 {
-	struct rtl2830_priv *priv = fe->demodulator_priv;
+	struct rtl2830_dev *dev = fe->demodulator_priv;
 	int ret, hierarchy, constellation;
 	u8 buf[2], tmp;
 	u16 tmp16;
@@ -539,12 +539,12 @@ static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
 		{ 92888734, 92888734, 95487525, 99770748 },
 	};
 
-	if (priv->sleeping)
+	if (dev->sleeping)
 		return 0;
 
 	/* reports SNR in resolution of 0.1 dB */
 
-	ret = rtl2830_rd_reg(priv, 0x33c, &tmp);
+	ret = rtl2830_rd_reg(dev, 0x33c, &tmp);
 	if (ret)
 		goto err;
 
@@ -556,7 +556,7 @@ static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
 	if (hierarchy > HIERARCHY_NUM - 1)
 		goto err;
 
-	ret = rtl2830_rd_regs(priv, 0x40c, buf, 2);
+	ret = rtl2830_rd_regs(dev, 0x40c, buf, 2);
 	if (ret)
 		goto err;
 
@@ -570,20 +570,20 @@ static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
 
 	return 0;
 err:
-	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
 	return ret;
 }
 
 static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
 {
-	struct rtl2830_priv *priv = fe->demodulator_priv;
+	struct rtl2830_dev *dev = fe->demodulator_priv;
 	int ret;
 	u8 buf[2];
 
-	if (priv->sleeping)
+	if (dev->sleeping)
 		return 0;
 
-	ret = rtl2830_rd_regs(priv, 0x34e, buf, 2);
+	ret = rtl2830_rd_regs(dev, 0x34e, buf, 2);
 	if (ret)
 		goto err;
 
@@ -591,7 +591,7 @@ static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
 
 	return 0;
 err:
-	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
 	return ret;
 }
 
@@ -603,15 +603,15 @@ static int rtl2830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
 
 static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 {
-	struct rtl2830_priv *priv = fe->demodulator_priv;
+	struct rtl2830_dev *dev = fe->demodulator_priv;
 	int ret;
 	u8 buf[2];
 	u16 if_agc_raw, if_agc;
 
-	if (priv->sleeping)
+	if (dev->sleeping)
 		return 0;
 
-	ret = rtl2830_rd_regs(priv, 0x359, buf, 2);
+	ret = rtl2830_rd_regs(dev, 0x359, buf, 2);
 	if (ret)
 		goto err;
 
@@ -627,7 +627,7 @@ static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 
 	return 0;
 err:
-	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
 	return ret;
 }
 
@@ -675,10 +675,10 @@ static struct dvb_frontend_ops rtl2830_ops = {
 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 rtl2830_dev *dev = i2c_get_clientdata(client);
 	struct i2c_msg select_reg_page_msg[1] = {
 		{
-			.addr = priv->cfg.i2c_addr,
+			.addr = dev->cfg.i2c_addr,
 			.flags = 0,
 			.len = 2,
 			.buf = "\x00\x01",
@@ -686,7 +686,7 @@ static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
 	};
 	struct i2c_msg gate_open_msg[1] = {
 		{
-			.addr = priv->cfg.i2c_addr,
+			.addr = dev->cfg.i2c_addr,
 			.flags = 0,
 			.len = 2,
 			.buf = "\x01\x08",
@@ -703,7 +703,7 @@ static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
 		goto err;
 	}
 
-	priv->page = 1;
+	dev->page = 1;
 
 	/* open tuner I2C repeater for 1 xfer, closes automatically */
 	ret = __i2c_transfer(adap, gate_open_msg, 1);
@@ -723,20 +723,20 @@ err:
 
 static struct dvb_frontend *rtl2830_get_dvb_frontend(struct i2c_client *client)
 {
-	struct rtl2830_priv *priv = i2c_get_clientdata(client);
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 
 	dev_dbg(&client->dev, "\n");
 
-	return &priv->fe;
+	return &dev->fe;
 }
 
 static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
 {
-	struct rtl2830_priv *priv = i2c_get_clientdata(client);
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 
 	dev_dbg(&client->dev, "\n");
 
-	return priv->adapter;
+	return dev->adapter;
 }
 
 static int rtl2830_probe(struct i2c_client *client,
@@ -744,7 +744,7 @@ static int rtl2830_probe(struct i2c_client *client,
 {
 	struct rtl2830_platform_data *pdata = client->dev.platform_data;
 	struct i2c_adapter *i2c = client->adapter;
-	struct rtl2830_priv *priv;
+	struct rtl2830_dev *dev;
 	int ret;
 	u8 u8tmp;
 
@@ -756,39 +756,39 @@ static int rtl2830_probe(struct i2c_client *client,
 	}
 
 	/* allocate memory for the internal state */
-	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
-	if (priv == NULL) {
+	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+	if (dev == 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;
+	i2c_set_clientdata(client, dev);
+	dev->i2c = i2c;
+	dev->sleeping = true;
+	dev->cfg.i2c_addr = client->addr;
+	dev->cfg.xtal = pdata->clk;
+	dev->cfg.spec_inv = pdata->spec_inv;
+	dev->cfg.vtop = pdata->vtop;
+	dev->cfg.krf = pdata->krf;
+	dev->cfg.agc_targ_val = pdata->agc_targ_val;
 
 	/* check if the demod is there */
-	ret = rtl2830_rd_reg(priv, 0x000, &u8tmp);
+	ret = rtl2830_rd_reg(dev, 0x000, &u8tmp);
 	if (ret)
 		goto err_kfree;
 
 	/* create muxed i2c adapter for tuner */
-	priv->adapter = i2c_add_mux_adapter(client->adapter, &client->dev,
+	dev->adapter = i2c_add_mux_adapter(client->adapter, &client->dev,
 			client, 0, 0, 0, rtl2830_select, NULL);
-	if (priv->adapter == NULL) {
+	if (dev->adapter == NULL) {
 		ret = -ENODEV;
 		goto err_kfree;
 	}
 
 	/* create dvb frontend */
-	memcpy(&priv->fe.ops, &rtl2830_ops, sizeof(priv->fe.ops));
-	priv->fe.demodulator_priv = priv;
+	memcpy(&dev->fe.ops, &rtl2830_ops, sizeof(dev->fe.ops));
+	dev->fe.demodulator_priv = dev;
 
 	/* setup callbacks */
 	pdata->get_dvb_frontend = rtl2830_get_dvb_frontend;
@@ -798,7 +798,7 @@ static int rtl2830_probe(struct i2c_client *client,
 	return 0;
 
 err_kfree:
-	kfree(priv);
+	kfree(dev);
 err:
 	dev_dbg(&client->dev, "failed=%d\n", ret);
 	return ret;
@@ -806,12 +806,12 @@ err:
 
 static int rtl2830_remove(struct i2c_client *client)
 {
-	struct rtl2830_priv *priv = i2c_get_clientdata(client);
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 
 	dev_dbg(&client->dev, "\n");
 
-	i2c_del_mux_adapter(priv->adapter);
-	kfree(priv);
+	i2c_del_mux_adapter(dev->adapter);
+	kfree(dev);
 	return 0;
 }
 
diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
index 545907a..9e7bd42 100644
--- a/drivers/media/dvb-frontends/rtl2830_priv.h
+++ b/drivers/media/dvb-frontends/rtl2830_priv.h
@@ -35,7 +35,7 @@ struct rtl2830_config {
 	u8 agc_targ_val;
 };
 
-struct rtl2830_priv {
+struct rtl2830_dev {
 	struct i2c_adapter *adapter;
 	struct i2c_adapter *i2c;
 	struct dvb_frontend fe;
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 05/18] rtl2830: carry pointer to I2C client for every function
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (2 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 04/18] rtl2830: rename 'priv' to 'dev' Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 06/18] rtl2830: fix logging Antti Palosaari
                   ` (12 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

As a I2C driver struct i2c_client is top level structure representing
the driver. Use it as parameter to carry all needed information for
each function in order to simplify things.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c | 97 +++++++++++++++++++----------------
 1 file changed, 54 insertions(+), 43 deletions(-)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index 44643d9..e7ba665 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -31,8 +31,9 @@
 #define MAX_XFER_SIZE  64
 
 /* write multiple hardware registers */
-static int rtl2830_wr(struct rtl2830_dev *dev, u8 reg, const u8 *val, int len)
+static int rtl2830_wr(struct i2c_client *client, u8 reg, const u8 *val, int len)
 {
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
 	u8 buf[MAX_XFER_SIZE];
 	struct i2c_msg msg[1] = {
@@ -66,8 +67,9 @@ static int rtl2830_wr(struct rtl2830_dev *dev, u8 reg, const u8 *val, int len)
 }
 
 /* read multiple hardware registers */
-static int rtl2830_rd(struct rtl2830_dev *dev, u8 reg, u8 *val, int len)
+static int rtl2830_rd(struct i2c_client *client, u8 reg, u8 *val, int len)
 {
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
 	struct i2c_msg msg[2] = {
 		{
@@ -95,59 +97,60 @@ static int rtl2830_rd(struct rtl2830_dev *dev, u8 reg, u8 *val, int len)
 }
 
 /* write multiple registers */
-static int rtl2830_wr_regs(struct rtl2830_dev *dev, u16 reg, const u8 *val,
-		int len)
+static int rtl2830_wr_regs(struct i2c_client *client, u16 reg, const u8 *val, int len)
 {
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
 	u8 reg2 = (reg >> 0) & 0xff;
 	u8 page = (reg >> 8) & 0xff;
 
 	/* switch bank if needed */
 	if (page != dev->page) {
-		ret = rtl2830_wr(dev, 0x00, &page, 1);
+		ret = rtl2830_wr(client, 0x00, &page, 1);
 		if (ret)
 			return ret;
 
 		dev->page = page;
 	}
 
-	return rtl2830_wr(dev, reg2, val, len);
+	return rtl2830_wr(client, reg2, val, len);
 }
 
 /* read multiple registers */
-static int rtl2830_rd_regs(struct rtl2830_dev *dev, u16 reg, u8 *val, int len)
+static int rtl2830_rd_regs(struct i2c_client *client, u16 reg, u8 *val, int len)
 {
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
 	u8 reg2 = (reg >> 0) & 0xff;
 	u8 page = (reg >> 8) & 0xff;
 
 	/* switch bank if needed */
 	if (page != dev->page) {
-		ret = rtl2830_wr(dev, 0x00, &page, 1);
+		ret = rtl2830_wr(client, 0x00, &page, 1);
 		if (ret)
 			return ret;
 
 		dev->page = page;
 	}
 
-	return rtl2830_rd(dev, reg2, val, len);
+	return rtl2830_rd(client, reg2, val, len);
 }
 
 /* read single register */
-static int rtl2830_rd_reg(struct rtl2830_dev *dev, u16 reg, u8 *val)
+static int rtl2830_rd_reg(struct i2c_client *client, u16 reg, u8 *val)
 {
-	return rtl2830_rd_regs(dev, reg, val, 1);
+	return rtl2830_rd_regs(client, reg, val, 1);
 }
 
 /* write single register with mask */
-static int rtl2830_wr_reg_mask(struct rtl2830_dev *dev, u16 reg, u8 val, u8 mask)
+static int rtl2830_wr_reg_mask(struct i2c_client *client, u16 reg, u8 val, u8 mask)
 {
 	int ret;
 	u8 tmp;
 
 	/* no need for read if whole reg is written */
 	if (mask != 0xff) {
-		ret = rtl2830_rd_regs(dev, reg, &tmp, 1);
+		ret = rtl2830_rd_regs(client, reg, &tmp, 1);
 		if (ret)
 			return ret;
 
@@ -156,16 +159,16 @@ static int rtl2830_wr_reg_mask(struct rtl2830_dev *dev, u16 reg, u8 val, u8 mask
 		val |= tmp;
 	}
 
-	return rtl2830_wr_regs(dev, reg, &val, 1);
+	return rtl2830_wr_regs(client, reg, &val, 1);
 }
 
 /* read single register with mask */
-static int rtl2830_rd_reg_mask(struct rtl2830_dev *dev, u16 reg, u8 *val, u8 mask)
+static int rtl2830_rd_reg_mask(struct i2c_client *client, u16 reg, u8 *val, u8 mask)
 {
 	int ret, i;
 	u8 tmp;
 
-	ret = rtl2830_rd_regs(dev, reg, &tmp, 1);
+	ret = rtl2830_rd_regs(client, reg, &tmp, 1);
 	if (ret)
 		return ret;
 
@@ -183,7 +186,8 @@ static int rtl2830_rd_reg_mask(struct rtl2830_dev *dev, u16 reg, u8 *val, u8 mas
 
 static int rtl2830_init(struct dvb_frontend *fe)
 {
-	struct rtl2830_dev *dev = fe->demodulator_priv;
+	struct i2c_client *client = fe->demodulator_priv;
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret, i;
 	struct rtl2830_reg_val_mask tab[] = {
 		{ 0x00d, 0x01, 0x03 },
@@ -225,17 +229,17 @@ static int rtl2830_init(struct dvb_frontend *fe)
 	};
 
 	for (i = 0; i < ARRAY_SIZE(tab); i++) {
-		ret = rtl2830_wr_reg_mask(dev, tab[i].reg, tab[i].val,
+		ret = rtl2830_wr_reg_mask(client, tab[i].reg, tab[i].val,
 			tab[i].mask);
 		if (ret)
 			goto err;
 	}
 
-	ret = rtl2830_wr_regs(dev, 0x18f, "\x28\x00", 2);
+	ret = rtl2830_wr_regs(client, 0x18f, "\x28\x00", 2);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_wr_regs(dev, 0x195,
+	ret = rtl2830_wr_regs(client, 0x195,
 		"\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
 	if (ret)
 		goto err;
@@ -243,11 +247,11 @@ static int rtl2830_init(struct dvb_frontend *fe)
 	/* TODO: spec init */
 
 	/* soft reset */
-	ret = rtl2830_wr_reg_mask(dev, 0x101, 0x04, 0x04);
+	ret = rtl2830_wr_reg_mask(client, 0x101, 0x04, 0x04);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_wr_reg_mask(dev, 0x101, 0x00, 0x04);
+	ret = rtl2830_wr_reg_mask(client, 0x101, 0x00, 0x04);
 	if (ret)
 		goto err;
 
@@ -261,7 +265,8 @@ err:
 
 static int rtl2830_sleep(struct dvb_frontend *fe)
 {
-	struct rtl2830_dev *dev = fe->demodulator_priv;
+	struct i2c_client *client = fe->demodulator_priv;
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	dev->sleeping = true;
 	return 0;
 }
@@ -278,7 +283,8 @@ static int rtl2830_get_tune_settings(struct dvb_frontend *fe,
 
 static int rtl2830_set_frontend(struct dvb_frontend *fe)
 {
-	struct rtl2830_dev *dev = fe->demodulator_priv;
+	struct i2c_client *client = fe->demodulator_priv;
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 	int ret, i;
 	u64 num;
@@ -331,7 +337,7 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 		return -EINVAL;
 	}
 
-	ret = rtl2830_wr_reg_mask(dev, 0x008, i << 1, 0x06);
+	ret = rtl2830_wr_reg_mask(client, 0x008, i << 1, 0x06);
 	if (ret)
 		goto err;
 
@@ -352,7 +358,7 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 	dev_dbg(&dev->i2c->dev, "%s: if_frequency=%d if_ctl=%08x\n",
 			__func__, if_frequency, if_ctl);
 
-	ret = rtl2830_rd_reg_mask(dev, 0x119, &tmp, 0xc0); /* b[7:6] */
+	ret = rtl2830_rd_reg_mask(client, 0x119, &tmp, 0xc0); /* b[7:6] */
 	if (ret)
 		goto err;
 
@@ -361,21 +367,21 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 	buf[1] = (if_ctl >>  8) & 0xff;
 	buf[2] = (if_ctl >>  0) & 0xff;
 
-	ret = rtl2830_wr_regs(dev, 0x119, buf, 3);
+	ret = rtl2830_wr_regs(client, 0x119, buf, 3);
 	if (ret)
 		goto err;
 
 	/* 1/2 split I2C write */
-	ret = rtl2830_wr_regs(dev, 0x11c, &bw_params1[i][0], 17);
+	ret = rtl2830_wr_regs(client, 0x11c, &bw_params1[i][0], 17);
 	if (ret)
 		goto err;
 
 	/* 2/2 split I2C write */
-	ret = rtl2830_wr_regs(dev, 0x12d, &bw_params1[i][17], 17);
+	ret = rtl2830_wr_regs(client, 0x12d, &bw_params1[i][17], 17);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_wr_regs(dev, 0x19d, bw_params2[i], 6);
+	ret = rtl2830_wr_regs(client, 0x19d, bw_params2[i], 6);
 	if (ret)
 		goto err;
 
@@ -387,7 +393,8 @@ err:
 
 static int rtl2830_get_frontend(struct dvb_frontend *fe)
 {
-	struct rtl2830_dev *dev = fe->demodulator_priv;
+	struct i2c_client *client = fe->demodulator_priv;
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 	int ret;
 	u8 buf[3];
@@ -395,11 +402,11 @@ static int rtl2830_get_frontend(struct dvb_frontend *fe)
 	if (dev->sleeping)
 		return 0;
 
-	ret = rtl2830_rd_regs(dev, 0x33c, buf, 2);
+	ret = rtl2830_rd_regs(client, 0x33c, buf, 2);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_rd_reg(dev, 0x351, &buf[2]);
+	ret = rtl2830_rd_reg(client, 0x351, &buf[2]);
 	if (ret)
 		goto err;
 
@@ -499,6 +506,7 @@ err:
 
 static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status)
 {
+	struct i2c_client *client = fe->demodulator_priv;
 	struct rtl2830_dev *dev = fe->demodulator_priv;
 	int ret;
 	u8 tmp;
@@ -507,7 +515,7 @@ static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status)
 	if (dev->sleeping)
 		return 0;
 
-	ret = rtl2830_rd_reg_mask(dev, 0x351, &tmp, 0x78); /* [6:3] */
+	ret = rtl2830_rd_reg_mask(client, 0x351, &tmp, 0x78); /* [6:3] */
 	if (ret)
 		goto err;
 
@@ -527,7 +535,8 @@ err:
 
 static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
 {
-	struct rtl2830_dev *dev = fe->demodulator_priv;
+	struct i2c_client *client = fe->demodulator_priv;
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret, hierarchy, constellation;
 	u8 buf[2], tmp;
 	u16 tmp16;
@@ -544,7 +553,7 @@ static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
 
 	/* reports SNR in resolution of 0.1 dB */
 
-	ret = rtl2830_rd_reg(dev, 0x33c, &tmp);
+	ret = rtl2830_rd_reg(client, 0x33c, &tmp);
 	if (ret)
 		goto err;
 
@@ -556,7 +565,7 @@ static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
 	if (hierarchy > HIERARCHY_NUM - 1)
 		goto err;
 
-	ret = rtl2830_rd_regs(dev, 0x40c, buf, 2);
+	ret = rtl2830_rd_regs(client, 0x40c, buf, 2);
 	if (ret)
 		goto err;
 
@@ -576,14 +585,15 @@ err:
 
 static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
 {
-	struct rtl2830_dev *dev = fe->demodulator_priv;
+	struct i2c_client *client = fe->demodulator_priv;
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
 	u8 buf[2];
 
 	if (dev->sleeping)
 		return 0;
 
-	ret = rtl2830_rd_regs(dev, 0x34e, buf, 2);
+	ret = rtl2830_rd_regs(client, 0x34e, buf, 2);
 	if (ret)
 		goto err;
 
@@ -603,7 +613,8 @@ static int rtl2830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
 
 static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 {
-	struct rtl2830_dev *dev = fe->demodulator_priv;
+	struct i2c_client *client = fe->demodulator_priv;
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
 	u8 buf[2];
 	u16 if_agc_raw, if_agc;
@@ -611,7 +622,7 @@ static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 	if (dev->sleeping)
 		return 0;
 
-	ret = rtl2830_rd_regs(dev, 0x359, buf, 2);
+	ret = rtl2830_rd_regs(client, 0x359, buf, 2);
 	if (ret)
 		goto err;
 
@@ -774,7 +785,7 @@ static int rtl2830_probe(struct i2c_client *client,
 	dev->cfg.agc_targ_val = pdata->agc_targ_val;
 
 	/* check if the demod is there */
-	ret = rtl2830_rd_reg(dev, 0x000, &u8tmp);
+	ret = rtl2830_rd_reg(client, 0x000, &u8tmp);
 	if (ret)
 		goto err_kfree;
 
@@ -788,7 +799,7 @@ static int rtl2830_probe(struct i2c_client *client,
 
 	/* create dvb frontend */
 	memcpy(&dev->fe.ops, &rtl2830_ops, sizeof(dev->fe.ops));
-	dev->fe.demodulator_priv = dev;
+	dev->fe.demodulator_priv = client;
 
 	/* setup callbacks */
 	pdata->get_dvb_frontend = rtl2830_get_dvb_frontend;
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 06/18] rtl2830: fix logging
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (3 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 05/18] rtl2830: carry pointer to I2C client for every function Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 07/18] rtl2830: get rid of internal config data Antti Palosaari
                   ` (11 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Pass correct device for dev_foo() logging in order to print logs
correctly.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c | 43 +++++++++++++++++------------------
 1 file changed, 21 insertions(+), 22 deletions(-)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index e7ba665..fa73575 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -46,9 +46,8 @@ static int rtl2830_wr(struct i2c_client *client, u8 reg, const u8 *val, int len)
 	};
 
 	if (1 + len > sizeof(buf)) {
-		dev_warn(&dev->i2c->dev,
-			 "%s: i2c wr reg=%04x: len=%d is too big!\n",
-			 KBUILD_MODNAME, reg, len);
+		dev_warn(&client->dev, "i2c wr reg=%04x: len=%d is too big!\n",
+				reg, len);
 		return -EINVAL;
 	}
 
@@ -59,8 +58,8 @@ static int rtl2830_wr(struct i2c_client *client, u8 reg, const u8 *val, int len)
 	if (ret == 1) {
 		ret = 0;
 	} else {
-		dev_warn(&dev->i2c->dev, "%s: i2c wr failed=%d reg=%02x " \
-				"len=%d\n", KBUILD_MODNAME, ret, reg, len);
+		dev_warn(&client->dev, "i2c wr failed=%d reg=%02x len=%d\n",
+				ret, reg, len);
 		ret = -EREMOTEIO;
 	}
 	return ret;
@@ -89,8 +88,8 @@ static int rtl2830_rd(struct i2c_client *client, u8 reg, u8 *val, int len)
 	if (ret == 2) {
 		ret = 0;
 	} else {
-		dev_warn(&dev->i2c->dev, "%s: i2c rd failed=%d reg=%02x " \
-				"len=%d\n", KBUILD_MODNAME, ret, reg, len);
+		dev_warn(&client->dev, "i2c rd failed=%d reg=%02x len=%d\n",
+				ret, reg, len);
 		ret = -EREMOTEIO;
 	}
 	return ret;
@@ -259,7 +258,7 @@ static int rtl2830_init(struct dvb_frontend *fe)
 
 	return ret;
 err:
-	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&client->dev, "failed=%d\n", ret);
 	return ret;
 }
 
@@ -314,9 +313,8 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 		{0xae, 0xba, 0xf3, 0x26, 0x66, 0x64}, /* 8 MHz */
 	};
 
-	dev_dbg(&dev->i2c->dev,
-			"%s: frequency=%d bandwidth_hz=%d inversion=%d\n",
-			__func__, c->frequency, c->bandwidth_hz, c->inversion);
+	dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
+			c->frequency, c->bandwidth_hz, c->inversion);
 
 	/* program tuner */
 	if (fe->ops.tuner_ops.set_params)
@@ -333,7 +331,8 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 		i = 2;
 		break;
 	default:
-		dev_dbg(&dev->i2c->dev, "%s: invalid bandwidth\n", __func__);
+		dev_err(&client->dev, "invalid bandwidth_hz %u\n",
+				c->bandwidth_hz);
 		return -EINVAL;
 	}
 
@@ -355,8 +354,8 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 	num = div_u64(num, dev->cfg.xtal);
 	num = -num;
 	if_ctl = num & 0x3fffff;
-	dev_dbg(&dev->i2c->dev, "%s: if_frequency=%d if_ctl=%08x\n",
-			__func__, if_frequency, if_ctl);
+	dev_dbg(&client->dev, "if_frequency=%d if_ctl=%08x\n",
+			if_frequency, if_ctl);
 
 	ret = rtl2830_rd_reg_mask(client, 0x119, &tmp, 0xc0); /* b[7:6] */
 	if (ret)
@@ -387,7 +386,7 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 
 	return ret;
 err:
-	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&client->dev, "failed=%d\n", ret);
 	return ret;
 }
 
@@ -410,7 +409,7 @@ static int rtl2830_get_frontend(struct dvb_frontend *fe)
 	if (ret)
 		goto err;
 
-	dev_dbg(&dev->i2c->dev, "%s: TPS=%*ph\n", __func__, 3, buf);
+	dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
 
 	switch ((buf[0] >> 2) & 3) {
 	case 0:
@@ -500,7 +499,7 @@ static int rtl2830_get_frontend(struct dvb_frontend *fe)
 
 	return 0;
 err:
-	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&client->dev, "failed=%d\n", ret);
 	return ret;
 }
 
@@ -529,7 +528,7 @@ static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status)
 
 	return ret;
 err:
-	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&client->dev, "failed=%d\n", ret);
 	return ret;
 }
 
@@ -579,7 +578,7 @@ static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
 
 	return 0;
 err:
-	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&client->dev, "failed=%d\n", ret);
 	return ret;
 }
 
@@ -601,7 +600,7 @@ static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
 
 	return 0;
 err:
-	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&client->dev, "failed=%d\n", ret);
 	return ret;
 }
 
@@ -638,7 +637,7 @@ static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 
 	return 0;
 err:
-	dev_dbg(&dev->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&client->dev, "failed=%d\n", ret);
 	return ret;
 }
 
@@ -728,7 +727,7 @@ static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
 	return 0;
 
 err:
-	dev_dbg(&client->dev, "%s: failed=%d\n", __func__, ret);
+	dev_dbg(&client->dev, "failed=%d\n", ret);
 	return ret;
 }
 
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 07/18] rtl2830: get rid of internal config data
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (4 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 06/18] rtl2830: fix logging Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 08/18] rtl2830: style related changes Antti Palosaari
                   ` (10 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Remove internal config and use configuration values directly from
the platform data.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c      | 43 ++++++++++++------------------
 drivers/media/dvb-frontends/rtl2830_priv.h | 15 +----------
 2 files changed, 18 insertions(+), 40 deletions(-)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index fa73575..ea68c7e 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -33,12 +33,11 @@
 /* write multiple hardware registers */
 static int rtl2830_wr(struct i2c_client *client, u8 reg, const u8 *val, int len)
 {
-	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
 	u8 buf[MAX_XFER_SIZE];
 	struct i2c_msg msg[1] = {
 		{
-			.addr = dev->cfg.i2c_addr,
+			.addr = client->addr,
 			.flags = 0,
 			.len = 1 + len,
 			.buf = buf,
@@ -54,7 +53,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(dev->i2c, msg, 1);
+	ret = i2c_transfer(client->adapter, msg, 1);
 	if (ret == 1) {
 		ret = 0;
 	} else {
@@ -68,23 +67,22 @@ static int rtl2830_wr(struct i2c_client *client, u8 reg, const u8 *val, int len)
 /* read multiple hardware registers */
 static int rtl2830_rd(struct i2c_client *client, u8 reg, u8 *val, int len)
 {
-	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
 	struct i2c_msg msg[2] = {
 		{
-			.addr = dev->cfg.i2c_addr,
+			.addr = client->addr,
 			.flags = 0,
 			.len = 1,
 			.buf = &reg,
 		}, {
-			.addr = dev->cfg.i2c_addr,
+			.addr = client->addr,
 			.flags = I2C_M_RD,
 			.len = len,
 			.buf = val,
 		}
 	};
 
-	ret = i2c_transfer(dev->i2c, msg, 2);
+	ret = i2c_transfer(client->adapter, msg, 2);
 	if (ret == 2) {
 		ret = 0;
 	} else {
@@ -207,10 +205,10 @@ static int rtl2830_init(struct dvb_frontend *fe)
 		{ 0x2f1, 0x20, 0xf8 },
 		{ 0x16d, 0x00, 0x01 },
 		{ 0x1a6, 0x00, 0x80 },
-		{ 0x106, dev->cfg.vtop, 0x3f },
-		{ 0x107, dev->cfg.krf, 0x3f },
+		{ 0x106, dev->pdata->vtop, 0x3f },
+		{ 0x107, dev->pdata->krf, 0x3f },
 		{ 0x112, 0x28, 0xff },
-		{ 0x103, dev->cfg.agc_targ_val, 0xff },
+		{ 0x103, dev->pdata->agc_targ_val, 0xff },
 		{ 0x00a, 0x02, 0x07 },
 		{ 0x140, 0x0c, 0x3c },
 		{ 0x140, 0x40, 0xc0 },
@@ -218,7 +216,7 @@ static int rtl2830_init(struct dvb_frontend *fe)
 		{ 0x15b, 0x28, 0x38 },
 		{ 0x15c, 0x05, 0x07 },
 		{ 0x15c, 0x28, 0x38 },
-		{ 0x115, dev->cfg.spec_inv, 0x01 },
+		{ 0x115, dev->pdata->spec_inv, 0x01 },
 		{ 0x16f, 0x01, 0x07 },
 		{ 0x170, 0x18, 0x38 },
 		{ 0x172, 0x0f, 0x0f },
@@ -349,9 +347,9 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 	if (ret < 0)
 		goto err;
 
-	num = if_frequency % dev->cfg.xtal;
+	num = if_frequency % dev->pdata->clk;
 	num *= 0x400000;
-	num = div_u64(num, dev->cfg.xtal);
+	num = div_u64(num, dev->pdata->clk);
 	num = -num;
 	if_ctl = num & 0x3fffff;
 	dev_dbg(&client->dev, "if_frequency=%d if_ctl=%08x\n",
@@ -506,7 +504,7 @@ err:
 static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status)
 {
 	struct i2c_client *client = fe->demodulator_priv;
-	struct rtl2830_dev *dev = fe->demodulator_priv;
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
 	u8 tmp;
 	*status = 0;
@@ -688,7 +686,7 @@ static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	struct i2c_msg select_reg_page_msg[1] = {
 		{
-			.addr = dev->cfg.i2c_addr,
+			.addr = client->addr,
 			.flags = 0,
 			.len = 2,
 			.buf = "\x00\x01",
@@ -696,7 +694,7 @@ static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
 	};
 	struct i2c_msg gate_open_msg[1] = {
 		{
-			.addr = dev->cfg.i2c_addr,
+			.addr = client->addr,
 			.flags = 0,
 			.len = 2,
 			.buf = "\x01\x08",
@@ -705,7 +703,7 @@ static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
 	int ret;
 
 	/* select register page */
-	ret = __i2c_transfer(adap, select_reg_page_msg, 1);
+	ret = __i2c_transfer(client->adapter, select_reg_page_msg, 1);
 	if (ret != 1) {
 		dev_warn(&client->dev, "i2c write failed %d\n", ret);
 		if (ret >= 0)
@@ -716,7 +714,7 @@ static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
 	dev->page = 1;
 
 	/* open tuner I2C repeater for 1 xfer, closes automatically */
-	ret = __i2c_transfer(adap, gate_open_msg, 1);
+	ret = __i2c_transfer(client->adapter, gate_open_msg, 1);
 	if (ret != 1) {
 		dev_warn(&client->dev, "i2c write failed %d\n", ret);
 		if (ret >= 0)
@@ -753,7 +751,6 @@ 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_dev *dev;
 	int ret;
 	u8 u8tmp;
@@ -774,14 +771,8 @@ static int rtl2830_probe(struct i2c_client *client,
 
 	/* setup the state */
 	i2c_set_clientdata(client, dev);
-	dev->i2c = i2c;
+	dev->pdata = client->dev.platform_data;
 	dev->sleeping = true;
-	dev->cfg.i2c_addr = client->addr;
-	dev->cfg.xtal = pdata->clk;
-	dev->cfg.spec_inv = pdata->spec_inv;
-	dev->cfg.vtop = pdata->vtop;
-	dev->cfg.krf = pdata->krf;
-	dev->cfg.agc_targ_val = pdata->agc_targ_val;
 
 	/* check if the demod is there */
 	ret = rtl2830_rd_reg(client, 0x000, &u8tmp);
diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
index 9e7bd42..5276fb2 100644
--- a/drivers/media/dvb-frontends/rtl2830_priv.h
+++ b/drivers/media/dvb-frontends/rtl2830_priv.h
@@ -26,24 +26,11 @@
 #include "rtl2830.h"
 #include <linux/i2c-mux.h>
 
-struct rtl2830_config {
-	u8 i2c_addr;
-	u32 xtal;
-	bool spec_inv;
-	u8 vtop;
-	u8 krf;
-	u8 agc_targ_val;
-};
-
 struct rtl2830_dev {
+	struct rtl2830_platform_data *pdata;
 	struct i2c_adapter *adapter;
-	struct i2c_adapter *i2c;
 	struct dvb_frontend fe;
-	struct rtl2830_config cfg;
-	struct i2c_adapter tuner_i2c_adapter;
-
 	bool sleeping;
-
 	u8 page; /* active register page */
 };
 
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 08/18] rtl2830: style related changes
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (5 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 07/18] rtl2830: get rid of internal config data Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 09/18] rtl2830: implement DVBv5 CNR statistic Antti Palosaari
                   ` (9 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Trivial changes proposed by checkpatch.pl and some more.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c      | 125 ++++++++++++++---------------
 drivers/media/dvb-frontends/rtl2830.h      |   4 -
 drivers/media/dvb-frontends/rtl2830_priv.h |   3 -
 3 files changed, 60 insertions(+), 72 deletions(-)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index ea68c7e..8025b19 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -13,16 +13,6 @@
  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *    GNU General Public License for more details.
  *
- *    You should have received a copy of the GNU General Public License along
- *    with this program; if not, write to the Free Software Foundation, Inc.,
- *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-/*
- * Driver implements own I2C-adapter for tuner I2C access. That's since chip
- * have unusual I2C-gate control which closes gate automatically after each
- * I2C transfer. Using own I2C adapter we can workaround that.
  */
 
 #include "rtl2830_priv.h"
@@ -46,7 +36,7 @@ static int rtl2830_wr(struct i2c_client *client, u8 reg, const u8 *val, int len)
 
 	if (1 + len > sizeof(buf)) {
 		dev_warn(&client->dev, "i2c wr reg=%04x: len=%d is too big!\n",
-				reg, len);
+			 reg, len);
 		return -EINVAL;
 	}
 
@@ -58,9 +48,10 @@ static int rtl2830_wr(struct i2c_client *client, u8 reg, const u8 *val, int len)
 		ret = 0;
 	} else {
 		dev_warn(&client->dev, "i2c wr failed=%d reg=%02x len=%d\n",
-				ret, reg, len);
+			 ret, reg, len);
 		ret = -EREMOTEIO;
 	}
+
 	return ret;
 }
 
@@ -87,9 +78,10 @@ static int rtl2830_rd(struct i2c_client *client, u8 reg, u8 *val, int len)
 		ret = 0;
 	} else {
 		dev_warn(&client->dev, "i2c rd failed=%d reg=%02x len=%d\n",
-				ret, reg, len);
+			 ret, reg, len);
 		ret = -EREMOTEIO;
 	}
+
 	return ret;
 }
 
@@ -187,47 +179,47 @@ static int rtl2830_init(struct dvb_frontend *fe)
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret, i;
 	struct rtl2830_reg_val_mask tab[] = {
-		{ 0x00d, 0x01, 0x03 },
-		{ 0x00d, 0x10, 0x10 },
-		{ 0x104, 0x00, 0x1e },
-		{ 0x105, 0x80, 0x80 },
-		{ 0x110, 0x02, 0x03 },
-		{ 0x110, 0x08, 0x0c },
-		{ 0x17b, 0x00, 0x40 },
-		{ 0x17d, 0x05, 0x0f },
-		{ 0x17d, 0x50, 0xf0 },
-		{ 0x18c, 0x08, 0x0f },
-		{ 0x18d, 0x00, 0xc0 },
-		{ 0x188, 0x05, 0x0f },
-		{ 0x189, 0x00, 0xfc },
-		{ 0x2d5, 0x02, 0x02 },
-		{ 0x2f1, 0x02, 0x06 },
-		{ 0x2f1, 0x20, 0xf8 },
-		{ 0x16d, 0x00, 0x01 },
-		{ 0x1a6, 0x00, 0x80 },
-		{ 0x106, dev->pdata->vtop, 0x3f },
-		{ 0x107, dev->pdata->krf, 0x3f },
-		{ 0x112, 0x28, 0xff },
-		{ 0x103, dev->pdata->agc_targ_val, 0xff },
-		{ 0x00a, 0x02, 0x07 },
-		{ 0x140, 0x0c, 0x3c },
-		{ 0x140, 0x40, 0xc0 },
-		{ 0x15b, 0x05, 0x07 },
-		{ 0x15b, 0x28, 0x38 },
-		{ 0x15c, 0x05, 0x07 },
-		{ 0x15c, 0x28, 0x38 },
-		{ 0x115, dev->pdata->spec_inv, 0x01 },
-		{ 0x16f, 0x01, 0x07 },
-		{ 0x170, 0x18, 0x38 },
-		{ 0x172, 0x0f, 0x0f },
-		{ 0x173, 0x08, 0x38 },
-		{ 0x175, 0x01, 0x07 },
-		{ 0x176, 0x00, 0xc0 },
+		{0x00d, 0x01, 0x03},
+		{0x00d, 0x10, 0x10},
+		{0x104, 0x00, 0x1e},
+		{0x105, 0x80, 0x80},
+		{0x110, 0x02, 0x03},
+		{0x110, 0x08, 0x0c},
+		{0x17b, 0x00, 0x40},
+		{0x17d, 0x05, 0x0f},
+		{0x17d, 0x50, 0xf0},
+		{0x18c, 0x08, 0x0f},
+		{0x18d, 0x00, 0xc0},
+		{0x188, 0x05, 0x0f},
+		{0x189, 0x00, 0xfc},
+		{0x2d5, 0x02, 0x02},
+		{0x2f1, 0x02, 0x06},
+		{0x2f1, 0x20, 0xf8},
+		{0x16d, 0x00, 0x01},
+		{0x1a6, 0x00, 0x80},
+		{0x106, dev->pdata->vtop, 0x3f},
+		{0x107, dev->pdata->krf, 0x3f},
+		{0x112, 0x28, 0xff},
+		{0x103, dev->pdata->agc_targ_val, 0xff},
+		{0x00a, 0x02, 0x07},
+		{0x140, 0x0c, 0x3c},
+		{0x140, 0x40, 0xc0},
+		{0x15b, 0x05, 0x07},
+		{0x15b, 0x28, 0x38},
+		{0x15c, 0x05, 0x07},
+		{0x15c, 0x28, 0x38},
+		{0x115, dev->pdata->spec_inv, 0x01},
+		{0x16f, 0x01, 0x07},
+		{0x170, 0x18, 0x38},
+		{0x172, 0x0f, 0x0f},
+		{0x173, 0x08, 0x38},
+		{0x175, 0x01, 0x07},
+		{0x176, 0x00, 0xc0},
 	};
 
 	for (i = 0; i < ARRAY_SIZE(tab); i++) {
 		ret = rtl2830_wr_reg_mask(client, tab[i].reg, tab[i].val,
-			tab[i].mask);
+					  tab[i].mask);
 		if (ret)
 			goto err;
 	}
@@ -237,7 +229,7 @@ static int rtl2830_init(struct dvb_frontend *fe)
 		goto err;
 
 	ret = rtl2830_wr_regs(client, 0x195,
-		"\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
+			      "\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
 	if (ret)
 		goto err;
 
@@ -264,12 +256,14 @@ static int rtl2830_sleep(struct dvb_frontend *fe)
 {
 	struct i2c_client *client = fe->demodulator_priv;
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
+
 	dev->sleeping = true;
+
 	return 0;
 }
 
 static int rtl2830_get_tune_settings(struct dvb_frontend *fe,
-	struct dvb_frontend_tune_settings *s)
+				     struct dvb_frontend_tune_settings *s)
 {
 	s->min_delay_ms = 500;
 	s->step_size = fe->ops.info.frequency_stepsize * 2;
@@ -312,7 +306,7 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 	};
 
 	dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
-			c->frequency, c->bandwidth_hz, c->inversion);
+		c->frequency, c->bandwidth_hz, c->inversion);
 
 	/* program tuner */
 	if (fe->ops.tuner_ops.set_params)
@@ -330,7 +324,7 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 		break;
 	default:
 		dev_err(&client->dev, "invalid bandwidth_hz %u\n",
-				c->bandwidth_hz);
+			c->bandwidth_hz);
 		return -EINVAL;
 	}
 
@@ -343,8 +337,7 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 		ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_frequency);
 	else
 		ret = -EINVAL;
-
-	if (ret < 0)
+	if (ret)
 		goto err;
 
 	num = if_frequency % dev->pdata->clk;
@@ -353,7 +346,7 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 	num = -num;
 	if_ctl = num & 0x3fffff;
 	dev_dbg(&client->dev, "if_frequency=%d if_ctl=%08x\n",
-			if_frequency, if_ctl);
+		if_frequency, if_ctl);
 
 	ret = rtl2830_rd_reg_mask(client, 0x119, &tmp, 0xc0); /* b[7:6] */
 	if (ret)
@@ -507,6 +500,7 @@ static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status)
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
 	u8 tmp;
+
 	*status = 0;
 
 	if (dev->sleeping)
@@ -540,9 +534,9 @@ static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
 #define CONSTELLATION_NUM 3
 #define HIERARCHY_NUM 4
 	static const u32 snr_constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
-		{ 70705899, 70705899, 70705899, 70705899 },
-		{ 82433173, 82433173, 87483115, 94445660 },
-		{ 92888734, 92888734, 95487525, 99770748 },
+		{70705899, 70705899, 70705899, 70705899},
+		{82433173, 82433173, 87483115, 94445660},
+		{92888734, 92888734, 95487525, 99770748},
 	};
 
 	if (dev->sleeping)
@@ -605,6 +599,7 @@ err:
 static int rtl2830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
 {
 	*ucblocks = 0;
+
 	return 0;
 }
 
@@ -630,7 +625,7 @@ static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 	else
 		if_agc = if_agc_raw;
 
-	*strength = (u8) (55 - if_agc / 182);
+	*strength = (u8)(55 - if_agc / 182);
 	*strength |= *strength << 8;
 
 	return 0;
@@ -640,7 +635,7 @@ err:
 }
 
 static struct dvb_frontend_ops rtl2830_ops = {
-	.delsys = { SYS_DVBT },
+	.delsys = {SYS_DVBT},
 	.info = {
 		.name = "Realtek RTL2830 (DVB-T)",
 		.caps = FE_CAN_FEC_1_2 |
@@ -723,7 +718,6 @@ static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
 	}
 
 	return 0;
-
 err:
 	dev_dbg(&client->dev, "failed=%d\n", ret);
 	return ret;
@@ -748,7 +742,7 @@ static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
 }
 
 static int rtl2830_probe(struct i2c_client *client,
-		const struct i2c_device_id *id)
+			 const struct i2c_device_id *id)
 {
 	struct rtl2830_platform_data *pdata = client->dev.platform_data;
 	struct rtl2830_dev *dev;
@@ -796,8 +790,8 @@ static int rtl2830_probe(struct i2c_client *client,
 	pdata->get_i2c_adapter = rtl2830_get_i2c_adapter;
 
 	dev_info(&client->dev, "Realtek RTL2830 successfully attached\n");
-	return 0;
 
+	return 0;
 err_kfree:
 	kfree(dev);
 err:
@@ -813,6 +807,7 @@ static int rtl2830_remove(struct i2c_client *client)
 
 	i2c_del_mux_adapter(dev->adapter);
 	kfree(dev);
+
 	return 0;
 }
 
diff --git a/drivers/media/dvb-frontends/rtl2830.h b/drivers/media/dvb-frontends/rtl2830.h
index 1d7784d..61f784c 100644
--- a/drivers/media/dvb-frontends/rtl2830.h
+++ b/drivers/media/dvb-frontends/rtl2830.h
@@ -13,15 +13,11 @@
  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *    GNU General Public License for more details.
  *
- *    You should have received a copy of the GNU General Public License along
- *    with this program; if not, write to the Free Software Foundation, Inc.,
- *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #ifndef RTL2830_H
 #define RTL2830_H
 
-#include <linux/kconfig.h>
 #include <linux/dvb/frontend.h>
 
 struct rtl2830_platform_data {
diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
index 5276fb2..5f9973a 100644
--- a/drivers/media/dvb-frontends/rtl2830_priv.h
+++ b/drivers/media/dvb-frontends/rtl2830_priv.h
@@ -13,9 +13,6 @@
  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *    GNU General Public License for more details.
  *
- *    You should have received a copy of the GNU General Public License along
- *    with this program; if not, write to the Free Software Foundation, Inc.,
- *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #ifndef RTL2830_PRIV_H
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 09/18] rtl2830: implement DVBv5 CNR statistic
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (6 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 08/18] rtl2830: style related changes Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 10/18] rtl2830: implement DVBv5 signal strength statistics Antti Palosaari
                   ` (8 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

DVBv5 CNR.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c      | 74 ++++++++++++++++++++++++++++++
 drivers/media/dvb-frontends/rtl2830_priv.h |  3 ++
 2 files changed, 77 insertions(+)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index 8025b19..c484634 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -177,6 +177,7 @@ static int rtl2830_init(struct dvb_frontend *fe)
 {
 	struct i2c_client *client = fe->demodulator_priv;
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
+	struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
 	int ret, i;
 	struct rtl2830_reg_val_mask tab[] = {
 		{0x00d, 0x01, 0x03},
@@ -244,6 +245,12 @@ static int rtl2830_init(struct dvb_frontend *fe)
 	if (ret)
 		goto err;
 
+	/* init stats here in order signal app which stats are supported */
+	c->cnr.len = 1;
+	c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+	/* start statistics polling */
+	schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
+
 	dev->sleeping = false;
 
 	return ret;
@@ -258,6 +265,9 @@ static int rtl2830_sleep(struct dvb_frontend *fe)
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 
 	dev->sleeping = true;
+	/* stop statistics polling */
+	cancel_delayed_work_sync(&dev->stat_work);
+	dev->fe_status = 0;
 
 	return 0;
 }
@@ -518,6 +528,8 @@ static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status)
 			FE_HAS_VITERBI;
 	}
 
+	dev->fe_status = *status;
+
 	return ret;
 err:
 	dev_dbg(&client->dev, "failed=%d\n", ret);
@@ -670,6 +682,66 @@ static struct dvb_frontend_ops rtl2830_ops = {
 	.read_signal_strength = rtl2830_read_signal_strength,
 };
 
+static void rtl2830_stat_work(struct work_struct *work)
+{
+	struct rtl2830_dev *dev = container_of(work, struct rtl2830_dev, stat_work.work);
+	struct i2c_client *client = dev->client;
+	struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
+	int ret, tmp;
+	u8 u8tmp, buf[2];
+	u16 u16tmp;
+
+	dev_dbg(&client->dev, "\n");
+
+	/* CNR */
+	if (dev->fe_status & FE_HAS_VITERBI) {
+		unsigned hierarchy, constellation;
+		#define CONSTELLATION_NUM 3
+		#define HIERARCHY_NUM 4
+		static const u32 constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
+			{70705899, 70705899, 70705899, 70705899},
+			{82433173, 82433173, 87483115, 94445660},
+			{92888734, 92888734, 95487525, 99770748},
+		};
+
+		ret = rtl2830_rd_reg(client, 0x33c, &u8tmp);
+		if (ret)
+			goto err;
+
+		constellation = (u8tmp >> 2) & 0x03; /* [3:2] */
+		if (constellation > CONSTELLATION_NUM - 1)
+			goto err_schedule_delayed_work;
+
+		hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */
+		if (hierarchy > HIERARCHY_NUM - 1)
+			goto err_schedule_delayed_work;
+
+		ret = rtl2830_rd_regs(client, 0x40c, buf, 2);
+		if (ret)
+			goto err;
+
+		u16tmp = buf[0] << 8 | buf[1] << 0;
+		if (u16tmp)
+			tmp = (constant[constellation][hierarchy] -
+			       intlog10(u16tmp)) / ((1 << 24) / 10000);
+		else
+			tmp = 0;
+
+		dev_dbg(&client->dev, "CNR raw=%u\n", u16tmp);
+
+		c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
+		c->cnr.stat[0].svalue = tmp;
+	} else {
+		c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+	}
+
+err_schedule_delayed_work:
+	schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
+	return;
+err:
+	dev_dbg(&client->dev, "failed=%d\n", ret);
+}
+
 /*
  * I2C gate/repeater logic
  * We must use unlocked i2c_transfer() here because I2C lock is already taken
@@ -765,8 +837,10 @@ static int rtl2830_probe(struct i2c_client *client,
 
 	/* setup the state */
 	i2c_set_clientdata(client, dev);
+	dev->client = client;
 	dev->pdata = client->dev.platform_data;
 	dev->sleeping = true;
+	INIT_DELAYED_WORK(&dev->stat_work, rtl2830_stat_work);
 
 	/* check if the demod is there */
 	ret = rtl2830_rd_reg(client, 0x000, &u8tmp);
diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
index 5f9973a..7cf316d 100644
--- a/drivers/media/dvb-frontends/rtl2830_priv.h
+++ b/drivers/media/dvb-frontends/rtl2830_priv.h
@@ -25,10 +25,13 @@
 
 struct rtl2830_dev {
 	struct rtl2830_platform_data *pdata;
+	struct i2c_client *client;
 	struct i2c_adapter *adapter;
 	struct dvb_frontend fe;
 	bool sleeping;
 	u8 page; /* active register page */
+	struct delayed_work stat_work;
+	fe_status_t fe_status;
 };
 
 struct rtl2830_reg_val_mask {
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 10/18] rtl2830: implement DVBv5 signal strength statistics
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (7 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 09/18] rtl2830: implement DVBv5 CNR statistic Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 11/18] rtl2830: implement DVBv5 BER statistic Antti Palosaari
                   ` (7 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Estimate signal strength from IF AGC.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index c484634..641047b 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -246,6 +246,8 @@ static int rtl2830_init(struct dvb_frontend *fe)
 		goto err;
 
 	/* init stats here in order signal app which stats are supported */
+	c->strength.len = 1;
+	c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 	c->cnr.len = 1;
 	c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 	/* start statistics polling */
@@ -693,6 +695,28 @@ static void rtl2830_stat_work(struct work_struct *work)
 
 	dev_dbg(&client->dev, "\n");
 
+	/* signal strength */
+	if (dev->fe_status & FE_HAS_SIGNAL) {
+		struct {signed int x:14; } s;
+
+		/* read IF AGC */
+		ret = rtl2830_rd_regs(client, 0x359, buf, 2);
+		if (ret)
+			goto err;
+
+		u16tmp = buf[0] << 8 | buf[1] << 0;
+		u16tmp &= 0x3fff; /* [13:0] */
+		tmp = s.x = u16tmp; /* 14-bit bin to 2 complement */
+		u16tmp = clamp_val(-4 * tmp + 32767, 0x0000, 0xffff);
+
+		dev_dbg(&client->dev, "IF AGC=%d\n", tmp);
+
+		c->strength.stat[0].scale = FE_SCALE_RELATIVE;
+		c->strength.stat[0].uvalue = u16tmp;
+	} else {
+		c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+	}
+
 	/* CNR */
 	if (dev->fe_status & FE_HAS_VITERBI) {
 		unsigned hierarchy, constellation;
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 11/18] rtl2830: implement DVBv5 BER statistic
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (8 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 10/18] rtl2830: implement DVBv5 signal strength statistics Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 12/18] rtl2830: wrap DVBv5 signal strength to DVBv3 Antti Palosaari
                   ` (6 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

DVBv5 BER.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c      | 25 +++++++++++++++++++++++++
 drivers/media/dvb-frontends/rtl2830_priv.h |  2 ++
 2 files changed, 27 insertions(+)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index 641047b..147b3a6 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -250,6 +250,10 @@ static int rtl2830_init(struct dvb_frontend *fe)
 	c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 	c->cnr.len = 1;
 	c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+	c->post_bit_error.len = 1;
+	c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+	c->post_bit_count.len = 1;
+	c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 	/* start statistics polling */
 	schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
 
@@ -759,6 +763,27 @@ static void rtl2830_stat_work(struct work_struct *work)
 		c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 	}
 
+	/* BER */
+	if (dev->fe_status & FE_HAS_LOCK) {
+		ret = rtl2830_rd_regs(client, 0x34e, buf, 2);
+		if (ret)
+			goto err;
+
+		u16tmp = buf[0] << 8 | buf[1] << 0;
+		dev->post_bit_error += u16tmp;
+		dev->post_bit_count += 1000000;
+
+		dev_dbg(&client->dev, "BER errors=%u total=1000000\n", u16tmp);
+
+		c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
+		c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
+		c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
+		c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
+	} else {
+		c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+		c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+	}
+
 err_schedule_delayed_work:
 	schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
 	return;
diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
index 7cf316d..cdcaacf 100644
--- a/drivers/media/dvb-frontends/rtl2830_priv.h
+++ b/drivers/media/dvb-frontends/rtl2830_priv.h
@@ -32,6 +32,8 @@ struct rtl2830_dev {
 	u8 page; /* active register page */
 	struct delayed_work stat_work;
 	fe_status_t fe_status;
+	u64 post_bit_error;
+	u64 post_bit_count;
 };
 
 struct rtl2830_reg_val_mask {
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 12/18] rtl2830: wrap DVBv5 signal strength to DVBv3
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (9 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 11/18] rtl2830: implement DVBv5 BER statistic Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 13/18] rtl2830: wrap DVBv5 BER " Antti Palosaari
                   ` (5 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Change legacy DVBv3 signal strength to return values calculated by
DVBv5 statistics.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c | 27 ++++-----------------------
 1 file changed, 4 insertions(+), 23 deletions(-)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index 147b3a6..a02ccdf 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -623,33 +623,14 @@ static int rtl2830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
 
 static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 {
-	struct i2c_client *client = fe->demodulator_priv;
-	struct rtl2830_dev *dev = i2c_get_clientdata(client);
-	int ret;
-	u8 buf[2];
-	u16 if_agc_raw, if_agc;
-
-	if (dev->sleeping)
-		return 0;
-
-	ret = rtl2830_rd_regs(client, 0x359, buf, 2);
-	if (ret)
-		goto err;
-
-	if_agc_raw = (buf[0] << 8 | buf[1]) & 0x3fff;
+	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 
-	if (if_agc_raw & (1 << 9))
-		if_agc = -(~(if_agc_raw - 1) & 0x1ff);
+	if (c->strength.stat[0].scale == FE_SCALE_RELATIVE)
+		*strength = c->strength.stat[0].uvalue;
 	else
-		if_agc = if_agc_raw;
-
-	*strength = (u8)(55 - if_agc / 182);
-	*strength |= *strength << 8;
+		*strength = 0;
 
 	return 0;
-err:
-	dev_dbg(&client->dev, "failed=%d\n", ret);
-	return ret;
 }
 
 static struct dvb_frontend_ops rtl2830_ops = {
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 13/18] rtl2830: wrap DVBv5 BER to DVBv3
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (10 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 12/18] rtl2830: wrap DVBv5 signal strength to DVBv3 Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 14/18] rtl2830: wrap DVBv5 CNR to DVBv3 SNR Antti Palosaari
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Change legacy DVBv3 read BER to return values calculated by DVBv5
statistics.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c      | 15 ++-------------
 drivers/media/dvb-frontends/rtl2830_priv.h |  1 +
 2 files changed, 3 insertions(+), 13 deletions(-)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index a02ccdf..0112b3f 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -596,22 +596,11 @@ static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
 {
 	struct i2c_client *client = fe->demodulator_priv;
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
-	int ret;
-	u8 buf[2];
-
-	if (dev->sleeping)
-		return 0;
-
-	ret = rtl2830_rd_regs(client, 0x34e, buf, 2);
-	if (ret)
-		goto err;
 
-	*ber = buf[0] << 8 | buf[1];
+	*ber = (dev->post_bit_error - dev->post_bit_error_prev);
+	dev->post_bit_error_prev = dev->post_bit_error;
 
 	return 0;
-err:
-	dev_dbg(&client->dev, "failed=%d\n", ret);
-	return ret;
 }
 
 static int rtl2830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
index cdcaacf..6636834 100644
--- a/drivers/media/dvb-frontends/rtl2830_priv.h
+++ b/drivers/media/dvb-frontends/rtl2830_priv.h
@@ -32,6 +32,7 @@ struct rtl2830_dev {
 	u8 page; /* active register page */
 	struct delayed_work stat_work;
 	fe_status_t fe_status;
+	u64 post_bit_error_prev; /* for old DVBv3 read_ber() calculation */
 	u64 post_bit_error;
 	u64 post_bit_count;
 };
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 14/18] rtl2830: wrap DVBv5 CNR to DVBv3 SNR
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (11 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 13/18] rtl2830: wrap DVBv5 BER " Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 15/18] rtl2830: implement PID filter Antti Palosaari
                   ` (3 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Change legacy DVBv3 read SNR to return values calculated by DVBv5
statistics.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c      | 44 ++----------------------------
 drivers/media/dvb-frontends/rtl2830_priv.h |  1 +
 2 files changed, 4 insertions(+), 41 deletions(-)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index 0112b3f..f1f1cfb 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -544,52 +544,14 @@ err:
 
 static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
 {
-	struct i2c_client *client = fe->demodulator_priv;
-	struct rtl2830_dev *dev = i2c_get_clientdata(client);
-	int ret, hierarchy, constellation;
-	u8 buf[2], tmp;
-	u16 tmp16;
-#define CONSTELLATION_NUM 3
-#define HIERARCHY_NUM 4
-	static const u32 snr_constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
-		{70705899, 70705899, 70705899, 70705899},
-		{82433173, 82433173, 87483115, 94445660},
-		{92888734, 92888734, 95487525, 99770748},
-	};
-
-	if (dev->sleeping)
-		return 0;
-
-	/* reports SNR in resolution of 0.1 dB */
-
-	ret = rtl2830_rd_reg(client, 0x33c, &tmp);
-	if (ret)
-		goto err;
-
-	constellation = (tmp >> 2) & 0x03; /* [3:2] */
-	if (constellation > CONSTELLATION_NUM - 1)
-		goto err;
-
-	hierarchy = (tmp >> 4) & 0x07; /* [6:4] */
-	if (hierarchy > HIERARCHY_NUM - 1)
-		goto err;
-
-	ret = rtl2830_rd_regs(client, 0x40c, buf, 2);
-	if (ret)
-		goto err;
-
-	tmp16 = buf[0] << 8 | buf[1];
+	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 
-	if (tmp16)
-		*snr = (snr_constant[constellation][hierarchy] -
-				intlog10(tmp16)) / ((1 << 24) / 100);
+	if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
+		*snr = div_s64(c->cnr.stat[0].svalue, 100);
 	else
 		*snr = 0;
 
 	return 0;
-err:
-	dev_dbg(&client->dev, "failed=%d\n", ret);
-	return ret;
 }
 
 static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
index 6636834..6a0e982 100644
--- a/drivers/media/dvb-frontends/rtl2830_priv.h
+++ b/drivers/media/dvb-frontends/rtl2830_priv.h
@@ -22,6 +22,7 @@
 #include "dvb_math.h"
 #include "rtl2830.h"
 #include <linux/i2c-mux.h>
+#include <linux/math64.h>
 
 struct rtl2830_dev {
 	struct rtl2830_platform_data *pdata;
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 15/18] rtl2830: implement PID filter
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (12 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 14/18] rtl2830: wrap DVBv5 CNR to DVBv3 SNR Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 16/18] rtl28xxu: add support for RTL2831U/RTL2830 " Antti Palosaari
                   ` (2 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Implement PID filter.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/rtl2830.c      | 67 ++++++++++++++++++++++++++++++
 drivers/media/dvb-frontends/rtl2830.h      |  2 +
 drivers/media/dvb-frontends/rtl2830_priv.h |  1 +
 3 files changed, 70 insertions(+)

diff --git a/drivers/media/dvb-frontends/rtl2830.c b/drivers/media/dvb-frontends/rtl2830.c
index f1f1cfb..8abaca6 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -723,6 +723,71 @@ err:
 	dev_dbg(&client->dev, "failed=%d\n", ret);
 }
 
+static int rtl2830_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
+{
+	struct i2c_client *client = fe->demodulator_priv;
+	int ret;
+	u8 u8tmp;
+
+	dev_dbg(&client->dev, "onoff=%d\n", onoff);
+
+	/* enable / disable PID filter */
+	if (onoff)
+		u8tmp = 0x80;
+	else
+		u8tmp = 0x00;
+
+	ret = rtl2830_wr_reg_mask(client, 0x061, u8tmp, 0x80);
+	if (ret)
+		goto err;
+
+	return 0;
+err:
+	dev_dbg(&client->dev, "failed=%d\n", ret);
+	return ret;
+}
+
+static int rtl2830_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid, int onoff)
+{
+	struct i2c_client *client = fe->demodulator_priv;
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
+	int ret;
+	u8 buf[4];
+
+	dev_dbg(&client->dev, "index=%d pid=%04x onoff=%d\n",
+		index, pid, onoff);
+
+	/* skip invalid PIDs (0x2000) */
+	if (pid > 0x1fff || index > 32)
+		return 0;
+
+	if (onoff)
+		set_bit(index, &dev->filters);
+	else
+		clear_bit(index, &dev->filters);
+
+	/* enable / disable PIDs */
+	buf[0] = (dev->filters >>  0) & 0xff;
+	buf[1] = (dev->filters >>  8) & 0xff;
+	buf[2] = (dev->filters >> 16) & 0xff;
+	buf[3] = (dev->filters >> 24) & 0xff;
+	ret = rtl2830_wr_regs(client, 0x062, buf, 4);
+	if (ret)
+		goto err;
+
+	/* add PID */
+	buf[0] = (pid >> 8) & 0xff;
+	buf[1] = (pid >> 0) & 0xff;
+	ret = rtl2830_wr_regs(client, 0x066 + 2 * index, buf, 2);
+	if (ret)
+		goto err;
+
+	return 0;
+err:
+	dev_dbg(&client->dev, "failed=%d\n", ret);
+	return ret;
+}
+
 /*
  * I2C gate/repeater logic
  * We must use unlocked i2c_transfer() here because I2C lock is already taken
@@ -843,6 +908,8 @@ static int rtl2830_probe(struct i2c_client *client,
 	/* setup callbacks */
 	pdata->get_dvb_frontend = rtl2830_get_dvb_frontend;
 	pdata->get_i2c_adapter = rtl2830_get_i2c_adapter;
+	pdata->pid_filter = rtl2830_pid_filter;
+	pdata->pid_filter_ctrl = rtl2830_pid_filter_ctrl;
 
 	dev_info(&client->dev, "Realtek RTL2830 successfully attached\n");
 
diff --git a/drivers/media/dvb-frontends/rtl2830.h b/drivers/media/dvb-frontends/rtl2830.h
index 61f784c..156edf7 100644
--- a/drivers/media/dvb-frontends/rtl2830.h
+++ b/drivers/media/dvb-frontends/rtl2830.h
@@ -49,6 +49,8 @@ struct rtl2830_platform_data {
 	 */
 	struct dvb_frontend* (*get_dvb_frontend)(struct i2c_client *);
 	struct i2c_adapter* (*get_i2c_adapter)(struct i2c_client *);
+	int (*pid_filter)(struct dvb_frontend *, u8, u16, int);
+	int (*pid_filter_ctrl)(struct dvb_frontend *, int);
 };
 
 #endif /* RTL2830_H */
diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
index 6a0e982..2931889 100644
--- a/drivers/media/dvb-frontends/rtl2830_priv.h
+++ b/drivers/media/dvb-frontends/rtl2830_priv.h
@@ -31,6 +31,7 @@ struct rtl2830_dev {
 	struct dvb_frontend fe;
 	bool sleeping;
 	u8 page; /* active register page */
+	unsigned long filters;
 	struct delayed_work stat_work;
 	fe_status_t fe_status;
 	u64 post_bit_error_prev; /* for old DVBv3 read_ber() calculation */
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 16/18] rtl28xxu: add support for RTL2831U/RTL2830 PID filter
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (13 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 15/18] rtl2830: implement PID filter Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14 19:25   ` Benjamin Larsson
  2014-12-14  8:28 ` [PATCH 17/18] rtl2830: implement own I2C locking Antti Palosaari
  2014-12-14  8:28 ` [PATCH 18/18] rtl2830: convert to RegMap API Antti Palosaari
  16 siblings, 1 reply; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

RTL2830 demod integrated to RTL2831U has PID filter. PID filtering
is provided by rtl2830 demod driver. Add support for it.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
index 4f94e0e..747a56d 100644
--- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
+++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
@@ -1568,6 +1568,24 @@ static int rtl2832u_get_rc_config(struct dvb_usb_device *d,
 #define rtl2832u_get_rc_config NULL
 #endif
 
+static int rtl28xxu_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
+{
+	struct dvb_usb_device *d = adap_to_d(adap);
+	struct rtl28xxu_priv *priv = d_to_priv(d);
+	struct rtl2830_platform_data *pdata = &priv->rtl2830_platform_data;
+
+	return pdata->pid_filter_ctrl(adap->fe[0], onoff);
+}
+
+static int rtl28xxu_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff)
+{
+	struct dvb_usb_device *d = adap_to_d(adap);
+	struct rtl28xxu_priv *priv = d_to_priv(d);
+	struct rtl2830_platform_data *pdata = &priv->rtl2830_platform_data;
+
+	return pdata->pid_filter(adap->fe[0], index, pid, onoff);
+}
+
 static const struct dvb_usb_device_properties rtl2831u_props = {
 	.driver_name = KBUILD_MODNAME,
 	.owner = THIS_MODULE,
@@ -1586,6 +1604,13 @@ static const struct dvb_usb_device_properties rtl2831u_props = {
 	.num_adapters = 1,
 	.adapter = {
 		{
+			.caps = DVB_USB_ADAP_HAS_PID_FILTER |
+				DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
+
+			.pid_filter_count = 32,
+			.pid_filter_ctrl = rtl28xxu_pid_filter_ctrl,
+			.pid_filter = rtl28xxu_pid_filter,
+
 			.stream = DVB_USB_STREAM_BULK(0x81, 6, 8 * 512),
 		},
 	},
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 17/18] rtl2830: implement own I2C locking
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (14 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 16/18] rtl28xxu: add support for RTL2831U/RTL2830 " Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  2014-12-14  8:28 ` [PATCH 18/18] rtl2830: convert to RegMap API Antti Palosaari
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

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.

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;
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 18/18] rtl2830: convert to RegMap API
  2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
                   ` (15 preceding siblings ...)
  2014-12-14  8:28 ` [PATCH 17/18] rtl2830: implement own I2C locking Antti Palosaari
@ 2014-12-14  8:28 ` Antti Palosaari
  16 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14  8:28 UTC (permalink / raw)
  To: linux-media; +Cc: Antti Palosaari

Use RegMap to cover register access routines.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/dvb-frontends/Kconfig        |   1 +
 drivers/media/dvb-frontends/rtl2830.c      | 414 +++++++++++++----------------
 drivers/media/dvb-frontends/rtl2830_priv.h |   3 +-
 3 files changed, 182 insertions(+), 236 deletions(-)

diff --git a/drivers/media/dvb-frontends/Kconfig b/drivers/media/dvb-frontends/Kconfig
index e8827fc..0e12634 100644
--- a/drivers/media/dvb-frontends/Kconfig
+++ b/drivers/media/dvb-frontends/Kconfig
@@ -444,6 +444,7 @@ config DVB_CXD2820R
 config DVB_RTL2830
 	tristate "Realtek RTL2830 DVB-T"
 	depends on DVB_CORE && I2C && I2C_MUX
+	select REGMAP
 	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 3a9e4e9..9d69b61 100644
--- a/drivers/media/dvb-frontends/rtl2830.c
+++ b/drivers/media/dvb-frontends/rtl2830.c
@@ -17,176 +17,43 @@
 
 #include "rtl2830_priv.h"
 
-/* Max transfer size done by I2C transfer functions */
-#define MAX_XFER_SIZE  64
-
-/* write multiple hardware registers */
-static int rtl2830_wr(struct i2c_client *client, u8 reg, const u8 *val, int len)
+/* Our RegMap is bypassing I2C adapter lock, thus we do it! */
+int rtl2830_bulk_write(struct i2c_client *client, unsigned int reg,
+		       const void *val, size_t val_count)
 {
+	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
-	u8 buf[MAX_XFER_SIZE];
-	struct i2c_msg msg[1] = {
-		{
-			.addr = client->addr,
-			.flags = 0,
-			.len = 1 + len,
-			.buf = buf,
-		}
-	};
-
-	if (1 + len > sizeof(buf)) {
-		dev_warn(&client->dev, "i2c wr reg=%04x: len=%d is too big!\n",
-			 reg, len);
-		return -EINVAL;
-	}
-
-	buf[0] = reg;
-	memcpy(&buf[1], val, len);
-
-	ret = __i2c_transfer(client->adapter, msg, 1);
-	if (ret == 1) {
-		ret = 0;
-	} else {
-		dev_warn(&client->dev, "i2c wr failed=%d reg=%02x len=%d\n",
-			 ret, reg, len);
-		ret = -EREMOTEIO;
-	}
 
+	i2c_lock_adapter(client->adapter);
+	ret = regmap_bulk_write(dev->regmap, reg, val, val_count);
+	i2c_unlock_adapter(client->adapter);
 	return ret;
 }
 
-/* read multiple hardware registers */
-static int rtl2830_rd(struct i2c_client *client, u8 reg, u8 *val, int len)
-{
-	int ret;
-	struct i2c_msg msg[2] = {
-		{
-			.addr = client->addr,
-			.flags = 0,
-			.len = 1,
-			.buf = &reg,
-		}, {
-			.addr = client->addr,
-			.flags = I2C_M_RD,
-			.len = len,
-			.buf = val,
-		}
-	};
-
-	ret = __i2c_transfer(client->adapter, msg, 2);
-	if (ret == 2) {
-		ret = 0;
-	} else {
-		dev_warn(&client->dev, "i2c rd failed=%d reg=%02x len=%d\n",
-			 ret, reg, len);
-		ret = -EREMOTEIO;
-	}
-
-	return ret;
-}
-
-/* write multiple registers */
-static int rtl2830_wr_regs(struct i2c_client *client, u16 reg, const u8 *val, int len)
+int rtl2830_update_bits(struct i2c_client *client, unsigned int reg,
+			unsigned int mask, unsigned int val)
 {
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
-	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)
-			goto err_mutex_unlock;
-
-		dev->page = page;
-	}
-
-	ret = rtl2830_wr(client, reg2, val, len);
-
-err_mutex_unlock:
-	mutex_unlock(&dev->i2c_mutex);
 
+	i2c_lock_adapter(client->adapter);
+	ret = regmap_update_bits(dev->regmap, reg, mask, val);
+	i2c_unlock_adapter(client->adapter);
 	return ret;
 }
 
-/* read multiple registers */
-static int rtl2830_rd_regs(struct i2c_client *client, u16 reg, u8 *val, int len)
+int rtl2830_bulk_read(struct i2c_client *client, unsigned int reg, void *val,
+		      size_t val_count)
 {
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
-	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)
-			goto err_mutex_unlock;
-
-		dev->page = page;
-	}
-
-	ret = rtl2830_rd(client, reg2, val, len);
-
-err_mutex_unlock:
-	mutex_unlock(&dev->i2c_mutex);
 
+	i2c_lock_adapter(client->adapter);
+	ret = regmap_bulk_read(dev->regmap, reg, val, val_count);
+	i2c_unlock_adapter(client->adapter);
 	return ret;
 }
 
-/* read single register */
-static int rtl2830_rd_reg(struct i2c_client *client, u16 reg, u8 *val)
-{
-	return rtl2830_rd_regs(client, reg, val, 1);
-}
-
-/* write single register with mask */
-static int rtl2830_wr_reg_mask(struct i2c_client *client, u16 reg, u8 val, u8 mask)
-{
-	int ret;
-	u8 tmp;
-
-	/* no need for read if whole reg is written */
-	if (mask != 0xff) {
-		ret = rtl2830_rd_regs(client, reg, &tmp, 1);
-		if (ret)
-			return ret;
-
-		val &= mask;
-		tmp &= ~mask;
-		val |= tmp;
-	}
-
-	return rtl2830_wr_regs(client, reg, &val, 1);
-}
-
-/* read single register with mask */
-static int rtl2830_rd_reg_mask(struct i2c_client *client, u16 reg, u8 *val, u8 mask)
-{
-	int ret, i;
-	u8 tmp;
-
-	ret = rtl2830_rd_regs(client, reg, &tmp, 1);
-	if (ret)
-		return ret;
-
-	tmp &= mask;
-
-	/* find position of the first bit */
-	for (i = 0; i < 8; i++) {
-		if ((mask >> i) & 0x01)
-			break;
-	}
-	*val = tmp >> i;
-
-	return 0;
-}
-
 static int rtl2830_init(struct dvb_frontend *fe)
 {
 	struct i2c_client *client = fe->demodulator_priv;
@@ -233,29 +100,29 @@ static int rtl2830_init(struct dvb_frontend *fe)
 	};
 
 	for (i = 0; i < ARRAY_SIZE(tab); i++) {
-		ret = rtl2830_wr_reg_mask(client, tab[i].reg, tab[i].val,
-					  tab[i].mask);
+		ret = rtl2830_update_bits(client, tab[i].reg, tab[i].mask,
+					  tab[i].val);
 		if (ret)
 			goto err;
 	}
 
-	ret = rtl2830_wr_regs(client, 0x18f, "\x28\x00", 2);
+	ret = rtl2830_bulk_write(client, 0x18f, "\x28\x00", 2);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_wr_regs(client, 0x195,
-			      "\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
+	ret = rtl2830_bulk_write(client, 0x195,
+				 "\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
 	if (ret)
 		goto err;
 
 	/* TODO: spec init */
 
 	/* soft reset */
-	ret = rtl2830_wr_reg_mask(client, 0x101, 0x04, 0x04);
+	ret = rtl2830_update_bits(client, 0x101, 0x04, 0x04);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_wr_reg_mask(client, 0x101, 0x00, 0x04);
+	ret = rtl2830_update_bits(client, 0x101, 0x04, 0x00);
 	if (ret)
 		goto err;
 
@@ -309,7 +176,7 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 	int ret, i;
 	u64 num;
-	u8 buf[3], tmp;
+	u8 buf[3], u8tmp;
 	u32 if_ctl, if_frequency;
 	static const u8 bw_params1[3][34] = {
 		{
@@ -358,7 +225,7 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 		return -EINVAL;
 	}
 
-	ret = rtl2830_wr_reg_mask(client, 0x008, i << 1, 0x06);
+	ret = rtl2830_update_bits(client, 0x008, 0x06, i << 1);
 	if (ret)
 		goto err;
 
@@ -378,30 +245,31 @@ static int rtl2830_set_frontend(struct dvb_frontend *fe)
 	dev_dbg(&client->dev, "if_frequency=%d if_ctl=%08x\n",
 		if_frequency, if_ctl);
 
-	ret = rtl2830_rd_reg_mask(client, 0x119, &tmp, 0xc0); /* b[7:6] */
+	buf[0] = (if_ctl >> 16) & 0x3f;
+	buf[1] = (if_ctl >>  8) & 0xff;
+	buf[2] = (if_ctl >>  0) & 0xff;
+
+	ret = rtl2830_bulk_read(client, 0x119, &u8tmp, 1);
 	if (ret)
 		goto err;
 
-	buf[0] = tmp << 6;
-	buf[0] |= (if_ctl >> 16) & 0x3f;
-	buf[1] = (if_ctl >>  8) & 0xff;
-	buf[2] = (if_ctl >>  0) & 0xff;
+	buf[0] |= u8tmp & 0xc0;  /* [7:6] */
 
-	ret = rtl2830_wr_regs(client, 0x119, buf, 3);
+	ret = rtl2830_bulk_write(client, 0x119, buf, 3);
 	if (ret)
 		goto err;
 
 	/* 1/2 split I2C write */
-	ret = rtl2830_wr_regs(client, 0x11c, &bw_params1[i][0], 17);
+	ret = rtl2830_bulk_write(client, 0x11c, &bw_params1[i][0], 17);
 	if (ret)
 		goto err;
 
 	/* 2/2 split I2C write */
-	ret = rtl2830_wr_regs(client, 0x12d, &bw_params1[i][17], 17);
+	ret = rtl2830_bulk_write(client, 0x12d, &bw_params1[i][17], 17);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_wr_regs(client, 0x19d, bw_params2[i], 6);
+	ret = rtl2830_bulk_write(client, 0x19d, bw_params2[i], 6);
 	if (ret)
 		goto err;
 
@@ -422,11 +290,11 @@ static int rtl2830_get_frontend(struct dvb_frontend *fe)
 	if (dev->sleeping)
 		return 0;
 
-	ret = rtl2830_rd_regs(client, 0x33c, buf, 2);
+	ret = rtl2830_bulk_read(client, 0x33c, buf, 2);
 	if (ret)
 		goto err;
 
-	ret = rtl2830_rd_reg(client, 0x351, &buf[2]);
+	ret = rtl2830_bulk_read(client, 0x351, &buf[2], 1);
 	if (ret)
 		goto err;
 
@@ -529,21 +397,22 @@ static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status)
 	struct i2c_client *client = fe->demodulator_priv;
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 	int ret;
-	u8 tmp;
+	u8 u8tmp;
 
 	*status = 0;
 
 	if (dev->sleeping)
 		return 0;
 
-	ret = rtl2830_rd_reg_mask(client, 0x351, &tmp, 0x78); /* [6:3] */
+	ret = rtl2830_bulk_read(client, 0x351, &u8tmp, 1);
 	if (ret)
 		goto err;
 
-	if (tmp == 11) {
+	u8tmp = (u8tmp >> 3) & 0x0f; /* [6:3] */
+	if (u8tmp == 11) {
 		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
 			FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
-	} else if (tmp == 10) {
+	} else if (u8tmp == 10) {
 		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
 			FE_HAS_VITERBI;
 	}
@@ -650,7 +519,7 @@ static void rtl2830_stat_work(struct work_struct *work)
 		struct {signed int x:14; } s;
 
 		/* read IF AGC */
-		ret = rtl2830_rd_regs(client, 0x359, buf, 2);
+		ret = rtl2830_bulk_read(client, 0x359, buf, 2);
 		if (ret)
 			goto err;
 
@@ -678,7 +547,7 @@ static void rtl2830_stat_work(struct work_struct *work)
 			{92888734, 92888734, 95487525, 99770748},
 		};
 
-		ret = rtl2830_rd_reg(client, 0x33c, &u8tmp);
+		ret = rtl2830_bulk_read(client, 0x33c, &u8tmp, 1);
 		if (ret)
 			goto err;
 
@@ -690,7 +559,7 @@ static void rtl2830_stat_work(struct work_struct *work)
 		if (hierarchy > HIERARCHY_NUM - 1)
 			goto err_schedule_delayed_work;
 
-		ret = rtl2830_rd_regs(client, 0x40c, buf, 2);
+		ret = rtl2830_bulk_read(client, 0x40c, buf, 2);
 		if (ret)
 			goto err;
 
@@ -711,7 +580,7 @@ static void rtl2830_stat_work(struct work_struct *work)
 
 	/* BER */
 	if (dev->fe_status & FE_HAS_LOCK) {
-		ret = rtl2830_rd_regs(client, 0x34e, buf, 2);
+		ret = rtl2830_bulk_read(client, 0x34e, buf, 2);
 		if (ret)
 			goto err;
 
@@ -751,7 +620,7 @@ static int rtl2830_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
 	else
 		u8tmp = 0x00;
 
-	ret = rtl2830_wr_reg_mask(client, 0x061, u8tmp, 0x80);
+	ret = rtl2830_update_bits(client, 0x061, 0x80, u8tmp);
 	if (ret)
 		goto err;
 
@@ -785,14 +654,14 @@ static int rtl2830_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid, int on
 	buf[1] = (dev->filters >>  8) & 0xff;
 	buf[2] = (dev->filters >> 16) & 0xff;
 	buf[3] = (dev->filters >> 24) & 0xff;
-	ret = rtl2830_wr_regs(client, 0x062, buf, 4);
+	ret = rtl2830_bulk_write(client, 0x062, buf, 4);
 	if (ret)
 		goto err;
 
 	/* add PID */
 	buf[0] = (pid >> 8) & 0xff;
 	buf[1] = (pid >> 0) & 0xff;
-	ret = rtl2830_wr_regs(client, 0x066 + 2 * index, buf, 2);
+	ret = rtl2830_bulk_write(client, 0x066 + 2 * index, buf, 2);
 	if (ret)
 		goto err;
 
@@ -803,55 +672,24 @@ err:
 }
 
 /*
- * 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.
+ * I2C gate/mux/repeater logic
+ * We must use unlocked __i2c_transfer() here (through RegMap) because of I2C
+ * adapter lock is already taken by tuner driver.
+ * Gate is closed automatically after single I2C transfer.
  */
 static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
 {
 	struct i2c_client *client = mux_priv;
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
-	struct i2c_msg select_reg_page_msg[1] = {
-		{
-			.addr = client->addr,
-			.flags = 0,
-			.len = 2,
-			.buf = "\x00\x01",
-		}
-	};
-	struct i2c_msg gate_open_msg[1] = {
-		{
-			.addr = client->addr,
-			.flags = 0,
-			.len = 2,
-			.buf = "\x01\x08",
-		}
-	};
 	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) {
-		dev_warn(&client->dev, "i2c write failed %d\n", ret);
-		if (ret >= 0)
-			ret = -EREMOTEIO;
+	/* open I2C repeater for 1 transfer, closes automatically */
+	/* XXX: regmap_update_bits() does not lock I2C adapter */
+	ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
+	if (ret)
 		goto err;
-	}
-
-	dev->page = 1;
-
-	/* open tuner I2C repeater for 1 xfer, closes automatically */
-	ret = __i2c_transfer(client->adapter, 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:
@@ -859,34 +697,107 @@ err:
 	return ret;
 }
 
-static int rtl2830_deselect(struct i2c_adapter *adap, void *mux_priv, u32 chan)
+static struct dvb_frontend *rtl2830_get_dvb_frontend(struct i2c_client *client)
 {
-	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;
+	return &dev->fe;
 }
 
-static struct dvb_frontend *rtl2830_get_dvb_frontend(struct i2c_client *client)
+static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
 {
 	struct rtl2830_dev *dev = i2c_get_clientdata(client);
 
 	dev_dbg(&client->dev, "\n");
 
-	return &dev->fe;
+	return dev->adapter;
 }
 
-static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
+/*
+ * We implement own I2C access routines for RegMap in order to get manual access
+ * to I2C adapter lock, which is needed for I2C mux adapter.
+ */
+static int rtl2830_regmap_read(void *context, const void *reg_buf,
+			       size_t reg_size, void *val_buf, size_t val_size)
 {
-	struct rtl2830_dev *dev = i2c_get_clientdata(client);
+	struct i2c_client *client = context;
+	int ret;
+	struct i2c_msg msg[2] = {
+		{
+			.addr = client->addr,
+			.flags = 0,
+			.len = reg_size,
+			.buf = (u8 *)reg_buf,
+		}, {
+			.addr = client->addr,
+			.flags = I2C_M_RD,
+			.len = val_size,
+			.buf = val_buf,
+		}
+	};
 
-	dev_dbg(&client->dev, "\n");
+	ret = __i2c_transfer(client->adapter, msg, 2);
+	if (ret != 2) {
+		dev_warn(&client->dev, "i2c reg read failed %d\n", ret);
+		if (ret >= 0)
+			ret = -EREMOTEIO;
+		return ret;
+	}
+	return 0;
+}
 
-	return dev->adapter;
+static int rtl2830_regmap_write(void *context, const void *data, size_t count)
+{
+	struct i2c_client *client = context;
+	int ret;
+	struct i2c_msg msg[1] = {
+		{
+			.addr = client->addr,
+			.flags = 0,
+			.len = count,
+			.buf = (u8 *)data,
+		}
+	};
+
+	ret = __i2c_transfer(client->adapter, msg, 1);
+	if (ret != 1) {
+		dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
+		if (ret >= 0)
+			ret = -EREMOTEIO;
+		return ret;
+	}
+	return 0;
+}
+
+static int rtl2830_regmap_gather_write(void *context, const void *reg,
+				       size_t reg_len, const void *val,
+				       size_t val_len)
+{
+	struct i2c_client *client = context;
+	int ret;
+	u8 buf[256];
+	struct i2c_msg msg[1] = {
+		{
+			.addr = client->addr,
+			.flags = 0,
+			.len = 1 + val_len,
+			.buf = buf,
+		}
+	};
+
+	buf[0] = *(u8 const *)reg;
+	memcpy(&buf[1], val, val_len);
+
+	ret = __i2c_transfer(client->adapter, msg, 1);
+	if (ret != 1) {
+		dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
+		if (ret >= 0)
+			ret = -EREMOTEIO;
+		return ret;
+	}
+	return 0;
 }
 
 static int rtl2830_probe(struct i2c_client *client,
@@ -896,6 +807,30 @@ static int rtl2830_probe(struct i2c_client *client,
 	struct rtl2830_dev *dev;
 	int ret;
 	u8 u8tmp;
+	static const struct regmap_bus rtl2830_regmap_bus = {
+		.read = rtl2830_regmap_read,
+		.write = rtl2830_regmap_write,
+		.gather_write = rtl2830_regmap_gather_write,
+		.val_format_endian_default = REGMAP_ENDIAN_NATIVE,
+	};
+	static const struct regmap_range_cfg rtl2830_regmap_range_cfg[] = {
+		{
+			.selector_reg     = 0x00,
+			.selector_mask    = 0xff,
+			.selector_shift   = 0,
+			.window_start     = 0,
+			.window_len       = 0x100,
+			.range_min        = 0 * 0x100,
+			.range_max        = 5 * 0x100,
+		},
+	};
+	static const struct regmap_config regmap_config = {
+		.reg_bits    =  8,
+		.val_bits    =  8,
+		.max_register = 5 * 0x100,
+		.ranges = rtl2830_regmap_range_cfg,
+		.num_ranges = ARRAY_SIZE(rtl2830_regmap_range_cfg),
+	};
 
 	dev_dbg(&client->dev, "\n");
 
@@ -918,18 +853,24 @@ static int rtl2830_probe(struct i2c_client *client,
 	dev->sleeping = true;
 	mutex_init(&dev->i2c_mutex);
 	INIT_DELAYED_WORK(&dev->stat_work, rtl2830_stat_work);
+	dev->regmap = regmap_init(&client->dev, &rtl2830_regmap_bus, client,
+				  &regmap_config);
+	if (IS_ERR(dev->regmap)) {
+		ret = PTR_ERR(dev->regmap);
+		goto err_kfree;
+	}
 
 	/* check if the demod is there */
-	ret = rtl2830_rd_reg(client, 0x000, &u8tmp);
+	ret = rtl2830_bulk_read(client, 0x000, &u8tmp, 1);
 	if (ret)
-		goto err_kfree;
+		goto err_regmap_exit;
 
 	/* create muxed i2c adapter for tuner */
 	dev->adapter = i2c_add_mux_adapter(client->adapter, &client->dev,
-			client, 0, 0, 0, rtl2830_select, rtl2830_deselect);
+			client, 0, 0, 0, rtl2830_select, NULL);
 	if (dev->adapter == NULL) {
 		ret = -ENODEV;
-		goto err_kfree;
+		goto err_regmap_exit;
 	}
 
 	/* create dvb frontend */
@@ -945,6 +886,8 @@ static int rtl2830_probe(struct i2c_client *client,
 	dev_info(&client->dev, "Realtek RTL2830 successfully attached\n");
 
 	return 0;
+err_regmap_exit:
+	regmap_exit(dev->regmap);
 err_kfree:
 	kfree(dev);
 err:
@@ -959,6 +902,7 @@ static int rtl2830_remove(struct i2c_client *client)
 	dev_dbg(&client->dev, "\n");
 
 	i2c_del_mux_adapter(dev->adapter);
+	regmap_exit(dev->regmap);
 	kfree(dev);
 
 	return 0;
diff --git a/drivers/media/dvb-frontends/rtl2830_priv.h b/drivers/media/dvb-frontends/rtl2830_priv.h
index 517758a..42c2b1f 100644
--- a/drivers/media/dvb-frontends/rtl2830_priv.h
+++ b/drivers/media/dvb-frontends/rtl2830_priv.h
@@ -23,15 +23,16 @@
 #include "rtl2830.h"
 #include <linux/i2c-mux.h>
 #include <linux/math64.h>
+#include <linux/regmap.h>
 
 struct rtl2830_dev {
 	struct rtl2830_platform_data *pdata;
 	struct i2c_client *client;
+	struct regmap *regmap;
 	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;
 	fe_status_t fe_status;
-- 
http://palosaari.fi/


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH 16/18] rtl28xxu: add support for RTL2831U/RTL2830 PID filter
  2014-12-14  8:28 ` [PATCH 16/18] rtl28xxu: add support for RTL2831U/RTL2830 " Antti Palosaari
@ 2014-12-14 19:25   ` Benjamin Larsson
  2014-12-14 19:27     ` Antti Palosaari
  0 siblings, 1 reply; 20+ messages in thread
From: Benjamin Larsson @ 2014-12-14 19:25 UTC (permalink / raw)
  To: Antti Palosaari, linux-media

On 12/14/2014 09:28 AM, Antti Palosaari wrote:
> RTL2830 demod integrated to RTL2831U has PID filter. PID filtering
> is provided by rtl2830 demod driver. Add support for it.
>

Do you plan on adding this for the RTL2832 demod also ?

MvH
Benjamin Larsson

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 16/18] rtl28xxu: add support for RTL2831U/RTL2830 PID filter
  2014-12-14 19:25   ` Benjamin Larsson
@ 2014-12-14 19:27     ` Antti Palosaari
  0 siblings, 0 replies; 20+ messages in thread
From: Antti Palosaari @ 2014-12-14 19:27 UTC (permalink / raw)
  To: Benjamin Larsson, linux-media

On 12/14/2014 09:25 PM, Benjamin Larsson wrote:
> On 12/14/2014 09:28 AM, Antti Palosaari wrote:
>> RTL2830 demod integrated to RTL2831U has PID filter. PID filtering
>> is provided by rtl2830 demod driver. Add support for it.
>>
>
> Do you plan on adding this for the RTL2832 demod also ?

I already did, but it is on my HD. I just published those rtl2830 codes 
for example as you asked.
I have implemented all those same for rtl2832 too + some more, like 
register caching.

regards
Antti

-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2014-12-14 19:27 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-12-14  8:28 [PATCH 01/18] rtl2830: convert driver to kernel I2C model Antti Palosaari
2014-12-14  8:28 ` [PATCH 02/18] rtl28xxu: use I2C binding for RTL2830 demod driver Antti Palosaari
2014-12-14  8:28 ` [PATCH 03/18] rtl2830: get rid of legacy DVB driver binding Antti Palosaari
2014-12-14  8:28 ` [PATCH 04/18] rtl2830: rename 'priv' to 'dev' Antti Palosaari
2014-12-14  8:28 ` [PATCH 05/18] rtl2830: carry pointer to I2C client for every function Antti Palosaari
2014-12-14  8:28 ` [PATCH 06/18] rtl2830: fix logging Antti Palosaari
2014-12-14  8:28 ` [PATCH 07/18] rtl2830: get rid of internal config data Antti Palosaari
2014-12-14  8:28 ` [PATCH 08/18] rtl2830: style related changes Antti Palosaari
2014-12-14  8:28 ` [PATCH 09/18] rtl2830: implement DVBv5 CNR statistic Antti Palosaari
2014-12-14  8:28 ` [PATCH 10/18] rtl2830: implement DVBv5 signal strength statistics Antti Palosaari
2014-12-14  8:28 ` [PATCH 11/18] rtl2830: implement DVBv5 BER statistic Antti Palosaari
2014-12-14  8:28 ` [PATCH 12/18] rtl2830: wrap DVBv5 signal strength to DVBv3 Antti Palosaari
2014-12-14  8:28 ` [PATCH 13/18] rtl2830: wrap DVBv5 BER " Antti Palosaari
2014-12-14  8:28 ` [PATCH 14/18] rtl2830: wrap DVBv5 CNR to DVBv3 SNR Antti Palosaari
2014-12-14  8:28 ` [PATCH 15/18] rtl2830: implement PID filter Antti Palosaari
2014-12-14  8:28 ` [PATCH 16/18] rtl28xxu: add support for RTL2831U/RTL2830 " Antti Palosaari
2014-12-14 19:25   ` Benjamin Larsson
2014-12-14 19:27     ` Antti Palosaari
2014-12-14  8:28 ` [PATCH 17/18] rtl2830: implement own I2C locking Antti Palosaari
2014-12-14  8:28 ` [PATCH 18/18] rtl2830: convert to RegMap API Antti Palosaari

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.