blob: 60f4113f202d9502a978868ba420a54777089d3c [file]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef __AML_CI_H_
#define __AML_CI_H_
//#include "drivers/media/dvb-core/dvb_ca_en50221.h"
#include "cimcu/dvb_ca_en50221_cimcu.h"
//#include "cimax/dvb_ca_en50221_cimax.h"
#include <linux/platform_device.h>
enum aml_dvb_io_type_e {
AML_DVB_IO_TYPE_IOBUS = 0,
AML_DVB_IO_TYPE_SPI,
AML_DVB_IO_TYPE_CIMAX,
AML_DVB_IO_TYPE_SPI_T312,
AML_DVB_IO_TYPE_CIBUS,
AML_DVB_IO_TYPE_MAX,
};
enum aml_gpio_level_e {
AML_GPIO_LOW = 0,
AML_GPIO_HIGH
};
enum AM_CI_CMD {
AM_CI_CMD_IOR = 0,
AM_CI_CMD_IOW,
AM_CI_CMD_MEMR,
AM_CI_CMD_MEMW,
AM_CI_CMD_FULLTEST,
AM_CI_CMD_CISTEST,
AM_CI_CMD_GETCD12,
AM_CI_CMD_POWER,
AM_CI_CMD_RESET,
AM_CI_CMD_CONGPIO,
};
struct aml_ci {
struct dvb_ca_en50221_cimcu en50221_cimcu;
struct mutex ci_lock; //ci mutex lock
int io_type;
void *priv;
int id;
struct class class;
int raw_mode;
int (*ci_init)(struct platform_device *pdev, struct aml_ci *ci);
int (*ci_exit)(struct aml_ci *ci);
/* NOTE: the read_*, write_* and poll_slot_status functions will be
* called for different slots concurrently and need to use locks where
* and if appropriate. There will be no concurrent access to one slot.
*/
/* functions for accessing attribute memory on the CAM */
int (*ci_mem_read)(struct aml_ci *ca, int slot, int address);
int (*ci_mem_write)(struct aml_ci *ca, int slot, int address, u8 value);
/* functions for accessing the control interface on the CAM */
int (*ci_io_read)(struct aml_ci *ca, int slot, int address);
int (*ci_io_write)(struct aml_ci *ca, int slot, int address, u8 value);
/* Functions for controlling slots */
int (*ci_slot_reset)(struct aml_ci *ca, int slot);
int (*ci_slot_shutdown)(struct aml_ci *ca, int slot);
int (*ci_slot_ts_enable)(struct aml_ci *ca, int slot);
/*
* Poll slot status.
* Only necessary if DVB_CA_FLAG_EN50221_IRQ_CAMCHANGE is not set
*/
int (*ci_poll_slot_status)(struct aml_ci *ca, int slot, int open);
int (*ci_get_slot_wakeup)(struct aml_ci *ca, int slot);
//struct dvb_ca_en50221_cimax en50221_cimax;
//int (*ci_read_cis)(struct aml_ci *ca, int slot, u8 *buf, int size);
//int (*ci_write_cor)(struct aml_ci *ca, int slot, int address, u8 *buf);
/*return the final size or -1 for error*/
//int (*ci_negotiate)(struct aml_ci *ca, int slot, int size);
/* functions for accessing the control interface on the CAM */
//int (*ci_read_lpdu)(struct aml_ci *ca, int slot, u8 *buf, int size);
//int (*ci_write_lpdu)(struct aml_ci *ca, int slot, u8 *buf, int size);
//int (*ci_get_capability)(struct aml_ci *ca, int slot);
//int (*ci_cam_reset)(struct aml_ci *ca, int slot);
//int (*ci_read_cam_status)(struct aml_ci *ca, int slot);
/* private data, used by caller */
void *data;
};
struct ci_dev_config_s {
char name[20];
unsigned char type;
int cs_hold_delay;
int cs_clk_delay;
};
int aml_ci_init(struct platform_device *pdev,
struct dvb_adapter *dvb_adapter, struct aml_ci **cip);
void aml_ci_exit(struct aml_ci *ci);
#endif /* __AML_CI_H_ */