]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/macintosh/via-pmu.c
8139too: fix a TX timeout watchdog thread against NAPI softirq race
[linux-2.6-omap-h63xx.git] / drivers / macintosh / via-pmu.c
index 79c7b44a94eef5c87ab3cad7384ac5947bbc8e6a..6eb93e45fcd3f624005714b5c27dc7205e703c12 100644 (file)
@@ -55,6 +55,8 @@
 #include <asm/sections.h>
 #include <asm/irq.h>
 #include <asm/pmac_feature.h>
+#include <asm/pmac_pfunc.h>
+#include <asm/pmac_low_i2c.h>
 #include <asm/uaccess.h>
 #include <asm/mmu_context.h>
 #include <asm/cputable.h>
@@ -158,8 +160,8 @@ static int pmu_version;
 static int drop_interrupts;
 #if defined(CONFIG_PM) && defined(CONFIG_PPC32)
 static int option_lid_wakeup = 1;
-static int sleep_in_progress;
 #endif /* CONFIG_PM && CONFIG_PPC32 */
+static int sleep_in_progress;
 static unsigned long async_req_locks;
 static unsigned int pmu_irq_stats[11];
 
@@ -197,7 +199,6 @@ static int pmu_adb_reset_bus(void);
 #endif /* CONFIG_ADB */
 
 static int init_pmu(void);
-static int pmu_queue_request(struct adb_request *req);
 static void pmu_start(void);
 static irqreturn_t via_pmu_interrupt(int irq, void *arg, struct pt_regs *regs);
 static irqreturn_t gpio1_interrupt(int irq, void *arg, struct pt_regs *regs);
@@ -1802,258 +1803,6 @@ pmu_present(void)
        return via != 0;
 }
 
-struct pmu_i2c_hdr {
-       u8      bus;
-       u8      mode;
-       u8      bus2;
-       u8      address;
-       u8      sub_addr;
-       u8      comb_addr;
-       u8      count;
-};
-
-int
-pmu_i2c_combined_read(int bus, int addr, int subaddr,  u8* data, int len)
-{
-       struct adb_request      req;
-       struct pmu_i2c_hdr      *hdr = (struct pmu_i2c_hdr *)&req.data[1];
-       int retry;
-       int rc;
-
-       for (retry=0; retry<16; retry++) {
-               memset(&req, 0, sizeof(req));
-
-               hdr->bus = bus;
-               hdr->address = addr & 0xfe;
-               hdr->mode = PMU_I2C_MODE_COMBINED;
-               hdr->bus2 = 0;
-               hdr->sub_addr = subaddr;
-               hdr->comb_addr = addr | 1;
-               hdr->count = len;
-               
-               req.nbytes = sizeof(struct pmu_i2c_hdr) + 1;
-               req.reply_expected = 0;
-               req.reply_len = 0;
-               req.data[0] = PMU_I2C_CMD;
-               req.reply[0] = 0xff;
-               rc = pmu_queue_request(&req);
-               if (rc)
-                       return rc;
-               while(!req.complete)
-                       pmu_poll();
-               if (req.reply[0] == PMU_I2C_STATUS_OK)
-                       break;
-               mdelay(15);
-       }
-       if (req.reply[0] != PMU_I2C_STATUS_OK)
-               return -1;
-
-       for (retry=0; retry<16; retry++) {
-               memset(&req, 0, sizeof(req));
-
-               mdelay(15);
-
-               hdr->bus = PMU_I2C_BUS_STATUS;
-               req.reply[0] = 0xff;
-               
-               req.nbytes = 2;
-               req.reply_expected = 0;
-               req.reply_len = 0;
-               req.data[0] = PMU_I2C_CMD;
-               rc = pmu_queue_request(&req);
-               if (rc)
-                       return rc;
-               while(!req.complete)
-                       pmu_poll();
-               if (req.reply[0] == PMU_I2C_STATUS_DATAREAD) {
-                       memcpy(data, &req.reply[1], req.reply_len - 1);
-                       return req.reply_len - 1;
-               }
-       }
-       return -1;
-}
-
-int
-pmu_i2c_stdsub_write(int bus, int addr, int subaddr,  u8* data, int len)
-{
-       struct adb_request      req;
-       struct pmu_i2c_hdr      *hdr = (struct pmu_i2c_hdr *)&req.data[1];
-       int retry;
-       int rc;
-
-       for (retry=0; retry<16; retry++) {
-               memset(&req, 0, sizeof(req));
-
-               hdr->bus = bus;
-               hdr->address = addr & 0xfe;
-               hdr->mode = PMU_I2C_MODE_STDSUB;
-               hdr->bus2 = 0;
-               hdr->sub_addr = subaddr;
-               hdr->comb_addr = addr & 0xfe;
-               hdr->count = len;
-
-               req.data[0] = PMU_I2C_CMD;
-               memcpy(&req.data[sizeof(struct pmu_i2c_hdr) + 1], data, len);
-               req.nbytes = sizeof(struct pmu_i2c_hdr) + len + 1;
-               req.reply_expected = 0;
-               req.reply_len = 0;
-               req.reply[0] = 0xff;
-               rc = pmu_queue_request(&req);
-               if (rc)
-                       return rc;
-               while(!req.complete)
-                       pmu_poll();
-               if (req.reply[0] == PMU_I2C_STATUS_OK)
-                       break;
-               mdelay(15);
-       }
-       if (req.reply[0] != PMU_I2C_STATUS_OK)
-               return -1;
-
-       for (retry=0; retry<16; retry++) {
-               memset(&req, 0, sizeof(req));
-
-               mdelay(15);
-
-               hdr->bus = PMU_I2C_BUS_STATUS;
-               req.reply[0] = 0xff;
-               
-               req.nbytes = 2;
-               req.reply_expected = 0;
-               req.reply_len = 0;
-               req.data[0] = PMU_I2C_CMD;
-               rc = pmu_queue_request(&req);
-               if (rc)
-                       return rc;
-               while(!req.complete)
-                       pmu_poll();
-               if (req.reply[0] == PMU_I2C_STATUS_OK)
-                       return len;
-       }
-       return -1;
-}
-
-int
-pmu_i2c_simple_read(int bus, int addr,  u8* data, int len)
-{
-       struct adb_request      req;
-       struct pmu_i2c_hdr      *hdr = (struct pmu_i2c_hdr *)&req.data[1];
-       int retry;
-       int rc;
-
-       for (retry=0; retry<16; retry++) {
-               memset(&req, 0, sizeof(req));
-
-               hdr->bus = bus;
-               hdr->address = addr | 1;
-               hdr->mode = PMU_I2C_MODE_SIMPLE;
-               hdr->bus2 = 0;
-               hdr->sub_addr = 0;
-               hdr->comb_addr = 0;
-               hdr->count = len;
-
-               req.data[0] = PMU_I2C_CMD;
-               req.nbytes = sizeof(struct pmu_i2c_hdr) + 1;
-               req.reply_expected = 0;
-               req.reply_len = 0;
-               req.reply[0] = 0xff;
-               rc = pmu_queue_request(&req);
-               if (rc)
-                       return rc;
-               while(!req.complete)
-                       pmu_poll();
-               if (req.reply[0] == PMU_I2C_STATUS_OK)
-                       break;
-               mdelay(15);
-       }
-       if (req.reply[0] != PMU_I2C_STATUS_OK)
-               return -1;
-
-       for (retry=0; retry<16; retry++) {
-               memset(&req, 0, sizeof(req));
-
-               mdelay(15);
-
-               hdr->bus = PMU_I2C_BUS_STATUS;
-               req.reply[0] = 0xff;
-               
-               req.nbytes = 2;
-               req.reply_expected = 0;
-               req.reply_len = 0;
-               req.data[0] = PMU_I2C_CMD;
-               rc = pmu_queue_request(&req);
-               if (rc)
-                       return rc;
-               while(!req.complete)
-                       pmu_poll();
-               if (req.reply[0] == PMU_I2C_STATUS_DATAREAD) {
-                       memcpy(data, &req.reply[1], req.reply_len - 1);
-                       return req.reply_len - 1;
-               }
-       }
-       return -1;
-}
-
-int
-pmu_i2c_simple_write(int bus, int addr,  u8* data, int len)
-{
-       struct adb_request      req;
-       struct pmu_i2c_hdr      *hdr = (struct pmu_i2c_hdr *)&req.data[1];
-       int retry;
-       int rc;
-
-       for (retry=0; retry<16; retry++) {
-               memset(&req, 0, sizeof(req));
-
-               hdr->bus = bus;
-               hdr->address = addr & 0xfe;
-               hdr->mode = PMU_I2C_MODE_SIMPLE;
-               hdr->bus2 = 0;
-               hdr->sub_addr = 0;
-               hdr->comb_addr = 0;
-               hdr->count = len;
-
-               req.data[0] = PMU_I2C_CMD;
-               memcpy(&req.data[sizeof(struct pmu_i2c_hdr) + 1], data, len);
-               req.nbytes = sizeof(struct pmu_i2c_hdr) + len + 1;
-               req.reply_expected = 0;
-               req.reply_len = 0;
-               req.reply[0] = 0xff;
-               rc = pmu_queue_request(&req);
-               if (rc)
-                       return rc;
-               while(!req.complete)
-                       pmu_poll();
-               if (req.reply[0] == PMU_I2C_STATUS_OK)
-                       break;
-               mdelay(15);
-       }
-       if (req.reply[0] != PMU_I2C_STATUS_OK)
-               return -1;
-
-       for (retry=0; retry<16; retry++) {
-               memset(&req, 0, sizeof(req));
-
-               mdelay(15);
-
-               hdr->bus = PMU_I2C_BUS_STATUS;
-               req.reply[0] = 0xff;
-               
-               req.nbytes = 2;
-               req.reply_expected = 0;
-               req.reply_len = 0;
-               req.data[0] = PMU_I2C_CMD;
-               rc = pmu_queue_request(&req);
-               if (rc)
-                       return rc;
-               while(!req.complete)
-                       pmu_poll();
-               if (req.reply[0] == PMU_I2C_STATUS_OK)
-                       return len;
-       }
-       return -1;
-}
-
 #ifdef CONFIG_PM
 
 static LIST_HEAD(sleep_notifiers);
@@ -2358,8 +2107,9 @@ pmac_suspend_devices(void)
                return -EBUSY;
        }
 
-       /* Disable clock spreading on some machines */
-       pmac_tweak_clock_spreading(0);
+       /* Call platform functions marked "on sleep" */
+       pmac_pfunc_i2c_suspend();
+       pmac_pfunc_base_suspend();
 
        /* Stop preemption */
        preempt_disable();
@@ -2431,8 +2181,9 @@ pmac_wakeup_devices(void)
        mdelay(10);
        preempt_enable();
 
-       /* Re-enable clock spreading on some machines */
-       pmac_tweak_clock_spreading(1);
+       /* Call platform functions marked "on wake" */
+       pmac_pfunc_base_resume();
+       pmac_pfunc_i2c_resume();
 
        /* Resume devices */
        device_resume();
@@ -3150,16 +2901,13 @@ static int __init init_pmu_sysfs(void)
 subsys_initcall(init_pmu_sysfs);
 
 EXPORT_SYMBOL(pmu_request);
+EXPORT_SYMBOL(pmu_queue_request);
 EXPORT_SYMBOL(pmu_poll);
 EXPORT_SYMBOL(pmu_poll_adb);
 EXPORT_SYMBOL(pmu_wait_complete);
 EXPORT_SYMBOL(pmu_suspend);
 EXPORT_SYMBOL(pmu_resume);
 EXPORT_SYMBOL(pmu_unlock);
-EXPORT_SYMBOL(pmu_i2c_combined_read);
-EXPORT_SYMBOL(pmu_i2c_stdsub_write);
-EXPORT_SYMBOL(pmu_i2c_simple_read);
-EXPORT_SYMBOL(pmu_i2c_simple_write);
 #if defined(CONFIG_PM) && defined(CONFIG_PPC32)
 EXPORT_SYMBOL(pmu_enable_irled);
 EXPORT_SYMBOL(pmu_battery_count);