mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
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:
parent
a1234b2155
commit
082e8f6db9
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user