1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * drivers/media/radio/si470x/radio-si470x.h |
4 | * |
5 | * Driver for radios with Silicon Labs Si470x FM Radio Receivers |
6 | * |
7 | * Copyright (c) 2009 Tobias Lorenz <tobias.lorenz@gmx.net> |
8 | */ |
9 | |
10 | |
11 | /* driver definitions */ |
12 | #define DRIVER_NAME "radio-si470x" |
13 | |
14 | |
15 | /* kernel includes */ |
16 | #include <linux/kernel.h> |
17 | #include <linux/module.h> |
18 | #include <linux/init.h> |
19 | #include <linux/sched.h> |
20 | #include <linux/slab.h> |
21 | #include <linux/input.h> |
22 | #include <linux/videodev2.h> |
23 | #include <linux/mutex.h> |
24 | #include <media/v4l2-common.h> |
25 | #include <media/v4l2-ioctl.h> |
26 | #include <media/v4l2-ctrls.h> |
27 | #include <media/v4l2-event.h> |
28 | #include <media/v4l2-device.h> |
29 | #include <asm/unaligned.h> |
30 | |
31 | |
32 | |
33 | /************************************************************************** |
34 | * Register Definitions |
35 | **************************************************************************/ |
36 | #define RADIO_REGISTER_SIZE 2 /* 16 register bit width */ |
37 | #define RADIO_REGISTER_NUM 16 /* DEVICEID ... RDSD */ |
38 | #define RDS_REGISTER_NUM 6 /* STATUSRSSI ... RDSD */ |
39 | |
40 | #define DEVICEID 0 /* Device ID */ |
41 | #define DEVICEID_PN 0xf000 /* bits 15..12: Part Number */ |
42 | #define DEVICEID_MFGID 0x0fff /* bits 11..00: Manufacturer ID */ |
43 | |
44 | #define SI_CHIPID 1 /* Chip ID */ |
45 | #define SI_CHIPID_REV 0xfc00 /* bits 15..10: Chip Version */ |
46 | #define SI_CHIPID_DEV 0x0200 /* bits 09..09: Device */ |
47 | #define SI_CHIPID_FIRMWARE 0x01ff /* bits 08..00: Firmware Version */ |
48 | |
49 | #define POWERCFG 2 /* Power Configuration */ |
50 | #define POWERCFG_DSMUTE 0x8000 /* bits 15..15: Softmute Disable */ |
51 | #define POWERCFG_DMUTE 0x4000 /* bits 14..14: Mute Disable */ |
52 | #define POWERCFG_MONO 0x2000 /* bits 13..13: Mono Select */ |
53 | #define POWERCFG_RDSM 0x0800 /* bits 11..11: RDS Mode (Si4701 only) */ |
54 | #define POWERCFG_SKMODE 0x0400 /* bits 10..10: Seek Mode */ |
55 | #define POWERCFG_SEEKUP 0x0200 /* bits 09..09: Seek Direction */ |
56 | #define POWERCFG_SEEK 0x0100 /* bits 08..08: Seek */ |
57 | #define POWERCFG_DISABLE 0x0040 /* bits 06..06: Powerup Disable */ |
58 | #define POWERCFG_ENABLE 0x0001 /* bits 00..00: Powerup Enable */ |
59 | |
60 | #define CHANNEL 3 /* Channel */ |
61 | #define CHANNEL_TUNE 0x8000 /* bits 15..15: Tune */ |
62 | #define CHANNEL_CHAN 0x03ff /* bits 09..00: Channel Select */ |
63 | |
64 | #define SYSCONFIG1 4 /* System Configuration 1 */ |
65 | #define SYSCONFIG1_RDSIEN 0x8000 /* bits 15..15: RDS Interrupt Enable (Si4701 only) */ |
66 | #define SYSCONFIG1_STCIEN 0x4000 /* bits 14..14: Seek/Tune Complete Interrupt Enable */ |
67 | #define SYSCONFIG1_RDS 0x1000 /* bits 12..12: RDS Enable (Si4701 only) */ |
68 | #define SYSCONFIG1_DE 0x0800 /* bits 11..11: De-emphasis (0=75us 1=50us) */ |
69 | #define SYSCONFIG1_AGCD 0x0400 /* bits 10..10: AGC Disable */ |
70 | #define SYSCONFIG1_BLNDADJ 0x00c0 /* bits 07..06: Stereo/Mono Blend Level Adjustment */ |
71 | #define SYSCONFIG1_GPIO3 0x0030 /* bits 05..04: General Purpose I/O 3 */ |
72 | #define SYSCONFIG1_GPIO2 0x000c /* bits 03..02: General Purpose I/O 2 */ |
73 | #define SYSCONFIG1_GPIO2_DIS 0x0000 /* Disable GPIO 2 interrupt */ |
74 | #define SYSCONFIG1_GPIO2_INT 0x0004 /* Enable STC/RDS interrupt */ |
75 | #define SYSCONFIG1_GPIO1 0x0003 /* bits 01..00: General Purpose I/O 1 */ |
76 | |
77 | #define SYSCONFIG2 5 /* System Configuration 2 */ |
78 | #define SYSCONFIG2_SEEKTH 0xff00 /* bits 15..08: RSSI Seek Threshold */ |
79 | #define SYSCONFIG2_BAND 0x00c0 /* bits 07..06: Band Select */ |
80 | #define SYSCONFIG2_SPACE 0x0030 /* bits 05..04: Channel Spacing */ |
81 | #define SYSCONFIG2_VOLUME 0x000f /* bits 03..00: Volume */ |
82 | |
83 | #define SYSCONFIG3 6 /* System Configuration 3 */ |
84 | #define SYSCONFIG3_SMUTER 0xc000 /* bits 15..14: Softmute Attack/Recover Rate */ |
85 | #define SYSCONFIG3_SMUTEA 0x3000 /* bits 13..12: Softmute Attenuation */ |
86 | #define SYSCONFIG3_SKSNR 0x00f0 /* bits 07..04: Seek SNR Threshold */ |
87 | #define SYSCONFIG3_SKCNT 0x000f /* bits 03..00: Seek FM Impulse Detection Threshold */ |
88 | |
89 | #define TEST1 7 /* Test 1 */ |
90 | #define TEST1_AHIZEN 0x4000 /* bits 14..14: Audio High-Z Enable */ |
91 | |
92 | #define TEST2 8 /* Test 2 */ |
93 | /* TEST2 only contains reserved bits */ |
94 | |
95 | #define BOOTCONFIG 9 /* Boot Configuration */ |
96 | /* BOOTCONFIG only contains reserved bits */ |
97 | |
98 | #define 10 /* Status RSSI */ |
99 | #define 0x8000 /* bits 15..15: RDS Ready (Si4701 only) */ |
100 | #define 0x4000 /* bits 14..14: Seek/Tune Complete */ |
101 | #define 0x2000 /* bits 13..13: Seek Fail/Band Limit */ |
102 | #define 0x1000 /* bits 12..12: AFC Rail */ |
103 | #define 0x0800 /* bits 11..11: RDS Synchronized (Si4701 only) */ |
104 | #define 0x0600 /* bits 10..09: RDS Block A Errors (Si4701 only) */ |
105 | #define 0x0100 /* bits 08..08: Stereo Indicator */ |
106 | #define 0x00ff /* bits 07..00: RSSI (Received Signal Strength Indicator) */ |
107 | |
108 | #define READCHAN 11 /* Read Channel */ |
109 | #define READCHAN_BLERB 0xc000 /* bits 15..14: RDS Block D Errors (Si4701 only) */ |
110 | #define READCHAN_BLERC 0x3000 /* bits 13..12: RDS Block C Errors (Si4701 only) */ |
111 | #define READCHAN_BLERD 0x0c00 /* bits 11..10: RDS Block B Errors (Si4701 only) */ |
112 | #define READCHAN_READCHAN 0x03ff /* bits 09..00: Read Channel */ |
113 | |
114 | #define RDSA 12 /* RDSA */ |
115 | #define RDSA_RDSA 0xffff /* bits 15..00: RDS Block A Data (Si4701 only) */ |
116 | |
117 | #define RDSB 13 /* RDSB */ |
118 | #define RDSB_RDSB 0xffff /* bits 15..00: RDS Block B Data (Si4701 only) */ |
119 | |
120 | #define RDSC 14 /* RDSC */ |
121 | #define RDSC_RDSC 0xffff /* bits 15..00: RDS Block C Data (Si4701 only) */ |
122 | |
123 | #define RDSD 15 /* RDSD */ |
124 | #define RDSD_RDSD 0xffff /* bits 15..00: RDS Block D Data (Si4701 only) */ |
125 | |
126 | |
127 | |
128 | /************************************************************************** |
129 | * General Driver Definitions |
130 | **************************************************************************/ |
131 | |
132 | /* |
133 | * si470x_device - private data |
134 | */ |
135 | struct si470x_device { |
136 | struct v4l2_device v4l2_dev; |
137 | struct video_device videodev; |
138 | struct v4l2_ctrl_handler hdl; |
139 | int band; |
140 | |
141 | /* Silabs internal registers (0..15) */ |
142 | unsigned short registers[RADIO_REGISTER_NUM]; |
143 | |
144 | /* RDS receive buffer */ |
145 | wait_queue_head_t read_queue; |
146 | struct mutex lock; /* buffer locking */ |
147 | unsigned char *buffer; /* size is always multiple of three */ |
148 | unsigned int buf_size; |
149 | unsigned int rd_index; |
150 | unsigned int wr_index; |
151 | |
152 | struct completion completion; |
153 | bool ; /* Does RSSI get updated automatic? */ |
154 | |
155 | /* si470x ops */ |
156 | |
157 | int (*get_register)(struct si470x_device *radio, int regnr); |
158 | int (*set_register)(struct si470x_device *radio, int regnr); |
159 | int (*fops_open)(struct file *file); |
160 | int (*fops_release)(struct file *file); |
161 | int (*vidioc_querycap)(struct file *file, void *priv, |
162 | struct v4l2_capability *capability); |
163 | |
164 | #if IS_ENABLED(CONFIG_USB_SI470X) |
165 | /* reference to USB and video device */ |
166 | struct usb_device *usbdev; |
167 | struct usb_interface *intf; |
168 | char *usb_buf; |
169 | |
170 | /* Interrupt endpoint handling */ |
171 | char *int_in_buffer; |
172 | struct usb_endpoint_descriptor *int_in_endpoint; |
173 | struct urb *int_in_urb; |
174 | int int_in_running; |
175 | |
176 | /* scratch page */ |
177 | unsigned char software_version; |
178 | unsigned char hardware_version; |
179 | #endif |
180 | |
181 | #if IS_ENABLED(CONFIG_I2C_SI470X) |
182 | struct i2c_client *client; |
183 | struct gpio_desc *gpio_reset; |
184 | #endif |
185 | }; |
186 | |
187 | |
188 | |
189 | /************************************************************************** |
190 | * Firmware Versions |
191 | **************************************************************************/ |
192 | |
193 | #define RADIO_FW_VERSION 12 |
194 | |
195 | |
196 | |
197 | /************************************************************************** |
198 | * Frequency Multiplicator |
199 | **************************************************************************/ |
200 | |
201 | /* |
202 | * The frequency is set in units of 62.5 Hz when using V4L2_TUNER_CAP_LOW, |
203 | * 62.5 kHz otherwise. |
204 | * The tuner is able to have a channel spacing of 50, 100 or 200 kHz. |
205 | * tuner->capability is therefore set to V4L2_TUNER_CAP_LOW |
206 | * The FREQ_MUL is then: 1 MHz / 62.5 Hz = 16000 |
207 | */ |
208 | #define FREQ_MUL (1000000 / 62.5) |
209 | |
210 | |
211 | |
212 | /************************************************************************** |
213 | * Common Functions |
214 | **************************************************************************/ |
215 | extern const struct video_device si470x_viddev_template; |
216 | extern const struct v4l2_ctrl_ops si470x_ctrl_ops; |
217 | int si470x_disconnect_check(struct si470x_device *radio); |
218 | int si470x_set_freq(struct si470x_device *radio, unsigned int freq); |
219 | int si470x_start(struct si470x_device *radio); |
220 | int si470x_stop(struct si470x_device *radio); |
221 | |