| /* |
| * 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_ */ |