2 * drivers/staging/media/radio-bcm2048.c
4 * Driver for I2C Broadcom BCM2048 FM Radio Receiver:
6 * Copyright (C) Nokia Corporation
7 * Contact: Eero Nurkkala <ext-eero.nurkkala@nokia.com>
9 * Copyright (C) Nils Faerber <nils.faerber@kernelconcepts.de>
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * version 2 as published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
28 * Eero Nurkkala <ext-eero.nurkkala@nokia.com>
30 * - Initial implementation
31 * 2010-02-21 Nils Faerber <nils.faerber@kernelconcepts.de>
33 * - Add support for interrupt driven rds data reading
36 #include <linux/kernel.h>
37 #include <linux/module.h>
38 #include <linux/init.h>
39 #include <linux/version.h>
40 #include <linux/interrupt.h>
41 #include <linux/sysfs.h>
42 #include <linux/completion.h>
43 #include <linux/delay.h>
44 #include <linux/i2c.h>
45 #include <linux/videodev2.h>
46 #include <linux/mutex.h>
47 #include <linux/slab.h>
48 #include <media/v4l2-common.h>
49 #include <media/v4l2-ioctl.h>
50 #include "radio-bcm2048.h"
52 /* driver definitions */
53 #define BCM2048_DRIVER_AUTHOR "Eero Nurkkala <ext-eero.nurkkala@nokia.com>"
54 #define BCM2048_DRIVER_NAME BCM2048_NAME
55 #define BCM2048_DRIVER_VERSION KERNEL_VERSION(0, 0, 1)
56 #define BCM2048_DRIVER_CARD "Broadcom bcm2048 FM Radio Receiver"
57 #define BCM2048_DRIVER_DESC "I2C driver for BCM2048 FM Radio Receiver"
59 /* I2C Control Registers */
60 #define BCM2048_I2C_FM_RDS_SYSTEM 0x00
61 #define BCM2048_I2C_FM_CTRL 0x01
62 #define BCM2048_I2C_RDS_CTRL0 0x02
63 #define BCM2048_I2C_RDS_CTRL1 0x03
64 #define BCM2048_I2C_FM_AUDIO_PAUSE 0x04
65 #define BCM2048_I2C_FM_AUDIO_CTRL0 0x05
66 #define BCM2048_I2C_FM_AUDIO_CTRL1 0x06
67 #define BCM2048_I2C_FM_SEARCH_CTRL0 0x07
68 #define BCM2048_I2C_FM_SEARCH_CTRL1 0x08
69 #define BCM2048_I2C_FM_SEARCH_TUNE_MODE 0x09
70 #define BCM2048_I2C_FM_FREQ0 0x0a
71 #define BCM2048_I2C_FM_FREQ1 0x0b
72 #define BCM2048_I2C_FM_AF_FREQ0 0x0c
73 #define BCM2048_I2C_FM_AF_FREQ1 0x0d
74 #define BCM2048_I2C_FM_CARRIER 0x0e
75 #define BCM2048_I2C_FM_RSSI 0x0f
76 #define BCM2048_I2C_FM_RDS_MASK0 0x10
77 #define BCM2048_I2C_FM_RDS_MASK1 0x11
78 #define BCM2048_I2C_FM_RDS_FLAG0 0x12
79 #define BCM2048_I2C_FM_RDS_FLAG1 0x13
80 #define BCM2048_I2C_RDS_WLINE 0x14
81 #define BCM2048_I2C_RDS_BLKB_MATCH0 0x16
82 #define BCM2048_I2C_RDS_BLKB_MATCH1 0x17
83 #define BCM2048_I2C_RDS_BLKB_MASK0 0x18
84 #define BCM2048_I2C_RDS_BLKB_MASK1 0x19
85 #define BCM2048_I2C_RDS_PI_MATCH0 0x1a
86 #define BCM2048_I2C_RDS_PI_MATCH1 0x1b
87 #define BCM2048_I2C_RDS_PI_MASK0 0x1c
88 #define BCM2048_I2C_RDS_PI_MASK1 0x1d
89 #define BCM2048_I2C_SPARE1 0x20
90 #define BCM2048_I2C_SPARE2 0x21
91 #define BCM2048_I2C_FM_RDS_REV 0x28
92 #define BCM2048_I2C_SLAVE_CONFIGURATION 0x29
93 #define BCM2048_I2C_RDS_DATA 0x80
94 #define BCM2048_I2C_FM_BEST_TUNE_MODE 0x90
96 /* BCM2048_I2C_FM_RDS_SYSTEM */
97 #define BCM2048_FM_ON 0x01
98 #define BCM2048_RDS_ON 0x02
100 /* BCM2048_I2C_FM_CTRL */
101 #define BCM2048_BAND_SELECT 0x01
102 #define BCM2048_STEREO_MONO_AUTO_SELECT 0x02
103 #define BCM2048_STEREO_MONO_MANUAL_SELECT 0x04
104 #define BCM2048_STEREO_MONO_BLEND_SWITCH 0x08
105 #define BCM2048_HI_LO_INJECTION 0x10
107 /* BCM2048_I2C_RDS_CTRL0 */
108 #define BCM2048_RBDS_RDS_SELECT 0x01
109 #define BCM2048_FLUSH_FIFO 0x02
111 /* BCM2048_I2C_FM_AUDIO_PAUSE */
112 #define BCM2048_AUDIO_PAUSE_RSSI_TRESH 0x0f
113 #define BCM2048_AUDIO_PAUSE_DURATION 0xf0
115 /* BCM2048_I2C_FM_AUDIO_CTRL0 */
116 #define BCM2048_RF_MUTE 0x01
117 #define BCM2048_MANUAL_MUTE 0x02
118 #define BCM2048_DAC_OUTPUT_LEFT 0x04
119 #define BCM2048_DAC_OUTPUT_RIGHT 0x08
120 #define BCM2048_AUDIO_ROUTE_DAC 0x10
121 #define BCM2048_AUDIO_ROUTE_I2S 0x20
122 #define BCM2048_DE_EMPHASIS_SELECT 0x40
123 #define BCM2048_AUDIO_BANDWIDTH_SELECT 0x80
125 /* BCM2048_I2C_FM_SEARCH_CTRL0 */
126 #define BCM2048_SEARCH_RSSI_THRESHOLD 0x7f
127 #define BCM2048_SEARCH_DIRECTION 0x80
129 /* BCM2048_I2C_FM_SEARCH_TUNE_MODE */
130 #define BCM2048_FM_AUTO_SEARCH 0x03
132 /* BCM2048_I2C_FM_RSSI */
133 #define BCM2048_RSSI_VALUE 0xff
135 /* BCM2048_I2C_FM_RDS_MASK0 */
136 /* BCM2048_I2C_FM_RDS_MASK1 */
137 #define BCM2048_FM_FLAG_SEARCH_TUNE_FINISHED 0x01
138 #define BCM2048_FM_FLAG_SEARCH_TUNE_FAIL 0x02
139 #define BCM2048_FM_FLAG_RSSI_LOW 0x04
140 #define BCM2048_FM_FLAG_CARRIER_ERROR_HIGH 0x08
141 #define BCM2048_FM_FLAG_AUDIO_PAUSE_INDICATION 0x10
142 #define BCM2048_FLAG_STEREO_DETECTED 0x20
143 #define BCM2048_FLAG_STEREO_ACTIVE 0x40
145 /* BCM2048_I2C_RDS_DATA */
146 #define BCM2048_SLAVE_ADDRESS 0x3f
147 #define BCM2048_SLAVE_ENABLE 0x80
149 /* BCM2048_I2C_FM_BEST_TUNE_MODE */
150 #define BCM2048_BEST_TUNE_MODE 0x80
152 #define BCM2048_FM_FLAG_SEARCH_TUNE_FINISHED 0x01
153 #define BCM2048_FM_FLAG_SEARCH_TUNE_FAIL 0x02
154 #define BCM2048_FM_FLAG_RSSI_LOW 0x04
155 #define BCM2048_FM_FLAG_CARRIER_ERROR_HIGH 0x08
156 #define BCM2048_FM_FLAG_AUDIO_PAUSE_INDICATION 0x10
157 #define BCM2048_FLAG_STEREO_DETECTED 0x20
158 #define BCM2048_FLAG_STEREO_ACTIVE 0x40
160 #define BCM2048_RDS_FLAG_FIFO_WLINE 0x02
161 #define BCM2048_RDS_FLAG_B_BLOCK_MATCH 0x08
162 #define BCM2048_RDS_FLAG_SYNC_LOST 0x10
163 #define BCM2048_RDS_FLAG_PI_MATCH 0x20
165 #define BCM2048_RDS_MARK_END_BYTE0 0x7C
166 #define BCM2048_RDS_MARK_END_BYTEN 0xFF
168 #define BCM2048_FM_FLAGS_ALL (FM_FLAG_SEARCH_TUNE_FINISHED | \
169 FM_FLAG_SEARCH_TUNE_FAIL | \
171 FM_FLAG_CARRIER_ERROR_HIGH | \
172 FM_FLAG_AUDIO_PAUSE_INDICATION | \
173 FLAG_STEREO_DETECTED | FLAG_STEREO_ACTIVE)
175 #define BCM2048_RDS_FLAGS_ALL (RDS_FLAG_FIFO_WLINE | \
176 RDS_FLAG_B_BLOCK_MATCH | \
177 RDS_FLAG_SYNC_LOST | RDS_FLAG_PI_MATCH)
179 #define BCM2048_DEFAULT_TIMEOUT 1500
180 #define BCM2048_AUTO_SEARCH_TIMEOUT 3000
183 #define BCM2048_FREQDEV_UNIT 10000
184 #define BCM2048_FREQV4L2_MULTI 625
185 #define dev_to_v4l2(f) ((f * BCM2048_FREQDEV_UNIT) / BCM2048_FREQV4L2_MULTI)
186 #define v4l2_to_dev(f) ((f * BCM2048_FREQV4L2_MULTI) / BCM2048_FREQDEV_UNIT)
188 #define msb(x) ((u8)((u16) x >> 8))
189 #define lsb(x) ((u8)((u16) x & 0x00FF))
190 #define compose_u16(msb, lsb) (((u16)msb << 8) | lsb)
192 #define BCM2048_DEFAULT_POWERING_DELAY 20
193 #define BCM2048_DEFAULT_REGION 0x02
194 #define BCM2048_DEFAULT_MUTE 0x01
195 #define BCM2048_DEFAULT_RSSI_THRESHOLD 0x64
196 #define BCM2048_DEFAULT_RDS_WLINE 0x7E
198 #define BCM2048_FM_SEARCH_INACTIVE 0x00
199 #define BCM2048_FM_PRE_SET_MODE 0x01
200 #define BCM2048_FM_AUTO_SEARCH_MODE 0x02
201 #define BCM2048_FM_AF_JUMP_MODE 0x03
203 #define BCM2048_FREQUENCY_BASE 64000
205 #define BCM2048_POWER_ON 0x01
206 #define BCM2048_POWER_OFF 0x00
208 #define BCM2048_ITEM_ENABLED 0x01
209 #define BCM2048_SEARCH_DIRECTION_UP 0x01
211 #define BCM2048_DE_EMPHASIS_75us 75
212 #define BCM2048_DE_EMPHASIS_50us 50
214 #define BCM2048_SCAN_FAIL 0x00
215 #define BCM2048_SCAN_OK 0x01
217 #define BCM2048_FREQ_ERROR_FLOOR -20
218 #define BCM2048_FREQ_ERROR_ROOF 20
220 /* -60 dB is reported as full signal strenght */
221 #define BCM2048_RSSI_LEVEL_BASE -60
222 #define BCM2048_RSSI_LEVEL_ROOF -100
223 #define BCM2048_RSSI_LEVEL_ROOF_NEG 100
224 #define BCM2048_SIGNAL_MULTIPLIER (0xFFFF / \
225 (BCM2048_RSSI_LEVEL_ROOF_NEG + \
226 BCM2048_RSSI_LEVEL_BASE))
228 #define BCM2048_RDS_FIFO_DUPLE_SIZE 0x03
229 #define BCM2048_RDS_CRC_MASK 0x0F
230 #define BCM2048_RDS_CRC_NONE 0x00
231 #define BCM2048_RDS_CRC_MAX_2BITS 0x04
232 #define BCM2048_RDS_CRC_LEAST_2BITS 0x08
233 #define BCM2048_RDS_CRC_UNRECOVARABLE 0x0C
235 #define BCM2048_RDS_BLOCK_MASK 0xF0
236 #define BCM2048_RDS_BLOCK_A 0x00
237 #define BCM2048_RDS_BLOCK_B 0x10
238 #define BCM2048_RDS_BLOCK_C 0x20
239 #define BCM2048_RDS_BLOCK_D 0x30
240 #define BCM2048_RDS_BLOCK_C_SCORED 0x40
241 #define BCM2048_RDS_BLOCK_E 0x60
243 #define BCM2048_RDS_RT 0x20
244 #define BCM2048_RDS_PS 0x00
246 #define BCM2048_RDS_GROUP_AB_MASK 0x08
247 #define BCM2048_RDS_GROUP_A 0x00
248 #define BCM2048_RDS_GROUP_B 0x08
250 #define BCM2048_RDS_RT_AB_MASK 0x10
251 #define BCM2048_RDS_RT_A 0x00
252 #define BCM2048_RDS_RT_B 0x10
253 #define BCM2048_RDS_RT_INDEX 0x0F
255 #define BCM2048_RDS_PS_INDEX 0x03
259 #define BCM2048_MAX_RDS_RT (64 + 1)
260 u8 rds_rt
[BCM2048_MAX_RDS_RT
];
263 #define BCM2048_MAX_RDS_PS (8 + 1)
264 u8 rds_ps
[BCM2048_MAX_RDS_PS
];
267 #define BCM2048_MAX_RDS_RADIO_TEXT 255
268 u8 radio_text
[BCM2048_MAX_RDS_RADIO_TEXT
+ 3];
273 u32 bottom_frequency
;
280 struct bcm2048_device
{
281 struct i2c_client
*client
;
282 struct video_device
*videodev
;
283 struct work_struct work
;
284 struct completion
compl;
286 struct bcm2048_platform_data
*platform_data
;
287 struct rds_info rds_info
;
288 struct region_info region_info
;
290 u8 cache_fm_rds_system
;
292 u8 cache_fm_audio_ctrl0
;
293 u8 cache_fm_search_ctrl0
;
300 /* for rds data device read */
301 wait_queue_head_t read_queue
;
303 unsigned char rds_data_available
;
304 unsigned int rd_index
;
307 static int radio_nr
= -1; /* radio device minor (-1 ==> auto assign) */
308 module_param(radio_nr
, int, 0);
309 MODULE_PARM_DESC(radio_nr
,
310 "Minor number for radio device (-1 ==> auto assign)");
312 static struct region_info region_configs
[] = {
315 .channel_spacing
= 20,
316 .bottom_frequency
= 87500,
317 .top_frequency
= 108000,
323 .channel_spacing
= 20,
324 .bottom_frequency
= 87500,
325 .top_frequency
= 108000,
331 .channel_spacing
= 10,
332 .bottom_frequency
= 87500,
333 .top_frequency
= 108000,
339 .channel_spacing
= 10,
340 .bottom_frequency
= 76000,
341 .top_frequency
= 90000,
345 /* Japan wide band */
347 .channel_spacing
= 10,
348 .bottom_frequency
= 76000,
349 .top_frequency
= 108000,
356 * I2C Interface read / write
358 static int bcm2048_send_command(struct bcm2048_device
*bdev
, unsigned int reg
,
361 struct i2c_client
*client
= bdev
->client
;
364 if (!bdev
->power_state
) {
365 dev_err(&bdev
->client
->dev
, "bcm2048: chip not powered!\n");
369 data
[0] = reg
& 0xff;
370 data
[1] = value
& 0xff;
372 if (i2c_master_send(client
, data
, 2) == 2) {
375 dev_err(&bdev
->client
->dev
, "BCM I2C error!\n");
376 dev_err(&bdev
->client
->dev
, "Is Bluetooth up and running?\n");
381 static int bcm2048_recv_command(struct bcm2048_device
*bdev
, unsigned int reg
,
384 struct i2c_client
*client
= bdev
->client
;
386 if (!bdev
->power_state
) {
387 dev_err(&bdev
->client
->dev
, "bcm2048: chip not powered!\n");
391 value
[0] = i2c_smbus_read_byte_data(client
, reg
& 0xff);
396 static int bcm2048_recv_duples(struct bcm2048_device
*bdev
, unsigned int reg
,
397 u8
*value
, u8 duples
)
399 struct i2c_client
*client
= bdev
->client
;
400 struct i2c_adapter
*adap
= client
->adapter
;
401 struct i2c_msg msg
[2];
404 if (!bdev
->power_state
) {
405 dev_err(&bdev
->client
->dev
, "bcm2048: chip not powered!\n");
411 msg
[0].addr
= client
->addr
;
412 msg
[0].flags
= client
->flags
& I2C_M_TEN
;
416 msg
[1].addr
= client
->addr
;
417 msg
[1].flags
= client
->flags
& I2C_M_TEN
;
418 msg
[1].flags
|= I2C_M_RD
;
422 return i2c_transfer(adap
, msg
, 2);
426 * BCM2048 - I2C register programming helpers
428 static int bcm2048_set_power_state(struct bcm2048_device
*bdev
, u8 power
)
432 mutex_lock(&bdev
->mutex
);
435 bdev
->power_state
= BCM2048_POWER_ON
;
436 bdev
->cache_fm_rds_system
|= BCM2048_FM_ON
;
438 bdev
->cache_fm_rds_system
&= ~BCM2048_FM_ON
;
442 * Warning! FM cannot be turned off because then
443 * the I2C communications get ruined!
444 * Comment off the "if (power)" when the chip works!
447 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_RDS_SYSTEM
,
448 bdev
->cache_fm_rds_system
);
449 msleep(BCM2048_DEFAULT_POWERING_DELAY
);
452 bdev
->power_state
= BCM2048_POWER_OFF
;
454 mutex_unlock(&bdev
->mutex
);
458 static int bcm2048_get_power_state(struct bcm2048_device
*bdev
)
463 mutex_lock(&bdev
->mutex
);
465 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_RDS_SYSTEM
, &value
);
467 mutex_unlock(&bdev
->mutex
);
469 if (!err
&& (value
& BCM2048_FM_ON
))
470 return BCM2048_POWER_ON
;
475 static int bcm2048_set_rds_no_lock(struct bcm2048_device
*bdev
, u8 rds_on
)
480 bdev
->cache_fm_rds_system
&= ~BCM2048_RDS_ON
;
483 bdev
->cache_fm_rds_system
|= BCM2048_RDS_ON
;
484 bdev
->rds_state
= BCM2048_RDS_ON
;
485 flags
= BCM2048_RDS_FLAG_FIFO_WLINE
;
486 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_RDS_MASK1
,
491 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_RDS_MASK1
,
493 memset(&bdev
->rds_info
, 0, sizeof(bdev
->rds_info
));
496 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_RDS_SYSTEM
,
497 bdev
->cache_fm_rds_system
);
502 static int bcm2048_get_rds_no_lock(struct bcm2048_device
*bdev
)
507 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_RDS_SYSTEM
, &value
);
509 if (!err
&& (value
& BCM2048_RDS_ON
))
510 return BCM2048_ITEM_ENABLED
;
515 static int bcm2048_set_rds(struct bcm2048_device
*bdev
, u8 rds_on
)
519 mutex_lock(&bdev
->mutex
);
521 err
= bcm2048_set_rds_no_lock(bdev
, rds_on
);
523 mutex_unlock(&bdev
->mutex
);
527 static int bcm2048_get_rds(struct bcm2048_device
*bdev
)
531 mutex_lock(&bdev
->mutex
);
533 err
= bcm2048_get_rds_no_lock(bdev
);
535 mutex_unlock(&bdev
->mutex
);
539 static int bcm2048_get_rds_pi(struct bcm2048_device
*bdev
)
541 return bdev
->rds_info
.rds_pi
;
544 static int bcm2048_set_fm_automatic_stereo_mono(struct bcm2048_device
*bdev
,
549 mutex_lock(&bdev
->mutex
);
551 bdev
->cache_fm_ctrl
&= ~BCM2048_STEREO_MONO_AUTO_SELECT
;
554 bdev
->cache_fm_ctrl
|= BCM2048_STEREO_MONO_AUTO_SELECT
;
556 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_CTRL
,
557 bdev
->cache_fm_ctrl
);
559 mutex_unlock(&bdev
->mutex
);
563 static int bcm2048_set_fm_hi_lo_injection(struct bcm2048_device
*bdev
,
568 mutex_lock(&bdev
->mutex
);
570 bdev
->cache_fm_ctrl
&= ~BCM2048_HI_LO_INJECTION
;
573 bdev
->cache_fm_ctrl
|= BCM2048_HI_LO_INJECTION
;
575 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_CTRL
,
576 bdev
->cache_fm_ctrl
);
578 mutex_unlock(&bdev
->mutex
);
582 static int bcm2048_get_fm_hi_lo_injection(struct bcm2048_device
*bdev
)
587 mutex_lock(&bdev
->mutex
);
589 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_CTRL
, &value
);
591 mutex_unlock(&bdev
->mutex
);
593 if (!err
&& (value
& BCM2048_HI_LO_INJECTION
))
594 return BCM2048_ITEM_ENABLED
;
599 static int bcm2048_set_fm_frequency(struct bcm2048_device
*bdev
, u32 frequency
)
603 if (frequency
< bdev
->region_info
.bottom_frequency
||
604 frequency
> bdev
->region_info
.top_frequency
)
607 frequency
-= BCM2048_FREQUENCY_BASE
;
609 mutex_lock(&bdev
->mutex
);
611 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_FREQ0
, lsb(frequency
));
612 err
|= bcm2048_send_command(bdev
, BCM2048_I2C_FM_FREQ1
,
616 bdev
->frequency
= frequency
;
618 mutex_unlock(&bdev
->mutex
);
622 static int bcm2048_get_fm_frequency(struct bcm2048_device
*bdev
)
627 mutex_lock(&bdev
->mutex
);
629 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_FREQ0
, &lsb
);
630 err
|= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_FREQ1
, &msb
);
632 mutex_unlock(&bdev
->mutex
);
637 err
= compose_u16(msb
, lsb
);
638 err
+= BCM2048_FREQUENCY_BASE
;
643 static int bcm2048_set_fm_af_frequency(struct bcm2048_device
*bdev
,
648 if (frequency
< bdev
->region_info
.bottom_frequency
||
649 frequency
> bdev
->region_info
.top_frequency
)
652 frequency
-= BCM2048_FREQUENCY_BASE
;
654 mutex_lock(&bdev
->mutex
);
656 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_AF_FREQ0
,
658 err
|= bcm2048_send_command(bdev
, BCM2048_I2C_FM_AF_FREQ1
,
661 bdev
->frequency
= frequency
;
663 mutex_unlock(&bdev
->mutex
);
667 static int bcm2048_get_fm_af_frequency(struct bcm2048_device
*bdev
)
672 mutex_lock(&bdev
->mutex
);
674 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_AF_FREQ0
, &lsb
);
675 err
|= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_AF_FREQ1
, &msb
);
677 mutex_unlock(&bdev
->mutex
);
682 err
= compose_u16(msb
, lsb
);
683 err
+= BCM2048_FREQUENCY_BASE
;
688 static int bcm2048_set_fm_deemphasis(struct bcm2048_device
*bdev
, int d
)
693 if (d
== BCM2048_DE_EMPHASIS_75us
)
694 deemphasis
= BCM2048_DE_EMPHASIS_SELECT
;
698 mutex_lock(&bdev
->mutex
);
700 bdev
->cache_fm_audio_ctrl0
&= ~BCM2048_DE_EMPHASIS_SELECT
;
701 bdev
->cache_fm_audio_ctrl0
|= deemphasis
;
703 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_AUDIO_CTRL0
,
704 bdev
->cache_fm_audio_ctrl0
);
707 bdev
->region_info
.deemphasis
= d
;
709 mutex_unlock(&bdev
->mutex
);
714 static int bcm2048_get_fm_deemphasis(struct bcm2048_device
*bdev
)
719 mutex_lock(&bdev
->mutex
);
721 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_AUDIO_CTRL0
, &value
);
723 mutex_unlock(&bdev
->mutex
);
726 if (value
& BCM2048_DE_EMPHASIS_SELECT
)
727 return BCM2048_DE_EMPHASIS_75us
;
729 return BCM2048_DE_EMPHASIS_50us
;
735 static int bcm2048_set_region(struct bcm2048_device
*bdev
, u8 region
)
738 u32 new_frequency
= 0;
740 if (region
> ARRAY_SIZE(region_configs
))
743 mutex_lock(&bdev
->mutex
);
744 bdev
->region_info
= region_configs
[region
];
745 mutex_unlock(&bdev
->mutex
);
747 if (bdev
->frequency
< region_configs
[region
].bottom_frequency
||
748 bdev
->frequency
> region_configs
[region
].top_frequency
)
749 new_frequency
= region_configs
[region
].bottom_frequency
;
751 if (new_frequency
> 0) {
752 err
= bcm2048_set_fm_frequency(bdev
, new_frequency
);
758 err
= bcm2048_set_fm_deemphasis(bdev
,
759 region_configs
[region
].deemphasis
);
765 static int bcm2048_get_region(struct bcm2048_device
*bdev
)
769 mutex_lock(&bdev
->mutex
);
770 err
= bdev
->region_info
.region
;
771 mutex_unlock(&bdev
->mutex
);
776 static int bcm2048_set_mute(struct bcm2048_device
*bdev
, u16 mute
)
780 mutex_lock(&bdev
->mutex
);
782 bdev
->cache_fm_audio_ctrl0
&= ~(BCM2048_RF_MUTE
| BCM2048_MANUAL_MUTE
);
785 bdev
->cache_fm_audio_ctrl0
|= (BCM2048_RF_MUTE
|
786 BCM2048_MANUAL_MUTE
);
788 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_AUDIO_CTRL0
,
789 bdev
->cache_fm_audio_ctrl0
);
792 bdev
->mute_state
= mute
;
794 mutex_unlock(&bdev
->mutex
);
798 static int bcm2048_get_mute(struct bcm2048_device
*bdev
)
803 mutex_lock(&bdev
->mutex
);
805 if (bdev
->power_state
) {
806 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_AUDIO_CTRL0
,
809 err
= value
& (BCM2048_RF_MUTE
| BCM2048_MANUAL_MUTE
);
811 err
= bdev
->mute_state
;
814 mutex_unlock(&bdev
->mutex
);
818 static int bcm2048_set_audio_route(struct bcm2048_device
*bdev
, u8 route
)
822 mutex_lock(&bdev
->mutex
);
824 route
&= (BCM2048_AUDIO_ROUTE_DAC
| BCM2048_AUDIO_ROUTE_I2S
);
825 bdev
->cache_fm_audio_ctrl0
&= ~(BCM2048_AUDIO_ROUTE_DAC
|
826 BCM2048_AUDIO_ROUTE_I2S
);
827 bdev
->cache_fm_audio_ctrl0
|= route
;
829 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_AUDIO_CTRL0
,
830 bdev
->cache_fm_audio_ctrl0
);
832 mutex_unlock(&bdev
->mutex
);
836 static int bcm2048_get_audio_route(struct bcm2048_device
*bdev
)
841 mutex_lock(&bdev
->mutex
);
843 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_AUDIO_CTRL0
, &value
);
845 mutex_unlock(&bdev
->mutex
);
848 return value
& (BCM2048_AUDIO_ROUTE_DAC
|
849 BCM2048_AUDIO_ROUTE_I2S
);
854 static int bcm2048_set_dac_output(struct bcm2048_device
*bdev
, u8 channels
)
858 mutex_lock(&bdev
->mutex
);
860 bdev
->cache_fm_audio_ctrl0
&= ~(BCM2048_DAC_OUTPUT_LEFT
|
861 BCM2048_DAC_OUTPUT_RIGHT
);
862 bdev
->cache_fm_audio_ctrl0
|= channels
;
864 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_AUDIO_CTRL0
,
865 bdev
->cache_fm_audio_ctrl0
);
867 mutex_unlock(&bdev
->mutex
);
871 static int bcm2048_get_dac_output(struct bcm2048_device
*bdev
)
876 mutex_lock(&bdev
->mutex
);
878 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_AUDIO_CTRL0
, &value
);
880 mutex_unlock(&bdev
->mutex
);
883 return value
& (BCM2048_DAC_OUTPUT_LEFT
|
884 BCM2048_DAC_OUTPUT_RIGHT
);
889 static int bcm2048_set_fm_search_rssi_threshold(struct bcm2048_device
*bdev
,
894 mutex_lock(&bdev
->mutex
);
896 threshold
&= BCM2048_SEARCH_RSSI_THRESHOLD
;
897 bdev
->cache_fm_search_ctrl0
&= ~BCM2048_SEARCH_RSSI_THRESHOLD
;
898 bdev
->cache_fm_search_ctrl0
|= threshold
;
900 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_SEARCH_CTRL0
,
901 bdev
->cache_fm_search_ctrl0
);
903 mutex_unlock(&bdev
->mutex
);
907 static int bcm2048_get_fm_search_rssi_threshold(struct bcm2048_device
*bdev
)
912 mutex_lock(&bdev
->mutex
);
914 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_SEARCH_CTRL0
, &value
);
916 mutex_unlock(&bdev
->mutex
);
919 return value
& BCM2048_SEARCH_RSSI_THRESHOLD
;
924 static int bcm2048_set_fm_search_mode_direction(struct bcm2048_device
*bdev
,
929 mutex_lock(&bdev
->mutex
);
931 bdev
->cache_fm_search_ctrl0
&= ~BCM2048_SEARCH_DIRECTION
;
934 bdev
->cache_fm_search_ctrl0
|= BCM2048_SEARCH_DIRECTION
;
936 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_SEARCH_CTRL0
,
937 bdev
->cache_fm_search_ctrl0
);
939 mutex_unlock(&bdev
->mutex
);
943 static int bcm2048_get_fm_search_mode_direction(struct bcm2048_device
*bdev
)
948 mutex_lock(&bdev
->mutex
);
950 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_SEARCH_CTRL0
, &value
);
952 mutex_unlock(&bdev
->mutex
);
954 if (!err
&& (value
& BCM2048_SEARCH_DIRECTION
))
955 return BCM2048_SEARCH_DIRECTION_UP
;
960 static int bcm2048_set_fm_search_tune_mode(struct bcm2048_device
*bdev
,
963 int err
, timeout
, restart_rds
= 0;
966 value
= mode
& BCM2048_FM_AUTO_SEARCH
;
968 flags
= BCM2048_FM_FLAG_SEARCH_TUNE_FINISHED
|
969 BCM2048_FM_FLAG_SEARCH_TUNE_FAIL
;
971 mutex_lock(&bdev
->mutex
);
974 * If RDS is enabled, and frequency is changed, RDS quits working.
975 * Thus, always restart RDS if it's enabled. Moreover, RDS must
976 * not be enabled while changing the frequency because it can
977 * provide a race to the mutex from the workqueue handler if RDS
978 * IRQ occurs while waiting for frequency changed IRQ.
980 if (bcm2048_get_rds_no_lock(bdev
)) {
981 err
= bcm2048_set_rds_no_lock(bdev
, 0);
987 err
= bcm2048_send_command(bdev
, BCM2048_I2C_FM_RDS_MASK0
, flags
);
992 bcm2048_send_command(bdev
, BCM2048_I2C_FM_SEARCH_TUNE_MODE
, value
);
994 if (mode
!= BCM2048_FM_AUTO_SEARCH_MODE
)
995 timeout
= BCM2048_DEFAULT_TIMEOUT
;
997 timeout
= BCM2048_AUTO_SEARCH_TIMEOUT
;
999 if (!wait_for_completion_timeout(&bdev
->compl,
1000 msecs_to_jiffies(timeout
)))
1001 dev_err(&bdev
->client
->dev
, "IRQ timeout.\n");
1004 if (!bdev
->scan_state
)
1009 err
|= bcm2048_set_rds_no_lock(bdev
, 1);
1011 mutex_unlock(&bdev
->mutex
);
1016 static int bcm2048_get_fm_search_tune_mode(struct bcm2048_device
*bdev
)
1021 mutex_lock(&bdev
->mutex
);
1023 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_SEARCH_TUNE_MODE
,
1026 mutex_unlock(&bdev
->mutex
);
1029 return value
& BCM2048_FM_AUTO_SEARCH
;
1034 static int bcm2048_set_rds_b_block_mask(struct bcm2048_device
*bdev
, u16 mask
)
1038 mutex_lock(&bdev
->mutex
);
1040 err
= bcm2048_send_command(bdev
,
1041 BCM2048_I2C_RDS_BLKB_MASK0
, lsb(mask
));
1042 err
|= bcm2048_send_command(bdev
,
1043 BCM2048_I2C_RDS_BLKB_MASK1
, msb(mask
));
1045 mutex_unlock(&bdev
->mutex
);
1049 static int bcm2048_get_rds_b_block_mask(struct bcm2048_device
*bdev
)
1054 mutex_lock(&bdev
->mutex
);
1056 err
= bcm2048_recv_command(bdev
,
1057 BCM2048_I2C_RDS_BLKB_MASK0
, &lsb
);
1058 err
|= bcm2048_recv_command(bdev
,
1059 BCM2048_I2C_RDS_BLKB_MASK1
, &msb
);
1061 mutex_unlock(&bdev
->mutex
);
1064 return compose_u16(msb
, lsb
);
1069 static int bcm2048_set_rds_b_block_match(struct bcm2048_device
*bdev
,
1074 mutex_lock(&bdev
->mutex
);
1076 err
= bcm2048_send_command(bdev
,
1077 BCM2048_I2C_RDS_BLKB_MATCH0
, lsb(match
));
1078 err
|= bcm2048_send_command(bdev
,
1079 BCM2048_I2C_RDS_BLKB_MATCH1
, msb(match
));
1081 mutex_unlock(&bdev
->mutex
);
1085 static int bcm2048_get_rds_b_block_match(struct bcm2048_device
*bdev
)
1090 mutex_lock(&bdev
->mutex
);
1092 err
= bcm2048_recv_command(bdev
,
1093 BCM2048_I2C_RDS_BLKB_MATCH0
, &lsb
);
1094 err
|= bcm2048_recv_command(bdev
,
1095 BCM2048_I2C_RDS_BLKB_MATCH1
, &msb
);
1097 mutex_unlock(&bdev
->mutex
);
1100 return compose_u16(msb
, lsb
);
1105 static int bcm2048_set_rds_pi_mask(struct bcm2048_device
*bdev
, u16 mask
)
1109 mutex_lock(&bdev
->mutex
);
1111 err
= bcm2048_send_command(bdev
,
1112 BCM2048_I2C_RDS_PI_MASK0
, lsb(mask
));
1113 err
|= bcm2048_send_command(bdev
,
1114 BCM2048_I2C_RDS_PI_MASK1
, msb(mask
));
1116 mutex_unlock(&bdev
->mutex
);
1120 static int bcm2048_get_rds_pi_mask(struct bcm2048_device
*bdev
)
1125 mutex_lock(&bdev
->mutex
);
1127 err
= bcm2048_recv_command(bdev
,
1128 BCM2048_I2C_RDS_PI_MASK0
, &lsb
);
1129 err
|= bcm2048_recv_command(bdev
,
1130 BCM2048_I2C_RDS_PI_MASK1
, &msb
);
1132 mutex_unlock(&bdev
->mutex
);
1135 return compose_u16(msb
, lsb
);
1140 static int bcm2048_set_rds_pi_match(struct bcm2048_device
*bdev
, u16 match
)
1144 mutex_lock(&bdev
->mutex
);
1146 err
= bcm2048_send_command(bdev
,
1147 BCM2048_I2C_RDS_PI_MATCH0
, lsb(match
));
1148 err
|= bcm2048_send_command(bdev
,
1149 BCM2048_I2C_RDS_PI_MATCH1
, msb(match
));
1151 mutex_unlock(&bdev
->mutex
);
1155 static int bcm2048_get_rds_pi_match(struct bcm2048_device
*bdev
)
1160 mutex_lock(&bdev
->mutex
);
1162 err
= bcm2048_recv_command(bdev
,
1163 BCM2048_I2C_RDS_PI_MATCH0
, &lsb
);
1164 err
|= bcm2048_recv_command(bdev
,
1165 BCM2048_I2C_RDS_PI_MATCH1
, &msb
);
1167 mutex_unlock(&bdev
->mutex
);
1170 return compose_u16(msb
, lsb
);
1175 static int bcm2048_set_fm_rds_mask(struct bcm2048_device
*bdev
, u16 mask
)
1179 mutex_lock(&bdev
->mutex
);
1181 err
= bcm2048_send_command(bdev
,
1182 BCM2048_I2C_FM_RDS_MASK0
, lsb(mask
));
1183 err
|= bcm2048_send_command(bdev
,
1184 BCM2048_I2C_FM_RDS_MASK1
, msb(mask
));
1186 mutex_unlock(&bdev
->mutex
);
1190 static int bcm2048_get_fm_rds_mask(struct bcm2048_device
*bdev
)
1195 mutex_lock(&bdev
->mutex
);
1197 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_RDS_MASK0
, &value0
);
1198 err
|= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_RDS_MASK1
, &value1
);
1200 mutex_unlock(&bdev
->mutex
);
1203 return compose_u16(value1
, value0
);
1208 static int bcm2048_get_fm_rds_flags(struct bcm2048_device
*bdev
)
1213 mutex_lock(&bdev
->mutex
);
1215 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_RDS_FLAG0
, &value0
);
1216 err
|= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_RDS_FLAG1
, &value1
);
1218 mutex_unlock(&bdev
->mutex
);
1221 return compose_u16(value1
, value0
);
1226 static int bcm2048_get_region_bottom_frequency(struct bcm2048_device
*bdev
)
1228 return bdev
->region_info
.bottom_frequency
;
1231 static int bcm2048_get_region_top_frequency(struct bcm2048_device
*bdev
)
1233 return bdev
->region_info
.top_frequency
;
1236 static int bcm2048_set_fm_best_tune_mode(struct bcm2048_device
*bdev
, u8 mode
)
1241 mutex_lock(&bdev
->mutex
);
1243 /* Perform read as the manual indicates */
1244 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_BEST_TUNE_MODE
,
1246 value
&= ~BCM2048_BEST_TUNE_MODE
;
1249 value
|= BCM2048_BEST_TUNE_MODE
;
1250 err
|= bcm2048_send_command(bdev
, BCM2048_I2C_FM_BEST_TUNE_MODE
,
1253 mutex_unlock(&bdev
->mutex
);
1257 static int bcm2048_get_fm_best_tune_mode(struct bcm2048_device
*bdev
)
1262 mutex_lock(&bdev
->mutex
);
1264 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_BEST_TUNE_MODE
,
1267 mutex_unlock(&bdev
->mutex
);
1269 if (!err
&& (value
& BCM2048_BEST_TUNE_MODE
))
1270 return BCM2048_ITEM_ENABLED
;
1275 static int bcm2048_get_fm_carrier_error(struct bcm2048_device
*bdev
)
1280 mutex_lock(&bdev
->mutex
);
1281 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_CARRIER
, &value
);
1282 mutex_unlock(&bdev
->mutex
);
1290 static int bcm2048_get_fm_rssi(struct bcm2048_device
*bdev
)
1295 mutex_lock(&bdev
->mutex
);
1296 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_RSSI
, &value
);
1297 mutex_unlock(&bdev
->mutex
);
1305 static int bcm2048_set_rds_wline(struct bcm2048_device
*bdev
, u8 wline
)
1309 mutex_lock(&bdev
->mutex
);
1311 err
= bcm2048_send_command(bdev
, BCM2048_I2C_RDS_WLINE
, wline
);
1314 bdev
->fifo_size
= wline
;
1316 mutex_unlock(&bdev
->mutex
);
1320 static int bcm2048_get_rds_wline(struct bcm2048_device
*bdev
)
1325 mutex_lock(&bdev
->mutex
);
1327 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_RDS_WLINE
, &value
);
1329 mutex_unlock(&bdev
->mutex
);
1332 bdev
->fifo_size
= value
;
1339 static int bcm2048_checkrev(struct bcm2048_device
*bdev
)
1344 mutex_lock(&bdev
->mutex
);
1346 err
= bcm2048_recv_command(bdev
, BCM2048_I2C_FM_RDS_REV
, &version
);
1348 mutex_unlock(&bdev
->mutex
);
1351 dev_info(&bdev
->client
->dev
, "BCM2048 Version 0x%x\n",
1359 static int bcm2048_get_rds_rt(struct bcm2048_device
*bdev
, char *data
)
1361 int err
= 0, i
, j
= 0, ce
= 0, cr
= 0;
1362 char data_buffer
[BCM2048_MAX_RDS_RT
+1];
1364 mutex_lock(&bdev
->mutex
);
1366 if (!bdev
->rds_info
.text_len
) {
1371 for (i
= 0; i
< BCM2048_MAX_RDS_RT
; i
++) {
1372 if (bdev
->rds_info
.rds_rt
[i
]) {
1374 /* Skip the carriage return */
1375 if (bdev
->rds_info
.rds_rt
[i
] != 0x0d) {
1376 data_buffer
[j
++] = bdev
->rds_info
.rds_rt
[i
];
1384 if (j
<= BCM2048_MAX_RDS_RT
)
1387 for (i
= 0; i
< BCM2048_MAX_RDS_RT
; i
++) {
1388 if (!bdev
->rds_info
.rds_rt
[i
]) {
1389 if (cr
&& (i
< cr
)) {
1394 if (cr
&& (i
>= cr
))
1402 memcpy(data
, data_buffer
, sizeof(data_buffer
));
1405 mutex_unlock(&bdev
->mutex
);
1409 static int bcm2048_get_rds_ps(struct bcm2048_device
*bdev
, char *data
)
1411 int err
= 0, i
, j
= 0;
1412 char data_buffer
[BCM2048_MAX_RDS_PS
+1];
1414 mutex_lock(&bdev
->mutex
);
1416 if (!bdev
->rds_info
.text_len
) {
1421 for (i
= 0; i
< BCM2048_MAX_RDS_PS
; i
++) {
1422 if (bdev
->rds_info
.rds_ps
[i
]) {
1423 data_buffer
[j
++] = bdev
->rds_info
.rds_ps
[i
];
1425 if (i
< (BCM2048_MAX_RDS_PS
- 1)) {
1432 if (j
<= BCM2048_MAX_RDS_PS
)
1435 memcpy(data
, data_buffer
, sizeof(data_buffer
));
1438 mutex_unlock(&bdev
->mutex
);
1442 static void bcm2048_parse_rds_pi(struct bcm2048_device
*bdev
)
1447 for (i
= 0; i
< bdev
->fifo_size
; i
+= BCM2048_RDS_FIFO_DUPLE_SIZE
) {
1449 /* Block A match, only data without crc errors taken */
1450 if (bdev
->rds_info
.radio_text
[i
] == BCM2048_RDS_BLOCK_A
) {
1452 pi
= ((bdev
->rds_info
.radio_text
[i
+1] << 8) +
1453 bdev
->rds_info
.radio_text
[i
+2]);
1455 if (!bdev
->rds_info
.rds_pi
) {
1456 bdev
->rds_info
.rds_pi
= pi
;
1459 if (pi
!= bdev
->rds_info
.rds_pi
) {
1462 bdev
->rds_info
.rds_pi
= pi
;
1472 static int bcm2048_rds_block_crc(struct bcm2048_device
*bdev
, int i
)
1474 return bdev
->rds_info
.radio_text
[i
] & BCM2048_RDS_CRC_MASK
;
1477 static void bcm2048_parse_rds_rt_block(struct bcm2048_device
*bdev
, int i
,
1480 /* Good data will overwrite poor data */
1482 if (!bdev
->rds_info
.rds_rt
[index
])
1483 bdev
->rds_info
.rds_rt
[index
] =
1484 bdev
->rds_info
.radio_text
[i
+1];
1485 if (!bdev
->rds_info
.rds_rt
[index
+1])
1486 bdev
->rds_info
.rds_rt
[index
+1] =
1487 bdev
->rds_info
.radio_text
[i
+2];
1489 bdev
->rds_info
.rds_rt
[index
] = bdev
->rds_info
.radio_text
[i
+1];
1490 bdev
->rds_info
.rds_rt
[index
+1] =
1491 bdev
->rds_info
.radio_text
[i
+2];
1495 static int bcm2048_parse_rt_match_b(struct bcm2048_device
*bdev
, int i
)
1497 int crc
, rt_id
, rt_group_b
, rt_ab
, index
= 0;
1499 crc
= bcm2048_rds_block_crc(bdev
, i
);
1501 if (crc
== BCM2048_RDS_CRC_UNRECOVARABLE
)
1504 if ((bdev
->rds_info
.radio_text
[i
] & BCM2048_RDS_BLOCK_MASK
) ==
1505 BCM2048_RDS_BLOCK_B
) {
1507 rt_id
= (bdev
->rds_info
.radio_text
[i
+1] &
1508 BCM2048_RDS_BLOCK_MASK
);
1509 rt_group_b
= bdev
->rds_info
.radio_text
[i
+1] &
1510 BCM2048_RDS_GROUP_AB_MASK
;
1511 rt_ab
= bdev
->rds_info
.radio_text
[i
+2] &
1512 BCM2048_RDS_RT_AB_MASK
;
1514 if (rt_group_b
!= bdev
->rds_info
.rds_rt_group_b
) {
1515 memset(bdev
->rds_info
.rds_rt
, 0,
1516 sizeof(bdev
->rds_info
.rds_rt
));
1517 bdev
->rds_info
.rds_rt_group_b
= rt_group_b
;
1520 if (rt_id
== BCM2048_RDS_RT
) {
1521 /* A to B or (vice versa), means: clear screen */
1522 if (rt_ab
!= bdev
->rds_info
.rds_rt_ab
) {
1523 memset(bdev
->rds_info
.rds_rt
, 0,
1524 sizeof(bdev
->rds_info
.rds_rt
));
1525 bdev
->rds_info
.rds_rt_ab
= rt_ab
;
1528 index
= bdev
->rds_info
.radio_text
[i
+2] &
1529 BCM2048_RDS_RT_INDEX
;
1531 if (bdev
->rds_info
.rds_rt_group_b
)
1543 static int bcm2048_parse_rt_match_c(struct bcm2048_device
*bdev
, int i
,
1548 crc
= bcm2048_rds_block_crc(bdev
, i
);
1550 if (crc
== BCM2048_RDS_CRC_UNRECOVARABLE
)
1553 BUG_ON((index
+2) >= BCM2048_MAX_RDS_RT
);
1555 if ((bdev
->rds_info
.radio_text
[i
] & BCM2048_RDS_BLOCK_MASK
) ==
1556 BCM2048_RDS_BLOCK_C
) {
1557 if (bdev
->rds_info
.rds_rt_group_b
)
1559 bcm2048_parse_rds_rt_block(bdev
, i
, index
, crc
);
1566 static void bcm2048_parse_rt_match_d(struct bcm2048_device
*bdev
, int i
,
1571 crc
= bcm2048_rds_block_crc(bdev
, i
);
1573 if (crc
== BCM2048_RDS_CRC_UNRECOVARABLE
)
1576 BUG_ON((index
+4) >= BCM2048_MAX_RDS_RT
);
1578 if ((bdev
->rds_info
.radio_text
[i
] & BCM2048_RDS_BLOCK_MASK
) ==
1579 BCM2048_RDS_BLOCK_D
)
1580 bcm2048_parse_rds_rt_block(bdev
, i
, index
+2, crc
);
1583 static int bcm2048_parse_rds_rt(struct bcm2048_device
*bdev
)
1585 int i
, index
= 0, crc
, match_b
= 0, match_c
= 0, match_d
= 0;
1587 for (i
= 0; i
< bdev
->fifo_size
; i
+= BCM2048_RDS_FIFO_DUPLE_SIZE
) {
1591 index
= bcm2048_parse_rt_match_b(bdev
, i
);
1592 if (index
>= 0 && index
<= (BCM2048_MAX_RDS_RT
- 5))
1595 } else if (match_c
) {
1597 if (bcm2048_parse_rt_match_c(bdev
, i
, index
))
1600 } else if (match_d
) {
1602 bcm2048_parse_rt_match_d(bdev
, i
, index
);
1606 /* Skip erroneous blocks due to messed up A block altogether */
1607 if ((bdev
->rds_info
.radio_text
[i
] & BCM2048_RDS_BLOCK_MASK
)
1608 == BCM2048_RDS_BLOCK_A
) {
1609 crc
= bcm2048_rds_block_crc(bdev
, i
);
1610 if (crc
== BCM2048_RDS_CRC_UNRECOVARABLE
)
1612 /* Syncronize to a good RDS PI */
1613 if (((bdev
->rds_info
.radio_text
[i
+1] << 8) +
1614 bdev
->rds_info
.radio_text
[i
+2]) ==
1615 bdev
->rds_info
.rds_pi
)
1623 static void bcm2048_parse_rds_ps_block(struct bcm2048_device
*bdev
, int i
,
1626 /* Good data will overwrite poor data */
1628 if (!bdev
->rds_info
.rds_ps
[index
])
1629 bdev
->rds_info
.rds_ps
[index
] =
1630 bdev
->rds_info
.radio_text
[i
+1];
1631 if (!bdev
->rds_info
.rds_ps
[index
+1])
1632 bdev
->rds_info
.rds_ps
[index
+1] =
1633 bdev
->rds_info
.radio_text
[i
+2];
1635 bdev
->rds_info
.rds_ps
[index
] = bdev
->rds_info
.radio_text
[i
+1];
1636 bdev
->rds_info
.rds_ps
[index
+1] =
1637 bdev
->rds_info
.radio_text
[i
+2];
1641 static int bcm2048_parse_ps_match_c(struct bcm2048_device
*bdev
, int i
,
1646 crc
= bcm2048_rds_block_crc(bdev
, i
);
1648 if (crc
== BCM2048_RDS_CRC_UNRECOVARABLE
)
1651 if ((bdev
->rds_info
.radio_text
[i
] & BCM2048_RDS_BLOCK_MASK
) ==
1652 BCM2048_RDS_BLOCK_C
)
1658 static void bcm2048_parse_ps_match_d(struct bcm2048_device
*bdev
, int i
,
1663 crc
= bcm2048_rds_block_crc(bdev
, i
);
1665 if (crc
== BCM2048_RDS_CRC_UNRECOVARABLE
)
1668 if ((bdev
->rds_info
.radio_text
[i
] & BCM2048_RDS_BLOCK_MASK
) ==
1669 BCM2048_RDS_BLOCK_D
)
1670 bcm2048_parse_rds_ps_block(bdev
, i
, index
, crc
);
1673 static int bcm2048_parse_ps_match_b(struct bcm2048_device
*bdev
, int i
)
1675 int crc
, index
, ps_id
, ps_group
;
1677 crc
= bcm2048_rds_block_crc(bdev
, i
);
1679 if (crc
== BCM2048_RDS_CRC_UNRECOVARABLE
)
1682 /* Block B Radio PS match */
1683 if ((bdev
->rds_info
.radio_text
[i
] & BCM2048_RDS_BLOCK_MASK
) ==
1684 BCM2048_RDS_BLOCK_B
) {
1685 ps_id
= bdev
->rds_info
.radio_text
[i
+1] &
1686 BCM2048_RDS_BLOCK_MASK
;
1687 ps_group
= bdev
->rds_info
.radio_text
[i
+1] &
1688 BCM2048_RDS_GROUP_AB_MASK
;
1691 * Poor RSSI will lead to RDS data corruption
1692 * So using 3 (same) sequential values to justify major changes
1694 if (ps_group
!= bdev
->rds_info
.rds_ps_group
) {
1695 if (crc
== BCM2048_RDS_CRC_NONE
) {
1696 bdev
->rds_info
.rds_ps_group_cnt
++;
1697 if (bdev
->rds_info
.rds_ps_group_cnt
> 2) {
1698 bdev
->rds_info
.rds_ps_group
= ps_group
;
1699 bdev
->rds_info
.rds_ps_group_cnt
= 0;
1700 dev_err(&bdev
->client
->dev
,
1701 "RDS PS Group change!\n");
1706 bdev
->rds_info
.rds_ps_group_cnt
= 0;
1710 if (ps_id
== BCM2048_RDS_PS
) {
1711 index
= bdev
->rds_info
.radio_text
[i
+2] &
1712 BCM2048_RDS_PS_INDEX
;
1721 static void bcm2048_parse_rds_ps(struct bcm2048_device
*bdev
)
1723 int i
, index
= 0, crc
, match_b
= 0, match_c
= 0, match_d
= 0;
1725 for (i
= 0; i
< bdev
->fifo_size
; i
+= BCM2048_RDS_FIFO_DUPLE_SIZE
) {
1729 index
= bcm2048_parse_ps_match_b(bdev
, i
);
1730 if (index
>= 0 && index
< (BCM2048_MAX_RDS_PS
- 1))
1733 } else if (match_c
) {
1735 if (bcm2048_parse_ps_match_c(bdev
, i
, index
))
1738 } else if (match_d
) {
1740 bcm2048_parse_ps_match_d(bdev
, i
, index
);
1744 /* Skip erroneous blocks due to messed up A block altogether */
1745 if ((bdev
->rds_info
.radio_text
[i
] & BCM2048_RDS_BLOCK_MASK
)
1746 == BCM2048_RDS_BLOCK_A
) {
1747 crc
= bcm2048_rds_block_crc(bdev
, i
);
1748 if (crc
== BCM2048_RDS_CRC_UNRECOVARABLE
)
1750 /* Syncronize to a good RDS PI */
1751 if (((bdev
->rds_info
.radio_text
[i
+1] << 8) +
1752 bdev
->rds_info
.radio_text
[i
+2]) ==
1753 bdev
->rds_info
.rds_pi
)
1759 static void bcm2048_rds_fifo_receive(struct bcm2048_device
*bdev
)
1763 mutex_lock(&bdev
->mutex
);
1765 err
= bcm2048_recv_duples(bdev
, BCM2048_I2C_RDS_DATA
,
1766 bdev
->rds_info
.radio_text
, bdev
->fifo_size
);
1768 dev_err(&bdev
->client
->dev
, "RDS Read problem\n");
1769 mutex_unlock(&bdev
->mutex
);
1773 bdev
->rds_info
.text_len
= bdev
->fifo_size
;
1775 bcm2048_parse_rds_pi(bdev
);
1776 bcm2048_parse_rds_rt(bdev
);
1777 bcm2048_parse_rds_ps(bdev
);
1779 mutex_unlock(&bdev
->mutex
);
1781 wake_up_interruptible(&bdev
->read_queue
);
1784 static int bcm2048_get_rds_data(struct bcm2048_device
*bdev
, char *data
)
1786 int err
= 0, i
, p
= 0;
1789 mutex_lock(&bdev
->mutex
);
1791 if (!bdev
->rds_info
.text_len
) {
1796 data_buffer
= kzalloc(BCM2048_MAX_RDS_RADIO_TEXT
*5, GFP_KERNEL
);
1802 for (i
= 0; i
< bdev
->rds_info
.text_len
; i
++) {
1803 p
+= sprintf(data_buffer
+p
, "%x ",
1804 bdev
->rds_info
.radio_text
[i
]);
1807 memcpy(data
, data_buffer
, p
);
1811 mutex_unlock(&bdev
->mutex
);
1816 * BCM2048 default initialization sequence
1818 static int bcm2048_init(struct bcm2048_device
*bdev
)
1822 err
= bcm2048_set_power_state(bdev
, BCM2048_POWER_ON
);
1826 err
= bcm2048_set_audio_route(bdev
, BCM2048_AUDIO_ROUTE_DAC
);
1830 err
= bcm2048_set_dac_output(bdev
, BCM2048_DAC_OUTPUT_LEFT
|
1831 BCM2048_DAC_OUTPUT_RIGHT
);
1838 * BCM2048 default deinitialization sequence
1840 static int bcm2048_deinit(struct bcm2048_device
*bdev
)
1844 err
= bcm2048_set_audio_route(bdev
, 0);
1848 err
= bcm2048_set_dac_output(bdev
, 0);
1852 err
= bcm2048_set_power_state(bdev
, BCM2048_POWER_OFF
);
1861 * BCM2048 probe sequence
1863 static int bcm2048_probe(struct bcm2048_device
*bdev
)
1867 err
= bcm2048_set_power_state(bdev
, BCM2048_POWER_ON
);
1871 err
= bcm2048_checkrev(bdev
);
1875 err
= bcm2048_set_mute(bdev
, BCM2048_DEFAULT_MUTE
);
1879 err
= bcm2048_set_region(bdev
, BCM2048_DEFAULT_REGION
);
1883 err
= bcm2048_set_fm_search_rssi_threshold(bdev
,
1884 BCM2048_DEFAULT_RSSI_THRESHOLD
);
1888 err
= bcm2048_set_fm_automatic_stereo_mono(bdev
, BCM2048_ITEM_ENABLED
);
1892 err
= bcm2048_get_rds_wline(bdev
);
1893 if (err
< BCM2048_DEFAULT_RDS_WLINE
)
1894 err
= bcm2048_set_rds_wline(bdev
, BCM2048_DEFAULT_RDS_WLINE
);
1898 err
= bcm2048_set_power_state(bdev
, BCM2048_POWER_OFF
);
1900 init_waitqueue_head(&bdev
->read_queue
);
1901 bdev
->rds_data_available
= 0;
1910 * BCM2048 workqueue handler
1912 static void bcm2048_work(struct work_struct
*work
)
1914 struct bcm2048_device
*bdev
;
1915 u8 flag_lsb
, flag_msb
, flags
;
1917 bdev
= container_of(work
, struct bcm2048_device
, work
);
1918 bcm2048_recv_command(bdev
, BCM2048_I2C_FM_RDS_FLAG0
, &flag_lsb
);
1919 bcm2048_recv_command(bdev
, BCM2048_I2C_FM_RDS_FLAG1
, &flag_msb
);
1921 if (flag_lsb
& (BCM2048_FM_FLAG_SEARCH_TUNE_FINISHED
|
1922 BCM2048_FM_FLAG_SEARCH_TUNE_FAIL
)) {
1924 if (flag_lsb
& BCM2048_FM_FLAG_SEARCH_TUNE_FAIL
)
1925 bdev
->scan_state
= BCM2048_SCAN_FAIL
;
1927 bdev
->scan_state
= BCM2048_SCAN_OK
;
1929 complete(&bdev
->compl);
1932 if (flag_msb
& BCM2048_RDS_FLAG_FIFO_WLINE
) {
1933 bcm2048_rds_fifo_receive(bdev
);
1934 if (bdev
->rds_state
) {
1935 flags
= BCM2048_RDS_FLAG_FIFO_WLINE
;
1936 bcm2048_send_command(bdev
, BCM2048_I2C_FM_RDS_MASK1
,
1939 bdev
->rds_data_available
= 1;
1940 bdev
->rd_index
= 0; /* new data, new start */
1945 * BCM2048 interrupt handler
1947 static irqreturn_t
bcm2048_handler(int irq
, void *dev
)
1949 struct bcm2048_device
*bdev
= dev
;
1951 dev_dbg(&bdev
->client
->dev
, "IRQ called, queuing work\n");
1952 if (bdev
->power_state
)
1953 schedule_work(&bdev
->work
);
1959 * BCM2048 sysfs interface definitions
1961 #define property_write(prop, type, mask, check) \
1962 static ssize_t bcm2048_##prop##_write(struct device *dev, \
1963 struct device_attribute *attr, \
1967 struct bcm2048_device *bdev = dev_get_drvdata(dev); \
1974 sscanf(buf, mask, &value); \
1979 err = bcm2048_set_##prop(bdev, value); \
1981 return err < 0 ? err : count; \
1984 #define property_read(prop, size, mask) \
1985 static ssize_t bcm2048_##prop##_read(struct device *dev, \
1986 struct device_attribute *attr, \
1989 struct bcm2048_device *bdev = dev_get_drvdata(dev); \
1995 value = bcm2048_get_##prop(bdev); \
1998 value = sprintf(buf, mask "\n", value); \
2003 #define property_signed_read(prop, size, mask) \
2004 static ssize_t bcm2048_##prop##_read(struct device *dev, \
2005 struct device_attribute *attr, \
2008 struct bcm2048_device *bdev = dev_get_drvdata(dev); \
2014 value = bcm2048_get_##prop(bdev); \
2016 value = sprintf(buf, mask "\n", value); \
2021 #define DEFINE_SYSFS_PROPERTY(prop, signal, size, mask, check) \
2022 property_write(prop, signal size, mask, check) \
2023 property_read(prop, size, mask)
2025 #define property_str_read(prop, size) \
2026 static ssize_t bcm2048_##prop##_read(struct device *dev, \
2027 struct device_attribute *attr, \
2030 struct bcm2048_device *bdev = dev_get_drvdata(dev); \
2037 out = kzalloc(size + 1, GFP_KERNEL); \
2041 bcm2048_get_##prop(bdev, out); \
2042 count = sprintf(buf, "%s\n", out); \
2049 DEFINE_SYSFS_PROPERTY(power_state
, unsigned, int, "%u", 0)
2050 DEFINE_SYSFS_PROPERTY(mute
, unsigned, int, "%u", 0)
2051 DEFINE_SYSFS_PROPERTY(audio_route
, unsigned, int, "%u", 0)
2052 DEFINE_SYSFS_PROPERTY(dac_output
, unsigned, int, "%u", 0)
2054 DEFINE_SYSFS_PROPERTY(fm_hi_lo_injection
, unsigned, int, "%u", 0)
2055 DEFINE_SYSFS_PROPERTY(fm_frequency
, unsigned, int, "%u", 0)
2056 DEFINE_SYSFS_PROPERTY(fm_af_frequency
, unsigned, int, "%u", 0)
2057 DEFINE_SYSFS_PROPERTY(fm_deemphasis
, unsigned, int, "%u", 0)
2058 DEFINE_SYSFS_PROPERTY(fm_rds_mask
, unsigned, int, "%u", 0)
2059 DEFINE_SYSFS_PROPERTY(fm_best_tune_mode
, unsigned, int, "%u", 0)
2060 DEFINE_SYSFS_PROPERTY(fm_search_rssi_threshold
, unsigned, int, "%u", 0)
2061 DEFINE_SYSFS_PROPERTY(fm_search_mode_direction
, unsigned, int, "%u", 0)
2062 DEFINE_SYSFS_PROPERTY(fm_search_tune_mode
, unsigned, int, "%u", value
> 3)
2064 DEFINE_SYSFS_PROPERTY(rds
, unsigned, int, "%u", 0)
2065 DEFINE_SYSFS_PROPERTY(rds_b_block_mask
, unsigned, int, "%u", 0)
2066 DEFINE_SYSFS_PROPERTY(rds_b_block_match
, unsigned, int, "%u", 0)
2067 DEFINE_SYSFS_PROPERTY(rds_pi_mask
, unsigned, int, "%u", 0)
2068 DEFINE_SYSFS_PROPERTY(rds_pi_match
, unsigned, int, "%u", 0)
2069 DEFINE_SYSFS_PROPERTY(rds_wline
, unsigned, int, "%u", 0)
2070 property_read(rds_pi
, unsigned int, "%x")
2071 property_str_read(rds_rt
, (BCM2048_MAX_RDS_RT
+ 1))
2072 property_str_read(rds_ps
, (BCM2048_MAX_RDS_PS
+ 1))
2074 property_read(fm_rds_flags
, unsigned int, "%u")
2075 property_str_read(rds_data
, BCM2048_MAX_RDS_RADIO_TEXT
*5)
2077 property_read(region_bottom_frequency
, unsigned int, "%u")
2078 property_read(region_top_frequency
, unsigned int, "%u")
2079 property_signed_read(fm_carrier_error
, int, "%d")
2080 property_signed_read(fm_rssi
, int, "%d")
2081 DEFINE_SYSFS_PROPERTY(region
, unsigned, int, "%u", 0)
2083 static struct device_attribute attrs
[] = {
2084 __ATTR(power_state
, S_IRUGO
| S_IWUSR
, bcm2048_power_state_read
,
2085 bcm2048_power_state_write
),
2086 __ATTR(mute
, S_IRUGO
| S_IWUSR
, bcm2048_mute_read
,
2087 bcm2048_mute_write
),
2088 __ATTR(audio_route
, S_IRUGO
| S_IWUSR
, bcm2048_audio_route_read
,
2089 bcm2048_audio_route_write
),
2090 __ATTR(dac_output
, S_IRUGO
| S_IWUSR
, bcm2048_dac_output_read
,
2091 bcm2048_dac_output_write
),
2092 __ATTR(fm_hi_lo_injection
, S_IRUGO
| S_IWUSR
,
2093 bcm2048_fm_hi_lo_injection_read
,
2094 bcm2048_fm_hi_lo_injection_write
),
2095 __ATTR(fm_frequency
, S_IRUGO
| S_IWUSR
, bcm2048_fm_frequency_read
,
2096 bcm2048_fm_frequency_write
),
2097 __ATTR(fm_af_frequency
, S_IRUGO
| S_IWUSR
,
2098 bcm2048_fm_af_frequency_read
,
2099 bcm2048_fm_af_frequency_write
),
2100 __ATTR(fm_deemphasis
, S_IRUGO
| S_IWUSR
, bcm2048_fm_deemphasis_read
,
2101 bcm2048_fm_deemphasis_write
),
2102 __ATTR(fm_rds_mask
, S_IRUGO
| S_IWUSR
, bcm2048_fm_rds_mask_read
,
2103 bcm2048_fm_rds_mask_write
),
2104 __ATTR(fm_best_tune_mode
, S_IRUGO
| S_IWUSR
,
2105 bcm2048_fm_best_tune_mode_read
,
2106 bcm2048_fm_best_tune_mode_write
),
2107 __ATTR(fm_search_rssi_threshold
, S_IRUGO
| S_IWUSR
,
2108 bcm2048_fm_search_rssi_threshold_read
,
2109 bcm2048_fm_search_rssi_threshold_write
),
2110 __ATTR(fm_search_mode_direction
, S_IRUGO
| S_IWUSR
,
2111 bcm2048_fm_search_mode_direction_read
,
2112 bcm2048_fm_search_mode_direction_write
),
2113 __ATTR(fm_search_tune_mode
, S_IRUGO
| S_IWUSR
,
2114 bcm2048_fm_search_tune_mode_read
,
2115 bcm2048_fm_search_tune_mode_write
),
2116 __ATTR(rds
, S_IRUGO
| S_IWUSR
, bcm2048_rds_read
,
2118 __ATTR(rds_b_block_mask
, S_IRUGO
| S_IWUSR
,
2119 bcm2048_rds_b_block_mask_read
,
2120 bcm2048_rds_b_block_mask_write
),
2121 __ATTR(rds_b_block_match
, S_IRUGO
| S_IWUSR
,
2122 bcm2048_rds_b_block_match_read
,
2123 bcm2048_rds_b_block_match_write
),
2124 __ATTR(rds_pi_mask
, S_IRUGO
| S_IWUSR
, bcm2048_rds_pi_mask_read
,
2125 bcm2048_rds_pi_mask_write
),
2126 __ATTR(rds_pi_match
, S_IRUGO
| S_IWUSR
, bcm2048_rds_pi_match_read
,
2127 bcm2048_rds_pi_match_write
),
2128 __ATTR(rds_wline
, S_IRUGO
| S_IWUSR
, bcm2048_rds_wline_read
,
2129 bcm2048_rds_wline_write
),
2130 __ATTR(rds_pi
, S_IRUGO
, bcm2048_rds_pi_read
, NULL
),
2131 __ATTR(rds_rt
, S_IRUGO
, bcm2048_rds_rt_read
, NULL
),
2132 __ATTR(rds_ps
, S_IRUGO
, bcm2048_rds_ps_read
, NULL
),
2133 __ATTR(fm_rds_flags
, S_IRUGO
, bcm2048_fm_rds_flags_read
, NULL
),
2134 __ATTR(region_bottom_frequency
, S_IRUGO
,
2135 bcm2048_region_bottom_frequency_read
, NULL
),
2136 __ATTR(region_top_frequency
, S_IRUGO
,
2137 bcm2048_region_top_frequency_read
, NULL
),
2138 __ATTR(fm_carrier_error
, S_IRUGO
,
2139 bcm2048_fm_carrier_error_read
, NULL
),
2140 __ATTR(fm_rssi
, S_IRUGO
,
2141 bcm2048_fm_rssi_read
, NULL
),
2142 __ATTR(region
, S_IRUGO
| S_IWUSR
, bcm2048_region_read
,
2143 bcm2048_region_write
),
2144 __ATTR(rds_data
, S_IRUGO
, bcm2048_rds_data_read
, NULL
),
2147 static int bcm2048_sysfs_unregister_properties(struct bcm2048_device
*bdev
,
2152 for (i
= 0; i
< size
; i
++)
2153 device_remove_file(&bdev
->client
->dev
, &attrs
[i
]);
2158 static int bcm2048_sysfs_register_properties(struct bcm2048_device
*bdev
)
2163 for (i
= 0; i
< ARRAY_SIZE(attrs
); i
++) {
2164 if (device_create_file(&bdev
->client
->dev
, &attrs
[i
]) != 0) {
2165 dev_err(&bdev
->client
->dev
,
2166 "could not register sysfs entry\n");
2168 bcm2048_sysfs_unregister_properties(bdev
, i
);
2177 static int bcm2048_fops_open(struct file
*file
)
2179 struct bcm2048_device
*bdev
= video_drvdata(file
);
2183 bdev
->rds_data_available
= 0;
2188 static int bcm2048_fops_release(struct file
*file
)
2190 struct bcm2048_device
*bdev
= video_drvdata(file
);
2197 static unsigned int bcm2048_fops_poll(struct file
*file
,
2198 struct poll_table_struct
*pts
)
2200 struct bcm2048_device
*bdev
= video_drvdata(file
);
2203 poll_wait(file
, &bdev
->read_queue
, pts
);
2205 if (bdev
->rds_data_available
)
2206 retval
= POLLIN
| POLLRDNORM
;
2211 static ssize_t
bcm2048_fops_read(struct file
*file
, char __user
*buf
,
2212 size_t count
, loff_t
*ppos
)
2214 struct bcm2048_device
*bdev
= video_drvdata(file
);
2218 /* we return at least 3 bytes, one block */
2219 count
= (count
/ 3) * 3; /* only multiples of 3 */
2223 while (!bdev
->rds_data_available
) {
2224 if (file
->f_flags
& O_NONBLOCK
) {
2225 retval
= -EWOULDBLOCK
;
2228 /* interruptible_sleep_on(&bdev->read_queue); */
2229 if (wait_event_interruptible(bdev
->read_queue
,
2230 bdev
->rds_data_available
) < 0) {
2236 mutex_lock(&bdev
->mutex
);
2237 /* copy data to userspace */
2238 i
= bdev
->fifo_size
- bdev
->rd_index
;
2240 count
= (i
/ 3) * 3;
2244 unsigned char tmpbuf
[3];
2245 tmpbuf
[i
] = bdev
->rds_info
.radio_text
[bdev
->rd_index
+i
+2];
2246 tmpbuf
[i
+1] = bdev
->rds_info
.radio_text
[bdev
->rd_index
+i
+1];
2247 tmpbuf
[i
+2] = ((bdev
->rds_info
.radio_text
[bdev
->rd_index
+i
]
2249 if ((bdev
->rds_info
.radio_text
[bdev
->rd_index
+i
] &
2250 BCM2048_RDS_CRC_MASK
) == BCM2048_RDS_CRC_UNRECOVARABLE
)
2251 tmpbuf
[i
+2] |= 0x80;
2252 if (copy_to_user(buf
+i
, tmpbuf
, 3)) {
2259 bdev
->rd_index
+= i
;
2260 if (bdev
->rd_index
>= bdev
->fifo_size
)
2261 bdev
->rds_data_available
= 0;
2263 mutex_unlock(&bdev
->mutex
);
2272 * bcm2048_fops - file operations interface
2274 static const struct v4l2_file_operations bcm2048_fops
= {
2275 .owner
= THIS_MODULE
,
2276 .ioctl
= video_ioctl2
,
2277 /* for RDS read support */
2278 .open
= bcm2048_fops_open
,
2279 .release
= bcm2048_fops_release
,
2280 .read
= bcm2048_fops_read
,
2281 .poll
= bcm2048_fops_poll
2285 * Video4Linux Interface
2287 static struct v4l2_queryctrl bcm2048_v4l2_queryctrl
[] = {
2289 .id
= V4L2_CID_AUDIO_VOLUME
,
2290 .flags
= V4L2_CTRL_FLAG_DISABLED
,
2293 .id
= V4L2_CID_AUDIO_BALANCE
,
2294 .flags
= V4L2_CTRL_FLAG_DISABLED
,
2297 .id
= V4L2_CID_AUDIO_BASS
,
2298 .flags
= V4L2_CTRL_FLAG_DISABLED
,
2301 .id
= V4L2_CID_AUDIO_TREBLE
,
2302 .flags
= V4L2_CTRL_FLAG_DISABLED
,
2305 .id
= V4L2_CID_AUDIO_MUTE
,
2306 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
2314 .id
= V4L2_CID_AUDIO_LOUDNESS
,
2315 .flags
= V4L2_CTRL_FLAG_DISABLED
,
2319 static int bcm2048_vidioc_querycap(struct file
*file
, void *priv
,
2320 struct v4l2_capability
*capability
)
2322 struct bcm2048_device
*bdev
= video_get_drvdata(video_devdata(file
));
2324 strlcpy(capability
->driver
, BCM2048_DRIVER_NAME
,
2325 sizeof(capability
->driver
));
2326 strlcpy(capability
->card
, BCM2048_DRIVER_CARD
,
2327 sizeof(capability
->card
));
2328 snprintf(capability
->bus_info
, 32, "I2C: 0x%X", bdev
->client
->addr
);
2329 capability
->version
= BCM2048_DRIVER_VERSION
;
2330 capability
->capabilities
= V4L2_CAP_TUNER
| V4L2_CAP_RADIO
|
2331 V4L2_CAP_HW_FREQ_SEEK
;
2336 static int bcm2048_vidioc_g_input(struct file
*filp
, void *priv
,
2344 static int bcm2048_vidioc_s_input(struct file
*filp
, void *priv
,
2353 static int bcm2048_vidioc_queryctrl(struct file
*file
, void *priv
,
2354 struct v4l2_queryctrl
*qc
)
2358 for (i
= 0; i
< ARRAY_SIZE(bcm2048_v4l2_queryctrl
); i
++) {
2359 if (qc
->id
&& qc
->id
== bcm2048_v4l2_queryctrl
[i
].id
) {
2360 *qc
= bcm2048_v4l2_queryctrl
[i
];
2368 static int bcm2048_vidioc_g_ctrl(struct file
*file
, void *priv
,
2369 struct v4l2_control
*ctrl
)
2371 struct bcm2048_device
*bdev
= video_get_drvdata(video_devdata(file
));
2378 case V4L2_CID_AUDIO_MUTE
:
2379 err
= bcm2048_get_mute(bdev
);
2388 static int bcm2048_vidioc_s_ctrl(struct file
*file
, void *priv
,
2389 struct v4l2_control
*ctrl
)
2391 struct bcm2048_device
*bdev
= video_get_drvdata(video_devdata(file
));
2398 case V4L2_CID_AUDIO_MUTE
:
2400 if (bdev
->power_state
) {
2401 err
= bcm2048_set_mute(bdev
, ctrl
->value
);
2402 err
|= bcm2048_deinit(bdev
);
2405 if (!bdev
->power_state
) {
2406 err
= bcm2048_init(bdev
);
2407 err
|= bcm2048_set_mute(bdev
, ctrl
->value
);
2416 static int bcm2048_vidioc_g_audio(struct file
*file
, void *priv
,
2417 struct v4l2_audio
*audio
)
2419 if (audio
->index
> 1)
2422 strncpy(audio
->name
, "Radio", 32);
2423 audio
->capability
= V4L2_AUDCAP_STEREO
;
2428 static int bcm2048_vidioc_s_audio(struct file
*file
, void *priv
,
2429 const struct v4l2_audio
*audio
)
2431 if (audio
->index
!= 0)
2437 static int bcm2048_vidioc_g_tuner(struct file
*file
, void *priv
,
2438 struct v4l2_tuner
*tuner
)
2440 struct bcm2048_device
*bdev
= video_get_drvdata(video_devdata(file
));
2447 if (tuner
->index
> 0)
2450 strncpy(tuner
->name
, "FM Receiver", 32);
2451 tuner
->type
= V4L2_TUNER_RADIO
;
2453 dev_to_v4l2(bcm2048_get_region_bottom_frequency(bdev
));
2455 dev_to_v4l2(bcm2048_get_region_top_frequency(bdev
));
2456 tuner
->rxsubchans
= V4L2_TUNER_SUB_STEREO
;
2457 tuner
->capability
= V4L2_TUNER_CAP_STEREO
| V4L2_TUNER_CAP_LOW
;
2458 tuner
->audmode
= V4L2_TUNER_MODE_STEREO
;
2460 if (bdev
->power_state
) {
2462 * Report frequencies with high carrier errors to have zero
2465 f_error
= bcm2048_get_fm_carrier_error(bdev
);
2466 if (f_error
< BCM2048_FREQ_ERROR_FLOOR
||
2467 f_error
> BCM2048_FREQ_ERROR_ROOF
) {
2471 * RSSI level -60 dB is defined to report full
2474 rssi
= bcm2048_get_fm_rssi(bdev
);
2475 if (rssi
>= BCM2048_RSSI_LEVEL_BASE
) {
2476 tuner
->signal
= 0xFFFF;
2477 } else if (rssi
> BCM2048_RSSI_LEVEL_ROOF
) {
2478 tuner
->signal
= (rssi
+
2479 BCM2048_RSSI_LEVEL_ROOF_NEG
)
2480 * BCM2048_SIGNAL_MULTIPLIER
;
2492 static int bcm2048_vidioc_s_tuner(struct file
*file
, void *priv
,
2493 const struct v4l2_tuner
*tuner
)
2495 struct bcm2048_device
*bdev
= video_get_drvdata(video_devdata(file
));
2500 if (tuner
->index
> 0)
2506 static int bcm2048_vidioc_g_frequency(struct file
*file
, void *priv
,
2507 struct v4l2_frequency
*freq
)
2509 struct bcm2048_device
*bdev
= video_get_drvdata(video_devdata(file
));
2513 if (!bdev
->power_state
)
2516 freq
->type
= V4L2_TUNER_RADIO
;
2517 f
= bcm2048_get_fm_frequency(bdev
);
2522 freq
->frequency
= dev_to_v4l2(f
);
2527 static int bcm2048_vidioc_s_frequency(struct file
*file
, void *priv
,
2528 const struct v4l2_frequency
*freq
)
2530 struct bcm2048_device
*bdev
= video_get_drvdata(video_devdata(file
));
2533 if (freq
->type
!= V4L2_TUNER_RADIO
)
2536 if (!bdev
->power_state
)
2539 err
= bcm2048_set_fm_frequency(bdev
, v4l2_to_dev(freq
->frequency
));
2540 err
|= bcm2048_set_fm_search_tune_mode(bdev
, BCM2048_FM_PRE_SET_MODE
);
2545 static int bcm2048_vidioc_s_hw_freq_seek(struct file
*file
, void *priv
,
2546 const struct v4l2_hw_freq_seek
*seek
)
2548 struct bcm2048_device
*bdev
= video_get_drvdata(video_devdata(file
));
2551 if (!bdev
->power_state
)
2554 if ((seek
->tuner
!= 0) || (seek
->type
!= V4L2_TUNER_RADIO
))
2557 err
= bcm2048_set_fm_search_mode_direction(bdev
, seek
->seek_upward
);
2558 err
|= bcm2048_set_fm_search_tune_mode(bdev
,
2559 BCM2048_FM_AUTO_SEARCH_MODE
);
2564 static struct v4l2_ioctl_ops bcm2048_ioctl_ops
= {
2565 .vidioc_querycap
= bcm2048_vidioc_querycap
,
2566 .vidioc_g_input
= bcm2048_vidioc_g_input
,
2567 .vidioc_s_input
= bcm2048_vidioc_s_input
,
2568 .vidioc_queryctrl
= bcm2048_vidioc_queryctrl
,
2569 .vidioc_g_ctrl
= bcm2048_vidioc_g_ctrl
,
2570 .vidioc_s_ctrl
= bcm2048_vidioc_s_ctrl
,
2571 .vidioc_g_audio
= bcm2048_vidioc_g_audio
,
2572 .vidioc_s_audio
= bcm2048_vidioc_s_audio
,
2573 .vidioc_g_tuner
= bcm2048_vidioc_g_tuner
,
2574 .vidioc_s_tuner
= bcm2048_vidioc_s_tuner
,
2575 .vidioc_g_frequency
= bcm2048_vidioc_g_frequency
,
2576 .vidioc_s_frequency
= bcm2048_vidioc_s_frequency
,
2577 .vidioc_s_hw_freq_seek
= bcm2048_vidioc_s_hw_freq_seek
,
2581 * bcm2048_viddev_template - video device interface
2583 static struct video_device bcm2048_viddev_template
= {
2584 .fops
= &bcm2048_fops
,
2585 .name
= BCM2048_DRIVER_NAME
,
2586 .release
= video_device_release
,
2587 .ioctl_ops
= &bcm2048_ioctl_ops
,
2591 * I2C driver interface
2593 static int bcm2048_i2c_driver_probe(struct i2c_client
*client
,
2594 const struct i2c_device_id
*id
)
2596 struct bcm2048_device
*bdev
;
2597 int err
, skip_release
= 0;
2599 bdev
= kzalloc(sizeof(*bdev
), GFP_KERNEL
);
2601 dev_dbg(&client
->dev
, "Failed to alloc video device.\n");
2606 bdev
->videodev
= video_device_alloc();
2607 if (!bdev
->videodev
) {
2608 dev_dbg(&client
->dev
, "Failed to alloc video device.\n");
2613 bdev
->client
= client
;
2614 i2c_set_clientdata(client
, bdev
);
2615 mutex_init(&bdev
->mutex
);
2616 init_completion(&bdev
->compl);
2617 INIT_WORK(&bdev
->work
, bcm2048_work
);
2620 err
= request_irq(client
->irq
,
2621 bcm2048_handler
, IRQF_TRIGGER_FALLING
| IRQF_DISABLED
,
2622 client
->name
, bdev
);
2624 dev_err(&client
->dev
, "Could not request IRQ\n");
2627 dev_dbg(&client
->dev
, "IRQ requested.\n");
2629 dev_dbg(&client
->dev
, "IRQ not configured. Using timeouts.\n");
2632 *bdev
->videodev
= bcm2048_viddev_template
;
2633 video_set_drvdata(bdev
->videodev
, bdev
);
2634 if (video_register_device(bdev
->videodev
, VFL_TYPE_RADIO
, radio_nr
)) {
2635 dev_dbg(&client
->dev
, "Could not register video device.\n");
2640 err
= bcm2048_sysfs_register_properties(bdev
);
2642 dev_dbg(&client
->dev
, "Could not register sysfs interface.\n");
2643 goto free_registration
;
2646 err
= bcm2048_probe(bdev
);
2648 dev_dbg(&client
->dev
, "Failed to probe device information.\n");
2655 bcm2048_sysfs_unregister_properties(bdev
, ARRAY_SIZE(attrs
));
2657 video_unregister_device(bdev
->videodev
);
2658 /* video_unregister_device frees bdev->videodev */
2659 bdev
->videodev
= NULL
;
2663 free_irq(client
->irq
, bdev
);
2666 video_device_release(bdev
->videodev
);
2667 i2c_set_clientdata(client
, NULL
);
2674 static int __exit
bcm2048_i2c_driver_remove(struct i2c_client
*client
)
2676 struct bcm2048_device
*bdev
= i2c_get_clientdata(client
);
2677 struct video_device
*vd
;
2679 if (!client
->adapter
)
2683 vd
= bdev
->videodev
;
2685 bcm2048_sysfs_unregister_properties(bdev
, ARRAY_SIZE(attrs
));
2688 video_unregister_device(vd
);
2690 if (bdev
->power_state
)
2691 bcm2048_set_power_state(bdev
, BCM2048_POWER_OFF
);
2693 if (client
->irq
> 0)
2694 free_irq(client
->irq
, bdev
);
2696 cancel_work_sync(&bdev
->work
);
2701 i2c_set_clientdata(client
, NULL
);
2707 * bcm2048_i2c_driver - i2c driver interface
2709 static const struct i2c_device_id bcm2048_id
[] = {
2713 MODULE_DEVICE_TABLE(i2c
, bcm2048_id
);
2715 static struct i2c_driver bcm2048_i2c_driver
= {
2717 .name
= BCM2048_DRIVER_NAME
,
2719 .probe
= bcm2048_i2c_driver_probe
,
2720 .remove
= __exit_p(bcm2048_i2c_driver_remove
),
2721 .id_table
= bcm2048_id
,
2727 static int __init
bcm2048_module_init(void)
2729 pr_info(BCM2048_DRIVER_DESC
"\n");
2731 return i2c_add_driver(&bcm2048_i2c_driver
);
2733 module_init(bcm2048_module_init
);
2735 static void __exit
bcm2048_module_exit(void)
2737 i2c_del_driver(&bcm2048_i2c_driver
);
2739 module_exit(bcm2048_module_exit
);
2741 MODULE_LICENSE("GPL");
2742 MODULE_AUTHOR(BCM2048_DRIVER_AUTHOR
);
2743 MODULE_DESCRIPTION(BCM2048_DRIVER_DESC
);
2744 MODULE_VERSION("0.0.2");