Merge with Linus' kernel.
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Sat, 7 Jan 2006 14:40:05 +0000 (14:40 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 7 Jan 2006 14:40:05 +0000 (14:40 +0000)
153 files changed:
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/boot/Makefile
arch/arm/common/Kconfig
arch/arm/common/Makefile
arch/arm/common/amba.c
arch/arm/common/scoop.c
arch/arm/common/sharpsl_pm.c [new file with mode: 0644]
arch/arm/configs/ixp4xx_defconfig
arch/arm/kernel/Makefile
arch/arm/kernel/apm.c
arch/arm/kernel/dma-isa.c
arch/arm/kernel/dma.c
arch/arm/kernel/entry-armv.S
arch/arm/kernel/head.S
arch/arm/kernel/irq.c
arch/arm/kernel/process.c
arch/arm/kernel/setup.c
arch/arm/kernel/time.c
arch/arm/kernel/traps.c
arch/arm/kernel/vmlinux.lds.S
arch/arm/mach-aaec2000/clock.c
arch/arm/mach-aaec2000/core.c
arch/arm/mach-aaec2000/core.h
arch/arm/mach-clps711x/dma.c [deleted file]
arch/arm/mach-epxa10db/dma.c [deleted file]
arch/arm/mach-footbridge/dma.c
arch/arm/mach-imx/mx1ads.c
arch/arm/mach-integrator/clock.c
arch/arm/mach-integrator/core.c
arch/arm/mach-integrator/dma.c [deleted file]
arch/arm/mach-integrator/impd1.c
arch/arm/mach-integrator/integrator_ap.c
arch/arm/mach-integrator/integrator_cp.c
arch/arm/mach-integrator/time.c
arch/arm/mach-iop3xx/iop331-setup.c
arch/arm/mach-ixp4xx/Kconfig
arch/arm/mach-ixp4xx/Makefile
arch/arm/mach-ixp4xx/common-pci.c
arch/arm/mach-ixp4xx/common.c
arch/arm/mach-ixp4xx/coyote-pci.c
arch/arm/mach-ixp4xx/coyote-setup.c
arch/arm/mach-ixp4xx/gtwx5715-setup.c
arch/arm/mach-ixp4xx/ixdp425-pci.c
arch/arm/mach-ixp4xx/ixdp425-setup.c
arch/arm/mach-ixp4xx/ixdpg425-pci.c
arch/arm/mach-ixp4xx/nas100d-pci.c [new file with mode: 0644]
arch/arm/mach-ixp4xx/nas100d-power.c [new file with mode: 0644]
arch/arm/mach-ixp4xx/nas100d-setup.c [new file with mode: 0644]
arch/arm/mach-ixp4xx/nslu2-pci.c
arch/arm/mach-ixp4xx/nslu2-power.c
arch/arm/mach-pxa/Kconfig
arch/arm/mach-pxa/corgi_pm.c
arch/arm/mach-pxa/mainstone.c
arch/arm/mach-pxa/sharpsl.h
arch/arm/mach-pxa/sharpsl_pm.c
arch/arm/mach-pxa/spitz.c
arch/arm/mach-pxa/spitz_pm.c
arch/arm/mach-realview/clock.c
arch/arm/mach-realview/core.c
arch/arm/mach-realview/core.h
arch/arm/mach-realview/realview_eb.c
arch/arm/mach-rpc/dma.c
arch/arm/mach-s3c2410/clock.c
arch/arm/mach-s3c2410/clock.h
arch/arm/mach-s3c2410/time.c
arch/arm/mach-sa1100/pm.c
arch/arm/mach-versatile/clock.c
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/core.h
arch/arm/mach-versatile/versatile_ab.c
arch/arm/mach-versatile/versatile_pb.c
arch/arm/mm/consistent.c
arch/arm/mm/discontig.c
arch/arm/mm/mm-armv.c
drivers/char/watchdog/s3c2410_wdt.c
drivers/i2c/busses/i2c-s3c2410.c
drivers/input/serio/ambakmi.c
drivers/mmc/mmci.c
drivers/mtd/nand/s3c2410.c
drivers/pcmcia/pxa2xx_sharpsl.c
drivers/serial/amba-pl010.c
drivers/serial/amba-pl011.c
drivers/serial/s3c2410.c
drivers/usb/host/ohci-s3c2410.c
drivers/video/amba-clcd.c
drivers/video/backlight/corgi_bl.c
drivers/video/imxfb.c
drivers/video/s3c2410fb.c
include/asm-arm/arch-aaec2000/dma.h
include/asm-arm/arch-cl7500/dma.h
include/asm-arm/arch-cl7500/entry-macro.S
include/asm-arm/arch-clps711x/dma.h
include/asm-arm/arch-clps711x/entry-macro.S
include/asm-arm/arch-clps711x/system.h
include/asm-arm/arch-ebsa110/dma.h
include/asm-arm/arch-ebsa285/dma.h
include/asm-arm/arch-ebsa285/entry-macro.S
include/asm-arm/arch-epxa10db/dma.h
include/asm-arm/arch-imx/dma.h
include/asm-arm/arch-imx/entry-macro.S
include/asm-arm/arch-integrator/debug-macro.S
include/asm-arm/arch-integrator/dma.h
include/asm-arm/arch-integrator/entry-macro.S
include/asm-arm/arch-iop3xx/dma.h
include/asm-arm/arch-iop3xx/entry-macro.S
include/asm-arm/arch-ixp2000/dma.h
include/asm-arm/arch-ixp2000/enp2611.h
include/asm-arm/arch-ixp2000/entry-macro.S
include/asm-arm/arch-ixp2000/io.h
include/asm-arm/arch-ixp2000/ixp2000-regs.h
include/asm-arm/arch-ixp4xx/coyote.h
include/asm-arm/arch-ixp4xx/dma.h
include/asm-arm/arch-ixp4xx/entry-macro.S
include/asm-arm/arch-ixp4xx/gtwx5715.h
include/asm-arm/arch-ixp4xx/hardware.h
include/asm-arm/arch-ixp4xx/irqs.h
include/asm-arm/arch-ixp4xx/ixdp425.h
include/asm-arm/arch-ixp4xx/memory.h
include/asm-arm/arch-ixp4xx/nas100d.h [new file with mode: 0644]
include/asm-arm/arch-ixp4xx/nslu2.h
include/asm-arm/arch-ixp4xx/platform.h
include/asm-arm/arch-l7200/dma.h
include/asm-arm/arch-l7200/system.h
include/asm-arm/arch-lh7a40x/dma.h
include/asm-arm/arch-lh7a40x/entry-macro.S
include/asm-arm/arch-omap/dma.h
include/asm-arm/arch-omap/entry-macro.S
include/asm-arm/arch-pxa/dma.h
include/asm-arm/arch-pxa/entry-macro.S
include/asm-arm/arch-pxa/pxa-regs.h
include/asm-arm/arch-realview/debug-macro.S
include/asm-arm/arch-realview/dma.h
include/asm-arm/arch-realview/entry-macro.S
include/asm-arm/arch-rpc/entry-macro.S
include/asm-arm/arch-s3c2410/dma.h
include/asm-arm/arch-s3c2410/entry-macro.S
include/asm-arm/arch-sa1100/dma.h
include/asm-arm/arch-versatile/debug-macro.S
include/asm-arm/arch-versatile/dma.h
include/asm-arm/arch-versatile/entry-macro.S
include/asm-arm/byteorder.h
include/asm-arm/cacheflush.h
include/asm-arm/dma.h
include/asm-arm/hardware/clock.h
include/asm-arm/hardware/sharpsl_pm.h [new file with mode: 0644]
include/asm-arm/mach/dma.h
include/asm-arm/scatterlist.h
include/linux/amba/bus.h [moved from include/asm-arm/hardware/amba.h with 100% similarity]
include/linux/amba/clcd.h [moved from include/asm-arm/hardware/amba_clcd.h with 100% similarity]
include/linux/amba/kmi.h [moved from include/asm-arm/hardware/amba_kmi.h with 100% similarity]
include/linux/amba/serial.h [moved from include/asm-arm/hardware/amba_serial.h with 100% similarity]
sound/arm/aaci.c

index 4b15f5f1e254d24ae1234c6de3697b5f85efa5ba..16a5d522b2f2d93a2fcb097aeed620b3fd4090de 100644 (file)
@@ -154,6 +154,7 @@ config ARCH_RPC
        select FIQ
        select TIMER_ACORN
        select ARCH_MAY_HAVE_PC_FDC
+       select ISA_DMA_API
        help
          On the Acorn Risc-PC, Linux can support the internal IDE disk and
          CD-ROM interface, serial and parallel port, and the floppy drive.
@@ -206,6 +207,7 @@ config ARCH_IMX
 
 config ARCH_H720X
        bool "Hynix-HMS720x-based"
+       select ISA_DMA_API
        help
          This enables support for systems based on the Hynix HMS720x
 
@@ -290,12 +292,14 @@ config ISA
          (MCA) or VESA.  ISA is an older system, now being displaced by PCI;
          newer boards don't support it.  If you have ISA, say Y, otherwise N.
 
+# Select ISA DMA controller support
 config ISA_DMA
        bool
+       select ISA_DMA_API
 
+# Select ISA DMA interface
 config ISA_DMA_API
        bool
-       default y
 
 config PCI
        bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB
@@ -656,7 +660,6 @@ source "kernel/power/Kconfig"
 
 config APM
        tristate "Advanced Power Management Emulation"
-       depends on PM_LEGACY
        ---help---
          APM is a BIOS specification for saving power using several different
          techniques. This is mostly useful for battery powered laptops with
index 81bd2193fe6d696799bef4c8a58f08961a8675e0..afaf3a1e903ca8194b99c3c6896314090d3fb35c 100644 (file)
@@ -8,7 +8,7 @@
 # Copyright (C) 1995-2001 by Russell King
 
 LDFLAGS_vmlinux        :=-p --no-undefined -X
-CPPFLAGS_vmlinux.lds = -DKERNEL_RAM_ADDR=$(TEXTADDR)
+CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET)
 OBJCOPYFLAGS   :=-O binary -R .note -R .comment -S
 GZFLAGS                :=-9
 #CFLAGS                +=-pipe
@@ -65,7 +65,7 @@ CHECKFLAGS    += -D__arm__
 
 #Default value
 head-y         := arch/arm/kernel/head.o arch/arm/kernel/init_task.o
-textaddr-y     := 0xC0008000
+textofs-y      := 0x00008000
 
  machine-$(CONFIG_ARCH_RPC)       := rpc
  machine-$(CONFIG_ARCH_EBSA110)           := ebsa110
@@ -73,22 +73,20 @@ textaddr-y  := 0xC0008000
   incdir-$(CONFIG_ARCH_CLPS7500)   := cl7500
  machine-$(CONFIG_FOOTBRIDGE)     := footbridge
   incdir-$(CONFIG_FOOTBRIDGE)     := ebsa285
-textaddr-$(CONFIG_ARCH_CO285)     := 0x60008000
  machine-$(CONFIG_ARCH_CO285)     := footbridge
   incdir-$(CONFIG_ARCH_CO285)     := ebsa285
  machine-$(CONFIG_ARCH_SHARK)     := shark
  machine-$(CONFIG_ARCH_SA1100)    := sa1100
 ifeq ($(CONFIG_ARCH_SA1100),y)
 # SA1111 DMA bug: we don't want the kernel to live in precious DMA-able memory
-textaddr-$(CONFIG_SA1111)         := 0xc0208000
+ textofs-$(CONFIG_SA1111)         := 0x00208000
 endif
  machine-$(CONFIG_ARCH_PXA)       := pxa
  machine-$(CONFIG_ARCH_L7200)     := l7200
  machine-$(CONFIG_ARCH_INTEGRATOR) := integrator
  machine-$(CONFIG_ARCH_CAMELOT)           := epxa10db
-textaddr-$(CONFIG_ARCH_CLPS711X)   := 0xc0028000
+ textofs-$(CONFIG_ARCH_CLPS711X)   := 0x00028000
  machine-$(CONFIG_ARCH_CLPS711X)   := clps711x
-textaddr-$(CONFIG_ARCH_FORTUNET)   := 0xc0008000
  machine-$(CONFIG_ARCH_IOP3XX)    := iop3xx
  machine-$(CONFIG_ARCH_IXP4XX)    := ixp4xx
  machine-$(CONFIG_ARCH_IXP2000)    := ixp2000
@@ -110,7 +108,8 @@ CFLAGS_3c589_cs.o :=-DISA_SIXTEEN_BIT_PERIPHERAL
 export CFLAGS_3c589_cs.o
 endif
 
-TEXTADDR := $(textaddr-y)
+# The byte offset of the kernel image in RAM from the start of RAM.
+TEXT_OFFSET := $(textofs-y)
 
 ifeq ($(incdir-y),)
 incdir-y := $(machine-y)
@@ -123,7 +122,7 @@ else
 MACHINE  :=
 endif
   
-export TEXTADDR GZFLAGS
+export TEXT_OFFSET GZFLAGS
 
 # Do we have FASTFPE?
 FASTFPE                :=arch/arm/fastfpe
index 937a353bc37ce070656023aac3d7edf66d0a2f2c..a174d63395ea7df73883480f79f5dd54fdaeeaaa 100644 (file)
@@ -15,7 +15,7 @@ include $(srctree)/$(MACHINE)/Makefile.boot
 endif
 
 # Note: the following conditions must always be true:
-#   ZRELADDR == virt_to_phys(TEXTADDR)
+#   ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
 #   PARAMS_PHYS must be within 4MB of ZRELADDR
 #   INITRD_PHYS must be in RAM
 ZRELADDR    := $(zreladdr-y)
index 666ba393575b8d7800b5b8a14d4e5ce1466932bc..d7509c7a3c5e651a2634ea04f203aca8a5226f4f 100644 (file)
@@ -23,5 +23,8 @@ config SHARP_LOCOMO
 config SHARP_PARAM
        bool
 
+config SHARPSL_PM
+       bool
+
 config SHARP_SCOOP
        bool
index a87886564b19e0b9c33798cdae6947114e0e5947..2685051b30131666c703f5bd607eb9878ab6fefc 100644 (file)
@@ -13,4 +13,5 @@ obj-$(CONFIG_DMABOUNCE)               += dmabounce.o
 obj-$(CONFIG_TIMER_ACORN)      += time-acorn.o
 obj-$(CONFIG_SHARP_LOCOMO)     += locomo.o
 obj-$(CONFIG_SHARP_PARAM)      += sharpsl_param.o
+obj-$(CONFIG_SHARPSL_PM)       += sharpsl_pm.o
 obj-$(CONFIG_SHARP_SCOOP)      += scoop.o
index c95ec9eab9964043b78da6d950ad39a17dcec8aa..1bbdd1693d5764430ba027a4291246358f9a29db 100644 (file)
 #include <linux/device.h>
 #include <linux/string.h>
 #include <linux/slab.h>
+#include <linux/amba/bus.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
-#include <asm/hardware/amba.h>
 #include <asm/sizes.h>
 
 #define to_amba_device(d)      container_of(d, struct amba_device, dev)
index 0c3cbd9a388b90d085f0e7b98113f375a2bfd512..b6de43e736998b05c2d598ccf530d0ece0dcec2e 100644 (file)
@@ -33,7 +33,6 @@ void reset_scoop(struct device *dev)
 
        SCOOP_REG(sdev->base,SCOOP_MCR) = 0x0100;  // 00
        SCOOP_REG(sdev->base,SCOOP_CDR) = 0x0000;  // 04
-       SCOOP_REG(sdev->base,SCOOP_CPR) = 0x0000;  // 0C
        SCOOP_REG(sdev->base,SCOOP_CCR) = 0x0000;  // 10
        SCOOP_REG(sdev->base,SCOOP_IMR) = 0x0000;  // 18
        SCOOP_REG(sdev->base,SCOOP_IRM) = 0x00FF;  // 14
@@ -154,6 +153,7 @@ int __init scoop_probe(struct platform_device *pdev)
 
        SCOOP_REG(devptr->base, SCOOP_MCR) = 0x0140;
        reset_scoop(&pdev->dev);
+       SCOOP_REG(devptr->base, SCOOP_CPR) = 0x0000;
        SCOOP_REG(devptr->base, SCOOP_GPCR) = inf->io_dir & 0xffff;
        SCOOP_REG(devptr->base, SCOOP_GPWR) = inf->io_out & 0xffff;
 
diff --git a/arch/arm/common/sharpsl_pm.c b/arch/arm/common/sharpsl_pm.c
new file mode 100644 (file)
index 0000000..978d32e
--- /dev/null
@@ -0,0 +1,839 @@
+/*
+ * Battery and Power Management code for the Sharp SL-C7xx and SL-Cxx00
+ * series of PDAs
+ *
+ * Copyright (c) 2004-2005 Richard Purdie
+ *
+ * Based on code written by Sharp for 2.4 kernels
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#undef DEBUG
+
+#include <linux/module.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/apm_bios.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+
+#include <asm/hardware.h>
+#include <asm/mach-types.h>
+#include <asm/irq.h>
+#include <asm/apm.h>
+#include <asm/arch/pm.h>
+#include <asm/arch/pxa-regs.h>
+#include <asm/arch/sharpsl.h>
+#include <asm/hardware/sharpsl_pm.h>
+
+/*
+ * Constants
+ */
+#define SHARPSL_CHARGE_ON_TIME_INTERVAL        (msecs_to_jiffies(1*60*1000))  /* 1 min */
+#define SHARPSL_CHARGE_FINISH_TIME             (msecs_to_jiffies(10*60*1000)) /* 10 min */
+#define SHARPSL_BATCHK_TIME                    (msecs_to_jiffies(15*1000))    /* 15 sec */
+#define SHARPSL_BATCHK_TIME_SUSPEND            (60*10)                        /* 10 min */
+#define SHARPSL_WAIT_CO_TIME                   15  /* 15 sec */
+#define SHARPSL_WAIT_DISCHARGE_ON              100 /* 100 msec */
+#define SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP   10  /* 10 msec */
+#define SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT   10  /* 10 msec */
+#define SHARPSL_CHECK_BATTERY_WAIT_TIME_ACIN   10  /* 10 msec */
+#define SHARPSL_CHARGE_WAIT_TIME               15  /* 15 msec */
+#define SHARPSL_CHARGE_CO_CHECK_TIME           5   /* 5 msec */
+#define SHARPSL_CHARGE_RETRY_CNT               1   /* eqv. 10 min */
+
+#define SHARPSL_CHARGE_ON_VOLT         0x99  /* 2.9V */
+#define SHARPSL_CHARGE_ON_TEMP         0xe0  /* 2.9V */
+#define SHARPSL_CHARGE_ON_ACIN_HIGH    0x9b  /* 6V */
+#define SHARPSL_CHARGE_ON_ACIN_LOW     0x34  /* 2V */
+#define SHARPSL_FATAL_ACIN_VOLT        182   /* 3.45V */
+#define SHARPSL_FATAL_NOACIN_VOLT      170   /* 3.40V */
+
+/*
+ * Prototypes
+ */
+static int sharpsl_off_charge_battery(void);
+static int sharpsl_check_battery_temp(void);
+static int sharpsl_check_battery_voltage(void);
+static int sharpsl_ac_check(void);
+static int sharpsl_fatal_check(void);
+static int sharpsl_average_value(int ad);
+static void sharpsl_average_clear(void);
+static void sharpsl_charge_toggle(void *private_);
+static void sharpsl_battery_thread(void *private_);
+
+
+/*
+ * Variables
+ */
+struct sharpsl_pm_status sharpsl_pm;
+DECLARE_WORK(toggle_charger, sharpsl_charge_toggle, NULL);
+DECLARE_WORK(sharpsl_bat, sharpsl_battery_thread, NULL);
+
+
+static int get_percentage(int voltage)
+{
+       int i = sharpsl_pm.machinfo->bat_levels - 1;
+       struct battery_thresh *thresh;
+
+       if (sharpsl_pm.charge_mode == CHRG_ON)
+               thresh=sharpsl_pm.machinfo->bat_levels_acin;
+       else
+               thresh=sharpsl_pm.machinfo->bat_levels_noac;
+
+       while (i > 0 && (voltage > thresh[i].voltage))
+               i--;
+
+       return thresh[i].percentage;
+}
+
+static int get_apm_status(int voltage)
+{
+       int low_thresh, high_thresh;
+
+       if (sharpsl_pm.charge_mode == CHRG_ON) {
+               high_thresh = sharpsl_pm.machinfo->status_high_acin;
+               low_thresh = sharpsl_pm.machinfo->status_low_acin;
+       } else {
+               high_thresh = sharpsl_pm.machinfo->status_high_noac;
+               low_thresh = sharpsl_pm.machinfo->status_low_noac;
+       }
+
+       if (voltage >= high_thresh)
+               return APM_BATTERY_STATUS_HIGH;
+       if (voltage >= low_thresh)
+               return APM_BATTERY_STATUS_LOW;
+       return APM_BATTERY_STATUS_CRITICAL;
+}
+
+void sharpsl_battery_kick(void)
+{
+       schedule_delayed_work(&sharpsl_bat, msecs_to_jiffies(125));
+}
+EXPORT_SYMBOL(sharpsl_battery_kick);
+
+
+static void sharpsl_battery_thread(void *private_)
+{
+       int voltage, percent, apm_status, i = 0;
+
+       if (!sharpsl_pm.machinfo)
+               return;
+
+       sharpsl_pm.battstat.ac_status = (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN) ? APM_AC_ONLINE : APM_AC_OFFLINE);
+
+       /* Corgi cannot confirm when battery fully charged so periodically kick! */
+       if (machine_is_corgi() && (sharpsl_pm.charge_mode == CHRG_ON)
+                       && time_after(jiffies, sharpsl_pm.charge_start_time +  SHARPSL_CHARGE_ON_TIME_INTERVAL))
+               schedule_work(&toggle_charger);
+
+       while(1) {
+               voltage = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT);
+
+               if (voltage > 0) break;
+               if (i++ > 5) {
+                       voltage = sharpsl_pm.machinfo->bat_levels_noac[0].voltage;
+                       dev_warn(sharpsl_pm.dev, "Warning: Cannot read main battery!\n");
+                       break;
+               }
+       }
+
+       voltage = sharpsl_average_value(voltage);
+       apm_status = get_apm_status(voltage);
+       percent = get_percentage(voltage);
+
+       /* At low battery voltages, the voltage has a tendency to start
+           creeping back up so we try to avoid this here */
+       if ((sharpsl_pm.battstat.ac_status == APM_AC_ONLINE) || (apm_status == APM_BATTERY_STATUS_HIGH) ||  percent <= sharpsl_pm.battstat.mainbat_percent) {
+               sharpsl_pm.battstat.mainbat_voltage = voltage;
+               sharpsl_pm.battstat.mainbat_status = apm_status;
+               sharpsl_pm.battstat.mainbat_percent = percent;
+       }
+
+       dev_dbg(sharpsl_pm.dev, "Battery: voltage: %d, status: %d, percentage: %d, time: %d\n", voltage,
+                       sharpsl_pm.battstat.mainbat_status, sharpsl_pm.battstat.mainbat_percent, jiffies);
+
+       /* If battery is low. limit backlight intensity to save power. */
+       if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE)
+                       && ((sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_LOW) ||
+                       (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL))) {
+               if (!(sharpsl_pm.flags & SHARPSL_BL_LIMIT)) {
+                       corgibl_limit_intensity(1);
+                       sharpsl_pm.flags |= SHARPSL_BL_LIMIT;
+               }
+       } else if (sharpsl_pm.flags & SHARPSL_BL_LIMIT) {
+               corgibl_limit_intensity(0);
+               sharpsl_pm.flags &= ~SHARPSL_BL_LIMIT;
+       }
+
+       /* Suspend if critical battery level */
+       if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE)
+                       && (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL)
+                       && !(sharpsl_pm.flags & SHARPSL_APM_QUEUED)) {
+               sharpsl_pm.flags |= SHARPSL_APM_QUEUED;
+               dev_err(sharpsl_pm.dev, "Fatal Off\n");
+               apm_queue_event(APM_CRITICAL_SUSPEND);
+       }
+
+       schedule_delayed_work(&sharpsl_bat, SHARPSL_BATCHK_TIME);
+}
+
+void sharpsl_pm_led(int val)
+{
+       if (val == SHARPSL_LED_ERROR) {
+               dev_err(sharpsl_pm.dev, "Charging Error!\n");
+       } else if (val == SHARPSL_LED_ON) {
+               dev_dbg(sharpsl_pm.dev, "Charge LED On\n");
+
+       } else {
+               dev_dbg(sharpsl_pm.dev, "Charge LED Off\n");
+
+       }
+}
+
+static void sharpsl_charge_on(void)
+{
+       dev_dbg(sharpsl_pm.dev, "Turning Charger On\n");
+
+       sharpsl_pm.full_count = 0;
+       sharpsl_pm.charge_mode = CHRG_ON;
+       schedule_delayed_work(&toggle_charger, msecs_to_jiffies(250));
+       schedule_delayed_work(&sharpsl_bat, msecs_to_jiffies(500));
+}
+
+static void sharpsl_charge_off(void)
+{
+       dev_dbg(sharpsl_pm.dev, "Turning Charger Off\n");
+
+       sharpsl_pm.machinfo->charge(0);
+       sharpsl_pm_led(SHARPSL_LED_OFF);
+       sharpsl_pm.charge_mode = CHRG_OFF;
+
+       schedule_work(&sharpsl_bat);
+}
+
+static void sharpsl_charge_error(void)
+{
+       sharpsl_pm_led(SHARPSL_LED_ERROR);
+       sharpsl_pm.machinfo->charge(0);
+       sharpsl_pm.charge_mode = CHRG_ERROR;
+}
+
+static void sharpsl_charge_toggle(void *private_)
+{
+       dev_dbg(sharpsl_pm.dev, "Toogling Charger at time: %lx\n", jiffies);
+
+       if (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN)) {
+               sharpsl_charge_off();
+               return;
+       } else if ((sharpsl_check_battery_temp() < 0) || (sharpsl_ac_check() < 0)) {
+               sharpsl_charge_error();
+               return;
+       }
+
+       sharpsl_pm_led(SHARPSL_LED_ON);
+       sharpsl_pm.machinfo->charge(0);
+       mdelay(SHARPSL_CHARGE_WAIT_TIME);
+       sharpsl_pm.machinfo->charge(1);
+
+       sharpsl_pm.charge_start_time = jiffies;
+}
+
+static void sharpsl_ac_timer(unsigned long data)
+{
+       int acin = sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN);
+
+       dev_dbg(sharpsl_pm.dev, "AC Status: %d\n",acin);
+
+       sharpsl_average_clear();
+       if (acin && (sharpsl_pm.charge_mode != CHRG_ON))
+               sharpsl_charge_on();
+       else if (sharpsl_pm.charge_mode == CHRG_ON)
+               sharpsl_charge_off();
+
+       schedule_work(&sharpsl_bat);
+}
+
+
+irqreturn_t sharpsl_ac_isr(int irq, void *dev_id, struct pt_regs *fp)
+{
+       /* Delay the event slightly to debounce */
+       /* Must be a smaller delay than the chrg_full_isr below */
+       mod_timer(&sharpsl_pm.ac_timer, jiffies + msecs_to_jiffies(250));
+
+       return IRQ_HANDLED;
+}
+
+static void sharpsl_chrg_full_timer(unsigned long data)
+{
+       dev_dbg(sharpsl_pm.dev, "Charge Full at time: %lx\n", jiffies);
+
+       sharpsl_pm.full_count++;
+
+       if (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN)) {
+               dev_dbg(sharpsl_pm.dev, "Charge Full: AC removed - stop charging!\n");
+               if (sharpsl_pm.charge_mode == CHRG_ON)
+                       sharpsl_charge_off();
+       } else if (sharpsl_pm.full_count < 2) {
+               dev_dbg(sharpsl_pm.dev, "Charge Full: Count too low\n");
+               schedule_work(&toggle_charger);
+       } else if (time_after(jiffies, sharpsl_pm.charge_start_time + SHARPSL_CHARGE_FINISH_TIME)) {
+               dev_dbg(sharpsl_pm.dev, "Charge Full: Interrupt generated too slowly - retry.\n");
+               schedule_work(&toggle_charger);
+       } else {
+               sharpsl_charge_off();
+               sharpsl_pm.charge_mode = CHRG_DONE;
+               dev_dbg(sharpsl_pm.dev, "Charge Full: Charging Finished\n");
+       }
+}
+
+/* Charging Finished Interrupt (Not present on Corgi) */
+/* Can trigger at the same time as an AC staus change so
+   delay until after that has been processed */
+irqreturn_t sharpsl_chrg_full_isr(int irq, void *dev_id, struct pt_regs *fp)
+{
+       if (sharpsl_pm.flags & SHARPSL_SUSPENDED)
+               return IRQ_HANDLED;
+
+       /* delay until after any ac interrupt */
+       mod_timer(&sharpsl_pm.chrg_full_timer, jiffies + msecs_to_jiffies(500));
+
+       return IRQ_HANDLED;
+}
+
+irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id, struct pt_regs *fp)
+{
+       int is_fatal = 0;
+
+       if (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) {
+               dev_err(sharpsl_pm.dev, "Battery now Unlocked! Suspending.\n");
+               is_fatal = 1;
+       }
+
+       if (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_FATAL)) {
+               dev_err(sharpsl_pm.dev, "Fatal Batt Error! Suspending.\n");
+               is_fatal = 1;
+       }
+
+       if (!(sharpsl_pm.flags & SHARPSL_APM_QUEUED) && is_fatal) {
+               sharpsl_pm.flags |= SHARPSL_APM_QUEUED;
+               apm_queue_event(APM_CRITICAL_SUSPEND);
+       }
+
+       return IRQ_HANDLED;
+}
+
+/*
+ * Maintain an average of the last 10 readings
+ */
+#define SHARPSL_CNV_VALUE_NUM    10
+static int sharpsl_ad_index;
+
+static void sharpsl_average_clear(void)
+{
+       sharpsl_ad_index = 0;
+}
+
+static int sharpsl_average_value(int ad)
+{
+       int i, ad_val = 0;
+       static int sharpsl_ad[SHARPSL_CNV_VALUE_NUM+1];
+
+       if (sharpsl_pm.battstat.mainbat_status != APM_BATTERY_STATUS_HIGH) {
+               sharpsl_ad_index = 0;
+               return ad;
+       }
+
+       sharpsl_ad[sharpsl_ad_index] = ad;
+       sharpsl_ad_index++;
+       if (sharpsl_ad_index >= SHARPSL_CNV_VALUE_NUM) {
+               for (i=0; i < (SHARPSL_CNV_VALUE_NUM-1); i++)
+                       sharpsl_ad[i] = sharpsl_ad[i+1];
+               sharpsl_ad_index = SHARPSL_CNV_VALUE_NUM - 1;
+       }
+       for (i=0; i < sharpsl_ad_index; i++)
+               ad_val += sharpsl_ad[i];
+
+       return (ad_val / sharpsl_ad_index);
+}
+
+/*
+ * Take an array of 5 integers, remove the maximum and minimum values
+ * and return the average.
+ */
+static int get_select_val(int *val)
+{
+       int i, j, k, temp, sum = 0;
+
+       /* Find MAX val */
+       temp = val[0];
+       j=0;
+       for (i=1; i<5; i++) {
+               if (temp < val[i]) {
+                       temp = val[i];
+                       j = i;
+               }
+       }
+
+       /* Find MIN val */
+       temp = val[4];
+       k=4;
+       for (i=3; i>=0; i--) {
+               if (temp > val[i]) {
+                       temp = val[i];
+                       k = i;
+               }
+       }
+
+       for (i=0; i<5; i++)
+               if (i != j && i != k )
+                       sum += val[i];
+
+       dev_dbg(sharpsl_pm.dev, "Average: %d from values: %d, %d, %d, %d, %d\n", sum/3, val[0], val[1], val[2], val[3], val[4]);
+
+       return (sum/3);
+}
+
+static int sharpsl_check_battery_temp(void)
+{
+       int val, i, buff[5];
+
+       /* Check battery temperature */
+       for (i=0; i<5; i++) {
+               mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP);
+               sharpsl_pm.machinfo->measure_temp(1);
+               mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP);
+               buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_TEMP);
+               sharpsl_pm.machinfo->measure_temp(0);
+       }
+
+       val = get_select_val(buff);
+
+       dev_dbg(sharpsl_pm.dev, "Temperature: %d\n", val);
+       if (val > SHARPSL_CHARGE_ON_TEMP)
+               return -1;
+
+       return 0;
+}
+
+static int sharpsl_check_battery_voltage(void)
+{
+       int val, i, buff[5];
+
+       /* disable charge, enable discharge */
+       sharpsl_pm.machinfo->charge(0);
+       sharpsl_pm.machinfo->discharge(1);
+       mdelay(SHARPSL_WAIT_DISCHARGE_ON);
+
+       if (sharpsl_pm.machinfo->discharge1)
+               sharpsl_pm.machinfo->discharge1(1);
+
+       /* Check battery voltage */
+       for (i=0; i<5; i++) {
+               buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT);
+               mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
+       }
+
+       if (sharpsl_pm.machinfo->discharge1)
+               sharpsl_pm.machinfo->discharge1(0);
+
+       sharpsl_pm.machinfo->discharge(0);
+
+       val = get_select_val(buff);
+       dev_dbg(sharpsl_pm.dev, "Battery Voltage: %d\n", val);
+
+       if (val < SHARPSL_CHARGE_ON_VOLT)
+               return -1;
+
+       return 0;
+}
+
+static int sharpsl_ac_check(void)
+{
+       int temp, i, buff[5];
+
+       for (i=0; i<5; i++) {
+               buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_ACIN_VOLT);
+               mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_ACIN);
+       }
+
+       temp = get_select_val(buff);
+       dev_dbg(sharpsl_pm.dev, "AC Voltage: %d\n",temp);
+
+       if ((temp > SHARPSL_CHARGE_ON_ACIN_HIGH) || (temp < SHARPSL_CHARGE_ON_ACIN_LOW)) {
+               dev_err(sharpsl_pm.dev, "Error: AC check failed.\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+#ifdef CONFIG_PM
+static int sharpsl_pm_suspend(struct platform_device *pdev, pm_message_t state)
+{
+       sharpsl_pm.flags |= SHARPSL_SUSPENDED;
+       flush_scheduled_work();
+
+       if (sharpsl_pm.charge_mode == CHRG_ON)
+               sharpsl_pm.flags |= SHARPSL_DO_OFFLINE_CHRG;
+       else
+               sharpsl_pm.flags &= ~SHARPSL_DO_OFFLINE_CHRG;
+
+       return 0;
+}
+
+static int sharpsl_pm_resume(struct platform_device *pdev)
+{
+       /* Clear the reset source indicators as they break the bootloader upon reboot */
+       RCSR = 0x0f;
+       sharpsl_average_clear();
+       sharpsl_pm.flags &= ~SHARPSL_APM_QUEUED;
+       sharpsl_pm.flags &= ~SHARPSL_SUSPENDED;
+
+       return 0;
+}
+
+static void corgi_goto_sleep(unsigned long alarm_time, unsigned int alarm_enable, suspend_state_t state)
+{
+       dev_dbg(sharpsl_pm.dev, "Time is: %08x\n",RCNR);
+
+       dev_dbg(sharpsl_pm.dev, "Offline Charge Activate = %d\n",sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG);
+       /* not charging and AC-IN! */
+
+       if ((sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG) && (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN))) {
+               dev_dbg(sharpsl_pm.dev, "Activating Offline Charger...\n");
+               sharpsl_pm.charge_mode = CHRG_OFF;
+               sharpsl_pm.flags &= ~SHARPSL_DO_OFFLINE_CHRG;
+               sharpsl_off_charge_battery();
+       }
+
+       sharpsl_pm.machinfo->presuspend();
+
+       PEDR = 0xffffffff; /* clear it */
+
+       sharpsl_pm.flags &= ~SHARPSL_ALARM_ACTIVE;
+       if ((sharpsl_pm.charge_mode == CHRG_ON) && ((alarm_enable && ((alarm_time - RCNR) > (SHARPSL_BATCHK_TIME_SUSPEND + 30))) || !alarm_enable)) {
+               RTSR &= RTSR_ALE;
+               RTAR = RCNR + SHARPSL_BATCHK_TIME_SUSPEND;
+               dev_dbg(sharpsl_pm.dev, "Charging alarm at: %08x\n",RTAR);
+               sharpsl_pm.flags |= SHARPSL_ALARM_ACTIVE;
+       } else if (alarm_enable) {
+               RTSR &= RTSR_ALE;
+               RTAR = alarm_time;
+               dev_dbg(sharpsl_pm.dev, "User alarm at: %08x\n",RTAR);
+       } else {
+               dev_dbg(sharpsl_pm.dev, "No alarms set.\n");
+       }
+
+       pxa_pm_enter(state);
+
+       sharpsl_pm.machinfo->postsuspend();
+
+       dev_dbg(sharpsl_pm.dev, "Corgi woken up from suspend: %08x\n",PEDR);
+}
+
+static int corgi_enter_suspend(unsigned long alarm_time, unsigned int alarm_enable, suspend_state_t state)
+{
+       if (!sharpsl_pm.machinfo->should_wakeup(!(sharpsl_pm.flags & SHARPSL_ALARM_ACTIVE) && alarm_enable) )
+       {
+               if (!(sharpsl_pm.flags & SHARPSL_ALARM_ACTIVE)) {
+                       dev_dbg(sharpsl_pm.dev, "No user triggered wakeup events and not charging. Strange. Suspend.\n");
+                       corgi_goto_sleep(alarm_time, alarm_enable, state);
+                       return 1;
+               }
+               if(sharpsl_off_charge_battery()) {
+                       dev_dbg(sharpsl_pm.dev, "Charging. Suspend...\n");
+                       corgi_goto_sleep(alarm_time, alarm_enable, state);
+                       return 1;
+               }
+               dev_dbg(sharpsl_pm.dev, "User triggered wakeup in offline charger.\n");
+       }
+
+       if ((!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) || (sharpsl_fatal_check() < 0) )
+       {
+               dev_err(sharpsl_pm.dev, "Fatal condition. Suspend.\n");
+               corgi_goto_sleep(alarm_time, alarm_enable, state);
+               return 1;
+       }
+
+       return 0;
+}
+
+static int corgi_pxa_pm_enter(suspend_state_t state)
+{
+       unsigned long alarm_time = RTAR;
+       unsigned int alarm_status = ((RTSR & RTSR_ALE) != 0);
+
+       dev_dbg(sharpsl_pm.dev, "SharpSL suspending for first time.\n");
+
+       corgi_goto_sleep(alarm_time, alarm_status, state);
+
+       while (corgi_enter_suspend(alarm_time,alarm_status,state))
+               {}
+
+       dev_dbg(sharpsl_pm.dev, "SharpSL resuming...\n");
+
+       return 0;
+}
+#endif
+
+
+/*
+ * Check for fatal battery errors
+ * Fatal returns -1
+ */
+static int sharpsl_fatal_check(void)
+{
+       int buff[5], temp, i, acin;
+
+       dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check entered\n");
+
+       /* Check AC-Adapter */
+       acin = sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN);
+
+       if (acin && (sharpsl_pm.charge_mode == CHRG_ON)) {
+               sharpsl_pm.machinfo->charge(0);
+               udelay(100);
+               sharpsl_pm.machinfo->discharge(1);      /* enable discharge */
+               mdelay(SHARPSL_WAIT_DISCHARGE_ON);
+       }
+
+       if (sharpsl_pm.machinfo->discharge1)
+               sharpsl_pm.machinfo->discharge1(1);
+
+       /* Check battery : check inserting battery ? */
+       for (i=0; i<5; i++) {
+               buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT);
+               mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
+       }
+
+       if (sharpsl_pm.machinfo->discharge1)
+               sharpsl_pm.machinfo->discharge1(0);
+
+       if (acin && (sharpsl_pm.charge_mode == CHRG_ON)) {
+               udelay(100);
+               sharpsl_pm.machinfo->charge(1);
+               sharpsl_pm.machinfo->discharge(0);
+       }
+
+       temp = get_select_val(buff);
+       dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check: acin: %d, discharge voltage: %d, no discharge: %d\n", acin, temp, sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT));
+
+       if ((acin && (temp < SHARPSL_FATAL_ACIN_VOLT)) ||
+                       (!acin && (temp < SHARPSL_FATAL_NOACIN_VOLT)))
+               return -1;
+       return 0;
+}
+
+static int sharpsl_off_charge_error(void)
+{
+       dev_err(sharpsl_pm.dev, "Offline Charger: Error occured.\n");
+       sharpsl_pm.machinfo->charge(0);
+       sharpsl_pm_led(SHARPSL_LED_ERROR);
+       sharpsl_pm.charge_mode = CHRG_ERROR;
+       return 1;
+}
+
+/*
+ * Charging Control while suspended
+ * Return 1 - go straight to sleep
+ * Return 0 - sleep or wakeup depending on other factors
+ */
+static int sharpsl_off_charge_battery(void)
+{
+       int time;
+
+       dev_dbg(sharpsl_pm.dev, "Charge Mode: %d\n", sharpsl_pm.charge_mode);
+
+       if (sharpsl_pm.charge_mode == CHRG_OFF) {
+               dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 1\n");
+
+               /* AC Check */
+               if ((sharpsl_ac_check() < 0) || (sharpsl_check_battery_temp() < 0))
+                       return sharpsl_off_charge_error();
+
+               /* Start Charging */
+               sharpsl_pm_led(SHARPSL_LED_ON);
+               sharpsl_pm.machinfo->charge(0);
+               mdelay(SHARPSL_CHARGE_WAIT_TIME);
+               sharpsl_pm.machinfo->charge(1);
+
+               sharpsl_pm.charge_mode = CHRG_ON;
+               sharpsl_pm.full_count = 0;
+
+               return 1;
+       } else if (sharpsl_pm.charge_mode != CHRG_ON) {
+               return 1;
+       }
+
+       if (sharpsl_pm.full_count == 0) {
+               int time;
+
+               dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 2\n");
+
+               if ((sharpsl_check_battery_temp() < 0) || (sharpsl_check_battery_voltage() < 0))
+                       return sharpsl_off_charge_error();
+
+               sharpsl_pm.machinfo->charge(0);
+               mdelay(SHARPSL_CHARGE_WAIT_TIME);
+               sharpsl_pm.machinfo->charge(1);
+               sharpsl_pm.charge_mode = CHRG_ON;
+
+               mdelay(SHARPSL_CHARGE_CO_CHECK_TIME);
+
+               time = RCNR;
+               while(1) {
+                       /* Check if any wakeup event had occured */
+                       if (sharpsl_pm.machinfo->charger_wakeup() != 0)
+                               return 0;
+                       /* Check for timeout */
+                       if ((RCNR - time) > SHARPSL_WAIT_CO_TIME)
+                               return 1;
+                       if (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_CHRGFULL)) {
+                               dev_dbg(sharpsl_pm.dev, "Offline Charger: Charge full occured. Retrying to check\n");
+                               sharpsl_pm.full_count++;
+                               sharpsl_pm.machinfo->charge(0);
+                               mdelay(SHARPSL_CHARGE_WAIT_TIME);
+                               sharpsl_pm.machinfo->charge(1);
+                               return 1;
+                       }
+               }
+       }
+
+       dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 3\n");
+
+       mdelay(SHARPSL_CHARGE_CO_CHECK_TIME);
+
+       time = RCNR;
+       while(1) {
+               /* Check if any wakeup event had occured */
+               if (sharpsl_pm.machinfo->charger_wakeup() != 0)
+                       return 0;
+               /* Check for timeout */
+               if ((RCNR-time) > SHARPSL_WAIT_CO_TIME) {
+                       if (sharpsl_pm.full_count > SHARPSL_CHARGE_RETRY_CNT) {
+                               dev_dbg(sharpsl_pm.dev, "Offline Charger: Not charged sufficiently. Retrying.\n");
+                               sharpsl_pm.full_count = 0;
+                       }
+                       sharpsl_pm.full_count++;
+                       return 1;
+               }
+               if (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_CHRGFULL)) {
+                       dev_dbg(sharpsl_pm.dev, "Offline Charger: Charging complete.\n");
+                       sharpsl_pm_led(SHARPSL_LED_OFF);
+                       sharpsl_pm.machinfo->charge(0);
+                       sharpsl_pm.charge_mode = CHRG_DONE;
+                       return 1;
+               }
+       }
+}
+
+
+static ssize_t battery_percentage_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       return sprintf(buf, "%d\n",sharpsl_pm.battstat.mainbat_percent);
+}
+
+static ssize_t battery_voltage_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       return sprintf(buf, "%d\n",sharpsl_pm.battstat.mainbat_voltage);
+}
+
+static DEVICE_ATTR(battery_percentage, 0444, battery_percentage_show, NULL);
+static DEVICE_ATTR(battery_voltage, 0444, battery_voltage_show, NULL);
+
+extern void (*apm_get_power_status)(struct apm_power_info *);
+
+static void sharpsl_apm_get_power_status(struct apm_power_info *info)
+{
+       info->ac_line_status = sharpsl_pm.battstat.ac_status;
+
+       if (sharpsl_pm.charge_mode == CHRG_ON)
+               info->battery_status = APM_BATTERY_STATUS_CHARGING;
+       else
+               info->battery_status = sharpsl_pm.battstat.mainbat_status;
+
+       info->battery_flag = (1 << info->battery_status);
+       info->battery_life = sharpsl_pm.battstat.mainbat_percent;
+}
+
+static struct pm_ops sharpsl_pm_ops = {
+       .pm_disk_mode   = PM_DISK_FIRMWARE,
+       .prepare        = pxa_pm_prepare,
+       .enter          = corgi_pxa_pm_enter,
+       .finish         = pxa_pm_finish,
+};
+
+static int __init sharpsl_pm_probe(struct platform_device *pdev)
+{
+       if (!pdev->dev.platform_data)
+               return -EINVAL;
+
+       sharpsl_pm.dev = &pdev->dev;
+       sharpsl_pm.machinfo = pdev->dev.platform_data;
+       sharpsl_pm.charge_mode = CHRG_OFF;
+       sharpsl_pm.flags = 0;
+
+       init_timer(&sharpsl_pm.ac_timer);
+       sharpsl_pm.ac_timer.function = sharpsl_ac_timer;
+
+       init_timer(&sharpsl_pm.chrg_full_timer);
+       sharpsl_pm.chrg_full_timer.function = sharpsl_chrg_full_timer;
+
+       sharpsl_pm.machinfo->init();
+
+       device_create_file(&pdev->dev, &dev_attr_battery_percentage);
+       device_create_file(&pdev->dev, &dev_attr_battery_voltage);
+
+       apm_get_power_status = sharpsl_apm_get_power_status;
+
+       pm_set_ops(&sharpsl_pm_ops);
+
+       mod_timer(&sharpsl_pm.ac_timer, jiffies + msecs_to_jiffies(250));
+
+       return 0;
+}
+
+static int sharpsl_pm_remove(struct platform_device *pdev)
+{
+       pm_set_ops(NULL);
+
+       device_remove_file(&pdev->dev, &dev_attr_battery_percentage);
+       device_remove_file(&pdev->dev, &dev_attr_battery_voltage);
+
+       sharpsl_pm.machinfo->exit();
+
+       del_timer_sync(&sharpsl_pm.chrg_full_timer);
+       del_timer_sync(&sharpsl_pm.ac_timer);
+
+       return 0;
+}
+
+static struct platform_driver sharpsl_pm_driver = {
+       .probe          = sharpsl_pm_probe,
+       .remove         = sharpsl_pm_remove,
+       .suspend        = sharpsl_pm_suspend,
+       .resume         = sharpsl_pm_resume,
+       .driver         = {
+               .name           = "sharpsl-pm",
+       },
+};
+
+static int __devinit sharpsl_pm_init(void)
+{
+       return platform_driver_register(&sharpsl_pm_driver);
+}
+
+static void sharpsl_pm_exit(void)
+{
+       platform_driver_unregister(&sharpsl_pm_driver);
+}
+
+late_initcall(sharpsl_pm_init);
+module_exit(sharpsl_pm_exit);
index f74c926beb428dc0434f74f136f8cb415e7bc76d..613afab62720a1ca89182a44095173b9ced4826b 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc1-git5
-# Tue Sep 20 17:26:28 2005
+# Linux kernel version: 2.6.15
+# Tue Jan  3 03:20:40 2006
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -33,6 +33,7 @@ CONFIG_SYSCTL=y
 CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
 CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
@@ -42,7 +43,6 @@ CONFIG_BUG=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_SHMEM=y
 CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
@@ -61,6 +61,23 @@ CONFIG_MODVERSIONS=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # System Type
 #
@@ -83,6 +100,7 @@ CONFIG_ARCH_IXP4XX=y
 # CONFIG_ARCH_LH7A40X is not set
 # CONFIG_ARCH_OMAP is not set
 # CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_REALVIEW is not set
 # CONFIG_ARCH_IMX is not set
 # CONFIG_ARCH_H720X is not set
 # CONFIG_ARCH_AAEC2000 is not set
@@ -102,6 +120,7 @@ CONFIG_MACH_IXDPG425=y
 CONFIG_MACH_IXDP465=y
 CONFIG_ARCH_IXCDP1100=y
 CONFIG_ARCH_PRPMC1100=y
+CONFIG_MACH_NAS100D=y
 CONFIG_ARCH_IXDP4XX=y
 CONFIG_CPU_IXP46X=y
 # CONFIG_MACH_GTWX5715 is not set
@@ -155,6 +174,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
 CONFIG_ALIGNMENT_TRAP=y
 
 #
@@ -173,6 +193,7 @@ CONFIG_CMDLINE="console=ttyS0,115200 ip=bootp root=/dev/nfs"
 # At least one emulation must be selected
 #
 CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_NWFPE_XP is not set
 # CONFIG_FPE_FASTFPE is not set
 
 #
@@ -187,6 +208,8 @@ CONFIG_BINFMT_ELF=y
 # Power management options
 #
 CONFIG_PM=y
+CONFIG_PM_LEGACY=y
+# CONFIG_PM_DEBUG is not set
 CONFIG_APM=y
 
 #
@@ -271,6 +294,10 @@ CONFIG_IP_VS_SH=m
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
 CONFIG_BRIDGE_NETFILTER=y
+
+#
+# Core Netfilter Configuration
+#
 # CONFIG_NETFILTER_NETLINK is not set
 
 #
@@ -286,6 +313,7 @@ CONFIG_IP_NF_IRC=m
 # CONFIG_IP_NF_NETBIOS_NS is not set
 # CONFIG_IP_NF_TFTP is not set
 # CONFIG_IP_NF_AMANDA is not set
+# CONFIG_IP_NF_PPTP is not set
 CONFIG_IP_NF_QUEUE=m
 CONFIG_IP_NF_IPTABLES=m
 CONFIG_IP_NF_MATCH_LIMIT=m
@@ -319,6 +347,7 @@ CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
 CONFIG_IP_NF_TARGET_TCPMSS=m
+# CONFIG_IP_NF_TARGET_NFQUEUE is not set
 CONFIG_IP_NF_NAT=m
 CONFIG_IP_NF_NAT_NEEDED=y
 CONFIG_IP_NF_TARGET_MASQUERADE=m
@@ -380,10 +409,18 @@ CONFIG_ECONET=m
 CONFIG_ECONET_AUNUDP=y
 CONFIG_ECONET_NATIVE=y
 CONFIG_WAN_ROUTER=m
+
+#
+# QoS and/or fair queueing
+#
 CONFIG_NET_SCHED=y
 CONFIG_NET_SCH_CLK_JIFFIES=y
 # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
 # CONFIG_NET_SCH_CLK_CPU is not set
+
+#
+# Queueing/Scheduling
+#
 CONFIG_NET_SCH_CBQ=m
 CONFIG_NET_SCH_HTB=m
 # CONFIG_NET_SCH_HFSC is not set
@@ -397,8 +434,10 @@ CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
 # CONFIG_NET_SCH_NETEM is not set
 CONFIG_NET_SCH_INGRESS=m
-CONFIG_NET_QOS=y
-CONFIG_NET_ESTIMATOR=y
+
+#
+# Classification
+#
 CONFIG_NET_CLS=y
 # CONFIG_NET_CLS_BASIC is not set
 CONFIG_NET_CLS_TCINDEX=m
@@ -407,13 +446,14 @@ CONFIG_NET_CLS_ROUTE=y
 CONFIG_NET_CLS_FW=m
 CONFIG_NET_CLS_U32=m
 # CONFIG_CLS_U32_PERF is not set
-# CONFIG_NET_CLS_IND is not set
 # CONFIG_CLS_U32_MARK is not set
 CONFIG_NET_CLS_RSVP=m
 CONFIG_NET_CLS_RSVP6=m
 # CONFIG_NET_EMATCH is not set
 # CONFIG_NET_CLS_ACT is not set
 CONFIG_NET_CLS_POLICE=y
+# CONFIG_NET_CLS_IND is not set
+CONFIG_NET_ESTIMATOR=y
 
 #
 # Network testing
@@ -436,6 +476,11 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 # CONFIG_FW_LOADER is not set
 # CONFIG_DEBUG_DRIVER is not set
 
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
 #
 # Memory Technology Devices (MTD)
 #
@@ -458,6 +503,7 @@ CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
 # CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -492,7 +538,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 # CONFIG_MTD_PHYSMAP is not set
 # CONFIG_MTD_ARM_INTEGRATOR is not set
 CONFIG_MTD_IXP4XX=y
-# CONFIG_MTD_EDB7312 is not set
 # CONFIG_MTD_PCI is not set
 # CONFIG_MTD_PLATRAM is not set
 
@@ -522,6 +567,11 @@ CONFIG_MTD_NAND_IDS=m
 # CONFIG_MTD_NAND_DISKONCHIP is not set
 # CONFIG_MTD_NAND_NANDSIM is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -548,14 +598,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -668,6 +710,7 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_SMC91X is not set
 # CONFIG_DM9000 is not set
@@ -739,6 +782,7 @@ CONFIG_NET_RADIO=y
 #
 # Wireless 802.11b ISA/PCI cards support
 #
+# CONFIG_AIRO is not set
 CONFIG_HERMES=y
 # CONFIG_PLX_HERMES is not set
 # CONFIG_TMD_HERMES is not set
@@ -782,6 +826,7 @@ CONFIG_WAN_ROUTER_DRIVERS=y
 #
 # ATM drivers
 #
+# CONFIG_ATM_DUMMY is not set
 CONFIG_ATM_TCP=m
 # CONFIG_ATM_LANAI is not set
 # CONFIG_ATM_ENI is not set
@@ -902,6 +947,7 @@ CONFIG_IXP4XX_WATCHDOG=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -954,6 +1000,7 @@ CONFIG_SENSORS_EEPROM=y
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_RTC_X1205_I2C is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -1035,6 +1082,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB is not set
 
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
 #
 # USB Gadget Support
 #
@@ -1110,6 +1161,7 @@ CONFIG_RAMFS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -1190,7 +1242,9 @@ CONFIG_DETECT_SOFTLOCKUP=y
 CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
 CONFIG_FRAME_POINTER=y
+# CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_DEBUG_USER is not set
 # CONFIG_DEBUG_WAITQ is not set
 CONFIG_DEBUG_ERRORS=y
index c11169b5ed9a4f391cdd7b25b977ee3fa7a75aa1..de94b0f3ee2a658c8ced0c87d9460ca4f2e0f1ac 100644 (file)
@@ -2,15 +2,16 @@
 # Makefile for the linux kernel.
 #
 
-AFLAGS_head.o := -DKERNEL_RAM_ADDR=$(TEXTADDR)
+AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
 
 # Object file lists.
 
-obj-y          := compat.o dma.o entry-armv.o entry-common.o irq.o \
+obj-y          := compat.o entry-armv.o entry-common.o irq.o \
                   process.o ptrace.o semaphore.o setup.o signal.o sys_arm.o \
                   time.o traps.o
 
 obj-$(CONFIG_APM)              += apm.o
+obj-$(CONFIG_ISA_DMA_API)      += dma.o
 obj-$(CONFIG_ARCH_ACORN)       += ecard.o 
 obj-$(CONFIG_FOOTBRIDGE)       += isa.o
 obj-$(CONFIG_FIQ)              += fiq.o
index a2843be0555733feaa8fc5cc29574817ce5c6c4d..b9df1b782bb1128b72b30739dbc92671d14c8d2e 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/apm_bios.h>
 #include <linux/sched.h>
 #include <linux/pm.h>
-#include <linux/pm_legacy.h>
 #include <linux/device.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
@@ -81,6 +80,7 @@ struct apm_user {
  */
 static int suspends_pending;
 static int apm_disabled;
+static int arm_apm_active;
 
 static DECLARE_WAIT_QUEUE_HEAD(apm_waitqueue);
 static DECLARE_WAIT_QUEUE_HEAD(apm_suspend_waitqueue);
@@ -477,9 +477,9 @@ static int kapmd(void *arg)
                apm_event_t event;
 
                wait_event_interruptible(kapmd_wait,
-                               !queue_empty(&kapmd_queue) || !pm_active);
+                               !queue_empty(&kapmd_queue) || !arm_apm_active);
 
-               if (!pm_active)
+               if (!arm_apm_active)
                        break;
 
                spin_lock_irq(&kapmd_queue_lock);
@@ -522,16 +522,11 @@ static int __init apm_init(void)
                return -ENODEV;
        }
 
-       if (PM_IS_ACTIVE()) {
-               printk(KERN_NOTICE "apm: overridden by ACPI.\n");
-               return -EINVAL;
-       }
-
-       pm_active = 1;
+       arm_apm_active = 1;
 
        ret = kernel_thread(kapmd, NULL, CLONE_KERNEL);
        if (ret < 0) {
-               pm_active = 0;
+               arm_apm_active = 0;
                return ret;
        }
 
@@ -543,7 +538,7 @@ static int __init apm_init(void)
        if (ret != 0) {
                remove_proc_entry("apm", NULL);
 
-               pm_active = 0;
+               arm_apm_active = 0;
                wake_up(&kapmd_wait);
                wait_for_completion(&kapmd_exit);
        }
@@ -556,7 +551,7 @@ static void __exit apm_exit(void)
        misc_deregister(&apm_device);
        remove_proc_entry("apm", NULL);
 
-       pm_active = 0;
+       arm_apm_active = 0;
        wake_up(&kapmd_wait);
        wait_for_completion(&kapmd_exit);
 }
index e9a36304ec3e0c7b1db77845e835ec2a5d3ac018..03532769a97f38840bea46f2969c914d857eb9d4 100644 (file)
@@ -18,7 +18,7 @@
  */
 #include <linux/ioport.h>
 #include <linux/init.h>
-#include <linux/pci.h>
+#include <linux/dma-mapping.h>
 
 #include <asm/dma.h>
 #include <asm/io.h>
@@ -65,37 +65,41 @@ static void isa_enable_dma(dmach_t channel, dma_t *dma)
 {
        if (dma->invalid) {
                unsigned long address, length;
-               unsigned int mode, direction;
+               unsigned int mode;
+               enum dma_data_direction direction;
 
                mode = channel & 3;
                switch (dma->dma_mode & DMA_MODE_MASK) {
                case DMA_MODE_READ:
                        mode |= ISA_DMA_MODE_READ;
-                       direction = PCI_DMA_FROMDEVICE;
+                       direction = DMA_FROM_DEVICE;
                        break;
 
                case DMA_MODE_WRITE:
                        mode |= ISA_DMA_MODE_WRITE;
-                       direction = PCI_DMA_TODEVICE;
+                       direction = DMA_TO_DEVICE;
                        break;
 
                case DMA_MODE_CASCADE:
                        mode |= ISA_DMA_MODE_CASCADE;
-                       direction = PCI_DMA_BIDIRECTIONAL;
+                       direction = DMA_BIDIRECTIONAL;
                        break;
 
                default:
-                       direction = PCI_DMA_NONE;
+                       direction = DMA_NONE;
                        break;
                }
 
-               if (!dma->using_sg) {
+               if (!dma->sg) {
                        /*
                         * Cope with ISA-style drivers which expect cache
                         * coherence.
                         */
-                       dma->buf.dma_address = pci_map_single(NULL,
-                               dma->buf.__address, dma->buf.length,
+                       dma->sg = &dma->buf;
+                       dma->sgcount = 1;
+                       dma->buf.length = dma->count;
+                       dma->buf.dma_address = dma_map_single(NULL,
+                               dma->addr, dma->count,
                                direction);
                }
 
index 2b78838842346da390e8547cd37035184376d506..5a0f4bc5da954492043571f24e430afe4f26a928 100644 (file)
@@ -12,8 +12,6 @@
  *  DMA facilities.
  */
 #include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/mman.h>
 #include <linux/init.h>
 #include <linux/spinlock.h>
 #include <linux/errno.h>
@@ -23,8 +21,7 @@
 #include <asm/mach/dma.h>
 
 DEFINE_SPINLOCK(dma_spin_lock);
-
-#if MAX_DMA_CHANNELS > 0
+EXPORT_SYMBOL(dma_spin_lock);
 
 static dma_t dma_chan[MAX_DMA_CHANNELS];
 
@@ -81,6 +78,7 @@ bad_dma:
 busy:
        return -EBUSY;
 }
+EXPORT_SYMBOL(request_dma);
 
 /*
  * Free DMA channel
@@ -112,6 +110,7 @@ void free_dma(dmach_t channel)
 bad_dma:
        printk(KERN_ERR "dma: trying to free DMA%d\n", channel);
 }
+EXPORT_SYMBOL(free_dma);
 
 /* Set DMA Scatter-Gather list
  */
@@ -125,15 +124,15 @@ void set_dma_sg (dmach_t channel, struct scatterlist *sg, int nr_sg)
 
        dma->sg = sg;
        dma->sgcount = nr_sg;
-       dma->using_sg = 1;
        dma->invalid = 1;
 }
+EXPORT_SYMBOL(set_dma_sg);
 
 /* Set DMA address
  *
  * Copy address to the structure, and set the invalid bit
  */
-void set_dma_addr (dmach_t channel, unsigned long physaddr)
+void __set_dma_addr (dmach_t channel, void *addr)
 {
        dma_t *dma = dma_chan + channel;
 
@@ -141,12 +140,11 @@ void set_dma_addr (dmach_t channel, unsigned long physaddr)
                printk(KERN_ERR "dma%d: altering DMA address while "
                       "DMA active\n", channel);
 
-       dma->sg = &dma->buf;
-       dma->sgcount = 1;
-       dma->buf.__address = bus_to_virt(physaddr);
-       dma->using_sg = 0;
+       dma->sg = NULL;
+       dma->addr = addr;
        dma->invalid = 1;
 }
+EXPORT_SYMBOL(__set_dma_addr);
 
 /* Set DMA byte count
  *
@@ -160,12 +158,11 @@ void set_dma_count (dmach_t channel, unsigned long count)
                printk(KERN_ERR "dma%d: altering DMA count while "
                       "DMA active\n", channel);
 
-       dma->sg = &dma->buf;
-       dma->sgcount = 1;
-       dma->buf.length = count;
-       dma->using_sg = 0;
+       dma->sg = NULL;
+       dma->count = count;
        dma->invalid = 1;
 }
+EXPORT_SYMBOL(set_dma_count);
 
 /* Set DMA direction mode
  */
@@ -180,6 +177,7 @@ void set_dma_mode (dmach_t channel, dmamode_t mode)
        dma->dma_mode = mode;
        dma->invalid = 1;
 }
+EXPORT_SYMBOL(set_dma_mode);
 
 /* Enable DMA channel
  */
@@ -200,6 +198,7 @@ free_dma:
        printk(KERN_ERR "dma%d: trying to enable free DMA\n", channel);
        BUG();
 }
+EXPORT_SYMBOL(enable_dma);
 
 /* Disable DMA channel
  */
@@ -220,6 +219,7 @@ free_dma:
        printk(KERN_ERR "dma%d: trying to disable free DMA\n", channel);
        BUG();
 }
+EXPORT_SYMBOL(disable_dma);
 
 /*
  * Is the specified DMA channel active?
@@ -233,6 +233,7 @@ void set_dma_page(dmach_t channel, char pagenr)
 {
        printk(KERN_ERR "dma%d: trying to set_dma_page\n", channel);
 }
+EXPORT_SYMBOL(set_dma_page);
 
 void set_dma_speed(dmach_t channel, int cycle_ns)
 {
@@ -243,6 +244,7 @@ void set_dma_speed(dmach_t channel, int cycle_ns)
                ret = dma->d_ops->setspeed(channel, dma, cycle_ns);
        dma->speed = ret;
 }
+EXPORT_SYMBOL(set_dma_speed);
 
 int get_dma_residue(dmach_t channel)
 {
@@ -254,49 +256,12 @@ int get_dma_residue(dmach_t channel)
 
        return ret;
 }
+EXPORT_SYMBOL(get_dma_residue);
 
-void __init init_dma(void)
+static int __init init_dma(void)
 {
        arch_dma_init(dma_chan);
-}
-
-#else
-
-int request_dma(dmach_t channel, const char *device_id)
-{
-       return -EINVAL;
-}
-
-int get_dma_residue(dmach_t channel)
-{
        return 0;
 }
 
-#define GLOBAL_ALIAS(_a,_b) asm (".set " #_a "," #_b "; .globl " #_a)
-GLOBAL_ALIAS(disable_dma, get_dma_residue);
-GLOBAL_ALIAS(enable_dma, get_dma_residue);
-GLOBAL_ALIAS(free_dma, get_dma_residue);
-GLOBAL_ALIAS(get_dma_list, get_dma_residue);
-GLOBAL_ALIAS(set_dma_mode, get_dma_residue);
-GLOBAL_ALIAS(set_dma_page, get_dma_residue);
-GLOBAL_ALIAS(set_dma_count, get_dma_residue);
-GLOBAL_ALIAS(set_dma_addr, get_dma_residue);
-GLOBAL_ALIAS(set_dma_sg, get_dma_residue);
-GLOBAL_ALIAS(set_dma_speed, get_dma_residue);
-GLOBAL_ALIAS(init_dma, get_dma_residue);
-
-#endif
-
-EXPORT_SYMBOL(request_dma);
-EXPORT_SYMBOL(free_dma);
-EXPORT_SYMBOL(enable_dma);
-EXPORT_SYMBOL(disable_dma);
-EXPORT_SYMBOL(set_dma_addr);
-EXPORT_SYMBOL(set_dma_count);
-EXPORT_SYMBOL(set_dma_mode);
-EXPORT_SYMBOL(set_dma_page);
-EXPORT_SYMBOL(get_dma_residue);
-EXPORT_SYMBOL(set_dma_sg);
-EXPORT_SYMBOL(set_dma_speed);
-
-EXPORT_SYMBOL(dma_spin_lock);
+core_initcall(init_dma);
index 2a8d27e18fa7765c13229cbb91f31a113c1b113d..a52baedf6262f776c2b2be8a474efc5290c0f7c9 100644 (file)
@@ -18,8 +18,6 @@
 #include <asm/memory.h>
 #include <asm/glue.h>
 #include <asm/vfpmacros.h>
-#include <asm/hardware.h>              /* should be moved into entry-macro.S */
-#include <asm/arch/irqs.h>             /* should be moved into entry-macro.S */
 #include <asm/arch/entry-macro.S>
 
 #include "entry-header.S"
index d7d69fd7039f342fd458bf6577dbc2cd55372ad0..1e985f2cd70fc4ab0df4dfa07616d9204b6fa87a 100644 (file)
@@ -33,6 +33,8 @@
 #define MACHINFO_PGOFFIO       12
 #define MACHINFO_NAME          16
 
+#define KERNEL_RAM_ADDR        (PAGE_OFFSET + TEXT_OFFSET)
+
 /*
  * swapper_pg_dir is the virtual address of the initial page table.
  * We place the page tables 16K below KERNEL_RAM_ADDR.  Therefore, we must
index d7099dbbb879ab8cd9ed6c417bdcc87d461dd747..869c466e625852689c6f1e792d4ee1e0262884f6 100644 (file)
@@ -1027,7 +1027,6 @@ void __init init_irq_proc(void)
 void __init init_IRQ(void)
 {
        struct irqdesc *desc;
-       extern void init_dma(void);
        int irq;
 
 #ifdef CONFIG_SMP
@@ -1041,7 +1040,6 @@ void __init init_IRQ(void)
        }
 
        init_arch_irq();
-       init_dma();
 }
 
 static int __init noirqdebug_setup(char *str)
index 30494aab829a8adeb68a165c168aa6cd8593cf39..54a21bdcba5cde6fe94bc1d56a3e083b5ac68af6 100644 (file)
 #include <linux/init.h>
 #include <linux/cpu.h>
 
-#include <asm/system.h>
-#include <asm/io.h>
 #include <asm/leds.h>
 #include <asm/processor.h>
+#include <asm/system.h>
 #include <asm/uaccess.h>
 #include <asm/mach/time.h>
 
index 85774165e9fdbccc1143636b4b484bf72b7cd48c..2cab741ad0f8e2d31cbb9fec2b3fefc8b40a429c 100644 (file)
@@ -26,8 +26,6 @@
 
 #include <asm/cpu.h>
 #include <asm/elf.h>
-#include <asm/hardware.h>
-#include <asm/io.h>
 #include <asm/procinfo.h>
 #include <asm/setup.h>
 #include <asm/mach-types.h>
index fc4729106a3262cd4709f8f822673952205098c8..d7d932c02866d51336414ecf44f3c98c935abedd 100644 (file)
@@ -29,9 +29,6 @@
 #include <linux/sysdev.h>
 #include <linux/timer.h>
 
-#include <asm/hardware.h>
-#include <asm/io.h>
-#include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/thread_info.h>
 #include <asm/mach/time.h>
index 45e9ea6cd2a50e482c9e2aad0c07c4d916b8e6cf..c9fe6f5f7ee35ac6df900efcf06c85cd908e3a15 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <asm/atomic.h>
 #include <asm/cacheflush.h>
-#include <asm/io.h>
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
index 9a47770114d49db0663b6f611ab7872cd0ab2755..2b254e88595c76e15c233290e0f1339f04e5a621 100644 (file)
@@ -17,15 +17,13 @@ jiffies = jiffies_64;
 jiffies = jiffies_64 + 4;
 #endif
 
+SECTIONS
+{
 #ifdef CONFIG_XIP_KERNEL
-#define TEXTADDR  XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)
+       . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
 #else
-#define TEXTADDR  KERNEL_RAM_ADDR
+       . = PAGE_OFFSET + TEXT_OFFSET;
 #endif
-
-SECTIONS
-{
-       . = TEXTADDR;
        .init : {                       /* Init code and data           */
                _stext = .;
                        _sinittext = .;
@@ -104,7 +102,7 @@ SECTIONS
 
 #ifdef CONFIG_XIP_KERNEL
        __data_loc = ALIGN(4);          /* location in binary */
-       . = KERNEL_RAM_ADDR;
+       . = PAGE_OFFSET + TEXT_OFFSET;
 #else
        . = ALIGN(THREAD_SIZE);
        __data_loc = .;
index 0340ddc4824ea3e7e8f0ebb733d71c3385c9bb7b..828208348b767045db0c2380be560b4cc0d92381 100644 (file)
@@ -58,17 +58,6 @@ void clk_disable(struct clk *clk)
 }
 EXPORT_SYMBOL(clk_disable);
 
-int clk_use(struct clk *clk)
-{
-       return 0;
-}
-EXPORT_SYMBOL(clk_use);
-
-void clk_unuse(struct clk *clk)
-{
-}
-EXPORT_SYMBOL(clk_unuse);
-
 unsigned long clk_get_rate(struct clk *clk)
 {
        return clk->rate;
index 4e706d9ad368ee63950a5cea90684eb50b272a26..dce4815cf53cd6c808cea279e58954d12f0db5bc 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/timex.h>
 #include <linux/signal.h>
+#include <linux/amba/bus.h>
 
 #include <asm/hardware.h>
 #include <asm/irq.h>
 #include <asm/sizes.h>
-#include <asm/hardware/amba.h>
 
 #include <asm/mach/flash.h>
 #include <asm/mach/irq.h>
index daefc0ea14a10236c8aca9e068dda22f6cd24540..b6029a95f19cfe9dfaec885e9c61f1aefd439969 100644 (file)
@@ -9,7 +9,7 @@
  *
  */
 
-#include <asm/hardware/amba_clcd.h>
+#include <linux/amba/clcd.h>
 
 struct sys_timer;
 
diff --git a/arch/arm/mach-clps711x/dma.c b/arch/arm/mach-clps711x/dma.c
deleted file mode 100644 (file)
index af5a4de..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  linux/arch/arm/mach-clps711x/dma.c
- *
- *  Copyright (C) 2000 Deep Blue Solutions Ltd
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-#include <linux/init.h>
-
-#include <asm/dma.h>
-#include <asm/mach/dma.h>
-
-void __init arch_dma_init(dma_t *dma)
-{
-}
diff --git a/arch/arm/mach-epxa10db/dma.c b/arch/arm/mach-epxa10db/dma.c
deleted file mode 100644 (file)
index 0151e9f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  linux/arch/arm/mach-epxa10db/dma.c
- *
- *  Copyright (C) 1999 ARM Limited
- *  Copyright (C) 2000 Deep Blue Solutions Ltd
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-#include <linux/init.h>
-
-#include <asm/dma.h>
-#include <asm/mach/dma.h>
-
-void __init arch_dma_init(dma_t *dma)
-{
-}
index a6b1396b0951bbeb021b50c1dc2dd10a302d0753..7a54578b51af5666025cdb679496f3c5492c6a6b 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <asm/dma.h>
 #include <asm/io.h>
+#include <asm/scatterlist.h>
 
 #include <asm/mach/dma.h>
 #include <asm/hardware/dec21285.h>
index 708e1b3faa1466cddb97867403510c8d301824a3..c9e0cd8ed0169e58a078c4525eea514e4146623d 100644 (file)
 #include "generic.h"
 #include <asm/serial.h>
 
-static struct resource mx1ads_resources[] = {
+static struct resource cs89x0_resources[] = {
        [0] = {
-               .start  = IMX_CS4_VIRT,
-               .end    = IMX_CS4_VIRT + 16,
+               .start  = IMX_CS4_PHYS + 0x300,
+               .end    = IMX_CS4_PHYS + 0x300 + 16,
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = 13,
-               .end    = 13,
+               .start  = IRQ_GPIOC(17),
+               .end    = IRQ_GPIOC(17),
                .flags  = IORESOURCE_IRQ,
        },
 };
 
-static struct platform_device mx1ads_device = {
-       .name           = "mx1ads",
-       .num_resources  = ARRAY_SIZE(mx1ads_resources),
-       .resource       = mx1ads_resources,
+static struct platform_device cs89x0_device = {
+       .name           = "cirrus-cs89x0",
+       .num_resources  = ARRAY_SIZE(cs89x0_resources),
+       .resource       = cs89x0_resources,
 };
 
 static struct platform_device *devices[] __initdata = {
-       &mx1ads_device,
+       &cs89x0_device,
 };
 
 static void __init
@@ -61,45 +61,10 @@ mx1ads_init(void)
        platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
-static struct map_desc mx1ads_io_desc[] __initdata = {
-       {
-               .virtual        = IMX_CS0_VIRT,
-               .pfn            = __phys_to_pfn(IMX_CS0_PHYS),
-               .length         = IMX_CS0_SIZE,
-               .type           = MT_DEVICE
-       }, {
-               .virtual        = IMX_CS1_VIRT,
-               .pfn            = __phys_to_pfn(IMX_CS1_PHYS),
-               .length         = IMX_CS1_SIZE,
-               .type           = MT_DEVICE
-       }, {
-               .virtual        = IMX_CS2_VIRT,
-               .pfn            = __phys_to_pfn(IMX_CS2_PHYS),
-               .length         = IMX_CS2_SIZE,
-               .type           = MT_DEVICE
-       }, {
-               .virtual        = IMX_CS3_VIRT,
-               .pfn            = __phys_to_pfn(IMX_CS3_PHYS),
-               .length         = IMX_CS3_SIZE,
-               .type           = MT_DEVICE
-       }, {
-               .virtual        = IMX_CS4_VIRT,
-               .pfn            = __phys_to_pfn(IMX_CS4_PHYS),
-               .length         = IMX_CS4_SIZE,
-               .type           = MT_DEVICE
-       }, {
-               .virtual        = IMX_CS5_VIRT,
-               .pfn            = __phys_to_pfn(IMX_CS5_PHYS),
-               .length         = IMX_CS5_SIZE,
-               .type           = MT_DEVICE
-       }
-};
-
 static void __init
 mx1ads_map_io(void)
 {
        imx_map_io();
-       iotable_init(mx1ads_io_desc, ARRAY_SIZE(mx1ads_io_desc));
 }
 
 MACHINE_START(MX1ADS, "Motorola MX1ADS")
index 73c360685cad5eac086d56e03243620ee83a7ac7..bbfe46cd91fe3be545a1095cd85ec22317f45491 100644 (file)
@@ -58,17 +58,6 @@ void clk_disable(struct clk *clk)
 }
 EXPORT_SYMBOL(clk_disable);
 
-int clk_use(struct clk *clk)
-{
-       return 0;
-}
-EXPORT_SYMBOL(clk_use);
-
-void clk_unuse(struct clk *clk)
-{
-}
-EXPORT_SYMBOL(clk_unuse);
-
 unsigned long clk_get_rate(struct clk *clk)
 {
        return clk->rate;
index dacbf504dae277e57cb4bd00eb1044022e3f26ff..20071a2767cc8ab8f542afe15ea1cd7c58356d6f 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/sched.h>
 #include <linux/smp.h>
+#include <linux/amba/bus.h>
 
 #include <asm/hardware.h>
 #include <asm/irq.h>
 #include <asm/io.h>
-#include <asm/hardware/amba.h>
 #include <asm/hardware/arm_timer.h>
 #include <asm/arch/cm.h>
 #include <asm/system.h>
diff --git a/arch/arm/mach-integrator/dma.c b/arch/arm/mach-integrator/dma.c
deleted file mode 100644 (file)
index aae6f23..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  linux/arch/arm/mach-integrator/dma.c
- *
- *  Copyright (C) 1999 ARM Limited
- *  Copyright (C) 2000 Deep Blue Solutions Ltd
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-#include <linux/slab.h>
-#include <linux/mman.h>
-#include <linux/init.h>
-
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/dma.h>
-#include <asm/io.h>
-#include <asm/hardware.h>
-
-#include <asm/mach/dma.h>
-
-void __init arch_dma_init(dma_t *dma)
-{
-}
index a4bafee77a06d0389269981a370a01192033096a..a85d471c5bfaf0d8e064f7a9dfc59ae8c2abccea 100644 (file)
 #include <linux/device.h>
 #include <linux/errno.h>
 #include <linux/mm.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/clcd.h>
 
 #include <asm/io.h>
 #include <asm/hardware/icst525.h>
-#include <asm/hardware/amba.h>
-#include <asm/hardware/amba_clcd.h>
 #include <asm/arch/lm.h>
 #include <asm/arch/impd1.h>
 #include <asm/sizes.h>
index 4c0f7c65facf93f215e510d628b9c17d9cdbcb00..3afedeb56a6e408e65cf04f901b575309e1678ce 100644 (file)
@@ -25,6 +25,8 @@
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/sysdev.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/kmi.h>
 
 #include <asm/hardware.h>
 #include <asm/io.h>
@@ -32,8 +34,6 @@
 #include <asm/setup.h>
 #include <asm/param.h>         /* HZ */
 #include <asm/mach-types.h>
-#include <asm/hardware/amba.h>
-#include <asm/hardware/amba_kmi.h>
 
 #include <asm/arch/lm.h>
 
index 93f7ccb22c27f4e12ad4dc9ba180baa3ac177aed..16cf2482a3e978c78a97f4f760a77f0b9d70cdb8 100644 (file)
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/sysdev.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/kmi.h>
+#include <linux/amba/clcd.h>
 
 #include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/setup.h>
 #include <asm/mach-types.h>
-#include <asm/hardware/amba.h>
-#include <asm/hardware/amba_kmi.h>
-#include <asm/hardware/amba_clcd.h>
 #include <asm/hardware/icst525.h>
 
 #include <asm/arch/cm.h>
index 1a844ca139e0df85e57cee2a67916aa305b1ffcb..9f46aaef8968de59ec1c762baeb9703e832879c5 100644 (file)
@@ -14,8 +14,8 @@
 #include <linux/interrupt.h>
 #include <linux/init.h>
 #include <linux/device.h>
+#include <linux/amba/bus.h>
 
-#include <asm/hardware/amba.h>
 #include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
index 53f60614498be508777a95ad4fd87f1532b74001..e6ea1cba6a17b36dbb141bb0a2458ebc4b51851b 100644 (file)
@@ -18,7 +18,7 @@
 #include <linux/platform_device.h>
 #include <linux/serial.h>
 #include <linux/tty.h>
-#include <linux/serial_core.h>
+#include <linux/serial_8250.h>
 
 #include <asm/io.h>
 #include <asm/pgtable.h>
@@ -50,32 +50,74 @@ static struct map_desc iop331_std_desc[] __initdata = {
        }
 };
 
-static struct uart_port iop331_serial_ports[] = {
-       {
-               .membase        = (char*)(IOP331_UART0_VIRT),
-               .mapbase        = (IOP331_UART0_PHYS),
-               .irq            = IRQ_IOP331_UART0,
-               .flags          = UPF_SKIP_TEST,
-               .iotype         = UPIO_MEM,
-               .regshift       = 2,
-               .uartclk        = IOP331_UART_XTAL,
-               .line           = 0,
-               .type           = PORT_XSCALE,
-               .fifosize       = 32
-       } , {
-               .membase        = (char*)(IOP331_UART1_VIRT),
-               .mapbase        = (IOP331_UART1_PHYS),
-               .irq            = IRQ_IOP331_UART1,
-               .flags          = UPF_SKIP_TEST,
-               .iotype         = UPIO_MEM,
-               .regshift       = 2,
-               .uartclk        = IOP331_UART_XTAL,
-               .line           = 1,
-               .type           = PORT_XSCALE,
-               .fifosize       = 32
+static struct resource iop33x_uart0_resources[] = {
+       [0] = {
+               .start = IOP331_UART0_PHYS,
+               .end = IOP331_UART0_PHYS + 0x3f,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_IOP331_UART0,
+               .end = IRQ_IOP331_UART0,
+               .flags = IORESOURCE_IRQ
+       }
+};
+
+static struct resource iop33x_uart1_resources[] = {
+       [0] = {
+               .start = IOP331_UART1_PHYS,
+               .end = IOP331_UART1_PHYS + 0x3f,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_IOP331_UART1,
+               .end = IRQ_IOP331_UART1,
+               .flags = IORESOURCE_IRQ
        }
 };
 
+static struct plat_serial8250_port iop33x_uart0_data[] = {
+       {
+       .membase     = (char*)(IOP331_UART0_VIRT),
+       .mapbase     = (IOP331_UART0_PHYS),
+       .irq         = IRQ_IOP331_UART0,
+       .uartclk     = IOP331_UART_XTAL,
+       .regshift    = 2,
+       .iotype      = UPIO_MEM,
+       .flags       = UPF_SKIP_TEST,
+       },
+       {  },
+};
+
+static struct plat_serial8250_port iop33x_uart1_data[] = {
+       {
+       .membase     = (char*)(IOP331_UART1_VIRT),
+       .mapbase     = (IOP331_UART1_PHYS),
+       .irq         = IRQ_IOP331_UART1,
+       .uartclk     = IOP331_UART_XTAL,
+       .regshift    = 2,
+       .iotype      = UPIO_MEM,
+       .flags       = UPF_SKIP_TEST,
+       },
+       {  },
+};
+
+static struct platform_device iop33x_uart0 = {
+       .name = "serial8250",
+       .id = 0,
+       .dev.platform_data = iop33x_uart0_data,
+       .num_resources = 2,
+       .resource = iop33x_uart0_resources,
+};
+
+static struct platform_device iop33x_uart1 = {
+       .name = "serial8250",
+       .id = 1,
+       .dev.platform_data = iop33x_uart1_data,
+       .num_resources = 2,
+       .resource = iop33x_uart1_resources,
+};
+
 static struct resource iop33x_i2c_0_resources[] = {
        [0] = {
                .start = 0xfffff680,
@@ -117,6 +159,8 @@ static struct platform_device iop33x_i2c_1_controller = {
 };
 
 static struct platform_device *iop33x_devices[] __initdata = {
+       &iop33x_uart0,
+       &iop33x_uart1,
        &iop33x_i2c_0_controller,
        &iop33x_i2c_1_controller
 };
@@ -133,8 +177,6 @@ void __init iop33x_init(void)
 void __init iop331_map_io(void)
 {
        iotable_init(iop331_std_desc, ARRAY_SIZE(iop331_std_desc));
-       early_serial_setup(&iop331_serial_ports[0]);
-       early_serial_setup(&iop331_serial_ports[1]);
 }
 
 #ifdef CONFIG_ARCH_IOP331
index 385285851cb5cd6561f48cdd228201a3ffe94b76..daadc78e271b47cd9d9338b11a93b0cd4fd023c0 100644 (file)
@@ -71,6 +71,14 @@ config ARCH_PRPMC1100
          PrPCM1100 Processor Mezanine Module. For more information on
          this platform, see <file:Documentation/arm/IXP4xx>.
 
+config MACH_NAS100D
+       bool
+       prompt "NAS100D"
+       help
+         Say 'Y' here if you want your kernel to support Iomega's
+         NAS 100d device. For more information on this platform,
+         see http://www.nslu2-linux.org/wiki/NAS100d/HomePage
+
 #
 # Avila and IXDP share the same source for now. Will change in future
 #
index 7a15629c18d0bd397fdbb09d928133b2c5a28774..0471044fa179869a26ac07b41d63274dfd595c3b 100644 (file)
@@ -9,4 +9,5 @@ obj-$(CONFIG_MACH_IXDPG425)     += ixdpg425-pci.o coyote-setup.o
 obj-$(CONFIG_ARCH_ADI_COYOTE)  += coyote-pci.o coyote-setup.o
 obj-$(CONFIG_MACH_GTWX5715)    += gtwx5715-pci.o gtwx5715-setup.o
 obj-$(CONFIG_MACH_NSLU2)       += nslu2-pci.o nslu2-setup.o nslu2-power.o
+obj-$(CONFIG_MACH_NAS100D)     += nas100d-pci.o nas100d-setup.o nas100d-power.o
 
index 9795da270e3aa8047586b6a73ce914cf33e766ff..6e3462ed53062ecfc5e032f6c22d9ae6975c0f1e 100644 (file)
@@ -341,6 +341,29 @@ int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size)
        return (dev->bus == &pci_bus_type ) && ((dma_addr + size) >= SZ_64M);
 }
 
+/*
+ * Only first 64MB of memory can be accessed via PCI.
+ * We use GFP_DMA to allocate safe buffers to do map/unmap.
+ * This is really ugly and we need a better way of specifying
+ * DMA-capable regions of memory.
+ */
+void __init ixp4xx_adjust_zones(int node, unsigned long *zone_size,
+       unsigned long *zhole_size)
+{
+       unsigned int sz = SZ_64M >> PAGE_SHIFT;
+
+       /*
+        * Only adjust if > 64M on current system
+        */
+       if (node || (zone_size[0] <= sz))
+               return;
+
+       zone_size[1] = zone_size[0] - sz;
+       zone_size[0] = sz;
+       zhole_size[1] = zhole_size[0];
+       zhole_size[0] = 0;
+}
+
 void __init ixp4xx_pci_preinit(void)
 {  
        unsigned long processor_id;
index f3c687cf00713dcbcaf20eb4689aac5f05818b98..6b393691d0e898cdcc0b4aaebb6da5ab2469c470 100644 (file)
@@ -142,6 +142,8 @@ static int ixp4xx_set_irq_type(unsigned int irq, unsigned int type)
        *int_reg &= ~(IXP4XX_GPIO_STYLE_CLEAR <<
                        (line * IXP4XX_GPIO_STYLE_SIZE));
 
+       *IXP4XX_GPIO_GPISR = (1 << line);
+
        /* Set the new style */
        *int_reg |= (int_style << (line * IXP4XX_GPIO_STYLE_SIZE));
 
@@ -169,7 +171,7 @@ static void ixp4xx_irq_ack(unsigned int irq)
        int line = (irq < 32) ? irq2gpio[irq] : -1;
 
        if (line >= 0)
-               gpio_line_isr_clear(line);
+               *IXP4XX_GPIO_GPISR = (1 << line);
 }
 
 /*
@@ -330,11 +332,27 @@ static struct platform_device *ixp46x_devices[] __initdata = {
        &ixp46x_i2c_controller
 };
 
+unsigned long ixp4xx_exp_bus_size;
+
 void __init ixp4xx_sys_init(void)
 {
+       ixp4xx_exp_bus_size = SZ_16M;
+
        if (cpu_is_ixp46x()) {
+               int region;
+
                platform_add_devices(ixp46x_devices,
                                ARRAY_SIZE(ixp46x_devices));
+
+               for (region = 0; region < 7; region++) {
+                       if((*(IXP4XX_EXP_REG(0x4 * region)) & 0x200)) {
+                               ixp4xx_exp_bus_size = SZ_32M;
+                               break;
+                       }
+               }
        }
+
+       printk("IXP4xx: Using %uMiB expansion bus window size\n",
+                       ixp4xx_exp_bus_size >> 20);
 }
 
index 60de8a94cff5f828cf93840d0d80cff53cc395da..e6b7fcd923faaf46fdb9a02887acf0566e21eb79 100644 (file)
@@ -33,9 +33,6 @@ void __init coyote_pci_preinit(void)
        set_irq_type(IRQ_COYOTE_PCI_SLOT0, IRQT_LOW);
        set_irq_type(IRQ_COYOTE_PCI_SLOT1, IRQT_LOW);
 
-       gpio_line_isr_clear(COYOTE_PCI_SLOT0_PIN);
-       gpio_line_isr_clear(COYOTE_PCI_SLOT1_PIN);
-
        ixp4xx_pci_preinit();
 }
 
index 050c92768913b73d542dab88a3a3f883ace1ed38..679594a73981704a3df75bea6d6e3f396474ab5c 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/serial.h>
 #include <linux/tty.h>
 #include <linux/serial_8250.h>
+#include <linux/slab.h>
 
 #include <asm/types.h>
 #include <asm/setup.h>
@@ -30,8 +31,6 @@ static struct flash_platform_data coyote_flash_data = {
 };
 
 static struct resource coyote_flash_resource = {
-       .start          = COYOTE_FLASH_BASE,
-       .end            = COYOTE_FLASH_BASE + COYOTE_FLASH_SIZE - 1,
        .flags          = IORESOURCE_MEM,
 };
 
@@ -81,6 +80,11 @@ static struct platform_device *coyote_devices[] __initdata = {
 
 static void __init coyote_init(void)
 {
+       ixp4xx_sys_init();
+
+       coyote_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
+       coyote_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_32M - 1;
+
        *IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE;
        *IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0;
 
@@ -91,8 +95,6 @@ static void __init coyote_init(void)
                coyote_uart_data[0].irq = IRQ_IXP4XX_UART1;
        }
 
-
-       ixp4xx_sys_init();
        platform_add_devices(coyote_devices, ARRAY_SIZE(coyote_devices));
 }
 
index 29a6d02fa851d4c19841545830af52788de21fbf..038670489970c2131145337490f64751db9eef8d 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/serial.h>
 #include <linux/tty.h>
 #include <linux/serial_8250.h>
+#include <linux/slab.h>
 
 #include <asm/types.h>
 #include <asm/setup.h>
@@ -106,11 +107,9 @@ static struct flash_platform_data gtwx5715_flash_data = {
        .width          = 2,
 };
 
-static struct resource gtwx5715_flash_resource = {
-       .start          = GTWX5715_FLASH_BASE,
-       .end            = GTWX5715_FLASH_BASE + GTWX5715_FLASH_SIZE - 1,
+static struct gtw5715_flash_resource = {
        .flags          = IORESOURCE_MEM,
-};
+}
 
 static struct platform_device gtwx5715_flash = {
        .name           = "IXP4XX-Flash",
@@ -129,6 +128,14 @@ static struct platform_device *gtwx5715_devices[] __initdata = {
 
 static void __init gtwx5715_init(void)
 {
+       ixp4xx_sys_init();
+
+       if (!flash_resource)
+               printk(KERN_ERR "Could not allocate flash resource\n");
+
+       gtwx5715_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
+       gtwx5715_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_8M - 1;
+
        platform_add_devices(gtwx5715_devices, ARRAY_SIZE(gtwx5715_devices));
 }
 
index f9a1d3e7d6922d30c6226690d06162facec746b2..da415d5d7f3719a9d70f688080db570011e55518 100644 (file)
@@ -32,11 +32,6 @@ void __init ixdp425_pci_preinit(void)
        set_irq_type(IRQ_IXDP425_PCI_INTC, IRQT_LOW);
        set_irq_type(IRQ_IXDP425_PCI_INTD, IRQT_LOW);
 
-       gpio_line_isr_clear(IXDP425_PCI_INTA_PIN);
-       gpio_line_isr_clear(IXDP425_PCI_INTB_PIN);
-       gpio_line_isr_clear(IXDP425_PCI_INTC_PIN);
-       gpio_line_isr_clear(IXDP425_PCI_INTD_PIN);
-
        ixp4xx_pci_preinit();
 }
 
index 3a22d84e10478de8581b6d0eeb8d2c4287170eb9..c2e105c89c9561613e30f006f5e238f886f097e4 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/serial.h>
 #include <linux/tty.h>
 #include <linux/serial_8250.h>
+#include <linux/slab.h>
 
 #include <asm/types.h>
 #include <asm/setup.h>
@@ -30,8 +31,6 @@ static struct flash_platform_data ixdp425_flash_data = {
 };
 
 static struct resource ixdp425_flash_resource = {
-       .start          = IXDP425_FLASH_BASE,
-       .end            = IXDP425_FLASH_BASE + IXDP425_FLASH_SIZE - 1,
        .flags          = IORESOURCE_MEM,
 };
 
@@ -108,17 +107,13 @@ static struct platform_device *ixdp425_devices[] __initdata = {
        &ixdp425_uart
 };
 
-
 static void __init ixdp425_init(void)
 {
        ixp4xx_sys_init();
 
-       /*
-        * IXP465 has 32MB window
-        */
-       if (machine_is_ixdp465()) {
-               ixdp425_flash_resource.end += IXDP425_FLASH_SIZE;
-       }
+       ixdp425_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
+       ixdp425_flash_resource.end =
+               IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1;
 
        platform_add_devices(ixdp425_devices, ARRAY_SIZE(ixdp425_devices));
 }
index fe5e7660de1d5e855594b45a6fdaf7cd4c152655..526fb6175bc312538ec835d52ab254949d595167 100644 (file)
@@ -32,9 +32,6 @@ void __init ixdpg425_pci_preinit(void)
        set_irq_type(IRQ_IXP4XX_GPIO6, IRQT_LOW);
        set_irq_type(IRQ_IXP4XX_GPIO7, IRQT_LOW);
 
-       gpio_line_isr_clear(6);
-       gpio_line_isr_clear(7);
-
        ixp4xx_pci_preinit();
 }
 
diff --git a/arch/arm/mach-ixp4xx/nas100d-pci.c b/arch/arm/mach-ixp4xx/nas100d-pci.c
new file mode 100644 (file)
index 0000000..26b7c00
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * arch/arm/mach-ixp4xx/nas100d-pci.c
+ *
+ * NAS 100d board-level PCI initialization
+ *
+ * based on ixdp425-pci.c:
+ *     Copyright (C) 2002 Intel Corporation.
+ *     Copyright (C) 2003-2004 MontaVista Software, Inc.
+ *
+ * Maintainer: http://www.nslu2-linux.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+
+#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
+
+void __init nas100d_pci_preinit(void)
+{
+       set_irq_type(IRQ_NAS100D_PCI_INTA, IRQT_LOW);
+       set_irq_type(IRQ_NAS100D_PCI_INTB, IRQT_LOW);
+       set_irq_type(IRQ_NAS100D_PCI_INTC, IRQT_LOW);
+       set_irq_type(IRQ_NAS100D_PCI_INTD, IRQT_LOW);
+       set_irq_type(IRQ_NAS100D_PCI_INTE, IRQT_LOW);
+
+       ixp4xx_pci_preinit();
+}
+
+static int __init nas100d_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
+{
+       static int pci_irq_table[NAS100D_PCI_MAX_DEV][NAS100D_PCI_IRQ_LINES] =
+       {
+               { IRQ_NAS100D_PCI_INTA, -1, -1 },
+               { IRQ_NAS100D_PCI_INTB, -1, -1 },
+               { IRQ_NAS100D_PCI_INTC, IRQ_NAS100D_PCI_INTD, IRQ_NAS100D_PCI_INTE },
+       };
+
+       int irq = -1;
+
+       if (slot >= 1 && slot <= NAS100D_PCI_MAX_DEV &&
+               pin >= 1 && pin <= NAS100D_PCI_IRQ_LINES)
+               irq = pci_irq_table[slot-1][pin-1];
+
+       return irq;
+}
+
+struct hw_pci __initdata nas100d_pci = {
+       .nr_controllers = 1,
+       .preinit        = nas100d_pci_preinit,
+       .swizzle        = pci_std_swizzle,
+       .setup          = ixp4xx_setup,
+       .scan           = ixp4xx_scan_bus,
+       .map_irq        = nas100d_map_irq,
+};
+
+int __init nas100d_pci_init(void)
+{
+       if (machine_is_nas100d())
+               pci_common_init(&nas100d_pci);
+
+       return 0;
+}
+
+subsys_initcall(nas100d_pci_init);
diff --git a/arch/arm/mach-ixp4xx/nas100d-power.c b/arch/arm/mach-ixp4xx/nas100d-power.c
new file mode 100644 (file)
index 0000000..2bec69b
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * arch/arm/mach-ixp4xx/nas100d-power.c
+ *
+ * NAS 100d Power/Reset driver
+ *
+ * Copyright (C) 2005 Tower Technologies
+ *
+ * based on nas100d-io.c
+ *  Copyright (C) 2004 Karen Spearel
+ *
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ * Maintainers: http://www.nslu2-linux.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/reboot.h>
+#include <linux/interrupt.h>
+
+#include <asm/mach-types.h>
+
+extern void ctrl_alt_del(void);
+
+static irqreturn_t nas100d_reset_handler(int irq, void *dev_id, struct pt_regs *regs)
+{
+       /* Signal init to do the ctrlaltdel action, this will bypass init if
+        * it hasn't started and do a kernel_restart.
+        */
+       ctrl_alt_del();
+
+       return IRQ_HANDLED;
+}
+
+static int __init nas100d_power_init(void)
+{
+       if (!(machine_is_nas100d()))
+               return 0;
+
+       set_irq_type(NAS100D_RB_IRQ, IRQT_LOW);
+
+       if (request_irq(NAS100D_RB_IRQ, &nas100d_reset_handler,
+               SA_INTERRUPT, "NAS100D reset button", NULL) < 0) {
+
+               printk(KERN_DEBUG "Reset Button IRQ %d not available\n",
+                       NAS100D_RB_IRQ);
+
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static void __exit nas100d_power_exit(void)
+{
+       free_irq(NAS100D_RB_IRQ, NULL);
+}
+
+module_init(nas100d_power_init);
+module_exit(nas100d_power_exit);
+
+MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>");
+MODULE_DESCRIPTION("NAS100D Power/Reset driver");
+MODULE_LICENSE("GPL");
diff --git a/arch/arm/mach-ixp4xx/nas100d-setup.c b/arch/arm/mach-ixp4xx/nas100d-setup.c
new file mode 100644 (file)
index 0000000..49998a8
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * arch/arm/mach-ixp4xx/nas100d-setup.c
+ *
+ * NAS 100d board-setup
+ *
+ * based ixdp425-setup.c:
+ *      Copyright (C) 2003-2004 MontaVista Software, Inc.
+ *
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ * Author: Rod Whitby <rod@whitby.id.au>
+ * Maintainers: http://www.nslu2-linux.org/
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/serial.h>
+#include <linux/serial_8250.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/flash.h>
+
+static struct flash_platform_data nas100d_flash_data = {
+       .map_name               = "cfi_probe",
+       .width                  = 2,
+};
+
+static struct resource nas100d_flash_resource = {
+       .flags                  = IORESOURCE_MEM,
+};
+
+static struct platform_device nas100d_flash = {
+       .name                   = "IXP4XX-Flash",
+       .id                     = 0,
+       .dev.platform_data      = &nas100d_flash_data,
+       .num_resources          = 1,
+       .resource               = &nas100d_flash_resource,
+};
+
+static struct ixp4xx_i2c_pins nas100d_i2c_gpio_pins = {
+       .sda_pin                = NAS100D_SDA_PIN,
+       .scl_pin                = NAS100D_SCL_PIN,
+};
+
+static struct platform_device nas100d_i2c_controller = {
+       .name                   = "IXP4XX-I2C",
+       .id                     = 0,
+       .dev.platform_data      = &nas100d_i2c_gpio_pins,
+       .num_resources          = 0,
+};
+
+static struct resource nas100d_uart_resources[] = {
+       {
+               .start          = IXP4XX_UART1_BASE_PHYS,
+               .end            = IXP4XX_UART1_BASE_PHYS + 0x0fff,
+               .flags          = IORESOURCE_MEM,
+       },
+       {
+               .start          = IXP4XX_UART2_BASE_PHYS,
+               .end            = IXP4XX_UART2_BASE_PHYS + 0x0fff,
+               .flags          = IORESOURCE_MEM,
+       }
+};
+
+static struct plat_serial8250_port nas100d_uart_data[] = {
+       {
+               .mapbase        = IXP4XX_UART1_BASE_PHYS,
+               .membase        = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET,
+               .irq            = IRQ_IXP4XX_UART1,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .iotype         = UPIO_MEM,
+               .regshift       = 2,
+               .uartclk        = IXP4XX_UART_XTAL,
+       },
+       {
+               .mapbase        = IXP4XX_UART2_BASE_PHYS,
+               .membase        = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
+               .irq            = IRQ_IXP4XX_UART2,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .iotype         = UPIO_MEM,
+               .regshift       = 2,
+               .uartclk        = IXP4XX_UART_XTAL,
+       },
+       { }
+};
+
+static struct platform_device nas100d_uart = {
+       .name                   = "serial8250",
+       .id                     = PLAT8250_DEV_PLATFORM,
+       .dev.platform_data      = nas100d_uart_data,
+       .num_resources          = 2,
+       .resource               = nas100d_uart_resources,
+};
+
+static struct platform_device *nas100d_devices[] __initdata = {
+       &nas100d_i2c_controller,
+       &nas100d_flash,
+       &nas100d_uart,
+};
+
+static void nas100d_power_off(void)
+{
+       /* This causes the box to drop the power and go dead. */
+
+       /* enable the pwr cntl gpio */
+       gpio_line_config(NAS100D_PO_GPIO, IXP4XX_GPIO_OUT);
+
+       /* do the deed */
+       gpio_line_set(NAS100D_PO_GPIO, IXP4XX_GPIO_HIGH);
+}
+
+static void __init nas100d_init(void)
+{
+       ixp4xx_sys_init();
+
+       nas100d_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
+       nas100d_flash_resource.end =
+               IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1;
+
+       pm_power_off = nas100d_power_off;
+
+       platform_add_devices(nas100d_devices, ARRAY_SIZE(nas100d_devices));
+}
+
+MACHINE_START(NAS100D, "Iomega NAS 100d")
+       /* Maintainer: www.nslu2-linux.org */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = IXP4XX_PERIPHERAL_BASE_PHYS,
+       .io_pg_offst    = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC,
+       .boot_params    = 0x00000100,
+       .map_io         = ixp4xx_map_io,
+       .init_irq       = ixp4xx_init_irq,
+       .timer          = &ixp4xx_timer,
+       .init_machine   = nas100d_init,
+MACHINE_END
index a575f2e0b2c874f59b155d0d27232b47cf2498f0..ece860444d5b91ef57fb68f0f20ddf6791f103e4 100644 (file)
@@ -28,14 +28,6 @@ void __init nslu2_pci_preinit(void)
        set_irq_type(IRQ_NSLU2_PCI_INTB, IRQT_LOW);
        set_irq_type(IRQ_NSLU2_PCI_INTC, IRQT_LOW);
 
-       gpio_line_isr_clear(NSLU2_PCI_INTA_PIN);
-       gpio_line_isr_clear(NSLU2_PCI_INTB_PIN);
-       gpio_line_isr_clear(NSLU2_PCI_INTC_PIN);
-
-       /* INTD is not configured as GPIO is used
-        * for the power input button.
-        */
-
        ixp4xx_pci_preinit();
 }
 
index 18fbc8c0fb306f0404bca9ba500ea2c146b12295..b0ad9e901f6eb924b82164340b679332b47ff616 100644 (file)
@@ -54,9 +54,6 @@ static int __init nslu2_power_init(void)
        set_irq_type(NSLU2_RB_IRQ, IRQT_LOW);
        set_irq_type(NSLU2_PB_IRQ, IRQT_HIGH);
 
-       gpio_line_isr_clear(NSLU2_RB_GPIO);
-       gpio_line_isr_clear(NSLU2_PB_GPIO);
-
        if (request_irq(NSLU2_RB_IRQ, &nslu2_reset_handler,
                SA_INTERRUPT, "NSLU2 reset button", NULL) < 0) {
 
index 2a58499c0968793001e7b4827cea8238091fdf0e..c1d77f5b38234da82e39b8eb7bb558ebdc174f6d 100644 (file)
@@ -112,12 +112,14 @@ config IWMMXT
 config PXA_SHARP_C7xx
        bool
        select PXA_SSP
+       select SHARPSL_PM
        help
          Enable support for all Sharp C7xx models
 
 config PXA_SHARP_Cxx00
        bool
        select PXA_SSP
+       select SHARPSL_PM
        help
          Enable common support for Sharp Cxx00 models
 
index 599be14754f938f8776ca502340b44df13b416fa..7a1ab73e9e10ba345b28d9131d242687db6816ba 100644 (file)
@@ -33,19 +33,7 @@ static void corgi_charger_init(void)
        pxa_gpio_mode(CORGI_GPIO_CHRG_ON | GPIO_OUT);
        pxa_gpio_mode(CORGI_GPIO_CHRG_UKN | GPIO_OUT);
        pxa_gpio_mode(CORGI_GPIO_KEY_INT | GPIO_IN);
-}
-
-static void corgi_charge_led(int val)
-{
-       if (val == SHARPSL_LED_ERROR) {
-               dev_dbg(sharpsl_pm.dev, "Charge LED Error\n");
-       } else if (val == SHARPSL_LED_ON) {
-               dev_dbg(sharpsl_pm.dev, "Charge LED On\n");
-               GPSR0 = GPIO_bit(CORGI_GPIO_LED_ORANGE);
-       } else {
-               dev_dbg(sharpsl_pm.dev, "Charge LED Off\n");
-               GPCR0 = GPIO_bit(CORGI_GPIO_LED_ORANGE);
-       }
+       sharpsl_pm_pxa_init();
 }
 
 static void corgi_measure_temp(int on)
@@ -138,15 +126,15 @@ static int corgi_should_wakeup(unsigned int resume_on_alarm)
        dev_dbg(sharpsl_pm.dev, "GPLR0 = %x,%x\n", GPLR0, PEDR);
 
        if ((PEDR & GPIO_bit(CORGI_GPIO_AC_IN))) {
-               if (STATUS_AC_IN()) {
+               if (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN)) {
                        /* charge on */
                        dev_dbg(sharpsl_pm.dev, "ac insert\n");
                        sharpsl_pm.flags |= SHARPSL_DO_OFFLINE_CHRG;
                } else {
                        /* charge off */
                        dev_dbg(sharpsl_pm.dev, "ac remove\n");
-                       CHARGE_LED_OFF();
-                       CHARGE_OFF();
+                       sharpsl_pm_led(SHARPSL_LED_OFF);
+                       sharpsl_pm.machinfo->charge(0);
                        sharpsl_pm.charge_mode = CHRG_OFF;
                }
        }
@@ -172,23 +160,39 @@ static unsigned long corgi_charger_wakeup(void)
        return ~GPLR0 & ( GPIO_bit(CORGI_GPIO_AC_IN) | GPIO_bit(CORGI_GPIO_KEY_INT) | GPIO_bit(CORGI_GPIO_WAKEUP) );
 }
 
-static int corgi_acin_status(void)
+unsigned long corgipm_read_devdata(int type)
 {
-       return ((GPLR(CORGI_GPIO_AC_IN) & GPIO_bit(CORGI_GPIO_AC_IN)) != 0);
+       switch(type) {
+       case SHARPSL_STATUS_ACIN:
+               return ((GPLR(CORGI_GPIO_AC_IN) & GPIO_bit(CORGI_GPIO_AC_IN)) != 0);
+       case SHARPSL_STATUS_LOCK:
+               return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock);
+       case SHARPSL_STATUS_CHRGFULL:
+               return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull);
+       case SHARPSL_STATUS_FATAL:
+               return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal);
+       case SHARPSL_ACIN_VOLT:
+               return sharpsl_pm_pxa_read_max1111(MAX1111_ACIN_VOLT);
+       case SHARPSL_BATT_TEMP:
+               return sharpsl_pm_pxa_read_max1111(MAX1111_BATT_TEMP);
+       case SHARPSL_BATT_VOLT:
+       default:
+               return sharpsl_pm_pxa_read_max1111(MAX1111_BATT_VOLT);
+       }
 }
 
 static struct sharpsl_charger_machinfo corgi_pm_machinfo = {
        .init            = corgi_charger_init,
+       .exit            = sharpsl_pm_pxa_remove,
        .gpio_batlock    = CORGI_GPIO_BAT_COVER,
        .gpio_acin       = CORGI_GPIO_AC_IN,
        .gpio_batfull    = CORGI_GPIO_CHRG_FULL,
-       .status_acin     = corgi_acin_status,
        .discharge       = corgi_discharge,
        .charge          = corgi_charge,
-       .chargeled       = corgi_charge_led,
        .measure_temp    = corgi_measure_temp,
        .presuspend      = corgi_presuspend,
        .postsuspend     = corgi_postsuspend,
+       .read_devdata    = corgipm_read_devdata,
        .charger_wakeup  = corgi_charger_wakeup,
        .should_wakeup   = corgi_should_wakeup,
        .bat_levels      = 40,
index 277498ae5b6c12d4911564ee4d4d999853c9c283..8da9d3efe9a01d4d0bf2c551534de1848262c99d 100644 (file)
@@ -427,6 +427,12 @@ static void __init mainstone_init(void)
        printk(KERN_NOTICE "Mainstone configured to boot from %s\n",
               mst_flash_data[0].name);
 
+       /* system bus arbiter setting
+        * - Core_Park
+        * - LCD_wt:DMA_wt:CORE_Wt = 2:3:4
+        */
+       ARB_CNTRL = ARB_CORE_PARK | 0x234;
+
        /*
         * On Mainstone, we route AC97_SYSCLK via GPIO45 to
         * the audio daughter card
index b0c40a1d6671e17d5b5f78cd4f12e8734a8e61b4..da4769caaf72b74a9cabe231e98081b6a1d82d37 100644 (file)
@@ -1,7 +1,17 @@
 /*
- * SharpSL SSP Driver
+ * Copyright (c) 2004-2005 Richard Purdie
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
  */
 
+#include <asm/hardware/sharpsl_pm.h>
+
+/*
+ * SharpSL SSP Driver
+ */
 struct corgissp_machinfo {
        int port;
        int cs_lcdcon;
@@ -14,18 +24,18 @@ struct corgissp_machinfo {
 
 void corgi_ssp_set_machinfo(struct corgissp_machinfo *machinfo);
 
+
 /*
  * SharpSL Backlight
  */
-
 void corgi_bl_set_intensity(int intensity);
 void spitz_bl_set_intensity(int intensity);
 void akita_bl_set_intensity(int intensity);
 
+
 /*
  * SharpSL Touchscreen Driver
  */
-
 unsigned long corgi_get_hsync_len(void);
 unsigned long spitz_get_hsync_len(void);
 void corgi_put_hsync(void);
@@ -33,89 +43,22 @@ void spitz_put_hsync(void);
 void corgi_wait_hsync(void);
 void spitz_wait_hsync(void);
 
+
 /*
  * SharpSL Battery/PM Driver
  */
 
-struct sharpsl_charger_machinfo {
-       void (*init)(void);
-       int gpio_acin;
-       int gpio_batfull;
-       int gpio_batlock;
-       int gpio_fatal;
-       int (*status_acin)(void);
-       void (*discharge)(int);
-       void (*discharge1)(int);
-       void (*charge)(int);
-       void (*chargeled)(int);
-       void (*measure_temp)(int);
-       void (*presuspend)(void);
-       void (*postsuspend)(void);
-       unsigned long (*charger_wakeup)(void);
-       int (*should_wakeup)(unsigned int resume_on_alarm);
-       int bat_levels;
-       struct battery_thresh *bat_levels_noac;
-       struct battery_thresh *bat_levels_acin;
-       int status_high_acin;
-       int status_low_acin;
-       int status_high_noac;
-       int status_low_noac;
-};
-
-struct battery_thresh {
-       int voltage;
-       int percentage;
-};
-
-struct battery_stat {
-       int ac_status;         /* APM AC Present/Not Present */
-       int mainbat_status;    /* APM Main Battery Status */
-       int mainbat_percent;   /* Main Battery Percentage Charge */
-       int mainbat_voltage;   /* Main Battery Voltage */
-};
-
-struct sharpsl_pm_status {
-       struct device *dev;
-       struct timer_list ac_timer;
-       struct timer_list chrg_full_timer;
-
-       int charge_mode;
-#define CHRG_ERROR    (-1)
-#define CHRG_OFF      (0)
-#define CHRG_ON       (1)
-#define CHRG_DONE     (2)
-
-       unsigned int flags;
-#define SHARPSL_SUSPENDED       (1 << 0)  /* Device is Suspended */
-#define SHARPSL_ALARM_ACTIVE    (1 << 1)  /* Alarm is for charging event (not user) */
-#define SHARPSL_BL_LIMIT        (1 << 2)  /* Backlight Intensity Limited */
-#define SHARPSL_APM_QUEUED      (1 << 3)  /* APM Event Queued */
-#define SHARPSL_DO_OFFLINE_CHRG (1 << 4)  /* Trigger the offline charger */
+#define READ_GPIO_BIT(x)    (GPLR(x) & GPIO_bit(x))
 
-       int full_count;
-       unsigned long charge_start_time;
-       struct sharpsl_charger_machinfo *machinfo;
-       struct battery_stat battstat;
-};
+/* MAX1111 Channel Definitions */
+#define MAX1111_BATT_VOLT   4u
+#define MAX1111_BATT_TEMP   2u
+#define MAX1111_ACIN_VOLT   6u
 
-extern struct sharpsl_pm_status sharpsl_pm;
 extern struct battery_thresh spitz_battery_levels_acin[];
 extern struct battery_thresh spitz_battery_levels_noac[];
+void sharpsl_pm_pxa_init(void);
+void sharpsl_pm_pxa_remove(void);
+int sharpsl_pm_pxa_read_max1111(int channel);
 
-#define READ_GPIO_BIT(x)    (GPLR(x) & GPIO_bit(x))
-
-#define SHARPSL_LED_ERROR  2
-#define SHARPSL_LED_ON     1
-#define SHARPSL_LED_OFF    0
 
-#define CHARGE_ON()         sharpsl_pm.machinfo->charge(1)
-#define CHARGE_OFF()        sharpsl_pm.machinfo->charge(0)
-#define CHARGE_LED_ON()     sharpsl_pm.machinfo->chargeled(SHARPSL_LED_ON)
-#define CHARGE_LED_OFF()    sharpsl_pm.machinfo->chargeled(SHARPSL_LED_OFF)
-#define CHARGE_LED_ERR()    sharpsl_pm.machinfo->chargeled(SHARPSL_LED_ERROR)
-#define DISCHARGE_ON()      sharpsl_pm.machinfo->discharge(1)
-#define DISCHARGE_OFF()     sharpsl_pm.machinfo->discharge(0)
-#define STATUS_AC_IN()      sharpsl_pm.machinfo->status_acin()
-#define STATUS_BATT_LOCKED()  READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock)
-#define STATUS_CHRG_FULL()  READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull)
-#define STATUS_FATAL()      READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal)
index c10be00fb52671ae7e7dc6fd2e1ccc93cb8ac722..6d402b262d8a49cc1db0eac22dd8d0daacbe1197 100644 (file)
 #undef DEBUG
 
 #include <linux/module.h>
-#include <linux/timer.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/apm_bios.h>
-#include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/platform_device.h>
 
 #include <asm/hardware.h>
-#include <asm/hardware/scoop.h>
 #include <asm/mach-types.h>
 #include <asm/irq.h>
 #include <asm/apm.h>
-
 #include <asm/arch/pm.h>
 #include <asm/arch/pxa-regs.h>
 #include <asm/arch/sharpsl.h>
 #include "sharpsl.h"
 
-/*
- * Constants
- */
-#define SHARPSL_CHARGE_ON_TIME_INTERVAL        (msecs_to_jiffies(1*60*1000))  /* 1 min */
-#define SHARPSL_CHARGE_FINISH_TIME             (msecs_to_jiffies(10*60*1000)) /* 10 min */
-#define SHARPSL_BATCHK_TIME                    (msecs_to_jiffies(15*1000))    /* 15 sec */
-#define SHARPSL_BATCHK_TIME_SUSPEND            (60*10)                        /* 10 min */
-#define SHARPSL_WAIT_CO_TIME                   15  /* 15 sec */
-#define SHARPSL_WAIT_DISCHARGE_ON              100 /* 100 msec */
-#define SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP   10  /* 10 msec */
-#define SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT   10  /* 10 msec */
-#define SHARPSL_CHECK_BATTERY_WAIT_TIME_ACIN   10  /* 10 msec */
-#define SHARPSL_CHARGE_WAIT_TIME               15  /* 15 msec */
-#define SHARPSL_CHARGE_CO_CHECK_TIME           5   /* 5 msec */
-#define SHARPSL_CHARGE_RETRY_CNT               1   /* eqv. 10 min */
-
-#define SHARPSL_CHARGE_ON_VOLT         0x99  /* 2.9V */
-#define SHARPSL_CHARGE_ON_TEMP         0xe0  /* 2.9V */
-#define SHARPSL_CHARGE_ON_ACIN_HIGH    0x9b  /* 6V */
-#define SHARPSL_CHARGE_ON_ACIN_LOW     0x34  /* 2V */
-#define SHARPSL_FATAL_ACIN_VOLT        182   /* 3.45V */
-#define SHARPSL_FATAL_NOACIN_VOLT      170   /* 3.40V */
-
 struct battery_thresh spitz_battery_levels_acin[] = {
        { 213, 100},
        { 212,  98},
@@ -151,763 +123,17 @@ struct battery_thresh  spitz_battery_levels_noac[] = {
 #define MAXCTRL_SEL_SH   4
 #define MAXCTRL_STR      1u << 7
 
-/* MAX1111 Channel Definitions */
-#define BATT_AD    4u
-#define BATT_THM   2u
-#define JK_VAD     6u
-
-
-/*
- * Prototypes
- */
-static int sharpsl_read_main_battery(void);
-static int sharpsl_off_charge_battery(void);
-static int sharpsl_check_battery_temp(void);
-static int sharpsl_check_battery_voltage(void);
-static int sharpsl_ac_check(void);
-static int sharpsl_fatal_check(void);
-static int sharpsl_average_value(int ad);
-static void sharpsl_average_clear(void);
-static void sharpsl_charge_toggle(void *private_);
-static void sharpsl_battery_thread(void *private_);
-
-
-/*
- * Variables
- */
-struct sharpsl_pm_status sharpsl_pm;
-DECLARE_WORK(toggle_charger, sharpsl_charge_toggle, NULL);
-DECLARE_WORK(sharpsl_bat, sharpsl_battery_thread, NULL);
-
-
-static int get_percentage(int voltage)
-{
-       int i = sharpsl_pm.machinfo->bat_levels - 1;
-       struct battery_thresh *thresh;
-
-       if (sharpsl_pm.charge_mode == CHRG_ON)
-               thresh=sharpsl_pm.machinfo->bat_levels_acin;
-       else
-               thresh=sharpsl_pm.machinfo->bat_levels_noac;
-
-       while (i > 0 && (voltage > thresh[i].voltage))
-               i--;
-
-       return thresh[i].percentage;
-}
-
-static int get_apm_status(int voltage)
-{
-       int low_thresh, high_thresh;
-
-       if (sharpsl_pm.charge_mode == CHRG_ON) {
-               high_thresh = sharpsl_pm.machinfo->status_high_acin;
-               low_thresh = sharpsl_pm.machinfo->status_low_acin;
-       } else {
-               high_thresh = sharpsl_pm.machinfo->status_high_noac;
-               low_thresh = sharpsl_pm.machinfo->status_low_noac;
-       }
-
-       if (voltage >= high_thresh)
-               return APM_BATTERY_STATUS_HIGH;
-       if (voltage >= low_thresh)
-               return APM_BATTERY_STATUS_LOW;
-       return APM_BATTERY_STATUS_CRITICAL;
-}
-
-void sharpsl_battery_kick(void)
-{
-       schedule_delayed_work(&sharpsl_bat, msecs_to_jiffies(125));
-}
-EXPORT_SYMBOL(sharpsl_battery_kick);
-
-
-static void sharpsl_battery_thread(void *private_)
-{
-       int voltage, percent, apm_status, i = 0;
-
-       if (!sharpsl_pm.machinfo)
-               return;
-
-       sharpsl_pm.battstat.ac_status = (STATUS_AC_IN() ? APM_AC_ONLINE : APM_AC_OFFLINE);
-
-       /* Corgi cannot confirm when battery fully charged so periodically kick! */
-       if (machine_is_corgi() && (sharpsl_pm.charge_mode == CHRG_ON)
-                       && time_after(jiffies, sharpsl_pm.charge_start_time +  SHARPSL_CHARGE_ON_TIME_INTERVAL))
-               schedule_work(&toggle_charger);
-
-       while(1) {
-               voltage = sharpsl_read_main_battery();
-               if (voltage > 0) break;
-               if (i++ > 5) {
-                       voltage = sharpsl_pm.machinfo->bat_levels_noac[0].voltage;
-                       dev_warn(sharpsl_pm.dev, "Warning: Cannot read main battery!\n");
-                       break;
-               }
-       }
-
-       voltage = sharpsl_average_value(voltage);
-       apm_status = get_apm_status(voltage);
-       percent = get_percentage(voltage);
-
-       /* At low battery voltages, the voltage has a tendency to start
-           creeping back up so we try to avoid this here */
-       if ((sharpsl_pm.battstat.ac_status == APM_AC_ONLINE) || (apm_status == APM_BATTERY_STATUS_HIGH) ||  percent <= sharpsl_pm.battstat.mainbat_percent) {
-               sharpsl_pm.battstat.mainbat_voltage = voltage;
-               sharpsl_pm.battstat.mainbat_status = apm_status;
-               sharpsl_pm.battstat.mainbat_percent = percent;
-       }
-
-       dev_dbg(sharpsl_pm.dev, "Battery: voltage: %d, status: %d, percentage: %d, time: %d\n", voltage,
-                       sharpsl_pm.battstat.mainbat_status, sharpsl_pm.battstat.mainbat_percent, jiffies);
-
-       /* If battery is low. limit backlight intensity to save power. */
-       if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE)
-                       && ((sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_LOW) ||
-                       (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL))) {
-               if (!(sharpsl_pm.flags & SHARPSL_BL_LIMIT)) {
-                       corgibl_limit_intensity(1);
-                       sharpsl_pm.flags |= SHARPSL_BL_LIMIT;
-               }
-       } else if (sharpsl_pm.flags & SHARPSL_BL_LIMIT) {
-               corgibl_limit_intensity(0);
-               sharpsl_pm.flags &= ~SHARPSL_BL_LIMIT;
-       }
-
-       /* Suspend if critical battery level */
-       if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE)
-                       && (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL)
-                       && !(sharpsl_pm.flags & SHARPSL_APM_QUEUED)) {
-               sharpsl_pm.flags |= SHARPSL_APM_QUEUED;
-               dev_err(sharpsl_pm.dev, "Fatal Off\n");
-               apm_queue_event(APM_CRITICAL_SUSPEND);
-       }
-
-       schedule_delayed_work(&sharpsl_bat, SHARPSL_BATCHK_TIME);
-}
-
-static void sharpsl_charge_on(void)
-{
-       dev_dbg(sharpsl_pm.dev, "Turning Charger On\n");
-
-       sharpsl_pm.full_count = 0;
-       sharpsl_pm.charge_mode = CHRG_ON;
-       schedule_delayed_work(&toggle_charger, msecs_to_jiffies(250));
-       schedule_delayed_work(&sharpsl_bat, msecs_to_jiffies(500));
-}
-
-static void sharpsl_charge_off(void)
-{
-       dev_dbg(sharpsl_pm.dev, "Turning Charger Off\n");
-
-       CHARGE_OFF();
-       CHARGE_LED_OFF();
-       sharpsl_pm.charge_mode = CHRG_OFF;
-
-       schedule_work(&sharpsl_bat);
-}
-
-static void sharpsl_charge_error(void)
-{
-       CHARGE_LED_ERR();
-       CHARGE_OFF();
-       sharpsl_pm.charge_mode = CHRG_ERROR;
-}
-
-static void sharpsl_charge_toggle(void *private_)
-{
-       dev_dbg(sharpsl_pm.dev, "Toogling Charger at time: %lx\n", jiffies);
-
-       if (STATUS_AC_IN() == 0) {
-               sharpsl_charge_off();
-               return;
-       } else if ((sharpsl_check_battery_temp() < 0) || (sharpsl_ac_check() < 0)) {
-               sharpsl_charge_error();
-               return;
-       }
-
-       CHARGE_LED_ON();
-       CHARGE_OFF();
-       mdelay(SHARPSL_CHARGE_WAIT_TIME);
-       CHARGE_ON();
-
-       sharpsl_pm.charge_start_time = jiffies;
-}
-
-static void sharpsl_ac_timer(unsigned long data)
-{
-       int acin = STATUS_AC_IN();
-
-       dev_dbg(sharpsl_pm.dev, "AC Status: %d\n",acin);
-
-       sharpsl_average_clear();
-       if (acin && (sharpsl_pm.charge_mode != CHRG_ON))
-               sharpsl_charge_on();
-       else if (sharpsl_pm.charge_mode == CHRG_ON)
-               sharpsl_charge_off();
-
-       schedule_work(&sharpsl_bat);
-}
-
-
-static irqreturn_t sharpsl_ac_isr(int irq, void *dev_id, struct pt_regs *fp)
-{
-       /* Delay the event slightly to debounce */
-       /* Must be a smaller delay than the chrg_full_isr below */
-       mod_timer(&sharpsl_pm.ac_timer, jiffies + msecs_to_jiffies(250));
-
-       return IRQ_HANDLED;
-}
-
-static void sharpsl_chrg_full_timer(unsigned long data)
-{
-       dev_dbg(sharpsl_pm.dev, "Charge Full at time: %lx\n", jiffies);
-
-       sharpsl_pm.full_count++;
-
-       if (STATUS_AC_IN() == 0) {
-               dev_dbg(sharpsl_pm.dev, "Charge Full: AC removed - stop charging!\n");
-               if (sharpsl_pm.charge_mode == CHRG_ON)
-                       sharpsl_charge_off();
-       } else if (sharpsl_pm.full_count < 2) {
-               dev_dbg(sharpsl_pm.dev, "Charge Full: Count too low\n");
-               schedule_work(&toggle_charger);
-       } else if (time_after(jiffies, sharpsl_pm.charge_start_time + SHARPSL_CHARGE_FINISH_TIME)) {
-               dev_dbg(sharpsl_pm.dev, "Charge Full: Interrupt generated too slowly - retry.\n");
-               schedule_work(&toggle_charger);
-       } else {
-               sharpsl_charge_off();
-               sharpsl_pm.charge_mode = CHRG_DONE;
-               dev_dbg(sharpsl_pm.dev, "Charge Full: Charging Finished\n");
-       }
-}
-
-/* Charging Finished Interrupt (Not present on Corgi) */
-/* Can trigger at the same time as an AC staus change so
-   delay until after that has been processed */
-static irqreturn_t sharpsl_chrg_full_isr(int irq, void *dev_id, struct pt_regs *fp)
-{
-       if (sharpsl_pm.flags & SHARPSL_SUSPENDED)
-               return IRQ_HANDLED;
-
-       /* delay until after any ac interrupt */
-       mod_timer(&sharpsl_pm.chrg_full_timer, jiffies + msecs_to_jiffies(500));
-
-       return IRQ_HANDLED;
-}
-
-static irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id, struct pt_regs *fp)
-{
-       int is_fatal = 0;
-
-       if (STATUS_BATT_LOCKED() == 0) {
-               dev_err(sharpsl_pm.dev, "Battery now Unlocked! Suspending.\n");
-               is_fatal = 1;
-       }
-
-       if (sharpsl_pm.machinfo->gpio_fatal && (STATUS_FATAL() == 0)) {
-               dev_err(sharpsl_pm.dev, "Fatal Batt Error! Suspending.\n");
-               is_fatal = 1;
-       }
-
-       if (!(sharpsl_pm.flags & SHARPSL_APM_QUEUED) && is_fatal) {
-               sharpsl_pm.flags |= SHARPSL_APM_QUEUED;
-               apm_queue_event(APM_CRITICAL_SUSPEND);
-       }
-
-       return IRQ_HANDLED;
-}
-
-/*
- * Maintain an average of the last 10 readings
- */
-#define SHARPSL_CNV_VALUE_NUM    10
-static int sharpsl_ad_index;
-
-static void sharpsl_average_clear(void)
-{
-       sharpsl_ad_index = 0;
-}
-
-static int sharpsl_average_value(int ad)
-{
-       int i, ad_val = 0;
-       static int sharpsl_ad[SHARPSL_CNV_VALUE_NUM+1];
-
-       if (sharpsl_pm.battstat.mainbat_status != APM_BATTERY_STATUS_HIGH) {
-               sharpsl_ad_index = 0;
-               return ad;
-       }
-
-       sharpsl_ad[sharpsl_ad_index] = ad;
-       sharpsl_ad_index++;
-       if (sharpsl_ad_index >= SHARPSL_CNV_VALUE_NUM) {
-               for (i=0; i < (SHARPSL_CNV_VALUE_NUM-1); i++)
-                       sharpsl_ad[i] = sharpsl_ad[i+1];
-               sharpsl_ad_index = SHARPSL_CNV_VALUE_NUM - 1;
-       }
-       for (i=0; i < sharpsl_ad_index; i++)
-               ad_val += sharpsl_ad[i];
-
-       return (ad_val / sharpsl_ad_index);
-}
-
-
 /*
  * Read MAX1111 ADC
  */
-static int read_max1111(int channel)
+int sharpsl_pm_pxa_read_max1111(int channel)
 {
        return corgi_ssp_max1111_get((channel << MAXCTRL_SEL_SH) | MAXCTRL_PD0 | MAXCTRL_PD1
                        | MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR);
 }
 
-static int sharpsl_read_main_battery(void)
-{
-       return read_max1111(BATT_AD);
-}
-
-static int sharpsl_read_temp(void)
+void sharpsl_pm_pxa_init(void)
 {
-       int temp;
-
-       sharpsl_pm.machinfo->measure_temp(1);
-
-       mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP);
-       temp = read_max1111(BATT_THM);
-
-       sharpsl_pm.machinfo->measure_temp(0);
-
-       return temp;
-}
-
-static int sharpsl_read_acin(void)
-{
-       return read_max1111(JK_VAD);
-}
-
-/*
- * Take an array of 5 integers, remove the maximum and minimum values
- * and return the average.
- */
-static int get_select_val(int *val)
-{
-       int i, j, k, temp, sum = 0;
-
-       /* Find MAX val */
-       temp = val[0];
-       j=0;
-       for (i=1; i<5; i++) {
-               if (temp < val[i]) {
-                       temp = val[i];
-                       j = i;
-               }
-       }
-
-       /* Find MIN val */
-       temp = val[4];
-       k=4;
-       for (i=3; i>=0; i--) {
-               if (temp > val[i]) {
-                       temp = val[i];
-                       k = i;
-               }
-       }
-
-       for (i=0; i<5; i++)
-               if (i != j && i != k )
-                       sum += val[i];
-
-       dev_dbg(sharpsl_pm.dev, "Average: %d from values: %d, %d, %d, %d, %d\n", sum/3, val[0], val[1], val[2], val[3], val[4]);
-
-       return (sum/3);
-}
-
-static int sharpsl_check_battery_temp(void)
-{
-       int val, i, buff[5];
-
-       /* Check battery temperature */
-       for (i=0; i<5; i++) {
-               mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP);
-               buff[i] = sharpsl_read_temp();
-       }
-
-       val = get_select_val(buff);
-
-       dev_dbg(sharpsl_pm.dev, "Temperature: %d\n", val);
-       if (val > SHARPSL_CHARGE_ON_TEMP)
-               return -1;
-
-       return 0;
-}
-
-static int sharpsl_check_battery_voltage(void)
-{
-       int val, i, buff[5];
-
-       /* disable charge, enable discharge */
-       CHARGE_OFF();
-       DISCHARGE_ON();
-       mdelay(SHARPSL_WAIT_DISCHARGE_ON);
-
-       if (sharpsl_pm.machinfo->discharge1)
-               sharpsl_pm.machinfo->discharge1(1);
-
-       /* Check battery voltage */
-       for (i=0; i<5; i++) {
-               buff[i] = sharpsl_read_main_battery();
-               mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
-       }
-
-       if (sharpsl_pm.machinfo->discharge1)
-               sharpsl_pm.machinfo->discharge1(0);
-
-       DISCHARGE_OFF();
-
-       val = get_select_val(buff);
-       dev_dbg(sharpsl_pm.dev, "Battery Voltage: %d\n", val);
-
-       if (val < SHARPSL_CHARGE_ON_VOLT)
-               return -1;
-
-       return 0;
-}
-
-static int sharpsl_ac_check(void)
-{
-       int temp, i, buff[5];
-
-       for (i=0; i<5; i++) {
-               buff[i] = sharpsl_read_acin();
-               mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_ACIN);
-       }
-
-       temp = get_select_val(buff);
-       dev_dbg(sharpsl_pm.dev, "AC Voltage: %d\n",temp);
-
-       if ((temp > SHARPSL_CHARGE_ON_ACIN_HIGH) || (temp < SHARPSL_CHARGE_ON_ACIN_LOW)) {
-               dev_err(sharpsl_pm.dev, "Error: AC check failed.\n");
-               return -1;
-       }
-
-       return 0;
-}
-
-#ifdef CONFIG_PM
-static int sharpsl_pm_suspend(struct platform_device *pdev, pm_message_t state)
-{
-       sharpsl_pm.flags |= SHARPSL_SUSPENDED;
-       flush_scheduled_work();
-
-       if (sharpsl_pm.charge_mode == CHRG_ON)
-               sharpsl_pm.flags |= SHARPSL_DO_OFFLINE_CHRG;
-       else
-               sharpsl_pm.flags &= ~SHARPSL_DO_OFFLINE_CHRG;
-
-       return 0;
-}
-
-static int sharpsl_pm_resume(struct platform_device *pdev)
-{
-       /* Clear the reset source indicators as they break the bootloader upon reboot */
-       RCSR = 0x0f;
-       sharpsl_average_clear();
-       sharpsl_pm.flags &= ~SHARPSL_APM_QUEUED;
-       sharpsl_pm.flags &= ~SHARPSL_SUSPENDED;
-
-       return 0;
-}
-
-static void corgi_goto_sleep(unsigned long alarm_time, unsigned int alarm_enable, suspend_state_t state)
-{
-       dev_dbg(sharpsl_pm.dev, "Time is: %08x\n",RCNR);
-
-       dev_dbg(sharpsl_pm.dev, "Offline Charge Activate = %d\n",sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG);
-       /* not charging and AC-IN! */
-
-       if ((sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG) && (STATUS_AC_IN() != 0)) {
-               dev_dbg(sharpsl_pm.dev, "Activating Offline Charger...\n");
-               sharpsl_pm.charge_mode = CHRG_OFF;
-               sharpsl_pm.flags &= ~SHARPSL_DO_OFFLINE_CHRG;
-               sharpsl_off_charge_battery();
-       }
-
-       sharpsl_pm.machinfo->presuspend();
-
-       PEDR = 0xffffffff; /* clear it */
-
-       sharpsl_pm.flags &= ~SHARPSL_ALARM_ACTIVE;
-       if ((sharpsl_pm.charge_mode == CHRG_ON) && ((alarm_enable && ((alarm_time - RCNR) > (SHARPSL_BATCHK_TIME_SUSPEND + 30))) || !alarm_enable)) {
-               RTSR &= RTSR_ALE;
-               RTAR = RCNR + SHARPSL_BATCHK_TIME_SUSPEND;
-               dev_dbg(sharpsl_pm.dev, "Charging alarm at: %08x\n",RTAR);
-               sharpsl_pm.flags |= SHARPSL_ALARM_ACTIVE;
-       } else if (alarm_enable) {
-               RTSR &= RTSR_ALE;
-               RTAR = alarm_time;
-               dev_dbg(sharpsl_pm.dev, "User alarm at: %08x\n",RTAR);
-       } else {
-               dev_dbg(sharpsl_pm.dev, "No alarms set.\n");
-       }
-
-       pxa_pm_enter(state);
-
-       sharpsl_pm.machinfo->postsuspend();
-
-       dev_dbg(sharpsl_pm.dev, "Corgi woken up from suspend: %08x\n",PEDR);
-}
-
-static int corgi_enter_suspend(unsigned long alarm_time, unsigned int alarm_enable, suspend_state_t state)
-{
-       if (!sharpsl_pm.machinfo->should_wakeup(!(sharpsl_pm.flags & SHARPSL_ALARM_ACTIVE) && alarm_enable) )
-       {
-               if (!(sharpsl_pm.flags & SHARPSL_ALARM_ACTIVE)) {
-                       dev_dbg(sharpsl_pm.dev, "No user triggered wakeup events and not charging. Strange. Suspend.\n");
-                       corgi_goto_sleep(alarm_time, alarm_enable, state);
-                       return 1;
-               }
-               if(sharpsl_off_charge_battery()) {
-                       dev_dbg(sharpsl_pm.dev, "Charging. Suspend...\n");
-                       corgi_goto_sleep(alarm_time, alarm_enable, state);
-                       return 1;
-               }
-               dev_dbg(sharpsl_pm.dev, "User triggered wakeup in offline charger.\n");
-       }
-
-       if ((STATUS_BATT_LOCKED() == 0) || (sharpsl_fatal_check() < 0) )
-       {
-               dev_err(sharpsl_pm.dev, "Fatal condition. Suspend.\n");
-               corgi_goto_sleep(alarm_time, alarm_enable, state);
-               return 1;
-       }
-
-       return 0;
-}
-
-static int corgi_pxa_pm_enter(suspend_state_t state)
-{
-       unsigned long alarm_time = RTAR;
-       unsigned int alarm_status = ((RTSR & RTSR_ALE) != 0);
-
-       dev_dbg(sharpsl_pm.dev, "SharpSL suspending for first time.\n");
-
-       corgi_goto_sleep(alarm_time, alarm_status, state);
-
-       while (corgi_enter_suspend(alarm_time,alarm_status,state))
-               {}
-
-       dev_dbg(sharpsl_pm.dev, "SharpSL resuming...\n");
-
-       return 0;
-}
-#endif
-
-
-/*
- * Check for fatal battery errors
- * Fatal returns -1
- */
-static int sharpsl_fatal_check(void)
-{
-       int buff[5], temp, i, acin;
-
-       dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check entered\n");
-
-       /* Check AC-Adapter */
-       acin = STATUS_AC_IN();
-
-       if (acin && (sharpsl_pm.charge_mode == CHRG_ON)) {
-               CHARGE_OFF();
-               udelay(100);
-               DISCHARGE_ON(); /* enable discharge */
-               mdelay(SHARPSL_WAIT_DISCHARGE_ON);
-       }
-
-       if (sharpsl_pm.machinfo->discharge1)
-               sharpsl_pm.machinfo->discharge1(1);
-
-       /* Check battery : check inserting battery ? */
-       for (i=0; i<5; i++) {
-               buff[i] = sharpsl_read_main_battery();
-               mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
-       }
-
-       if (sharpsl_pm.machinfo->discharge1)
-               sharpsl_pm.machinfo->discharge1(0);
-
-       if (acin && (sharpsl_pm.charge_mode == CHRG_ON)) {
-               udelay(100);
-               CHARGE_ON();
-               DISCHARGE_OFF();
-       }
-
-       temp = get_select_val(buff);
-       dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check: acin: %d, discharge voltage: %d, no discharge: %d\n", acin, temp, sharpsl_read_main_battery());
-
-       if ((acin && (temp < SHARPSL_FATAL_ACIN_VOLT)) ||
-                       (!acin && (temp < SHARPSL_FATAL_NOACIN_VOLT)))
-               return -1;
-       return 0;
-}
-
-static int sharpsl_off_charge_error(void)
-{
-       dev_err(sharpsl_pm.dev, "Offline Charger: Error occured.\n");
-       CHARGE_OFF();
-       CHARGE_LED_ERR();
-       sharpsl_pm.charge_mode = CHRG_ERROR;
-       return 1;
-}
-
-/*
- * Charging Control while suspended
- * Return 1 - go straight to sleep
- * Return 0 - sleep or wakeup depending on other factors
- */
-static int sharpsl_off_charge_battery(void)
-{
-       int time;
-
-       dev_dbg(sharpsl_pm.dev, "Charge Mode: %d\n", sharpsl_pm.charge_mode);
-
-       if (sharpsl_pm.charge_mode == CHRG_OFF) {
-               dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 1\n");
-
-               /* AC Check */
-               if ((sharpsl_ac_check() < 0) || (sharpsl_check_battery_temp() < 0))
-                       return sharpsl_off_charge_error();
-
-               /* Start Charging */
-               CHARGE_LED_ON();
-               CHARGE_OFF();
-               mdelay(SHARPSL_CHARGE_WAIT_TIME);
-               CHARGE_ON();
-
-               sharpsl_pm.charge_mode = CHRG_ON;
-               sharpsl_pm.full_count = 0;
-
-               return 1;
-       } else if (sharpsl_pm.charge_mode != CHRG_ON) {
-               return 1;
-       }
-
-       if (sharpsl_pm.full_count == 0) {
-               int time;
-
-               dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 2\n");
-
-               if ((sharpsl_check_battery_temp() < 0) || (sharpsl_check_battery_voltage() < 0))
-                       return sharpsl_off_charge_error();
-
-               CHARGE_OFF();
-               mdelay(SHARPSL_CHARGE_WAIT_TIME);
-               CHARGE_ON();
-               sharpsl_pm.charge_mode = CHRG_ON;
-
-               mdelay(SHARPSL_CHARGE_CO_CHECK_TIME);
-
-               time = RCNR;
-               while(1) {
-                       /* Check if any wakeup event had occured */
-                       if (sharpsl_pm.machinfo->charger_wakeup() != 0)
-                               return 0;
-                       /* Check for timeout */
-                       if ((RCNR - time) > SHARPSL_WAIT_CO_TIME)
-                               return 1;
-                       if (STATUS_CHRG_FULL()) {
-                               dev_dbg(sharpsl_pm.dev, "Offline Charger: Charge full occured. Retrying to check\n");
-                               sharpsl_pm.full_count++;
-                               CHARGE_OFF();
-                               mdelay(SHARPSL_CHARGE_WAIT_TIME);
-                               CHARGE_ON();
-                               return 1;
-                       }
-               }
-       }
-
-       dev_dbg(sharpsl_pm.dev, "Offline Charger: Step 3\n");
-
-       mdelay(SHARPSL_CHARGE_CO_CHECK_TIME);
-
-       time = RCNR;
-       while(1) {
-               /* Check if any wakeup event had occured */
-               if (sharpsl_pm.machinfo->charger_wakeup() != 0)
-                       return 0;
-               /* Check for timeout */
-               if ((RCNR-time) > SHARPSL_WAIT_CO_TIME) {
-                       if (sharpsl_pm.full_count > SHARPSL_CHARGE_RETRY_CNT) {
-                               dev_dbg(sharpsl_pm.dev, "Offline Charger: Not charged sufficiently. Retrying.\n");
-                               sharpsl_pm.full_count = 0;
-                       }
-                       sharpsl_pm.full_count++;
-                       return 1;
-               }
-               if (STATUS_CHRG_FULL()) {
-                       dev_dbg(sharpsl_pm.dev, "Offline Charger: Charging complete.\n");
-                       CHARGE_LED_OFF();
-                       CHARGE_OFF();
-                       sharpsl_pm.charge_mode = CHRG_DONE;
-                       return 1;
-               }
-       }
-}
-
-
-static ssize_t battery_percentage_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
-       return sprintf(buf, "%d\n",sharpsl_pm.battstat.mainbat_percent);
-}
-
-static ssize_t battery_voltage_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
-       return sprintf(buf, "%d\n",sharpsl_pm.battstat.mainbat_voltage);
-}
-
-static DEVICE_ATTR(battery_percentage, 0444, battery_percentage_show, NULL);
-static DEVICE_ATTR(battery_voltage, 0444, battery_voltage_show, NULL);
-
-extern void (*apm_get_power_status)(struct apm_power_info *);
-
-static void sharpsl_apm_get_power_status(struct apm_power_info *info)
-{
-       info->ac_line_status = sharpsl_pm.battstat.ac_status;
-
-       if (sharpsl_pm.charge_mode == CHRG_ON)
-               info->battery_status = APM_BATTERY_STATUS_CHARGING;
-       else
-               info->battery_status = sharpsl_pm.battstat.mainbat_status;
-
-       info->battery_flag = (1 << info->battery_status);
-       info->battery_life = sharpsl_pm.battstat.mainbat_percent;
-}
-
-static struct pm_ops sharpsl_pm_ops = {
-       .pm_disk_mode   = PM_DISK_FIRMWARE,
-       .prepare        = pxa_pm_prepare,
-       .enter          = corgi_pxa_pm_enter,
-       .finish         = pxa_pm_finish,
-};
-
-static int __init sharpsl_pm_probe(struct platform_device *pdev)
-{
-       if (!pdev->dev.platform_data)
-               return -EINVAL;
-
-       sharpsl_pm.dev = &pdev->dev;
-       sharpsl_pm.machinfo = pdev->dev.platform_data;
-       sharpsl_pm.charge_mode = CHRG_OFF;
-       sharpsl_pm.flags = 0;
-
-       sharpsl_pm.machinfo->init();
-
-       init_timer(&sharpsl_pm.ac_timer);
-       sharpsl_pm.ac_timer.function = sharpsl_ac_timer;
-
-       init_timer(&sharpsl_pm.chrg_full_timer);
-       sharpsl_pm.chrg_full_timer.function = sharpsl_chrg_full_timer;
-
        pxa_gpio_mode(sharpsl_pm.machinfo->gpio_acin | GPIO_IN);
        pxa_gpio_mode(sharpsl_pm.machinfo->gpio_batfull | GPIO_IN);
        pxa_gpio_mode(sharpsl_pm.machinfo->gpio_batlock | GPIO_IN);
@@ -938,26 +164,10 @@ static int __init sharpsl_pm_probe(struct platform_device *pdev)
                }
                else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull),IRQT_RISING);
        }
-
-       device_create_file(&pdev->dev, &dev_attr_battery_percentage);
-       device_create_file(&pdev->dev, &dev_attr_battery_voltage);
-
-       apm_get_power_status = sharpsl_apm_get_power_status;
-
-       pm_set_ops(&sharpsl_pm_ops);
-
-       mod_timer(&sharpsl_pm.ac_timer, jiffies + msecs_to_jiffies(250));
-
-       return 0;
 }
 
-static int sharpsl_pm_remove(struct platform_device *pdev)
+void sharpsl_pm_pxa_remove(void)
 {
-       pm_set_ops(NULL);
-
-       device_remove_file(&pdev->dev, &dev_attr_battery_percentage);
-       device_remove_file(&pdev->dev, &dev_attr_battery_voltage);
-
        free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr);
        free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr);
 
@@ -966,32 +176,4 @@ static int sharpsl_pm_remove(struct platform_device *pdev)
 
        if (!machine_is_corgi())
                free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr);
-
-       del_timer_sync(&sharpsl_pm.chrg_full_timer);
-       del_timer_sync(&sharpsl_pm.ac_timer);
-
-       return 0;
 }
-
-static struct platform_driver sharpsl_pm_driver = {
-       .probe          = sharpsl_pm_probe,
-       .remove         = sharpsl_pm_remove,
-       .suspend        = sharpsl_pm_suspend,
-       .resume         = sharpsl_pm_resume,
-       .driver         = {
-               .name           = "sharpsl-pm",
-       },
-};
-
-static int __devinit sharpsl_pm_init(void)
-{
-       return platform_driver_register(&sharpsl_pm_driver);
-}
-
-static void sharpsl_pm_exit(void)
-{
-       platform_driver_unregister(&sharpsl_pm_driver);
-}
-
-late_initcall(sharpsl_pm_init);
-module_exit(sharpsl_pm_exit);
index 2df1b56615b1029601d405b958f682aae41d8b98..f2007db0cda5aebe5ad398a3909f8ddecd1f688f 100644 (file)
@@ -36,6 +36,7 @@
 #include <asm/arch/irq.h>
 #include <asm/arch/irda.h>
 #include <asm/arch/mmc.h>
+#include <asm/arch/ohci.h>
 #include <asm/arch/udc.h>
 #include <asm/arch/pxafb.h>
 #include <asm/arch/akita.h>
@@ -126,10 +127,12 @@ static void spitz_card_pwr_ctrl(int device, unsigned short new_cpr)
                        cpr &= ~0x0002;
                if (device == SPITZ_PWR_SD)
                        cpr &= ~0x0004;
-               write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | new_cpr);
                if (!(cpr & 0x0002) && !(cpr & 0x0004)) {
+                       write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, 0x0000);
                        mdelay(1);
                        reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER);
+               } else {
+                       write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | new_cpr);
                }
        }
 }
@@ -334,6 +337,35 @@ static struct pxamci_platform_data spitz_mci_platform_data = {
 };
 
 
+/*
+ * USB Host (OHCI)
+ */
+static int spitz_ohci_init(struct device *dev)
+{
+       /* Only Port 2 is connected */
+       pxa_gpio_mode(SPITZ_GPIO_USB_CONNECT | GPIO_IN);
+       pxa_gpio_mode(SPITZ_GPIO_USB_HOST | GPIO_OUT);
+       pxa_gpio_mode(SPITZ_GPIO_USB_DEVICE | GPIO_IN);
+
+       /* Setup USB Port 2 Output Control Register */
+       UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
+
+       GPSR(SPITZ_GPIO_USB_HOST) = GPIO_bit(SPITZ_GPIO_USB_HOST);
+
+       UHCHR = (UHCHR) &
+               ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE);
+
+       UHCRHDA |= UHCRHDA_NOCP;
+
+       return 0;
+}
+
+static struct pxaohci_platform_data spitz_ohci_platform_data = {
+       .port_mode      = PMM_NPS_MODE,
+       .init           = spitz_ohci_init,
+};
+
+
 /*
  * Irda
  */
@@ -411,6 +443,7 @@ static void __init common_init(void)
 
        platform_add_devices(devices, ARRAY_SIZE(devices));
        pxa_set_mci_info(&spitz_mci_platform_data);
+       pxa_set_ohci_info(&spitz_ohci_platform_data);
        pxa_set_ficp_info(&spitz_ficp_platform_data);
        set_pxa_fb_parent(&spitzssp_device.dev);
        set_pxa_fb_info(&spitz_pxafb_info);
index 3ce7486daa51b42c73febb736220e24103ce4227..5e5bdc898482191548156b50ac5f324a491e4ae8 100644 (file)
@@ -33,19 +33,7 @@ static void spitz_charger_init(void)
 {
        pxa_gpio_mode(SPITZ_GPIO_KEY_INT | GPIO_IN);
        pxa_gpio_mode(SPITZ_GPIO_SYNC | GPIO_IN);
-}
-
-static void spitz_charge_led(int val)
-{
-       if (val == SHARPSL_LED_ERROR) {
-               dev_dbg(sharpsl_pm.dev, "Charge LED Error\n");
-       } else if (val == SHARPSL_LED_ON) {
-               dev_dbg(sharpsl_pm.dev, "Charge LED On\n");
-               set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_LED_ORANGE);
-       } else {
-               dev_dbg(sharpsl_pm.dev, "Charge LED Off\n");
-               reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_LED_ORANGE);
-       }
+       sharpsl_pm_pxa_init();
 }
 
 static void spitz_measure_temp(int on)
@@ -92,7 +80,7 @@ static void spitz_discharge1(int on)
 
 static void spitz_presuspend(void)
 {
-       spitz_last_ac_status = STATUS_AC_IN();
+       spitz_last_ac_status = sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN);
 
        /* GPIO Sleep Register */
        PGSR0 = 0x00144018;
@@ -138,7 +126,7 @@ static void spitz_postsuspend(void)
 static int spitz_should_wakeup(unsigned int resume_on_alarm)
 {
        int is_resume = 0;
-       int acin = STATUS_AC_IN();
+       int acin = sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN);
 
        if (spitz_last_ac_status != acin) {
                if (acin) {
@@ -148,8 +136,8 @@ static int spitz_should_wakeup(unsigned int resume_on_alarm)
                } else {
                        /* charge off */
                        dev_dbg(sharpsl_pm.dev, "AC Removed\n");
-                       CHARGE_LED_OFF();
-                       CHARGE_OFF();
+                       sharpsl_pm_led(SHARPSL_LED_OFF);
+                       sharpsl_pm.machinfo->charge(0);
                        sharpsl_pm.charge_mode = CHRG_OFF;
                }
                spitz_last_ac_status = acin;
@@ -175,25 +163,41 @@ static unsigned long spitz_charger_wakeup(void)
        return (~GPLR0 & GPIO_bit(SPITZ_GPIO_KEY_INT)) | (GPLR0 & GPIO_bit(SPITZ_GPIO_SYNC));
 }
 
-static int spitz_acin_status(void)
+unsigned long spitzpm_read_devdata(int type)
 {
-       return (((~GPLR(SPITZ_GPIO_AC_IN)) & GPIO_bit(SPITZ_GPIO_AC_IN)) != 0);
+       switch(type) {
+       case SHARPSL_STATUS_ACIN:
+               return (((~GPLR(SPITZ_GPIO_AC_IN)) & GPIO_bit(SPITZ_GPIO_AC_IN)) != 0);
+       case SHARPSL_STATUS_LOCK:
+               return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock);
+       case SHARPSL_STATUS_CHRGFULL:
+               return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull);
+       case SHARPSL_STATUS_FATAL:
+               return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal);
+       case SHARPSL_ACIN_VOLT:
+               return sharpsl_pm_pxa_read_max1111(MAX1111_ACIN_VOLT);
+       case SHARPSL_BATT_TEMP:
+               return sharpsl_pm_pxa_read_max1111(MAX1111_BATT_TEMP);
+       case SHARPSL_BATT_VOLT:
+       default:
+               return sharpsl_pm_pxa_read_max1111(MAX1111_BATT_VOLT);
+       }
 }
 
 struct sharpsl_charger_machinfo spitz_pm_machinfo = {
        .init             = spitz_charger_init,
+       .exit             = sharpsl_pm_pxa_remove,
        .gpio_batlock     = SPITZ_GPIO_BAT_COVER,
        .gpio_acin        = SPITZ_GPIO_AC_IN,
        .gpio_batfull     = SPITZ_GPIO_CHRG_FULL,
        .gpio_fatal       = SPITZ_GPIO_FATAL_BAT,
-       .status_acin      = spitz_acin_status,
        .discharge        = spitz_discharge,
        .discharge1       = spitz_discharge1,
        .charge           = spitz_charge,
-       .chargeled        = spitz_charge_led,
        .measure_temp     = spitz_measure_temp,
        .presuspend       = spitz_presuspend,
        .postsuspend      = spitz_postsuspend,
+       .read_devdata     = spitzpm_read_devdata,
        .charger_wakeup   = spitz_charger_wakeup,
        .should_wakeup    = spitz_should_wakeup,
        .bat_levels       = 40,
index 002635c97bb6dcb5c2485332144b4770ad1680fc..331e1b483aa74ec1bdb0de038c84b7dabd68185e 100644 (file)
@@ -57,17 +57,6 @@ void clk_disable(struct clk *clk)
 }
 EXPORT_SYMBOL(clk_disable);
 
-int clk_use(struct clk *clk)
-{
-       return 0;
-}
-EXPORT_SYMBOL(clk_use);
-
-void clk_unuse(struct clk *clk)
-{
-}
-EXPORT_SYMBOL(clk_unuse);
-
 unsigned long clk_get_rate(struct clk *clk)
 {
        return clk->rate;
index af6580f1ceb8e583404218ad65afcbb8d396f9d0..4a222f59f2cf0aaeb5c20aa8507b39a22371467e 100644 (file)
 #include <linux/dma-mapping.h>
 #include <linux/sysdev.h>
 #include <linux/interrupt.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/clcd.h>
 
 #include <asm/system.h>
 #include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/leds.h>
-#include <asm/hardware/amba.h>
-#include <asm/hardware/amba_clcd.h>
 #include <asm/hardware/arm_timer.h>
 #include <asm/hardware/icst307.h>
 
index c06e6041df41bbde4fe03f66f5a0b478c128d949..93e86d9f439cc10a4579b223e5ebd0f9157663d3 100644 (file)
@@ -22,7 +22,8 @@
 #ifndef __ASM_ARCH_REALVIEW_H
 #define __ASM_ARCH_REALVIEW_H
 
-#include <asm/hardware/amba.h>
+#include <linux/amba/bus.h>
+
 #include <asm/leds.h>
 #include <asm/io.h>
 
index 7dc32503fdf28ae68291c829866f2bbb8503624f..112f7592aca972cef48f361365631c447d5a2283 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/sysdev.h>
+#include <linux/amba/bus.h>
 
 #include <asm/hardware.h>
 #include <asm/io.h>
@@ -30,7 +31,6 @@
 #include <asm/leds.h>
 #include <asm/mach-types.h>
 #include <asm/hardware/gic.h>
-#include <asm/hardware/amba.h>
 #include <asm/hardware/icst307.h>
 
 #include <asm/mach/arch.h>
index bc0747439fb36ea5726e03b6d2584d2f9dd99447..bd86ffba8810e9b3b1716df97d60cacb1dfd2857 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/mman.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
-#include <linux/pci.h>
+#include <linux/dma-mapping.h>
 
 #include <asm/page.h>
 #include <asm/dma.h>
@@ -148,11 +148,14 @@ static void iomd_enable_dma(dmach_t channel, dma_t *dma)
                 * Cope with ISA-style drivers which expect cache
                 * coherence.
                 */
-               if (!dma->using_sg) {
-                       dma->buf.dma_address = pci_map_single(NULL,
-                               dma->buf.__address, dma->buf.length,
+               if (!dma->sg) {
+                       dma->sg = &dma->buf;
+                       dma->sgcount = 1;
+                       dma->buf.length = dma->count;
+                       dma->buf.dma_address = dma_map_single(NULL,
+                               dma->addr, dma->count,
                                dma->dma_mode == DMA_MODE_READ ?
-                               PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE);
+                               DMA_FROM_DEVICE : DMA_TO_DEVICE);
                }
 
                iomd_writeb(DMA_CR_C, dma_base + CR);
@@ -239,7 +242,7 @@ static void floppy_enable_dma(dmach_t channel, dma_t *dma)
        unsigned int fiqhandler_length;
        struct pt_regs regs;
 
-       if (dma->using_sg)
+       if (dma->sg)
                BUG();
 
        if (dma->dma_mode == DMA_MODE_READ) {
@@ -252,8 +255,8 @@ static void floppy_enable_dma(dmach_t channel, dma_t *dma)
                fiqhandler_length = &floppy_fiqout_end - &floppy_fiqout_start;
        }
 
-       regs.ARM_r9  = dma->buf.length;
-       regs.ARM_r10 = (unsigned long)dma->buf.__address;
+       regs.ARM_r9  = dma->count;
+       regs.ARM_r10 = (unsigned long)dma->addr;
        regs.ARM_fp  = (unsigned long)FLOPPYDMA_BASE;
 
        if (claim_fiq(&fh)) {
index 82e8253b1fa04d556c4da51b2db7ca905bb642c3..77f321fac281006a252804a770628b7fc0a0f3de 100644 (file)
@@ -151,18 +151,6 @@ void clk_disable(struct clk *clk)
 }
 
 
-int clk_use(struct clk *clk)
-{
-       atomic_inc(&clk->used);
-       return 0;
-}
-
-
-void clk_unuse(struct clk *clk)
-{
-       atomic_dec(&clk->used);
-}
-
 unsigned long clk_get_rate(struct clk *clk)
 {
        if (IS_ERR(clk))
@@ -196,8 +184,6 @@ EXPORT_SYMBOL(clk_get);
 EXPORT_SYMBOL(clk_put);
 EXPORT_SYMBOL(clk_enable);
 EXPORT_SYMBOL(clk_disable);
-EXPORT_SYMBOL(clk_use);
-EXPORT_SYMBOL(clk_unuse);
 EXPORT_SYMBOL(clk_get_rate);
 EXPORT_SYMBOL(clk_round_rate);
 EXPORT_SYMBOL(clk_set_rate);
@@ -370,7 +356,6 @@ static struct clk init_clocks[] = {
 int s3c24xx_register_clock(struct clk *clk)
 {
        clk->owner = THIS_MODULE;
-       atomic_set(&clk->used, 0);
 
        if (clk->enable == NULL)
                clk->enable = clk_null_enable;
index 7953b6f397b9b6495570cdc0858245bcacc39cb4..177d5c8decf74306bbf5eb874840507fd5557b2c 100644 (file)
@@ -16,7 +16,6 @@ struct clk {
        struct clk           *parent;
        const char           *name;
        int                   id;
-       atomic_t              used;
        unsigned long         rate;
        unsigned long         ctrlbit;
        int                 (*enable)(struct clk *, int enable);
index 8a00e3c3cd089cf3bec4f192c72322cee95ebd93..9acda44b25a673b5f2424776ef631440bd686937 100644 (file)
@@ -191,7 +191,6 @@ static void s3c2410_timer_setup (void)
                if (IS_ERR(clk))
                        panic("failed to get clock for system timer");
 
-               clk_use(clk);
                clk_enable(clk);
 
                pclk = clk_get_rate(clk);
index 59c7964cfe11d0a9b68193f5efb369c592ab1a7e..786c8534231f8e258858cfab996be37128c46a90 100644 (file)
@@ -134,30 +134,12 @@ unsigned long sleep_phys_sp(void *sp)
        return virt_to_phys(sp);
 }
 
-/*
- * Called after processes are frozen, but before we shut down devices.
- */
-static int sa11x0_pm_prepare(suspend_state_t state)
-{
-       return 0;
-}
-
-/*
- * Called after devices are re-setup, but before processes are thawed.
- */
-static int sa11x0_pm_finish(suspend_state_t state)
-{
-       return 0;
-}
-
 /*
  * Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk.
  */
 static struct pm_ops sa11x0_pm_ops = {
        .pm_disk_mode   = PM_DISK_FIRMWARE,
-       .prepare        = sa11x0_pm_prepare,
        .enter          = sa11x0_pm_enter,
-       .finish         = sa11x0_pm_finish,
 };
 
 static int __init sa11x0_pm_init(void)
index b96a2ea15d41b61b517204c770cfe9cc4d19ec7c..ada3142da8dc9bd3dcc6179595aefecbc8334393 100644 (file)
@@ -58,17 +58,6 @@ void clk_disable(struct clk *clk)
 }
 EXPORT_SYMBOL(clk_disable);
 
-int clk_use(struct clk *clk)
-{
-       return 0;
-}
-EXPORT_SYMBOL(clk_use);
-
-void clk_unuse(struct clk *clk)
-{
-}
-EXPORT_SYMBOL(clk_unuse);
-
 unsigned long clk_get_rate(struct clk *clk)
 {
        return clk->rate;
index a1ca46630dda469140f5ef2b2d33919bc6c9551a..90023745b23a4f0b73f387ff2946de853b30f34b 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/sysdev.h>
 #include <linux/interrupt.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/clcd.h>
 
 #include <asm/system.h>
 #include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/leds.h>
-#include <asm/hardware/amba.h>
-#include <asm/hardware/amba_clcd.h>
 #include <asm/hardware/arm_timer.h>
 #include <asm/hardware/icst307.h>
 
index 588c20669d5de30a62d2b5afe4368818db063430..afcaa858eb1f916df6d40c5c916878447c296398 100644 (file)
@@ -22,7 +22,7 @@
 #ifndef __ASM_ARCH_VERSATILE_H
 #define __ASM_ARCH_VERSATILE_H
 
-#include <asm/hardware/amba.h>
+#include <linux/amba/bus.h>
 
 extern void __init versatile_init(void);
 extern void __init versatile_init_irq(void);
index 8b0b3bef24aece3a51315e355d33779a78b402a0..e74c8a2fbb955c793687bce629c25a90cc71ea7a 100644 (file)
 #include <linux/init.h>
 #include <linux/device.h>
 #include <linux/sysdev.h>
+#include <linux/amba/bus.h>
 
 #include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/mach-types.h>
-#include <asm/hardware/amba.h>
 
 #include <asm/mach/arch.h>
 
index 7c3078c3891658379de6e84cf5e49fa6980882e8..22d5ca07f75d60e4f8332f3aaa794542f1aeef05 100644 (file)
 #include <linux/init.h>
 #include <linux/device.h>
 #include <linux/sysdev.h>
+#include <linux/amba/bus.h>
 
 #include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/mach-types.h>
-#include <asm/hardware/amba.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach/mmc.h>
index dbfe9e891f015a87f3efb5b31349d8c1baca20c8..0513ed1b2fcf8334ffdcf12a78277008e23e07c8 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/dma-mapping.h>
 
 #include <asm/cacheflush.h>
-#include <asm/io.h>
 #include <asm/tlbflush.h>
 
 #define CONSISTENT_BASE        (0xffc00000)
index 0d097bb1bc4d3963df211cae5a07706bb6d3696e..1e56021895072b69777ddebc3d18b54fd2baba0e 100644 (file)
@@ -9,10 +9,8 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
-
 #include <linux/module.h>
-#include <linux/mm.h>
-#include <linux/init.h>
+#include <linux/mmzone.h>
 #include <linux/bootmem.h>
 
 #if MAX_NUMNODES != 4 && MAX_NUMNODES != 16
index 9e50127be635c7bbb52c4dc8824524ba4397f6fc..d0245a31d4dd15f8382e0de7087b3027e97acbc7 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <asm/pgalloc.h>
 #include <asm/page.h>
-#include <asm/io.h>
 #include <asm/setup.h>
 #include <asm/tlbflush.h>
 
index eb667daee19b6de487c28a2563ce42b2dc44935a..621e8a99e733d43d88c4817d050b29e8393ee17a 100644 (file)
@@ -397,7 +397,6 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
                return -ENOENT;
        }
 
-       clk_use(wdt_clock);
        clk_enable(wdt_clock);
 
        /* see if we can actually set the requested timer margin, and if
@@ -444,7 +443,6 @@ static int s3c2410wdt_remove(struct platform_device *dev)
 
        if (wdt_clock != NULL) {
                clk_disable(wdt_clock);
-               clk_unuse(wdt_clock);
                clk_put(wdt_clock);
                wdt_clock = NULL;
        }
index 58cfd3111ef62fac86eadd283b437018995bd4b4..2a2f86d8c2d87426b88dfadd624e89c5ae7574ff 100644 (file)
@@ -738,7 +738,6 @@ static void s3c24xx_i2c_free(struct s3c24xx_i2c *i2c)
 {
        if (i2c->clk != NULL && !IS_ERR(i2c->clk)) {
                clk_disable(i2c->clk);
-               clk_unuse(i2c->clk);
                clk_put(i2c->clk);
                i2c->clk = NULL;
        }
@@ -778,7 +777,6 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
 
        dev_dbg(&pdev->dev, "clock source %p\n", i2c->clk);
 
-       clk_use(i2c->clk);
        clk_enable(i2c->clk);
 
        /* map the registers */
index 9b1ab5e7a98d12657bd2faa8e351de65726dc716..cbab5d26377bdc1be597939935a6c919396cdb45 100644 (file)
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/err.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/kmi.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
-#include <asm/hardware/amba.h>
-#include <asm/hardware/amba_kmi.h>
 #include <asm/hardware/clock.h>
 
 #define KMI_BASE       (kmi->base)
@@ -72,13 +72,9 @@ static int amba_kmi_open(struct serio *io)
        unsigned int divisor;
        int ret;
 
-       ret = clk_use(kmi->clk);
-       if (ret)
-               goto out;
-
        ret = clk_enable(kmi->clk);
        if (ret)
-               goto clk_unuse;
+               goto out;
 
        divisor = clk_get_rate(kmi->clk) / 8000000 - 1;
        writeb(divisor, KMICLKDIV);
@@ -97,8 +93,6 @@ static int amba_kmi_open(struct serio *io)
 
  clk_disable:
        clk_disable(kmi->clk);
- clk_unuse:
-       clk_unuse(kmi->clk);
  out:
        return ret;
 }
@@ -111,7 +105,6 @@ static void amba_kmi_close(struct serio *io)
 
        free_irq(kmi->irq, kmi);
        clk_disable(kmi->clk);
-       clk_unuse(kmi->clk);
 }
 
 static int amba_kmi_probe(struct amba_device *dev, void *id)
index 166c9b0ad04ef7a43be4e63f6f5e66483cbdd80a..57375bc123729e8e6afc6eac5dd29417ef9ee0e4 100644 (file)
 #include <linux/highmem.h>
 #include <linux/mmc/host.h>
 #include <linux/mmc/protocol.h>
+#include <linux/amba/bus.h>
 
 #include <asm/div64.h>
 #include <asm/io.h>
 #include <asm/scatterlist.h>
 #include <asm/sizes.h>
-#include <asm/hardware/amba.h>
 #include <asm/hardware/clock.h>
 #include <asm/mach/mmc.h>
 
@@ -479,13 +479,9 @@ static int mmci_probe(struct amba_device *dev, void *id)
                goto host_free;
        }
 
-       ret = clk_use(host->clk);
-       if (ret)
-               goto clk_free;
-
        ret = clk_enable(host->clk);
        if (ret)
-               goto clk_unuse;
+               goto clk_free;
 
        host->plat = plat;
        host->mclk = clk_get_rate(host->clk);
@@ -558,8 +554,6 @@ static int mmci_probe(struct amba_device *dev, void *id)
        iounmap(host->base);
  clk_disable:
        clk_disable(host->clk);
- clk_unuse:
-       clk_unuse(host->clk);
  clk_free:
        clk_put(host->clk);
  host_free:
@@ -594,7 +588,6 @@ static int mmci_remove(struct amba_device *dev)
 
                iounmap(host->base);
                clk_disable(host->clk);
-               clk_unuse(host->clk);
                clk_put(host->clk);
 
                mmc_free_host(mmc);
index d209214b1318b451e9680c629b3db767438c51b0..b796a9a6b924ac842bc8f13687049ec3f8ac1dfd 100644 (file)
@@ -460,7 +460,6 @@ static int s3c2410_nand_remove(struct platform_device *pdev)
 
        if (info->clk != NULL && !IS_ERR(info->clk)) {
                clk_disable(info->clk);
-               clk_unuse(info->clk);
                clk_put(info->clk);
        }
 
@@ -598,7 +597,6 @@ static int s3c24xx_nand_probe(struct platform_device *pdev, int is_s3c2440)
                goto exit_error;
        }
 
-       clk_use(info->clk);
        clk_enable(info->clk);
 
        /* allocate and map the resource */
index b5fdeec20b151660b139a32c2275b904dd4dc411..12a7244a5ec86e4a92bfca58f422c7d4c7c69511 100644 (file)
 struct scoop_pcmcia_config *platform_scoop_config;
 #define SCOOP_DEV platform_scoop_config->devs
 
-static void sharpsl_pcmcia_init_reset(struct scoop_pcmcia_dev *scoopdev)
+static void sharpsl_pcmcia_init_reset(struct soc_pcmcia_socket *skt)
 {
+       struct scoop_pcmcia_dev *scoopdev = &SCOOP_DEV[skt->nr];
+
        reset_scoop(scoopdev->dev);
+
+       /* Shared power controls need to be handled carefully */
+       if (platform_scoop_config->power_ctrl)
+               platform_scoop_config->power_ctrl(scoopdev->dev, 0x0000, skt->nr);
+       else
+               write_scoop_reg(scoopdev->dev, SCOOP_CPR, 0x0000);
+
        scoopdev->keep_vs = NO_KEEP_VS;
        scoopdev->keep_rd = 0;
 }
@@ -208,26 +217,17 @@ static int sharpsl_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
 
 static void sharpsl_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
 {
-       sharpsl_pcmcia_init_reset(&SCOOP_DEV[skt->nr]);
+       sharpsl_pcmcia_init_reset(skt);
 
        /* Enable interrupt */
        write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_IMR, 0x00C0);
        write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_MCR, 0x0101);
        SCOOP_DEV[skt->nr].keep_vs = NO_KEEP_VS;
-
-       if (machine_is_collie())
-               /* We need to disable SS_OUTPUT_ENA here. */
-               write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR, read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR) & ~0x0080);
 }
 
 static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
 {
-       /* CF_BUS_OFF */
-       sharpsl_pcmcia_init_reset(&SCOOP_DEV[skt->nr]);
-
-       if (machine_is_collie())
-               /* We need to disable SS_OUTPUT_ENA here. */
-               write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR, read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR) & ~0x0080);
+       sharpsl_pcmcia_init_reset(skt);
 }
 
 static struct pcmcia_low_level sharpsl_pcmcia_ops = {
index ddd0307fece23217108a8907cf94f5567f0ec7b6..48f6e872314bb2a1acf12efc7b003739707d2c9e 100644 (file)
 #include <linux/tty_flip.h>
 #include <linux/serial_core.h>
 #include <linux/serial.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/serial.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/hardware.h>
-#include <asm/hardware/amba.h>
-#include <asm/hardware/amba_serial.h>
 
 #define UART_NR                2
 
index d84476ee65923d85a4ce5043b162565324c6db79..4ae4dff59795d83bac6d4ec13e9e705366502a21 100644 (file)
 #include <linux/tty_flip.h>
 #include <linux/serial_core.h>
 #include <linux/serial.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/serial.h>
 
 #include <asm/io.h>
 #include <asm/sizes.h>
-#include <asm/hardware/amba.h>
 #include <asm/hardware/clock.h>
-#include <asm/hardware/amba_serial.h>
 
 #define UART_NR                        14
 
@@ -761,10 +761,6 @@ static int pl011_probe(struct amba_device *dev, void *id)
                goto unmap;
        }
 
-       ret = clk_use(uap->clk);
-       if (ret)
-               goto putclk;
-
        uap->port.dev = &dev->dev;
        uap->port.mapbase = dev->res.start;
        uap->port.membase = base;
@@ -782,8 +778,6 @@ static int pl011_probe(struct amba_device *dev, void *id)
        if (ret) {
                amba_set_drvdata(dev, NULL);
                amba_ports[i] = NULL;
-               clk_unuse(uap->clk);
- putclk:
                clk_put(uap->clk);
  unmap:
                iounmap(base);
@@ -808,7 +802,6 @@ static int pl011_remove(struct amba_device *dev)
                        amba_ports[i] = NULL;
 
        iounmap(uap->port.membase);
-       clk_unuse(uap->clk);
        clk_put(uap->clk);
        kfree(uap);
        return 0;
index 47681c4654e4d110d1cd76ea4d37752881de8b0c..eb47f5b71aeb1b94ae3a6137c6c5bc1f791e5052 100644 (file)
@@ -782,11 +782,9 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
 
                if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) {
                        clk_disable(ourport->baudclk);
-                       clk_unuse(ourport->baudclk);
                        ourport->baudclk  = NULL;
                }
 
-               clk_use(clk);
                clk_enable(clk);
 
                ourport->clksrc = clksrc;
@@ -1077,9 +1075,6 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport,
 
        ourport->clk    = clk_get(&platdev->dev, "uart");
 
-       if (ourport->clk != NULL && !IS_ERR(ourport->clk))
-               clk_use(ourport->clk);
-
        dbg("port: map=%08x, mem=%08x, irq=%d, clock=%ld\n",
            port->mapbase, port->membase, port->irq, port->uartclk);
 
index 35cc9402adc03dcaceccfe6e6cdd1dd16a5a220c..add198a4be79ffb398a57fd08e05668410b71f74 100644 (file)
@@ -363,7 +363,6 @@ int usb_hcd_s3c2410_probe (const struct hc_driver *driver,
                goto err1;
        }
 
-       clk_use(clk);
        s3c2410_start_hc(dev, hcd);
 
        hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
@@ -384,7 +383,6 @@ int usb_hcd_s3c2410_probe (const struct hc_driver *driver,
  err2:
        s3c2410_stop_hc(dev);
        iounmap(hcd->regs);
-       clk_unuse(clk);
        clk_put(clk);
 
  err1:
index a3c2c45e29e03e7d9e42a64036501904305ee4df..3358a1429651380cbfeb86b684e66a11027cce54 100644 (file)
 #include <linux/init.h>
 #include <linux/ioport.h>
 #include <linux/list.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/clcd.h>
 
 #include <asm/sizes.h>
-#include <asm/hardware/amba.h>
 #include <asm/hardware/clock.h>
 
-#include <asm/hardware/amba_clcd.h>
-
 #define to_clcd(info)  container_of(info, struct clcd_fb, fb)
 
 /* This is limited to 16 characters when displayed by X startup */
@@ -346,10 +345,6 @@ static int clcdfb_register(struct clcd_fb *fb)
                goto out;
        }
 
-       ret = clk_use(fb->clk);
-       if (ret)
-               goto free_clk;
-
        fb->fb.fix.mmio_start   = fb->dev->res.start;
        fb->fb.fix.mmio_len     = SZ_4K;
 
@@ -357,7 +352,7 @@ static int clcdfb_register(struct clcd_fb *fb)
        if (!fb->regs) {
                printk(KERN_ERR "CLCD: unable to remap registers\n");
                ret = -ENOMEM;
-               goto unuse_clk;
+               goto free_clk;
        }
 
        fb->fb.fbops            = &clcdfb_ops;
@@ -427,8 +422,6 @@ static int clcdfb_register(struct clcd_fb *fb)
        printk(KERN_ERR "CLCD: cannot register framebuffer (%d)\n", ret);
 
        iounmap(fb->regs);
- unuse_clk:
-       clk_unuse(fb->clk);
  free_clk:
        clk_put(fb->clk);
  out:
@@ -489,7 +482,6 @@ static int clcdfb_remove(struct amba_device *dev)
        clcdfb_disable(fb);
        unregister_framebuffer(&fb->fb);
        iounmap(fb->regs);
-       clk_unuse(fb->clk);
        clk_put(fb->clk);
 
        fb->board->remove(fb);
index 6a219b2c77e3d10a18200c5e0c2bca0791a5235a..d0aaf450e8c7229d01d6c43c9c580d0939125a29 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/backlight.h>
 
 #include <asm/arch/sharpsl.h>
+#include <asm/hardware/sharpsl_pm.h>
 
 #define CORGI_DEFAULT_INTENSITY                0x1f
 #define CORGI_LIMIT_MASK               0x0b
index 5924cc225c95d2f736935a3eb11744e46e17df29..1718baaeed2a6b2271135d6bda6358c333f839c9 100644 (file)
@@ -554,7 +554,7 @@ static int __init imxfb_probe(struct platform_device *pdev)
 
        inf = pdev->dev.platform_data;
        if(!inf) {
-               dev_err(dev,"No platform_data available\n");
+               dev_err(&pdev->dev,"No platform_data available\n");
                return -ENOMEM;
        }
 
@@ -579,7 +579,7 @@ static int __init imxfb_probe(struct platform_device *pdev)
        if (!inf->fixed_screen_cpu) {
                ret = imxfb_map_video_memory(info);
                if (ret) {
-                       dev_err(dev, "Failed to allocate video RAM: %d\n", ret);
+                       dev_err(&pdev->dev, "Failed to allocate video RAM: %d\n", ret);
                        ret = -ENOMEM;
                        goto failed_map;
                }
@@ -608,7 +608,7 @@ static int __init imxfb_probe(struct platform_device *pdev)
        imxfb_set_par(info);
        ret = register_framebuffer(info);
        if (ret < 0) {
-               dev_err(dev, "failed to register framebuffer\n");
+               dev_err(&pdev->dev, "failed to register framebuffer\n");
                goto failed_register;
        }
 
index ce6e749db3a7aa5433401833e28ee5b56f4ad135..d9c08cc7ac44840f9ee93c3806029b1a758e5917 100644 (file)
@@ -746,7 +746,6 @@ int __init s3c2410fb_probe(struct platform_device *pdev)
                goto release_irq;
        }
 
-       clk_use(info->clk);
        clk_enable(info->clk);
        dprintk("got and enabled clock\n");
 
@@ -783,7 +782,6 @@ free_video_memory:
        s3c2410fb_unmap_video_memory(info);
 release_clock:
        clk_disable(info->clk);
-       clk_unuse(info->clk);
        clk_put(info->clk);
 release_irq:
        free_irq(irq,info);
@@ -828,7 +826,6 @@ static int s3c2410fb_remove(struct platform_device *pdev)
 
        if (info->clk) {
                clk_disable(info->clk);
-               clk_unuse(info->clk);
                clk_put(info->clk);
                info->clk = NULL;
        }
index 28c890b4a1d379bb3e94ea9dbcd100337c34e544..e100b1e526fe972e0a8fa9f9721bf2bc5d685d2a 100644 (file)
@@ -7,11 +7,3 @@
  *  it under the terms of the GNU General Public License version 2 as
  *  published by the Free Software Foundation.
  */
-
-#ifndef __ASM_ARCH_DMA_H
-#define __ASM_ARCH_DMA_H
-
-#define MAX_DMA_ADDRESS         0xffffffff
-#define MAX_DMA_CHANNELS        0
-
-#endif
index 1d6a8829d3271ca2954fdc0398f20423c2a8de94..591ed25518929d9cc46cf6307ee600ce7473b15c 100644 (file)
@@ -15,7 +15,6 @@
  * bytes of RAM.
  */
 #define MAX_DMA_ADDRESS                0xd0000000
-#define MAX_DMA_CHANNELS       0
 
 #define DMA_S0                 0
 
index 686f413f82d66906555c8843043ffbcecef3a63f..c9e5395e510614a50259c4cd5719d724f4320ad9 100644 (file)
@@ -1,3 +1,3 @@
-
+#include <asm/hardware.h>
 #include <asm/hardware/entry-macro-iomd.S>
 
index 3c4c5c843252627198546e864877625975a81b49..61099793842301804ba51622de5a5eba45dd9165 100644 (file)
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
-#ifndef __ASM_ARCH_DMA_H
-#define __ASM_ARCH_DMA_H
-
-#define MAX_DMA_ADDRESS                0xffffffff
-
-#define MAX_DMA_CHANNELS       0
-
-#endif /* _ASM_ARCH_DMA_H */
-
index b31079a1d4a92d740f36b70ddc59f8f399b1168d..21f6ee4858191bc46f5580f553f834a21e1f7caa 100644 (file)
@@ -7,6 +7,7 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
+#include <asm/hardware.h>
 #include <asm/hardware/clps7111.h>
 
                .macro  disable_fiq
index 2ab981fee37fa9a0e99c275bc07ecdd30647a649..11e1491535a8a67d86d29ba68f7d6a8dbefac966 100644 (file)
@@ -20,7 +20,9 @@
 #ifndef __ASM_ARCH_SYSTEM_H
 #define __ASM_ARCH_SYSTEM_H
 
+#include <asm/hardware.h>
 #include <asm/hardware/clps7111.h>
+#include <asm/io.h>
 
 static inline void arch_idle(void)
 {
index d491776ac1cc813b01bd0b0bdd55360c2444ac8d..c52f9e2ab0bb53f9dd0a316e19b02e3b39edb8c6 100644 (file)
@@ -9,11 +9,3 @@
  *
  *  EBSA110 DMA definitions
  */
-#ifndef __ASM_ARCH_DMA_H
-#define __ASM_ARCH_DMA_H
-
-#define MAX_DMA_ADDRESS                0xffffffff
-#define MAX_DMA_CHANNELS       0
-
-#endif /* _ASM_ARCH_DMA_H */
-
index c43046eb8bc7cfc889c051606b653a3aca6d0565..0259ad45d33c7ba3cfd6d1ddfea8ab058ab82a61 100644 (file)
@@ -9,11 +9,6 @@
 #ifndef __ASM_ARCH_DMA_H
 #define __ASM_ARCH_DMA_H
 
-/*
- * This is the maximum DMA address that can be DMAd to.
- */
-#define MAX_DMA_ADDRESS                0xffffffff
-
 /*
  * The 21285 has two internal DMA channels; we call these 8 and 9.
  * On CATS hardware we have an additional eight ISA dma channels
index db5729ff634932903da1015427f7c88052ef8eb7..cf10ac96fdded85a3a97fd26442c92328942d9b0 100644 (file)
@@ -7,6 +7,8 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
+#include <asm/hardware.h>
+#include <asm/arch/irqs.h>
 #include <asm/hardware/dec21285.h>
 
                .macro  disable_fiq
index 5d97734d1077969c7544ea40641fd5f1e826cc85..de20ec8e74b1ca9909c4f61a2d1c80903db10a34 100644 (file)
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
-#ifndef __ASM_ARCH_DMA_H
-#define __ASM_ARCH_DMA_H
-
-#define MAX_DMA_ADDRESS                0xffffffff
-
-#define MAX_DMA_CHANNELS       0
-
-#endif /* _ASM_ARCH_DMA_H */
-
index dbdc017804131fec86a17a38c36babcfb8d40a37..b45fa367d71e4a3180c0569a3a699c18178e6963 100644 (file)
 #ifndef __ASM_ARCH_DMA_H
 #define __ASM_ARCH_DMA_H
 
-#define MAX_DMA_ADDRESS                0xffffffff
-
-#define MAX_DMA_CHANNELS       0
-
 /*
  * DMA registration
  */
index b40ea7cf88ec9b8222e00af84752bd852f71632a..3b9ef69146275a68929602e67f773b238f676348 100644 (file)
@@ -7,6 +7,8 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
+#include <asm/hardware.h>
+
                .macro  disable_fiq
                .endm
 #define AITC_NIVECSR   0x40
index 484a1aa470989695162ce3f00596bebe15a6f6b4..031d30941791dbc7911d2f3cdbfe21c0364c2372 100644 (file)
@@ -11,7 +11,7 @@
  *
 */
 
-#include <asm/hardware/amba_serial.h>
+#include <linux/amba/serial.h>
 
                .macro  addruart,rx
                mrc     p15, 0, \rx, c1, c0
index 7171792290bdf24c94e7333e9f31f009b7685ce8..83fd6bbaf9d3f959c4db886170c507a6f659757e 100644 (file)
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
-#ifndef __ASM_ARCH_DMA_H
-#define __ASM_ARCH_DMA_H
-
-#define MAX_DMA_ADDRESS                0xffffffff
-
-#define MAX_DMA_CHANNELS       0
-
-#endif /* _ASM_ARCH_DMA_H */
-
index 44f7ee613194c8d8469e7c57eb8aabf543ade92d..69838d04f90bc9882c36c06ffa65a3b513737021 100644 (file)
@@ -7,6 +7,8 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
+#include <asm/hardware.h>
+#include <asm/arch/irqs.h>
 
                .macro  disable_fiq
                .endm
index 797f9e6fc745343773a2f31131e0cb7437cf1d21..1e808db8af2a5a2f19493c9169d9621dca3922a5 100644 (file)
@@ -7,10 +7,3 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
-
-#ifndef _IOP3XX_DMA_H_P
-#define _IOP3XX_DMA_H_P
-
-#define MAX_DMA_ADDRESS                0xffffffff
-
-#endif /* _ASM_ARCH_DMA_H_P */
index e2ce7f5467c89c8289f6797dece61751180db463..926668c098a5aff5fd46af6029d04d3fe56ac465 100644 (file)
@@ -7,6 +7,7 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
+#include <asm/arch/irqs.h>
 
 #if defined(CONFIG_ARCH_IOP321)
                .macro  disable_fiq
index 0fb3568a98dd5255be94c7544e9412a728755314..548d8dc507eb6d6e03f2a4de200d0aa1a36f0922 100644 (file)
@@ -7,12 +7,3 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
-#ifndef __ASM_ARCH_DMA_H
-#define __ASM_ARCH_DMA_H
-
-#define MAX_DMA_ADDRESS                0xffffffff
-
-/* No DMA */
-#define MAX_DMA_CHANNELS       0
-
-#endif /* _ASM_ARCH_DMA_H */
index 95128d9f5026707338946d134126c51333b47dab..42f3c28dc5c4e08e712b0272375bd4b309001799 100644 (file)
 #define ENP2611_GPIO_SCL               7
 #define ENP2611_GPIO_SDA               6
 
+#define IRQ_ENP2611_THERMAL            IRQ_IXP2000_GPIO4
+#define IRQ_ENP2611_OPTION_BOARD       IRQ_IXP2000_GPIO3
+#define IRQ_ENP2611_CALEB              IRQ_IXP2000_GPIO2
+#define IRQ_ENP2611_PM3386_1           IRQ_IXP2000_GPIO1
+#define IRQ_ENP2611_PM3386_0           IRQ_IXP2000_GPIO0
+
 
 #endif
index e3a4e4121298547822ba858ef232bccd9f856c4d..16e1e6124b319bec4e7b043abb3e13c9d126229d 100644 (file)
@@ -7,6 +7,7 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
+#include <asm/arch/irqs.h>
 
                .macro  disable_fiq
                .endm
index 7fbcdf9931eecfd7ac2d7e088a5fd56befee8616..c0ff2c6c66e764e3752ff3b4294387656bfdaf26 100644 (file)
 #endif
 
 
-#ifdef CONFIG_ARCH_IXDP2X01
-/*
- * This is an ugly hack but the CS8900 on the 2x01's does not sit in any sort
- * of "I/O space" and is just direct mapped into a 32-bit-only addressable
- * bus. The address space for this bus is such that we can't really easily
- * make it contiguous to the PCI I/O address range, and it also does not
- * need swapping like PCI addresses do (IXDP2x01 is a BE platform).
- * B/C of this we can't use the standard in/out functions and need to
- * runtime check if the incoming address is a PCI address or for
- * the CS89x0.
- */
-#undef inw
-#undef outw
-#undef insw
-#undef outsw
-
-#include <asm/mach-types.h>
-
-static inline void insw(u32 ptr, void *buf, int length)
-{
-       register volatile u32 *port = (volatile u32 *)ptr;
-
-       /*
-        * Is this cycle meant for the CS8900?
-        */
-       if ((machine_is_ixdp2401() || machine_is_ixdp2801()) && 
-               (((u32)port >= (u32)IXDP2X01_CS8900_VIRT_BASE) &&
-                ((u32)port <= (u32)IXDP2X01_CS8900_VIRT_END))) {
-               u8 *buf8 = (u8*)buf;
-               register u32 tmp32;
-
-               do {
-                       tmp32 = *port;
-                       *buf8++ = (u8)tmp32;
-                       *buf8++ = (u8)(tmp32 >> 8);
-               } while(--length);
-
-               return;
-       }
-
-       __raw_readsw(alignw(___io(ptr)),buf,length);
-}
-
-static inline void outsw(u32 ptr, void *buf, int length)
-{
-       register volatile u32 *port = (volatile u32 *)ptr;
-
-       /*
-        * Is this cycle meant for the CS8900?
-        */
-       if ((machine_is_ixdp2401() || machine_is_ixdp2801()) && 
-               (((u32)port >= (u32)IXDP2X01_CS8900_VIRT_BASE) &&
-                ((u32)port <= (u32)IXDP2X01_CS8900_VIRT_END))) {
-               register u32 tmp32;
-               u8 *buf8 = (u8*)buf;
-               do {
-                       tmp32 = *buf8++;
-                       tmp32 |= (*buf8++) << 8;
-                       *port = tmp32;
-               } while(--length);
-               return;
-       }
-
-       __raw_writesw(alignw(___io(ptr)),buf,length);
-}
-
-
-static inline u16 inw(u32 ptr)
-{
-       register volatile u32 *port = (volatile u32 *)ptr;
-
-       /*
-        * Is this cycle meant for the CS8900?
-        */
-       if ((machine_is_ixdp2401() || machine_is_ixdp2801()) && 
-               (((u32)port >= (u32)IXDP2X01_CS8900_VIRT_BASE) &&
-                ((u32)port <= (u32)IXDP2X01_CS8900_VIRT_END))) {
-               return (u16)(*port);  
-       }
-
-       return __raw_readw(alignw(___io(ptr)));
-}
-
-static inline void outw(u16 value, u32 ptr)
-{
-       register volatile u32 *port = (volatile u32 *)ptr;
-
-       if ((machine_is_ixdp2401() || machine_is_ixdp2801()) && 
-               (((u32)port >= (u32)IXDP2X01_CS8900_VIRT_BASE) &&
-                ((u32)port <= (u32)IXDP2X01_CS8900_VIRT_END))) {
-               *port = value;  
-               return;
-       }
-
-       __raw_writew((value),alignw(___io(ptr)));
-}
-#endif /* IXDP2x01 */
-
 #endif
index fc5ac6aec4f21d5e703dad12801bc981de74d2bd..8cf70ff160afb42b0d0a9e4415bb4d7d386d2238 100644 (file)
 #define IXP2000_IRQ_THD_RAW_STATUS_B_1 IXP2000_INTCTL_REG(0x84)
 #define IXP2000_IRQ_THD_RAW_STATUS_B_2 IXP2000_INTCTL_REG(0x88)
 #define IXP2000_IRQ_THD_RAW_STATUS_B_3 IXP2000_INTCTL_REG(0x8c)
+#define IXP2000_IRQ_THD_STATUS_A_0     IXP2000_INTCTL_REG(0xe0)
+#define IXP2000_IRQ_THD_STATUS_A_1     IXP2000_INTCTL_REG(0xe4)
+#define IXP2000_IRQ_THD_STATUS_A_2     IXP2000_INTCTL_REG(0xe8)
+#define IXP2000_IRQ_THD_STATUS_A_3     IXP2000_INTCTL_REG(0xec)
+#define IXP2000_IRQ_THD_STATUS_B_0     IXP2000_INTCTL_REG(0x100)
+#define IXP2000_IRQ_THD_STATUS_B_1     IXP2000_INTCTL_REG(0x104)
+#define IXP2000_IRQ_THD_STATUS_B_2     IXP2000_INTCTL_REG(0x108)
+#define IXP2000_IRQ_THD_STATUS_B_3     IXP2000_INTCTL_REG(0x10c)
 #define IXP2000_IRQ_THD_ENABLE_SET_A_0 IXP2000_INTCTL_REG(0x160)
 #define IXP2000_IRQ_THD_ENABLE_SET_A_1 IXP2000_INTCTL_REG(0x164)
 #define IXP2000_IRQ_THD_ENABLE_SET_A_2 IXP2000_INTCTL_REG(0x168)
index dd0c2d2d85039e7749559b17e2b0b48b917db190..7ac9ba2c035cf9b4ed60989032410ed2bc3c6722 100644 (file)
@@ -16,9 +16,6 @@
 #error "Do not include this directly, instead #include <asm/hardware.h>"
 #endif
 
-#define        COYOTE_FLASH_BASE       IXP4XX_EXP_BUS_CS0_BASE_PHYS
-#define        COYOTE_FLASH_SIZE       IXP4XX_EXP_BUS_CSX_REGION_SIZE * 2
-
 /* PCI controller GPIO to IRQ pin mappings */
 #define        COYOTE_PCI_SLOT0_PIN    6
 #define        COYOTE_PCI_SLOT1_PIN    11
@@ -26,7 +23,7 @@
 #define        COYOTE_PCI_SLOT0_DEVID  14
 #define        COYOTE_PCI_SLOT1_DEVID  15
 
-#define        COYOTE_IDE_BASE_PHYS    IXP4XX_EXP_BUS_CS3_BASE_PHYS
+#define        COYOTE_IDE_BASE_PHYS    IXP4XX_EXP_BUS_BASE(3)
 #define        COYOTE_IDE_BASE_VIRT    0xFFFE1000
 #define        COYOTE_IDE_REGION_SIZE  0x1000
 
index 312065dc0e7abdb962db140be874b2376d3c498c..b1a071ecebc8a26c3aebd5632228036806c57f88 100644 (file)
@@ -20,7 +20,4 @@
 
 #define MAX_DMA_ADDRESS                (PAGE_OFFSET + SZ_64M)
 
-/* No DMA */
-#define MAX_DMA_CHANNELS       0
-
 #endif /* _ASM_ARCH_DMA_H */
index 323b0bc4a39c9e74465a72581406a612ccae1678..27e124132e4cde02926eae5b52aeb26cdefbd896 100644 (file)
@@ -7,6 +7,7 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
+#include <asm/hardware.h>
 
                .macro  disable_fiq
                .endm
index fc460af70627a72fb54106d4a30e3556d1cd3e63..c3069d67c00efb54b378a3b211233f2ce073ecd4 100644 (file)
 #define GTWX5715_GPIO13_IRQ            IRQ_IXP4XX_SW_INT1
 #define GTWX5715_GPIO14_IRQ            IRQ_IXP4XX_SW_INT2
 
-
-#define        GTWX5715_FLASH_BASE     IXP4XX_EXP_BUS_CS0_BASE_PHYS
-#define        GTWX5715_FLASH_SIZE     (0x00800000)
-
 /* PCI controller GPIO to IRQ pin mappings
 
                        INTA    INTB
index cfb413c845f76334bca5b1a8be4c57976351eb18..6acb69c95ef9cfebf262034fc7a0c1998a410420 100644 (file)
@@ -45,5 +45,6 @@ extern unsigned int processor_id;
 #include "coyote.h"
 #include "prpmc1100.h"
 #include "nslu2.h"
+#include "nas100d.h"
 
 #endif  /* _ASM_ARCH_HARDWARE_H */
index 2cf4930372bca1ad7e5880b376386d2d7a9628c3..f24b763ca18e406cf698d7096534ddb1f0282137 100644 (file)
 #define        IRQ_NSLU2_PCI_INTB      IRQ_IXP4XX_GPIO10
 #define        IRQ_NSLU2_PCI_INTC      IRQ_IXP4XX_GPIO9
 
+/*
+ * NAS100D board IRQs
+ */
+#define        IRQ_NAS100D_PCI_INTA    IRQ_IXP4XX_GPIO11
+#define        IRQ_NAS100D_PCI_INTB    IRQ_IXP4XX_GPIO10
+#define        IRQ_NAS100D_PCI_INTC    IRQ_IXP4XX_GPIO9
+#define        IRQ_NAS100D_PCI_INTD    IRQ_IXP4XX_GPIO8
+#define        IRQ_NAS100D_PCI_INTE    IRQ_IXP4XX_GPIO7
+
 #endif
index 7d21bf941379033c288dc7fc2eba0c4c9c7e26d6..3d3820d7ba09f71847bb9256aac2c6a7bb71b1ea 100644 (file)
@@ -16,9 +16,6 @@
 #error "Do not include this directly, instead #include <asm/hardware.h>"
 #endif
 
-#define        IXDP425_FLASH_BASE      IXP4XX_EXP_BUS_CS0_BASE_PHYS
-#define        IXDP425_FLASH_SIZE      IXP4XX_EXP_BUS_CSX_REGION_SIZE
-
 #define        IXDP425_SDA_PIN         7
 #define        IXDP425_SCL_PIN         6
 
index e024d0a1a669d7b5bd33d47501dbcf83968e9042..ee211d28a3ef3260ae315a0ca0e4bd161e5f4c5b 100644 (file)
 
 #ifndef __ASSEMBLY__
 
-/*
- * Only first 64MB of memory can be accessed via PCI.
- * We use GFP_DMA to allocate safe buffers to do map/unmap.
- * This is really ugly and we need a better way of specifying
- * DMA-capable regions of memory.
- */
-static inline void __arch_adjust_zones(int node, unsigned long *zone_size, 
-       unsigned long *zhole_size) 
-{
-       unsigned int sz = SZ_64M >> PAGE_SHIFT;
-
-       /*
-        * Only adjust if > 64M on current system
-        */
-       if (node || (zone_size[0] <= sz))
-               return;
-
-       zone_size[1] = zone_size[0] - sz;
-       zone_size[0] = sz;
-       zhole_size[1] = zhole_size[0];
-       zhole_size[0] = 0;
-}
+void ixp4xx_adjust_zones(int node, unsigned long *size, unsigned long *holes);
 
 #define arch_adjust_zones(node, size, holes) \
-       __arch_adjust_zones(node, size, holes)
+       ixp4xx_adjust_zones(node, size, holes)
 
 #define ISA_DMA_THRESHOLD (SZ_64M - 1)
 
diff --git a/include/asm-arm/arch-ixp4xx/nas100d.h b/include/asm-arm/arch-ixp4xx/nas100d.h
new file mode 100644 (file)
index 0000000..51ac018
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * include/asm-arm/arch-ixp4xx/nas100d.h
+ *
+ * NAS100D platform specific definitions
+ *
+ * Copyright (c) 2005 Tower Technologies
+ *
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * based on ixdp425.h:
+ *     Copyright 2004 (c) MontaVista, Software, Inc.
+ *
+ * This file is licensed under  the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __ASM_ARCH_HARDWARE_H__
+#error "Do not include this directly, instead #include <asm/hardware.h>"
+#endif
+
+#define NAS100D_SDA_PIN                6
+#define NAS100D_SCL_PIN                5
+
+/*
+ * NAS100D PCI IRQs
+ */
+#define NAS100D_PCI_MAX_DEV    3
+#define NAS100D_PCI_IRQ_LINES  3
+
+
+/* PCI controller GPIO to IRQ pin mappings */
+#define NAS100D_PCI_INTA_PIN   11
+#define NAS100D_PCI_INTB_PIN   10
+#define NAS100D_PCI_INTC_PIN   9
+#define NAS100D_PCI_INTD_PIN   8
+#define NAS100D_PCI_INTE_PIN   7
+
+/* GPIO */
+
+#define NAS100D_GPIO0           0
+#define NAS100D_GPIO1           1
+#define NAS100D_GPIO2           2
+#define NAS100D_GPIO3           3
+#define NAS100D_GPIO4           4
+#define NAS100D_GPIO5           5
+#define NAS100D_GPIO6           6
+#define NAS100D_GPIO7           7
+#define NAS100D_GPIO8           8
+#define NAS100D_GPIO9           9
+#define NAS100D_GPIO10          10
+#define NAS100D_GPIO11          11
+#define NAS100D_GPIO12          12
+#define NAS100D_GPIO13          13
+#define NAS100D_GPIO14          14
+#define NAS100D_GPIO15          15
+
+
+/* Buttons */
+
+#define NAS100D_PB_GPIO         NAS100D_GPIO14
+#define NAS100D_RB_GPIO         NAS100D_GPIO4
+#define NAS100D_PO_GPIO         NAS100D_GPIO12   /* power off */
+
+#define NAS100D_PB_IRQ          IRQ_IXP4XX_GPIO14
+#define NAS100D_RB_IRQ          IRQ_IXP4XX_GPIO4
+
+/*
+#define NAS100D_PB_BM           (1L << NAS100D_PB_GPIO)
+#define NAS100D_PO_BM           (1L << NAS100D_PO_GPIO)
+#define NAS100D_RB_BM           (1L << NAS100D_RB_GPIO)
+*/
index b8b347a559c75e8c7651f64fcff1d62e5f413e0d..4281838873eff89156e49a0c0e4c7500fc9505f1 100644 (file)
@@ -18,9 +18,6 @@
 #error "Do not include this directly, instead #include <asm/hardware.h>"
 #endif
 
-#define NSLU2_FLASH_BASE       IXP4XX_EXP_BUS_CS0_BASE_PHYS
-#define NSLU2_FLASH_SIZE       IXP4XX_EXP_BUS_CSX_REGION_SIZE
-
 #define NSLU2_SDA_PIN          7
 #define NSLU2_SCL_PIN          6
 
index f14ed63590c36cd80980fab6c9cf8eaeb08e1cf1..daf9790645ca2bd7746ddce03d50f7a1a67b5147 100644 (file)
  */
 #define IXP4XX_EXP_BUS_BASE_PHYS       (0x50000000)
 
-#define        IXP4XX_EXP_BUS_CSX_REGION_SIZE  (0x01000000)
+/*
+ * The expansion bus on the IXP4xx can be configured for either 16 or
+ * 32MB windows and the CS offset for each region changes based on the
+ * current configuration. This means that we cannot simply hardcode
+ * each offset. ixp4xx_sys_init() looks at the expansion bus configuration
+ * as setup by the bootloader to determine our window size.
+ */
+extern unsigned long ixp4xx_exp_bus_size;
 
-#define IXP4XX_EXP_BUS_CS0_BASE_PHYS   (IXP4XX_EXP_BUS_BASE_PHYS + 0x00000000)
-#define IXP4XX_EXP_BUS_CS1_BASE_PHYS   (IXP4XX_EXP_BUS_BASE_PHYS + 0x01000000)
-#define IXP4XX_EXP_BUS_CS2_BASE_PHYS   (IXP4XX_EXP_BUS_BASE_PHYS + 0x02000000)
-#define IXP4XX_EXP_BUS_CS3_BASE_PHYS   (IXP4XX_EXP_BUS_BASE_PHYS + 0x03000000)
-#define IXP4XX_EXP_BUS_CS4_BASE_PHYS   (IXP4XX_EXP_BUS_BASE_PHYS + 0x04000000)
-#define IXP4XX_EXP_BUS_CS5_BASE_PHYS   (IXP4XX_EXP_BUS_BASE_PHYS + 0x05000000)
-#define IXP4XX_EXP_BUS_CS6_BASE_PHYS   (IXP4XX_EXP_BUS_BASE_PHYS + 0x06000000)
-#define IXP4XX_EXP_BUS_CS7_BASE_PHYS   (IXP4XX_EXP_BUS_BASE_PHYS + 0x07000000)
+#define        IXP4XX_EXP_BUS_BASE(region)\
+               (IXP4XX_EXP_BUS_BASE_PHYS + ((region) * ixp4xx_exp_bus_size))
 
 #define IXP4XX_FLASH_WRITABLE  (0x2)
 #define IXP4XX_FLASH_DEFAULT   (0xbcd23c40)
@@ -112,10 +113,5 @@ static inline void gpio_line_set(u8 line, int value)
            *IXP4XX_GPIO_GPOUTR &= ~(1 << line);
 }
 
-static inline void gpio_line_isr_clear(u8 line)
-{
-       *IXP4XX_GPIO_GPISR = (1 << line);
-}
-
 #endif // __ASSEMBLY__
 
index 6595b386cfc9e1816e21a4a1aa8db4387cb70100..4c7eca63f03533d5b5a7a93cb3286acdb2db08e2 100644 (file)
@@ -17,7 +17,6 @@
  * bytes of RAM.
  */
 #define MAX_DMA_ADDRESS         0xd0000000
-#define MAX_DMA_CHANNELS        0
 
 #define DMA_S0                  0
 
index cb4ff29059b8a375efe30300f2470fa02c303daa..18825cf071ba6b766751570f2bb47c087cf4e56e 100644 (file)
@@ -12,6 +12,8 @@
 #ifndef __ASM_ARCH_SYSTEM_H
 #define __ASM_ARCH_SYSTEM_H
 
+#include <asm/hardware.h>
+
 static inline void arch_idle(void)
 {
        *(unsigned long *)(IO_BASE + 0x50004) = 1;      /* idle mode */
index 5797f01e18441ce40de67cc83763832c1940f032..15492e3253f6abdc5088e6f6522613f53f537a8b 100644 (file)
@@ -7,11 +7,3 @@
  *  version 2 as published by the Free Software Foundation.
  *
  */
-
-#ifndef __ASM_ARCH_DMA_H
-#define __ASM_ARCH_DMA_H
-
-#define MAX_DMA_ADDRESS                0xffffffff
-#define MAX_DMA_CHANNELS       0 /* All DMA is internal to CPU */
-
-#endif /* _ASM_ARCH_DMA_H */
index 865f396aa63cc382b7a54d2c55062caac87afbf3..a2f67c06d9c94281741d5e0f9509367eab92778a 100644 (file)
@@ -7,6 +7,8 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
+#include <asm/hardware.h>
+#include <asm/arch/irqs.h>
 
 # if defined (CONFIG_ARCH_LH7A400) && defined (CONFIG_ARCH_LH7A404)
 #  error "LH7A400 and LH7A404 are mutually exclusive"
index ccbcb580a5c17b90326c8c9c679cfe737d0d908d..d4e73efcb816e3fa08456a0ad728b9dcfd7c07b0 100644 (file)
@@ -21,9 +21,6 @@
 #ifndef __ASM_ARCH_DMA_H
 #define __ASM_ARCH_DMA_H
 
-#define MAX_DMA_ADDRESS                        0xffffffff
-#define MAX_DMA_CHANNELS               0
-
 /* Hardware registers for omap1 */
 #define OMAP_DMA_BASE                  (0xfffed800)
 #define OMAP_DMA_GCR                   (OMAP_DMA_BASE + 0x400)
index f8814a84910e4025371ef44c6b2ee4fa434dbecd..0ffb1185f1ac90b930fd486e6fe57c85bf0a0bcd 100644 (file)
@@ -7,6 +7,8 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
+#include <asm/hardware.h>
+#include <asm/arch/irqs.h>
 
 #if defined(CONFIG_ARCH_OMAP1)
 
index 56db3d49bfc8130cc00c42913b4e99e93628bcbc..3e88a2a02a0fdd01186107439eed4711d38b9a7f 100644 (file)
 #ifndef __ASM_ARCH_DMA_H
 #define __ASM_ARCH_DMA_H
 
-#define MAX_DMA_ADDRESS                0xffffffff
-
-/* No DMA as the rest of the world see it */
-#define MAX_DMA_CHANNELS       0
-
 /*
  * Descriptor structure for PXA's DMA engine
  * Note: this structure must always be aligned to a 16-byte boundary.
index 2abfc8bb3ee59be2b6bd98b133e20f3d37937278..4985e33afc12de2cc389dad3e76dc60182345d57 100644 (file)
@@ -7,6 +7,8 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
+#include <asm/hardware.h>
+#include <asm/arch/irqs.h>
 
                .macro  disable_fiq
                .endm
index a75a2470f4f59a1e2f23bc5d9e8a5b7707b016f9..dae138b9cac5033470efe6284a3fa6d51b34db1b 100644 (file)
 
 #ifdef CONFIG_PXA27x
 
+#define ARB_CNTRL      __REG(0x48000048)  /* Arbiter Control Register */
+
+#define ARB_DMA_SLV_PARK       (1<<31)    /* Be parked with DMA slave when idle */
+#define ARB_CI_PARK            (1<<30)    /* Be parked with Camera Interface when idle */
+#define ARB_EX_MEM_PARK        (1<<29)    /* Be parked with external MEMC when idle */
+#define ARB_INT_MEM_PARK       (1<<28)    /* Be parked with internal MEMC when idle */
+#define ARB_USB_PARK           (1<<27)    /* Be parked with USB when idle */
+#define ARB_LCD_PARK           (1<<26)    /* Be parked with LCD when idle */
+#define ARB_DMA_PARK           (1<<25)    /* Be parked with DMA when idle */
+#define ARB_CORE_PARK          (1<<24)    /* Be parked with core when idle */
+#define ARB_LOCK_FLAG          (1<<23)    /* Only Locking masters gain access to the bus */
+
 /*
  * Keypad
  */
index ed28bd012236252abd398a38b058685c79580749..017ad996848d51be86c81042b30bd90035f111be 100644 (file)
@@ -11,7 +11,7 @@
  *
 */
 
-#include <asm/hardware/amba_serial.h>
+#include <linux/amba/serial.h>
 
                .macro  addruart,rx
                mrc     p15, 0, \rx, c1, c0
index 744491a74bd9c592188935dabaf2e3f773ed3f28..8342e3f9d6eca3681011074e8e6fc6e0b0cb1076 100644 (file)
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
-#ifndef __ASM_ARCH_DMA_H
-#define __ASM_ARCH_DMA_H
-
-#define MAX_DMA_ADDRESS                0xffffffff
-#define MAX_DMA_CHANNELS       0
-
-#endif /* _ASM_ARCH_DMA_H */
index 6288fad0dc4182f9ebd4409b443cce684016c28d..1a6eec86bd476581b0e29f5ae566d9a49c61d27b 100644 (file)
@@ -7,7 +7,7 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
-
+#include <asm/hardware.h>
 #include <asm/hardware/gic.h>
 
                .macro  disable_fiq
index 686f413f82d66906555c8843043ffbcecef3a63f..c9e5395e510614a50259c4cd5719d724f4320ad9 100644 (file)
@@ -1,3 +1,3 @@
-
+#include <asm/hardware.h>
 #include <asm/hardware/entry-macro-iomd.S>
 
index e830a40e573a2ed2d8a0bc28d4e40175f0aed873..b011e14f3bc663d6858fb7afc2811eaf7395c3d5 100644 (file)
 #define MAX_DMA_TRANSFER_SIZE   0x100000 /* Data Unit is half word  */
 
 
-/* according to the samsung port, we cannot use the regular
- * dma channels... we must therefore provide our own interface
- * for DMA, and allow our drivers to use that.
- */
-
-#define MAX_DMA_CHANNELS       0
-
-
 /* we have 4 dma channels */
 #define S3C2410_DMA_CHANNELS        (4)
 
index b7d4d7f4422d97dbcc08c47cd383f2a33c6eee3d..cc06b1bd37b245a5f030feb3ef5955f18c2863b0 100644 (file)
@@ -10,6 +10,8 @@
  * Modifications:
  *     10-Mar-2005 LCVR  Changed S3C2410_VA to S3C24XX_VA
  */
+#include <asm/hardware.h>
+#include <asm/arch/irqs.h>
 
 
        .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
index 3d60ed9f8c34b3017ed2cfcb26d8b3191ebb443e..02575d72ac6bcd9548c870ac5987aa71a95d7bc5 100644 (file)
 #include "hardware.h"
 
 
-/*
- * This is the maximum DMA address that can be DMAd to.
- */
-#define MAX_DMA_ADDRESS                0xffffffff
-
-
-/*
- * The regular generic DMA interface is inappropriate for the
- * SA1100 DMA model.  None of the SA1100 specific drivers using
- * DMA are portable anyway so it's pointless to try to twist the
- * regular DMA API to accommodate them.
- */
-#define MAX_DMA_CHANNELS       0
-
 /*
  * The SA1100 has six internal DMA channels.
  */
index 89e38ac1444e1d05c0fbcec233da784686ee040e..ef6167116dbb2f8b2b32e423557d1550b1104950 100644 (file)
@@ -11,7 +11,7 @@
  *
 */
 
-#include <asm/hardware/amba_serial.h>
+#include <linux/amba/serial.h>
 
                .macro  addruart,rx
                mrc     p15, 0, \rx, c1, c0
index dcc8ac26eac0d5be514deffeebe6fc84ec2aed90..6425773486239ab0fced894ae331cc9cccd30d0a 100644 (file)
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
-#ifndef __ASM_ARCH_DMA_H
-#define __ASM_ARCH_DMA_H
-
-#define MAX_DMA_ADDRESS                0xffffffff
-#define MAX_DMA_CHANNELS       0
-
-#endif /* _ASM_ARCH_DMA_H */
index 90e4e970d25304613ca8d2f3e34424ec9ad42882..58f0d71759f6606f342652b8f61702cf7e3a2168 100644 (file)
@@ -7,7 +7,9 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
-                       .macro  disable_fiq
+#include <asm/hardware.h>
+
+               .macro  disable_fiq
                .endm
 
                .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
index d648a1915c334e5ef0001d6c479e917895aae09d..af42f449b9a6d57f3bbe90e236c3969cc7eab4c8 100644 (file)
 #ifndef __ASM_ARM_BYTEORDER_H
 #define __ASM_ARM_BYTEORDER_H
 
-
 #include <asm/types.h>
 
+static inline __attribute_const__ __u32 ___arch__swab32(__u32 x)
+{
+       __u32 t;
+
+       t = x ^ ((x << 16) | (x >> 16));        /* eor r1,r0,r0,ror #16  */
+       x = (x << 24) | (x >> 8);               /* mov r0,r0,ror #8      */
+       t &= ~0x00FF0000;                       /* bic r1,r1,#0x00FF0000 */
+       x ^= (t >> 8);                          /* eor r0,r0,r1,lsr #8   */
+
+       return x;
+}
+
+#define __arch__swab32(x) ___arch__swab32(x)
+
 #if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
 #  define __BYTEORDER_HAS_U64__
 #  define __SWAB_64_THRU_32__
index e81baff4f54b3293d18290088af1e1ac1f65fabe..09e19a783a51dd9339e5234fae2f65d01484742f 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/sched.h>
 #include <linux/mm.h>
 
-#include <asm/mman.h>
 #include <asm/glue.h>
 #include <asm/shmparam.h>
 
index ef41df43a584765b5c7d10ce6e38a6cc75d567f8..49c01e2bf7c8f7b6a7afad9fc4ba71ca60240329 100644 (file)
@@ -9,6 +9,13 @@ typedef unsigned int dmach_t;
 #include <asm/scatterlist.h>
 #include <asm/arch/dma.h>
 
+/*
+ * This is the maximum virtual address which can be DMA'd from.
+ */
+#ifndef MAX_DMA_ADDRESS
+#define MAX_DMA_ADDRESS        0xffffffff
+#endif
+
 /*
  * DMA modes
  */
@@ -91,7 +98,9 @@ extern void set_dma_sg(dmach_t channel, struct scatterlist *sg, int nr_sg);
  * especially since some DMA architectures don't update the
  * DMA address immediately, but defer it to the enable_dma().
  */
-extern void set_dma_addr(dmach_t channel, unsigned long physaddr);
+extern void __set_dma_addr(dmach_t channel, void *addr);
+#define set_dma_addr(channel, addr)                            \
+       __set_dma_addr(channel, bus_to_virt(addr))
 
 /* Set the DMA byte count for this channel
  *
index 19da861e523d8dbbfe327e4b07d166c61544a623..69f33215e43723abd84c6f21af41bf97dd65529a 100644 (file)
@@ -33,6 +33,8 @@ struct clk;
  * uses @dev and @id to determine the clock consumer, and thereby
  * the clock producer.  (IOW, @id may be identical strings, but
  * clk_get may return different clock producers depending on @dev.)
+ *
+ * Drivers must assume that the clock source is not enabled.
  */
 struct clk *clk_get(struct device *dev, const char *id);
 
@@ -49,22 +51,16 @@ int clk_enable(struct clk *clk);
 /**
  * clk_disable - inform the system when the clock source is no longer required.
  * @clk: clock source
- */
-void clk_disable(struct clk *clk);
-
-/**
- * clk_use - increment the use count
- * @clk: clock source
  *
- * Returns success (0) or negative errno.
- */
-int clk_use(struct clk *clk);
-
-/**
- * clk_unuse - decrement the use count
- * @clk: clock source
+ * Inform the system that a clock source is no longer required by
+ * a driver and may be shut down.
+ *
+ * Implementation detail: if the clock source is shared between
+ * multiple drivers, clk_enable() calls must be balanced by the
+ * same number of clk_disable() calls for the clock source to be
+ * disabled.
  */
-void clk_unuse(struct clk *clk);
+void clk_disable(struct clk *clk);
 
 /**
  * clk_get_rate - obtain the current clock rate (in Hz) for a clock source.
@@ -76,6 +72,10 @@ unsigned long clk_get_rate(struct clk *clk);
 /**
  * clk_put     - "free" the clock source
  * @clk: clock source
+ *
+ * Note: drivers must ensure that all clk_enable calls made on this
+ * clock source are balanced by clk_disable calls prior to calling
+ * this function.
  */
 void clk_put(struct clk *clk);
 
diff --git a/include/asm-arm/hardware/sharpsl_pm.h b/include/asm-arm/hardware/sharpsl_pm.h
new file mode 100644 (file)
index 0000000..36983e5
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * SharpSL Battery/PM Driver
+ *
+ * Copyright (c) 2004-2005 Richard Purdie
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/interrupt.h>
+
+struct sharpsl_charger_machinfo {
+       void (*init)(void);
+       void (*exit)(void);
+       int gpio_acin;
+       int gpio_batfull;
+       int gpio_batlock;
+       int gpio_fatal;
+       void (*discharge)(int);
+       void (*discharge1)(int);
+       void (*charge)(int);
+       void (*measure_temp)(int);
+       void (*presuspend)(void);
+       void (*postsuspend)(void);
+       unsigned long (*read_devdata)(int);
+#define SHARPSL_BATT_VOLT       1
+#define SHARPSL_BATT_TEMP       2
+#define SHARPSL_ACIN_VOLT       3
+#define SHARPSL_STATUS_ACIN     4
+#define SHARPSL_STATUS_LOCK     5
+#define SHARPSL_STATUS_CHRGFULL 6
+#define SHARPSL_STATUS_FATAL    7
+       unsigned long (*charger_wakeup)(void);
+       int (*should_wakeup)(unsigned int resume_on_alarm);
+       int bat_levels;
+       struct battery_thresh *bat_levels_noac;
+       struct battery_thresh *bat_levels_acin;
+       int status_high_acin;
+       int status_low_acin;
+       int status_high_noac;
+       int status_low_noac;
+};
+
+struct battery_thresh {
+       int voltage;
+       int percentage;
+};
+
+struct battery_stat {
+       int ac_status;         /* APM AC Present/Not Present */
+       int mainbat_status;    /* APM Main Battery Status */
+       int mainbat_percent;   /* Main Battery Percentage Charge */
+       int mainbat_voltage;   /* Main Battery Voltage */
+};
+
+struct sharpsl_pm_status {
+       struct device *dev;
+       struct timer_list ac_timer;
+       struct timer_list chrg_full_timer;
+
+       int charge_mode;
+#define CHRG_ERROR    (-1)
+#define CHRG_OFF      (0)
+#define CHRG_ON       (1)
+#define CHRG_DONE     (2)
+
+       unsigned int flags;
+#define SHARPSL_SUSPENDED       (1 << 0)  /* Device is Suspended */
+#define SHARPSL_ALARM_ACTIVE    (1 << 1)  /* Alarm is for charging event (not user) */
+#define SHARPSL_BL_LIMIT        (1 << 2)  /* Backlight Intensity Limited */
+#define SHARPSL_APM_QUEUED      (1 << 3)  /* APM Event Queued */
+#define SHARPSL_DO_OFFLINE_CHRG (1 << 4)  /* Trigger the offline charger */
+
+       int full_count;
+       unsigned long charge_start_time;
+       struct sharpsl_charger_machinfo *machinfo;
+       struct battery_stat battstat;
+};
+
+extern struct sharpsl_pm_status sharpsl_pm;
+
+
+#define SHARPSL_LED_ERROR  2
+#define SHARPSL_LED_ON     1
+#define SHARPSL_LED_OFF    0
+
+void sharpsl_battery_kick(void);
+void sharpsl_pm_led(int val);
+irqreturn_t sharpsl_ac_isr(int irq, void *dev_id, struct pt_regs *fp);
+irqreturn_t sharpsl_chrg_full_isr(int irq, void *dev_id, struct pt_regs *fp);
+irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id, struct pt_regs *fp);
+
index 31bf716106ee964f8c75a4207e0b8e2e0d62686b..e7c4a20aad531c72de46e36c296aa9fd24d8edb9 100644 (file)
@@ -25,13 +25,15 @@ struct dma_ops {
 };
 
 struct dma_struct {
+       void            *addr;          /* single DMA address           */
+       unsigned long   count;          /* single DMA size              */
        struct scatterlist buf;         /* single DMA                   */
        int             sgcount;        /* number of DMA SG             */
        struct scatterlist *sg;         /* DMA Scatter-Gather List      */
 
        unsigned int    active:1;       /* Transfer active              */
        unsigned int    invalid:1;      /* Address/Count changed        */
-       unsigned int    using_sg:1;     /* using scatter list?          */
+
        dmamode_t       dma_mode;       /* DMA mode                     */
        int             speed;          /* DMA speed                    */
 
index 83b876fb04cc2c0074bed7d43b8c9f4e69173a96..de2f65eb42ed7cad529e8369c3dce85e505f2127 100644 (file)
@@ -9,7 +9,6 @@ struct scatterlist {
        unsigned int    offset;         /* buffer offset                 */
        dma_addr_t      dma_address;    /* dma address                   */
        unsigned int    length;         /* length                        */
-       char            *__address;     /* for set_dma_addr              */
 };
 
 /*
index 5e9a81ab990b984eae69dfecf2ee9052751f6a66..54147c1f6361d67d85db502737830e8da461e86a 100644 (file)
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
 #include <linux/err.h>
+#include <linux/amba/bus.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/sizes.h>
-#include <asm/hardware/amba.h>
 
 #include <sound/driver.h>
 #include <sound/core.h>