Lines Matching +full:string +full:- +full:array +full:- +full:property
2 * drivers/media/radio/si4713-i2c.c
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33 #include <media/v4l2-device.h>
34 #include <media/v4l2-ioctl.h>
35 #include <media/v4l2-common.h>
37 #include "si4713-i2c.h"
42 MODULE_PARM_DESC(debug, "Debug level (0 - 2)");
67 #define DEFAULT_ACOMP_THRESHOLD (-0x28)
178 static int usecs_to_dev(unsigned long usecs, unsigned long const array[], in usecs_to_dev() argument
182 int rval = -EINVAL; in usecs_to_dev()
185 if (array[(i * 2) + 1] >= usecs) { in usecs_to_dev()
186 rval = array[i * 2]; in usecs_to_dev()
193 static unsigned long dev_to_usecs(int value, unsigned long const array[], in dev_to_usecs() argument
197 int rval = -EINVAL; in dev_to_usecs()
200 if (array[i * 2] == value) { in dev_to_usecs()
201 rval = array[(i * 2) + 1]; in dev_to_usecs()
213 v4l2_dbg(2, debug, &sdev->sd, in si4713_handler()
215 complete(&sdev->work); in si4713_handler()
221 * si4713_send_command - sends a command to si4713 and waits its response
234 struct i2c_client *client = v4l2_get_subdevdata(&sdev->sd); in si4713_send_command()
238 if (!client->adapter) in si4713_send_command()
239 return -ENODEV; in si4713_send_command()
244 DBG_BUFFER(&sdev->sd, "Parameters", data1, argn + 1); in si4713_send_command()
248 v4l2_err(&sdev->sd, "Error while sending command 0x%02x\n", in si4713_send_command()
250 return (err > 0) ? -EIO : err; in si4713_send_command()
254 if (!wait_for_completion_timeout(&sdev->work, in si4713_send_command()
256 v4l2_warn(&sdev->sd, in si4713_send_command()
263 v4l2_err(&sdev->sd, in si4713_send_command()
266 return (err > 0) ? -EIO : err; in si4713_send_command()
269 DBG_BUFFER(&sdev->sd, "Response", response, respn); in si4713_send_command()
271 return -EBUSY; in si4713_send_command()
277 * si4713_read_property - reads a si4713 property
279 * @prop: property identification number
280 * @pv: property value to be returned on success
288 * .Second byte = property's MSB in si4713_read_property()
289 * .Third byte = property's LSB in si4713_read_property()
306 v4l2_dbg(1, debug, &sdev->sd, in si4713_read_property()
307 "%s: property=0x%02x value=0x%02x status=0x%02x\n", in si4713_read_property()
314 * si4713_write_property - modifies a si4713 property
316 * @prop: property identification number
317 * @val: new value for that property
325 * .Second byte = property's MSB in si4713_write_property()
326 * .Third byte = property's LSB in si4713_write_property()
346 v4l2_dbg(1, debug, &sdev->sd, in si4713_write_property()
347 "%s: property=0x%02x value=0x%02x status=0x%02x\n", in si4713_write_property()
353 * to have property properly set. in si4713_write_property()
361 * si4713_powerup - Powers the device up
377 if (sdev->power_state) in si4713_powerup()
380 err = regulator_bulk_enable(ARRAY_SIZE(sdev->supplies), in si4713_powerup()
381 sdev->supplies); in si4713_powerup()
383 v4l2_err(&sdev->sd, "Failed to enable supplies: %d\n", err); in si4713_powerup()
386 if (gpio_is_valid(sdev->gpio_reset)) { in si4713_powerup()
388 gpio_set_value(sdev->gpio_reset, 1); in si4713_powerup()
397 v4l2_dbg(1, debug, &sdev->sd, "Powerup response: 0x%02x\n", in si4713_powerup()
399 v4l2_dbg(1, debug, &sdev->sd, "Device in power up mode\n"); in si4713_powerup()
400 sdev->power_state = POWER_ON; in si4713_powerup()
405 if (gpio_is_valid(sdev->gpio_reset)) in si4713_powerup()
406 gpio_set_value(sdev->gpio_reset, 0); in si4713_powerup()
407 err = regulator_bulk_disable(ARRAY_SIZE(sdev->supplies), in si4713_powerup()
408 sdev->supplies); in si4713_powerup()
410 v4l2_err(&sdev->sd, in si4713_powerup()
418 * si4713_powerdown - Powers the device down
426 if (!sdev->power_state) in si4713_powerdown()
435 v4l2_dbg(1, debug, &sdev->sd, "Power down response: 0x%02x\n", in si4713_powerdown()
437 v4l2_dbg(1, debug, &sdev->sd, "Device in reset mode\n"); in si4713_powerdown()
438 if (gpio_is_valid(sdev->gpio_reset)) in si4713_powerdown()
439 gpio_set_value(sdev->gpio_reset, 0); in si4713_powerdown()
440 err = regulator_bulk_disable(ARRAY_SIZE(sdev->supplies), in si4713_powerdown()
441 sdev->supplies); in si4713_powerdown()
443 v4l2_err(&sdev->sd, in si4713_powerdown()
445 sdev->power_state = POWER_OFF; in si4713_powerdown()
452 * si4713_checkrev - Checks if we are treating a device with the correct rev.
457 struct i2c_client *client = v4l2_get_subdevdata(&sdev->sd); in si4713_checkrev()
461 mutex_lock(&sdev->mutex); in si4713_checkrev()
472 v4l2_info(&sdev->sd, "chip found @ 0x%02x (%s)\n", in si4713_checkrev()
473 client->addr << 1, client->adapter->name); in si4713_checkrev()
475 v4l2_err(&sdev->sd, "Invalid product number\n"); in si4713_checkrev()
476 rval = -EINVAL; in si4713_checkrev()
480 mutex_unlock(&sdev->mutex); in si4713_checkrev()
485 * si4713_wait_stc - Waits STC interrupt and clears status bits. Useful
496 if (!wait_for_completion_timeout(&sdev->work, in si4713_wait_stc()
498 v4l2_warn(&sdev->sd, in si4713_wait_stc()
511 v4l2_dbg(1, debug, &sdev->sd, in si4713_wait_stc()
515 err = -EIO; in si4713_wait_stc()
522 * si4713_tx_tune_freq - Sets the state of the RF carrier and sets the tuning
526 * @frequency: desired frequency (76 - 108 MHz, unit 10 KHz, step 50 kHz)
550 v4l2_dbg(1, debug, &sdev->sd, in si4713_tx_tune_freq()
562 * si4713_tx_tune_power - Sets the RF voltage level between 88 and 115 dBuV in
565 * indicates autotuning, and a value of 1 - 191 indicates
569 * @power: tuning power (88 - 115 dBuV, unit/step 1 dB)
570 * @antcap: value of antenna tuning capacitor (0 - 191)
592 return -EDOM; in si4713_tx_tune_power()
601 v4l2_dbg(1, debug, &sdev->sd, in si4713_tx_tune_power()
609 * si4713_tx_tune_measure - Enters receive mode and measures the received noise
617 * @frequency: desired frequency (76 - 108 MHz, unit 10 KHz, step 50 kHz)
618 * @antcap: value of antenna tuning capacitor (0 - 191)
638 sdev->tune_rnl = DEFAULT_TUNE_RNL; in si4713_tx_tune_measure()
641 return -EDOM; in si4713_tx_tune_measure()
650 v4l2_dbg(1, debug, &sdev->sd, in si4713_tx_tune_measure()
658 * si4713_tx_tune_status- Returns the status of the tx_tune_freq, tx_tune_mea or
689 v4l2_dbg(1, debug, &sdev->sd, in si4713_tx_tune_status()
692 sdev->frequency = *frequency; in si4713_tx_tune_status()
696 v4l2_dbg(1, debug, &sdev->sd, "%s: response: %d x 10 kHz " in si4713_tx_tune_status()
705 * si4713_tx_rds_buff - Loads the RDS group buffer FIFO or circular buffer.
735 v4l2_dbg(1, debug, &sdev->sd, in si4713_tx_rds_buff()
737 *cbleft = (s8)val[2] - val[3]; in si4713_tx_rds_buff()
738 v4l2_dbg(1, debug, &sdev->sd, "%s: response: interrupts" in si4713_tx_rds_buff()
748 * si4713_tx_rds_ps - Loads the program service buffer.
751 * @pschar: assumed 4 size char array to be loaded into the program service
774 v4l2_dbg(1, debug, &sdev->sd, "%s: status=0x%02x\n", __func__, val[0]); in si4713_tx_rds_ps()
783 mutex_lock(&sdev->mutex); in si4713_set_power_state()
790 mutex_unlock(&sdev->mutex); in si4713_set_power_state()
800 mutex_lock(&sdev->mutex); in si4713_set_mute()
802 if (sdev->power_state) in si4713_set_mute()
807 sdev->mute = get_mute(mute); in si4713_set_mute()
809 mutex_unlock(&sdev->mutex); in si4713_set_mute()
823 mutex_lock(&sdev->mutex); in si4713_set_rds_ps_name()
825 if (sdev->power_state) { in si4713_set_rds_ps_name()
836 len = strlen(ps_name) - 1; in si4713_set_rds_ps_name()
853 strncpy(sdev->rds_info.ps_name, ps_name, MAX_RDS_PS_NAME); in si4713_set_rds_ps_name()
856 mutex_unlock(&sdev->mutex); in si4713_set_rds_ps_name()
867 mutex_lock(&sdev->mutex); in si4713_set_rds_radio_text()
869 if (!sdev->power_state) in si4713_set_rds_radio_text()
910 strncpy(sdev->rds_info.radio_text, rt, MAX_RDS_RADIO_TEXT); in si4713_set_rds_radio_text()
913 mutex_unlock(&sdev->mutex); in si4713_set_rds_radio_text()
918 u32 **shadow, s32 *bit, s32 *mask, u16 *property, int *mul, in si4713_choose_econtrol_action() argument
926 *property = SI4713_TX_RDS_PI; in si4713_choose_econtrol_action()
928 *shadow = &sdev->rds_info.pi; in si4713_choose_econtrol_action()
931 *property = SI4713_TX_ACOMP_THRESHOLD; in si4713_choose_econtrol_action()
933 *shadow = &sdev->acomp_info.threshold; in si4713_choose_econtrol_action()
936 *property = SI4713_TX_ACOMP_GAIN; in si4713_choose_econtrol_action()
938 *shadow = &sdev->acomp_info.gain; in si4713_choose_econtrol_action()
941 *property = SI4713_TX_PILOT_FREQUENCY; in si4713_choose_econtrol_action()
943 *shadow = &sdev->pilot_info.frequency; in si4713_choose_econtrol_action()
946 *property = SI4713_TX_ACOMP_ATTACK_TIME; in si4713_choose_econtrol_action()
948 *shadow = &sdev->acomp_info.attack_time; in si4713_choose_econtrol_action()
951 *property = SI4713_TX_PILOT_DEVIATION; in si4713_choose_econtrol_action()
953 *shadow = &sdev->pilot_info.deviation; in si4713_choose_econtrol_action()
956 *property = SI4713_TX_AUDIO_DEVIATION; in si4713_choose_econtrol_action()
958 *shadow = &sdev->limiter_info.deviation; in si4713_choose_econtrol_action()
961 *property = SI4713_TX_RDS_DEVIATION; in si4713_choose_econtrol_action()
963 *shadow = &sdev->rds_info.deviation; in si4713_choose_econtrol_action()
967 *property = SI4713_TX_RDS_PS_MISC; in si4713_choose_econtrol_action()
970 *shadow = &sdev->rds_info.pty; in si4713_choose_econtrol_action()
973 *property = SI4713_TX_ACOMP_ENABLE; in si4713_choose_econtrol_action()
976 *shadow = &sdev->limiter_info.enabled; in si4713_choose_econtrol_action()
979 *property = SI4713_TX_ACOMP_ENABLE; in si4713_choose_econtrol_action()
982 *shadow = &sdev->acomp_info.enabled; in si4713_choose_econtrol_action()
985 *property = SI4713_TX_COMPONENT_ENABLE; in si4713_choose_econtrol_action()
988 *shadow = &sdev->pilot_info.enabled; in si4713_choose_econtrol_action()
992 *property = SI4713_TX_LIMITER_RELEASE_TIME; in si4713_choose_econtrol_action()
995 *shadow = &sdev->limiter_info.release_time; in si4713_choose_econtrol_action()
998 *property = SI4713_TX_ACOMP_RELEASE_TIME; in si4713_choose_econtrol_action()
1001 *shadow = &sdev->acomp_info.release_time; in si4713_choose_econtrol_action()
1004 *property = SI4713_TX_PREEMPHASIS; in si4713_choose_econtrol_action()
1007 *shadow = &sdev->preemphasis; in si4713_choose_econtrol_action()
1011 rval = -EINVAL; in si4713_choose_econtrol_action()
1019 /* write string property */
1027 vqc.id = control->id; in si4713_write_econtrol_string()
1028 rval = si4713_queryctrl(&sdev->sd, &vqc); in si4713_write_econtrol_string()
1032 switch (control->id) { in si4713_write_econtrol_string()
1036 len = control->size - 1; in si4713_write_econtrol_string()
1038 rval = -ERANGE; in si4713_write_econtrol_string()
1041 rval = copy_from_user(ps_name, control->string, len); in si4713_write_econtrol_string()
1043 rval = -EFAULT; in si4713_write_econtrol_string()
1049 rval = -ERANGE; in si4713_write_econtrol_string()
1060 len = control->size - 1; in si4713_write_econtrol_string()
1062 rval = -ERANGE; in si4713_write_econtrol_string()
1065 rval = copy_from_user(radio_text, control->string, len); in si4713_write_econtrol_string()
1067 rval = -EFAULT; in si4713_write_econtrol_string()
1073 rval = -ERANGE; in si4713_write_econtrol_string()
1082 rval = -EINVAL; in si4713_write_econtrol_string()
1096 vqc.id = control->id; in validate_range()
1101 if (control->value < vqc.minimum || control->value > vqc.maximum) in validate_range()
1102 rval = -ERANGE; in validate_range()
1115 rval = validate_range(&sdev->sd, control); in si4713_write_econtrol_tune()
1119 mutex_lock(&sdev->mutex); in si4713_write_econtrol_tune()
1121 switch (control->id) { in si4713_write_econtrol_tune()
1123 power = control->value; in si4713_write_econtrol_tune()
1124 antcap = sdev->antenna_capacitor; in si4713_write_econtrol_tune()
1127 power = sdev->power_level; in si4713_write_econtrol_tune()
1128 antcap = control->value; in si4713_write_econtrol_tune()
1131 rval = -EINVAL; in si4713_write_econtrol_tune()
1135 if (sdev->power_state) in si4713_write_econtrol_tune()
1139 sdev->power_level = power; in si4713_write_econtrol_tune()
1140 sdev->antenna_capacitor = antcap; in si4713_write_econtrol_tune()
1144 mutex_unlock(&sdev->mutex); in si4713_write_econtrol_tune()
1155 u16 property = 0; in si4713_write_econtrol_integers() local
1160 rval = validate_range(&sdev->sd, control); in si4713_write_econtrol_integers()
1164 rval = si4713_choose_econtrol_action(sdev, control->id, &shadow, &bit, in si4713_write_econtrol_integers()
1165 &mask, &property, &mul, &table, &size); in si4713_write_econtrol_integers()
1169 val = control->value; in si4713_write_econtrol_integers()
1171 val = control->value / mul; in si4713_write_econtrol_integers()
1173 rval = usecs_to_dev(control->value, table, size); in si4713_write_econtrol_integers()
1180 mutex_lock(&sdev->mutex); in si4713_write_econtrol_integers()
1182 if (sdev->power_state) { in si4713_write_econtrol_integers()
1184 rval = si4713_read_property(sdev, property, &val); in si4713_write_econtrol_integers()
1187 val = set_bits(val, control->value, bit, mask); in si4713_write_econtrol_integers()
1190 rval = si4713_write_property(sdev, property, val); in si4713_write_econtrol_integers()
1194 val = control->value; in si4713_write_econtrol_integers()
1210 mutex_unlock(&sdev->mutex); in si4713_write_econtrol_integers()
1218 * si4713_setup - Sets the device up with current configuration.
1231 return -ENOMEM; in si4713_setup()
1234 mutex_lock(&sdev->mutex); in si4713_setup()
1236 mutex_unlock(&sdev->mutex); in si4713_setup()
1239 ctrl.value = tmp->rds_info.pi; in si4713_setup()
1243 ctrl.value = tmp->acomp_info.threshold; in si4713_setup()
1247 ctrl.value = tmp->acomp_info.gain; in si4713_setup()
1251 ctrl.value = tmp->pilot_info.frequency; in si4713_setup()
1255 ctrl.value = tmp->acomp_info.attack_time; in si4713_setup()
1259 ctrl.value = tmp->pilot_info.deviation; in si4713_setup()
1263 ctrl.value = tmp->limiter_info.deviation; in si4713_setup()
1267 ctrl.value = tmp->rds_info.deviation; in si4713_setup()
1271 ctrl.value = tmp->rds_info.pty; in si4713_setup()
1275 ctrl.value = tmp->limiter_info.enabled; in si4713_setup()
1279 ctrl.value = tmp->acomp_info.enabled; in si4713_setup()
1283 ctrl.value = tmp->pilot_info.enabled; in si4713_setup()
1287 ctrl.value = tmp->limiter_info.release_time; in si4713_setup()
1291 ctrl.value = tmp->acomp_info.release_time; in si4713_setup()
1295 ctrl.value = tmp->preemphasis; in si4713_setup()
1299 rval |= si4713_set_rds_ps_name(sdev, tmp->rds_info.ps_name); in si4713_setup()
1302 rval |= si4713_set_rds_radio_text(sdev, tmp->rds_info.radio_text); in si4713_setup()
1305 f.frequency = tmp->frequency ? tmp->frequency : DEFAULT_FREQUENCY; in si4713_setup()
1307 rval |= si4713_s_frequency(&sdev->sd, &f); in si4713_setup()
1310 ctrl.value = tmp->power_level; in si4713_setup()
1314 ctrl.value = tmp->antenna_capacitor; in si4713_setup()
1318 if (tmp->stereo) in si4713_setup()
1322 if (tmp->rds_info.enabled) in si4713_setup()
1324 si4713_s_modulator(&sdev->sd, &vm); in si4713_setup()
1332 * si4713_initialize - Sets the device up with default configuration.
1351 mutex_lock(&sdev->mutex); in si4713_initialize()
1353 sdev->rds_info.pi = DEFAULT_RDS_PI; in si4713_initialize()
1354 sdev->rds_info.pty = DEFAULT_RDS_PTY; in si4713_initialize()
1355 sdev->rds_info.deviation = DEFAULT_RDS_DEVIATION; in si4713_initialize()
1356 strlcpy(sdev->rds_info.ps_name, DEFAULT_RDS_PS_NAME, MAX_RDS_PS_NAME); in si4713_initialize()
1357 strlcpy(sdev->rds_info.radio_text, DEFAULT_RDS_RADIO_TEXT, in si4713_initialize()
1359 sdev->rds_info.enabled = 1; in si4713_initialize()
1361 sdev->limiter_info.release_time = DEFAULT_LIMITER_RTIME; in si4713_initialize()
1362 sdev->limiter_info.deviation = DEFAULT_LIMITER_DEV; in si4713_initialize()
1363 sdev->limiter_info.enabled = 1; in si4713_initialize()
1365 sdev->pilot_info.deviation = DEFAULT_PILOT_DEVIATION; in si4713_initialize()
1366 sdev->pilot_info.frequency = DEFAULT_PILOT_FREQUENCY; in si4713_initialize()
1367 sdev->pilot_info.enabled = 1; in si4713_initialize()
1369 sdev->acomp_info.release_time = DEFAULT_ACOMP_RTIME; in si4713_initialize()
1370 sdev->acomp_info.attack_time = DEFAULT_ACOMP_ATIME; in si4713_initialize()
1371 sdev->acomp_info.threshold = DEFAULT_ACOMP_THRESHOLD; in si4713_initialize()
1372 sdev->acomp_info.gain = DEFAULT_ACOMP_GAIN; in si4713_initialize()
1373 sdev->acomp_info.enabled = 1; in si4713_initialize()
1375 sdev->frequency = DEFAULT_FREQUENCY; in si4713_initialize()
1376 sdev->preemphasis = DEFAULT_PREEMPHASIS; in si4713_initialize()
1377 sdev->mute = DEFAULT_MUTE; in si4713_initialize()
1378 sdev->power_level = DEFAULT_POWER_LEVEL; in si4713_initialize()
1379 sdev->antenna_capacitor = 0; in si4713_initialize()
1380 sdev->stereo = 1; in si4713_initialize()
1381 sdev->tune_rnl = DEFAULT_TUNE_RNL; in si4713_initialize()
1383 mutex_unlock(&sdev->mutex); in si4713_initialize()
1389 /* read string property */
1395 switch (control->id) { in si4713_read_econtrol_string()
1397 if (strlen(sdev->rds_info.ps_name) + 1 > control->size) { in si4713_read_econtrol_string()
1398 control->size = MAX_RDS_PS_NAME + 1; in si4713_read_econtrol_string()
1399 rval = -ENOSPC; in si4713_read_econtrol_string()
1402 rval = copy_to_user(control->string, sdev->rds_info.ps_name, in si4713_read_econtrol_string()
1403 strlen(sdev->rds_info.ps_name) + 1); in si4713_read_econtrol_string()
1405 rval = -EFAULT; in si4713_read_econtrol_string()
1409 if (strlen(sdev->rds_info.radio_text) + 1 > control->size) { in si4713_read_econtrol_string()
1410 control->size = MAX_RDS_RADIO_TEXT + 1; in si4713_read_econtrol_string()
1411 rval = -ENOSPC; in si4713_read_econtrol_string()
1414 rval = copy_to_user(control->string, sdev->rds_info.radio_text, in si4713_read_econtrol_string()
1415 strlen(sdev->rds_info.radio_text) + 1); in si4713_read_econtrol_string()
1417 rval = -EFAULT; in si4713_read_econtrol_string()
1421 rval = -EINVAL; in si4713_read_econtrol_string()
1430 * si4713_update_tune_status - update properties from tx_tune_status
1431 * command. Must be called with sdev->mutex held.
1445 sdev->power_level = p; in si4713_update_tune_status()
1446 sdev->antenna_capacitor = a; in si4713_update_tune_status()
1447 sdev->tune_rnl = n; in si4713_update_tune_status()
1459 mutex_lock(&sdev->mutex); in si4713_read_econtrol_tune()
1461 if (sdev->power_state) { in si4713_read_econtrol_tune()
1467 switch (control->id) { in si4713_read_econtrol_tune()
1469 control->value = sdev->power_level; in si4713_read_econtrol_tune()
1472 control->value = sdev->antenna_capacitor; in si4713_read_econtrol_tune()
1475 rval = -EINVAL; in si4713_read_econtrol_tune()
1479 mutex_unlock(&sdev->mutex); in si4713_read_econtrol_tune()
1489 u16 property = 0; in si4713_read_econtrol_integers() local
1494 rval = si4713_choose_econtrol_action(sdev, control->id, &shadow, &bit, in si4713_read_econtrol_integers()
1495 &mask, &property, &mul, &table, &size); in si4713_read_econtrol_integers()
1499 mutex_lock(&sdev->mutex); in si4713_read_econtrol_integers()
1501 if (sdev->power_state) { in si4713_read_econtrol_integers()
1502 rval = si4713_read_property(sdev, property, &val); in si4713_read_econtrol_integers()
1507 if (control->id == V4L2_CID_AUDIO_COMPRESSION_THRESHOLD) in si4713_read_econtrol_integers()
1517 control->value = *shadow; in si4713_read_econtrol_integers()
1520 mutex_unlock(&sdev->mutex); in si4713_read_econtrol_integers()
1528 /* si4713_s_ext_ctrls - set extended controls value */
1535 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_FM_TX) in si4713_s_ext_ctrls()
1536 return -EINVAL; in si4713_s_ext_ctrls()
1538 for (i = 0; i < ctrls->count; i++) { in si4713_s_ext_ctrls()
1541 switch ((ctrls->controls + i)->id) { in si4713_s_ext_ctrls()
1545 ctrls->controls + i); in si4713_s_ext_ctrls()
1550 ctrls->controls + i); in si4713_s_ext_ctrls()
1554 ctrls->controls + i); in si4713_s_ext_ctrls()
1558 ctrls->error_idx = i; in si4713_s_ext_ctrls()
1566 /* si4713_g_ext_ctrls - get extended controls value */
1573 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_FM_TX) in si4713_g_ext_ctrls()
1574 return -EINVAL; in si4713_g_ext_ctrls()
1576 for (i = 0; i < ctrls->count; i++) { in si4713_g_ext_ctrls()
1579 switch ((ctrls->controls + i)->id) { in si4713_g_ext_ctrls()
1583 ctrls->controls + i); in si4713_g_ext_ctrls()
1588 ctrls->controls + i); in si4713_g_ext_ctrls()
1592 ctrls->controls + i); in si4713_g_ext_ctrls()
1596 ctrls->error_idx = i; in si4713_g_ext_ctrls()
1604 /* si4713_queryctrl - enumerate control items */
1609 switch (qc->id) { in si4713_queryctrl()
1699 rval = -EINVAL; in si4713_queryctrl()
1706 /* si4713_g_ctrl - get the value of a control */
1713 return -ENODEV; in si4713_g_ctrl()
1715 mutex_lock(&sdev->mutex); in si4713_g_ctrl()
1717 if (sdev->power_state) { in si4713_g_ctrl()
1719 &sdev->mute); in si4713_g_ctrl()
1725 switch (ctrl->id) { in si4713_g_ctrl()
1727 ctrl->value = get_mute(sdev->mute); in si4713_g_ctrl()
1732 mutex_unlock(&sdev->mutex); in si4713_g_ctrl()
1736 /* si4713_s_ctrl - set the value of a control */
1743 return -ENODEV; in si4713_s_ctrl()
1745 switch (ctrl->id) { in si4713_s_ctrl()
1747 if (ctrl->value) { in si4713_s_ctrl()
1748 rval = si4713_set_mute(sdev, ctrl->value); in si4713_s_ctrl()
1762 rval = si4713_set_mute(sdev, ctrl->value); in si4713_s_ctrl()
1771 /* si4713_ioctl - deal with private ioctls (only rnl for now) */
1780 return -EINVAL; in si4713_ioctl()
1782 mutex_lock(&sdev->mutex); in si4713_ioctl()
1785 frequency = v4l2_to_si4713(rnl->frequency); in si4713_ioctl()
1787 if (sdev->power_state) { in si4713_ioctl()
1797 rnl->rnl = sdev->tune_rnl; in si4713_ioctl()
1802 rval = -ENOIOCTLCMD; in si4713_ioctl()
1806 mutex_unlock(&sdev->mutex); in si4713_ioctl()
1819 /* si4713_g_modulator - get modulator attributes */
1826 rval = -ENODEV; in si4713_g_modulator()
1830 if (vm->index > 0) { in si4713_g_modulator()
1831 rval = -EINVAL; in si4713_g_modulator()
1835 strncpy(vm->name, "FM Modulator", 32); in si4713_g_modulator()
1836 vm->capability = V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LOW | in si4713_g_modulator()
1840 vm->rangelow = si4713_to_v4l2(FREQ_RANGE_LOW); in si4713_g_modulator()
1841 vm->rangehigh = si4713_to_v4l2(FREQ_RANGE_HIGH); in si4713_g_modulator()
1843 mutex_lock(&sdev->mutex); in si4713_g_modulator()
1845 if (sdev->power_state) { in si4713_g_modulator()
1853 sdev->stereo = get_status_bit(comp_en, 1, 1 << 1); in si4713_g_modulator()
1854 sdev->rds_info.enabled = get_status_bit(comp_en, 2, 1 << 2); in si4713_g_modulator()
1858 if (sdev->stereo) in si4713_g_modulator()
1859 vm->txsubchans = V4L2_TUNER_SUB_STEREO; in si4713_g_modulator()
1861 vm->txsubchans = V4L2_TUNER_SUB_MONO; in si4713_g_modulator()
1864 if (sdev->rds_info.enabled) in si4713_g_modulator()
1865 vm->txsubchans |= V4L2_TUNER_SUB_RDS; in si4713_g_modulator()
1867 vm->txsubchans &= ~V4L2_TUNER_SUB_RDS; in si4713_g_modulator()
1870 mutex_unlock(&sdev->mutex); in si4713_g_modulator()
1875 /* si4713_s_modulator - set modulator attributes */
1884 return -ENODEV; in si4713_s_modulator()
1886 if (vm->index > 0) in si4713_s_modulator()
1887 return -EINVAL; in si4713_s_modulator()
1890 if (vm->txsubchans & V4L2_TUNER_SUB_STEREO) in si4713_s_modulator()
1892 else if (vm->txsubchans & V4L2_TUNER_SUB_MONO) in si4713_s_modulator()
1895 return -EINVAL; in si4713_s_modulator()
1897 rds = !!(vm->txsubchans & V4L2_TUNER_SUB_RDS); in si4713_s_modulator()
1899 mutex_lock(&sdev->mutex); in si4713_s_modulator()
1901 if (sdev->power_state) { in si4713_s_modulator()
1916 sdev->stereo = stereo; in si4713_s_modulator()
1917 sdev->rds_info.enabled = rds; in si4713_s_modulator()
1920 mutex_unlock(&sdev->mutex); in si4713_s_modulator()
1924 /* si4713_g_frequency - get tuner or modulator radio frequency */
1930 f->type = V4L2_TUNER_RADIO; in si4713_g_frequency()
1932 mutex_lock(&sdev->mutex); in si4713_g_frequency()
1934 if (sdev->power_state) { in si4713_g_frequency()
1942 sdev->frequency = freq; in si4713_g_frequency()
1945 f->frequency = si4713_to_v4l2(sdev->frequency); in si4713_g_frequency()
1948 mutex_unlock(&sdev->mutex); in si4713_g_frequency()
1952 /* si4713_s_frequency - set tuner or modulator radio frequency */
1957 u16 frequency = v4l2_to_si4713(f->frequency); in si4713_s_frequency()
1961 return -EDOM; in si4713_s_frequency()
1963 mutex_lock(&sdev->mutex); in si4713_s_frequency()
1965 if (sdev->power_state) { in si4713_s_frequency()
1972 sdev->frequency = frequency; in si4713_s_frequency()
1973 f->frequency = si4713_to_v4l2(frequency); in si4713_s_frequency()
1976 mutex_unlock(&sdev->mutex); in si4713_s_frequency()
1995 /* si4713_probe - probe for the device */
2000 struct si4713_platform_data *pdata = client->dev.platform_data; in si4713_probe()
2005 dev_err(&client->dev, "Failed to alloc video device.\n"); in si4713_probe()
2006 rval = -ENOMEM; in si4713_probe()
2010 sdev->gpio_reset = -1; in si4713_probe()
2011 if (pdata && gpio_is_valid(pdata->gpio_reset)) { in si4713_probe()
2012 rval = gpio_request(pdata->gpio_reset, "si4713 reset"); in si4713_probe()
2014 dev_err(&client->dev, in si4713_probe()
2018 sdev->gpio_reset = pdata->gpio_reset; in si4713_probe()
2019 gpio_direction_output(sdev->gpio_reset, 0); in si4713_probe()
2022 for (i = 0; i < ARRAY_SIZE(sdev->supplies); i++) in si4713_probe()
2023 sdev->supplies[i].supply = si4713_supply_names[i]; in si4713_probe()
2025 rval = regulator_bulk_get(&client->dev, ARRAY_SIZE(sdev->supplies), in si4713_probe()
2026 sdev->supplies); in si4713_probe()
2028 dev_err(&client->dev, "Cannot get regulators: %d\n", rval); in si4713_probe()
2032 v4l2_i2c_subdev_init(&sdev->sd, client, &si4713_subdev_ops); in si4713_probe()
2034 mutex_init(&sdev->mutex); in si4713_probe()
2035 init_completion(&sdev->work); in si4713_probe()
2037 if (client->irq) { in si4713_probe()
2038 rval = request_irq(client->irq, in si4713_probe()
2040 client->name, sdev); in si4713_probe()
2042 v4l2_err(&sdev->sd, "Could not request IRQ\n"); in si4713_probe()
2045 v4l2_dbg(1, debug, &sdev->sd, "IRQ requested.\n"); in si4713_probe()
2047 v4l2_warn(&sdev->sd, "IRQ not configured. Using timeouts.\n"); in si4713_probe()
2052 v4l2_err(&sdev->sd, "Failed to probe device information.\n"); in si4713_probe()
2059 if (client->irq) in si4713_probe()
2060 free_irq(client->irq, sdev); in si4713_probe()
2062 regulator_bulk_free(ARRAY_SIZE(sdev->supplies), sdev->supplies); in si4713_probe()
2064 if (gpio_is_valid(sdev->gpio_reset)) in si4713_probe()
2065 gpio_free(sdev->gpio_reset); in si4713_probe()
2072 /* si4713_remove - remove the device */
2078 if (sdev->power_state) in si4713_remove()
2081 if (client->irq > 0) in si4713_remove()
2082 free_irq(client->irq, sdev); in si4713_remove()
2085 regulator_bulk_free(ARRAY_SIZE(sdev->supplies), sdev->supplies); in si4713_remove()
2086 if (gpio_is_valid(sdev->gpio_reset)) in si4713_remove()
2087 gpio_free(sdev->gpio_reset); in si4713_remove()
2093 /* si4713_i2c_driver - i2c driver interface */