Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[pandora-kernel.git] / drivers / char / agp / efficeon-agp.c
index e7aea77..30f730f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Transmeta's Efficeon AGPGART driver.
- * 
+ *
  * Based upon a diff by Linus around November '02.
  *
  * Ported to the 2.6 kernel by Carlos Puchol <cpglinux@puchol.com>
@@ -9,7 +9,7 @@
 
 /*
  * NOTE-cpg-040217:
- * 
+ *
  *   - when compiled as a module, after loading the module,
  *     it will refuse to unload, indicating it is in use,
  *     when it is not.
@@ -45,7 +45,7 @@
  *      8: Present
  *    7:6: reserved, write as zero
  *    5:0: GATT directory index: which 1st-level entry
- * 
+ *
  * The Efficeon AGP spec requires pages to be WB-cacheable
  * but to be explicitly CLFLUSH'd after any changes.
  */
@@ -64,6 +64,12 @@ static struct gatt_mask efficeon_generic_masks[] =
        {.mask = 0x00000001, .type = 0}
 };
 
+/* This function does the same thing as mask_memory() for this chipset... */
+static inline unsigned long efficeon_mask_memory(unsigned long addr)
+{
+       return addr | 0x00000001;
+}
+
 static struct aper_size_info_lvl2 efficeon_generic_sizes[4] =
 {
        {256, 65536, 0},
@@ -125,7 +131,7 @@ static int efficeon_configure(void)
        struct aper_size_info_lvl2 *current_size;
 
        printk(KERN_DEBUG PFX "efficeon_configure()\n");
-       
+
        current_size = A_SIZE_LVL2(agp_bridge->current_size);
 
        /* aperture size */
@@ -171,7 +177,7 @@ static int efficeon_free_gatt_table(struct agp_bridge_data *bridge)
 
 
 /*
- * Since we don't need contigious memory we just try
+ * Since we don't need contiguous memory we just try
  * to get the gatt table once
  */
 
@@ -190,7 +196,7 @@ static int efficeon_create_gatt_table(struct agp_bridge_data *bridge)
        const int present = EFFICEON_PRESENT;
        const int clflush_chunk = ((cpuid_ebx(1) >> 8) & 0xff) << 3;
        int num_entries, l1_pages;
-       
+
        num_entries = A_SIZE_LVL2(agp_bridge->current_size)->num_entries;
 
        printk(KERN_DEBUG PFX "efficeon_create_gatt_table(%d)\n", num_entries);
@@ -251,18 +257,18 @@ static int efficeon_insert_memory(struct agp_memory * mem, off_t pg_start, int t
        last_page = NULL;
        for (i = 0; i < count; i++) {
                int index = pg_start + i;
-               unsigned long insert = mem->memory[i];
+               unsigned long insert = efficeon_mask_memory(mem->memory[i]);
 
                page = (unsigned int *) efficeon_private.l1_table[index >> 10];
 
                if (!page)
                        continue;
-               
+
                page += (index & 0x3ff);
                *page = insert;
 
                /* clflush is slow, so don't clflush until we have to */
-               if ( last_page && 
+               if ( last_page &&
                     ((unsigned long)page^(unsigned long)last_page) & clflush_mask )
                    asm volatile("clflush %0" : : "m" (*last_page));
 
@@ -331,13 +337,6 @@ static struct agp_bridge_driver efficeon_driver = {
        .agp_destroy_page       = agp_generic_destroy_page,
 };
 
-
-static int agp_efficeon_resume(struct pci_dev *pdev)
-{
-       printk(KERN_DEBUG PFX "agp_efficeon_resume()\n");
-       return efficeon_configure();
-}
-
 static int __devinit agp_efficeon_probe(struct pci_dev *pdev,
                                     const struct pci_device_id *ent)
 {
@@ -373,7 +372,7 @@ static int __devinit agp_efficeon_probe(struct pci_dev *pdev,
        */
        r = &pdev->resource[0];
        if (!r->start && r->end) {
-               if(pci_assign_resource(pdev, 0)) {
+               if (pci_assign_resource(pdev, 0)) {
                        printk(KERN_ERR PFX "could not assign resource 0\n");
                        return -ENODEV;
                }
@@ -408,11 +407,18 @@ static void __devexit agp_efficeon_remove(struct pci_dev *pdev)
        agp_put_bridge(bridge);
 }
 
+#ifdef CONFIG_PM
 static int agp_efficeon_suspend(struct pci_dev *dev, pm_message_t state)
 {
        return 0;
 }
 
+static int agp_efficeon_resume(struct pci_dev *pdev)
+{
+       printk(KERN_DEBUG PFX "agp_efficeon_resume()\n");
+       return efficeon_configure();
+}
+#endif
 
 static struct pci_device_id agp_efficeon_pci_table[] = {
        {
@@ -433,8 +439,10 @@ static struct pci_driver agp_efficeon_pci_driver = {
        .id_table       = agp_efficeon_pci_table,
        .probe          = agp_efficeon_probe,
        .remove         = agp_efficeon_remove,
+#ifdef CONFIG_PM
        .suspend        = agp_efficeon_suspend,
        .resume         = agp_efficeon_resume,
+#endif
 };
 
 static int __init agp_efficeon_init(void)