drivers: adc: add pinctrl driver support
Replace soc-specific pin functions with Zephyr pinctrl api functions for pin-mux configuration in npcx adc driver. Please notice users need to configure the corresponding pinctrl nodes in 'pinctrl-0' property in the adc0 DT node. For example, if ADC0 and ADC2 channels are selected for the application, please add the follwoings in your board DT layout file. &adc0 { status = "okay"; /* Use adc0 channel 0 and 2 for 'adc_api' driver tests */ pinctrl-0 = <&adc0_chan0_gp45 &adc0_chan2_gp43>; pinctrl-names = "default"; }; Signed-off-by: Mulin Chao <mlchao@nuvoton.com>
This commit is contained in:
parent
22f9036577
commit
7ef371b2e7
6 changed files with 34 additions and 44 deletions
|
@ -82,8 +82,11 @@
|
|||
};
|
||||
|
||||
&adc0 {
|
||||
/* ADC pinmux is changed only if related channel is configured. */
|
||||
status = "okay";
|
||||
/* Use adc0 channel 0 and 2 for 'adc_api' driver tests */
|
||||
pinctrl-0 = <&adc0_chan0_gp45
|
||||
&adc0_chan2_gp43>;
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
&espi0 {
|
||||
|
|
|
@ -95,8 +95,11 @@
|
|||
};
|
||||
|
||||
&adc0 {
|
||||
/* ADC pinmux is changed only if related channel is configured. */
|
||||
status = "okay";
|
||||
/* Use adc0 channel 0 and 2 for 'adc_api' driver tests */
|
||||
pinctrl-0 = <&adc0_chan0_gp45
|
||||
&adc0_chan2_gp43>;
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
&espi0 {
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <zephyr/drivers/adc.h>
|
||||
#include <zephyr/drivers/adc/adc_npcx_threshold.h>
|
||||
#include <zephyr/drivers/clock_control.h>
|
||||
#include <zephyr/drivers/pinctrl.h>
|
||||
#include <zephyr/kernel.h>
|
||||
#include <soc.h>
|
||||
|
||||
|
@ -26,7 +27,7 @@ LOG_MODULE_REGISTER(adc_npcx, CONFIG_ADC_LOG_LEVEL);
|
|||
#define ADC_REGULAR_MEAST_VAL 0x0001
|
||||
|
||||
/* ADC channel number */
|
||||
#define NPCX_ADC_CH_COUNT DT_INST_NUM_PINCTRLS_BY_IDX(0, 0)
|
||||
#define NPCX_ADC_CH_COUNT DT_INST_PROP(0, channel_count)
|
||||
|
||||
/* ADC targeted operating frequency (2MHz) */
|
||||
#define NPCX_ADC_CLK 2000000
|
||||
|
@ -49,12 +50,11 @@ struct adc_npcx_config {
|
|||
uintptr_t base;
|
||||
/* clock configuration */
|
||||
struct npcx_clk_cfg clk_cfg;
|
||||
/* pinmux configuration */
|
||||
const struct npcx_alt *alts_list;
|
||||
/* amount of thresholds supported */
|
||||
const uint8_t threshold_count;
|
||||
/* threshold control register offset */
|
||||
const uint16_t threshold_reg_offset;
|
||||
const struct pinctrl_dev_config *pcfg;
|
||||
};
|
||||
|
||||
struct adc_npcx_threshold_control {
|
||||
|
@ -328,7 +328,6 @@ static void adc_context_update_buffer_pointer(struct adc_context *ctx,
|
|||
static int adc_npcx_channel_setup(const struct device *dev,
|
||||
const struct adc_channel_cfg *channel_cfg)
|
||||
{
|
||||
const struct adc_npcx_config *const config = dev->config;
|
||||
uint8_t channel_id = channel_cfg->channel_id;
|
||||
|
||||
if (channel_id >= NPCX_ADC_CH_COUNT) {
|
||||
|
@ -356,13 +355,7 @@ static int adc_npcx_channel_setup(const struct device *dev,
|
|||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
/* Configure pin-mux for ADC channel */
|
||||
npcx_pinctrl_mux_configure(config->alts_list + channel_cfg->channel_id,
|
||||
1, 1);
|
||||
LOG_DBG("ADC channel %d, alts(%d,%d)", channel_cfg->channel_id,
|
||||
config->alts_list[channel_cfg->channel_id].group,
|
||||
config->alts_list[channel_cfg->channel_id].bit);
|
||||
|
||||
LOG_DBG("ADC channel %d configured", channel_cfg->channel_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -679,14 +672,16 @@ static const struct adc_driver_api adc_npcx_driver_api = {
|
|||
|
||||
static int adc_npcx_init(const struct device *dev);
|
||||
|
||||
static const struct npcx_alt adc_alts[] = NPCX_DT_ALT_ITEMS_LIST(0);
|
||||
PINCTRL_DT_INST_DEFINE(0);
|
||||
BUILD_ASSERT(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) == 1,
|
||||
"only one 'nuvoton_npcx_adc' compatible node may be present");
|
||||
|
||||
static const struct adc_npcx_config adc_npcx_cfg_0 = {
|
||||
.base = DT_INST_REG_ADDR(0),
|
||||
.clk_cfg = NPCX_DT_CLK_CFG_ITEM(0),
|
||||
.alts_list = adc_alts,
|
||||
.threshold_count = DT_INST_PROP(0, threshold_count),
|
||||
.threshold_reg_offset = DT_INST_PROP(0, threshold_reg_offset),
|
||||
.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(0),
|
||||
};
|
||||
|
||||
static struct adc_npcx_threshold_data threshold_data_0;
|
||||
|
@ -758,7 +753,12 @@ static int adc_npcx_init(const struct device *dev)
|
|||
/* Initialize mutex of ADC channels */
|
||||
adc_context_unlock_unconditionally(&data->ctx);
|
||||
|
||||
/* Configure pin-mux for ADC device */
|
||||
ret = pinctrl_apply_state(config->pcfg, PINCTRL_STATE_DEFAULT);
|
||||
if (ret < 0) {
|
||||
LOG_ERR("ADC pinctrl setup failed (%d)", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
BUILD_ASSERT(ARRAY_SIZE(adc_alts) == NPCX_ADC_CH_COUNT,
|
||||
"The number of ADC channels and pin-mux configurations don't match!");
|
||||
|
|
|
@ -182,18 +182,9 @@
|
|||
&wui_iof4 &wui_iof5 &wui_none &wui_none>;
|
||||
};
|
||||
|
||||
/* Supported channels for ADC0 in npcx7 series */
|
||||
/* ADC0 comparator configuration in npcx7 series */
|
||||
adc0: adc@400d1000 {
|
||||
pinctrl-0 = <&alt6_adc0_sl /* ADC0 - PIN45 */
|
||||
&alt6_adc1_sl /* ADC1 - PIN44 */
|
||||
&alt6_adc2_sl /* ADC2 - PIN43 */
|
||||
&alt6_adc3_sl /* ADC3 - PIN42 */
|
||||
&alt6_adc4_sl /* ADC4 - PIN41 */
|
||||
&altf_adc5_sl /* ADC5 - PIN37 */
|
||||
&altf_adc6_sl /* ADC6 - PIN34 */
|
||||
&altf_adc7_sl /* ADC7 - PINE1 */
|
||||
&altf_adc8_sl /* ADC8 - PINF1 */
|
||||
&altf_adc9_sl>; /* ADC9 - PINF0 */
|
||||
channel-count = <10>;
|
||||
threshold-reg-offset = <0x14>;
|
||||
threshold-count = <3>;
|
||||
};
|
||||
|
|
|
@ -204,20 +204,9 @@
|
|||
&wui_iof4 &wui_iof5 &wui_none &wui_none>;
|
||||
};
|
||||
|
||||
/* Supported channels for ADC0 in npcx9 series */
|
||||
/* ADC0 comparator configuration in npcx9 series */
|
||||
adc0: adc@400d1000 {
|
||||
pinctrl-0 = <&alt6_adc0_sl /* ADC0 - PIN45 */
|
||||
&alt6_adc1_sl /* ADC1 - PIN44 */
|
||||
&alt6_adc2_sl /* ADC2 - PIN43 */
|
||||
&alt6_adc3_sl /* ADC3 - PIN42 */
|
||||
&alt6_adc4_sl /* ADC4 - PIN41 */
|
||||
&altf_adc5_sl /* ADC5 - PIN37 */
|
||||
&altf_adc6_sl /* ADC6 - PIN34 */
|
||||
&altf_adc7_sl /* ADC7 - PINE1 */
|
||||
&altf_adc8_sl /* ADC8 - PINF1 */
|
||||
&altf_adc9_sl /* ADC9 - PINF0 */
|
||||
&altf_adc10_sl /* ADC10 - PINE0 */
|
||||
&altf_adc11_sl>; /* ADC11 - PINC7 */
|
||||
channel-count = <12>;
|
||||
threshold-reg-offset = <0x60>;
|
||||
threshold-count = <6>;
|
||||
};
|
||||
|
|
|
@ -5,7 +5,7 @@ description: Nuvoton, NPCX-ADC node
|
|||
|
||||
compatible: "nuvoton,npcx-adc"
|
||||
|
||||
include: [adc-controller.yaml]
|
||||
include: [adc-controller.yaml, pinctrl-device.yaml]
|
||||
|
||||
properties:
|
||||
reg:
|
||||
|
@ -15,9 +15,13 @@ properties:
|
|||
label:
|
||||
required: true
|
||||
pinctrl-0:
|
||||
type: phandles
|
||||
required: true
|
||||
description: configurations of pinmux controllers
|
||||
pinctrl-names:
|
||||
required: true
|
||||
channel-count:
|
||||
type: int
|
||||
required: true
|
||||
description: the number of ADC channels
|
||||
threshold-reg-offset:
|
||||
type: int
|
||||
required: true
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue