Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 Xceive XC5000 "QAM/8VSB single chip tuner"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  *  Copyright (c) 2007 Xceive Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  *  Copyright (c) 2007 Steven Toth <stoth@linuxtv.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  *  Copyright (c) 2009 Devin Heitmueller <dheitmueller@kernellabs.com>
^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/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) #include <linux/moduleparam.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #include <linux/videodev2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #include <linux/dvb/frontend.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #include <media/dvb_frontend.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #include "xc5000.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #include "tuner-i2c.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) static int debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) module_param(debug, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) static int no_poweroff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) module_param(no_poweroff, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) MODULE_PARM_DESC(no_poweroff, "0 (default) powers device off when not used.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) 	"\t\t1 keep device energized and with tuner ready all the times.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) 	"\t\tFaster, but consumes more power and keeps the device hotter");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) static DEFINE_MUTEX(xc5000_list_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) static LIST_HEAD(hybrid_tuner_instance_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) #define dprintk(level, fmt, arg...) if (debug >= level) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) 	printk(KERN_INFO "%s: " fmt, "xc5000", ## arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) struct xc5000_priv {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) 	struct tuner_i2c_props i2c_props;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) 	struct list_head hybrid_tuner_instance_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) 	u32 if_khz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) 	u16 xtal_khz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) 	u32 freq_hz, freq_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) 	u32 bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) 	u8  video_standard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) 	unsigned int mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 	u8  rf_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) 	u8  radio_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) 	u16  output_amp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) 	int chip_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 	u16 pll_register_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) 	u8 init_status_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) 	u8 fw_checksum_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) 	struct dvb_frontend *fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 	struct delayed_work timer_sleep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	const struct firmware   *firmware;
^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) /* Misc Defines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) #define MAX_TV_STANDARD			24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) #define XC_MAX_I2C_WRITE_LENGTH		64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) /* Time to suspend after the .sleep callback is called */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) #define XC5000_SLEEP_TIME		5000 /* ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) /* Signal Types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) #define XC_RF_MODE_AIR			0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) #define XC_RF_MODE_CABLE		1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) /* Product id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) #define XC_PRODUCT_ID_FW_NOT_LOADED	0x2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) #define XC_PRODUCT_ID_FW_LOADED	0x1388
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) /* Registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) #define XREG_INIT         0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) #define XREG_VIDEO_MODE   0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) #define XREG_AUDIO_MODE   0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) #define XREG_RF_FREQ      0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) #define XREG_D_CODE       0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) #define XREG_IF_OUT       0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) #define XREG_SEEK_MODE    0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) #define XREG_POWER_DOWN   0x0A /* Obsolete */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) /* Set the output amplitude - SIF for analog, DTVP/DTVN for digital */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) #define XREG_OUTPUT_AMP   0x0B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) #define XREG_SIGNALSOURCE 0x0D /* 0=Air, 1=Cable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) #define XREG_SMOOTHEDCVBS 0x0E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) #define XREG_XTALFREQ     0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) #define XREG_FINERFREQ    0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) #define XREG_DDIMODE      0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) #define XREG_ADC_ENV      0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) #define XREG_QUALITY      0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) #define XREG_FRAME_LINES  0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) #define XREG_HSYNC_FREQ   0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) #define XREG_LOCK         0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) #define XREG_FREQ_ERROR   0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) #define XREG_SNR          0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) #define XREG_VERSION      0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) #define XREG_PRODUCT_ID   0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) #define XREG_BUSY         0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) #define XREG_BUILD        0x0D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) #define XREG_TOTALGAIN    0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) #define XREG_FW_CHECKSUM  0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) #define XREG_INIT_STATUS  0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112)    Basic firmware description. This will remain with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113)    the driver for documentation purposes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115)    This represents an I2C firmware file encoded as a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116)    string of unsigned char. Format is as follows:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118)    char[0  ]=len0_MSB  -> len = len_MSB * 256 + len_LSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119)    char[1  ]=len0_LSB  -> length of first write transaction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120)    char[2  ]=data0 -> first byte to be sent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121)    char[3  ]=data1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122)    char[4  ]=data2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123)    char[   ]=...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124)    char[M  ]=dataN  -> last byte to be sent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125)    char[M+1]=len1_MSB  -> len = len_MSB * 256 + len_LSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126)    char[M+2]=len1_LSB  -> length of second write transaction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127)    char[M+3]=data0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128)    char[M+4]=data1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129)    ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130)    etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132)    The [len] value should be interpreted as follows:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134)    len= len_MSB _ len_LSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135)    len=1111_1111_1111_1111   : End of I2C_SEQUENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136)    len=0000_0000_0000_0000   : Reset command: Do hardware reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137)    len=0NNN_NNNN_NNNN_NNNN   : Normal transaction: number of bytes = {1:32767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138)    len=1WWW_WWWW_WWWW_WWWW   : Wait command: wait for {1:32767} ms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140)    For the RESET and WAIT commands, the two following bytes will contain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141)    immediately the length of the following transaction.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) struct XC_TV_STANDARD {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 	char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 	u16 audio_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 	u16 video_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) /* Tuner standards */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) #define MN_NTSC_PAL_BTSC	0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) #define MN_NTSC_PAL_A2		1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) #define MN_NTSC_PAL_EIAJ	2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) #define MN_NTSC_PAL_MONO	3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) #define BG_PAL_A2		4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) #define BG_PAL_NICAM		5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) #define BG_PAL_MONO		6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) #define I_PAL_NICAM		7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) #define I_PAL_NICAM_MONO	8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) #define DK_PAL_A2		9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) #define DK_PAL_NICAM		10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) #define DK_PAL_MONO		11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) #define DK_SECAM_A2DK1		12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) #define DK_SECAM_A2LDK3		13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) #define DK_SECAM_A2MONO		14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) #define L_SECAM_NICAM		15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) #define LC_SECAM_NICAM		16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) #define DTV6			17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) #define DTV8			18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) #define DTV7_8			19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) #define DTV7			20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) #define FM_RADIO_INPUT2		21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) #define FM_RADIO_INPUT1		22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) #define FM_RADIO_INPUT1_MONO	23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) static struct XC_TV_STANDARD xc5000_standard[MAX_TV_STANDARD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	{"M/N-NTSC/PAL-BTSC", 0x0400, 0x8020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 	{"M/N-NTSC/PAL-A2",   0x0600, 0x8020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 	{"M/N-NTSC/PAL-EIAJ", 0x0440, 0x8020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 	{"M/N-NTSC/PAL-Mono", 0x0478, 0x8020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	{"B/G-PAL-A2",        0x0A00, 0x8049},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 	{"B/G-PAL-NICAM",     0x0C04, 0x8049},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	{"B/G-PAL-MONO",      0x0878, 0x8059},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 	{"I-PAL-NICAM",       0x1080, 0x8009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 	{"I-PAL-NICAM-MONO",  0x0E78, 0x8009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 	{"D/K-PAL-A2",        0x1600, 0x8009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 	{"D/K-PAL-NICAM",     0x0E80, 0x8009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 	{"D/K-PAL-MONO",      0x1478, 0x8009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 	{"D/K-SECAM-A2 DK1",  0x1200, 0x8009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 	{"D/K-SECAM-A2 L/DK3", 0x0E00, 0x8009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 	{"D/K-SECAM-A2 MONO", 0x1478, 0x8009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 	{"L-SECAM-NICAM",     0x8E82, 0x0009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 	{"L'-SECAM-NICAM",    0x8E82, 0x4009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 	{"DTV6",              0x00C0, 0x8002},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 	{"DTV8",              0x00C0, 0x800B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 	{"DTV7/8",            0x00C0, 0x801B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 	{"DTV7",              0x00C0, 0x8007},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	{"FM Radio-INPUT2",   0x9802, 0x9002},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 	{"FM Radio-INPUT1",   0x0208, 0x9002},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 	{"FM Radio-INPUT1_MONO", 0x0278, 0x9002}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) struct xc5000_fw_cfg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 	char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 	u16 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 	u16 pll_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 	u8 init_status_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 	u8 fw_checksum_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) #define XC5000A_FIRMWARE "dvb-fe-xc5000-1.6.114.fw"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) static const struct xc5000_fw_cfg xc5000a_1_6_114 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 	.name = XC5000A_FIRMWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 	.size = 12401,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 	.pll_reg = 0x806c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) #define XC5000C_FIRMWARE "dvb-fe-xc5000c-4.1.30.7.fw"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) static const struct xc5000_fw_cfg xc5000c_41_024_5 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	.name = XC5000C_FIRMWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 	.size = 16497,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 	.pll_reg = 0x13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 	.init_status_supported = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 	.fw_checksum_supported = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) static inline const struct xc5000_fw_cfg *xc5000_assign_firmware(int chip_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	switch (chip_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 	case XC5000A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 		return &xc5000a_1_6_114;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 	case XC5000C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 		return &xc5000c_41_024_5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe, int force);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) static int xc5000_is_firmware_loaded(struct dvb_frontend *fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) static int xc5000_readreg(struct xc5000_priv *priv, u16 reg, u16 *val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) static int xc5000_tuner_reset(struct dvb_frontend *fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) static int xc_send_i2c_data(struct xc5000_priv *priv, u8 *buf, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 	struct i2c_msg msg = { .addr = priv->i2c_props.addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 			       .flags = 0, .buf = buf, .len = len };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 	if (i2c_transfer(priv->i2c_props.adap, &msg, 1) != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 		printk(KERN_ERR "xc5000: I2C write failed (len=%i)\n", len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) /* This routine is never used because the only time we read data from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258)    i2c bus is when we read registers, and we want that to be an atomic i2c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259)    transaction in case we are on a multi-master bus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) static int xc_read_i2c_data(struct xc5000_priv *priv, u8 *buf, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 	struct i2c_msg msg = { .addr = priv->i2c_props.addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 		.flags = I2C_M_RD, .buf = buf, .len = len };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	if (i2c_transfer(priv->i2c_props.adap, &msg, 1) != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 		printk(KERN_ERR "xc5000 I2C read failed (len=%i)\n", len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) static int xc5000_readreg(struct xc5000_priv *priv, u16 reg, u16 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 	u8 buf[2] = { reg >> 8, reg & 0xff };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 	u8 bval[2] = { 0, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 	struct i2c_msg msg[2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 		{ .addr = priv->i2c_props.addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 			.flags = 0, .buf = &buf[0], .len = 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 		{ .addr = priv->i2c_props.addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 			.flags = I2C_M_RD, .buf = &bval[0], .len = 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 	if (i2c_transfer(priv->i2c_props.adap, msg, 2) != 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 		printk(KERN_WARNING "xc5000: I2C read failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 		return -EREMOTEIO;
^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) 	*val = (bval[0] << 8) | bval[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) static int xc5000_tuner_reset(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 	if (fe->callback) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 		ret = fe->callback(((fe->dvb) && (fe->dvb->priv)) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 					   fe->dvb->priv :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 					   priv->i2c_props.adap->algo_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 					   DVB_FRONTEND_COMPONENT_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 					   XC5000_TUNER_RESET, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 		if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 			printk(KERN_ERR "xc5000: reset failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 		printk(KERN_ERR "xc5000: no tuner reset callback function, fatal\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) static int xc_write_reg(struct xc5000_priv *priv, u16 reg_addr, u16 i2c_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 	u8 buf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	int watch_dog_timer = 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 	int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 	buf[0] = (reg_addr >> 8) & 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	buf[1] = reg_addr & 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 	buf[2] = (i2c_data >> 8) & 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 	buf[3] = i2c_data & 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 	result = xc_send_i2c_data(priv, buf, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	if (result == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 		/* wait for busy flag to clear */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 		while ((watch_dog_timer > 0) && (result == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 			result = xc5000_readreg(priv, XREG_BUSY, (u16 *)buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 			if (result == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 				if ((buf[0] == 0) && (buf[1] == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 					/* busy flag cleared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 				} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 					msleep(5); /* wait 5 ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 					watch_dog_timer--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 			}
^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) 	if (watch_dog_timer <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 		result = -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) static int xc_load_i2c_sequence(struct dvb_frontend *fe, const u8 *i2c_sequence)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 	int i, nbytes_to_send, result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	unsigned int len, pos, index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	u8 buf[XC_MAX_I2C_WRITE_LENGTH];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 	index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 	while ((i2c_sequence[index] != 0xFF) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 		(i2c_sequence[index + 1] != 0xFF)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 		len = i2c_sequence[index] * 256 + i2c_sequence[index+1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 		if (len == 0x0000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 			/* RESET command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 			result = xc5000_tuner_reset(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 			index += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 			if (result != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 				return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 		} else if (len & 0x8000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 			/* WAIT command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 			msleep(len & 0x7FFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 			index += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 			/* Send i2c data whilst ensuring individual transactions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 			 * do not exceed XC_MAX_I2C_WRITE_LENGTH bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 			index += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 			buf[0] = i2c_sequence[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 			buf[1] = i2c_sequence[index + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 			pos = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 			while (pos < len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 				if ((len - pos) > XC_MAX_I2C_WRITE_LENGTH - 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 					nbytes_to_send =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 						XC_MAX_I2C_WRITE_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 				else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 					nbytes_to_send = (len - pos + 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 				for (i = 2; i < nbytes_to_send; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 					buf[i] = i2c_sequence[index + pos +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 						i - 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 				result = xc_send_i2c_data(priv, buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 					nbytes_to_send);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 				if (result != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 					return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 				pos += nbytes_to_send - 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 			index += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) static int xc_initialize(struct xc5000_priv *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 	return xc_write_reg(priv, XREG_INIT, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) static int xc_set_tv_standard(struct xc5000_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 	u16 video_mode, u16 audio_mode, u8 radio_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 	dprintk(1, "%s(0x%04x,0x%04x)\n", __func__, video_mode, audio_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 	if (radio_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 		dprintk(1, "%s() Standard = %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 			__func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 			xc5000_standard[radio_mode].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 		dprintk(1, "%s() Standard = %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 			__func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 			xc5000_standard[priv->video_standard].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 	ret = xc_write_reg(priv, XREG_VIDEO_MODE, video_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 	if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 		ret = xc_write_reg(priv, XREG_AUDIO_MODE, audio_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) static int xc_set_signal_source(struct xc5000_priv *priv, u16 rf_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	dprintk(1, "%s(%d) Source = %s\n", __func__, rf_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 		rf_mode == XC_RF_MODE_AIR ? "ANTENNA" : "CABLE");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 	if ((rf_mode != XC_RF_MODE_AIR) && (rf_mode != XC_RF_MODE_CABLE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 		rf_mode = XC_RF_MODE_CABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 		printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 			"%s(), Invalid mode, defaulting to CABLE",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 			__func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 	return xc_write_reg(priv, XREG_SIGNALSOURCE, rf_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) static const struct dvb_tuner_ops xc5000_tuner_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) static int xc_set_rf_frequency(struct xc5000_priv *priv, u32 freq_hz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 	u16 freq_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 	dprintk(1, "%s(%u)\n", __func__, freq_hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 	if ((freq_hz > xc5000_tuner_ops.info.frequency_max_hz) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 		(freq_hz < xc5000_tuner_ops.info.frequency_min_hz))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	freq_code = (u16)(freq_hz / 15625);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 	/* Starting in firmware version 1.1.44, Xceive recommends using the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 	   FINERFREQ for all normal tuning (the doc indicates reg 0x03 should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 	   only be used for fast scanning for channel lock) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 	return xc_write_reg(priv, XREG_FINERFREQ, freq_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) static int xc_set_IF_frequency(struct xc5000_priv *priv, u32 freq_khz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 	u32 freq_code = (freq_khz * 1024)/1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 	dprintk(1, "%s(freq_khz = %d) freq_code = 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 		__func__, freq_khz, freq_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 	return xc_write_reg(priv, XREG_IF_OUT, freq_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) static int xc_get_adc_envelope(struct xc5000_priv *priv, u16 *adc_envelope)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	return xc5000_readreg(priv, XREG_ADC_ENV, adc_envelope);
^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 xc_get_frequency_error(struct xc5000_priv *priv, u32 *freq_error_hz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	u16 reg_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	u32 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	result = xc5000_readreg(priv, XREG_FREQ_ERROR, &reg_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 	if (result != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 		return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 	tmp = (u32)reg_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 	(*freq_error_hz) = (tmp * 15625) / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 	return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) static int xc_get_lock_status(struct xc5000_priv *priv, u16 *lock_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	return xc5000_readreg(priv, XREG_LOCK, lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) static int xc_get_version(struct xc5000_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 	u8 *hw_majorversion, u8 *hw_minorversion,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	u8 *fw_majorversion, u8 *fw_minorversion)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 	u16 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 	int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 	result = xc5000_readreg(priv, XREG_VERSION, &data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 	if (result != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 		return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 	(*hw_majorversion) = (data >> 12) & 0x0F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 	(*hw_minorversion) = (data >>  8) & 0x0F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	(*fw_majorversion) = (data >>  4) & 0x0F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	(*fw_minorversion) = data & 0x0F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) static int xc_get_buildversion(struct xc5000_priv *priv, u16 *buildrev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 	return xc5000_readreg(priv, XREG_BUILD, buildrev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) static int xc_get_hsync_freq(struct xc5000_priv *priv, u32 *hsync_freq_hz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	u16 reg_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 	int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 	result = xc5000_readreg(priv, XREG_HSYNC_FREQ, &reg_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 	if (result != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 		return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 	(*hsync_freq_hz) = ((reg_data & 0x0fff) * 763)/100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 	return result;
^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) static int xc_get_frame_lines(struct xc5000_priv *priv, u16 *frame_lines)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 	return xc5000_readreg(priv, XREG_FRAME_LINES, frame_lines);
^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 int xc_get_quality(struct xc5000_priv *priv, u16 *quality)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 	return xc5000_readreg(priv, XREG_QUALITY, quality);
^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 int xc_get_analogsnr(struct xc5000_priv *priv, u16 *snr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 	return xc5000_readreg(priv, XREG_SNR, snr);
^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 xc_get_totalgain(struct xc5000_priv *priv, u16 *totalgain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	return xc5000_readreg(priv, XREG_TOTALGAIN, totalgain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) #define XC_TUNE_ANALOG  0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) #define XC_TUNE_DIGITAL 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) static int xc_tune_channel(struct xc5000_priv *priv, u32 freq_hz, int mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 	dprintk(1, "%s(%u)\n", __func__, freq_hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 	if (xc_set_rf_frequency(priv, freq_hz) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) static int xc_set_xtal(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	switch (priv->chip_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 	case XC5000A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 		/* 32.000 MHz xtal is default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 	case XC5000C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 		switch (priv->xtal_khz) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 		case 32000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 			/* 32.000 MHz xtal is default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 		case 31875:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 			/* 31.875 MHz xtal configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 			ret = xc_write_reg(priv, 0x000f, 0x8081);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) static int xc5000_fwupload(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 			   const struct xc5000_fw_cfg *desired_fw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 			   const struct firmware *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	/* request the firmware, this will block and timeout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	dprintk(1, "waiting for firmware upload (%s)...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 		desired_fw->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	priv->pll_register_no = desired_fw->pll_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 	priv->init_status_supported = desired_fw->init_status_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 	priv->fw_checksum_supported = desired_fw->fw_checksum_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 	dprintk(1, "firmware uploading...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	ret = xc_load_i2c_sequence(fe,  fw->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 	if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 		ret = xc_set_xtal(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 		dprintk(1, "Firmware upload complete...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 		printk(KERN_ERR "xc5000: firmware upload failed...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) static void xc_debug_dump(struct xc5000_priv *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	u16 adc_envelope;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 	u32 freq_error_hz = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	u16 lock_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 	u32 hsync_freq_hz = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 	u16 frame_lines;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 	u16 quality;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 	u16 snr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 	u16 totalgain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 	u8 hw_majorversion = 0, hw_minorversion = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 	u8 fw_majorversion = 0, fw_minorversion = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 	u16 fw_buildversion = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 	u16 regval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	/* Wait for stats to stabilize.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 	 * Frame Lines needs two frame times after initial lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 	 * before it is valid.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 	msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	xc_get_adc_envelope(priv,  &adc_envelope);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 	dprintk(1, "*** ADC envelope (0-1023) = %d\n", adc_envelope);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 	xc_get_frequency_error(priv, &freq_error_hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	dprintk(1, "*** Frequency error = %d Hz\n", freq_error_hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	xc_get_lock_status(priv,  &lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	dprintk(1, "*** Lock status (0-Wait, 1-Locked, 2-No-signal) = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 		lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	xc_get_version(priv,  &hw_majorversion, &hw_minorversion,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 		&fw_majorversion, &fw_minorversion);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 	xc_get_buildversion(priv,  &fw_buildversion);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 	dprintk(1, "*** HW: V%d.%d, FW: V %d.%d.%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 		hw_majorversion, hw_minorversion,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 		fw_majorversion, fw_minorversion, fw_buildversion);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 	xc_get_hsync_freq(priv,  &hsync_freq_hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 	dprintk(1, "*** Horizontal sync frequency = %d Hz\n", hsync_freq_hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 	xc_get_frame_lines(priv,  &frame_lines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 	dprintk(1, "*** Frame lines = %d\n", frame_lines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 	xc_get_quality(priv,  &quality);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 	dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality & 0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 	xc_get_analogsnr(priv,  &snr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 	dprintk(1, "*** Unweighted analog SNR = %d dB\n", snr & 0x3f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 	xc_get_totalgain(priv,  &totalgain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 	dprintk(1, "*** Total gain = %d.%d dB\n", totalgain / 256,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 		(totalgain % 256) * 100 / 256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 	if (priv->pll_register_no) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 		if (!xc5000_readreg(priv, priv->pll_register_no, &regval))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 			dprintk(1, "*** PLL lock status = 0x%04x\n", regval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) static int xc5000_tune_digital(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 	u32 bw = fe->dtv_property_cache.bandwidth_hz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 	ret = xc_set_signal_source(priv, priv->rf_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 	if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 		printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 			"xc5000: xc_set_signal_source(%d) failed\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 			priv->rf_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	ret = xc_set_tv_standard(priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 		xc5000_standard[priv->video_standard].video_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 		xc5000_standard[priv->video_standard].audio_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 	if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 		printk(KERN_ERR "xc5000: xc_set_tv_standard failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	ret = xc_set_IF_frequency(priv, priv->if_khz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 	if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 		printk(KERN_ERR "xc5000: xc_Set_IF_frequency(%d) failed\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 		       priv->if_khz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 	dprintk(1, "%s() setting OUTPUT_AMP to 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 		__func__, priv->output_amp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 	xc_write_reg(priv, XREG_OUTPUT_AMP, priv->output_amp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 	xc_tune_channel(priv, priv->freq_hz, XC_TUNE_DIGITAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 	if (debug)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 		xc_debug_dump(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 	priv->bandwidth = bw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) static int xc5000_set_digital_params(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 	int b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 	u32 bw = fe->dtv_property_cache.bandwidth_hz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 	u32 freq = fe->dtv_property_cache.frequency;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 	u32 delsys  = fe->dtv_property_cache.delivery_system;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 	if (xc_load_fw_and_init_tuner(fe, 0) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 		dprintk(1, "Unable to load firmware and init tuner\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 	dprintk(1, "%s() frequency=%d (Hz)\n", __func__, freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 	switch (delsys) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 	case SYS_ATSC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 		dprintk(1, "%s() VSB modulation\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 		priv->rf_mode = XC_RF_MODE_AIR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 		priv->freq_offset = 1750000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 		priv->video_standard = DTV6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	case SYS_DVBC_ANNEX_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 		dprintk(1, "%s() QAM modulation\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 		priv->rf_mode = XC_RF_MODE_CABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 		priv->freq_offset = 1750000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 		priv->video_standard = DTV6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 	case SYS_ISDBT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 		/* All ISDB-T are currently for 6 MHz bw */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 		if (!bw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 			bw = 6000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 		/* fall to OFDM handling */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 	case SYS_DMBTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 	case SYS_DVBT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	case SYS_DVBT2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 		dprintk(1, "%s() OFDM\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 		switch (bw) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 		case 6000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 			priv->video_standard = DTV6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 			priv->freq_offset = 1750000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 		case 7000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 			priv->video_standard = DTV7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 			priv->freq_offset = 2250000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 		case 8000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 			priv->video_standard = DTV8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 			priv->freq_offset = 2750000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 			printk(KERN_ERR "xc5000 bandwidth not set!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 		priv->rf_mode = XC_RF_MODE_AIR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 	case SYS_DVBC_ANNEX_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 	case SYS_DVBC_ANNEX_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 		dprintk(1, "%s() QAM modulation\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 		priv->rf_mode = XC_RF_MODE_CABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 		if (bw <= 6000000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 			priv->video_standard = DTV6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 			priv->freq_offset = 1750000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 			b = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 		} else if (bw <= 7000000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 			priv->video_standard = DTV7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 			priv->freq_offset = 2250000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 			b = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 			priv->video_standard = DTV7_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 			priv->freq_offset = 2750000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 			b = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 		dprintk(1, "%s() Bandwidth %dMHz (%d)\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 			b, bw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 		printk(KERN_ERR "xc5000: delivery system is not supported!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 	priv->freq_hz = freq - priv->freq_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 	priv->mode = V4L2_TUNER_DIGITAL_TV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 	dprintk(1, "%s() frequency=%d (compensated to %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 		__func__, freq, priv->freq_hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 	return xc5000_tune_digital(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) static int xc5000_is_firmware_loaded(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 	u16 id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 	ret = xc5000_readreg(priv, XREG_PRODUCT_ID, &id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 	if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 		if (id == XC_PRODUCT_ID_FW_NOT_LOADED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 			ret = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 		dprintk(1, "%s() returns id = 0x%x\n", __func__, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 		dprintk(1, "%s() returns error %d\n", __func__, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) static void xc5000_config_tv(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 			     struct analog_parameters *params)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 	dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 		__func__, params->frequency);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 	/* Fix me: it could be air. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 	priv->rf_mode = params->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 	if (params->mode > XC_RF_MODE_CABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 		priv->rf_mode = XC_RF_MODE_CABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 	/* params->frequency is in units of 62.5khz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 	priv->freq_hz = params->frequency * 62500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 	/* FIX ME: Some video standards may have several possible audio
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 		   standards. We simply default to one of them here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 	if (params->std & V4L2_STD_MN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 		/* default to BTSC audio standard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 		priv->video_standard = MN_NTSC_PAL_BTSC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	if (params->std & V4L2_STD_PAL_BG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 		/* default to NICAM audio standard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 		priv->video_standard = BG_PAL_NICAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 	if (params->std & V4L2_STD_PAL_I) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 		/* default to NICAM audio standard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 		priv->video_standard = I_PAL_NICAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 	if (params->std & V4L2_STD_PAL_DK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 		/* default to NICAM audio standard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 		priv->video_standard = DK_PAL_NICAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 	if (params->std & V4L2_STD_SECAM_DK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 		/* default to A2 DK1 audio standard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 		priv->video_standard = DK_SECAM_A2DK1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 	if (params->std & V4L2_STD_SECAM_L) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 		priv->video_standard = L_SECAM_NICAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 		return;
^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) 	if (params->std & V4L2_STD_SECAM_LC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 		priv->video_standard = LC_SECAM_NICAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) static int xc5000_set_tv_freq(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 	u16 pll_lock_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) tune_channel:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 	ret = xc_set_signal_source(priv, priv->rf_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 	if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 		printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 			"xc5000: xc_set_signal_source(%d) failed\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 			priv->rf_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 	ret = xc_set_tv_standard(priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 		xc5000_standard[priv->video_standard].video_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 		xc5000_standard[priv->video_standard].audio_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 	if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 		printk(KERN_ERR "xc5000: xc_set_tv_standard failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 	xc_write_reg(priv, XREG_OUTPUT_AMP, 0x09);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 	xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 	if (debug)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 		xc_debug_dump(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 	if (priv->pll_register_no != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 		msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 		ret = xc5000_readreg(priv, priv->pll_register_no,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 				     &pll_lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 		if (pll_lock_status > 63) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 			/* PLL is unlocked, force reload of the firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 			dprintk(1, "xc5000: PLL not locked (0x%x).  Reloading...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 				pll_lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 			if (xc_load_fw_and_init_tuner(fe, 1) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 				printk(KERN_ERR "xc5000: Unable to reload fw\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 				return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 			goto tune_channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) static int xc5000_config_radio(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 			       struct analog_parameters *params)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 	dprintk(1, "%s() frequency=%d (in units of khz)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 		__func__, params->frequency);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 	if (priv->radio_input == XC5000_RADIO_NOT_CONFIGURED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 		dprintk(1, "%s() radio input not configured\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 	priv->freq_hz = params->frequency * 125 / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 	priv->rf_mode = XC_RF_MODE_AIR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) static int xc5000_set_radio_freq(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	u8 radio_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 	if (priv->radio_input == XC5000_RADIO_FM1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 		radio_input = FM_RADIO_INPUT1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 	else if  (priv->radio_input == XC5000_RADIO_FM2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 		radio_input = FM_RADIO_INPUT2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 	else if  (priv->radio_input == XC5000_RADIO_FM1_MONO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 		radio_input = FM_RADIO_INPUT1_MONO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 		dprintk(1, "%s() unknown radio input %d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 			priv->radio_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 	ret = xc_set_tv_standard(priv, xc5000_standard[radio_input].video_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 			       xc5000_standard[radio_input].audio_mode, radio_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 	if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 		printk(KERN_ERR "xc5000: xc_set_tv_standard failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 	ret = xc_set_signal_source(priv, priv->rf_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 	if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 		printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 			"xc5000: xc_set_signal_source(%d) failed\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 			priv->rf_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 	if ((priv->radio_input == XC5000_RADIO_FM1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 				(priv->radio_input == XC5000_RADIO_FM2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 		xc_write_reg(priv, XREG_OUTPUT_AMP, 0x09);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	else if  (priv->radio_input == XC5000_RADIO_FM1_MONO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 		xc_write_reg(priv, XREG_OUTPUT_AMP, 0x06);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 	xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) static int xc5000_set_params(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 	if (xc_load_fw_and_init_tuner(fe, 0) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 		dprintk(1, "Unable to load firmware and init tuner\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 	switch (priv->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 	case V4L2_TUNER_RADIO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 		return xc5000_set_radio_freq(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 	case V4L2_TUNER_ANALOG_TV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 		return xc5000_set_tv_freq(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 	case V4L2_TUNER_DIGITAL_TV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 		return xc5000_tune_digital(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) static int xc5000_set_analog_params(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 			     struct analog_parameters *params)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	if (priv->i2c_props.adap == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	switch (params->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 	case V4L2_TUNER_RADIO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 		ret = xc5000_config_radio(fe, params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 	case V4L2_TUNER_ANALOG_TV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 		xc5000_config_tv(fe, params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 	priv->mode = params->mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 	return xc5000_set_params(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) static int xc5000_get_frequency(struct dvb_frontend *fe, u32 *freq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 	*freq = priv->freq_hz + priv->freq_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) static int xc5000_get_if_frequency(struct dvb_frontend *fe, u32 *freq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 	*freq = priv->if_khz * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) static int xc5000_get_bandwidth(struct dvb_frontend *fe, u32 *bw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 	*bw = priv->bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) static int xc5000_get_status(struct dvb_frontend *fe, u32 *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 	u16 lock_status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 	xc_get_lock_status(priv, &lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 	dprintk(1, "%s() lock_status = 0x%08x\n", __func__, lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	*status = lock_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe, int force)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 	const struct xc5000_fw_cfg *desired_fw = xc5000_assign_firmware(priv->chip_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	const struct firmware *fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 	int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 	u16 pll_lock_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 	u16 fw_ck;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 	cancel_delayed_work(&priv->timer_sleep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 	if (!force && xc5000_is_firmware_loaded(fe) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 	if (!priv->firmware) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 		ret = request_firmware(&fw, desired_fw->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 					priv->i2c_props.adap->dev.parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 		if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 			pr_err("xc5000: Upload failed. rc %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 		dprintk(1, "firmware read %zu bytes.\n", fw->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 		if (fw->size != desired_fw->size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 			pr_err("xc5000: Firmware file with incorrect size\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 			release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 		priv->firmware = fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 		fw = priv->firmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 	/* Try up to 5 times to load firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	for (i = 0; i < 5; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 		if (i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 			printk(KERN_CONT " - retrying to upload firmware.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 		ret = xc5000_fwupload(fe, desired_fw, fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 		if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 			goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 		msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 		if (priv->fw_checksum_supported) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 			if (xc5000_readreg(priv, XREG_FW_CHECKSUM, &fw_ck)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 				printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 				       "xc5000: FW checksum reading failed.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 			if (!fw_ck) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 				printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 				       "xc5000: FW checksum failed = 0x%04x.",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 				       fw_ck);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 		/* Start the tuner self-calibration process */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 		ret = xc_initialize(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 		if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 			printk(KERN_ERR "xc5000: Can't request self-calibration.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 		/* Wait for calibration to complete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 		 * We could continue but XC5000 will clock stretch subsequent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 		 * I2C transactions until calibration is complete.  This way we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 		 * don't have to rely on clock stretching working.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 		msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 		if (priv->init_status_supported) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 			if (xc5000_readreg(priv, XREG_INIT_STATUS, &fw_ck)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 				printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 				       "xc5000: FW failed reading init status.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 			if (!fw_ck) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 				printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 				       "xc5000: FW init status failed = 0x%04x.",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 				       fw_ck);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 		if (priv->pll_register_no) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 			ret = xc5000_readreg(priv, priv->pll_register_no,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 					     &pll_lock_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 			if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 			if (pll_lock_status > 63) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 				/* PLL is unlocked, force reload of the firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 				printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 				       "xc5000: PLL not running after fwload.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 				continue;
^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) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 		/* Default to "CABLE" mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 		ret = xc_write_reg(priv, XREG_SIGNALSOURCE, XC_RF_MODE_CABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 		if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 		printk(KERN_ERR "xc5000: can't set to cable mode.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 	if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 		printk(KERN_INFO "xc5000: Firmware %s loaded and running.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 		       desired_fw->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 		printk(KERN_CONT " - too many retries. Giving up\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) static void xc5000_do_timer_sleep(struct work_struct *timer_sleep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 	struct xc5000_priv *priv =container_of(timer_sleep, struct xc5000_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 					       timer_sleep.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 	struct dvb_frontend *fe = priv->fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 	/* According to Xceive technical support, the "powerdown" register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 	   was removed in newer versions of the firmware.  The "supported"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 	   way to sleep the tuner is to pull the reset pin low for 10ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 	ret = xc5000_tuner_reset(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) 	if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 		printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 			"xc5000: %s() unable to shutdown tuner\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 			__func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) static int xc5000_sleep(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 	/* Avoid firmware reload on slow devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 	if (no_poweroff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 	schedule_delayed_work(&priv->timer_sleep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 			      msecs_to_jiffies(XC5000_SLEEP_TIME));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 	return 0;
^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) static int xc5000_suspend(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 	cancel_delayed_work(&priv->timer_sleep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 	ret = xc5000_tuner_reset(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 	if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 		printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 			"xc5000: %s() unable to shutdown tuner\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 			__func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) static int xc5000_resume(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 	/* suspended before firmware is loaded.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 	   Avoid firmware load in resume path. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 	if (!priv->firmware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 	return xc5000_set_params(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) static int xc5000_init(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 	if (xc_load_fw_and_init_tuner(fe, 0) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 		printk(KERN_ERR "xc5000: Unable to initialise tuner\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 		return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 	if (debug)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 		xc_debug_dump(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) static void xc5000_release(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 	mutex_lock(&xc5000_list_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 	if (priv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 		cancel_delayed_work(&priv->timer_sleep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 		if (priv->firmware) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 			release_firmware(priv->firmware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 			priv->firmware = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 		hybrid_tuner_release_state(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 	mutex_unlock(&xc5000_list_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 	fe->tuner_priv = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) static int xc5000_set_config(struct dvb_frontend *fe, void *priv_cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 	struct xc5000_priv *priv = fe->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 	struct xc5000_config *p = priv_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 	dprintk(1, "%s()\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 	if (p->if_khz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 		priv->if_khz = p->if_khz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 	if (p->radio_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 		priv->radio_input = p->radio_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 	if (p->output_amp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 		priv->output_amp = p->output_amp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) static const struct dvb_tuner_ops xc5000_tuner_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 	.info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 		.name              = "Xceive XC5000",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 		.frequency_min_hz  =    1 * MHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 		.frequency_max_hz  = 1023 * MHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 		.frequency_step_hz =   50 * kHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 	.release	   = xc5000_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 	.init		   = xc5000_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 	.sleep		   = xc5000_sleep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 	.suspend	   = xc5000_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 	.resume		   = xc5000_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 	.set_config	   = xc5000_set_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 	.set_params	   = xc5000_set_digital_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 	.set_analog_params = xc5000_set_analog_params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 	.get_frequency	   = xc5000_get_frequency,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 	.get_if_frequency  = xc5000_get_if_frequency,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 	.get_bandwidth	   = xc5000_get_bandwidth,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 	.get_status	   = xc5000_get_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 				   struct i2c_adapter *i2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 				   const struct xc5000_config *cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 	struct xc5000_priv *priv = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 	int instance;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 	u16 id = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 	dprintk(1, "%s(%d-%04x)\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 		i2c ? i2c_adapter_id(i2c) : -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 		cfg ? cfg->i2c_address : -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 	mutex_lock(&xc5000_list_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 	instance = hybrid_tuner_request_state(struct xc5000_priv, priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 					      hybrid_tuner_instance_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 					      i2c, cfg->i2c_address, "xc5000");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 	switch (instance) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 	case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 	case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 		/* new tuner instance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 		priv->bandwidth = 6000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 		fe->tuner_priv = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 		priv->fe = fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 		INIT_DELAYED_WORK(&priv->timer_sleep, xc5000_do_timer_sleep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 		/* existing tuner instance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 		fe->tuner_priv = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) 	if (priv->if_khz == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 		/* If the IF hasn't been set yet, use the value provided by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 		   the caller (occurs in hybrid devices where the analog
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 		   call to xc5000_attach occurs before the digital side) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 		priv->if_khz = cfg->if_khz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 	if (priv->xtal_khz == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 		priv->xtal_khz = cfg->xtal_khz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 	if (priv->radio_input == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 		priv->radio_input = cfg->radio_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 	/* don't override chip id if it's already been set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 	   unless explicitly specified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 	if ((priv->chip_id == 0) || (cfg->chip_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 		/* use default chip id if none specified, set to 0 so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 		   it can be overridden if this is a hybrid driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 		priv->chip_id = (cfg->chip_id) ? cfg->chip_id : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 	/* don't override output_amp if it's already been set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 	   unless explicitly specified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 	if ((priv->output_amp == 0) || (cfg->output_amp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 		/* use default output_amp value if none specified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 		priv->output_amp = (cfg->output_amp) ? cfg->output_amp : 0x8a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 	/* Check if firmware has been loaded. It is possible that another
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 	   instance of the driver has loaded the firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 	if (xc5000_readreg(priv, XREG_PRODUCT_ID, &id) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 	switch (id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 	case XC_PRODUCT_ID_FW_LOADED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 		printk(KERN_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 			"xc5000: Successfully identified at address 0x%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 			cfg->i2c_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 		printk(KERN_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 			"xc5000: Firmware has been loaded previously\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 	case XC_PRODUCT_ID_FW_NOT_LOADED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 		printk(KERN_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 			"xc5000: Successfully identified at address 0x%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 			cfg->i2c_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 		printk(KERN_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 			"xc5000: Firmware has not been loaded previously\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 		printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 			"xc5000: Device not found at addr 0x%02x (0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 			cfg->i2c_address, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 	mutex_unlock(&xc5000_list_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 	memcpy(&fe->ops.tuner_ops, &xc5000_tuner_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 		sizeof(struct dvb_tuner_ops));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 	return fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 	mutex_unlock(&xc5000_list_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 	xc5000_release(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) EXPORT_SYMBOL(xc5000_attach);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) MODULE_AUTHOR("Steven Toth");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) MODULE_DESCRIPTION("Xceive xc5000 silicon tuner driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) MODULE_FIRMWARE(XC5000A_FIRMWARE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) MODULE_FIRMWARE(XC5000C_FIRMWARE);