/* * Framework for ISA radio drivers. * This takes care of all the V4L2 scaffolding, allowing the ISA drivers * to concentrate on the actual hardware operation. * * Copyright (C) 2012 Hans Verkuil * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef _RADIO_ISA_H_ #define _RADIO_ISA_H_ #include #include #include #include #include struct radio_isa_driver; struct radio_isa_ops; /* Core structure for radio ISA cards */ struct radio_isa_card { const struct radio_isa_driver *drv; struct v4l2_device v4l2_dev; struct v4l2_ctrl_handler hdl; struct video_device vdev; struct mutex lock; const struct radio_isa_ops *ops; struct { /* mute/volume cluster */ struct v4l2_ctrl *mute; struct v4l2_ctrl *volume; }; /* I/O port */ int io; /* Card is in stereo audio mode */ bool stereo; /* Current frequency */ u32 freq; }; struct radio_isa_ops { /* Allocate and initialize a radio_isa_card struct */ struct radio_isa_card *(*alloc)(void); /* Probe whether a card is present at the given port */ bool (*probe)(struct radio_isa_card *isa, int io); /* Special card initialization can be done here, this is called after * the standard controls are registered, but before they are setup, * thus allowing drivers to add their own controls here. */ int (*init)(struct radio_isa_card *isa); /* Set mute and volume. */ int (*s_mute_volume)(struct radio_isa_card *isa, bool mute, int volume); /* Set frequency */ int (*s_frequency)(struct radio_isa_card *isa, u32 freq); /* Set stereo/mono audio mode */ int (*s_stereo)(struct radio_isa_card *isa, bool stereo); /* Get rxsubchans value for VIDIOC_G_TUNER */ u32 (*g_rxsubchans)(struct radio_isa_card *isa); /* Get the signal strength for VIDIOC_G_TUNER */ u32 (*g_signal)(struct radio_isa_card *isa); }; /* Top level structure needed to instantiate the cards */ struct radio_isa_driver { struct isa_driver driver; #ifdef CONFIG_PNP struct pnp_driver pnp_driver; #endif const struct radio_isa_ops *ops; /* The module_param_array with the specified I/O ports */ int *io_params; /* The module_param_array with the radio_nr values */ int *radio_nr_params; /* Whether we should probe for possible cards */ bool probe; /* The list of possible I/O ports */ const int *io_ports; /* The size of that list */ int num_of_io_ports; /* The region size to request */ unsigned region_size; /* The name of the card */ const char *card; /* Card can capture stereo audio */ bool has_stereo; /* The maximum volume for the volume control. If 0, then there is no volume control possible. */ int max_volume; }; int radio_isa_match(struct device *pdev, unsigned int dev); int radio_isa_probe(struct device *pdev, unsigned int dev); int radio_isa_remove(struct device *pdev, unsigned int dev); #ifdef CONFIG_PNP int radio_isa_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id); void radio_isa_pnp_remove(struct pnp_dev *dev); #endif #endif