blob: e23825361f787707c4b0c5e26a2659c992f58629 [file] [log] [blame]
/*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Description:
*/
#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;
struct class cls;
/* add gpio pin */
struct gpio_desc *cd_pin1;
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;
};
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
/*
31 wait timeout irq enable,defalut 1;
30:0 data read from cam;time out threshold
if wait time > threshold,than timeout irq.
*/
#define ENABEL_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
extern void dvb_ca_en50221_camready_irq(struct dvb_ca_en50221 *pubca, int slot);
extern int aml_ci_bus_init(struct platform_device *pdev, struct aml_ci *ci_dev);
extern int aml_ci_bus_exit(struct aml_ci *ci);
#endif /* __AML_CI_BUS_H_ */