Skip to content

Commit 42a017c

Browse files
TonyHan11dkalowsk
authored andcommitted
drivers: i2c: sam: update i2c_clock_set() for sama7g5 FLEXCOM TWI
The TWI offered by sama7g5 FLEXCOM is compatible with "atmel,sam-i2c-twi". Signed-off-by: Tony Han <tony.han@microchip.com>
1 parent 5fa0898 commit 42a017c

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

drivers/i2c/i2c_sam_twi.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,33 @@ struct i2c_sam_twi_dev_data {
7070
struct twi_msg msg;
7171
};
7272

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)
7474
{
7575
uint32_t ck_div = 0U;
7676
uint32_t cl_div;
7777
bool div_completed = false;
7878

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+
7995
/* From the datasheet "TWI Clock Waveform Generator Register"
8096
* T_low = ( ( CLDIV × 2^CKDIV ) + 4 ) × T_MCK
8197
*/
8298
while (!div_completed) {
83-
cl_div = ((SOC_ATMEL_SAM_MCK_FREQ_HZ / (speed * 2U)) - 4)
99+
cl_div = ((rate / (speed * 2U)) - 4)
84100
/ (1 << ck_div);
85101

86102
if (cl_div <= 255U) {
@@ -137,7 +153,7 @@ static int i2c_sam_twi_configure(const struct device *dev, uint32_t config)
137153
k_sem_take(&dev_data->lock, K_FOREVER);
138154

139155
/* Setup clock waveform */
140-
ret = i2c_clk_set(twi, bitrate);
156+
ret = i2c_clk_set(dev, twi, bitrate);
141157
if (ret < 0) {
142158
goto unlock;
143159
}

0 commit comments

Comments
 (0)