Lines Matching defs:radio
3 * drivers/media/radio/si470x/radio-si470x-i2c.c
15 #define DRIVER_DESC "I2C radio driver for Si470x FM Radio Receivers"
25 #include "radio-si470x.h"
84 static int si470x_get_register(struct si470x_device *radio, int regnr)
89 .addr = radio->client->addr,
96 if (i2c_transfer(radio->client->adapter, msgs, 1) != 1)
99 radio->registers[regnr] = __be16_to_cpu(buf[READ_INDEX(regnr)]);
108 static int si470x_set_register(struct si470x_device *radio, int regnr)
114 .addr = radio->client->addr,
121 buf[i] = __cpu_to_be16(radio->registers[WRITE_INDEX(i)]);
123 if (i2c_transfer(radio->client->adapter, msgs, 1) != 1)
138 static int si470x_get_all_registers(struct si470x_device *radio)
144 .addr = radio->client->addr,
151 if (i2c_transfer(radio->client->adapter, msgs, 1) != 1)
155 radio->registers[i] = __be16_to_cpu(buf[READ_INDEX(i)]);
171 struct si470x_device *radio = video_drvdata(file);
178 /* start radio */
179 retval = si470x_start(radio);
184 radio->registers[SYSCONFIG1] |= SYSCONFIG1_RDSIEN;
185 radio->registers[SYSCONFIG1] |= SYSCONFIG1_STCIEN;
186 radio->registers[SYSCONFIG1] &= ~SYSCONFIG1_GPIO2;
187 radio->registers[SYSCONFIG1] |= 0x1 << 2;
188 retval = si470x_set_register(radio, SYSCONFIG1);
203 struct si470x_device *radio = video_drvdata(file);
206 /* stop radio */
207 si470x_stop(radio);
240 struct si470x_device *radio = dev_id;
249 retval = si470x_get_register(radio, STATUSRSSI);
253 if (radio->registers[STATUSRSSI] & STATUSRSSI_STC)
254 complete(&radio->completion);
257 if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS) == 0)
262 retval = si470x_get_register(radio, STATUSRSSI + regnr);
268 if ((radio->registers[STATUSRSSI] & STATUSRSSI_RDSR) == 0)
275 bler = (radio->registers[STATUSRSSI] &
277 rds = radio->registers[RDSA];
280 bler = (radio->registers[READCHAN] &
282 rds = radio->registers[RDSB];
285 bler = (radio->registers[READCHAN] &
287 rds = radio->registers[RDSC];
290 bler = (radio->registers[READCHAN] &
292 rds = radio->registers[RDSD];
306 memcpy(&radio->buffer[radio->wr_index], &tmpbuf, 3);
307 radio->wr_index += 3;
310 if (radio->wr_index >= radio->buf_size)
311 radio->wr_index = 0;
314 if (radio->wr_index == radio->rd_index) {
316 radio->rd_index += 3;
317 if (radio->rd_index >= radio->buf_size)
318 radio->rd_index = 0;
322 if (radio->wr_index != radio->rd_index)
323 wake_up_interruptible(&radio->read_queue);
335 struct si470x_device *radio;
340 radio = devm_kzalloc(&client->dev, sizeof(*radio), GFP_KERNEL);
341 if (!radio) {
346 radio->client = client;
347 radio->band = 1; /* Default to 76 - 108 MHz */
348 mutex_init(&radio->lock);
349 init_completion(&radio->completion);
351 radio->get_register = si470x_get_register;
352 radio->set_register = si470x_set_register;
353 radio->fops_open = si470x_fops_open;
354 radio->fops_release = si470x_fops_release;
355 radio->vidioc_querycap = si470x_vidioc_querycap;
357 retval = v4l2_device_register(&client->dev, &radio->v4l2_dev);
363 v4l2_ctrl_handler_init(&radio->hdl, 2);
364 v4l2_ctrl_new_std(&radio->hdl, &si470x_ctrl_ops,
366 v4l2_ctrl_new_std(&radio->hdl, &si470x_ctrl_ops,
368 if (radio->hdl.error) {
369 retval = radio->hdl.error;
375 radio->videodev = si470x_viddev_template;
376 radio->videodev.ctrl_handler = &radio->hdl;
377 radio->videodev.lock = &radio->lock;
378 radio->videodev.v4l2_dev = &radio->v4l2_dev;
379 radio->videodev.release = video_device_release_empty;
380 radio->videodev.device_caps =
383 video_set_drvdata(&radio->videodev, radio);
385 radio->gpio_reset = devm_gpiod_get_optional(&client->dev, "reset",
387 if (IS_ERR(radio->gpio_reset)) {
388 retval = PTR_ERR(radio->gpio_reset);
393 if (radio->gpio_reset)
394 gpiod_set_value(radio->gpio_reset, 1);
397 radio->registers[POWERCFG] = POWERCFG_ENABLE;
398 if (si470x_set_register(radio, POWERCFG) < 0) {
405 if (si470x_get_all_registers(radio) < 0) {
410 radio->registers[DEVICEID], radio->registers[SI_CHIPID]);
411 if ((radio->registers[SI_CHIPID] & SI_CHIPID_FIRMWARE) < RADIO_FW_VERSION) {
417 radio->registers[SI_CHIPID] & SI_CHIPID_FIRMWARE);
430 si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */
433 radio->buf_size = rds_buf * 3;
434 radio->buffer = devm_kmalloc(&client->dev, radio->buf_size, GFP_KERNEL);
435 if (!radio->buffer) {
441 radio->wr_index = 0;
442 radio->rd_index = 0;
443 init_waitqueue_head(&radio->read_queue);
448 DRIVER_NAME, radio);
455 retval = video_register_device(&radio->videodev, VFL_TYPE_RADIO,
461 i2c_set_clientdata(client, radio);
465 v4l2_ctrl_handler_free(&radio->hdl);
466 v4l2_device_unregister(&radio->v4l2_dev);
477 struct si470x_device *radio = i2c_get_clientdata(client);
479 video_unregister_device(&radio->videodev);
481 if (radio->gpio_reset)
482 gpiod_set_value(radio->gpio_reset, 0);
484 v4l2_ctrl_handler_free(&radio->hdl);
485 v4l2_device_unregister(&radio->v4l2_dev);
497 struct si470x_device *radio = i2c_get_clientdata(client);
500 radio->registers[POWERCFG] |= POWERCFG_DISABLE;
501 if (si470x_set_register(radio, POWERCFG) < 0)
514 struct si470x_device *radio = i2c_get_clientdata(client);
517 radio->registers[POWERCFG] |= POWERCFG_ENABLE;
518 if (si470x_set_register(radio, POWERCFG) < 0)