summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c')
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c57
1 files changed, 20 insertions, 37 deletions
diff --git a/firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c
index ee91b99c0f..5b0c71110d 100644
--- a/firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c
+++ b/firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c
@@ -29,7 +29,6 @@
29#include "gpio-target.h" 29#include "gpio-target.h"
30#include "i2c-imx31.h" 30#include "i2c-imx31.h"
31#include "fmradio_i2c.h" 31#include "fmradio_i2c.h"
32#include "rds.h"
33#include "tuner.h" 32#include "tuner.h"
34 33
35static struct i2c_node si4700_i2c_node = 34static struct i2c_node si4700_i2c_node =
@@ -128,60 +127,44 @@ bool si4700_st(void)
128 127
129 128
130/* Low-level RDS Support */ 129/* Low-level RDS Support */
131
132/* Transfer descriptor for RDS async operations */
133static struct si4700_i2c_transfer_desc
134{
135 struct i2c_transfer_desc xfer;
136 unsigned char regbuf[32];
137} si4700_xfer =
138{
139 .xfer = { .node = &si4700_i2c_node }
140};
141
142static bool int_restore; 130static bool int_restore;
143 131
144static void si4700_rds_read_raw_callback(struct i2c_transfer_desc *xfer) 132/* Called after I2C read cycle completes */
133static void si4700_rds_read_raw_async_callback(struct i2c_transfer_desc *xfer)
145{ 134{
146 struct si4700_i2c_transfer_desc *xf =
147 (struct si4700_i2c_transfer_desc *)xfer;
148
149 if (xfer->rxcount == 0) 135 if (xfer->rxcount == 0)
150 { 136 si4700_rds_process();
151 uint16_t rds_data[4];
152 si4700_rds_read_raw_async_complete(xf->regbuf, rds_data);
153
154 if (rds_process(rds_data))
155 si4700_rds_set_event();
156 }
157 /* else read didn't finish */ 137 /* else read didn't finish */
158 138
159 if (int_restore) 139 if (int_restore)
160 gpio_int_enable(SI4700_EVENT_ID); 140 gpio_int_enable(SI4700_EVENT_ID);
161} 141}
162 142
163/* Callback from si4700_rds_read_raw to execute the read */ 143/* Called to read registers from ISR context */
164void si4700_read_raw_async(int count) 144void si4700_rds_read_raw_async(unsigned char *buf, int count)
165{ 145{
166 si4700_xfer.xfer.txdata = NULL; 146 /* transfer descriptor for RDS async operations */
167 si4700_xfer.xfer.txcount = 0; 147 static struct i2c_transfer_desc xfer = { .node = &si4700_i2c_node };
168 si4700_xfer.xfer.rxdata = si4700_xfer.regbuf; 148
169 si4700_xfer.xfer.rxcount = count; 149 xfer.txdata = NULL;
170 si4700_xfer.xfer.callback = si4700_rds_read_raw_callback; 150 xfer.txcount = 0;
171 si4700_xfer.xfer.next = NULL; 151 xfer.rxdata = buf;
172 152 xfer.rxcount = count;
173 i2c_transfer(&si4700_xfer.xfer); 153 xfer.callback = si4700_rds_read_raw_async_callback;
154 xfer.next = NULL;
155
156 i2c_transfer(&xfer);
174} 157}
175 158
176/* RDS GPIO interrupt handler - start RDS data read */ 159/* RDS GPIO interrupt handler - start RDS data read */
177void INT_SI4700_RDS(void) 160void INT_SI4700_RDS(void)
178{ 161{
179 /* mask and clear the interrupt */ 162 /* mask and clear the interrupt until we're done */
180 gpio_int_disable(SI4700_EVENT_ID); 163 gpio_int_disable(SI4700_EVENT_ID);
181 gpio_int_clear(SI4700_EVENT_ID); 164 gpio_int_clear(SI4700_EVENT_ID);
182 165
183 /* read the RDS data */ 166 /* tell radio driver about it */
184 si4700_rds_read_raw_async(); 167 si4700_rds_interrupt();
185} 168}
186 169
187/* Called with on=true after full radio power up, and with on=false before 170/* Called with on=true after full radio power up, and with on=false before
@@ -197,5 +180,5 @@ void si4700_rds_powerup(bool on)
197/* One-time RDS init at startup */ 180/* One-time RDS init at startup */
198void si4700_rds_init(void) 181void si4700_rds_init(void)
199{ 182{
200 rds_init(); 183 /* nothing to do */
201} 184}