Loading...
/* 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); void 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 |