]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
[media] dvb: LNA implementation changes
authorAntti Palosaari <crope@iki.fi>
Wed, 3 Oct 2012 07:28:56 +0000 (04:28 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 7 Oct 2012 13:27:49 +0000 (10:27 -0300)
* use dvb property cache
* implement get (thus API minor++)
* PCTV 290e: 1=LNA ON, all the other values LNA OFF
  Also fix PCTV 290e LNA comment, it is disabled by default
Hans and Mauro proposed use of cache implementation of get as they
were planning to extend LNA usage for analog side too.

Reported-by: Hans Verkuil <hverkuil@xs4all.nl>
Reported-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Antti Palosaari <crope@iki.fi>
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb-core/dvb_frontend.c
drivers/media/dvb-core/dvb_frontend.h
drivers/media/usb/em28xx/em28xx-dvb.c
include/linux/dvb/version.h

index 41af996c413f8957e14c562fcd7fe07097015a20..7e92793260f0deffbf6bdb0a3024a95f3bf59ff5 100644 (file)
@@ -966,6 +966,8 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
                break;
        }
 
+       c->lna = LNA_AUTO;
+
        return 0;
 }
 
@@ -1054,6 +1056,8 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
        _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_B, 0, 0),
        _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_C, 0, 0),
        _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_D, 0, 0),
+
+       _DTV_CMD(DTV_LNA, 0, 0),
 };
 
 static void dtv_property_dump(struct dvb_frontend *fe, struct dtv_property *tvp)
@@ -1440,6 +1444,10 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
                tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_d;
                break;
 
+       case DTV_LNA:
+               tvp->u.data = c->lna;
+               break;
+
        default:
                return -EINVAL;
        }
@@ -1731,10 +1739,6 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
        case DTV_INTERLEAVING:
                c->interleaving = tvp->u.data;
                break;
-       case DTV_LNA:
-               if (fe->ops.set_lna)
-                       r = fe->ops.set_lna(fe, tvp->u.data);
-               break;
 
        /* ISDB-T Support here */
        case DTV_ISDBT_PARTIAL_RECEPTION:
@@ -1806,6 +1810,12 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
                fe->dtv_property_cache.atscmh_rs_frame_ensemble = tvp->u.data;
                break;
 
+       case DTV_LNA:
+               c->lna = tvp->u.data;
+               if (fe->ops.set_lna)
+                       r = fe->ops.set_lna(fe);
+               break;
+
        default:
                return -EINVAL;
        }
index 44a445cee74f53b2fe5aa010323bd09308f293b1..97112cd88a177f4ad66fafa8bd66e540aaf86dcf 100644 (file)
@@ -303,7 +303,7 @@ struct dvb_frontend_ops {
        int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
        int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
        int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire);
-       int (*set_lna)(struct dvb_frontend *, int);
+       int (*set_lna)(struct dvb_frontend *);
 
        /* These callbacks are for devices that implement their own
         * tuning algorithms, rather than a simple swzigzag
@@ -391,6 +391,8 @@ struct dtv_frontend_properties {
        u8                      atscmh_sccc_code_mode_b;
        u8                      atscmh_sccc_code_mode_c;
        u8                      atscmh_sccc_code_mode_d;
+
+       u32                     lna;
 };
 
 struct dvb_frontend {
index 913e5227897a3c4b68a7ad51ec254c7bb51d41e0..13ae821949e9f5f3007aaf77554e63e1551cc28e 100644 (file)
@@ -574,18 +574,19 @@ static void pctv_520e_init(struct em28xx *dev)
                i2c_master_send(&dev->i2c_client, regs[i].r, regs[i].len);
 };
 
-static int em28xx_pctv_290e_set_lna(struct dvb_frontend *fe, int val)
+static int em28xx_pctv_290e_set_lna(struct dvb_frontend *fe)
 {
+       struct dtv_frontend_properties *c = &fe->dtv_property_cache;
        struct em28xx *dev = fe->dvb->priv;
 #ifdef CONFIG_GPIOLIB
        struct em28xx_dvb *dvb = dev->dvb;
        int ret;
        unsigned long flags;
 
-       if (val)
-               flags = GPIOF_OUT_INIT_LOW;
+       if (c->lna == 1)
+               flags = GPIOF_OUT_INIT_HIGH; /* enable LNA */
        else
-               flags = GPIOF_OUT_INIT_HIGH;
+               flags = GPIOF_OUT_INIT_LOW; /* disable LNA */
 
        ret = gpio_request_one(dvb->lna_gpio, flags, NULL);
        if (ret)
@@ -595,8 +596,8 @@ static int em28xx_pctv_290e_set_lna(struct dvb_frontend *fe, int val)
 
        return ret;
 #else
-       dev_warn(&dev->udev->dev, "%s: LNA control is disabled\n",
-                       KBUILD_MODNAME);
+       dev_warn(&dev->udev->dev, "%s: LNA control is disabled (lna=%u)\n",
+                       KBUILD_MODNAME, c->lna);
        return 0;
 #endif
 }
index 20e5eac2ffd3f70688e35b7964fbdc0e172e8c4a..827cce7e33e330510c012e9857c40a77ea13b106 100644 (file)
@@ -24,6 +24,6 @@
 #define _DVBVERSION_H_
 
 #define DVB_API_VERSION 5
-#define DVB_API_VERSION_MINOR 8
+#define DVB_API_VERSION_MINOR 9
 
 #endif /*_DVBVERSION_H_*/