All of lore.kernel.org
 help / color / mirror / Atom feed
From: Antti Palosaari <crope@iki.fi>
To: linux-media@vger.kernel.org
Cc: Antti Palosaari <crope@iki.fi>
Subject: [PATCH 16/37] it913x: convert to RegMap API
Date: Thu,  4 Sep 2014 05:36:24 +0300	[thread overview]
Message-ID: <1409798205-25645-16-git-send-email-crope@iki.fi> (raw)
In-Reply-To: <1409798205-25645-1-git-send-email-crope@iki.fi>

Use RegMap API to cover I2C register access routines.

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/tuners/Kconfig       |   1 +
 drivers/media/tuners/it913x.c      | 137 +++++++++----------------------------
 drivers/media/tuners/it913x_priv.h |   1 +
 3 files changed, 34 insertions(+), 105 deletions(-)

diff --git a/drivers/media/tuners/Kconfig b/drivers/media/tuners/Kconfig
index d79fd1c..ca42da8 100644
--- a/drivers/media/tuners/Kconfig
+++ b/drivers/media/tuners/Kconfig
@@ -247,6 +247,7 @@ config MEDIA_TUNER_SI2157
 config MEDIA_TUNER_IT913X
 	tristate "ITE Tech IT913x silicon tuner"
 	depends on MEDIA_SUPPORT && I2C
+	select REGMAP_I2C
 	default m if !MEDIA_SUBDRV_AUTOSELECT
 	help
 	  ITE Tech IT913x silicon tuner driver.
diff --git a/drivers/media/tuners/it913x.c b/drivers/media/tuners/it913x.c
index cc959c1..f3e212c 100644
--- a/drivers/media/tuners/it913x.c
+++ b/drivers/media/tuners/it913x.c
@@ -24,6 +24,7 @@
 
 struct it913x_dev {
 	struct i2c_client *client;
+	struct regmap *regmap;
 	struct dvb_frontend *fe;
 	u8 chip_ver;
 	u8 firmware_ver;
@@ -33,92 +34,6 @@ struct it913x_dev {
 	u32 tun_fn_min;
 };
 
-/* read multiple registers */
-static int it913x_rd_regs(struct it913x_dev *dev,
-		u32 reg, u8 *data, u8 count)
-{
-	int ret;
-	u8 b[3];
-	struct i2c_msg msg[2] = {
-		{ .addr = dev->client->addr, .flags = 0,
-			.buf = b, .len = sizeof(b) },
-		{ .addr = dev->client->addr, .flags = I2C_M_RD,
-			.buf = data, .len = count }
-	};
-
-	b[0] = (u8)(reg >> 16) & 0xff;
-	b[1] = (u8)(reg >> 8) & 0xff;
-	b[2] = (u8) reg & 0xff;
-
-	ret = i2c_transfer(dev->client->adapter, msg, 2);
-
-	return ret;
-}
-
-/* read single register */
-static int it913x_rd_reg(struct it913x_dev *dev, u32 reg, u8 *val)
-{
-	int ret;
-	u8 b[1];
-
-	ret = it913x_rd_regs(dev, reg, &b[0], sizeof(b));
-	if (ret < 0)
-		return -ENODEV;
-	*val = b[0];
-	return 0;
-}
-
-/* write multiple registers */
-static int it913x_wr_regs(struct it913x_dev *dev,
-		u32 reg, u8 buf[], u8 count)
-{
-	u8 b[256];
-	struct i2c_msg msg[1] = {
-		{ .addr = dev->client->addr, .flags = 0,
-		  .buf = b, .len = 3 + count }
-	};
-	int ret;
-
-	b[0] = (u8)(reg >> 16) & 0xff;
-	b[1] = (u8)(reg >> 8) & 0xff;
-	b[2] = (u8) reg & 0xff;
-	memcpy(&b[3], buf, count);
-
-	ret = i2c_transfer(dev->client->adapter, msg, 1);
-
-	if (ret < 0)
-		return -EIO;
-
-	return 0;
-}
-
-/* write single register */
-static int it913x_wr_reg(struct it913x_dev *dev,
-		u32 reg, u32 data)
-{
-	int ret;
-	u8 b[4];
-	u8 len;
-
-	b[0] = data >> 24;
-	b[1] = (data >> 16) & 0xff;
-	b[2] = (data >> 8) & 0xff;
-	b[3] = data & 0xff;
-	/* expand write as needed */
-	if (data < 0x100)
-		len = 3;
-	else if (data < 0x1000)
-		len = 2;
-	else if (data < 0x100000)
-		len = 1;
-	else
-		len = 0;
-
-	ret = it913x_wr_regs(dev, reg, &b[len], sizeof(b) - len);
-
-	return ret;
-}
-
 static int it913x_script_loader(struct it913x_dev *dev,
 		struct it913xset *loadscript)
 {
@@ -130,8 +45,7 @@ static int it913x_script_loader(struct it913x_dev *dev,
 	for (i = 0; i < 1000; ++i) {
 		if (loadscript[i].address == 0x000000)
 			break;
-		ret = it913x_wr_regs(dev,
-			loadscript[i].address,
+		ret = regmap_bulk_write(dev->regmap, loadscript[i].address,
 			loadscript[i].reg, loadscript[i].count);
 		if (ret < 0)
 			return -ENODEV;
@@ -143,12 +57,12 @@ static int it913x_init(struct dvb_frontend *fe)
 {
 	struct it913x_dev *dev = fe->tuner_priv;
 	int ret, i;
-	u8 reg = 0;
+	unsigned int reg;
 	u8 val, nv_val;
 	u8 nv[] = {48, 32, 24, 16, 12, 8, 6, 4, 2};
 	u8 b[2];
 
-	ret = it913x_rd_reg(dev, 0x80ec86, &reg);
+	ret = regmap_read(dev->regmap, 0x80ec86, &reg);
 	switch (reg) {
 	case 0:
 		dev->tun_clk_mode = reg;
@@ -165,7 +79,7 @@ static int it913x_init(struct dvb_frontend *fe)
 		break;
 	}
 
-	ret = it913x_rd_reg(dev, 0x80ed03,  &reg);
+	ret = regmap_read(dev->regmap, 0x80ed03,  &reg);
 
 	if (reg < 0)
 		return -ENODEV;
@@ -175,11 +89,11 @@ static int it913x_init(struct dvb_frontend *fe)
 		nv_val = 2;
 
 	for (i = 0; i < 50; i++) {
-		ret = it913x_rd_regs(dev, 0x80ed23, &b[0], sizeof(b));
+		ret = regmap_bulk_read(dev->regmap, 0x80ed23, &b[0], sizeof(b));
 		reg = (b[1] << 8) + b[0];
 		if (reg > 0)
 			break;
-		if (ret < 0)
+		if (ret)
 			return -ENODEV;
 		udelay(2000);
 	}
@@ -191,7 +105,7 @@ static int it913x_init(struct dvb_frontend *fe)
 		msleep(50);
 	else {
 		for (i = 0; i < 50; i++) {
-			ret = it913x_rd_reg(dev, 0x80ec82, &reg);
+			ret = regmap_read(dev->regmap, 0x80ec82, &reg);
 			if (ret < 0)
 				return -ENODEV;
 			if (reg > 0)
@@ -201,11 +115,11 @@ static int it913x_init(struct dvb_frontend *fe)
 	}
 
 	/* Power Up Tuner - common all versions */
-	ret = it913x_wr_reg(dev, 0x80ec40, 0x1);
-	ret |= it913x_wr_reg(dev, 0x80ec57, 0x0);
-	ret |= it913x_wr_reg(dev, 0x80ec58, 0x0);
+	ret = regmap_write(dev->regmap, 0x80ec40, 0x1);
+	ret |= regmap_write(dev->regmap, 0x80ec57, 0x0);
+	ret |= regmap_write(dev->regmap, 0x80ec58, 0x0);
 
-	return it913x_wr_reg(dev, 0x80ed81, val);
+	return regmap_write(dev->regmap, 0x80ed81, val);
 }
 
 static int it9137_set_params(struct dvb_frontend *fe)
@@ -216,7 +130,7 @@ static int it9137_set_params(struct dvb_frontend *fe)
 	u32 bandwidth = p->bandwidth_hz;
 	u32 frequency_m = p->frequency;
 	int ret;
-	u8 reg = 0;
+	unsigned int reg;
 	u32 frequency = frequency_m / 1000;
 	u32 freq, temp_f, tmp;
 	u16 iqik_m_cal;
@@ -317,7 +231,7 @@ static int it9137_set_params(struct dvb_frontend *fe)
 	} else
 		return -EINVAL;
 
-	ret = it913x_rd_reg(dev, 0x80ed81, &reg);
+	ret = regmap_read(dev->regmap, 0x80ed81, &reg);
 	iqik_m_cal = (u16)reg * n_div;
 
 	if (reg < 0x20) {
@@ -394,6 +308,10 @@ static int it913x_probe(struct i2c_client *client,
 	struct it913x_dev *dev;
 	int ret;
 	char *chip_ver_str;
+	static const struct regmap_config regmap_config = {
+		.reg_bits = 24,
+		.val_bits = 8,
+	};
 
 	dev = kzalloc(sizeof(struct it913x_dev), GFP_KERNEL);
 	if (dev == NULL) {
@@ -406,11 +324,16 @@ static int it913x_probe(struct i2c_client *client,
 	dev->fe = cfg->fe;
 	dev->chip_ver = cfg->chip_ver;
 	dev->firmware_ver = 1;
+	dev->regmap = regmap_init_i2c(client, &regmap_config);
+	if (IS_ERR(dev->regmap)) {
+		ret = PTR_ERR(dev->regmap);
+		goto err_kfree;
+	}
 
 	/* tuner RF initial */
-	ret = it913x_wr_reg(dev, 0x80ec4c, 0x68);
-	if (ret < 0)
-		goto err;
+	ret = regmap_write(dev->regmap, 0x80ec4c, 0x68);
+	if (ret)
+		goto err_regmap_exit;
 
 	fe->tuner_priv = dev;
 	memcpy(&fe->ops.tuner_ops, &it913x_tuner_ops,
@@ -428,10 +351,13 @@ static int it913x_probe(struct i2c_client *client,
 			chip_ver_str);
 	dev_dbg(&dev->client->dev, "chip_ver=%02x\n", dev->chip_ver);
 	return 0;
+
+err_regmap_exit:
+	regmap_exit(dev->regmap);
+err_kfree:
+	kfree(dev);
 err:
 	dev_dbg(&client->dev, "failed %d\n", ret);
-	kfree(dev);
-
 	return ret;
 }
 
@@ -444,6 +370,7 @@ static int it913x_remove(struct i2c_client *client)
 
 	memset(&fe->ops.tuner_ops, 0, sizeof(struct dvb_tuner_ops));
 	fe->tuner_priv = NULL;
+	regmap_exit(dev->regmap);
 	kfree(dev);
 
 	return 0;
diff --git a/drivers/media/tuners/it913x_priv.h b/drivers/media/tuners/it913x_priv.h
index 32af24c..3ed2d3c 100644
--- a/drivers/media/tuners/it913x_priv.h
+++ b/drivers/media/tuners/it913x_priv.h
@@ -24,6 +24,7 @@
 #define IT913X_PRIV_H
 
 #include "it913x.h"
+#include <linux/regmap.h>
 
 #define TRIGGER_OFSM		0x0000
 
-- 
http://palosaari.fi/


  parent reply	other threads:[~2014-09-04  2:37 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-04  2:36 [PATCH 01/37] af9033: provide dyn0_clk clock source Antti Palosaari
2014-09-04  2:36 ` [PATCH 02/37] af9035: enable AF9033 demod clock source for IT9135 Antti Palosaari
2014-09-04  2:36 ` [PATCH 03/37] it913x: fix tuner sleep power leak Antti Palosaari
2014-09-04  2:36 ` [PATCH 04/37] it913x: avoid division by zero on error case Antti Palosaari
2014-09-04  2:36 ` [PATCH 05/37] it913x: fix IT9135 AX sleep Antti Palosaari
2014-09-04  2:36 ` [PATCH 06/37] af9035: remove AVerMedia eeprom override Antti Palosaari
2014-09-04  2:36 ` [PATCH 07/37] af9035: make checkpatch.pl happy Antti Palosaari
2014-09-04  2:36 ` [PATCH 08/37] af9033: " Antti Palosaari
2014-09-04  2:36 ` [PATCH 09/37] it913x: " Antti Palosaari
2014-09-04  2:36 ` [PATCH 10/37] it913x: rename tuner_it913x => it913x Antti Palosaari
2014-09-04  2:36 ` [PATCH 11/37] af9035: do not attach IT9135 tuner Antti Palosaari
2014-09-04  2:36 ` [PATCH 12/37] it913x: convert to I2C driver Antti Palosaari
2014-09-04  2:36 ` [PATCH 13/37] af9035: use I2C it913x tuner driver Antti Palosaari
2014-09-04  2:36 ` [PATCH 14/37] it913x: change reg read/write routines more common Antti Palosaari
2014-09-04  2:36 ` [PATCH 15/37] it913x: rename 'state' to 'dev' Antti Palosaari
2014-09-04  2:36 ` Antti Palosaari [this message]
2014-09-04  2:36 ` [PATCH 17/37] it913x: re-implement sleep Antti Palosaari
2014-09-04  2:36 ` [PATCH 18/37] it913x: remove dead code Antti Palosaari
2014-09-04  2:36 ` [PATCH 19/37] it913x: get rid of script loader and and private header file Antti Palosaari
2014-09-04  2:36 ` [PATCH 20/37] it913x: refactor code largely Antti Palosaari
2014-09-04  2:36 ` [PATCH 21/37] it913x: replace udelay polling with jiffies Antti Palosaari
2014-09-04  2:36 ` [PATCH 22/37] af9033: fix firmware version logging Antti Palosaari
2014-09-04  2:36 ` [PATCH 23/37] af9033: rename 'state' to 'dev' Antti Palosaari
2014-09-04  2:36 ` [PATCH 24/37] af9033: convert to I2C client Antti Palosaari
2014-09-04  2:36 ` [PATCH 25/37] af9033: clean up logging Antti Palosaari
2014-09-04  2:36 ` [PATCH 26/37] af9035: few small I2C master xfer changes Antti Palosaari
2014-09-04  2:36 ` [PATCH 27/37] af9033: remove I2C addr from config Antti Palosaari
2014-09-04  2:36 ` [PATCH 28/37] af9035: replace PCTV device model numbers with name Antti Palosaari
2014-09-04  2:36 ` [PATCH 29/37] MAINTAINERS: IT913X driver filenames Antti Palosaari
2014-09-04  2:36 ` [PATCH 30/37] af9033: implement DVBv5 statistic for signal strength Antti Palosaari
2014-09-04  2:36 ` [PATCH 31/37] af9033: implement DVBv5 statistic for CNR Antti Palosaari
2014-09-04  2:36 ` [PATCH 32/37] af9033: wrap DVBv3 read SNR to DVBv5 CNR Antti Palosaari
2014-09-04  2:36 ` [PATCH 33/37] af9033: implement DVBv5 stat block counters Antti Palosaari
2014-09-04  2:36 ` [PATCH 34/37] af9033: implement DVBv5 post-Viterbi BER Antti Palosaari
2014-09-04  2:36 ` [PATCH 35/37] af9033: wrap DVBv3 UCB to DVBv5 UCB stats Antti Palosaari
2014-09-04  2:36 ` [PATCH 36/37] af9033: wrap DVBv3 BER to DVBv5 BER Antti Palosaari
2014-09-04  2:36 ` [PATCH 37/37] af9033: remove all DVBv3 stat calculation logic Antti Palosaari

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1409798205-25645-16-git-send-email-crope@iki.fi \
    --to=crope@iki.fi \
    --cc=linux-media@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.