summaryrefslogtreecommitdiff
path: root/driver/retimer/kb800x.h
blob: 1d041f3e291cb97c271f2dcc538ac40e2d1a0477 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* Copyright 2021 The ChromiumOS Authors
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * Driver for Kandou KB8001 USB-C 40 Gb/s multiprotocol switch.
 */

#ifndef __CROS_EC_KB800X_H
#define __CROS_EC_KB800X_H

#include "compile_time_macros.h"
#include "gpio_signal.h"
#include "usb_mux.h"

#define KB800X_I2C_ADDR0_FLAGS 0x08
#define KB800X_I2C_ADDR1_FLAGS 0x0C

extern const struct usb_mux_driver kb800x_usb_mux_driver;

/* Set the protocol */
#define KB800X_REG_PROTOCOL 0x0001
#define KB800X_PROTOCOL_USB3 0x0
#define KB800X_PROTOCOL_DPMF 0x1
#define KB800X_PROTOCOL_DP 0x2
#define KB800X_PROTOCOL_CIO 0x3

/* Configure the lane orientaitons */
#define KB800X_REG_ORIENTATION 0x0002
#define KB800X_ORIENTATION_POLARITY 0x1
#define KB800X_ORIENTATION_DP_UFP 0x4
#define KB800X_ORIENTATION_DP_DFP 0x6
#define KB800X_ORIENTATION_CIO_LANE_SWAP 0x8
/* Select one, 0x0 for non-legacy */
#define KB800X_ORIENTATION_CIO_LEGACY_PASSIVE (0x1 << 4)
#define KB800X_ORIENTATION_CIO_LEGACY_UNIDIR (0x2 << 4)
#define KB800X_ORIENTATION_CIO_LEGACY_BIDIR (0x3 << 4)

#define KB800X_REG_RESET 0x0006
#define KB800X_RESET_FSM BIT(0)
#define KB800X_RESET_MM BIT(1)
#define KB800X_RESET_SERDES BIT(2)
#define KB800X_RESET_COM BIT(3)
#define KB800X_RESET_MASK GENMASK(3, 0)

#define KB800X_REG_XBAR_OVR 0x5040
#define KB800X_XBAR_OVR_EN BIT(6)

/* Registers to configure the elastic buffer input connection */
#define KB800X_REG_XBAR_EB1SEL 0x5044
#define KB800X_REG_XBAR_EB23SEL 0x5045
#define KB800X_REG_XBAR_EB4SEL 0x5046
#define KB800X_REG_XBAR_EB56SEL 0x5047

/* Registers to configure the elastic buffer output connection (x=0-7) */
#define KB800X_REG_TXSEL_FROM_PHY(x) (0x5048 + ((x) / 2))

enum kb800x_ss_lane { KB800X_TX0 = 0, KB800X_TX1, KB800X_RX0, KB800X_RX1 };

enum kb800x_phy_lane {
	KB800X_A0 = 0,
	KB800X_A1,
	KB800X_B0,
	KB800X_B1,
	KB800X_C0,
	KB800X_C1,
	KB800X_D0,
	KB800X_D1,
	KB800X_PHY_LANE_COUNT
};

enum kb800x_eb {
	KB800X_EB1 = 0,
	KB800X_EB2,
	KB800X_EB3,
	KB800X_EB4,
	KB800X_EB5,
	KB800X_EB6
};

#define KB800X_FLIP_SS_LANE(x) ((x) + 1 - 2 * ((x)&0x1))
#define KB800X_LANE_NUMBER_FROM_PHY(x) ((x)&0x1)
#define KB800X_PHY_IS_AB(x) ((x) <= KB800X_B1)

struct kb800x_control_t {
	enum gpio_signal retimer_rst_gpio;
	enum gpio_signal usb_ls_en_gpio;
#ifdef CONFIG_KB800X_CUSTOM_XBAR
	enum kb800x_ss_lane ss_lanes[KB800X_PHY_LANE_COUNT];
#endif /* CONFIG_KB800X_CUSTOM_XBAR */
};

/*
 * Default 'example' lane mapping. With this mapping, CONFIG_KB800X_CUSTOM_XBAR
 * can be undefined, since a custom xbar mapping is not needed.
 * ss_lanes = {
 * [KB800X_A0] = KB800X_TX0, [KB800X_A1] = KB800X_RX0,
 * [KB800X_B0] = KB800X_RX1, [KB800X_B1] = KB800X_TX1,
 * [KB800X_C0] = KB800X_RX0, [KB800X_C1] = KB800X_TX0,
 * [KB800X_D0] = KB800X_TX1, [KB800X_D1] = KB800X_RX1,}
 */

extern struct kb800x_control_t kb800x_control[];

#endif /* __CROS_EC_KB800X_H  */