lm7000.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /* Sanyo LM7000 tuner chip driver
  2. *
  3. * Copyright 2012 Ondrej Zary <linux@rainbow-software.org>
  4. * based on radio-aimslab.c by M. Kirkwood
  5. * and radio-sf16fmi.c by M. Kirkwood and Petr Vandrovec
  6. */
  7. #include <linux/delay.h>
  8. #include <linux/module.h>
  9. #include "lm7000.h"
  10. MODULE_AUTHOR("Ondrej Zary <linux@rainbow-software.org>");
  11. MODULE_DESCRIPTION("Routines for Sanyo LM7000 AM/FM radio tuner chip");
  12. MODULE_LICENSE("GPL");
  13. /* write the 24-bit register, starting with LSB */
  14. static void lm7000_write(struct lm7000 *lm, u32 val)
  15. {
  16. int i;
  17. u8 data;
  18. for (i = 0; i < 24; i++) {
  19. data = val & (1 << i) ? LM7000_DATA : 0;
  20. lm->set_pins(lm, data | LM7000_CE);
  21. udelay(2);
  22. lm->set_pins(lm, data | LM7000_CE | LM7000_CLK);
  23. udelay(2);
  24. lm->set_pins(lm, data | LM7000_CE);
  25. udelay(2);
  26. }
  27. lm->set_pins(lm, 0);
  28. }
  29. void lm7000_set_freq(struct lm7000 *lm, u32 freq)
  30. {
  31. freq += 171200; /* Add 10.7 MHz IF */
  32. freq /= 400; /* Convert to 25 kHz units */
  33. lm7000_write(lm, freq | LM7000_FM_25 | LM7000_BIT_FM);
  34. }
  35. EXPORT_SYMBOL(lm7000_set_freq);
  36. static int __init lm7000_module_init(void)
  37. {
  38. return 0;
  39. }
  40. static void __exit lm7000_module_exit(void)
  41. {
  42. }
  43. module_init(lm7000_module_init)
  44. module_exit(lm7000_module_exit)