Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * drivers/media/radio/si4713-i2c.h
0003  *
0004  * Property and commands definitions for Si4713 radio transmitter chip.
0005  *
0006  * Copyright (c) 2008 Instituto Nokia de Tecnologia - INdT
0007  * Contact: Eduardo Valentin <eduardo.valentin@nokia.com>
0008  *
0009  * This file is licensed under the terms of the GNU General Public License
0010  * version 2. This program is licensed "as is" without any warranty of any
0011  * kind, whether express or implied.
0012  *
0013  */
0014 
0015 #ifndef SI4713_I2C_H
0016 #define SI4713_I2C_H
0017 
0018 #include <linux/platform_device.h>
0019 #include <linux/regulator/consumer.h>
0020 #include <linux/gpio/consumer.h>
0021 #include <media/v4l2-subdev.h>
0022 #include <media/v4l2-ctrls.h>
0023 #include <linux/platform_data/media/si4713.h>
0024 
0025 #define SI4713_PRODUCT_NUMBER       0x0D
0026 
0027 /* Command Timeouts */
0028 #define DEFAULT_TIMEOUT         500
0029 #define TIMEOUT_SET_PROPERTY        20
0030 #define TIMEOUT_TX_TUNE_POWER       30000
0031 #define TIMEOUT_TX_TUNE         110000
0032 #define TIMEOUT_POWER_UP        200000
0033 
0034 /*
0035  * Command and its arguments definitions
0036  */
0037 #define SI4713_PWUP_CTSIEN      (1<<7)
0038 #define SI4713_PWUP_GPO2OEN     (1<<6)
0039 #define SI4713_PWUP_PATCH       (1<<5)
0040 #define SI4713_PWUP_XOSCEN      (1<<4)
0041 #define SI4713_PWUP_FUNC_TX     0x02
0042 #define SI4713_PWUP_FUNC_PATCH      0x0F
0043 #define SI4713_PWUP_OPMOD_ANALOG    0x50
0044 #define SI4713_PWUP_OPMOD_DIGITAL   0x0F
0045 #define SI4713_PWUP_NARGS       2
0046 #define SI4713_PWUP_NRESP       1
0047 #define SI4713_CMD_POWER_UP     0x01
0048 
0049 #define SI4713_GETREV_NRESP     9
0050 #define SI4713_CMD_GET_REV      0x10
0051 
0052 #define SI4713_PWDN_NRESP       1
0053 #define SI4713_CMD_POWER_DOWN       0x11
0054 
0055 #define SI4713_SET_PROP_NARGS       5
0056 #define SI4713_SET_PROP_NRESP       1
0057 #define SI4713_CMD_SET_PROPERTY     0x12
0058 
0059 #define SI4713_GET_PROP_NARGS       3
0060 #define SI4713_GET_PROP_NRESP       4
0061 #define SI4713_CMD_GET_PROPERTY     0x13
0062 
0063 #define SI4713_GET_STATUS_NRESP     1
0064 #define SI4713_CMD_GET_INT_STATUS   0x14
0065 
0066 #define SI4713_CMD_PATCH_ARGS       0x15
0067 #define SI4713_CMD_PATCH_DATA       0x16
0068 
0069 #define SI4713_MAX_FREQ         10800
0070 #define SI4713_MIN_FREQ         7600
0071 #define SI4713_TXFREQ_NARGS     3
0072 #define SI4713_TXFREQ_NRESP     1
0073 #define SI4713_CMD_TX_TUNE_FREQ     0x30
0074 
0075 #define SI4713_MAX_POWER        120
0076 #define SI4713_MIN_POWER        88
0077 #define SI4713_MAX_ANTCAP       191
0078 #define SI4713_MIN_ANTCAP       0
0079 #define SI4713_TXPWR_NARGS      4
0080 #define SI4713_TXPWR_NRESP      1
0081 #define SI4713_CMD_TX_TUNE_POWER    0x31
0082 
0083 #define SI4713_TXMEA_NARGS      4
0084 #define SI4713_TXMEA_NRESP      1
0085 #define SI4713_CMD_TX_TUNE_MEASURE  0x32
0086 
0087 #define SI4713_INTACK_MASK      0x01
0088 #define SI4713_TXSTATUS_NARGS       1
0089 #define SI4713_TXSTATUS_NRESP       8
0090 #define SI4713_CMD_TX_TUNE_STATUS   0x33
0091 
0092 #define SI4713_OVERMOD_BIT      (1 << 2)
0093 #define SI4713_IALH_BIT         (1 << 1)
0094 #define SI4713_IALL_BIT         (1 << 0)
0095 #define SI4713_ASQSTATUS_NARGS      1
0096 #define SI4713_ASQSTATUS_NRESP      5
0097 #define SI4713_CMD_TX_ASQ_STATUS    0x34
0098 
0099 #define SI4713_RDSBUFF_MODE_MASK    0x87
0100 #define SI4713_RDSBUFF_NARGS        7
0101 #define SI4713_RDSBUFF_NRESP        6
0102 #define SI4713_CMD_TX_RDS_BUFF      0x35
0103 
0104 #define SI4713_RDSPS_PSID_MASK      0x1F
0105 #define SI4713_RDSPS_NARGS      5
0106 #define SI4713_RDSPS_NRESP      1
0107 #define SI4713_CMD_TX_RDS_PS        0x36
0108 
0109 #define SI4713_CMD_GPO_CTL      0x80
0110 #define SI4713_CMD_GPO_SET      0x81
0111 
0112 /*
0113  * Bits from status response
0114  */
0115 #define SI4713_CTS          (1<<7)
0116 #define SI4713_ERR          (1<<6)
0117 #define SI4713_RDS_INT          (1<<2)
0118 #define SI4713_ASQ_INT          (1<<1)
0119 #define SI4713_STC_INT          (1<<0)
0120 
0121 /*
0122  * Property definitions
0123  */
0124 #define SI4713_GPO_IEN          0x0001
0125 #define SI4713_DIG_INPUT_FORMAT     0x0101
0126 #define SI4713_DIG_INPUT_SAMPLE_RATE    0x0103
0127 #define SI4713_REFCLK_FREQ      0x0201
0128 #define SI4713_REFCLK_PRESCALE      0x0202
0129 #define SI4713_TX_COMPONENT_ENABLE  0x2100
0130 #define SI4713_TX_AUDIO_DEVIATION   0x2101
0131 #define SI4713_TX_PILOT_DEVIATION   0x2102
0132 #define SI4713_TX_RDS_DEVIATION     0x2103
0133 #define SI4713_TX_LINE_INPUT_LEVEL  0x2104
0134 #define SI4713_TX_LINE_INPUT_MUTE   0x2105
0135 #define SI4713_TX_PREEMPHASIS       0x2106
0136 #define SI4713_TX_PILOT_FREQUENCY   0x2107
0137 #define SI4713_TX_ACOMP_ENABLE      0x2200
0138 #define SI4713_TX_ACOMP_THRESHOLD   0x2201
0139 #define SI4713_TX_ACOMP_ATTACK_TIME 0x2202
0140 #define SI4713_TX_ACOMP_RELEASE_TIME    0x2203
0141 #define SI4713_TX_ACOMP_GAIN        0x2204
0142 #define SI4713_TX_LIMITER_RELEASE_TIME  0x2205
0143 #define SI4713_TX_ASQ_INTERRUPT_SOURCE  0x2300
0144 #define SI4713_TX_ASQ_LEVEL_LOW     0x2301
0145 #define SI4713_TX_ASQ_DURATION_LOW  0x2302
0146 #define SI4713_TX_ASQ_LEVEL_HIGH    0x2303
0147 #define SI4713_TX_ASQ_DURATION_HIGH 0x2304
0148 #define SI4713_TX_RDS_INTERRUPT_SOURCE  0x2C00
0149 #define SI4713_TX_RDS_PI        0x2C01
0150 #define SI4713_TX_RDS_PS_MIX        0x2C02
0151 #define SI4713_TX_RDS_PS_MISC       0x2C03
0152 #define SI4713_TX_RDS_PS_REPEAT_COUNT   0x2C04
0153 #define SI4713_TX_RDS_PS_MESSAGE_COUNT  0x2C05
0154 #define SI4713_TX_RDS_PS_AF     0x2C06
0155 #define SI4713_TX_RDS_FIFO_SIZE     0x2C07
0156 
0157 #define PREEMPHASIS_USA         75
0158 #define PREEMPHASIS_EU          50
0159 #define PREEMPHASIS_DISABLED        0
0160 #define FMPE_USA            0x00
0161 #define FMPE_EU             0x01
0162 #define FMPE_DISABLED           0x02
0163 
0164 #define POWER_UP            0x01
0165 #define POWER_DOWN          0x00
0166 
0167 #define MAX_RDS_PTY         31
0168 #define MAX_RDS_DEVIATION       90000
0169 
0170 /*
0171  * PSNAME is known to be defined as 8 character sized (RDS Spec).
0172  * However, there is receivers which scroll PSNAME 8xN sized.
0173  */
0174 #define MAX_RDS_PS_NAME         96
0175 
0176 /*
0177  * MAX_RDS_RADIO_TEXT is known to be defined as 32 (2A group) or 64 (2B group)
0178  * character sized (RDS Spec).
0179  * However, there is receivers which scroll them as well.
0180  */
0181 #define MAX_RDS_RADIO_TEXT      384
0182 
0183 #define MAX_LIMITER_RELEASE_TIME    102390
0184 #define MAX_LIMITER_DEVIATION       90000
0185 
0186 #define MAX_PILOT_DEVIATION     90000
0187 #define MAX_PILOT_FREQUENCY     19000
0188 
0189 #define MAX_ACOMP_RELEASE_TIME      1000000
0190 #define MAX_ACOMP_ATTACK_TIME       5000
0191 #define MAX_ACOMP_THRESHOLD     0
0192 #define MIN_ACOMP_THRESHOLD     (-40)
0193 #define MAX_ACOMP_GAIN          20
0194 
0195 /*
0196  * si4713_device - private data
0197  */
0198 struct si4713_device {
0199     /* v4l2_subdev and i2c reference (v4l2_subdev priv data) */
0200     struct v4l2_subdev sd;
0201     struct v4l2_ctrl_handler ctrl_handler;
0202     /* private data structures */
0203     struct { /* si4713 control cluster */
0204         /* This is one big cluster since the mute control
0205          * powers off the device and after unmuting again all
0206          * controls need to be set at once. The only way of doing
0207          * that is by making it one big cluster. */
0208         struct v4l2_ctrl *mute;
0209         struct v4l2_ctrl *rds_ps_name;
0210         struct v4l2_ctrl *rds_radio_text;
0211         struct v4l2_ctrl *rds_pi;
0212         struct v4l2_ctrl *rds_deviation;
0213         struct v4l2_ctrl *rds_pty;
0214         struct v4l2_ctrl *rds_compressed;
0215         struct v4l2_ctrl *rds_art_head;
0216         struct v4l2_ctrl *rds_stereo;
0217         struct v4l2_ctrl *rds_ta;
0218         struct v4l2_ctrl *rds_tp;
0219         struct v4l2_ctrl *rds_ms;
0220         struct v4l2_ctrl *rds_dyn_pty;
0221         struct v4l2_ctrl *rds_alt_freqs_enable;
0222         struct v4l2_ctrl *rds_alt_freqs;
0223         struct v4l2_ctrl *compression_enabled;
0224         struct v4l2_ctrl *compression_threshold;
0225         struct v4l2_ctrl *compression_gain;
0226         struct v4l2_ctrl *compression_attack_time;
0227         struct v4l2_ctrl *compression_release_time;
0228         struct v4l2_ctrl *pilot_tone_enabled;
0229         struct v4l2_ctrl *pilot_tone_freq;
0230         struct v4l2_ctrl *pilot_tone_deviation;
0231         struct v4l2_ctrl *limiter_enabled;
0232         struct v4l2_ctrl *limiter_deviation;
0233         struct v4l2_ctrl *limiter_release_time;
0234         struct v4l2_ctrl *tune_preemphasis;
0235         struct v4l2_ctrl *tune_pwr_level;
0236         struct v4l2_ctrl *tune_ant_cap;
0237     };
0238     struct completion work;
0239     struct regulator *vdd;
0240     struct regulator *vio;
0241     struct gpio_desc *gpio_reset;
0242     struct platform_device *pd;
0243     u32 power_state;
0244     u32 rds_enabled;
0245     u32 frequency;
0246     u32 preemphasis;
0247     u32 stereo;
0248     u32 tune_rnl;
0249 };
0250 
0251 struct radio_si4713_platform_data {
0252     struct i2c_client *subdev;
0253 };
0254 #endif /* ifndef SI4713_I2C_H */