|
@@ -1,9 +1,4 @@
|
|
|
/*
|
|
|
- * The list_sort function is (presumably) licensed under the GPL (see the
|
|
|
- * top level "COPYING" file for details).
|
|
|
- *
|
|
|
- * The remainder of this file is:
|
|
|
- *
|
|
|
* Copyright © 1997-2003 by The XFree86 Project, Inc.
|
|
|
* Copyright © 2007 Dave Airlie
|
|
|
* Copyright © 2007-2008 Intel Corporation
|
|
@@ -36,6 +31,7 @@
|
|
|
*/
|
|
|
|
|
|
#include <linux/list.h>
|
|
|
+#include <linux/list_sort.h>
|
|
|
#include "drmP.h"
|
|
|
#include "drm.h"
|
|
|
#include "drm_crtc.h"
|
|
@@ -855,6 +851,7 @@ EXPORT_SYMBOL(drm_mode_prune_invalid);
|
|
|
|
|
|
/**
|
|
|
* drm_mode_compare - compare modes for favorability
|
|
|
+ * @priv: unused
|
|
|
* @lh_a: list_head for first mode
|
|
|
* @lh_b: list_head for second mode
|
|
|
*
|
|
@@ -868,7 +865,7 @@ EXPORT_SYMBOL(drm_mode_prune_invalid);
|
|
|
* Negative if @lh_a is better than @lh_b, zero if they're equivalent, or
|
|
|
* positive if @lh_b is better than @lh_a.
|
|
|
*/
|
|
|
-static int drm_mode_compare(struct list_head *lh_a, struct list_head *lh_b)
|
|
|
+static int drm_mode_compare(void *priv, struct list_head *lh_a, struct list_head *lh_b)
|
|
|
{
|
|
|
struct drm_display_mode *a = list_entry(lh_a, struct drm_display_mode, head);
|
|
|
struct drm_display_mode *b = list_entry(lh_b, struct drm_display_mode, head);
|
|
@@ -885,85 +882,6 @@ static int drm_mode_compare(struct list_head *lh_a, struct list_head *lh_b)
|
|
|
return diff;
|
|
|
}
|
|
|
|
|
|
-/* FIXME: what we don't have a list sort function? */
|
|
|
-/* list sort from Mark J Roberts (mjr@znex.org) */
|
|
|
-void list_sort(struct list_head *head,
|
|
|
- int (*cmp)(struct list_head *a, struct list_head *b))
|
|
|
-{
|
|
|
- struct list_head *p, *q, *e, *list, *tail, *oldhead;
|
|
|
- int insize, nmerges, psize, qsize, i;
|
|
|
-
|
|
|
- list = head->next;
|
|
|
- list_del(head);
|
|
|
- insize = 1;
|
|
|
- for (;;) {
|
|
|
- p = oldhead = list;
|
|
|
- list = tail = NULL;
|
|
|
- nmerges = 0;
|
|
|
-
|
|
|
- while (p) {
|
|
|
- nmerges++;
|
|
|
- q = p;
|
|
|
- psize = 0;
|
|
|
- for (i = 0; i < insize; i++) {
|
|
|
- psize++;
|
|
|
- q = q->next == oldhead ? NULL : q->next;
|
|
|
- if (!q)
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- qsize = insize;
|
|
|
- while (psize > 0 || (qsize > 0 && q)) {
|
|
|
- if (!psize) {
|
|
|
- e = q;
|
|
|
- q = q->next;
|
|
|
- qsize--;
|
|
|
- if (q == oldhead)
|
|
|
- q = NULL;
|
|
|
- } else if (!qsize || !q) {
|
|
|
- e = p;
|
|
|
- p = p->next;
|
|
|
- psize--;
|
|
|
- if (p == oldhead)
|
|
|
- p = NULL;
|
|
|
- } else if (cmp(p, q) <= 0) {
|
|
|
- e = p;
|
|
|
- p = p->next;
|
|
|
- psize--;
|
|
|
- if (p == oldhead)
|
|
|
- p = NULL;
|
|
|
- } else {
|
|
|
- e = q;
|
|
|
- q = q->next;
|
|
|
- qsize--;
|
|
|
- if (q == oldhead)
|
|
|
- q = NULL;
|
|
|
- }
|
|
|
- if (tail)
|
|
|
- tail->next = e;
|
|
|
- else
|
|
|
- list = e;
|
|
|
- e->prev = tail;
|
|
|
- tail = e;
|
|
|
- }
|
|
|
- p = q;
|
|
|
- }
|
|
|
-
|
|
|
- tail->next = list;
|
|
|
- list->prev = tail;
|
|
|
-
|
|
|
- if (nmerges <= 1)
|
|
|
- break;
|
|
|
-
|
|
|
- insize *= 2;
|
|
|
- }
|
|
|
-
|
|
|
- head->next = list;
|
|
|
- head->prev = list->prev;
|
|
|
- list->prev->next = head;
|
|
|
- list->prev = head;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* drm_mode_sort - sort mode list
|
|
|
* @mode_list: list to sort
|
|
@@ -975,7 +893,7 @@ void list_sort(struct list_head *head,
|
|
|
*/
|
|
|
void drm_mode_sort(struct list_head *mode_list)
|
|
|
{
|
|
|
- list_sort(mode_list, drm_mode_compare);
|
|
|
+ list_sort(NULL, mode_list, drm_mode_compare);
|
|
|
}
|
|
|
EXPORT_SYMBOL(drm_mode_sort);
|
|
|
|