1/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 * GNU General Public License for more details.
11 */
12
13#ifndef __WCD9310_SLIMSLAVE_H_
14#define __WCD9310_SLIMSLAVE_H_
15
16#include <linux/slimbus/slimbus.h>
17#include <linux/mfd/wcd9xxx/core.h>
18
19/* Channel numbers to be used for each port */
20enum {
21	SLIM_TX_1   = 128,
22	SLIM_TX_2   = 129,
23	SLIM_TX_3   = 130,
24	SLIM_TX_4   = 131,
25	SLIM_TX_5   = 132,
26	SLIM_TX_6   = 133,
27	SLIM_TX_7   = 134,
28	SLIM_TX_8   = 135,
29	SLIM_TX_9   = 136,
30	SLIM_TX_10  = 137,
31	SLIM_RX_1   = 138,
32	SLIM_RX_2   = 139,
33	SLIM_RX_3   = 140,
34	SLIM_RX_4   = 141,
35	SLIM_RX_5   = 142,
36	SLIM_RX_6   = 143,
37	SLIM_RX_7   = 144,
38	SLIM_MAX    = 145
39};
40
41/*
42 *  client is expected to give port ids in the range of
43 *  1-10 for pre Taiko Tx ports and 1-16 for Taiko
44 *  1-7 for pre Taiko Rx ports and 1-16 for Tako,
45 *  we need to add offset for getting the absolute slave
46 *  port id before configuring the HW
47 */
48#define TABLA_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS 10
49#define TAIKO_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS 16
50
51#define SLIM_MAX_TX_PORTS TAIKO_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS
52
53#define TABLA_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS \
54	TABLA_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS
55#define TAIKO_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS \
56	TAIKO_SB_PGD_MAX_NUMBER_OF_TX_SLAVE_DEV_PORTS
57
58#define TABLA_SB_PGD_MAX_NUMBER_OF_RX_SLAVE_DEV_PORTS 7
59#define TAIKO_SB_PGD_MAX_NUMBER_OF_RX_SLAVE_DEV_PORTS 13
60
61#define SLIM_MAX_RX_PORTS TAIKO_SB_PGD_MAX_NUMBER_OF_RX_SLAVE_DEV_PORTS
62
63#define TABLA_SB_PGD_RX_PORT_MULTI_CHANNEL_0_START_PORT_ID \
64	TABLA_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS
65#define TAIKO_SB_PGD_RX_PORT_MULTI_CHANNEL_0_START_PORT_ID \
66	TAIKO_SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS
67
68#define TABLA_SB_PGD_RX_PORT_MULTI_CHANNEL_0_END_PORT_ID 16
69#define TAIKO_SB_PGD_RX_PORT_MULTI_CHANNEL_0_END_PORT_ID 31
70
71#define TABLA_SB_PGD_TX_PORT_MULTI_CHANNEL_1_END_PORT_ID 9
72#define TAIKO_SB_PGD_TX_PORT_MULTI_CHANNEL_1_END_PORT_ID 15
73
74/* below details are taken from SLIMBUS slave SWI */
75#define SB_PGD_PORT_BASE 0x000
76
77#define SB_PGD_PORT_CFG_BYTE_ADDR(offset, port_num) \
78		(SB_PGD_PORT_BASE + offset + (1 * port_num))
79
80#define SB_PGD_TX_PORT_MULTI_CHANNEL_0(port_num) \
81		(SB_PGD_PORT_BASE + 0x100 + 4*port_num)
82#define SB_PGD_TX_PORT_MULTI_CHANNEL_0_START_PORT_ID   0
83#define SB_PGD_TX_PORT_MULTI_CHANNEL_0_END_PORT_ID     7
84
85#define SB_PGD_TX_PORT_MULTI_CHANNEL_1(port_num) \
86		(SB_PGD_PORT_BASE + 0x101 + 4*port_num)
87#define SB_PGD_TX_PORT_MULTI_CHANNEL_1_START_PORT_ID   8
88
89#define SB_PGD_RX_PORT_MULTI_CHANNEL_0(offset, port_num) \
90		(SB_PGD_PORT_BASE + offset + (4 * port_num))
91
92/* slave port water mark level
93 *   (0: 6bytes, 1: 9bytes, 2: 12 bytes, 3: 15 bytes)
94 */
95#define SLAVE_PORT_WATER_MARK_VALUE 2
96#define SLAVE_PORT_WATER_MARK_SHIFT 1
97#define SLAVE_PORT_ENABLE           1
98#define SLAVE_PORT_DISABLE          0
99
100#define BASE_CH_NUM 128
101
102
103int wcd9xxx_init_slimslave(struct wcd9xxx *wcd9xxx, u8 wcd9xxx_pgd_la);
104
105int wcd9xxx_deinit_slimslave(struct wcd9xxx *wcd9xxx);
106
107int wcd9xxx_cfg_slim_sch_rx(struct wcd9xxx *wcd9xxx, unsigned int *ch_num,
108				unsigned int tot_ch, unsigned int rate);
109int wcd9xxx_cfg_slim_sch_tx(struct wcd9xxx *wcd9xxx, unsigned int *ch_num,
110				unsigned int tot_ch, unsigned int rate);
111int wcd9xxx_close_slim_sch_rx(struct wcd9xxx *wcd9xxx, unsigned int *ch_num,
112				unsigned int tot_ch);
113int wcd9xxx_close_slim_sch_tx(struct wcd9xxx *wcd9xxx, unsigned int *ch_num,
114				unsigned int tot_ch);
115int wcd9xxx_get_channel(struct wcd9xxx *wcd9xxx,
116			unsigned int *rx_ch,
117			unsigned int *tx_ch);
118int wcd9xxx_get_slave_port(unsigned int ch_num);
119int wcd9xxx_disconnect_port(struct wcd9xxx *wcd9xxx, unsigned int *ch_num,
120				unsigned int tot_ch, unsigned int rx_tx);
121#endif /* __WCD9310_SLIMSLAVE_H_ */
122