blob: e1ad51e05d3dfa52fb5fb77e3c318ca2441c1c33 [file] [log] [blame]
Sagar Dharia7c927c02016-11-23 11:51:43 -07001/*
2 * Copyright (c) 2017, The Linux Foundation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 */
14
15#ifndef _LINUX_QCOM_GENI_SE
16#define _LINUX_QCOM_GENI_SE
17#include <linux/io.h>
Girish Mahadevanebeed352016-11-23 10:59:29 -070018#include <linux/clk.h>
19#include <linux/msm-bus.h>
20#include <linux/msm-bus-board.h>
21#include <linux/pm_runtime.h>
Sagar Dharia7c927c02016-11-23 11:51:43 -070022
23enum se_xfer_mode {
24 INVALID,
25 FIFO_MODE,
26 GSI_DMA,
27};
28
29enum se_protocol_types {
30 NONE,
31 SPI,
32 UART,
33 I2C,
34 I3C
35};
36
Girish Mahadevanebeed352016-11-23 10:59:29 -070037struct se_geni_rsc {
38 struct clk *se_clk;
39 struct clk *m_ahb_clk;
40 struct clk *s_ahb_clk;
41 struct msm_bus_client_handle *bus_bw;
42 unsigned long ab;
43 unsigned long ib;
44 struct pinctrl *geni_pinctrl;
45 struct pinctrl_state *geni_gpio_active;
46 struct pinctrl_state *geni_gpio_sleep;
47};
48
49#define PINCTRL_DEFAULT "default"
50#define PINCTRL_SLEEP "sleep"
51
Girish Mahadevan2ef85af2017-02-14 14:42:22 -070052/* Common SE registers */
Sagar Dharia7c927c02016-11-23 11:51:43 -070053#define GENI_INIT_CFG_REVISION (0x0)
54#define GENI_S_INIT_CFG_REVISION (0x4)
55#define GENI_FORCE_DEFAULT_REG (0x20)
56#define GENI_OUTPUT_CTRL (0x24)
57#define GENI_CGC_CTRL (0x28)
58#define SE_GENI_STATUS (0x40)
59#define GENI_SER_M_CLK_CFG (0x48)
60#define GENI_SER_S_CLK_CFG (0x4C)
61#define GENI_CLK_CTRL_RO (0x60)
62#define GENI_IF_DISABLE_RO (0x64)
63#define GENI_FW_REVISION_RO (0x68)
64#define GENI_FW_S_REVISION_RO (0x6C)
65#define SE_GENI_CLK_SEL (0x7C)
66#define SE_GENI_DMA_MODE_EN (0x258)
67#define SE_GENI_TX_PACKING_CFG0 (0x260)
68#define SE_GENI_TX_PACKING_CFG1 (0x264)
69#define SE_GENI_RX_PACKING_CFG0 (0x284)
70#define SE_GENI_RX_PACKING_CFG1 (0x288)
71#define SE_GENI_M_CMD0 (0x600)
72#define SE_GENI_M_CMD_CTRL_REG (0x604)
73#define SE_GENI_M_IRQ_STATUS (0x610)
74#define SE_GENI_M_IRQ_EN (0x614)
75#define SE_GENI_M_IRQ_CLEAR (0x618)
76#define SE_GENI_S_CMD0 (0x630)
77#define SE_GENI_S_CMD_CTRL_REG (0x634)
78#define SE_GENI_S_IRQ_STATUS (0x640)
79#define SE_GENI_S_IRQ_EN (0x644)
80#define SE_GENI_S_IRQ_CLEAR (0x648)
81#define SE_GENI_TX_FIFOn (0x700)
82#define SE_GENI_RX_FIFOn (0x780)
83#define SE_GENI_TX_FIFO_STATUS (0x800)
84#define SE_GENI_RX_FIFO_STATUS (0x804)
85#define SE_GENI_TX_WATERMARK_REG (0x80C)
86#define SE_GENI_RX_WATERMARK_REG (0x810)
87#define SE_GENI_RX_RFR_WATERMARK_REG (0x814)
88#define SE_GENI_M_GP_LENGTH (0x910)
89#define SE_GENI_S_GP_LENGTH (0x914)
90#define SE_IRQ_EN (0xE1C)
91#define SE_HW_PARAM_0 (0xE24)
92#define SE_HW_PARAM_1 (0xE28)
93#define SE_DMA_GENERAL_CFG (0xE30)
94
95/* GENI_OUTPUT_CTRL fields */
96#define DEFAULT_IO_OUTPUT_CTRL_MSK (GENMASK(6, 0))
97
98/* GENI_FORCE_DEFAULT_REG fields */
99#define FORCE_DEFAULT (BIT(0))
100
101/* GENI_CGC_CTRL fields */
102#define CFG_AHB_CLK_CGC_ON (BIT(0))
103#define CFG_AHB_WR_ACLK_CGC_ON (BIT(1))
104#define DATA_AHB_CLK_CGC_ON (BIT(2))
105#define SCLK_CGC_ON (BIT(3))
106#define TX_CLK_CGC_ON (BIT(4))
107#define RX_CLK_CGC_ON (BIT(5))
108#define EXT_CLK_CGC_ON (BIT(6))
109#define PROG_RAM_HCLK_OFF (BIT(8))
110#define PROG_RAM_SCLK_OFF (BIT(9))
111#define DEFAULT_CGC_EN (GENMASK(6, 0))
112
113/* GENI_STATUS fields */
114#define M_GENI_CMD_ACTIVE (BIT(0))
115#define S_GENI_CMD_ACTIVE (BIT(12))
116
117/* GENI_SER_M_CLK_CFG/GENI_SER_S_CLK_CFG */
118#define SER_CLK_EN (BIT(0))
119#define CLK_DIV_MSK (GENMASK(15, 4))
120#define CLK_DIV_SHFT (4)
121
122/* CLK_CTRL_RO fields */
123
124/* IF_DISABLE_RO fields */
125
126/* FW_REVISION_RO fields */
127#define FW_REV_PROTOCOL_MSK (GENMASK(15, 8))
128#define FW_REV_PROTOCOL_SHFT (8)
129
Girish Mahadevan2ef85af2017-02-14 14:42:22 -0700130/* GENI_CLK_SEL fields */
131#define CLK_SEL_MSK (GENMASK(2, 0))
132
Sagar Dharia7c927c02016-11-23 11:51:43 -0700133/* SE_GENI_DMA_MODE_EN */
134#define GENI_DMA_MODE_EN (BIT(0))
135
136/* GENI_M_CMD0 fields */
137#define M_OPCODE_MSK (GENMASK(31, 27))
138#define M_OPCODE_SHFT (27)
139#define M_PARAMS_MSK (GENMASK(26, 0))
140
141/* GENI_M_CMD_CTRL_REG */
142#define M_GENI_CMD_CANCEL BIT(2)
143#define M_GENI_CMD_ABORT BIT(1)
144#define M_GENI_DISABLE BIT(0)
145
146/* GENI_S_CMD0 fields */
147#define S_OPCODE_MSK (GENMASK(31, 27))
148#define S_OPCODE_SHFT (27)
149#define S_PARAMS_MSK (GENMASK(26, 0))
150
151/* GENI_S_CMD_CTRL_REG */
152#define S_GENI_CMD_CANCEL (BIT(2))
153#define S_GENI_CMD_ABORT (BIT(1))
154#define S_GENI_DISABLE (BIT(0))
155
156/* GENI_M_IRQ_EN fields */
157#define M_CMD_DONE_EN (BIT(0))
158#define M_CMD_OVERRUN_EN (BIT(1))
159#define M_ILLEGAL_CMD_EN (BIT(2))
160#define M_CMD_FAILURE_EN (BIT(3))
161#define M_CMD_CANCEL_EN (BIT(4))
162#define M_CMD_ABORT_EN (BIT(5))
163#define M_TIMESTAMP_EN (BIT(6))
164#define M_RX_IRQ_EN (BIT(7))
165#define M_GP_SYNC_IRQ_0_EN (BIT(8))
166#define M_GP_IRQ_0_EN (BIT(9))
167#define M_GP_IRQ_1_EN (BIT(10))
168#define M_GP_IRQ_2_EN (BIT(11))
169#define M_GP_IRQ_3_EN (BIT(12))
170#define M_GP_IRQ_4_EN (BIT(13))
171#define M_GP_IRQ_5_EN (BIT(14))
172#define M_IO_DATA_DEASSERT_EN (BIT(22))
173#define M_IO_DATA_ASSERT_EN (BIT(23))
174#define M_RX_FIFO_RD_ERR_EN (BIT(24))
175#define M_RX_FIFO_WR_ERR_EN (BIT(25))
176#define M_RX_FIFO_WATERMARK_EN (BIT(26))
177#define M_RX_FIFO_LAST_EN (BIT(27))
178#define M_TX_FIFO_RD_ERR_EN (BIT(28))
179#define M_TX_FIFO_WR_ERR_EN (BIT(29))
180#define M_TX_FIFO_WATERMARK_EN (BIT(30))
181#define M_SEC_IRQ_EN (BIT(31))
182#define M_COMMON_GENI_M_IRQ_EN (GENMASK(3, 0) | M_TIMESTAMP_EN | \
183 GENMASK(14, 8) | M_IO_DATA_DEASSERT_EN | \
184 M_IO_DATA_ASSERT_EN | M_RX_FIFO_RD_ERR_EN | \
185 M_RX_FIFO_WR_ERR_EN | M_TX_FIFO_RD_ERR_EN | \
186 M_TX_FIFO_WR_ERR_EN | M_SEC_IRQ_EN)
187
188/* GENI_S_IRQ_EN fields */
189#define S_CMD_DONE_EN (BIT(0))
190#define S_CMD_OVERRUN_EN (BIT(1))
191#define S_ILLEGAL_CMD_EN (BIT(2))
192#define S_CMD_FAILURE_EN (BIT(3))
193#define S_CMD_CANCEL_EN (BIT(4))
194#define S_CMD_ABORT_EN (BIT(5))
195#define S_GP_SYNC_IRQ_0_EN (BIT(8))
196#define S_GP_IRQ_0_EN (BIT(9))
197#define S_GP_IRQ_1_EN (BIT(10))
198#define S_GP_IRQ_2_EN (BIT(11))
199#define S_GP_IRQ_3_EN (BIT(12))
200#define S_GP_IRQ_4_EN (BIT(13))
201#define S_GP_IRQ_5_EN (BIT(14))
202#define S_IO_DATA_DEASSERT_EN (BIT(22))
203#define S_IO_DATA_ASSERT_EN (BIT(23))
204#define S_RX_FIFO_RD_ERR_EN (BIT(24))
205#define S_RX_FIFO_WR_ERR_EN (BIT(25))
206#define S_RX_FIFO_WATERMARK_EN (BIT(26))
207#define S_RX_FIFO_LAST_EN (BIT(27))
208#define S_COMMON_GENI_S_IRQ_EN (GENMASK(3, 0) | GENMASK(14, 8) | \
209 S_RX_FIFO_RD_ERR_EN | S_RX_FIFO_WR_ERR_EN)
210
211/* GENI_/TX/RX/RX_RFR/_WATERMARK_REG fields */
212#define WATERMARK_MSK (GENMASK(5, 0))
213
214/* GENI_TX_FIFO_STATUS fields */
215#define TX_FIFO_WC (GENMASK(27, 0))
216
217/* GENI_RX_FIFO_STATUS fields */
218#define RX_LAST (BIT(31))
219#define RX_LAST_BYTE_VALID_MSK (GENMASK(30, 28))
220#define RX_LAST_BYTE_VALID_SHFT (28)
221#define RX_FIFO_WC_MSK (GENMASK(24, 0))
222
223/* SE_IRQ_EN fields */
224#define DMA_RX_IRQ_EN (BIT(0))
225#define DMA_TX_IRQ_EN (BIT(1))
226#define GENI_M_IRQ_EN (BIT(2))
227#define GENI_S_IRQ_EN (BIT(3))
228
229/* SE_HW_PARAM_0 fields */
230#define TX_FIFO_WIDTH_MSK (GENMASK(29, 24))
231#define TX_FIFO_WIDTH_SHFT (24)
232#define TX_FIFO_DEPTH_MSK (GENMASK(21, 16))
233#define TX_FIFO_DEPTH_SHFT (16)
234
235/* SE_HW_PARAM_1 fields */
236#define RX_FIFO_WIDTH_MSK (GENMASK(29, 24))
237#define RX_FIFO_WIDTH_SHFT (24)
238#define RX_FIFO_DEPTH_MSK (GENMASK(21, 16))
239#define RX_FIFO_DEPTH_SHFT (16)
240
241/* SE_DMA_GENERAL_CFG */
242#define DMA_RX_CLK_CGC_ON (BIT(0))
243#define DMA_TX_CLK_CGC_ON (BIT(1))
244#define DMA_AHB_SLV_CFG_ON (BIT(2))
245#define AHB_SEC_SLV_CLK_CGC_ON (BIT(3))
246#define DUMMY_RX_NON_BUFFERABLE (BIT(4))
247#define RX_DMA_ZERO_PADDING_EN (BIT(5))
248#define RX_DMA_IRQ_DELAY_MSK (GENMASK(8, 6))
249#define RX_DMA_IRQ_DELAY_SHFT (6)
250
251static inline unsigned int geni_read_reg(void __iomem *base, int offset)
252{
253 return readl_relaxed(base + offset);
254}
255
256static inline void geni_write_reg(unsigned int value, void __iomem *base,
257 int offset)
258{
259 return writel_relaxed(value, (base + offset));
260}
261
262static inline int get_se_proto(void __iomem *base)
263{
264 int proto = 0;
265
266 proto = ((geni_read_reg(base, GENI_FW_REVISION_RO)
267 & FW_REV_PROTOCOL_MSK) >> FW_REV_PROTOCOL_SHFT);
268 return proto;
269}
270
271static inline int se_geni_irq_en(void __iomem *base, int mode)
272{
273 int ret = 0;
274 unsigned int common_geni_m_irq_en;
275 unsigned int common_geni_s_irq_en;
276 int proto = get_se_proto(base);
277
278 common_geni_m_irq_en = geni_read_reg(base, SE_GENI_M_IRQ_EN);
279 common_geni_s_irq_en = geni_read_reg(base, SE_GENI_S_IRQ_EN);
280 /* Common to all modes */
281 common_geni_m_irq_en |= M_COMMON_GENI_M_IRQ_EN;
282 common_geni_s_irq_en |= S_COMMON_GENI_S_IRQ_EN;
283
284 switch (mode) {
285 case FIFO_MODE:
286 {
Girish Mahadevan2ef85af2017-02-14 14:42:22 -0700287 if (proto != UART) {
Sagar Dharia7c927c02016-11-23 11:51:43 -0700288 common_geni_m_irq_en |=
Girish Mahadevan2ef85af2017-02-14 14:42:22 -0700289 (M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN |
290 M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN);
Sagar Dharia7c927c02016-11-23 11:51:43 -0700291 common_geni_s_irq_en |= S_CMD_DONE_EN;
292 }
293 break;
294 }
295 case GSI_DMA:
296 break;
297 default:
298 pr_err("%s: Invalid mode %d\n", __func__, mode);
299 ret = -ENXIO;
300 goto exit_irq_en;
301 }
302
303
304 geni_write_reg(common_geni_m_irq_en, base, SE_GENI_M_IRQ_EN);
305 geni_write_reg(common_geni_s_irq_en, base, SE_GENI_S_IRQ_EN);
306exit_irq_en:
307 return ret;
308}
309
310
311static inline void se_set_rx_rfr_wm(void __iomem *base, unsigned int rx_wm,
312 unsigned int rx_rfr)
313{
314 geni_write_reg(rx_wm, base, SE_GENI_RX_WATERMARK_REG);
315 geni_write_reg(rx_rfr, base, SE_GENI_RX_RFR_WATERMARK_REG);
316}
317
318static inline int se_io_set_mode(void __iomem *base, int mode)
319{
320 int ret = 0;
321 unsigned int io_mode = 0;
322 unsigned int geni_dma_mode = 0;
323
324 io_mode = geni_read_reg(base, SE_IRQ_EN);
325 geni_dma_mode = geni_read_reg(base, SE_GENI_DMA_MODE_EN);
326
327 switch (mode) {
328 case FIFO_MODE:
329 {
330 io_mode |= (GENI_M_IRQ_EN | GENI_S_IRQ_EN);
331 io_mode |= (DMA_TX_IRQ_EN | DMA_RX_IRQ_EN);
332 geni_dma_mode &= ~GENI_DMA_MODE_EN;
333 break;
334
335 }
336 default:
337 ret = -ENXIO;
338 goto exit_set_mode;
339 }
340 geni_write_reg(io_mode, base, SE_IRQ_EN);
341 geni_write_reg(geni_dma_mode, base, SE_GENI_DMA_MODE_EN);
342exit_set_mode:
343 return ret;
344}
345
346static inline void se_io_init(void __iomem *base)
347{
348 unsigned int io_op_ctrl = 0;
349 unsigned int geni_cgc_ctrl;
350 unsigned int dma_general_cfg;
351
352 geni_cgc_ctrl = geni_read_reg(base, GENI_CGC_CTRL);
353 dma_general_cfg = geni_read_reg(base, SE_DMA_GENERAL_CFG);
354 geni_cgc_ctrl |= DEFAULT_CGC_EN;
355 dma_general_cfg |= (AHB_SEC_SLV_CLK_CGC_ON | DMA_AHB_SLV_CFG_ON |
356 DMA_TX_CLK_CGC_ON | DMA_RX_CLK_CGC_ON);
357 io_op_ctrl |= DEFAULT_IO_OUTPUT_CTRL_MSK;
358 geni_write_reg(geni_cgc_ctrl, base, GENI_CGC_CTRL);
359 geni_write_reg(dma_general_cfg, base, SE_DMA_GENERAL_CFG);
360
361 geni_write_reg(io_op_ctrl, base, GENI_OUTPUT_CTRL);
362 geni_write_reg(FORCE_DEFAULT, base, GENI_FORCE_DEFAULT_REG);
363}
364
365static inline int geni_se_init(void __iomem *base, int mode,
366 unsigned int rx_wm, unsigned int rx_rfr)
367{
368 int ret = 0;
369
370 se_io_init(base);
371 ret = se_io_set_mode(base, mode);
372 if (ret)
373 goto exit_geni_se_init;
374
375 se_set_rx_rfr_wm(base, rx_wm, rx_rfr);
376 ret = se_geni_irq_en(base, mode);
377 if (ret)
378 goto exit_geni_se_init;
379
380exit_geni_se_init:
381 return ret;
382}
383
384static inline void geni_setup_m_cmd(void __iomem *base, u32 cmd,
385 u32 params)
386{
387 u32 m_cmd = geni_read_reg(base, SE_GENI_M_CMD0);
388
389 m_cmd &= ~(M_OPCODE_MSK | M_PARAMS_MSK);
390 m_cmd |= (cmd << M_OPCODE_SHFT);
391 m_cmd |= (params & M_PARAMS_MSK);
392 geni_write_reg(m_cmd, base, SE_GENI_M_CMD0);
393}
394
395static inline void geni_setup_s_cmd(void __iomem *base, u32 cmd,
396 u32 params)
397{
398 u32 s_cmd = geni_read_reg(base, SE_GENI_S_CMD0);
399
400 s_cmd &= ~(S_OPCODE_MSK | S_PARAMS_MSK);
401 s_cmd |= (cmd << S_OPCODE_SHFT);
402 s_cmd |= (params & S_PARAMS_MSK);
403 geni_write_reg(s_cmd, base, SE_GENI_S_CMD0);
404}
405
406static inline void geni_cancel_m_cmd(void __iomem *base)
407{
408 geni_write_reg(M_GENI_CMD_CANCEL, base, SE_GENI_S_CMD_CTRL_REG);
409}
410
411static inline void geni_cancel_s_cmd(void __iomem *base)
412{
413 geni_write_reg(S_GENI_CMD_CANCEL, base, SE_GENI_S_CMD_CTRL_REG);
414}
415
416static inline void geni_abort_m_cmd(void __iomem *base)
417{
418 geni_write_reg(M_GENI_CMD_ABORT, base, SE_GENI_M_CMD_CTRL_REG);
419}
420
421static inline void qcom_geni_abort_s_cmd(void __iomem *base)
422{
423 geni_write_reg(S_GENI_CMD_ABORT, base, SE_GENI_S_CMD_CTRL_REG);
424}
425
426static inline int get_tx_fifo_depth(void __iomem *base)
427{
428 int tx_fifo_depth;
429
430 tx_fifo_depth = ((geni_read_reg(base, SE_HW_PARAM_0)
431 & TX_FIFO_DEPTH_MSK) >> TX_FIFO_DEPTH_SHFT);
432 return tx_fifo_depth;
433}
434
435static inline int get_tx_fifo_width(void __iomem *base)
436{
437 int tx_fifo_width;
438
439 tx_fifo_width = ((geni_read_reg(base, SE_HW_PARAM_0)
440 & TX_FIFO_WIDTH_MSK) >> TX_FIFO_WIDTH_SHFT);
441 return tx_fifo_width;
442}
443
444static inline int get_rx_fifo_depth(void __iomem *base)
445{
446 int rx_fifo_depth;
447
448 rx_fifo_depth = ((geni_read_reg(base, SE_HW_PARAM_1)
449 & RX_FIFO_DEPTH_MSK) >> RX_FIFO_DEPTH_SHFT);
450 return rx_fifo_depth;
451}
452
453static inline void se_config_packing(void __iomem *base, int bpw,
454 int pack_words, bool msb_to_lsb)
455{
456 u32 cfg[4] = {0};
457 unsigned long cfg0, cfg1;
458 int len = ((bpw < 8) ? (bpw - 1) : 7);
459 int idx = ((msb_to_lsb == 1) ? len : 0);
460 int iter = (bpw * pack_words) >> 3;
461 int i;
462
463 for (i = 0; i < iter; i++) {
464 cfg[i] = ((idx << 5) | (msb_to_lsb << 4) | (len << 1));
465 idx += (len + 1);
466 if (i == iter - 1)
467 cfg[i] |= 1;
468 }
469 cfg0 = cfg[0] | (cfg[1] << 10);
470 cfg1 = cfg[2] | (cfg[3] << 10);
471 geni_write_reg(cfg0, base, SE_GENI_TX_PACKING_CFG0);
472 geni_write_reg(cfg1, base, SE_GENI_TX_PACKING_CFG1);
473 geni_write_reg(cfg0, base, SE_GENI_RX_PACKING_CFG0);
474 geni_write_reg(cfg1, base, SE_GENI_RX_PACKING_CFG1);
475}
Girish Mahadevanebeed352016-11-23 10:59:29 -0700476
477/*
478 * Power/Resource Management functions
479 */
480
481static inline int se_geni_clks_off(struct se_geni_rsc *rsc)
482{
483 int ret = 0;
484
485 clk_disable_unprepare(rsc->se_clk);
486 clk_disable_unprepare(rsc->m_ahb_clk);
487 clk_disable_unprepare(rsc->s_ahb_clk);
488 return ret;
489}
490
491static inline int se_geni_resources_off(struct se_geni_rsc *rsc)
492{
493 int ret = 0;
494
495 ret = pinctrl_select_state(rsc->geni_pinctrl, rsc->geni_gpio_sleep);
496 se_geni_clks_off(rsc);
497 if (rsc->bus_bw)
498 msm_bus_scale_update_bw(rsc->bus_bw, 0, 0);
499 return ret;
500}
501
502static inline int se_geni_clks_on(struct se_geni_rsc *rsc)
503{
504 int ret = 0;
505
506 clk_prepare_enable(rsc->se_clk);
507 clk_prepare_enable(rsc->m_ahb_clk);
508 clk_prepare_enable(rsc->s_ahb_clk);
509 return ret;
510}
511
512static inline int se_geni_resources_on(struct se_geni_rsc *rsc)
513{
514 int ret = 0;
515
516 if (rsc->bus_bw)
517 msm_bus_scale_update_bw(rsc->bus_bw, rsc->ab, rsc->ib);
518 se_geni_clks_on(rsc);
519 ret = pinctrl_select_state(rsc->geni_pinctrl, rsc->geni_gpio_active);
520 return ret;
521}
Sagar Dharia7c927c02016-11-23 11:51:43 -0700522#endif