return -1;
 }
 
-int stv090x_set_gpio(struct dvb_frontend *fe, u8 gpio, u8 dir, u8 value,
-               u8 xor_value)
+static int stv090x_set_gpio(struct dvb_frontend *fe, u8 gpio, u8 dir,
+                           u8 value, u8 xor_value)
 {
        struct stv090x_state *state = fe->demodulator_priv;
        u8 reg = 0;
 
        return stv090x_write_reg(state, STV090x_GPIOxCFG(gpio), reg);
 }
-EXPORT_SYMBOL(stv090x_set_gpio);
 
 static struct dvb_frontend_ops stv090x_ops = {
        .delsys = { SYS_DVBS, SYS_DVBS2, SYS_DSS },
 };
 
 
-struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
+struct dvb_frontend *stv090x_attach(struct stv090x_config *config,
                                    struct i2c_adapter *i2c,
                                    enum stv090x_demodulator demod)
 {
        if (config->diseqc_envelope_mode)
                stv090x_send_diseqc_burst(&state->frontend, SEC_MINI_A);
 
+       config->set_gpio = stv090x_set_gpio;
+
        dprintk(FE_ERROR, 1, "Attaching %s demodulator(%d) Cut=0x%02x",
               state->device == STV0900 ? "STV0900" : "STV0903",
               demod,
 
        int (*tuner_set_refclk)  (struct dvb_frontend *fe, u32 refclk);
        int (*tuner_get_status) (struct dvb_frontend *fe, u32 *status);
        void (*tuner_i2c_lock) (struct dvb_frontend *fe, int lock);
+
+       /* dir = 0 -> output, dir = 1 -> input/open-drain */
+       int (*set_gpio)(struct dvb_frontend *fe, u8 gpio, u8 dir, u8 value,
+                        u8 xor_value);
 };
 
 #if IS_ENABLED(CONFIG_DVB_STV090x)
 
-extern struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
+extern struct dvb_frontend *stv090x_attach(struct stv090x_config *config,
                                           struct i2c_adapter *i2c,
                                           enum stv090x_demodulator demod);
 
-/* dir = 0 -> output, dir = 1 -> input/open-drain */
-extern int stv090x_set_gpio(struct dvb_frontend *fe, u8 gpio,
-               u8 dir, u8 value, u8 xor_value);
-
 #else
 
 static inline struct dvb_frontend *stv090x_attach(const struct stv090x_config *config,
        return NULL;
 }
 
-static inline int stv090x_set_gpio(struct dvb_frontend *fe, u8 gpio,
-               u8 opd, u8 value, u8 xor_value)
-{
-       printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
-       return -ENODEV;
-}
 #endif /* CONFIG_DVB_STV090x */
 
 #endif /* __STV090x_H */
 
        return 0;
 }
 
+static struct stv090x_config technisat_usb2_stv090x_config;
+
 /* frontend attach */
 static int technisat_usb2_set_voltage(struct dvb_frontend *fe,
                fe_sec_voltage_t voltage)
        }
 
        for (i = 0; i < 3; i++)
-               if (stv090x_set_gpio(fe, i+2, 0, gpio[i], 0) != 0)
+               if (technisat_usb2_stv090x_config.set_gpio(fe, i+2, 0,
+                                                          gpio[i], 0) != 0)
                        return -EREMOTEIO;
        return 0;
 }