cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

helene.c (32188B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * helene.c
      4 *
      5 * Sony HELENE DVB-S/S2 DVB-T/T2 DVB-C/C2 ISDB-T/S tuner driver (CXD2858ER)
      6 *
      7 * Copyright 2012 Sony Corporation
      8 * Copyright (C) 2014 NetUP Inc.
      9 * Copyright (C) 2014 Abylay Ospan <aospan@netup.ru>
     10  */
     11
     12#include <linux/slab.h>
     13#include <linux/module.h>
     14#include <linux/dvb/frontend.h>
     15#include <linux/types.h>
     16#include "helene.h"
     17#include <media/dvb_frontend.h>
     18
     19#define MAX_WRITE_REGSIZE 20
     20
     21enum helene_state {
     22	STATE_UNKNOWN,
     23	STATE_SLEEP,
     24	STATE_ACTIVE
     25};
     26
     27struct helene_priv {
     28	u32			frequency;
     29	u8			i2c_address;
     30	struct i2c_adapter	*i2c;
     31	enum helene_state	state;
     32	void			*set_tuner_data;
     33	int			(*set_tuner)(void *, int);
     34	enum helene_xtal xtal;
     35};
     36
     37#define TERR_INTERNAL_LOOPFILTER_AVAILABLE(tv_system) \
     38	(((tv_system) != SONY_HELENE_DTV_DVBC_6) && \
     39	 ((tv_system) != SONY_HELENE_DTV_DVBC_8)\
     40	 && ((tv_system) != SONY_HELENE_DTV_DVBC2_6) && \
     41	 ((tv_system) != SONY_HELENE_DTV_DVBC2_8))
     42
     43#define HELENE_AUTO		0xff
     44#define HELENE_OFFSET(ofs)	((u8)(ofs) & 0x1F)
     45#define HELENE_BW_6		0x00
     46#define HELENE_BW_7		0x01
     47#define HELENE_BW_8		0x02
     48#define HELENE_BW_1_7		0x03
     49
     50enum helene_tv_system_t {
     51	SONY_HELENE_TV_SYSTEM_UNKNOWN,
     52	/* Terrestrial Analog */
     53	SONY_HELENE_ATV_MN_EIAJ,
     54	/**< System-M (Japan) (IF: Fp=5.75MHz in default) */
     55	SONY_HELENE_ATV_MN_SAP,
     56	/**< System-M (US)    (IF: Fp=5.75MHz in default) */
     57	SONY_HELENE_ATV_MN_A2,
     58	/**< System-M (Korea) (IF: Fp=5.9MHz in default) */
     59	SONY_HELENE_ATV_BG,
     60	/**< System-B/G       (IF: Fp=7.3MHz in default) */
     61	SONY_HELENE_ATV_I,
     62	/**< System-I         (IF: Fp=7.85MHz in default) */
     63	SONY_HELENE_ATV_DK,
     64	/**< System-D/K       (IF: Fp=7.85MHz in default) */
     65	SONY_HELENE_ATV_L,
     66	/**< System-L         (IF: Fp=7.85MHz in default) */
     67	SONY_HELENE_ATV_L_DASH,
     68	/**< System-L DASH    (IF: Fp=2.2MHz in default) */
     69	/* Terrestrial/Cable Digital */
     70	SONY_HELENE_DTV_8VSB,
     71	/**< ATSC 8VSB        (IF: Fc=3.7MHz in default) */
     72	SONY_HELENE_DTV_QAM,
     73	/**< US QAM           (IF: Fc=3.7MHz in default) */
     74	SONY_HELENE_DTV_ISDBT_6,
     75	/**< ISDB-T 6MHzBW    (IF: Fc=3.55MHz in default) */
     76	SONY_HELENE_DTV_ISDBT_7,
     77	/**< ISDB-T 7MHzBW    (IF: Fc=4.15MHz in default) */
     78	SONY_HELENE_DTV_ISDBT_8,
     79	/**< ISDB-T 8MHzBW    (IF: Fc=4.75MHz in default) */
     80	SONY_HELENE_DTV_DVBT_5,
     81	/**< DVB-T 5MHzBW     (IF: Fc=3.6MHz in default) */
     82	SONY_HELENE_DTV_DVBT_6,
     83	/**< DVB-T 6MHzBW     (IF: Fc=3.6MHz in default) */
     84	SONY_HELENE_DTV_DVBT_7,
     85	/**< DVB-T 7MHzBW     (IF: Fc=4.2MHz in default) */
     86	SONY_HELENE_DTV_DVBT_8,
     87	/**< DVB-T 8MHzBW     (IF: Fc=4.8MHz in default) */
     88	SONY_HELENE_DTV_DVBT2_1_7,
     89	/**< DVB-T2 1.7MHzBW  (IF: Fc=3.5MHz in default) */
     90	SONY_HELENE_DTV_DVBT2_5,
     91	/**< DVB-T2 5MHzBW    (IF: Fc=3.6MHz in default) */
     92	SONY_HELENE_DTV_DVBT2_6,
     93	/**< DVB-T2 6MHzBW    (IF: Fc=3.6MHz in default) */
     94	SONY_HELENE_DTV_DVBT2_7,
     95	/**< DVB-T2 7MHzBW    (IF: Fc=4.2MHz in default) */
     96	SONY_HELENE_DTV_DVBT2_8,
     97	/**< DVB-T2 8MHzBW    (IF: Fc=4.8MHz in default) */
     98	SONY_HELENE_DTV_DVBC_6,
     99	/**< DVB-C 6MHzBW     (IF: Fc=3.7MHz in default) */
    100	SONY_HELENE_DTV_DVBC_8,
    101	/**< DVB-C 8MHzBW     (IF: Fc=4.9MHz in default) */
    102	SONY_HELENE_DTV_DVBC2_6,
    103	/**< DVB-C2 6MHzBW    (IF: Fc=3.7MHz in default) */
    104	SONY_HELENE_DTV_DVBC2_8,
    105	/**< DVB-C2 8MHzBW    (IF: Fc=4.9MHz in default) */
    106	SONY_HELENE_DTV_DTMB,
    107	/**< DTMB             (IF: Fc=5.1MHz in default) */
    108	/* Satellite */
    109	SONY_HELENE_STV_ISDBS,
    110	/**< ISDB-S */
    111	SONY_HELENE_STV_DVBS,
    112	/**< DVB-S */
    113	SONY_HELENE_STV_DVBS2,
    114	/**< DVB-S2 */
    115
    116	SONY_HELENE_ATV_MIN = SONY_HELENE_ATV_MN_EIAJ,
    117	/**< Minimum analog terrestrial system */
    118	SONY_HELENE_ATV_MAX = SONY_HELENE_ATV_L_DASH,
    119	/**< Maximum analog terrestrial system */
    120	SONY_HELENE_DTV_MIN = SONY_HELENE_DTV_8VSB,
    121	/**< Minimum digital terrestrial system */
    122	SONY_HELENE_DTV_MAX = SONY_HELENE_DTV_DTMB,
    123	/**< Maximum digital terrestrial system */
    124	SONY_HELENE_TERR_TV_SYSTEM_NUM,
    125	/**< Number of supported terrestrial broadcasting system */
    126	SONY_HELENE_STV_MIN = SONY_HELENE_STV_ISDBS,
    127	/**< Minimum satellite system */
    128	SONY_HELENE_STV_MAX = SONY_HELENE_STV_DVBS2
    129	/**< Maximum satellite system */
    130};
    131
    132struct helene_terr_adjust_param_t {
    133	/* < Addr:0x69 Bit[6:4] : RFVGA gain.
    134	 * 0xFF means Auto. (RF_GAIN_SEL = 1)
    135	 */
    136	uint8_t RF_GAIN;
    137	/* < Addr:0x69 Bit[3:0] : IF_BPF gain.
    138	*/
    139	uint8_t IF_BPF_GC;
    140	/* < Addr:0x6B Bit[3:0] : RF overload
    141	 * RF input detect level. (FRF <= 172MHz)
    142	*/
    143	uint8_t RFOVLD_DET_LV1_VL;
    144	/* < Addr:0x6B Bit[3:0] : RF overload
    145	 * RF input detect level. (172MHz < FRF <= 464MHz)
    146	*/
    147	uint8_t RFOVLD_DET_LV1_VH;
    148	/* < Addr:0x6B Bit[3:0] : RF overload
    149	 * RF input detect level. (FRF > 464MHz)
    150	*/
    151	uint8_t RFOVLD_DET_LV1_U;
    152	/* < Addr:0x6C Bit[2:0] :
    153	 * Internal RFAGC detect level. (FRF <= 172MHz)
    154	*/
    155	uint8_t IFOVLD_DET_LV_VL;
    156	/* < Addr:0x6C Bit[2:0] :
    157	 * Internal RFAGC detect level. (172MHz < FRF <= 464MHz)
    158	*/
    159	uint8_t IFOVLD_DET_LV_VH;
    160	/* < Addr:0x6C Bit[2:0] :
    161	 * Internal RFAGC detect level. (FRF > 464MHz)
    162	*/
    163	uint8_t IFOVLD_DET_LV_U;
    164	/* < Addr:0x6D Bit[5:4] :
    165	 * IF filter center offset.
    166	*/
    167	uint8_t IF_BPF_F0;
    168	/* < Addr:0x6D Bit[1:0] :
    169	 * 6MHzBW(0x00) or 7MHzBW(0x01)
    170	 * or 8MHzBW(0x02) or 1.7MHzBW(0x03)
    171	*/
    172	uint8_t BW;
    173	/* < Addr:0x6E Bit[4:0] :
    174	 * 5bit signed. IF offset (kHz) = FIF_OFFSET x 50
    175	*/
    176	uint8_t FIF_OFFSET;
    177	/* < Addr:0x6F Bit[4:0] :
    178	 * 5bit signed. BW offset (kHz) =
    179	 * BW_OFFSET x 50 (BW_OFFSET x 10 in 1.7MHzBW)
    180	*/
    181	uint8_t BW_OFFSET;
    182	/* < Addr:0x9C Bit[0]   :
    183	 * Local polarity. (0: Upper Local, 1: Lower Local)
    184	*/
    185	uint8_t IS_LOWERLOCAL;
    186};
    187
    188static const struct helene_terr_adjust_param_t
    189terr_params[SONY_HELENE_TERR_TV_SYSTEM_NUM] = {
    190	/*< SONY_HELENE_TV_SYSTEM_UNKNOWN */
    191	{HELENE_AUTO, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    192		HELENE_BW_6, HELENE_OFFSET(0),  HELENE_OFFSET(0),  0x00},
    193	/* Analog */
    194	/**< SONY_HELENE_ATV_MN_EIAJ   (System-M (Japan)) */
    195	{HELENE_AUTO, 0x05, 0x03, 0x06, 0x03, 0x01, 0x01, 0x01, 0x00,
    196		HELENE_BW_6,  HELENE_OFFSET(0),  HELENE_OFFSET(1),  0x00},
    197	/**< SONY_HELENE_ATV_MN_SAP    (System-M (US)) */
    198	{HELENE_AUTO, 0x05, 0x03, 0x06, 0x03, 0x01, 0x01, 0x01, 0x00,
    199		HELENE_BW_6,  HELENE_OFFSET(0),  HELENE_OFFSET(1),  0x00},
    200	{HELENE_AUTO, 0x05, 0x03, 0x06, 0x03, 0x01, 0x01, 0x01, 0x00,
    201		HELENE_BW_6,  HELENE_OFFSET(3),  HELENE_OFFSET(1),  0x00},
    202	/**< SONY_HELENE_ATV_MN_A2     (System-M (Korea)) */
    203	{HELENE_AUTO, 0x05, 0x03, 0x06, 0x03, 0x01, 0x01, 0x01, 0x00,
    204		HELENE_BW_7,  HELENE_OFFSET(11), HELENE_OFFSET(5),  0x00},
    205	/**< SONY_HELENE_ATV_BG        (System-B/G) */
    206	{HELENE_AUTO, 0x05, 0x03, 0x06, 0x03, 0x01, 0x01, 0x01, 0x00,
    207		HELENE_BW_8,  HELENE_OFFSET(2),  HELENE_OFFSET(-3), 0x00},
    208	/**< SONY_HELENE_ATV_I         (System-I) */
    209	{HELENE_AUTO, 0x05, 0x03, 0x06, 0x03, 0x01, 0x01, 0x01, 0x00,
    210		HELENE_BW_8,  HELENE_OFFSET(2),  HELENE_OFFSET(-3), 0x00},
    211	/**< SONY_HELENE_ATV_DK        (System-D/K) */
    212	{HELENE_AUTO, 0x03, 0x04, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x00,
    213		HELENE_BW_8,  HELENE_OFFSET(2),  HELENE_OFFSET(-3), 0x00},
    214	/**< SONY_HELENE_ATV_L         (System-L) */
    215	{HELENE_AUTO, 0x03, 0x04, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x00,
    216		HELENE_BW_8,  HELENE_OFFSET(-1), HELENE_OFFSET(4),  0x00},
    217	/**< SONY_HELENE_ATV_L_DASH    (System-L DASH) */
    218	/* Digital */
    219	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x03, 0x03, 0x03, 0x00,
    220		HELENE_BW_6,  HELENE_OFFSET(-6), HELENE_OFFSET(-3), 0x00},
    221	/**< SONY_HELENE_DTV_8VSB      (ATSC 8VSB) */
    222	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    223		HELENE_BW_6,  HELENE_OFFSET(-6), HELENE_OFFSET(-3), 0x00},
    224	/**< SONY_HELENE_DTV_QAM       (US QAM) */
    225	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    226		HELENE_BW_6,  HELENE_OFFSET(-9), HELENE_OFFSET(-5), 0x00},
    227	/**< SONY_HELENE_DTV_ISDBT_6   (ISDB-T 6MHzBW) */
    228	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    229		HELENE_BW_7,  HELENE_OFFSET(-7), HELENE_OFFSET(-6), 0x00},
    230	/**< SONY_HELENE_DTV_ISDBT_7   (ISDB-T 7MHzBW) */
    231	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    232		HELENE_BW_8,  HELENE_OFFSET(-5), HELENE_OFFSET(-7), 0x00},
    233	/**< SONY_HELENE_DTV_ISDBT_8   (ISDB-T 8MHzBW) */
    234	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    235		HELENE_BW_6,  HELENE_OFFSET(-8), HELENE_OFFSET(-3), 0x00},
    236	/**< SONY_HELENE_DTV_DVBT_5    (DVB-T 5MHzBW) */
    237	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    238		HELENE_BW_6,  HELENE_OFFSET(-8), HELENE_OFFSET(-3), 0x00},
    239	/**< SONY_HELENE_DTV_DVBT_6    (DVB-T 6MHzBW) */
    240	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    241		HELENE_BW_7,  HELENE_OFFSET(-6), HELENE_OFFSET(-5), 0x00},
    242	/**< SONY_HELENE_DTV_DVBT_7    (DVB-T 7MHzBW) */
    243	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    244		HELENE_BW_8,  HELENE_OFFSET(-4), HELENE_OFFSET(-6), 0x00},
    245	/**< SONY_HELENE_DTV_DVBT_8    (DVB-T 8MHzBW) */
    246	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    247		HELENE_BW_1_7, HELENE_OFFSET(-10), HELENE_OFFSET(-10), 0x00},
    248	/**< SONY_HELENE_DTV_DVBT2_1_7 (DVB-T2 1.7MHzBW) */
    249	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    250		HELENE_BW_6,  HELENE_OFFSET(-8), HELENE_OFFSET(-3), 0x00},
    251	/**< SONY_HELENE_DTV_DVBT2_5   (DVB-T2 5MHzBW) */
    252	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    253		HELENE_BW_6,  HELENE_OFFSET(-8), HELENE_OFFSET(-3), 0x00},
    254	/**< SONY_HELENE_DTV_DVBT2_6   (DVB-T2 6MHzBW) */
    255	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    256		HELENE_BW_7,  HELENE_OFFSET(-6), HELENE_OFFSET(-5), 0x00},
    257	/**< SONY_HELENE_DTV_DVBT2_7   (DVB-T2 7MHzBW) */
    258	{HELENE_AUTO, 0x09, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    259		HELENE_BW_8,  HELENE_OFFSET(-4), HELENE_OFFSET(-6), 0x00},
    260	/**< SONY_HELENE_DTV_DVBT2_8   (DVB-T2 8MHzBW) */
    261	{HELENE_AUTO, 0x05, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00,
    262		HELENE_BW_6,  HELENE_OFFSET(-6), HELENE_OFFSET(-4), 0x00},
    263	/**< SONY_HELENE_DTV_DVBC_6    (DVB-C 6MHzBW) */
    264	{HELENE_AUTO, 0x05, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00,
    265		HELENE_BW_8,  HELENE_OFFSET(-2), HELENE_OFFSET(-3), 0x00},
    266	/**< SONY_HELENE_DTV_DVBC_8    (DVB-C 8MHzBW) */
    267	{HELENE_AUTO, 0x03, 0x09, 0x09, 0x09, 0x02, 0x02, 0x02, 0x00,
    268		HELENE_BW_6,  HELENE_OFFSET(-6), HELENE_OFFSET(-2), 0x00},
    269	/**< SONY_HELENE_DTV_DVBC2_6   (DVB-C2 6MHzBW) */
    270	{HELENE_AUTO, 0x03, 0x09, 0x09, 0x09, 0x02, 0x02, 0x02, 0x00,
    271		HELENE_BW_8,  HELENE_OFFSET(-2), HELENE_OFFSET(0),  0x00},
    272	/**< SONY_HELENE_DTV_DVBC2_8   (DVB-C2 8MHzBW) */
    273	{HELENE_AUTO, 0x04, 0x0B, 0x0B, 0x0B, 0x02, 0x02, 0x02, 0x00,
    274		HELENE_BW_8,  HELENE_OFFSET(2),  HELENE_OFFSET(1),  0x00}
    275	/**< SONY_HELENE_DTV_DTMB      (DTMB) */
    276};
    277
    278static void helene_i2c_debug(struct helene_priv *priv,
    279		u8 reg, u8 write, const u8 *data, u32 len)
    280{
    281	dev_dbg(&priv->i2c->dev, "helene: I2C %s reg 0x%02x size %d\n",
    282			(write == 0 ? "read" : "write"), reg, len);
    283	print_hex_dump_bytes("helene: I2C data: ",
    284			DUMP_PREFIX_OFFSET, data, len);
    285}
    286
    287static int helene_write_regs(struct helene_priv *priv,
    288		u8 reg, const u8 *data, u32 len)
    289{
    290	int ret;
    291	u8 buf[MAX_WRITE_REGSIZE + 1];
    292	struct i2c_msg msg[1] = {
    293		{
    294			.addr = priv->i2c_address,
    295			.flags = 0,
    296			.len = len + 1,
    297			.buf = buf,
    298		}
    299	};
    300
    301	if (len + 1 > sizeof(buf)) {
    302		dev_warn(&priv->i2c->dev,
    303				"wr reg=%04x: len=%d vs %zu is too big!\n",
    304				reg, len + 1, sizeof(buf));
    305		return -E2BIG;
    306	}
    307
    308	helene_i2c_debug(priv, reg, 1, data, len);
    309	buf[0] = reg;
    310	memcpy(&buf[1], data, len);
    311	ret = i2c_transfer(priv->i2c, msg, 1);
    312	if (ret >= 0 && ret != 1)
    313		ret = -EREMOTEIO;
    314	if (ret < 0) {
    315		dev_warn(&priv->i2c->dev,
    316				"%s: i2c wr failed=%d reg=%02x len=%d\n",
    317				KBUILD_MODNAME, ret, reg, len);
    318		return ret;
    319	}
    320	return 0;
    321}
    322
    323static int helene_write_reg(struct helene_priv *priv, u8 reg, u8 val)
    324{
    325	u8 tmp = val; /* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */
    326
    327	return helene_write_regs(priv, reg, &tmp, 1);
    328}
    329
    330static int helene_read_regs(struct helene_priv *priv,
    331		u8 reg, u8 *val, u32 len)
    332{
    333	int ret;
    334	struct i2c_msg msg[2] = {
    335		{
    336			.addr = priv->i2c_address,
    337			.flags = 0,
    338			.len = 1,
    339			.buf = &reg,
    340		}, {
    341			.addr = priv->i2c_address,
    342			.flags = I2C_M_RD,
    343			.len = len,
    344			.buf = val,
    345		}
    346	};
    347
    348	ret = i2c_transfer(priv->i2c, &msg[0], 1);
    349	if (ret >= 0 && ret != 1)
    350		ret = -EREMOTEIO;
    351	if (ret < 0) {
    352		dev_warn(&priv->i2c->dev,
    353				"%s: I2C rw failed=%d addr=%02x reg=%02x\n",
    354				KBUILD_MODNAME, ret, priv->i2c_address, reg);
    355		return ret;
    356	}
    357	ret = i2c_transfer(priv->i2c, &msg[1], 1);
    358	if (ret >= 0 && ret != 1)
    359		ret = -EREMOTEIO;
    360	if (ret < 0) {
    361		dev_warn(&priv->i2c->dev,
    362				"%s: i2c rd failed=%d addr=%02x reg=%02x\n",
    363				KBUILD_MODNAME, ret, priv->i2c_address, reg);
    364		return ret;
    365	}
    366	helene_i2c_debug(priv, reg, 0, val, len);
    367	return 0;
    368}
    369
    370static int helene_read_reg(struct helene_priv *priv, u8 reg, u8 *val)
    371{
    372	return helene_read_regs(priv, reg, val, 1);
    373}
    374
    375static int helene_set_reg_bits(struct helene_priv *priv,
    376		u8 reg, u8 data, u8 mask)
    377{
    378	int res;
    379	u8 rdata;
    380
    381	if (mask != 0xff) {
    382		res = helene_read_reg(priv, reg, &rdata);
    383		if (res != 0)
    384			return res;
    385		data = ((data & mask) | (rdata & (mask ^ 0xFF)));
    386	}
    387	return helene_write_reg(priv, reg, data);
    388}
    389
    390static int helene_enter_power_save(struct helene_priv *priv)
    391{
    392	dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
    393	if (priv->state == STATE_SLEEP)
    394		return 0;
    395
    396	/* Standby setting for CPU */
    397	helene_write_reg(priv, 0x88, 0x0);
    398
    399	/* Standby setting for internal logic block */
    400	helene_write_reg(priv, 0x87, 0xC0);
    401
    402	priv->state = STATE_SLEEP;
    403	return 0;
    404}
    405
    406static int helene_leave_power_save(struct helene_priv *priv)
    407{
    408	dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
    409	if (priv->state == STATE_ACTIVE)
    410		return 0;
    411
    412	/* Standby setting for internal logic block */
    413	helene_write_reg(priv, 0x87, 0xC4);
    414
    415	/* Standby setting for CPU */
    416	helene_write_reg(priv, 0x88, 0x40);
    417
    418	priv->state = STATE_ACTIVE;
    419	return 0;
    420}
    421
    422static int helene_init(struct dvb_frontend *fe)
    423{
    424	struct helene_priv *priv = fe->tuner_priv;
    425
    426	dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
    427	return helene_leave_power_save(priv);
    428}
    429
    430static void helene_release(struct dvb_frontend *fe)
    431{
    432	struct helene_priv *priv = fe->tuner_priv;
    433
    434	dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
    435	kfree(fe->tuner_priv);
    436	fe->tuner_priv = NULL;
    437}
    438
    439static int helene_sleep(struct dvb_frontend *fe)
    440{
    441	struct helene_priv *priv = fe->tuner_priv;
    442
    443	dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
    444	helene_enter_power_save(priv);
    445	return 0;
    446}
    447
    448static enum helene_tv_system_t helene_get_tv_system(struct dvb_frontend *fe)
    449{
    450	enum helene_tv_system_t system = SONY_HELENE_TV_SYSTEM_UNKNOWN;
    451	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
    452	struct helene_priv *priv = fe->tuner_priv;
    453
    454	if (p->delivery_system == SYS_DVBT) {
    455		if (p->bandwidth_hz <= 5000000)
    456			system = SONY_HELENE_DTV_DVBT_5;
    457		else if (p->bandwidth_hz <= 6000000)
    458			system = SONY_HELENE_DTV_DVBT_6;
    459		else if (p->bandwidth_hz <= 7000000)
    460			system = SONY_HELENE_DTV_DVBT_7;
    461		else if (p->bandwidth_hz <= 8000000)
    462			system = SONY_HELENE_DTV_DVBT_8;
    463		else {
    464			system = SONY_HELENE_DTV_DVBT_8;
    465			p->bandwidth_hz = 8000000;
    466		}
    467	} else if (p->delivery_system == SYS_DVBT2) {
    468		if (p->bandwidth_hz <= 5000000)
    469			system = SONY_HELENE_DTV_DVBT2_5;
    470		else if (p->bandwidth_hz <= 6000000)
    471			system = SONY_HELENE_DTV_DVBT2_6;
    472		else if (p->bandwidth_hz <= 7000000)
    473			system = SONY_HELENE_DTV_DVBT2_7;
    474		else if (p->bandwidth_hz <= 8000000)
    475			system = SONY_HELENE_DTV_DVBT2_8;
    476		else {
    477			system = SONY_HELENE_DTV_DVBT2_8;
    478			p->bandwidth_hz = 8000000;
    479		}
    480	} else if (p->delivery_system == SYS_DVBS) {
    481		system = SONY_HELENE_STV_DVBS;
    482	} else if (p->delivery_system == SYS_DVBS2) {
    483		system = SONY_HELENE_STV_DVBS2;
    484	} else if (p->delivery_system == SYS_ISDBS) {
    485		system = SONY_HELENE_STV_ISDBS;
    486	} else if (p->delivery_system == SYS_ISDBT) {
    487		if (p->bandwidth_hz <= 6000000)
    488			system = SONY_HELENE_DTV_ISDBT_6;
    489		else if (p->bandwidth_hz <= 7000000)
    490			system = SONY_HELENE_DTV_ISDBT_7;
    491		else if (p->bandwidth_hz <= 8000000)
    492			system = SONY_HELENE_DTV_ISDBT_8;
    493		else {
    494			system = SONY_HELENE_DTV_ISDBT_8;
    495			p->bandwidth_hz = 8000000;
    496		}
    497	} else if (p->delivery_system == SYS_DVBC_ANNEX_A) {
    498		if (p->bandwidth_hz <= 6000000)
    499			system = SONY_HELENE_DTV_DVBC_6;
    500		else if (p->bandwidth_hz <= 8000000)
    501			system = SONY_HELENE_DTV_DVBC_8;
    502	}
    503	dev_dbg(&priv->i2c->dev,
    504			"%s(): HELENE DTV system %d (delsys %d, bandwidth %d)\n",
    505			__func__, (int)system, p->delivery_system,
    506			p->bandwidth_hz);
    507	return system;
    508}
    509
    510static int helene_set_params_s(struct dvb_frontend *fe)
    511{
    512	u8 data[MAX_WRITE_REGSIZE];
    513	u32 frequency;
    514	enum helene_tv_system_t tv_system;
    515	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
    516	struct helene_priv *priv = fe->tuner_priv;
    517	int frequencykHz = p->frequency;
    518	uint32_t frequency4kHz = 0;
    519	u32 symbol_rate = p->symbol_rate/1000;
    520
    521	dev_dbg(&priv->i2c->dev, "%s(): tune frequency %dkHz sr=%uKsps\n",
    522			__func__, frequencykHz, symbol_rate);
    523	tv_system = helene_get_tv_system(fe);
    524
    525	if (tv_system == SONY_HELENE_TV_SYSTEM_UNKNOWN) {
    526		dev_err(&priv->i2c->dev, "%s(): unknown DTV system\n",
    527				__func__);
    528		return -EINVAL;
    529	}
    530	/* RF switch turn to satellite */
    531	if (priv->set_tuner)
    532		priv->set_tuner(priv->set_tuner_data, 0);
    533	frequency = roundup(p->frequency / 1000, 1);
    534
    535	/* Disable IF signal output */
    536	helene_write_reg(priv, 0x15, 0x02);
    537
    538	/* RFIN matching in power save (Sat) reset */
    539	helene_write_reg(priv, 0x43, 0x06);
    540
    541	/* Analog block setting (0x6A, 0x6B) */
    542	data[0] = 0x00;
    543	data[1] = 0x00;
    544	helene_write_regs(priv, 0x6A, data, 2);
    545	helene_write_reg(priv, 0x75, 0x99);
    546	helene_write_reg(priv, 0x9D, 0x00);
    547
    548	/* Tuning setting for CPU (0x61) */
    549	helene_write_reg(priv, 0x61, 0x07);
    550
    551	/* Satellite mode select (0x01) */
    552	helene_write_reg(priv, 0x01, 0x01);
    553
    554	/* Clock enable for internal logic block, CPU wake-up (0x04, 0x05) */
    555	data[0] = 0xC4;
    556	data[1] = 0x40;
    557
    558	switch (priv->xtal) {
    559	case SONY_HELENE_XTAL_16000:
    560		data[2] = 0x02;
    561		break;
    562	case SONY_HELENE_XTAL_20500:
    563		data[2] = 0x02;
    564		break;
    565	case SONY_HELENE_XTAL_24000:
    566		data[2] = 0x03;
    567		break;
    568	case SONY_HELENE_XTAL_41000:
    569		data[2] = 0x05;
    570		break;
    571	default:
    572		dev_err(&priv->i2c->dev, "%s(): unknown xtal %d\n",
    573				__func__, priv->xtal);
    574		return -EINVAL;
    575	}
    576
    577	/* Setting for analog block (0x07). LOOPFILTER INTERNAL */
    578	data[3] = 0x80;
    579
    580	/* Tuning setting for analog block
    581	 * (0x08, 0x09, 0x0A, 0x0B). LOOPFILTER INTERNAL
    582	*/
    583	if (priv->xtal == SONY_HELENE_XTAL_20500)
    584		data[4] = 0x58;
    585	else
    586		data[4] = 0x70;
    587
    588	data[5] = 0x1E;
    589	data[6] = 0x02;
    590	data[7] = 0x24;
    591
    592	/* Enable for analog block (0x0C, 0x0D, 0x0E). SAT LNA ON */
    593	data[8] = 0x0F;
    594	data[8] |= 0xE0; /* POWERSAVE_TERR_RF_ACTIVE */
    595	data[9]  = 0x02;
    596	data[10] = 0x1E;
    597
    598	/* Setting for LPF cutoff frequency (0x0F) */
    599	switch (tv_system) {
    600	case SONY_HELENE_STV_ISDBS:
    601		data[11] = 0x22; /* 22MHz */
    602		break;
    603	case SONY_HELENE_STV_DVBS:
    604		if (symbol_rate <= 4000)
    605			data[11] = 0x05;
    606		else if (symbol_rate <= 10000)
    607			data[11] = (uint8_t)((symbol_rate * 47
    608						+ (40000-1)) / 40000);
    609		else
    610			data[11] = (uint8_t)((symbol_rate * 27
    611						+ (40000-1)) / 40000 + 5);
    612
    613		if (data[11] > 36)
    614			data[11] = 36; /* 5 <= lpf_cutoff <= 36 is valid */
    615		break;
    616	case SONY_HELENE_STV_DVBS2:
    617		if (symbol_rate <= 4000)
    618			data[11] = 0x05;
    619		else if (symbol_rate <= 10000)
    620			data[11] = (uint8_t)((symbol_rate * 11
    621						+ (10000-1)) / 10000);
    622		else
    623			data[11] = (uint8_t)((symbol_rate * 3
    624						+ (5000-1)) / 5000 + 5);
    625
    626		if (data[11] > 36)
    627			data[11] = 36; /* 5 <= lpf_cutoff <= 36 is valid */
    628		break;
    629	default:
    630		dev_err(&priv->i2c->dev, "%s(): unknown standard %d\n",
    631				__func__, tv_system);
    632		return -EINVAL;
    633	}
    634
    635	/* RF tuning frequency setting (0x10, 0x11, 0x12) */
    636	frequency4kHz = (frequencykHz + 2) / 4;
    637	data[12] = (uint8_t)(frequency4kHz & 0xFF);         /* FRF_L */
    638	data[13] = (uint8_t)((frequency4kHz >> 8) & 0xFF);  /* FRF_M */
    639	/* FRF_H (bit[3:0]) */
    640	data[14] = (uint8_t)((frequency4kHz >> 16) & 0x0F);
    641
    642	/* Tuning command (0x13) */
    643	data[15] = 0xFF;
    644
    645	/* Setting for IQOUT_LIMIT (0x14) 0.75Vpp */
    646	data[16] = 0x00;
    647
    648	/* Enable IQ output (0x15) */
    649	data[17] = 0x01;
    650
    651	helene_write_regs(priv, 0x04, data, 18);
    652
    653	dev_dbg(&priv->i2c->dev, "%s(): tune done\n",
    654			__func__);
    655
    656	priv->frequency = frequency;
    657	return 0;
    658}
    659
    660static int helene_set_params_t(struct dvb_frontend *fe)
    661{
    662	u8 data[MAX_WRITE_REGSIZE];
    663	u32 frequency;
    664	enum helene_tv_system_t tv_system;
    665	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
    666	struct helene_priv *priv = fe->tuner_priv;
    667	int frequencykHz = p->frequency / 1000;
    668
    669	dev_dbg(&priv->i2c->dev, "%s(): tune frequency %dkHz\n",
    670			__func__, frequencykHz);
    671	tv_system = helene_get_tv_system(fe);
    672
    673	if (tv_system == SONY_HELENE_TV_SYSTEM_UNKNOWN) {
    674		dev_dbg(&priv->i2c->dev, "%s(): unknown DTV system\n",
    675				__func__);
    676		return -EINVAL;
    677	}
    678	if (priv->set_tuner)
    679		priv->set_tuner(priv->set_tuner_data, 1);
    680	frequency = roundup(p->frequency / 1000, 25);
    681
    682	/* mode select */
    683	helene_write_reg(priv, 0x01, 0x00);
    684
    685	/* Disable IF signal output */
    686	helene_write_reg(priv, 0x74, 0x02);
    687
    688	if (priv->state == STATE_SLEEP)
    689		helene_leave_power_save(priv);
    690
    691	/* Initial setting for internal analog block (0x91, 0x92) */
    692	if ((tv_system == SONY_HELENE_DTV_DVBC_6) ||
    693			(tv_system == SONY_HELENE_DTV_DVBC_8)) {
    694		data[0] = 0x16;
    695		data[1] = 0x26;
    696	} else {
    697		data[0] = 0x10;
    698		data[1] = 0x20;
    699	}
    700	helene_write_regs(priv, 0x91, data, 2);
    701
    702	/* Setting for analog block */
    703	if (TERR_INTERNAL_LOOPFILTER_AVAILABLE(tv_system))
    704		data[0] = 0x90;
    705	else
    706		data[0] = 0x00;
    707
    708	/* Setting for local polarity (0x9D) */
    709	data[1] = (uint8_t)(terr_params[tv_system].IS_LOWERLOCAL & 0x01);
    710	helene_write_regs(priv, 0x9C, data, 2);
    711
    712	/* Enable for analog block */
    713	data[0] = 0xEE;
    714	data[1] = 0x02;
    715	data[2] = 0x1E;
    716	data[3] = 0x67; /* Tuning setting for CPU */
    717
    718	/* Setting for PLL reference divider for xtal=24MHz */
    719	if ((tv_system == SONY_HELENE_DTV_DVBC_6) ||
    720			(tv_system == SONY_HELENE_DTV_DVBC_8))
    721		data[4] = 0x18;
    722	else
    723		data[4] = 0x03;
    724
    725	/* Tuning setting for analog block */
    726	if (TERR_INTERNAL_LOOPFILTER_AVAILABLE(tv_system)) {
    727		data[5] = 0x38;
    728		data[6] = 0x1E;
    729		data[7] = 0x02;
    730		data[8] = 0x24;
    731	} else if ((tv_system == SONY_HELENE_DTV_DVBC_6) ||
    732			(tv_system == SONY_HELENE_DTV_DVBC_8)) {
    733		data[5] = 0x1C;
    734		data[6] = 0x78;
    735		data[7] = 0x08;
    736		data[8] = 0x1C;
    737	} else {
    738		data[5] = 0xB4;
    739		data[6] = 0x78;
    740		data[7] = 0x08;
    741		data[8] = 0x30;
    742	}
    743	helene_write_regs(priv, 0x5E, data, 9);
    744
    745	/* LT_AMP_EN should be 0 */
    746	helene_set_reg_bits(priv, 0x67, 0x0, 0x02);
    747
    748	/* Setting for IFOUT_LIMIT */
    749	data[0] = 0x00; /* 1.5Vpp */
    750
    751	/* RF_GAIN setting */
    752	if (terr_params[tv_system].RF_GAIN == HELENE_AUTO)
    753		data[1] = 0x80; /* RF_GAIN_SEL = 1 */
    754	else
    755		data[1] = (uint8_t)((terr_params[tv_system].RF_GAIN
    756					<< 4) & 0x70);
    757
    758	/* IF_BPF_GC setting */
    759	data[1] |= (uint8_t)(terr_params[tv_system].IF_BPF_GC & 0x0F);
    760
    761	/* Setting for internal RFAGC (0x6A, 0x6B, 0x6C) */
    762	data[2] = 0x00;
    763	if (frequencykHz <= 172000) {
    764		data[3] = (uint8_t)(terr_params[tv_system].RFOVLD_DET_LV1_VL
    765				& 0x0F);
    766		data[4] = (uint8_t)(terr_params[tv_system].IFOVLD_DET_LV_VL
    767				& 0x07);
    768	} else if (frequencykHz <= 464000) {
    769		data[3] = (uint8_t)(terr_params[tv_system].RFOVLD_DET_LV1_VH
    770				& 0x0F);
    771		data[4] = (uint8_t)(terr_params[tv_system].IFOVLD_DET_LV_VH
    772				& 0x07);
    773	} else {
    774		data[3] = (uint8_t)(terr_params[tv_system].RFOVLD_DET_LV1_U
    775				& 0x0F);
    776		data[4] = (uint8_t)(terr_params[tv_system].IFOVLD_DET_LV_U
    777				& 0x07);
    778	}
    779	data[4] |= 0x20;
    780
    781	/* Setting for IF frequency and bandwidth */
    782
    783	/* IF filter center frequency offset (IF_BPF_F0) (0x6D) */
    784	data[5] = (uint8_t)((terr_params[tv_system].IF_BPF_F0 << 4) & 0x30);
    785
    786	/* IF filter band width (BW) (0x6D) */
    787	data[5] |= (uint8_t)(terr_params[tv_system].BW & 0x03);
    788
    789	/* IF frequency offset value (FIF_OFFSET) (0x6E) */
    790	data[6] = (uint8_t)(terr_params[tv_system].FIF_OFFSET & 0x1F);
    791
    792	/* IF band width offset value (BW_OFFSET) (0x6F) */
    793	data[7] = (uint8_t)(terr_params[tv_system].BW_OFFSET & 0x1F);
    794
    795	/* RF tuning frequency setting (0x70, 0x71, 0x72) */
    796	data[8]  = (uint8_t)(frequencykHz & 0xFF);         /* FRF_L */
    797	data[9]  = (uint8_t)((frequencykHz >> 8) & 0xFF);  /* FRF_M */
    798	data[10] = (uint8_t)((frequencykHz >> 16)
    799			& 0x0F); /* FRF_H (bit[3:0]) */
    800
    801	/* Tuning command */
    802	data[11] = 0xFF;
    803
    804	/* Enable IF output, AGC and IFOUT pin selection (0x74) */
    805	data[12] = 0x01;
    806
    807	if ((tv_system == SONY_HELENE_DTV_DVBC_6) ||
    808			(tv_system == SONY_HELENE_DTV_DVBC_8)) {
    809		data[13] = 0xD9;
    810		data[14] = 0x0F;
    811		data[15] = 0x24;
    812		data[16] = 0x87;
    813	} else {
    814		data[13] = 0x99;
    815		data[14] = 0x00;
    816		data[15] = 0x24;
    817		data[16] = 0x87;
    818	}
    819
    820	helene_write_regs(priv, 0x68, data, 17);
    821
    822	dev_dbg(&priv->i2c->dev, "%s(): tune done\n",
    823			__func__);
    824
    825	priv->frequency = frequency;
    826	return 0;
    827}
    828
    829static int helene_set_params(struct dvb_frontend *fe)
    830{
    831	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
    832
    833	if (p->delivery_system == SYS_DVBT ||
    834	    p->delivery_system == SYS_DVBT2 ||
    835	    p->delivery_system == SYS_ISDBT ||
    836	    p->delivery_system == SYS_DVBC_ANNEX_A)
    837		return helene_set_params_t(fe);
    838
    839	return helene_set_params_s(fe);
    840}
    841
    842static int helene_get_frequency(struct dvb_frontend *fe, u32 *frequency)
    843{
    844	struct helene_priv *priv = fe->tuner_priv;
    845
    846	*frequency = priv->frequency * 1000;
    847	return 0;
    848}
    849
    850static const struct dvb_tuner_ops helene_tuner_ops_t = {
    851	.info = {
    852		.name = "Sony HELENE Ter tuner",
    853		.frequency_min_hz  =    1 * MHz,
    854		.frequency_max_hz  = 1200 * MHz,
    855		.frequency_step_hz =   25 * kHz,
    856	},
    857	.init = helene_init,
    858	.release = helene_release,
    859	.sleep = helene_sleep,
    860	.set_params = helene_set_params_t,
    861	.get_frequency = helene_get_frequency,
    862};
    863
    864static const struct dvb_tuner_ops helene_tuner_ops_s = {
    865	.info = {
    866		.name = "Sony HELENE Sat tuner",
    867		.frequency_min_hz  =  500 * MHz,
    868		.frequency_max_hz  = 2500 * MHz,
    869		.frequency_step_hz =    1 * MHz,
    870	},
    871	.init = helene_init,
    872	.release = helene_release,
    873	.sleep = helene_sleep,
    874	.set_params = helene_set_params_s,
    875	.get_frequency = helene_get_frequency,
    876};
    877
    878static const struct dvb_tuner_ops helene_tuner_ops = {
    879	.info = {
    880		.name = "Sony HELENE Sat/Ter tuner",
    881		.frequency_min_hz  =    1 * MHz,
    882		.frequency_max_hz  = 2500 * MHz,
    883		.frequency_step_hz =   25 * kHz,
    884	},
    885	.init = helene_init,
    886	.release = helene_release,
    887	.sleep = helene_sleep,
    888	.set_params = helene_set_params,
    889	.get_frequency = helene_get_frequency,
    890};
    891
    892/* power-on tuner
    893 * call once after reset
    894 */
    895static int helene_x_pon(struct helene_priv *priv)
    896{
    897	/* RFIN matching in power save (terrestrial) = ACTIVE */
    898	/* RFIN matching in power save (satellite) = ACTIVE */
    899	u8 dataT[] = { 0x06, 0x00, 0x02, 0x00 };
    900	/* SAT_RF_ACTIVE = true, lnaOff = false, terrRfActive = true */
    901	u8 dataS[] = { 0x05, 0x06 };
    902	u8 cdata[] = {0x7A, 0x01};
    903	u8 data[20];
    904	u8 rdata[2];
    905
    906	/* mode select */
    907	helene_write_reg(priv, 0x01, 0x00);
    908
    909	helene_write_reg(priv, 0x67, dataT[3]);
    910	helene_write_reg(priv, 0x43, dataS[1]);
    911	helene_write_regs(priv, 0x5E, dataT, 3);
    912	helene_write_reg(priv, 0x0C, dataS[0]);
    913
    914	/* Initial setting for internal logic block */
    915	helene_write_regs(priv, 0x99, cdata, sizeof(cdata));
    916
    917	/* 0x81 - 0x94 */
    918	if (priv->xtal == SONY_HELENE_XTAL_16000)
    919		data[0] = 0x10; /* xtal 16 MHz */
    920	else
    921		data[0] = 0x18; /* xtal 24 MHz */
    922	data[1] = (uint8_t)(0x80 | (0x04 & 0x1F)); /* 4 x 25 = 100uA */
    923	data[2] = (uint8_t)(0x80 | (0x26 & 0x7F)); /* 38 x 0.25 = 9.5pF */
    924	data[3] = 0x80; /* REFOUT signal output 500mVpp */
    925	data[4] = 0x00; /* GPIO settings */
    926	data[5] = 0x00; /* GPIO settings */
    927	data[6] = 0xC4; /* Clock enable for internal logic block */
    928	data[7] = 0x40; /* Start CPU boot-up */
    929	data[8] = 0x10; /* For burst-write */
    930
    931	/* Setting for internal RFAGC */
    932	data[9] = 0x00;
    933	data[10] = 0x45;
    934	data[11] = 0x75;
    935
    936	data[12] = 0x07; /* Setting for analog block */
    937
    938	/* Initial setting for internal analog block */
    939	data[13] = 0x1C;
    940	data[14] = 0x3F;
    941	data[15] = 0x02;
    942	data[16] = 0x10;
    943	data[17] = 0x20;
    944	data[18] = 0x0A;
    945	data[19] = 0x00;
    946
    947	helene_write_regs(priv, 0x81, data, sizeof(data));
    948
    949	/* Setting for internal RFAGC */
    950	helene_write_reg(priv, 0x9B, 0x00);
    951
    952	msleep(20);
    953
    954	/* Check CPU_STT/CPU_ERR */
    955	helene_read_regs(priv, 0x1A, rdata, sizeof(rdata));
    956
    957	if (rdata[0] != 0x00) {
    958		dev_err(&priv->i2c->dev,
    959				"HELENE tuner CPU error 0x%x\n", rdata[0]);
    960		return -EIO;
    961	}
    962
    963	/* VCO current setting */
    964	cdata[0] = 0x90;
    965	cdata[1] = 0x06;
    966	helene_write_regs(priv, 0x17, cdata, sizeof(cdata));
    967	msleep(20);
    968	helene_read_reg(priv, 0x19, data);
    969	helene_write_reg(priv, 0x95, (uint8_t)((data[0] >> 4) & 0x0F));
    970
    971	/* Disable IF signal output */
    972	helene_write_reg(priv, 0x74, 0x02);
    973
    974	/* Standby setting for CPU */
    975	helene_write_reg(priv, 0x88, 0x00);
    976
    977	/* Standby setting for internal logic block */
    978	helene_write_reg(priv, 0x87, 0xC0);
    979
    980	/* Load capacitance control setting for crystal oscillator */
    981	helene_write_reg(priv, 0x80, 0x01);
    982
    983	/* Satellite initial setting */
    984	cdata[0] = 0x07;
    985	cdata[1] = 0x00;
    986	helene_write_regs(priv, 0x41, cdata, sizeof(cdata));
    987
    988	dev_info(&priv->i2c->dev,
    989			"HELENE tuner x_pon done\n");
    990
    991	return 0;
    992}
    993
    994struct dvb_frontend *helene_attach_s(struct dvb_frontend *fe,
    995		const struct helene_config *config,
    996		struct i2c_adapter *i2c)
    997{
    998	struct helene_priv *priv = NULL;
    999
   1000	priv = kzalloc(sizeof(struct helene_priv), GFP_KERNEL);
   1001	if (priv == NULL)
   1002		return NULL;
   1003	priv->i2c_address = (config->i2c_address >> 1);
   1004	priv->i2c = i2c;
   1005	priv->set_tuner_data = config->set_tuner_priv;
   1006	priv->set_tuner = config->set_tuner_callback;
   1007	priv->xtal = config->xtal;
   1008
   1009	if (fe->ops.i2c_gate_ctrl)
   1010		fe->ops.i2c_gate_ctrl(fe, 1);
   1011
   1012	if (helene_x_pon(priv) != 0) {
   1013		kfree(priv);
   1014		return NULL;
   1015	}
   1016
   1017	if (fe->ops.i2c_gate_ctrl)
   1018		fe->ops.i2c_gate_ctrl(fe, 0);
   1019
   1020	memcpy(&fe->ops.tuner_ops, &helene_tuner_ops_s,
   1021			sizeof(struct dvb_tuner_ops));
   1022	fe->tuner_priv = priv;
   1023	dev_info(&priv->i2c->dev,
   1024			"Sony HELENE Sat attached on addr=%x at I2C adapter %p\n",
   1025			priv->i2c_address, priv->i2c);
   1026	return fe;
   1027}
   1028EXPORT_SYMBOL(helene_attach_s);
   1029
   1030struct dvb_frontend *helene_attach(struct dvb_frontend *fe,
   1031		const struct helene_config *config,
   1032		struct i2c_adapter *i2c)
   1033{
   1034	struct helene_priv *priv = NULL;
   1035
   1036	priv = kzalloc(sizeof(struct helene_priv), GFP_KERNEL);
   1037	if (priv == NULL)
   1038		return NULL;
   1039	priv->i2c_address = (config->i2c_address >> 1);
   1040	priv->i2c = i2c;
   1041	priv->set_tuner_data = config->set_tuner_priv;
   1042	priv->set_tuner = config->set_tuner_callback;
   1043	priv->xtal = config->xtal;
   1044
   1045	if (fe->ops.i2c_gate_ctrl)
   1046		fe->ops.i2c_gate_ctrl(fe, 1);
   1047
   1048	if (helene_x_pon(priv) != 0) {
   1049		kfree(priv);
   1050		return NULL;
   1051	}
   1052
   1053	if (fe->ops.i2c_gate_ctrl)
   1054		fe->ops.i2c_gate_ctrl(fe, 0);
   1055
   1056	memcpy(&fe->ops.tuner_ops, &helene_tuner_ops_t,
   1057			sizeof(struct dvb_tuner_ops));
   1058	fe->tuner_priv = priv;
   1059	dev_info(&priv->i2c->dev,
   1060			"Sony HELENE Ter attached on addr=%x at I2C adapter %p\n",
   1061			priv->i2c_address, priv->i2c);
   1062	return fe;
   1063}
   1064EXPORT_SYMBOL(helene_attach);
   1065
   1066static int helene_probe(struct i2c_client *client,
   1067			const struct i2c_device_id *id)
   1068{
   1069	struct helene_config *config = client->dev.platform_data;
   1070	struct dvb_frontend *fe = config->fe;
   1071	struct device *dev = &client->dev;
   1072	struct helene_priv *priv;
   1073
   1074	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
   1075	if (!priv)
   1076		return -ENOMEM;
   1077
   1078	priv->i2c_address = client->addr;
   1079	priv->i2c = client->adapter;
   1080	priv->set_tuner_data = config->set_tuner_priv;
   1081	priv->set_tuner = config->set_tuner_callback;
   1082	priv->xtal = config->xtal;
   1083
   1084	if (fe->ops.i2c_gate_ctrl)
   1085		fe->ops.i2c_gate_ctrl(fe, 1);
   1086
   1087	if (helene_x_pon(priv) != 0)
   1088		return -EINVAL;
   1089
   1090	if (fe->ops.i2c_gate_ctrl)
   1091		fe->ops.i2c_gate_ctrl(fe, 0);
   1092
   1093	memcpy(&fe->ops.tuner_ops, &helene_tuner_ops,
   1094	       sizeof(struct dvb_tuner_ops));
   1095	fe->tuner_priv = priv;
   1096	i2c_set_clientdata(client, priv);
   1097
   1098	dev_info(dev, "Sony HELENE attached on addr=%x at I2C adapter %p\n",
   1099		 priv->i2c_address, priv->i2c);
   1100
   1101	return 0;
   1102}
   1103
   1104static const struct i2c_device_id helene_id[] = {
   1105	{ "helene", },
   1106	{}
   1107};
   1108MODULE_DEVICE_TABLE(i2c, helene_id);
   1109
   1110static struct i2c_driver helene_driver = {
   1111	.driver = {
   1112		.name = "helene",
   1113	},
   1114	.probe    = helene_probe,
   1115	.id_table = helene_id,
   1116};
   1117module_i2c_driver(helene_driver);
   1118
   1119MODULE_DESCRIPTION("Sony HELENE Sat/Ter tuner driver");
   1120MODULE_AUTHOR("Abylay Ospan <aospan@netup.ru>");
   1121MODULE_LICENSE("GPL");