V4L/DVB (3739): Add support for FE_GET_FRONTEND to or51132 frontend
authorTrent Piepho <xyzzy@speakeasy.org>
Thu, 6 Apr 2006 09:03:09 +0000 (06:03 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Sun, 25 Jun 2006 04:57:50 +0000 (01:57 -0300)
Adds the FE_GET_FRONTEND ioctl to the or51132 frontend.  Current modulation is
read from the hardware, while frequency is taken from the driver's state.

Signed-off-by: Trent Piepho <xyzzy@speakeasy.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/dvb/frontends/or51132.c

index 619856b076cdea1ea1f594c72b6f61bf40af7991..c25ec73440e73314648d0824259da50163e5cfa8 100644 (file)
@@ -400,6 +400,44 @@ static int or51132_set_parameters(struct dvb_frontend* fe,
        return 0;
 }
 
+static int or51132_get_parameters(struct dvb_frontend* fe,
+                                 struct dvb_frontend_parameters *param)
+{
+       struct or51132_state* state = fe->demodulator_priv;
+       u8 buf[2];
+
+       /* Receiver Status */
+       buf[0]=0x04;
+       buf[1]=0x00;
+       msleep(30); /* 30ms */
+       if (i2c_writebytes(state,state->config->demod_address,buf,2)) {
+               printk(KERN_WARNING "or51132: get_parameters write error\n");
+               return -EREMOTEIO;
+       }
+       msleep(30); /* 30ms */
+       if (i2c_readbytes(state,state->config->demod_address,buf,2)) {
+               printk(KERN_WARNING "or51132: get_parameters read error\n");
+               return -EREMOTEIO;
+       }
+       switch(buf[0]) {
+               case 0x06: param->u.vsb.modulation = VSB_8; break;
+               case 0x43: param->u.vsb.modulation = QAM_64; break;
+               case 0x45: param->u.vsb.modulation = QAM_256; break;
+               default:
+                       printk(KERN_WARNING "or51132: unknown status 0x%02x\n",
+                              buf[0]);
+                       return -EREMOTEIO;
+       }
+
+       /* FIXME: Read frequency from frontend, take AFC into account */
+       param->frequency = state->current_frequency;
+
+       /* FIXME: How to read inversion setting? Receiver 6 register? */
+       param->inversion = INVERSION_AUTO;
+
+       return 0;
+}
+
 static int or51132_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
        struct or51132_state* state = fe->demodulator_priv;
@@ -618,6 +656,7 @@ static struct dvb_frontend_ops or51132_ops = {
        .sleep = or51132_sleep,
 
        .set_frontend = or51132_set_parameters,
+       .get_frontend = or51132_get_parameters,
        .get_tune_settings = or51132_get_tune_settings,
 
        .read_status = or51132_read_status,