1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * include/linux/amba/pl022.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2008-2009 ST-Ericsson AB 6*4882a593Smuzhiyun * Copyright (C) 2006 STMicroelectronics Pvt. Ltd. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Author: Linus Walleij <linus.walleij@stericsson.com> 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Initial version inspired by: 11*4882a593Smuzhiyun * linux-2.6.17-rc3-mm1/drivers/spi/pxa2xx_spi.c 12*4882a593Smuzhiyun * Initial adoption to PL022 by: 13*4882a593Smuzhiyun * Sachin Verma <sachin.verma@st.com> 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #ifndef _SSP_PL022_H 17*4882a593Smuzhiyun #define _SSP_PL022_H 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #include <linux/types.h> 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /** 22*4882a593Smuzhiyun * whether SSP is in loopback mode or not 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun enum ssp_loopback { 25*4882a593Smuzhiyun LOOPBACK_DISABLED, 26*4882a593Smuzhiyun LOOPBACK_ENABLED 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /** 30*4882a593Smuzhiyun * enum ssp_interface - interfaces allowed for this SSP Controller 31*4882a593Smuzhiyun * @SSP_INTERFACE_MOTOROLA_SPI: Motorola Interface 32*4882a593Smuzhiyun * @SSP_INTERFACE_TI_SYNC_SERIAL: Texas Instrument Synchronous Serial 33*4882a593Smuzhiyun * interface 34*4882a593Smuzhiyun * @SSP_INTERFACE_NATIONAL_MICROWIRE: National Semiconductor Microwire 35*4882a593Smuzhiyun * interface 36*4882a593Smuzhiyun * @SSP_INTERFACE_UNIDIRECTIONAL: Unidirectional interface (STn8810 37*4882a593Smuzhiyun * &STn8815 only) 38*4882a593Smuzhiyun */ 39*4882a593Smuzhiyun enum ssp_interface { 40*4882a593Smuzhiyun SSP_INTERFACE_MOTOROLA_SPI, 41*4882a593Smuzhiyun SSP_INTERFACE_TI_SYNC_SERIAL, 42*4882a593Smuzhiyun SSP_INTERFACE_NATIONAL_MICROWIRE, 43*4882a593Smuzhiyun SSP_INTERFACE_UNIDIRECTIONAL 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /** 47*4882a593Smuzhiyun * enum ssp_hierarchy - whether SSP is configured as Master or Slave 48*4882a593Smuzhiyun */ 49*4882a593Smuzhiyun enum ssp_hierarchy { 50*4882a593Smuzhiyun SSP_MASTER, 51*4882a593Smuzhiyun SSP_SLAVE 52*4882a593Smuzhiyun }; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /** 55*4882a593Smuzhiyun * enum ssp_clock_params - clock parameters, to set SSP clock at a 56*4882a593Smuzhiyun * desired freq 57*4882a593Smuzhiyun */ 58*4882a593Smuzhiyun struct ssp_clock_params { 59*4882a593Smuzhiyun u8 cpsdvsr; /* value from 2 to 254 (even only!) */ 60*4882a593Smuzhiyun u8 scr; /* value from 0 to 255 */ 61*4882a593Smuzhiyun }; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /** 64*4882a593Smuzhiyun * enum ssp_rx_endian - endianess of Rx FIFO Data 65*4882a593Smuzhiyun * this feature is only available in ST versionf of PL022 66*4882a593Smuzhiyun */ 67*4882a593Smuzhiyun enum ssp_rx_endian { 68*4882a593Smuzhiyun SSP_RX_MSB, 69*4882a593Smuzhiyun SSP_RX_LSB 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /** 73*4882a593Smuzhiyun * enum ssp_tx_endian - endianess of Tx FIFO Data 74*4882a593Smuzhiyun */ 75*4882a593Smuzhiyun enum ssp_tx_endian { 76*4882a593Smuzhiyun SSP_TX_MSB, 77*4882a593Smuzhiyun SSP_TX_LSB 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /** 81*4882a593Smuzhiyun * enum ssp_data_size - number of bits in one data element 82*4882a593Smuzhiyun */ 83*4882a593Smuzhiyun enum ssp_data_size { 84*4882a593Smuzhiyun SSP_DATA_BITS_4 = 0x03, SSP_DATA_BITS_5, SSP_DATA_BITS_6, 85*4882a593Smuzhiyun SSP_DATA_BITS_7, SSP_DATA_BITS_8, SSP_DATA_BITS_9, 86*4882a593Smuzhiyun SSP_DATA_BITS_10, SSP_DATA_BITS_11, SSP_DATA_BITS_12, 87*4882a593Smuzhiyun SSP_DATA_BITS_13, SSP_DATA_BITS_14, SSP_DATA_BITS_15, 88*4882a593Smuzhiyun SSP_DATA_BITS_16, SSP_DATA_BITS_17, SSP_DATA_BITS_18, 89*4882a593Smuzhiyun SSP_DATA_BITS_19, SSP_DATA_BITS_20, SSP_DATA_BITS_21, 90*4882a593Smuzhiyun SSP_DATA_BITS_22, SSP_DATA_BITS_23, SSP_DATA_BITS_24, 91*4882a593Smuzhiyun SSP_DATA_BITS_25, SSP_DATA_BITS_26, SSP_DATA_BITS_27, 92*4882a593Smuzhiyun SSP_DATA_BITS_28, SSP_DATA_BITS_29, SSP_DATA_BITS_30, 93*4882a593Smuzhiyun SSP_DATA_BITS_31, SSP_DATA_BITS_32 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /** 97*4882a593Smuzhiyun * enum ssp_mode - SSP mode of operation (Communication modes) 98*4882a593Smuzhiyun */ 99*4882a593Smuzhiyun enum ssp_mode { 100*4882a593Smuzhiyun INTERRUPT_TRANSFER, 101*4882a593Smuzhiyun POLLING_TRANSFER, 102*4882a593Smuzhiyun DMA_TRANSFER 103*4882a593Smuzhiyun }; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun /** 106*4882a593Smuzhiyun * enum ssp_rx_level_trig - receive FIFO watermark level which triggers 107*4882a593Smuzhiyun * IT: Interrupt fires when _N_ or more elements in RX FIFO. 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun enum ssp_rx_level_trig { 110*4882a593Smuzhiyun SSP_RX_1_OR_MORE_ELEM, 111*4882a593Smuzhiyun SSP_RX_4_OR_MORE_ELEM, 112*4882a593Smuzhiyun SSP_RX_8_OR_MORE_ELEM, 113*4882a593Smuzhiyun SSP_RX_16_OR_MORE_ELEM, 114*4882a593Smuzhiyun SSP_RX_32_OR_MORE_ELEM 115*4882a593Smuzhiyun }; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /** 118*4882a593Smuzhiyun * Transmit FIFO watermark level which triggers (IT Interrupt fires 119*4882a593Smuzhiyun * when _N_ or more empty locations in TX FIFO) 120*4882a593Smuzhiyun */ 121*4882a593Smuzhiyun enum ssp_tx_level_trig { 122*4882a593Smuzhiyun SSP_TX_1_OR_MORE_EMPTY_LOC, 123*4882a593Smuzhiyun SSP_TX_4_OR_MORE_EMPTY_LOC, 124*4882a593Smuzhiyun SSP_TX_8_OR_MORE_EMPTY_LOC, 125*4882a593Smuzhiyun SSP_TX_16_OR_MORE_EMPTY_LOC, 126*4882a593Smuzhiyun SSP_TX_32_OR_MORE_EMPTY_LOC 127*4882a593Smuzhiyun }; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /** 130*4882a593Smuzhiyun * enum SPI Clock Phase - clock phase (Motorola SPI interface only) 131*4882a593Smuzhiyun * @SSP_CLK_FIRST_EDGE: Receive data on first edge transition (actual direction depends on polarity) 132*4882a593Smuzhiyun * @SSP_CLK_SECOND_EDGE: Receive data on second edge transition (actual direction depends on polarity) 133*4882a593Smuzhiyun */ 134*4882a593Smuzhiyun enum ssp_spi_clk_phase { 135*4882a593Smuzhiyun SSP_CLK_FIRST_EDGE, 136*4882a593Smuzhiyun SSP_CLK_SECOND_EDGE 137*4882a593Smuzhiyun }; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /** 140*4882a593Smuzhiyun * enum SPI Clock Polarity - clock polarity (Motorola SPI interface only) 141*4882a593Smuzhiyun * @SSP_CLK_POL_IDLE_LOW: Low inactive level 142*4882a593Smuzhiyun * @SSP_CLK_POL_IDLE_HIGH: High inactive level 143*4882a593Smuzhiyun */ 144*4882a593Smuzhiyun enum ssp_spi_clk_pol { 145*4882a593Smuzhiyun SSP_CLK_POL_IDLE_LOW, 146*4882a593Smuzhiyun SSP_CLK_POL_IDLE_HIGH 147*4882a593Smuzhiyun }; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /** 150*4882a593Smuzhiyun * Microwire Conrol Lengths Command size in microwire format 151*4882a593Smuzhiyun */ 152*4882a593Smuzhiyun enum ssp_microwire_ctrl_len { 153*4882a593Smuzhiyun SSP_BITS_4 = 0x03, SSP_BITS_5, SSP_BITS_6, 154*4882a593Smuzhiyun SSP_BITS_7, SSP_BITS_8, SSP_BITS_9, 155*4882a593Smuzhiyun SSP_BITS_10, SSP_BITS_11, SSP_BITS_12, 156*4882a593Smuzhiyun SSP_BITS_13, SSP_BITS_14, SSP_BITS_15, 157*4882a593Smuzhiyun SSP_BITS_16, SSP_BITS_17, SSP_BITS_18, 158*4882a593Smuzhiyun SSP_BITS_19, SSP_BITS_20, SSP_BITS_21, 159*4882a593Smuzhiyun SSP_BITS_22, SSP_BITS_23, SSP_BITS_24, 160*4882a593Smuzhiyun SSP_BITS_25, SSP_BITS_26, SSP_BITS_27, 161*4882a593Smuzhiyun SSP_BITS_28, SSP_BITS_29, SSP_BITS_30, 162*4882a593Smuzhiyun SSP_BITS_31, SSP_BITS_32 163*4882a593Smuzhiyun }; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /** 166*4882a593Smuzhiyun * enum Microwire Wait State 167*4882a593Smuzhiyun * @SSP_MWIRE_WAIT_ZERO: No wait state inserted after last command bit 168*4882a593Smuzhiyun * @SSP_MWIRE_WAIT_ONE: One wait state inserted after last command bit 169*4882a593Smuzhiyun */ 170*4882a593Smuzhiyun enum ssp_microwire_wait_state { 171*4882a593Smuzhiyun SSP_MWIRE_WAIT_ZERO, 172*4882a593Smuzhiyun SSP_MWIRE_WAIT_ONE 173*4882a593Smuzhiyun }; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /** 176*4882a593Smuzhiyun * enum ssp_duplex - whether Full/Half Duplex on microwire, only 177*4882a593Smuzhiyun * available in the ST Micro variant. 178*4882a593Smuzhiyun * @SSP_MICROWIRE_CHANNEL_FULL_DUPLEX: SSPTXD becomes bi-directional, 179*4882a593Smuzhiyun * SSPRXD not used 180*4882a593Smuzhiyun * @SSP_MICROWIRE_CHANNEL_HALF_DUPLEX: SSPTXD is an output, SSPRXD is 181*4882a593Smuzhiyun * an input. 182*4882a593Smuzhiyun */ 183*4882a593Smuzhiyun enum ssp_duplex { 184*4882a593Smuzhiyun SSP_MICROWIRE_CHANNEL_FULL_DUPLEX, 185*4882a593Smuzhiyun SSP_MICROWIRE_CHANNEL_HALF_DUPLEX 186*4882a593Smuzhiyun }; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun /** 189*4882a593Smuzhiyun * enum ssp_clkdelay - an optional clock delay on the feedback clock 190*4882a593Smuzhiyun * only available in the ST Micro PL023 variant. 191*4882a593Smuzhiyun * @SSP_FEEDBACK_CLK_DELAY_NONE: no delay, the data coming in from the 192*4882a593Smuzhiyun * slave is sampled directly 193*4882a593Smuzhiyun * @SSP_FEEDBACK_CLK_DELAY_1T: the incoming slave data is sampled with 194*4882a593Smuzhiyun * a delay of T-dt 195*4882a593Smuzhiyun * @SSP_FEEDBACK_CLK_DELAY_2T: dito with a delay if 2T-dt 196*4882a593Smuzhiyun * @SSP_FEEDBACK_CLK_DELAY_3T: dito with a delay if 3T-dt 197*4882a593Smuzhiyun * @SSP_FEEDBACK_CLK_DELAY_4T: dito with a delay if 4T-dt 198*4882a593Smuzhiyun * @SSP_FEEDBACK_CLK_DELAY_5T: dito with a delay if 5T-dt 199*4882a593Smuzhiyun * @SSP_FEEDBACK_CLK_DELAY_6T: dito with a delay if 6T-dt 200*4882a593Smuzhiyun * @SSP_FEEDBACK_CLK_DELAY_7T: dito with a delay if 7T-dt 201*4882a593Smuzhiyun */ 202*4882a593Smuzhiyun enum ssp_clkdelay { 203*4882a593Smuzhiyun SSP_FEEDBACK_CLK_DELAY_NONE, 204*4882a593Smuzhiyun SSP_FEEDBACK_CLK_DELAY_1T, 205*4882a593Smuzhiyun SSP_FEEDBACK_CLK_DELAY_2T, 206*4882a593Smuzhiyun SSP_FEEDBACK_CLK_DELAY_3T, 207*4882a593Smuzhiyun SSP_FEEDBACK_CLK_DELAY_4T, 208*4882a593Smuzhiyun SSP_FEEDBACK_CLK_DELAY_5T, 209*4882a593Smuzhiyun SSP_FEEDBACK_CLK_DELAY_6T, 210*4882a593Smuzhiyun SSP_FEEDBACK_CLK_DELAY_7T 211*4882a593Smuzhiyun }; 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /** 214*4882a593Smuzhiyun * CHIP select/deselect commands 215*4882a593Smuzhiyun */ 216*4882a593Smuzhiyun enum ssp_chip_select { 217*4882a593Smuzhiyun SSP_CHIP_SELECT, 218*4882a593Smuzhiyun SSP_CHIP_DESELECT 219*4882a593Smuzhiyun }; 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun struct dma_chan; 223*4882a593Smuzhiyun /** 224*4882a593Smuzhiyun * struct pl022_ssp_master - device.platform_data for SPI controller devices. 225*4882a593Smuzhiyun * @bus_id: identifier for this bus 226*4882a593Smuzhiyun * @num_chipselect: chipselects are used to distinguish individual 227*4882a593Smuzhiyun * SPI slaves, and are numbered from zero to num_chipselects - 1. 228*4882a593Smuzhiyun * each slave has a chipselect signal, but it's common that not 229*4882a593Smuzhiyun * every chipselect is connected to a slave. 230*4882a593Smuzhiyun * @enable_dma: if true enables DMA driven transfers. 231*4882a593Smuzhiyun * @dma_rx_param: parameter to locate an RX DMA channel. 232*4882a593Smuzhiyun * @dma_tx_param: parameter to locate a TX DMA channel. 233*4882a593Smuzhiyun * @autosuspend_delay: delay in ms following transfer completion before the 234*4882a593Smuzhiyun * runtime power management system suspends the device. A setting of 0 235*4882a593Smuzhiyun * indicates no delay and the device will be suspended immediately. 236*4882a593Smuzhiyun * @rt: indicates the controller should run the message pump with realtime 237*4882a593Smuzhiyun * priority to minimise the transfer latency on the bus. 238*4882a593Smuzhiyun * @chipselects: list of <num_chipselects> chip select gpios 239*4882a593Smuzhiyun */ 240*4882a593Smuzhiyun struct pl022_ssp_controller { 241*4882a593Smuzhiyun u16 bus_id; 242*4882a593Smuzhiyun u8 num_chipselect; 243*4882a593Smuzhiyun u8 enable_dma:1; 244*4882a593Smuzhiyun bool (*dma_filter)(struct dma_chan *chan, void *filter_param); 245*4882a593Smuzhiyun void *dma_rx_param; 246*4882a593Smuzhiyun void *dma_tx_param; 247*4882a593Smuzhiyun int autosuspend_delay; 248*4882a593Smuzhiyun bool rt; 249*4882a593Smuzhiyun int *chipselects; 250*4882a593Smuzhiyun }; 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun /** 253*4882a593Smuzhiyun * struct ssp_config_chip - spi_board_info.controller_data for SPI 254*4882a593Smuzhiyun * slave devices, copied to spi_device.controller_data. 255*4882a593Smuzhiyun * 256*4882a593Smuzhiyun * @iface: Interface type(Motorola, TI, Microwire, Universal) 257*4882a593Smuzhiyun * @hierarchy: sets whether interface is master or slave 258*4882a593Smuzhiyun * @slave_tx_disable: SSPTXD is disconnected (in slave mode only) 259*4882a593Smuzhiyun * @clk_freq: Tune freq parameters of SSP(when in master mode) 260*4882a593Smuzhiyun * @com_mode: communication mode: polling, Interrupt or DMA 261*4882a593Smuzhiyun * @rx_lev_trig: Rx FIFO watermark level (for IT & DMA mode) 262*4882a593Smuzhiyun * @tx_lev_trig: Tx FIFO watermark level (for IT & DMA mode) 263*4882a593Smuzhiyun * @ctrl_len: Microwire interface: Control length 264*4882a593Smuzhiyun * @wait_state: Microwire interface: Wait state 265*4882a593Smuzhiyun * @duplex: Microwire interface: Full/Half duplex 266*4882a593Smuzhiyun * @clkdelay: on the PL023 variant, the delay in feeback clock cycles 267*4882a593Smuzhiyun * before sampling the incoming line 268*4882a593Smuzhiyun * @cs_control: function pointer to board-specific function to 269*4882a593Smuzhiyun * assert/deassert I/O port to control HW generation of devices chip-select. 270*4882a593Smuzhiyun */ 271*4882a593Smuzhiyun struct pl022_config_chip { 272*4882a593Smuzhiyun enum ssp_interface iface; 273*4882a593Smuzhiyun enum ssp_hierarchy hierarchy; 274*4882a593Smuzhiyun bool slave_tx_disable; 275*4882a593Smuzhiyun struct ssp_clock_params clk_freq; 276*4882a593Smuzhiyun enum ssp_mode com_mode; 277*4882a593Smuzhiyun enum ssp_rx_level_trig rx_lev_trig; 278*4882a593Smuzhiyun enum ssp_tx_level_trig tx_lev_trig; 279*4882a593Smuzhiyun enum ssp_microwire_ctrl_len ctrl_len; 280*4882a593Smuzhiyun enum ssp_microwire_wait_state wait_state; 281*4882a593Smuzhiyun enum ssp_duplex duplex; 282*4882a593Smuzhiyun enum ssp_clkdelay clkdelay; 283*4882a593Smuzhiyun void (*cs_control) (u32 control); 284*4882a593Smuzhiyun }; 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun #endif /* _SSP_PL022_H */ 287