radio: Add Sanyo LM7000 tuner driver
PATCH 1/3 radio: Add Sanyo LM7000 tuner driver
Add very simple driver for Sanyo LM7000 AM/FM tuner chip. Only FM is supported as there is no known HW with AM implemented.
This will be used by radio-aimslab and radio-sf16fmi.
drivers/media/radio/Kconfig +3 -0
@@ -191,6 +191,9 @@ config RADIO_CADET To compile this driver as a module, choose M here: the module will be called radio-cadet. +config RADIO_LM7000 + tristate + config RADIO_RTRACK tristate "AIMSlab RadioTrack (aka RadioReveal) support" depends on ISA && VIDEO_V4L2
drivers/media/radio/Makefile +1 -0
@@ -28,5 +28,6 @@ obj-$(CONFIG_RADIO_TEF6862) += tef6862.o obj-$(CONFIG_RADIO_TIMBERDALE) += radio-timb.o obj-$(CONFIG_RADIO_WL1273) += radio-wl1273.o obj-$(CONFIG_RADIO_WL128X) += wl128x/ +obj-$(CONFIG_RADIO_LM7000) += lm7000.o ccflags-y += -Isound
drivers/media/radio/lm7000.c new file +52 -0
52 lines not on this page · raw message
drivers/media/radio/lm7000.h new file +32 -0
@@ -0,0 +1,32 @@ +#ifndef __LM7000_H +#define __LM7000_H + +#define LM7000_DATA (1 << 0) +#define LM7000_CLK (1 << 1) +#define LM7000_CE (1 << 2) + +#define LM7000_FREQ_MASK 0x3fff +#define LM7000_BIT_T0 (1 << 14) +#define LM7000_BIT_T1 (1 << 15) +#define LM7000_BIT_B0 (1 << 16) +#define LM7000_BIT_B1 (1 << 17) +#define LM7000_BIT_B2 (1 << 18) +#define LM7000_BIT_TB (1 << 19) +#define LM7000_FM_100 (0 << 20) +#define LM7000_FM_50 (1 << 20) +#define LM7000_FM_25 (2 << 20) +#define LM7000_AM_5 (3 << 20) +#define LM7000_AM_10 (4 << 20) +#define LM7000_AM_9 (5 << 20) +#define LM7000_AM_1 (6 << 20) +#define LM7000_AM_5_ (7 << 20) +#define LM7000_BIT_FM (1 << 23) + + +struct lm7000 { +void (*set_pins)(struct lm7000 *lm,u8 pins); +}; + +void lm7000_set_freq (struct lm7000 *lm,u32 freq); + +#endif /* __LM7000_H */
Signature · 1 line
Ondrej Zary
Hi Ondrej!
Quoted 2 lines · On Tue June 12 2012 20:37:54 Ondrej Zary wrote:
Add very simple driver for Sanyo LM7000 AM/FM tuner chip. Only FM is supported as there is no known HW with AM implemented.
It feels to me that it is overkill to turn this into a full blown module. Can't this be done as a single lm7000.h header that contains a single static inline function like this:
static inline void lm7000_set_freq(u32 freq, void *handle,
void (*set_pins)(void *handle, u8 pins))
{
...
}It does the job just as well.
Otherwise it looks fine.
Regards,
Hans
Quoted 127 lines
This will be used by radio-aimslab and radio-sf16fmi.
Signed-off-by Ondrej Zary <[email protected]>drivers/media/radio/Kconfig +3
-0@@ -191,6 +191,9 @@ config RADIO_CADET To compile this driver as a module, choose M here: the module will be called radio-cadet. +config RADIO_LM7000 + tristate + config RADIO_RTRACK tristate "AIMSlab RadioTrack (aka RadioReveal) support" depends on ISA && VIDEO_V4L2drivers/media/radio/Makefile +1
-0@@ -28,5 +28,6 @@ obj-$(CONFIG_RADIO_TEF6862) += tef6862.o obj-$(CONFIG_RADIO_TIMBERDALE) += radio-timb.o obj-$(CONFIG_RADIO_WL1273) += radio-wl1273.o obj-$(CONFIG_RADIO_WL128X) += wl128x/ +obj-$(CONFIG_RADIO_LM7000) += lm7000.o ccflags-y += -Isounddrivers/media/radio/lm7000.c new file +52
-0@@ -0,0 +1,52 @@ +/* Sanyo LM7000 tuner chip driver +* +* Copyright 2012 Ondrej Zary <[email protected]> +* based on radio-aimslab.c by M. Kirkwood +* and radio-sf16fmi.c by M. Kirkwood and Petr Vandrovec +*/ + +#include <linux/delay.h> +#include <linux/module.h> +#include "lm7000.h" + +MODULE_AUTHOR ("Ondrej Zary <[email protected]>" ); +MODULE_DESCRIPTION ("Routines for Sanyo LM7000 AM/FM radio tuner chip" ); +MODULE_LICENSE ("GPL" ); + +/* write the 24-bit register, starting with LSB */ +static void lm7000_write (struct lm7000 *lm,u32 val) +{ +int i; +u8 data; + +for (i =0 ; i <24 ; i++) { + data = val & (1 << i) ?LM7000_DATA :0 ; + lm->set_pins (lm, data |LM7000_CE ); +udelay (2 ); + lm->set_pins (lm, data |LM7000_CE |LM7000_CLK ); +udelay (2 ); + lm->set_pins (lm, data |LM7000_CE ); +udelay (2 ); + } + lm->set_pins (lm,0 ); +} + +void lm7000_set_freq (struct lm7000 *lm,u32 freq) +{ + freq +=171200 ;/* Add 10.7 MHz IF */ + freq /=400 ;/* Convert to 25 kHz units */ +lm7000_write (lm, freq |LM7000_FM_25 |LM7000_BIT_FM ); +} +EXPORT_SYMBOL (lm7000_set_freq); + +static int __init lm7000_module_init (void ) +{ +return 0 ; +} + +static void __exit lm7000_module_exit(void) +{ +} + +module_init (lm7000_module_init) +module_exit (lm7000_module_exit)drivers/media/radio/lm7000.h new file +32
-0@@ -0,0 +1,32 @@ +#ifndef __LM7000_H +#define __LM7000_H + +#define LM7000_DATA (1 << 0) +#define LM7000_CLK (1 << 1) +#define LM7000_CE (1 << 2) + +#define LM7000_FREQ_MASK 0x3fff +#define LM7000_BIT_T0 (1 << 14) +#define LM7000_BIT_T1 (1 << 15) +#define LM7000_BIT_B0 (1 << 16) +#define LM7000_BIT_B1 (1 << 17) +#define LM7000_BIT_B2 (1 << 18) +#define LM7000_BIT_TB (1 << 19) +#define LM7000_FM_100 (0 << 20) +#define LM7000_FM_50 (1 << 20) +#define LM7000_FM_25 (2 << 20) +#define LM7000_AM_5 (3 << 20) +#define LM7000_AM_10 (4 << 20) +#define LM7000_AM_9 (5 << 20) +#define LM7000_AM_1 (6 << 20) +#define LM7000_AM_5_ (7 << 20) +#define LM7000_BIT_FM (1 << 23) + + +struct lm7000 { +void (*set_pins)(struct lm7000 *lm,u8 pins); +}; + +void lm7000_set_freq (struct lm7000 *lm,u32 freq); + +#endif /* __LM7000_H */
Quoted 10 lines · On Tuesday 12 June 2012 22:17:43 Hans Verkuil wrote:
Hi Ondrej!
Quoted 2 lines · On Tue June 12 2012 20:37:54 Ondrej Zary wrote:
Add very simple driver for Sanyo LM7000 AM/FM tuner chip. Only FM is supported as there is no known HW with AM implemented.
It feels to me that it is overkill to turn this into a full blown module. Can't this be done as a single
lm7000.hheader that contains a single static inline function like this:
Quoted 7 lines
static inline void lm7000_set_freq(u32 freq, void *handle,
void (*set_pins)(void *handle, u8 pins)){ ... }It does the job just as well.
Thanks for idea, it will simplify this a lot. Will resend updated patches.
Quoted 131 lines
Otherwise it looks fine.
Regards,
Hans
Quoted 125 lines
This will be used by radio-aimslab and radio-sf16fmi.
Signed-off-by Ondrej Zary <[email protected]>drivers/media/radio/Kconfig +3
-0@@ -191,6 +191,9 @@ config RADIO_CADET To compile this driver as a module, choose M here: the module will be called radio-cadet. +config RADIO_LM7000 + tristate + config RADIO_RTRACK tristate "AIMSlab RadioTrack (aka RadioReveal) support" depends on ISA && VIDEO_V4L2drivers/media/radio/Makefile +1
-0@@ -28,5 +28,6 @@ obj-$(CONFIG_RADIO_TEF6862) += tef6862.o obj-$(CONFIG_RADIO_TIMBERDALE) += radio-timb.o obj-$(CONFIG_RADIO_WL1273) += radio-wl1273.o obj-$(CONFIG_RADIO_WL128X) += wl128x/ +obj-$(CONFIG_RADIO_LM7000) += lm7000.o ccflags-y += -Isounddrivers/media/radio/lm7000.c new file +52
-0@@ -0,0 +1,52 @@ +/* Sanyo LM7000 tuner chip driver +* +* Copyright 2012 Ondrej Zary <[email protected]> +* based on radio-aimslab.c by M. Kirkwood +* and radio-sf16fmi.c by M. Kirkwood and Petr Vandrovec +*/ + +#include <linux/delay.h> +#include <linux/module.h> +#include "lm7000.h" + +MODULE_AUTHOR ("Ondrej Zary <[email protected]>" ); +MODULE_DESCRIPTION ("Routines for Sanyo LM7000 AM/FM radio tuner chip" ); +MODULE_LICENSE ("GPL" ); + +/* write the 24-bit register, starting with LSB */ +static void lm7000_write (struct lm7000 *lm,u32 val) +{ +int i; +u8 data; + +for (i =0 ; i <24 ; i++) { + data = val & (1 << i) ?LM7000_DATA :0 ; + lm->set_pins (lm, data |LM7000_CE ); +udelay (2 ); + lm->set_pins (lm, data |LM7000_CE |LM7000_CLK ); +udelay (2 ); + lm->set_pins (lm, data |LM7000_CE ); +udelay (2 ); + } + lm->set_pins (lm,0 ); +} + +void lm7000_set_freq (struct lm7000 *lm,u32 freq) +{ + freq +=171200 ;/* Add 10.7 MHz IF */ + freq /=400 ;/* Convert to 25 kHz units */ +lm7000_write (lm, freq |LM7000_FM_25 |LM7000_BIT_FM ); +} +EXPORT_SYMBOL (lm7000_set_freq); + +static int __init lm7000_module_init (void ) +{ +return 0 ; +} + +static void __exit lm7000_module_exit(void) +{ +} + +module_init (lm7000_module_init) +module_exit (lm7000_module_exit)drivers/media/radio/lm7000.h new file +32
-0@@ -0,0 +1,32 @@ +#ifndef __LM7000_H +#define __LM7000_H + +#define LM7000_DATA (1 << 0) +#define LM7000_CLK (1 << 1) +#define LM7000_CE (1 << 2) + +#define LM7000_FREQ_MASK 0x3fff +#define LM7000_BIT_T0 (1 << 14) +#define LM7000_BIT_T1 (1 << 15) +#define LM7000_BIT_B0 (1 << 16) +#define LM7000_BIT_B1 (1 << 17) +#define LM7000_BIT_B2 (1 << 18) +#define LM7000_BIT_TB (1 << 19) +#define LM7000_FM_100 (0 << 20) +#define LM7000_FM_50 (1 << 20) +#define LM7000_FM_25 (2 << 20) +#define LM7000_AM_5 (3 << 20) +#define LM7000_AM_10 (4 << 20) +#define LM7000_AM_9 (5 << 20) +#define LM7000_AM_1 (6 << 20) +#define LM7000_AM_5_ (7 << 20) +#define LM7000_BIT_FM (1 << 23) + + +struct lm7000 { +void (*set_pins)(struct lm7000 *lm,u8 pins); +}; + +void lm7000_set_freq (struct lm7000 *lm,u32 freq); + +#endif /* __LM7000_H */
Signature · 1 line
Ondrej Zary