Skip to content

Commit 082e8f6

Browse files
elkablolag-linaro
authored andcommitted
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>
1 parent a1234b2 commit 082e8f6

File tree

3 files changed

+136
-131
lines changed

3 files changed

+136
-131
lines changed

drivers/platform/cznic/turris-omnia-mcu-base.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ int omnia_cmd_write_read(const struct i2c_client *client,
5252

5353
return 0;
5454
}
55+
EXPORT_SYMBOL_GPL(omnia_cmd_write_read);
5556

5657
static int omnia_get_version_hash(struct omnia_mcu *mcu, bool bootloader,
5758
char version[static OMNIA_FW_VERSION_HEX_LEN])

drivers/platform/cznic/turris-omnia-mcu.h

Lines changed: 0 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#ifndef __TURRIS_OMNIA_MCU_H
99
#define __TURRIS_OMNIA_MCU_H
1010

11-
#include <linux/bitops.h>
1211
#include <linux/completion.h>
1312
#include <linux/gpio/driver.h>
1413
#include <linux/hw_random.h>
@@ -17,8 +16,6 @@
1716
#include <linux/types.h>
1817
#include <linux/watchdog.h>
1918
#include <linux/workqueue.h>
20-
#include <asm/byteorder.h>
21-
#include <linux/unaligned.h>
2219

2320
struct i2c_client;
2421
struct rtc_device;
@@ -93,133 +90,6 @@ struct omnia_mcu {
9390
#endif
9491
};
9592

96-
int omnia_cmd_write_read(const struct i2c_client *client,
97-
void *cmd, unsigned int cmd_len,
98-
void *reply, unsigned int reply_len);
99-
100-
static inline int omnia_cmd_write(const struct i2c_client *client, void *cmd,
101-
unsigned int len)
102-
{
103-
return omnia_cmd_write_read(client, cmd, len, NULL, 0);
104-
}
105-
106-
static inline int omnia_cmd_write_u8(const struct i2c_client *client, u8 cmd,
107-
u8 val)
108-
{
109-
u8 buf[2] = { cmd, val };
110-
111-
return omnia_cmd_write(client, buf, sizeof(buf));
112-
}
113-
114-
static inline int omnia_cmd_write_u16(const struct i2c_client *client, u8 cmd,
115-
u16 val)
116-
{
117-
u8 buf[3];
118-
119-
buf[0] = cmd;
120-
put_unaligned_le16(val, &buf[1]);
121-
122-
return omnia_cmd_write(client, buf, sizeof(buf));
123-
}
124-
125-
static inline int omnia_cmd_write_u32(const struct i2c_client *client, u8 cmd,
126-
u32 val)
127-
{
128-
u8 buf[5];
129-
130-
buf[0] = cmd;
131-
put_unaligned_le32(val, &buf[1]);
132-
133-
return omnia_cmd_write(client, buf, sizeof(buf));
134-
}
135-
136-
static inline int omnia_cmd_read(const struct i2c_client *client, u8 cmd,
137-
void *reply, unsigned int len)
138-
{
139-
return omnia_cmd_write_read(client, &cmd, 1, reply, len);
140-
}
141-
142-
static inline unsigned int
143-
omnia_compute_reply_length(unsigned long mask, bool interleaved,
144-
unsigned int offset)
145-
{
146-
if (!mask)
147-
return 0;
148-
149-
return ((__fls(mask) >> 3) << interleaved) + 1 + offset;
150-
}
151-
152-
/* Returns 0 on success */
153-
static inline int omnia_cmd_read_bits(const struct i2c_client *client, u8 cmd,
154-
unsigned long bits, unsigned long *dst)
155-
{
156-
__le32 reply;
157-
int err;
158-
159-
if (!bits) {
160-
*dst = 0;
161-
return 0;
162-
}
163-
164-
err = omnia_cmd_read(client, cmd, &reply,
165-
omnia_compute_reply_length(bits, false, 0));
166-
if (err)
167-
return err;
168-
169-
*dst = le32_to_cpu(reply) & bits;
170-
171-
return 0;
172-
}
173-
174-
static inline int omnia_cmd_read_bit(const struct i2c_client *client, u8 cmd,
175-
unsigned long bit)
176-
{
177-
unsigned long reply;
178-
int err;
179-
180-
err = omnia_cmd_read_bits(client, cmd, bit, &reply);
181-
if (err)
182-
return err;
183-
184-
return !!reply;
185-
}
186-
187-
static inline int omnia_cmd_read_u32(const struct i2c_client *client, u8 cmd,
188-
u32 *dst)
189-
{
190-
__le32 reply;
191-
int err;
192-
193-
err = omnia_cmd_read(client, cmd, &reply, sizeof(reply));
194-
if (err)
195-
return err;
196-
197-
*dst = le32_to_cpu(reply);
198-
199-
return 0;
200-
}
201-
202-
static inline int omnia_cmd_read_u16(const struct i2c_client *client, u8 cmd,
203-
u16 *dst)
204-
{
205-
__le16 reply;
206-
int err;
207-
208-
err = omnia_cmd_read(client, cmd, &reply, sizeof(reply));
209-
if (err)
210-
return err;
211-
212-
*dst = le16_to_cpu(reply);
213-
214-
return 0;
215-
}
216-
217-
static inline int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd,
218-
u8 *reply)
219-
{
220-
return omnia_cmd_read(client, cmd, reply, sizeof(*reply));
221-
}
222-
22393
#ifdef CONFIG_TURRIS_OMNIA_MCU_GPIO
22494
extern const u8 omnia_int_to_gpio_idx[32];
22595
extern const struct attribute_group omnia_mcu_gpio_group;

include/linux/turris-omnia-mcu-interface.h

Lines changed: 135 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
#define __TURRIS_OMNIA_MCU_INTERFACE_H
1010

1111
#include <linux/bitfield.h>
12-
#include <linux/bits.h>
12+
#include <linux/bitops.h>
13+
#include <linux/types.h>
14+
#include <linux/unaligned.h>
15+
#include <asm/byteorder.h>
1316

1417
enum omnia_commands_e {
1518
OMNIA_CMD_GET_STATUS_WORD = 0x01, /* slave sends status word back */
@@ -246,4 +249,135 @@ enum omnia_cmd_usb_ovc_prot_e {
246249
OMNIA_CMD_xET_USB_OVC_PROT_ENABLE = BIT(4),
247250
};
248251

252+
/* Command execution functions */
253+
254+
struct i2c_client;
255+
256+
int omnia_cmd_write_read(const struct i2c_client *client,
257+
void *cmd, unsigned int cmd_len,
258+
void *reply, unsigned int reply_len);
259+
260+
static inline int omnia_cmd_write(const struct i2c_client *client, void *cmd,
261+
unsigned int len)
262+
{
263+
return omnia_cmd_write_read(client, cmd, len, NULL, 0);
264+
}
265+
266+
static inline int omnia_cmd_write_u8(const struct i2c_client *client, u8 cmd,
267+
u8 val)
268+
{
269+
u8 buf[2] = { cmd, val };
270+
271+
return omnia_cmd_write(client, buf, sizeof(buf));
272+
}
273+
274+
static inline int omnia_cmd_write_u16(const struct i2c_client *client, u8 cmd,
275+
u16 val)
276+
{
277+
u8 buf[3];
278+
279+
buf[0] = cmd;
280+
put_unaligned_le16(val, &buf[1]);
281+
282+
return omnia_cmd_write(client, buf, sizeof(buf));
283+
}
284+
285+
static inline int omnia_cmd_write_u32(const struct i2c_client *client, u8 cmd,
286+
u32 val)
287+
{
288+
u8 buf[5];
289+
290+
buf[0] = cmd;
291+
put_unaligned_le32(val, &buf[1]);
292+
293+
return omnia_cmd_write(client, buf, sizeof(buf));
294+
}
295+
296+
static inline int omnia_cmd_read(const struct i2c_client *client, u8 cmd,
297+
void *reply, unsigned int len)
298+
{
299+
return omnia_cmd_write_read(client, &cmd, 1, reply, len);
300+
}
301+
302+
static inline unsigned int
303+
omnia_compute_reply_length(unsigned long mask, bool interleaved,
304+
unsigned int offset)
305+
{
306+
if (!mask)
307+
return 0;
308+
309+
return ((__fls(mask) >> 3) << interleaved) + 1 + offset;
310+
}
311+
312+
/* Returns 0 on success */
313+
static inline int omnia_cmd_read_bits(const struct i2c_client *client, u8 cmd,
314+
unsigned long bits, unsigned long *dst)
315+
{
316+
__le32 reply;
317+
int err;
318+
319+
if (!bits) {
320+
*dst = 0;
321+
return 0;
322+
}
323+
324+
err = omnia_cmd_read(client, cmd, &reply,
325+
omnia_compute_reply_length(bits, false, 0));
326+
if (err)
327+
return err;
328+
329+
*dst = le32_to_cpu(reply) & bits;
330+
331+
return 0;
332+
}
333+
334+
static inline int omnia_cmd_read_bit(const struct i2c_client *client, u8 cmd,
335+
unsigned long bit)
336+
{
337+
unsigned long reply;
338+
int err;
339+
340+
err = omnia_cmd_read_bits(client, cmd, bit, &reply);
341+
if (err)
342+
return err;
343+
344+
return !!reply;
345+
}
346+
347+
static inline int omnia_cmd_read_u32(const struct i2c_client *client, u8 cmd,
348+
u32 *dst)
349+
{
350+
__le32 reply;
351+
int err;
352+
353+
err = omnia_cmd_read(client, cmd, &reply, sizeof(reply));
354+
if (err)
355+
return err;
356+
357+
*dst = le32_to_cpu(reply);
358+
359+
return 0;
360+
}
361+
362+
static inline int omnia_cmd_read_u16(const struct i2c_client *client, u8 cmd,
363+
u16 *dst)
364+
{
365+
__le16 reply;
366+
int err;
367+
368+
err = omnia_cmd_read(client, cmd, &reply, sizeof(reply));
369+
if (err)
370+
return err;
371+
372+
*dst = le16_to_cpu(reply);
373+
374+
return 0;
375+
}
376+
377+
static inline int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd,
378+
u8 *reply)
379+
{
380+
return omnia_cmd_read(client, cmd, reply, sizeof(*reply));
381+
}
382+
249383
#endif /* __TURRIS_OMNIA_MCU_INTERFACE_H */

0 commit comments

Comments
 (0)