162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* Driver for Realtek RTS5139 USB card reader 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Author: 762306a36Sopenharmony_ci * Roger Tseng <rogerable@realtek.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef __RTSX_USB_H 1162306a36Sopenharmony_ci#define __RTSX_USB_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/usb.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* related module names */ 1662306a36Sopenharmony_ci#define RTSX_USB_SD_CARD 0 1762306a36Sopenharmony_ci#define RTSX_USB_MS_CARD 1 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* endpoint numbers */ 2062306a36Sopenharmony_ci#define EP_BULK_OUT 1 2162306a36Sopenharmony_ci#define EP_BULK_IN 2 2262306a36Sopenharmony_ci#define EP_INTR_IN 3 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* USB vendor requests */ 2562306a36Sopenharmony_ci#define RTSX_USB_REQ_REG_OP 0x00 2662306a36Sopenharmony_ci#define RTSX_USB_REQ_POLL 0x02 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* miscellaneous parameters */ 2962306a36Sopenharmony_ci#define MIN_DIV_N 60 3062306a36Sopenharmony_ci#define MAX_DIV_N 120 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define MAX_PHASE 15 3362306a36Sopenharmony_ci#define RX_TUNING_CNT 3 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define QFN24 0 3662306a36Sopenharmony_ci#define LQFP48 1 3762306a36Sopenharmony_ci#define CHECK_PKG(ucr, pkg) ((ucr)->package == (pkg)) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* data structures */ 4062306a36Sopenharmony_cistruct rtsx_ucr { 4162306a36Sopenharmony_ci u16 vendor_id; 4262306a36Sopenharmony_ci u16 product_id; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci int package; 4562306a36Sopenharmony_ci u8 ic_version; 4662306a36Sopenharmony_ci bool is_rts5179; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci unsigned int cur_clk; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci u8 *cmd_buf; 5162306a36Sopenharmony_ci unsigned int cmd_idx; 5262306a36Sopenharmony_ci u8 *rsp_buf; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci struct usb_device *pusb_dev; 5562306a36Sopenharmony_ci struct usb_interface *pusb_intf; 5662306a36Sopenharmony_ci struct usb_sg_request current_sg; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci struct timer_list sg_timer; 5962306a36Sopenharmony_ci struct mutex dev_mutex; 6062306a36Sopenharmony_ci}; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci/* buffer size */ 6362306a36Sopenharmony_ci#define IOBUF_SIZE 1024 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/* prototypes of exported functions */ 6662306a36Sopenharmony_ciextern int rtsx_usb_get_card_status(struct rtsx_ucr *ucr, u16 *status); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ciextern int rtsx_usb_read_register(struct rtsx_ucr *ucr, u16 addr, u8 *data); 6962306a36Sopenharmony_ciextern int rtsx_usb_write_register(struct rtsx_ucr *ucr, u16 addr, u8 mask, 7062306a36Sopenharmony_ci u8 data); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ciextern int rtsx_usb_ep0_write_register(struct rtsx_ucr *ucr, u16 addr, u8 mask, 7362306a36Sopenharmony_ci u8 data); 7462306a36Sopenharmony_ciextern int rtsx_usb_ep0_read_register(struct rtsx_ucr *ucr, u16 addr, 7562306a36Sopenharmony_ci u8 *data); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ciextern void rtsx_usb_add_cmd(struct rtsx_ucr *ucr, u8 cmd_type, 7862306a36Sopenharmony_ci u16 reg_addr, u8 mask, u8 data); 7962306a36Sopenharmony_ciextern int rtsx_usb_send_cmd(struct rtsx_ucr *ucr, u8 flag, int timeout); 8062306a36Sopenharmony_ciextern int rtsx_usb_get_rsp(struct rtsx_ucr *ucr, int rsp_len, int timeout); 8162306a36Sopenharmony_ciextern int rtsx_usb_transfer_data(struct rtsx_ucr *ucr, unsigned int pipe, 8262306a36Sopenharmony_ci void *buf, unsigned int len, int use_sg, 8362306a36Sopenharmony_ci unsigned int *act_len, int timeout); 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ciextern int rtsx_usb_read_ppbuf(struct rtsx_ucr *ucr, u8 *buf, int buf_len); 8662306a36Sopenharmony_ciextern int rtsx_usb_write_ppbuf(struct rtsx_ucr *ucr, u8 *buf, int buf_len); 8762306a36Sopenharmony_ciextern int rtsx_usb_switch_clock(struct rtsx_ucr *ucr, unsigned int card_clock, 8862306a36Sopenharmony_ci u8 ssc_depth, bool initial_mode, bool double_clk, bool vpclk); 8962306a36Sopenharmony_ciextern int rtsx_usb_card_exclusive_check(struct rtsx_ucr *ucr, int card); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/* card status */ 9262306a36Sopenharmony_ci#define SD_CD 0x01 9362306a36Sopenharmony_ci#define MS_CD 0x02 9462306a36Sopenharmony_ci#define XD_CD 0x04 9562306a36Sopenharmony_ci#define CD_MASK (SD_CD | MS_CD | XD_CD) 9662306a36Sopenharmony_ci#define SD_WP 0x08 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/* reader command field offset & parameters */ 9962306a36Sopenharmony_ci#define READ_REG_CMD 0 10062306a36Sopenharmony_ci#define WRITE_REG_CMD 1 10162306a36Sopenharmony_ci#define CHECK_REG_CMD 2 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#define PACKET_TYPE 4 10462306a36Sopenharmony_ci#define CNT_H 5 10562306a36Sopenharmony_ci#define CNT_L 6 10662306a36Sopenharmony_ci#define STAGE_FLAG 7 10762306a36Sopenharmony_ci#define CMD_OFFSET 8 10862306a36Sopenharmony_ci#define SEQ_WRITE_DATA_OFFSET 12 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define BATCH_CMD 0 11162306a36Sopenharmony_ci#define SEQ_READ 1 11262306a36Sopenharmony_ci#define SEQ_WRITE 2 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#define STAGE_R 0x01 11562306a36Sopenharmony_ci#define STAGE_DI 0x02 11662306a36Sopenharmony_ci#define STAGE_DO 0x04 11762306a36Sopenharmony_ci#define STAGE_MS_STATUS 0x08 11862306a36Sopenharmony_ci#define STAGE_XD_STATUS 0x10 11962306a36Sopenharmony_ci#define MODE_C 0x00 12062306a36Sopenharmony_ci#define MODE_CR (STAGE_R) 12162306a36Sopenharmony_ci#define MODE_CDIR (STAGE_R | STAGE_DI) 12262306a36Sopenharmony_ci#define MODE_CDOR (STAGE_R | STAGE_DO) 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#define EP0_OP_SHIFT 14 12562306a36Sopenharmony_ci#define EP0_READ_REG_CMD 2 12662306a36Sopenharmony_ci#define EP0_WRITE_REG_CMD 3 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci#define rtsx_usb_cmd_hdr_tag(ucr) \ 12962306a36Sopenharmony_ci do { \ 13062306a36Sopenharmony_ci ucr->cmd_buf[0] = 'R'; \ 13162306a36Sopenharmony_ci ucr->cmd_buf[1] = 'T'; \ 13262306a36Sopenharmony_ci ucr->cmd_buf[2] = 'C'; \ 13362306a36Sopenharmony_ci ucr->cmd_buf[3] = 'R'; \ 13462306a36Sopenharmony_ci } while (0) 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistatic inline void rtsx_usb_init_cmd(struct rtsx_ucr *ucr) 13762306a36Sopenharmony_ci{ 13862306a36Sopenharmony_ci rtsx_usb_cmd_hdr_tag(ucr); 13962306a36Sopenharmony_ci ucr->cmd_idx = 0; 14062306a36Sopenharmony_ci ucr->cmd_buf[PACKET_TYPE] = BATCH_CMD; 14162306a36Sopenharmony_ci} 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci/* internal register address */ 14462306a36Sopenharmony_ci#define FPDCTL 0xFC00 14562306a36Sopenharmony_ci#define SSC_DIV_N_0 0xFC07 14662306a36Sopenharmony_ci#define SSC_CTL1 0xFC09 14762306a36Sopenharmony_ci#define SSC_CTL2 0xFC0A 14862306a36Sopenharmony_ci#define CFG_MODE 0xFC0E 14962306a36Sopenharmony_ci#define CFG_MODE_1 0xFC0F 15062306a36Sopenharmony_ci#define RCCTL 0xFC14 15162306a36Sopenharmony_ci#define SOF_WDOG 0xFC28 15262306a36Sopenharmony_ci#define SYS_DUMMY0 0xFC30 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci#define MS_BLKEND 0xFD30 15562306a36Sopenharmony_ci#define MS_READ_START 0xFD31 15662306a36Sopenharmony_ci#define MS_READ_COUNT 0xFD32 15762306a36Sopenharmony_ci#define MS_WRITE_START 0xFD33 15862306a36Sopenharmony_ci#define MS_WRITE_COUNT 0xFD34 15962306a36Sopenharmony_ci#define MS_COMMAND 0xFD35 16062306a36Sopenharmony_ci#define MS_OLD_BLOCK_0 0xFD36 16162306a36Sopenharmony_ci#define MS_OLD_BLOCK_1 0xFD37 16262306a36Sopenharmony_ci#define MS_NEW_BLOCK_0 0xFD38 16362306a36Sopenharmony_ci#define MS_NEW_BLOCK_1 0xFD39 16462306a36Sopenharmony_ci#define MS_LOG_BLOCK_0 0xFD3A 16562306a36Sopenharmony_ci#define MS_LOG_BLOCK_1 0xFD3B 16662306a36Sopenharmony_ci#define MS_BUS_WIDTH 0xFD3C 16762306a36Sopenharmony_ci#define MS_PAGE_START 0xFD3D 16862306a36Sopenharmony_ci#define MS_PAGE_LENGTH 0xFD3E 16962306a36Sopenharmony_ci#define MS_CFG 0xFD40 17062306a36Sopenharmony_ci#define MS_TPC 0xFD41 17162306a36Sopenharmony_ci#define MS_TRANS_CFG 0xFD42 17262306a36Sopenharmony_ci#define MS_TRANSFER 0xFD43 17362306a36Sopenharmony_ci#define MS_INT_REG 0xFD44 17462306a36Sopenharmony_ci#define MS_BYTE_CNT 0xFD45 17562306a36Sopenharmony_ci#define MS_SECTOR_CNT_L 0xFD46 17662306a36Sopenharmony_ci#define MS_SECTOR_CNT_H 0xFD47 17762306a36Sopenharmony_ci#define MS_DBUS_H 0xFD48 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci#define CARD_DMA1_CTL 0xFD5C 18062306a36Sopenharmony_ci#define CARD_PULL_CTL1 0xFD60 18162306a36Sopenharmony_ci#define CARD_PULL_CTL2 0xFD61 18262306a36Sopenharmony_ci#define CARD_PULL_CTL3 0xFD62 18362306a36Sopenharmony_ci#define CARD_PULL_CTL4 0xFD63 18462306a36Sopenharmony_ci#define CARD_PULL_CTL5 0xFD64 18562306a36Sopenharmony_ci#define CARD_PULL_CTL6 0xFD65 18662306a36Sopenharmony_ci#define CARD_EXIST 0xFD6F 18762306a36Sopenharmony_ci#define CARD_INT_PEND 0xFD71 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci#define LDO_POWER_CFG 0xFD7B 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci#define SD_CFG1 0xFDA0 19262306a36Sopenharmony_ci#define SD_CFG2 0xFDA1 19362306a36Sopenharmony_ci#define SD_CFG3 0xFDA2 19462306a36Sopenharmony_ci#define SD_STAT1 0xFDA3 19562306a36Sopenharmony_ci#define SD_STAT2 0xFDA4 19662306a36Sopenharmony_ci#define SD_BUS_STAT 0xFDA5 19762306a36Sopenharmony_ci#define SD_PAD_CTL 0xFDA6 19862306a36Sopenharmony_ci#define SD_SAMPLE_POINT_CTL 0xFDA7 19962306a36Sopenharmony_ci#define SD_PUSH_POINT_CTL 0xFDA8 20062306a36Sopenharmony_ci#define SD_CMD0 0xFDA9 20162306a36Sopenharmony_ci#define SD_CMD1 0xFDAA 20262306a36Sopenharmony_ci#define SD_CMD2 0xFDAB 20362306a36Sopenharmony_ci#define SD_CMD3 0xFDAC 20462306a36Sopenharmony_ci#define SD_CMD4 0xFDAD 20562306a36Sopenharmony_ci#define SD_CMD5 0xFDAE 20662306a36Sopenharmony_ci#define SD_BYTE_CNT_L 0xFDAF 20762306a36Sopenharmony_ci#define SD_BYTE_CNT_H 0xFDB0 20862306a36Sopenharmony_ci#define SD_BLOCK_CNT_L 0xFDB1 20962306a36Sopenharmony_ci#define SD_BLOCK_CNT_H 0xFDB2 21062306a36Sopenharmony_ci#define SD_TRANSFER 0xFDB3 21162306a36Sopenharmony_ci#define SD_CMD_STATE 0xFDB5 21262306a36Sopenharmony_ci#define SD_DATA_STATE 0xFDB6 21362306a36Sopenharmony_ci#define SD_VPCLK0_CTL 0xFC2A 21462306a36Sopenharmony_ci#define SD_VPCLK1_CTL 0xFC2B 21562306a36Sopenharmony_ci#define SD_DCMPS0_CTL 0xFC2C 21662306a36Sopenharmony_ci#define SD_DCMPS1_CTL 0xFC2D 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci#define CARD_DMA1_CTL 0xFD5C 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci#define HW_VERSION 0xFC01 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci#define SSC_CLK_FPGA_SEL 0xFC02 22362306a36Sopenharmony_ci#define CLK_DIV 0xFC03 22462306a36Sopenharmony_ci#define SFSM_ED 0xFC04 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci#define CD_DEGLITCH_WIDTH 0xFC20 22762306a36Sopenharmony_ci#define CD_DEGLITCH_EN 0xFC21 22862306a36Sopenharmony_ci#define AUTO_DELINK_EN 0xFC23 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci#define FPGA_PULL_CTL 0xFC1D 23162306a36Sopenharmony_ci#define CARD_CLK_SOURCE 0xFC2E 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci#define CARD_SHARE_MODE 0xFD51 23462306a36Sopenharmony_ci#define CARD_DRIVE_SEL 0xFD52 23562306a36Sopenharmony_ci#define CARD_STOP 0xFD53 23662306a36Sopenharmony_ci#define CARD_OE 0xFD54 23762306a36Sopenharmony_ci#define CARD_AUTO_BLINK 0xFD55 23862306a36Sopenharmony_ci#define CARD_GPIO 0xFD56 23962306a36Sopenharmony_ci#define SD30_DRIVE_SEL 0xFD57 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci#define CARD_DATA_SOURCE 0xFD5D 24262306a36Sopenharmony_ci#define CARD_SELECT 0xFD5E 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci#define CARD_CLK_EN 0xFD79 24562306a36Sopenharmony_ci#define CARD_PWR_CTL 0xFD7A 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci#define OCPCTL 0xFD80 24862306a36Sopenharmony_ci#define OCPPARA1 0xFD81 24962306a36Sopenharmony_ci#define OCPPARA2 0xFD82 25062306a36Sopenharmony_ci#define OCPSTAT 0xFD83 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci#define HS_USB_STAT 0xFE01 25362306a36Sopenharmony_ci#define HS_VCONTROL 0xFE26 25462306a36Sopenharmony_ci#define HS_VSTAIN 0xFE27 25562306a36Sopenharmony_ci#define HS_VLOADM 0xFE28 25662306a36Sopenharmony_ci#define HS_VSTAOUT 0xFE29 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci#define MC_IRQ 0xFF00 25962306a36Sopenharmony_ci#define MC_IRQEN 0xFF01 26062306a36Sopenharmony_ci#define MC_FIFO_CTL 0xFF02 26162306a36Sopenharmony_ci#define MC_FIFO_BC0 0xFF03 26262306a36Sopenharmony_ci#define MC_FIFO_BC1 0xFF04 26362306a36Sopenharmony_ci#define MC_FIFO_STAT 0xFF05 26462306a36Sopenharmony_ci#define MC_FIFO_MODE 0xFF06 26562306a36Sopenharmony_ci#define MC_FIFO_RD_PTR0 0xFF07 26662306a36Sopenharmony_ci#define MC_FIFO_RD_PTR1 0xFF08 26762306a36Sopenharmony_ci#define MC_DMA_CTL 0xFF10 26862306a36Sopenharmony_ci#define MC_DMA_TC0 0xFF11 26962306a36Sopenharmony_ci#define MC_DMA_TC1 0xFF12 27062306a36Sopenharmony_ci#define MC_DMA_TC2 0xFF13 27162306a36Sopenharmony_ci#define MC_DMA_TC3 0xFF14 27262306a36Sopenharmony_ci#define MC_DMA_RST 0xFF15 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci#define RBUF_SIZE_MASK 0xFBFF 27562306a36Sopenharmony_ci#define RBUF_BASE 0xF000 27662306a36Sopenharmony_ci#define PPBUF_BASE1 0xF800 27762306a36Sopenharmony_ci#define PPBUF_BASE2 0xFA00 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci/* internal register value macros */ 28062306a36Sopenharmony_ci#define POWER_OFF 0x03 28162306a36Sopenharmony_ci#define PARTIAL_POWER_ON 0x02 28262306a36Sopenharmony_ci#define POWER_ON 0x00 28362306a36Sopenharmony_ci#define POWER_MASK 0x03 28462306a36Sopenharmony_ci#define LDO3318_PWR_MASK 0x0C 28562306a36Sopenharmony_ci#define LDO_ON 0x00 28662306a36Sopenharmony_ci#define LDO_SUSPEND 0x08 28762306a36Sopenharmony_ci#define LDO_OFF 0x0C 28862306a36Sopenharmony_ci#define DV3318_AUTO_PWR_OFF 0x10 28962306a36Sopenharmony_ci#define FORCE_LDO_POWERB 0x60 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci/* LDO_POWER_CFG */ 29262306a36Sopenharmony_ci#define TUNE_SD18_MASK 0x1C 29362306a36Sopenharmony_ci#define TUNE_SD18_1V7 0x00 29462306a36Sopenharmony_ci#define TUNE_SD18_1V8 (0x01 << 2) 29562306a36Sopenharmony_ci#define TUNE_SD18_1V9 (0x02 << 2) 29662306a36Sopenharmony_ci#define TUNE_SD18_2V0 (0x03 << 2) 29762306a36Sopenharmony_ci#define TUNE_SD18_2V7 (0x04 << 2) 29862306a36Sopenharmony_ci#define TUNE_SD18_2V8 (0x05 << 2) 29962306a36Sopenharmony_ci#define TUNE_SD18_2V9 (0x06 << 2) 30062306a36Sopenharmony_ci#define TUNE_SD18_3V3 (0x07 << 2) 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci/* CLK_DIV */ 30362306a36Sopenharmony_ci#define CLK_CHANGE 0x80 30462306a36Sopenharmony_ci#define CLK_DIV_1 0x00 30562306a36Sopenharmony_ci#define CLK_DIV_2 0x01 30662306a36Sopenharmony_ci#define CLK_DIV_4 0x02 30762306a36Sopenharmony_ci#define CLK_DIV_8 0x03 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci#define SSC_POWER_MASK 0x01 31062306a36Sopenharmony_ci#define SSC_POWER_DOWN 0x01 31162306a36Sopenharmony_ci#define SSC_POWER_ON 0x00 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci#define FPGA_VER 0x80 31462306a36Sopenharmony_ci#define HW_VER_MASK 0x0F 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci#define EXTEND_DMA1_ASYNC_SIGNAL 0x02 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci/* CFG_MODE*/ 31962306a36Sopenharmony_ci#define XTAL_FREE 0x80 32062306a36Sopenharmony_ci#define CLK_MODE_MASK 0x03 32162306a36Sopenharmony_ci#define CLK_MODE_12M_XTAL 0x00 32262306a36Sopenharmony_ci#define CLK_MODE_NON_XTAL 0x01 32362306a36Sopenharmony_ci#define CLK_MODE_24M_OSC 0x02 32462306a36Sopenharmony_ci#define CLK_MODE_48M_OSC 0x03 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci/* CFG_MODE_1*/ 32762306a36Sopenharmony_ci#define RTS5179 0x02 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci#define NYET_EN 0x01 33062306a36Sopenharmony_ci#define NYET_MSAK 0x01 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci#define SD30_DRIVE_MASK 0x07 33362306a36Sopenharmony_ci#define SD20_DRIVE_MASK 0x03 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci#define DISABLE_SD_CD 0x08 33662306a36Sopenharmony_ci#define DISABLE_MS_CD 0x10 33762306a36Sopenharmony_ci#define DISABLE_XD_CD 0x20 33862306a36Sopenharmony_ci#define SD_CD_DEGLITCH_EN 0x01 33962306a36Sopenharmony_ci#define MS_CD_DEGLITCH_EN 0x02 34062306a36Sopenharmony_ci#define XD_CD_DEGLITCH_EN 0x04 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci#define CARD_SHARE_LQFP48 0x04 34362306a36Sopenharmony_ci#define CARD_SHARE_QFN24 0x00 34462306a36Sopenharmony_ci#define CARD_SHARE_LQFP_SEL 0x04 34562306a36Sopenharmony_ci#define CARD_SHARE_XD 0x00 34662306a36Sopenharmony_ci#define CARD_SHARE_SD 0x01 34762306a36Sopenharmony_ci#define CARD_SHARE_MS 0x02 34862306a36Sopenharmony_ci#define CARD_SHARE_MASK 0x03 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci/* SD30_DRIVE_SEL */ 35262306a36Sopenharmony_ci#define DRIVER_TYPE_A 0x05 35362306a36Sopenharmony_ci#define DRIVER_TYPE_B 0x03 35462306a36Sopenharmony_ci#define DRIVER_TYPE_C 0x02 35562306a36Sopenharmony_ci#define DRIVER_TYPE_D 0x01 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci/* SD_BUS_STAT */ 35862306a36Sopenharmony_ci#define SD_CLK_TOGGLE_EN 0x80 35962306a36Sopenharmony_ci#define SD_CLK_FORCE_STOP 0x40 36062306a36Sopenharmony_ci#define SD_DAT3_STATUS 0x10 36162306a36Sopenharmony_ci#define SD_DAT2_STATUS 0x08 36262306a36Sopenharmony_ci#define SD_DAT1_STATUS 0x04 36362306a36Sopenharmony_ci#define SD_DAT0_STATUS 0x02 36462306a36Sopenharmony_ci#define SD_CMD_STATUS 0x01 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci/* SD_PAD_CTL */ 36762306a36Sopenharmony_ci#define SD_IO_USING_1V8 0x80 36862306a36Sopenharmony_ci#define SD_IO_USING_3V3 0x7F 36962306a36Sopenharmony_ci#define TYPE_A_DRIVING 0x00 37062306a36Sopenharmony_ci#define TYPE_B_DRIVING 0x01 37162306a36Sopenharmony_ci#define TYPE_C_DRIVING 0x02 37262306a36Sopenharmony_ci#define TYPE_D_DRIVING 0x03 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci/* CARD_CLK_EN */ 37562306a36Sopenharmony_ci#define SD_CLK_EN 0x04 37662306a36Sopenharmony_ci#define MS_CLK_EN 0x08 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci/* CARD_SELECT */ 37962306a36Sopenharmony_ci#define SD_MOD_SEL 2 38062306a36Sopenharmony_ci#define MS_MOD_SEL 3 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci/* CARD_SHARE_MODE */ 38362306a36Sopenharmony_ci#define CARD_SHARE_LQFP48 0x04 38462306a36Sopenharmony_ci#define CARD_SHARE_QFN24 0x00 38562306a36Sopenharmony_ci#define CARD_SHARE_LQFP_SEL 0x04 38662306a36Sopenharmony_ci#define CARD_SHARE_XD 0x00 38762306a36Sopenharmony_ci#define CARD_SHARE_SD 0x01 38862306a36Sopenharmony_ci#define CARD_SHARE_MS 0x02 38962306a36Sopenharmony_ci#define CARD_SHARE_MASK 0x03 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci/* SSC_CTL1 */ 39262306a36Sopenharmony_ci#define SSC_RSTB 0x80 39362306a36Sopenharmony_ci#define SSC_8X_EN 0x40 39462306a36Sopenharmony_ci#define SSC_FIX_FRAC 0x20 39562306a36Sopenharmony_ci#define SSC_SEL_1M 0x00 39662306a36Sopenharmony_ci#define SSC_SEL_2M 0x08 39762306a36Sopenharmony_ci#define SSC_SEL_4M 0x10 39862306a36Sopenharmony_ci#define SSC_SEL_8M 0x18 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci/* SSC_CTL2 */ 40162306a36Sopenharmony_ci#define SSC_DEPTH_MASK 0x03 40262306a36Sopenharmony_ci#define SSC_DEPTH_DISALBE 0x00 40362306a36Sopenharmony_ci#define SSC_DEPTH_2M 0x01 40462306a36Sopenharmony_ci#define SSC_DEPTH_1M 0x02 40562306a36Sopenharmony_ci#define SSC_DEPTH_512K 0x03 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci/* SD_VPCLK0_CTL */ 40862306a36Sopenharmony_ci#define PHASE_CHANGE 0x80 40962306a36Sopenharmony_ci#define PHASE_NOT_RESET 0x40 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci/* SD_TRANSFER */ 41262306a36Sopenharmony_ci#define SD_TRANSFER_START 0x80 41362306a36Sopenharmony_ci#define SD_TRANSFER_END 0x40 41462306a36Sopenharmony_ci#define SD_STAT_IDLE 0x20 41562306a36Sopenharmony_ci#define SD_TRANSFER_ERR 0x10 41662306a36Sopenharmony_ci#define SD_TM_NORMAL_WRITE 0x00 41762306a36Sopenharmony_ci#define SD_TM_AUTO_WRITE_3 0x01 41862306a36Sopenharmony_ci#define SD_TM_AUTO_WRITE_4 0x02 41962306a36Sopenharmony_ci#define SD_TM_AUTO_READ_3 0x05 42062306a36Sopenharmony_ci#define SD_TM_AUTO_READ_4 0x06 42162306a36Sopenharmony_ci#define SD_TM_CMD_RSP 0x08 42262306a36Sopenharmony_ci#define SD_TM_AUTO_WRITE_1 0x09 42362306a36Sopenharmony_ci#define SD_TM_AUTO_WRITE_2 0x0A 42462306a36Sopenharmony_ci#define SD_TM_NORMAL_READ 0x0C 42562306a36Sopenharmony_ci#define SD_TM_AUTO_READ_1 0x0D 42662306a36Sopenharmony_ci#define SD_TM_AUTO_READ_2 0x0E 42762306a36Sopenharmony_ci#define SD_TM_AUTO_TUNING 0x0F 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci/* SD_CFG1 */ 43062306a36Sopenharmony_ci#define SD_CLK_DIVIDE_0 0x00 43162306a36Sopenharmony_ci#define SD_CLK_DIVIDE_256 0xC0 43262306a36Sopenharmony_ci#define SD_CLK_DIVIDE_128 0x80 43362306a36Sopenharmony_ci#define SD_CLK_DIVIDE_MASK 0xC0 43462306a36Sopenharmony_ci#define SD_BUS_WIDTH_1BIT 0x00 43562306a36Sopenharmony_ci#define SD_BUS_WIDTH_4BIT 0x01 43662306a36Sopenharmony_ci#define SD_BUS_WIDTH_8BIT 0x02 43762306a36Sopenharmony_ci#define SD_ASYNC_FIFO_RST 0x10 43862306a36Sopenharmony_ci#define SD_20_MODE 0x00 43962306a36Sopenharmony_ci#define SD_DDR_MODE 0x04 44062306a36Sopenharmony_ci#define SD_30_MODE 0x08 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci/* SD_CFG2 */ 44362306a36Sopenharmony_ci#define SD_CALCULATE_CRC7 0x00 44462306a36Sopenharmony_ci#define SD_NO_CALCULATE_CRC7 0x80 44562306a36Sopenharmony_ci#define SD_CHECK_CRC16 0x00 44662306a36Sopenharmony_ci#define SD_NO_CHECK_CRC16 0x40 44762306a36Sopenharmony_ci#define SD_WAIT_CRC_TO_EN 0x20 44862306a36Sopenharmony_ci#define SD_WAIT_BUSY_END 0x08 44962306a36Sopenharmony_ci#define SD_NO_WAIT_BUSY_END 0x00 45062306a36Sopenharmony_ci#define SD_CHECK_CRC7 0x00 45162306a36Sopenharmony_ci#define SD_NO_CHECK_CRC7 0x04 45262306a36Sopenharmony_ci#define SD_RSP_LEN_0 0x00 45362306a36Sopenharmony_ci#define SD_RSP_LEN_6 0x01 45462306a36Sopenharmony_ci#define SD_RSP_LEN_17 0x02 45562306a36Sopenharmony_ci#define SD_RSP_TYPE_R0 0x04 45662306a36Sopenharmony_ci#define SD_RSP_TYPE_R1 0x01 45762306a36Sopenharmony_ci#define SD_RSP_TYPE_R1b 0x09 45862306a36Sopenharmony_ci#define SD_RSP_TYPE_R2 0x02 45962306a36Sopenharmony_ci#define SD_RSP_TYPE_R3 0x05 46062306a36Sopenharmony_ci#define SD_RSP_TYPE_R4 0x05 46162306a36Sopenharmony_ci#define SD_RSP_TYPE_R5 0x01 46262306a36Sopenharmony_ci#define SD_RSP_TYPE_R6 0x01 46362306a36Sopenharmony_ci#define SD_RSP_TYPE_R7 0x01 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci/* SD_STAT1 */ 46662306a36Sopenharmony_ci#define SD_CRC7_ERR 0x80 46762306a36Sopenharmony_ci#define SD_CRC16_ERR 0x40 46862306a36Sopenharmony_ci#define SD_CRC_WRITE_ERR 0x20 46962306a36Sopenharmony_ci#define SD_CRC_WRITE_ERR_MASK 0x1C 47062306a36Sopenharmony_ci#define GET_CRC_TIME_OUT 0x02 47162306a36Sopenharmony_ci#define SD_TUNING_COMPARE_ERR 0x01 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci/* SD_DATA_STATE */ 47462306a36Sopenharmony_ci#define SD_DATA_IDLE 0x80 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci/* CARD_DATA_SOURCE */ 47762306a36Sopenharmony_ci#define PINGPONG_BUFFER 0x01 47862306a36Sopenharmony_ci#define RING_BUFFER 0x00 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci/* CARD_OE */ 48162306a36Sopenharmony_ci#define SD_OUTPUT_EN 0x04 48262306a36Sopenharmony_ci#define MS_OUTPUT_EN 0x08 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci/* CARD_STOP */ 48562306a36Sopenharmony_ci#define SD_STOP 0x04 48662306a36Sopenharmony_ci#define MS_STOP 0x08 48762306a36Sopenharmony_ci#define SD_CLR_ERR 0x40 48862306a36Sopenharmony_ci#define MS_CLR_ERR 0x80 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci/* CARD_CLK_SOURCE */ 49162306a36Sopenharmony_ci#define CRC_FIX_CLK (0x00 << 0) 49262306a36Sopenharmony_ci#define CRC_VAR_CLK0 (0x01 << 0) 49362306a36Sopenharmony_ci#define CRC_VAR_CLK1 (0x02 << 0) 49462306a36Sopenharmony_ci#define SD30_FIX_CLK (0x00 << 2) 49562306a36Sopenharmony_ci#define SD30_VAR_CLK0 (0x01 << 2) 49662306a36Sopenharmony_ci#define SD30_VAR_CLK1 (0x02 << 2) 49762306a36Sopenharmony_ci#define SAMPLE_FIX_CLK (0x00 << 4) 49862306a36Sopenharmony_ci#define SAMPLE_VAR_CLK0 (0x01 << 4) 49962306a36Sopenharmony_ci#define SAMPLE_VAR_CLK1 (0x02 << 4) 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ci/* SD_SAMPLE_POINT_CTL */ 50262306a36Sopenharmony_ci#define DDR_FIX_RX_DAT 0x00 50362306a36Sopenharmony_ci#define DDR_VAR_RX_DAT 0x80 50462306a36Sopenharmony_ci#define DDR_FIX_RX_DAT_EDGE 0x00 50562306a36Sopenharmony_ci#define DDR_FIX_RX_DAT_14_DELAY 0x40 50662306a36Sopenharmony_ci#define DDR_FIX_RX_CMD 0x00 50762306a36Sopenharmony_ci#define DDR_VAR_RX_CMD 0x20 50862306a36Sopenharmony_ci#define DDR_FIX_RX_CMD_POS_EDGE 0x00 50962306a36Sopenharmony_ci#define DDR_FIX_RX_CMD_14_DELAY 0x10 51062306a36Sopenharmony_ci#define SD20_RX_POS_EDGE 0x00 51162306a36Sopenharmony_ci#define SD20_RX_14_DELAY 0x08 51262306a36Sopenharmony_ci#define SD20_RX_SEL_MASK 0x08 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci/* SD_PUSH_POINT_CTL */ 51562306a36Sopenharmony_ci#define DDR_FIX_TX_CMD_DAT 0x00 51662306a36Sopenharmony_ci#define DDR_VAR_TX_CMD_DAT 0x80 51762306a36Sopenharmony_ci#define DDR_FIX_TX_DAT_14_TSU 0x00 51862306a36Sopenharmony_ci#define DDR_FIX_TX_DAT_12_TSU 0x40 51962306a36Sopenharmony_ci#define DDR_FIX_TX_CMD_NEG_EDGE 0x00 52062306a36Sopenharmony_ci#define DDR_FIX_TX_CMD_14_AHEAD 0x20 52162306a36Sopenharmony_ci#define SD20_TX_NEG_EDGE 0x00 52262306a36Sopenharmony_ci#define SD20_TX_14_AHEAD 0x10 52362306a36Sopenharmony_ci#define SD20_TX_SEL_MASK 0x10 52462306a36Sopenharmony_ci#define DDR_VAR_SDCLK_POL_SWAP 0x01 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci/* MS_CFG */ 52762306a36Sopenharmony_ci#define SAMPLE_TIME_RISING 0x00 52862306a36Sopenharmony_ci#define SAMPLE_TIME_FALLING 0x80 52962306a36Sopenharmony_ci#define PUSH_TIME_DEFAULT 0x00 53062306a36Sopenharmony_ci#define PUSH_TIME_ODD 0x40 53162306a36Sopenharmony_ci#define NO_EXTEND_TOGGLE 0x00 53262306a36Sopenharmony_ci#define EXTEND_TOGGLE_CHK 0x20 53362306a36Sopenharmony_ci#define MS_BUS_WIDTH_1 0x00 53462306a36Sopenharmony_ci#define MS_BUS_WIDTH_4 0x10 53562306a36Sopenharmony_ci#define MS_BUS_WIDTH_8 0x18 53662306a36Sopenharmony_ci#define MS_2K_SECTOR_MODE 0x04 53762306a36Sopenharmony_ci#define MS_512_SECTOR_MODE 0x00 53862306a36Sopenharmony_ci#define MS_TOGGLE_TIMEOUT_EN 0x00 53962306a36Sopenharmony_ci#define MS_TOGGLE_TIMEOUT_DISEN 0x01 54062306a36Sopenharmony_ci#define MS_NO_CHECK_INT 0x02 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci/* MS_TRANS_CFG */ 54362306a36Sopenharmony_ci#define WAIT_INT 0x80 54462306a36Sopenharmony_ci#define NO_WAIT_INT 0x00 54562306a36Sopenharmony_ci#define NO_AUTO_READ_INT_REG 0x00 54662306a36Sopenharmony_ci#define AUTO_READ_INT_REG 0x40 54762306a36Sopenharmony_ci#define MS_CRC16_ERR 0x20 54862306a36Sopenharmony_ci#define MS_RDY_TIMEOUT 0x10 54962306a36Sopenharmony_ci#define MS_INT_CMDNK 0x08 55062306a36Sopenharmony_ci#define MS_INT_BREQ 0x04 55162306a36Sopenharmony_ci#define MS_INT_ERR 0x02 55262306a36Sopenharmony_ci#define MS_INT_CED 0x01 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci/* MS_TRANSFER */ 55562306a36Sopenharmony_ci#define MS_TRANSFER_START 0x80 55662306a36Sopenharmony_ci#define MS_TRANSFER_END 0x40 55762306a36Sopenharmony_ci#define MS_TRANSFER_ERR 0x20 55862306a36Sopenharmony_ci#define MS_BS_STATE 0x10 55962306a36Sopenharmony_ci#define MS_TM_READ_BYTES 0x00 56062306a36Sopenharmony_ci#define MS_TM_NORMAL_READ 0x01 56162306a36Sopenharmony_ci#define MS_TM_WRITE_BYTES 0x04 56262306a36Sopenharmony_ci#define MS_TM_NORMAL_WRITE 0x05 56362306a36Sopenharmony_ci#define MS_TM_AUTO_READ 0x08 56462306a36Sopenharmony_ci#define MS_TM_AUTO_WRITE 0x0C 56562306a36Sopenharmony_ci#define MS_TM_SET_CMD 0x06 56662306a36Sopenharmony_ci#define MS_TM_COPY_PAGE 0x07 56762306a36Sopenharmony_ci#define MS_TM_MULTI_READ 0x02 56862306a36Sopenharmony_ci#define MS_TM_MULTI_WRITE 0x03 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci/* MC_FIFO_CTL */ 57162306a36Sopenharmony_ci#define FIFO_FLUSH 0x01 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_ci/* MC_DMA_RST */ 57462306a36Sopenharmony_ci#define DMA_RESET 0x01 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci/* MC_DMA_CTL */ 57762306a36Sopenharmony_ci#define DMA_TC_EQ_0 0x80 57862306a36Sopenharmony_ci#define DMA_DIR_TO_CARD 0x00 57962306a36Sopenharmony_ci#define DMA_DIR_FROM_CARD 0x02 58062306a36Sopenharmony_ci#define DMA_EN 0x01 58162306a36Sopenharmony_ci#define DMA_128 (0 << 2) 58262306a36Sopenharmony_ci#define DMA_256 (1 << 2) 58362306a36Sopenharmony_ci#define DMA_512 (2 << 2) 58462306a36Sopenharmony_ci#define DMA_1024 (3 << 2) 58562306a36Sopenharmony_ci#define DMA_PACK_SIZE_MASK 0x0C 58662306a36Sopenharmony_ci 58762306a36Sopenharmony_ci/* CARD_INT_PEND */ 58862306a36Sopenharmony_ci#define XD_INT 0x10 58962306a36Sopenharmony_ci#define MS_INT 0x08 59062306a36Sopenharmony_ci#define SD_INT 0x04 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_ci/* LED operations*/ 59362306a36Sopenharmony_cistatic inline int rtsx_usb_turn_on_led(struct rtsx_ucr *ucr) 59462306a36Sopenharmony_ci{ 59562306a36Sopenharmony_ci return rtsx_usb_ep0_write_register(ucr, CARD_GPIO, 0x03, 0x02); 59662306a36Sopenharmony_ci} 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_cistatic inline int rtsx_usb_turn_off_led(struct rtsx_ucr *ucr) 59962306a36Sopenharmony_ci{ 60062306a36Sopenharmony_ci return rtsx_usb_ep0_write_register(ucr, CARD_GPIO, 0x03, 0x03); 60162306a36Sopenharmony_ci} 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci/* HW error clearing */ 60462306a36Sopenharmony_cistatic inline void rtsx_usb_clear_fsm_err(struct rtsx_ucr *ucr) 60562306a36Sopenharmony_ci{ 60662306a36Sopenharmony_ci rtsx_usb_ep0_write_register(ucr, SFSM_ED, 0xf8, 0xf8); 60762306a36Sopenharmony_ci} 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_cistatic inline void rtsx_usb_clear_dma_err(struct rtsx_ucr *ucr) 61062306a36Sopenharmony_ci{ 61162306a36Sopenharmony_ci rtsx_usb_ep0_write_register(ucr, MC_FIFO_CTL, 61262306a36Sopenharmony_ci FIFO_FLUSH, FIFO_FLUSH); 61362306a36Sopenharmony_ci rtsx_usb_ep0_write_register(ucr, MC_DMA_RST, DMA_RESET, DMA_RESET); 61462306a36Sopenharmony_ci} 61562306a36Sopenharmony_ci#endif /* __RTS51139_H */ 616