GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / net / dsa / hirschmann / hellcreek_ptp.h
1 /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
2 /*
3  * DSA driver for:
4  * Hirschmann Hellcreek TSN switch.
5  *
6  * Copyright (C) 2019,2020 Hochschule Offenburg
7  * Copyright (C) 2019,2020 Linutronix GmbH
8  * Authors: Kurt Kanzenbach <kurt@linutronix.de>
9  *          Kamil Alkhouri <kamil.alkhouri@hs-offenburg.de>
10  */
11
12 #ifndef _HELLCREEK_PTP_H_
13 #define _HELLCREEK_PTP_H_
14
15 #include <linux/bitops.h>
16 #include <linux/ptp_clock_kernel.h>
17
18 #include "hellcreek.h"
19
20 /* Every jump in time is 7 ns */
21 #define MAX_NS_PER_STEP                 7L
22
23 /* Correct offset at every clock cycle */
24 #define MIN_CLK_CYCLES_BETWEEN_STEPS    0
25
26 /* Maximum available slow offset resources */
27 #define MAX_SLOW_OFFSET_ADJ                                     \
28         ((unsigned long long)((1 << 30) - 1) * MAX_NS_PER_STEP)
29
30 /* four times a second overflow check */
31 #define HELLCREEK_OVERFLOW_PERIOD       (HZ / 4)
32
33 /* PTP Register */
34 #define PR_SETTINGS_C                   (0x09 * 2)
35 #define PR_SETTINGS_C_RES3TS            BIT(4)
36 #define PR_SETTINGS_C_TS_SRC_TK_SHIFT   8
37 #define PR_SETTINGS_C_TS_SRC_TK_MASK    GENMASK(9, 8)
38 #define PR_COMMAND_C                    (0x0a * 2)
39 #define PR_COMMAND_C_SS                 BIT(0)
40
41 #define PR_CLOCK_STATUS_C               (0x0c * 2)
42 #define PR_CLOCK_STATUS_C_ENA_DRIFT     BIT(12)
43 #define PR_CLOCK_STATUS_C_OFS_ACT       BIT(13)
44 #define PR_CLOCK_STATUS_C_ENA_OFS       BIT(14)
45
46 #define PR_CLOCK_READ_C                 (0x0d * 2)
47 #define PR_CLOCK_WRITE_C                (0x0e * 2)
48 #define PR_CLOCK_OFFSET_C               (0x0f * 2)
49 #define PR_CLOCK_DRIFT_C                (0x10 * 2)
50
51 #define PR_SS_FREE_DATA_C               (0x12 * 2)
52 #define PR_SS_SYNT_DATA_C               (0x14 * 2)
53 #define PR_SS_SYNC_DATA_C               (0x16 * 2)
54 #define PR_SS_DRAC_DATA_C               (0x18 * 2)
55
56 #define STATUS_OUT                      (0x60 * 2)
57 #define STATUS_OUT_SYNC_GOOD            BIT(0)
58 #define STATUS_OUT_IS_GM                BIT(1)
59
60 int hellcreek_ptp_setup(struct hellcreek *hellcreek);
61 void hellcreek_ptp_free(struct hellcreek *hellcreek);
62 u16 hellcreek_ptp_read(struct hellcreek *hellcreek, unsigned int offset);
63 void hellcreek_ptp_write(struct hellcreek *hellcreek, u16 data,
64                          unsigned int offset);
65 u64 hellcreek_ptp_gettime_seconds(struct hellcreek *hellcreek, u64 ns);
66
67 #define ptp_to_hellcreek(ptp)                                   \
68         container_of(ptp, struct hellcreek, ptp_clock_info)
69
70 #define dw_overflow_to_hellcreek(dw)                            \
71         container_of(dw, struct hellcreek, overflow_work)
72
73 #define led_to_hellcreek(ldev, led)                             \
74         container_of(ldev, struct hellcreek, led)
75
76 #endif /* _HELLCREEK_PTP_H_ */