forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.1 KiB
44 lines
1.1 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
#ifndef __LM7000_H |
|
#define __LM7000_H |
|
|
|
/* Sanyo LM7000 tuner chip control |
|
* |
|
* Copyright 2012 Ondrej Zary <[email protected]> |
|
* based on radio-aimslab.c by M. Kirkwood |
|
* and radio-sf16fmi.c by M. Kirkwood and Petr Vandrovec |
|
*/ |
|
|
|
#define LM7000_DATA (1 << 0) |
|
#define LM7000_CLK (1 << 1) |
|
#define LM7000_CE (1 << 2) |
|
|
|
#define LM7000_FM_100 (0 << 20) |
|
#define LM7000_FM_50 (1 << 20) |
|
#define LM7000_FM_25 (2 << 20) |
|
#define LM7000_BIT_FM (1 << 23) |
|
|
|
static inline void lm7000_set_freq(u32 freq, void *handle, |
|
void (*set_pins)(void *handle, u8 pins)) |
|
{ |
|
int i; |
|
u8 data; |
|
u32 val; |
|
|
|
freq += 171200; /* Add 10.7 MHz IF */ |
|
freq /= 400; /* Convert to 25 kHz units */ |
|
val = freq | LM7000_FM_25 | LM7000_BIT_FM; |
|
/* write the 24-bit register, starting with LSB */ |
|
for (i = 0; i < 24; i++) { |
|
data = val & (1 << i) ? LM7000_DATA : 0; |
|
set_pins(handle, data | LM7000_CE); |
|
udelay(2); |
|
set_pins(handle, data | LM7000_CE | LM7000_CLK); |
|
udelay(2); |
|
set_pins(handle, data | LM7000_CE); |
|
udelay(2); |
|
} |
|
set_pins(handle, 0); |
|
} |
|
|
|
#endif /* __LM7000_H */
|
|
|