Blame view

kernel/linux-rt-4.4.41/drivers/media/radio/radio-isa.h 3.58 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  /*
   * 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>
   *
   * 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 <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