]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/media/radio/si4713/si4713.c
Merge branches 'for-4.11/upstream-fixes', 'for-4.12/accutouch', 'for-4.12/cp2112...
[mirror_ubuntu-artful-kernel.git] / drivers / media / radio / si4713 / si4713.c
CommitLineData
02bee89e
EV
1/*
2 * drivers/media/radio/si4713-i2c.c
3 *
4 * Silicon Labs Si4713 FM Radio Transmitter I2C commands.
5 *
6 * Copyright (c) 2009 Nokia Corporation
7 * Contact: Eduardo Valentin <eduardo.valentin@nokia.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
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.
02bee89e
EV
18 */
19
02bee89e
EV
20#include <linux/completion.h>
21#include <linux/delay.h>
d4471dec 22#include <linux/err.h>
02bee89e
EV
23#include <linux/interrupt.h>
24#include <linux/i2c.h>
5a0e3ad6 25#include <linux/slab.h>
00df055a 26#include <linux/gpio.h>
7a707b89 27#include <linux/module.h>
02bee89e
EV
28#include <media/v4l2-device.h>
29#include <media/v4l2-ioctl.h>
30#include <media/v4l2-common.h>
31
7391232e 32#include "si4713.h"
02bee89e
EV
33
34/* module parameters */
35static int debug;
36module_param(debug, int, S_IRUGO | S_IWUSR);
37MODULE_PARM_DESC(debug, "Debug level (0 - 2)");
38
39MODULE_LICENSE("GPL");
40MODULE_AUTHOR("Eduardo Valentin <eduardo.valentin@nokia.com>");
41MODULE_DESCRIPTION("I2C driver for Si4713 FM Radio Transmitter");
42MODULE_VERSION("0.0.1");
43
44#define DEFAULT_RDS_PI 0x00
45#define DEFAULT_RDS_PTY 0x00
02bee89e
EV
46#define DEFAULT_RDS_DEVIATION 0x00C8
47#define DEFAULT_RDS_PS_REPEAT_COUNT 0x0003
48#define DEFAULT_LIMITER_RTIME 0x1392
49#define DEFAULT_LIMITER_DEV 0x102CA
9ca33ccd 50#define DEFAULT_PILOT_FREQUENCY 0x4A38
02bee89e
EV
51#define DEFAULT_PILOT_DEVIATION 0x1A5E
52#define DEFAULT_ACOMP_ATIME 0x0000
53#define DEFAULT_ACOMP_RTIME 0xF4240L
54#define DEFAULT_ACOMP_GAIN 0x0F
9ca33ccd 55#define DEFAULT_ACOMP_THRESHOLD (-0x28)
02bee89e
EV
56#define DEFAULT_MUTE 0x01
57#define DEFAULT_POWER_LEVEL 88
58#define DEFAULT_FREQUENCY 8800
59#define DEFAULT_PREEMPHASIS FMPE_EU
60#define DEFAULT_TUNE_RNL 0xFF
61
62#define to_si4713_device(sd) container_of(sd, struct si4713_device, sd)
63
64/* frequency domain transformation (using times 10 to avoid floats) */
65#define FREQDEV_UNIT 100000
66#define FREQV4L2_MULTI 625
67#define si4713_to_v4l2(f) ((f * FREQDEV_UNIT) / FREQV4L2_MULTI)
68#define v4l2_to_si4713(f) ((f * FREQV4L2_MULTI) / FREQDEV_UNIT)
69#define FREQ_RANGE_LOW 7600
70#define FREQ_RANGE_HIGH 10800
71
72#define MAX_ARGS 7
73
74#define RDS_BLOCK 8
75#define RDS_BLOCK_CLEAR 0x03
76#define RDS_BLOCK_LOAD 0x04
77#define RDS_RADIOTEXT_2A 0x20
78#define RDS_RADIOTEXT_BLK_SIZE 4
79#define RDS_RADIOTEXT_INDEX_MAX 0x0F
80#define RDS_CARRIAGE_RETURN 0x0D
81
82#define rds_ps_nblocks(len) ((len / RDS_BLOCK) + (len % RDS_BLOCK ? 1 : 0))
83
84#define get_status_bit(p, b, m) (((p) & (m)) >> (b))
85#define set_bits(p, v, b, m) (((p) & ~(m)) | ((v) << (b)))
86
87#define ATTACK_TIME_UNIT 500
88
89#define POWER_OFF 0x00
90#define POWER_ON 0x01
91
92#define msb(x) ((u8)((u16) x >> 8))
93#define lsb(x) ((u8)((u16) x & 0x00FF))
94#define compose_u16(msb, lsb) (((u16)msb << 8) | lsb)
95#define check_command_failed(status) (!(status & SI4713_CTS) || \
96 (status & SI4713_ERR))
97/* mute definition */
98#define set_mute(p) ((p & 1) | ((p & 1) << 1));
02bee89e
EV
99
100#ifdef DEBUG
101#define DBG_BUFFER(device, message, buffer, size) \
102 { \
103 int i; \
104 char str[(size)*5]; \
105 for (i = 0; i < size; i++) \
106 sprintf(str + i * 5, " 0x%02x", buffer[i]); \
107 v4l2_dbg(2, debug, device, "%s:%s\n", message, str); \
108 }
109#else
110#define DBG_BUFFER(device, message, buffer, size)
111#endif
112
113/*
114 * Values for limiter release time (sorted by second column)
115 * device release
116 * value time (us)
117 */
118static long limiter_times[] = {
119 2000, 250,
120 1000, 500,
121 510, 1000,
122 255, 2000,
123 170, 3000,
124 127, 4020,
125 102, 5010,
126 85, 6020,
127 73, 7010,
128 64, 7990,
129 57, 8970,
130 51, 10030,
131 25, 20470,
132 17, 30110,
133 13, 39380,
134 10, 51190,
135 8, 63690,
136 7, 73140,
137 6, 85330,
138 5, 102390,
139};
140
141/*
142 * Values for audio compression release time (sorted by second column)
143 * device release
144 * value time (us)
145 */
146static unsigned long acomp_rtimes[] = {
147 0, 100000,
148 1, 200000,
149 2, 350000,
150 3, 525000,
151 4, 1000000,
152};
153
154/*
155 * Values for preemphasis (sorted by second column)
156 * device preemphasis
157 * value value (v4l2)
158 */
159static unsigned long preemphasis_values[] = {
160 FMPE_DISABLED, V4L2_PREEMPHASIS_DISABLED,
161 FMPE_EU, V4L2_PREEMPHASIS_50_uS,
162 FMPE_USA, V4L2_PREEMPHASIS_75_uS,
163};
164
165static int usecs_to_dev(unsigned long usecs, unsigned long const array[],
166 int size)
167{
168 int i;
169 int rval = -EINVAL;
170
171 for (i = 0; i < size / 2; i++)
172 if (array[(i * 2) + 1] >= usecs) {
173 rval = array[i * 2];
174 break;
175 }
176
177 return rval;
178}
179
02bee89e
EV
180/* si4713_handler: IRQ handler, just complete work */
181static irqreturn_t si4713_handler(int irq, void *dev)
182{
183 struct si4713_device *sdev = dev;
184
185 v4l2_dbg(2, debug, &sdev->sd,
186 "%s: sending signal to completion work.\n", __func__);
187 complete(&sdev->work);
188
189 return IRQ_HANDLED;
190}
191
192/*
193 * si4713_send_command - sends a command to si4713 and waits its response
194 * @sdev: si4713_device structure for the device we are communicating
195 * @command: command id
196 * @args: command arguments we are sending (up to 7)
197 * @argn: actual size of @args
198 * @response: buffer to place the expected response from the device (up to 15)
199 * @respn: actual size of @response
200 * @usecs: amount of time to wait before reading the response (in usecs)
201 */
202static int si4713_send_command(struct si4713_device *sdev, const u8 command,
203 const u8 args[], const int argn,
204 u8 response[], const int respn, const int usecs)
205{
206 struct i2c_client *client = v4l2_get_subdevdata(&sdev->sd);
5173332c 207 unsigned long until_jiffies;
02bee89e
EV
208 u8 data1[MAX_ARGS + 1];
209 int err;
210
211 if (!client->adapter)
212 return -ENODEV;
213
214 /* First send the command and its arguments */
215 data1[0] = command;
216 memcpy(data1 + 1, args, argn);
217 DBG_BUFFER(&sdev->sd, "Parameters", data1, argn + 1);
218
219 err = i2c_master_send(client, data1, argn + 1);
220 if (err != argn + 1) {
221 v4l2_err(&sdev->sd, "Error while sending command 0x%02x\n",
222 command);
5173332c 223 return err < 0 ? err : -EIO;
02bee89e
EV
224 }
225
5173332c
DR
226 until_jiffies = jiffies + usecs_to_jiffies(usecs) + 1;
227
02bee89e 228 /* Wait response from interrupt */
5173332c
DR
229 if (client->irq) {
230 if (!wait_for_completion_timeout(&sdev->work,
02bee89e 231 usecs_to_jiffies(usecs) + 1))
5173332c 232 v4l2_warn(&sdev->sd,
02bee89e
EV
233 "(%s) Device took too much time to answer.\n",
234 __func__);
02bee89e
EV
235 }
236
5173332c
DR
237 do {
238 err = i2c_master_recv(client, response, respn);
239 if (err != respn) {
240 v4l2_err(&sdev->sd,
241 "Error %d while reading response for command 0x%02x\n",
242 err, command);
243 return err < 0 ? err : -EIO;
244 }
02bee89e 245
5173332c
DR
246 DBG_BUFFER(&sdev->sd, "Response", response, respn);
247 if (!check_command_failed(response[0]))
248 return 0;
249
250 if (client->irq)
251 return -EBUSY;
cb15da36
HV
252 if (usecs <= 1000)
253 usleep_range(usecs, 1000);
254 else
255 usleep_range(1000, 2000);
256 } while (time_is_after_jiffies(until_jiffies));
5173332c
DR
257
258 return -EBUSY;
02bee89e
EV
259}
260
261/*
262 * si4713_read_property - reads a si4713 property
263 * @sdev: si4713_device structure for the device we are communicating
264 * @prop: property identification number
265 * @pv: property value to be returned on success
266 */
267static int si4713_read_property(struct si4713_device *sdev, u16 prop, u32 *pv)
268{
269 int err;
270 u8 val[SI4713_GET_PROP_NRESP];
271 /*
9ca33ccd
HV
272 * .First byte = 0
273 * .Second byte = property's MSB
274 * .Third byte = property's LSB
02bee89e
EV
275 */
276 const u8 args[SI4713_GET_PROP_NARGS] = {
277 0x00,
278 msb(prop),
279 lsb(prop),
280 };
281
282 err = si4713_send_command(sdev, SI4713_CMD_GET_PROPERTY,
283 args, ARRAY_SIZE(args), val,
284 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
285
286 if (err < 0)
287 return err;
288
289 *pv = compose_u16(val[2], val[3]);
290
291 v4l2_dbg(1, debug, &sdev->sd,
292 "%s: property=0x%02x value=0x%02x status=0x%02x\n",
293 __func__, prop, *pv, val[0]);
294
295 return err;
296}
297
298/*
299 * si4713_write_property - modifies a si4713 property
300 * @sdev: si4713_device structure for the device we are communicating
301 * @prop: property identification number
302 * @val: new value for that property
303 */
304static int si4713_write_property(struct si4713_device *sdev, u16 prop, u16 val)
305{
306 int rval;
307 u8 resp[SI4713_SET_PROP_NRESP];
308 /*
9ca33ccd
HV
309 * .First byte = 0
310 * .Second byte = property's MSB
311 * .Third byte = property's LSB
312 * .Fourth byte = value's MSB
313 * .Fifth byte = value's LSB
02bee89e
EV
314 */
315 const u8 args[SI4713_SET_PROP_NARGS] = {
316 0x00,
317 msb(prop),
318 lsb(prop),
319 msb(val),
320 lsb(val),
321 };
322
323 rval = si4713_send_command(sdev, SI4713_CMD_SET_PROPERTY,
324 args, ARRAY_SIZE(args),
325 resp, ARRAY_SIZE(resp),
326 DEFAULT_TIMEOUT);
327
328 if (rval < 0)
329 return rval;
330
331 v4l2_dbg(1, debug, &sdev->sd,
332 "%s: property=0x%02x value=0x%02x status=0x%02x\n",
333 __func__, prop, val, resp[0]);
334
335 /*
336 * As there is no command response for SET_PROPERTY,
337 * wait Tcomp time to finish before proceed, in order
338 * to have property properly set.
339 */
340 msleep(TIMEOUT_SET_PROPERTY);
341
342 return rval;
343}
344
345/*
346 * si4713_powerup - Powers the device up
347 * @sdev: si4713_device structure for the device we are communicating
348 */
349static int si4713_powerup(struct si4713_device *sdev)
350{
5173332c 351 struct i2c_client *client = v4l2_get_subdevdata(&sdev->sd);
02bee89e
EV
352 int err;
353 u8 resp[SI4713_PWUP_NRESP];
354 /*
9ca33ccd
HV
355 * .First byte = Enabled interrupts and boot function
356 * .Second byte = Input operation mode
02bee89e 357 */
5173332c
DR
358 u8 args[SI4713_PWUP_NARGS] = {
359 SI4713_PWUP_GPO2OEN | SI4713_PWUP_FUNC_TX,
02bee89e
EV
360 SI4713_PWUP_OPMOD_ANALOG,
361 };
362
363 if (sdev->power_state)
364 return 0;
365
d4471dec
SR
366 if (sdev->vdd) {
367 err = regulator_enable(sdev->vdd);
cc6d618f 368 if (err) {
d4471dec 369 v4l2_err(&sdev->sd, "Failed to enable vdd: %d\n", err);
cc6d618f
DR
370 return err;
371 }
00df055a 372 }
d4471dec
SR
373
374 if (sdev->vio) {
375 err = regulator_enable(sdev->vio);
376 if (err) {
377 v4l2_err(&sdev->sd, "Failed to enable vio: %d\n", err);
378 return err;
379 }
380 }
381
b36ae853 382 if (sdev->gpio_reset) {
00df055a 383 udelay(50);
fbe14a12 384 gpiod_set_value(sdev->gpio_reset, 1);
00df055a
JN
385 }
386
5173332c
DR
387 if (client->irq)
388 args[0] |= SI4713_PWUP_CTSIEN;
389
02bee89e
EV
390 err = si4713_send_command(sdev, SI4713_CMD_POWER_UP,
391 args, ARRAY_SIZE(args),
392 resp, ARRAY_SIZE(resp),
393 TIMEOUT_POWER_UP);
394
395 if (!err) {
396 v4l2_dbg(1, debug, &sdev->sd, "Powerup response: 0x%02x\n",
397 resp[0]);
398 v4l2_dbg(1, debug, &sdev->sd, "Device in power up mode\n");
399 sdev->power_state = POWER_ON;
400
5173332c
DR
401 if (client->irq)
402 err = si4713_write_property(sdev, SI4713_GPO_IEN,
02bee89e 403 SI4713_STC_INT | SI4713_CTS);
cc6d618f
DR
404 return err;
405 }
b36ae853 406 gpiod_set_value(sdev->gpio_reset, 0);
d4471dec
SR
407
408
409 if (sdev->vdd) {
410 err = regulator_disable(sdev->vdd);
00df055a 411 if (err)
d4471dec
SR
412 v4l2_err(&sdev->sd, "Failed to disable vdd: %d\n", err);
413 }
414
415 if (sdev->vio) {
416 err = regulator_disable(sdev->vio);
417 if (err)
418 v4l2_err(&sdev->sd, "Failed to disable vio: %d\n", err);
02bee89e
EV
419 }
420
421 return err;
422}
423
424/*
425 * si4713_powerdown - Powers the device down
426 * @sdev: si4713_device structure for the device we are communicating
427 */
428static int si4713_powerdown(struct si4713_device *sdev)
429{
430 int err;
431 u8 resp[SI4713_PWDN_NRESP];
432
433 if (!sdev->power_state)
434 return 0;
435
436 err = si4713_send_command(sdev, SI4713_CMD_POWER_DOWN,
437 NULL, 0,
438 resp, ARRAY_SIZE(resp),
439 DEFAULT_TIMEOUT);
440
441 if (!err) {
442 v4l2_dbg(1, debug, &sdev->sd, "Power down response: 0x%02x\n",
443 resp[0]);
444 v4l2_dbg(1, debug, &sdev->sd, "Device in reset mode\n");
b36ae853 445 if (sdev->gpio_reset)
fbe14a12 446 gpiod_set_value(sdev->gpio_reset, 0);
d4471dec
SR
447
448 if (sdev->vdd) {
449 err = regulator_disable(sdev->vdd);
450 if (err) {
cc6d618f 451 v4l2_err(&sdev->sd,
d4471dec
SR
452 "Failed to disable vdd: %d\n", err);
453 }
454 }
455
456 if (sdev->vio) {
457 err = regulator_disable(sdev->vio);
458 if (err) {
459 v4l2_err(&sdev->sd,
460 "Failed to disable vio: %d\n", err);
461 }
cc6d618f 462 }
02bee89e
EV
463 sdev->power_state = POWER_OFF;
464 }
465
466 return err;
467}
468
469/*
470 * si4713_checkrev - Checks if we are treating a device with the correct rev.
471 * @sdev: si4713_device structure for the device we are communicating
472 */
473static int si4713_checkrev(struct si4713_device *sdev)
474{
475 struct i2c_client *client = v4l2_get_subdevdata(&sdev->sd);
476 int rval;
477 u8 resp[SI4713_GETREV_NRESP];
478
02bee89e
EV
479 rval = si4713_send_command(sdev, SI4713_CMD_GET_REV,
480 NULL, 0,
481 resp, ARRAY_SIZE(resp),
482 DEFAULT_TIMEOUT);
483
484 if (rval < 0)
55b2a312 485 return rval;
02bee89e
EV
486
487 if (resp[1] == SI4713_PRODUCT_NUMBER) {
488 v4l2_info(&sdev->sd, "chip found @ 0x%02x (%s)\n",
489 client->addr << 1, client->adapter->name);
490 } else {
b2c6eedb 491 v4l2_err(&sdev->sd, "Invalid product number 0x%X\n", resp[1]);
02bee89e
EV
492 rval = -EINVAL;
493 }
02bee89e
EV
494 return rval;
495}
496
497/*
25985edc 498 * si4713_wait_stc - Waits STC interrupt and clears status bits. Useful
02bee89e
EV
499 * for TX_TUNE_POWER, TX_TUNE_FREQ and TX_TUNE_MEAS
500 * @sdev: si4713_device structure for the device we are communicating
501 * @usecs: timeout to wait for STC interrupt signal
502 */
503static int si4713_wait_stc(struct si4713_device *sdev, const int usecs)
504{
5173332c 505 struct i2c_client *client = v4l2_get_subdevdata(&sdev->sd);
02bee89e 506 u8 resp[SI4713_GET_STATUS_NRESP];
5173332c
DR
507 unsigned long start_jiffies = jiffies;
508 int err;
02bee89e 509
5173332c
DR
510 if (client->irq &&
511 !wait_for_completion_timeout(&sdev->work, usecs_to_jiffies(usecs) + 1))
02bee89e 512 v4l2_warn(&sdev->sd,
5173332c
DR
513 "(%s) Device took too much time to answer.\n", __func__);
514
515 for (;;) {
516 /* Clear status bits */
517 err = si4713_send_command(sdev, SI4713_CMD_GET_INT_STATUS,
518 NULL, 0,
519 resp, ARRAY_SIZE(resp),
520 DEFAULT_TIMEOUT);
521 /* The USB device returns errors when it waits for the
522 * STC bit to be set. Hence polling */
523 if (err >= 0) {
524 v4l2_dbg(1, debug, &sdev->sd,
525 "%s: status bits: 0x%02x\n", __func__, resp[0]);
526
527 if (resp[0] & SI4713_STC_INT)
528 return 0;
529 }
530 if (jiffies_to_usecs(jiffies - start_jiffies) > usecs)
531 return err < 0 ? err : -EIO;
cb15da36 532 /* We sleep here for 3-4 ms in order to avoid flooding the device
5173332c
DR
533 * with USB requests. The si4713 USB driver was developed
534 * by reverse engineering the Windows USB driver. The windows
535 * driver also has a ~2.5 ms delay between responses. */
cb15da36 536 usleep_range(3000, 4000);
5173332c 537 }
02bee89e
EV
538}
539
540/*
541 * si4713_tx_tune_freq - Sets the state of the RF carrier and sets the tuning
9ca33ccd
HV
542 * frequency between 76 and 108 MHz in 10 kHz units and
543 * steps of 50 kHz.
02bee89e
EV
544 * @sdev: si4713_device structure for the device we are communicating
545 * @frequency: desired frequency (76 - 108 MHz, unit 10 KHz, step 50 kHz)
546 */
547static int si4713_tx_tune_freq(struct si4713_device *sdev, u16 frequency)
548{
549 int err;
550 u8 val[SI4713_TXFREQ_NRESP];
551 /*
9ca33ccd
HV
552 * .First byte = 0
553 * .Second byte = frequency's MSB
554 * .Third byte = frequency's LSB
02bee89e
EV
555 */
556 const u8 args[SI4713_TXFREQ_NARGS] = {
557 0x00,
558 msb(frequency),
559 lsb(frequency),
560 };
561
562 err = si4713_send_command(sdev, SI4713_CMD_TX_TUNE_FREQ,
563 args, ARRAY_SIZE(args), val,
564 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
565
566 if (err < 0)
567 return err;
568
569 v4l2_dbg(1, debug, &sdev->sd,
570 "%s: frequency=0x%02x status=0x%02x\n", __func__,
571 frequency, val[0]);
572
573 err = si4713_wait_stc(sdev, TIMEOUT_TX_TUNE);
574 if (err < 0)
575 return err;
576
577 return compose_u16(args[1], args[2]);
578}
579
580/*
e26fa6dc 581 * si4713_tx_tune_power - Sets the RF voltage level between 88 and 120 dBuV in
9ca33ccd
HV
582 * 1 dB units. A value of 0x00 indicates off. The command
583 * also sets the antenna tuning capacitance. A value of 0
584 * indicates autotuning, and a value of 1 - 191 indicates
585 * a manual override, which results in a tuning
586 * capacitance of 0.25 pF x @antcap.
02bee89e 587 * @sdev: si4713_device structure for the device we are communicating
e26fa6dc 588 * @power: tuning power (88 - 120 dBuV, unit/step 1 dB)
02bee89e
EV
589 * @antcap: value of antenna tuning capacitor (0 - 191)
590 */
591static int si4713_tx_tune_power(struct si4713_device *sdev, u8 power,
592 u8 antcap)
593{
594 int err;
595 u8 val[SI4713_TXPWR_NRESP];
596 /*
9ca33ccd
HV
597 * .First byte = 0
598 * .Second byte = 0
599 * .Third byte = power
600 * .Fourth byte = antcap
02bee89e 601 */
e26fa6dc 602 u8 args[SI4713_TXPWR_NARGS] = {
02bee89e
EV
603 0x00,
604 0x00,
605 power,
606 antcap,
607 };
608
e26fa6dc
DR
609 /* Map power values 1-87 to MIN_POWER (88) */
610 if (power > 0 && power < SI4713_MIN_POWER)
611 args[2] = power = SI4713_MIN_POWER;
02bee89e
EV
612
613 err = si4713_send_command(sdev, SI4713_CMD_TX_TUNE_POWER,
614 args, ARRAY_SIZE(args), val,
615 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
616
617 if (err < 0)
618 return err;
619
620 v4l2_dbg(1, debug, &sdev->sd,
621 "%s: power=0x%02x antcap=0x%02x status=0x%02x\n",
622 __func__, power, antcap, val[0]);
623
624 return si4713_wait_stc(sdev, TIMEOUT_TX_TUNE_POWER);
625}
626
627/*
628 * si4713_tx_tune_measure - Enters receive mode and measures the received noise
9ca33ccd
HV
629 * level in units of dBuV on the selected frequency.
630 * The Frequency must be between 76 and 108 MHz in 10 kHz
631 * units and steps of 50 kHz. The command also sets the
632 * antenna tuning capacitance. A value of 0 means
633 * autotuning, and a value of 1 to 191 indicates manual
634 * override.
02bee89e
EV
635 * @sdev: si4713_device structure for the device we are communicating
636 * @frequency: desired frequency (76 - 108 MHz, unit 10 KHz, step 50 kHz)
637 * @antcap: value of antenna tuning capacitor (0 - 191)
638 */
639static int si4713_tx_tune_measure(struct si4713_device *sdev, u16 frequency,
640 u8 antcap)
641{
642 int err;
643 u8 val[SI4713_TXMEA_NRESP];
644 /*
9ca33ccd
HV
645 * .First byte = 0
646 * .Second byte = frequency's MSB
647 * .Third byte = frequency's LSB
648 * .Fourth byte = antcap
02bee89e
EV
649 */
650 const u8 args[SI4713_TXMEA_NARGS] = {
651 0x00,
652 msb(frequency),
653 lsb(frequency),
654 antcap,
655 };
656
657 sdev->tune_rnl = DEFAULT_TUNE_RNL;
658
659 if (antcap > SI4713_MAX_ANTCAP)
660 return -EDOM;
661
662 err = si4713_send_command(sdev, SI4713_CMD_TX_TUNE_MEASURE,
663 args, ARRAY_SIZE(args), val,
664 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
665
666 if (err < 0)
667 return err;
668
669 v4l2_dbg(1, debug, &sdev->sd,
670 "%s: frequency=0x%02x antcap=0x%02x status=0x%02x\n",
671 __func__, frequency, antcap, val[0]);
672
673 return si4713_wait_stc(sdev, TIMEOUT_TX_TUNE);
674}
675
676/*
677 * si4713_tx_tune_status- Returns the status of the tx_tune_freq, tx_tune_mea or
9ca33ccd
HV
678 * tx_tune_power commands. This command return the current
679 * frequency, output voltage in dBuV, the antenna tunning
680 * capacitance value and the received noise level. The
681 * command also clears the stcint interrupt bit when the
682 * first bit of its arguments is high.
02bee89e
EV
683 * @sdev: si4713_device structure for the device we are communicating
684 * @intack: 0x01 to clear the seek/tune complete interrupt status indicator.
685 * @frequency: returned frequency
686 * @power: returned power
687 * @antcap: returned antenna capacitance
688 * @noise: returned noise level
689 */
690static int si4713_tx_tune_status(struct si4713_device *sdev, u8 intack,
691 u16 *frequency, u8 *power,
692 u8 *antcap, u8 *noise)
693{
694 int err;
695 u8 val[SI4713_TXSTATUS_NRESP];
696 /*
9ca33ccd 697 * .First byte = intack bit
02bee89e
EV
698 */
699 const u8 args[SI4713_TXSTATUS_NARGS] = {
700 intack & SI4713_INTACK_MASK,
701 };
702
703 err = si4713_send_command(sdev, SI4713_CMD_TX_TUNE_STATUS,
704 args, ARRAY_SIZE(args), val,
705 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
706
707 if (!err) {
708 v4l2_dbg(1, debug, &sdev->sd,
709 "%s: status=0x%02x\n", __func__, val[0]);
710 *frequency = compose_u16(val[2], val[3]);
711 sdev->frequency = *frequency;
712 *power = val[5];
713 *antcap = val[6];
714 *noise = val[7];
3c1e3009
MCC
715 v4l2_dbg(1, debug, &sdev->sd,
716 "%s: response: %d x 10 kHz (power %d, antcap %d, rnl %d)\n",
717 __func__, *frequency, *power, *antcap, *noise);
02bee89e
EV
718 }
719
720 return err;
721}
722
723/*
724 * si4713_tx_rds_buff - Loads the RDS group buffer FIFO or circular buffer.
725 * @sdev: si4713_device structure for the device we are communicating
726 * @mode: the buffer operation mode.
727 * @rdsb: RDS Block B
728 * @rdsc: RDS Block C
729 * @rdsd: RDS Block D
730 * @cbleft: returns the number of available circular buffer blocks minus the
731 * number of used circular buffer blocks.
732 */
733static int si4713_tx_rds_buff(struct si4713_device *sdev, u8 mode, u16 rdsb,
734 u16 rdsc, u16 rdsd, s8 *cbleft)
735{
736 int err;
737 u8 val[SI4713_RDSBUFF_NRESP];
738
739 const u8 args[SI4713_RDSBUFF_NARGS] = {
740 mode & SI4713_RDSBUFF_MODE_MASK,
741 msb(rdsb),
742 lsb(rdsb),
743 msb(rdsc),
744 lsb(rdsc),
745 msb(rdsd),
746 lsb(rdsd),
747 };
748
749 err = si4713_send_command(sdev, SI4713_CMD_TX_RDS_BUFF,
750 args, ARRAY_SIZE(args), val,
751 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
752
753 if (!err) {
754 v4l2_dbg(1, debug, &sdev->sd,
755 "%s: status=0x%02x\n", __func__, val[0]);
756 *cbleft = (s8)val[2] - val[3];
3c1e3009
MCC
757 v4l2_dbg(1, debug, &sdev->sd,
758 "%s: response: interrupts 0x%02x cb avail: %d cb used %d fifo avail %d fifo used %d\n",
759 __func__, val[1], val[2], val[3], val[4], val[5]);
02bee89e
EV
760 }
761
762 return err;
763}
764
765/*
766 * si4713_tx_rds_ps - Loads the program service buffer.
767 * @sdev: si4713_device structure for the device we are communicating
768 * @psid: program service id to be loaded.
769 * @pschar: assumed 4 size char array to be loaded into the program service
770 */
771static int si4713_tx_rds_ps(struct si4713_device *sdev, u8 psid,
772 unsigned char *pschar)
773{
774 int err;
775 u8 val[SI4713_RDSPS_NRESP];
776
777 const u8 args[SI4713_RDSPS_NARGS] = {
778 psid & SI4713_RDSPS_PSID_MASK,
779 pschar[0],
780 pschar[1],
781 pschar[2],
782 pschar[3],
783 };
784
785 err = si4713_send_command(sdev, SI4713_CMD_TX_RDS_PS,
786 args, ARRAY_SIZE(args), val,
787 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
788
789 if (err < 0)
790 return err;
791
792 v4l2_dbg(1, debug, &sdev->sd, "%s: status=0x%02x\n", __func__, val[0]);
793
794 return err;
795}
796
797static int si4713_set_power_state(struct si4713_device *sdev, u8 value)
798{
02bee89e 799 if (value)
55b2a312
HV
800 return si4713_powerup(sdev);
801 return si4713_powerdown(sdev);
02bee89e
EV
802}
803
804static int si4713_set_mute(struct si4713_device *sdev, u16 mute)
805{
806 int rval = 0;
807
808 mute = set_mute(mute);
809
02bee89e
EV
810 if (sdev->power_state)
811 rval = si4713_write_property(sdev,
812 SI4713_TX_LINE_INPUT_MUTE, mute);
813
02bee89e
EV
814 return rval;
815}
816
817static int si4713_set_rds_ps_name(struct si4713_device *sdev, char *ps_name)
818{
819 int rval = 0, i;
820 u8 len = 0;
821
822 /* We want to clear the whole thing */
823 if (!strlen(ps_name))
824 memset(ps_name, 0, MAX_RDS_PS_NAME + 1);
825
02bee89e
EV
826 if (sdev->power_state) {
827 /* Write the new ps name and clear the padding */
828 for (i = 0; i < MAX_RDS_PS_NAME; i += (RDS_BLOCK / 2)) {
829 rval = si4713_tx_rds_ps(sdev, (i / (RDS_BLOCK / 2)),
830 ps_name + i);
831 if (rval < 0)
55b2a312 832 return rval;
02bee89e
EV
833 }
834
835 /* Setup the size to be sent */
836 if (strlen(ps_name))
837 len = strlen(ps_name) - 1;
838 else
839 len = 1;
840
841 rval = si4713_write_property(sdev,
842 SI4713_TX_RDS_PS_MESSAGE_COUNT,
843 rds_ps_nblocks(len));
844 if (rval < 0)
55b2a312 845 return rval;
02bee89e
EV
846
847 rval = si4713_write_property(sdev,
848 SI4713_TX_RDS_PS_REPEAT_COUNT,
849 DEFAULT_RDS_PS_REPEAT_COUNT * 2);
850 if (rval < 0)
55b2a312 851 return rval;
02bee89e
EV
852 }
853
02bee89e
EV
854 return rval;
855}
856
8aab72bb 857static int si4713_set_rds_radio_text(struct si4713_device *sdev, const char *rt)
02bee89e 858{
8aab72bb 859 static const char cr[RDS_RADIOTEXT_BLK_SIZE] = { RDS_CARRIAGE_RETURN, 0 };
02bee89e
EV
860 int rval = 0, i;
861 u16 t_index = 0;
862 u8 b_index = 0, cr_inserted = 0;
863 s8 left;
864
02bee89e 865 if (!sdev->power_state)
03aa1bcd 866 return rval;
02bee89e
EV
867
868 rval = si4713_tx_rds_buff(sdev, RDS_BLOCK_CLEAR, 0, 0, 0, &left);
869 if (rval < 0)
55b2a312 870 return rval;
02bee89e
EV
871
872 if (!strlen(rt))
03aa1bcd 873 return rval;
02bee89e
EV
874
875 do {
876 /* RDS spec says that if the last block isn't used,
877 * then apply a carriage return
878 */
03aa1bcd 879 if (t_index < (RDS_RADIOTEXT_INDEX_MAX * RDS_RADIOTEXT_BLK_SIZE)) {
02bee89e 880 for (i = 0; i < RDS_RADIOTEXT_BLK_SIZE; i++) {
03aa1bcd
HV
881 if (!rt[t_index + i] ||
882 rt[t_index + i] == RDS_CARRIAGE_RETURN) {
8aab72bb 883 rt = cr;
02bee89e
EV
884 cr_inserted = 1;
885 break;
886 }
887 }
888 }
889
890 rval = si4713_tx_rds_buff(sdev, RDS_BLOCK_LOAD,
891 compose_u16(RDS_RADIOTEXT_2A, b_index++),
892 compose_u16(rt[t_index], rt[t_index + 1]),
893 compose_u16(rt[t_index + 2], rt[t_index + 3]),
894 &left);
895 if (rval < 0)
55b2a312 896 return rval;
02bee89e
EV
897
898 t_index += RDS_RADIOTEXT_BLK_SIZE;
899
900 if (cr_inserted)
901 break;
902 } while (left > 0);
903
03aa1bcd
HV
904 return rval;
905}
906
907/*
908 * si4713_update_tune_status - update properties from tx_tune_status
909 * command. Must be called with sdev->mutex held.
910 * @sdev: si4713_device structure for the device we are communicating
911 */
912static int si4713_update_tune_status(struct si4713_device *sdev)
913{
914 int rval;
915 u16 f = 0;
916 u8 p = 0, a = 0, n = 0;
917
918 rval = si4713_tx_tune_status(sdev, 0x00, &f, &p, &a, &n);
919
920 if (rval < 0)
921 goto exit;
922
923/* TODO: check that power_level and antenna_capacitor really are not
924 changed by the hardware. If they are, then these controls should become
925 volatiles.
926 sdev->power_level = p;
927 sdev->antenna_capacitor = a;*/
928 sdev->tune_rnl = n;
929
930exit:
02bee89e
EV
931 return rval;
932}
933
934static int si4713_choose_econtrol_action(struct si4713_device *sdev, u32 id,
03aa1bcd 935 s32 *bit, s32 *mask, u16 *property, int *mul,
02bee89e
EV
936 unsigned long **table, int *size)
937{
938 s32 rval = 0;
939
940 switch (id) {
941 /* FM_TX class controls */
942 case V4L2_CID_RDS_TX_PI:
943 *property = SI4713_TX_RDS_PI;
944 *mul = 1;
02bee89e
EV
945 break;
946 case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD:
947 *property = SI4713_TX_ACOMP_THRESHOLD;
948 *mul = 1;
02bee89e
EV
949 break;
950 case V4L2_CID_AUDIO_COMPRESSION_GAIN:
951 *property = SI4713_TX_ACOMP_GAIN;
952 *mul = 1;
02bee89e
EV
953 break;
954 case V4L2_CID_PILOT_TONE_FREQUENCY:
955 *property = SI4713_TX_PILOT_FREQUENCY;
956 *mul = 1;
02bee89e
EV
957 break;
958 case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME:
959 *property = SI4713_TX_ACOMP_ATTACK_TIME;
960 *mul = ATTACK_TIME_UNIT;
02bee89e
EV
961 break;
962 case V4L2_CID_PILOT_TONE_DEVIATION:
963 *property = SI4713_TX_PILOT_DEVIATION;
964 *mul = 10;
02bee89e
EV
965 break;
966 case V4L2_CID_AUDIO_LIMITER_DEVIATION:
967 *property = SI4713_TX_AUDIO_DEVIATION;
968 *mul = 10;
02bee89e
EV
969 break;
970 case V4L2_CID_RDS_TX_DEVIATION:
971 *property = SI4713_TX_RDS_DEVIATION;
972 *mul = 1;
02bee89e
EV
973 break;
974
975 case V4L2_CID_RDS_TX_PTY:
976 *property = SI4713_TX_RDS_PS_MISC;
977 *bit = 5;
978 *mask = 0x1F << 5;
02bee89e 979 break;
1abba28c
HV
980 case V4L2_CID_RDS_TX_DYNAMIC_PTY:
981 *property = SI4713_TX_RDS_PS_MISC;
982 *bit = 15;
983 *mask = 1 << 15;
984 break;
985 case V4L2_CID_RDS_TX_COMPRESSED:
986 *property = SI4713_TX_RDS_PS_MISC;
987 *bit = 14;
988 *mask = 1 << 14;
989 break;
990 case V4L2_CID_RDS_TX_ARTIFICIAL_HEAD:
991 *property = SI4713_TX_RDS_PS_MISC;
992 *bit = 13;
993 *mask = 1 << 13;
994 break;
995 case V4L2_CID_RDS_TX_MONO_STEREO:
996 *property = SI4713_TX_RDS_PS_MISC;
997 *bit = 12;
998 *mask = 1 << 12;
999 break;
1000 case V4L2_CID_RDS_TX_TRAFFIC_PROGRAM:
1001 *property = SI4713_TX_RDS_PS_MISC;
1002 *bit = 10;
1003 *mask = 1 << 10;
1004 break;
1005 case V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT:
1006 *property = SI4713_TX_RDS_PS_MISC;
1007 *bit = 4;
1008 *mask = 1 << 4;
1009 break;
1010 case V4L2_CID_RDS_TX_MUSIC_SPEECH:
1011 *property = SI4713_TX_RDS_PS_MISC;
1012 *bit = 3;
1013 *mask = 1 << 3;
1014 break;
02bee89e
EV
1015 case V4L2_CID_AUDIO_LIMITER_ENABLED:
1016 *property = SI4713_TX_ACOMP_ENABLE;
1017 *bit = 1;
1018 *mask = 1 << 1;
02bee89e
EV
1019 break;
1020 case V4L2_CID_AUDIO_COMPRESSION_ENABLED:
1021 *property = SI4713_TX_ACOMP_ENABLE;
1022 *bit = 0;
1023 *mask = 1 << 0;
02bee89e
EV
1024 break;
1025 case V4L2_CID_PILOT_TONE_ENABLED:
1026 *property = SI4713_TX_COMPONENT_ENABLE;
1027 *bit = 0;
1028 *mask = 1 << 0;
02bee89e
EV
1029 break;
1030
1031 case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME:
1032 *property = SI4713_TX_LIMITER_RELEASE_TIME;
1033 *table = limiter_times;
1034 *size = ARRAY_SIZE(limiter_times);
02bee89e
EV
1035 break;
1036 case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME:
1037 *property = SI4713_TX_ACOMP_RELEASE_TIME;
1038 *table = acomp_rtimes;
1039 *size = ARRAY_SIZE(acomp_rtimes);
02bee89e
EV
1040 break;
1041 case V4L2_CID_TUNE_PREEMPHASIS:
1042 *property = SI4713_TX_PREEMPHASIS;
1043 *table = preemphasis_values;
1044 *size = ARRAY_SIZE(preemphasis_values);
02bee89e
EV
1045 break;
1046
1047 default:
1048 rval = -EINVAL;
02bee89e 1049 break;
02bee89e
EV
1050 }
1051
02bee89e
EV
1052 return rval;
1053}
1054
b530a447 1055static int si4713_s_frequency(struct v4l2_subdev *sd, const struct v4l2_frequency *f);
3f70e1f5 1056static int si4713_s_modulator(struct v4l2_subdev *sd, const struct v4l2_modulator *);
02bee89e
EV
1057/*
1058 * si4713_setup - Sets the device up with current configuration.
1059 * @sdev: si4713_device structure for the device we are communicating
1060 */
1061static int si4713_setup(struct si4713_device *sdev)
1062{
02bee89e
EV
1063 struct v4l2_frequency f;
1064 struct v4l2_modulator vm;
03aa1bcd 1065 int rval;
02bee89e
EV
1066
1067 /* Device procedure needs to set frequency first */
b387754d 1068 f.tuner = 0;
03aa1bcd 1069 f.frequency = sdev->frequency ? sdev->frequency : DEFAULT_FREQUENCY;
02bee89e 1070 f.frequency = si4713_to_v4l2(f.frequency);
03aa1bcd 1071 rval = si4713_s_frequency(&sdev->sd, &f);
02bee89e
EV
1072
1073 vm.index = 0;
03aa1bcd 1074 if (sdev->stereo)
02bee89e
EV
1075 vm.txsubchans = V4L2_TUNER_SUB_STEREO;
1076 else
1077 vm.txsubchans = V4L2_TUNER_SUB_MONO;
03aa1bcd 1078 if (sdev->rds_enabled)
02bee89e
EV
1079 vm.txsubchans |= V4L2_TUNER_SUB_RDS;
1080 si4713_s_modulator(&sdev->sd, &vm);
1081
02bee89e
EV
1082 return rval;
1083}
1084
1085/*
1086 * si4713_initialize - Sets the device up with default configuration.
1087 * @sdev: si4713_device structure for the device we are communicating
1088 */
1089static int si4713_initialize(struct si4713_device *sdev)
1090{
1091 int rval;
1092
1093 rval = si4713_set_power_state(sdev, POWER_ON);
1094 if (rval < 0)
55b2a312 1095 return rval;
02bee89e
EV
1096
1097 rval = si4713_checkrev(sdev);
1098 if (rval < 0)
55b2a312 1099 return rval;
02bee89e
EV
1100
1101 rval = si4713_set_power_state(sdev, POWER_OFF);
1102 if (rval < 0)
55b2a312 1103 return rval;
02bee89e 1104
02bee89e 1105 sdev->frequency = DEFAULT_FREQUENCY;
02bee89e
EV
1106 sdev->stereo = 1;
1107 sdev->tune_rnl = DEFAULT_TUNE_RNL;
03aa1bcd 1108 return 0;
02bee89e
EV
1109}
1110
03aa1bcd
HV
1111/* si4713_s_ctrl - set the value of a control */
1112static int si4713_s_ctrl(struct v4l2_ctrl *ctrl)
02bee89e 1113{
03aa1bcd
HV
1114 struct si4713_device *sdev =
1115 container_of(ctrl->handler, struct si4713_device, ctrl_handler);
1116 u32 val = 0;
02bee89e
EV
1117 s32 bit = 0, mask = 0;
1118 u16 property = 0;
1119 int mul = 0;
1120 unsigned long *table = NULL;
1121 int size = 0;
03aa1bcd
HV
1122 bool force = false;
1123 int c;
1124 int ret = 0;
02bee89e 1125
03aa1bcd 1126 if (ctrl->id != V4L2_CID_AUDIO_MUTE)
02bee89e 1127 return -EINVAL;
03aa1bcd
HV
1128 if (ctrl->is_new) {
1129 if (ctrl->val) {
1130 ret = si4713_set_mute(sdev, ctrl->val);
1131 if (!ret)
1132 ret = si4713_set_power_state(sdev, POWER_DOWN);
1133 return ret;
02bee89e 1134 }
03aa1bcd
HV
1135 ret = si4713_set_power_state(sdev, POWER_UP);
1136 if (!ret)
1137 ret = si4713_set_mute(sdev, ctrl->val);
1138 if (!ret)
1139 ret = si4713_setup(sdev);
1140 if (ret)
1141 return ret;
1142 force = true;
02bee89e
EV
1143 }
1144
03aa1bcd
HV
1145 if (!sdev->power_state)
1146 return 0;
02bee89e 1147
03aa1bcd
HV
1148 for (c = 1; !ret && c < ctrl->ncontrols; c++) {
1149 ctrl = ctrl->cluster[c];
02bee89e 1150
03aa1bcd
HV
1151 if (!force && !ctrl->is_new)
1152 continue;
02bee89e 1153
03aa1bcd 1154 switch (ctrl->id) {
02bee89e 1155 case V4L2_CID_RDS_TX_PS_NAME:
2a9ec373 1156 ret = si4713_set_rds_ps_name(sdev, ctrl->p_new.p_char);
03aa1bcd
HV
1157 break;
1158
02bee89e 1159 case V4L2_CID_RDS_TX_RADIO_TEXT:
2a9ec373 1160 ret = si4713_set_rds_radio_text(sdev, ctrl->p_new.p_char);
02bee89e 1161 break;
03aa1bcd 1162
02bee89e 1163 case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
03aa1bcd
HV
1164 /* don't handle this control if we force setting all
1165 * controls since in that case it will be handled by
1166 * V4L2_CID_TUNE_POWER_LEVEL. */
1167 if (force)
1168 break;
1169 /* fall through */
02bee89e 1170 case V4L2_CID_TUNE_POWER_LEVEL:
03aa1bcd
HV
1171 ret = si4713_tx_tune_power(sdev,
1172 sdev->tune_pwr_level->val, sdev->tune_ant_cap->val);
1173 if (!ret) {
1174 /* Make sure we don't set this twice */
1175 sdev->tune_ant_cap->is_new = false;
1176 sdev->tune_pwr_level->is_new = false;
1177 }
02bee89e 1178 break;
02bee89e 1179
1abba28c
HV
1180 case V4L2_CID_RDS_TX_ALT_FREQS_ENABLE:
1181 case V4L2_CID_RDS_TX_ALT_FREQS:
1182 if (sdev->rds_alt_freqs_enable->val) {
1183 val = sdev->rds_alt_freqs->p_new.p_u32[0];
1184 val = val / 100 - 876 + 0xe101;
1185 } else {
1186 val = 0xe0e0;
1187 }
1188 ret = si4713_write_property(sdev, SI4713_TX_RDS_PS_AF, val);
1189 break;
1190
03aa1bcd
HV
1191 default:
1192 ret = si4713_choose_econtrol_action(sdev, ctrl->id, &bit,
1193 &mask, &property, &mul, &table, &size);
1194 if (ret < 0)
1195 break;
1196
1197 val = ctrl->val;
1198 if (mul) {
1199 val = val / mul;
1200 } else if (table) {
1201 ret = usecs_to_dev(val, table, size);
1202 if (ret < 0)
1203 break;
1204 val = ret;
1205 ret = 0;
1206 }
02bee89e 1207
03aa1bcd
HV
1208 if (mask) {
1209 ret = si4713_read_property(sdev, property, &val);
1210 if (ret < 0)
1211 break;
1212 val = set_bits(val, ctrl->val, bit, mask);
1213 }
02bee89e 1214
03aa1bcd
HV
1215 ret = si4713_write_property(sdev, property, val);
1216 if (ret < 0)
1217 break;
1218 if (mask)
1219 val = ctrl->val;
1220 break;
02bee89e 1221 }
02bee89e
EV
1222 }
1223
03aa1bcd 1224 return ret;
02bee89e
EV
1225}
1226
1227/* si4713_ioctl - deal with private ioctls (only rnl for now) */
0dec8688 1228static long si4713_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
02bee89e
EV
1229{
1230 struct si4713_device *sdev = to_si4713_device(sd);
1231 struct si4713_rnl *rnl = arg;
1232 u16 frequency;
1233 int rval = 0;
1234
1235 if (!arg)
1236 return -EINVAL;
1237
02bee89e
EV
1238 switch (cmd) {
1239 case SI4713_IOC_MEASURE_RNL:
1240 frequency = v4l2_to_si4713(rnl->frequency);
1241
1242 if (sdev->power_state) {
1243 /* Set desired measurement frequency */
1244 rval = si4713_tx_tune_measure(sdev, frequency, 0);
1245 if (rval < 0)
55b2a312 1246 return rval;
02bee89e
EV
1247 /* get results from tune status */
1248 rval = si4713_update_tune_status(sdev);
1249 if (rval < 0)
55b2a312 1250 return rval;
02bee89e
EV
1251 }
1252 rnl->rnl = sdev->tune_rnl;
1253 break;
1254
1255 default:
1256 /* nothing */
1257 rval = -ENOIOCTLCMD;
1258 }
1259
02bee89e
EV
1260 return rval;
1261}
1262
02bee89e
EV
1263/* si4713_g_modulator - get modulator attributes */
1264static int si4713_g_modulator(struct v4l2_subdev *sd, struct v4l2_modulator *vm)
1265{
1266 struct si4713_device *sdev = to_si4713_device(sd);
1267 int rval = 0;
1268
55b2a312
HV
1269 if (!sdev)
1270 return -ENODEV;
02bee89e 1271
55b2a312
HV
1272 if (vm->index > 0)
1273 return -EINVAL;
02bee89e
EV
1274
1275 strncpy(vm->name, "FM Modulator", 32);
1276 vm->capability = V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LOW |
cb0ed222 1277 V4L2_TUNER_CAP_RDS | V4L2_TUNER_CAP_RDS_CONTROLS;
02bee89e
EV
1278
1279 /* Report current frequency range limits */
1280 vm->rangelow = si4713_to_v4l2(FREQ_RANGE_LOW);
1281 vm->rangehigh = si4713_to_v4l2(FREQ_RANGE_HIGH);
1282
02bee89e
EV
1283 if (sdev->power_state) {
1284 u32 comp_en = 0;
1285
1286 rval = si4713_read_property(sdev, SI4713_TX_COMPONENT_ENABLE,
1287 &comp_en);
1288 if (rval < 0)
55b2a312 1289 return rval;
02bee89e
EV
1290
1291 sdev->stereo = get_status_bit(comp_en, 1, 1 << 1);
02bee89e
EV
1292 }
1293
1294 /* Report current audio mode: mono or stereo */
1295 if (sdev->stereo)
1296 vm->txsubchans = V4L2_TUNER_SUB_STEREO;
1297 else
1298 vm->txsubchans = V4L2_TUNER_SUB_MONO;
1299
1300 /* Report rds feature status */
03aa1bcd 1301 if (sdev->rds_enabled)
02bee89e
EV
1302 vm->txsubchans |= V4L2_TUNER_SUB_RDS;
1303 else
1304 vm->txsubchans &= ~V4L2_TUNER_SUB_RDS;
1305
02bee89e
EV
1306 return rval;
1307}
1308
1309/* si4713_s_modulator - set modulator attributes */
3f70e1f5 1310static int si4713_s_modulator(struct v4l2_subdev *sd, const struct v4l2_modulator *vm)
02bee89e
EV
1311{
1312 struct si4713_device *sdev = to_si4713_device(sd);
1313 int rval = 0;
1314 u16 stereo, rds;
1315 u32 p;
1316
a65f3159
HV
1317 if (!sdev)
1318 return -ENODEV;
02bee89e 1319
a65f3159
HV
1320 if (vm->index > 0)
1321 return -EINVAL;
02bee89e
EV
1322
1323 /* Set audio mode: mono or stereo */
1324 if (vm->txsubchans & V4L2_TUNER_SUB_STEREO)
1325 stereo = 1;
1326 else if (vm->txsubchans & V4L2_TUNER_SUB_MONO)
1327 stereo = 0;
1328 else
a65f3159 1329 return -EINVAL;
02bee89e
EV
1330
1331 rds = !!(vm->txsubchans & V4L2_TUNER_SUB_RDS);
1332
02bee89e
EV
1333 if (sdev->power_state) {
1334 rval = si4713_read_property(sdev,
1335 SI4713_TX_COMPONENT_ENABLE, &p);
1336 if (rval < 0)
55b2a312 1337 return rval;
02bee89e
EV
1338
1339 p = set_bits(p, stereo, 1, 1 << 1);
1340 p = set_bits(p, rds, 2, 1 << 2);
1341
1342 rval = si4713_write_property(sdev,
1343 SI4713_TX_COMPONENT_ENABLE, p);
1344 if (rval < 0)
55b2a312 1345 return rval;
02bee89e
EV
1346 }
1347
1348 sdev->stereo = stereo;
03aa1bcd 1349 sdev->rds_enabled = rds;
02bee89e 1350
02bee89e
EV
1351 return rval;
1352}
1353
1354/* si4713_g_frequency - get tuner or modulator radio frequency */
1355static int si4713_g_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f)
1356{
1357 struct si4713_device *sdev = to_si4713_device(sd);
1358 int rval = 0;
1359
b387754d
HV
1360 if (f->tuner)
1361 return -EINVAL;
02bee89e 1362
02bee89e
EV
1363 if (sdev->power_state) {
1364 u16 freq;
1365 u8 p, a, n;
1366
1367 rval = si4713_tx_tune_status(sdev, 0x00, &freq, &p, &a, &n);
1368 if (rval < 0)
55b2a312 1369 return rval;
02bee89e
EV
1370
1371 sdev->frequency = freq;
1372 }
1373
1374 f->frequency = si4713_to_v4l2(sdev->frequency);
1375
02bee89e
EV
1376 return rval;
1377}
1378
1379/* si4713_s_frequency - set tuner or modulator radio frequency */
b530a447 1380static int si4713_s_frequency(struct v4l2_subdev *sd, const struct v4l2_frequency *f)
02bee89e
EV
1381{
1382 struct si4713_device *sdev = to_si4713_device(sd);
1383 int rval = 0;
1384 u16 frequency = v4l2_to_si4713(f->frequency);
1385
b387754d
HV
1386 if (f->tuner)
1387 return -EINVAL;
1388
02bee89e 1389 /* Check frequency range */
b387754d 1390 frequency = clamp_t(u16, frequency, FREQ_RANGE_LOW, FREQ_RANGE_HIGH);
02bee89e 1391
02bee89e
EV
1392 if (sdev->power_state) {
1393 rval = si4713_tx_tune_freq(sdev, frequency);
1394 if (rval < 0)
55b2a312 1395 return rval;
02bee89e
EV
1396 frequency = rval;
1397 rval = 0;
1398 }
1399 sdev->frequency = frequency;
02bee89e 1400
02bee89e
EV
1401 return rval;
1402}
1403
03aa1bcd
HV
1404static const struct v4l2_ctrl_ops si4713_ctrl_ops = {
1405 .s_ctrl = si4713_s_ctrl,
1406};
1407
1408static const struct v4l2_subdev_core_ops si4713_subdev_core_ops = {
1409 .ioctl = si4713_ioctl,
1410};
1411
02bee89e
EV
1412static const struct v4l2_subdev_tuner_ops si4713_subdev_tuner_ops = {
1413 .g_frequency = si4713_g_frequency,
1414 .s_frequency = si4713_s_frequency,
1415 .g_modulator = si4713_g_modulator,
1416 .s_modulator = si4713_s_modulator,
1417};
1418
1419static const struct v4l2_subdev_ops si4713_subdev_ops = {
1420 .core = &si4713_subdev_core_ops,
1421 .tuner = &si4713_subdev_tuner_ops,
1422};
1423
1abba28c
HV
1424static const struct v4l2_ctrl_config si4713_alt_freqs_ctrl = {
1425 .id = V4L2_CID_RDS_TX_ALT_FREQS,
1426 .type = V4L2_CTRL_TYPE_U32,
1427 .min = 87600,
1428 .max = 107900,
1429 .step = 100,
1430 .def = 87600,
1431 .dims = { 1 },
1432 .elem_size = sizeof(u32),
1433};
1434
02bee89e
EV
1435/*
1436 * I2C driver interface
1437 */
1438/* si4713_probe - probe for the device */
1439static int si4713_probe(struct i2c_client *client,
1440 const struct i2c_device_id *id)
1441{
1442 struct si4713_device *sdev;
03aa1bcd 1443 struct v4l2_ctrl_handler *hdl;
98bea620
SR
1444 struct si4713_platform_data *pdata = client->dev.platform_data;
1445 struct device_node *np = client->dev.of_node;
1446 struct radio_si4713_platform_data si4713_pdev_pdata;
1447 struct platform_device *si4713_pdev;
d4471dec 1448 int rval;
02bee89e 1449
80cd5c7a 1450 sdev = devm_kzalloc(&client->dev, sizeof(*sdev), GFP_KERNEL);
02bee89e
EV
1451 if (!sdev) {
1452 dev_err(&client->dev, "Failed to alloc video device.\n");
1453 rval = -ENOMEM;
1454 goto exit;
1455 }
1456
b36ae853
UKK
1457 sdev->gpio_reset = devm_gpiod_get_optional(&client->dev, "reset",
1458 GPIOD_OUT_LOW);
1459 if (IS_ERR(sdev->gpio_reset)) {
fbe14a12
SR
1460 rval = PTR_ERR(sdev->gpio_reset);
1461 dev_err(&client->dev, "Failed to request gpio: %d\n", rval);
80cd5c7a 1462 goto exit;
00df055a
JN
1463 }
1464
d4471dec
SR
1465 sdev->vdd = devm_regulator_get_optional(&client->dev, "vdd");
1466 if (IS_ERR(sdev->vdd)) {
1467 rval = PTR_ERR(sdev->vdd);
1468 if (rval == -EPROBE_DEFER)
1469 goto exit;
1470
1471 dev_dbg(&client->dev, "no vdd regulator found: %d\n", rval);
1472 sdev->vdd = NULL;
1473 }
1474
1475 sdev->vio = devm_regulator_get_optional(&client->dev, "vio");
1476 if (IS_ERR(sdev->vio)) {
1477 rval = PTR_ERR(sdev->vio);
1478 if (rval == -EPROBE_DEFER)
1479 goto exit;
00df055a 1480
d4471dec
SR
1481 dev_dbg(&client->dev, "no vio regulator found: %d\n", rval);
1482 sdev->vio = NULL;
02bee89e
EV
1483 }
1484
1485 v4l2_i2c_subdev_init(&sdev->sd, client, &si4713_subdev_ops);
1486
02bee89e
EV
1487 init_completion(&sdev->work);
1488
03aa1bcd
HV
1489 hdl = &sdev->ctrl_handler;
1490 v4l2_ctrl_handler_init(hdl, 20);
1491 sdev->mute = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1492 V4L2_CID_AUDIO_MUTE, 0, 1, 1, DEFAULT_MUTE);
1493
1494 sdev->rds_pi = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1495 V4L2_CID_RDS_TX_PI, 0, 0xffff, 1, DEFAULT_RDS_PI);
1496 sdev->rds_pty = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1497 V4L2_CID_RDS_TX_PTY, 0, 31, 1, DEFAULT_RDS_PTY);
1abba28c
HV
1498 sdev->rds_compressed = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1499 V4L2_CID_RDS_TX_COMPRESSED, 0, 1, 1, 0);
1500 sdev->rds_art_head = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1501 V4L2_CID_RDS_TX_ARTIFICIAL_HEAD, 0, 1, 1, 0);
1502 sdev->rds_stereo = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1503 V4L2_CID_RDS_TX_MONO_STEREO, 0, 1, 1, 1);
1504 sdev->rds_tp = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1505 V4L2_CID_RDS_TX_TRAFFIC_PROGRAM, 0, 1, 1, 0);
1506 sdev->rds_ta = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1507 V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT, 0, 1, 1, 0);
1508 sdev->rds_ms = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1509 V4L2_CID_RDS_TX_MUSIC_SPEECH, 0, 1, 1, 1);
1510 sdev->rds_dyn_pty = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1511 V4L2_CID_RDS_TX_DYNAMIC_PTY, 0, 1, 1, 0);
1512 sdev->rds_alt_freqs_enable = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1513 V4L2_CID_RDS_TX_ALT_FREQS_ENABLE, 0, 1, 1, 0);
1514 sdev->rds_alt_freqs = v4l2_ctrl_new_custom(hdl, &si4713_alt_freqs_ctrl, NULL);
03aa1bcd
HV
1515 sdev->rds_deviation = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1516 V4L2_CID_RDS_TX_DEVIATION, 0, MAX_RDS_DEVIATION,
1517 10, DEFAULT_RDS_DEVIATION);
1518 /*
1519 * Report step as 8. From RDS spec, psname
1520 * should be 8. But there are receivers which scroll strings
1521 * sized as 8xN.
1522 */
1523 sdev->rds_ps_name = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1524 V4L2_CID_RDS_TX_PS_NAME, 0, MAX_RDS_PS_NAME, 8, 0);
1525 /*
1526 * Report step as 32 (2A block). From RDS spec,
1527 * radio text should be 32 for 2A block. But there are receivers
1528 * which scroll strings sized as 32xN. Setting default to 32.
1529 */
1530 sdev->rds_radio_text = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1531 V4L2_CID_RDS_TX_RADIO_TEXT, 0, MAX_RDS_RADIO_TEXT, 32, 0);
1532
1533 sdev->limiter_enabled = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1534 V4L2_CID_AUDIO_LIMITER_ENABLED, 0, 1, 1, 1);
1535 sdev->limiter_release_time = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1536 V4L2_CID_AUDIO_LIMITER_RELEASE_TIME, 250,
1537 MAX_LIMITER_RELEASE_TIME, 10, DEFAULT_LIMITER_RTIME);
1538 sdev->limiter_deviation = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1539 V4L2_CID_AUDIO_LIMITER_DEVIATION, 0,
1540 MAX_LIMITER_DEVIATION, 10, DEFAULT_LIMITER_DEV);
1541
1542 sdev->compression_enabled = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1543 V4L2_CID_AUDIO_COMPRESSION_ENABLED, 0, 1, 1, 1);
1544 sdev->compression_gain = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1545 V4L2_CID_AUDIO_COMPRESSION_GAIN, 0, MAX_ACOMP_GAIN, 1,
1546 DEFAULT_ACOMP_GAIN);
1547 sdev->compression_threshold = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
9ca33ccd
HV
1548 V4L2_CID_AUDIO_COMPRESSION_THRESHOLD,
1549 MIN_ACOMP_THRESHOLD, MAX_ACOMP_THRESHOLD, 1,
03aa1bcd
HV
1550 DEFAULT_ACOMP_THRESHOLD);
1551 sdev->compression_attack_time = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1552 V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME, 0,
1553 MAX_ACOMP_ATTACK_TIME, 500, DEFAULT_ACOMP_ATIME);
1554 sdev->compression_release_time = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1555 V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME, 100000,
1556 MAX_ACOMP_RELEASE_TIME, 100000, DEFAULT_ACOMP_RTIME);
1557
1558 sdev->pilot_tone_enabled = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1559 V4L2_CID_PILOT_TONE_ENABLED, 0, 1, 1, 1);
1560 sdev->pilot_tone_deviation = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1561 V4L2_CID_PILOT_TONE_DEVIATION, 0, MAX_PILOT_DEVIATION,
1562 10, DEFAULT_PILOT_DEVIATION);
1563 sdev->pilot_tone_freq = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
1564 V4L2_CID_PILOT_TONE_FREQUENCY, 0, MAX_PILOT_FREQUENCY,
1565 1, DEFAULT_PILOT_FREQUENCY);
1566
1567 sdev->tune_preemphasis = v4l2_ctrl_new_std_menu(hdl, &si4713_ctrl_ops,
1568 V4L2_CID_TUNE_PREEMPHASIS,
1569 V4L2_PREEMPHASIS_75_uS, 0, V4L2_PREEMPHASIS_50_uS);
1570 sdev->tune_pwr_level = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
9ca33ccd
HV
1571 V4L2_CID_TUNE_POWER_LEVEL, 0, SI4713_MAX_POWER,
1572 1, DEFAULT_POWER_LEVEL);
03aa1bcd 1573 sdev->tune_ant_cap = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
9ca33ccd
HV
1574 V4L2_CID_TUNE_ANTENNA_CAPACITOR, 0, SI4713_MAX_ANTCAP,
1575 1, 0);
03aa1bcd
HV
1576
1577 if (hdl->error) {
1578 rval = hdl->error;
1579 goto free_ctrls;
1580 }
1abba28c 1581 v4l2_ctrl_cluster(29, &sdev->mute);
03aa1bcd
HV
1582 sdev->sd.ctrl_handler = hdl;
1583
02bee89e 1584 if (client->irq) {
c3a5baf4 1585 rval = devm_request_irq(&client->dev, client->irq,
0798ec69 1586 si4713_handler, IRQF_TRIGGER_FALLING,
02bee89e
EV
1587 client->name, sdev);
1588 if (rval < 0) {
1589 v4l2_err(&sdev->sd, "Could not request IRQ\n");
d4471dec 1590 goto free_ctrls;
02bee89e
EV
1591 }
1592 v4l2_dbg(1, debug, &sdev->sd, "IRQ requested.\n");
1593 } else {
1594 v4l2_warn(&sdev->sd, "IRQ not configured. Using timeouts.\n");
1595 }
1596
1597 rval = si4713_initialize(sdev);
1598 if (rval < 0) {
1599 v4l2_err(&sdev->sd, "Failed to probe device information.\n");
c3a5baf4 1600 goto free_ctrls;
02bee89e
EV
1601 }
1602
98bea620
SR
1603 if (!np && (!pdata || !pdata->is_platform_device))
1604 return 0;
1605
1606 si4713_pdev = platform_device_alloc("radio-si4713", -1);
50f2468e
JL
1607 if (!si4713_pdev) {
1608 rval = -ENOMEM;
98bea620 1609 goto put_main_pdev;
50f2468e 1610 }
98bea620
SR
1611
1612 si4713_pdev_pdata.subdev = client;
1613 rval = platform_device_add_data(si4713_pdev, &si4713_pdev_pdata,
1614 sizeof(si4713_pdev_pdata));
1615 if (rval)
1616 goto put_main_pdev;
1617
1618 rval = platform_device_add(si4713_pdev);
1619 if (rval)
1620 goto put_main_pdev;
1621
1622 sdev->pd = si4713_pdev;
1623
02bee89e
EV
1624 return 0;
1625
98bea620
SR
1626put_main_pdev:
1627 platform_device_put(si4713_pdev);
1628 v4l2_device_unregister_subdev(&sdev->sd);
03aa1bcd
HV
1629free_ctrls:
1630 v4l2_ctrl_handler_free(hdl);
02bee89e
EV
1631exit:
1632 return rval;
1633}
1634
1635/* si4713_remove - remove the device */
1636static int si4713_remove(struct i2c_client *client)
1637{
1638 struct v4l2_subdev *sd = i2c_get_clientdata(client);
1639 struct si4713_device *sdev = to_si4713_device(sd);
1640
98bea620
SR
1641 platform_device_unregister(sdev->pd);
1642
02bee89e
EV
1643 if (sdev->power_state)
1644 si4713_set_power_state(sdev, POWER_DOWN);
1645
02bee89e 1646 v4l2_device_unregister_subdev(sd);
03aa1bcd 1647 v4l2_ctrl_handler_free(sd->ctrl_handler);
02bee89e
EV
1648
1649 return 0;
1650}
1651
1652/* si4713_i2c_driver - i2c driver interface */
1653static const struct i2c_device_id si4713_id[] = {
1654 { "si4713" , 0 },
1655 { },
1656};
1657MODULE_DEVICE_TABLE(i2c, si4713_id);
1658
1659static struct i2c_driver si4713_i2c_driver = {
1660 .driver = {
1661 .name = "si4713",
1662 },
1663 .probe = si4713_probe,
1664 .remove = si4713_remove,
1665 .id_table = si4713_id,
1666};
1667
c6e8d86f 1668module_i2c_driver(si4713_i2c_driver);