From 8fe4ed8f29b70601a818cd7d04ecffcda0bb2193 Mon Sep 17 00:00:00 2001
From: Krzysztof Kolasa <kkolasa@winsoft.pl>
Date: Sun, 7 Jul 2013 16:08:06 +0200
Subject: add linux/seq_file.h for kernel >= 3.10.X
Origin: other, https://github.com/kolasa/fglrx-8.97.100.7/commit/8fe4ed8f29b70601a818cd7d04ecffcda0bb2193

---
 firegl_public.c |   78 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 74 insertions(+), 4 deletions(-)

diff --git a/common/lib/modules/fglrx/build_mod/firegl_public.c b/common/lib/modules/fglrx/build_mod/firegl_public.c
index c69e69d..03eddec 100644
--- a/common/lib/modules/fglrx/build_mod/firegl_public.c
+++ b/common/lib/modules/fglrx/build_mod/firegl_public.c
@@ -196,6 +196,10 @@
 #include "kcl_io.h"
 #include "kcl_debug.h"
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+#include <linux/seq_file.h>
+#endif
+
 // ============================================================
 
 // VM_SHM is deleted in 2.6.18 or higher kernels.
@@ -513,16 +517,26 @@ READ_PROC_WRAP(firegl_lock_info)
 #ifdef DEBUG
 READ_PROC_WRAP(drm_bq_info)
 #endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
 READ_PROC_WRAP(firegl_debug_proc_read)
+#endif
 READ_PROC_WRAP(firegl_bios_version)
 READ_PROC_WRAP(firegl_interrupt_info)
 READ_PROC_WRAP(firegl_ptm_info)
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
 static int firegl_debug_proc_write_wrap(void* file, const char *buffer, unsigned long count, void *data)
-{                                                                  
-    return firegl_debug_proc_write(file, buffer, count, data);     
+#else
+static int firegl_debug_proc_read_wrap(struct seq_file *m, void* data)
+{
+    return firegl_debug_proc_read(m->buf, m->from, m->index, m->size, m->size - m->count, data);
 }
 
+static ssize_t firegl_debug_proc_write_wrap(struct file *file, const char *buffer, size_t count, void *data)
+#endif
+{
+	return firegl_debug_proc_write(file, buffer, count, data);
+}
 /** \brief Callback function for reading from /proc/ati/major
  *
  * Returns the major device number in the outupt buffer in decimal.
@@ -536,9 +550,14 @@ static int firegl_debug_proc_write_wrap(void* file, const char *buffer, unsigned
  *
  * \return number of bytes written
  */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
 static int firegl_major_proc_read(char *buf, char **start, kcl_off_t offset,
                                   int request, int* eof, void* data)
+#else
+static int firegl_major_proc_read(struct seq_file *m, void* data)
+#endif
 {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
     int len = 0;    // For ProcFS: fill buf from the beginning
 
     KCL_DEBUG1(FN_FIREGL_PROC, "offset %d\n", (int)offset);
@@ -553,7 +572,9 @@ static int firegl_major_proc_read(char *buf, char **start, kcl_off_t offset,
     *eof = 1;
 
     len = snprintf(buf, request, "%d\n", major);
-
+#else
+	int len = seq_printf(m, "%d\n", major);
+#endif
     KCL_DEBUG1(FN_FIREGL_PROC, "return len=%i\n",len);
 
     return len;
@@ -576,6 +597,29 @@ kcl_proc_list_t KCL_PROC_FileList[] =
     { "NULL",           NULL,                       NULL} // Terminate List!!!
 };
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+static int firegl_major_proc_open(struct inode *inode, struct file *file){
+		return single_open(file, firegl_major_proc_read, NULL);
+}
+
+static const struct file_operations firegl_major_fops = {
+		.open = firegl_major_proc_open,
+		.read = seq_read,
+		.llseek = seq_lseek,
+};
+
+static int firegl_debug_proc_open(struct inode *inode, struct file *file){
+		return single_open(file, firegl_debug_proc_read_wrap, NULL);
+}
+
+static const struct file_operations firegl_debug_fops = {
+		.open = firegl_debug_proc_open,
+		.write = firegl_debug_proc_write_wrap,
+		.read = seq_read,
+		.llseek = seq_lseek,
+};
+#endif
+
 static struct proc_dir_entry *firegl_proc_init( device_t *dev,
                                                 int minor,
                                                 struct proc_dir_entry *root,
@@ -588,7 +632,11 @@ static struct proc_dir_entry *firegl_proc_init( device_t *dev,
     KCL_DEBUG1(FN_FIREGL_PROC, "minor %d, proc_list 0x%08lx\n", minor, (unsigned long)proc_list);
     if (!minor)
     {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
         root = create_proc_entry("ati", S_IFDIR, NULL);
+#else
+        root = proc_mkdir("ati", NULL);
+#endif
     }
 
     if (!root)
@@ -600,18 +648,28 @@ static struct proc_dir_entry *firegl_proc_init( device_t *dev,
     if (minor == 0)
     {
         // Global major debice number entry
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
         ent = create_proc_entry("major", S_IFREG|S_IRUGO, root);
+#else
+        ent = proc_create("major", S_IFREG|S_IRUGO, root, &firegl_major_fops);
+#endif
         if (!ent)
         {
             remove_proc_entry("ati", NULL);
             KCL_DEBUG_ERROR("Cannot create /proc/ati/major\n");
             return NULL;
         }
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
         ent->read_proc = (read_proc_t*)firegl_major_proc_read;
+#endif
     }
 
     sprintf(name, "%d", minor);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
     *dev_root = create_proc_entry(name, S_IFDIR, root);
+#else
+    *dev_root = proc_mkdir(name, root);
+#endif
     if (!*dev_root) {
         remove_proc_entry("major", root);
         remove_proc_entry("ati", NULL);
@@ -621,7 +679,12 @@ static struct proc_dir_entry *firegl_proc_init( device_t *dev,
 
     while (list->f || list->fops)
     {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
         ent = create_proc_entry(list->name, S_IFREG|S_IRUGO, *dev_root);
+#else
+        ent = proc_create_data(list->name, S_IFREG|S_IRUGO, *dev_root, &firegl_fops,
+			(dev->pubdev.signature == FGL_DEVICE_SIGNATURE)? firegl_find_device(minor) : (dev));
+#endif
         if (!ent)
         {
             KCL_DEBUG_ERROR("Cannot create /proc/ati/%s/%s\n", name, list->name);
@@ -639,6 +702,7 @@ static struct proc_dir_entry *firegl_proc_init( device_t *dev,
             return NULL;
         }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
         if (list->f)
         {
             ent->read_proc = (read_proc_t*)list->f;
@@ -652,19 +716,25 @@ static struct proc_dir_entry *firegl_proc_init( device_t *dev,
         {
             ent->data = (dev->pubdev.signature == FGL_DEVICE_SIGNATURE)? firegl_find_device(minor) : (dev);
         }
-
+#endif
         list++;
     }
 
     if (minor == 0)
     {
         // Global debug entry, only create it once
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
         ent = create_proc_entry("debug", S_IFREG|S_IRUGO, root);
+#else
+        ent = proc_create_data("debug", S_IFREG|S_IRUGO, root, &firegl_debug_fops, dev);
+#endif
         if (ent) 
         {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
             ent->read_proc = (read_proc_t*)firegl_debug_proc_read_wrap;     
             ent->write_proc = (write_proc_t*)firegl_debug_proc_write_wrap;  
             ent->data = dev;
+#endif
         }
     }
 
-- 
1.7.10.4

