x1000: Add INIT_ATTR to various target specific functions

Add INIT_ATTR to some low-hanging fruit in the X1000 code:
GPIO init, GPIO initial state tables, clock init, and DMA init.

Change-Id: Ia02b20945da1bbed103e2e01eaf60553eb5f72d4
This commit is contained in:
Aidan MacDonald 2022-12-03 16:17:43 +00:00
parent a980d5f869
commit 484a79fcc0
6 changed files with 19 additions and 20 deletions

View file

@ -22,8 +22,9 @@
#ifndef __CLK_X1000_H__ #ifndef __CLK_X1000_H__
#define __CLK_X1000_H__ #define __CLK_X1000_H__
#include <stdint.h> #include "config.h"
#include "x1000/cpm.h" #include "x1000/cpm.h"
#include <stdint.h>
/* Used as arguments to clk_set_ccr_mux() */ /* Used as arguments to clk_set_ccr_mux() */
#define CLKMUX_SCLK_A(x) jz_orf(CPM_CCR, SEL_SRC_V(x)) #define CLKMUX_SCLK_A(x) jz_orf(CPM_CCR, SEL_SRC_V(x))
@ -67,17 +68,17 @@ extern uint32_t clk_get(x1000_clk_t clk);
extern const char* clk_get_name(x1000_clk_t clk); extern const char* clk_get_name(x1000_clk_t clk);
/* Clock initialization */ /* Clock initialization */
extern void clk_init_early(void); extern void clk_init_early(void) INIT_ATTR;
extern void clk_init(void); extern void clk_init(void) INIT_ATTR;
/* Sets system clock multiplexers */ /* Sets system clock multiplexers */
extern void clk_set_ccr_mux(uint32_t muxbits); extern void clk_set_ccr_mux(uint32_t muxbits) INIT_ATTR;
/* Sets system clock dividers */ /* Sets system clock dividers */
extern void clk_set_ccr_div(uint32_t divbits); extern void clk_set_ccr_div(uint32_t divbits) INIT_ATTR;
/* Sets DDR clock source and divider */ /* Sets DDR clock source and divider */
extern void clk_set_ddr(x1000_clk_t src, uint32_t div); extern void clk_set_ddr(x1000_clk_t src, uint32_t div) INIT_ATTR;
/* Returns the smallest n such that infreq/n <= outfreq */ /* Returns the smallest n such that infreq/n <= outfreq */
static inline uint32_t clk_calc_div(uint32_t infreq, uint32_t outfreq) static inline uint32_t clk_calc_div(uint32_t infreq, uint32_t outfreq)

View file

@ -64,7 +64,7 @@ typedef struct dma_desc dma_desc;
typedef void(*dma_cb_func)(int event); typedef void(*dma_cb_func)(int event);
extern void dma_init(void); extern void dma_init(void) INIT_ATTR;
extern void dma_set_callback(int chn, dma_cb_func cb); extern void dma_set_callback(int chn, dma_cb_func cb);
#endif /* __DMA_X1000_H__ */ #endif /* __DMA_X1000_H__ */

View file

@ -21,7 +21,7 @@
#include "gpio-x1000.h" #include "gpio-x1000.h"
const struct gpio_setting gpio_settings[PIN_COUNT] = { static const struct gpio_setting gpio_settings[PIN_COUNT] INITDATA_ATTR = {
#define DEFINE_GPIO(_name, _gpio, _func) \ #define DEFINE_GPIO(_name, _gpio, _func) \
{.gpio = _gpio, .func = _func}, {.gpio = _gpio, .func = _func},
#define DEFINE_PINGROUP(...) #define DEFINE_PINGROUP(...)
@ -30,7 +30,7 @@ const struct gpio_setting gpio_settings[PIN_COUNT] = {
#undef DEFINE_PINGROUP #undef DEFINE_PINGROUP
}; };
const struct pingroup_setting pingroup_settings[PINGROUP_COUNT] = { static const struct pingroup_setting pingroup_settings[PINGROUP_COUNT] INITDATA_ATTR = {
#define DEFINE_GPIO(...) #define DEFINE_GPIO(...)
#define DEFINE_PINGROUP(_name, _port, _pins, _func) \ #define DEFINE_PINGROUP(_name, _port, _pins, _func) \
{.port = _port, .pins = _pins, .func = _func}, {.port = _port, .pins = _pins, .func = _func},
@ -39,7 +39,8 @@ const struct pingroup_setting pingroup_settings[PINGROUP_COUNT] = {
#undef DEFINE_PINGROUP #undef DEFINE_PINGROUP
}; };
const char* const gpio_names[PIN_COUNT] = { #if 0 /* not needed for the time being */
static const char* const gpio_names[PIN_COUNT] = {
#define DEFINE_GPIO(_name, ...) #_name, #define DEFINE_GPIO(_name, ...) #_name,
#define DEFINE_PINGROUP(...) #define DEFINE_PINGROUP(...)
#include "gpio-target.h" #include "gpio-target.h"
@ -47,13 +48,14 @@ const char* const gpio_names[PIN_COUNT] = {
#undef DEFINE_PINGROUP #undef DEFINE_PINGROUP
}; };
const char* const pingroup_names[PINGROUP_COUNT] = { static const char* const pingroup_names[PINGROUP_COUNT] = {
#define DEFINE_GPIO(...) #define DEFINE_GPIO(...)
#define DEFINE_PINGROUP(_name, ...) #_name, #define DEFINE_PINGROUP(_name, ...) #_name,
#include "gpio-target.h" #include "gpio-target.h"
#undef DEFINE_GPIO #undef DEFINE_GPIO
#undef DEFINE_PINGROUP #undef DEFINE_PINGROUP
}; };
#endif
void gpio_init(void) void gpio_init(void)
{ {

View file

@ -23,6 +23,7 @@
#define __GPIO_X1000_H__ #define __GPIO_X1000_H__
#include "x1000/gpio.h" #include "x1000/gpio.h"
#include "config.h"
/* GPIO port numbers */ /* GPIO port numbers */
#define GPIO_A 0 #define GPIO_A 0
@ -103,16 +104,8 @@ enum {
PINGROUP_COUNT, PINGROUP_COUNT,
}; };
/* arrays which define the target's GPIO settings */
extern const struct gpio_setting gpio_settings[PIN_COUNT];
extern const struct pingroup_setting pingroup_settings[PINGROUP_COUNT];
/* stringified names for use in debug menus */
extern const char* const gpio_names[PIN_COUNT];
extern const char* const pingroup_names[PINGROUP_COUNT];
/* called at early init to set up GPIOs */ /* called at early init to set up GPIOs */
extern void gpio_init(void); extern void gpio_init(void) INIT_ATTR;
/* Use GPIO Z to reconfigure several pins atomically */ /* Use GPIO Z to reconfigure several pins atomically */
extern void gpioz_configure(int port, uint32_t pins, int func); extern void gpioz_configure(int port, uint32_t pins, int func);

View file

@ -97,6 +97,8 @@ extern irq_handler_t system_set_irq_handler(int irq, irq_handler_t handler);
extern void system_enable_irq(int irq); extern void system_enable_irq(int irq);
extern void system_disable_irq(int irq); extern void system_disable_irq(int irq);
extern void system_early_init(void) INIT_ATTR;
/* Simple delay API */ /* Simple delay API */
#define OST_FREQUENCY (X1000_EXCLK_FREQ / 4) #define OST_FREQUENCY (X1000_EXCLK_FREQ / 4)
#define OST_TICKS_PER_US (OST_FREQUENCY / 1000000) #define OST_TICKS_PER_US (OST_FREQUENCY / 1000000)

View file

@ -44,6 +44,7 @@ uint32_t __cpu_idle_reftick = 0;
#endif #endif
/* Prepare the CPU to process interrupts, but don't enable them yet */ /* Prepare the CPU to process interrupts, but don't enable them yet */
static void system_init_irq(void) INIT_ATTR;
static void system_init_irq(void) static void system_init_irq(void)
{ {
/* Mask all interrupts */ /* Mask all interrupts */