^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) Driver for ST STB6000 DVBS Silicon tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) Copyright (C) 2008 Igor M. Liplianin (liplianin@me.by)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/dvb/frontend.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "stb6000.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) static int debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define dprintk(args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) if (debug) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) printk(KERN_DEBUG "stb6000: " args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) struct stb6000_priv {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) /* i2c details */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) int i2c_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) struct i2c_adapter *i2c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) u32 frequency;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static void stb6000_release(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) kfree(fe->tuner_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) fe->tuner_priv = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static int stb6000_sleep(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct stb6000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) u8 buf[] = { 10, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct i2c_msg msg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .addr = priv->i2c_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .buf = buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .len = 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) dprintk("%s:\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) if (fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) fe->ops.i2c_gate_ctrl(fe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ret = i2c_transfer(priv->i2c, &msg, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) if (ret != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) dprintk("%s: i2c error\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) if (fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) fe->ops.i2c_gate_ctrl(fe, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) return (ret == 1) ? 0 : ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) static int stb6000_set_params(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct dtv_frontend_properties *p = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct stb6000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) unsigned int n, m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) u32 freq_mhz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) int bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) u8 buf[12];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) struct i2c_msg msg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .addr = priv->i2c_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) .buf = buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .len = 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) dprintk("%s:\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) freq_mhz = p->frequency / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) bandwidth = p->symbol_rate / 1000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (bandwidth > 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) bandwidth = 31;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) if ((freq_mhz > 949) && (freq_mhz < 2151)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) buf[0] = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) buf[1] = 0xac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) if (freq_mhz < 1950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) buf[1] = 0xaa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) if (freq_mhz < 1800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) buf[1] = 0xa8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) if (freq_mhz < 1650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) buf[1] = 0xa6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) if (freq_mhz < 1530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) buf[1] = 0xa5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) if (freq_mhz < 1470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) buf[1] = 0xa4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) if (freq_mhz < 1370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) buf[1] = 0xa2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) if (freq_mhz < 1300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) buf[1] = 0xa1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) if (freq_mhz < 1200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) buf[1] = 0xa0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) if (freq_mhz < 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) buf[1] = 0xbc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) if (freq_mhz < 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) buf[1] = 0xba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) if (freq_mhz < 1075) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) n = freq_mhz / 8; /* vco=lo*4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) m = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) n = freq_mhz / 16; /* vco=lo*2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) m = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) buf[2] = n >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) buf[3] = (unsigned char)(((n & 1) << 7) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) (m * freq_mhz - n * 16) | 0x60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) buf[4] = 0x04;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) buf[5] = 0x0e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) buf[6] = (unsigned char)(bandwidth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) buf[7] = 0xd8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) buf[8] = 0xd0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) buf[9] = 0x50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) buf[10] = 0xeb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) buf[11] = 0x4f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) if (fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) fe->ops.i2c_gate_ctrl(fe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) ret = i2c_transfer(priv->i2c, &msg, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) if (ret != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) dprintk("%s: i2c error\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) udelay(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) if (fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) fe->ops.i2c_gate_ctrl(fe, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) buf[0] = 0x07;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) buf[1] = 0xdf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) buf[2] = 0xd0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) buf[3] = 0x50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) buf[4] = 0xfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) msg.len = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) if (fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) fe->ops.i2c_gate_ctrl(fe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) ret = i2c_transfer(priv->i2c, &msg, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) if (ret != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) dprintk("%s: i2c error\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) udelay(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) if (fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) fe->ops.i2c_gate_ctrl(fe, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) priv->frequency = freq_mhz * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) return (ret == 1) ? 0 : ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) static int stb6000_get_frequency(struct dvb_frontend *fe, u32 *frequency)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) struct stb6000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) *frequency = priv->frequency;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static const struct dvb_tuner_ops stb6000_tuner_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) .info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) .name = "ST STB6000",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) .frequency_min_hz = 950 * MHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) .frequency_max_hz = 2150 * MHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) .release = stb6000_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) .sleep = stb6000_sleep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) .set_params = stb6000_set_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) .get_frequency = stb6000_get_frequency,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) struct dvb_frontend *stb6000_attach(struct dvb_frontend *fe, int addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct i2c_adapter *i2c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) struct stb6000_priv *priv = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) u8 b0[] = { 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) u8 b1[] = { 0, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) struct i2c_msg msg[2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) .addr = addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) .buf = b0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) .len = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) .addr = addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) .flags = I2C_M_RD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) .buf = b1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) .len = 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) dprintk("%s:\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) if (fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) fe->ops.i2c_gate_ctrl(fe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) /* is some i2c device here ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) ret = i2c_transfer(i2c, msg, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) if (fe->ops.i2c_gate_ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) fe->ops.i2c_gate_ctrl(fe, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) if (ret != 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) priv = kzalloc(sizeof(struct stb6000_priv), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) if (priv == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) priv->i2c_address = addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) priv->i2c = i2c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) memcpy(&fe->ops.tuner_ops, &stb6000_tuner_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) sizeof(struct dvb_tuner_ops));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) fe->tuner_priv = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) return fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) EXPORT_SYMBOL(stb6000_attach);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) module_param(debug, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) MODULE_DESCRIPTION("DVB STB6000 driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) MODULE_AUTHOR("Igor M. Liplianin <liplianin@me.by>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) MODULE_LICENSE("GPL");