159 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * Montage Technology M88DS3103/M88RS6000 demodulator driver4 *5 * Copyright (C) 2013 Antti Palosaari <crope@iki.fi>6 */7 8#ifndef M88DS3103_H9#define M88DS3103_H10 11#include <linux/dvb/frontend.h>12 13/*14 * I2C address15 * 0x68,16 */17 18/**19 * enum m88ds3103_ts_mode - TS connection mode20 * @M88DS3103_TS_SERIAL: TS output pin D0, normal21 * @M88DS3103_TS_SERIAL_D7: TS output pin D722 * @M88DS3103_TS_PARALLEL: TS Parallel mode23 * @M88DS3103_TS_CI: TS CI Mode24 */25enum m88ds3103_ts_mode {26 M88DS3103_TS_SERIAL,27 M88DS3103_TS_SERIAL_D7,28 M88DS3103_TS_PARALLEL,29 M88DS3103_TS_CI30};31 32/**33 * enum m88ds3103_clock_out34 * @M88DS3103_CLOCK_OUT_DISABLED: Clock output is disabled35 * @M88DS3103_CLOCK_OUT_ENABLED: Clock output is enabled with crystal36 * clock.37 * @M88DS3103_CLOCK_OUT_ENABLED_DIV2: Clock output is enabled with half38 * crystal clock.39 */40enum m88ds3103_clock_out {41 M88DS3103_CLOCK_OUT_DISABLED,42 M88DS3103_CLOCK_OUT_ENABLED,43 M88DS3103_CLOCK_OUT_ENABLED_DIV244};45 46/**47 * struct m88ds3103_platform_data - Platform data for the m88ds3103 driver48 * @clk: Clock frequency.49 * @i2c_wr_max: Max bytes I2C adapter can write at once.50 * @ts_mode: TS mode.51 * @ts_clk: TS clock (KHz).52 * @ts_clk_pol: TS clk polarity. 1-active at falling edge; 0-active at rising53 * edge.54 * @spec_inv: Input spectrum inversion.55 * @agc: AGC configuration.56 * @agc_inv: AGC polarity.57 * @clk_out: Clock output.58 * @envelope_mode: DiSEqC envelope mode.59 * @lnb_hv_pol: LNB H/V pin polarity. 0: pin high set to VOLTAGE_18, pin low to60 * set VOLTAGE_13. 1: pin high set to VOLTAGE_13, pin low to set VOLTAGE_18.61 * @lnb_en_pol: LNB enable pin polarity. 0: pin high to disable, pin low to62 * enable. 1: pin high to enable, pin low to disable.63 * @get_dvb_frontend: Get DVB frontend.64 * @get_i2c_adapter: Get I2C adapter.65 */66struct m88ds3103_platform_data {67 u32 clk;68 u16 i2c_wr_max;69 enum m88ds3103_ts_mode ts_mode;70 u32 ts_clk;71 enum m88ds3103_clock_out clk_out;72 u8 ts_clk_pol:1;73 u8 spec_inv:1;74 u8 agc;75 u8 agc_inv:1;76 u8 envelope_mode:1;77 u8 lnb_hv_pol:1;78 u8 lnb_en_pol:1;79 80 struct dvb_frontend* (*get_dvb_frontend)(struct i2c_client *);81 struct i2c_adapter* (*get_i2c_adapter)(struct i2c_client *);82 83/* private: For legacy media attach wrapper. Do not set value. */84 u8 attach_in_use:1;85};86 87/**88 * struct m88ds3103_config - m88ds3102 configuration89 *90 * @i2c_addr: I2C address. Default: none, must set. Example: 0x68, ...91 * @clock: Device's clock. Default: none, must set. Example: 2700000092 * @i2c_wr_max: Max bytes I2C provider is asked to write at once.93 * Default: none, must set. Example: 33, 65, ...94 * @ts_mode: TS output mode, as defined by &enum m88ds3103_ts_mode.95 * Default: M88DS3103_TS_SERIAL.96 * @ts_clk: TS clk in KHz. Default: 0.97 * @ts_clk_pol: TS clk polarity.Default: 0.98 * 1-active at falling edge; 0-active at rising edge.99 * @spec_inv: Spectrum inversion. Default: 0.100 * @agc_inv: AGC polarity. Default: 0.101 * @clock_out: Clock output, as defined by &enum m88ds3103_clock_out.102 * Default: M88DS3103_CLOCK_OUT_DISABLED.103 * @envelope_mode: DiSEqC envelope mode. Default: 0.104 * @agc: AGC configuration. Default: none, must set.105 * @lnb_hv_pol: LNB H/V pin polarity. Default: 0. Values:106 * 1: pin high set to VOLTAGE_13, pin low to set VOLTAGE_18;107 * 0: pin high set to VOLTAGE_18, pin low to set VOLTAGE_13.108 * @lnb_en_pol: LNB enable pin polarity. Default: 0. Values:109 * 1: pin high to enable, pin low to disable;110 * 0: pin high to disable, pin low to enable.111 */112struct m88ds3103_config {113 u8 i2c_addr;114 u32 clock;115 u16 i2c_wr_max;116 u8 ts_mode;117 u32 ts_clk;118 u8 ts_clk_pol:1;119 u8 spec_inv:1;120 u8 agc_inv:1;121 u8 clock_out;122 u8 envelope_mode:1;123 u8 agc;124 u8 lnb_hv_pol:1;125 u8 lnb_en_pol:1;126};127 128#if defined(CONFIG_DVB_M88DS3103) || \129 (defined(CONFIG_DVB_M88DS3103_MODULE) && defined(MODULE))130/**131 * m88ds3103_attach - Attach a m88ds3103 demod132 *133 * @config: pointer to &struct m88ds3103_config with demod configuration.134 * @i2c: i2c adapter to use.135 * @tuner_i2c: on success, returns the I2C adapter associated with136 * m88ds3103 tuner.137 *138 * return: FE pointer on success, NULL on failure.139 * Note: Do not add new m88ds3103_attach() users! Use I2C bindings instead.140 */141extern struct dvb_frontend *m88ds3103_attach(142 const struct m88ds3103_config *config,143 struct i2c_adapter *i2c,144 struct i2c_adapter **tuner_i2c);145extern int m88ds3103_get_agc_pwm(struct dvb_frontend *fe, u8 *_agc_pwm);146#else147static inline struct dvb_frontend *m88ds3103_attach(148 const struct m88ds3103_config *config,149 struct i2c_adapter *i2c,150 struct i2c_adapter **tuner_i2c)151{152 pr_warn("%s: driver disabled by Kconfig\n", __func__);153 return NULL;154}155#define m88ds3103_get_agc_pwm NULL156#endif157 158#endif159