1c942fddfSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2395d00d1SAntti Palosaari /* 37978b8a1SAntti Palosaari * Montage Technology M88DS3103/M88RS6000 demodulator driver 4395d00d1SAntti Palosaari * 5395d00d1SAntti Palosaari * Copyright (C) 2013 Antti Palosaari <crope@iki.fi> 6395d00d1SAntti Palosaari */ 7395d00d1SAntti Palosaari 8395d00d1SAntti Palosaari #ifndef M88DS3103_H 9395d00d1SAntti Palosaari #define M88DS3103_H 10395d00d1SAntti Palosaari 11395d00d1SAntti Palosaari #include <linux/dvb/frontend.h> 12395d00d1SAntti Palosaari 13f01919e8SAntti Palosaari /* 14f01919e8SAntti Palosaari * I2C address 15f01919e8SAntti Palosaari * 0x68, 16f01919e8SAntti Palosaari */ 17f01919e8SAntti Palosaari 18f01919e8SAntti Palosaari /** 19be9b53c8SMauro Carvalho Chehab * enum m88ds3103_ts_mode - TS connection mode 20be9b53c8SMauro Carvalho Chehab * @M88DS3103_TS_SERIAL: TS output pin D0, normal 21be9b53c8SMauro Carvalho Chehab * @M88DS3103_TS_SERIAL_D7: TS output pin D7 22be9b53c8SMauro Carvalho Chehab * @M88DS3103_TS_PARALLEL: TS Parallel mode 23be9b53c8SMauro Carvalho Chehab * @M88DS3103_TS_CI: TS CI Mode 24be9b53c8SMauro Carvalho Chehab */ 25be9b53c8SMauro Carvalho Chehab enum m88ds3103_ts_mode { 26be9b53c8SMauro Carvalho Chehab M88DS3103_TS_SERIAL, 27be9b53c8SMauro Carvalho Chehab M88DS3103_TS_SERIAL_D7, 28be9b53c8SMauro Carvalho Chehab M88DS3103_TS_PARALLEL, 29be9b53c8SMauro Carvalho Chehab M88DS3103_TS_CI 30be9b53c8SMauro Carvalho Chehab }; 31be9b53c8SMauro Carvalho Chehab 32be9b53c8SMauro Carvalho Chehab /** 33be9b53c8SMauro Carvalho Chehab * enum m88ds3103_clock_out 34be9b53c8SMauro Carvalho Chehab * @M88DS3103_CLOCK_OUT_DISABLED: Clock output is disabled 35be9b53c8SMauro Carvalho Chehab * @M88DS3103_CLOCK_OUT_ENABLED: Clock output is enabled with crystal 36be9b53c8SMauro Carvalho Chehab * clock. 37be9b53c8SMauro Carvalho Chehab * @M88DS3103_CLOCK_OUT_ENABLED_DIV2: Clock output is enabled with half 38be9b53c8SMauro Carvalho Chehab * crystal clock. 39be9b53c8SMauro Carvalho Chehab */ 40be9b53c8SMauro Carvalho Chehab enum m88ds3103_clock_out { 41be9b53c8SMauro Carvalho Chehab M88DS3103_CLOCK_OUT_DISABLED, 42be9b53c8SMauro Carvalho Chehab M88DS3103_CLOCK_OUT_ENABLED, 43be9b53c8SMauro Carvalho Chehab M88DS3103_CLOCK_OUT_ENABLED_DIV2 44be9b53c8SMauro Carvalho Chehab }; 45be9b53c8SMauro Carvalho Chehab 46be9b53c8SMauro Carvalho Chehab /** 47f01919e8SAntti Palosaari * struct m88ds3103_platform_data - Platform data for the m88ds3103 driver 48f01919e8SAntti Palosaari * @clk: Clock frequency. 49f01919e8SAntti Palosaari * @i2c_wr_max: Max bytes I2C adapter can write at once. 50f01919e8SAntti Palosaari * @ts_mode: TS mode. 51f01919e8SAntti Palosaari * @ts_clk: TS clock (KHz). 52f01919e8SAntti Palosaari * @ts_clk_pol: TS clk polarity. 1-active at falling edge; 0-active at rising 53f01919e8SAntti Palosaari * edge. 54f01919e8SAntti Palosaari * @spec_inv: Input spectrum inversion. 55f01919e8SAntti Palosaari * @agc: AGC configuration. 56f01919e8SAntti Palosaari * @agc_inv: AGC polarity. 57f01919e8SAntti Palosaari * @clk_out: Clock output. 58f01919e8SAntti Palosaari * @envelope_mode: DiSEqC envelope mode. 59f01919e8SAntti Palosaari * @lnb_hv_pol: LNB H/V pin polarity. 0: pin high set to VOLTAGE_18, pin low to 60f01919e8SAntti Palosaari * set VOLTAGE_13. 1: pin high set to VOLTAGE_13, pin low to set VOLTAGE_18. 61f01919e8SAntti Palosaari * @lnb_en_pol: LNB enable pin polarity. 0: pin high to disable, pin low to 62f01919e8SAntti Palosaari * enable. 1: pin high to enable, pin low to disable. 63f01919e8SAntti Palosaari * @get_dvb_frontend: Get DVB frontend. 64f01919e8SAntti Palosaari * @get_i2c_adapter: Get I2C adapter. 65f01919e8SAntti Palosaari */ 66f01919e8SAntti Palosaari struct m88ds3103_platform_data { 67f01919e8SAntti Palosaari u32 clk; 68f01919e8SAntti Palosaari u16 i2c_wr_max; 69be9b53c8SMauro Carvalho Chehab enum m88ds3103_ts_mode ts_mode; 70f01919e8SAntti Palosaari u32 ts_clk; 71be9b53c8SMauro Carvalho Chehab enum m88ds3103_clock_out clk_out; 72f01919e8SAntti Palosaari u8 ts_clk_pol:1; 73f01919e8SAntti Palosaari u8 spec_inv:1; 74f01919e8SAntti Palosaari u8 agc; 75f01919e8SAntti Palosaari u8 agc_inv:1; 76f01919e8SAntti Palosaari u8 envelope_mode:1; 77f01919e8SAntti Palosaari u8 lnb_hv_pol:1; 78f01919e8SAntti Palosaari u8 lnb_en_pol:1; 79f01919e8SAntti Palosaari 80f01919e8SAntti Palosaari struct dvb_frontend* (*get_dvb_frontend)(struct i2c_client *); 81f01919e8SAntti Palosaari struct i2c_adapter* (*get_i2c_adapter)(struct i2c_client *); 82f01919e8SAntti Palosaari 83f01919e8SAntti Palosaari /* private: For legacy media attach wrapper. Do not set value. */ 84f01919e8SAntti Palosaari u8 attach_in_use:1; 85f01919e8SAntti Palosaari }; 86f01919e8SAntti Palosaari 87be9b53c8SMauro Carvalho Chehab /** 88be9b53c8SMauro Carvalho Chehab * struct m88ds3103_config - m88ds3102 configuration 89be9b53c8SMauro Carvalho Chehab * 90be9b53c8SMauro Carvalho Chehab * @i2c_addr: I2C address. Default: none, must set. Example: 0x68, ... 91be9b53c8SMauro Carvalho Chehab * @clock: Device's clock. Default: none, must set. Example: 27000000 92be9b53c8SMauro Carvalho Chehab * @i2c_wr_max: Max bytes I2C provider is asked to write at once. 93be9b53c8SMauro Carvalho Chehab * Default: none, must set. Example: 33, 65, ... 94be9b53c8SMauro Carvalho Chehab * @ts_mode: TS output mode, as defined by &enum m88ds3103_ts_mode. 95be9b53c8SMauro Carvalho Chehab * Default: M88DS3103_TS_SERIAL. 96be9b53c8SMauro Carvalho Chehab * @ts_clk: TS clk in KHz. Default: 0. 97be9b53c8SMauro Carvalho Chehab * @ts_clk_pol: TS clk polarity.Default: 0. 98be9b53c8SMauro Carvalho Chehab * 1-active at falling edge; 0-active at rising edge. 99be9b53c8SMauro Carvalho Chehab * @spec_inv: Spectrum inversion. Default: 0. 100be9b53c8SMauro Carvalho Chehab * @agc_inv: AGC polarity. Default: 0. 101be9b53c8SMauro Carvalho Chehab * @clock_out: Clock output, as defined by &enum m88ds3103_clock_out. 102be9b53c8SMauro Carvalho Chehab * Default: M88DS3103_CLOCK_OUT_DISABLED. 103be9b53c8SMauro Carvalho Chehab * @envelope_mode: DiSEqC envelope mode. Default: 0. 104be9b53c8SMauro Carvalho Chehab * @agc: AGC configuration. Default: none, must set. 105be9b53c8SMauro Carvalho Chehab * @lnb_hv_pol: LNB H/V pin polarity. Default: 0. Values: 106be9b53c8SMauro Carvalho Chehab * 1: pin high set to VOLTAGE_13, pin low to set VOLTAGE_18; 10779d09330Snibble.max * 0: pin high set to VOLTAGE_18, pin low to set VOLTAGE_13. 108be9b53c8SMauro Carvalho Chehab * @lnb_en_pol: LNB enable pin polarity. Default: 0. Values: 109be9b53c8SMauro Carvalho Chehab * 1: pin high to enable, pin low to disable; 11079d09330Snibble.max * 0: pin high to disable, pin low to enable. 11179d09330Snibble.max */ 112be9b53c8SMauro Carvalho Chehab struct m88ds3103_config { 113be9b53c8SMauro Carvalho Chehab u8 i2c_addr; 114be9b53c8SMauro Carvalho Chehab u32 clock; 115be9b53c8SMauro Carvalho Chehab u16 i2c_wr_max; 116be9b53c8SMauro Carvalho Chehab u8 ts_mode; 117be9b53c8SMauro Carvalho Chehab u32 ts_clk; 118be9b53c8SMauro Carvalho Chehab u8 ts_clk_pol:1; 119be9b53c8SMauro Carvalho Chehab u8 spec_inv:1; 120be9b53c8SMauro Carvalho Chehab u8 agc_inv:1; 121be9b53c8SMauro Carvalho Chehab u8 clock_out; 122be9b53c8SMauro Carvalho Chehab u8 envelope_mode:1; 123be9b53c8SMauro Carvalho Chehab u8 agc; 124be9b53c8SMauro Carvalho Chehab u8 lnb_hv_pol:1; 12579d09330Snibble.max u8 lnb_en_pol:1; 126395d00d1SAntti Palosaari }; 127395d00d1SAntti Palosaari 128395d00d1SAntti Palosaari #if defined(CONFIG_DVB_M88DS3103) || \ 129395d00d1SAntti Palosaari (defined(CONFIG_DVB_M88DS3103_MODULE) && defined(MODULE)) 130be9b53c8SMauro Carvalho Chehab /** 131be9b53c8SMauro Carvalho Chehab * Attach a m88ds3103 demod 132be9b53c8SMauro Carvalho Chehab * 133be9b53c8SMauro Carvalho Chehab * @config: pointer to &struct m88ds3103_config with demod configuration. 134be9b53c8SMauro Carvalho Chehab * @i2c: i2c adapter to use. 135be9b53c8SMauro Carvalho Chehab * @tuner_i2c: on success, returns the I2C adapter associated with 136be9b53c8SMauro Carvalho Chehab * m88ds3103 tuner. 137be9b53c8SMauro Carvalho Chehab * 138be9b53c8SMauro Carvalho Chehab * return: FE pointer on success, NULL on failure. 139be9b53c8SMauro Carvalho Chehab * Note: Do not add new m88ds3103_attach() users! Use I2C bindings instead. 140be9b53c8SMauro Carvalho Chehab */ 141395d00d1SAntti Palosaari extern struct dvb_frontend *m88ds3103_attach( 142395d00d1SAntti Palosaari const struct m88ds3103_config *config, 143395d00d1SAntti Palosaari struct i2c_adapter *i2c, 144395d00d1SAntti Palosaari struct i2c_adapter **tuner_i2c); 1450f91c9d6SDavid Howells extern int m88ds3103_get_agc_pwm(struct dvb_frontend *fe, u8 *_agc_pwm); 146395d00d1SAntti Palosaari #else 147395d00d1SAntti Palosaari static inline struct dvb_frontend *m88ds3103_attach( 148395d00d1SAntti Palosaari const struct m88ds3103_config *config, 149395d00d1SAntti Palosaari struct i2c_adapter *i2c, 150395d00d1SAntti Palosaari struct i2c_adapter **tuner_i2c) 151395d00d1SAntti Palosaari { 152395d00d1SAntti Palosaari pr_warn("%s: driver disabled by Kconfig\n", __func__); 153395d00d1SAntti Palosaari return NULL; 154395d00d1SAntti Palosaari } 1550f91c9d6SDavid Howells #define m88ds3103_get_agc_pwm NULL 156395d00d1SAntti Palosaari #endif 157395d00d1SAntti Palosaari 158395d00d1SAntti Palosaari #endif 159