| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* |
| * 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 <hans.verkuil@cisco.com> |
| */ |
| |
| #ifndef _RADIO_ISA_H_ |
| #define _RADIO_ISA_H_ |
| |
| #include <linux/isa.h> |
| #include <linux/pnp.h> |
| #include <linux/videodev2.h> |
| #include <media/v4l2-device.h> |
| #include <media/v4l2-ctrls.h> |
| |
| 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 |