6
6
*/
7
7
8
8
#include <linux/acpi.h>
9
+ #include <linux/bitfield.h>
9
10
#include <linux/delay.h>
10
11
#include <linux/err.h>
11
12
#include <linux/interrupt.h>
63
64
*/
64
65
#define MLXBF_I2C_TYU_PLL_OUT_FREQ (400 * 1000 * 1000)
65
66
/* Reference clock for Bluefield - 156 MHz. */
66
- #define MLXBF_I2C_PLL_IN_FREQ (156 * 1000 * 1000)
67
+ #define MLXBF_I2C_PLL_IN_FREQ 156250000ULL
67
68
68
69
/* Constant used to determine the PLL frequency. */
69
- #define MLNXBF_I2C_COREPLL_CONST 16384
70
+ #define MLNXBF_I2C_COREPLL_CONST 16384ULL
71
+
72
+ #define MLXBF_I2C_FREQUENCY_1GHZ 1000000000ULL
70
73
71
74
/* PLL registers. */
72
- #define MLXBF_I2C_CORE_PLL_REG0 0x0
73
75
#define MLXBF_I2C_CORE_PLL_REG1 0x4
74
76
#define MLXBF_I2C_CORE_PLL_REG2 0x8
75
77
181
183
#define MLXBF_I2C_COREPLL_FREQ MLXBF_I2C_TYU_PLL_OUT_FREQ
182
184
183
185
/* Core PLL TYU configuration. */
184
- #define MLXBF_I2C_COREPLL_CORE_F_TYU_MASK GENMASK(12, 0)
185
- #define MLXBF_I2C_COREPLL_CORE_OD_TYU_MASK GENMASK(3, 0)
186
- #define MLXBF_I2C_COREPLL_CORE_R_TYU_MASK GENMASK(5, 0)
187
-
188
- #define MLXBF_I2C_COREPLL_CORE_F_TYU_SHIFT 3
189
- #define MLXBF_I2C_COREPLL_CORE_OD_TYU_SHIFT 16
190
- #define MLXBF_I2C_COREPLL_CORE_R_TYU_SHIFT 20
186
+ #define MLXBF_I2C_COREPLL_CORE_F_TYU_MASK GENMASK(15, 3)
187
+ #define MLXBF_I2C_COREPLL_CORE_OD_TYU_MASK GENMASK(19, 16)
188
+ #define MLXBF_I2C_COREPLL_CORE_R_TYU_MASK GENMASK(25, 20)
191
189
192
190
/* Core PLL YU configuration. */
193
191
#define MLXBF_I2C_COREPLL_CORE_F_YU_MASK GENMASK(25, 0)
194
192
#define MLXBF_I2C_COREPLL_CORE_OD_YU_MASK GENMASK(3, 0)
195
- #define MLXBF_I2C_COREPLL_CORE_R_YU_MASK GENMASK(5, 0 )
193
+ #define MLXBF_I2C_COREPLL_CORE_R_YU_MASK GENMASK(31, 26 )
196
194
197
- #define MLXBF_I2C_COREPLL_CORE_F_YU_SHIFT 0
198
- #define MLXBF_I2C_COREPLL_CORE_OD_YU_SHIFT 1
199
- #define MLXBF_I2C_COREPLL_CORE_R_YU_SHIFT 26
200
195
201
196
/* Core PLL frequency. */
202
197
static u64 mlxbf_i2c_corepll_frequency ;
@@ -479,8 +474,6 @@ static struct mutex mlxbf_i2c_bus_lock;
479
474
#define MLXBF_I2C_MASK_8 GENMASK(7, 0)
480
475
#define MLXBF_I2C_MASK_16 GENMASK(15, 0)
481
476
482
- #define MLXBF_I2C_FREQUENCY_1GHZ 1000000000
483
-
484
477
/*
485
478
* Function to poll a set of bits at a specific address; it checks whether
486
479
* the bits are equal to zero when eq_zero is set to 'true', and not equal
@@ -1410,24 +1403,19 @@ static int mlxbf_i2c_init_master(struct platform_device *pdev,
1410
1403
return 0 ;
1411
1404
}
1412
1405
1413
- static u64 mlxbf_calculate_freq_from_tyu (struct mlxbf_i2c_resource * corepll_res )
1406
+ static u64 mlxbf_i2c_calculate_freq_from_tyu (struct mlxbf_i2c_resource * corepll_res )
1414
1407
{
1415
- u64 core_frequency , pad_frequency ;
1408
+ u64 core_frequency ;
1416
1409
u8 core_od , core_r ;
1417
1410
u32 corepll_val ;
1418
1411
u16 core_f ;
1419
1412
1420
- pad_frequency = MLXBF_I2C_PLL_IN_FREQ ;
1421
-
1422
1413
corepll_val = readl (corepll_res -> io + MLXBF_I2C_CORE_PLL_REG1 );
1423
1414
1424
1415
/* Get Core PLL configuration bits. */
1425
- core_f = rol32 (corepll_val , MLXBF_I2C_COREPLL_CORE_F_TYU_SHIFT ) &
1426
- MLXBF_I2C_COREPLL_CORE_F_TYU_MASK ;
1427
- core_od = rol32 (corepll_val , MLXBF_I2C_COREPLL_CORE_OD_TYU_SHIFT ) &
1428
- MLXBF_I2C_COREPLL_CORE_OD_TYU_MASK ;
1429
- core_r = rol32 (corepll_val , MLXBF_I2C_COREPLL_CORE_R_TYU_SHIFT ) &
1430
- MLXBF_I2C_COREPLL_CORE_R_TYU_MASK ;
1416
+ core_f = FIELD_GET (MLXBF_I2C_COREPLL_CORE_F_TYU_MASK , corepll_val );
1417
+ core_od = FIELD_GET (MLXBF_I2C_COREPLL_CORE_OD_TYU_MASK , corepll_val );
1418
+ core_r = FIELD_GET (MLXBF_I2C_COREPLL_CORE_R_TYU_MASK , corepll_val );
1431
1419
1432
1420
/*
1433
1421
* Compute PLL output frequency as follow:
@@ -1439,31 +1427,26 @@ static u64 mlxbf_calculate_freq_from_tyu(struct mlxbf_i2c_resource *corepll_res)
1439
1427
* Where PLL_OUT_FREQ and PLL_IN_FREQ refer to CoreFrequency
1440
1428
* and PadFrequency, respectively.
1441
1429
*/
1442
- core_frequency = pad_frequency * (++ core_f );
1430
+ core_frequency = MLXBF_I2C_PLL_IN_FREQ * (++ core_f );
1443
1431
core_frequency /= (++ core_r ) * (++ core_od );
1444
1432
1445
1433
return core_frequency ;
1446
1434
}
1447
1435
1448
- static u64 mlxbf_calculate_freq_from_yu (struct mlxbf_i2c_resource * corepll_res )
1436
+ static u64 mlxbf_i2c_calculate_freq_from_yu (struct mlxbf_i2c_resource * corepll_res )
1449
1437
{
1450
1438
u32 corepll_reg1_val , corepll_reg2_val ;
1451
- u64 corepll_frequency , pad_frequency ;
1439
+ u64 corepll_frequency ;
1452
1440
u8 core_od , core_r ;
1453
1441
u32 core_f ;
1454
1442
1455
- pad_frequency = MLXBF_I2C_PLL_IN_FREQ ;
1456
-
1457
1443
corepll_reg1_val = readl (corepll_res -> io + MLXBF_I2C_CORE_PLL_REG1 );
1458
1444
corepll_reg2_val = readl (corepll_res -> io + MLXBF_I2C_CORE_PLL_REG2 );
1459
1445
1460
1446
/* Get Core PLL configuration bits */
1461
- core_f = rol32 (corepll_reg1_val , MLXBF_I2C_COREPLL_CORE_F_YU_SHIFT ) &
1462
- MLXBF_I2C_COREPLL_CORE_F_YU_MASK ;
1463
- core_r = rol32 (corepll_reg1_val , MLXBF_I2C_COREPLL_CORE_R_YU_SHIFT ) &
1464
- MLXBF_I2C_COREPLL_CORE_R_YU_MASK ;
1465
- core_od = rol32 (corepll_reg2_val , MLXBF_I2C_COREPLL_CORE_OD_YU_SHIFT ) &
1466
- MLXBF_I2C_COREPLL_CORE_OD_YU_MASK ;
1447
+ core_f = FIELD_GET (MLXBF_I2C_COREPLL_CORE_F_YU_MASK , corepll_reg1_val );
1448
+ core_r = FIELD_GET (MLXBF_I2C_COREPLL_CORE_R_YU_MASK , corepll_reg1_val );
1449
+ core_od = FIELD_GET (MLXBF_I2C_COREPLL_CORE_OD_YU_MASK , corepll_reg2_val );
1467
1450
1468
1451
/*
1469
1452
* Compute PLL output frequency as follow:
@@ -1475,7 +1458,7 @@ static u64 mlxbf_calculate_freq_from_yu(struct mlxbf_i2c_resource *corepll_res)
1475
1458
* Where PLL_OUT_FREQ and PLL_IN_FREQ refer to CoreFrequency
1476
1459
* and PadFrequency, respectively.
1477
1460
*/
1478
- corepll_frequency = (pad_frequency * core_f ) / MLNXBF_I2C_COREPLL_CONST ;
1461
+ corepll_frequency = (MLXBF_I2C_PLL_IN_FREQ * core_f ) / MLNXBF_I2C_COREPLL_CONST ;
1479
1462
corepll_frequency /= (++ core_r ) * (++ core_od );
1480
1463
1481
1464
return corepll_frequency ;
@@ -2183,14 +2166,14 @@ static struct mlxbf_i2c_chip_info mlxbf_i2c_chip[] = {
2183
2166
[1 ] = & mlxbf_i2c_corepll_res [MLXBF_I2C_CHIP_TYPE_1 ],
2184
2167
[2 ] = & mlxbf_i2c_gpio_res [MLXBF_I2C_CHIP_TYPE_1 ]
2185
2168
},
2186
- .calculate_freq = mlxbf_calculate_freq_from_tyu
2169
+ .calculate_freq = mlxbf_i2c_calculate_freq_from_tyu
2187
2170
},
2188
2171
[MLXBF_I2C_CHIP_TYPE_2 ] = {
2189
2172
.type = MLXBF_I2C_CHIP_TYPE_2 ,
2190
2173
.shared_res = {
2191
2174
[0 ] = & mlxbf_i2c_corepll_res [MLXBF_I2C_CHIP_TYPE_2 ]
2192
2175
},
2193
- .calculate_freq = mlxbf_calculate_freq_from_yu
2176
+ .calculate_freq = mlxbf_i2c_calculate_freq_from_yu
2194
2177
}
2195
2178
};
2196
2179
0 commit comments