1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 21b2fd5bfSSimon Glass /* 31b2fd5bfSSimon Glass * SPI driver for rockchip 41b2fd5bfSSimon Glass * 51b2fd5bfSSimon Glass * (C) Copyright 2015 Google, Inc 61b2fd5bfSSimon Glass * 71b2fd5bfSSimon Glass * (C) Copyright 2008-2013 Rockchip Electronics 81b2fd5bfSSimon Glass * Peter, Software Engineering, <superpeter.cai@gmail.com>. 91b2fd5bfSSimon Glass */ 101b2fd5bfSSimon Glass 111b2fd5bfSSimon Glass #ifndef __RK_SPI_H 121b2fd5bfSSimon Glass #define __RK_SPI_H 131b2fd5bfSSimon Glass 141b2fd5bfSSimon Glass struct rockchip_spi { 151b2fd5bfSSimon Glass u32 ctrlr0; 161b2fd5bfSSimon Glass u32 ctrlr1; 171b2fd5bfSSimon Glass u32 enr; 181b2fd5bfSSimon Glass u32 ser; 191b2fd5bfSSimon Glass u32 baudr; 201b2fd5bfSSimon Glass u32 txftlr; 211b2fd5bfSSimon Glass u32 rxftlr; 221b2fd5bfSSimon Glass u32 txflr; 231b2fd5bfSSimon Glass u32 rxflr; 241b2fd5bfSSimon Glass u32 sr; 251b2fd5bfSSimon Glass u32 ipr; 261b2fd5bfSSimon Glass u32 imr; 271b2fd5bfSSimon Glass u32 isr; 281b2fd5bfSSimon Glass u32 risr; 291b2fd5bfSSimon Glass u32 icr; 301b2fd5bfSSimon Glass u32 dmacr; 311b2fd5bfSSimon Glass u32 dmatdlr; 321b2fd5bfSSimon Glass u32 dmardlr; /* 0x44 */ 331b2fd5bfSSimon Glass u32 reserved[0xef]; 341b2fd5bfSSimon Glass u32 txdr[0x100]; /* 0x400 */ 351b2fd5bfSSimon Glass u32 rxdr[0x100]; /* 0x800 */ 361b2fd5bfSSimon Glass }; 371b2fd5bfSSimon Glass 381b2fd5bfSSimon Glass /* CTRLR0 */ 391b2fd5bfSSimon Glass enum { 401b2fd5bfSSimon Glass DFS_SHIFT = 0, /* Data Frame Size */ 411b2fd5bfSSimon Glass DFS_MASK = 3, 421b2fd5bfSSimon Glass DFS_4BIT = 0, 431b2fd5bfSSimon Glass DFS_8BIT, 441b2fd5bfSSimon Glass DFS_16BIT, 451b2fd5bfSSimon Glass DFS_RESV, 461b2fd5bfSSimon Glass 471b2fd5bfSSimon Glass CFS_SHIFT = 2, /* Control Frame Size */ 481b2fd5bfSSimon Glass CFS_MASK = 0xf, 491b2fd5bfSSimon Glass 501b2fd5bfSSimon Glass SCPH_SHIFT = 6, /* Serial Clock Phase */ 511b2fd5bfSSimon Glass SCPH_MASK = 1, 521b2fd5bfSSimon Glass SCPH_TOGMID = 0, /* SCLK toggles in middle of first data bit */ 531b2fd5bfSSimon Glass SCPH_TOGSTA, /* SCLK toggles at start of first data bit */ 541b2fd5bfSSimon Glass 551b2fd5bfSSimon Glass SCOL_SHIFT = 7, /* Serial Clock Polarity */ 561b2fd5bfSSimon Glass SCOL_MASK = 1, 571b2fd5bfSSimon Glass SCOL_LOW = 0, /* Inactive state of serial clock is low */ 581b2fd5bfSSimon Glass SCOL_HIGH, /* Inactive state of serial clock is high */ 591b2fd5bfSSimon Glass 601b2fd5bfSSimon Glass CSM_SHIFT = 8, /* Chip Select Mode */ 611b2fd5bfSSimon Glass CSM_MASK = 0x3, 621b2fd5bfSSimon Glass CSM_KEEP = 0, /* ss_n stays low after each frame */ 631b2fd5bfSSimon Glass CSM_HALF, /* ss_n high for half sclk_out cycles */ 641b2fd5bfSSimon Glass CSM_ONE, /* ss_n high for one sclk_out cycle */ 651b2fd5bfSSimon Glass CSM_RESV, 661b2fd5bfSSimon Glass 671b2fd5bfSSimon Glass SSN_DELAY_SHIFT = 10, /* SSN to Sclk_out delay */ 681b2fd5bfSSimon Glass SSN_DELAY_MASK = 1, 691b2fd5bfSSimon Glass SSN_DELAY_HALF = 0, /* 1/2 sclk_out cycle */ 701b2fd5bfSSimon Glass SSN_DELAY_ONE = 1, /* 1 sclk_out cycle */ 711b2fd5bfSSimon Glass 721b2fd5bfSSimon Glass SEM_SHIFT = 11, /* Serial Endian Mode */ 731b2fd5bfSSimon Glass SEM_MASK = 1, 741b2fd5bfSSimon Glass SEM_LITTLE = 0, /* little endian */ 751b2fd5bfSSimon Glass SEM_BIG, /* big endian */ 761b2fd5bfSSimon Glass 771b2fd5bfSSimon Glass FBM_SHIFT = 12, /* First Bit Mode */ 781b2fd5bfSSimon Glass FBM_MASK = 1, 791b2fd5bfSSimon Glass FBM_MSB = 0, /* first bit is MSB */ 801b2fd5bfSSimon Glass FBM_LSB, /* first bit in LSB */ 811b2fd5bfSSimon Glass 821b2fd5bfSSimon Glass HALF_WORD_TX_SHIFT = 13, /* Byte and Halfword Transform */ 831b2fd5bfSSimon Glass HALF_WORD_MASK = 1, 841b2fd5bfSSimon Glass HALF_WORD_ON = 0, /* apb 16bit write/read, spi 8bit write/read */ 851b2fd5bfSSimon Glass HALF_WORD_OFF, /* apb 8bit write/read, spi 8bit write/read */ 861b2fd5bfSSimon Glass 871b2fd5bfSSimon Glass RXDSD_SHIFT = 14, /* Rxd Sample Delay, in cycles */ 881b2fd5bfSSimon Glass RXDSD_MASK = 3, 891b2fd5bfSSimon Glass 901b2fd5bfSSimon Glass FRF_SHIFT = 16, /* Frame Format */ 911b2fd5bfSSimon Glass FRF_MASK = 3, 921b2fd5bfSSimon Glass FRF_SPI = 0, /* Motorola SPI */ 931b2fd5bfSSimon Glass FRF_SSP, /* Texas Instruments SSP*/ 941b2fd5bfSSimon Glass FRF_MICROWIRE, /* National Semiconductors Microwire */ 951b2fd5bfSSimon Glass FRF_RESV, 961b2fd5bfSSimon Glass 971b2fd5bfSSimon Glass TMOD_SHIFT = 18, /* Transfer Mode */ 981b2fd5bfSSimon Glass TMOD_MASK = 3, 991b2fd5bfSSimon Glass TMOD_TR = 0, /* xmit & recv */ 1001b2fd5bfSSimon Glass TMOD_TO, /* xmit only */ 1011b2fd5bfSSimon Glass TMOD_RO, /* recv only */ 1021b2fd5bfSSimon Glass TMOD_RESV, 1031b2fd5bfSSimon Glass 1041b2fd5bfSSimon Glass OMOD_SHIFT = 20, /* Operation Mode */ 1051b2fd5bfSSimon Glass OMOD_MASK = 1, 1061b2fd5bfSSimon Glass OMOD_MASTER = 0, /* Master Mode */ 1071b2fd5bfSSimon Glass OMOD_SLAVE, /* Slave Mode */ 1081b2fd5bfSSimon Glass }; 1091b2fd5bfSSimon Glass 1101b2fd5bfSSimon Glass /* SR */ 1111b2fd5bfSSimon Glass enum { 1121b2fd5bfSSimon Glass SR_MASK = 0x7f, 1131b2fd5bfSSimon Glass SR_BUSY = 1 << 0, 1141b2fd5bfSSimon Glass SR_TF_FULL = 1 << 1, 1151b2fd5bfSSimon Glass SR_TF_EMPT = 1 << 2, 1161b2fd5bfSSimon Glass SR_RF_EMPT = 1 << 3, 1171b2fd5bfSSimon Glass SR_RF_FULL = 1 << 4, 1181b2fd5bfSSimon Glass }; 1191b2fd5bfSSimon Glass 1201b2fd5bfSSimon Glass #define ROCKCHIP_SPI_TIMEOUT_MS 1000 121bd376714SPhilipp Tomsich 122bd376714SPhilipp Tomsich /* 123bd376714SPhilipp Tomsich * We limit the maximum bitrate to 50MBit/s (50MHz) due to an assumed 124bd376714SPhilipp Tomsich * hardware limitation... the Linux kernel source has the following 125bd376714SPhilipp Tomsich * comment: 126bd376714SPhilipp Tomsich * "sclk_out: spi master internal logic in rk3x can support 50Mhz" 127bd376714SPhilipp Tomsich */ 128bd376714SPhilipp Tomsich #define ROCKCHIP_SPI_MAX_RATE 50000000 1291b2fd5bfSSimon Glass 1301b2fd5bfSSimon Glass #endif /* __RK_SPI_H */ 131