Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
7295a14
[P-R#6052] drivers: stm32_gpio: helper function to register GPIO banks
etienne-lms May 23, 2023
a64c352
[P-R#6052] drivers: stm32_gpio: probe pinctrl nodes
etienne-lms May 23, 2023
eb8db6f
[P-R#6052] drivers: stm32_gpio: fix driver header file guards
etienne-lms May 23, 2023
9e1ea28
[P-R#6041] core: rename dt_driver_phandle_args to dt_pargs
etienne-lms May 22, 2023
a1f9e45
[P-R#6049] drivers: pinctrl: fix stubbed pinctrl_free_state()
etienne-lms May 25, 2023
814d467
[P-R#6053] drivers: stm32_gpio: consider DT output data configuration
etienne-lms May 23, 2023
89990cc
[P-R#6056] drivers: gpio: add put operation handle
etienne-lms May 26, 2023
b8e966b
drivers: stm32_gpio: support CFG_DRIVERS_GPIO
etienne-lms May 26, 2023
2ce07b4
plat-stm32mp1: enable CFG_DRIVERS_GPIO
etienne-lms May 30, 2023
5f89ae3
drivers: stm32_gpio: remove GPIO access specific API functions
etienne-lms May 26, 2023
87cbd91
drivers: stm32_gpio: support CFG_DRIVERS_PINCTRL
etienne-lms May 23, 2023
2af6403
drivers: stm32_gpio: add helper function stm32_gpio_pinctrl_bank_pin()
etienne-lms May 26, 2023
8668845
drivers: stm32_gpio: add helper function stm32_pinctrl_set_secure_cfg()
etienne-lms May 26, 2023
882e488
plat-stm32mp1: shared_resources: support CFG_DRIVERS_PINCTRL
etienne-lms May 25, 2023
fb8ebc4
drivers: stm32_uart: support CFG_DRIVERS_PINCTRL
etienne-lms May 23, 2023
bb91a0e
drivers: stm32_i2c: support CFG_DRIVERS_PINCTRL
etienne-lms May 23, 2023
46ef2d8
plat-stm32mp1: conf: enable CFG_DRIVERS_PINCTRL
etienne-lms May 25, 2023
3bfb991
drivers: stm32_gpio: add help function stm32_gpio_get_bank()
etienne-lms May 25, 2023
be10e9a
drivers: stm32_gpio: use SHIFT_U32() where applicable
etienne-lms May 30, 2023
c2b28ac
plat-stm32mp1: remove unused gpio bank clock helper functions
etienne-lms May 25, 2023
9525edd
plat-stm32mp1: remove unused gpio bank base address helper function
etienne-lms May 25, 2023
2a59bfc
plat-stm32mp1: remove unused stm32mp_gpio_bank_is_shared()
etienne-lms May 23, 2023
4867659
drivers: stm32_gpio: remove cases when CFG_DRIVERS_PINCTRL is disabled
etienne-lms May 25, 2023
a7797e9
drivers: stm32_uart: remove cases when CFG_DRIVERS_PINCTRL is disabled
etienne-lms May 25, 2023
d860bbb
drivers: stm32_i2c: remove cases when CFG_DRIVERS_PINCTRL is disabled
etienne-lms May 25, 2023
0a0c12c
drivers: stm32_gpio: move definitions to source file
etienne-lms May 25, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions core/arch/arm/plat-stm32mp1/conf.mk
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ include core/arch/arm/cpu/cortex-a7.mk

$(call force,CFG_DRIVERS_CLK,y)
$(call force,CFG_DRIVERS_CLK_DT,y)
$(call force,CFG_DRIVERS_GPIO,y)
$(call force,CFG_DRIVERS_PINCTRL,y)
$(call force,CFG_GIC,y)
$(call force,CFG_INIT_CNTVOFF,y)
$(call force,CFG_PSCI_ARM32,y)
Expand Down
35 changes: 12 additions & 23 deletions core/arch/arm/plat-stm32mp1/drivers/stm32mp1_pmic.c
Original file line number Diff line number Diff line change
Expand Up @@ -460,8 +460,8 @@ static void parse_regulator_fdt_nodes(void)
* Return 0 on success, 1 if no PMIC node found and a negative value otherwise
*/
static int dt_pmic_i2c_config(struct dt_node_info *i2c_info,
struct stm32_pinctrl **pinctrl,
size_t *pinctrl_count,
struct pinctrl_state **pinctrl_active,
struct pinctrl_state **pinctrl_sleep,
struct stm32_i2c_init_s *init)
{
int pmic_node = 0;
Expand Down Expand Up @@ -493,8 +493,8 @@ static int dt_pmic_i2c_config(struct dt_node_info *i2c_info,
if (!i2c_info->reg)
return -FDT_ERR_NOTFOUND;

if (stm32_i2c_get_setup_from_fdt(fdt, i2c_node, init,
pinctrl, pinctrl_count))
if (stm32_i2c_get_setup_from_fdt(fdt, i2c_node, init, pinctrl_active,
pinctrl_sleep))
panic();

return 0;
Expand All @@ -510,17 +510,11 @@ static bool initialize_pmic_i2c(void)
int ret = 0;
struct dt_node_info i2c_info = { };
struct i2c_handle_s *i2c = &i2c_handle;
struct stm32_pinctrl *pinctrl = NULL;
size_t pin_count = 0;
struct stm32_i2c_init_s i2c_init = { };

ret = dt_pmic_i2c_config(&i2c_info, &pinctrl, &pin_count, &i2c_init);
if (ret < 0) {
EMSG("I2C configuration failed %d", ret);
if (dt_pmic_i2c_config(&i2c_info, &i2c->pinctrl, &i2c->pinctrl_sleep,
&i2c_init))
panic();
}
if (ret)
return false;

/* Initialize PMIC I2C */
i2c->base.pa = i2c_info.reg;
Expand All @@ -533,9 +527,6 @@ static bool initialize_pmic_i2c(void)
i2c_init.analog_filter = true;
i2c_init.digital_filter_coef = 0;

i2c->pinctrl = pinctrl;
i2c->pinctrl_count = pin_count;

stm32mp_get_pmic();

ret = stm32_i2c_init(i2c, &i2c_init);
Expand Down Expand Up @@ -586,26 +577,24 @@ void stm32mp_put_pmic(void)

static void register_non_secure_pmic(void)
{
size_t n = 0;
size_t __maybe_unused n = 0;

/* Allow this function to be called when STPMIC1 not used */
if (!i2c_handle.base.pa)
return;

for (n = 0; n < i2c_handle.pinctrl_count; n++)
stm32mp_register_non_secure_gpio(i2c_handle.pinctrl[n].bank,
i2c_handle.pinctrl[n].pin);
stm32mp_register_non_secure_pinctrl(i2c_handle.pinctrl);
stm32mp_register_non_secure_pinctrl(i2c_handle.pinctrl_sleep);

stm32mp_register_non_secure_periph_iomem(i2c_handle.base.pa);
}

static void register_secure_pmic(void)
{
size_t n = 0;
size_t __maybe_unused n = 0;

for (n = 0; n < i2c_handle.pinctrl_count; n++)
stm32mp_register_secure_gpio(i2c_handle.pinctrl[n].bank,
i2c_handle.pinctrl[n].pin);
stm32mp_register_secure_pinctrl(i2c_handle.pinctrl);
stm32mp_register_secure_pinctrl(i2c_handle.pinctrl_sleep);

stm32mp_register_secure_periph_iomem(i2c_handle.base.pa);
register_pm_driver_cb(pmic_pm, NULL, "stm32mp1-pmic");
Expand Down
53 changes: 4 additions & 49 deletions core/arch/arm/plat-stm32mp1/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <config.h>
#include <console.h>
#include <drivers/gic.h>
#include <drivers/pinctrl.h>
#include <drivers/stm32_etzpc.h>
#include <drivers/stm32_iwdg.h>
#include <drivers/stm32_tamp.h>
Expand Down Expand Up @@ -407,33 +408,6 @@ static bool __maybe_unused bank_is_valid(unsigned int bank)
panic();
}

vaddr_t stm32_get_gpio_bank_base(unsigned int bank)
{
static struct io_pa_va base = { .pa = GPIOA_BASE };

static_assert(GPIO_BANK_A == 0);
assert(bank_is_valid(bank));

if (IS_ENABLED(CFG_STM32MP15)) {
static struct io_pa_va zbase = { .pa = GPIOZ_BASE };

/* Get secure mapping address for GPIOZ */
if (bank == GPIO_BANK_Z)
return io_pa_or_va_secure(&zbase, GPIO_BANK_OFFSET);

/* Other are mapped non-secure */
return io_pa_or_va_nsec(&base, (bank + 1) * GPIO_BANK_OFFSET) +
(bank * GPIO_BANK_OFFSET);
}

if (IS_ENABLED(CFG_STM32MP13))
return io_pa_or_va_secure(&base,
(bank + 1) * GPIO_BANK_OFFSET) +
(bank * GPIO_BANK_OFFSET);

panic();
}

unsigned int stm32_get_gpio_bank_offset(unsigned int bank)
{
assert(bank_is_valid(bank));
Expand All @@ -444,28 +418,6 @@ unsigned int stm32_get_gpio_bank_offset(unsigned int bank)
return bank * GPIO_BANK_OFFSET;
}

unsigned int stm32_get_gpio_bank_clock(unsigned int bank)
{
assert(bank_is_valid(bank));

#ifdef CFG_STM32MP15
if (bank == GPIO_BANK_Z)
return GPIOZ;
#endif

return GPIOA + bank;
}

struct clk *stm32_get_gpio_bank_clk(unsigned int bank)
{
assert(bank_is_valid(bank));

if (!IS_ENABLED(CFG_DRIVERS_CLK))
return NULL;

return stm32mp_rcc_clock_id_to_clk(stm32_get_gpio_bank_clock(bank));
}

#ifdef CFG_STM32_IWDG
TEE_Result stm32_get_iwdg_otp_config(paddr_t pbase,
struct stm32_iwdg_otp_data *otp_data)
Expand Down Expand Up @@ -535,3 +487,6 @@ static TEE_Result init_debug(void)
}
early_init_late(init_debug);
#endif /* CFG_STM32_DEBUG_ACCESS */

/* Some generic resources need to be unpaged */
DECLARE_KEEP_PAGER(pinctrl_apply_state);
68 changes: 51 additions & 17 deletions core/arch/arm/plat-stm32mp1/shared_resources.c
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright (c) 2017-2022, STMicroelectronics
* Copyright (c) 2017-2023, STMicroelectronics
*/

#include <config.h>
#include <drivers/pinctrl.h>
#include <drivers/stm32_etzpc.h>
#include <drivers/stm32_gpio.h>
#include <drivers/stm32mp1_etzpc.h>
Expand Down Expand Up @@ -370,33 +371,66 @@ void stm32mp_register_non_secure_gpio(unsigned int bank, unsigned int pin)
}
}

static void lock_registering(void)
void stm32mp_register_secure_pinctrl(struct pinctrl_state *pinctrl)
{
registering_locked = true;
unsigned int *bank = NULL;
unsigned int *pin = NULL;
size_t count = 0;
size_t n = 0;

stm32_gpio_pinctrl_bank_pin(pinctrl, NULL, NULL, &count);
if (!count)
return;

bank = calloc(count, sizeof(*bank));
pin = calloc(count, sizeof(*pin));
if (!bank || !pin)
panic();

stm32_gpio_pinctrl_bank_pin(pinctrl, bank, pin, &count);

for (n = 0; n < count; n++)
stm32mp_register_secure_gpio(bank[n], pin[n]);

free(bank);
free(pin);
}

bool stm32mp_periph_is_secure(enum stm32mp_shres id)
void stm32mp_register_non_secure_pinctrl(struct pinctrl_state *pinctrl)
{
lock_registering();
unsigned int *bank = NULL;
unsigned int *pin = NULL;
size_t count = 0;
size_t n = 0;

return shres_state[id] == SHRES_SECURE;
stm32_gpio_pinctrl_bank_pin(pinctrl, NULL, NULL, &count);
if (!count)
return;

bank = calloc(count, sizeof(*bank));
pin = calloc(count, sizeof(*pin));
if (!bank || !pin)
panic();

stm32_gpio_pinctrl_bank_pin(pinctrl, bank, pin, &count);

for (n = 0; n < count; n++)
stm32mp_register_non_secure_gpio(bank[n], pin[n]);

free(bank);
free(pin);
}

bool stm32mp_gpio_bank_is_shared(unsigned int bank)
static void lock_registering(void)
{
unsigned int not_secure = 0;
unsigned int pin = 0;
registering_locked = true;
}

bool stm32mp_periph_is_secure(enum stm32mp_shres id)
{
lock_registering();

if (bank != GPIO_BANK_Z)
return false;

for (pin = 0; pin < get_gpioz_nbpin(); pin++)
if (!stm32mp_periph_is_secure(STM32MP1_SHRES_GPIOZ(pin)))
not_secure++;

return not_secure > 0 && not_secure < get_gpioz_nbpin();
return shres_state[id] == SHRES_SECURE;
}

bool stm32mp_gpio_bank_is_non_secure(unsigned int bank)
Expand Down
31 changes: 25 additions & 6 deletions core/arch/arm/plat-stm32mp1/stm32_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include <assert.h>
#include <drivers/clk.h>
#include <drivers/pinctrl.h>
#include <drivers/stm32_bsec.h>
#include <kernel/panic.h>
#include <stdint.h>
Expand Down Expand Up @@ -42,10 +43,7 @@ vaddr_t get_gicd_base(void);
* check DT configuration matches platform implementation of the banks
* description.
*/
vaddr_t stm32_get_gpio_bank_base(unsigned int bank);
unsigned int stm32_get_gpio_bank_offset(unsigned int bank);
unsigned int stm32_get_gpio_bank_clock(unsigned int bank);
struct clk *stm32_get_gpio_bank_clk(unsigned int bank);

/* Platform util for PMIC support */
bool stm32mp_with_pmic(void);
Expand Down Expand Up @@ -254,15 +252,26 @@ void stm32mp_register_secure_gpio(unsigned int bank, unsigned int pin);
*/
void stm32mp_register_non_secure_gpio(unsigned int bank, unsigned int pin);

/*
* Register pin resource of a pin control state as a secure peripheral
* @bank: Bank of the target GPIO
* @pin: Bit position of the target GPIO in the bank
*/
void stm32mp_register_secure_pinctrl(struct pinctrl_state *pinctrl);

/*
* Register pin resource of a pin control state as a non-secure peripheral
* @bank: Bank of the target GPIO
* @pin: Bit position of the target GPIO in the bank
*/
void stm32mp_register_non_secure_pinctrl(struct pinctrl_state *pinctrl);

/* Return true if and only if resource @id is registered as secure */
bool stm32mp_periph_is_secure(enum stm32mp_shres id);

/* Return true if and only if GPIO bank @bank is registered as secure */
bool stm32mp_gpio_bank_is_secure(unsigned int bank);

/* Return true if and only if GPIO bank @bank is registered as shared */
bool stm32mp_gpio_bank_is_shared(unsigned int bank);

/* Return true if and only if GPIO bank @bank is registered as non-secure */
bool stm32mp_gpio_bank_is_non_secure(unsigned int bank);

Expand Down Expand Up @@ -300,6 +309,16 @@ static inline void stm32mp_register_non_secure_gpio(unsigned int bank __unused,
{
}

static inline
void stm32mp_register_secure_pinctrl(struct pinctrl_state *pinctrl __unused)
{
}

static inline
void stm32mp_register_non_secure_pinctrl(struct pinctrl_state *pinctrl __unused)
{
}

static inline bool stm32mp_periph_is_secure(enum stm32mp_shres id __unused)
{
return true;
Expand Down
4 changes: 2 additions & 2 deletions core/drivers/atmel_piobu.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,13 +204,13 @@ static const struct gpio_ops atmel_piobu_ops = {
.set_interrupt = secumod_gpio_set_interrupt,
};

static struct gpio *secumod_dt_get(struct dt_driver_phandle_args *a, void *data,
static struct gpio *secumod_dt_get(struct dt_pargs *pargs, void *data,
TEE_Result *res)
{
struct gpio *gpio = NULL;
struct gpio_chip *chip = data;

gpio = gpio_dt_alloc_pin(a, res);
gpio = gpio_dt_alloc_pin(pargs, res);
if (*res)
return NULL;

Expand Down
2 changes: 1 addition & 1 deletion core/drivers/clk/clk-stm32-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -544,7 +544,7 @@ struct clk *stm32mp_rcc_clock_id_to_clk(unsigned long clock_id)
return priv->clk_refs[clock_id];
}

static struct clk *stm32mp_clk_dt_get_clk(struct dt_driver_phandle_args *pargs,
static struct clk *stm32mp_clk_dt_get_clk(struct dt_pargs *pargs,
void *data __unused, TEE_Result *res)
{
unsigned long clock_id = pargs->args[0];
Expand Down
2 changes: 1 addition & 1 deletion core/drivers/clk/clk-stm32mp15.c
Original file line number Diff line number Diff line change
Expand Up @@ -1499,7 +1499,7 @@ static TEE_Result register_stm32mp1_clocks(void)
return TEE_SUCCESS;
}

static struct clk *stm32mp1_clk_dt_get_clk(struct dt_driver_phandle_args *pargs,
static struct clk *stm32mp1_clk_dt_get_clk(struct dt_pargs *pargs,
void *data __unused, TEE_Result *res)
{
unsigned long clock_id = pargs->args[0];
Expand Down
3 changes: 1 addition & 2 deletions core/drivers/clk/sam/at91_clk.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,7 @@ struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem,
unsigned int nperiph, unsigned int ngck,
unsigned int npck);

struct clk *clk_dt_pmc_get(struct dt_driver_phandle_args *args, void *data,
TEE_Result *res);
struct clk *clk_dt_pmc_get(struct dt_pargs *args, void *data, TEE_Result *res);

struct clk *pmc_clk_get_by_name(struct pmc_clk *clks, unsigned int nclk,
const char *name);
Expand Down
2 changes: 1 addition & 1 deletion core/drivers/clk/sam/at91_pmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ TEE_Result pmc_clk_get(struct pmc_data *pmc, unsigned int type,
return TEE_SUCCESS;
}

struct clk *clk_dt_pmc_get(struct dt_driver_phandle_args *clkspec, void *data,
struct clk *clk_dt_pmc_get(struct dt_pargs *clkspec, void *data,
TEE_Result *res)
{
unsigned int type = clkspec->args[0];
Expand Down
Loading