diff options
author | Michael Krufky <mkrufky@linuxtv.org> | 2007-08-31 15:39:39 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-10-09 21:07:45 -0400 |
commit | 735f0b9af1748602bb7f3a8009c31cf5f133eec8 (patch) | |
tree | 101e80cb5bbea411baedc57954e38f45a90c5c66 | |
parent | 8fb3b9f7a9e0420150bf6cb8a3c20f45d372cce4 (diff) |
V4L/DVB (6137): tuner-simple: add get_rf_strength and improve status reading efficiency
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r-- | drivers/media/video/tuner-simple.c | 58 |
1 files changed, 36 insertions, 22 deletions
diff --git a/drivers/media/video/tuner-simple.c b/drivers/media/video/tuner-simple.c index 2dbd91c8cb64..7b93d3b1f4c6 100644 --- a/drivers/media/video/tuner-simple.c +++ b/drivers/media/video/tuner-simple.c | |||
@@ -102,7 +102,7 @@ struct tuner_simple_priv { | |||
102 | 102 | ||
103 | /* ---------------------------------------------------------------------- */ | 103 | /* ---------------------------------------------------------------------- */ |
104 | 104 | ||
105 | static int tuner_getstatus(struct dvb_frontend *fe) | 105 | static int tuner_read_status(struct dvb_frontend *fe) |
106 | { | 106 | { |
107 | struct tuner_simple_priv *priv = fe->tuner_priv; | 107 | struct tuner_simple_priv *priv = fe->tuner_priv; |
108 | unsigned char byte; | 108 | unsigned char byte; |
@@ -113,47 +113,60 @@ static int tuner_getstatus(struct dvb_frontend *fe) | |||
113 | return byte; | 113 | return byte; |
114 | } | 114 | } |
115 | 115 | ||
116 | static int tuner_signal(struct dvb_frontend *fe) | 116 | static inline int tuner_signal(const int status) |
117 | { | 117 | { |
118 | return (tuner_getstatus(fe) & TUNER_SIGNAL) << 13; | 118 | return (status & TUNER_SIGNAL) << 13; |
119 | } | 119 | } |
120 | 120 | ||
121 | static int tuner_stereo(struct dvb_frontend *fe) | 121 | static inline int tuner_stereo(const int type, const int status) |
122 | { | 122 | { |
123 | struct tuner_simple_priv *priv = fe->tuner_priv; | 123 | switch (type) { |
124 | |||
125 | int stereo, status; | ||
126 | |||
127 | status = tuner_getstatus(fe); | ||
128 | |||
129 | switch (priv->type) { | ||
130 | case TUNER_PHILIPS_FM1216ME_MK3: | 124 | case TUNER_PHILIPS_FM1216ME_MK3: |
131 | case TUNER_PHILIPS_FM1236_MK3: | 125 | case TUNER_PHILIPS_FM1236_MK3: |
132 | case TUNER_PHILIPS_FM1256_IH3: | 126 | case TUNER_PHILIPS_FM1256_IH3: |
133 | case TUNER_LG_NTSC_TAPE: | 127 | case TUNER_LG_NTSC_TAPE: |
134 | stereo = ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3); | 128 | return ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3); |
135 | break; | ||
136 | default: | 129 | default: |
137 | stereo = status & TUNER_STEREO; | 130 | return status & TUNER_STEREO; |
138 | } | 131 | } |
132 | } | ||
139 | 133 | ||
140 | return stereo; | 134 | static inline int tuner_islocked(const int status) |
135 | { | ||
136 | return (status & TUNER_FL); | ||
137 | } | ||
138 | |||
139 | static inline int tuner_afcstatus(const int status) | ||
140 | { | ||
141 | return (status & TUNER_AFC) - 2; | ||
141 | } | 142 | } |
142 | 143 | ||
143 | 144 | ||
144 | static int simple_get_status(struct dvb_frontend *fe, u32 *status) | 145 | static int simple_get_status(struct dvb_frontend *fe, u32 *status) |
145 | { | 146 | { |
146 | struct tuner_simple_priv *priv = fe->tuner_priv; | 147 | struct tuner_simple_priv *priv = fe->tuner_priv; |
147 | int signal = tuner_signal(fe); | 148 | int tuner_status = tuner_read_status(fe); |
148 | 149 | ||
149 | *status = 0; | 150 | *status = 0; |
150 | 151 | ||
151 | if (signal) | 152 | if (tuner_islocked(tuner_status)) |
152 | *status = TUNER_STATUS_LOCKED; | 153 | *status = TUNER_STATUS_LOCKED; |
153 | if (tuner_stereo(fe)) | 154 | if (tuner_stereo(priv->type, tuner_status)) |
154 | *status |= TUNER_STATUS_STEREO; | 155 | *status |= TUNER_STATUS_STEREO; |
155 | 156 | ||
156 | tuner_dbg("tuner-simple: Signal strength: %d\n", signal); | 157 | tuner_dbg("AFC Status: %d\n", tuner_afcstatus(tuner_status)); |
158 | |||
159 | return 0; | ||
160 | } | ||
161 | |||
162 | static int simple_get_rf_strength(struct dvb_frontend *fe, u16 *strength) | ||
163 | { | ||
164 | struct tuner_simple_priv *priv = fe->tuner_priv; | ||
165 | int signal = tuner_signal(tuner_read_status(fe)); | ||
166 | |||
167 | *strength = signal; | ||
168 | |||
169 | tuner_dbg("Signal strength: %d\n", signal); | ||
157 | 170 | ||
158 | return 0; | 171 | return 0; |
159 | } | 172 | } |
@@ -580,9 +593,10 @@ static int simple_get_frequency(struct dvb_frontend *fe, u32 *frequency) | |||
580 | 593 | ||
581 | static struct dvb_tuner_ops simple_tuner_ops = { | 594 | static struct dvb_tuner_ops simple_tuner_ops = { |
582 | .set_analog_params = simple_set_params, | 595 | .set_analog_params = simple_set_params, |
583 | .release = simple_release, | 596 | .release = simple_release, |
584 | .get_frequency = simple_get_frequency, | 597 | .get_frequency = simple_get_frequency, |
585 | .get_status = simple_get_status, | 598 | .get_status = simple_get_status, |
599 | .get_rf_strength = simple_get_rf_strength, | ||
586 | }; | 600 | }; |
587 | 601 | ||
588 | struct dvb_frontend *simple_tuner_attach(struct dvb_frontend *fe, | 602 | struct dvb_frontend *simple_tuner_attach(struct dvb_frontend *fe, |