summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/drivers/tuner/lv24020lp.c47
1 files changed, 32 insertions, 15 deletions
diff --git a/firmware/drivers/tuner/lv24020lp.c b/firmware/drivers/tuner/lv24020lp.c
index 31fe939add..a1af38c89d 100644
--- a/firmware/drivers/tuner/lv24020lp.c
+++ b/firmware/drivers/tuner/lv24020lp.c
@@ -58,10 +58,25 @@ static int fd_log = -1;
58 58
59/** tuner register defines **/ 59/** tuner register defines **/
60 60
61/* pins on GPIOH port */ 61#if defined(SANSA_E200) || defined(SANSA_C200)
62#define GPIO_OUTPUT_EN GPIOH_OUTPUT_EN
63#define GPIO_OUTPUT_VAL GPIOH_OUTPUT_VAL
64#define GPIO_INPUT_VAL GPIOH_INPUT_VAL
62#define FM_NRW_PIN 3 65#define FM_NRW_PIN 3
63#define FM_CLOCK_PIN 4 66#define FM_CLOCK_PIN 4
64#define FM_DATA_PIN 5 67#define FM_DATA_PIN 5
68#elif defined(COWON_D2)
69#define GPIO_OUTPUT_EN GPIOC_DIR
70#define GPIO_OUTPUT_VAL GPIOC
71#define GPIO_INPUT_VAL GPIOC
72#define FM_NRW_PIN 31
73#define FM_CLOCK_PIN 29
74#define FM_DATA_PIN 30
75#define udelay(x) /* Remove hack when D2 has udelay */
76#else
77#error GPIOs undefined for this target
78#endif
79
65#define FM_CLK_DELAY 1 80#define FM_CLK_DELAY 1
66 81
67/* block 1 registers */ 82/* block 1 registers */
@@ -258,17 +273,18 @@ static void lv24020lp_send_byte(unsigned int byte)
258{ 273{
259 int i; 274 int i;
260 275
261 byte <<= FM_DATA_PIN;
262
263 for (i = 0; i < 8; i++) 276 for (i = 0; i < 8; i++)
264 { 277 {
265 GPIOH_OUTPUT_VAL &= ~(1 << FM_CLOCK_PIN); 278 GPIO_OUTPUT_VAL &= ~(1 << FM_CLOCK_PIN);
279
280 if (byte & 1)
281 GPIO_OUTPUT_VAL |= (1 << FM_DATA_PIN);
282 else
283 GPIO_OUTPUT_VAL &= ~(1 << FM_DATA_PIN);
266 284
267 GPIOH_OUTPUT_VAL = (GPIOH_OUTPUT_VAL & ~(1 << FM_DATA_PIN)) |
268 (byte & (1 << FM_DATA_PIN));
269 udelay(FM_CLK_DELAY); 285 udelay(FM_CLK_DELAY);
270 286
271 GPIOH_OUTPUT_VAL |= (1 << FM_CLOCK_PIN); 287 GPIO_OUTPUT_VAL |= (1 << FM_CLOCK_PIN);
272 udelay(FM_CLK_DELAY); 288 udelay(FM_CLK_DELAY);
273 289
274 byte >>= 1; 290 byte >>= 1;
@@ -279,8 +295,8 @@ static void lv24020lp_send_byte(unsigned int byte)
279static void lv24020lp_end_write(void) 295static void lv24020lp_end_write(void)
280{ 296{
281 /* switch back to read mode */ 297 /* switch back to read mode */
282 GPIOH_OUTPUT_EN &= ~(1 << FM_DATA_PIN); 298 GPIO_OUTPUT_EN &= ~(1 << FM_DATA_PIN);
283 GPIOH_OUTPUT_VAL &= ~(1 << FM_NRW_PIN); 299 GPIO_OUTPUT_VAL &= ~(1 << FM_NRW_PIN);
284 udelay(FM_CLK_DELAY); 300 udelay(FM_CLK_DELAY);
285} 301}
286 302
@@ -294,8 +310,8 @@ static unsigned int lv24020lp_begin_write(unsigned int address)
294 for (;;) 310 for (;;)
295 { 311 {
296 /* Prepare 3-wire bus pins for write cycle */ 312 /* Prepare 3-wire bus pins for write cycle */
297 GPIOH_OUTPUT_VAL |= (1 << FM_NRW_PIN); 313 GPIO_OUTPUT_VAL |= (1 << FM_NRW_PIN);
298 GPIOH_OUTPUT_EN |= (1 << FM_DATA_PIN); 314 GPIO_OUTPUT_EN |= (1 << FM_DATA_PIN);
299 udelay(FM_CLK_DELAY); 315 udelay(FM_CLK_DELAY);
300 316
301 /* current block == register block? */ 317 /* current block == register block? */
@@ -386,16 +402,17 @@ static unsigned int lv24020lp_read(unsigned int address)
386 toread = 0; 402 toread = 0;
387 for (i = 0; i < 8; i++) 403 for (i = 0; i < 8; i++)
388 { 404 {
389 GPIOH_OUTPUT_VAL &= ~(1 << FM_CLOCK_PIN); 405 GPIO_OUTPUT_VAL &= ~(1 << FM_CLOCK_PIN);
390 udelay(FM_CLK_DELAY); 406 udelay(FM_CLK_DELAY);
391 407
392 toread |= (GPIOH_INPUT_VAL & (1 << FM_DATA_PIN)) << i; 408 if (GPIO_INPUT_VAL & (1 << FM_DATA_PIN))
409 toread |= (1 << i);
393 410
394 GPIOH_OUTPUT_VAL |= (1 << FM_CLOCK_PIN); 411 GPIO_OUTPUT_VAL |= (1 << FM_CLOCK_PIN);
395 udelay(FM_CLK_DELAY); 412 udelay(FM_CLK_DELAY);
396 } 413 }
397 414
398 return toread >> FM_DATA_PIN; 415 return toread;
399} 416}
400 417
401/* enables auto frequency centering */ 418/* enables auto frequency centering */