^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* DVB USB compliant linux driver for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * DM04/QQBOX DVB-S USB BOX LME2510C + SHARP:BS2F7HZ7395
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * LME2510C + LG TDQY-P001F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * LME2510C + BS2F7HZ0194
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * LME2510 + LG TDQY-P001F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * LME2510 + BS2F7HZ0194
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * MVB7395 (LME2510C+SHARP:BS2F7HZ7395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * SHARP:BS2F7HZ7395 = (STV0288+Sharp IX2505V)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * MV001F (LME2510+LGTDQY-P001F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * LG TDQY - P001F =(TDA8263 + TDA10086H)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * MVB0001F (LME2510C+LGTDQT-P001F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * MV0194 (LME2510+SHARP:BS2F7HZ0194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * SHARP:BS2F7HZ0194 = (STV0299+IX2410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * MVB0194 (LME2510C+SHARP0194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * LME2510C + M88RS2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * For firmware see Documentation/admin-guide/media/lmedm04.rst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * I2C addresses:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * 0xd0 - STV0288 - Demodulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * 0xc0 - Sharp IX2505V - Tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * --
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * 0x1c - TDA10086 - Demodulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * 0xc0 - TDA8263 - Tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * --
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * 0xd0 - STV0299 - Demodulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * 0xc0 - IX2410 - Tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * VID = 3344 PID LME2510=1122 LME2510C=1120
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * Copyright (C) 2010 Malcolm Priestley (tvboxspy@gmail.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * LME2510(C)(C) Leaguerme (Shenzhen) MicroElectronics Co., Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * see Documentation/driver-api/media/drivers/dvb-usb.rst for more information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * Known Issues :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * LME2510: Non Intel USB chipsets fail to maintain High Speed on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * Boot or Hot Plug.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * QQbox suffers from noise on LNB voltage.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * LME2510: SHARP:BS2F7HZ0194(MV0194) cannot cold reset and share system
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * with other tuners. After a cold reset streaming will not start.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * M88RS2000 suffers from loss of lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define DVB_USB_LOG_PREFIX "LME2510(C)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #include <linux/usb/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #include <media/rc-core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #include "dvb_usb.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #include "lmedm04.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #include "tda826x.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #include "tda10086.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #include "stv0288.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #include "ix2505v.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #include "stv0299.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #include "dvb-pll.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #include "z0194a.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #include "m88rs2000.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #include "ts2020.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define LME2510_C_S7395 "dvb-usb-lme2510c-s7395.fw";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define LME2510_C_LG "dvb-usb-lme2510c-lg.fw";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define LME2510_C_S0194 "dvb-usb-lme2510c-s0194.fw";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define LME2510_C_RS2000 "dvb-usb-lme2510c-rs2000.fw";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define LME2510_LG "dvb-usb-lme2510-lg.fw";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define LME2510_S0194 "dvb-usb-lme2510-s0194.fw";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /* debug */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) static int dvb_usb_lme2510_debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define lme_debug(var, level, args...) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) if ((var >= level)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) pr_debug(DVB_USB_LOG_PREFIX": " args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define deb_info(level, args...) lme_debug(dvb_usb_lme2510_debug, level, args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define debug_data_snipet(level, name, p) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) deb_info(level, name" (%8phN)", p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define info(args...) pr_info(DVB_USB_LOG_PREFIX": "args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) module_param_named(debug, dvb_usb_lme2510_debug, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able)).");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) static int dvb_usb_lme2510_firmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) module_param_named(firmware, dvb_usb_lme2510_firmware, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) MODULE_PARM_DESC(firmware, "set default firmware 0=Sharp7395 1=LG");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) static int pid_filter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) module_param_named(pid, pid_filter, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) MODULE_PARM_DESC(pid, "set default 0=default 1=off 2=on");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define TUNER_DEFAULT 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define TUNER_LG 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define TUNER_S7395 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define TUNER_S0194 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define TUNER_RS2000 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) struct lme2510_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) unsigned long int_urb_due;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) enum fe_status lock_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) u8 id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) u8 tuner_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) u8 signal_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) u8 signal_sn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) u8 time_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) u8 i2c_talk_onoff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) u8 i2c_gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) u8 i2c_tuner_gate_w;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) u8 i2c_tuner_gate_r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) u8 i2c_tuner_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) u8 stream_on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) u8 pid_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) u8 pid_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) u8 int_buffer[128];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) struct urb *lme_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) u8 usb_buffer[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* Frontend original calls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) int (*fe_read_status)(struct dvb_frontend *, enum fe_status *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) int (*fe_read_signal_strength)(struct dvb_frontend *, u16 *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) int (*fe_read_snr)(struct dvb_frontend *, u16 *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) int (*fe_read_ber)(struct dvb_frontend *, u32 *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) int (*fe_read_ucblocks)(struct dvb_frontend *, u32 *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) int (*fe_set_voltage)(struct dvb_frontend *, enum fe_sec_voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) u8 dvb_usb_lme2510_firmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) static int lme2510_usb_talk(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) u8 *wbuf, int wlen, u8 *rbuf, int rlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) struct lme2510_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) if (max(wlen, rlen) > sizeof(st->usb_buffer))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) ret = mutex_lock_interruptible(&d->usb_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) memcpy(st->usb_buffer, wbuf, wlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) ret = dvb_usbv2_generic_rw_locked(d, st->usb_buffer, wlen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) st->usb_buffer, rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) if (rlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) memcpy(rbuf, st->usb_buffer, rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) mutex_unlock(&d->usb_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) static int lme2510_stream_restart(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) struct lme2510_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) u8 all_pids[] = LME_ALL_PIDS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) u8 stream_on[] = LME_ST_ON_W;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) u8 rbuff[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) if (st->pid_off)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) lme2510_usb_talk(d, all_pids, sizeof(all_pids),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) rbuff, sizeof(rbuff));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /*Restart Stream Command*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) return lme2510_usb_talk(d, stream_on, sizeof(stream_on),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) rbuff, sizeof(rbuff));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) static int lme2510_enable_pid(struct dvb_usb_device *d, u8 index, u16 pid_out)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) struct lme2510_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) static u8 pid_buff[] = LME_ZERO_PID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) static u8 rbuf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) u8 pid_no = index * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) u8 pid_len = pid_no + 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) deb_info(1, "PID Setting Pid %04x", pid_out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) if (st->pid_size == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) ret |= lme2510_stream_restart(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) pid_buff[2] = pid_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) pid_buff[3] = (u8)pid_out & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) pid_buff[4] = pid_no + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) pid_buff[5] = (u8)(pid_out >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) if (pid_len > st->pid_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) st->pid_size = pid_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) pid_buff[7] = 0x80 + st->pid_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) ret |= lme2510_usb_talk(d, pid_buff ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) sizeof(pid_buff) , rbuf, sizeof(rbuf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) if (st->stream_on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) ret |= lme2510_stream_restart(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) /* Convert range from 0x00-0xff to 0x0000-0xffff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) #define reg_to_16bits(x) ((x) | ((x) << 8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) static void lme2510_update_stats(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) struct lme2510_state *st = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct dvb_frontend *fe = adap->fe[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) struct dtv_frontend_properties *c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) u32 s_tmp = 0, c_tmp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) if (!fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) c = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) c->block_count.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) c->block_error.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) c->post_bit_count.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) c->post_bit_error.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) if (st->i2c_talk_onoff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) c->strength.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) c->cnr.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) switch (st->tuner_config) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) case TUNER_LG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) s_tmp = reg_to_16bits(0xff - st->signal_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) c_tmp = reg_to_16bits(0xff - st->signal_sn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) case TUNER_S7395:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) case TUNER_S0194:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) s_tmp = 0xffff - (((st->signal_level * 2) << 8) * 5 / 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) c_tmp = reg_to_16bits((0xff - st->signal_sn - 0xa1) * 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) case TUNER_RS2000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) s_tmp = reg_to_16bits(st->signal_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) c_tmp = reg_to_16bits(st->signal_sn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) c->strength.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) c->strength.stat[0].scale = FE_SCALE_RELATIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) c->strength.stat[0].uvalue = (u64)s_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) c->cnr.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) c->cnr.stat[0].scale = FE_SCALE_RELATIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) c->cnr.stat[0].uvalue = (u64)c_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) static void lme2510_int_response(struct urb *lme_urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) struct dvb_usb_adapter *adap = lme_urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) struct lme2510_state *st = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) u8 *ibuf, *rbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) int i = 0, offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) u32 key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) u8 signal_lock = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) switch (lme_urb->status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) case -ETIMEDOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) case -ECONNRESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) case -ENOENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) case -ESHUTDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) info("Error %x", lme_urb->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) rbuf = (u8 *) lme_urb->transfer_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) offset = ((lme_urb->actual_length/8) > 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) ? 4 : (lme_urb->actual_length/8) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) for (i = 0; i < offset; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) ibuf = (u8 *)&rbuf[i*8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) deb_info(5, "INT O/S C =%02x C/O=%02x Type =%02x%02x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) offset, i, ibuf[0], ibuf[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) switch (ibuf[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) case 0xaa:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) debug_data_snipet(1, "INT Remote data snippet", ibuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) if (!adap_to_d(adap)->rc_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) key = RC_SCANCODE_NEC32(ibuf[2] << 24 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) ibuf[3] << 16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) ibuf[4] << 8 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) ibuf[5]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) deb_info(1, "INT Key = 0x%08x", key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) rc_keydown(adap_to_d(adap)->rc_dev, RC_PROTO_NEC32, key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) case 0xbb:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) switch (st->tuner_config) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) case TUNER_LG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) signal_lock = ibuf[2] & BIT(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) st->signal_level = ibuf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) st->signal_sn = ibuf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) st->time_key = ibuf[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) case TUNER_S7395:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) case TUNER_S0194:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) /* Tweak for earlier firmware*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) if (ibuf[1] == 0x03) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) signal_lock = ibuf[2] & BIT(4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) st->signal_level = ibuf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) st->signal_sn = ibuf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) st->signal_level = ibuf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) st->signal_sn = ibuf[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) case TUNER_RS2000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) signal_lock = ibuf[2] & 0xee;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) st->signal_level = ibuf[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) st->signal_sn = ibuf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) st->time_key = ibuf[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) /* Interrupt will also throw just BIT 0 as lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) signal_lock |= ibuf[2] & BIT(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) if (!signal_lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) st->lock_status &= ~FE_HAS_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) lme2510_update_stats(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) debug_data_snipet(5, "INT Remote data snippet in", ibuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) case 0xcc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) debug_data_snipet(1, "INT Control data snippet", ibuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) debug_data_snipet(1, "INT Unknown data snippet", ibuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) usb_submit_urb(lme_urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) /* Interrupt urb is due every 48 msecs while streaming the buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) * stores up to 4 periods if missed. Allow 200 msec for next interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) st->int_urb_due = jiffies + msecs_to_jiffies(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) static int lme2510_int_read(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) struct lme2510_state *lme_int = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) struct usb_host_endpoint *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) lme_int->lme_urb = usb_alloc_urb(0, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) if (lme_int->lme_urb == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) usb_fill_int_urb(lme_int->lme_urb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) usb_rcvintpipe(d->udev, 0xa),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) lme_int->int_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) sizeof(lme_int->int_buffer),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) lme2510_int_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) adap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) /* Quirk of pipe reporting PIPE_BULK but behaves as interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) ep = usb_pipe_endpoint(d->udev, lme_int->lme_urb->pipe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) if (usb_endpoint_type(&ep->desc) == USB_ENDPOINT_XFER_BULK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) lme_int->lme_urb->pipe = usb_rcvbulkpipe(d->udev, 0xa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) usb_submit_urb(lme_int->lme_urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) info("INT Interrupt Service Started");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) static int lme2510_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) struct lme2510_state *st = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) static u8 clear_pid_reg[] = LME_ALL_PIDS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) static u8 rbuf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) deb_info(1, "PID Clearing Filter");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) mutex_lock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) if (!onoff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) ret |= lme2510_usb_talk(d, clear_pid_reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) sizeof(clear_pid_reg), rbuf, sizeof(rbuf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) st->pid_off = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) st->pid_off = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) st->pid_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) mutex_unlock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) static int lme2510_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) deb_info(3, "%s PID=%04x Index=%04x onoff=%02x", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) pid, index, onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) if (onoff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) mutex_lock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) ret |= lme2510_enable_pid(d, index, pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) mutex_unlock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) static int lme2510_return_status(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) u8 *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) data = kzalloc(6, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 0x06, 0x80, 0x0302, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) data, 0x6, 200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) if (ret != 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) ret = data[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) info("Firmware Status: %6ph", data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) kfree(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) static int lme2510_msg(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) u8 *wbuf, int wlen, u8 *rbuf, int rlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) struct lme2510_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) st->i2c_talk_onoff = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) return lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) static int lme2510_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) int num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) struct dvb_usb_device *d = i2c_get_adapdata(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) struct lme2510_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) static u8 obuf[64], ibuf[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) int i, read, read_o;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) u16 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) u8 gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) mutex_lock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) for (i = 0; i < num; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) read_o = msg[i].flags & I2C_M_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) read = i + 1 < num && msg[i + 1].flags & I2C_M_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) read |= read_o;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) gate = (msg[i].addr == st->i2c_tuner_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) ? (read) ? st->i2c_tuner_gate_r
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) : st->i2c_tuner_gate_w
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) : st->i2c_gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) obuf[0] = gate | (read << 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) if (gate == 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) obuf[1] = (read) ? 2 : msg[i].len + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) obuf[1] = msg[i].len + read + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) obuf[2] = msg[i].addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) if (read) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) if (read_o)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) len = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) memcpy(&obuf[3], msg[i].buf, msg[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) obuf[msg[i].len+3] = msg[i+1].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) len = msg[i].len+4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) memcpy(&obuf[3], msg[i].buf, msg[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) len = msg[i].len+3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) if (lme2510_msg(d, obuf, len, ibuf, 64) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) deb_info(1, "i2c transfer failed.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) mutex_unlock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) if (read) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) if (read_o)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) memcpy(msg[i].buf, &ibuf[1], msg[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) mutex_unlock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) static u32 lme2510_i2c_func(struct i2c_adapter *adapter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) return I2C_FUNC_I2C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) static struct i2c_algorithm lme2510_i2c_algo = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) .master_xfer = lme2510_i2c_xfer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) .functionality = lme2510_i2c_func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) static int lme2510_streaming_ctrl(struct dvb_frontend *fe, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) struct dvb_usb_adapter *adap = fe_to_adap(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) struct lme2510_state *st = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) static u8 clear_reg_3[] = LME_ALL_PIDS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) static u8 rbuf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) int ret = 0, rlen = sizeof(rbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) deb_info(1, "STM (%02x)", onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) /* Streaming is started by FE_HAS_LOCK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) if (onoff == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) st->stream_on = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) deb_info(1, "STM Steam Off");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) /* mutex is here only to avoid collision with I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) mutex_lock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) ret = lme2510_usb_talk(d, clear_reg_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) sizeof(clear_reg_3), rbuf, rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) st->stream_on = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) st->i2c_talk_onoff = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) mutex_unlock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) return (ret < 0) ? -ENODEV : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) static u8 check_sum(u8 *p, u8 len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) u8 sum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) while (len--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) sum += *p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) return sum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) static int lme2510_download_firmware(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) const struct firmware *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) u8 *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) u16 j, wlen, len_in, start, end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) u8 packet_size, dlen, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) u8 *fw_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) packet_size = 0x31;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) len_in = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) data = kzalloc(128, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) if (!data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) info("FRM Could not start Firmware Download"\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) "(Buffer allocation failed)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) info("FRM Starting Firmware Download");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) for (i = 1; i < 3; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) start = (i == 1) ? 0 : 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) end = (i == 1) ? 512 : fw->size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) for (j = start; j < end; j += (packet_size+1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) fw_data = (u8 *)(fw->data + j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) if ((end - j) > packet_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) data[0] = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) dlen = packet_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) data[0] = i | 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) dlen = (u8)(end - j)-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) data[1] = dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) memcpy(&data[2], fw_data, dlen+1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) wlen = (u8) dlen + 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) data[wlen-1] = check_sum(fw_data, dlen+1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) deb_info(1, "Data S=%02x:E=%02x CS= %02x", data[3],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) data[dlen+2], data[dlen+3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) lme2510_usb_talk(d, data, wlen, data, len_in);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) ret |= (data[0] == 0x88) ? 0 : -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) data[0] = 0x8a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) len_in = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) msleep(2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) lme2510_usb_talk(d, data, len_in, data, len_in);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) msleep(400);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) info("FRM Firmware Download Failed (%04x)" , ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) info("FRM Firmware Download Completed - Resetting Device");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) kfree(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) return RECONNECTS_USB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) static void lme_coldreset(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) u8 data[1] = {0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) data[0] = 0x0a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) info("FRM Firmware Cold Reset");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) lme2510_usb_talk(d, data, sizeof(data), data, sizeof(data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) static const char fw_c_s7395[] = LME2510_C_S7395;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) static const char fw_c_lg[] = LME2510_C_LG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) static const char fw_c_s0194[] = LME2510_C_S0194;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) static const char fw_c_rs2000[] = LME2510_C_RS2000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) static const char fw_lg[] = LME2510_LG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) static const char fw_s0194[] = LME2510_S0194;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) static const char *lme_firmware_switch(struct dvb_usb_device *d, int cold)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) struct lme2510_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) struct usb_device *udev = d->udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) const struct firmware *fw = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) const char *fw_lme;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) cold = (cold > 0) ? (cold & 1) : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) switch (le16_to_cpu(udev->descriptor.idProduct)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) case 0x1122:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) switch (st->dvb_usb_lme2510_firmware) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) case TUNER_S0194:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) fw_lme = fw_s0194;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) ret = request_firmware(&fw, fw_lme, &udev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) st->dvb_usb_lme2510_firmware = TUNER_S0194;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) cold = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) case TUNER_LG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) fw_lme = fw_lg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) ret = request_firmware(&fw, fw_lme, &udev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) st->dvb_usb_lme2510_firmware = TUNER_LG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) st->dvb_usb_lme2510_firmware = TUNER_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) case 0x1120:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) switch (st->dvb_usb_lme2510_firmware) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) case TUNER_S7395:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) fw_lme = fw_c_s7395;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) ret = request_firmware(&fw, fw_lme, &udev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) st->dvb_usb_lme2510_firmware = TUNER_S7395;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) cold = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) case TUNER_LG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) fw_lme = fw_c_lg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) ret = request_firmware(&fw, fw_lme, &udev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) st->dvb_usb_lme2510_firmware = TUNER_LG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) case TUNER_S0194:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) fw_lme = fw_c_s0194;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) ret = request_firmware(&fw, fw_lme, &udev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) st->dvb_usb_lme2510_firmware = TUNER_S0194;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) st->dvb_usb_lme2510_firmware = TUNER_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) cold = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) case 0x22f0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) fw_lme = fw_c_rs2000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) st->dvb_usb_lme2510_firmware = TUNER_RS2000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) fw_lme = fw_c_s7395;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) if (cold) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) dvb_usb_lme2510_firmware = st->dvb_usb_lme2510_firmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) info("FRM Changing to %s firmware", fw_lme);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) lme_coldreset(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) return fw_lme;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) static int lme2510_kill_urb(struct usb_data_stream *stream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) for (i = 0; i < stream->urbs_submitted; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) deb_info(3, "killing URB no. %d.", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) /* stop the URB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) usb_kill_urb(stream->urb_list[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) stream->urbs_submitted = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) static struct tda10086_config tda10086_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) .demod_address = 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) .invert = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) .diseqc_tone = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) .xtal_freq = TDA10086_XTAL_16M,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) static struct stv0288_config lme_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) .demod_address = 0x68,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) .min_delay_ms = 15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) .inittab = s7395_inittab,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) static struct ix2505v_config lme_tuner = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) .tuner_address = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) .min_delay_ms = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) .tuner_gain = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) .tuner_chargepump = 0x3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) static struct stv0299_config sharp_z0194_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) .demod_address = 0x68,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) .inittab = sharp_z0194a_inittab,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) .mclk = 88000000UL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) .invert = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) .skip_reinit = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) .lock_output = STV0299_LOCKOUTPUT_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) .volt13_op0_op1 = STV0299_VOLT13_OP1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) .min_delay_ms = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) .set_symbol_rate = sharp_z0194a_set_symbol_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) static struct m88rs2000_config m88rs2000_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) .demod_addr = 0x68
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) static struct ts2020_config ts2020_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) .tuner_address = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) .clk_out_div = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) .dont_poll = true
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) enum fe_sec_voltage voltage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) struct dvb_usb_device *d = fe_to_d(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) struct lme2510_state *st = fe_to_priv(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) static u8 voltage_low[] = LME_VOLTAGE_L;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) static u8 voltage_high[] = LME_VOLTAGE_H;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) static u8 rbuf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) int ret = 0, len = 3, rlen = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) mutex_lock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) switch (voltage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) case SEC_VOLTAGE_18:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) ret |= lme2510_usb_talk(d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) voltage_high, len, rbuf, rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) case SEC_VOLTAGE_OFF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) case SEC_VOLTAGE_13:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) ret |= lme2510_usb_talk(d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) voltage_low, len, rbuf, rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) mutex_unlock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) if (st->tuner_config == TUNER_RS2000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) if (st->fe_set_voltage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) st->fe_set_voltage(fe, voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) return (ret < 0) ? -ENODEV : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) static int dm04_read_status(struct dvb_frontend *fe, enum fe_status *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) struct dvb_usb_device *d = fe_to_d(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) struct lme2510_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) if (st->i2c_talk_onoff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) if (st->fe_read_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) ret = st->fe_read_status(fe, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) st->lock_status = *status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) if (*status & FE_HAS_LOCK && st->stream_on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) mutex_lock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) st->i2c_talk_onoff = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) ret = lme2510_stream_restart(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) mutex_unlock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) /* Timeout of interrupt reached on RS2000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) if (st->tuner_config == TUNER_RS2000 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) time_after(jiffies, st->int_urb_due))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) st->lock_status &= ~FE_HAS_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) *status = st->lock_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) if (!(*status & FE_HAS_LOCK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) struct dvb_usb_adapter *adap = fe_to_adap(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) st->i2c_talk_onoff = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) lme2510_update_stats(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) static int dm04_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) struct dtv_frontend_properties *c = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) struct lme2510_state *st = fe_to_priv(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) if (st->fe_read_signal_strength && !st->stream_on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) return st->fe_read_signal_strength(fe, strength);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) if (c->strength.stat[0].scale == FE_SCALE_RELATIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) *strength = (u16)c->strength.stat[0].uvalue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) *strength = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) static int dm04_read_snr(struct dvb_frontend *fe, u16 *snr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) struct dtv_frontend_properties *c = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) struct lme2510_state *st = fe_to_priv(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) if (st->fe_read_snr && !st->stream_on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) return st->fe_read_snr(fe, snr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) if (c->cnr.stat[0].scale == FE_SCALE_RELATIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) *snr = (u16)c->cnr.stat[0].uvalue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) *snr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) static int dm04_read_ber(struct dvb_frontend *fe, u32 *ber)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) struct lme2510_state *st = fe_to_priv(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) if (st->fe_read_ber && !st->stream_on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) return st->fe_read_ber(fe, ber);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) *ber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) static int dm04_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) struct lme2510_state *st = fe_to_priv(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) if (st->fe_read_ucblocks && !st->stream_on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) return st->fe_read_ucblocks(fe, ucblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) *ucblocks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) static int lme_name(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) struct lme2510_state *st = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) const char *desc = d->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) static const char * const fe_name[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) "", " LG TDQY-P001F", " SHARP:BS2F7HZ7395",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) " SHARP:BS2F7HZ0194", " RS2000"};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) char *name = adap->fe[0]->ops.info.name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) strscpy(name, desc, 128);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) strlcat(name, fe_name[st->tuner_config], 128);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) struct lme2510_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) st->i2c_talk_onoff = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) switch (le16_to_cpu(d->udev->descriptor.idProduct)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) case 0x1122:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) case 0x1120:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) st->i2c_gate = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) adap->fe[0] = dvb_attach(tda10086_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) &tda10086_config, &d->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) if (adap->fe[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) info("TUN Found Frontend TDA10086");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) st->i2c_tuner_gate_w = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) st->i2c_tuner_gate_r = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) st->i2c_tuner_addr = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) st->tuner_config = TUNER_LG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) if (st->dvb_usb_lme2510_firmware != TUNER_LG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) st->dvb_usb_lme2510_firmware = TUNER_LG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) st->i2c_gate = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) adap->fe[0] = dvb_attach(stv0299_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) &sharp_z0194_config, &d->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) if (adap->fe[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) info("FE Found Stv0299");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) st->i2c_tuner_gate_w = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) st->i2c_tuner_gate_r = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) st->i2c_tuner_addr = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) st->tuner_config = TUNER_S0194;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) if (st->dvb_usb_lme2510_firmware != TUNER_S0194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) st->dvb_usb_lme2510_firmware = TUNER_S0194;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) st->i2c_gate = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) adap->fe[0] = dvb_attach(stv0288_attach, &lme_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) &d->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) if (adap->fe[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) info("FE Found Stv0288");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) st->i2c_tuner_gate_w = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) st->i2c_tuner_gate_r = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) st->i2c_tuner_addr = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) st->tuner_config = TUNER_S7395;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) if (st->dvb_usb_lme2510_firmware != TUNER_S7395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) st->dvb_usb_lme2510_firmware = TUNER_S7395;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) case 0x22f0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) st->i2c_gate = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) adap->fe[0] = dvb_attach(m88rs2000_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) &m88rs2000_config, &d->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) if (adap->fe[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) info("FE Found M88RS2000");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) st->i2c_tuner_gate_w = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) st->i2c_tuner_gate_r = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) st->i2c_tuner_addr = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) st->tuner_config = TUNER_RS2000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) st->fe_set_voltage =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) adap->fe[0]->ops.set_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) if (adap->fe[0] == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) info("DM04/QQBOX Not Powered up or not Supported");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) if (adap->fe[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) dvb_frontend_detach(adap->fe[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) adap->fe[0] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) d->rc_map = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) st->fe_read_status = adap->fe[0]->ops.read_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) st->fe_read_signal_strength = adap->fe[0]->ops.read_signal_strength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) st->fe_read_snr = adap->fe[0]->ops.read_snr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) st->fe_read_ber = adap->fe[0]->ops.read_ber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) st->fe_read_ucblocks = adap->fe[0]->ops.read_ucblocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) adap->fe[0]->ops.read_status = dm04_read_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) adap->fe[0]->ops.read_signal_strength = dm04_read_signal_strength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) adap->fe[0]->ops.read_snr = dm04_read_snr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) adap->fe[0]->ops.read_ber = dm04_read_ber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) adap->fe[0]->ops.read_ucblocks = dm04_read_ucblocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) adap->fe[0]->ops.set_voltage = dm04_lme2510_set_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) ret = lme_name(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) struct lme2510_state *st = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) static const char * const tun_msg[] = {"", "TDA8263", "IX2505V", "DVB_PLL_OPERA", "RS2000"};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) switch (st->tuner_config) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) case TUNER_LG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) if (dvb_attach(tda826x_attach, adap->fe[0], 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) &d->i2c_adap, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) ret = st->tuner_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) case TUNER_S7395:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) if (dvb_attach(ix2505v_attach , adap->fe[0], &lme_tuner,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) &d->i2c_adap))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) ret = st->tuner_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) case TUNER_S0194:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) if (dvb_attach(dvb_pll_attach , adap->fe[0], 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) &d->i2c_adap, DVB_PLL_OPERA1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) ret = st->tuner_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) case TUNER_RS2000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) if (dvb_attach(ts2020_attach, adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) &ts2020_config, &d->i2c_adap))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) ret = st->tuner_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) info("TUN Found %s tuner", tun_msg[ret]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) info("TUN No tuner found");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) /* Start the Interrupt*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) ret = lme2510_int_read(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) info("INT Unable to start Interrupt Service");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) static int lme2510_powerup(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) struct lme2510_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) static u8 lnb_on[] = LNB_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) static u8 lnb_off[] = LNB_OFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) static u8 rbuf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) int ret = 0, len = 3, rlen = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) mutex_lock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) ret = lme2510_usb_talk(d, onoff ? lnb_on : lnb_off, len, rbuf, rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) st->i2c_talk_onoff = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) mutex_unlock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) static int lme2510_get_adapter_count(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) static int lme2510_identify_state(struct dvb_usb_device *d, const char **name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) struct lme2510_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) usb_reset_configuration(d->udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) usb_set_interface(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) d->props->bInterfaceNumber, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) st->dvb_usb_lme2510_firmware = dvb_usb_lme2510_firmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) status = lme2510_return_status(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) if (status == 0x44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) *name = lme_firmware_switch(d, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) return COLD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) if (status != 0x47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) return WARM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) static int lme2510_get_stream_config(struct dvb_frontend *fe, u8 *ts_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) struct usb_data_stream_properties *stream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) struct dvb_usb_adapter *adap = fe_to_adap(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) struct dvb_usb_device *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) if (adap == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) /* Turn PID filter on the fly by module option */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) if (pid_filter == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) adap->pid_filtering = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) adap->max_feed_count = 15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) if (!(le16_to_cpu(d->udev->descriptor.idProduct)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) == 0x1122))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) stream->endpoint = 0x8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) static int lme2510_get_rc_config(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) struct dvb_usb_rc *rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) rc->allowed_protos = RC_PROTO_BIT_NEC32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) static void lme2510_exit(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) struct lme2510_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) struct dvb_usb_adapter *adap = &d->adapter[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) if (adap != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) lme2510_kill_urb(&adap->stream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) if (st->lme_urb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) usb_kill_urb(st->lme_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) usb_free_urb(st->lme_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) info("Interrupt Service Stopped");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) static struct dvb_usb_device_properties lme2510_props = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) .driver_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) .bInterfaceNumber = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) .adapter_nr = adapter_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) .size_of_priv = sizeof(struct lme2510_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) .generic_bulk_ctrl_endpoint_response = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) .download_firmware = lme2510_download_firmware,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) .power_ctrl = lme2510_powerup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) .identify_state = lme2510_identify_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) .i2c_algo = &lme2510_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) .frontend_attach = dm04_lme2510_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) .tuner_attach = dm04_lme2510_tuner,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) .get_stream_config = lme2510_get_stream_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) .get_adapter_count = lme2510_get_adapter_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) .streaming_ctrl = lme2510_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) .get_rc_config = lme2510_get_rc_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) .exit = lme2510_exit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) .caps = DVB_USB_ADAP_HAS_PID_FILTER|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) .pid_filter_count = 15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) .pid_filter = lme2510_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) .pid_filter_ctrl = lme2510_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) .stream =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) DVB_USB_STREAM_BULK(0x86, 10, 4096),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) static const struct usb_device_id lme2510_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) { DVB_USB_DEVICE(0x3344, 0x1122, &lme2510_props,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) "DM04_LME2510_DVB-S", RC_MAP_LME2510) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) { DVB_USB_DEVICE(0x3344, 0x1120, &lme2510_props,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) "DM04_LME2510C_DVB-S", RC_MAP_LME2510) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) { DVB_USB_DEVICE(0x3344, 0x22f0, &lme2510_props,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) "DM04_LME2510C_DVB-S RS2000", RC_MAP_LME2510) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) {} /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) MODULE_DEVICE_TABLE(usb, lme2510_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) static struct usb_driver lme2510_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) .name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) .probe = dvb_usbv2_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) .disconnect = dvb_usbv2_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) .id_table = lme2510_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) .no_dynamic_id = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) .soft_unbind = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) module_usb_driver(lme2510_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) MODULE_VERSION("2.07");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) MODULE_FIRMWARE(LME2510_C_S7395);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) MODULE_FIRMWARE(LME2510_C_LG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) MODULE_FIRMWARE(LME2510_C_S0194);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) MODULE_FIRMWARE(LME2510_C_RS2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) MODULE_FIRMWARE(LME2510_LG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) MODULE_FIRMWARE(LME2510_S0194);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)