#include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/debugfs.h>
 #include <linux/pci.h>
 #include "processor_thermal_device.h"
 
 
 struct ptc_data {
        u32 offset;
+       struct pci_dev *pdev;
        struct attribute_group ptc_attr_group;
        struct attribute *ptc_attrs[PTC_MAX_ATTRS];
        struct device_attribute temperature_target_attr;
 }
 
 static struct ptc_data ptc_instance[PTC_MAX_INSTANCES];
+static struct dentry *ptc_debugfs;
+
+#define PTC_TEMP_OVERRIDE_ENABLE_INDEX 4
+#define PTC_TEMP_OVERRIDE_INDEX                5
+
+static ssize_t ptc_temperature_write(struct file *file, const char __user *data,
+                                    size_t count, loff_t *ppos)
+{
+       struct ptc_data *ptc_instance = file->private_data;
+       struct pci_dev *pdev = ptc_instance->pdev;
+       char buf[32];
+       ssize_t len;
+       u32 value;
+
+       len = min(count, sizeof(buf) - 1);
+       if (copy_from_user(buf, data, len))
+               return -EFAULT;
+
+       buf[len] = '\0';
+       if (kstrtouint(buf, 0, &value))
+               return -EINVAL;
+
+       if (ptc_mmio_regs[PTC_TEMP_OVERRIDE_INDEX].units)
+               value /= ptc_mmio_regs[PTC_TEMP_OVERRIDE_INDEX].units;
+
+       if (value > ptc_mmio_regs[PTC_TEMP_OVERRIDE_INDEX].mask)
+               return -EINVAL;
+
+       if (!value) {
+               ptc_mmio_write(pdev, ptc_instance->offset, PTC_TEMP_OVERRIDE_ENABLE_INDEX, 0);
+       } else {
+               ptc_mmio_write(pdev, ptc_instance->offset, PTC_TEMP_OVERRIDE_INDEX, value);
+               ptc_mmio_write(pdev, ptc_instance->offset, PTC_TEMP_OVERRIDE_ENABLE_INDEX, 1);
+       }
+
+       return count;
+}
+
+static const struct file_operations ptc_fops = {
+       .open = simple_open,
+       .write = ptc_temperature_write,
+       .llseek = generic_file_llseek,
+};
+
+static void ptc_create_debugfs(void)
+{
+       ptc_debugfs = debugfs_create_dir("platform_temperature_control", NULL);
+
+       debugfs_create_file("temperature_0",  0200, ptc_debugfs,  &ptc_instance[0], &ptc_fops);
+       debugfs_create_file("temperature_1",  0200, ptc_debugfs,  &ptc_instance[1], &ptc_fops);
+       debugfs_create_file("temperature_2",  0200, ptc_debugfs,  &ptc_instance[2], &ptc_fops);
+}
+
+static void ptc_delete_debugfs(void)
+{
+       debugfs_remove_recursive(ptc_debugfs);
+}
 
 int proc_thermal_ptc_add(struct pci_dev *pdev, struct proc_thermal_device *proc_priv)
 {
 
                for (i = 0; i < PTC_MAX_INSTANCES; i++) {
                        ptc_instance[i].offset = ptc_offsets[i];
+                       ptc_instance[i].pdev = pdev;
                        ptc_create_groups(pdev, i, &ptc_instance[i]);
                }
+
+               ptc_create_debugfs();
        }
 
        return 0;
 
                for (i = 0; i < PTC_MAX_INSTANCES; i++)
                        sysfs_remove_group(&pdev->dev.kobj, &ptc_instance[i].ptc_attr_group);
+
+               ptc_delete_debugfs();
        }
 }
 EXPORT_SYMBOL_GPL(proc_thermal_ptc_remove);