7
7
*/
8
8
9
9
#include <linux/platform_device.h>
10
+ #include <linux/of_address.h>
10
11
#include <linux/of_mdio.h>
11
12
#include <linux/delay.h>
12
13
#include <linux/module.h>
13
14
#include <linux/gfp.h>
14
15
#include <linux/phy.h>
15
16
#include <linux/io.h>
16
17
18
+ #ifdef CONFIG_CAVIUM_OCTEON_SOC
17
19
#include <asm/octeon/octeon.h>
18
- #include <asm/octeon/cvmx-smix-defs.h>
20
+ #endif
19
21
20
- #define DRV_VERSION "1.0 "
21
- #define DRV_DESCRIPTION "Cavium Networks Octeon SMI/MDIO driver"
22
+ #define DRV_VERSION "1.1 "
23
+ #define DRV_DESCRIPTION "Cavium Networks Octeon/ThunderX SMI/MDIO driver"
22
24
23
25
#define SMI_CMD 0x0
24
26
#define SMI_WR_DAT 0x8
25
27
#define SMI_RD_DAT 0x10
26
28
#define SMI_CLK 0x18
27
29
#define SMI_EN 0x20
28
30
31
+ #ifdef __BIG_ENDIAN_BITFIELD
32
+ #define OCT_MDIO_BITFIELD_FIELD (field , more ) \
33
+ field; \
34
+ more
35
+
36
+ #else
37
+ #define OCT_MDIO_BITFIELD_FIELD (field , more ) \
38
+ more \
39
+ field;
40
+
41
+ #endif
42
+
43
+ union cvmx_smix_clk {
44
+ u64 u64 ;
45
+ struct cvmx_smix_clk_s {
46
+ OCT_MDIO_BITFIELD_FIELD (u64 reserved_25_63 :39 ,
47
+ OCT_MDIO_BITFIELD_FIELD (u64 mode :1 ,
48
+ OCT_MDIO_BITFIELD_FIELD (u64 reserved_21_23 :3 ,
49
+ OCT_MDIO_BITFIELD_FIELD (u64 sample_hi :5 ,
50
+ OCT_MDIO_BITFIELD_FIELD (u64 sample_mode :1 ,
51
+ OCT_MDIO_BITFIELD_FIELD (u64 reserved_14_14 :1 ,
52
+ OCT_MDIO_BITFIELD_FIELD (u64 clk_idle :1 ,
53
+ OCT_MDIO_BITFIELD_FIELD (u64 preamble :1 ,
54
+ OCT_MDIO_BITFIELD_FIELD (u64 sample :4 ,
55
+ OCT_MDIO_BITFIELD_FIELD (u64 phase :8 ,
56
+ ;))))))))))
57
+ } s ;
58
+ };
59
+
60
+ union cvmx_smix_cmd {
61
+ u64 u64 ;
62
+ struct cvmx_smix_cmd_s {
63
+ OCT_MDIO_BITFIELD_FIELD (u64 reserved_18_63 :46 ,
64
+ OCT_MDIO_BITFIELD_FIELD (u64 phy_op :2 ,
65
+ OCT_MDIO_BITFIELD_FIELD (u64 reserved_13_15 :3 ,
66
+ OCT_MDIO_BITFIELD_FIELD (u64 phy_adr :5 ,
67
+ OCT_MDIO_BITFIELD_FIELD (u64 reserved_5_7 :3 ,
68
+ OCT_MDIO_BITFIELD_FIELD (u64 reg_adr :5 ,
69
+ ;))))))
70
+ } s ;
71
+ };
72
+
73
+ union cvmx_smix_en {
74
+ u64 u64 ;
75
+ struct cvmx_smix_en_s {
76
+ OCT_MDIO_BITFIELD_FIELD (u64 reserved_1_63 :63 ,
77
+ OCT_MDIO_BITFIELD_FIELD (u64 en :1 ,
78
+ ;))
79
+ } s ;
80
+ };
81
+
82
+ union cvmx_smix_rd_dat {
83
+ u64 u64 ;
84
+ struct cvmx_smix_rd_dat_s {
85
+ OCT_MDIO_BITFIELD_FIELD (u64 reserved_18_63 :46 ,
86
+ OCT_MDIO_BITFIELD_FIELD (u64 pending :1 ,
87
+ OCT_MDIO_BITFIELD_FIELD (u64 val :1 ,
88
+ OCT_MDIO_BITFIELD_FIELD (u64 dat :16 ,
89
+ ;))))
90
+ } s ;
91
+ };
92
+
93
+ union cvmx_smix_wr_dat {
94
+ u64 u64 ;
95
+ struct cvmx_smix_wr_dat_s {
96
+ OCT_MDIO_BITFIELD_FIELD (u64 reserved_18_63 :46 ,
97
+ OCT_MDIO_BITFIELD_FIELD (u64 pending :1 ,
98
+ OCT_MDIO_BITFIELD_FIELD (u64 val :1 ,
99
+ OCT_MDIO_BITFIELD_FIELD (u64 dat :16 ,
100
+ ;))))
101
+ } s ;
102
+ };
103
+
29
104
enum octeon_mdiobus_mode {
30
105
UNINIT = 0 ,
31
106
C22 ,
@@ -41,6 +116,21 @@ struct octeon_mdiobus {
41
116
int phy_irq [PHY_MAX_ADDR ];
42
117
};
43
118
119
+ #ifdef CONFIG_CAVIUM_OCTEON_SOC
120
+ static void oct_mdio_writeq (u64 val , u64 addr )
121
+ {
122
+ cvmx_write_csr (addr , val );
123
+ }
124
+
125
+ static u64 oct_mdio_readq (u64 addr )
126
+ {
127
+ return cvmx_read_csr (addr );
128
+ }
129
+ #else
130
+ #define oct_mdio_writeq (val , addr ) writeq_relaxed(val, (void *)addr)
131
+ #define oct_mdio_readq (addr ) readq_relaxed((void *)addr)
132
+ #endif
133
+
44
134
static void octeon_mdiobus_set_mode (struct octeon_mdiobus * p ,
45
135
enum octeon_mdiobus_mode m )
46
136
{
@@ -49,10 +139,10 @@ static void octeon_mdiobus_set_mode(struct octeon_mdiobus *p,
49
139
if (m == p -> mode )
50
140
return ;
51
141
52
- smi_clk .u64 = cvmx_read_csr (p -> register_base + SMI_CLK );
142
+ smi_clk .u64 = oct_mdio_readq (p -> register_base + SMI_CLK );
53
143
smi_clk .s .mode = (m == C45 ) ? 1 : 0 ;
54
144
smi_clk .s .preamble = 1 ;
55
- cvmx_write_csr ( p -> register_base + SMI_CLK , smi_clk . u64 );
145
+ oct_mdio_writeq ( smi_clk . u64 , p -> register_base + SMI_CLK );
56
146
p -> mode = m ;
57
147
}
58
148
@@ -67,22 +157,22 @@ static int octeon_mdiobus_c45_addr(struct octeon_mdiobus *p,
67
157
68
158
smi_wr .u64 = 0 ;
69
159
smi_wr .s .dat = regnum & 0xffff ;
70
- cvmx_write_csr ( p -> register_base + SMI_WR_DAT , smi_wr . u64 );
160
+ oct_mdio_writeq ( smi_wr . u64 , p -> register_base + SMI_WR_DAT );
71
161
72
162
regnum = (regnum >> 16 ) & 0x1f ;
73
163
74
164
smi_cmd .u64 = 0 ;
75
165
smi_cmd .s .phy_op = 0 ; /* MDIO_CLAUSE_45_ADDRESS */
76
166
smi_cmd .s .phy_adr = phy_id ;
77
167
smi_cmd .s .reg_adr = regnum ;
78
- cvmx_write_csr ( p -> register_base + SMI_CMD , smi_cmd . u64 );
168
+ oct_mdio_writeq ( smi_cmd . u64 , p -> register_base + SMI_CMD );
79
169
80
170
do {
81
171
/* Wait 1000 clocks so we don't saturate the RSL bus
82
172
* doing reads.
83
173
*/
84
174
__delay (1000 );
85
- smi_wr .u64 = cvmx_read_csr (p -> register_base + SMI_WR_DAT );
175
+ smi_wr .u64 = oct_mdio_readq (p -> register_base + SMI_WR_DAT );
86
176
} while (smi_wr .s .pending && -- timeout );
87
177
88
178
if (timeout <= 0 )
@@ -114,14 +204,14 @@ static int octeon_mdiobus_read(struct mii_bus *bus, int phy_id, int regnum)
114
204
smi_cmd .s .phy_op = op ;
115
205
smi_cmd .s .phy_adr = phy_id ;
116
206
smi_cmd .s .reg_adr = regnum ;
117
- cvmx_write_csr ( p -> register_base + SMI_CMD , smi_cmd . u64 );
207
+ oct_mdio_writeq ( smi_cmd . u64 , p -> register_base + SMI_CMD );
118
208
119
209
do {
120
210
/* Wait 1000 clocks so we don't saturate the RSL bus
121
211
* doing reads.
122
212
*/
123
213
__delay (1000 );
124
- smi_rd .u64 = cvmx_read_csr (p -> register_base + SMI_RD_DAT );
214
+ smi_rd .u64 = oct_mdio_readq (p -> register_base + SMI_RD_DAT );
125
215
} while (smi_rd .s .pending && -- timeout );
126
216
127
217
if (smi_rd .s .val )
@@ -153,20 +243,20 @@ static int octeon_mdiobus_write(struct mii_bus *bus, int phy_id,
153
243
154
244
smi_wr .u64 = 0 ;
155
245
smi_wr .s .dat = val ;
156
- cvmx_write_csr ( p -> register_base + SMI_WR_DAT , smi_wr . u64 );
246
+ oct_mdio_writeq ( smi_wr . u64 , p -> register_base + SMI_WR_DAT );
157
247
158
248
smi_cmd .u64 = 0 ;
159
249
smi_cmd .s .phy_op = op ;
160
250
smi_cmd .s .phy_adr = phy_id ;
161
251
smi_cmd .s .reg_adr = regnum ;
162
- cvmx_write_csr ( p -> register_base + SMI_CMD , smi_cmd . u64 );
252
+ oct_mdio_writeq ( smi_cmd . u64 , p -> register_base + SMI_CMD );
163
253
164
254
do {
165
255
/* Wait 1000 clocks so we don't saturate the RSL bus
166
256
* doing reads.
167
257
*/
168
258
__delay (1000 );
169
- smi_wr .u64 = cvmx_read_csr (p -> register_base + SMI_WR_DAT );
259
+ smi_wr .u64 = oct_mdio_readq (p -> register_base + SMI_WR_DAT );
170
260
} while (smi_wr .s .pending && -- timeout );
171
261
172
262
if (timeout <= 0 )
@@ -210,7 +300,7 @@ static int octeon_mdiobus_probe(struct platform_device *pdev)
210
300
211
301
smi_en .u64 = 0 ;
212
302
smi_en .s .en = 1 ;
213
- cvmx_write_csr ( bus -> register_base + SMI_EN , smi_en . u64 );
303
+ oct_mdio_writeq ( smi_en . u64 , bus -> register_base + SMI_EN );
214
304
215
305
bus -> mii_bus -> priv = bus ;
216
306
bus -> mii_bus -> irq = bus -> phy_irq ;
@@ -234,7 +324,7 @@ static int octeon_mdiobus_probe(struct platform_device *pdev)
234
324
mdiobus_free (bus -> mii_bus );
235
325
fail :
236
326
smi_en .u64 = 0 ;
237
- cvmx_write_csr ( bus -> register_base + SMI_EN , smi_en . u64 );
327
+ oct_mdio_writeq ( smi_en . u64 , bus -> register_base + SMI_EN );
238
328
return err ;
239
329
}
240
330
@@ -248,7 +338,7 @@ static int octeon_mdiobus_remove(struct platform_device *pdev)
248
338
mdiobus_unregister (bus -> mii_bus );
249
339
mdiobus_free (bus -> mii_bus );
250
340
smi_en .u64 = 0 ;
251
- cvmx_write_csr ( bus -> register_base + SMI_EN , smi_en . u64 );
341
+ oct_mdio_writeq ( smi_en . u64 , bus -> register_base + SMI_EN );
252
342
return 0 ;
253
343
}
254
344
0 commit comments