aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2014-04-11 19:35:27 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-04-23 08:52:22 -0400
commitbffab93c46434c99fcb27eb4e65af90a142f205c (patch)
treee1dad0a107e79284a990ae6d9b1170ce398c186f
parent192292403147877c7d5f737a3cc751ded397aef7 (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.c55
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:
66static int si2168_read_status(struct dvb_frontend *fe, fe_status_t *status) 66static 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
585static const struct dvb_frontend_ops si2168_ops = { 616static 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 |