GNU Linux-libre 4.19.207-gnu1
[releases.git] / drivers / media / i2c / max2175.c
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
307 static inline struct max2175 *max2175_from_sd(struct v4l2_subdev *sd)
308 {
309         return container_of(sd, struct max2175, sd);
310 }
311
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 */
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 */
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, &regval);
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
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
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
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
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 */
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
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
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
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
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
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
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
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
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
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
514 static int 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
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
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  */
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
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 = 2LL * (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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.rst 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.rst 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.rst 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
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
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
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>");