1 /* SPDX-License-Identifier: GPL-2.0 */
3 * CZ.NIC's Turris Omnia MCU driver
8 #ifndef __TURRIS_OMNIA_MCU_H
9 #define __TURRIS_OMNIA_MCU_H
11 #include <linux/bitops.h>
12 #include <linux/completion.h>
13 #include <linux/gpio/driver.h>
14 #include <linux/hw_random.h>
15 #include <linux/if_ether.h>
16 #include <linux/mutex.h>
17 #include <linux/types.h>
18 #include <linux/watchdog.h>
19 #include <linux/workqueue.h>
20 #include <asm/byteorder.h>
21 #include <asm/unaligned.h>
27 struct i2c_client *client;
31 /* board information */
32 u64 board_serial_number;
33 u8 board_first_mac[ETH_ALEN];
39 unsigned long mask, rising, falling, both, cached, is_cached;
40 /* Old MCU firmware handling needs the following */
41 struct delayed_work button_release_emul_work;
42 unsigned long last_status;
43 bool button_pressed_emul;
45 /* RTC device for configuring wake-up */
46 struct rtc_device *rtcdev;
48 bool front_button_poweron;
51 struct watchdog_device wdt;
53 /* true random number generator */
55 struct completion trng_entropy_ready;
58 int omnia_cmd_write_read(const struct i2c_client *client,
59 void *cmd, unsigned int cmd_len,
60 void *reply, unsigned int reply_len);
62 static inline int omnia_cmd_write(const struct i2c_client *client, void *cmd,
65 return omnia_cmd_write_read(client, cmd, len, NULL, 0);
68 static inline int omnia_cmd_write_u8(const struct i2c_client *client, u8 cmd,
71 u8 buf[2] = { cmd, val };
73 return omnia_cmd_write(client, buf, sizeof(buf));
76 static inline int omnia_cmd_write_u16(const struct i2c_client *client, u8 cmd,
82 put_unaligned_le16(val, &buf[1]);
84 return omnia_cmd_write(client, buf, sizeof(buf));
87 static inline int omnia_cmd_write_u32(const struct i2c_client *client, u8 cmd,
93 put_unaligned_le32(val, &buf[1]);
95 return omnia_cmd_write(client, buf, sizeof(buf));
98 static inline int omnia_cmd_read(const struct i2c_client *client, u8 cmd,
99 void *reply, unsigned int len)
101 return omnia_cmd_write_read(client, &cmd, 1, reply, len);
104 static inline unsigned int
105 omnia_compute_reply_length(unsigned long mask, bool interleaved,
111 return ((__fls(mask) >> 3) << interleaved) + 1 + offset;
114 /* Returns 0 on success */
115 static inline int omnia_cmd_read_bits(const struct i2c_client *client, u8 cmd,
116 unsigned long bits, unsigned long *dst)
126 err = omnia_cmd_read(client, cmd, &reply,
127 omnia_compute_reply_length(bits, false, 0));
131 *dst = le32_to_cpu(reply) & bits;
136 static inline int omnia_cmd_read_bit(const struct i2c_client *client, u8 cmd,
142 err = omnia_cmd_read_bits(client, cmd, bit, &reply);
149 static inline int omnia_cmd_read_u32(const struct i2c_client *client, u8 cmd,
155 err = omnia_cmd_read(client, cmd, &reply, sizeof(reply));
159 *dst = le32_to_cpu(reply);
164 static inline int omnia_cmd_read_u16(const struct i2c_client *client, u8 cmd,
170 err = omnia_cmd_read(client, cmd, &reply, sizeof(reply));
174 *dst = le16_to_cpu(reply);
179 static inline int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd,
182 return omnia_cmd_read(client, cmd, reply, sizeof(*reply));
185 extern const u8 omnia_int_to_gpio_idx[32];
186 extern const struct attribute_group omnia_mcu_gpio_group;
187 extern const struct attribute_group omnia_mcu_poweroff_group;
189 int omnia_mcu_register_gpiochip(struct omnia_mcu *mcu);
190 int omnia_mcu_register_sys_off_and_wakeup(struct omnia_mcu *mcu);
191 int omnia_mcu_register_trng(struct omnia_mcu *mcu);
192 int omnia_mcu_register_watchdog(struct omnia_mcu *mcu);
194 #endif /* __TURRIS_OMNIA_MCU_H */