Browse Source

drivers: gpio: max22190: add max22199 extended support

The MAX22199 is an IEC 61131-2 compliant industrial digital input device.
The MAX22199 translates eight 24V current-sinking industrial inputs to a
serialized SPI-compatible output that interfaces with 3V to 5.5V logic. It
can operate as eight Type 1/Type 3 digital inputs or four Type 2 digital
inputs. The device provides diagnostic functions, including thermal
shutdown, 24V under voltage alarm, 24V missing voltage alarm, and SPI and
CRC communication error detection.

Signed-off-by: Robert Budai <robert.budai@analog.com>
pull/87723/head
Robert Budai 5 months ago committed by Benjamin Cabé
parent
commit
d7e363e358
  1. 2
      drivers/gpio/CMakeLists.txt
  2. 2
      drivers/gpio/Kconfig
  3. 10
      drivers/gpio/Kconfig.max2219x
  4. 125
      drivers/gpio/gpio_max2219x.c
  5. 58
      dts/bindings/gpio/adi,max22190-gpio.yaml
  6. 47
      dts/bindings/gpio/adi,max22199-gpio.yaml
  7. 76
      dts/bindings/gpio/adi,max2219x-base-gpio.yaml
  8. 24
      tests/drivers/build_all/gpio/app.overlay

2
drivers/gpio/CMakeLists.txt

@ -47,7 +47,7 @@ zephyr_library_sources_ifdef(CONFIG_GPIO_MAX14906 gpio_max14906.c) @@ -47,7 +47,7 @@ zephyr_library_sources_ifdef(CONFIG_GPIO_MAX14906 gpio_max14906.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_MAX14916 gpio_max14916.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_MAX14917 gpio_max14917.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_MAX22017 gpio_max22017.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_MAX22190 gpio_max22190.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_MAX2219X gpio_max2219x.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_MAX32 gpio_max32.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_MCHP_MEC5 gpio_mchp_mec5.c)
zephyr_library_sources_ifdef(CONFIG_GPIO_MCHP_MSS gpio_mchp_mss.c)

2
drivers/gpio/Kconfig

@ -137,7 +137,7 @@ source "drivers/gpio/Kconfig.max14906" @@ -137,7 +137,7 @@ source "drivers/gpio/Kconfig.max14906"
source "drivers/gpio/Kconfig.max14916"
source "drivers/gpio/Kconfig.max14917"
source "drivers/gpio/Kconfig.max22017"
source "drivers/gpio/Kconfig.max22190"
source "drivers/gpio/Kconfig.max2219x"
source "drivers/gpio/Kconfig.max32"
source "drivers/gpio/Kconfig.mchp_mss"
source "drivers/gpio/Kconfig.mcp23xxx"

10
drivers/gpio/Kconfig.max22190 → drivers/gpio/Kconfig.max2219x

@ -4,18 +4,18 @@ @@ -4,18 +4,18 @@
# MAX22190 GPIO configuration options
menuconfig GPIO_MAX22190
bool "MAX22190 GPIO driver"
menuconfig GPIO_MAX2219X
bool "MAX2219X GPIO driver"
default y
depends on SPI
depends on DT_HAS_ADI_MAX22190_GPIO_ENABLED
depends on DT_HAS_ADI_MAX22190_GPIO_ENABLED || DT_HAS_ADI_MAX22199_GPIO_ENABLED
help
Enabe MAX22190 Octal industrial digital
Enabe MAX2219X Octal industrial digital
input with diagnostics
config GPIO_MAX22190_INIT_PRIORITY
int "Driver init priority"
default 99
depends on GPIO_MAX22190
depends on GPIO_MAX2219X
help
Device driver initialization priority.

125
drivers/gpio/gpio_max22190.c → drivers/gpio/gpio_max2219x.c

@ -5,8 +5,6 @@ @@ -5,8 +5,6 @@
* SPDX-License-Identifier: Apache-2.0
*/
#define DT_DRV_COMPAT adi_max22190_gpio
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/kernel.h>
@ -19,10 +17,6 @@ LOG_MODULE_REGISTER(gpio_max22190); @@ -19,10 +17,6 @@ LOG_MODULE_REGISTER(gpio_max22190);
#include <zephyr/drivers/gpio/gpio_utils.h>
#if DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) == 0
#warning "GPIO MAX22190 driver enabled without any devices"
#endif
#define MAX22190_ENABLE 1
#define MAX22190_DISABLE 0
@ -72,6 +66,11 @@ LOG_MODULE_REGISTER(gpio_max22190); @@ -72,6 +66,11 @@ LOG_MODULE_REGISTER(gpio_max22190);
max22190_reg_update(dev, MAX22190_FAULT1_REG, MAX22190_POR_MASK, \
FIELD_PREP(MAX22190_POR_MASK, 0))
enum max22190_variants {
MAX22190,
MAX22199,
};
enum max22190_ch_state {
MAX22190_CH_OFF,
MAX22190_CH_ON
@ -184,6 +183,7 @@ struct max22190_config { @@ -184,6 +183,7 @@ struct max22190_config {
bool crc_en;
enum max22190_mode mode;
uint8_t pkt_size;
uint8_t variant;
};
struct max22190_data {
@ -375,6 +375,7 @@ static int max22190_reg_update(const struct device *dev, uint8_t addr, uint8_t m @@ -375,6 +375,7 @@ static int max22190_reg_update(const struct device *dev, uint8_t addr, uint8_t m
static void max22190_fault_check(const struct device *dev)
{
struct max22190_data *data = dev->data;
const struct max22190_config *config = dev->config;
/* FAULT1 */
data->fault1.reg_raw = max22190_reg_read(dev, MAX22190_FAULT1_REG);
@ -389,23 +390,24 @@ static void max22190_fault_check(const struct device *dev) @@ -389,23 +390,24 @@ static void max22190_fault_check(const struct device *dev)
data->fault1_en.reg_bits.max22190_PORE);
PRINT_ERR_BIT(data->fault1.reg_bits.max22190_FAULT2,
data->fault1_en.reg_bits.max22190_FAULT2E);
PRINT_ERR_BIT(data->fault1.reg_bits.max22190_ALRMT2,
data->fault1_en.reg_bits.max22190_ALRMT2E);
PRINT_ERR_BIT(data->fault1.reg_bits.max22190_ALRMT1,
data->fault1_en.reg_bits.max22190_ALRMT1E);
PRINT_ERR_BIT(data->fault1.reg_bits.max22190_24VL,
data->fault1_en.reg_bits.max22190_24VLE);
PRINT_ERR_BIT(data->fault1.reg_bits.max22190_24VM,
data->fault1_en.reg_bits.max22190_24VME);
PRINT_ERR_BIT(data->fault1.reg_bits.max22190_WBG,
data->fault1_en.reg_bits.max22190_WBGE);
if (data->fault1.reg_bits.max22190_WBG & data->fault1_en.reg_bits.max22190_WBGE) {
uint8_t wb_val = max22190_reg_read(dev, MAX22190_WB_REG);
max22190_update_wb_stat(dev, (uint8_t)wb_val);
if (config->variant == MAX22190) {
PRINT_ERR_BIT(data->fault1.reg_bits.max22190_ALRMT2,
data->fault1_en.reg_bits.max22190_ALRMT2E);
PRINT_ERR_BIT(data->fault1.reg_bits.max22190_ALRMT1,
data->fault1_en.reg_bits.max22190_ALRMT1E);
PRINT_ERR_BIT(data->fault1.reg_bits.max22190_WBG,
data->fault1_en.reg_bits.max22190_WBGE);
if (data->fault1.reg_bits.max22190_WBG &
data->fault1_en.reg_bits.max22190_WBGE) {
uint8_t wb_val = max22190_reg_read(dev, MAX22190_WB_REG);
max22190_update_wb_stat(dev, (uint8_t)wb_val);
}
}
if (data->fault1.reg_bits.max22190_FAULT2) {
/* FAULT2 */
data->fault2.reg_raw = max22190_reg_read(dev, MAX22190_FAULT2_REG);
@ -413,18 +415,20 @@ static void max22190_fault_check(const struct device *dev) @@ -413,18 +415,20 @@ static void max22190_fault_check(const struct device *dev)
/* FAULT2_EN */
data->fault2_en.reg_raw = max22190_reg_read(dev, MAX22190_FAULT2_EN_REG);
PRINT_ERR_BIT(data->fault2.reg_bits.max22190_RFWBS,
data->fault2_en.reg_bits.max22190_RFWBSE);
PRINT_ERR_BIT(data->fault2.reg_bits.max22190_RFWBO,
data->fault2_en.reg_bits.max22190_RFWBOE);
PRINT_ERR_BIT(data->fault2.reg_bits.max22190_RFDIS,
data->fault2_en.reg_bits.max22190_RFDISE);
PRINT_ERR_BIT(data->fault2.reg_bits.max22190_RFDIO,
data->fault2_en.reg_bits.max22190_RFDIOE);
PRINT_ERR_BIT(data->fault2.reg_bits.max22190_OTSHDN,
data->fault2_en.reg_bits.max22190_OTSHDNE);
PRINT_ERR_BIT(data->fault2.reg_bits.max22190_FAULT8CK,
data->fault2_en.reg_bits.max22190_FAULT8CKE);
if (config->variant == MAX22190) {
PRINT_ERR_BIT(data->fault2.reg_bits.max22190_RFWBS,
data->fault2_en.reg_bits.max22190_RFWBSE);
PRINT_ERR_BIT(data->fault2.reg_bits.max22190_RFWBO,
data->fault2_en.reg_bits.max22190_RFWBOE);
PRINT_ERR_BIT(data->fault2.reg_bits.max22190_RFDIS,
data->fault2_en.reg_bits.max22190_RFDISE);
PRINT_ERR_BIT(data->fault2.reg_bits.max22190_RFDIO,
data->fault2_en.reg_bits.max22190_RFDIOE);
}
}
}
}
@ -515,6 +519,7 @@ static int max22190_fault_set(const struct device *dev) @@ -515,6 +519,7 @@ static int max22190_fault_set(const struct device *dev)
exit_fault_set:
LOG_ERR("Err spi_transcieve_dt [%d]\n", ret);
return ret;
}
@ -583,17 +588,25 @@ static int gpio_max22190_init(const struct device *dev) @@ -583,17 +588,25 @@ static int gpio_max22190_init(const struct device *dev)
}
for (int i = 0; i < 8; i++) {
LOG_DBG("IN%d WBE [%d] FBP[%d] DELAY[%d]\n", i,
config->filter[i].reg_bits.max22190_WBE,
config->filter[i].reg_bits.max22190_FBP,
config->filter[i].reg_bits.max22190_DELAY);
if (config->variant == MAX22190) {
LOG_DBG("IN%d WBE [%d] FBP[%d] DELAY[%d]\n", i,
config->filter[i].reg_bits.max22190_WBE,
config->filter[i].reg_bits.max22190_FBP,
config->filter[i].reg_bits.max22190_DELAY);
} else {
LOG_DBG("IN%d FBP[%d] DELAY[%d]\n", i,
config->filter[i].reg_bits.max22190_FBP,
config->filter[i].reg_bits.max22190_DELAY);
}
}
LOG_DBG(" > MAX22190 MODE: %x", config->mode);
LOG_DBG(" > MAX22190 PKT SIZE: %dbits (%dbytes)", config->pkt_size * 8, config->pkt_size);
LOG_DBG(" > MAX22190 CRC: %s", config->crc_en ? "enable" : "disable");
data->fault1_en.reg_bits.max22190_WBGE = 1;
if (config->variant == MAX22190) {
data->fault1_en.reg_bits.max22190_WBGE = 1;
}
data->fault1_en.reg_bits.max22190_PORE = 1;
/* Set all FAULT and FAULT_EN regs */
@ -626,17 +639,24 @@ static DEVICE_API(gpio, gpio_max22190_api) = { @@ -626,17 +639,24 @@ static DEVICE_API(gpio, gpio_max22190_api) = {
: delay == 50 ? MAX22190_DELAY_50US \
: MAX22190_DELAY_20000US
/* Assigning proper variant for differentiating register map */
#define MAX22190_CONFIG_SET_VARIANT(model) \
model == 22190 ? MAX22190 /* MAX22190 */ \
: model == 22199 ? MAX22199 /* MAX22199 */ \
: MAX22190 /* Default fallback */
/* Set FILTERx reg */
#define MAX22190_FILTER_BY_IDX(id, idx) \
#define MAX22190_FILTER_BY_IDX(id, model, idx) \
{ \
.reg_bits.max22190_DELAY = \
MAX22190_FILTER_SET_DELAY(DT_INST_PROP_BY_IDX(id, filter_delays, idx)), \
.reg_bits.max22190_FBP = DT_INST_PROP_BY_IDX(id, filter_fbps, idx), \
.reg_bits.max22190_WBE = DT_INST_PROP_BY_IDX(id, filter_wbes, idx), \
.reg_bits.max22190_WBE = \
(model == 22190) ? DT_INST_PROP_BY_IDX(id, filter_wbes, idx) : 0, \
}
#define GPIO_MAX22190_DEVICE(id) \
static const struct max22190_config max22190_##id##_cfg = { \
#define GPIO_MAX22190_DEVICE(id, model) \
static const struct max22190_config max##model##_##id##_cfg = { \
.spi = SPI_DT_SPEC_INST_GET(id, SPI_OP_MODE_MASTER | SPI_WORD_SET(8U), 0U), \
.ready_gpio = GPIO_DT_SPEC_INST_GET(id, drdy_gpios), \
.fault_gpio = GPIO_DT_SPEC_INST_GET(id, fault_gpios), \
@ -644,23 +664,34 @@ static DEVICE_API(gpio, gpio_max22190_api) = { @@ -644,23 +664,34 @@ static DEVICE_API(gpio, gpio_max22190_api) = {
.mode = DT_INST_PROP(id, max22190_mode), \
.crc_en = !(DT_INST_PROP(id, max22190_mode) & 0x1), \
.pkt_size = !(DT_INST_PROP(id, max22190_mode) & 0x1) ? 3 : 2, \
.variant = MAX22190_CONFIG_SET_VARIANT(model), \
.filter = \
{ \
MAX22190_FILTER_BY_IDX(id, 0), \
MAX22190_FILTER_BY_IDX(id, 1), \
MAX22190_FILTER_BY_IDX(id, 2), \
MAX22190_FILTER_BY_IDX(id, 3), \
MAX22190_FILTER_BY_IDX(id, 4), \
MAX22190_FILTER_BY_IDX(id, 5), \
MAX22190_FILTER_BY_IDX(id, 6), \
MAX22190_FILTER_BY_IDX(id, 7), \
MAX22190_FILTER_BY_IDX(id, model, 0), \
MAX22190_FILTER_BY_IDX(id, model, 1), \
MAX22190_FILTER_BY_IDX(id, model, 2), \
MAX22190_FILTER_BY_IDX(id, model, 3), \
MAX22190_FILTER_BY_IDX(id, model, 4), \
MAX22190_FILTER_BY_IDX(id, model, 5), \
MAX22190_FILTER_BY_IDX(id, model, 6), \
MAX22190_FILTER_BY_IDX(id, model, 7), \
}, \
}; \
\
static struct max22190_data max22190_##id##_data; \
static struct max22190_data max##model##_##id##_data; \
\
DEVICE_DT_INST_DEFINE(id, &gpio_max22190_init, NULL, &max22190_##id##_data, \
&max22190_##id##_cfg, POST_KERNEL, \
DEVICE_DT_INST_DEFINE(id, &gpio_max22190_init, NULL, &max##model##_##id##_data, \
&max##model##_##id##_cfg, POST_KERNEL, \
CONFIG_GPIO_MAX22190_INIT_PRIORITY, &gpio_max22190_api);
DT_INST_FOREACH_STATUS_OKAY(GPIO_MAX22190_DEVICE)
#undef DT_DRV_COMPAT
#define DT_DRV_COMPAT adi_max22190_gpio
DT_INST_FOREACH_STATUS_OKAY_VARGS(GPIO_MAX22190_DEVICE, 22190)
#undef DT_DRV_COMPAT
#define DT_DRV_COMPAT adi_max22199_gpio
DT_INST_FOREACH_STATUS_OKAY_VARGS(GPIO_MAX22190_DEVICE, 22199)
#if DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) == 0
#warning "GPIO MAX22190 driver enabled without any devices"
#endif

58
dts/bindings/gpio/adi,max22190-gpio.yaml

@ -41,44 +41,6 @@ description: | @@ -41,44 +41,6 @@ description: |
compatible: "adi,max22190-gpio"
properties:
"#gpio-cells":
const: 2
ngpios:
type: int
required: true
const: 8
description: Number of gpios supported
drdy-gpios:
description: Ready pin which show when chip is ready
type: phandle-array
fault-gpios:
description: |
Fault pin indicates when there is Fault state in either FAULT1 or FAULT2
bothe of which are cleaned on read once problem is not persistent
type: phandle-array
latch-gpios:
description: |
Latch the data so it could be read (partially duplicate CS)
type: phandle-array
max22190-mode:
type: int
required: true
enum:
- 0
- 1
- 2
- 3
description: |
Default mode set to 1, because in MAX22190PMB devkit this is hardwired
mode set by manufacturer.
max22190 mode is configured from M0 and M1 pins with
pull up or down resistors.
MODE| M1| M0| FRAME | CRC | DAISY CHAIN
----+---+---+--------+-----+------------
0 | 0 | 0 | 24-bit | yes | no
1 | 0 | 1 | 16-bit | no | no
2 | 1 | 0 | 24-bit | yes | yes
3 | 1 | 1 | 16-bit | no | yes
filter-wbes:
type: array
default: [0, 0, 0, 0, 0, 0, 0, 0]
@ -92,27 +54,9 @@ properties: @@ -92,27 +54,9 @@ properties:
- 1 wire break enable
- 0 wire break disable
channels indentation start from CH0...CH7
filter-fbps:
type: array
default: [1, 1, 1, 1, 1, 1, 1, 1]
description: |
The default value corresponds to the default value of the hardware.
All channels are in bypass.
Enable or disable filter
- 1 mean bypass
- 0 mean filter is used
channels indentation start from CH0...CH7
filter-delays:
type: array
default: [50, 50, 50, 50, 50, 50, 50, 50]
description: |
The default value corresponds to the default value of the hardware.
Used to setup filter delay. Values are set in us. Default value is 50 = 50 us.
Value : 50, 100, 400, 800, 1600, 3200, 12800, 20000
channels indentation start from CH0...CH7
gpio-cells:
- pin
- flags
include: [gpio-controller.yaml, spi-device.yaml]
include: adi,max2219x-base-gpio.yaml

47
dts/bindings/gpio/adi,max22199-gpio.yaml

@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
# Copyright (c) 2024 Analog Devices Inc.
# Copyright (c) 2024 BayLibre SAS
# SPDX-License-Identifier: Apache-2.0
description: |
The MAX22199 is an IEC 61131-2 compliant industrial digital input device.
The MAX22199 translates eight 24V current-sinking industrial inputs to a
serialized SPI-compatible output that interfaces with 3V to 5.5V logic.
It can operate as eight Type 1/Type 3 digital inputs or four Type 2 digital
inputs. The device provides diagnostic functions, including thermal shutdown,
24V under voltage alarm, 24V missing voltage alarm, and SPI and CRC
communication error detection.
Sample binding
&sdp_spi {
status = "okay";
pinctrl-names = "default";
max22199_gpio0: max22199_gpio@0 {
compatible = "adi,max22199-gpio";
reg = <0>;
spi-max-frequency = <1000000>;
status = "okay";
gpio-controller;
#gpio-cells = <2>;
ngpios = <8>;
status = "okay";
max22199-mode = <1>; // modes range from 0-4
drdy-gpios = <&gpioj 12 GPIO_ACTIVE_LOW>; /* SDP-GPIO5 - PMOD-PIN8 */
fault-gpios = <&gpioc 11 GPIO_ACTIVE_LOW>; /* SDP-SERIAL_INT - PMOD-PIN7 */
latch-gpios = <&gpioj 13 GPIO_ACTIVE_LOW>; /* SDP-GPIO6 - PMOD-PIN9 */
filter-fbps = <0 0 0 0 0 0 0 0>; // programmable filter INx
filter-delays = <50 100 400 800 1600 3200 12800 20000>; // 1000 us == 1ms
};
};
compatible: "adi,max22199-gpio"
gpio-cells:
- pin
- flags
include: adi,max2219x-base-gpio.yaml

76
dts/bindings/gpio/adi,max2219x-base-gpio.yaml

@ -0,0 +1,76 @@ @@ -0,0 +1,76 @@
# Copyright (c) 2024 Analog Devices Inc.
# Copyright (c) 2024 BayLibre SAS
# SPDX-License-Identifier: Apache-2.0
include: [gpio-controller.yaml, spi-device.yaml]
properties:
"#gpio-cells":
const: 2
ngpios:
type: int
required: true
const: 8
description: Number of gpios supported
drdy-gpios:
description: Ready pin which show when chip is ready
type: phandle-array
fault-gpios:
description: |
Fault pin indicates when there is Fault state in either FAULT1 or FAULT2
bothe of which are cleaned on read once problem is not persistent
type: phandle-array
latch-gpios:
description: |
Latch the data so it could be read (partially duplicate CS)
type: phandle-array
max22190-mode:
type: int
required: true
enum:
- 0
- 1
- 2
- 3
description: |
Default mode set to 1, because in MAX22190PMB devkit this is hardwired
mode set by manufacturer.
max22190 mode is configured from M0 and M1 pins with
pull up or down resistors.
MODE| M1| M0| FRAME | CRC | DAISY CHAIN
----+---+---+--------+-----+------------
0 | 0 | 0 | 24-bit | yes | no
1 | 0 | 1 | 16-bit | no | no
2 | 1 | 0 | 24-bit | yes | yes
3 | 1 | 1 | 16-bit | no | yes
filter-wbes:
type: array
default: [0, 0, 0, 0, 0, 0, 0, 0]
description: |
The default value corresponds to the default value of the hardware.
Wire break is disabled in all channels.
WBE bit in all Filter registers stand for wire break enable on each
channel, so to enable WB functionality set 1.
If WB on specific channel is disabled , FAULT will not be rised in case
wire is cut.
- 1 wire break enable
- 0 wire break disable
channels indentation start from CH0...CH7
filter-fbps:
type: array
default: [1, 1, 1, 1, 1, 1, 1, 1]
description: |
The default value corresponds to the default value of the hardware.
All channels are in bypass.
Enable or disable filter
- 1 mean bypass
- 0 mean filter is used
channels indentation start from CH0...CH7
filter-delays:
type: array
default: [50, 50, 50, 50, 50, 50, 50, 50]
description: |
The default value corresponds to the default value of the hardware.
Used to setup filter delay. Values are set in us. Default value is 50 = 50 us.
Value : 50, 100, 400, 800, 1600, 3200, 12800, 20000
channels indentation start from CH0...CH7

24
tests/drivers/build_all/gpio/app.overlay

@ -596,11 +596,27 @@ @@ -596,11 +596,27 @@
latch-gpios = <&test_gpio 0 0>;
};
test_spi_max22017: max22017_mfd@b {
compatible = "adi,max22017";
test_spi_max22199: max22199@b {
compatible = "adi,max22199-gpio";
status = "okay";
reg = <0x0b>;
spi-max-frequency = <0>;
gpio-controller;
#gpio-cells = <2>;
ngpios = <8>;
max22190-mode = <1>;
filter-fbps = <0 0 0 0 0 0 0 0>;
filter-delays = <50 100 400 800 1600 3200 12800 20000>;
drdy-gpios = <&test_gpio 0 0>;
fault-gpios = <&test_gpio 0 0>;
latch-gpios = <&test_gpio 0 0>;
};
test_spi_max22017: max22017_mfd@c {
compatible = "adi,max22017";
status = "okay";
reg = <0x0c>;
spi-max-frequency = <0>;
max22017_gpio0: max22017_gpio {
compatible = "adi,max22017-gpio";
@ -611,10 +627,10 @@ @@ -611,10 +627,10 @@
};
};
test_max14915: max14915@c {
test_max14915: max14915@d {
compatible = "adi,max14915-gpio";
status = "okay";
reg = <0x0c>;
reg = <0x0d>;
spi-max-frequency = <0>;
gpio-controller;
#gpio-cells = <2>;

Loading…
Cancel
Save