diff options
-rw-r--r-- | drivers/media/dvb/frontends/stv090x.c | 211 |
1 files changed, 185 insertions, 26 deletions
diff --git a/drivers/media/dvb/frontends/stv090x.c b/drivers/media/dvb/frontends/stv090x.c index dba2c0407fd1..e26bfd765460 100644 --- a/drivers/media/dvb/frontends/stv090x.c +++ b/drivers/media/dvb/frontends/stv090x.c | |||
@@ -3846,6 +3846,7 @@ static int stv090x_sleep(struct dvb_frontend *fe) | |||
3846 | { | 3846 | { |
3847 | struct stv090x_state *state = fe->demodulator_priv; | 3847 | struct stv090x_state *state = fe->demodulator_priv; |
3848 | u32 reg; | 3848 | u32 reg; |
3849 | u8 full_standby = 0; | ||
3849 | 3850 | ||
3850 | if (stv090x_i2c_gate_ctrl(state, 1) < 0) | 3851 | if (stv090x_i2c_gate_ctrl(state, 1) < 0) |
3851 | goto err; | 3852 | goto err; |
@@ -3858,24 +3859,119 @@ static int stv090x_sleep(struct dvb_frontend *fe) | |||
3858 | if (stv090x_i2c_gate_ctrl(state, 0) < 0) | 3859 | if (stv090x_i2c_gate_ctrl(state, 0) < 0) |
3859 | goto err; | 3860 | goto err; |
3860 | 3861 | ||
3861 | dprintk(FE_DEBUG, 1, "Set %s to sleep", | 3862 | dprintk(FE_DEBUG, 1, "Set %s(%d) to sleep", |
3862 | state->device == STV0900 ? "STV0900" : "STV0903"); | 3863 | state->device == STV0900 ? "STV0900" : "STV0903", |
3864 | state->demod); | ||
3863 | 3865 | ||
3864 | reg = stv090x_read_reg(state, STV090x_SYNTCTRL); | 3866 | mutex_lock(&state->internal->demod_lock); |
3865 | STV090x_SETFIELD(reg, STANDBY_FIELD, 0x01); | ||
3866 | if (stv090x_write_reg(state, STV090x_SYNTCTRL, reg) < 0) | ||
3867 | goto err; | ||
3868 | 3867 | ||
3869 | reg = stv090x_read_reg(state, STV090x_TSTTNR1); | 3868 | switch (state->demod) { |
3870 | STV090x_SETFIELD(reg, ADC1_PON_FIELD, 0); | 3869 | case STV090x_DEMODULATOR_0: |
3871 | if (stv090x_write_reg(state, STV090x_TSTTNR1, reg) < 0) | 3870 | /* power off ADC 1 */ |
3872 | goto err; | 3871 | reg = stv090x_read_reg(state, STV090x_TSTTNR1); |
3872 | STV090x_SETFIELD(reg, ADC1_PON_FIELD, 0); | ||
3873 | if (stv090x_write_reg(state, STV090x_TSTTNR1, reg) < 0) | ||
3874 | goto err; | ||
3875 | /* power off DiSEqC 1 */ | ||
3876 | reg = stv090x_read_reg(state, STV090x_TSTTNR2); | ||
3877 | STV090x_SETFIELD(reg, DISEQC1_PON_FIELD, 0); | ||
3878 | if (stv090x_write_reg(state, STV090x_TSTTNR2, reg) < 0) | ||
3879 | goto err; | ||
3880 | |||
3881 | /* check whether path 2 is already sleeping, that is when | ||
3882 | ADC2 is off */ | ||
3883 | reg = stv090x_read_reg(state, STV090x_TSTTNR3); | ||
3884 | if (STV090x_GETFIELD(reg, ADC2_PON_FIELD) == 0) | ||
3885 | full_standby = 1; | ||
3886 | |||
3887 | /* stop clocks */ | ||
3888 | reg = stv090x_read_reg(state, STV090x_STOPCLK1); | ||
3889 | /* packet delineator 1 clock */ | ||
3890 | STV090x_SETFIELD(reg, STOP_CLKPKDT1_FIELD, 1); | ||
3891 | /* ADC 1 clock */ | ||
3892 | STV090x_SETFIELD(reg, STOP_CLKADCI1_FIELD, 1); | ||
3893 | /* FEC clock is shared between the two paths, only stop it | ||
3894 | when full standby is possible */ | ||
3895 | if (full_standby) | ||
3896 | STV090x_SETFIELD(reg, STOP_CLKFEC_FIELD, 1); | ||
3897 | if (stv090x_write_reg(state, STV090x_STOPCLK1, reg) < 0) | ||
3898 | goto err; | ||
3899 | reg = stv090x_read_reg(state, STV090x_STOPCLK2); | ||
3900 | /* sampling 1 clock */ | ||
3901 | STV090x_SETFIELD(reg, STOP_CLKSAMP1_FIELD, 1); | ||
3902 | /* viterbi 1 clock */ | ||
3903 | STV090x_SETFIELD(reg, STOP_CLKVIT1_FIELD, 1); | ||
3904 | /* TS clock is shared between the two paths, only stop it | ||
3905 | when full standby is possible */ | ||
3906 | if (full_standby) | ||
3907 | STV090x_SETFIELD(reg, STOP_CLKTS_FIELD, 1); | ||
3908 | if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) | ||
3909 | goto err; | ||
3910 | break; | ||
3873 | 3911 | ||
3912 | case STV090x_DEMODULATOR_1: | ||
3913 | /* power off ADC 2 */ | ||
3914 | reg = stv090x_read_reg(state, STV090x_TSTTNR3); | ||
3915 | STV090x_SETFIELD(reg, ADC2_PON_FIELD, 0); | ||
3916 | if (stv090x_write_reg(state, STV090x_TSTTNR3, reg) < 0) | ||
3917 | goto err; | ||
3918 | /* power off DiSEqC 2 */ | ||
3919 | reg = stv090x_read_reg(state, STV090x_TSTTNR4); | ||
3920 | STV090x_SETFIELD(reg, DISEQC2_PON_FIELD, 0); | ||
3921 | if (stv090x_write_reg(state, STV090x_TSTTNR4, reg) < 0) | ||
3922 | goto err; | ||
3923 | |||
3924 | /* check whether path 1 is already sleeping, that is when | ||
3925 | ADC1 is off */ | ||
3926 | reg = stv090x_read_reg(state, STV090x_TSTTNR1); | ||
3927 | if (STV090x_GETFIELD(reg, ADC1_PON_FIELD) == 0) | ||
3928 | full_standby = 1; | ||
3929 | |||
3930 | /* stop clocks */ | ||
3931 | reg = stv090x_read_reg(state, STV090x_STOPCLK1); | ||
3932 | /* packet delineator 2 clock */ | ||
3933 | STV090x_SETFIELD(reg, STOP_CLKPKDT2_FIELD, 1); | ||
3934 | /* ADC 2 clock */ | ||
3935 | STV090x_SETFIELD(reg, STOP_CLKADCI2_FIELD, 1); | ||
3936 | /* FEC clock is shared between the two paths, only stop it | ||
3937 | when full standby is possible */ | ||
3938 | if (full_standby) | ||
3939 | STV090x_SETFIELD(reg, STOP_CLKFEC_FIELD, 1); | ||
3940 | if (stv090x_write_reg(state, STV090x_STOPCLK1, reg) < 0) | ||
3941 | goto err; | ||
3942 | reg = stv090x_read_reg(state, STV090x_STOPCLK2); | ||
3943 | /* sampling 2 clock */ | ||
3944 | STV090x_SETFIELD(reg, STOP_CLKSAMP2_FIELD, 1); | ||
3945 | /* viterbi 2 clock */ | ||
3946 | STV090x_SETFIELD(reg, STOP_CLKVIT2_FIELD, 1); | ||
3947 | /* TS clock is shared between the two paths, only stop it | ||
3948 | when full standby is possible */ | ||
3949 | if (full_standby) | ||
3950 | STV090x_SETFIELD(reg, STOP_CLKTS_FIELD, 1); | ||
3951 | if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) | ||
3952 | goto err; | ||
3953 | break; | ||
3954 | |||
3955 | default: | ||
3956 | dprintk(FE_ERROR, 1, "Wrong demodulator!"); | ||
3957 | break; | ||
3958 | } | ||
3959 | |||
3960 | if (full_standby) { | ||
3961 | /* general power off */ | ||
3962 | reg = stv090x_read_reg(state, STV090x_SYNTCTRL); | ||
3963 | STV090x_SETFIELD(reg, STANDBY_FIELD, 0x01); | ||
3964 | if (stv090x_write_reg(state, STV090x_SYNTCTRL, reg) < 0) | ||
3965 | goto err; | ||
3966 | } | ||
3967 | |||
3968 | mutex_unlock(&state->internal->demod_lock); | ||
3874 | return 0; | 3969 | return 0; |
3875 | 3970 | ||
3876 | err_gateoff: | 3971 | err_gateoff: |
3877 | stv090x_i2c_gate_ctrl(state, 0); | 3972 | stv090x_i2c_gate_ctrl(state, 0); |
3878 | err: | 3973 | err: |
3974 | mutex_unlock(&state->internal->demod_lock); | ||
3879 | dprintk(FE_ERROR, 1, "I/O error"); | 3975 | dprintk(FE_ERROR, 1, "I/O error"); |
3880 | return -1; | 3976 | return -1; |
3881 | } | 3977 | } |
@@ -3885,21 +3981,94 @@ static int stv090x_wakeup(struct dvb_frontend *fe) | |||
3885 | struct stv090x_state *state = fe->demodulator_priv; | 3981 | struct stv090x_state *state = fe->demodulator_priv; |
3886 | u32 reg; | 3982 | u32 reg; |
3887 | 3983 | ||
3888 | dprintk(FE_DEBUG, 1, "Wake %s from standby", | 3984 | dprintk(FE_DEBUG, 1, "Wake %s(%d) from standby", |
3889 | state->device == STV0900 ? "STV0900" : "STV0903"); | 3985 | state->device == STV0900 ? "STV0900" : "STV0903", |
3986 | state->demod); | ||
3987 | |||
3988 | mutex_lock(&state->internal->demod_lock); | ||
3890 | 3989 | ||
3990 | /* general power on */ | ||
3891 | reg = stv090x_read_reg(state, STV090x_SYNTCTRL); | 3991 | reg = stv090x_read_reg(state, STV090x_SYNTCTRL); |
3892 | STV090x_SETFIELD(reg, STANDBY_FIELD, 0x00); | 3992 | STV090x_SETFIELD(reg, STANDBY_FIELD, 0x00); |
3893 | if (stv090x_write_reg(state, STV090x_SYNTCTRL, reg) < 0) | 3993 | if (stv090x_write_reg(state, STV090x_SYNTCTRL, reg) < 0) |
3894 | goto err; | 3994 | goto err; |
3895 | 3995 | ||
3896 | reg = stv090x_read_reg(state, STV090x_TSTTNR1); | 3996 | switch (state->demod) { |
3897 | STV090x_SETFIELD(reg, ADC1_PON_FIELD, 1); | 3997 | case STV090x_DEMODULATOR_0: |
3898 | if (stv090x_write_reg(state, STV090x_TSTTNR1, reg) < 0) | 3998 | /* power on ADC 1 */ |
3899 | goto err; | 3999 | reg = stv090x_read_reg(state, STV090x_TSTTNR1); |
4000 | STV090x_SETFIELD(reg, ADC1_PON_FIELD, 1); | ||
4001 | if (stv090x_write_reg(state, STV090x_TSTTNR1, reg) < 0) | ||
4002 | goto err; | ||
4003 | /* power on DiSEqC 1 */ | ||
4004 | reg = stv090x_read_reg(state, STV090x_TSTTNR2); | ||
4005 | STV090x_SETFIELD(reg, DISEQC1_PON_FIELD, 1); | ||
4006 | if (stv090x_write_reg(state, STV090x_TSTTNR2, reg) < 0) | ||
4007 | goto err; | ||
4008 | |||
4009 | /* activate clocks */ | ||
4010 | reg = stv090x_read_reg(state, STV090x_STOPCLK1); | ||
4011 | /* packet delineator 1 clock */ | ||
4012 | STV090x_SETFIELD(reg, STOP_CLKPKDT1_FIELD, 0); | ||
4013 | /* ADC 1 clock */ | ||
4014 | STV090x_SETFIELD(reg, STOP_CLKADCI1_FIELD, 0); | ||
4015 | /* FEC clock */ | ||
4016 | STV090x_SETFIELD(reg, STOP_CLKFEC_FIELD, 0); | ||
4017 | if (stv090x_write_reg(state, STV090x_STOPCLK1, reg) < 0) | ||
4018 | goto err; | ||
4019 | reg = stv090x_read_reg(state, STV090x_STOPCLK2); | ||
4020 | /* sampling 1 clock */ | ||
4021 | STV090x_SETFIELD(reg, STOP_CLKSAMP1_FIELD, 0); | ||
4022 | /* viterbi 1 clock */ | ||
4023 | STV090x_SETFIELD(reg, STOP_CLKVIT1_FIELD, 0); | ||
4024 | /* TS clock */ | ||
4025 | STV090x_SETFIELD(reg, STOP_CLKTS_FIELD, 0); | ||
4026 | if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) | ||
4027 | goto err; | ||
4028 | break; | ||
3900 | 4029 | ||
4030 | case STV090x_DEMODULATOR_1: | ||
4031 | /* power on ADC 2 */ | ||
4032 | reg = stv090x_read_reg(state, STV090x_TSTTNR3); | ||
4033 | STV090x_SETFIELD(reg, ADC2_PON_FIELD, 1); | ||
4034 | if (stv090x_write_reg(state, STV090x_TSTTNR3, reg) < 0) | ||
4035 | goto err; | ||
4036 | /* power on DiSEqC 2 */ | ||
4037 | reg = stv090x_read_reg(state, STV090x_TSTTNR4); | ||
4038 | STV090x_SETFIELD(reg, DISEQC2_PON_FIELD, 1); | ||
4039 | if (stv090x_write_reg(state, STV090x_TSTTNR4, reg) < 0) | ||
4040 | goto err; | ||
4041 | |||
4042 | /* activate clocks */ | ||
4043 | reg = stv090x_read_reg(state, STV090x_STOPCLK1); | ||
4044 | /* packet delineator 2 clock */ | ||
4045 | STV090x_SETFIELD(reg, STOP_CLKPKDT2_FIELD, 0); | ||
4046 | /* ADC 2 clock */ | ||
4047 | STV090x_SETFIELD(reg, STOP_CLKADCI2_FIELD, 0); | ||
4048 | /* FEC clock */ | ||
4049 | STV090x_SETFIELD(reg, STOP_CLKFEC_FIELD, 0); | ||
4050 | if (stv090x_write_reg(state, STV090x_STOPCLK1, reg) < 0) | ||
4051 | goto err; | ||
4052 | reg = stv090x_read_reg(state, STV090x_STOPCLK2); | ||
4053 | /* sampling 2 clock */ | ||
4054 | STV090x_SETFIELD(reg, STOP_CLKSAMP2_FIELD, 0); | ||
4055 | /* viterbi 2 clock */ | ||
4056 | STV090x_SETFIELD(reg, STOP_CLKVIT2_FIELD, 0); | ||
4057 | /* TS clock */ | ||
4058 | STV090x_SETFIELD(reg, STOP_CLKTS_FIELD, 0); | ||
4059 | if (stv090x_write_reg(state, STV090x_STOPCLK2, reg) < 0) | ||
4060 | goto err; | ||
4061 | break; | ||
4062 | |||
4063 | default: | ||
4064 | dprintk(FE_ERROR, 1, "Wrong demodulator!"); | ||
4065 | break; | ||
4066 | } | ||
4067 | |||
4068 | mutex_unlock(&state->internal->demod_lock); | ||
3901 | return 0; | 4069 | return 0; |
3902 | err: | 4070 | err: |
4071 | mutex_unlock(&state->internal->demod_lock); | ||
3903 | dprintk(FE_ERROR, 1, "I/O error"); | 4072 | dprintk(FE_ERROR, 1, "I/O error"); |
3904 | return -1; | 4073 | return -1; |
3905 | } | 4074 | } |
@@ -4622,20 +4791,10 @@ struct dvb_frontend *stv090x_attach(const struct stv090x_config *config, | |||
4622 | mutex_init(&state->internal->demod_lock); | 4791 | mutex_init(&state->internal->demod_lock); |
4623 | mutex_init(&state->internal->tuner_lock); | 4792 | mutex_init(&state->internal->tuner_lock); |
4624 | 4793 | ||
4625 | if (stv090x_sleep(&state->frontend) < 0) { | ||
4626 | dprintk(FE_ERROR, 1, "Error putting device to sleep"); | ||
4627 | goto error; | ||
4628 | } | ||
4629 | |||
4630 | if (stv090x_setup(&state->frontend) < 0) { | 4794 | if (stv090x_setup(&state->frontend) < 0) { |
4631 | dprintk(FE_ERROR, 1, "Error setting up device"); | 4795 | dprintk(FE_ERROR, 1, "Error setting up device"); |
4632 | goto error; | 4796 | goto error; |
4633 | } | 4797 | } |
4634 | if (stv090x_wakeup(&state->frontend) < 0) { | ||
4635 | dprintk(FE_ERROR, 1, "Error waking device"); | ||
4636 | goto error; | ||
4637 | } | ||
4638 | |||
4639 | dprintk(FE_ERROR, 1, "Attaching %s demodulator(%d) Cut=0x%02x", | 4798 | dprintk(FE_ERROR, 1, "Attaching %s demodulator(%d) Cut=0x%02x", |
4640 | state->device == STV0900 ? "STV0900" : "STV0903", | 4799 | state->device == STV0900 ? "STV0900" : "STV0903", |
4641 | demod, | 4800 | demod, |