V4L/DVB (9435): Add post process interfaces
authorManu Abraham <abraham.manu@gmail.com>
Tue, 30 Oct 2007 22:46:49 +0000 (19:46 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 29 Dec 2008 19:53:20 +0000 (17:53 -0200)
Signed-off-by: Manu Abraham <manu@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/frontends/stb0899_drv.c
drivers/media/dvb/frontends/stb0899_drv.h

index 9f5254aee39b6eddf29af8bff7f12daa145f6570..0b1d944766382a42fe3ef49cef78cec2e4e3e1de 100644 (file)
@@ -580,11 +580,35 @@ static void stb0899_set_mclk(struct stb0899_state *state, u32 Mclk)
        dprintk(verbose, FE_DEBUG, 1, "MasterCLOCK=%d", internal->master_clk);
 }
 
+static int stb0899_postproc(struct stb0899_state *state, u8 ctl, int enable)
+{
+       struct stb0899_config *config           = state->config;
+       struct stb0899_postproc *postproc       = config->postproc;
+
+       /* post process event */
+       if (postproc) {
+               if (enable) {
+                       if (postproc[STB0899_POSTPROC_GPIO_POWER].level == STB0899_GPIOPULLUP)
+                               stb0899_write_reg(state, postproc[ctl].gpio, 0x02);
+                       else
+                               stb0899_write_reg(state, postproc[ctl].gpio, 0x82);
+               } else {
+                       if (postproc[STB0899_POSTPROC_GPIO_POWER].level == STB0899_GPIOPULLUP)
+                               stb0899_write_reg(state, postproc[ctl].gpio, 0x82);
+                       else
+                               stb0899_write_reg(state, postproc[ctl].gpio, 0x02);
+               }
+       }
+       return 0;
+}
+
 static void stb0899_release(struct dvb_frontend *fe)
 {
        struct stb0899_state *state = fe->demodulator_priv;
 
        dprintk(verbose, FE_DEBUG, 1, "Release Frontend");
+       /* post process event */
+       stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 0);
        kfree(state);
 }
 
@@ -839,6 +863,9 @@ static int stb0899_sleep(struct dvb_frontend *fe)
        u8 reg;
 
        dprintk(verbose, FE_DEBUG, 1, "Going to Sleep .. (Really tired .. :-))");
+       /* post process event */
+       stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 0);
+
        return 0;
 }
 
@@ -855,6 +882,9 @@ static int stb0899_wakeup(struct dvb_frontend *fe)
        if ((rc = stb0899_write_reg(state, STB0899_STOPCLK2, 0x00)))
                return rc;
 
+       /* post process event */
+       stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 1);
+
        return 0;
 }
 
@@ -1050,6 +1080,8 @@ static int stb0899_read_status(struct dvb_frontend *fe, enum fe_status *status)
                                if (STB0899_GETFIELD(VITCURPUN, reg)) {
                                        dprintk(state->verbose, FE_DEBUG, 1, "--------> FE_HAS_VITERBI | FE_HAS_SYNC");
                                        *status |= FE_HAS_VITERBI | FE_HAS_SYNC;
+                                       /* post process event */
+                                       stb0899_postproc(state, STB0899_POSTPROC_GPIO_LOCK, 1);
                                }
                        }
                }
@@ -1079,6 +1111,8 @@ static int stb0899_read_status(struct dvb_frontend *fe, enum fe_status *status)
                                        *status |= FE_HAS_SYNC;
                                        dprintk(state->verbose, FE_DEBUG, 1,
                                                "Packet Delineator found SYNC ! -----> DVB-S2 FE_HAS_SYNC");
+                                       /* post process event */
+                                       stb0899_postproc(state, STB0899_POSTPROC_GPIO_LOCK, 1);
                                }
                        }
                }
index 1e28114febf36b2cc70ef803664b59ecf092a819..45136d9aaeb704864677a5c2f0da105636391e3e 100644 (file)
@@ -50,6 +50,47 @@ enum stb0899_inversion {
        IQ_SWAP_AUTO
 };
 
+#define STB0899_GPIO00                         0xf140
+#define STB0899_GPIO01                         0xf141
+#define STB0899_GPIO02                         0xf142
+#define STB0899_GPIO03                         0xf143
+#define STB0899_GPIO04                         0xf144
+#define STB0899_GPIO05                         0xf145
+#define STB0899_GPIO06                         0xf146
+#define STB0899_GPIO07                         0xf147
+#define STB0899_GPIO08                         0xf148
+#define STB0899_GPIO09                         0xf149
+#define STB0899_GPIO10                         0xf14a
+#define STB0899_GPIO11                         0xf14b
+#define STB0899_GPIO12                         0xf14c
+#define STB0899_GPIO13                         0xf14d
+#define STB0899_GPIO14                         0xf14e
+#define STB0899_GPIO15                         0xf14f
+#define STB0899_GPIO16                         0xf150
+#define STB0899_GPIO17                         0xf151
+#define STB0899_GPIO18                         0xf152
+#define STB0899_GPIO19                         0xf153
+#define STB0899_GPIO20                         0xf154
+
+#define STB0899_GPIOPULLUP                     0x01 /* Output device is connected to Vdd */
+#define STB0899_GPIOPULLDN                     0x00 /* Output device is connected to Vss */
+
+#define STB0899_POSTPROC_GPIO_POWER            0x00
+#define STB0899_POSTPROC_GPIO_LOCK             0x01
+
+/*
+ * Post process output configuration control
+ * 1. POWER ON/OFF             (index 0)
+ * 2. FE_HAS_LOCK/LOCK_LOSS    (index 1)
+ *
+ * @gpio       = one of the above listed GPIO's
+ * @level      = output state: pulled up or low
+ */
+struct stb0899_postproc {
+       u16     gpio;
+       u8      level;
+};
+
 struct stb0899_config {
        const struct stb0899_s1_reg     *init_dev;
        const struct stb0899_s2_reg     *init_s2_demod;
@@ -57,6 +98,8 @@ struct stb0899_config {
        const struct stb0899_s2_reg     *init_s2_fec;
        const struct stb0899_s1_reg     *init_tst;
 
+       const struct stb0899_postproc   *postproc;
+
        enum stb0899_inversion          inversion;
 
        u32     xtal_freq;