File Index
Files and directories
Sign in
FILE

turris-omnia-mcu.h

File preview with syntax highlighting.

linux-6.19.14/drivers/platform/cznic/turris-omnia-mcu.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * CZ.NIC's Turris Omnia MCU driver
  4 *
  5 * 2024 by Marek BehĂșn <kabel@kernel.org>
  6 */
  7
  8#ifndef __TURRIS_OMNIA_MCU_H
  9#define __TURRIS_OMNIA_MCU_H
 10
 11#include <linux/completion.h>
 12#include <linux/gpio/driver.h>
 13#include <linux/hw_random.h>
 14#include <linux/if_ether.h>
 15#include <linux/interrupt.h>
 16#include <linux/mutex.h>
 17#include <linux/types.h>
 18#include <linux/watchdog.h>
 19#include <linux/workqueue.h>
 20
 21enum {
 22	OMNIA_MCU_CRYPTO_PUBLIC_KEY_LEN	= 1 + 32,
 23	OMNIA_MCU_CRYPTO_SIGNATURE_LEN	= 64,
 24};
 25
 26struct i2c_client;
 27struct rtc_device;
 28
 29/**
 30 * struct omnia_mcu - driver private data structure
 31 * @client:			I2C client
 32 * @type:			MCU type (STM32, GD32, MKL, or unknown)
 33 * @features:			bitmap of features supported by the MCU firmware
 34 * @board_serial_number:	board serial number, if stored in MCU
 35 * @board_first_mac:		board first MAC address, if stored in MCU
 36 * @board_revision:		board revision, if stored in MCU
 37 * @gc:				GPIO chip
 38 * @lock:			mutex to protect internal GPIO chip state
 39 * @mask:			bitmap of masked IRQs
 40 * @rising:			bitmap of rising edge IRQs
 41 * @falling:			bitmap of falling edge IRQs
 42 * @both:			bitmap of both edges IRQs
 43 * @cached:			bitmap of cached IRQ line values (when an IRQ line is configured for
 44 *				both edges, we cache the corresponding GPIO values in the IRQ
 45 *				handler)
 46 * @is_cached:			bitmap of which IRQ line values are cached
 47 * @button_release_emul_work:	front button release emulation work, used with old MCU firmware
 48 *				versions which did not send button release events, only button press
 49 *				events
 50 * @last_status:		cached value of the status word, to be compared with new value to
 51 *				determine which interrupt events occurred, used with old MCU
 52 *				firmware versions which only informed that the status word changed,
 53 *				but not which bits of the status word changed
 54 * @button_pressed_emul:	the front button is still emulated to be pressed
 55 * @rtcdev:			RTC device, does not actually count real-time, the device is only
 56 *				used for the RTC alarm mechanism, so that the board can be
 57 *				configured to wake up from poweroff state at a specific time
 58 * @rtc_alarm:			RTC alarm that was set for the board to wake up on, in MCU time
 59 *				(seconds since last MCU reset)
 60 * @front_button_poweron:	the front button should power on the device after it is powered off
 61 * @wdt:			watchdog driver structure
 62 * @trng:			RNG driver structure
 63 * @trng_entropy_ready:		RNG entropy ready completion
 64 * @msg_signed:			message signed completion
 65 * @sign_lock:			mutex to protect message signing state
 66 * @sign_requested:		flag indicating that message signing was requested but not completed
 67 * @sign_err:			message signing error number, filled in interrupt handler
 68 * @signature:			message signing signature, filled in interrupt handler
 69 * @board_public_key:		board public key, if stored in MCU
 70 */
 71struct omnia_mcu {
 72	struct i2c_client *client;
 73	const char *type;
 74	u32 features;
 75
 76	u64 board_serial_number;
 77	u8 board_first_mac[ETH_ALEN];
 78	u8 board_revision;
 79
 80#ifdef CONFIG_TURRIS_OMNIA_MCU_GPIO
 81	struct gpio_chip gc;
 82	struct mutex lock;
 83	unsigned long mask, rising, falling, both, cached, is_cached;
 84	struct delayed_work button_release_emul_work;
 85	unsigned long last_status;
 86	bool button_pressed_emul;
 87#endif
 88
 89#ifdef CONFIG_TURRIS_OMNIA_MCU_SYSOFF_WAKEUP
 90	struct rtc_device *rtcdev;
 91	u32 rtc_alarm;
 92	bool front_button_poweron;
 93#endif
 94
 95#ifdef CONFIG_TURRIS_OMNIA_MCU_WATCHDOG
 96	struct watchdog_device wdt;
 97#endif
 98
 99#ifdef CONFIG_TURRIS_OMNIA_MCU_TRNG
100	struct hwrng trng;
101	struct completion trng_entropy_ready;
102#endif
103
104#ifdef CONFIG_TURRIS_OMNIA_MCU_KEYCTL
105	struct completion msg_signed;
106	struct mutex sign_lock;
107	bool sign_requested;
108	int sign_err;
109	u8 signature[OMNIA_MCU_CRYPTO_SIGNATURE_LEN];
110	u8 board_public_key[OMNIA_MCU_CRYPTO_PUBLIC_KEY_LEN];
111#endif
112};
113
114#ifdef CONFIG_TURRIS_OMNIA_MCU_GPIO
115extern const struct attribute_group omnia_mcu_gpio_group;
116int omnia_mcu_register_gpiochip(struct omnia_mcu *mcu);
117int omnia_mcu_request_irq(struct omnia_mcu *mcu, u32 spec,
118			  irq_handler_t thread_fn, const char *devname);
119#else
120static inline int omnia_mcu_register_gpiochip(struct omnia_mcu *mcu)
121{
122	return 0;
123}
124#endif
125
126#ifdef CONFIG_TURRIS_OMNIA_MCU_KEYCTL
127int omnia_mcu_register_keyctl(struct omnia_mcu *mcu);
128#else
129static inline int omnia_mcu_register_keyctl(struct omnia_mcu *mcu)
130{
131	return 0;
132}
133#endif
134
135#ifdef CONFIG_TURRIS_OMNIA_MCU_SYSOFF_WAKEUP
136extern const struct attribute_group omnia_mcu_poweroff_group;
137int omnia_mcu_register_sys_off_and_wakeup(struct omnia_mcu *mcu);
138#else
139static inline int omnia_mcu_register_sys_off_and_wakeup(struct omnia_mcu *mcu)
140{
141	return 0;
142}
143#endif
144
145#ifdef CONFIG_TURRIS_OMNIA_MCU_TRNG
146int omnia_mcu_register_trng(struct omnia_mcu *mcu);
147#else
148static inline int omnia_mcu_register_trng(struct omnia_mcu *mcu)
149{
150	return 0;
151}
152#endif
153
154#ifdef CONFIG_TURRIS_OMNIA_MCU_WATCHDOG
155int omnia_mcu_register_watchdog(struct omnia_mcu *mcu);
156#else
157static inline int omnia_mcu_register_watchdog(struct omnia_mcu *mcu)
158{
159	return 0;
160}
161#endif
162
163#endif /* __TURRIS_OMNIA_MCU_H */
~/ Read-only file preview.