[media] drx-j: Allow standard selection

ClearQAM is currently not working. Add support for it too.
Unlikely other ATSC tuners, though, this device will not
auto-detect between ATSC and ClearQAM. So, the delivery
system should be properly set.

Also, this frontend seems to also support DVB-C annex A/C. Add
experimental support for them.

Acked-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
This commit is contained in:
Mauro Carvalho Chehab 2014-01-19 12:08:36 -03:00
parent aafdbaa6cf
commit 96b43136b8
1 changed files with 27 additions and 2 deletions

View File

@ -188,7 +188,8 @@ static int drx39xxj_set_frontend(struct dvb_frontend *fe)
struct drx_channel channel; struct drx_channel channel;
int result; int result;
struct drxuio_data uio_data; struct drxuio_data uio_data;
struct drx_channel def_channel = { /* frequency */ 0, static const struct drx_channel def_channel = {
/* frequency */ 0,
/* bandwidth */ DRX_BANDWIDTH_6MHZ, /* bandwidth */ DRX_BANDWIDTH_6MHZ,
/* mirror */ DRX_MIRROR_NO, /* mirror */ DRX_MIRROR_NO,
/* constellation */ DRX_CONSTELLATION_AUTO, /* constellation */ DRX_CONSTELLATION_AUTO,
@ -204,6 +205,7 @@ static int drx39xxj_set_frontend(struct dvb_frontend *fe)
/* carrier */ DRX_CARRIER_UNKNOWN, /* carrier */ DRX_CARRIER_UNKNOWN,
/* frame mode */ DRX_FRAMEMODE_UNKNOWN /* frame mode */ DRX_FRAMEMODE_UNKNOWN
}; };
u32 constellation = DRX_CONSTELLATION_AUTO;
/* Bring the demod out of sleep */ /* Bring the demod out of sleep */
drx39xxj_set_powerstate(fe, 1); drx39xxj_set_powerstate(fe, 1);
@ -217,6 +219,29 @@ static int drx39xxj_set_frontend(struct dvb_frontend *fe)
fe->ops.i2c_gate_ctrl(fe, 0); fe->ops.i2c_gate_ctrl(fe, 0);
} }
switch (p->delivery_system) {
case SYS_ATSC:
standard = DRX_STANDARD_8VSB;
break;
case SYS_DVBC_ANNEX_B:
standard = DRX_STANDARD_ITU_B;
switch (p->modulation) {
case QAM_64:
constellation = DRX_CONSTELLATION_QAM64;
break;
case QAM_256:
constellation = DRX_CONSTELLATION_QAM256;
break;
default:
constellation = DRX_CONSTELLATION_AUTO;
break;
}
break;
default:
return -EINVAL;
}
if (standard != state->current_standard || state->powered_up == 0) { if (standard != state->current_standard || state->powered_up == 0) {
/* Set the standard (will be powered up if necessary */ /* Set the standard (will be powered up if necessary */
result = drx_ctrl(demod, DRX_CTRL_SET_STANDARD, &standard); result = drx_ctrl(demod, DRX_CTRL_SET_STANDARD, &standard);
@ -233,7 +258,7 @@ static int drx39xxj_set_frontend(struct dvb_frontend *fe)
channel = def_channel; channel = def_channel;
channel.frequency = p->frequency / 1000; channel.frequency = p->frequency / 1000;
channel.bandwidth = DRX_BANDWIDTH_6MHZ; channel.bandwidth = DRX_BANDWIDTH_6MHZ;
channel.constellation = DRX_CONSTELLATION_AUTO; channel.constellation = constellation;
/* program channel */ /* program channel */
result = drx_ctrl(demod, DRX_CTRL_SET_CHANNEL, &channel); result = drx_ctrl(demod, DRX_CTRL_SET_CHANNEL, &channel);