Fix double fget() in vhost_net_set_backend()
[linux-2.6-microblaze.git] / drivers / hwmon / dell-smm-hwmon.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * dell-smm-hwmon.c -- Linux driver for accessing the SMM BIOS on Dell laptops.
4  *
5  * Copyright (C) 2001  Massimo Dal Zotto <dz@debian.org>
6  *
7  * Hwmon integration:
8  * Copyright (C) 2011  Jean Delvare <jdelvare@suse.de>
9  * Copyright (C) 2013, 2014  Guenter Roeck <linux@roeck-us.net>
10  * Copyright (C) 2014, 2015  Pali Rohár <pali@kernel.org>
11  */
12
13 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14
15 #include <linux/capability.h>
16 #include <linux/cpu.h>
17 #include <linux/ctype.h>
18 #include <linux/delay.h>
19 #include <linux/dmi.h>
20 #include <linux/err.h>
21 #include <linux/errno.h>
22 #include <linux/hwmon.h>
23 #include <linux/init.h>
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/mutex.h>
27 #include <linux/platform_device.h>
28 #include <linux/proc_fs.h>
29 #include <linux/seq_file.h>
30 #include <linux/string.h>
31 #include <linux/smp.h>
32 #include <linux/types.h>
33 #include <linux/uaccess.h>
34
35 #include <linux/i8k.h>
36
37 #define I8K_SMM_FN_STATUS       0x0025
38 #define I8K_SMM_POWER_STATUS    0x0069
39 #define I8K_SMM_SET_FAN         0x01a3
40 #define I8K_SMM_GET_FAN         0x00a3
41 #define I8K_SMM_GET_SPEED       0x02a3
42 #define I8K_SMM_GET_FAN_TYPE    0x03a3
43 #define I8K_SMM_GET_NOM_SPEED   0x04a3
44 #define I8K_SMM_GET_TEMP        0x10a3
45 #define I8K_SMM_GET_TEMP_TYPE   0x11a3
46 #define I8K_SMM_GET_DELL_SIG1   0xfea3
47 #define I8K_SMM_GET_DELL_SIG2   0xffa3
48
49 #define I8K_FAN_MULT            30
50 #define I8K_FAN_MAX_RPM         30000
51 #define I8K_MAX_TEMP            127
52
53 #define I8K_FN_NONE             0x00
54 #define I8K_FN_UP               0x01
55 #define I8K_FN_DOWN             0x02
56 #define I8K_FN_MUTE             0x04
57 #define I8K_FN_MASK             0x07
58 #define I8K_FN_SHIFT            8
59
60 #define I8K_POWER_AC            0x05
61 #define I8K_POWER_BATTERY       0x01
62
63 #define DELL_SMM_NO_TEMP        10
64 #define DELL_SMM_NO_FANS        3
65
66 struct dell_smm_data {
67         struct mutex i8k_mutex; /* lock for sensors writes */
68         char bios_version[4];
69         char bios_machineid[16];
70         uint i8k_fan_mult;
71         uint i8k_pwm_mult;
72         uint i8k_fan_max;
73         bool disallow_fan_type_call;
74         bool disallow_fan_support;
75         unsigned int manual_fan;
76         unsigned int auto_fan;
77         int temp_type[DELL_SMM_NO_TEMP];
78         bool fan[DELL_SMM_NO_FANS];
79         int fan_type[DELL_SMM_NO_FANS];
80         int *fan_nominal_speed[DELL_SMM_NO_FANS];
81 };
82
83 MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)");
84 MODULE_AUTHOR("Pali Rohár <pali@kernel.org>");
85 MODULE_DESCRIPTION("Dell laptop SMM BIOS hwmon driver");
86 MODULE_LICENSE("GPL");
87 MODULE_ALIAS("i8k");
88
89 static bool force;
90 module_param_unsafe(force, bool, 0);
91 MODULE_PARM_DESC(force, "Force loading without checking for supported models and features");
92
93 static bool ignore_dmi;
94 module_param(ignore_dmi, bool, 0);
95 MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match");
96
97 #if IS_ENABLED(CONFIG_I8K)
98 static bool restricted = true;
99 module_param(restricted, bool, 0);
100 MODULE_PARM_DESC(restricted, "Restrict fan control and serial number to CAP_SYS_ADMIN (default: 1)");
101
102 static bool power_status;
103 module_param(power_status, bool, 0600);
104 MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k (default: 0)");
105 #endif
106
107 static uint fan_mult;
108 module_param(fan_mult, uint, 0);
109 MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with (default: autodetect)");
110
111 static uint fan_max;
112 module_param(fan_max, uint, 0);
113 MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)");
114
115 struct smm_regs {
116         unsigned int eax;
117         unsigned int ebx;
118         unsigned int ecx;
119         unsigned int edx;
120         unsigned int esi;
121         unsigned int edi;
122 } __packed;
123
124 static const char * const temp_labels[] = {
125         "CPU",
126         "GPU",
127         "SODIMM",
128         "Other",
129         "Ambient",
130         "Other",
131 };
132
133 static const char * const fan_labels[] = {
134         "Processor Fan",
135         "Motherboard Fan",
136         "Video Fan",
137         "Power Supply Fan",
138         "Chipset Fan",
139         "Other Fan",
140 };
141
142 static const char * const docking_labels[] = {
143         "Docking Processor Fan",
144         "Docking Motherboard Fan",
145         "Docking Video Fan",
146         "Docking Power Supply Fan",
147         "Docking Chipset Fan",
148         "Docking Other Fan",
149 };
150
151 static inline const char __init *i8k_get_dmi_data(int field)
152 {
153         const char *dmi_data = dmi_get_system_info(field);
154
155         return dmi_data && *dmi_data ? dmi_data : "?";
156 }
157
158 /*
159  * Call the System Management Mode BIOS. Code provided by Jonathan Buzzard.
160  */
161 static int i8k_smm_func(void *par)
162 {
163         ktime_t calltime = ktime_get();
164         struct smm_regs *regs = par;
165         int eax = regs->eax;
166         int ebx = regs->ebx;
167         long long duration;
168         int rc;
169
170         /* SMM requires CPU 0 */
171         if (smp_processor_id() != 0)
172                 return -EBUSY;
173
174 #if defined(CONFIG_X86_64)
175         asm volatile("pushq %%rax\n\t"
176                 "movl 0(%%rax),%%edx\n\t"
177                 "pushq %%rdx\n\t"
178                 "movl 4(%%rax),%%ebx\n\t"
179                 "movl 8(%%rax),%%ecx\n\t"
180                 "movl 12(%%rax),%%edx\n\t"
181                 "movl 16(%%rax),%%esi\n\t"
182                 "movl 20(%%rax),%%edi\n\t"
183                 "popq %%rax\n\t"
184                 "out %%al,$0xb2\n\t"
185                 "out %%al,$0x84\n\t"
186                 "xchgq %%rax,(%%rsp)\n\t"
187                 "movl %%ebx,4(%%rax)\n\t"
188                 "movl %%ecx,8(%%rax)\n\t"
189                 "movl %%edx,12(%%rax)\n\t"
190                 "movl %%esi,16(%%rax)\n\t"
191                 "movl %%edi,20(%%rax)\n\t"
192                 "popq %%rdx\n\t"
193                 "movl %%edx,0(%%rax)\n\t"
194                 "pushfq\n\t"
195                 "popq %%rax\n\t"
196                 "andl $1,%%eax\n"
197                 : "=a"(rc)
198                 :    "a"(regs)
199                 :    "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
200 #else
201         asm volatile("pushl %%eax\n\t"
202             "movl 0(%%eax),%%edx\n\t"
203             "push %%edx\n\t"
204             "movl 4(%%eax),%%ebx\n\t"
205             "movl 8(%%eax),%%ecx\n\t"
206             "movl 12(%%eax),%%edx\n\t"
207             "movl 16(%%eax),%%esi\n\t"
208             "movl 20(%%eax),%%edi\n\t"
209             "popl %%eax\n\t"
210             "out %%al,$0xb2\n\t"
211             "out %%al,$0x84\n\t"
212             "xchgl %%eax,(%%esp)\n\t"
213             "movl %%ebx,4(%%eax)\n\t"
214             "movl %%ecx,8(%%eax)\n\t"
215             "movl %%edx,12(%%eax)\n\t"
216             "movl %%esi,16(%%eax)\n\t"
217             "movl %%edi,20(%%eax)\n\t"
218             "popl %%edx\n\t"
219             "movl %%edx,0(%%eax)\n\t"
220             "lahf\n\t"
221             "shrl $8,%%eax\n\t"
222             "andl $1,%%eax\n"
223             : "=a"(rc)
224             :    "a"(regs)
225             :    "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
226 #endif
227         if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax)
228                 rc = -EINVAL;
229
230         duration = ktime_us_delta(ktime_get(), calltime);
231         pr_debug("smm(0x%.4x 0x%.4x) = 0x%.4x  (took %7lld usecs)\n", eax, ebx,
232                  (rc ? 0xffff : regs->eax & 0xffff), duration);
233
234         return rc;
235 }
236
237 /*
238  * Call the System Management Mode BIOS.
239  */
240 static int i8k_smm(struct smm_regs *regs)
241 {
242         int ret;
243
244         cpus_read_lock();
245         ret = smp_call_on_cpu(0, i8k_smm_func, regs, true);
246         cpus_read_unlock();
247
248         return ret;
249 }
250
251 /*
252  * Read the fan status.
253  */
254 static int i8k_get_fan_status(const struct dell_smm_data *data, u8 fan)
255 {
256         struct smm_regs regs = {
257                 .eax = I8K_SMM_GET_FAN,
258                 .ebx = fan,
259         };
260
261         if (data->disallow_fan_support)
262                 return -EINVAL;
263
264         return i8k_smm(&regs) ? : regs.eax & 0xff;
265 }
266
267 /*
268  * Read the fan speed in RPM.
269  */
270 static int i8k_get_fan_speed(const struct dell_smm_data *data, u8 fan)
271 {
272         struct smm_regs regs = {
273                 .eax = I8K_SMM_GET_SPEED,
274                 .ebx = fan,
275         };
276
277         if (data->disallow_fan_support)
278                 return -EINVAL;
279
280         return i8k_smm(&regs) ? : (regs.eax & 0xffff) * data->i8k_fan_mult;
281 }
282
283 /*
284  * Read the fan type.
285  */
286 static int _i8k_get_fan_type(const struct dell_smm_data *data, u8 fan)
287 {
288         struct smm_regs regs = {
289                 .eax = I8K_SMM_GET_FAN_TYPE,
290                 .ebx = fan,
291         };
292
293         if (data->disallow_fan_support || data->disallow_fan_type_call)
294                 return -EINVAL;
295
296         return i8k_smm(&regs) ? : regs.eax & 0xff;
297 }
298
299 static int i8k_get_fan_type(struct dell_smm_data *data, u8 fan)
300 {
301         /* I8K_SMM_GET_FAN_TYPE SMM call is expensive, so cache values */
302         if (data->fan_type[fan] == INT_MIN)
303                 data->fan_type[fan] = _i8k_get_fan_type(data, fan);
304
305         return data->fan_type[fan];
306 }
307
308 /*
309  * Read the fan nominal rpm for specific fan speed.
310  */
311 static int __init i8k_get_fan_nominal_speed(const struct dell_smm_data *data, u8 fan, int speed)
312 {
313         struct smm_regs regs = {
314                 .eax = I8K_SMM_GET_NOM_SPEED,
315                 .ebx = fan | (speed << 8),
316         };
317
318         if (data->disallow_fan_support)
319                 return -EINVAL;
320
321         return i8k_smm(&regs) ? : (regs.eax & 0xffff) * data->i8k_fan_mult;
322 }
323
324 /*
325  * Enable or disable automatic BIOS fan control support
326  */
327 static int i8k_enable_fan_auto_mode(const struct dell_smm_data *data, bool enable)
328 {
329         struct smm_regs regs = { };
330
331         if (data->disallow_fan_support)
332                 return -EINVAL;
333
334         regs.eax = enable ? data->auto_fan : data->manual_fan;
335         return i8k_smm(&regs);
336 }
337
338 /*
339  * Set the fan speed (off, low, high, ...).
340  */
341 static int i8k_set_fan(const struct dell_smm_data *data, u8 fan, int speed)
342 {
343         struct smm_regs regs = { .eax = I8K_SMM_SET_FAN, };
344
345         if (data->disallow_fan_support)
346                 return -EINVAL;
347
348         speed = (speed < 0) ? 0 : ((speed > data->i8k_fan_max) ? data->i8k_fan_max : speed);
349         regs.ebx = fan | (speed << 8);
350
351         return i8k_smm(&regs);
352 }
353
354 static int __init i8k_get_temp_type(u8 sensor)
355 {
356         struct smm_regs regs = {
357                 .eax = I8K_SMM_GET_TEMP_TYPE,
358                 .ebx = sensor,
359         };
360
361         return i8k_smm(&regs) ? : regs.eax & 0xff;
362 }
363
364 /*
365  * Read the cpu temperature.
366  */
367 static int _i8k_get_temp(u8 sensor)
368 {
369         struct smm_regs regs = {
370                 .eax = I8K_SMM_GET_TEMP,
371                 .ebx = sensor,
372         };
373
374         return i8k_smm(&regs) ? : regs.eax & 0xff;
375 }
376
377 static int i8k_get_temp(u8 sensor)
378 {
379         int temp = _i8k_get_temp(sensor);
380
381         /*
382          * Sometimes the temperature sensor returns 0x99, which is out of range.
383          * In this case we retry (once) before returning an error.
384          # 1003655137 00000058 00005a4b
385          # 1003655138 00000099 00003a80 <--- 0x99 = 153 degrees
386          # 1003655139 00000054 00005c52
387          */
388         if (temp == 0x99) {
389                 msleep(100);
390                 temp = _i8k_get_temp(sensor);
391         }
392         /*
393          * Return -ENODATA for all invalid temperatures.
394          *
395          * Known instances are the 0x99 value as seen above as well as
396          * 0xc1 (193), which may be returned when trying to read the GPU
397          * temperature if the system supports a GPU and it is currently
398          * turned off.
399          */
400         if (temp > I8K_MAX_TEMP)
401                 return -ENODATA;
402
403         return temp;
404 }
405
406 static int __init i8k_get_dell_signature(int req_fn)
407 {
408         struct smm_regs regs = { .eax = req_fn, };
409         int rc;
410
411         rc = i8k_smm(&regs);
412         if (rc < 0)
413                 return rc;
414
415         return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1;
416 }
417
418 #if IS_ENABLED(CONFIG_I8K)
419
420 /*
421  * Read the Fn key status.
422  */
423 static int i8k_get_fn_status(void)
424 {
425         struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, };
426         int rc;
427
428         rc = i8k_smm(&regs);
429         if (rc < 0)
430                 return rc;
431
432         switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) {
433         case I8K_FN_UP:
434                 return I8K_VOL_UP;
435         case I8K_FN_DOWN:
436                 return I8K_VOL_DOWN;
437         case I8K_FN_MUTE:
438                 return I8K_VOL_MUTE;
439         default:
440                 return 0;
441         }
442 }
443
444 /*
445  * Read the power status.
446  */
447 static int i8k_get_power_status(void)
448 {
449         struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, };
450         int rc;
451
452         rc = i8k_smm(&regs);
453         if (rc < 0)
454                 return rc;
455
456         return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY;
457 }
458
459 /*
460  * Procfs interface
461  */
462
463 static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
464 {
465         struct dell_smm_data *data = pde_data(file_inode(fp));
466         int __user *argp = (int __user *)arg;
467         int speed, err;
468         int val = 0;
469
470         if (!argp)
471                 return -EINVAL;
472
473         switch (cmd) {
474         case I8K_BIOS_VERSION:
475                 if (!isdigit(data->bios_version[0]) || !isdigit(data->bios_version[1]) ||
476                     !isdigit(data->bios_version[2]))
477                         return -EINVAL;
478
479                 val = (data->bios_version[0] << 16) |
480                                 (data->bios_version[1] << 8) | data->bios_version[2];
481
482                 if (copy_to_user(argp, &val, sizeof(val)))
483                         return -EFAULT;
484
485                 return 0;
486         case I8K_MACHINE_ID:
487                 if (restricted && !capable(CAP_SYS_ADMIN))
488                         return -EPERM;
489
490                 if (copy_to_user(argp, data->bios_machineid, sizeof(data->bios_machineid)))
491                         return -EFAULT;
492
493                 return 0;
494         case I8K_FN_STATUS:
495                 val = i8k_get_fn_status();
496                 break;
497
498         case I8K_POWER_STATUS:
499                 val = i8k_get_power_status();
500                 break;
501
502         case I8K_GET_TEMP:
503                 val = i8k_get_temp(0);
504                 break;
505
506         case I8K_GET_SPEED:
507                 if (copy_from_user(&val, argp, sizeof(int)))
508                         return -EFAULT;
509
510                 if (val > U8_MAX || val < 0)
511                         return -EINVAL;
512
513                 val = i8k_get_fan_speed(data, val);
514                 break;
515
516         case I8K_GET_FAN:
517                 if (copy_from_user(&val, argp, sizeof(int)))
518                         return -EFAULT;
519
520                 if (val > U8_MAX || val < 0)
521                         return -EINVAL;
522
523                 val = i8k_get_fan_status(data, val);
524                 break;
525
526         case I8K_SET_FAN:
527                 if (restricted && !capable(CAP_SYS_ADMIN))
528                         return -EPERM;
529
530                 if (copy_from_user(&val, argp, sizeof(int)))
531                         return -EFAULT;
532
533                 if (val > U8_MAX || val < 0)
534                         return -EINVAL;
535
536                 if (copy_from_user(&speed, argp + 1, sizeof(int)))
537                         return -EFAULT;
538
539                 mutex_lock(&data->i8k_mutex);
540                 err = i8k_set_fan(data, val, speed);
541                 if (err < 0)
542                         val = err;
543                 else
544                         val = i8k_get_fan_status(data, val);
545                 mutex_unlock(&data->i8k_mutex);
546                 break;
547
548         default:
549                 return -ENOIOCTLCMD;
550         }
551
552         if (val < 0)
553                 return val;
554
555         if (copy_to_user(argp, &val, sizeof(int)))
556                 return -EFAULT;
557
558         return 0;
559 }
560
561 /*
562  * Print the information for /proc/i8k.
563  */
564 static int i8k_proc_show(struct seq_file *seq, void *offset)
565 {
566         struct dell_smm_data *data = seq->private;
567         int fn_key, cpu_temp, ac_power;
568         int left_fan, right_fan, left_speed, right_speed;
569
570         cpu_temp        = i8k_get_temp(0);                              /* 11100 µs */
571         left_fan        = i8k_get_fan_status(data, I8K_FAN_LEFT);       /*   580 µs */
572         right_fan       = i8k_get_fan_status(data, I8K_FAN_RIGHT);      /*   580 µs */
573         left_speed      = i8k_get_fan_speed(data, I8K_FAN_LEFT);        /*   580 µs */
574         right_speed     = i8k_get_fan_speed(data, I8K_FAN_RIGHT);       /*   580 µs */
575         fn_key          = i8k_get_fn_status();                          /*   750 µs */
576         if (power_status)
577                 ac_power = i8k_get_power_status();                      /* 14700 µs */
578         else
579                 ac_power = -1;
580
581         /*
582          * Info:
583          *
584          * 1)  Format version (this will change if format changes)
585          * 2)  BIOS version
586          * 3)  BIOS machine ID
587          * 4)  Cpu temperature
588          * 5)  Left fan status
589          * 6)  Right fan status
590          * 7)  Left fan speed
591          * 8)  Right fan speed
592          * 9)  AC power
593          * 10) Fn Key status
594          */
595         seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n",
596                    I8K_PROC_FMT,
597                    data->bios_version,
598                    (restricted && !capable(CAP_SYS_ADMIN)) ? "-1" : data->bios_machineid,
599                    cpu_temp,
600                    left_fan, right_fan, left_speed, right_speed,
601                    ac_power, fn_key);
602
603         return 0;
604 }
605
606 static int i8k_open_fs(struct inode *inode, struct file *file)
607 {
608         return single_open(file, i8k_proc_show, pde_data(inode));
609 }
610
611 static const struct proc_ops i8k_proc_ops = {
612         .proc_open      = i8k_open_fs,
613         .proc_read      = seq_read,
614         .proc_lseek     = seq_lseek,
615         .proc_release   = single_release,
616         .proc_ioctl     = i8k_ioctl,
617 };
618
619 static void i8k_exit_procfs(void *param)
620 {
621         remove_proc_entry("i8k", NULL);
622 }
623
624 static void __init i8k_init_procfs(struct device *dev)
625 {
626         struct dell_smm_data *data = dev_get_drvdata(dev);
627
628         /* Only register exit function if creation was successful */
629         if (proc_create_data("i8k", 0, NULL, &i8k_proc_ops, data))
630                 devm_add_action_or_reset(dev, i8k_exit_procfs, NULL);
631 }
632
633 #else
634
635 static void __init i8k_init_procfs(struct device *dev)
636 {
637 }
638
639 #endif
640
641 /*
642  * Hwmon interface
643  */
644
645 static umode_t dell_smm_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr,
646                                    int channel)
647 {
648         const struct dell_smm_data *data = drvdata;
649
650         switch (type) {
651         case hwmon_temp:
652                 switch (attr) {
653                 case hwmon_temp_input:
654                         /* _i8k_get_temp() is fine since we do not care about the actual value */
655                         if (data->temp_type[channel] >= 0 || _i8k_get_temp(channel) >= 0)
656                                 return 0444;
657
658                         break;
659                 case hwmon_temp_label:
660                         if (data->temp_type[channel] >= 0)
661                                 return 0444;
662
663                         break;
664                 default:
665                         break;
666                 }
667                 break;
668         case hwmon_fan:
669                 if (data->disallow_fan_support)
670                         break;
671
672                 switch (attr) {
673                 case hwmon_fan_input:
674                         if (data->fan[channel])
675                                 return 0444;
676
677                         break;
678                 case hwmon_fan_label:
679                         if (data->fan[channel] && !data->disallow_fan_type_call)
680                                 return 0444;
681
682                         break;
683                 case hwmon_fan_min:
684                 case hwmon_fan_max:
685                 case hwmon_fan_target:
686                         if (data->fan_nominal_speed[channel])
687                                 return 0444;
688
689                         break;
690                 default:
691                         break;
692                 }
693                 break;
694         case hwmon_pwm:
695                 if (data->disallow_fan_support)
696                         break;
697
698                 switch (attr) {
699                 case hwmon_pwm_input:
700                         if (data->fan[channel])
701                                 return 0644;
702
703                         break;
704                 case hwmon_pwm_enable:
705                         if (data->auto_fan)
706                                 /*
707                                  * There is no command for retrieve the current status
708                                  * from BIOS, and userspace/firmware itself can change
709                                  * it.
710                                  * Thus we can only provide write-only access for now.
711                                  */
712                                 return 0200;
713
714                         break;
715                 default:
716                         break;
717                 }
718                 break;
719         default:
720                 break;
721         }
722
723         return 0;
724 }
725
726 static int dell_smm_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel,
727                          long *val)
728 {
729         struct dell_smm_data *data = dev_get_drvdata(dev);
730         int ret;
731
732         switch (type) {
733         case hwmon_temp:
734                 switch (attr) {
735                 case hwmon_temp_input:
736                         ret = i8k_get_temp(channel);
737                         if (ret < 0)
738                                 return ret;
739
740                         *val = ret * 1000;
741
742                         return 0;
743                 default:
744                         break;
745                 }
746                 break;
747         case hwmon_fan:
748                 switch (attr) {
749                 case hwmon_fan_input:
750                         ret = i8k_get_fan_speed(data, channel);
751                         if (ret < 0)
752                                 return ret;
753
754                         *val = ret;
755
756                         return 0;
757                 case hwmon_fan_min:
758                         *val = data->fan_nominal_speed[channel][0];
759
760                         return 0;
761                 case hwmon_fan_max:
762                         *val = data->fan_nominal_speed[channel][data->i8k_fan_max];
763
764                         return 0;
765                 case hwmon_fan_target:
766                         ret = i8k_get_fan_status(data, channel);
767                         if (ret < 0)
768                                 return ret;
769
770                         if (ret > data->i8k_fan_max)
771                                 ret = data->i8k_fan_max;
772
773                         *val = data->fan_nominal_speed[channel][ret];
774
775                         return 0;
776                 default:
777                         break;
778                 }
779                 break;
780         case hwmon_pwm:
781                 switch (attr) {
782                 case hwmon_pwm_input:
783                         ret = i8k_get_fan_status(data, channel);
784                         if (ret < 0)
785                                 return ret;
786
787                         *val = clamp_val(ret * data->i8k_pwm_mult, 0, 255);
788
789                         return 0;
790                 default:
791                         break;
792                 }
793                 break;
794         default:
795                 break;
796         }
797
798         return -EOPNOTSUPP;
799 }
800
801 static const char *dell_smm_fan_label(struct dell_smm_data *data, int channel)
802 {
803         bool dock = false;
804         int type = i8k_get_fan_type(data, channel);
805
806         if (type < 0)
807                 return ERR_PTR(type);
808
809         if (type & 0x10) {
810                 dock = true;
811                 type &= 0x0F;
812         }
813
814         if (type >= ARRAY_SIZE(fan_labels))
815                 type = ARRAY_SIZE(fan_labels) - 1;
816
817         return dock ? docking_labels[type] : fan_labels[type];
818 }
819
820 static int dell_smm_read_string(struct device *dev, enum hwmon_sensor_types type, u32 attr,
821                                 int channel, const char **str)
822 {
823         struct dell_smm_data *data = dev_get_drvdata(dev);
824
825         switch (type) {
826         case hwmon_temp:
827                 switch (attr) {
828                 case hwmon_temp_label:
829                         *str = temp_labels[data->temp_type[channel]];
830                         return 0;
831                 default:
832                         break;
833                 }
834                 break;
835         case hwmon_fan:
836                 switch (attr) {
837                 case hwmon_fan_label:
838                         *str = dell_smm_fan_label(data, channel);
839                         return PTR_ERR_OR_ZERO(*str);
840                 default:
841                         break;
842                 }
843                 break;
844         default:
845                 break;
846         }
847
848         return -EOPNOTSUPP;
849 }
850
851 static int dell_smm_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel,
852                           long val)
853 {
854         struct dell_smm_data *data = dev_get_drvdata(dev);
855         unsigned long pwm;
856         bool enable;
857         int err;
858
859         switch (type) {
860         case hwmon_pwm:
861                 switch (attr) {
862                 case hwmon_pwm_input:
863                         pwm = clamp_val(DIV_ROUND_CLOSEST(val, data->i8k_pwm_mult), 0,
864                                         data->i8k_fan_max);
865
866                         mutex_lock(&data->i8k_mutex);
867                         err = i8k_set_fan(data, channel, pwm);
868                         mutex_unlock(&data->i8k_mutex);
869
870                         if (err < 0)
871                                 return err;
872
873                         return 0;
874                 case hwmon_pwm_enable:
875                         if (!val)
876                                 return -EINVAL;
877
878                         if (val == 1)
879                                 enable = false;
880                         else
881                                 enable = true;
882
883                         mutex_lock(&data->i8k_mutex);
884                         err = i8k_enable_fan_auto_mode(data, enable);
885                         mutex_unlock(&data->i8k_mutex);
886
887                         if (err < 0)
888                                 return err;
889
890                         return 0;
891                 default:
892                         break;
893                 }
894                 break;
895         default:
896                 break;
897         }
898
899         return -EOPNOTSUPP;
900 }
901
902 static const struct hwmon_ops dell_smm_ops = {
903         .is_visible = dell_smm_is_visible,
904         .read = dell_smm_read,
905         .read_string = dell_smm_read_string,
906         .write = dell_smm_write,
907 };
908
909 static const struct hwmon_channel_info *dell_smm_info[] = {
910         HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
911         HWMON_CHANNEL_INFO(temp,
912                            HWMON_T_INPUT | HWMON_T_LABEL,
913                            HWMON_T_INPUT | HWMON_T_LABEL,
914                            HWMON_T_INPUT | HWMON_T_LABEL,
915                            HWMON_T_INPUT | HWMON_T_LABEL,
916                            HWMON_T_INPUT | HWMON_T_LABEL,
917                            HWMON_T_INPUT | HWMON_T_LABEL,
918                            HWMON_T_INPUT | HWMON_T_LABEL,
919                            HWMON_T_INPUT | HWMON_T_LABEL,
920                            HWMON_T_INPUT | HWMON_T_LABEL,
921                            HWMON_T_INPUT | HWMON_T_LABEL
922                            ),
923         HWMON_CHANNEL_INFO(fan,
924                            HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_MIN | HWMON_F_MAX |
925                            HWMON_F_TARGET,
926                            HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_MIN | HWMON_F_MAX |
927                            HWMON_F_TARGET,
928                            HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_MIN | HWMON_F_MAX |
929                            HWMON_F_TARGET
930                            ),
931         HWMON_CHANNEL_INFO(pwm,
932                            HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
933                            HWMON_PWM_INPUT,
934                            HWMON_PWM_INPUT
935                            ),
936         NULL
937 };
938
939 static const struct hwmon_chip_info dell_smm_chip_info = {
940         .ops = &dell_smm_ops,
941         .info = dell_smm_info,
942 };
943
944 static int __init dell_smm_init_hwmon(struct device *dev)
945 {
946         struct dell_smm_data *data = dev_get_drvdata(dev);
947         struct device *dell_smm_hwmon_dev;
948         int state, err;
949         u8 i;
950
951         for (i = 0; i < DELL_SMM_NO_TEMP; i++) {
952                 data->temp_type[i] = i8k_get_temp_type(i);
953                 if (data->temp_type[i] < 0)
954                         continue;
955
956                 if (data->temp_type[i] >= ARRAY_SIZE(temp_labels))
957                         data->temp_type[i] = ARRAY_SIZE(temp_labels) - 1;
958         }
959
960         for (i = 0; i < DELL_SMM_NO_FANS; i++) {
961                 data->fan_type[i] = INT_MIN;
962                 err = i8k_get_fan_status(data, i);
963                 if (err < 0)
964                         err = i8k_get_fan_type(data, i);
965
966                 if (err < 0)
967                         continue;
968
969                 data->fan[i] = true;
970                 data->fan_nominal_speed[i] = devm_kmalloc_array(dev, data->i8k_fan_max + 1,
971                                                                 sizeof(*data->fan_nominal_speed[i]),
972                                                                 GFP_KERNEL);
973                 if (!data->fan_nominal_speed[i])
974                         continue;
975
976                 for (state = 0; state <= data->i8k_fan_max; state++) {
977                         err = i8k_get_fan_nominal_speed(data, i, state);
978                         if (err < 0) {
979                                 /* Mark nominal speed table as invalid in case of error */
980                                 devm_kfree(dev, data->fan_nominal_speed[i]);
981                                 data->fan_nominal_speed[i] = NULL;
982                                 break;
983                         }
984                         data->fan_nominal_speed[i][state] = err;
985                 }
986         }
987
988         dell_smm_hwmon_dev = devm_hwmon_device_register_with_info(dev, "dell_smm", data,
989                                                                   &dell_smm_chip_info, NULL);
990
991         return PTR_ERR_OR_ZERO(dell_smm_hwmon_dev);
992 }
993
994 struct i8k_config_data {
995         uint fan_mult;
996         uint fan_max;
997 };
998
999 enum i8k_configs {
1000         DELL_LATITUDE_D520,
1001         DELL_PRECISION_490,
1002         DELL_STUDIO,
1003         DELL_XPS,
1004 };
1005
1006 /*
1007  * Only use for machines which need some special configuration
1008  * in order to work correctly (e.g. if autoconfig fails on this machines).
1009  */
1010
1011 static const struct i8k_config_data i8k_config_data[] __initconst = {
1012         [DELL_LATITUDE_D520] = {
1013                 .fan_mult = 1,
1014                 .fan_max = I8K_FAN_TURBO,
1015         },
1016         [DELL_PRECISION_490] = {
1017                 .fan_mult = 1,
1018                 .fan_max = I8K_FAN_TURBO,
1019         },
1020         [DELL_STUDIO] = {
1021                 .fan_mult = 1,
1022                 .fan_max = I8K_FAN_HIGH,
1023         },
1024         [DELL_XPS] = {
1025                 .fan_mult = 1,
1026                 .fan_max = I8K_FAN_HIGH,
1027         },
1028 };
1029
1030 static const struct dmi_system_id i8k_dmi_table[] __initconst = {
1031         {
1032                 .ident = "Dell Inspiron",
1033                 .matches = {
1034                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"),
1035                         DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"),
1036                 },
1037         },
1038         {
1039                 .ident = "Dell Latitude",
1040                 .matches = {
1041                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"),
1042                         DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"),
1043                 },
1044         },
1045         {
1046                 .ident = "Dell Inspiron 2",
1047                 .matches = {
1048                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1049                         DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"),
1050                 },
1051         },
1052         {
1053                 .ident = "Dell Latitude D520",
1054                 .matches = {
1055                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1056                         DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D520"),
1057                 },
1058                 .driver_data = (void *)&i8k_config_data[DELL_LATITUDE_D520],
1059         },
1060         {
1061                 .ident = "Dell Latitude 2",
1062                 .matches = {
1063                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1064                         DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"),
1065                 },
1066         },
1067         {       /* UK Inspiron 6400  */
1068                 .ident = "Dell Inspiron 3",
1069                 .matches = {
1070                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1071                         DMI_MATCH(DMI_PRODUCT_NAME, "MM061"),
1072                 },
1073         },
1074         {
1075                 .ident = "Dell Inspiron 3",
1076                 .matches = {
1077                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1078                         DMI_MATCH(DMI_PRODUCT_NAME, "MP061"),
1079                 },
1080         },
1081         {
1082                 .ident = "Dell Precision 490",
1083                 .matches = {
1084                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1085                         DMI_MATCH(DMI_PRODUCT_NAME,
1086                                   "Precision WorkStation 490"),
1087                 },
1088                 .driver_data = (void *)&i8k_config_data[DELL_PRECISION_490],
1089         },
1090         {
1091                 .ident = "Dell Precision",
1092                 .matches = {
1093                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1094                         DMI_MATCH(DMI_PRODUCT_NAME, "Precision"),
1095                 },
1096         },
1097         {
1098                 .ident = "Dell Vostro",
1099                 .matches = {
1100                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1101                         DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"),
1102                 },
1103         },
1104         {
1105                 .ident = "Dell Studio",
1106                 .matches = {
1107                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1108                         DMI_MATCH(DMI_PRODUCT_NAME, "Studio"),
1109                 },
1110                 .driver_data = (void *)&i8k_config_data[DELL_STUDIO],
1111         },
1112         {
1113                 .ident = "Dell XPS M140",
1114                 .matches = {
1115                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1116                         DMI_MATCH(DMI_PRODUCT_NAME, "MXC051"),
1117                 },
1118                 .driver_data = (void *)&i8k_config_data[DELL_XPS],
1119         },
1120         {
1121                 .ident = "Dell XPS",
1122                 .matches = {
1123                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1124                         DMI_MATCH(DMI_PRODUCT_NAME, "XPS"),
1125                 },
1126         },
1127         { }
1128 };
1129
1130 MODULE_DEVICE_TABLE(dmi, i8k_dmi_table);
1131
1132 /*
1133  * On some machines once I8K_SMM_GET_FAN_TYPE is issued then CPU fan speed
1134  * randomly going up and down due to bug in Dell SMM or BIOS. Here is blacklist
1135  * of affected Dell machines for which we disallow I8K_SMM_GET_FAN_TYPE call.
1136  * See bug: https://bugzilla.kernel.org/show_bug.cgi?id=100121
1137  */
1138 static const struct dmi_system_id i8k_blacklist_fan_type_dmi_table[] __initconst = {
1139         {
1140                 .ident = "Dell Studio XPS 8000",
1141                 .matches = {
1142                         DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1143                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Studio XPS 8000"),
1144                 },
1145         },
1146         {
1147                 .ident = "Dell Studio XPS 8100",
1148                 .matches = {
1149                         DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1150                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Studio XPS 8100"),
1151                 },
1152         },
1153         {
1154                 .ident = "Dell Inspiron 580",
1155                 .matches = {
1156                         DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1157                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Inspiron 580 "),
1158                 },
1159         },
1160         {
1161                 .ident = "Dell Inspiron 3505",
1162                 .matches = {
1163                         DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1164                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Inspiron 3505"),
1165                 },
1166         },
1167         { }
1168 };
1169
1170 /*
1171  * On some machines all fan related SMM functions implemented by Dell BIOS
1172  * firmware freeze kernel for about 500ms. Until Dell fixes these problems fan
1173  * support for affected blacklisted Dell machines stay disabled.
1174  * See bug: https://bugzilla.kernel.org/show_bug.cgi?id=195751
1175  */
1176 static const struct dmi_system_id i8k_blacklist_fan_support_dmi_table[] __initconst = {
1177         {
1178                 .ident = "Dell Inspiron 7720",
1179                 .matches = {
1180                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1181                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Inspiron 7720"),
1182                 },
1183         },
1184         {
1185                 .ident = "Dell Vostro 3360",
1186                 .matches = {
1187                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1188                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Vostro 3360"),
1189                 },
1190         },
1191         {
1192                 .ident = "Dell XPS13 9333",
1193                 .matches = {
1194                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1195                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "XPS13 9333"),
1196                 },
1197         },
1198         {
1199                 .ident = "Dell XPS 15 L502X",
1200                 .matches = {
1201                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1202                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Dell System XPS L502X"),
1203                 },
1204         },
1205         { }
1206 };
1207
1208 struct i8k_fan_control_data {
1209         unsigned int manual_fan;
1210         unsigned int auto_fan;
1211 };
1212
1213 enum i8k_fan_controls {
1214         I8K_FAN_34A3_35A3,
1215 };
1216
1217 static const struct i8k_fan_control_data i8k_fan_control_data[] __initconst = {
1218         [I8K_FAN_34A3_35A3] = {
1219                 .manual_fan = 0x34a3,
1220                 .auto_fan = 0x35a3,
1221         },
1222 };
1223
1224 static const struct dmi_system_id i8k_whitelist_fan_control[] __initconst = {
1225         {
1226                 .ident = "Dell Latitude 5480",
1227                 .matches = {
1228                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1229                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Latitude 5480"),
1230                 },
1231                 .driver_data = (void *)&i8k_fan_control_data[I8K_FAN_34A3_35A3],
1232         },
1233         {
1234                 .ident = "Dell Latitude E6440",
1235                 .matches = {
1236                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1237                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Latitude E6440"),
1238                 },
1239                 .driver_data = (void *)&i8k_fan_control_data[I8K_FAN_34A3_35A3],
1240         },
1241         {
1242                 .ident = "Dell Latitude E7440",
1243                 .matches = {
1244                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1245                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Latitude E7440"),
1246                 },
1247                 .driver_data = (void *)&i8k_fan_control_data[I8K_FAN_34A3_35A3],
1248         },
1249         {
1250                 .ident = "Dell Precision 5530",
1251                 .matches = {
1252                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1253                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Precision 5530"),
1254                 },
1255                 .driver_data = (void *)&i8k_fan_control_data[I8K_FAN_34A3_35A3],
1256         },
1257         {
1258                 .ident = "Dell Precision 7510",
1259                 .matches = {
1260                         DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1261                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Precision 7510"),
1262                 },
1263                 .driver_data = (void *)&i8k_fan_control_data[I8K_FAN_34A3_35A3],
1264         },
1265         { }
1266 };
1267
1268 static int __init dell_smm_probe(struct platform_device *pdev)
1269 {
1270         struct dell_smm_data *data;
1271         const struct dmi_system_id *id, *fan_control;
1272         int ret;
1273         u8 fan;
1274
1275         data = devm_kzalloc(&pdev->dev, sizeof(struct dell_smm_data), GFP_KERNEL);
1276         if (!data)
1277                 return -ENOMEM;
1278
1279         mutex_init(&data->i8k_mutex);
1280         data->i8k_fan_mult = I8K_FAN_MULT;
1281         data->i8k_fan_max = I8K_FAN_HIGH;
1282         platform_set_drvdata(pdev, data);
1283
1284         if (dmi_check_system(i8k_blacklist_fan_support_dmi_table)) {
1285                 dev_warn(&pdev->dev, "broken Dell BIOS detected, disallow fan support\n");
1286                 if (!force)
1287                         data->disallow_fan_support = true;
1288         }
1289
1290         if (dmi_check_system(i8k_blacklist_fan_type_dmi_table)) {
1291                 dev_warn(&pdev->dev, "broken Dell BIOS detected, disallow fan type call\n");
1292                 if (!force)
1293                         data->disallow_fan_type_call = true;
1294         }
1295
1296         strscpy(data->bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION),
1297                 sizeof(data->bios_version));
1298         strscpy(data->bios_machineid, i8k_get_dmi_data(DMI_PRODUCT_SERIAL),
1299                 sizeof(data->bios_machineid));
1300
1301         /*
1302          * Set fan multiplier and maximal fan speed from dmi config
1303          * Values specified in module parameters override values from dmi
1304          */
1305         id = dmi_first_match(i8k_dmi_table);
1306         if (id && id->driver_data) {
1307                 const struct i8k_config_data *conf = id->driver_data;
1308
1309                 if (!fan_mult && conf->fan_mult)
1310                         fan_mult = conf->fan_mult;
1311
1312                 if (!fan_max && conf->fan_max)
1313                         fan_max = conf->fan_max;
1314         }
1315
1316         data->i8k_fan_max = fan_max ? : I8K_FAN_HIGH;   /* Must not be 0 */
1317         data->i8k_pwm_mult = DIV_ROUND_UP(255, data->i8k_fan_max);
1318
1319         fan_control = dmi_first_match(i8k_whitelist_fan_control);
1320         if (fan_control && fan_control->driver_data) {
1321                 const struct i8k_fan_control_data *control = fan_control->driver_data;
1322
1323                 data->manual_fan = control->manual_fan;
1324                 data->auto_fan = control->auto_fan;
1325                 dev_info(&pdev->dev, "enabling support for setting automatic/manual fan control\n");
1326         }
1327
1328         if (!fan_mult) {
1329                 /*
1330                  * Autodetect fan multiplier based on nominal rpm
1331                  * If fan reports rpm value too high then set multiplier to 1
1332                  */
1333                 for (fan = 0; fan < DELL_SMM_NO_FANS; ++fan) {
1334                         ret = i8k_get_fan_nominal_speed(data, fan, data->i8k_fan_max);
1335                         if (ret < 0)
1336                                 continue;
1337
1338                         if (ret > I8K_FAN_MAX_RPM)
1339                                 data->i8k_fan_mult = 1;
1340                         break;
1341                 }
1342         } else {
1343                 /* Fan multiplier was specified in module param or in dmi */
1344                 data->i8k_fan_mult = fan_mult;
1345         }
1346
1347         ret = dell_smm_init_hwmon(&pdev->dev);
1348         if (ret)
1349                 return ret;
1350
1351         i8k_init_procfs(&pdev->dev);
1352
1353         return 0;
1354 }
1355
1356 static struct platform_driver dell_smm_driver = {
1357         .driver         = {
1358                 .name   = KBUILD_MODNAME,
1359         },
1360 };
1361
1362 static struct platform_device *dell_smm_device;
1363
1364 /*
1365  * Probe for the presence of a supported laptop.
1366  */
1367 static int __init i8k_init(void)
1368 {
1369         /*
1370          * Get DMI information
1371          */
1372         if (!dmi_check_system(i8k_dmi_table)) {
1373                 if (!ignore_dmi && !force)
1374                         return -ENODEV;
1375
1376                 pr_info("not running on a supported Dell system.\n");
1377                 pr_info("vendor=%s, model=%s, version=%s\n",
1378                         i8k_get_dmi_data(DMI_SYS_VENDOR),
1379                         i8k_get_dmi_data(DMI_PRODUCT_NAME),
1380                         i8k_get_dmi_data(DMI_BIOS_VERSION));
1381         }
1382
1383         /*
1384          * Get SMM Dell signature
1385          */
1386         if (i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG1) &&
1387             i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG2)) {
1388                 pr_err("unable to get SMM Dell signature\n");
1389                 if (!force)
1390                         return -ENODEV;
1391         }
1392
1393         dell_smm_device = platform_create_bundle(&dell_smm_driver, dell_smm_probe, NULL, 0, NULL,
1394                                                  0);
1395
1396         return PTR_ERR_OR_ZERO(dell_smm_device);
1397 }
1398
1399 static void __exit i8k_exit(void)
1400 {
1401         platform_device_unregister(dell_smm_device);
1402         platform_driver_unregister(&dell_smm_driver);
1403 }
1404
1405 module_init(i8k_init);
1406 module_exit(i8k_exit);