/*
 * Afatech AF9013 demodulator driver
 *
 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
 * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
 *
 * Thanks to Afatech who kindly provided information.
 *
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 */

#ifndef AF9013_H
#define AF9013_H

#include <linux/dvb/frontend.h>

/*
 * I2C address: 0x1c, 0x1d
 */

/**
 * struct af9013_platform_data - Platform data for the af9013 driver
 * @clk: Clock frequency.
 * @tuner: Used tuner model.
 * @if_frequency: IF frequency.
 * @ts_mode: TS mode.
 * @ts_output_pin: TS output pin.
 * @spec_inv: Input spectrum inverted.
 * @api_version: Firmware API version.
 * @gpio: GPIOs.
 * @get_dvb_frontend: Get DVB frontend callback.
 */
struct af9013_platform_data {
	/*
	 * 20480000, 25000000, 28000000, 28800000
	 */
	u32 clk;
#define AF9013_TUNER_MXL5003D      3 /* MaxLinear */
#define AF9013_TUNER_MXL5005D     13 /* MaxLinear */
#define AF9013_TUNER_MXL5005R     30 /* MaxLinear */
#define AF9013_TUNER_ENV77H11D5  129 /* Panasonic */
#define AF9013_TUNER_MT2060      130 /* Microtune */
#define AF9013_TUNER_MC44S803    133 /* Freescale */
#define AF9013_TUNER_QT1010      134 /* Quantek */
#define AF9013_TUNER_UNKNOWN     140 /* for can tuners ? */
#define AF9013_TUNER_MT2060_2    147 /* Microtune */
#define AF9013_TUNER_TDA18271    156 /* NXP */
#define AF9013_TUNER_QT1010A     162 /* Quantek */
#define AF9013_TUNER_MXL5007T    177 /* MaxLinear */
#define AF9013_TUNER_TDA18218    179 /* NXP */
	u8 tuner;
	u32 if_frequency;
#define AF9013_TS_MODE_USB       0
#define AF9013_TS_MODE_PARALLEL  1
#define AF9013_TS_MODE_SERIAL    2
	u8 ts_mode;
	u8 ts_output_pin;
	bool spec_inv;
	u8 api_version[4];
#define AF9013_GPIO_ON (1 << 0)
#define AF9013_GPIO_EN (1 << 1)
#define AF9013_GPIO_O  (1 << 2)
#define AF9013_GPIO_I  (1 << 3)
#define AF9013_GPIO_LO (AF9013_GPIO_ON|AF9013_GPIO_EN)
#define AF9013_GPIO_HI (AF9013_GPIO_ON|AF9013_GPIO_EN|AF9013_GPIO_O)
#define AF9013_GPIO_TUNER_ON  (AF9013_GPIO_ON|AF9013_GPIO_EN)
#define AF9013_GPIO_TUNER_OFF (AF9013_GPIO_ON|AF9013_GPIO_EN|AF9013_GPIO_O)
	u8 gpio[4];

	struct dvb_frontend* (*get_dvb_frontend)(struct i2c_client *);

/* private: For legacy media attach wrapper. Do not set value. */
	bool attach_in_use;
	u8 i2c_addr;
	u32 clock;
};

#define af9013_config       af9013_platform_data
#define AF9013_TS_USB       AF9013_TS_MODE_USB
#define AF9013_TS_PARALLEL  AF9013_TS_MODE_PARALLEL
#define AF9013_TS_SERIAL    AF9013_TS_MODE_SERIAL

/*
 * AF9013/5 GPIOs (mostly guessed)
 * demod#1-gpio#0 - set demod#2 i2c-addr for dual devices
 * demod#1-gpio#1 - xtal setting (?)
 * demod#1-gpio#3 - tuner#1
 * demod#2-gpio#0 - tuner#2
 * demod#2-gpio#1 - xtal setting (?)
 */

#if IS_REACHABLE(CONFIG_DVB_AF9013)
extern struct dvb_frontend *af9013_attach(const struct af9013_config *config,
	struct i2c_adapter *i2c);
#else
static inline struct dvb_frontend *af9013_attach(
const struct af9013_config *config, struct i2c_adapter *i2c)
{
	pr_warn("%s: driver disabled by Kconfig\n", __func__);
	return NULL;
}
#endif /* CONFIG_DVB_AF9013 */

#endif /* AF9013_H */
