1 /*
2 * Maxim Integrated MAX2175 RF to Bits tuner driver
3 *
4 * This driver & most of the hard coded values are based on the reference
5 * application delivered by Maxim for this device.
6 *
7 * Copyright (C) 2016 Maxim Integrated Products
8 * Copyright (C) 2017 Renesas Electronics Corporation
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 */
19
20 #include <linux/clk.h>
21 #include <linux/delay.h>
22 #include <linux/errno.h>
23 #include <linux/i2c.h>
24 #include <linux/kernel.h>
25 #include <linux/math64.h>
26 #include <linux/max2175.h>
27 #include <linux/module.h>
28 #include <linux/of.h>
29 #include <linux/regmap.h>
30 #include <linux/slab.h>
31 #include <media/v4l2-ctrls.h>
32 #include <media/v4l2-device.h>
33
34 #include "max2175.h"
35
36 #define DRIVER_NAME "max2175"
37
38 #define mxm_dbg(ctx, fmt, arg...) dev_dbg(&ctx->client->dev, fmt, ## arg)
39 #define mxm_err(ctx, fmt, arg...) dev_err(&ctx->client->dev, fmt, ## arg)
40
41 /* Rx mode */
42 struct max2175_rxmode {
43 enum max2175_band band; /* Associated band */
44 u32 freq; /* Default freq in Hz */
45 u8 i2s_word_size; /* Bit value */
46 };
47
48 /* Register map to define preset values */
49 struct max2175_reg_map {
50 u8 idx; /* Register index */
51 u8 val; /* Register value */
52 };
53
54 static const struct max2175_rxmode eu_rx_modes[] = {
55 /* EU modes */
56 [MAX2175_EU_FM_1_2] = { MAX2175_BAND_FM, 98256000, 1 },
57 [MAX2175_DAB_1_2] = { MAX2175_BAND_VHF, 182640000, 0 },
58 };
59
60 static const struct max2175_rxmode na_rx_modes[] = {
61 /* NA modes */
62 [MAX2175_NA_FM_1_0] = { MAX2175_BAND_FM, 98255520, 1 },
63 [MAX2175_NA_FM_2_0] = { MAX2175_BAND_FM, 98255520, 6 },
64 };
65
66 /*
67 * Preset values:
68 * Based on Maxim MAX2175 Register Table revision: 130p10
69 */
70 static const u8 full_fm_eu_1p0[] = {
71 0x15, 0x04, 0xb8, 0xe3, 0x35, 0x18, 0x7c, 0x00,
72 0x00, 0x7d, 0x40, 0x08, 0x70, 0x7a, 0x88, 0x91,
73 0x61, 0x61, 0x61, 0x61, 0x5a, 0x0f, 0x34, 0x1c,
74 0x14, 0x88, 0x33, 0x02, 0x00, 0x09, 0x00, 0x65,
75 0x9f, 0x2b, 0x80, 0x00, 0x95, 0x05, 0x2c, 0x00,
76 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
77 0x4a, 0x08, 0xa8, 0x0e, 0x0e, 0x2f, 0x7e, 0x00,
78 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
79 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x5e, 0xa9,
80 0xae, 0xbb, 0x57, 0x18, 0x3b, 0x03, 0x3b, 0x64,
81 0x40, 0x60, 0x00, 0x2a, 0xbf, 0x3f, 0xff, 0x9f,
82 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00,
83 0xff, 0xfc, 0xef, 0x1c, 0x40, 0x00, 0x00, 0x02,
84 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
85 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x40, 0x00,
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00,
87 0x00, 0x47, 0x00, 0x00, 0x11, 0x3f, 0x22, 0x00,
88 0xf1, 0x00, 0x41, 0x03, 0xb0, 0x00, 0x00, 0x00,
89 0x1b,
90 };
91
92 static const u8 full_fm_na_1p0[] = {
93 0x13, 0x08, 0x8d, 0xc0, 0x35, 0x18, 0x7d, 0x3f,
94 0x7d, 0x75, 0x40, 0x08, 0x70, 0x7a, 0x88, 0x91,
95 0x61, 0x61, 0x61, 0x61, 0x5c, 0x0f, 0x34, 0x1c,
96 0x14, 0x88, 0x33, 0x02, 0x00, 0x01, 0x00, 0x65,
97 0x9f, 0x2b, 0x80, 0x00, 0x95, 0x05, 0x2c, 0x00,
98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
99 0x4a, 0x08, 0xa8, 0x0e, 0x0e, 0xaf, 0x7e, 0x00,
100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x5e, 0xa9,
102 0xae, 0xbb, 0x57, 0x18, 0x3b, 0x03, 0x3b, 0x64,
103 0x40, 0x60, 0x00, 0x2a, 0xbf, 0x3f, 0xff, 0x9f,
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00,
105 0xff, 0xfc, 0xef, 0x1c, 0x40, 0x00, 0x00, 0x02,
106 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
107 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x40, 0x00,
108 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00,
109 0x00, 0x35, 0x00, 0x00, 0x11, 0x3f, 0x22, 0x00,
110 0xf1, 0x00, 0x41, 0x03, 0xb0, 0x00, 0x00, 0x00,
111 0x1b,
112 };
113
114 /* DAB1.2 settings */
115 static const struct max2175_reg_map dab12_map[] = {
116 { 0x01, 0x13 }, { 0x02, 0x0d }, { 0x03, 0x15 }, { 0x04, 0x55 },
117 { 0x05, 0x0a }, { 0x06, 0xa0 }, { 0x07, 0x40 }, { 0x08, 0x00 },
118 { 0x09, 0x00 }, { 0x0a, 0x7d }, { 0x0b, 0x4a }, { 0x0c, 0x28 },
119 { 0x0e, 0x43 }, { 0x0f, 0xb5 }, { 0x10, 0x31 }, { 0x11, 0x9e },
120 { 0x12, 0x68 }, { 0x13, 0x9e }, { 0x14, 0x68 }, { 0x15, 0x58 },
121 { 0x16, 0x2f }, { 0x17, 0x3f }, { 0x18, 0x40 }, { 0x1a, 0x88 },
122 { 0x1b, 0xaa }, { 0x1c, 0x9a }, { 0x1d, 0x00 }, { 0x1e, 0x00 },
123 { 0x23, 0x80 }, { 0x24, 0x00 }, { 0x25, 0x00 }, { 0x26, 0x00 },
124 { 0x27, 0x00 }, { 0x32, 0x08 }, { 0x33, 0xf8 }, { 0x36, 0x2d },
125 { 0x37, 0x7e }, { 0x55, 0xaf }, { 0x56, 0x3f }, { 0x57, 0xf8 },
126 { 0x58, 0x99 }, { 0x76, 0x00 }, { 0x77, 0x00 }, { 0x78, 0x02 },
127 { 0x79, 0x40 }, { 0x82, 0x00 }, { 0x83, 0x00 }, { 0x85, 0x00 },
128 { 0x86, 0x20 },
129 };
130
131 /* EU FM 1.2 settings */
132 static const struct max2175_reg_map fmeu1p2_map[] = {
133 { 0x01, 0x15 }, { 0x02, 0x04 }, { 0x03, 0xb8 }, { 0x04, 0xe3 },
134 { 0x05, 0x35 }, { 0x06, 0x18 }, { 0x07, 0x7c }, { 0x08, 0x00 },
135 { 0x09, 0x00 }, { 0x0a, 0x73 }, { 0x0b, 0x40 }, { 0x0c, 0x08 },
136 { 0x0e, 0x7a }, { 0x0f, 0x88 }, { 0x10, 0x91 }, { 0x11, 0x61 },
137 { 0x12, 0x61 }, { 0x13, 0x61 }, { 0x14, 0x61 }, { 0x15, 0x5a },
138 { 0x16, 0x0f }, { 0x17, 0x34 }, { 0x18, 0x1c }, { 0x1a, 0x88 },
139 { 0x1b, 0x33 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x1e, 0x01 },
140 { 0x23, 0x80 }, { 0x24, 0x00 }, { 0x25, 0x95 }, { 0x26, 0x05 },
141 { 0x27, 0x2c }, { 0x32, 0x08 }, { 0x33, 0xa8 }, { 0x36, 0x2f },
142 { 0x37, 0x7e }, { 0x55, 0xbf }, { 0x56, 0x3f }, { 0x57, 0xff },
143 { 0x58, 0x9f }, { 0x76, 0xac }, { 0x77, 0x40 }, { 0x78, 0x00 },
144 { 0x79, 0x00 }, { 0x82, 0x47 }, { 0x83, 0x00 }, { 0x85, 0x11 },
145 { 0x86, 0x3f },
146 };
147
148 /* FM NA 1.0 settings */
149 static const struct max2175_reg_map fmna1p0_map[] = {
150 { 0x01, 0x13 }, { 0x02, 0x08 }, { 0x03, 0x8d }, { 0x04, 0xc0 },
151 { 0x05, 0x35 }, { 0x06, 0x18 }, { 0x07, 0x7d }, { 0x08, 0x3f },
152 { 0x09, 0x7d }, { 0x0a, 0x75 }, { 0x0b, 0x40 }, { 0x0c, 0x08 },
153 { 0x0e, 0x7a }, { 0x0f, 0x88 }, { 0x10, 0x91 }, { 0x11, 0x61 },
154 { 0x12, 0x61 }, { 0x13, 0x61 }, { 0x14, 0x61 }, { 0x15, 0x5c },
155 { 0x16, 0x0f }, { 0x17, 0x34 }, { 0x18, 0x1c }, { 0x1a, 0x88 },
156 { 0x1b, 0x33 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x1e, 0x01 },
157 { 0x23, 0x80 }, { 0x24, 0x00 }, { 0x25, 0x95 }, { 0x26, 0x05 },
158 { 0x27, 0x2c }, { 0x32, 0x08 }, { 0x33, 0xa8 }, { 0x36, 0xaf },
159 { 0x37, 0x7e }, { 0x55, 0xbf }, { 0x56, 0x3f }, { 0x57, 0xff },
160 { 0x58, 0x9f }, { 0x76, 0xa6 }, { 0x77, 0x40 }, { 0x78, 0x00 },
161 { 0x79, 0x00 }, { 0x82, 0x35 }, { 0x83, 0x00 }, { 0x85, 0x11 },
162 { 0x86, 0x3f },
163 };
164
165 /* FM NA 2.0 settings */
166 static const struct max2175_reg_map fmna2p0_map[] = {
167 { 0x01, 0x13 }, { 0x02, 0x08 }, { 0x03, 0x8d }, { 0x04, 0xc0 },
168 { 0x05, 0x35 }, { 0x06, 0x18 }, { 0x07, 0x7c }, { 0x08, 0x54 },
169 { 0x09, 0xa7 }, { 0x0a, 0x55 }, { 0x0b, 0x42 }, { 0x0c, 0x48 },
170 { 0x0e, 0x7a }, { 0x0f, 0x88 }, { 0x10, 0x91 }, { 0x11, 0x61 },
171 { 0x12, 0x61 }, { 0x13, 0x61 }, { 0x14, 0x61 }, { 0x15, 0x5c },
172 { 0x16, 0x0f }, { 0x17, 0x34 }, { 0x18, 0x1c }, { 0x1a, 0x88 },
173 { 0x1b, 0x33 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x1e, 0x01 },
174 { 0x23, 0x80 }, { 0x24, 0x00 }, { 0x25, 0x95 }, { 0x26, 0x05 },
175 { 0x27, 0x2c }, { 0x32, 0x08 }, { 0x33, 0xa8 }, { 0x36, 0xaf },
176 { 0x37, 0x7e }, { 0x55, 0xbf }, { 0x56, 0x3f }, { 0x57, 0xff },
177 { 0x58, 0x9f }, { 0x76, 0xac }, { 0x77, 0xc0 }, { 0x78, 0x00 },
178 { 0x79, 0x00 }, { 0x82, 0x6b }, { 0x83, 0x00 }, { 0x85, 0x11 },
179 { 0x86, 0x3f },
180 };
181
182 static const u16 ch_coeff_dab1[] = {
183 0x001c, 0x0007, 0xffcd, 0x0056, 0xffa4, 0x0033, 0x0027, 0xff61,
184 0x010e, 0xfec0, 0x0106, 0xffb8, 0xff1c, 0x023c, 0xfcb2, 0x039b,
185 0xfd4e, 0x0055, 0x036a, 0xf7de, 0x0d21, 0xee72, 0x1499, 0x6a51,
186 };
187
188 static const u16 ch_coeff_fmeu[] = {
189 0x0000, 0xffff, 0x0001, 0x0002, 0xfffa, 0xffff, 0x0015, 0xffec,
190 0xffde, 0x0054, 0xfff9, 0xff52, 0x00b8, 0x00a2, 0xfe0a, 0x00af,
191 0x02e3, 0xfc14, 0xfe89, 0x089d, 0xfa2e, 0xf30f, 0x25be, 0x4eb6,
192 };
193
194 static const u16 eq_coeff_fmeu1_ra02_m6db[] = {
195 0x0040, 0xffc6, 0xfffa, 0x002c, 0x000d, 0xff90, 0x0037, 0x006e,
196 0xffc0, 0xff5b, 0x006a, 0x00f0, 0xff57, 0xfe94, 0x0112, 0x0252,
197 0xfe0c, 0xfc6a, 0x0385, 0x0553, 0xfa49, 0xf789, 0x0b91, 0x1a10,
198 };
199
200 static const u16 ch_coeff_fmna[] = {
201 0x0001, 0x0003, 0xfffe, 0xfff4, 0x0000, 0x001f, 0x000c, 0xffbc,
202 0xffd3, 0x007d, 0x0075, 0xff33, 0xff01, 0x0131, 0x01ef, 0xfe60,
203 0xfc7a, 0x020e, 0x0656, 0xfd94, 0xf395, 0x02ab, 0x2857, 0x3d3f,
204 };
205
206 static const u16 eq_coeff_fmna1_ra02_m6db[] = {
207 0xfff1, 0xffe1, 0xffef, 0x000e, 0x0030, 0x002f, 0xfff6, 0xffa7,
208 0xff9d, 0x000a, 0x00a2, 0x00b5, 0xffea, 0xfed9, 0xfec5, 0x003d,
209 0x0217, 0x021b, 0xff5a, 0xfc2b, 0xfcbd, 0x02c4, 0x0ac3, 0x0e85,
210 };
211
212 static const u8 adc_presets[2][23] = {
213 {
214 0x83, 0x00, 0xcf, 0xb4, 0x0f, 0x2c, 0x0c, 0x49,
215 0x00, 0x00, 0x00, 0x8c, 0x02, 0x02, 0x00, 0x04,
216 0xec, 0x82, 0x4b, 0xcc, 0x01, 0x88, 0x0c,
217 },
218 {
219 0x83, 0x00, 0xcf, 0xb4, 0x0f, 0x2c, 0x0c, 0x49,
220 0x00, 0x00, 0x00, 0x8c, 0x02, 0x20, 0x33, 0x8c,
221 0x57, 0xd7, 0x59, 0xb7, 0x65, 0x0e, 0x0c,
222 },
223 };
224
225 /* Tuner bands */
226 static const struct v4l2_frequency_band eu_bands_rf = {
227 .tuner = 0,
228 .type = V4L2_TUNER_RF,
229 .index = 0,
230 .capability = V4L2_TUNER_CAP_1HZ | V4L2_TUNER_CAP_FREQ_BANDS,
231 .rangelow = 65000000,
232 .rangehigh = 240000000,
233 };
234
235 static const struct v4l2_frequency_band na_bands_rf = {
236 .tuner = 0,
237 .type = V4L2_TUNER_RF,
238 .index = 0,
239 .capability = V4L2_TUNER_CAP_1HZ | V4L2_TUNER_CAP_FREQ_BANDS,
240 .rangelow = 65000000,
241 .rangehigh = 108000000,
242 };
243
244 /* Regmap settings */
245 static const struct regmap_range max2175_regmap_volatile_range[] = {
246 regmap_reg_range(0x30, 0x35),
247 regmap_reg_range(0x3a, 0x45),
248 regmap_reg_range(0x59, 0x5e),
249 regmap_reg_range(0x73, 0x75),
250 };
251
252 static const struct regmap_access_table max2175_volatile_regs = {
253 .yes_ranges = max2175_regmap_volatile_range,
254 .n_yes_ranges = ARRAY_SIZE(max2175_regmap_volatile_range),
255 };
256
257 static const struct reg_default max2175_reg_defaults[] = {
258 { 0x00, 0x07},
259 };
260
261 static const struct regmap_config max2175_regmap_config = {
262 .reg_bits = 8,
263 .val_bits = 8,
264 .max_register = 0xff,
265 .reg_defaults = max2175_reg_defaults,
266 .num_reg_defaults = ARRAY_SIZE(max2175_reg_defaults),
267 .volatile_table = &max2175_volatile_regs,
268 .cache_type = REGCACHE_FLAT,
269 };
270
271 struct max2175 {
272 struct v4l2_subdev sd; /* Sub-device */
273 struct i2c_client *client; /* I2C client */
274
275 /* Controls */
276 struct v4l2_ctrl_handler ctrl_hdl;
277 struct v4l2_ctrl *lna_gain; /* LNA gain value */
278 struct v4l2_ctrl *if_gain; /* I/F gain value */
279 struct v4l2_ctrl *pll_lock; /* PLL lock */
280 struct v4l2_ctrl *i2s_en; /* I2S output enable */
281 struct v4l2_ctrl *hsls; /* High-side/Low-side polarity */
282 struct v4l2_ctrl *rx_mode; /* Receive mode */
283
284 /* Regmap */
285 struct regmap *regmap;
286
287 /* Cached configuration */
288 u32 freq; /* Tuned freq In Hz */
289 const struct max2175_rxmode *rx_modes; /* EU or NA modes */
290 const struct v4l2_frequency_band *bands_rf; /* EU or NA bands */
291
292 /* Device settings */
293 unsigned long xtal_freq; /* Ref Oscillator freq in Hz */
294 u32 decim_ratio;
295 bool master; /* Master/Slave */
296 bool am_hiz; /* AM Hi-Z filter */
297
298 /* ROM values */
299 u8 rom_bbf_bw_am;
300 u8 rom_bbf_bw_fm;
301 u8 rom_bbf_bw_dab;
302
303 /* Driver private variables */
304 bool mode_resolved; /* Flag to sanity check settings */
305 };
306
max2175_from_sd(struct v4l2_subdev * sd)307 static inline struct max2175 *max2175_from_sd(struct v4l2_subdev *sd)
308 {
309 return container_of(sd, struct max2175, sd);
310 }
311
max2175_from_ctrl_hdl(struct v4l2_ctrl_handler * h)312 static inline struct max2175 *max2175_from_ctrl_hdl(struct v4l2_ctrl_handler *h)
313 {
314 return container_of(h, struct max2175, ctrl_hdl);
315 }
316
317 /* Get bitval of a given val */
max2175_get_bitval(u8 val,u8 msb,u8 lsb)318 static inline u8 max2175_get_bitval(u8 val, u8 msb, u8 lsb)
319 {
320 return (val & GENMASK(msb, lsb)) >> lsb;
321 }
322
323 /* Read/Write bit(s) on top of regmap */
max2175_read(struct max2175 * ctx,u8 idx,u8 * val)324 static int max2175_read(struct max2175 *ctx, u8 idx, u8 *val)
325 {
326 u32 regval;
327 int ret;
328
329 ret = regmap_read(ctx->regmap, idx, ®val);
330 if (ret)
331 mxm_err(ctx, "read ret(%d): idx 0x%02x\n", ret, idx);
332 else
333 *val = regval;
334
335 return ret;
336 }
337
max2175_write(struct max2175 * ctx,u8 idx,u8 val)338 static int max2175_write(struct max2175 *ctx, u8 idx, u8 val)
339 {
340 int ret;
341
342 ret = regmap_write(ctx->regmap, idx, val);
343 if (ret)
344 mxm_err(ctx, "write ret(%d): idx 0x%02x val 0x%02x\n",
345 ret, idx, val);
346
347 return ret;
348 }
349
max2175_read_bits(struct max2175 * ctx,u8 idx,u8 msb,u8 lsb)350 static u8 max2175_read_bits(struct max2175 *ctx, u8 idx, u8 msb, u8 lsb)
351 {
352 u8 val;
353
354 if (max2175_read(ctx, idx, &val))
355 return 0;
356
357 return max2175_get_bitval(val, msb, lsb);
358 }
359
max2175_write_bits(struct max2175 * ctx,u8 idx,u8 msb,u8 lsb,u8 newval)360 static int max2175_write_bits(struct max2175 *ctx, u8 idx,
361 u8 msb, u8 lsb, u8 newval)
362 {
363 int ret = regmap_update_bits(ctx->regmap, idx, GENMASK(msb, lsb),
364 newval << lsb);
365
366 if (ret)
367 mxm_err(ctx, "wbits ret(%d): idx 0x%02x\n", ret, idx);
368
369 return ret;
370 }
371
max2175_write_bit(struct max2175 * ctx,u8 idx,u8 bit,u8 newval)372 static int max2175_write_bit(struct max2175 *ctx, u8 idx, u8 bit, u8 newval)
373 {
374 return max2175_write_bits(ctx, idx, bit, bit, newval);
375 }
376
377 /* Checks expected pattern every msec until timeout */
max2175_poll_timeout(struct max2175 * ctx,u8 idx,u8 msb,u8 lsb,u8 exp_bitval,u32 timeout_us)378 static int max2175_poll_timeout(struct max2175 *ctx, u8 idx, u8 msb, u8 lsb,
379 u8 exp_bitval, u32 timeout_us)
380 {
381 unsigned int val;
382
383 return regmap_read_poll_timeout(ctx->regmap, idx, val,
384 (max2175_get_bitval(val, msb, lsb) == exp_bitval),
385 1000, timeout_us);
386 }
387
max2175_poll_csm_ready(struct max2175 * ctx)388 static int max2175_poll_csm_ready(struct max2175 *ctx)
389 {
390 int ret;
391
392 ret = max2175_poll_timeout(ctx, 69, 1, 1, 0, 50000);
393 if (ret)
394 mxm_err(ctx, "csm not ready\n");
395
396 return ret;
397 }
398
399 #define MAX2175_IS_BAND_AM(ctx) \
400 (max2175_read_bits(ctx, 5, 1, 0) == MAX2175_BAND_AM)
401
402 #define MAX2175_IS_BAND_VHF(ctx) \
403 (max2175_read_bits(ctx, 5, 1, 0) == MAX2175_BAND_VHF)
404
405 #define MAX2175_IS_FM_MODE(ctx) \
406 (max2175_read_bits(ctx, 12, 5, 4) == 0)
407
408 #define MAX2175_IS_FMHD_MODE(ctx) \
409 (max2175_read_bits(ctx, 12, 5, 4) == 1)
410
411 #define MAX2175_IS_DAB_MODE(ctx) \
412 (max2175_read_bits(ctx, 12, 5, 4) == 2)
413
max2175_band_from_freq(u32 freq)414 static int max2175_band_from_freq(u32 freq)
415 {
416 if (freq >= 144000 && freq <= 26100000)
417 return MAX2175_BAND_AM;
418 else if (freq >= 65000000 && freq <= 108000000)
419 return MAX2175_BAND_FM;
420
421 return MAX2175_BAND_VHF;
422 }
423
max2175_i2s_enable(struct max2175 * ctx,bool enable)424 static void max2175_i2s_enable(struct max2175 *ctx, bool enable)
425 {
426 if (enable)
427 /* Stuff bits are zeroed */
428 max2175_write_bits(ctx, 104, 3, 0, 2);
429 else
430 /* Keep SCK alive */
431 max2175_write_bits(ctx, 104, 3, 0, 9);
432 mxm_dbg(ctx, "i2s %sabled\n", enable ? "en" : "dis");
433 }
434
max2175_set_filter_coeffs(struct max2175 * ctx,u8 m_sel,u8 bank,const u16 * coeffs)435 static void max2175_set_filter_coeffs(struct max2175 *ctx, u8 m_sel,
436 u8 bank, const u16 *coeffs)
437 {
438 unsigned int i;
439 u8 coeff_addr, upper_address = 24;
440
441 mxm_dbg(ctx, "set_filter_coeffs: m_sel %d bank %d\n", m_sel, bank);
442 max2175_write_bits(ctx, 114, 5, 4, m_sel);
443
444 if (m_sel == 2)
445 upper_address = 12;
446
447 for (i = 0; i < upper_address; i++) {
448 coeff_addr = i + bank * 24;
449 max2175_write(ctx, 115, coeffs[i] >> 8);
450 max2175_write(ctx, 116, coeffs[i]);
451 max2175_write(ctx, 117, coeff_addr | 1 << 7);
452 }
453 max2175_write_bit(ctx, 117, 7, 0);
454 }
455
max2175_load_fmeu_1p2(struct max2175 * ctx)456 static void max2175_load_fmeu_1p2(struct max2175 *ctx)
457 {
458 unsigned int i;
459
460 for (i = 0; i < ARRAY_SIZE(fmeu1p2_map); i++)
461 max2175_write(ctx, fmeu1p2_map[i].idx, fmeu1p2_map[i].val);
462
463 ctx->decim_ratio = 36;
464
465 /* Load the Channel Filter Coefficients into channel filter bank #2 */
466 max2175_set_filter_coeffs(ctx, MAX2175_CH_MSEL, 0, ch_coeff_fmeu);
467 max2175_set_filter_coeffs(ctx, MAX2175_EQ_MSEL, 0,
468 eq_coeff_fmeu1_ra02_m6db);
469 }
470
max2175_load_dab_1p2(struct max2175 * ctx)471 static void max2175_load_dab_1p2(struct max2175 *ctx)
472 {
473 unsigned int i;
474
475 for (i = 0; i < ARRAY_SIZE(dab12_map); i++)
476 max2175_write(ctx, dab12_map[i].idx, dab12_map[i].val);
477
478 ctx->decim_ratio = 1;
479
480 /* Load the Channel Filter Coefficients into channel filter bank #2 */
481 max2175_set_filter_coeffs(ctx, MAX2175_CH_MSEL, 2, ch_coeff_dab1);
482 }
483
max2175_load_fmna_1p0(struct max2175 * ctx)484 static void max2175_load_fmna_1p0(struct max2175 *ctx)
485 {
486 unsigned int i;
487
488 for (i = 0; i < ARRAY_SIZE(fmna1p0_map); i++)
489 max2175_write(ctx, fmna1p0_map[i].idx, fmna1p0_map[i].val);
490 }
491
max2175_load_fmna_2p0(struct max2175 * ctx)492 static void max2175_load_fmna_2p0(struct max2175 *ctx)
493 {
494 unsigned int i;
495
496 for (i = 0; i < ARRAY_SIZE(fmna2p0_map); i++)
497 max2175_write(ctx, fmna2p0_map[i].idx, fmna2p0_map[i].val);
498 }
499
max2175_set_bbfilter(struct max2175 * ctx)500 static void max2175_set_bbfilter(struct max2175 *ctx)
501 {
502 if (MAX2175_IS_BAND_AM(ctx)) {
503 max2175_write_bits(ctx, 12, 3, 0, ctx->rom_bbf_bw_am);
504 mxm_dbg(ctx, "set_bbfilter AM: rom %d\n", ctx->rom_bbf_bw_am);
505 } else if (MAX2175_IS_DAB_MODE(ctx)) {
506 max2175_write_bits(ctx, 12, 3, 0, ctx->rom_bbf_bw_dab);
507 mxm_dbg(ctx, "set_bbfilter DAB: rom %d\n", ctx->rom_bbf_bw_dab);
508 } else {
509 max2175_write_bits(ctx, 12, 3, 0, ctx->rom_bbf_bw_fm);
510 mxm_dbg(ctx, "set_bbfilter FM: rom %d\n", ctx->rom_bbf_bw_fm);
511 }
512 }
513
max2175_set_csm_mode(struct max2175 * ctx,enum max2175_csm_mode new_mode)514 static bool max2175_set_csm_mode(struct max2175 *ctx,
515 enum max2175_csm_mode new_mode)
516 {
517 int ret = max2175_poll_csm_ready(ctx);
518
519 if (ret)
520 return ret;
521
522 max2175_write_bits(ctx, 0, 2, 0, new_mode);
523 mxm_dbg(ctx, "set csm new mode %d\n", new_mode);
524
525 /* Wait for a fixed settle down time depending on new mode */
526 switch (new_mode) {
527 case MAX2175_PRESET_TUNE:
528 usleep_range(51100, 51500); /* 51.1ms */
529 break;
530 /*
531 * Other mode switches need different sleep values depending on band &
532 * mode
533 */
534 default:
535 break;
536 }
537
538 return max2175_poll_csm_ready(ctx);
539 }
540
max2175_csm_action(struct max2175 * ctx,enum max2175_csm_mode action)541 static int max2175_csm_action(struct max2175 *ctx,
542 enum max2175_csm_mode action)
543 {
544 int ret;
545
546 mxm_dbg(ctx, "csm_action: %d\n", action);
547
548 /* Other actions can be added in future when needed */
549 ret = max2175_set_csm_mode(ctx, MAX2175_LOAD_TO_BUFFER);
550 if (ret)
551 return ret;
552
553 return max2175_set_csm_mode(ctx, MAX2175_PRESET_TUNE);
554 }
555
max2175_set_lo_freq(struct max2175 * ctx,u32 lo_freq)556 static int max2175_set_lo_freq(struct max2175 *ctx, u32 lo_freq)
557 {
558 u8 lo_mult, loband_bits = 0, vcodiv_bits = 0;
559 u32 int_desired, frac_desired;
560 enum max2175_band band;
561 int ret;
562
563 band = max2175_read_bits(ctx, 5, 1, 0);
564 switch (band) {
565 case MAX2175_BAND_AM:
566 lo_mult = 16;
567 break;
568 case MAX2175_BAND_FM:
569 if (lo_freq <= 74700000) {
570 lo_mult = 16;
571 } else if (lo_freq > 74700000 && lo_freq <= 110000000) {
572 loband_bits = 1;
573 lo_mult = 8;
574 } else {
575 loband_bits = 1;
576 vcodiv_bits = 3;
577 lo_mult = 8;
578 }
579 break;
580 case MAX2175_BAND_VHF:
581 if (lo_freq <= 210000000)
582 vcodiv_bits = 2;
583 else
584 vcodiv_bits = 1;
585
586 loband_bits = 2;
587 lo_mult = 4;
588 break;
589 default:
590 loband_bits = 3;
591 vcodiv_bits = 2;
592 lo_mult = 2;
593 break;
594 }
595
596 if (band == MAX2175_BAND_L)
597 lo_freq /= lo_mult;
598 else
599 lo_freq *= lo_mult;
600
601 int_desired = lo_freq / ctx->xtal_freq;
602 frac_desired = div_u64((u64)(lo_freq % ctx->xtal_freq) << 20,
603 ctx->xtal_freq);
604
605 /* Check CSM is not busy */
606 ret = max2175_poll_csm_ready(ctx);
607 if (ret)
608 return ret;
609
610 mxm_dbg(ctx, "lo_mult %u int %u frac %u\n",
611 lo_mult, int_desired, frac_desired);
612
613 /* Write the calculated values to the appropriate registers */
614 max2175_write(ctx, 1, int_desired);
615 max2175_write_bits(ctx, 2, 3, 0, (frac_desired >> 16) & 0xf);
616 max2175_write(ctx, 3, frac_desired >> 8);
617 max2175_write(ctx, 4, frac_desired);
618 max2175_write_bits(ctx, 5, 3, 2, loband_bits);
619 max2175_write_bits(ctx, 6, 7, 6, vcodiv_bits);
620
621 return ret;
622 }
623
624 /*
625 * Helper similar to DIV_ROUND_CLOSEST but an inline function that accepts s64
626 * dividend and s32 divisor
627 */
max2175_round_closest(s64 dividend,s32 divisor)628 static inline s64 max2175_round_closest(s64 dividend, s32 divisor)
629 {
630 if ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0))
631 return div_s64(dividend + divisor / 2, divisor);
632
633 return div_s64(dividend - divisor / 2, divisor);
634 }
635
max2175_set_nco_freq(struct max2175 * ctx,s32 nco_freq)636 static int max2175_set_nco_freq(struct max2175 *ctx, s32 nco_freq)
637 {
638 s32 clock_rate = ctx->xtal_freq / ctx->decim_ratio;
639 u32 nco_reg, abs_nco_freq = abs(nco_freq);
640 s64 nco_val_desired;
641 int ret;
642
643 if (abs_nco_freq < clock_rate / 2) {
644 nco_val_desired = 2 * nco_freq;
645 } else {
646 nco_val_desired = 2 * (clock_rate - abs_nco_freq);
647 if (nco_freq < 0)
648 nco_val_desired = -nco_val_desired;
649 }
650
651 nco_reg = max2175_round_closest(nco_val_desired << 20, clock_rate);
652
653 if (nco_freq < 0)
654 nco_reg += 0x200000;
655
656 /* Check CSM is not busy */
657 ret = max2175_poll_csm_ready(ctx);
658 if (ret)
659 return ret;
660
661 mxm_dbg(ctx, "freq %d desired %lld reg %u\n",
662 nco_freq, nco_val_desired, nco_reg);
663
664 /* Write the calculated values to the appropriate registers */
665 max2175_write_bits(ctx, 7, 4, 0, (nco_reg >> 16) & 0x1f);
666 max2175_write(ctx, 8, nco_reg >> 8);
667 max2175_write(ctx, 9, nco_reg);
668
669 return ret;
670 }
671
max2175_set_rf_freq_non_am_bands(struct max2175 * ctx,u64 freq,u32 lo_pos)672 static int max2175_set_rf_freq_non_am_bands(struct max2175 *ctx, u64 freq,
673 u32 lo_pos)
674 {
675 s64 adj_freq, low_if_freq;
676 int ret;
677
678 mxm_dbg(ctx, "rf_freq: non AM bands\n");
679
680 if (MAX2175_IS_FM_MODE(ctx))
681 low_if_freq = 128000;
682 else if (MAX2175_IS_FMHD_MODE(ctx))
683 low_if_freq = 228000;
684 else
685 return max2175_set_lo_freq(ctx, freq);
686
687 if (MAX2175_IS_BAND_VHF(ctx) == (lo_pos == MAX2175_LO_ABOVE_DESIRED))
688 adj_freq = freq + low_if_freq;
689 else
690 adj_freq = freq - low_if_freq;
691
692 ret = max2175_set_lo_freq(ctx, adj_freq);
693 if (ret)
694 return ret;
695
696 return max2175_set_nco_freq(ctx, -low_if_freq);
697 }
698
max2175_set_rf_freq(struct max2175 * ctx,u64 freq,u32 lo_pos)699 static int max2175_set_rf_freq(struct max2175 *ctx, u64 freq, u32 lo_pos)
700 {
701 int ret;
702
703 if (MAX2175_IS_BAND_AM(ctx))
704 ret = max2175_set_nco_freq(ctx, freq);
705 else
706 ret = max2175_set_rf_freq_non_am_bands(ctx, freq, lo_pos);
707
708 mxm_dbg(ctx, "set_rf_freq: ret %d freq %llu\n", ret, freq);
709
710 return ret;
711 }
712
max2175_tune_rf_freq(struct max2175 * ctx,u64 freq,u32 hsls)713 static int max2175_tune_rf_freq(struct max2175 *ctx, u64 freq, u32 hsls)
714 {
715 int ret;
716
717 ret = max2175_set_rf_freq(ctx, freq, hsls);
718 if (ret)
719 return ret;
720
721 ret = max2175_csm_action(ctx, MAX2175_BUFFER_PLUS_PRESET_TUNE);
722 if (ret)
723 return ret;
724
725 mxm_dbg(ctx, "tune_rf_freq: old %u new %llu\n", ctx->freq, freq);
726 ctx->freq = freq;
727
728 return ret;
729 }
730
max2175_set_hsls(struct max2175 * ctx,u32 lo_pos)731 static void max2175_set_hsls(struct max2175 *ctx, u32 lo_pos)
732 {
733 mxm_dbg(ctx, "set_hsls: lo_pos %u\n", lo_pos);
734
735 if ((lo_pos == MAX2175_LO_BELOW_DESIRED) == MAX2175_IS_BAND_VHF(ctx))
736 max2175_write_bit(ctx, 5, 4, 1);
737 else
738 max2175_write_bit(ctx, 5, 4, 0);
739 }
740
max2175_set_eu_rx_mode(struct max2175 * ctx,u32 rx_mode)741 static void max2175_set_eu_rx_mode(struct max2175 *ctx, u32 rx_mode)
742 {
743 switch (rx_mode) {
744 case MAX2175_EU_FM_1_2:
745 max2175_load_fmeu_1p2(ctx);
746 break;
747
748 case MAX2175_DAB_1_2:
749 max2175_load_dab_1p2(ctx);
750 break;
751 }
752 /* Master is the default setting */
753 if (!ctx->master)
754 max2175_write_bit(ctx, 30, 7, 1);
755 }
756
max2175_set_na_rx_mode(struct max2175 * ctx,u32 rx_mode)757 static void max2175_set_na_rx_mode(struct max2175 *ctx, u32 rx_mode)
758 {
759 switch (rx_mode) {
760 case MAX2175_NA_FM_1_0:
761 max2175_load_fmna_1p0(ctx);
762 break;
763 case MAX2175_NA_FM_2_0:
764 max2175_load_fmna_2p0(ctx);
765 break;
766 }
767 /* Master is the default setting */
768 if (!ctx->master)
769 max2175_write_bit(ctx, 30, 7, 1);
770
771 ctx->decim_ratio = 27;
772
773 /* Load the Channel Filter Coefficients into channel filter bank #2 */
774 max2175_set_filter_coeffs(ctx, MAX2175_CH_MSEL, 0, ch_coeff_fmna);
775 max2175_set_filter_coeffs(ctx, MAX2175_EQ_MSEL, 0,
776 eq_coeff_fmna1_ra02_m6db);
777 }
778
max2175_set_rx_mode(struct max2175 * ctx,u32 rx_mode)779 static int max2175_set_rx_mode(struct max2175 *ctx, u32 rx_mode)
780 {
781 mxm_dbg(ctx, "set_rx_mode: %u am_hiz %u\n", rx_mode, ctx->am_hiz);
782 if (ctx->xtal_freq == MAX2175_EU_XTAL_FREQ)
783 max2175_set_eu_rx_mode(ctx, rx_mode);
784 else
785 max2175_set_na_rx_mode(ctx, rx_mode);
786
787 if (ctx->am_hiz) {
788 mxm_dbg(ctx, "setting AM HiZ related config\n");
789 max2175_write_bit(ctx, 50, 5, 1);
790 max2175_write_bit(ctx, 90, 7, 1);
791 max2175_write_bits(ctx, 73, 1, 0, 2);
792 max2175_write_bits(ctx, 80, 5, 0, 33);
793 }
794
795 /* Load BB filter trim values saved in ROM */
796 max2175_set_bbfilter(ctx);
797
798 /* Set HSLS */
799 max2175_set_hsls(ctx, ctx->hsls->cur.val);
800
801 /* Use i2s enable settings */
802 max2175_i2s_enable(ctx, ctx->i2s_en->cur.val);
803
804 ctx->mode_resolved = true;
805
806 return 0;
807 }
808
max2175_rx_mode_from_freq(struct max2175 * ctx,u32 freq,u32 * mode)809 static int max2175_rx_mode_from_freq(struct max2175 *ctx, u32 freq, u32 *mode)
810 {
811 unsigned int i;
812 int band = max2175_band_from_freq(freq);
813
814 /* Pick the first match always */
815 for (i = 0; i <= ctx->rx_mode->maximum; i++) {
816 if (ctx->rx_modes[i].band == band) {
817 *mode = i;
818 mxm_dbg(ctx, "rx_mode_from_freq: freq %u mode %d\n",
819 freq, *mode);
820 return 0;
821 }
822 }
823
824 return -EINVAL;
825 }
826
max2175_freq_rx_mode_valid(struct max2175 * ctx,u32 mode,u32 freq)827 static bool max2175_freq_rx_mode_valid(struct max2175 *ctx,
828 u32 mode, u32 freq)
829 {
830 int band = max2175_band_from_freq(freq);
831
832 return (ctx->rx_modes[mode].band == band);
833 }
834
max2175_load_adc_presets(struct max2175 * ctx)835 static void max2175_load_adc_presets(struct max2175 *ctx)
836 {
837 unsigned int i, j;
838
839 for (i = 0; i < ARRAY_SIZE(adc_presets); i++)
840 for (j = 0; j < ARRAY_SIZE(adc_presets[0]); j++)
841 max2175_write(ctx, 146 + j + i * 55, adc_presets[i][j]);
842 }
843
max2175_init_power_manager(struct max2175 * ctx)844 static int max2175_init_power_manager(struct max2175 *ctx)
845 {
846 int ret;
847
848 /* Execute on-chip power-up/calibration */
849 max2175_write_bit(ctx, 99, 2, 0);
850 usleep_range(1000, 1500);
851 max2175_write_bit(ctx, 99, 2, 1);
852
853 /* Wait for the power manager to finish. */
854 ret = max2175_poll_timeout(ctx, 69, 7, 7, 1, 50000);
855 if (ret)
856 mxm_err(ctx, "init pm failed\n");
857
858 return ret;
859 }
860
max2175_recalibrate_adc(struct max2175 * ctx)861 static int max2175_recalibrate_adc(struct max2175 *ctx)
862 {
863 int ret;
864
865 /* ADC Re-calibration */
866 max2175_write(ctx, 150, 0xff);
867 max2175_write(ctx, 205, 0xff);
868 max2175_write(ctx, 147, 0x20);
869 max2175_write(ctx, 147, 0x00);
870 max2175_write(ctx, 202, 0x20);
871 max2175_write(ctx, 202, 0x00);
872
873 ret = max2175_poll_timeout(ctx, 69, 4, 3, 3, 50000);
874 if (ret)
875 mxm_err(ctx, "adc recalibration failed\n");
876
877 return ret;
878 }
879
max2175_read_rom(struct max2175 * ctx,u8 row)880 static u8 max2175_read_rom(struct max2175 *ctx, u8 row)
881 {
882 u8 data = 0;
883
884 max2175_write_bit(ctx, 56, 4, 0);
885 max2175_write_bits(ctx, 56, 3, 0, row);
886
887 usleep_range(2000, 2500);
888 max2175_read(ctx, 58, &data);
889
890 max2175_write_bits(ctx, 56, 3, 0, 0);
891
892 mxm_dbg(ctx, "read_rom: row %d data 0x%02x\n", row, data);
893
894 return data;
895 }
896
max2175_load_from_rom(struct max2175 * ctx)897 static void max2175_load_from_rom(struct max2175 *ctx)
898 {
899 u8 data = 0;
900
901 data = max2175_read_rom(ctx, 0);
902 ctx->rom_bbf_bw_am = data & 0x0f;
903 max2175_write_bits(ctx, 81, 3, 0, data >> 4);
904
905 data = max2175_read_rom(ctx, 1);
906 ctx->rom_bbf_bw_fm = data & 0x0f;
907 ctx->rom_bbf_bw_dab = data >> 4;
908
909 data = max2175_read_rom(ctx, 2);
910 max2175_write_bits(ctx, 82, 4, 0, data & 0x1f);
911 max2175_write_bits(ctx, 82, 7, 5, data >> 5);
912
913 data = max2175_read_rom(ctx, 3);
914 if (ctx->am_hiz) {
915 data &= 0x0f;
916 data |= (max2175_read_rom(ctx, 7) & 0x40) >> 2;
917 if (!data)
918 data |= 2;
919 } else {
920 data = (data & 0xf0) >> 4;
921 data |= (max2175_read_rom(ctx, 7) & 0x80) >> 3;
922 if (!data)
923 data |= 30;
924 }
925 max2175_write_bits(ctx, 80, 5, 0, data + 31);
926
927 data = max2175_read_rom(ctx, 6);
928 max2175_write_bits(ctx, 81, 7, 6, data >> 6);
929 }
930
max2175_load_full_fm_eu_1p0(struct max2175 * ctx)931 static void max2175_load_full_fm_eu_1p0(struct max2175 *ctx)
932 {
933 unsigned int i;
934
935 for (i = 0; i < ARRAY_SIZE(full_fm_eu_1p0); i++)
936 max2175_write(ctx, i + 1, full_fm_eu_1p0[i]);
937
938 usleep_range(5000, 5500);
939 ctx->decim_ratio = 36;
940 }
941
max2175_load_full_fm_na_1p0(struct max2175 * ctx)942 static void max2175_load_full_fm_na_1p0(struct max2175 *ctx)
943 {
944 unsigned int i;
945
946 for (i = 0; i < ARRAY_SIZE(full_fm_na_1p0); i++)
947 max2175_write(ctx, i + 1, full_fm_na_1p0[i]);
948
949 usleep_range(5000, 5500);
950 ctx->decim_ratio = 27;
951 }
952
max2175_core_init(struct max2175 * ctx,u32 refout_bits)953 static int max2175_core_init(struct max2175 *ctx, u32 refout_bits)
954 {
955 int ret;
956
957 /* MAX2175 uses 36.864MHz clock for EU & 40.154MHz for NA region */
958 if (ctx->xtal_freq == MAX2175_EU_XTAL_FREQ)
959 max2175_load_full_fm_eu_1p0(ctx);
960 else
961 max2175_load_full_fm_na_1p0(ctx);
962
963 /* The default settings assume master */
964 if (!ctx->master)
965 max2175_write_bit(ctx, 30, 7, 1);
966
967 mxm_dbg(ctx, "refout_bits %u\n", refout_bits);
968
969 /* Set REFOUT */
970 max2175_write_bits(ctx, 56, 7, 5, refout_bits);
971
972 /* ADC Reset */
973 max2175_write_bit(ctx, 99, 1, 0);
974 usleep_range(1000, 1500);
975 max2175_write_bit(ctx, 99, 1, 1);
976
977 /* Load ADC preset values */
978 max2175_load_adc_presets(ctx);
979
980 /* Initialize the power management state machine */
981 ret = max2175_init_power_manager(ctx);
982 if (ret)
983 return ret;
984
985 /* Recalibrate ADC */
986 ret = max2175_recalibrate_adc(ctx);
987 if (ret)
988 return ret;
989
990 /* Load ROM values to appropriate registers */
991 max2175_load_from_rom(ctx);
992
993 if (ctx->xtal_freq == MAX2175_EU_XTAL_FREQ) {
994 /* Load FIR coefficients into bank 0 */
995 max2175_set_filter_coeffs(ctx, MAX2175_CH_MSEL, 0,
996 ch_coeff_fmeu);
997 max2175_set_filter_coeffs(ctx, MAX2175_EQ_MSEL, 0,
998 eq_coeff_fmeu1_ra02_m6db);
999 } else {
1000 /* Load FIR coefficients into bank 0 */
1001 max2175_set_filter_coeffs(ctx, MAX2175_CH_MSEL, 0,
1002 ch_coeff_fmna);
1003 max2175_set_filter_coeffs(ctx, MAX2175_EQ_MSEL, 0,
1004 eq_coeff_fmna1_ra02_m6db);
1005 }
1006 mxm_dbg(ctx, "core initialized\n");
1007
1008 return 0;
1009 }
1010
max2175_s_ctrl_rx_mode(struct max2175 * ctx,u32 rx_mode)1011 static void max2175_s_ctrl_rx_mode(struct max2175 *ctx, u32 rx_mode)
1012 {
1013 /* Load mode. Range check already done */
1014 max2175_set_rx_mode(ctx, rx_mode);
1015
1016 mxm_dbg(ctx, "s_ctrl_rx_mode: %u curr freq %u\n", rx_mode, ctx->freq);
1017
1018 /* Check if current freq valid for mode & update */
1019 if (max2175_freq_rx_mode_valid(ctx, rx_mode, ctx->freq))
1020 max2175_tune_rf_freq(ctx, ctx->freq, ctx->hsls->cur.val);
1021 else
1022 /* Use default freq of mode if current freq is not valid */
1023 max2175_tune_rf_freq(ctx, ctx->rx_modes[rx_mode].freq,
1024 ctx->hsls->cur.val);
1025 }
1026
max2175_s_ctrl(struct v4l2_ctrl * ctrl)1027 static int max2175_s_ctrl(struct v4l2_ctrl *ctrl)
1028 {
1029 struct max2175 *ctx = max2175_from_ctrl_hdl(ctrl->handler);
1030
1031 mxm_dbg(ctx, "s_ctrl: id 0x%x, val %u\n", ctrl->id, ctrl->val);
1032 switch (ctrl->id) {
1033 case V4L2_CID_MAX2175_I2S_ENABLE:
1034 max2175_i2s_enable(ctx, ctrl->val);
1035 break;
1036 case V4L2_CID_MAX2175_HSLS:
1037 max2175_set_hsls(ctx, ctrl->val);
1038 break;
1039 case V4L2_CID_MAX2175_RX_MODE:
1040 max2175_s_ctrl_rx_mode(ctx, ctrl->val);
1041 break;
1042 }
1043
1044 return 0;
1045 }
1046
max2175_get_lna_gain(struct max2175 * ctx)1047 static u32 max2175_get_lna_gain(struct max2175 *ctx)
1048 {
1049 enum max2175_band band = max2175_read_bits(ctx, 5, 1, 0);
1050
1051 switch (band) {
1052 case MAX2175_BAND_AM:
1053 return max2175_read_bits(ctx, 51, 3, 0);
1054 case MAX2175_BAND_FM:
1055 return max2175_read_bits(ctx, 50, 3, 0);
1056 case MAX2175_BAND_VHF:
1057 return max2175_read_bits(ctx, 52, 5, 0);
1058 default:
1059 return 0;
1060 }
1061 }
1062
max2175_g_volatile_ctrl(struct v4l2_ctrl * ctrl)1063 static int max2175_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
1064 {
1065 struct max2175 *ctx = max2175_from_ctrl_hdl(ctrl->handler);
1066
1067 switch (ctrl->id) {
1068 case V4L2_CID_RF_TUNER_LNA_GAIN:
1069 ctrl->val = max2175_get_lna_gain(ctx);
1070 break;
1071 case V4L2_CID_RF_TUNER_IF_GAIN:
1072 ctrl->val = max2175_read_bits(ctx, 49, 4, 0);
1073 break;
1074 case V4L2_CID_RF_TUNER_PLL_LOCK:
1075 ctrl->val = (max2175_read_bits(ctx, 60, 7, 6) == 3);
1076 break;
1077 }
1078
1079 return 0;
1080 };
1081
max2175_set_freq_and_mode(struct max2175 * ctx,u32 freq)1082 static int max2175_set_freq_and_mode(struct max2175 *ctx, u32 freq)
1083 {
1084 u32 rx_mode;
1085 int ret;
1086
1087 /* Get band from frequency */
1088 ret = max2175_rx_mode_from_freq(ctx, freq, &rx_mode);
1089 if (ret)
1090 return ret;
1091
1092 mxm_dbg(ctx, "set_freq_and_mode: freq %u rx_mode %d\n", freq, rx_mode);
1093
1094 /* Load mode */
1095 max2175_set_rx_mode(ctx, rx_mode);
1096 ctx->rx_mode->cur.val = rx_mode;
1097
1098 /* Tune to the new freq given */
1099 return max2175_tune_rf_freq(ctx, freq, ctx->hsls->cur.val);
1100 }
1101
max2175_s_frequency(struct v4l2_subdev * sd,const struct v4l2_frequency * vf)1102 static int max2175_s_frequency(struct v4l2_subdev *sd,
1103 const struct v4l2_frequency *vf)
1104 {
1105 struct max2175 *ctx = max2175_from_sd(sd);
1106 u32 freq;
1107 int ret = 0;
1108
1109 mxm_dbg(ctx, "s_freq: new %u curr %u, mode_resolved %d\n",
1110 vf->frequency, ctx->freq, ctx->mode_resolved);
1111
1112 if (vf->tuner != 0)
1113 return -EINVAL;
1114
1115 freq = clamp(vf->frequency, ctx->bands_rf->rangelow,
1116 ctx->bands_rf->rangehigh);
1117
1118 /* Check new freq valid for rx_mode if already resolved */
1119 if (ctx->mode_resolved &&
1120 max2175_freq_rx_mode_valid(ctx, ctx->rx_mode->cur.val, freq))
1121 ret = max2175_tune_rf_freq(ctx, freq, ctx->hsls->cur.val);
1122 else
1123 /* Find default rx_mode for freq and tune to it */
1124 ret = max2175_set_freq_and_mode(ctx, freq);
1125
1126 mxm_dbg(ctx, "s_freq: ret %d curr %u mode_resolved %d mode %u\n",
1127 ret, ctx->freq, ctx->mode_resolved, ctx->rx_mode->cur.val);
1128
1129 return ret;
1130 }
1131
max2175_g_frequency(struct v4l2_subdev * sd,struct v4l2_frequency * vf)1132 static int max2175_g_frequency(struct v4l2_subdev *sd,
1133 struct v4l2_frequency *vf)
1134 {
1135 struct max2175 *ctx = max2175_from_sd(sd);
1136 int ret = 0;
1137
1138 if (vf->tuner != 0)
1139 return -EINVAL;
1140
1141 /* RF freq */
1142 vf->type = V4L2_TUNER_RF;
1143 vf->frequency = ctx->freq;
1144
1145 return ret;
1146 }
1147
max2175_enum_freq_bands(struct v4l2_subdev * sd,struct v4l2_frequency_band * band)1148 static int max2175_enum_freq_bands(struct v4l2_subdev *sd,
1149 struct v4l2_frequency_band *band)
1150 {
1151 struct max2175 *ctx = max2175_from_sd(sd);
1152
1153 if (band->tuner != 0 || band->index != 0)
1154 return -EINVAL;
1155
1156 *band = *ctx->bands_rf;
1157
1158 return 0;
1159 }
1160
max2175_g_tuner(struct v4l2_subdev * sd,struct v4l2_tuner * vt)1161 static int max2175_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
1162 {
1163 struct max2175 *ctx = max2175_from_sd(sd);
1164
1165 if (vt->index > 0)
1166 return -EINVAL;
1167
1168 strlcpy(vt->name, "RF", sizeof(vt->name));
1169 vt->type = V4L2_TUNER_RF;
1170 vt->capability = V4L2_TUNER_CAP_1HZ | V4L2_TUNER_CAP_FREQ_BANDS;
1171 vt->rangelow = ctx->bands_rf->rangelow;
1172 vt->rangehigh = ctx->bands_rf->rangehigh;
1173
1174 return 0;
1175 }
1176
max2175_s_tuner(struct v4l2_subdev * sd,const struct v4l2_tuner * vt)1177 static int max2175_s_tuner(struct v4l2_subdev *sd, const struct v4l2_tuner *vt)
1178 {
1179 /* Check tuner index is valid */
1180 if (vt->index > 0)
1181 return -EINVAL;
1182
1183 return 0;
1184 }
1185
1186 static const struct v4l2_subdev_tuner_ops max2175_tuner_ops = {
1187 .s_frequency = max2175_s_frequency,
1188 .g_frequency = max2175_g_frequency,
1189 .enum_freq_bands = max2175_enum_freq_bands,
1190 .g_tuner = max2175_g_tuner,
1191 .s_tuner = max2175_s_tuner,
1192 };
1193
1194 static const struct v4l2_subdev_ops max2175_ops = {
1195 .tuner = &max2175_tuner_ops,
1196 };
1197
1198 static const struct v4l2_ctrl_ops max2175_ctrl_ops = {
1199 .s_ctrl = max2175_s_ctrl,
1200 .g_volatile_ctrl = max2175_g_volatile_ctrl,
1201 };
1202
1203 /*
1204 * I2S output enable/disable configuration. This is a private control.
1205 * Refer to Documentation/media/v4l-drivers/max2175 for more details.
1206 */
1207 static const struct v4l2_ctrl_config max2175_i2s_en = {
1208 .ops = &max2175_ctrl_ops,
1209 .id = V4L2_CID_MAX2175_I2S_ENABLE,
1210 .name = "I2S Enable",
1211 .type = V4L2_CTRL_TYPE_BOOLEAN,
1212 .min = 0,
1213 .max = 1,
1214 .step = 1,
1215 .def = 1,
1216 .is_private = 1,
1217 };
1218
1219 /*
1220 * HSLS value control LO freq adjacent location configuration.
1221 * Refer to Documentation/media/v4l-drivers/max2175 for more details.
1222 */
1223 static const struct v4l2_ctrl_config max2175_hsls = {
1224 .ops = &max2175_ctrl_ops,
1225 .id = V4L2_CID_MAX2175_HSLS,
1226 .name = "HSLS Above/Below Desired",
1227 .type = V4L2_CTRL_TYPE_BOOLEAN,
1228 .min = 0,
1229 .max = 1,
1230 .step = 1,
1231 .def = 1,
1232 };
1233
1234 /*
1235 * Rx modes below are a set of preset configurations that decides the tuner's
1236 * sck and sample rate of transmission. They are separate for EU & NA regions.
1237 * Refer to Documentation/media/v4l-drivers/max2175 for more details.
1238 */
1239 static const char * const max2175_ctrl_eu_rx_modes[] = {
1240 [MAX2175_EU_FM_1_2] = "EU FM 1.2",
1241 [MAX2175_DAB_1_2] = "DAB 1.2",
1242 };
1243
1244 static const char * const max2175_ctrl_na_rx_modes[] = {
1245 [MAX2175_NA_FM_1_0] = "NA FM 1.0",
1246 [MAX2175_NA_FM_2_0] = "NA FM 2.0",
1247 };
1248
1249 static const struct v4l2_ctrl_config max2175_eu_rx_mode = {
1250 .ops = &max2175_ctrl_ops,
1251 .id = V4L2_CID_MAX2175_RX_MODE,
1252 .name = "RX Mode",
1253 .type = V4L2_CTRL_TYPE_MENU,
1254 .max = ARRAY_SIZE(max2175_ctrl_eu_rx_modes) - 1,
1255 .def = 0,
1256 .qmenu = max2175_ctrl_eu_rx_modes,
1257 };
1258
1259 static const struct v4l2_ctrl_config max2175_na_rx_mode = {
1260 .ops = &max2175_ctrl_ops,
1261 .id = V4L2_CID_MAX2175_RX_MODE,
1262 .name = "RX Mode",
1263 .type = V4L2_CTRL_TYPE_MENU,
1264 .max = ARRAY_SIZE(max2175_ctrl_na_rx_modes) - 1,
1265 .def = 0,
1266 .qmenu = max2175_ctrl_na_rx_modes,
1267 };
1268
max2175_refout_load_to_bits(struct i2c_client * client,u32 load,u32 * bits)1269 static int max2175_refout_load_to_bits(struct i2c_client *client, u32 load,
1270 u32 *bits)
1271 {
1272 if (load <= 40)
1273 *bits = load / 10;
1274 else if (load >= 60 && load <= 70)
1275 *bits = load / 10 - 1;
1276 else
1277 return -EINVAL;
1278
1279 return 0;
1280 }
1281
max2175_probe(struct i2c_client * client,const struct i2c_device_id * id)1282 static int max2175_probe(struct i2c_client *client,
1283 const struct i2c_device_id *id)
1284 {
1285 bool master = true, am_hiz = false;
1286 u32 refout_load, refout_bits = 0; /* REFOUT disabled */
1287 struct v4l2_ctrl_handler *hdl;
1288 struct fwnode_handle *fwnode;
1289 struct device_node *np;
1290 struct v4l2_subdev *sd;
1291 struct regmap *regmap;
1292 struct max2175 *ctx;
1293 struct clk *clk;
1294 int ret;
1295
1296 /* Parse DT properties */
1297 np = of_parse_phandle(client->dev.of_node, "maxim,master", 0);
1298 if (np) {
1299 master = false; /* Slave tuner */
1300 of_node_put(np);
1301 }
1302
1303 fwnode = of_fwnode_handle(client->dev.of_node);
1304 if (fwnode_property_present(fwnode, "maxim,am-hiz-filter"))
1305 am_hiz = true;
1306
1307 if (!fwnode_property_read_u32(fwnode, "maxim,refout-load",
1308 &refout_load)) {
1309 ret = max2175_refout_load_to_bits(client, refout_load,
1310 &refout_bits);
1311 if (ret) {
1312 dev_err(&client->dev, "invalid refout_load %u\n",
1313 refout_load);
1314 return -EINVAL;
1315 }
1316 }
1317
1318 clk = devm_clk_get(&client->dev, NULL);
1319 if (IS_ERR(clk)) {
1320 ret = PTR_ERR(clk);
1321 dev_err(&client->dev, "cannot get clock %d\n", ret);
1322 return ret;
1323 }
1324
1325 regmap = devm_regmap_init_i2c(client, &max2175_regmap_config);
1326 if (IS_ERR(regmap)) {
1327 ret = PTR_ERR(regmap);
1328 dev_err(&client->dev, "regmap init failed %d\n", ret);
1329 return -ENODEV;
1330 }
1331
1332 /* Alloc tuner context */
1333 ctx = devm_kzalloc(&client->dev, sizeof(*ctx), GFP_KERNEL);
1334 if (ctx == NULL)
1335 return -ENOMEM;
1336
1337 sd = &ctx->sd;
1338 ctx->master = master;
1339 ctx->am_hiz = am_hiz;
1340 ctx->mode_resolved = false;
1341 ctx->regmap = regmap;
1342 ctx->xtal_freq = clk_get_rate(clk);
1343 dev_info(&client->dev, "xtal freq %luHz\n", ctx->xtal_freq);
1344
1345 v4l2_i2c_subdev_init(sd, client, &max2175_ops);
1346 ctx->client = client;
1347
1348 sd->flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
1349
1350 /* Controls */
1351 hdl = &ctx->ctrl_hdl;
1352 ret = v4l2_ctrl_handler_init(hdl, 7);
1353 if (ret)
1354 return ret;
1355
1356 ctx->lna_gain = v4l2_ctrl_new_std(hdl, &max2175_ctrl_ops,
1357 V4L2_CID_RF_TUNER_LNA_GAIN,
1358 0, 63, 1, 0);
1359 ctx->lna_gain->flags |= (V4L2_CTRL_FLAG_VOLATILE |
1360 V4L2_CTRL_FLAG_READ_ONLY);
1361 ctx->if_gain = v4l2_ctrl_new_std(hdl, &max2175_ctrl_ops,
1362 V4L2_CID_RF_TUNER_IF_GAIN,
1363 0, 31, 1, 0);
1364 ctx->if_gain->flags |= (V4L2_CTRL_FLAG_VOLATILE |
1365 V4L2_CTRL_FLAG_READ_ONLY);
1366 ctx->pll_lock = v4l2_ctrl_new_std(hdl, &max2175_ctrl_ops,
1367 V4L2_CID_RF_TUNER_PLL_LOCK,
1368 0, 1, 1, 0);
1369 ctx->pll_lock->flags |= (V4L2_CTRL_FLAG_VOLATILE |
1370 V4L2_CTRL_FLAG_READ_ONLY);
1371 ctx->i2s_en = v4l2_ctrl_new_custom(hdl, &max2175_i2s_en, NULL);
1372 ctx->hsls = v4l2_ctrl_new_custom(hdl, &max2175_hsls, NULL);
1373
1374 if (ctx->xtal_freq == MAX2175_EU_XTAL_FREQ) {
1375 ctx->rx_mode = v4l2_ctrl_new_custom(hdl,
1376 &max2175_eu_rx_mode, NULL);
1377 ctx->rx_modes = eu_rx_modes;
1378 ctx->bands_rf = &eu_bands_rf;
1379 } else {
1380 ctx->rx_mode = v4l2_ctrl_new_custom(hdl,
1381 &max2175_na_rx_mode, NULL);
1382 ctx->rx_modes = na_rx_modes;
1383 ctx->bands_rf = &na_bands_rf;
1384 }
1385 ctx->sd.ctrl_handler = &ctx->ctrl_hdl;
1386
1387 /* Set the defaults */
1388 ctx->freq = ctx->bands_rf->rangelow;
1389
1390 /* Register subdev */
1391 ret = v4l2_async_register_subdev(sd);
1392 if (ret) {
1393 dev_err(&client->dev, "register subdev failed\n");
1394 goto err_reg;
1395 }
1396
1397 /* Initialize device */
1398 ret = max2175_core_init(ctx, refout_bits);
1399 if (ret)
1400 goto err_init;
1401
1402 ret = v4l2_ctrl_handler_setup(hdl);
1403 if (ret)
1404 goto err_init;
1405
1406 return 0;
1407
1408 err_init:
1409 v4l2_async_unregister_subdev(sd);
1410 err_reg:
1411 v4l2_ctrl_handler_free(&ctx->ctrl_hdl);
1412
1413 return ret;
1414 }
1415
max2175_remove(struct i2c_client * client)1416 static int max2175_remove(struct i2c_client *client)
1417 {
1418 struct v4l2_subdev *sd = i2c_get_clientdata(client);
1419 struct max2175 *ctx = max2175_from_sd(sd);
1420
1421 v4l2_ctrl_handler_free(&ctx->ctrl_hdl);
1422 v4l2_async_unregister_subdev(sd);
1423
1424 return 0;
1425 }
1426
1427 static const struct i2c_device_id max2175_id[] = {
1428 { DRIVER_NAME, 0},
1429 {},
1430 };
1431 MODULE_DEVICE_TABLE(i2c, max2175_id);
1432
1433 static const struct of_device_id max2175_of_ids[] = {
1434 { .compatible = "maxim,max2175", },
1435 { }
1436 };
1437 MODULE_DEVICE_TABLE(of, max2175_of_ids);
1438
1439 static struct i2c_driver max2175_driver = {
1440 .driver = {
1441 .name = DRIVER_NAME,
1442 .of_match_table = max2175_of_ids,
1443 },
1444 .probe = max2175_probe,
1445 .remove = max2175_remove,
1446 .id_table = max2175_id,
1447 };
1448
1449 module_i2c_driver(max2175_driver);
1450
1451 MODULE_DESCRIPTION("Maxim MAX2175 RF to Bits tuner driver");
1452 MODULE_LICENSE("GPL v2");
1453 MODULE_AUTHOR("Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com>");
1454