linux/drivers/media/radio/si470x/radio-si470x.h
<<
>>
Prefs
   1/*
   2 *  drivers/media/radio/si470x/radio-si470x.h
   3 *
   4 *  Driver for radios with Silicon Labs Si470x FM Radio Receivers
   5 *
   6 *  Copyright (c) 2009 Tobias Lorenz <tobias.lorenz@gmx.net>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 */
  18
  19
  20/* driver definitions */
  21#define DRIVER_NAME "radio-si470x"
  22
  23
  24/* kernel includes */
  25#include <linux/kernel.h>
  26#include <linux/module.h>
  27#include <linux/init.h>
  28#include <linux/sched.h>
  29#include <linux/slab.h>
  30#include <linux/input.h>
  31#include <linux/videodev2.h>
  32#include <linux/mutex.h>
  33#include <media/v4l2-common.h>
  34#include <media/v4l2-ioctl.h>
  35#include <media/v4l2-ctrls.h>
  36#include <media/v4l2-event.h>
  37#include <media/v4l2-device.h>
  38#include <asm/unaligned.h>
  39
  40
  41
  42/**************************************************************************
  43 * Register Definitions
  44 **************************************************************************/
  45#define RADIO_REGISTER_SIZE     2       /* 16 register bit width */
  46#define RADIO_REGISTER_NUM      16      /* DEVICEID   ... RDSD */
  47#define RDS_REGISTER_NUM        6       /* STATUSRSSI ... RDSD */
  48
  49#define DEVICEID                0       /* Device ID */
  50#define DEVICEID_PN             0xf000  /* bits 15..12: Part Number */
  51#define DEVICEID_MFGID          0x0fff  /* bits 11..00: Manufacturer ID */
  52
  53#define SI_CHIPID               1       /* Chip ID */
  54#define SI_CHIPID_REV           0xfc00  /* bits 15..10: Chip Version */
  55#define SI_CHIPID_DEV           0x0200  /* bits 09..09: Device */
  56#define SI_CHIPID_FIRMWARE      0x01ff  /* bits 08..00: Firmware Version */
  57
  58#define POWERCFG                2       /* Power Configuration */
  59#define POWERCFG_DSMUTE         0x8000  /* bits 15..15: Softmute Disable */
  60#define POWERCFG_DMUTE          0x4000  /* bits 14..14: Mute Disable */
  61#define POWERCFG_MONO           0x2000  /* bits 13..13: Mono Select */
  62#define POWERCFG_RDSM           0x0800  /* bits 11..11: RDS Mode (Si4701 only) */
  63#define POWERCFG_SKMODE         0x0400  /* bits 10..10: Seek Mode */
  64#define POWERCFG_SEEKUP         0x0200  /* bits 09..09: Seek Direction */
  65#define POWERCFG_SEEK           0x0100  /* bits 08..08: Seek */
  66#define POWERCFG_DISABLE        0x0040  /* bits 06..06: Powerup Disable */
  67#define POWERCFG_ENABLE         0x0001  /* bits 00..00: Powerup Enable */
  68
  69#define CHANNEL                 3       /* Channel */
  70#define CHANNEL_TUNE            0x8000  /* bits 15..15: Tune */
  71#define CHANNEL_CHAN            0x03ff  /* bits 09..00: Channel Select */
  72
  73#define SYSCONFIG1              4       /* System Configuration 1 */
  74#define SYSCONFIG1_RDSIEN       0x8000  /* bits 15..15: RDS Interrupt Enable (Si4701 only) */
  75#define SYSCONFIG1_STCIEN       0x4000  /* bits 14..14: Seek/Tune Complete Interrupt Enable */
  76#define SYSCONFIG1_RDS          0x1000  /* bits 12..12: RDS Enable (Si4701 only) */
  77#define SYSCONFIG1_DE           0x0800  /* bits 11..11: De-emphasis (0=75us 1=50us) */
  78#define SYSCONFIG1_AGCD         0x0400  /* bits 10..10: AGC Disable */
  79#define SYSCONFIG1_BLNDADJ      0x00c0  /* bits 07..06: Stereo/Mono Blend Level Adjustment */
  80#define SYSCONFIG1_GPIO3        0x0030  /* bits 05..04: General Purpose I/O 3 */
  81#define SYSCONFIG1_GPIO2        0x000c  /* bits 03..02: General Purpose I/O 2 */
  82#define SYSCONFIG1_GPIO2_DIS    0x0000  /* Disable GPIO 2 interrupt */
  83#define SYSCONFIG1_GPIO2_INT    0x0004  /* Enable STC/RDS interrupt */
  84#define SYSCONFIG1_GPIO1        0x0003  /* bits 01..00: General Purpose I/O 1 */
  85
  86#define SYSCONFIG2              5       /* System Configuration 2 */
  87#define SYSCONFIG2_SEEKTH       0xff00  /* bits 15..08: RSSI Seek Threshold */
  88#define SYSCONFIG2_BAND         0x00c0  /* bits 07..06: Band Select */
  89#define SYSCONFIG2_SPACE        0x0030  /* bits 05..04: Channel Spacing */
  90#define SYSCONFIG2_VOLUME       0x000f  /* bits 03..00: Volume */
  91
  92#define SYSCONFIG3              6       /* System Configuration 3 */
  93#define SYSCONFIG3_SMUTER       0xc000  /* bits 15..14: Softmute Attack/Recover Rate */
  94#define SYSCONFIG3_SMUTEA       0x3000  /* bits 13..12: Softmute Attenuation */
  95#define SYSCONFIG3_SKSNR        0x00f0  /* bits 07..04: Seek SNR Threshold */
  96#define SYSCONFIG3_SKCNT        0x000f  /* bits 03..00: Seek FM Impulse Detection Threshold */
  97
  98#define TEST1                   7       /* Test 1 */
  99#define TEST1_AHIZEN            0x4000  /* bits 14..14: Audio High-Z Enable */
 100
 101#define TEST2                   8       /* Test 2 */
 102/* TEST2 only contains reserved bits */
 103
 104#define BOOTCONFIG              9       /* Boot Configuration */
 105/* BOOTCONFIG only contains reserved bits */
 106
 107#define STATUSRSSI              10      /* Status RSSI */
 108#define STATUSRSSI_RDSR         0x8000  /* bits 15..15: RDS Ready (Si4701 only) */
 109#define STATUSRSSI_STC          0x4000  /* bits 14..14: Seek/Tune Complete */
 110#define STATUSRSSI_SF           0x2000  /* bits 13..13: Seek Fail/Band Limit */
 111#define STATUSRSSI_AFCRL        0x1000  /* bits 12..12: AFC Rail */
 112#define STATUSRSSI_RDSS         0x0800  /* bits 11..11: RDS Synchronized (Si4701 only) */
 113#define STATUSRSSI_BLERA        0x0600  /* bits 10..09: RDS Block A Errors (Si4701 only) */
 114#define STATUSRSSI_ST           0x0100  /* bits 08..08: Stereo Indicator */
 115#define STATUSRSSI_RSSI         0x00ff  /* bits 07..00: RSSI (Received Signal Strength Indicator) */
 116
 117#define READCHAN                11      /* Read Channel */
 118#define READCHAN_BLERB          0xc000  /* bits 15..14: RDS Block D Errors (Si4701 only) */
 119#define READCHAN_BLERC          0x3000  /* bits 13..12: RDS Block C Errors (Si4701 only) */
 120#define READCHAN_BLERD          0x0c00  /* bits 11..10: RDS Block B Errors (Si4701 only) */
 121#define READCHAN_READCHAN       0x03ff  /* bits 09..00: Read Channel */
 122
 123#define RDSA                    12      /* RDSA */
 124#define RDSA_RDSA               0xffff  /* bits 15..00: RDS Block A Data (Si4701 only) */
 125
 126#define RDSB                    13      /* RDSB */
 127#define RDSB_RDSB               0xffff  /* bits 15..00: RDS Block B Data (Si4701 only) */
 128
 129#define RDSC                    14      /* RDSC */
 130#define RDSC_RDSC               0xffff  /* bits 15..00: RDS Block C Data (Si4701 only) */
 131
 132#define RDSD                    15      /* RDSD */
 133#define RDSD_RDSD               0xffff  /* bits 15..00: RDS Block D Data (Si4701 only) */
 134
 135
 136
 137/**************************************************************************
 138 * General Driver Definitions
 139 **************************************************************************/
 140
 141/*
 142 * si470x_device - private data
 143 */
 144struct si470x_device {
 145        struct v4l2_device v4l2_dev;
 146        struct video_device videodev;
 147        struct v4l2_ctrl_handler hdl;
 148        int band;
 149
 150        /* Silabs internal registers (0..15) */
 151        unsigned short registers[RADIO_REGISTER_NUM];
 152
 153        /* RDS receive buffer */
 154        wait_queue_head_t read_queue;
 155        struct mutex lock;              /* buffer locking */
 156        unsigned char *buffer;          /* size is always multiple of three */
 157        unsigned int buf_size;
 158        unsigned int rd_index;
 159        unsigned int wr_index;
 160
 161        struct completion completion;
 162        bool status_rssi_auto_update;   /* Does RSSI get updated automatic? */
 163
 164        /* si470x ops */
 165
 166        int (*get_register)(struct si470x_device *radio, int regnr);
 167        int (*set_register)(struct si470x_device *radio, int regnr);
 168        int (*fops_open)(struct file *file);
 169        int (*fops_release)(struct file *file);
 170        int (*vidioc_querycap)(struct file *file, void *priv,
 171                               struct v4l2_capability *capability);
 172
 173#if IS_ENABLED(CONFIG_USB_SI470X)
 174        /* reference to USB and video device */
 175        struct usb_device *usbdev;
 176        struct usb_interface *intf;
 177        char *usb_buf;
 178
 179        /* Interrupt endpoint handling */
 180        char *int_in_buffer;
 181        struct usb_endpoint_descriptor *int_in_endpoint;
 182        struct urb *int_in_urb;
 183        int int_in_running;
 184
 185        /* scratch page */
 186        unsigned char software_version;
 187        unsigned char hardware_version;
 188#endif
 189
 190#if IS_ENABLED(CONFIG_I2C_SI470X)
 191        struct i2c_client *client;
 192#endif
 193};
 194
 195
 196
 197/**************************************************************************
 198 * Firmware Versions
 199 **************************************************************************/
 200
 201#define RADIO_FW_VERSION        12
 202
 203
 204
 205/**************************************************************************
 206 * Frequency Multiplicator
 207 **************************************************************************/
 208
 209/*
 210 * The frequency is set in units of 62.5 Hz when using V4L2_TUNER_CAP_LOW,
 211 * 62.5 kHz otherwise.
 212 * The tuner is able to have a channel spacing of 50, 100 or 200 kHz.
 213 * tuner->capability is therefore set to V4L2_TUNER_CAP_LOW
 214 * The FREQ_MUL is then: 1 MHz / 62.5 Hz = 16000
 215 */
 216#define FREQ_MUL (1000000 / 62.5)
 217
 218
 219
 220/**************************************************************************
 221 * Common Functions
 222 **************************************************************************/
 223extern const struct video_device si470x_viddev_template;
 224extern const struct v4l2_ctrl_ops si470x_ctrl_ops;
 225int si470x_disconnect_check(struct si470x_device *radio);
 226int si470x_set_freq(struct si470x_device *radio, unsigned int freq);
 227int si470x_start(struct si470x_device *radio);
 228int si470x_stop(struct si470x_device *radio);
 229