Skip to content

Commit ca16ba0

Browse files
committed
platform/apple: smc: Add apple_smc_write_f32_scaled
Signed-off-by: Janne Grunau <j@jannau.net>
1 parent 4bf83d9 commit ca16ba0

2 files changed

Lines changed: 42 additions & 0 deletions

File tree

drivers/platform/apple/smc_core.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,47 @@ int apple_smc_read_f32_scaled(struct apple_smc *smc, smc_key key, int *p, int sc
149149
}
150150
EXPORT_SYMBOL(apple_smc_read_f32_scaled);
151151

152+
#define FLT_SIGN_MASK BIT(31)
153+
#define FLT_EXP_MASK GENMASK(30, 23)
154+
#define FLT_MANT_MASK GENMASK(22, 0)
155+
#define FLT_EXP_BIAS 127
156+
157+
int apple_smc_write_f32_scaled(struct apple_smc *smc, smc_key key, int value,
158+
int scale)
159+
{
160+
u64 val;
161+
u32 fval = 0;
162+
int exp = 0, neg;
163+
164+
val = abs(value);
165+
neg = val != value;
166+
167+
if (scale > 1) {
168+
val <<= 32;
169+
exp = 32;
170+
val /= scale;
171+
} else if (scale < 1)
172+
val *= -scale;
173+
174+
if (val) {
175+
int msb = __fls(val) - exp;
176+
if (msb > 23) {
177+
val >>= msb - 23;
178+
exp -= msb - 23;
179+
} else if (msb < 23) {
180+
val <<= 23 - msb;
181+
exp += msb;
182+
}
183+
184+
fval = FIELD_PREP(FLT_SIGN_MASK, neg) |
185+
FIELD_PREP(FLT_EXP_MASK, exp + FLT_EXP_BIAS) |
186+
FIELD_PREP(FLT_MANT_MASK, val);
187+
}
188+
189+
return apple_smc_write_u32(smc, key, fval);
190+
}
191+
EXPORT_SYMBOL(apple_smc_write_f32_scaled);
192+
152193
/*
153194
* ioft is a 48.16 fixed point type
154195
*/

include/linux/mfd/macsmc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ static inline int apple_smc_read_flag(struct apple_smc *smc, smc_key key)
8383
#define apple_smc_write_flag apple_smc_write_u8
8484

8585
int apple_smc_read_f32_scaled(struct apple_smc *smc, smc_key key, int *p, int scale);
86+
int apple_smc_write_f32_scaled(struct apple_smc *smc, smc_key key, int p, int scale);
8687
int apple_smc_read_ioft_scaled(struct apple_smc *smc, smc_key key, u64 *p, int scale);
8788

8889
int apple_smc_register_notifier(struct apple_smc *smc, struct notifier_block *n);

0 commit comments

Comments
 (0)