blob: 587622be11ba8916cc8c191991fdf0cd3019535d [file]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef __AML_CI_BUS_H_
#define __AML_CI_BUS_H_
#include <linux/amlogic/iomap.h>
#include <linux/amlogic/aml_gpio_consumer.h>
#include <linux/gpio/consumer.h>
#include "aml_pcmcia.h"
#include "aml_ci.h"
#include "dvb_ca_en50221.h"
/* aml spi dev */
struct aml_ci_bus {
struct mutex mutex; /* mutex */
struct class cls;
struct gpio_desc *cd_pin1; /* add gpio pin */
int cd_pin1_value;
struct gpio_desc *cd_pin2;
int cd_pin2_value;
struct gpio_desc *pwr_pin;
int pwr_pin_value;
struct gpio_desc *le_pin;
int le_pin_value;
int le_enable_level;
int addr_ts_mode_multiplex;
/* cam irq */
int irq;
int irq_cmp;
int irq_timeout;
struct aml_pcmcia pc;
void *priv;
/*device type*/
int io_device_type;
/*select gpio group*/
int select;
struct pinctrl *pinctrl;
struct pinctrl *bus_pinctrl;
struct platform_device *pdev;
/*save cam cur state*/
enum aml_slot_state slot_state;
/*wake up thread mode at cimcu thread*/
int wakeup_thread;
/*for raw mode used*/
int used;
int raw_mode;
};
enum aml_gpio_select_e {
AML_GPIO_ADDR = 0,
AML_GPIO_TS,
};
#define IORD 0x0
#define IOWR 0x1
#define MEMRD 0x2
#define MEMWR 0x3
//24M cyccles, 42 ns
#define CYCLES (42)
//mem rd
#define DELAY_RMEM_INIT_ADDR (0)
#define DELAY_RMEM_ADDR_CE (0)
#define DELAY_RMEM_CE_RD (3)
#define DELAY_RMEM_RD_RWAIT (0)
#define DELAY_RMEM_RWAIT_DATA (0)
#define DELAY_RMEM_DATA_DRD (0)
#define DELAY_RMEM_DRD_DCE (0)
#define DELAY_RMEM_DCE_INIT (0)
//mem wr
#define DELAY_WMEM_INIT_ADDR (0)
#define DELAY_WMEM_ADDR_CE (1)
#define DELAY_WMEM_CE_WR (1)
#define DELAY_WMEM_WR_RWAIT (0)
#define DELAY_WMEM_RWAIT_DATA (0)
#define DELAY_WMEM_DATA_DWR (0)
#define DELAY_WMEM_DWR_DCE (1)
#define DELAY_WMEM_DCE_INIT (1)
//iord
#define DELAY_RIO_INIT_ADDR (0)
#define DELAY_RIO_ADDR_CE (0)
#define DELAY_RIO_CE_RD (2)
#define DELAY_RIO_RD_RWAIT (0)
#define DELAY_RIO_RWAIT_DATA (0)
#define DELAY_RIO_DATA_DRD (0)
#define DELAY_RIO_DRD_DCE (0)
#define DELAY_RIO_DCE_INIT (0)
//iowr
#define DELAY_WIO_INIT_ADDR (0)
#define DELAY_WIO_ADDR_CE (1)
#define DELAY_WIO_CE_WR (1)
#define DELAY_WIO_WR_RWAIT (0)
#define DELAY_WIO_RWAIT_DATA (0)
#define DELAY_WIO_DATA_DWR (0)
#define DELAY_WIO_DWR_DCE (1)
#define DELAY_WIO_DCE_INIT (1)
//timeout irq hold time,10MS
#define TIMEOUT_IRQ_HOLD_TIME (200)
//reg define
#define CIPLUS_CMD_REG 0x0
/*
* 31:24 rw, wdata:the data write in cam
* 23 reserved
* 22:8 addr A0-A14
* 7:6 reserved
* 5:4 cmd type:00: iord,01:iowr 10: oe 11:we
* 3:1 reserved
* 0 cmd valid,1:cmd is valid.need be executed.
* 0: cmd is invalid
*/
#define CI_CMD_WDATA 24
#define CI_CMD_ADDR 8
#define CI_CMD_TYPE 4
#define CI_CMD_VALID 0
#define CIPLUS_RDATA_REG 0x4
/*
*31:8 reserved
*7:0 data read from cam
*/
#define CIPLUS_CTRL_REG 0x8
/*
*31:21 reserved
*10 ctrl clk 1:disable clk gated;
* 0:enable clk gated
*9 completion irq en,1: disable;0:able
*8 inv_cam_iowrn
*7 inv_cam_iordn
*6 inv_cam_wen
*5 inv_cam_oen
*4 inv_cam_cen
*3 clear transfer complete irq;1:clear
*2 clear timeout ieq, 1:clear
*1 cam reset: =1 assert =0 deassert
*0 control enable: 1:enable ciplus ctrl,0:disable
*/
#define ENABLE_CMP_IRQ 9
#define INV_CAM_IOWR 8
#define INV_CAM_IORD 7
#define INV_CAM_WE 6
#define INV_CAM_OE 5
#define INV_CAM_CE 4
#define CLEAR_CMP_IRQ 3
#define CLEAR_TIMEOUT_IRQ 2
#define CAM_RESET 1
#define CI_ENABLE 0
#define CIPLUS_DELAY_CTRL0 0xc
/*
* 31:24 0xf,delay cycles between assert IORD/IOWR/MEMRD/MEMWR
* and WAIT# RELEASED
* 23:16 0xf,delay cycles between assert CE and assert IORD/IOWR/MEMRD/MEMWR
* 15:8 0x8,delay cycles between send addr and assert CE
* 7:0 0x4,delay cycles between INIT and send ADDR/DATA
*/
#define CIPLUS_DELAY_CTRL1 0x10
/*
* 31:24 0xf,delay cycles between DEassert CE and IDLE
* 23:16 0xf,delay cycles between DEassert IORD/IOWR/MEMRD/MEMWR and deassert CE
* 15:8 0x8,delay cycles between SAMPLE DATA and DEassert IORD/IOWR/MEMRD/MEMWR
* 7:0 0xF,delay cycles between WAIT# RELEASE and (SAMPLEDATA OR DEASSERT IORD
* IOWR/MEMRD/MEMWR)
*/
#define CIPLUS_WAIT_TIMEOUT 0x14
/*
* 1 wait timeout irq enable,default 1;
* 30:0 data read from cam;time out threshold
* if wait time > threshold,than timeout irq.
*/
#define ENABLE_TIMEOUT_IRQ 31
#define WATT_TIMEOUT_TIME 0
#define CIPLUS_STATUS_REG 0x18
/*
* 31:6 reserved
* 5:2 fsm state
* 1 timeout irq
* 0 complete irq
*/
#define TIMEOUT_IRQ_STATE 1
#define COMPLETE_IRQ_STATE 0
void dvb_ca_en50221_camready_irq(struct dvb_ca_en50221 *pubca, int slot);
int aml_ci_bus_init(struct platform_device *pdev, struct aml_ci *ci_dev);
int aml_ci_bus_exit(struct aml_ci *ci);
int aml_ci_bus_mod_init(void);
void aml_ci_bus_mod_exit(void);
#endif /* __AML_CI_BUS_H_ */