Skip to content

Commit 069280c

Browse files
danieldegrassedleach02
authored andcommitted
drivers: i2c: i2c_lpc11u6x: enable pin control
Enable pin control for lpc11u6x i2c driver, and remove pinmux usage from board level DTS files. Signed-off-by: Daniel DeGrasse <[email protected]>
1 parent 8e07e21 commit 069280c

File tree

5 files changed

+26
-69
lines changed

5 files changed

+26
-69
lines changed

boards/arm/faze/faze.dts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,6 @@
6060
};
6161

6262
&i2c0 {
63-
pinmuxs = <&pinmux0 4 IOCON_FUNC1>,
64-
<&pinmux0 5 IOCON_FUNC1>;
65-
pinmux-names = "SCL", "SDA";
6663
pinctrl-0 = <&i2c0_default>;
6764
pinctrl-1 = <&i2c0_fast>;
6865
pinctrl-names = "default", "fast-plus";
@@ -76,9 +73,6 @@
7673
};
7774

7875
&i2c1 {
79-
pinmuxs = <&pinmux0 7 (IOCON_FUNC3| IOCON_OPENDRAIN_EN)>,
80-
<&pinmux1 24 (IOCON_FUNC2 | IOCON_OPENDRAIN_EN)>;
81-
pinmux-names = "SCL", "SDA";
8276
pinctrl-0 = <&i2c1_default>;
8377
pinctrl-1 = <&i2c1_fast>;
8478
pinctrl-names = "default", "fast-plus";

boards/arm/lpcxpresso11u68/lpcxpresso11u68.dts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,9 @@ arduino_serial: &uart4 {
107107
};
108108

109109
arduino_i2c: &i2c0 {
110-
pinmuxs = <&pinmux0 4 IOCON_FUNC1>,
111-
<&pinmux0 5 IOCON_FUNC1>;
112110
pinctrl-0 = <&i2c0_default>;
113111
pinctrl-1 = <&i2c0_fast>;
114112
pinctrl-names = "default", "fast-plus";
115-
pinmux-names = "SCL", "SDA";
116113
status = "okay";
117114
};
118115

drivers/i2c/i2c_lpc11u6x.c

Lines changed: 18 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88

99
#include <zephyr/kernel.h>
1010
#include <zephyr/drivers/i2c.h>
11-
#include <zephyr/drivers/pinmux.h>
1211
#include <zephyr/drivers/clock_control.h>
13-
#include <zephyr/dt-bindings/pinctrl/lpc11u6x-pinctrl.h>
1412
#include "i2c_lpc11u6x.h"
1513

1614
#define DEV_BASE(dev) (((struct lpc11u6x_i2c_config *)(dev->config))->base)
@@ -34,8 +32,10 @@ static int lpc11u6x_i2c_configure(const struct device *dev,
3432
{
3533
const struct lpc11u6x_i2c_config *cfg = dev->config;
3634
struct lpc11u6x_i2c_data *data = dev->data;
37-
const struct device *clk_dev, *pinmux_dev;
38-
uint32_t speed, flags = 0;
35+
const struct device *clk_dev;
36+
uint32_t speed;
37+
int ret;
38+
uint8_t mux_selection = PINCTRL_STATE_DEFAULT;
3939

4040
switch (I2C_SPEED_GET(dev_config)) {
4141
case I2C_SPEED_STANDARD:
@@ -45,7 +45,7 @@ static int lpc11u6x_i2c_configure(const struct device *dev,
4545
speed = 400000;
4646
break;
4747
case I2C_SPEED_FAST_PLUS:
48-
flags |= IOCON_FASTI2C_EN;
48+
mux_selection = PINCTRL_STATE_FAST_PLUS;
4949
speed = 1000000;
5050
break;
5151
case I2C_SPEED_HIGH:
@@ -67,28 +67,13 @@ static int lpc11u6x_i2c_configure(const struct device *dev,
6767
k_mutex_lock(&data->mutex, K_FOREVER);
6868
lpc11u6x_i2c_set_bus_speed(cfg, clk_dev, speed);
6969

70-
if (!flags) {
71-
goto exit;
72-
}
73-
74-
pinmux_dev = device_get_binding(cfg->scl_pinmux_drv);
75-
if (!pinmux_dev) {
76-
goto err;
70+
ret = pinctrl_apply_state(cfg->pincfg, mux_selection);
71+
if (ret) {
72+
k_mutex_unlock(&data->mutex);
73+
return ret;
7774
}
78-
pinmux_pin_set(pinmux_dev, cfg->scl_pin, cfg->scl_flags | flags);
79-
80-
pinmux_dev = device_get_binding(cfg->sda_pinmux_drv);
81-
if (!pinmux_dev) {
82-
goto err;
83-
}
84-
pinmux_pin_set(pinmux_dev, cfg->sda_pin, cfg->sda_flags | flags);
85-
86-
exit:
8775
k_mutex_unlock(&data->mutex);
8876
return 0;
89-
err:
90-
k_mutex_unlock(&data->mutex);
91-
return -EINVAL;
9277
}
9378

9479
static int lpc11u6x_i2c_transfer(const struct device *dev,
@@ -328,20 +313,13 @@ static int lpc11u6x_i2c_init(const struct device *dev)
328313
{
329314
const struct lpc11u6x_i2c_config *cfg = dev->config;
330315
struct lpc11u6x_i2c_data *data = dev->data;
331-
const struct device *pinmux_dev, *clk_dev;
332-
333-
/* Configure SCL and SDA pins */
334-
pinmux_dev = device_get_binding(cfg->scl_pinmux_drv);
335-
if (!pinmux_dev) {
336-
return -EINVAL;
337-
}
338-
pinmux_pin_set(pinmux_dev, cfg->scl_pin, cfg->scl_flags);
316+
const struct device *clk_dev;
317+
int err;
339318

340-
pinmux_dev = device_get_binding(cfg->sda_pinmux_drv);
341-
if (!pinmux_dev) {
342-
return -EINVAL;
319+
err = pinctrl_apply_state(cfg->pincfg, PINCTRL_STATE_DEFAULT);
320+
if (err) {
321+
return err;
343322
}
344-
pinmux_pin_set(pinmux_dev, cfg->sda_pin, cfg->sda_flags);
345323

346324
/* Configure clock and de-assert reset for I2Cx */
347325
clk_dev = device_get_binding(cfg->clock_drv);
@@ -377,23 +355,16 @@ static const struct i2c_driver_api i2c_api = {
377355

378356
#define LPC11U6X_I2C_INIT(idx) \
379357
\
380-
static void lpc11u6x_i2c_isr_config_##idx(const struct device *dev); \
358+
static void lpc11u6x_i2c_isr_config_##idx(const struct device *dev); \
359+
\
360+
PINCTRL_DT_INST_DEFINE(idx); \
381361
\
382362
static const struct lpc11u6x_i2c_config i2c_cfg_##idx = { \
383363
.base = \
384364
(struct lpc11u6x_i2c_regs *) DT_INST_REG_ADDR(idx), \
385365
.clock_drv = DT_LABEL(DT_INST_PHANDLE(idx, clocks)), \
386-
.scl_pinmux_drv = \
387-
DT_LABEL(DT_INST_PHANDLE_BY_NAME(idx, pinmuxs, scl)), \
388-
.sda_pinmux_drv = \
389-
DT_LABEL(DT_INST_PHANDLE_BY_NAME(idx, pinmuxs, sda)), \
390366
.irq_config_func = lpc11u6x_i2c_isr_config_##idx, \
391-
.scl_flags = \
392-
DT_INST_PHA_BY_NAME(idx, pinmuxs, scl, function), \
393-
.sda_flags = \
394-
DT_INST_PHA_BY_NAME(idx, pinmuxs, sda, function), \
395-
.scl_pin = DT_INST_PHA_BY_NAME(idx, pinmuxs, scl, pin), \
396-
.sda_pin = DT_INST_PHA_BY_NAME(idx, pinmuxs, sda, pin), \
367+
.pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(idx), \
397368
.clkid = DT_INST_PHA_BY_IDX(idx, clocks, 0, clkid), \
398369
}; \
399370
\

drivers/i2c/i2c_lpc11u6x.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
#ifndef ZEPHYR_DRIVERS_I2C_I2C_LPC11U6X_H_
88
#define ZEPHYR_DRIVERS_I2C_I2C_LPC11U6X_H_
99

10+
#include <zephyr/drivers/pinctrl.h>
11+
12+
#define PINCTRL_STATE_FAST_PLUS PINCTRL_STATE_PRIV_START
13+
1014
#define LPC11U6X_I2C_CONTROL_AA (1 << 2)
1115
#define LPC11U6X_I2C_CONTROL_SI (1 << 3)
1216
#define LPC11U6X_I2C_CONTROL_STOP (1 << 4)
@@ -66,14 +70,9 @@ struct lpc11u6x_i2c_regs {
6670
struct lpc11u6x_i2c_config {
6771
struct lpc11u6x_i2c_regs *base;
6872
char *clock_drv;
69-
char *scl_pinmux_drv;
70-
char *sda_pinmux_drv;
7173
void (*irq_config_func)(const struct device *dev);
7274
uint32_t clkid;
73-
uint32_t scl_flags;
74-
uint32_t sda_flags;
75-
uint8_t scl_pin;
76-
uint8_t sda_pin;
75+
const struct pinctrl_dev_config *pincfg;
7776
};
7877

7978
struct lpc11u6x_i2c_current_transfer {

dts/bindings/i2c/nxp,lpc11u6x-i2c.yaml

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ description: LPC11U6X I2C Controller
55

66
compatible: "nxp,lpc11u6x-i2c"
77

8-
include: i2c-controller.yaml
8+
include: [i2c-controller.yaml, pinctrl-device.yaml]
99

1010
properties:
1111
reg:
@@ -17,12 +17,8 @@ properties:
1717
clocks:
1818
required: true
1919

20-
pinmuxs:
21-
type: phandle-array
20+
pinctrl-0:
2221
required: true
23-
description: SDA and SCL pins
2422

25-
pinmux-names:
26-
type: string-array
23+
pinctrl-names:
2724
required: true
28-
description: Pin names for SDA and SCL

0 commit comments

Comments
 (0)