Skip to content

Commit c093775

Browse files
marcanjannau
authored andcommitted
platform/apple: smc: Add apple_smc_read_f32_scaled
Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent c59a890 commit c093775

2 files changed

Lines changed: 50 additions & 0 deletions

File tree

drivers/platform/apple/smc_core.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* Copyright The Asahi Linux Contributors
55
*/
66

7+
#include <linux/bitfield.h>
78
#include <linux/device.h>
89
#include <linux/mfd/core.h>
910
#include <linux/mutex.h>
@@ -98,6 +99,53 @@ int apple_smc_rw(struct apple_smc *smc, smc_key key, void *wbuf, size_t wsize,
9899
}
99100
EXPORT_SYMBOL(apple_smc_rw);
100101

102+
int apple_smc_read_f32_scaled(struct apple_smc *smc, smc_key key, int *p, int scale)
103+
{
104+
u32 fval;
105+
u64 val;
106+
int ret, exp;
107+
108+
ret = apple_smc_read_u32(smc, key, &fval);
109+
if (ret < 0)
110+
return ret;
111+
112+
val = ((u64)((fval & GENMASK(22, 0)) | BIT(23)));
113+
exp = ((fval >> 23) & 0xff) - 127 - 23;
114+
if (scale < 0) {
115+
val <<= 32;
116+
exp -= 32;
117+
val /= -scale;
118+
} else {
119+
val *= scale;
120+
}
121+
122+
if (exp > 63)
123+
val = U64_MAX;
124+
else if (exp < -63)
125+
val = 0;
126+
else if (exp < 0)
127+
val >>= -exp;
128+
else if (exp != 0 && (val & ~((1UL << (64 - exp)) - 1))) /* overflow */
129+
val = U64_MAX;
130+
else
131+
val <<= exp;
132+
133+
if (fval & BIT(31)) {
134+
if (val > (-(s64)INT_MIN))
135+
*p = INT_MIN;
136+
else
137+
*p = -val;
138+
} else {
139+
if (val > INT_MAX)
140+
*p = INT_MAX;
141+
else
142+
*p = val;
143+
}
144+
145+
return ret;
146+
}
147+
EXPORT_SYMBOL(apple_smc_read_f32_scaled);
148+
101149
int apple_smc_get_key_by_index(struct apple_smc *smc, int index, smc_key *key)
102150
{
103151
int ret;

include/linux/mfd/macsmc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ static inline int apple_smc_read_flag(struct apple_smc *smc, smc_key key)
8282
}
8383
#define apple_smc_write_flag apple_smc_write_u8
8484

85+
int apple_smc_read_f32_scaled(struct apple_smc *smc, smc_key key, int *p, int scale);
86+
8587
int apple_smc_register_notifier(struct apple_smc *smc, struct notifier_block *n);
8688
int apple_smc_unregister_notifier(struct apple_smc *smc, struct notifier_block *n);
8789

0 commit comments

Comments
 (0)