File tree Expand file tree Collapse file tree 1 file changed +19
-3
lines changed Expand file tree Collapse file tree 1 file changed +19
-3
lines changed Original file line number Diff line number Diff line change @@ -70,17 +70,33 @@ struct i2c_sam_twi_dev_data {
70
70
struct twi_msg msg ;
71
71
};
72
72
73
- static int i2c_clk_set (Twi * const twi , uint32_t speed )
73
+ static int i2c_clk_set (const struct device * dev , Twi * const twi , uint32_t speed )
74
74
{
75
75
uint32_t ck_div = 0U ;
76
76
uint32_t cl_div ;
77
77
bool div_completed = false;
78
78
79
+ #ifdef SOC_ATMEL_SAM_MCK_FREQ_HZ
80
+ ARG_UNUSED (dev );
81
+
82
+ const uint32_t rate = SOC_ATMEL_SAM_MCK_FREQ_HZ ;
83
+ #else
84
+ const struct i2c_sam_twi_dev_cfg * const config = dev -> config ;
85
+ uint32_t rate ;
86
+ int ret ;
87
+
88
+ ret = clock_control_get_rate (SAM_DT_PMC_CONTROLLER ,
89
+ (clock_control_subsys_t )& config -> clock_cfg , & rate );
90
+ if (ret ) {
91
+ return ret ;
92
+ }
93
+ #endif
94
+
79
95
/* From the datasheet "TWI Clock Waveform Generator Register"
80
96
* T_low = ( ( CLDIV × 2^CKDIV ) + 4 ) × T_MCK
81
97
*/
82
98
while (!div_completed ) {
83
- cl_div = ((SOC_ATMEL_SAM_MCK_FREQ_HZ / (speed * 2U )) - 4 )
99
+ cl_div = ((rate / (speed * 2U )) - 4 )
84
100
/ (1 << ck_div );
85
101
86
102
if (cl_div <= 255U ) {
@@ -137,7 +153,7 @@ static int i2c_sam_twi_configure(const struct device *dev, uint32_t config)
137
153
k_sem_take (& dev_data -> lock , K_FOREVER );
138
154
139
155
/* Setup clock waveform */
140
- ret = i2c_clk_set (twi , bitrate );
156
+ ret = i2c_clk_set (dev , twi , bitrate );
141
157
if (ret < 0 ) {
142
158
goto unlock ;
143
159
}
You can’t perform that action at this time.
0 commit comments