turris-omnia-mcu-interface.h: Move command execution function to global header

Move the command execution functions from the turris-omnia-mcu platform
driver private header to the global turris-omnia-mcu-interface.h header,
so that they can be used by the LED driver.

Signed-off-by: Marek Behún <kabel@kernel.org>
Link: https://lore.kernel.org/r/20241111100355.6978-2-kabel@kernel.org
Signed-off-by: Lee Jones <lee@kernel.org>
This commit is contained in:
Marek Behún 2024-11-11 11:03:45 +01:00 committed by Lee Jones
parent a1234b2155
commit 082e8f6db9
3 changed files with 136 additions and 131 deletions

View File

@ -52,6 +52,7 @@ int omnia_cmd_write_read(const struct i2c_client *client,
return 0;
}
EXPORT_SYMBOL_GPL(omnia_cmd_write_read);
static int omnia_get_version_hash(struct omnia_mcu *mcu, bool bootloader,
char version[static OMNIA_FW_VERSION_HEX_LEN])

View File

@ -8,7 +8,6 @@
#ifndef __TURRIS_OMNIA_MCU_H
#define __TURRIS_OMNIA_MCU_H
#include <linux/bitops.h>
#include <linux/completion.h>
#include <linux/gpio/driver.h>
#include <linux/hw_random.h>
@ -17,8 +16,6 @@
#include <linux/types.h>
#include <linux/watchdog.h>
#include <linux/workqueue.h>
#include <asm/byteorder.h>
#include <linux/unaligned.h>
struct i2c_client;
struct rtc_device;
@ -93,133 +90,6 @@ struct omnia_mcu {
#endif
};
int omnia_cmd_write_read(const struct i2c_client *client,
void *cmd, unsigned int cmd_len,
void *reply, unsigned int reply_len);
static inline int omnia_cmd_write(const struct i2c_client *client, void *cmd,
unsigned int len)
{
return omnia_cmd_write_read(client, cmd, len, NULL, 0);
}
static inline int omnia_cmd_write_u8(const struct i2c_client *client, u8 cmd,
u8 val)
{
u8 buf[2] = { cmd, val };
return omnia_cmd_write(client, buf, sizeof(buf));
}
static inline int omnia_cmd_write_u16(const struct i2c_client *client, u8 cmd,
u16 val)
{
u8 buf[3];
buf[0] = cmd;
put_unaligned_le16(val, &buf[1]);
return omnia_cmd_write(client, buf, sizeof(buf));
}
static inline int omnia_cmd_write_u32(const struct i2c_client *client, u8 cmd,
u32 val)
{
u8 buf[5];
buf[0] = cmd;
put_unaligned_le32(val, &buf[1]);
return omnia_cmd_write(client, buf, sizeof(buf));
}
static inline int omnia_cmd_read(const struct i2c_client *client, u8 cmd,
void *reply, unsigned int len)
{
return omnia_cmd_write_read(client, &cmd, 1, reply, len);
}
static inline unsigned int
omnia_compute_reply_length(unsigned long mask, bool interleaved,
unsigned int offset)
{
if (!mask)
return 0;
return ((__fls(mask) >> 3) << interleaved) + 1 + offset;
}
/* Returns 0 on success */
static inline int omnia_cmd_read_bits(const struct i2c_client *client, u8 cmd,
unsigned long bits, unsigned long *dst)
{
__le32 reply;
int err;
if (!bits) {
*dst = 0;
return 0;
}
err = omnia_cmd_read(client, cmd, &reply,
omnia_compute_reply_length(bits, false, 0));
if (err)
return err;
*dst = le32_to_cpu(reply) & bits;
return 0;
}
static inline int omnia_cmd_read_bit(const struct i2c_client *client, u8 cmd,
unsigned long bit)
{
unsigned long reply;
int err;
err = omnia_cmd_read_bits(client, cmd, bit, &reply);
if (err)
return err;
return !!reply;
}
static inline int omnia_cmd_read_u32(const struct i2c_client *client, u8 cmd,
u32 *dst)
{
__le32 reply;
int err;
err = omnia_cmd_read(client, cmd, &reply, sizeof(reply));
if (err)
return err;
*dst = le32_to_cpu(reply);
return 0;
}
static inline int omnia_cmd_read_u16(const struct i2c_client *client, u8 cmd,
u16 *dst)
{
__le16 reply;
int err;
err = omnia_cmd_read(client, cmd, &reply, sizeof(reply));
if (err)
return err;
*dst = le16_to_cpu(reply);
return 0;
}
static inline int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd,
u8 *reply)
{
return omnia_cmd_read(client, cmd, reply, sizeof(*reply));
}
#ifdef CONFIG_TURRIS_OMNIA_MCU_GPIO
extern const u8 omnia_int_to_gpio_idx[32];
extern const struct attribute_group omnia_mcu_gpio_group;

View File

@ -9,7 +9,10 @@
#define __TURRIS_OMNIA_MCU_INTERFACE_H
#include <linux/bitfield.h>
#include <linux/bits.h>
#include <linux/bitops.h>
#include <linux/types.h>
#include <linux/unaligned.h>
#include <asm/byteorder.h>
enum omnia_commands_e {
OMNIA_CMD_GET_STATUS_WORD = 0x01, /* slave sends status word back */
@ -246,4 +249,135 @@ enum omnia_cmd_usb_ovc_prot_e {
OMNIA_CMD_xET_USB_OVC_PROT_ENABLE = BIT(4),
};
/* Command execution functions */
struct i2c_client;
int omnia_cmd_write_read(const struct i2c_client *client,
void *cmd, unsigned int cmd_len,
void *reply, unsigned int reply_len);
static inline int omnia_cmd_write(const struct i2c_client *client, void *cmd,
unsigned int len)
{
return omnia_cmd_write_read(client, cmd, len, NULL, 0);
}
static inline int omnia_cmd_write_u8(const struct i2c_client *client, u8 cmd,
u8 val)
{
u8 buf[2] = { cmd, val };
return omnia_cmd_write(client, buf, sizeof(buf));
}
static inline int omnia_cmd_write_u16(const struct i2c_client *client, u8 cmd,
u16 val)
{
u8 buf[3];
buf[0] = cmd;
put_unaligned_le16(val, &buf[1]);
return omnia_cmd_write(client, buf, sizeof(buf));
}
static inline int omnia_cmd_write_u32(const struct i2c_client *client, u8 cmd,
u32 val)
{
u8 buf[5];
buf[0] = cmd;
put_unaligned_le32(val, &buf[1]);
return omnia_cmd_write(client, buf, sizeof(buf));
}
static inline int omnia_cmd_read(const struct i2c_client *client, u8 cmd,
void *reply, unsigned int len)
{
return omnia_cmd_write_read(client, &cmd, 1, reply, len);
}
static inline unsigned int
omnia_compute_reply_length(unsigned long mask, bool interleaved,
unsigned int offset)
{
if (!mask)
return 0;
return ((__fls(mask) >> 3) << interleaved) + 1 + offset;
}
/* Returns 0 on success */
static inline int omnia_cmd_read_bits(const struct i2c_client *client, u8 cmd,
unsigned long bits, unsigned long *dst)
{
__le32 reply;
int err;
if (!bits) {
*dst = 0;
return 0;
}
err = omnia_cmd_read(client, cmd, &reply,
omnia_compute_reply_length(bits, false, 0));
if (err)
return err;
*dst = le32_to_cpu(reply) & bits;
return 0;
}
static inline int omnia_cmd_read_bit(const struct i2c_client *client, u8 cmd,
unsigned long bit)
{
unsigned long reply;
int err;
err = omnia_cmd_read_bits(client, cmd, bit, &reply);
if (err)
return err;
return !!reply;
}
static inline int omnia_cmd_read_u32(const struct i2c_client *client, u8 cmd,
u32 *dst)
{
__le32 reply;
int err;
err = omnia_cmd_read(client, cmd, &reply, sizeof(reply));
if (err)
return err;
*dst = le32_to_cpu(reply);
return 0;
}
static inline int omnia_cmd_read_u16(const struct i2c_client *client, u8 cmd,
u16 *dst)
{
__le16 reply;
int err;
err = omnia_cmd_read(client, cmd, &reply, sizeof(reply));
if (err)
return err;
*dst = le16_to_cpu(reply);
return 0;
}
static inline int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd,
u8 *reply)
{
return omnia_cmd_read(client, cmd, reply, sizeof(*reply));
}
#endif /* __TURRIS_OMNIA_MCU_INTERFACE_H */