Dave Young | 12 Jan 10:51
Picon

[PATCH 3/7] power supply : use class iteration api

Convert to use the class iteration api.

Signed-off-by: Dave Young <hidave.darkstar <at> gmail.com> 

---
 drivers/power/apm_power.c         |  116 ++++++++++++++++++++++----------------
 drivers/power/power_supply_core.c |   72 ++++++++++++-----------
 2 files changed, 106 insertions(+), 82 deletions(-)

diff -upr linux/drivers/power/apm_power.c linux.new/drivers/power/apm_power.c
--- linux/drivers/power/apm_power.c	2008-01-11 18:06:38.000000000 +0800
+++ linux.new/drivers/power/apm_power.c	2008-01-11 18:06:38.000000000 +0800
@@ -13,6 +13,7 @@
 #include <linux/power_supply.h>
 #include <linux/apm-emulation.h>

+static DEFINE_MUTEX(apm_mutex);
 #define PSY_PROP(psy, prop, val) psy->get_property(psy, \
 			 POWER_SUPPLY_PROP_##prop, val)

@@ -23,67 +24,86 @@

 static struct power_supply *main_battery;

-static void find_main_battery(void)
-{
-	struct device *dev;
-	struct power_supply *bat = NULL;
-	struct power_supply *max_charge_bat = NULL;
-	struct power_supply *max_energy_bat = NULL;
(Continue reading)

Dave Young | 3 Jan 06:58
Picon

[PATCH 4/7] power supply : convert semaphore to mutex in struct class

Use mutex instead of semaphore in struct class.

Signed-off-by: Dave Young <hidave.darkstar <at> gmail.com> 
---
drivers/power/apm_power.c         |    6 +++---
drivers/power/power_supply_core.c |    8 ++++----
2 files changed, 7 insertions(+), 7 deletions(-)

diff -upr linux/drivers/power/apm_power.c linux.new/drivers/power/apm_power.c
--- linux/drivers/power/apm_power.c	2007-12-28 10:36:26.000000000 +0800
+++ linux.new/drivers/power/apm_power.c	2007-12-28 10:38:03.000000000 +0800
@@ -207,10 +207,10 @@ static void apm_battery_apm_get_power_st
 	union power_supply_propval status;
 	union power_supply_propval capacity, time_to_full, time_to_empty;

-	down(&power_supply_class->sem);
+	mutex_lock(&power_supply_class->mutex);
 	find_main_battery();
 	if (!main_battery) {
-		up(&power_supply_class->sem);
+		mutex_unlock(&power_supply_class->mutex);
 		return;
 	}

@@ -278,7 +278,7 @@ static void apm_battery_apm_get_power_st
 		}
 	}

-	up(&power_supply_class->sem);
+	mutex_unlock(&power_supply_class->mutex);
(Continue reading)

Dave Young | 29 Dec 02:14
Picon

[PATCH 08/12] power supply : Use mutex instead of semaphore in driver core

Signed-off-by: Dave Young <hidave.darkstar <at> gmail.com> 

---
drivers/power/apm_power.c         |    6 +++---
drivers/power/power_supply_core.c |    8 ++++----
2 files changed, 7 insertions(+), 7 deletions(-)

diff -upr linux/drivers/power/apm_power.c linux.new/drivers/power/apm_power.c
--- linux/drivers/power/apm_power.c	2007-12-28 10:36:26.000000000 +0800
+++ linux.new/drivers/power/apm_power.c	2007-12-28 10:38:03.000000000 +0800
@@ -207,10 +207,10 @@ static void apm_battery_apm_get_power_st
 	union power_supply_propval status;
 	union power_supply_propval capacity, time_to_full, time_to_empty;

-	down(&power_supply_class->sem);
+	mutex_lock(&power_supply_class->mutex);
 	find_main_battery();
 	if (!main_battery) {
-		up(&power_supply_class->sem);
+		mutex_unlock(&power_supply_class->mutex);
 		return;
 	}

@@ -278,7 +278,7 @@ static void apm_battery_apm_get_power_st
 		}
 	}

-	up(&power_supply_class->sem);
+	mutex_unlock(&power_supply_class->mutex);
 }
(Continue reading)

ian | 31 Oct 22:03

DMA API Re: Remove dma_coherent_mem interface

Hi folks.

Please CC me - I am NOT on LKML at present

There was a recent patch to remove the coherent memory interface from
the DMA API.

I'd like to ask that this not happen - there are several users of this
code in the handhelds.org tree, which we hope will merge into mainline.
this code is _essential_ to allow support of these devices.

Removing this from mainline will only increase the hh.org delta which we
are working hard to reduce, and there is no other realistic way to
support these devices.

Thanks,

Ian

-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo <at> vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Milan Plzik | 26 Sep 17:56
Picon

[PATCH] save/restore samcop gpio configuration upon PM events

  Hello,

  attached patch fixes the bug where changing the battery while device
is suspended would result in samcop gpio reset (most apparently seen by
non-functional keyboard).

	Milan
save/remove samcop gpio state on power management events

From: Milan Plzik <milan.plzik <at> gmail.com>

---

 drivers/mfd/samcop_base.c |   33 +++++++++++++++++++++++++++++++++
 1 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/drivers/mfd/samcop_base.c b/drivers/mfd/samcop_base.c
index 97901f6..eb8f9f2 100644
--- a/drivers/mfd/samcop_base.c
+++ b/drivers/mfd/samcop_base.c
@@ -64,6 +64,8 @@
 #include <asm/arch/clock.h>
 #include <asm/types.h>

+#define SAMCOP_GPIO_REGISTERS (_SAMCOP_GPIO_INTPND/sizeof(uint32_t))
+
 struct samcop_data
 {
(Continue reading)

Maria Zabolotnaya | 2 Sep 15:31
Picon

[ANN] PyQemu 1.0 (and machine plugin patches)

Hello,

My name is Maria Zabolotnaya, I am a Google Summer of Code student from Handhelds.org organization. This summer I worked on a project to create new ARM machine emulations using the Python programming language. I am glad to announce that the work is complete and results are available in the form of Python bindings for QEMU (PyQemu) and set of auxiliary patches to QEMU source code.

The release 1.0 is available at this time at http://handhelds.org/~pfalcon/gsoc/ . It includes:
1. Python bindings for QEMU developed using ctypes Python module (native Python FFI (Foreign Function Interface), no C glue code is required; part of standard library since Python 2.5, available as add-on module for earlier versions).
2. Support for building QEMU as a shared library as required by ctypes to use it.
3. Patches to export more symbols and accessors from QEMU shared library.
4. Patch to allow to override ARM machine type from command line.
5. Patch to allow to load machine definitions from external shared libraries (plugins).
6. Samples of machine plugins (C).
7. Basic emulation of HTC ASIC3 peripheral controller, used in the number of Compaq/HP/HTC ARM PDAs (iPAQ h3900, iPAQ h4000, iPAQ hx4700, HTC Universal, etc.), written in Python.
8. Emulation of HP iPAQ h4000 PDA (main PDA features): screen, touchscreen, buttons, SD controller - written in Python.

The archive (pyqemu-1.0.tar.gz) contains all materials above together with README describing how to make it run. For iPAQ h4000 emulation, sample kernel/userspace images are available in images-h4000.tar.bz2.

This project was developed under auspices of Handhelds org to facilitate development of emulations of PDA hardware to help with kernel porting and debugging on those handhelds. I hope that it will be useful for this purpose, but its scope is wider and may interest other parties and open new uses for the QEMU emulator.


I would like to thank following parties:

Google, Inc.for the amazing GSoC program
Handhelds.org for letting me to be a student on their behalf
Paul Sokolovsky, my mentor, for guiding me through this work
Andrzej Zaborowski on whose work on PXA/PDA, etc. emulation this work is largely based
QEMU project for the best emulation platform ever

Best regards,
Maria Zabolotnaya.

Milan Plzik | 19 Aug 11:11
Picon

[PATCH] h5000 IrDA controller fix

  Hello,

  attached patch changes primarily h5400.c -- addsone structure, which
is required in order to get pxaficp_ir working properly. It also
modifies one comment in h5400-gpio.c, so everyone in the future will
know that IRDA_SD means "IrDA transceiver shutdown" :). It was tested at
least with one siemens phone, I was able to receive ~250KByte file, so
it probably works:).

  This patch was only tested on h5550 device, which contains only SIR
controller. I'm not sure how the other devices (namely h54xx ones,
capable of CIR) will behave.

	Milan
h5000 IrDA fix

From: Milan Plzik <milan.plzik <at> gmail.com>

---

 arch/arm/mach-pxa/h5400/h5400.c       |   30 +++++++++++++++++++++++++++++-
 include/asm-arm/arch-pxa/h5400-gpio.h |    4 ++--
 2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mach-pxa/h5400/h5400.c b/arch/arm/mach-pxa/h5400/h5400.c
index f87415d..ea4b677 100644
--- a/arch/arm/mach-pxa/h5400/h5400.c
+++ b/arch/arm/mach-pxa/h5400/h5400.c
@@ -63,6 +63,7 @@
 #include <asm/arch/serial.h>
 #include <asm/arch/pxa-dmabounce.h>
 #include <asm/arch/irq.h>
+#include <asm/arch/irda.h>
 #include <asm/types.h>
 #include <linux/mfd/samcop_base.h>
 #include <asm/hardware/samcop_leds.h>
@@ -97,6 +98,32 @@ static int h5400_dma_needs_bounce (struct device *dev, dma_addr_t addr, size_t s
 };

 /****************************************************************************
+ * PXA IrDA functions and data structures
+ ****************************************************************************/
+
+static void h5000_irda_transceiver_mode(struct device *dev, int mode)
+{
+	unsigned long flags;
+	local_irq_save(flags);
+
+	if (mode & IR_OFF) {
+		SET_H5400_GPIO(IRDA_SD, 1);
+	} else {
+		SET_H5400_GPIO(IRDA_SD, 0);
+	};
+
+	local_irq_restore(flags);
+}
+
+
+static struct pxaficp_platform_data h5000_ficp_platform_data = {
+	.transceiver_cap = IR_SIRMODE | IR_OFF,
+	.transceiver_mode = h5000_irda_transceiver_mode,
+};
+
+
+
+/****************************************************************************
  * Bluetooth functions and data structures
  ****************************************************************************/

@@ -507,7 +534,7 @@ static short h5400_gpio_modes[] __initdata = {
 	GPIO_NR_H5400_IRDA_SD | GPIO_OUT,			/* GPIO58 */
 	59 | GPIO_OUT,						/* GPIO59 XXX docs say "usb charge on" input */
 	GPIO_NR_H5400_POWER_SD_N | GPIO_OUT,			/* GPIO60 XXX not really active low? */
-	GPIO_NR_H5400_POWER_RS232_OR_FS_N | GPIO_OUT | GPIO_DFLT_HIGH,
+	GPIO_NR_H5400_POWER_RS232_N_OR_FS | GPIO_OUT | GPIO_DFLT_HIGH,
 	GPIO_NR_H5400_POWER_ACCEL_N | GPIO_OUT | GPIO_DFLT_HIGH,
 	63 | GPIO_OUT,						/* GPIO63 NC */
 	GPIO_NR_H5400_OPT_NVRAM | GPIO_OUT ,
@@ -741,6 +768,7 @@ h5400_init (void)
 	platform_device_register (&h5000_gpiodev_keys2);
 	pxa_set_udc_info (&h5400_udc_mach_info);
 	pxa_set_dma_needs_bounce (h5400_dma_needs_bounce);
+	pxa_set_ficp_info (&h5000_ficp_platform_data);
 }

 MACHINE_START(H5400, "HP iPAQ H5400")
diff --git a/include/asm-arm/arch-pxa/h5400-gpio.h b/include/asm-arm/arch-pxa/h5400-gpio.h
index ff17bb6..ed594f0 100644
--- a/include/asm-arm/arch-pxa/h5400-gpio.h
+++ b/include/asm-arm/arch-pxa/h5400-gpio.h
@@ -85,10 +85,10 @@ else \
 #define GPIO_NR_H5400_PWAIT_N       56       /* used for pcmcia */ 
 #define GPIO_NR_H5400_IOIS16_N      57       /* used for pcmcia */ 

-#define GPIO_NR_H5400_IRDA_SD       58       /* to hsdl3002 sd */ 
+#define GPIO_NR_H5400_IRDA_SD       58       /* to hsdl3002 shutdown pin */ 
 /* 59 not connected */
 #define GPIO_NR_H5400_POWER_SD_N    60       /* controls power to SD */
-#define GPIO_NR_H5400_POWER_RS232_OR_FS_N 61       /* inverted FORCEON to rs232 transceiver or FCD*/
+#define GPIO_NR_H5400_POWER_RS232_N_OR_FS 61       /* inverted FORCEON to rs232 transceiver or FCD*/
 #define GPIO_NR_H5400_POWER_ACCEL_N 62       /* controls power to accel */
 /* 63 is not connected */
 #define GPIO_NR_H5400_OPT_NVRAM     64       /* controls power to expansion pack */  
Milan Plzik | 14 Aug 22:30
Picon

[PATCH] h5000 fingerprint scanner interface fixes

  Hello,

  attached patch fixes h5000 fingerprint scanner. There was one really
important change:

  GPIO 61 on PXA really _DOES_ power up atmel fingerprint scanner.
Without setting this GPIO to 0, only zeroes were read from samcop's FSI.
I also renamed definition of that GPIO in h5400-gpio.h. It was quite
confusing to see that is was renamed to RS232 and took a lot of time to
figure out that the comment was wrong.

  The driver itself is just hotfixed and needs proper cleanup, although
in this state it should be fully functional. There are some places I
don't fully understand yet, and also code, which is not very readable
(most notably buffer management in fsi_drv.c). 

  There is also not-very-clean relation between fsi_drv.c and
samcop_fsi.c . fsi_drv.c seems to be sort-of more generic interface, to
which samcop_fsi attaches. But despite of this, it calls functions from
samcop_fsi .

  I'll try to clean it up a bit, but so far I don't have idea where to
begin and how it should be designed. And I don't want to do just partial
cleanups. :)

	Milan
? drivers/misc/.Makefile.swp
? drivers/misc/.built-in.o.cmd
? drivers/misc/.fsi_drv.c.swp
? drivers/misc/.fsi_drv.ko.cmd
? drivers/misc/.fsi_drv.mod.o.cmd
? drivers/misc/.fsi_drv.o.cmd
? drivers/misc/.ipaq-sleeve.ko.cmd
? drivers/misc/.ipaq-sleeve.mod.o.cmd
? drivers/misc/.ipaq-sleeve.o.cmd
? drivers/misc/.ipaq_samcop_fsi.ko.cmd
? drivers/misc/.ipaq_samcop_fsi.mod.o.cmd
? drivers/misc/.ipaq_samcop_fsi.o.cmd
? drivers/misc/.samcop_fsi.c.swp
? drivers/misc/.samcop_fsi.h.swp
? drivers/misc/.samcop_fsi.ko.cmd
? drivers/misc/.samcop_fsi.mod.o.cmd
? drivers/misc/.samcop_fsi.o.cmd
? drivers/misc/.samcop_sleeve.ko.cmd
? drivers/misc/.samcop_sleeve.mod.o.cmd
? drivers/misc/.samcop_sleeve.o.cmd
? drivers/misc/fsi_drv.ko
? drivers/misc/fsi_drv.mod.c
? drivers/misc/ipaq-sleeve.ko
? drivers/misc/ipaq-sleeve.mod.c
? drivers/misc/ipaq_samcop_fsi.ko
? drivers/misc/ipaq_samcop_fsi.mod.c
? drivers/misc/samcop_fsi.ko
? drivers/misc/samcop_fsi.mod.c
? drivers/misc/samcop_sleeve.ko
? drivers/misc/samcop_sleeve.mod.c
? drivers/misc/adc/.adc.o.cmd
? drivers/misc/adc/.built-in.o.cmd
? drivers/misc/adc/.samcop_adc.o.cmd
? arch/arm/mach-pxa/h5400/.built-in.o.cmd
? arch/arm/mach-pxa/h5400/.h5400.c.swp
? arch/arm/mach-pxa/h5400/.h5400.o.cmd
? arch/arm/mach-pxa/h5400/.h5400_bl.o.cmd
? arch/arm/mach-pxa/h5400/.h5400_bt.ko.cmd
? arch/arm/mach-pxa/h5400/.h5400_bt.mod.o.cmd
? arch/arm/mach-pxa/h5400/.h5400_bt.o.cmd
? arch/arm/mach-pxa/h5400/.h5400_lcd.o.cmd
? arch/arm/mach-pxa/h5400/h5000_buttons.c
? arch/arm/mach-pxa/h5400/h5400_bt.ko
? arch/arm/mach-pxa/h5400/h5400_bt.mod.c
Index: include/asm/arch/h5400-gpio.h
===================================================================
RCS file: /cvs/linux/kernel26/include/asm-arm/arch-pxa/h5400-gpio.h,v
retrieving revision 1.7
diff -a -u -r1.7 h5400-gpio.h
--- include/asm/arch/h5400-gpio.h	15 Nov 2006 22:18:21 -0000	1.7
+++ include/asm/arch/h5400-gpio.h	14 Aug 2007 20:12:38 -0000
@@ -88,7 +88,7 @@
 #define GPIO_NR_H5400_IRDA_SD       58       /* to hsdl3002 sd */ 
 /* 59 not connected */
 #define GPIO_NR_H5400_POWER_SD_N    60       /* controls power to SD */
-#define GPIO_NR_H5400_POWER_RS232_N 61       /* inverted FORCEON to rs232 transceiver */
+#define GPIO_NR_H5400_POWER_RS232_N_OR_FS 61       /* inverted FORCEON to rs232 transceiver or FCD*/
 #define GPIO_NR_H5400_POWER_ACCEL_N 62       /* controls power to accel */
 /* 63 is not connected */
 #define GPIO_NR_H5400_OPT_NVRAM     64       /* controls power to expansion pack */  
Index: drivers/misc/Kconfig
===================================================================
RCS file: /cvs/linux/kernel26/drivers/misc/Kconfig,v
retrieving revision 1.27
diff -a -u -r1.27 Kconfig
--- drivers/misc/Kconfig	27 Jul 2007 21:42:05 -0000	1.27
+++ drivers/misc/Kconfig	14 Aug 2007 20:12:38 -0000
@@ -163,13 +163,13 @@
 #	tristate "HTC ASIC2 sleeve driver"
 #	depends on HTC_ASIC2 && IPAQ_SLEEVE

-#config IPAQ_SAMCOP_FSI
-#	tristate "HP iPAQ SAMCOP FSI driver"
-#	depends on SOC_SAMCOP
-#	help
-#	  Provides access to the samcop portion of the fingerprint scanner
-#	  on the h5[5,4]xx. It also provides the /dev/misc/fsi0 device to
-#	  userspace users of the scanner.
+config IPAQ_SAMCOP_FSI
+	tristate "HP iPAQ SAMCOP FSI driver"
+	depends on SOC_SAMCOP
+	help
+	  Provides access to the samcop portion of the fingerprint scanner
+	  on the h5[5,4]xx. It also provides the /dev/misc/fsi0 device to
+	  userspace users of the scanner.

 config IPAQ_SAMCOP_SLEEVE
 	tristate "HP iPAQ SAMCOP Sleeve driver"
Index: drivers/misc/Makefile
===================================================================
RCS file: /cvs/linux/kernel26/drivers/misc/Makefile,v
retrieving revision 1.23
diff -a -u -r1.23 Makefile
--- drivers/misc/Makefile	27 Jul 2007 21:42:05 -0000	1.23
+++ drivers/misc/Makefile	14 Aug 2007 20:12:38 -0000
@@ -26,6 +26,8 @@
 #obj-$(CONFIG_IPAQ_ASIC2_SLEEVE) += asic2_sleeve.o
 #obj-$(CONFIG_IPAQ_ASIC2_OWM) += asic2_owm.o

-#obj-$(CONFIG_IPAQ_SAMCOP_FSI) += samcop_fsi.o fsi_drv.o
+obj-$(CONFIG_IPAQ_SAMCOP_FSI) += ipaq_samcop_fsi.o
+ipaq_samcop_fsi-objs = samcop_fsi.o fsi_drv.o
+
 obj-$(CONFIG_IPAQ_SAMCOP_SLEEVE) += samcop_sleeve.o

Index: drivers/misc/fsi_drv.c
===================================================================
RCS file: /cvs/linux/kernel26/drivers/misc/fsi_drv.c,v
retrieving revision 1.3
diff -a -u -r1.3 fsi_drv.c
--- drivers/misc/fsi_drv.c	23 Aug 2006 18:24:04 -0000	1.3
+++ drivers/misc/fsi_drv.c	14 Aug 2007 20:12:38 -0000
@@ -26,24 +26,26 @@
 #include <asm/arch/irqs.h>

 #include <asm/arch/fsi.h>
+#include <asm/arch/pxa-regs.h>
+#include <asm/arch/h5400-gpio.h>

 #include "samcop_fsi.h"

-atomic_t fsi_in_use;
-DECLARE_WAIT_QUEUE_HEAD(fsi_rqueue);
-struct timer_list fsi_temp_timer;
-
-unsigned int fsi_prescale = 19;
-unsigned int fsi_dmi = 1124;
-unsigned int fsi_treshold_on = 20;
-unsigned int fsi_treshold_off = 4;
-unsigned int fsi_buffer_size = FSI_FRAME_SIZE * (sizeof(unsigned long)) * 3;
+static atomic_t fsi_in_use;
+static DECLARE_WAIT_QUEUE_HEAD(fsi_rqueue);
+static struct timer_list fsi_temp_timer;
+
+static unsigned int fsi_prescale = 19;
+static unsigned int fsi_dmi = 1124;
+static unsigned int fsi_treshold_on = 20;
+static unsigned int fsi_treshold_off = 4;
+static unsigned int fsi_buffer_size = FSI_FRAME_SIZE * (sizeof(unsigned long)) * 3;

 volatile unsigned char fsi_lfrm = 0;

 static struct samcop_fsi *fsi_ = NULL;

-void fsi_set_mode(unsigned int cmd)
+static void fsi_set_mode(unsigned int cmd)
 {
 	static unsigned int current_mode = 0;
 	static unsigned long control_register = 0;
@@ -107,14 +109,14 @@
 	}
 }

-void fsi_timer_temp_callback(unsigned long input)
+static void fsi_timer_temp_callback(unsigned long input)
 {
 	printk(KERN_DEBUG "%s: stopping temperature increase (status=%d)\n", __FUNCTION__,
 	       samcop_fsi_get_control(fsi_) & FSI_CONTROL_TEMP);
 	fsi_set_mode(FSI_CMD_STOP_TEMP);
 }

-inline int fsi_analyze_column(struct fsi_read_state *read_state, unsigned int data)
+static inline int fsi_analyze_column(struct fsi_read_state *read_state, unsigned int data)
 {
 	if ((data & 0xEFEF) == 0xE0E0) { /* sync column */
 		read_state->frame_number++;
@@ -158,7 +160,7 @@
 	return 0;
 }

-void fsi_run_tasklet(unsigned long state_ptr)
+static void fsi_run_tasklet(unsigned long state_ptr)
 {
 	unsigned int i;
 	unsigned long data;
@@ -202,14 +204,14 @@

 DECLARE_TASKLET_DISABLED(fsi_tasklet,fsi_run_tasklet,0);

-int fsi_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t fsi_irq_handler(int irq, void *dev_id)
 {
 	unsigned int fifo_status;

 
 	fifo_status = samcop_fsi_get_status(fsi_);

-	if (fifo_status & 1) {
+	if (fifo_status & 1) { /* FIFO trigger */
 		fsi_set_mode(FSI_CMD_STOP_ACQ_INT);
 		tasklet_schedule(&fsi_tasklet);
 	}
@@ -226,10 +228,10 @@
 		fsi_lfrm = 1;
 		tasklet_schedule(&fsi_tasklet);
 	}
-	return 0;
+	return IRQ_HANDLED;
 }

-int fsi_copy_to_user(struct fsi_read_state *read_state, char *buf)
+static int fsi_copy_to_user(struct fsi_read_state *read_state, char *buf)
 {
 	unsigned int avail_words;

@@ -240,7 +242,14 @@
 	else
 		avail_words = read_state->write_pos - read_state->read_pos;
 	
-	if (copy_to_user(buf+read_state->word_count*4,read_state->buffer+read_state->read_pos,avail_words*4))
+	/* 'buf' is 'char*', but word_count denotes count in array of 'unsigned
+	 * long'. To get proper destination address, we need to multiple it by
+	 * sizeof(unsigned long).
+	 */
+
+	if (copy_to_user(buf+read_state->word_count*sizeof(unsigned long), 
+		read_state->buffer+read_state->read_pos,
+		avail_words*sizeof(unsigned long)))
 		return -EFAULT;

 	read_state->word_count += avail_words;
@@ -284,10 +293,13 @@

 	filp->private_data = read_state;

-#if 0
+#if 1 
 	/* GPIO61 turns out to be serial power, not fingerchip power.
 	   Any other guesses?  */
-	SET_GPIO(POWER_FP_N, 0); /* power on */
+	/* it _IS_ this GPIO. No idea what else it powers, but without it, ATMEL
+	 * chip returns zeroes. */
+	//SET_GPIO(POWER_FP_N, 0); /* power on */
+	SET_H5400_GPIO(POWER_RS232_N_OR_FS, 0);
 #endif
 	/* init hardware */
 	samcop_fsi_up(fsi_);
@@ -295,18 +307,19 @@
 	return 0;
 }

-int fsi_release(struct inode *inode, struct file *filp)
+static int fsi_release(struct inode *inode, struct file *filp)
 {
 	/* put scanner to sleep before we exit */
 	samcop_fsi_down(fsi_);

 	kfree(filp->private_data);
 	atomic_inc(&fsi_in_use);
+	SET_H5400_GPIO(POWER_RS232_N_OR_FS, 1);

 	return 0;
 }

-ssize_t fsi_read(struct file *filp, char *buf, size_t count, loff_t *offp)
+static ssize_t fsi_read(struct file *filp, char *buf, size_t count, loff_t *offp)
 {
 	int errval = 0;
 	struct fsi_read_state *read_state;
@@ -321,6 +334,7 @@
 	/* allocate buffer and initialize state */
 	read_state->buffer_size = fsi_buffer_size;
 	read_state->buffer = kmalloc(read_state->buffer_size,GFP_KERNEL);
+	read_state->buffer_size = fsi_buffer_size/sizeof(unsigned long);
 	if (read_state->buffer == NULL)
 		return -ENOMEM;

@@ -347,6 +361,7 @@

 	/* gather data */
 	while (read_state->word_count < read_state->word_dest) {
+		//printk (KERN_INFO "word_count: %d, word_dest: %d\n", read_state->word_count, read_state->word_dest);
 		interruptible_sleep_on(&fsi_rqueue);
 		if (signal_pending(current)) {
 			errval = -ERESTARTSYS;
@@ -380,7 +395,7 @@
 	return count;
 }

-int fsi_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
+static int fsi_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
 {
 	struct fsi_read_state *read_state;

@@ -474,15 +489,20 @@
 	return 0; 
 }

-void
+int
 fsi_detach(void)
 {
+	if (atomic_dec_and_test(&fsi_in_use)) {
+		atomic_inc(&fsi_in_use);
+		/* someone is using FSI at the moment, we can't quit */
+		return -EBUSY;
+	}
 	fsi_set_mode(FSI_CMD_STOP_TEMP);
 	del_timer(&fsi_temp_timer);
-	samcop_fsi_down(fsi_); /* Stop h/w */
 	free_irq(fsi_->irq, NULL);
 	fsi_ = NULL;
 	misc_deregister(&fsi_miscdev);
+	return 0;
 }

 MODULE_AUTHOR("J°rgen Andreas Michaelsen <jorgenam <at> ifi.uio.no>");
Index: drivers/misc/samcop_fsi.c
===================================================================
RCS file: /cvs/linux/kernel26/drivers/misc/samcop_fsi.c,v
retrieving revision 1.9
diff -a -u -r1.9 samcop_fsi.c
--- drivers/misc/samcop_fsi.c	10 Apr 2006 22:45:16 -0000	1.9
+++ drivers/misc/samcop_fsi.c	14 Aug 2007 20:12:39 -0000
@@ -9,6 +9,7 @@
  *
  */

+
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
@@ -18,24 +19,24 @@
 #include <linux/clk.h>
 #include <asm/hardware.h>
 #include <asm/io.h>
-#include <asm/arch/ipaq.h>
 #include <asm/hardware/ipaq-samcop.h>
-#include <asm/hardware/samcop_base.h>
+#include <linux/mfd/samcop_base.h>
 #include <asm/hardware/samcop-fsi.h>

 #include "samcop_fsi.h"

 static inline void
-samcop_fsi_write_register (struct samcop_fsi *fsi, u32 reg, u16 val)
+samcop_fsi_write_register (struct samcop_fsi *fsi, u32 reg, u32 val)
 {
-	__raw_writew (val, reg + fsi->map);
+	fsi->fsi_data->write_reg (fsi->me, reg, val);
 }

-static inline u16
+static inline u32
 samcop_fsi_read_register (struct samcop_fsi *fsi, u32 reg)
 {
-	return __raw_readw (reg + fsi->map);
+	return fsi->fsi_data->read_reg (fsi->me, reg);
 }
+
 /*
  * Helper functions that provide samcop access to the fcd and fsi parts of the
  * fingerprint scanner
@@ -44,6 +45,7 @@
 void
 samcop_fsi_set_control (struct samcop_fsi *fsi, u32 val)
 {
+	val &= 0xff;
 	samcop_fsi_write_register (fsi, _SAMCOP_FSI_Control, val);
 }

@@ -100,7 +102,7 @@
 	/* tell scanner to sleep */
 	u32 control_register = 0;
 	control_register = samcop_fsi_get_control(fsi);
-	control_register |= ~SAMCOP_FSI_CONTROL_TEMP_PWR_ON;
+	control_register &= ~SAMCOP_FSI_CONTROL_TEMP_PWR_ON; // |= was here originally
 	samcop_fsi_set_control(fsi, control_register);

 	/* disable PCLK */
@@ -110,40 +112,69 @@
 void
 samcop_fsi_set_status (struct samcop_fsi *fsi, u32 val)
 {
-	samcop_fsi_write_register (fsi, SAMCOP_FSI_STA, val);
+	samcop_fsi_write_register (fsi, _SAMCOP_FSI_STA, val);
 }

 u32
 samcop_fsi_get_status (struct samcop_fsi *fsi)
 {
-	return samcop_fsi_read_register (fsi, SAMCOP_FSI_STA);
+	return samcop_fsi_read_register (fsi, _SAMCOP_FSI_STA);
 }

 u32
 samcop_fsi_read_data (struct samcop_fsi *fsi)
 {
-	return samcop_fsi_read_register (fsi, SAMCOP_FSI_DAT);
+	return samcop_fsi_read_register (fsi, _SAMCOP_FSI_DAT);
 }

 static int
-samcop_fsi_probe (struct device *dev)
+samcop_fsi_probe (struct platform_device *pdev)
 {
 	int result = 0;
 	struct samcop_fsi *fsi;
-	struct platform_device *sdev = to_platform_device (dev);

 	fsi = kmalloc (sizeof (*fsi), GFP_KERNEL);
 	if (!fsi)
 		return -ENOMEM;
 	memset (fsi, 0, sizeof (*fsi));

-	fsi->parent = dev->parent;
-	dev->driver_data = fsi;
+	fsi->parent = pdev->dev.parent;
+	platform_set_drvdata(pdev, fsi);

-	fsi->map = (void *)sdev->resource[1].start;
-	fsi->irq = sdev->resource[2].start;
+	/* Is this really correct? Some other drivers use this approach, but
+	 * this was already once ioremapped by samcop_base, so we could possibly
+	 * use that mapping and not create new one (approach similar to
+	 * samcop_sdi).
+	 */
+
+	fsi->map = ioremap(pdev->resource[0].start, 
+			pdev->resource[0].end - pdev->resource[0].start + 1);
+	fsi->irq = pdev->resource[1].start;
+	pr_debug("FSI at 0x%p, IRQ %d\n", fsi->map, fsi->irq);
+
+	fsi->clk = clk_get(&pdev->dev, "fsi");
+	if (!fsi->clk) {
+		printk(KERN_ERR "samcop_fsi: Could not get fsi clock");
+		iounmap(fsi->map);
+		kfree(fsi);
+		result = -EBUSY;
+	};
+
+	fsi->fsi_data = pdev->dev.platform_data;
+	fsi->me = &pdev->dev;
+/*	
+	fsi->set_control = samcop_fsi_set_control;
+	fsi->get_control = samcop_fsi_get_control;
+	fsi->set_status = samcop_fsi_set_status;
+	fsi->get_status = samcop_fsi_get_status;
+	fsi->read_data = samcop_fsi_read_data;
+	fsi->up = samcop_fsi_up;
+	fsi->down = samcop_fsi_down;
+	fsi->set_fifo_control = samcop_fsi_set_fifo_control;
+	fsi->set_prescaler = samcop_fsi_set_prescaler;
+	fsi->set_dmc = samcop_fsi_set_dmc;
+*/

-	fsi->clk = clk_get(dev, "fsi");
 	if (IS_ERR(fsi->clk)) {
 		printk(KERN_ERR "failed to get fsi clock\n");
 		kfree (fsi);
@@ -154,33 +185,40 @@
 		printk("couldn't attach fsi driver: error %d\n", result);
 		kfree (fsi);
 	}
+	

 	return result;
 }

 static int
-samcop_fsi_remove (struct device *dev)
+samcop_fsi_remove (struct platform_device *dev)
 {
-	struct samcop_fsi *fsi = dev->driver_data;
-	fsi_detach();
+	struct samcop_fsi *fsi = platform_get_drvdata(dev);
+	int result = 0;
+	result = fsi_detach();
+	if (result != 0)
+		return result;
+	iounmap(fsi->map);
 	kfree (fsi);
-	return 0;
+	return result;
 }

 static int
-samcop_fsi_suspend (struct device *dev, pm_message_t state)
+samcop_fsi_suspend (struct platform_device *dev, pm_message_t state)
 {
 	return 0;
 }

 static int
-samcop_fsi_resume (struct device *dev)
+samcop_fsi_resume (struct platform_device *dev)
 {
 	return 0;
 }

-struct device_driver samcop_fsi_device_driver = {
-	.name    = "samcop fsi",
+struct platform_driver samcop_fsi_device_driver = {
+	.driver = {
+		.name    = "samcop fsi",
+	},
 	.probe   = samcop_fsi_probe,
 	.remove  = samcop_fsi_remove,
 	.suspend = samcop_fsi_suspend,
@@ -189,12 +227,12 @@

 static int samcop_fsi_init (void)
 {
-	return driver_register (&samcop_fsi_device_driver);
+	return platform_driver_register (&samcop_fsi_device_driver);
 }

 static void samcop_fsi_cleanup (void)
 {
-	driver_unregister (&samcop_fsi_device_driver);
+	platform_driver_unregister (&samcop_fsi_device_driver);
 }

 module_init(samcop_fsi_init);
Index: drivers/misc/samcop_fsi.h
===================================================================
RCS file: /cvs/linux/kernel26/drivers/misc/samcop_fsi.h,v
retrieving revision 1.2
diff -a -u -r1.2 samcop_fsi.h
--- drivers/misc/samcop_fsi.h	5 Nov 2005 01:09:35 -0000	1.2
+++ drivers/misc/samcop_fsi.h	14 Aug 2007 20:12:39 -0000
@@ -10,14 +10,26 @@
 #ifndef _SAMCOP_FSI_H_
 #define _SAMCOP_FSI_H_
 
+
+struct samcop_fsi_data {
+	u32     (*read_reg)(struct device *dev, u32 reg);
+	void    (*write_reg)(struct device *dev, u32 reg, u32 val);
+};
+
+
 struct samcop_fsi {
 	struct device 		*parent;	// parent struct for access to
 						// samcop registers
+	struct device 		*me;
 	void			*map;		// fsi register map
 	int			irq;		// data ready irq
 	struct clk		*clk;		// samcop fsi clk
+
+	struct samcop_fsi_data *fsi_data;
 };

+
+
 extern void samcop_fsi_set_control (struct samcop_fsi *fsi, u32 val);
 extern u32 samcop_fsi_get_control (struct samcop_fsi *fsi);
 extern void samcop_fsi_set_status (struct samcop_fsi *fsi, u32 val);
@@ -29,7 +41,8 @@
 extern void samcop_fsi_set_prescaler (struct samcop_fsi *fsi, u32 val);
 extern void samcop_fsi_set_dmc (struct samcop_fsi *fsi, u32 val);

+
 extern int fsi_attach (struct samcop_fsi *fsi);
-extern void fsi_detach (void);
+extern int fsi_detach (void);

 #endif /* _SAMCOP_FSI_H_ */
joe | 13 Aug 08:34

[PATCH] [380/2many] MAINTAINERS - POWER SUPPLY CLASS/SUBSYSTEM and DRIVERS

Add file pattern to MAINTAINER entry

Signed-off-by: Joe Perches <joe <at> perches.com>

diff --git a/MAINTAINERS b/MAINTAINERS
index 58602ab..0d30368 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3649,6 +3649,8 @@ L:	linux-kernel <at> vger.kernel.org
 L:	kernel-discuss <at> handhelds.org
 T:	git git.infradead.org/battery-2.6.git
 S:	Maintained
+F:	include/linux/power_supply.h
+F:	drivers/power/power_supply*

 POWERPC 4xx EMAC DRIVER
 P:	Eugene Surovegin
Milan Plzik | 12 Aug 16:23
Picon

[PATCH] H5000 gpiodev-keys2 support

  Hello,

  attached patch replaces gpiodev-keys support in h5000.c by brand new
support for gpiodev-keys2, and also includes few changes to initial
values for samcop's gpio block, which were dumped from windows. All
H5000 keys should now work correctly. Also, from some strange reason,
the power button was marked as active_low, but it seems the opposite is
true. Please, apply this patch only if gpiodev-keys2 patch has been
commited.

	Milan
Index: arch/arm/mach-pxa/h5400/h5400.c
===================================================================
RCS file: /cvs/linux/kernel26/arch/arm/mach-pxa/h5400/h5400.c,v
retrieving revision 1.54
diff -a -u -r1.54 h5400.c
--- arch/arm/mach-pxa/h5400/h5400.c	27 Jul 2007 21:44:42 -0000	1.54
+++ arch/arm/mach-pxa/h5400/h5400.c	12 Aug 2007 14:21:56 -0000
@@ -38,8 +38,7 @@
 #include <linux/input_pda.h>
 #include <linux/adc.h>
 #include <linux/mfd/samcop_adc.h>
-#include <linux/gpiodev_keys.h>
-#include <linux/gpiodev_diagonal.h>
+#include <linux/gpiodev_keys2.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
@@ -649,8 +648,8 @@
 		.gpacon2 = 0x5a,
 		.gpadat = 0x0,
 		.gpaup = 0x0,
-		.gpioint = { 0x66666666, 0x60006, 0x0, },
-		.gpioflt = { 0x3fff0000, 0x3fff3fff, 0x3fff, 0, 0, 0x3fff3fff, 0, },
+		.gpioint = { 0xeeeeeeee, 0x6766eeee, 0x0444444f, },
+		.gpioflt = { 0x3fff0001, 0x3fff3fff, 0x3fff3fff, 0x3fff3fff, 0x3fff3fff, 0x3fff3fff, 0x000f3fff, },
 		.gpioenint = { 0x3f, 0x7f, },
 	},
 	.child_devs = samcop_child_devs,
@@ -669,52 +668,68 @@
 };
 EXPORT_SYMBOL(h5400_samcop);

-static struct gpiodev_keys_button h5400_button_table[] = {
-	{ KEY_POWER,      { &pxagpio_device.dev, GPIO_NR_H5400_POWER_BUTTON }, 1, "Power button" },
-	{ _KEY_RECORD,    { &h5400_samcop.dev, SAMCOP_GPA_RECORD },	1, "Record button" },
-	{ _KEY_CALENDAR,  { &h5400_samcop.dev, SAMCOP_GPA_APPBTN1 },	1, "Calendar button" },
-	{ _KEY_CONTACTS,  { &h5400_samcop.dev, SAMCOP_GPA_APPBTN2 },	1, "Contacts button" },
-	{ _KEY_MAIL,      { &h5400_samcop.dev, SAMCOP_GPA_APPBTN3 },	1, "Mail button" },
-	{ _KEY_HOMEPAGE,  { &h5400_samcop.dev, SAMCOP_GPA_APPBTN4 },	1, "Homepage button" },
-	{ KEY_VOLUMEUP,	  { &h5400_samcop.dev, SAMCOP_GPA_TOGGLEUP },		1, "Volume up" },
-	{ KEY_VOLUMEDOWN, { &h5400_samcop.dev, SAMCOP_GPA_TOGGLEDOWN },		1, "Volume down" },
+static struct gpiodev_keys2_gpio h5000_gpiodev_keys2_gpios[] = {
+	{ "Power button",   	{ &pxagpio_device.dev, GPIO_NR_H5400_POWER_BUTTON }, 0, },
+	{ "Record button",  	{ &h5400_samcop.dev, SAMCOP_GPA_RECORD },	1, },
+	{ "Calendar button",	{ &h5400_samcop.dev, SAMCOP_GPA_APPBTN1 },	1, },
+	{ "Contacts button",	{ &h5400_samcop.dev, SAMCOP_GPA_APPBTN2 },	1, },
+	{ "Mail button",    	{ &h5400_samcop.dev, SAMCOP_GPA_APPBTN3 },	1, },
+	{ "Homepage button",	{ &h5400_samcop.dev, SAMCOP_GPA_APPBTN4 },	1, },
+	{ "Volume up",	    	{ &h5400_samcop.dev, SAMCOP_GPA_TOGGLEUP },	1, },
+	{ "Volume down",    	{ &h5400_samcop.dev, SAMCOP_GPA_TOGGLEDOWN },	1, },
+	{ "Joypad NW",      	{ &h5400_samcop.dev, SAMCOP_GPA_JOYSTICK1 }, 1, },
+	{ "Joypad NE",      	{ &h5400_samcop.dev, SAMCOP_GPA_JOYSTICK2 }, 1, },
+	{ "Joypad SE",      	{ &h5400_samcop.dev, SAMCOP_GPA_JOYSTICK3 }, 1, },
+	{ "Joypad SW",      	{ &h5400_samcop.dev, SAMCOP_GPA_JOYSTICK4 }, 1, },
+	{ "Joypad action", 	{ &h5400_samcop.dev, SAMCOP_GPA_JOYSTICK5 }, 1, },
+};
+
+static struct gpiodev_keys2_button h5000_gpiodev_keys2_buttons[] = {
+	{ KEY_POWER,      	{ "Power button", NULL }, 0, 0, },
+	{ _KEY_CALENDAR,	{ "Calendar button", NULL }, 0, 0, },
+	{ _KEY_CONTACTS,	{ "Contacts button", NULL }, 0, 0, },
+	{ _KEY_MAIL,    	{ "Mail button", NULL }, 0, 0, },
+	{ _KEY_HOMEPAGE,	{ "Homepage button", NULL }, 0, 0, },
+	/* Side buttons */
+	{ _KEY_RECORD,  	{ "Record button", "Volume up", "Volume down", NULL }, 75, 1, },
+	{ KEY_VOLUMEUP, 	{ "Volume up", NULL }, 75, 0, },
+	{ KEY_VOLUMEDOWN,	{ "Volume down", "Record button", NULL }, 75, 0, },
+	/* Diagonal joypad */
+	{ KEY_ENTER,     	{ "Joypad action", NULL }, 0, 0},
+	/* One diagonal pressed */
+	/* NE */
+	{ KEY_UP,       	{ "Joypad NE", "Joypad action", NULL}, 0, 1},
+	{ KEY_RIGHT,       	{ "Joypad NE", "Joypad action", NULL}, 0, 1},
+	/* NW */
+	{ KEY_UP,       	{ "Joypad NW", "Joypad action", NULL}, 0, 1},
+	{ KEY_LEFT,       	{ "Joypad NW", "Joypad action", NULL}, 0, 1},
+	/* SE */
+	{ KEY_DOWN,       	{ "Joypad SE", "Joypad action", NULL}, 0, 1},
+	{ KEY_RIGHT,       	{ "Joypad SE", "Joypad action", NULL}, 0, 1},
+	/* SW */
+	{ KEY_DOWN,       	{ "Joypad SW", "Joypad action", NULL}, 0, 1},
+	{ KEY_LEFT,       	{ "Joypad SW", "Joypad action", NULL}, 0, 1},
+	/* Two diagonals pressed */
+	{ KEY_UP,        	{ "Joypad NE", "Joypad NW", "Joypad action", NULL }, 0, 2},
+	{ KEY_LEFT,        	{ "Joypad NW", "Joypad SW", "Joypad action", NULL }, 0, 2},
+	{ KEY_DOWN,        	{ "Joypad SW", "Joypad SE", "Joypad action", NULL }, 0, 2},
+	{ KEY_RIGHT,        	{ "Joypad SE", "Joypad NE", "Joypad action", NULL }, 0, 2},
+};
+
+static struct gpiodev_keys2_platform_data h5000_gpiodev_keys2_platform_data = {
+	.gpios  =  	h5000_gpiodev_keys2_gpios,
+	.ngpios =  	ARRAY_SIZE(h5000_gpiodev_keys2_gpios),
+	.buttons = 	h5000_gpiodev_keys2_buttons,
+	.nbuttons = 	ARRAY_SIZE(h5000_gpiodev_keys2_buttons),
 };

-
-static struct gpiodev_keys_platform_data h5400_pxa_keys_data = {
-	.buttons = h5400_button_table,
-	.nbuttons = ARRAY_SIZE(h5400_button_table),
-};
-
-static struct platform_device h5400_pxa_keys = {
-	.name = "gpiodev-keys",
-	.dev = {
-		.platform_data = &h5400_pxa_keys_data,
-	},
-};
-
-static struct gpiodev_diagonal_button h5400_joypad_table[] = {
-	{ { &h5400_samcop.dev, SAMCOP_GPA_JOYSTICK1 }, 1, GPIODEV_DIAG_LEFT | GPIODEV_DIAG_UP, "Joypad
left-up" },
-	{ { &h5400_samcop.dev, SAMCOP_GPA_JOYSTICK2 }, 1, GPIODEV_DIAG_RIGHT | GPIODEV_DIAG_UP, "Joypad
right-up" },
-	{ { &h5400_samcop.dev, SAMCOP_GPA_JOYSTICK3 }, 1, GPIODEV_DIAG_RIGHT | GPIODEV_DIAG_DOWN, "Joypad
right-down" },
-	{ { &h5400_samcop.dev, SAMCOP_GPA_JOYSTICK4 }, 1, GPIODEV_DIAG_LEFT | GPIODEV_DIAG_DOWN, "Joypad
left-down" },
-	{ { &h5400_samcop.dev, SAMCOP_GPA_JOYSTICK5 }, 1, GPIODEV_DIAG_ACTION, "Joypad action" },
-};
-
-static struct gpiodev_diagonal_platform_data h5400_pxa_joypad_data = {
-	.buttons = h5400_joypad_table,
-	.nbuttons = ARRAY_SIZE(h5400_joypad_table),
-	.dir_disables_enter = 1,
-};
-
-static struct platform_device h5400_pxa_joypad = {
-	.name = "gpiodev-diagonal",
+static struct platform_device h5000_gpiodev_keys2 = {
+	.name = "gpiodev-keys2",
 	.dev = {
-		.platform_data = &h5400_pxa_joypad_data,
+		.platform_data = &h5000_gpiodev_keys2_platform_data,
 	},
 };

-
 static void __init
 h5400_init (void)
 {
@@ -723,8 +738,7 @@
 	platform_device_register (&h5000_flash[0]);
 	platform_device_register (&h5000_flash[1]);
 	platform_device_register (&h5400_samcop);
-	platform_device_register (&h5400_pxa_keys);
-	platform_device_register (&h5400_pxa_joypad);
+	platform_device_register (&h5000_gpiodev_keys2);
 	pxa_set_udc_info (&h5400_udc_mach_info);
 	pxa_set_dma_needs_bounce (h5400_dma_needs_bounce);
 }
Milan Plzik | 12 Aug 13:14
Picon

[PATCH] Minor h5000 audio fixes

  Hello,

  looks like h5000 audio driver has one #include line, which refers to
moved file, and also there were few more dependencies missing in
Kconfig. Attached patch fixes that.

	Milan
Index: sound/soc/pxa/h5000.c
===================================================================
RCS file: /cvs/linux/kernel26/sound/soc/pxa/h5000.c,v
retrieving revision 1.1
diff -a -u -r1.1 h5000.c
--- sound/soc/pxa/h5000.c	23 Mar 2007 22:05:12 -0000	1.1
+++ sound/soc/pxa/h5000.c	12 Aug 2007 11:09:39 -0000
@@ -26,7 +26,7 @@
 #include <asm-arm/arch/gpio.h>
 #include <asm/arch-pxa/h5400-asic.h>
 #include <asm/arch-pxa/h5400-gpio.h>
-#include <asm/hardware/samcop_base.h>
+#include <linux/mfd/samcop_base.h>

 #include "pxa2xx-i2s.h"
 #include "pxa2xx-pcm.h"

Gmane