aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMalcolm Priestley <tvboxspy@gmail.com>2011-10-01 08:24:16 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-10-08 07:03:27 -0400
commite30528854797f057aa6ffb6dc9f890e923c467fd (patch)
treeed64c534f443b42fb61a0902e18be6b11385fd44
parent64933337e3cb61ca555969a35ab68b477db34ee2 (diff)
[media] it913x-fe changes to power up and down of tuner
Currently the tuner is constantly powered causing these effects. 1. Remembering last tune channel causing corruptions of changing channel. 2. Causing corruption on other frontend. 3. Higher current in standby of demodulator with clock running. Power sequence now follows; Power Up Tuner on -> Frontend suspend off -> Tuner clk on Power Down Frontend suspend on -> Tuner clk off -> Tuner off Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/dvb/frontends/it913x-fe-priv.h10
-rw-r--r--drivers/media/dvb/frontends/it913x-fe.c27
2 files changed, 30 insertions, 7 deletions
diff --git a/drivers/media/dvb/frontends/it913x-fe-priv.h b/drivers/media/dvb/frontends/it913x-fe-priv.h
index 40e1d9b266e3..1c6fb4b66255 100644
--- a/drivers/media/dvb/frontends/it913x-fe-priv.h
+++ b/drivers/media/dvb/frontends/it913x-fe-priv.h
@@ -312,7 +312,15 @@ static struct it913xset it9137_set[] = {
312 {PRO_LINK, GPIOH5_EN, {0x01}, 0x01}, 312 {PRO_LINK, GPIOH5_EN, {0x01}, 0x01},
313 {PRO_LINK, GPIOH5_ON, {0x01}, 0x01}, 313 {PRO_LINK, GPIOH5_ON, {0x01}, 0x01},
314 {PRO_LINK, GPIOH5_O, {0x00}, 0x01}, 314 {PRO_LINK, GPIOH5_O, {0x00}, 0x01},
315 {PRO_LINK, GPIOH5_O, {0x01}, 0x01},/* ?, but enable */ 315 {PRO_LINK, GPIOH5_O, {0x01}, 0x01},
316 {0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */
317};
318
319static struct it913xset it9137_tuner_off[] = {
320 {PRO_DMOD, 0xfba8, {0x01}, 0x01}, /* Tuner Clock Off */
321 {PRO_DMOD, 0xec40, {0x00}, 0x01}, /* Power Down Tuner */
322 {PRO_DMOD, 0xec02, {0x3f, 0x1f, 0x3f, 0x3f}, 0x04},
323 {PRO_DMOD, 0xec3f, {0x01}, 0x01},
316 {0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */ 324 {0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */
317}; 325};
318 326
diff --git a/drivers/media/dvb/frontends/it913x-fe.c b/drivers/media/dvb/frontends/it913x-fe.c
index 02839a8b7b29..d4bd24eb4700 100644
--- a/drivers/media/dvb/frontends/it913x-fe.c
+++ b/drivers/media/dvb/frontends/it913x-fe.c
@@ -626,7 +626,7 @@ static int it913x_fe_suspend(struct it913x_fe_state *state)
626 for (i = 0; i < 128; i++) { 626 for (i = 0; i < 128; i++) {
627 ret = it913x_read_reg(state, SUSPEND_FLAG, &b, 1); 627 ret = it913x_read_reg(state, SUSPEND_FLAG, &b, 1);
628 if (ret < 0) 628 if (ret < 0)
629 return -EINVAL; 629 return -ENODEV;
630 if (b == 0) 630 if (b == 0)
631 break; 631 break;
632 632
@@ -634,18 +634,23 @@ static int it913x_fe_suspend(struct it913x_fe_state *state)
634 634
635 ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x8); 635 ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x8);
636 /* Turn LED off */ 636 /* Turn LED off */
637 ret = it913x_write_reg(state, PRO_LINK, GPIOH3_O, 0x0); 637 ret |= it913x_write_reg(state, PRO_LINK, GPIOH3_O, 0x0);
638 638
639 return 0; 639 ret |= it913x_fe_script_loader(state, it9137_tuner_off);
640
641 return (ret < 0) ? -ENODEV : 0;
640} 642}
641 643
644/* Power sequence */
645/* Power Up Tuner on -> Frontend suspend off -> Tuner clk on */
646/* Power Down Frontend suspend on -> Tuner clk off -> Tuner off */
647
642static int it913x_fe_sleep(struct dvb_frontend *fe) 648static int it913x_fe_sleep(struct dvb_frontend *fe)
643{ 649{
644 struct it913x_fe_state *state = fe->demodulator_priv; 650 struct it913x_fe_state *state = fe->demodulator_priv;
645 return it913x_fe_suspend(state); 651 return it913x_fe_suspend(state);
646} 652}
647 653
648
649static u32 compute_div(u32 a, u32 b, u32 x) 654static u32 compute_div(u32 a, u32 b, u32 x)
650{ 655{
651 u32 res = 0; 656 u32 res = 0;
@@ -738,11 +743,21 @@ static int it913x_fe_init(struct dvb_frontend *fe)
738{ 743{
739 struct it913x_fe_state *state = fe->demodulator_priv; 744 struct it913x_fe_state *state = fe->demodulator_priv;
740 int ret = 0; 745 int ret = 0;
746 /* Power Up Tuner - common all versions */
747 ret = it913x_write_reg(state, PRO_DMOD, 0xec40, 0x1);
741 748
742 it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x0); 749 ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x0);
743 750
744 ret |= it913x_fe_script_loader(state, init_1); 751 ret |= it913x_fe_script_loader(state, init_1);
745 752
753 switch (state->tuner_type) {
754 case IT9137:
755 ret |= it913x_write_reg(state, PRO_DMOD, 0xfba8, 0x0);
756 break;
757 default:
758 return -EINVAL;
759 }
760
746 return (ret < 0) ? -ENODEV : 0; 761 return (ret < 0) ? -ENODEV : 0;
747} 762}
748 763
@@ -820,5 +835,5 @@ static struct dvb_frontend_ops it913x_fe_ofdm_ops = {
820 835
821MODULE_DESCRIPTION("it913x Frontend and it9137 tuner"); 836MODULE_DESCRIPTION("it913x Frontend and it9137 tuner");
822MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com"); 837MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com");
823MODULE_VERSION("1.06"); 838MODULE_VERSION("1.07");
824MODULE_LICENSE("GPL"); 839MODULE_LICENSE("GPL");