// SPDX-License-Identifier: GPL-2.0-only /* * Zoltrix Radio Plus driver * Copyright 1998 C. van Schaik <[email protected]> * * BUGS * Due to the inconsistency in reading from the signal flags * it is difficult to get an accurate tuned signal. * * It seems that the card is not linear to 0 volume. It cuts off * at a low volume, and it is not possible (at least I have not found) * to get fine volume control over the low volume range. * * Some code derived from code by Romolo Manfredini * [email protected] * * 1999-05-06 - (C. van Schaik) * - Make signal strength and stereo scans * kinder to cpu while in delay * 1999-01-05 - (C. van Schaik) * - Changed tuning to 1/160Mhz accuracy * - Added stereo support * (card defaults to stereo) * (can explicitly force mono on the card) * (can detect if station is in stereo) * - Added unmute function * - Reworked ioctl functions * 2002-07-15 - Fix Stereo typo * * 2006-07-24 - Converted to V4L2 API * by Mauro Carvalho Chehab <[email protected]> * * Converted to the radio-isa framework by Hans Verkuil <[email protected]> * * Note that this is the driver for the Zoltrix Radio Plus. * This driver does not work for the Zoltrix Radio Plus 108 or the * Zoltrix Radio Plus for Windows. * * Fully tested with the Keene USB FM Transmitter and the v4l2-compliance tool. */ #include <linux/module.h> /* Modules */ #include <linux/init.h> /* Initdata */ #include <linux/ioport.h> /* request_region */ #include <linux/delay.h> /* udelay, msleep */ #include <linux/videodev2.h> /* kernel radio structs */ #include <linux/mutex.h> #include <linux/io.h> /* outb, outb_p */ #include <linux/slab.h> #include <media/v4l2-device.h> #include <media/v4l2-ioctl.h> #include "radio-isa.h" MODULE_AUTHOR(…) …; MODULE_DESCRIPTION(…) …; MODULE_LICENSE(…) …; MODULE_VERSION(…) …; #ifndef CONFIG_RADIO_ZOLTRIX_PORT #define CONFIG_RADIO_ZOLTRIX_PORT … #endif #define ZOLTRIX_MAX … static int io[ZOLTRIX_MAX] = …; static int radio_nr[ZOLTRIX_MAX] = …; module_param_array(…); MODULE_PARM_DESC(…) …; module_param_array(…); MODULE_PARM_DESC(…) …; struct zoltrix { … }; static struct radio_isa_card *zoltrix_alloc(void) { … } static int zoltrix_s_mute_volume(struct radio_isa_card *isa, bool mute, int vol) { … } /* tunes the radio to the desired frequency */ static int zoltrix_s_frequency(struct radio_isa_card *isa, u32 freq) { … } /* Get signal strength */ static u32 zoltrix_g_rxsubchans(struct radio_isa_card *isa) { … } static u32 zoltrix_g_signal(struct radio_isa_card *isa) { … } static int zoltrix_s_stereo(struct radio_isa_card *isa, bool stereo) { … } static const struct radio_isa_ops zoltrix_ops = …; static const int zoltrix_ioports[] = …; static struct radio_isa_driver zoltrix_driver = …; static int __init zoltrix_init(void) { … } static void __exit zoltrix_exit(void) { … } module_init(…) …; module_exit(zoltrix_exit);