Commit 3b60b761 authored by Antti Palosaari's avatar Antti Palosaari Committed by Mauro Carvalho Chehab

[media] tda18212: convert to RegMap API

Use RegMap API to handle all the boring I2C register access
boilerplate stuff.
Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent e4a42e18
...@@ -204,6 +204,7 @@ config MEDIA_TUNER_FC0013 ...@@ -204,6 +204,7 @@ config MEDIA_TUNER_FC0013
config MEDIA_TUNER_TDA18212 config MEDIA_TUNER_TDA18212
tristate "NXP TDA18212 silicon tuner" tristate "NXP TDA18212 silicon tuner"
depends on MEDIA_SUPPORT && I2C depends on MEDIA_SUPPORT && I2C
select REGMAP_I2C
default m if !MEDIA_SUBDRV_AUTOSELECT default m if !MEDIA_SUBDRV_AUTOSELECT
help help
NXP TDA18212 silicon tuner driver. NXP TDA18212 silicon tuner driver.
......
...@@ -19,122 +19,16 @@ ...@@ -19,122 +19,16 @@
*/ */
#include "tda18212.h" #include "tda18212.h"
#include <linux/regmap.h>
/* Max transfer size done by I2C transfer functions */
#define MAX_XFER_SIZE 64
struct tda18212_dev { struct tda18212_dev {
struct tda18212_config cfg; struct tda18212_config cfg;
struct i2c_client *client; struct i2c_client *client;
struct regmap *regmap;
u32 if_frequency; u32 if_frequency;
}; };
/* write multiple registers */
static int tda18212_wr_regs(struct tda18212_dev *dev, u8 reg, u8 *val, int len)
{
int ret;
u8 buf[MAX_XFER_SIZE];
struct i2c_msg msg[1] = {
{
.addr = dev->client->addr,
.flags = 0,
.len = 1 + len,
.buf = buf,
}
};
if (1 + len > sizeof(buf)) {
dev_warn(&dev->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(dev->client->adapter, msg, 1);
if (ret == 1) {
ret = 0;
} else {
dev_warn(&dev->client->dev,
"i2c wr failed=%d reg=%02x len=%d\n",
ret, reg, len);
ret = -EREMOTEIO;
}
return ret;
}
/* read multiple registers */
static int tda18212_rd_regs(struct tda18212_dev *dev, u8 reg, u8 *val, int len)
{
int ret;
u8 buf[MAX_XFER_SIZE];
struct i2c_msg msg[2] = {
{
.addr = dev->client->addr,
.flags = 0,
.len = 1,
.buf = &reg,
}, {
.addr = dev->client->addr,
.flags = I2C_M_RD,
.len = len,
.buf = buf,
}
};
if (len > sizeof(buf)) {
dev_warn(&dev->client->dev,
"i2c rd reg=%04x: len=%d is too big!\n",
reg, len);
return -EINVAL;
}
ret = i2c_transfer(dev->client->adapter, msg, 2);
if (ret == 2) {
memcpy(val, buf, len);
ret = 0;
} else {
dev_warn(&dev->client->dev,
"i2c rd failed=%d reg=%02x len=%d\n",
ret, reg, len);
ret = -EREMOTEIO;
}
return ret;
}
/* write single register */
static int tda18212_wr_reg(struct tda18212_dev *dev, u8 reg, u8 val)
{
return tda18212_wr_regs(dev, reg, &val, 1);
}
/* read single register */
static int tda18212_rd_reg(struct tda18212_dev *dev, u8 reg, u8 *val)
{
return tda18212_rd_regs(dev, reg, val, 1);
}
#if 0 /* keep, useful when developing driver */
static void tda18212_dump_regs(struct tda18212_dev *dev)
{
int i;
u8 buf[256];
#define TDA18212_RD_LEN 32
for (i = 0; i < sizeof(buf); i += TDA18212_RD_LEN)
tda18212_rd_regs(dev, i, &buf[i], TDA18212_RD_LEN);
print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 32, 1, buf,
sizeof(buf), true);
return;
}
#endif
static int tda18212_set_params(struct dvb_frontend *fe) static int tda18212_set_params(struct dvb_frontend *fe)
{ {
struct tda18212_dev *dev = fe->tuner_priv; struct tda18212_dev *dev = fe->tuner_priv;
...@@ -231,15 +125,15 @@ static int tda18212_set_params(struct dvb_frontend *fe) ...@@ -231,15 +125,15 @@ static int tda18212_set_params(struct dvb_frontend *fe)
goto error; goto error;
} }
ret = tda18212_wr_reg(dev, 0x23, bw_params[i][2]); ret = regmap_write(dev->regmap, 0x23, bw_params[i][2]);
if (ret) if (ret)
goto error; goto error;
ret = tda18212_wr_reg(dev, 0x06, 0x00); ret = regmap_write(dev->regmap, 0x06, 0x00);
if (ret) if (ret)
goto error; goto error;
ret = tda18212_wr_reg(dev, 0x0f, bw_params[i][0]); ret = regmap_write(dev->regmap, 0x0f, bw_params[i][0]);
if (ret) if (ret)
goto error; goto error;
...@@ -252,7 +146,7 @@ static int tda18212_set_params(struct dvb_frontend *fe) ...@@ -252,7 +146,7 @@ static int tda18212_set_params(struct dvb_frontend *fe)
buf[6] = ((c->frequency / 1000) >> 0) & 0xff; buf[6] = ((c->frequency / 1000) >> 0) & 0xff;
buf[7] = 0xc1; buf[7] = 0xc1;
buf[8] = 0x01; buf[8] = 0x01;
ret = tda18212_wr_regs(dev, 0x12, buf, sizeof(buf)); ret = regmap_bulk_write(dev->regmap, 0x12, buf, sizeof(buf));
if (ret) if (ret)
goto error; goto error;
...@@ -299,8 +193,12 @@ static int tda18212_probe(struct i2c_client *client, ...@@ -299,8 +193,12 @@ static int tda18212_probe(struct i2c_client *client,
struct dvb_frontend *fe = cfg->fe; struct dvb_frontend *fe = cfg->fe;
struct tda18212_dev *dev; struct tda18212_dev *dev;
int ret; int ret;
u8 chip_id = chip_id; unsigned int chip_id;
char *version; char *version;
static const struct regmap_config regmap_config = {
.reg_bits = 8,
.val_bits = 8,
};
dev = kzalloc(sizeof(*dev), GFP_KERNEL); dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (dev == NULL) { if (dev == NULL) {
...@@ -311,12 +209,17 @@ static int tda18212_probe(struct i2c_client *client, ...@@ -311,12 +209,17 @@ static int tda18212_probe(struct i2c_client *client,
memcpy(&dev->cfg, cfg, sizeof(struct tda18212_config)); memcpy(&dev->cfg, cfg, sizeof(struct tda18212_config));
dev->client = client; dev->client = client;
dev->regmap = devm_regmap_init_i2c(client, &regmap_config);
if (IS_ERR(dev->regmap)) {
ret = PTR_ERR(dev->regmap);
goto err;
}
/* check if the tuner is there */ /* check if the tuner is there */
if (fe->ops.i2c_gate_ctrl) if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1); /* open I2C-gate */ fe->ops.i2c_gate_ctrl(fe, 1); /* open I2C-gate */
ret = tda18212_rd_reg(dev, 0x00, &chip_id); ret = regmap_read(dev->regmap, 0x00, &chip_id);
dev_dbg(&dev->client->dev, "chip_id=%02x\n", chip_id); dev_dbg(&dev->client->dev, "chip_id=%02x\n", chip_id);
if (fe->ops.i2c_gate_ctrl) if (fe->ops.i2c_gate_ctrl)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment