xref: /linux/drivers/net/wireless/silabs/wfx/hwio.h (revision 4a5fb1bbcdf1cccae1f6b9c0277b3796b2a468ef)
1*4a5fb1bbSJérôme Pouiller /* SPDX-License-Identifier: GPL-2.0-only */
2*4a5fb1bbSJérôme Pouiller /*
3*4a5fb1bbSJérôme Pouiller  * Low-level I/O functions.
4*4a5fb1bbSJérôme Pouiller  *
5*4a5fb1bbSJérôme Pouiller  * Copyright (c) 2017-2020, Silicon Laboratories, Inc.
6*4a5fb1bbSJérôme Pouiller  * Copyright (c) 2010, ST-Ericsson
7*4a5fb1bbSJérôme Pouiller  */
8*4a5fb1bbSJérôme Pouiller #ifndef WFX_HWIO_H
9*4a5fb1bbSJérôme Pouiller #define WFX_HWIO_H
10*4a5fb1bbSJérôme Pouiller 
11*4a5fb1bbSJérôme Pouiller #include <linux/types.h>
12*4a5fb1bbSJérôme Pouiller 
13*4a5fb1bbSJérôme Pouiller struct wfx_dev;
14*4a5fb1bbSJérôme Pouiller 
15*4a5fb1bbSJérôme Pouiller /* Caution: in the functions below, 'buf' will used with a DMA. So, it must be kmalloc'd (do not use
16*4a5fb1bbSJérôme Pouiller  * stack allocated buffers). In doubt, enable CONFIG_DEBUG_SG to detect badly located buffer.
17*4a5fb1bbSJérôme Pouiller  */
18*4a5fb1bbSJérôme Pouiller int wfx_data_read(struct wfx_dev *wdev, void *buf, size_t buf_len);
19*4a5fb1bbSJérôme Pouiller int wfx_data_write(struct wfx_dev *wdev, const void *buf, size_t buf_len);
20*4a5fb1bbSJérôme Pouiller 
21*4a5fb1bbSJérôme Pouiller int wfx_sram_buf_read(struct wfx_dev *wdev, u32 addr, void *buf, size_t len);
22*4a5fb1bbSJérôme Pouiller int wfx_sram_buf_write(struct wfx_dev *wdev, u32 addr, const void *buf, size_t len);
23*4a5fb1bbSJérôme Pouiller 
24*4a5fb1bbSJérôme Pouiller int wfx_ahb_buf_read(struct wfx_dev *wdev, u32 addr, void *buf, size_t len);
25*4a5fb1bbSJérôme Pouiller int wfx_ahb_buf_write(struct wfx_dev *wdev, u32 addr, const void *buf, size_t len);
26*4a5fb1bbSJérôme Pouiller 
27*4a5fb1bbSJérôme Pouiller int wfx_sram_reg_read(struct wfx_dev *wdev, u32 addr, u32 *val);
28*4a5fb1bbSJérôme Pouiller int wfx_sram_reg_write(struct wfx_dev *wdev, u32 addr, u32 val);
29*4a5fb1bbSJérôme Pouiller 
30*4a5fb1bbSJérôme Pouiller int wfx_ahb_reg_read(struct wfx_dev *wdev, u32 addr, u32 *val);
31*4a5fb1bbSJérôme Pouiller int wfx_ahb_reg_write(struct wfx_dev *wdev, u32 addr, u32 val);
32*4a5fb1bbSJérôme Pouiller 
33*4a5fb1bbSJérôme Pouiller #define CFG_ERR_SPI_FRAME          0x00000001 /* only with SPI */
34*4a5fb1bbSJérôme Pouiller #define CFG_ERR_SDIO_BUF_MISMATCH  0x00000001 /* only with SDIO */
35*4a5fb1bbSJérôme Pouiller #define CFG_ERR_BUF_UNDERRUN       0x00000002
36*4a5fb1bbSJérôme Pouiller #define CFG_ERR_DATA_IN_TOO_LARGE  0x00000004
37*4a5fb1bbSJérôme Pouiller #define CFG_ERR_HOST_NO_OUT_QUEUE  0x00000008
38*4a5fb1bbSJérôme Pouiller #define CFG_ERR_BUF_OVERRUN        0x00000010
39*4a5fb1bbSJérôme Pouiller #define CFG_ERR_DATA_OUT_TOO_LARGE 0x00000020
40*4a5fb1bbSJérôme Pouiller #define CFG_ERR_HOST_NO_IN_QUEUE   0x00000040
41*4a5fb1bbSJérôme Pouiller #define CFG_ERR_HOST_CRC_MISS      0x00000080 /* only with SDIO */
42*4a5fb1bbSJérôme Pouiller #define CFG_SPI_IGNORE_CS          0x00000080 /* only with SPI */
43*4a5fb1bbSJérôme Pouiller #define CFG_BYTE_ORDER_MASK        0x00000300 /* only writable with SPI */
44*4a5fb1bbSJérôme Pouiller #define     CFG_BYTE_ORDER_BADC    0x00000000
45*4a5fb1bbSJérôme Pouiller #define     CFG_BYTE_ORDER_DCBA    0x00000100
46*4a5fb1bbSJérôme Pouiller #define     CFG_BYTE_ORDER_ABCD    0x00000200 /* SDIO always use this value */
47*4a5fb1bbSJérôme Pouiller #define CFG_DIRECT_ACCESS_MODE     0x00000400
48*4a5fb1bbSJérôme Pouiller #define CFG_PREFETCH_AHB           0x00000800
49*4a5fb1bbSJérôme Pouiller #define CFG_DISABLE_CPU_CLK        0x00001000
50*4a5fb1bbSJérôme Pouiller #define CFG_PREFETCH_SRAM          0x00002000
51*4a5fb1bbSJérôme Pouiller #define CFG_CPU_RESET              0x00004000
52*4a5fb1bbSJérôme Pouiller #define CFG_SDIO_DISABLE_IRQ       0x00008000 /* only with SDIO */
53*4a5fb1bbSJérôme Pouiller #define CFG_IRQ_ENABLE_DATA        0x00010000
54*4a5fb1bbSJérôme Pouiller #define CFG_IRQ_ENABLE_WRDY        0x00020000
55*4a5fb1bbSJérôme Pouiller #define CFG_CLK_RISE_EDGE          0x00040000
56*4a5fb1bbSJérôme Pouiller #define CFG_SDIO_DISABLE_CRC_CHK   0x00080000 /* only with SDIO */
57*4a5fb1bbSJérôme Pouiller #define CFG_RESERVED               0x00F00000
58*4a5fb1bbSJérôme Pouiller #define CFG_DEVICE_ID_MAJOR        0x07000000
59*4a5fb1bbSJérôme Pouiller #define CFG_DEVICE_ID_RESERVED     0x78000000
60*4a5fb1bbSJérôme Pouiller #define CFG_DEVICE_ID_TYPE         0x80000000
61*4a5fb1bbSJérôme Pouiller int wfx_config_reg_read(struct wfx_dev *wdev, u32 *val);
62*4a5fb1bbSJérôme Pouiller int wfx_config_reg_write(struct wfx_dev *wdev, u32 val);
63*4a5fb1bbSJérôme Pouiller int wfx_config_reg_write_bits(struct wfx_dev *wdev, u32 mask, u32 val);
64*4a5fb1bbSJérôme Pouiller 
65*4a5fb1bbSJérôme Pouiller #define CTRL_NEXT_LEN_MASK   0x00000FFF
66*4a5fb1bbSJérôme Pouiller #define CTRL_WLAN_WAKEUP     0x00001000
67*4a5fb1bbSJérôme Pouiller #define CTRL_WLAN_READY      0x00002000
68*4a5fb1bbSJérôme Pouiller int wfx_control_reg_read(struct wfx_dev *wdev, u32 *val);
69*4a5fb1bbSJérôme Pouiller int wfx_control_reg_write(struct wfx_dev *wdev, u32 val);
70*4a5fb1bbSJérôme Pouiller int wfx_control_reg_write_bits(struct wfx_dev *wdev, u32 mask, u32 val);
71*4a5fb1bbSJérôme Pouiller 
72*4a5fb1bbSJérôme Pouiller #define IGPR_RW          0x80000000
73*4a5fb1bbSJérôme Pouiller #define IGPR_INDEX       0x7F000000
74*4a5fb1bbSJérôme Pouiller #define IGPR_VALUE       0x00FFFFFF
75*4a5fb1bbSJérôme Pouiller int wfx_igpr_reg_read(struct wfx_dev *wdev, int index, u32 *val);
76*4a5fb1bbSJérôme Pouiller int wfx_igpr_reg_write(struct wfx_dev *wdev, int index, u32 val);
77*4a5fb1bbSJérôme Pouiller 
78*4a5fb1bbSJérôme Pouiller #endif
79