diff options
-rw-r--r-- | firmware/drivers/tuner/lv24020lp.c | 47 |
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) | |||
279 | static void lv24020lp_end_write(void) | 295 | static 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 */ |