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