xref: /OK3568_Linux_fs/kernel/include/media/dvb_ca_en50221.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * dvb_ca.h: generic DVB functions for EN50221 CA interfaces
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2004 Andrew de Quincey
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or
7*4882a593Smuzhiyun  * modify it under the terms of the GNU Lesser General Public License
8*4882a593Smuzhiyun  * as published by the Free Software Foundation; either version 2.1
9*4882a593Smuzhiyun  * of the License, or (at your option) any later version.
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful,
12*4882a593Smuzhiyun  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*4882a593Smuzhiyun  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
14*4882a593Smuzhiyun  * GNU General Public License for more details.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #ifndef _DVB_CA_EN50221_H_
18*4882a593Smuzhiyun #define _DVB_CA_EN50221_H_
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <linux/list.h>
21*4882a593Smuzhiyun #include <linux/dvb/ca.h>
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #include <media/dvbdev.h>
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define DVB_CA_EN50221_POLL_CAM_PRESENT	1
26*4882a593Smuzhiyun #define DVB_CA_EN50221_POLL_CAM_CHANGED	2
27*4882a593Smuzhiyun #define DVB_CA_EN50221_POLL_CAM_READY		4
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE	1
30*4882a593Smuzhiyun #define DVB_CA_EN50221_FLAG_IRQ_FR		2
31*4882a593Smuzhiyun #define DVB_CA_EN50221_FLAG_IRQ_DA		4
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define DVB_CA_EN50221_CAMCHANGE_REMOVED		0
34*4882a593Smuzhiyun #define DVB_CA_EN50221_CAMCHANGE_INSERTED		1
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /**
37*4882a593Smuzhiyun  * struct dvb_ca_en50221- Structure describing a CA interface
38*4882a593Smuzhiyun  *
39*4882a593Smuzhiyun  * @owner:		the module owning this structure
40*4882a593Smuzhiyun  * @read_attribute_mem:	function for reading attribute memory on the CAM
41*4882a593Smuzhiyun  * @write_attribute_mem: function for writing attribute memory on the CAM
42*4882a593Smuzhiyun  * @read_cam_control:	function for reading the control interface on the CAM
43*4882a593Smuzhiyun  * @write_cam_control:	function for reading the control interface on the CAM
44*4882a593Smuzhiyun  * @read_data:		function for reading data (block mode)
45*4882a593Smuzhiyun  * @write_data:		function for writing data (block mode)
46*4882a593Smuzhiyun  * @slot_reset:		function to reset the CAM slot
47*4882a593Smuzhiyun  * @slot_shutdown:	function to shutdown a CAM slot
48*4882a593Smuzhiyun  * @slot_ts_enable:	function to enable the Transport Stream on a CAM slot
49*4882a593Smuzhiyun  * @poll_slot_status:	function to poll slot status. Only necessary if
50*4882a593Smuzhiyun  *			DVB_CA_FLAG_EN50221_IRQ_CAMCHANGE is not set.
51*4882a593Smuzhiyun  * @data:		private data, used by caller.
52*4882a593Smuzhiyun  * @private:		Opaque data used by the dvb_ca core. Do not modify!
53*4882a593Smuzhiyun  *
54*4882a593Smuzhiyun  * NOTE: the read_*, write_* and poll_slot_status functions will be
55*4882a593Smuzhiyun  * called for different slots concurrently and need to use locks where
56*4882a593Smuzhiyun  * and if appropriate. There will be no concurrent access to one slot.
57*4882a593Smuzhiyun  */
58*4882a593Smuzhiyun struct dvb_ca_en50221 {
59*4882a593Smuzhiyun 	struct module *owner;
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	int (*read_attribute_mem)(struct dvb_ca_en50221 *ca,
62*4882a593Smuzhiyun 				  int slot, int address);
63*4882a593Smuzhiyun 	int (*write_attribute_mem)(struct dvb_ca_en50221 *ca,
64*4882a593Smuzhiyun 				   int slot, int address, u8 value);
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	int (*read_cam_control)(struct dvb_ca_en50221 *ca,
67*4882a593Smuzhiyun 				int slot, u8 address);
68*4882a593Smuzhiyun 	int (*write_cam_control)(struct dvb_ca_en50221 *ca,
69*4882a593Smuzhiyun 				 int slot, u8 address, u8 value);
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	int (*read_data)(struct dvb_ca_en50221 *ca,
72*4882a593Smuzhiyun 			 int slot, u8 *ebuf, int ecount);
73*4882a593Smuzhiyun 	int (*write_data)(struct dvb_ca_en50221 *ca,
74*4882a593Smuzhiyun 			  int slot, u8 *ebuf, int ecount);
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	int (*slot_reset)(struct dvb_ca_en50221 *ca, int slot);
77*4882a593Smuzhiyun 	int (*slot_shutdown)(struct dvb_ca_en50221 *ca, int slot);
78*4882a593Smuzhiyun 	int (*slot_ts_enable)(struct dvb_ca_en50221 *ca, int slot);
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	int (*poll_slot_status)(struct dvb_ca_en50221 *ca, int slot, int open);
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	void *data;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	void *private;
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /*
88*4882a593Smuzhiyun  * Functions for reporting IRQ events
89*4882a593Smuzhiyun  */
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /**
92*4882a593Smuzhiyun  * dvb_ca_en50221_camchange_irq - A CAMCHANGE IRQ has occurred.
93*4882a593Smuzhiyun  *
94*4882a593Smuzhiyun  * @pubca: CA instance.
95*4882a593Smuzhiyun  * @slot: Slot concerned.
96*4882a593Smuzhiyun  * @change_type: One of the DVB_CA_CAMCHANGE_* values
97*4882a593Smuzhiyun  */
98*4882a593Smuzhiyun void dvb_ca_en50221_camchange_irq(struct dvb_ca_en50221 *pubca, int slot,
99*4882a593Smuzhiyun 				  int change_type);
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun /**
102*4882a593Smuzhiyun  * dvb_ca_en50221_camready_irq - A CAMREADY IRQ has occurred.
103*4882a593Smuzhiyun  *
104*4882a593Smuzhiyun  * @pubca: CA instance.
105*4882a593Smuzhiyun  * @slot: Slot concerned.
106*4882a593Smuzhiyun  */
107*4882a593Smuzhiyun void dvb_ca_en50221_camready_irq(struct dvb_ca_en50221 *pubca, int slot);
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun /**
110*4882a593Smuzhiyun  * dvb_ca_en50221_frda_irq - An FR or a DA IRQ has occurred.
111*4882a593Smuzhiyun  *
112*4882a593Smuzhiyun  * @ca: CA instance.
113*4882a593Smuzhiyun  * @slot: Slot concerned.
114*4882a593Smuzhiyun  */
115*4882a593Smuzhiyun void dvb_ca_en50221_frda_irq(struct dvb_ca_en50221 *ca, int slot);
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun /*
118*4882a593Smuzhiyun  * Initialisation/shutdown functions
119*4882a593Smuzhiyun  */
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun /**
122*4882a593Smuzhiyun  * dvb_ca_en50221_init - Initialise a new DVB CA device.
123*4882a593Smuzhiyun  *
124*4882a593Smuzhiyun  * @dvb_adapter: DVB adapter to attach the new CA device to.
125*4882a593Smuzhiyun  * @ca: The dvb_ca instance.
126*4882a593Smuzhiyun  * @flags: Flags describing the CA device (DVB_CA_EN50221_FLAG_*).
127*4882a593Smuzhiyun  * @slot_count: Number of slots supported.
128*4882a593Smuzhiyun  *
129*4882a593Smuzhiyun  * @return 0 on success, nonzero on failure
130*4882a593Smuzhiyun  */
131*4882a593Smuzhiyun int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
132*4882a593Smuzhiyun 			struct dvb_ca_en50221 *ca, int flags,
133*4882a593Smuzhiyun 			       int slot_count);
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun /**
136*4882a593Smuzhiyun  * dvb_ca_en50221_release - Release a DVB CA device.
137*4882a593Smuzhiyun  *
138*4882a593Smuzhiyun  * @ca: The associated dvb_ca instance.
139*4882a593Smuzhiyun  */
140*4882a593Smuzhiyun void dvb_ca_en50221_release(struct dvb_ca_en50221 *ca);
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #endif
143