Skip to content

Commit bd73c73

Browse files
bjarki-andreasendanieldegrasse
authored andcommitted
drivers: i2c: nrfx_twim: impl device deinit
Implement device deinit for the nRF TWIM device drivers. Signed-off-by: Bjarki Arge Andreasen <[email protected]>
1 parent c251bee commit bd73c73

File tree

4 files changed

+63
-10
lines changed

4 files changed

+63
-10
lines changed

drivers/i2c/i2c_nrfx_twim.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,11 @@ static int i2c_nrfx_twim_init(const struct device *dev)
224224
return i2c_nrfx_twim_common_init(dev);
225225
}
226226

227+
static int i2c_nrfx_twim_deinit(const struct device *dev)
228+
{
229+
return i2c_nrfx_twim_common_deinit(dev);
230+
}
231+
227232
static DEVICE_API(i2c, i2c_nrfx_twim_driver_api) = {
228233
.configure = i2c_nrfx_twim_configure,
229234
.transfer = i2c_nrfx_twim_transfer,
@@ -280,8 +285,9 @@ static DEVICE_API(i2c, i2c_nrfx_twim_driver_api) = {
280285
}; \
281286
PM_DEVICE_DT_DEFINE(I2C(idx), twim_nrfx_pm_action, \
282287
PM_DEVICE_ISR_SAFE); \
283-
I2C_DEVICE_DT_DEFINE(I2C(idx), \
288+
I2C_DEVICE_DT_DEINIT_DEFINE(I2C(idx), \
284289
i2c_nrfx_twim_init, \
290+
i2c_nrfx_twim_deinit, \
285291
PM_DEVICE_DT_GET(I2C(idx)), \
286292
&twim_##idx##_data, \
287293
&twim_##idx##z_config, \

drivers/i2c/i2c_nrfx_twim_common.c

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,18 +102,30 @@ int i2c_nrfx_twim_msg_transfer(const struct device *dev, uint8_t flags, uint8_t
102102
return ret;
103103
}
104104

105-
int twim_nrfx_pm_action(const struct device *dev, enum pm_device_action action)
105+
void twim_nrfx_pm_resume(const struct device *dev)
106106
{
107107
const struct i2c_nrfx_twim_common_config *config = dev->config;
108108

109+
(void)pinctrl_apply_state(config->pcfg, PINCTRL_STATE_DEFAULT);
110+
nrfx_twim_enable(&config->twim);
111+
}
112+
113+
void twim_nrfx_pm_suspend(const struct device *dev)
114+
{
115+
const struct i2c_nrfx_twim_common_config *config = dev->config;
116+
117+
nrfx_twim_disable(&config->twim);
118+
(void)pinctrl_apply_state(config->pcfg, PINCTRL_STATE_SLEEP);
119+
}
120+
121+
int twim_nrfx_pm_action(const struct device *dev, enum pm_device_action action)
122+
{
109123
switch (action) {
110124
case PM_DEVICE_ACTION_RESUME:
111-
(void)pinctrl_apply_state(config->pcfg, PINCTRL_STATE_DEFAULT);
112-
nrfx_twim_enable(&config->twim);
125+
twim_nrfx_pm_resume(dev);
113126
break;
114127
case PM_DEVICE_ACTION_SUSPEND:
115-
nrfx_twim_disable(&config->twim);
116-
(void)pinctrl_apply_state(config->pcfg, PINCTRL_STATE_SLEEP);
128+
twim_nrfx_pm_suspend(dev);
117129
break;
118130
default:
119131
return -ENOTSUP;
@@ -138,3 +150,31 @@ int i2c_nrfx_twim_common_init(const struct device *dev)
138150

139151
return pm_device_driver_init(dev, twim_nrfx_pm_action);
140152
}
153+
154+
int i2c_nrfx_twim_common_deinit(const struct device *dev)
155+
{
156+
const struct i2c_nrfx_twim_common_config *config = dev->config;
157+
#if CONFIG_PM_DEVICE
158+
enum pm_device_state state;
159+
#endif
160+
161+
#if CONFIG_PM_DEVICE
162+
/*
163+
* PM must have suspended the device before driver can
164+
* be deinitialized
165+
*/
166+
(void)pm_device_state_get(dev, &state);
167+
if (state != PM_DEVICE_STATE_SUSPENDED &&
168+
state != PM_DEVICE_STATE_OFF) {
169+
LOG_ERR("device active");
170+
return -EBUSY;
171+
}
172+
#else
173+
/* Suspend device */
174+
twim_nrfx_pm_suspend(dev);
175+
#endif
176+
177+
/* Uninit device hardware */
178+
nrfx_twim_uninit(&config->twim);
179+
return 0;
180+
}

drivers/i2c/i2c_nrfx_twim_common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ struct i2c_nrfx_twim_common_config {
4343
};
4444

4545
int i2c_nrfx_twim_common_init(const struct device *dev);
46+
int i2c_nrfx_twim_common_deinit(const struct device *dev);
4647
int i2c_nrfx_twim_configure(const struct device *dev, uint32_t i2c_config);
4748
int i2c_nrfx_twim_recover_bus(const struct device *dev);
4849
int i2c_nrfx_twim_msg_transfer(const struct device *dev, uint8_t flags, uint8_t *buf,

drivers/i2c/i2c_nrfx_twim_rtio.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,14 +203,19 @@ static DEVICE_API(i2c, i2c_nrfx_twim_driver_api) = {
203203
.iodev_submit = i2c_nrfx_twim_rtio_submit,
204204
};
205205

206-
int i2c_nrfx_twim_rtio_init(const struct device *dev)
206+
static int i2c_nrfx_twim_rtio_init(const struct device *dev)
207207
{
208208
const struct i2c_nrfx_twim_rtio_config *config = dev->config;
209209

210210
i2c_rtio_init(config->ctx, dev);
211211
return i2c_nrfx_twim_common_init(dev);
212212
}
213213

214+
static int i2c_nrfx_twim_rtio_deinit(const struct device *dev)
215+
{
216+
return i2c_nrfx_twim_common_deinit(dev);
217+
}
218+
214219
#define CONCAT_BUF_SIZE(idx) \
215220
COND_CODE_1(DT_NODE_HAS_PROP(I2C(idx), zephyr_concat_buf_size), \
216221
(DT_PROP(I2C(idx), zephyr_concat_buf_size)), (0))
@@ -282,9 +287,10 @@ int i2c_nrfx_twim_rtio_init(const struct device *dev)
282287
.ctx = &_i2c##idx##_twim_rtio, \
283288
}; \
284289
PM_DEVICE_DT_DEFINE(I2C(idx), twim_nrfx_pm_action, PM_DEVICE_ISR_SAFE); \
285-
I2C_DEVICE_DT_DEFINE(I2C(idx), i2c_nrfx_twim_rtio_init, PM_DEVICE_DT_GET(I2C(idx)), \
286-
&twim_##idx##z_data, &twim_##idx##z_config, POST_KERNEL, \
287-
CONFIG_I2C_INIT_PRIORITY, &i2c_nrfx_twim_driver_api);
290+
I2C_DEVICE_DT_DEINIT_DEFINE(I2C(idx), i2c_nrfx_twim_rtio_init, i2c_nrfx_twim_rtio_deinit, \
291+
PM_DEVICE_DT_GET(I2C(idx)), &twim_##idx##z_data, \
292+
&twim_##idx##z_config, POST_KERNEL, CONFIG_I2C_INIT_PRIORITY, \
293+
&i2c_nrfx_twim_driver_api);
288294

289295
#ifdef CONFIG_HAS_HW_NRF_TWIM0
290296
I2C_NRFX_TWIM_RTIO_DEVICE(0);

0 commit comments

Comments
 (0)