ITE: drivers/i2c: create pinmux phandle to the I2C driver node

Create the pinmux phandle to the I2C driver node in the
devicetree. When the pinmux_pin_set function in
i2c_it8xxx2_init can refer to the setting of this phandle.
It is more flexible to use.

Signed-off-by: Tim Lin <tim2.lin@ite.corp-partner.google.com>
This commit is contained in:
Tim Lin 2021-06-24 18:29:53 +08:00 committed by Christopher Friedt
commit 8fdcc11d6b
4 changed files with 94 additions and 0 deletions

View file

@ -7,6 +7,7 @@
#define DT_DRV_COMPAT ite_it8xxx2_i2c
#include <drivers/i2c.h>
#include <drivers/pinmux.h>
#include <errno.h>
#include <logging/log.h>
LOG_MODULE_REGISTER(i2c_ite_it8xxx2);
@ -19,6 +20,19 @@
#define DEV_DATA(dev) \
((struct i2c_it8xxx2_data * const)(dev)->data)
#define DEV_CLK_PINMUX(idx) DEVICE_DT_GET(DT_PHANDLE \
(DT_NODELABEL(pinctrl_i2c_clk##idx), pinctrls))
#define DEV_DATA_PINMUX(idx) DEVICE_DT_GET(DT_PHANDLE \
(DT_NODELABEL(pinctrl_i2c_data##idx), pinctrls))
#define DEV_CLK_PIN(idx) DT_PHA(DT_PHANDLE_BY_IDX \
(DT_DRV_INST(idx), pinctrl_0, 0), pinctrls, pin)
#define DEV_DATA_PIN(idx) DT_PHA(DT_PHANDLE_BY_IDX \
(DT_DRV_INST(idx), pinctrl_1, 0), pinctrls, pin)
#define DEV_CLK_ALT_FUNC(idx) DT_PHA(DT_PHANDLE_BY_IDX \
(DT_DRV_INST(idx), pinctrl_0, 0), pinctrls, alt_func)
#define DEV_DATA_ALT_FUNC(idx) DT_PHA(DT_PHANDLE_BY_IDX \
(DT_DRV_INST(idx), pinctrl_1, 0), pinctrls, alt_func)
#define I2C_STANDARD_PORT_COUNT 3
/* Default PLL frequency. */
#define PLL_CLOCK 48000000
@ -29,6 +43,15 @@ struct i2c_it8xxx2_config {
uint8_t *base;
uint8_t i2c_irq_base;
uint8_t port;
/* Pinmux control group */
const struct device *clk_pinctrls;
const struct device *data_pinctrls;
/* GPIO pin */
uint8_t clk_pin;
uint8_t data_pin;
/* Alternate function */
uint8_t clk_alt_fun;
uint8_t data_alt_fun;
};
enum i2c_ch_status {
@ -905,6 +928,11 @@ static int i2c_it8xxx2_init(const struct device *dev)
return error;
}
/* The pin is set to I2C alternate function of clock */
pinmux_pin_set(config->clk_pinctrls, config->clk_pin, config->clk_alt_fun);
/* The pin is set to I2C alternate function of data */
pinmux_pin_set(config->data_pinctrls, config->data_pin, config->data_alt_fun);
return 0;
}
@ -922,6 +950,12 @@ static const struct i2c_driver_api i2c_it8xxx2_driver_api = {
.bitrate = DT_INST_PROP(idx, clock_frequency), \
.i2c_irq_base = DT_INST_IRQN(idx), \
.port = DT_INST_PROP(idx, port_num), \
.clk_pinctrls = DEV_CLK_PINMUX(idx), \
.data_pinctrls = DEV_DATA_PINMUX(idx), \
.clk_pin = DEV_CLK_PIN(idx), \
.data_pin = DEV_DATA_PIN(idx), \
.clk_alt_fun = DEV_CLK_ALT_FUNC(idx), \
.data_alt_fun = DEV_DATA_ALT_FUNC(idx) \
}; \
\
static struct i2c_it8xxx2_data i2c_it8xxx2_data_##idx; \

View file

@ -21,3 +21,13 @@ properties:
type: int
required: true
description: Ordinal identifying the port
pinctrl-0:
type: phandle
required: true
description: Configuration of I2C clock pinmux controller
pinctrl-1:
type: phandle
required: true
description: Configuration of I2C data pinmux controller

View file

@ -61,5 +61,43 @@
pinctrl_pwm7: pwm7 {
pinctrls = <&pinmuxa 7 IT8XXX2_PINMUX_FUNC_1>;
};
/* I2C alternate function */
pinctrl_i2c_clk0: i2c_clk0 {
pinctrls = <&pinmuxb 3 IT8XXX2_PINMUX_FUNC_1>;
};
pinctrl_i2c_data0: i2c_data0 {
pinctrls = <&pinmuxb 4 IT8XXX2_PINMUX_FUNC_1>;
};
pinctrl_i2c_clk1: i2c_clk1 {
pinctrls = <&pinmuxc 1 IT8XXX2_PINMUX_FUNC_1>;
};
pinctrl_i2c_data1: i2c_data1 {
pinctrls = <&pinmuxc 2 IT8XXX2_PINMUX_FUNC_1>;
};
pinctrl_i2c_clk2: i2c_clk2 {
pinctrls = <&pinmuxf 6 IT8XXX2_PINMUX_FUNC_1>;
};
pinctrl_i2c_data2: i2c_data2 {
pinctrls = <&pinmuxf 7 IT8XXX2_PINMUX_FUNC_1>;
};
pinctrl_i2c_clk3: i2c_clk3 {
pinctrls = <&pinmuxh 1 IT8XXX2_PINMUX_FUNC_3>;
};
pinctrl_i2c_data3: i2c_data3 {
pinctrls = <&pinmuxh 2 IT8XXX2_PINMUX_FUNC_3>;
};
pinctrl_i2c_clk4: i2c_clk4 {
pinctrls = <&pinmuxe 0 IT8XXX2_PINMUX_FUNC_3>;
};
pinctrl_i2c_data4: i2c_data4 {
pinctrls = <&pinmuxe 7 IT8XXX2_PINMUX_FUNC_3>;
};
pinctrl_i2c_clk5: i2c_clk5 {
pinctrls = <&pinmuxa 4 IT8XXX2_PINMUX_FUNC_3>;
};
pinctrl_i2c_data5: i2c_data5 {
pinctrls = <&pinmuxa 5 IT8XXX2_PINMUX_FUNC_3>;
};
};
};

View file

@ -603,6 +603,8 @@
status = "disabled";
label = "I2C_0";
port-num = <0>;
pinctrl-0 = <&pinctrl_i2c_clk0>; /* GPB3 */
pinctrl-1 = <&pinctrl_i2c_data0>; /* GPB4 */
};
i2c1: i2c@f01c80 {
compatible = "ite,it8xxx2-i2c";
@ -614,6 +616,8 @@
status = "disabled";
label = "I2C_1";
port-num = <1>;
pinctrl-0 = <&pinctrl_i2c_clk1>; /* GPC1 */
pinctrl-1 = <&pinctrl_i2c_data1>; /* GPC2 */
};
i2c2: i2c@f01cc0 {
compatible = "ite,it8xxx2-i2c";
@ -625,6 +629,8 @@
status = "disabled";
label = "I2C_2";
port-num = <2>;
pinctrl-0 = <&pinctrl_i2c_clk2>; /* GPF6 */
pinctrl-1 = <&pinctrl_i2c_data2>; /* GPF7 */
};
i2c3: i2c@f03680 {
compatible = "ite,it8xxx2-i2c";
@ -636,6 +642,8 @@
status = "disabled";
label = "I2C_3";
port-num = <3>;
pinctrl-0 = <&pinctrl_i2c_clk3>; /* GPH1 */
pinctrl-1 = <&pinctrl_i2c_data3>; /* GPH2 */
};
i2c4: i2c@f03500 {
compatible = "ite,it8xxx2-i2c";
@ -647,6 +655,8 @@
status = "disabled";
label = "I2C_4";
port-num = <4>;
pinctrl-0 = <&pinctrl_i2c_clk4>; /* GPE0 */
pinctrl-1 = <&pinctrl_i2c_data4>; /* GPE7 */
};
i2c5: i2c@f03580 {
compatible = "ite,it8xxx2-i2c";
@ -658,6 +668,8 @@
status = "disabled";
label = "I2C_5";
port-num = <5>;
pinctrl-0 = <&pinctrl_i2c_clk5>; /* GPA4 */
pinctrl-1 = <&pinctrl_i2c_data5>; /* GPA5 */
};
ecpm: clock-controller@f01e00 {