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