1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
4 /* Disable MMIO tracing to prevent excessive logging of unwanted MMIO traces */
5 #define __DISABLE_TRACE_MMIO__
7 #include <linux/acpi.h>
9 #include <linux/slab.h>
10 #include <linux/dma-mapping.h>
12 #include <linux/module.h>
14 #include <linux/of_platform.h>
15 #include <linux/pinctrl/consumer.h>
16 #include <linux/platform_device.h>
17 #include <linux/soc/qcom/geni-se.h>
22 * Generic Interface (GENI) Serial Engine (SE) Wrapper driver is introduced
23 * to manage GENI firmware based Qualcomm Universal Peripheral (QUP) Wrapper
24 * controller. QUP Wrapper is designed to support various serial bus protocols
25 * like UART, SPI, I2C, I3C, etc.
29 * DOC: Hardware description
31 * GENI based QUP is a highly-flexible and programmable module for supporting
32 * a wide range of serial interfaces like UART, SPI, I2C, I3C, etc. A single
33 * QUP module can provide upto 8 serial interfaces, using its internal
34 * serial engines. The actual configuration is determined by the target
35 * platform configuration. The protocol supported by each interface is
36 * determined by the firmware loaded to the serial engine. Each SE consists
37 * of a DMA Engine and GENI sub modules which enable serial engines to
38 * support FIFO and DMA modes of operation.
41 * +-----------------------------------------+
43 * | +----------------------------+ |
44 * --QUP & SE Clocks--> | Serial Engine N | +-IO------>
45 * | | ... | | Interface
46 * <---Clock Perf.----+ +----+-----------------------+ | |
47 * State Interface | | Serial Engine 1 | | |
50 * <--------AHB-------> | | | |
54 * <------SE IRQ------+ +----------------------------+ |
56 * +-----------------------------------------+
58 * Figure 1: GENI based QUP Wrapper
60 * The GENI submodules include primary and secondary sequencers which are
61 * used to drive TX & RX operations. On serial interfaces that operate using
62 * master-slave model, primary sequencer drives both TX & RX operations. On
63 * serial interfaces that operate using peer-to-peer model, primary sequencer
64 * drives TX operation and secondary sequencer drives RX operation.
68 * DOC: Software description
70 * GENI SE Wrapper driver is structured into 2 parts:
72 * geni_wrapper represents QUP Wrapper controller. This part of the driver
73 * manages QUP Wrapper information such as hardware version, clock
74 * performance table that is common to all the internal serial engines.
76 * geni_se represents serial engine. This part of the driver manages serial
77 * engine information such as clocks, containing QUP Wrapper, etc. This part
78 * of driver also supports operations (eg. initialize the concerned serial
79 * engine, select between FIFO and DMA mode of operation etc.) that are
80 * common to all the serial engines and are independent of serial interfaces.
83 #define MAX_CLK_PERF_LEVEL 32
87 * struct geni_wrapper - Data structure to represent the QUP Wrapper Core
88 * @dev: Device pointer of the QUP wrapper core
89 * @base: Base address of this instance of QUP wrapper core
90 * @clks: Handle to the primary & optional secondary AHB clocks
91 * @num_clks: Count of clocks
96 struct clk_bulk_data clks
[MAX_CLKS
];
97 unsigned int num_clks
;
101 * struct geni_se_desc - Data structure to represent the QUP Wrapper resources
102 * @clks: Name of the primary & optional secondary AHB clocks
103 * @num_clks: Count of clock names
105 struct geni_se_desc
{
106 unsigned int num_clks
;
107 const char * const *clks
;
110 static const char * const icc_path_names
[] = {"qup-core", "qup-config",
113 #define QUP_HW_VER_REG 0x4
115 /* Common SE registers */
116 #define GENI_INIT_CFG_REVISION 0x0
117 #define GENI_S_INIT_CFG_REVISION 0x4
118 #define GENI_OUTPUT_CTRL 0x24
119 #define GENI_CGC_CTRL 0x28
120 #define GENI_CLK_CTRL_RO 0x60
121 #define GENI_FW_S_REVISION_RO 0x6c
122 #define SE_GENI_BYTE_GRAN 0x254
123 #define SE_GENI_TX_PACKING_CFG0 0x260
124 #define SE_GENI_TX_PACKING_CFG1 0x264
125 #define SE_GENI_RX_PACKING_CFG0 0x284
126 #define SE_GENI_RX_PACKING_CFG1 0x288
127 #define SE_GENI_M_GP_LENGTH 0x910
128 #define SE_GENI_S_GP_LENGTH 0x914
129 #define SE_DMA_TX_PTR_L 0xc30
130 #define SE_DMA_TX_PTR_H 0xc34
131 #define SE_DMA_TX_ATTR 0xc38
132 #define SE_DMA_TX_LEN 0xc3c
133 #define SE_DMA_TX_IRQ_EN 0xc48
134 #define SE_DMA_TX_IRQ_EN_SET 0xc4c
135 #define SE_DMA_TX_IRQ_EN_CLR 0xc50
136 #define SE_DMA_TX_LEN_IN 0xc54
137 #define SE_DMA_TX_MAX_BURST 0xc5c
138 #define SE_DMA_RX_PTR_L 0xd30
139 #define SE_DMA_RX_PTR_H 0xd34
140 #define SE_DMA_RX_ATTR 0xd38
141 #define SE_DMA_RX_LEN 0xd3c
142 #define SE_DMA_RX_IRQ_EN 0xd48
143 #define SE_DMA_RX_IRQ_EN_SET 0xd4c
144 #define SE_DMA_RX_IRQ_EN_CLR 0xd50
145 #define SE_DMA_RX_LEN_IN 0xd54
146 #define SE_DMA_RX_MAX_BURST 0xd5c
147 #define SE_DMA_RX_FLUSH 0xd60
148 #define SE_GSI_EVENT_EN 0xe18
149 #define SE_IRQ_EN 0xe1c
150 #define SE_DMA_GENERAL_CFG 0xe30
152 /* GENI_OUTPUT_CTRL fields */
153 #define DEFAULT_IO_OUTPUT_CTRL_MSK GENMASK(6, 0)
155 /* GENI_CGC_CTRL fields */
156 #define CFG_AHB_CLK_CGC_ON BIT(0)
157 #define CFG_AHB_WR_ACLK_CGC_ON BIT(1)
158 #define DATA_AHB_CLK_CGC_ON BIT(2)
159 #define SCLK_CGC_ON BIT(3)
160 #define TX_CLK_CGC_ON BIT(4)
161 #define RX_CLK_CGC_ON BIT(5)
162 #define EXT_CLK_CGC_ON BIT(6)
163 #define PROG_RAM_HCLK_OFF BIT(8)
164 #define PROG_RAM_SCLK_OFF BIT(9)
165 #define DEFAULT_CGC_EN GENMASK(6, 0)
167 /* SE_GSI_EVENT_EN fields */
168 #define DMA_RX_EVENT_EN BIT(0)
169 #define DMA_TX_EVENT_EN BIT(1)
170 #define GENI_M_EVENT_EN BIT(2)
171 #define GENI_S_EVENT_EN BIT(3)
173 /* SE_IRQ_EN fields */
174 #define DMA_RX_IRQ_EN BIT(0)
175 #define DMA_TX_IRQ_EN BIT(1)
176 #define GENI_M_IRQ_EN BIT(2)
177 #define GENI_S_IRQ_EN BIT(3)
179 /* SE_DMA_GENERAL_CFG */
180 #define DMA_RX_CLK_CGC_ON BIT(0)
181 #define DMA_TX_CLK_CGC_ON BIT(1)
182 #define DMA_AHB_SLV_CFG_ON BIT(2)
183 #define AHB_SEC_SLV_CLK_CGC_ON BIT(3)
184 #define DUMMY_RX_NON_BUFFERABLE BIT(4)
185 #define RX_DMA_ZERO_PADDING_EN BIT(5)
186 #define RX_DMA_IRQ_DELAY_MSK GENMASK(8, 6)
187 #define RX_DMA_IRQ_DELAY_SHFT 6
190 * geni_se_get_qup_hw_version() - Read the QUP wrapper Hardware version
191 * @se: Pointer to the corresponding serial engine.
193 * Return: Hardware Version of the wrapper.
195 u32
geni_se_get_qup_hw_version(struct geni_se
*se
)
197 struct geni_wrapper
*wrapper
= se
->wrapper
;
199 return readl_relaxed(wrapper
->base
+ QUP_HW_VER_REG
);
201 EXPORT_SYMBOL_GPL(geni_se_get_qup_hw_version
);
203 static void geni_se_io_set_mode(void __iomem
*base
)
207 val
= readl_relaxed(base
+ SE_IRQ_EN
);
208 val
|= GENI_M_IRQ_EN
| GENI_S_IRQ_EN
;
209 val
|= DMA_TX_IRQ_EN
| DMA_RX_IRQ_EN
;
210 writel_relaxed(val
, base
+ SE_IRQ_EN
);
212 val
= readl_relaxed(base
+ SE_GENI_DMA_MODE_EN
);
213 val
&= ~GENI_DMA_MODE_EN
;
214 writel_relaxed(val
, base
+ SE_GENI_DMA_MODE_EN
);
216 writel_relaxed(0, base
+ SE_GSI_EVENT_EN
);
219 static void geni_se_io_init(void __iomem
*base
)
223 val
= readl_relaxed(base
+ GENI_CGC_CTRL
);
224 val
|= DEFAULT_CGC_EN
;
225 writel_relaxed(val
, base
+ GENI_CGC_CTRL
);
227 val
= readl_relaxed(base
+ SE_DMA_GENERAL_CFG
);
228 val
|= AHB_SEC_SLV_CLK_CGC_ON
| DMA_AHB_SLV_CFG_ON
;
229 val
|= DMA_TX_CLK_CGC_ON
| DMA_RX_CLK_CGC_ON
;
230 writel_relaxed(val
, base
+ SE_DMA_GENERAL_CFG
);
232 writel_relaxed(DEFAULT_IO_OUTPUT_CTRL_MSK
, base
+ GENI_OUTPUT_CTRL
);
233 writel_relaxed(FORCE_DEFAULT
, base
+ GENI_FORCE_DEFAULT_REG
);
236 static void geni_se_irq_clear(struct geni_se
*se
)
238 writel_relaxed(0, se
->base
+ SE_GSI_EVENT_EN
);
239 writel_relaxed(0xffffffff, se
->base
+ SE_GENI_M_IRQ_CLEAR
);
240 writel_relaxed(0xffffffff, se
->base
+ SE_GENI_S_IRQ_CLEAR
);
241 writel_relaxed(0xffffffff, se
->base
+ SE_DMA_TX_IRQ_CLR
);
242 writel_relaxed(0xffffffff, se
->base
+ SE_DMA_RX_IRQ_CLR
);
243 writel_relaxed(0xffffffff, se
->base
+ SE_IRQ_EN
);
247 * geni_se_init() - Initialize the GENI serial engine
248 * @se: Pointer to the concerned serial engine.
249 * @rx_wm: Receive watermark, in units of FIFO words.
250 * @rx_rfr: Ready-for-receive watermark, in units of FIFO words.
252 * This function is used to initialize the GENI serial engine, configure
253 * receive watermark and ready-for-receive watermarks.
255 void geni_se_init(struct geni_se
*se
, u32 rx_wm
, u32 rx_rfr
)
259 geni_se_irq_clear(se
);
260 geni_se_io_init(se
->base
);
261 geni_se_io_set_mode(se
->base
);
263 writel_relaxed(rx_wm
, se
->base
+ SE_GENI_RX_WATERMARK_REG
);
264 writel_relaxed(rx_rfr
, se
->base
+ SE_GENI_RX_RFR_WATERMARK_REG
);
266 val
= readl_relaxed(se
->base
+ SE_GENI_M_IRQ_EN
);
267 val
|= M_COMMON_GENI_M_IRQ_EN
;
268 writel_relaxed(val
, se
->base
+ SE_GENI_M_IRQ_EN
);
270 val
= readl_relaxed(se
->base
+ SE_GENI_S_IRQ_EN
);
271 val
|= S_COMMON_GENI_S_IRQ_EN
;
272 writel_relaxed(val
, se
->base
+ SE_GENI_S_IRQ_EN
);
274 EXPORT_SYMBOL_GPL(geni_se_init
);
276 static void geni_se_select_fifo_mode(struct geni_se
*se
)
278 u32 proto
= geni_se_read_proto(se
);
281 geni_se_irq_clear(se
);
283 /* UART driver manages enabling / disabling interrupts internally */
284 if (proto
!= GENI_SE_UART
) {
285 /* Non-UART use only primary sequencer so dont bother about S_IRQ */
286 val_old
= val
= readl_relaxed(se
->base
+ SE_GENI_M_IRQ_EN
);
287 val
|= M_CMD_DONE_EN
| M_TX_FIFO_WATERMARK_EN
;
288 val
|= M_RX_FIFO_WATERMARK_EN
| M_RX_FIFO_LAST_EN
;
290 writel_relaxed(val
, se
->base
+ SE_GENI_M_IRQ_EN
);
293 val_old
= val
= readl_relaxed(se
->base
+ SE_GENI_DMA_MODE_EN
);
294 val
&= ~GENI_DMA_MODE_EN
;
296 writel_relaxed(val
, se
->base
+ SE_GENI_DMA_MODE_EN
);
299 static void geni_se_select_dma_mode(struct geni_se
*se
)
301 u32 proto
= geni_se_read_proto(se
);
304 geni_se_irq_clear(se
);
306 /* UART driver manages enabling / disabling interrupts internally */
307 if (proto
!= GENI_SE_UART
) {
308 /* Non-UART use only primary sequencer so dont bother about S_IRQ */
309 val_old
= val
= readl_relaxed(se
->base
+ SE_GENI_M_IRQ_EN
);
310 val
&= ~(M_CMD_DONE_EN
| M_TX_FIFO_WATERMARK_EN
);
311 val
&= ~(M_RX_FIFO_WATERMARK_EN
| M_RX_FIFO_LAST_EN
);
313 writel_relaxed(val
, se
->base
+ SE_GENI_M_IRQ_EN
);
316 val_old
= val
= readl_relaxed(se
->base
+ SE_GENI_DMA_MODE_EN
);
317 val
|= GENI_DMA_MODE_EN
;
319 writel_relaxed(val
, se
->base
+ SE_GENI_DMA_MODE_EN
);
322 static void geni_se_select_gpi_mode(struct geni_se
*se
)
326 geni_se_irq_clear(se
);
328 writel(0, se
->base
+ SE_IRQ_EN
);
330 val
= readl(se
->base
+ SE_GENI_M_IRQ_EN
);
331 val
&= ~(M_CMD_DONE_EN
| M_TX_FIFO_WATERMARK_EN
|
332 M_RX_FIFO_WATERMARK_EN
| M_RX_FIFO_LAST_EN
);
333 writel(val
, se
->base
+ SE_GENI_M_IRQ_EN
);
335 writel(GENI_DMA_MODE_EN
, se
->base
+ SE_GENI_DMA_MODE_EN
);
337 val
= readl(se
->base
+ SE_GSI_EVENT_EN
);
338 val
|= (DMA_RX_EVENT_EN
| DMA_TX_EVENT_EN
| GENI_M_EVENT_EN
| GENI_S_EVENT_EN
);
339 writel(val
, se
->base
+ SE_GSI_EVENT_EN
);
343 * geni_se_select_mode() - Select the serial engine transfer mode
344 * @se: Pointer to the concerned serial engine.
345 * @mode: Transfer mode to be selected.
347 void geni_se_select_mode(struct geni_se
*se
, enum geni_se_xfer_mode mode
)
349 WARN_ON(mode
!= GENI_SE_FIFO
&& mode
!= GENI_SE_DMA
&& mode
!= GENI_GPI_DMA
);
353 geni_se_select_fifo_mode(se
);
356 geni_se_select_dma_mode(se
);
359 geni_se_select_gpi_mode(se
);
361 case GENI_SE_INVALID
:
366 EXPORT_SYMBOL_GPL(geni_se_select_mode
);
371 * GENI FIFO packing is highly configurable. TX/RX packing/unpacking consist
372 * of up to 4 operations, each operation represented by 4 configuration vectors
373 * of 10 bits programmed in GENI_TX_PACKING_CFG0 and GENI_TX_PACKING_CFG1 for
374 * TX FIFO and in GENI_RX_PACKING_CFG0 and GENI_RX_PACKING_CFG1 for RX FIFO.
375 * Refer to below examples for detailed bit-field description.
377 * Example 1: word_size = 7, packing_mode = 4 x 8, msb_to_lsb = 1
379 * +-----------+-------+-------+-------+-------+
380 * | | vec_0 | vec_1 | vec_2 | vec_3 |
381 * +-----------+-------+-------+-------+-------+
382 * | start | 0x6 | 0xe | 0x16 | 0x1e |
383 * | direction | 1 | 1 | 1 | 1 |
384 * | length | 6 | 6 | 6 | 6 |
385 * | stop | 0 | 0 | 0 | 1 |
386 * +-----------+-------+-------+-------+-------+
388 * Example 2: word_size = 15, packing_mode = 2 x 16, msb_to_lsb = 0
390 * +-----------+-------+-------+-------+-------+
391 * | | vec_0 | vec_1 | vec_2 | vec_3 |
392 * +-----------+-------+-------+-------+-------+
393 * | start | 0x0 | 0x8 | 0x10 | 0x18 |
394 * | direction | 0 | 0 | 0 | 0 |
395 * | length | 7 | 6 | 7 | 6 |
396 * | stop | 0 | 0 | 0 | 1 |
397 * +-----------+-------+-------+-------+-------+
399 * Example 3: word_size = 23, packing_mode = 1 x 32, msb_to_lsb = 1
401 * +-----------+-------+-------+-------+-------+
402 * | | vec_0 | vec_1 | vec_2 | vec_3 |
403 * +-----------+-------+-------+-------+-------+
404 * | start | 0x16 | 0xe | 0x6 | 0x0 |
405 * | direction | 1 | 1 | 1 | 1 |
406 * | length | 7 | 7 | 6 | 0 |
407 * | stop | 0 | 0 | 1 | 0 |
408 * +-----------+-------+-------+-------+-------+
412 #define NUM_PACKING_VECTORS 4
413 #define PACKING_START_SHIFT 5
414 #define PACKING_DIR_SHIFT 4
415 #define PACKING_LEN_SHIFT 1
416 #define PACKING_STOP_BIT BIT(0)
417 #define PACKING_VECTOR_SHIFT 10
419 * geni_se_config_packing() - Packing configuration of the serial engine
420 * @se: Pointer to the concerned serial engine
421 * @bpw: Bits of data per transfer word.
422 * @pack_words: Number of words per fifo element.
423 * @msb_to_lsb: Transfer from MSB to LSB or vice-versa.
424 * @tx_cfg: Flag to configure the TX Packing.
425 * @rx_cfg: Flag to configure the RX Packing.
427 * This function is used to configure the packing rules for the current
430 void geni_se_config_packing(struct geni_se
*se
, int bpw
, int pack_words
,
431 bool msb_to_lsb
, bool tx_cfg
, bool rx_cfg
)
433 u32 cfg0
, cfg1
, cfg
[NUM_PACKING_VECTORS
] = {0};
436 int idx_start
= msb_to_lsb
? bpw
- 1 : 0;
438 int idx_delta
= msb_to_lsb
? -BITS_PER_BYTE
: BITS_PER_BYTE
;
439 int ceil_bpw
= ALIGN(bpw
, BITS_PER_BYTE
);
440 int iter
= (ceil_bpw
* pack_words
) / BITS_PER_BYTE
;
443 if (iter
<= 0 || iter
> NUM_PACKING_VECTORS
)
446 for (i
= 0; i
< iter
; i
++) {
447 len
= min_t(int, temp_bpw
, BITS_PER_BYTE
) - 1;
448 cfg
[i
] = idx
<< PACKING_START_SHIFT
;
449 cfg
[i
] |= msb_to_lsb
<< PACKING_DIR_SHIFT
;
450 cfg
[i
] |= len
<< PACKING_LEN_SHIFT
;
452 if (temp_bpw
<= BITS_PER_BYTE
) {
453 idx
= ((i
+ 1) * BITS_PER_BYTE
) + idx_start
;
456 idx
= idx
+ idx_delta
;
457 temp_bpw
= temp_bpw
- BITS_PER_BYTE
;
460 cfg
[iter
- 1] |= PACKING_STOP_BIT
;
461 cfg0
= cfg
[0] | (cfg
[1] << PACKING_VECTOR_SHIFT
);
462 cfg1
= cfg
[2] | (cfg
[3] << PACKING_VECTOR_SHIFT
);
465 writel_relaxed(cfg0
, se
->base
+ SE_GENI_TX_PACKING_CFG0
);
466 writel_relaxed(cfg1
, se
->base
+ SE_GENI_TX_PACKING_CFG1
);
469 writel_relaxed(cfg0
, se
->base
+ SE_GENI_RX_PACKING_CFG0
);
470 writel_relaxed(cfg1
, se
->base
+ SE_GENI_RX_PACKING_CFG1
);
474 * Number of protocol words in each FIFO entry
475 * 0 - 4x8, four words in each entry, max word size of 8 bits
476 * 1 - 2x16, two words in each entry, max word size of 16 bits
477 * 2 - 1x32, one word in each entry, max word size of 32 bits
480 if (pack_words
|| bpw
== 32)
481 writel_relaxed(bpw
/ 16, se
->base
+ SE_GENI_BYTE_GRAN
);
483 EXPORT_SYMBOL_GPL(geni_se_config_packing
);
485 static void geni_se_clks_off(struct geni_se
*se
)
487 struct geni_wrapper
*wrapper
= se
->wrapper
;
489 clk_disable_unprepare(se
->clk
);
490 clk_bulk_disable_unprepare(wrapper
->num_clks
, wrapper
->clks
);
494 * geni_se_resources_off() - Turn off resources associated with the serial
496 * @se: Pointer to the concerned serial engine.
498 * Return: 0 on success, standard Linux error codes on failure/error.
500 int geni_se_resources_off(struct geni_se
*se
)
504 if (has_acpi_companion(se
->dev
))
507 ret
= pinctrl_pm_select_sleep_state(se
->dev
);
511 geni_se_clks_off(se
);
514 EXPORT_SYMBOL_GPL(geni_se_resources_off
);
516 static int geni_se_clks_on(struct geni_se
*se
)
519 struct geni_wrapper
*wrapper
= se
->wrapper
;
521 ret
= clk_bulk_prepare_enable(wrapper
->num_clks
, wrapper
->clks
);
525 ret
= clk_prepare_enable(se
->clk
);
527 clk_bulk_disable_unprepare(wrapper
->num_clks
, wrapper
->clks
);
532 * geni_se_resources_on() - Turn on resources associated with the serial
534 * @se: Pointer to the concerned serial engine.
536 * Return: 0 on success, standard Linux error codes on failure/error.
538 int geni_se_resources_on(struct geni_se
*se
)
542 if (has_acpi_companion(se
->dev
))
545 ret
= geni_se_clks_on(se
);
549 ret
= pinctrl_pm_select_default_state(se
->dev
);
551 geni_se_clks_off(se
);
555 EXPORT_SYMBOL_GPL(geni_se_resources_on
);
558 * geni_se_clk_tbl_get() - Get the clock table to program DFS
559 * @se: Pointer to the concerned serial engine.
560 * @tbl: Table in which the output is returned.
562 * This function is called by the protocol drivers to determine the different
563 * clock frequencies supported by serial engine core clock. The protocol
564 * drivers use the output to determine the clock frequency index to be
565 * programmed into DFS.
567 * Return: number of valid performance levels in the table on success,
568 * standard Linux error codes on failure.
570 int geni_se_clk_tbl_get(struct geni_se
*se
, unsigned long **tbl
)
575 if (se
->clk_perf_tbl
) {
576 *tbl
= se
->clk_perf_tbl
;
577 return se
->num_clk_levels
;
580 se
->clk_perf_tbl
= devm_kcalloc(se
->dev
, MAX_CLK_PERF_LEVEL
,
581 sizeof(*se
->clk_perf_tbl
),
583 if (!se
->clk_perf_tbl
)
586 for (i
= 0; i
< MAX_CLK_PERF_LEVEL
; i
++) {
587 freq
= clk_round_rate(se
->clk
, freq
+ 1);
589 (i
> 0 && freq
== se
->clk_perf_tbl
[i
- 1]))
591 se
->clk_perf_tbl
[i
] = freq
;
593 se
->num_clk_levels
= i
;
594 *tbl
= se
->clk_perf_tbl
;
595 return se
->num_clk_levels
;
597 EXPORT_SYMBOL_GPL(geni_se_clk_tbl_get
);
600 * geni_se_clk_freq_match() - Get the matching or closest SE clock frequency
601 * @se: Pointer to the concerned serial engine.
602 * @req_freq: Requested clock frequency.
603 * @index: Index of the resultant frequency in the table.
604 * @res_freq: Resultant frequency of the source clock.
605 * @exact: Flag to indicate exact multiple requirement of the requested
608 * This function is called by the protocol drivers to determine the best match
609 * of the requested frequency as provided by the serial engine clock in order
610 * to meet the performance requirements.
612 * If we return success:
613 * - if @exact is true then @res_freq / <an_integer> == @req_freq
614 * - if @exact is false then @res_freq / <an_integer> <= @req_freq
616 * Return: 0 on success, standard Linux error codes on failure.
618 int geni_se_clk_freq_match(struct geni_se
*se
, unsigned long req_freq
,
619 unsigned int *index
, unsigned long *res_freq
,
625 unsigned long best_delta
;
626 unsigned long new_delta
;
627 unsigned int divider
;
629 num_clk_levels
= geni_se_clk_tbl_get(se
, &tbl
);
630 if (num_clk_levels
< 0)
631 return num_clk_levels
;
633 if (num_clk_levels
== 0)
636 best_delta
= ULONG_MAX
;
637 for (i
= 0; i
< num_clk_levels
; i
++) {
638 divider
= DIV_ROUND_UP(tbl
[i
], req_freq
);
639 new_delta
= req_freq
- tbl
[i
] / divider
;
640 if (new_delta
< best_delta
) {
641 /* We have a new best! */
645 /* If the new best is exact then we're done */
649 /* Record how close we got */
650 best_delta
= new_delta
;
659 EXPORT_SYMBOL_GPL(geni_se_clk_freq_match
);
661 #define GENI_SE_DMA_DONE_EN BIT(0)
662 #define GENI_SE_DMA_EOT_EN BIT(1)
663 #define GENI_SE_DMA_AHB_ERR_EN BIT(2)
664 #define GENI_SE_DMA_EOT_BUF BIT(0)
667 * geni_se_tx_init_dma() - Initiate TX DMA transfer on the serial engine
668 * @se: Pointer to the concerned serial engine.
669 * @iova: Mapped DMA address.
670 * @len: Length of the TX buffer.
672 * This function is used to initiate DMA TX transfer.
674 void geni_se_tx_init_dma(struct geni_se
*se
, dma_addr_t iova
, size_t len
)
678 val
= GENI_SE_DMA_DONE_EN
;
679 val
|= GENI_SE_DMA_EOT_EN
;
680 val
|= GENI_SE_DMA_AHB_ERR_EN
;
681 writel_relaxed(val
, se
->base
+ SE_DMA_TX_IRQ_EN_SET
);
682 writel_relaxed(lower_32_bits(iova
), se
->base
+ SE_DMA_TX_PTR_L
);
683 writel_relaxed(upper_32_bits(iova
), se
->base
+ SE_DMA_TX_PTR_H
);
684 writel_relaxed(GENI_SE_DMA_EOT_BUF
, se
->base
+ SE_DMA_TX_ATTR
);
685 writel(len
, se
->base
+ SE_DMA_TX_LEN
);
687 EXPORT_SYMBOL_GPL(geni_se_tx_init_dma
);
690 * geni_se_tx_dma_prep() - Prepare the serial engine for TX DMA transfer
691 * @se: Pointer to the concerned serial engine.
692 * @buf: Pointer to the TX buffer.
693 * @len: Length of the TX buffer.
694 * @iova: Pointer to store the mapped DMA address.
696 * This function is used to prepare the buffers for DMA TX.
698 * Return: 0 on success, standard Linux error codes on failure.
700 int geni_se_tx_dma_prep(struct geni_se
*se
, void *buf
, size_t len
,
703 struct geni_wrapper
*wrapper
= se
->wrapper
;
708 *iova
= dma_map_single(wrapper
->dev
, buf
, len
, DMA_TO_DEVICE
);
709 if (dma_mapping_error(wrapper
->dev
, *iova
))
712 geni_se_tx_init_dma(se
, *iova
, len
);
715 EXPORT_SYMBOL_GPL(geni_se_tx_dma_prep
);
718 * geni_se_rx_init_dma() - Initiate RX DMA transfer on the serial engine
719 * @se: Pointer to the concerned serial engine.
720 * @iova: Mapped DMA address.
721 * @len: Length of the RX buffer.
723 * This function is used to initiate DMA RX transfer.
725 void geni_se_rx_init_dma(struct geni_se
*se
, dma_addr_t iova
, size_t len
)
729 val
= GENI_SE_DMA_DONE_EN
;
730 val
|= GENI_SE_DMA_EOT_EN
;
731 val
|= GENI_SE_DMA_AHB_ERR_EN
;
732 writel_relaxed(val
, se
->base
+ SE_DMA_RX_IRQ_EN_SET
);
733 writel_relaxed(lower_32_bits(iova
), se
->base
+ SE_DMA_RX_PTR_L
);
734 writel_relaxed(upper_32_bits(iova
), se
->base
+ SE_DMA_RX_PTR_H
);
735 /* RX does not have EOT buffer type bit. So just reset RX_ATTR */
736 writel_relaxed(0, se
->base
+ SE_DMA_RX_ATTR
);
737 writel(len
, se
->base
+ SE_DMA_RX_LEN
);
739 EXPORT_SYMBOL_GPL(geni_se_rx_init_dma
);
742 * geni_se_rx_dma_prep() - Prepare the serial engine for RX DMA transfer
743 * @se: Pointer to the concerned serial engine.
744 * @buf: Pointer to the RX buffer.
745 * @len: Length of the RX buffer.
746 * @iova: Pointer to store the mapped DMA address.
748 * This function is used to prepare the buffers for DMA RX.
750 * Return: 0 on success, standard Linux error codes on failure.
752 int geni_se_rx_dma_prep(struct geni_se
*se
, void *buf
, size_t len
,
755 struct geni_wrapper
*wrapper
= se
->wrapper
;
760 *iova
= dma_map_single(wrapper
->dev
, buf
, len
, DMA_FROM_DEVICE
);
761 if (dma_mapping_error(wrapper
->dev
, *iova
))
764 geni_se_rx_init_dma(se
, *iova
, len
);
767 EXPORT_SYMBOL_GPL(geni_se_rx_dma_prep
);
770 * geni_se_tx_dma_unprep() - Unprepare the serial engine after TX DMA transfer
771 * @se: Pointer to the concerned serial engine.
772 * @iova: DMA address of the TX buffer.
773 * @len: Length of the TX buffer.
775 * This function is used to unprepare the DMA buffers after DMA TX.
777 void geni_se_tx_dma_unprep(struct geni_se
*se
, dma_addr_t iova
, size_t len
)
779 struct geni_wrapper
*wrapper
= se
->wrapper
;
781 if (!dma_mapping_error(wrapper
->dev
, iova
))
782 dma_unmap_single(wrapper
->dev
, iova
, len
, DMA_TO_DEVICE
);
784 EXPORT_SYMBOL_GPL(geni_se_tx_dma_unprep
);
787 * geni_se_rx_dma_unprep() - Unprepare the serial engine after RX DMA transfer
788 * @se: Pointer to the concerned serial engine.
789 * @iova: DMA address of the RX buffer.
790 * @len: Length of the RX buffer.
792 * This function is used to unprepare the DMA buffers after DMA RX.
794 void geni_se_rx_dma_unprep(struct geni_se
*se
, dma_addr_t iova
, size_t len
)
796 struct geni_wrapper
*wrapper
= se
->wrapper
;
798 if (!dma_mapping_error(wrapper
->dev
, iova
))
799 dma_unmap_single(wrapper
->dev
, iova
, len
, DMA_FROM_DEVICE
);
801 EXPORT_SYMBOL_GPL(geni_se_rx_dma_unprep
);
803 int geni_icc_get(struct geni_se
*se
, const char *icc_ddr
)
806 const char *icc_names
[] = {"qup-core", "qup-config", icc_ddr
};
808 if (has_acpi_companion(se
->dev
))
811 for (i
= 0; i
< ARRAY_SIZE(se
->icc_paths
); i
++) {
815 se
->icc_paths
[i
].path
= devm_of_icc_get(se
->dev
, icc_names
[i
]);
816 if (IS_ERR(se
->icc_paths
[i
].path
))
823 err
= PTR_ERR(se
->icc_paths
[i
].path
);
824 if (err
!= -EPROBE_DEFER
)
825 dev_err_ratelimited(se
->dev
, "Failed to get ICC path '%s': %d\n",
830 EXPORT_SYMBOL_GPL(geni_icc_get
);
832 int geni_icc_set_bw(struct geni_se
*se
)
836 for (i
= 0; i
< ARRAY_SIZE(se
->icc_paths
); i
++) {
837 ret
= icc_set_bw(se
->icc_paths
[i
].path
,
838 se
->icc_paths
[i
].avg_bw
, se
->icc_paths
[i
].avg_bw
);
840 dev_err_ratelimited(se
->dev
, "ICC BW voting failed on path '%s': %d\n",
841 icc_path_names
[i
], ret
);
848 EXPORT_SYMBOL_GPL(geni_icc_set_bw
);
850 void geni_icc_set_tag(struct geni_se
*se
, u32 tag
)
854 for (i
= 0; i
< ARRAY_SIZE(se
->icc_paths
); i
++)
855 icc_set_tag(se
->icc_paths
[i
].path
, tag
);
857 EXPORT_SYMBOL_GPL(geni_icc_set_tag
);
859 /* To do: Replace this by icc_bulk_enable once it's implemented in ICC core */
860 int geni_icc_enable(struct geni_se
*se
)
864 for (i
= 0; i
< ARRAY_SIZE(se
->icc_paths
); i
++) {
865 ret
= icc_enable(se
->icc_paths
[i
].path
);
867 dev_err_ratelimited(se
->dev
, "ICC enable failed on path '%s': %d\n",
868 icc_path_names
[i
], ret
);
875 EXPORT_SYMBOL_GPL(geni_icc_enable
);
877 int geni_icc_disable(struct geni_se
*se
)
881 for (i
= 0; i
< ARRAY_SIZE(se
->icc_paths
); i
++) {
882 ret
= icc_disable(se
->icc_paths
[i
].path
);
884 dev_err_ratelimited(se
->dev
, "ICC disable failed on path '%s': %d\n",
885 icc_path_names
[i
], ret
);
892 EXPORT_SYMBOL_GPL(geni_icc_disable
);
894 static int geni_se_probe(struct platform_device
*pdev
)
896 struct device
*dev
= &pdev
->dev
;
897 struct geni_wrapper
*wrapper
;
900 wrapper
= devm_kzalloc(dev
, sizeof(*wrapper
), GFP_KERNEL
);
905 wrapper
->base
= devm_platform_ioremap_resource(pdev
, 0);
906 if (IS_ERR(wrapper
->base
))
907 return PTR_ERR(wrapper
->base
);
909 if (!has_acpi_companion(&pdev
->dev
)) {
910 const struct geni_se_desc
*desc
;
913 desc
= device_get_match_data(&pdev
->dev
);
917 wrapper
->num_clks
= min_t(unsigned int, desc
->num_clks
, MAX_CLKS
);
919 for (i
= 0; i
< wrapper
->num_clks
; ++i
)
920 wrapper
->clks
[i
].id
= desc
->clks
[i
];
922 ret
= of_count_phandle_with_args(dev
->of_node
, "clocks", "#clock-cells");
924 dev_err(dev
, "invalid clocks property at %pOF\n", dev
->of_node
);
928 if (ret
< wrapper
->num_clks
) {
929 dev_err(dev
, "invalid clocks count at %pOF, expected %d entries\n",
930 dev
->of_node
, wrapper
->num_clks
);
934 ret
= devm_clk_bulk_get(dev
, wrapper
->num_clks
, wrapper
->clks
);
936 dev_err(dev
, "Err getting clks %d\n", ret
);
941 dev_set_drvdata(dev
, wrapper
);
942 dev_dbg(dev
, "GENI SE Driver probed\n");
943 return devm_of_platform_populate(dev
);
946 static const char * const qup_clks
[] = {
951 static const struct geni_se_desc qup_desc
= {
953 .num_clks
= ARRAY_SIZE(qup_clks
),
956 static const char * const i2c_master_hub_clks
[] = {
960 static const struct geni_se_desc i2c_master_hub_desc
= {
961 .clks
= i2c_master_hub_clks
,
962 .num_clks
= ARRAY_SIZE(i2c_master_hub_clks
),
965 static const struct of_device_id geni_se_dt_match
[] = {
966 { .compatible
= "qcom,geni-se-qup", .data
= &qup_desc
},
967 { .compatible
= "qcom,geni-se-i2c-master-hub", .data
= &i2c_master_hub_desc
},
970 MODULE_DEVICE_TABLE(of
, geni_se_dt_match
);
972 static struct platform_driver geni_se_driver
= {
974 .name
= "geni_se_qup",
975 .of_match_table
= geni_se_dt_match
,
977 .probe
= geni_se_probe
,
979 module_platform_driver(geni_se_driver
);
981 MODULE_DESCRIPTION("GENI Serial Engine Driver");
982 MODULE_LICENSE("GPL v2");