blob: deca2e06ff2203bba0caae2e5737499fd0f9cdc2 [file] [log] [blame]
Eduardo Valentin02bee892009-08-08 08:46:53 -03001/*
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.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24#include <linux/mutex.h>
25#include <linux/completion.h>
26#include <linux/delay.h>
27#include <linux/interrupt.h>
28#include <linux/i2c.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090029#include <linux/slab.h>
Jarkko Nikula00df0552010-10-29 11:31:39 -030030#include <linux/gpio.h>
31#include <linux/regulator/consumer.h>
Eduardo Valentin02bee892009-08-08 08:46:53 -030032#include <media/v4l2-device.h>
33#include <media/v4l2-ioctl.h>
34#include <media/v4l2-common.h>
35
36#include "si4713-i2c.h"
37
38/* module parameters */
39static int debug;
40module_param(debug, int, S_IRUGO | S_IWUSR);
41MODULE_PARM_DESC(debug, "Debug level (0 - 2)");
42
43MODULE_LICENSE("GPL");
44MODULE_AUTHOR("Eduardo Valentin <eduardo.valentin@nokia.com>");
45MODULE_DESCRIPTION("I2C driver for Si4713 FM Radio Transmitter");
46MODULE_VERSION("0.0.1");
47
Jarkko Nikula00df0552010-10-29 11:31:39 -030048static const char *si4713_supply_names[SI4713_NUM_SUPPLIES] = {
49 "vio",
50 "vdd",
51};
52
Eduardo Valentin02bee892009-08-08 08:46:53 -030053#define DEFAULT_RDS_PI 0x00
54#define DEFAULT_RDS_PTY 0x00
55#define DEFAULT_RDS_PS_NAME ""
56#define DEFAULT_RDS_RADIO_TEXT DEFAULT_RDS_PS_NAME
57#define DEFAULT_RDS_DEVIATION 0x00C8
58#define DEFAULT_RDS_PS_REPEAT_COUNT 0x0003
59#define DEFAULT_LIMITER_RTIME 0x1392
60#define DEFAULT_LIMITER_DEV 0x102CA
61#define DEFAULT_PILOT_FREQUENCY 0x4A38
62#define DEFAULT_PILOT_DEVIATION 0x1A5E
63#define DEFAULT_ACOMP_ATIME 0x0000
64#define DEFAULT_ACOMP_RTIME 0xF4240L
65#define DEFAULT_ACOMP_GAIN 0x0F
66#define DEFAULT_ACOMP_THRESHOLD (-0x28)
67#define DEFAULT_MUTE 0x01
68#define DEFAULT_POWER_LEVEL 88
69#define DEFAULT_FREQUENCY 8800
70#define DEFAULT_PREEMPHASIS FMPE_EU
71#define DEFAULT_TUNE_RNL 0xFF
72
73#define to_si4713_device(sd) container_of(sd, struct si4713_device, sd)
74
75/* frequency domain transformation (using times 10 to avoid floats) */
76#define FREQDEV_UNIT 100000
77#define FREQV4L2_MULTI 625
78#define si4713_to_v4l2(f) ((f * FREQDEV_UNIT) / FREQV4L2_MULTI)
79#define v4l2_to_si4713(f) ((f * FREQV4L2_MULTI) / FREQDEV_UNIT)
80#define FREQ_RANGE_LOW 7600
81#define FREQ_RANGE_HIGH 10800
82
83#define MAX_ARGS 7
84
85#define RDS_BLOCK 8
86#define RDS_BLOCK_CLEAR 0x03
87#define RDS_BLOCK_LOAD 0x04
88#define RDS_RADIOTEXT_2A 0x20
89#define RDS_RADIOTEXT_BLK_SIZE 4
90#define RDS_RADIOTEXT_INDEX_MAX 0x0F
91#define RDS_CARRIAGE_RETURN 0x0D
92
93#define rds_ps_nblocks(len) ((len / RDS_BLOCK) + (len % RDS_BLOCK ? 1 : 0))
94
95#define get_status_bit(p, b, m) (((p) & (m)) >> (b))
96#define set_bits(p, v, b, m) (((p) & ~(m)) | ((v) << (b)))
97
98#define ATTACK_TIME_UNIT 500
99
100#define POWER_OFF 0x00
101#define POWER_ON 0x01
102
103#define msb(x) ((u8)((u16) x >> 8))
104#define lsb(x) ((u8)((u16) x & 0x00FF))
105#define compose_u16(msb, lsb) (((u16)msb << 8) | lsb)
106#define check_command_failed(status) (!(status & SI4713_CTS) || \
107 (status & SI4713_ERR))
108/* mute definition */
109#define set_mute(p) ((p & 1) | ((p & 1) << 1));
110#define get_mute(p) (p & 0x01)
111
112#ifdef DEBUG
113#define DBG_BUFFER(device, message, buffer, size) \
114 { \
115 int i; \
116 char str[(size)*5]; \
117 for (i = 0; i < size; i++) \
118 sprintf(str + i * 5, " 0x%02x", buffer[i]); \
119 v4l2_dbg(2, debug, device, "%s:%s\n", message, str); \
120 }
121#else
122#define DBG_BUFFER(device, message, buffer, size)
123#endif
124
125/*
126 * Values for limiter release time (sorted by second column)
127 * device release
128 * value time (us)
129 */
130static long limiter_times[] = {
131 2000, 250,
132 1000, 500,
133 510, 1000,
134 255, 2000,
135 170, 3000,
136 127, 4020,
137 102, 5010,
138 85, 6020,
139 73, 7010,
140 64, 7990,
141 57, 8970,
142 51, 10030,
143 25, 20470,
144 17, 30110,
145 13, 39380,
146 10, 51190,
147 8, 63690,
148 7, 73140,
149 6, 85330,
150 5, 102390,
151};
152
153/*
154 * Values for audio compression release time (sorted by second column)
155 * device release
156 * value time (us)
157 */
158static unsigned long acomp_rtimes[] = {
159 0, 100000,
160 1, 200000,
161 2, 350000,
162 3, 525000,
163 4, 1000000,
164};
165
166/*
167 * Values for preemphasis (sorted by second column)
168 * device preemphasis
169 * value value (v4l2)
170 */
171static unsigned long preemphasis_values[] = {
172 FMPE_DISABLED, V4L2_PREEMPHASIS_DISABLED,
173 FMPE_EU, V4L2_PREEMPHASIS_50_uS,
174 FMPE_USA, V4L2_PREEMPHASIS_75_uS,
175};
176
177static int usecs_to_dev(unsigned long usecs, unsigned long const array[],
178 int size)
179{
180 int i;
181 int rval = -EINVAL;
182
183 for (i = 0; i < size / 2; i++)
184 if (array[(i * 2) + 1] >= usecs) {
185 rval = array[i * 2];
186 break;
187 }
188
189 return rval;
190}
191
192static unsigned long dev_to_usecs(int value, unsigned long const array[],
193 int size)
194{
195 int i;
196 int rval = -EINVAL;
197
198 for (i = 0; i < size / 2; i++)
199 if (array[i * 2] == value) {
200 rval = array[(i * 2) + 1];
201 break;
202 }
203
204 return rval;
205}
206
207/* si4713_handler: IRQ handler, just complete work */
208static irqreturn_t si4713_handler(int irq, void *dev)
209{
210 struct si4713_device *sdev = dev;
211
212 v4l2_dbg(2, debug, &sdev->sd,
213 "%s: sending signal to completion work.\n", __func__);
214 complete(&sdev->work);
215
216 return IRQ_HANDLED;
217}
218
219/*
220 * si4713_send_command - sends a command to si4713 and waits its response
221 * @sdev: si4713_device structure for the device we are communicating
222 * @command: command id
223 * @args: command arguments we are sending (up to 7)
224 * @argn: actual size of @args
225 * @response: buffer to place the expected response from the device (up to 15)
226 * @respn: actual size of @response
227 * @usecs: amount of time to wait before reading the response (in usecs)
228 */
229static int si4713_send_command(struct si4713_device *sdev, const u8 command,
230 const u8 args[], const int argn,
231 u8 response[], const int respn, const int usecs)
232{
233 struct i2c_client *client = v4l2_get_subdevdata(&sdev->sd);
234 u8 data1[MAX_ARGS + 1];
235 int err;
236
237 if (!client->adapter)
238 return -ENODEV;
239
240 /* First send the command and its arguments */
241 data1[0] = command;
242 memcpy(data1 + 1, args, argn);
243 DBG_BUFFER(&sdev->sd, "Parameters", data1, argn + 1);
244
245 err = i2c_master_send(client, data1, argn + 1);
246 if (err != argn + 1) {
247 v4l2_err(&sdev->sd, "Error while sending command 0x%02x\n",
248 command);
249 return (err > 0) ? -EIO : err;
250 }
251
252 /* Wait response from interrupt */
253 if (!wait_for_completion_timeout(&sdev->work,
254 usecs_to_jiffies(usecs) + 1))
255 v4l2_warn(&sdev->sd,
256 "(%s) Device took too much time to answer.\n",
257 __func__);
258
259 /* Then get the response */
260 err = i2c_master_recv(client, response, respn);
261 if (err != respn) {
262 v4l2_err(&sdev->sd,
263 "Error while reading response for command 0x%02x\n",
264 command);
265 return (err > 0) ? -EIO : err;
266 }
267
268 DBG_BUFFER(&sdev->sd, "Response", response, respn);
269 if (check_command_failed(response[0]))
270 return -EBUSY;
271
272 return 0;
273}
274
275/*
276 * si4713_read_property - reads a si4713 property
277 * @sdev: si4713_device structure for the device we are communicating
278 * @prop: property identification number
279 * @pv: property value to be returned on success
280 */
281static int si4713_read_property(struct si4713_device *sdev, u16 prop, u32 *pv)
282{
283 int err;
284 u8 val[SI4713_GET_PROP_NRESP];
285 /*
286 * .First byte = 0
287 * .Second byte = property's MSB
288 * .Third byte = property's LSB
289 */
290 const u8 args[SI4713_GET_PROP_NARGS] = {
291 0x00,
292 msb(prop),
293 lsb(prop),
294 };
295
296 err = si4713_send_command(sdev, SI4713_CMD_GET_PROPERTY,
297 args, ARRAY_SIZE(args), val,
298 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
299
300 if (err < 0)
301 return err;
302
303 *pv = compose_u16(val[2], val[3]);
304
305 v4l2_dbg(1, debug, &sdev->sd,
306 "%s: property=0x%02x value=0x%02x status=0x%02x\n",
307 __func__, prop, *pv, val[0]);
308
309 return err;
310}
311
312/*
313 * si4713_write_property - modifies a si4713 property
314 * @sdev: si4713_device structure for the device we are communicating
315 * @prop: property identification number
316 * @val: new value for that property
317 */
318static int si4713_write_property(struct si4713_device *sdev, u16 prop, u16 val)
319{
320 int rval;
321 u8 resp[SI4713_SET_PROP_NRESP];
322 /*
323 * .First byte = 0
324 * .Second byte = property's MSB
325 * .Third byte = property's LSB
326 * .Fourth byte = value's MSB
327 * .Fifth byte = value's LSB
328 */
329 const u8 args[SI4713_SET_PROP_NARGS] = {
330 0x00,
331 msb(prop),
332 lsb(prop),
333 msb(val),
334 lsb(val),
335 };
336
337 rval = si4713_send_command(sdev, SI4713_CMD_SET_PROPERTY,
338 args, ARRAY_SIZE(args),
339 resp, ARRAY_SIZE(resp),
340 DEFAULT_TIMEOUT);
341
342 if (rval < 0)
343 return rval;
344
345 v4l2_dbg(1, debug, &sdev->sd,
346 "%s: property=0x%02x value=0x%02x status=0x%02x\n",
347 __func__, prop, val, resp[0]);
348
349 /*
350 * As there is no command response for SET_PROPERTY,
351 * wait Tcomp time to finish before proceed, in order
352 * to have property properly set.
353 */
354 msleep(TIMEOUT_SET_PROPERTY);
355
356 return rval;
357}
358
359/*
360 * si4713_powerup - Powers the device up
361 * @sdev: si4713_device structure for the device we are communicating
362 */
363static int si4713_powerup(struct si4713_device *sdev)
364{
365 int err;
366 u8 resp[SI4713_PWUP_NRESP];
367 /*
368 * .First byte = Enabled interrupts and boot function
369 * .Second byte = Input operation mode
370 */
371 const u8 args[SI4713_PWUP_NARGS] = {
372 SI4713_PWUP_CTSIEN | SI4713_PWUP_GPO2OEN | SI4713_PWUP_FUNC_TX,
373 SI4713_PWUP_OPMOD_ANALOG,
374 };
375
376 if (sdev->power_state)
377 return 0;
378
Jarkko Nikula00df0552010-10-29 11:31:39 -0300379 err = regulator_bulk_enable(ARRAY_SIZE(sdev->supplies),
380 sdev->supplies);
381 if (err) {
382 v4l2_err(&sdev->sd, "Failed to enable supplies: %d\n", err);
383 return err;
384 }
385 if (gpio_is_valid(sdev->gpio_reset)) {
386 udelay(50);
387 gpio_set_value(sdev->gpio_reset, 1);
388 }
389
Eduardo Valentin02bee892009-08-08 08:46:53 -0300390 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
401 err = si4713_write_property(sdev, SI4713_GPO_IEN,
402 SI4713_STC_INT | SI4713_CTS);
403 } else {
Jarkko Nikula00df0552010-10-29 11:31:39 -0300404 if (gpio_is_valid(sdev->gpio_reset))
405 gpio_set_value(sdev->gpio_reset, 0);
406 err = regulator_bulk_disable(ARRAY_SIZE(sdev->supplies),
407 sdev->supplies);
408 if (err)
409 v4l2_err(&sdev->sd,
410 "Failed to disable supplies: %d\n", err);
Eduardo Valentin02bee892009-08-08 08:46:53 -0300411 }
412
413 return err;
414}
415
416/*
417 * si4713_powerdown - Powers the device down
418 * @sdev: si4713_device structure for the device we are communicating
419 */
420static int si4713_powerdown(struct si4713_device *sdev)
421{
422 int err;
423 u8 resp[SI4713_PWDN_NRESP];
424
425 if (!sdev->power_state)
426 return 0;
427
428 err = si4713_send_command(sdev, SI4713_CMD_POWER_DOWN,
429 NULL, 0,
430 resp, ARRAY_SIZE(resp),
431 DEFAULT_TIMEOUT);
432
433 if (!err) {
434 v4l2_dbg(1, debug, &sdev->sd, "Power down response: 0x%02x\n",
435 resp[0]);
436 v4l2_dbg(1, debug, &sdev->sd, "Device in reset mode\n");
Jarkko Nikula00df0552010-10-29 11:31:39 -0300437 if (gpio_is_valid(sdev->gpio_reset))
438 gpio_set_value(sdev->gpio_reset, 0);
439 err = regulator_bulk_disable(ARRAY_SIZE(sdev->supplies),
440 sdev->supplies);
441 if (err)
442 v4l2_err(&sdev->sd,
443 "Failed to disable supplies: %d\n", err);
Eduardo Valentin02bee892009-08-08 08:46:53 -0300444 sdev->power_state = POWER_OFF;
445 }
446
447 return err;
448}
449
450/*
451 * si4713_checkrev - Checks if we are treating a device with the correct rev.
452 * @sdev: si4713_device structure for the device we are communicating
453 */
454static int si4713_checkrev(struct si4713_device *sdev)
455{
456 struct i2c_client *client = v4l2_get_subdevdata(&sdev->sd);
457 int rval;
458 u8 resp[SI4713_GETREV_NRESP];
459
460 mutex_lock(&sdev->mutex);
461
462 rval = si4713_send_command(sdev, SI4713_CMD_GET_REV,
463 NULL, 0,
464 resp, ARRAY_SIZE(resp),
465 DEFAULT_TIMEOUT);
466
467 if (rval < 0)
468 goto unlock;
469
470 if (resp[1] == SI4713_PRODUCT_NUMBER) {
471 v4l2_info(&sdev->sd, "chip found @ 0x%02x (%s)\n",
472 client->addr << 1, client->adapter->name);
473 } else {
474 v4l2_err(&sdev->sd, "Invalid product number\n");
475 rval = -EINVAL;
476 }
477
478unlock:
479 mutex_unlock(&sdev->mutex);
480 return rval;
481}
482
483/*
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300484 * si4713_wait_stc - Waits STC interrupt and clears status bits. Useful
Eduardo Valentin02bee892009-08-08 08:46:53 -0300485 * for TX_TUNE_POWER, TX_TUNE_FREQ and TX_TUNE_MEAS
486 * @sdev: si4713_device structure for the device we are communicating
487 * @usecs: timeout to wait for STC interrupt signal
488 */
489static int si4713_wait_stc(struct si4713_device *sdev, const int usecs)
490{
491 int err;
492 u8 resp[SI4713_GET_STATUS_NRESP];
493
494 /* Wait response from STC interrupt */
495 if (!wait_for_completion_timeout(&sdev->work,
496 usecs_to_jiffies(usecs) + 1))
497 v4l2_warn(&sdev->sd,
498 "%s: device took too much time to answer (%d usec).\n",
499 __func__, usecs);
500
501 /* Clear status bits */
502 err = si4713_send_command(sdev, SI4713_CMD_GET_INT_STATUS,
503 NULL, 0,
504 resp, ARRAY_SIZE(resp),
505 DEFAULT_TIMEOUT);
506
507 if (err < 0)
508 goto exit;
509
510 v4l2_dbg(1, debug, &sdev->sd,
511 "%s: status bits: 0x%02x\n", __func__, resp[0]);
512
513 if (!(resp[0] & SI4713_STC_INT))
514 err = -EIO;
515
516exit:
517 return err;
518}
519
520/*
521 * si4713_tx_tune_freq - Sets the state of the RF carrier and sets the tuning
522 * frequency between 76 and 108 MHz in 10 kHz units and
523 * steps of 50 kHz.
524 * @sdev: si4713_device structure for the device we are communicating
525 * @frequency: desired frequency (76 - 108 MHz, unit 10 KHz, step 50 kHz)
526 */
527static int si4713_tx_tune_freq(struct si4713_device *sdev, u16 frequency)
528{
529 int err;
530 u8 val[SI4713_TXFREQ_NRESP];
531 /*
532 * .First byte = 0
533 * .Second byte = frequency's MSB
534 * .Third byte = frequency's LSB
535 */
536 const u8 args[SI4713_TXFREQ_NARGS] = {
537 0x00,
538 msb(frequency),
539 lsb(frequency),
540 };
541
542 err = si4713_send_command(sdev, SI4713_CMD_TX_TUNE_FREQ,
543 args, ARRAY_SIZE(args), val,
544 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
545
546 if (err < 0)
547 return err;
548
549 v4l2_dbg(1, debug, &sdev->sd,
550 "%s: frequency=0x%02x status=0x%02x\n", __func__,
551 frequency, val[0]);
552
553 err = si4713_wait_stc(sdev, TIMEOUT_TX_TUNE);
554 if (err < 0)
555 return err;
556
557 return compose_u16(args[1], args[2]);
558}
559
560/*
561 * si4713_tx_tune_power - Sets the RF voltage level between 88 and 115 dBuV in
562 * 1 dB units. A value of 0x00 indicates off. The command
563 * also sets the antenna tuning capacitance. A value of 0
564 * indicates autotuning, and a value of 1 - 191 indicates
565 * a manual override, which results in a tuning
566 * capacitance of 0.25 pF x @antcap.
567 * @sdev: si4713_device structure for the device we are communicating
568 * @power: tuning power (88 - 115 dBuV, unit/step 1 dB)
569 * @antcap: value of antenna tuning capacitor (0 - 191)
570 */
571static int si4713_tx_tune_power(struct si4713_device *sdev, u8 power,
572 u8 antcap)
573{
574 int err;
575 u8 val[SI4713_TXPWR_NRESP];
576 /*
577 * .First byte = 0
578 * .Second byte = 0
579 * .Third byte = power
580 * .Fourth byte = antcap
581 */
582 const u8 args[SI4713_TXPWR_NARGS] = {
583 0x00,
584 0x00,
585 power,
586 antcap,
587 };
588
589 if (((power > 0) && (power < SI4713_MIN_POWER)) ||
590 power > SI4713_MAX_POWER || antcap > SI4713_MAX_ANTCAP)
591 return -EDOM;
592
593 err = si4713_send_command(sdev, SI4713_CMD_TX_TUNE_POWER,
594 args, ARRAY_SIZE(args), val,
595 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
596
597 if (err < 0)
598 return err;
599
600 v4l2_dbg(1, debug, &sdev->sd,
601 "%s: power=0x%02x antcap=0x%02x status=0x%02x\n",
602 __func__, power, antcap, val[0]);
603
604 return si4713_wait_stc(sdev, TIMEOUT_TX_TUNE_POWER);
605}
606
607/*
608 * si4713_tx_tune_measure - Enters receive mode and measures the received noise
609 * level in units of dBuV on the selected frequency.
610 * The Frequency must be between 76 and 108 MHz in 10 kHz
611 * units and steps of 50 kHz. The command also sets the
612 * antenna tuning capacitance. A value of 0 means
613 * autotuning, and a value of 1 to 191 indicates manual
614 * override.
615 * @sdev: si4713_device structure for the device we are communicating
616 * @frequency: desired frequency (76 - 108 MHz, unit 10 KHz, step 50 kHz)
617 * @antcap: value of antenna tuning capacitor (0 - 191)
618 */
619static int si4713_tx_tune_measure(struct si4713_device *sdev, u16 frequency,
620 u8 antcap)
621{
622 int err;
623 u8 val[SI4713_TXMEA_NRESP];
624 /*
625 * .First byte = 0
626 * .Second byte = frequency's MSB
627 * .Third byte = frequency's LSB
628 * .Fourth byte = antcap
629 */
630 const u8 args[SI4713_TXMEA_NARGS] = {
631 0x00,
632 msb(frequency),
633 lsb(frequency),
634 antcap,
635 };
636
637 sdev->tune_rnl = DEFAULT_TUNE_RNL;
638
639 if (antcap > SI4713_MAX_ANTCAP)
640 return -EDOM;
641
642 err = si4713_send_command(sdev, SI4713_CMD_TX_TUNE_MEASURE,
643 args, ARRAY_SIZE(args), val,
644 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
645
646 if (err < 0)
647 return err;
648
649 v4l2_dbg(1, debug, &sdev->sd,
650 "%s: frequency=0x%02x antcap=0x%02x status=0x%02x\n",
651 __func__, frequency, antcap, val[0]);
652
653 return si4713_wait_stc(sdev, TIMEOUT_TX_TUNE);
654}
655
656/*
657 * si4713_tx_tune_status- Returns the status of the tx_tune_freq, tx_tune_mea or
658 * tx_tune_power commands. This command return the current
659 * frequency, output voltage in dBuV, the antenna tunning
660 * capacitance value and the received noise level. The
661 * command also clears the stcint interrupt bit when the
662 * first bit of its arguments is high.
663 * @sdev: si4713_device structure for the device we are communicating
664 * @intack: 0x01 to clear the seek/tune complete interrupt status indicator.
665 * @frequency: returned frequency
666 * @power: returned power
667 * @antcap: returned antenna capacitance
668 * @noise: returned noise level
669 */
670static int si4713_tx_tune_status(struct si4713_device *sdev, u8 intack,
671 u16 *frequency, u8 *power,
672 u8 *antcap, u8 *noise)
673{
674 int err;
675 u8 val[SI4713_TXSTATUS_NRESP];
676 /*
677 * .First byte = intack bit
678 */
679 const u8 args[SI4713_TXSTATUS_NARGS] = {
680 intack & SI4713_INTACK_MASK,
681 };
682
683 err = si4713_send_command(sdev, SI4713_CMD_TX_TUNE_STATUS,
684 args, ARRAY_SIZE(args), val,
685 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
686
687 if (!err) {
688 v4l2_dbg(1, debug, &sdev->sd,
689 "%s: status=0x%02x\n", __func__, val[0]);
690 *frequency = compose_u16(val[2], val[3]);
691 sdev->frequency = *frequency;
692 *power = val[5];
693 *antcap = val[6];
694 *noise = val[7];
695 v4l2_dbg(1, debug, &sdev->sd, "%s: response: %d x 10 kHz "
696 "(power %d, antcap %d, rnl %d)\n", __func__,
697 *frequency, *power, *antcap, *noise);
698 }
699
700 return err;
701}
702
703/*
704 * si4713_tx_rds_buff - Loads the RDS group buffer FIFO or circular buffer.
705 * @sdev: si4713_device structure for the device we are communicating
706 * @mode: the buffer operation mode.
707 * @rdsb: RDS Block B
708 * @rdsc: RDS Block C
709 * @rdsd: RDS Block D
710 * @cbleft: returns the number of available circular buffer blocks minus the
711 * number of used circular buffer blocks.
712 */
713static int si4713_tx_rds_buff(struct si4713_device *sdev, u8 mode, u16 rdsb,
714 u16 rdsc, u16 rdsd, s8 *cbleft)
715{
716 int err;
717 u8 val[SI4713_RDSBUFF_NRESP];
718
719 const u8 args[SI4713_RDSBUFF_NARGS] = {
720 mode & SI4713_RDSBUFF_MODE_MASK,
721 msb(rdsb),
722 lsb(rdsb),
723 msb(rdsc),
724 lsb(rdsc),
725 msb(rdsd),
726 lsb(rdsd),
727 };
728
729 err = si4713_send_command(sdev, SI4713_CMD_TX_RDS_BUFF,
730 args, ARRAY_SIZE(args), val,
731 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
732
733 if (!err) {
734 v4l2_dbg(1, debug, &sdev->sd,
735 "%s: status=0x%02x\n", __func__, val[0]);
736 *cbleft = (s8)val[2] - val[3];
737 v4l2_dbg(1, debug, &sdev->sd, "%s: response: interrupts"
738 " 0x%02x cb avail: %d cb used %d fifo avail"
739 " %d fifo used %d\n", __func__, val[1],
740 val[2], val[3], val[4], val[5]);
741 }
742
743 return err;
744}
745
746/*
747 * si4713_tx_rds_ps - Loads the program service buffer.
748 * @sdev: si4713_device structure for the device we are communicating
749 * @psid: program service id to be loaded.
750 * @pschar: assumed 4 size char array to be loaded into the program service
751 */
752static int si4713_tx_rds_ps(struct si4713_device *sdev, u8 psid,
753 unsigned char *pschar)
754{
755 int err;
756 u8 val[SI4713_RDSPS_NRESP];
757
758 const u8 args[SI4713_RDSPS_NARGS] = {
759 psid & SI4713_RDSPS_PSID_MASK,
760 pschar[0],
761 pschar[1],
762 pschar[2],
763 pschar[3],
764 };
765
766 err = si4713_send_command(sdev, SI4713_CMD_TX_RDS_PS,
767 args, ARRAY_SIZE(args), val,
768 ARRAY_SIZE(val), DEFAULT_TIMEOUT);
769
770 if (err < 0)
771 return err;
772
773 v4l2_dbg(1, debug, &sdev->sd, "%s: status=0x%02x\n", __func__, val[0]);
774
775 return err;
776}
777
778static int si4713_set_power_state(struct si4713_device *sdev, u8 value)
779{
780 int rval;
781
782 mutex_lock(&sdev->mutex);
783
784 if (value)
785 rval = si4713_powerup(sdev);
786 else
787 rval = si4713_powerdown(sdev);
788
789 mutex_unlock(&sdev->mutex);
790 return rval;
791}
792
793static int si4713_set_mute(struct si4713_device *sdev, u16 mute)
794{
795 int rval = 0;
796
797 mute = set_mute(mute);
798
799 mutex_lock(&sdev->mutex);
800
801 if (sdev->power_state)
802 rval = si4713_write_property(sdev,
803 SI4713_TX_LINE_INPUT_MUTE, mute);
804
805 if (rval >= 0)
806 sdev->mute = get_mute(mute);
807
808 mutex_unlock(&sdev->mutex);
809
810 return rval;
811}
812
813static int si4713_set_rds_ps_name(struct si4713_device *sdev, char *ps_name)
814{
815 int rval = 0, i;
816 u8 len = 0;
817
818 /* We want to clear the whole thing */
819 if (!strlen(ps_name))
820 memset(ps_name, 0, MAX_RDS_PS_NAME + 1);
821
822 mutex_lock(&sdev->mutex);
823
824 if (sdev->power_state) {
825 /* Write the new ps name and clear the padding */
826 for (i = 0; i < MAX_RDS_PS_NAME; i += (RDS_BLOCK / 2)) {
827 rval = si4713_tx_rds_ps(sdev, (i / (RDS_BLOCK / 2)),
828 ps_name + i);
829 if (rval < 0)
830 goto unlock;
831 }
832
833 /* Setup the size to be sent */
834 if (strlen(ps_name))
835 len = strlen(ps_name) - 1;
836 else
837 len = 1;
838
839 rval = si4713_write_property(sdev,
840 SI4713_TX_RDS_PS_MESSAGE_COUNT,
841 rds_ps_nblocks(len));
842 if (rval < 0)
843 goto unlock;
844
845 rval = si4713_write_property(sdev,
846 SI4713_TX_RDS_PS_REPEAT_COUNT,
847 DEFAULT_RDS_PS_REPEAT_COUNT * 2);
848 if (rval < 0)
849 goto unlock;
850 }
851
852 strncpy(sdev->rds_info.ps_name, ps_name, MAX_RDS_PS_NAME);
853
854unlock:
855 mutex_unlock(&sdev->mutex);
856 return rval;
857}
858
859static int si4713_set_rds_radio_text(struct si4713_device *sdev, char *rt)
860{
861 int rval = 0, i;
862 u16 t_index = 0;
863 u8 b_index = 0, cr_inserted = 0;
864 s8 left;
865
866 mutex_lock(&sdev->mutex);
867
868 if (!sdev->power_state)
869 goto copy;
870
871 rval = si4713_tx_rds_buff(sdev, RDS_BLOCK_CLEAR, 0, 0, 0, &left);
872 if (rval < 0)
873 goto unlock;
874
875 if (!strlen(rt))
876 goto copy;
877
878 do {
879 /* RDS spec says that if the last block isn't used,
880 * then apply a carriage return
881 */
882 if (t_index < (RDS_RADIOTEXT_INDEX_MAX *
883 RDS_RADIOTEXT_BLK_SIZE)) {
884 for (i = 0; i < RDS_RADIOTEXT_BLK_SIZE; i++) {
885 if (!rt[t_index + i] || rt[t_index + i] ==
886 RDS_CARRIAGE_RETURN) {
887 rt[t_index + i] = RDS_CARRIAGE_RETURN;
888 cr_inserted = 1;
889 break;
890 }
891 }
892 }
893
894 rval = si4713_tx_rds_buff(sdev, RDS_BLOCK_LOAD,
895 compose_u16(RDS_RADIOTEXT_2A, b_index++),
896 compose_u16(rt[t_index], rt[t_index + 1]),
897 compose_u16(rt[t_index + 2], rt[t_index + 3]),
898 &left);
899 if (rval < 0)
900 goto unlock;
901
902 t_index += RDS_RADIOTEXT_BLK_SIZE;
903
904 if (cr_inserted)
905 break;
906 } while (left > 0);
907
908copy:
909 strncpy(sdev->rds_info.radio_text, rt, MAX_RDS_RADIO_TEXT);
910
911unlock:
912 mutex_unlock(&sdev->mutex);
913 return rval;
914}
915
916static int si4713_choose_econtrol_action(struct si4713_device *sdev, u32 id,
917 u32 **shadow, s32 *bit, s32 *mask, u16 *property, int *mul,
918 unsigned long **table, int *size)
919{
920 s32 rval = 0;
921
922 switch (id) {
923 /* FM_TX class controls */
924 case V4L2_CID_RDS_TX_PI:
925 *property = SI4713_TX_RDS_PI;
926 *mul = 1;
927 *shadow = &sdev->rds_info.pi;
928 break;
929 case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD:
930 *property = SI4713_TX_ACOMP_THRESHOLD;
931 *mul = 1;
932 *shadow = &sdev->acomp_info.threshold;
933 break;
934 case V4L2_CID_AUDIO_COMPRESSION_GAIN:
935 *property = SI4713_TX_ACOMP_GAIN;
936 *mul = 1;
937 *shadow = &sdev->acomp_info.gain;
938 break;
939 case V4L2_CID_PILOT_TONE_FREQUENCY:
940 *property = SI4713_TX_PILOT_FREQUENCY;
941 *mul = 1;
942 *shadow = &sdev->pilot_info.frequency;
943 break;
944 case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME:
945 *property = SI4713_TX_ACOMP_ATTACK_TIME;
946 *mul = ATTACK_TIME_UNIT;
947 *shadow = &sdev->acomp_info.attack_time;
948 break;
949 case V4L2_CID_PILOT_TONE_DEVIATION:
950 *property = SI4713_TX_PILOT_DEVIATION;
951 *mul = 10;
952 *shadow = &sdev->pilot_info.deviation;
953 break;
954 case V4L2_CID_AUDIO_LIMITER_DEVIATION:
955 *property = SI4713_TX_AUDIO_DEVIATION;
956 *mul = 10;
957 *shadow = &sdev->limiter_info.deviation;
958 break;
959 case V4L2_CID_RDS_TX_DEVIATION:
960 *property = SI4713_TX_RDS_DEVIATION;
961 *mul = 1;
962 *shadow = &sdev->rds_info.deviation;
963 break;
964
965 case V4L2_CID_RDS_TX_PTY:
966 *property = SI4713_TX_RDS_PS_MISC;
967 *bit = 5;
968 *mask = 0x1F << 5;
969 *shadow = &sdev->rds_info.pty;
970 break;
971 case V4L2_CID_AUDIO_LIMITER_ENABLED:
972 *property = SI4713_TX_ACOMP_ENABLE;
973 *bit = 1;
974 *mask = 1 << 1;
975 *shadow = &sdev->limiter_info.enabled;
976 break;
977 case V4L2_CID_AUDIO_COMPRESSION_ENABLED:
978 *property = SI4713_TX_ACOMP_ENABLE;
979 *bit = 0;
980 *mask = 1 << 0;
981 *shadow = &sdev->acomp_info.enabled;
982 break;
983 case V4L2_CID_PILOT_TONE_ENABLED:
984 *property = SI4713_TX_COMPONENT_ENABLE;
985 *bit = 0;
986 *mask = 1 << 0;
987 *shadow = &sdev->pilot_info.enabled;
988 break;
989
990 case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME:
991 *property = SI4713_TX_LIMITER_RELEASE_TIME;
992 *table = limiter_times;
993 *size = ARRAY_SIZE(limiter_times);
994 *shadow = &sdev->limiter_info.release_time;
995 break;
996 case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME:
997 *property = SI4713_TX_ACOMP_RELEASE_TIME;
998 *table = acomp_rtimes;
999 *size = ARRAY_SIZE(acomp_rtimes);
1000 *shadow = &sdev->acomp_info.release_time;
1001 break;
1002 case V4L2_CID_TUNE_PREEMPHASIS:
1003 *property = SI4713_TX_PREEMPHASIS;
1004 *table = preemphasis_values;
1005 *size = ARRAY_SIZE(preemphasis_values);
1006 *shadow = &sdev->preemphasis;
1007 break;
1008
1009 default:
1010 rval = -EINVAL;
1011 };
1012
1013 return rval;
1014}
1015
1016static int si4713_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc);
1017
1018/* write string property */
1019static int si4713_write_econtrol_string(struct si4713_device *sdev,
1020 struct v4l2_ext_control *control)
1021{
1022 struct v4l2_queryctrl vqc;
1023 int len;
1024 s32 rval = 0;
1025
1026 vqc.id = control->id;
1027 rval = si4713_queryctrl(&sdev->sd, &vqc);
1028 if (rval < 0)
1029 goto exit;
1030
1031 switch (control->id) {
1032 case V4L2_CID_RDS_TX_PS_NAME: {
1033 char ps_name[MAX_RDS_PS_NAME + 1];
1034
1035 len = control->size - 1;
1036 if (len > MAX_RDS_PS_NAME) {
1037 rval = -ERANGE;
1038 goto exit;
1039 }
1040 rval = copy_from_user(ps_name, control->string, len);
Dan Carpenteraac870a2010-06-04 07:34:40 -03001041 if (rval) {
1042 rval = -EFAULT;
Eduardo Valentin02bee892009-08-08 08:46:53 -03001043 goto exit;
Dan Carpenteraac870a2010-06-04 07:34:40 -03001044 }
Eduardo Valentin02bee892009-08-08 08:46:53 -03001045 ps_name[len] = '\0';
1046
1047 if (strlen(ps_name) % vqc.step) {
1048 rval = -ERANGE;
1049 goto exit;
1050 }
1051
1052 rval = si4713_set_rds_ps_name(sdev, ps_name);
1053 }
1054 break;
1055
1056 case V4L2_CID_RDS_TX_RADIO_TEXT: {
1057 char radio_text[MAX_RDS_RADIO_TEXT + 1];
1058
1059 len = control->size - 1;
1060 if (len > MAX_RDS_RADIO_TEXT) {
1061 rval = -ERANGE;
1062 goto exit;
1063 }
1064 rval = copy_from_user(radio_text, control->string, len);
Dan Carpenteraac870a2010-06-04 07:34:40 -03001065 if (rval) {
1066 rval = -EFAULT;
Eduardo Valentin02bee892009-08-08 08:46:53 -03001067 goto exit;
Dan Carpenteraac870a2010-06-04 07:34:40 -03001068 }
Eduardo Valentin02bee892009-08-08 08:46:53 -03001069 radio_text[len] = '\0';
1070
1071 if (strlen(radio_text) % vqc.step) {
1072 rval = -ERANGE;
1073 goto exit;
1074 }
1075
1076 rval = si4713_set_rds_radio_text(sdev, radio_text);
1077 }
1078 break;
1079
1080 default:
1081 rval = -EINVAL;
1082 break;
1083 };
1084
1085exit:
1086 return rval;
1087}
1088
1089static int validate_range(struct v4l2_subdev *sd,
1090 struct v4l2_ext_control *control)
1091{
1092 struct v4l2_queryctrl vqc;
1093 int rval;
1094
1095 vqc.id = control->id;
1096 rval = si4713_queryctrl(sd, &vqc);
1097 if (rval < 0)
1098 goto exit;
1099
1100 if (control->value < vqc.minimum || control->value > vqc.maximum)
1101 rval = -ERANGE;
1102
1103exit:
1104 return rval;
1105}
1106
1107/* properties which use tx_tune_power*/
1108static int si4713_write_econtrol_tune(struct si4713_device *sdev,
1109 struct v4l2_ext_control *control)
1110{
1111 s32 rval = 0;
1112 u8 power, antcap;
1113
1114 rval = validate_range(&sdev->sd, control);
1115 if (rval < 0)
1116 goto exit;
1117
1118 mutex_lock(&sdev->mutex);
1119
1120 switch (control->id) {
1121 case V4L2_CID_TUNE_POWER_LEVEL:
1122 power = control->value;
1123 antcap = sdev->antenna_capacitor;
1124 break;
1125 case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
1126 power = sdev->power_level;
1127 antcap = control->value;
1128 break;
1129 default:
1130 rval = -EINVAL;
1131 goto unlock;
1132 };
1133
1134 if (sdev->power_state)
1135 rval = si4713_tx_tune_power(sdev, power, antcap);
1136
1137 if (rval == 0) {
1138 sdev->power_level = power;
1139 sdev->antenna_capacitor = antcap;
1140 }
1141
1142unlock:
1143 mutex_unlock(&sdev->mutex);
1144exit:
1145 return rval;
1146}
1147
1148static int si4713_write_econtrol_integers(struct si4713_device *sdev,
1149 struct v4l2_ext_control *control)
1150{
1151 s32 rval;
1152 u32 *shadow = NULL, val = 0;
1153 s32 bit = 0, mask = 0;
1154 u16 property = 0;
1155 int mul = 0;
1156 unsigned long *table = NULL;
1157 int size = 0;
1158
1159 rval = validate_range(&sdev->sd, control);
1160 if (rval < 0)
1161 goto exit;
1162
1163 rval = si4713_choose_econtrol_action(sdev, control->id, &shadow, &bit,
1164 &mask, &property, &mul, &table, &size);
1165 if (rval < 0)
1166 goto exit;
1167
1168 val = control->value;
1169 if (mul) {
1170 val = control->value / mul;
1171 } else if (table) {
1172 rval = usecs_to_dev(control->value, table, size);
1173 if (rval < 0)
1174 goto exit;
1175 val = rval;
1176 rval = 0;
1177 }
1178
1179 mutex_lock(&sdev->mutex);
1180
1181 if (sdev->power_state) {
1182 if (mask) {
1183 rval = si4713_read_property(sdev, property, &val);
1184 if (rval < 0)
1185 goto unlock;
1186 val = set_bits(val, control->value, bit, mask);
1187 }
1188
1189 rval = si4713_write_property(sdev, property, val);
1190 if (rval < 0)
1191 goto unlock;
1192 if (mask)
1193 val = control->value;
1194 }
1195
1196 if (mul) {
1197 *shadow = val * mul;
1198 } else if (table) {
1199 rval = dev_to_usecs(val, table, size);
1200 if (rval < 0)
1201 goto unlock;
1202 *shadow = rval;
1203 rval = 0;
1204 } else {
1205 *shadow = val;
1206 }
1207
1208unlock:
1209 mutex_unlock(&sdev->mutex);
1210exit:
1211 return rval;
1212}
1213
1214static int si4713_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f);
1215static int si4713_s_modulator(struct v4l2_subdev *sd, struct v4l2_modulator *);
1216/*
1217 * si4713_setup - Sets the device up with current configuration.
1218 * @sdev: si4713_device structure for the device we are communicating
1219 */
1220static int si4713_setup(struct si4713_device *sdev)
1221{
1222 struct v4l2_ext_control ctrl;
1223 struct v4l2_frequency f;
1224 struct v4l2_modulator vm;
1225 struct si4713_device *tmp;
1226 int rval = 0;
1227
1228 tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
1229 if (!tmp)
1230 return -ENOMEM;
1231
1232 /* Get a local copy to avoid race */
1233 mutex_lock(&sdev->mutex);
1234 memcpy(tmp, sdev, sizeof(*sdev));
1235 mutex_unlock(&sdev->mutex);
1236
1237 ctrl.id = V4L2_CID_RDS_TX_PI;
1238 ctrl.value = tmp->rds_info.pi;
1239 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1240
1241 ctrl.id = V4L2_CID_AUDIO_COMPRESSION_THRESHOLD;
1242 ctrl.value = tmp->acomp_info.threshold;
1243 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1244
1245 ctrl.id = V4L2_CID_AUDIO_COMPRESSION_GAIN;
1246 ctrl.value = tmp->acomp_info.gain;
1247 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1248
1249 ctrl.id = V4L2_CID_PILOT_TONE_FREQUENCY;
1250 ctrl.value = tmp->pilot_info.frequency;
1251 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1252
1253 ctrl.id = V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME;
1254 ctrl.value = tmp->acomp_info.attack_time;
1255 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1256
1257 ctrl.id = V4L2_CID_PILOT_TONE_DEVIATION;
1258 ctrl.value = tmp->pilot_info.deviation;
1259 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1260
1261 ctrl.id = V4L2_CID_AUDIO_LIMITER_DEVIATION;
1262 ctrl.value = tmp->limiter_info.deviation;
1263 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1264
1265 ctrl.id = V4L2_CID_RDS_TX_DEVIATION;
1266 ctrl.value = tmp->rds_info.deviation;
1267 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1268
1269 ctrl.id = V4L2_CID_RDS_TX_PTY;
1270 ctrl.value = tmp->rds_info.pty;
1271 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1272
1273 ctrl.id = V4L2_CID_AUDIO_LIMITER_ENABLED;
1274 ctrl.value = tmp->limiter_info.enabled;
1275 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1276
1277 ctrl.id = V4L2_CID_AUDIO_COMPRESSION_ENABLED;
1278 ctrl.value = tmp->acomp_info.enabled;
1279 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1280
1281 ctrl.id = V4L2_CID_PILOT_TONE_ENABLED;
1282 ctrl.value = tmp->pilot_info.enabled;
1283 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1284
1285 ctrl.id = V4L2_CID_AUDIO_LIMITER_RELEASE_TIME;
1286 ctrl.value = tmp->limiter_info.release_time;
1287 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1288
1289 ctrl.id = V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME;
1290 ctrl.value = tmp->acomp_info.release_time;
1291 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1292
1293 ctrl.id = V4L2_CID_TUNE_PREEMPHASIS;
1294 ctrl.value = tmp->preemphasis;
1295 rval |= si4713_write_econtrol_integers(sdev, &ctrl);
1296
1297 ctrl.id = V4L2_CID_RDS_TX_PS_NAME;
1298 rval |= si4713_set_rds_ps_name(sdev, tmp->rds_info.ps_name);
1299
1300 ctrl.id = V4L2_CID_RDS_TX_RADIO_TEXT;
1301 rval |= si4713_set_rds_radio_text(sdev, tmp->rds_info.radio_text);
1302
1303 /* Device procedure needs to set frequency first */
1304 f.frequency = tmp->frequency ? tmp->frequency : DEFAULT_FREQUENCY;
1305 f.frequency = si4713_to_v4l2(f.frequency);
1306 rval |= si4713_s_frequency(&sdev->sd, &f);
1307
1308 ctrl.id = V4L2_CID_TUNE_POWER_LEVEL;
1309 ctrl.value = tmp->power_level;
1310 rval |= si4713_write_econtrol_tune(sdev, &ctrl);
1311
1312 ctrl.id = V4L2_CID_TUNE_ANTENNA_CAPACITOR;
1313 ctrl.value = tmp->antenna_capacitor;
1314 rval |= si4713_write_econtrol_tune(sdev, &ctrl);
1315
1316 vm.index = 0;
1317 if (tmp->stereo)
1318 vm.txsubchans = V4L2_TUNER_SUB_STEREO;
1319 else
1320 vm.txsubchans = V4L2_TUNER_SUB_MONO;
1321 if (tmp->rds_info.enabled)
1322 vm.txsubchans |= V4L2_TUNER_SUB_RDS;
1323 si4713_s_modulator(&sdev->sd, &vm);
1324
1325 kfree(tmp);
1326
1327 return rval;
1328}
1329
1330/*
1331 * si4713_initialize - Sets the device up with default configuration.
1332 * @sdev: si4713_device structure for the device we are communicating
1333 */
1334static int si4713_initialize(struct si4713_device *sdev)
1335{
1336 int rval;
1337
1338 rval = si4713_set_power_state(sdev, POWER_ON);
1339 if (rval < 0)
1340 goto exit;
1341
1342 rval = si4713_checkrev(sdev);
1343 if (rval < 0)
1344 goto exit;
1345
1346 rval = si4713_set_power_state(sdev, POWER_OFF);
1347 if (rval < 0)
1348 goto exit;
1349
1350 mutex_lock(&sdev->mutex);
1351
1352 sdev->rds_info.pi = DEFAULT_RDS_PI;
1353 sdev->rds_info.pty = DEFAULT_RDS_PTY;
1354 sdev->rds_info.deviation = DEFAULT_RDS_DEVIATION;
1355 strlcpy(sdev->rds_info.ps_name, DEFAULT_RDS_PS_NAME, MAX_RDS_PS_NAME);
1356 strlcpy(sdev->rds_info.radio_text, DEFAULT_RDS_RADIO_TEXT,
1357 MAX_RDS_RADIO_TEXT);
1358 sdev->rds_info.enabled = 1;
1359
1360 sdev->limiter_info.release_time = DEFAULT_LIMITER_RTIME;
1361 sdev->limiter_info.deviation = DEFAULT_LIMITER_DEV;
1362 sdev->limiter_info.enabled = 1;
1363
1364 sdev->pilot_info.deviation = DEFAULT_PILOT_DEVIATION;
1365 sdev->pilot_info.frequency = DEFAULT_PILOT_FREQUENCY;
1366 sdev->pilot_info.enabled = 1;
1367
1368 sdev->acomp_info.release_time = DEFAULT_ACOMP_RTIME;
1369 sdev->acomp_info.attack_time = DEFAULT_ACOMP_ATIME;
1370 sdev->acomp_info.threshold = DEFAULT_ACOMP_THRESHOLD;
1371 sdev->acomp_info.gain = DEFAULT_ACOMP_GAIN;
1372 sdev->acomp_info.enabled = 1;
1373
1374 sdev->frequency = DEFAULT_FREQUENCY;
1375 sdev->preemphasis = DEFAULT_PREEMPHASIS;
1376 sdev->mute = DEFAULT_MUTE;
1377 sdev->power_level = DEFAULT_POWER_LEVEL;
1378 sdev->antenna_capacitor = 0;
1379 sdev->stereo = 1;
1380 sdev->tune_rnl = DEFAULT_TUNE_RNL;
1381
1382 mutex_unlock(&sdev->mutex);
1383
1384exit:
1385 return rval;
1386}
1387
1388/* read string property */
1389static int si4713_read_econtrol_string(struct si4713_device *sdev,
1390 struct v4l2_ext_control *control)
1391{
1392 s32 rval = 0;
1393
1394 switch (control->id) {
1395 case V4L2_CID_RDS_TX_PS_NAME:
1396 if (strlen(sdev->rds_info.ps_name) + 1 > control->size) {
1397 control->size = MAX_RDS_PS_NAME + 1;
1398 rval = -ENOSPC;
1399 goto exit;
1400 }
1401 rval = copy_to_user(control->string, sdev->rds_info.ps_name,
1402 strlen(sdev->rds_info.ps_name) + 1);
Dan Carpenteraac870a2010-06-04 07:34:40 -03001403 if (rval)
1404 rval = -EFAULT;
Eduardo Valentin02bee892009-08-08 08:46:53 -03001405 break;
1406
1407 case V4L2_CID_RDS_TX_RADIO_TEXT:
1408 if (strlen(sdev->rds_info.radio_text) + 1 > control->size) {
1409 control->size = MAX_RDS_RADIO_TEXT + 1;
1410 rval = -ENOSPC;
1411 goto exit;
1412 }
1413 rval = copy_to_user(control->string, sdev->rds_info.radio_text,
1414 strlen(sdev->rds_info.radio_text) + 1);
Dan Carpenteraac870a2010-06-04 07:34:40 -03001415 if (rval)
1416 rval = -EFAULT;
Eduardo Valentin02bee892009-08-08 08:46:53 -03001417 break;
1418
1419 default:
1420 rval = -EINVAL;
1421 break;
1422 };
1423
1424exit:
1425 return rval;
1426}
1427
1428/*
1429 * si4713_update_tune_status - update properties from tx_tune_status
1430 * command. Must be called with sdev->mutex held.
1431 * @sdev: si4713_device structure for the device we are communicating
1432 */
1433static int si4713_update_tune_status(struct si4713_device *sdev)
1434{
1435 int rval;
1436 u16 f = 0;
1437 u8 p = 0, a = 0, n = 0;
1438
1439 rval = si4713_tx_tune_status(sdev, 0x00, &f, &p, &a, &n);
1440
1441 if (rval < 0)
1442 goto exit;
1443
1444 sdev->power_level = p;
1445 sdev->antenna_capacitor = a;
1446 sdev->tune_rnl = n;
1447
1448exit:
1449 return rval;
1450}
1451
1452/* properties which use tx_tune_status */
1453static int si4713_read_econtrol_tune(struct si4713_device *sdev,
1454 struct v4l2_ext_control *control)
1455{
1456 s32 rval = 0;
1457
1458 mutex_lock(&sdev->mutex);
1459
1460 if (sdev->power_state) {
1461 rval = si4713_update_tune_status(sdev);
1462 if (rval < 0)
1463 goto unlock;
1464 }
1465
1466 switch (control->id) {
1467 case V4L2_CID_TUNE_POWER_LEVEL:
1468 control->value = sdev->power_level;
1469 break;
1470 case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
1471 control->value = sdev->antenna_capacitor;
1472 break;
1473 default:
1474 rval = -EINVAL;
1475 };
1476
1477unlock:
1478 mutex_unlock(&sdev->mutex);
1479 return rval;
1480}
1481
1482static int si4713_read_econtrol_integers(struct si4713_device *sdev,
1483 struct v4l2_ext_control *control)
1484{
1485 s32 rval;
1486 u32 *shadow = NULL, val = 0;
1487 s32 bit = 0, mask = 0;
1488 u16 property = 0;
1489 int mul = 0;
1490 unsigned long *table = NULL;
1491 int size = 0;
1492
1493 rval = si4713_choose_econtrol_action(sdev, control->id, &shadow, &bit,
1494 &mask, &property, &mul, &table, &size);
1495 if (rval < 0)
1496 goto exit;
1497
1498 mutex_lock(&sdev->mutex);
1499
1500 if (sdev->power_state) {
1501 rval = si4713_read_property(sdev, property, &val);
1502 if (rval < 0)
1503 goto unlock;
1504
1505 /* Keep negative values for threshold */
1506 if (control->id == V4L2_CID_AUDIO_COMPRESSION_THRESHOLD)
1507 *shadow = (s16)val;
1508 else if (mask)
1509 *shadow = get_status_bit(val, bit, mask);
1510 else if (mul)
1511 *shadow = val * mul;
1512 else
1513 *shadow = dev_to_usecs(val, table, size);
1514 }
1515
1516 control->value = *shadow;
1517
1518unlock:
1519 mutex_unlock(&sdev->mutex);
1520exit:
1521 return rval;
1522}
1523
1524/*
1525 * Video4Linux Subdev Interface
1526 */
1527/* si4713_s_ext_ctrls - set extended controls value */
1528static int si4713_s_ext_ctrls(struct v4l2_subdev *sd,
1529 struct v4l2_ext_controls *ctrls)
1530{
1531 struct si4713_device *sdev = to_si4713_device(sd);
1532 int i;
1533
1534 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_FM_TX)
1535 return -EINVAL;
1536
1537 for (i = 0; i < ctrls->count; i++) {
1538 int err;
1539
1540 switch ((ctrls->controls + i)->id) {
1541 case V4L2_CID_RDS_TX_PS_NAME:
1542 case V4L2_CID_RDS_TX_RADIO_TEXT:
1543 err = si4713_write_econtrol_string(sdev,
1544 ctrls->controls + i);
1545 break;
1546 case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
1547 case V4L2_CID_TUNE_POWER_LEVEL:
1548 err = si4713_write_econtrol_tune(sdev,
1549 ctrls->controls + i);
1550 break;
1551 default:
1552 err = si4713_write_econtrol_integers(sdev,
1553 ctrls->controls + i);
1554 }
1555
1556 if (err < 0) {
1557 ctrls->error_idx = i;
1558 return err;
1559 }
1560 }
1561
1562 return 0;
1563}
1564
1565/* si4713_g_ext_ctrls - get extended controls value */
1566static int si4713_g_ext_ctrls(struct v4l2_subdev *sd,
1567 struct v4l2_ext_controls *ctrls)
1568{
1569 struct si4713_device *sdev = to_si4713_device(sd);
1570 int i;
1571
1572 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_FM_TX)
1573 return -EINVAL;
1574
1575 for (i = 0; i < ctrls->count; i++) {
1576 int err;
1577
1578 switch ((ctrls->controls + i)->id) {
1579 case V4L2_CID_RDS_TX_PS_NAME:
1580 case V4L2_CID_RDS_TX_RADIO_TEXT:
1581 err = si4713_read_econtrol_string(sdev,
1582 ctrls->controls + i);
1583 break;
1584 case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
1585 case V4L2_CID_TUNE_POWER_LEVEL:
1586 err = si4713_read_econtrol_tune(sdev,
1587 ctrls->controls + i);
1588 break;
1589 default:
1590 err = si4713_read_econtrol_integers(sdev,
1591 ctrls->controls + i);
1592 }
1593
1594 if (err < 0) {
1595 ctrls->error_idx = i;
1596 return err;
1597 }
1598 }
1599
1600 return 0;
1601}
1602
1603/* si4713_queryctrl - enumerate control items */
1604static int si4713_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
1605{
1606 int rval = 0;
1607
1608 switch (qc->id) {
1609 /* User class controls */
1610 case V4L2_CID_AUDIO_MUTE:
1611 rval = v4l2_ctrl_query_fill(qc, 0, 1, 1, DEFAULT_MUTE);
1612 break;
1613 /* FM_TX class controls */
1614 case V4L2_CID_RDS_TX_PI:
1615 rval = v4l2_ctrl_query_fill(qc, 0, 0xFFFF, 1, DEFAULT_RDS_PI);
1616 break;
1617 case V4L2_CID_RDS_TX_PTY:
1618 rval = v4l2_ctrl_query_fill(qc, 0, 31, 1, DEFAULT_RDS_PTY);
1619 break;
1620 case V4L2_CID_RDS_TX_DEVIATION:
1621 rval = v4l2_ctrl_query_fill(qc, 0, MAX_RDS_DEVIATION,
1622 10, DEFAULT_RDS_DEVIATION);
1623 break;
1624 case V4L2_CID_RDS_TX_PS_NAME:
1625 /*
1626 * Report step as 8. From RDS spec, psname
1627 * should be 8. But there are receivers which scroll strings
1628 * sized as 8xN.
1629 */
1630 rval = v4l2_ctrl_query_fill(qc, 0, MAX_RDS_PS_NAME, 8, 0);
1631 break;
1632 case V4L2_CID_RDS_TX_RADIO_TEXT:
1633 /*
1634 * Report step as 32 (2A block). From RDS spec,
1635 * radio text should be 32 for 2A block. But there are receivers
1636 * which scroll strings sized as 32xN. Setting default to 32.
1637 */
1638 rval = v4l2_ctrl_query_fill(qc, 0, MAX_RDS_RADIO_TEXT, 32, 0);
1639 break;
1640
1641 case V4L2_CID_AUDIO_LIMITER_ENABLED:
1642 rval = v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);
1643 break;
1644 case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME:
1645 rval = v4l2_ctrl_query_fill(qc, 250, MAX_LIMITER_RELEASE_TIME,
1646 50, DEFAULT_LIMITER_RTIME);
1647 break;
1648 case V4L2_CID_AUDIO_LIMITER_DEVIATION:
1649 rval = v4l2_ctrl_query_fill(qc, 0, MAX_LIMITER_DEVIATION,
1650 10, DEFAULT_LIMITER_DEV);
1651 break;
1652
1653 case V4L2_CID_AUDIO_COMPRESSION_ENABLED:
1654 rval = v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);
1655 break;
1656 case V4L2_CID_AUDIO_COMPRESSION_GAIN:
1657 rval = v4l2_ctrl_query_fill(qc, 0, MAX_ACOMP_GAIN, 1,
1658 DEFAULT_ACOMP_GAIN);
1659 break;
1660 case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD:
1661 rval = v4l2_ctrl_query_fill(qc, MIN_ACOMP_THRESHOLD,
1662 MAX_ACOMP_THRESHOLD, 1,
1663 DEFAULT_ACOMP_THRESHOLD);
1664 break;
1665 case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME:
1666 rval = v4l2_ctrl_query_fill(qc, 0, MAX_ACOMP_ATTACK_TIME,
1667 500, DEFAULT_ACOMP_ATIME);
1668 break;
1669 case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME:
1670 rval = v4l2_ctrl_query_fill(qc, 100000, MAX_ACOMP_RELEASE_TIME,
1671 100000, DEFAULT_ACOMP_RTIME);
1672 break;
1673
1674 case V4L2_CID_PILOT_TONE_ENABLED:
1675 rval = v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);
1676 break;
1677 case V4L2_CID_PILOT_TONE_DEVIATION:
1678 rval = v4l2_ctrl_query_fill(qc, 0, MAX_PILOT_DEVIATION,
1679 10, DEFAULT_PILOT_DEVIATION);
1680 break;
1681 case V4L2_CID_PILOT_TONE_FREQUENCY:
1682 rval = v4l2_ctrl_query_fill(qc, 0, MAX_PILOT_FREQUENCY,
1683 1, DEFAULT_PILOT_FREQUENCY);
1684 break;
1685
1686 case V4L2_CID_TUNE_PREEMPHASIS:
1687 rval = v4l2_ctrl_query_fill(qc, V4L2_PREEMPHASIS_DISABLED,
1688 V4L2_PREEMPHASIS_75_uS, 1,
1689 V4L2_PREEMPHASIS_50_uS);
1690 break;
1691 case V4L2_CID_TUNE_POWER_LEVEL:
1692 rval = v4l2_ctrl_query_fill(qc, 0, 120, 1, DEFAULT_POWER_LEVEL);
1693 break;
1694 case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
1695 rval = v4l2_ctrl_query_fill(qc, 0, 191, 1, 0);
1696 break;
1697 default:
1698 rval = -EINVAL;
1699 break;
1700 };
1701
1702 return rval;
1703}
1704
1705/* si4713_g_ctrl - get the value of a control */
1706static int si4713_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
1707{
1708 struct si4713_device *sdev = to_si4713_device(sd);
1709 int rval = 0;
1710
1711 if (!sdev)
1712 return -ENODEV;
1713
1714 mutex_lock(&sdev->mutex);
1715
1716 if (sdev->power_state) {
1717 rval = si4713_read_property(sdev, SI4713_TX_LINE_INPUT_MUTE,
1718 &sdev->mute);
1719
1720 if (rval < 0)
1721 goto unlock;
1722 }
1723
1724 switch (ctrl->id) {
1725 case V4L2_CID_AUDIO_MUTE:
1726 ctrl->value = get_mute(sdev->mute);
1727 break;
1728 }
1729
1730unlock:
1731 mutex_unlock(&sdev->mutex);
1732 return rval;
1733}
1734
1735/* si4713_s_ctrl - set the value of a control */
1736static int si4713_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
1737{
1738 struct si4713_device *sdev = to_si4713_device(sd);
1739 int rval = 0;
1740
1741 if (!sdev)
1742 return -ENODEV;
1743
1744 switch (ctrl->id) {
1745 case V4L2_CID_AUDIO_MUTE:
1746 if (ctrl->value) {
1747 rval = si4713_set_mute(sdev, ctrl->value);
1748 if (rval < 0)
1749 goto exit;
1750
1751 rval = si4713_set_power_state(sdev, POWER_DOWN);
1752 } else {
1753 rval = si4713_set_power_state(sdev, POWER_UP);
1754 if (rval < 0)
1755 goto exit;
1756
1757 rval = si4713_setup(sdev);
1758 if (rval < 0)
1759 goto exit;
1760
1761 rval = si4713_set_mute(sdev, ctrl->value);
1762 }
1763 break;
1764 }
1765
1766exit:
1767 return rval;
1768}
1769
1770/* si4713_ioctl - deal with private ioctls (only rnl for now) */
1771long si4713_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
1772{
1773 struct si4713_device *sdev = to_si4713_device(sd);
1774 struct si4713_rnl *rnl = arg;
1775 u16 frequency;
1776 int rval = 0;
1777
1778 if (!arg)
1779 return -EINVAL;
1780
1781 mutex_lock(&sdev->mutex);
1782 switch (cmd) {
1783 case SI4713_IOC_MEASURE_RNL:
1784 frequency = v4l2_to_si4713(rnl->frequency);
1785
1786 if (sdev->power_state) {
1787 /* Set desired measurement frequency */
1788 rval = si4713_tx_tune_measure(sdev, frequency, 0);
1789 if (rval < 0)
1790 goto unlock;
1791 /* get results from tune status */
1792 rval = si4713_update_tune_status(sdev);
1793 if (rval < 0)
1794 goto unlock;
1795 }
1796 rnl->rnl = sdev->tune_rnl;
1797 break;
1798
1799 default:
1800 /* nothing */
1801 rval = -ENOIOCTLCMD;
1802 }
1803
1804unlock:
1805 mutex_unlock(&sdev->mutex);
1806 return rval;
1807}
1808
1809static const struct v4l2_subdev_core_ops si4713_subdev_core_ops = {
1810 .queryctrl = si4713_queryctrl,
1811 .g_ext_ctrls = si4713_g_ext_ctrls,
1812 .s_ext_ctrls = si4713_s_ext_ctrls,
1813 .g_ctrl = si4713_g_ctrl,
1814 .s_ctrl = si4713_s_ctrl,
1815 .ioctl = si4713_ioctl,
1816};
1817
1818/* si4713_g_modulator - get modulator attributes */
1819static int si4713_g_modulator(struct v4l2_subdev *sd, struct v4l2_modulator *vm)
1820{
1821 struct si4713_device *sdev = to_si4713_device(sd);
1822 int rval = 0;
1823
1824 if (!sdev) {
1825 rval = -ENODEV;
1826 goto exit;
1827 }
1828
1829 if (vm->index > 0) {
1830 rval = -EINVAL;
1831 goto exit;
1832 }
1833
1834 strncpy(vm->name, "FM Modulator", 32);
1835 vm->capability = V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LOW |
Matti Aaltonencb0ed222010-10-18 06:54:14 -03001836 V4L2_TUNER_CAP_RDS | V4L2_TUNER_CAP_RDS_CONTROLS;
Eduardo Valentin02bee892009-08-08 08:46:53 -03001837
1838 /* Report current frequency range limits */
1839 vm->rangelow = si4713_to_v4l2(FREQ_RANGE_LOW);
1840 vm->rangehigh = si4713_to_v4l2(FREQ_RANGE_HIGH);
1841
1842 mutex_lock(&sdev->mutex);
1843
1844 if (sdev->power_state) {
1845 u32 comp_en = 0;
1846
1847 rval = si4713_read_property(sdev, SI4713_TX_COMPONENT_ENABLE,
1848 &comp_en);
1849 if (rval < 0)
1850 goto unlock;
1851
1852 sdev->stereo = get_status_bit(comp_en, 1, 1 << 1);
1853 sdev->rds_info.enabled = get_status_bit(comp_en, 2, 1 << 2);
1854 }
1855
1856 /* Report current audio mode: mono or stereo */
1857 if (sdev->stereo)
1858 vm->txsubchans = V4L2_TUNER_SUB_STEREO;
1859 else
1860 vm->txsubchans = V4L2_TUNER_SUB_MONO;
1861
1862 /* Report rds feature status */
1863 if (sdev->rds_info.enabled)
1864 vm->txsubchans |= V4L2_TUNER_SUB_RDS;
1865 else
1866 vm->txsubchans &= ~V4L2_TUNER_SUB_RDS;
1867
1868unlock:
1869 mutex_unlock(&sdev->mutex);
1870exit:
1871 return rval;
1872}
1873
1874/* si4713_s_modulator - set modulator attributes */
1875static int si4713_s_modulator(struct v4l2_subdev *sd, struct v4l2_modulator *vm)
1876{
1877 struct si4713_device *sdev = to_si4713_device(sd);
1878 int rval = 0;
1879 u16 stereo, rds;
1880 u32 p;
1881
Hans Verkuila65f3152009-08-31 17:21:04 -03001882 if (!sdev)
1883 return -ENODEV;
Eduardo Valentin02bee892009-08-08 08:46:53 -03001884
Hans Verkuila65f3152009-08-31 17:21:04 -03001885 if (vm->index > 0)
1886 return -EINVAL;
Eduardo Valentin02bee892009-08-08 08:46:53 -03001887
1888 /* Set audio mode: mono or stereo */
1889 if (vm->txsubchans & V4L2_TUNER_SUB_STEREO)
1890 stereo = 1;
1891 else if (vm->txsubchans & V4L2_TUNER_SUB_MONO)
1892 stereo = 0;
1893 else
Hans Verkuila65f3152009-08-31 17:21:04 -03001894 return -EINVAL;
Eduardo Valentin02bee892009-08-08 08:46:53 -03001895
1896 rds = !!(vm->txsubchans & V4L2_TUNER_SUB_RDS);
1897
1898 mutex_lock(&sdev->mutex);
1899
1900 if (sdev->power_state) {
1901 rval = si4713_read_property(sdev,
1902 SI4713_TX_COMPONENT_ENABLE, &p);
1903 if (rval < 0)
1904 goto unlock;
1905
1906 p = set_bits(p, stereo, 1, 1 << 1);
1907 p = set_bits(p, rds, 2, 1 << 2);
1908
1909 rval = si4713_write_property(sdev,
1910 SI4713_TX_COMPONENT_ENABLE, p);
1911 if (rval < 0)
1912 goto unlock;
1913 }
1914
1915 sdev->stereo = stereo;
1916 sdev->rds_info.enabled = rds;
1917
1918unlock:
1919 mutex_unlock(&sdev->mutex);
Eduardo Valentin02bee892009-08-08 08:46:53 -03001920 return rval;
1921}
1922
1923/* si4713_g_frequency - get tuner or modulator radio frequency */
1924static int si4713_g_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f)
1925{
1926 struct si4713_device *sdev = to_si4713_device(sd);
1927 int rval = 0;
1928
1929 f->type = V4L2_TUNER_RADIO;
1930
1931 mutex_lock(&sdev->mutex);
1932
1933 if (sdev->power_state) {
1934 u16 freq;
1935 u8 p, a, n;
1936
1937 rval = si4713_tx_tune_status(sdev, 0x00, &freq, &p, &a, &n);
1938 if (rval < 0)
1939 goto unlock;
1940
1941 sdev->frequency = freq;
1942 }
1943
1944 f->frequency = si4713_to_v4l2(sdev->frequency);
1945
1946unlock:
1947 mutex_unlock(&sdev->mutex);
1948 return rval;
1949}
1950
1951/* si4713_s_frequency - set tuner or modulator radio frequency */
1952static int si4713_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f)
1953{
1954 struct si4713_device *sdev = to_si4713_device(sd);
1955 int rval = 0;
1956 u16 frequency = v4l2_to_si4713(f->frequency);
1957
1958 /* Check frequency range */
1959 if (frequency < FREQ_RANGE_LOW || frequency > FREQ_RANGE_HIGH)
1960 return -EDOM;
1961
1962 mutex_lock(&sdev->mutex);
1963
1964 if (sdev->power_state) {
1965 rval = si4713_tx_tune_freq(sdev, frequency);
1966 if (rval < 0)
1967 goto unlock;
1968 frequency = rval;
1969 rval = 0;
1970 }
1971 sdev->frequency = frequency;
1972 f->frequency = si4713_to_v4l2(frequency);
1973
1974unlock:
1975 mutex_unlock(&sdev->mutex);
1976 return rval;
1977}
1978
1979static const struct v4l2_subdev_tuner_ops si4713_subdev_tuner_ops = {
1980 .g_frequency = si4713_g_frequency,
1981 .s_frequency = si4713_s_frequency,
1982 .g_modulator = si4713_g_modulator,
1983 .s_modulator = si4713_s_modulator,
1984};
1985
1986static const struct v4l2_subdev_ops si4713_subdev_ops = {
1987 .core = &si4713_subdev_core_ops,
1988 .tuner = &si4713_subdev_tuner_ops,
1989};
1990
1991/*
1992 * I2C driver interface
1993 */
1994/* si4713_probe - probe for the device */
1995static int si4713_probe(struct i2c_client *client,
1996 const struct i2c_device_id *id)
1997{
1998 struct si4713_device *sdev;
Jarkko Nikula00df0552010-10-29 11:31:39 -03001999 struct si4713_platform_data *pdata = client->dev.platform_data;
2000 int rval, i;
Eduardo Valentin02bee892009-08-08 08:46:53 -03002001
2002 sdev = kzalloc(sizeof *sdev, GFP_KERNEL);
2003 if (!sdev) {
2004 dev_err(&client->dev, "Failed to alloc video device.\n");
2005 rval = -ENOMEM;
2006 goto exit;
2007 }
2008
Jarkko Nikula00df0552010-10-29 11:31:39 -03002009 sdev->gpio_reset = -1;
2010 if (pdata && gpio_is_valid(pdata->gpio_reset)) {
2011 rval = gpio_request(pdata->gpio_reset, "si4713 reset");
2012 if (rval) {
2013 dev_err(&client->dev,
2014 "Failed to request gpio: %d\n", rval);
2015 goto free_sdev;
2016 }
2017 sdev->gpio_reset = pdata->gpio_reset;
2018 gpio_direction_output(sdev->gpio_reset, 0);
2019 }
2020
2021 for (i = 0; i < ARRAY_SIZE(sdev->supplies); i++)
2022 sdev->supplies[i].supply = si4713_supply_names[i];
2023
2024 rval = regulator_bulk_get(&client->dev, ARRAY_SIZE(sdev->supplies),
2025 sdev->supplies);
2026 if (rval) {
2027 dev_err(&client->dev, "Cannot get regulators: %d\n", rval);
2028 goto free_gpio;
Eduardo Valentin02bee892009-08-08 08:46:53 -03002029 }
2030
2031 v4l2_i2c_subdev_init(&sdev->sd, client, &si4713_subdev_ops);
2032
2033 mutex_init(&sdev->mutex);
2034 init_completion(&sdev->work);
2035
2036 if (client->irq) {
2037 rval = request_irq(client->irq,
2038 si4713_handler, IRQF_TRIGGER_FALLING | IRQF_DISABLED,
2039 client->name, sdev);
2040 if (rval < 0) {
2041 v4l2_err(&sdev->sd, "Could not request IRQ\n");
Jarkko Nikula00df0552010-10-29 11:31:39 -03002042 goto put_reg;
Eduardo Valentin02bee892009-08-08 08:46:53 -03002043 }
2044 v4l2_dbg(1, debug, &sdev->sd, "IRQ requested.\n");
2045 } else {
2046 v4l2_warn(&sdev->sd, "IRQ not configured. Using timeouts.\n");
2047 }
2048
2049 rval = si4713_initialize(sdev);
2050 if (rval < 0) {
2051 v4l2_err(&sdev->sd, "Failed to probe device information.\n");
2052 goto free_irq;
2053 }
2054
2055 return 0;
2056
2057free_irq:
2058 if (client->irq)
2059 free_irq(client->irq, sdev);
Jarkko Nikula00df0552010-10-29 11:31:39 -03002060put_reg:
2061 regulator_bulk_free(ARRAY_SIZE(sdev->supplies), sdev->supplies);
2062free_gpio:
2063 if (gpio_is_valid(sdev->gpio_reset))
2064 gpio_free(sdev->gpio_reset);
Eduardo Valentin02bee892009-08-08 08:46:53 -03002065free_sdev:
2066 kfree(sdev);
2067exit:
2068 return rval;
2069}
2070
2071/* si4713_remove - remove the device */
2072static int si4713_remove(struct i2c_client *client)
2073{
2074 struct v4l2_subdev *sd = i2c_get_clientdata(client);
2075 struct si4713_device *sdev = to_si4713_device(sd);
2076
2077 if (sdev->power_state)
2078 si4713_set_power_state(sdev, POWER_DOWN);
2079
2080 if (client->irq > 0)
2081 free_irq(client->irq, sdev);
2082
2083 v4l2_device_unregister_subdev(sd);
Jarkko Nikula00df0552010-10-29 11:31:39 -03002084 regulator_bulk_free(ARRAY_SIZE(sdev->supplies), sdev->supplies);
2085 if (gpio_is_valid(sdev->gpio_reset))
2086 gpio_free(sdev->gpio_reset);
Eduardo Valentin02bee892009-08-08 08:46:53 -03002087 kfree(sdev);
2088
2089 return 0;
2090}
2091
2092/* si4713_i2c_driver - i2c driver interface */
2093static const struct i2c_device_id si4713_id[] = {
2094 { "si4713" , 0 },
2095 { },
2096};
2097MODULE_DEVICE_TABLE(i2c, si4713_id);
2098
2099static struct i2c_driver si4713_i2c_driver = {
2100 .driver = {
2101 .name = "si4713",
2102 },
2103 .probe = si4713_probe,
2104 .remove = si4713_remove,
2105 .id_table = si4713_id,
2106};
2107
2108/* Module Interface */
2109static int __init si4713_module_init(void)
2110{
2111 return i2c_add_driver(&si4713_i2c_driver);
2112}
2113
2114static void __exit si4713_module_exit(void)
2115{
2116 i2c_del_driver(&si4713_i2c_driver);
2117}
2118
2119module_init(si4713_module_init);
2120module_exit(si4713_module_exit);
2121