summaryrefslogtreecommitdiff
path: root/drivers/media/dvb-frontends/cxd2820r.h
blob: a49400c0e28eac26d2a689080bb7eb209c855377 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
 * Sony CXD2820R demodulator driver
 *
 * Copyright (C) 2010 Antti Palosaari <crope@iki.fi>
 *
 *    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.
 *
 *    You should have received a copy of the GNU General Public License along
 *    with this program; if not, write to the Free Software Foundation, Inc.,
 *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */


#ifndef CXD2820R_H
#define CXD2820R_H

#include <linux/dvb/frontend.h>

#define CXD2820R_GPIO_D (0 << 0) /* disable */
#define CXD2820R_GPIO_E (1 << 0) /* enable */
#define CXD2820R_GPIO_O (0 << 1) /* output */
#define CXD2820R_GPIO_I (1 << 1) /* input */
#define CXD2820R_GPIO_L (0 << 2) /* output low */
#define CXD2820R_GPIO_H (1 << 2) /* output high */

#define CXD2820R_TS_SERIAL        0x08
#define CXD2820R_TS_SERIAL_MSB    0x28
#define CXD2820R_TS_PARALLEL      0x30
#define CXD2820R_TS_PARALLEL_MSB  0x70

/*
 * I2C address: 0x6c, 0x6d
 */

/**
 * struct cxd2820r_platform_data - Platform data for the cxd2820r driver
 * @ts_mode: TS mode.
 * @ts_clk_inv: TS clock inverted.
 * @if_agc_polarity: IF AGC polarity.
 * @spec_inv: Input spectrum inverted.
 * @gpio_chip_base: GPIO.
 * @get_dvb_frontend: Get DVB frontend.
 */
struct cxd2820r_platform_data {
	u8 ts_mode;
	bool ts_clk_inv;
	bool if_agc_polarity;
	bool spec_inv;
	int **gpio_chip_base;

	struct dvb_frontend* (*get_dvb_frontend)(struct i2c_client *);
/* private: For legacy media attach wrapper. Do not set value. */
	bool attach_in_use;
};

/**
 * struct cxd2820r_config - configuration for cxd2020r demod
 *
 * @i2c_address: Demodulator I2C address. Driver determines DVB-C slave I2C
 *		 address automatically from master address.
 *		 Default: none, must set. Values: 0x6c, 0x6d.
 * @ts_mode:	TS output mode. Default: none, must set. Values: FIXME?
 * @ts_clock_inv: TS clock inverted. Default: 0. Values: 0, 1.
 * @if_agc_polarity: Default: 0. Values: 0, 1
 * @spec_inv:	Spectrum inversion. Default: 0. Values: 0, 1.
 */
struct cxd2820r_config {
	/* Demodulator I2C address.
	 * Driver determines DVB-C slave I2C address automatically from master
	 * address.
	 * Default: none, must set
	 * Values: 0x6c, 0x6d
	 */
	u8 i2c_address;

	/* TS output mode.
	 * Default: none, must set.
	 * Values:
	 */
	u8 ts_mode;

	/* TS clock inverted.
	 * Default: 0
	 * Values: 0, 1
	 */
	bool ts_clock_inv;

	/* IF AGC polarity.
	 * Default: 0
	 * Values: 0, 1
	 */
	bool if_agc_polarity;

	/* Spectrum inversion.
	 * Default: 0
	 * Values: 0, 1
	 */
	bool spec_inv;
};


#if IS_REACHABLE(CONFIG_DVB_CXD2820R)
/**
 * Attach a cxd2820r demod
 *
 * @config: pointer to &struct cxd2820r_config with demod configuration.
 * @i2c: i2c adapter to use.
 * @gpio_chip_base: if zero, disables GPIO setting. Otherwise, if
 *		    CONFIG_GPIOLIB is set dynamically allocate
 *		    gpio base; if is not set, use its value to
 *		    setup the GPIO pins.
 *
 * return: FE pointer on success, NULL on failure.
 */
extern struct dvb_frontend *cxd2820r_attach(
	const struct cxd2820r_config *config,
	struct i2c_adapter *i2c,
	int *gpio_chip_base
);
#else
static inline struct dvb_frontend *cxd2820r_attach(
	const struct cxd2820r_config *config,
	struct i2c_adapter *i2c,
	int *gpio_chip_base
)
{
	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
	return NULL;
}

#endif

#endif /* CXD2820R_H */