From 4f16b419e82f51465be2b90b2773f576b832f12f Mon Sep 17 00:00:00 2001 From: Peter Bigot Date: Tue, 12 May 2020 07:14:53 -0500 Subject: [PATCH] device: avoid casting away const from config_info pointer The driver-specific config_info structure referenced from the device structure is marked const. Some drivers fail to preserve that qualifier when casting the pointer to the driver-specific structure, violating MISRA 11.8. Changes produced by scripts/coccinelle/const_config_info.cocci. Some changes proposed by the script are not included because they reveal mutation of state through the const pointer, though the code works as long as the driver-specific object is defined without the const qualifier. Signed-off-by: Peter Bigot --- drivers/adc/adc_stm32.c | 12 ++++++------ drivers/audio/mpxxdtyy.h | 2 +- drivers/counter/counter_gecko_rtcc.c | 2 +- drivers/display/grove_lcd_rgb.c | 8 ++++---- drivers/entropy/entropy_stm32.c | 4 ++-- drivers/ethernet/eth_gecko_priv.h | 2 +- drivers/ethernet/eth_stellaris.c | 2 +- drivers/ethernet/eth_stellaris_priv.h | 2 +- drivers/ethernet/eth_stm32_hal.c | 2 +- drivers/ethernet/eth_stm32_hal_priv.h | 2 +- drivers/ieee802154/ieee802154_nrf5.c | 2 +- drivers/neural_net/intel_gna.c | 4 ++-- drivers/pwm/pwm_dw.c | 6 +++--- drivers/pwm/pwm_led_esp32.c | 4 ++-- drivers/pwm/pwm_nrf5_sw.c | 12 ++++++------ drivers/watchdog/wdt_gecko.c | 2 +- include/drivers/counter.h | 12 ++++++------ tests/lib/devicetree/src/main.c | 2 +- 18 files changed, 41 insertions(+), 41 deletions(-) diff --git a/drivers/adc/adc_stm32.c b/drivers/adc/adc_stm32.c index 000a783f8ce..a5a0602b805 100644 --- a/drivers/adc/adc_stm32.c +++ b/drivers/adc/adc_stm32.c @@ -389,8 +389,8 @@ static void adc_stm32_isr(void *arg) { struct device *dev = (struct device *)arg; struct adc_stm32_data *data = (struct adc_stm32_data *)dev->driver_data; - struct adc_stm32_cfg *config = - (struct adc_stm32_cfg *)dev->config_info; + const struct adc_stm32_cfg *config = + (const struct adc_stm32_cfg *)dev->config_info; ADC_TypeDef *adc = config->base; *data->buffer++ = LL_ADC_REG_ReadConversionData32(adc); @@ -449,8 +449,8 @@ static int adc_stm32_check_acq_time(u16_t acq_time) static void adc_stm32_setup_speed(struct device *dev, u8_t id, u8_t acq_time_index) { - struct adc_stm32_cfg *config = - (struct adc_stm32_cfg *)dev->config_info; + const struct adc_stm32_cfg *config = + (const struct adc_stm32_cfg *)dev->config_info; ADC_TypeDef *adc = config->base; #if defined(CONFIG_SOC_SERIES_STM32F0X) || defined(CONFIG_SOC_SERIES_STM32L0X) @@ -522,8 +522,8 @@ static int adc_stm32_channel_setup(struct device *dev, !defined(CONFIG_SOC_SERIES_STM32L1X) static void adc_stm32_calib(struct device *dev) { - struct adc_stm32_cfg *config = - (struct adc_stm32_cfg *)dev->config_info; + const struct adc_stm32_cfg *config = + (const struct adc_stm32_cfg *)dev->config_info; ADC_TypeDef *adc = config->base; #if defined(CONFIG_SOC_SERIES_STM32F3X) || \ diff --git a/drivers/audio/mpxxdtyy.h b/drivers/audio/mpxxdtyy.h index 11f9632e451..81b3c8c158c 100644 --- a/drivers/audio/mpxxdtyy.h +++ b/drivers/audio/mpxxdtyy.h @@ -20,7 +20,7 @@ extern "C" { #define MPXXDTYY_MAX_PDM_FREQ 3250000 /* 3.25MHz */ #define DEV_CFG(dev) \ - ((struct mpxxdtyy_config *const)(dev)->config_info) + ((const struct mpxxdtyy_config *const)(dev)->config_info) #define DEV_DATA(dev) \ ((struct mpxxdtyy_data *const)(dev)->driver_data) diff --git a/drivers/counter/counter_gecko_rtcc.c b/drivers/counter/counter_gecko_rtcc.c index e41440777a2..820a706d4d8 100644 --- a/drivers/counter/counter_gecko_rtcc.c +++ b/drivers/counter/counter_gecko_rtcc.c @@ -41,7 +41,7 @@ struct counter_gecko_data { #define DEV_NAME(dev) ((dev)->name) #define DEV_CFG(dev) \ - ((struct counter_gecko_config * const)(dev)->config_info) + ((const struct counter_gecko_config * const)(dev)->config_info) #define DEV_DATA(dev) \ ((struct counter_gecko_data *const)(dev)->driver_data) diff --git a/drivers/display/grove_lcd_rgb.c b/drivers/display/grove_lcd_rgb.c index ca79f648449..d1a768deacf 100644 --- a/drivers/display/grove_lcd_rgb.c +++ b/drivers/display/grove_lcd_rgb.c @@ -104,7 +104,7 @@ static inline void sleep(u32_t sleep_in_ms) *******************************************/ void glcd_print(struct device *port, char *data, u32_t size) { - const struct glcd_driver * const rom = (struct glcd_driver *) + const struct glcd_driver * const rom = (const struct glcd_driver *) port->config_info; struct glcd_data *dev = port->driver_data; u8_t buf[] = { GLCD_CMD_SET_CGRAM_ADDR, 0 }; @@ -119,7 +119,7 @@ void glcd_print(struct device *port, char *data, u32_t size) void glcd_cursor_pos_set(struct device *port, u8_t col, u8_t row) { - const struct glcd_driver * const rom = (struct glcd_driver *) + const struct glcd_driver * const rom = (const struct glcd_driver *) port->config_info; struct glcd_data *dev = port->driver_data; @@ -140,7 +140,7 @@ void glcd_cursor_pos_set(struct device *port, u8_t col, u8_t row) void glcd_clear(struct device *port) { - const struct glcd_driver * const rom = (struct glcd_driver *) + const struct glcd_driver * const rom = (const struct glcd_driver *) port->config_info; struct glcd_data *dev = port->driver_data; u8_t clear[] = { 0, GLCD_CMD_SCREEN_CLEAR }; @@ -153,7 +153,7 @@ void glcd_clear(struct device *port) void glcd_display_state_set(struct device *port, u8_t opt) { - const struct glcd_driver * const rom = (struct glcd_driver *) + const struct glcd_driver * const rom = (const struct glcd_driver *) port->config_info; struct glcd_data *dev = port->driver_data; u8_t data[] = { 0, 0 }; diff --git a/drivers/entropy/entropy_stm32.c b/drivers/entropy/entropy_stm32.c index a1516c50b6e..f08f66aa7a2 100644 --- a/drivers/entropy/entropy_stm32.c +++ b/drivers/entropy/entropy_stm32.c @@ -32,7 +32,7 @@ struct entropy_stm32_rng_dev_data { ((struct entropy_stm32_rng_dev_data *)(dev)->driver_data) #define DEV_CFG(dev) \ - ((struct entropy_stm32_rng_dev_cfg *)(dev)->config_info) + ((const struct entropy_stm32_rng_dev_cfg *)(dev)->config_info) static void entropy_stm32_rng_reset(RNG_TypeDef *rng) { @@ -144,7 +144,7 @@ static int entropy_stm32_rng_get_entropy(struct device *dev, u8_t *buffer, static int entropy_stm32_rng_init(struct device *dev) { struct entropy_stm32_rng_dev_data *dev_data; - struct entropy_stm32_rng_dev_cfg *dev_cfg; + const struct entropy_stm32_rng_dev_cfg *dev_cfg; int res; __ASSERT_NO_MSG(dev != NULL); diff --git a/drivers/ethernet/eth_gecko_priv.h b/drivers/ethernet/eth_gecko_priv.h index eb566234ff2..56cea19ba12 100644 --- a/drivers/ethernet/eth_gecko_priv.h +++ b/drivers/ethernet/eth_gecko_priv.h @@ -96,7 +96,7 @@ struct eth_gecko_dev_data { #define DEV_NAME(dev) ((dev)->name) #define DEV_CFG(dev) \ - ((struct eth_gecko_dev_cfg *)(dev)->config_info) + ((const struct eth_gecko_dev_cfg *)(dev)->config_info) #define DEV_DATA(dev) \ ((struct eth_gecko_dev_data *)(dev)->driver_data) diff --git a/drivers/ethernet/eth_stellaris.c b/drivers/ethernet/eth_stellaris.c index dc11d582293..21ce337ad9a 100644 --- a/drivers/ethernet/eth_stellaris.c +++ b/drivers/ethernet/eth_stellaris.c @@ -272,7 +272,7 @@ static void eth_stellaris_isr(void *arg) static void eth_stellaris_init(struct net_if *iface) { struct device *dev = net_if_get_device(iface); - struct eth_stellaris_config *dev_conf = DEV_CFG(dev); + const struct eth_stellaris_config *dev_conf = DEV_CFG(dev); struct eth_stellaris_runtime *dev_data = DEV_DATA(dev); dev_data->iface = iface; diff --git a/drivers/ethernet/eth_stellaris_priv.h b/drivers/ethernet/eth_stellaris_priv.h index 09020d5dbd4..16240d6bbd4 100644 --- a/drivers/ethernet/eth_stellaris_priv.h +++ b/drivers/ethernet/eth_stellaris_priv.h @@ -11,7 +11,7 @@ #define DEV_DATA(dev) \ ((struct eth_stellaris_runtime *)(dev)->driver_data) #define DEV_CFG(dev) \ - ((struct eth_stellaris_config *const)(dev)->config_info) + ((const struct eth_stellaris_config *const)(dev)->config_info) /* * Register mapping */ diff --git a/drivers/ethernet/eth_stm32_hal.c b/drivers/ethernet/eth_stm32_hal.c index 926ce96ded3..1c127e7f341 100644 --- a/drivers/ethernet/eth_stm32_hal.c +++ b/drivers/ethernet/eth_stm32_hal.c @@ -370,7 +370,7 @@ static void generate_mac(u8_t *mac_addr) static int eth_initialize(struct device *dev) { struct eth_stm32_hal_dev_data *dev_data; - struct eth_stm32_hal_dev_cfg *cfg; + const struct eth_stm32_hal_dev_cfg *cfg; ETH_HandleTypeDef *heth; u8_t hal_ret; int ret = 0; diff --git a/drivers/ethernet/eth_stm32_hal_priv.h b/drivers/ethernet/eth_stm32_hal_priv.h index 061bfc32039..ba6605a0b00 100644 --- a/drivers/ethernet/eth_stm32_hal_priv.h +++ b/drivers/ethernet/eth_stm32_hal_priv.h @@ -45,7 +45,7 @@ struct eth_stm32_hal_dev_data { }; #define DEV_CFG(dev) \ - ((struct eth_stm32_hal_dev_cfg *)(dev)->config_info) + ((const struct eth_stm32_hal_dev_cfg *)(dev)->config_info) #define DEV_DATA(dev) \ ((struct eth_stm32_hal_dev_data *)(dev)->driver_data) diff --git a/drivers/ieee802154/ieee802154_nrf5.c b/drivers/ieee802154/ieee802154_nrf5.c index de1c32e1ef9..c2569b1a1f7 100644 --- a/drivers/ieee802154/ieee802154_nrf5.c +++ b/drivers/ieee802154/ieee802154_nrf5.c @@ -58,7 +58,7 @@ static struct nrf5_802154_data nrf5_data; ((struct nrf5_802154_data * const)(dev)->driver_data) #define NRF5_802154_CFG(dev) \ - ((struct nrf5_802154_config * const)(dev)->config_info) + ((const struct nrf5_802154_config * const)(dev)->config_info) static void nrf5_get_eui64(u8_t *mac) { diff --git a/drivers/neural_net/intel_gna.c b/drivers/neural_net/intel_gna.c index 6d25544108d..6c0f8b6d121 100644 --- a/drivers/neural_net/intel_gna.c +++ b/drivers/neural_net/intel_gna.c @@ -26,7 +26,7 @@ LOG_MODULE_REGISTER(neural_net); #define DEV_NAME(dev) ((dev)->name) #define DEV_CFG(dev) \ - ((struct intel_gna_config *const)(dev)->config_info) + ((const struct intel_gna_config *const)(dev)->config_info) #define DEV_DATA(dev) \ ((struct intel_gna_data *const)(dev)->driver_data) @@ -221,7 +221,7 @@ static int intel_gna_initialize(struct device *dev) static int intel_gna_configure(struct device *dev, struct gna_config *cfg) { - struct intel_gna_config *const dev_cfg = DEV_CFG(dev); + const struct intel_gna_config *const dev_cfg = DEV_CFG(dev); struct intel_gna_data *const gna = DEV_DATA(dev); volatile struct intel_gna_regs *regs = gna->regs; diff --git a/drivers/pwm/pwm_dw.c b/drivers/pwm/pwm_dw.c index 31a786b025b..901d878bb6a 100644 --- a/drivers/pwm/pwm_dw.c +++ b/drivers/pwm/pwm_dw.c @@ -73,7 +73,7 @@ struct pwm_dw_config { static inline int pwm_dw_timer_base_addr(struct device *dev, u32_t timer) { const struct pwm_dw_config * const cfg = - (struct pwm_dw_config *)dev->config_info; + (const struct pwm_dw_config *)dev->config_info; return (cfg->addr + (timer * REG_OFFSET)); } @@ -89,7 +89,7 @@ static inline int pwm_dw_timer_base_addr(struct device *dev, u32_t timer) static inline int pwm_dw_timer_ldcnt2_addr(struct device *dev, u32_t timer) { const struct pwm_dw_config * const cfg = - (struct pwm_dw_config *)dev->config_info; + (const struct pwm_dw_config *)dev->config_info; return (cfg->addr + REG_TMR_LOAD_CNT2 + (timer * REG_OFFSET_LOAD_CNT2)); } @@ -144,7 +144,7 @@ static int pwm_dw_pin_set_cycles(struct device *dev, u32_t pulse_cycles, pwm_flags_t flags) { const struct pwm_dw_config * const cfg = - (struct pwm_dw_config *)dev->config_info; + (const struct pwm_dw_config *)dev->config_info; int i; u32_t on, off; diff --git a/drivers/pwm/pwm_led_esp32.c b/drivers/pwm/pwm_led_esp32.c index 76ce61c9992..2070f256b5f 100644 --- a/drivers/pwm/pwm_led_esp32.c +++ b/drivers/pwm/pwm_led_esp32.c @@ -320,7 +320,7 @@ static int pwm_led_esp32_pin_set_cycles(struct device *dev, int timer; int ret; const struct pwm_led_esp32_config * const config = - (struct pwm_led_esp32_config *) dev->config_info; + (const struct pwm_led_esp32_config *) dev->config_info; ARG_UNUSED(period_cycles); @@ -373,7 +373,7 @@ static int pwm_led_esp32_get_cycles_per_sec(struct device *dev, u32_t pwm, int timer; int speed_mode; - config = (struct pwm_led_esp32_config *) dev->config_info; + config = (const struct pwm_led_esp32_config *) dev->config_info; channel = pwm_led_esp32_get_gpio_config(pwm, config->ch_cfg); if (channel < 0) { diff --git a/drivers/pwm/pwm_nrf5_sw.c b/drivers/pwm/pwm_nrf5_sw.c index fd57b76edf1..bc64e21a9c1 100644 --- a/drivers/pwm/pwm_nrf5_sw.c +++ b/drivers/pwm/pwm_nrf5_sw.c @@ -92,7 +92,7 @@ static int pwm_nrf5_sw_pin_set(struct device *dev, u32_t pwm, u32_t period_cycles, u32_t pulse_cycles, pwm_flags_t flags) { - struct pwm_config *config; + const struct pwm_config *config; NRF_TIMER_Type *timer; struct pwm_data *data; u8_t ppi_index; @@ -100,7 +100,7 @@ static int pwm_nrf5_sw_pin_set(struct device *dev, u32_t pwm, u16_t div; u32_t ret; - config = (struct pwm_config *)dev->config_info; + config = (const struct pwm_config *)dev->config_info; timer = config->timer; data = dev->driver_data; @@ -216,9 +216,9 @@ pin_set_pwm_off: static int pwm_nrf5_sw_get_cycles_per_sec(struct device *dev, u32_t pwm, u64_t *cycles) { - struct pwm_config *config; + const struct pwm_config *config; - config = (struct pwm_config *)dev->config_info; + config = (const struct pwm_config *)dev->config_info; /* HF timer frequency is derived from 16MHz source with a prescaler */ *cycles = 16000000UL / BIT(config->prescaler); @@ -233,10 +233,10 @@ static const struct pwm_driver_api pwm_nrf5_sw_drv_api_funcs = { static int pwm_nrf5_sw_init(struct device *dev) { - struct pwm_config *config; + const struct pwm_config *config; NRF_TIMER_Type *timer; - config = (struct pwm_config *)dev->config_info; + config = (const struct pwm_config *)dev->config_info; timer = config->timer; /* setup HF timer */ diff --git a/drivers/watchdog/wdt_gecko.c b/drivers/watchdog/wdt_gecko.c index c7f906b44c8..3266d6e6fe3 100644 --- a/drivers/watchdog/wdt_gecko.c +++ b/drivers/watchdog/wdt_gecko.c @@ -36,7 +36,7 @@ struct wdt_gecko_data { #define DEV_DATA(dev) \ ((struct wdt_gecko_data *)(dev)->driver_data) #define DEV_CFG(dev) \ - ((struct wdt_gecko_cfg *)(dev)->config_info) + ((const struct wdt_gecko_cfg *)(dev)->config_info) static u32_t wdt_gecko_get_timeout_from_persel(int perSel) { diff --git a/include/drivers/counter.h b/include/drivers/counter.h index 0d2fcedb89d..16824a07ae8 100644 --- a/include/drivers/counter.h +++ b/include/drivers/counter.h @@ -211,7 +211,7 @@ __syscall bool counter_is_counting_up(const struct device *dev); static inline bool z_impl_counter_is_counting_up(const struct device *dev) { const struct counter_config_info *config = - (struct counter_config_info *)dev->config_info; + (const struct counter_config_info *)dev->config_info; return config->flags & COUNTER_CONFIG_INFO_COUNT_UP; } @@ -228,7 +228,7 @@ __syscall u8_t counter_get_num_of_channels(const struct device *dev); static inline u8_t z_impl_counter_get_num_of_channels(const struct device *dev) { const struct counter_config_info *config = - (struct counter_config_info *)dev->config_info; + (const struct counter_config_info *)dev->config_info; return config->channels; } @@ -246,7 +246,7 @@ __syscall u32_t counter_get_frequency(const struct device *dev); static inline u32_t z_impl_counter_get_frequency(const struct device *dev) { const struct counter_config_info *config = - (struct counter_config_info *)dev->config_info; + (const struct counter_config_info *)dev->config_info; return config->freq; } @@ -265,7 +265,7 @@ static inline u32_t z_impl_counter_us_to_ticks(const struct device *dev, u64_t us) { const struct counter_config_info *config = - (struct counter_config_info *)dev->config_info; + (const struct counter_config_info *)dev->config_info; u64_t ticks = (us * config->freq) / USEC_PER_SEC; return (ticks > (u64_t)UINT32_MAX) ? UINT32_MAX : ticks; @@ -285,7 +285,7 @@ static inline u64_t z_impl_counter_ticks_to_us(const struct device *dev, u32_t ticks) { const struct counter_config_info *config = - (struct counter_config_info *)dev->config_info; + (const struct counter_config_info *)dev->config_info; return ((u64_t)ticks * USEC_PER_SEC) / config->freq; } @@ -302,7 +302,7 @@ __syscall u32_t counter_get_max_top_value(const struct device *dev); static inline u32_t z_impl_counter_get_max_top_value(const struct device *dev) { const struct counter_config_info *config = - (struct counter_config_info *)dev->config_info; + (const struct counter_config_info *)dev->config_info; return config->max_top_value; } diff --git a/tests/lib/devicetree/src/main.c b/tests/lib/devicetree/src/main.c index 9761544a3b3..deca566b61f 100644 --- a/tests/lib/devicetree/src/main.c +++ b/tests/lib/devicetree/src/main.c @@ -1220,7 +1220,7 @@ static inline struct test_gpio_data *to_data(struct device *dev) static inline const struct test_gpio_info *to_info(struct device *dev) { - return (struct test_gpio_info *)dev->config_info; + return (const struct test_gpio_info *)dev->config_info; } static void test_devices(void)