diff options
author | Antti Palosaari <crope@iki.fi> | 2014-04-11 19:35:27 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-04-23 08:52:22 -0400 |
commit | bffab93c46434c99fcb27eb4e65af90a142f205c (patch) | |
tree | e1dad0a107e79284a990ae6d9b1170ce398c186f | |
parent | 192292403147877c7d5f737a3cc751ded397aef7 (diff) |
[media] si2168: add support for DVB-T2
Add support for DVB-T2.
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r-- | drivers/media/dvb-frontends/si2168.c | 55 |
1 files changed, 43 insertions, 12 deletions
diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c index eef4e456548d..4f3efbef123e 100644 --- a/drivers/media/dvb-frontends/si2168.c +++ b/drivers/media/dvb-frontends/si2168.c | |||
@@ -66,6 +66,7 @@ err: | |||
66 | static int si2168_read_status(struct dvb_frontend *fe, fe_status_t *status) | 66 | static int si2168_read_status(struct dvb_frontend *fe, fe_status_t *status) |
67 | { | 67 | { |
68 | struct si2168 *s = fe->demodulator_priv; | 68 | struct si2168 *s = fe->demodulator_priv; |
69 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
69 | int ret; | 70 | int ret; |
70 | struct si2168_cmd cmd; | 71 | struct si2168_cmd cmd; |
71 | 72 | ||
@@ -76,10 +77,24 @@ static int si2168_read_status(struct dvb_frontend *fe, fe_status_t *status) | |||
76 | goto err; | 77 | goto err; |
77 | } | 78 | } |
78 | 79 | ||
79 | cmd.args[0] = 0xa0; | 80 | switch (c->delivery_system) { |
80 | cmd.args[1] = 0x01; | 81 | case SYS_DVBT: |
81 | cmd.wlen = 2; | 82 | cmd.args[0] = 0xa0; |
82 | cmd.rlen = 13; | 83 | cmd.args[1] = 0x01; |
84 | cmd.wlen = 2; | ||
85 | cmd.rlen = 13; | ||
86 | break; | ||
87 | case SYS_DVBT2: | ||
88 | cmd.args[0] = 0x50; | ||
89 | cmd.args[1] = 0x01; | ||
90 | cmd.wlen = 2; | ||
91 | cmd.rlen = 14; | ||
92 | break; | ||
93 | default: | ||
94 | ret = -EINVAL; | ||
95 | goto err; | ||
96 | } | ||
97 | |||
83 | ret = si2168_cmd_execute(s, &cmd); | 98 | ret = si2168_cmd_execute(s, &cmd); |
84 | if (ret) | 99 | if (ret) |
85 | goto err; | 100 | goto err; |
@@ -125,7 +140,7 @@ static int si2168_set_frontend(struct dvb_frontend *fe) | |||
125 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | 140 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; |
126 | int ret; | 141 | int ret; |
127 | struct si2168_cmd cmd; | 142 | struct si2168_cmd cmd; |
128 | u8 bandwidth; | 143 | u8 bandwidth, delivery_system; |
129 | 144 | ||
130 | dev_dbg(&s->client->dev, | 145 | dev_dbg(&s->client->dev, |
131 | "%s: delivery_system=%u modulation=%u frequency=%u bandwidth_hz=%u symbol_rate=%u inversion=%u\n", | 146 | "%s: delivery_system=%u modulation=%u frequency=%u bandwidth_hz=%u symbol_rate=%u inversion=%u\n", |
@@ -138,18 +153,30 @@ static int si2168_set_frontend(struct dvb_frontend *fe) | |||
138 | goto err; | 153 | goto err; |
139 | } | 154 | } |
140 | 155 | ||
156 | switch (c->delivery_system) { | ||
157 | case SYS_DVBT: | ||
158 | delivery_system = 0x20; | ||
159 | break; | ||
160 | case SYS_DVBT2: | ||
161 | delivery_system = 0x70; | ||
162 | break; | ||
163 | default: | ||
164 | ret = -EINVAL; | ||
165 | goto err; | ||
166 | } | ||
167 | |||
141 | switch (c->bandwidth_hz) { | 168 | switch (c->bandwidth_hz) { |
142 | case 5000000: | 169 | case 5000000: |
143 | bandwidth = 0x25; | 170 | bandwidth = 0x05; |
144 | break; | 171 | break; |
145 | case 6000000: | 172 | case 6000000: |
146 | bandwidth = 0x26; | 173 | bandwidth = 0x06; |
147 | break; | 174 | break; |
148 | case 7000000: | 175 | case 7000000: |
149 | bandwidth = 0x27; | 176 | bandwidth = 0x07; |
150 | break; | 177 | break; |
151 | case 8000000: | 178 | case 8000000: |
152 | bandwidth = 0x28; | 179 | bandwidth = 0x08; |
153 | break; | 180 | break; |
154 | default: | 181 | default: |
155 | ret = -EINVAL; | 182 | ret = -EINVAL; |
@@ -170,7 +197,11 @@ static int si2168_set_frontend(struct dvb_frontend *fe) | |||
170 | if (ret) | 197 | if (ret) |
171 | goto err; | 198 | goto err; |
172 | 199 | ||
173 | memcpy(cmd.args, "\x89\x21\x06\x11\xff\x98", 6); | 200 | /* that has no big effect */ |
201 | if (c->delivery_system == SYS_DVBT) | ||
202 | memcpy(cmd.args, "\x89\x21\x06\x11\xff\x98", 6); | ||
203 | else if (c->delivery_system == SYS_DVBT2) | ||
204 | memcpy(cmd.args, "\x89\x21\x06\x11\x89\x20", 6); | ||
174 | cmd.wlen = 6; | 205 | cmd.wlen = 6; |
175 | cmd.rlen = 3; | 206 | cmd.rlen = 3; |
176 | ret = si2168_cmd_execute(s, &cmd); | 207 | ret = si2168_cmd_execute(s, &cmd); |
@@ -241,7 +272,7 @@ static int si2168_set_frontend(struct dvb_frontend *fe) | |||
241 | goto err; | 272 | goto err; |
242 | 273 | ||
243 | memcpy(cmd.args, "\x14\x00\x0a\x10\x00\x00", 6); | 274 | memcpy(cmd.args, "\x14\x00\x0a\x10\x00\x00", 6); |
244 | cmd.args[4] = bandwidth; | 275 | cmd.args[4] = delivery_system | bandwidth; |
245 | cmd.wlen = 6; | 276 | cmd.wlen = 6; |
246 | cmd.rlen = 1; | 277 | cmd.rlen = 1; |
247 | ret = si2168_cmd_execute(s, &cmd); | 278 | ret = si2168_cmd_execute(s, &cmd); |
@@ -583,7 +614,7 @@ static int si2168_deselect(struct i2c_adapter *adap, void *mux_priv, u32 chan) | |||
583 | } | 614 | } |
584 | 615 | ||
585 | static const struct dvb_frontend_ops si2168_ops = { | 616 | static const struct dvb_frontend_ops si2168_ops = { |
586 | .delsys = {SYS_DVBT}, | 617 | .delsys = {SYS_DVBT, SYS_DVBT2}, |
587 | .info = { | 618 | .info = { |
588 | .name = "Silicon Labs Si2168", | 619 | .name = "Silicon Labs Si2168", |
589 | .caps = FE_CAN_FEC_1_2 | | 620 | .caps = FE_CAN_FEC_1_2 | |