summaryrefslogtreecommitdiffstats
path: root/drivers/media/tuners
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2014-08-27 08:59:27 +0200
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2014-09-21 23:24:32 +0200
commit676c350f97366f648dbe7f7f8202a695d946f764 (patch)
tree7c6a245865b7b9451432db6510a062a3eb0532c7 /drivers/media/tuners
parent[media] it913x: convert to RegMap API (diff)
downloadlinux-676c350f97366f648dbe7f7f8202a695d946f764.tar.xz
linux-676c350f97366f648dbe7f7f8202a695d946f764.zip
[media] it913x: re-implement sleep
Re-implement sleep. Based USB sniffs taken from the latest Hauppauge windows driver version 07/10/2014, 14.6.23.32191. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/tuners')
-rw-r--r--drivers/media/tuners/it913x.c76
-rw-r--r--drivers/media/tuners/it913x.h10
-rw-r--r--drivers/media/tuners/it913x_priv.h27
3 files changed, 69 insertions, 44 deletions
diff --git a/drivers/media/tuners/it913x.c b/drivers/media/tuners/it913x.c
index f3e212c127c8..11d391a5d5c6 100644
--- a/drivers/media/tuners/it913x.c
+++ b/drivers/media/tuners/it913x.c
@@ -26,7 +26,8 @@ struct it913x_dev {
struct i2c_client *client;
struct regmap *regmap;
struct dvb_frontend *fe;
- u8 chip_ver;
+ u8 chip_ver:2;
+ u8 role:2;
u8 firmware_ver;
u16 tun_xtal;
u8 tun_fdiv;
@@ -122,6 +123,62 @@ static int it913x_init(struct dvb_frontend *fe)
return regmap_write(dev->regmap, 0x80ed81, val);
}
+static int it913x_sleep(struct dvb_frontend *fe)
+{
+ struct it913x_dev *dev = fe->tuner_priv;
+ int ret, len;
+
+ dev_dbg(&dev->client->dev, "role=%u\n", dev->role);
+
+ ret = regmap_bulk_write(dev->regmap, 0x80ec40, "\x00", 1);
+ if (ret)
+ goto err;
+
+ /*
+ * Writing '0x00' to master tuner register '0x80ec08' causes slave tuner
+ * communication lost. Due to that, we cannot put master full sleep.
+ */
+ if (dev->role == IT913X_ROLE_DUAL_MASTER)
+ len = 4;
+ else
+ len = 15;
+
+ dev_dbg(&dev->client->dev, "role=%u len=%d\n", dev->role, len);
+
+ ret = regmap_bulk_write(dev->regmap, 0x80ec02,
+ "\x3f\x1f\x3f\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ len);
+ if (ret)
+ goto err;
+
+ ret = regmap_bulk_write(dev->regmap, 0x80ec12, "\x00\x00\x00\x00", 4);
+ if (ret)
+ goto err;
+
+ ret = regmap_bulk_write(dev->regmap, 0x80ec17,
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00", 9);
+ if (ret)
+ goto err;
+
+ ret = regmap_bulk_write(dev->regmap, 0x80ec22,
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 10);
+ if (ret)
+ goto err;
+
+ ret = regmap_bulk_write(dev->regmap, 0x80ec20, "\x00", 1);
+ if (ret)
+ goto err;
+
+ ret = regmap_bulk_write(dev->regmap, 0x80ec3f, "\x01", 1);
+ if (ret)
+ goto err;
+
+ return 0;
+err:
+ dev_dbg(&dev->client->dev, "failed %d\n", ret);
+ return ret;
+}
+
static int it9137_set_params(struct dvb_frontend *fe)
{
struct it913x_dev *dev = fe->tuner_priv;
@@ -274,20 +331,6 @@ static int it9137_set_params(struct dvb_frontend *fe)
return (ret < 0) ? -ENODEV : 0;
}
-/* Power sequence */
-/* Power Up Tuner on -> Frontend suspend off -> Tuner clk on */
-/* Power Down Frontend suspend on -> Tuner clk off -> Tuner off */
-
-static int it913x_sleep(struct dvb_frontend *fe)
-{
- struct it913x_dev *dev = fe->tuner_priv;
-
- if (dev->chip_ver == 0x01)
- return it913x_script_loader(dev, it9135ax_tuner_off);
- else
- return it913x_script_loader(dev, it9137_tuner_off);
-}
-
static const struct dvb_tuner_ops it913x_tuner_ops = {
.info = {
.name = "ITE Tech IT913X",
@@ -323,6 +366,7 @@ static int it913x_probe(struct i2c_client *client,
dev->client = client;
dev->fe = cfg->fe;
dev->chip_ver = cfg->chip_ver;
+ dev->role = cfg->role;
dev->firmware_ver = 1;
dev->regmap = regmap_init_i2c(client, &regmap_config);
if (IS_ERR(dev->regmap)) {
@@ -349,7 +393,7 @@ static int it913x_probe(struct i2c_client *client,
dev_info(&dev->client->dev, "ITE IT913X %s successfully attached\n",
chip_ver_str);
- dev_dbg(&dev->client->dev, "chip_ver=%02x\n", dev->chip_ver);
+ dev_dbg(&dev->client->dev, "chip_ver=%u role=%u\n", dev->chip_ver, dev->role);
return 0;
err_regmap_exit:
diff --git a/drivers/media/tuners/it913x.h b/drivers/media/tuners/it913x.h
index 9789c4d2a6ea..33de53d4a566 100644
--- a/drivers/media/tuners/it913x.h
+++ b/drivers/media/tuners/it913x.h
@@ -40,7 +40,15 @@ struct it913x_config {
* 1 = IT9135 AX
* 2 = IT9135 BX
*/
- u8 chip_ver:2;
+ unsigned int chip_ver:2;
+
+ /*
+ * tuner role
+ */
+#define IT913X_ROLE_SINGLE 0
+#define IT913X_ROLE_DUAL_MASTER 1
+#define IT913X_ROLE_DUAL_SLAVE 2
+ unsigned int role:2;
};
#endif
diff --git a/drivers/media/tuners/it913x_priv.h b/drivers/media/tuners/it913x_priv.h
index 3ed2d3c0fe55..41f9b2a43e39 100644
--- a/drivers/media/tuners/it913x_priv.h
+++ b/drivers/media/tuners/it913x_priv.h
@@ -33,33 +33,6 @@ struct it913xset { u32 address;
u8 count;
};
-/* Tuner setting scripts for IT9135 AX */
-static struct it913xset it9135ax_tuner_off[] = {
- {0x80ec40, {0x00}, 0x01}, /* Power Down Tuner */
- {0x80ec02, {0x3f}, 0x01},
- {0x80ec03, {0x1f}, 0x01},
- {0x80ec04, {0x3f}, 0x01},
- {0x80ec05, {0x3f}, 0x01},
- {0x80ec3f, {0x01}, 0x01},
- {0x000000, {0x00}, 0x00}, /* Terminating Entry */
-};
-
-/* Tuner setting scripts (still keeping it9137) */
-static struct it913xset it9137_tuner_off[] = {
- {0x80ec40, {0x00}, 0x01}, /* Power Down Tuner */
- {0x80ec02, {0x3f, 0x1f, 0x3f, 0x3f}, 0x04},
- {0x80ec06, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00}, 0x0c},
- {0x80ec12, {0x00, 0x00, 0x00, 0x00}, 0x04},
- {0x80ec17, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00}, 0x09},
- {0x80ec22, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00}, 0x0a},
- {0x80ec20, {0x00}, 0x01},
- {0x80ec3f, {0x01}, 0x01},
- {0x000000, {0x00}, 0x00}, /* Terminating Entry */
-};
-
static struct it913xset set_it9135_template[] = {
{0x80ee06, {0x00}, 0x01},
{0x80ec56, {0x00}, 0x01},