From 4dab2a3bd62003416bbc7557d42dd40d0fb81cfe Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Mon, 10 Sep 2007 03:35:48 +0000 Subject: linux-ezx: update to svn r2050 --- packages/linux/linux-ezx-2.6.21/a1200/defconfig | 1 + .../linux/linux-ezx-2.6.21/patches/a1200-eoc.patch | 82 ++ .../linux/linux-ezx-2.6.21/patches/a1200-mci.patch | 6 +- .../linux-ezx-2.6.21/patches/a1200-pcap.patch | 36 +- .../linux/linux-ezx-2.6.21/patches/a1200-ts.patch | 10 +- .../linux/linux-ezx-2.6.21/patches/a780-emu.patch | 6 +- .../linux/linux-ezx-2.6.21/patches/a780-flip.patch | 6 +- .../linux/linux-ezx-2.6.21/patches/a780-kbd.patch | 8 +- .../linux/linux-ezx-2.6.21/patches/a780-leds.patch | 36 +- .../linux/linux-ezx-2.6.21/patches/a780-mci.patch | 6 +- .../linux/linux-ezx-2.6.21/patches/a780-pcap.patch | 54 +- .../linux/linux-ezx-2.6.21/patches/a780-ts.patch | 6 +- .../linux-ezx-2.6.21/patches/a780-vibrator.patch | 83 +- .../patches/asoc-fix-loopback.patch | 14 + .../linux-ezx-2.6.21/patches/asoc-pxa-ssp.patch | 14 +- .../linux/linux-ezx-2.6.21/patches/e680-emu.patch | 6 +- .../linux/linux-ezx-2.6.21/patches/e680-kbd.patch | 8 +- .../linux/linux-ezx-2.6.21/patches/e680-leds.patch | 20 +- .../linux-ezx-2.6.21/patches/e680-locksw.patch | 6 +- .../linux/linux-ezx-2.6.21/patches/e680-mci.patch | 6 +- .../linux/linux-ezx-2.6.21/patches/e680-pcap.patch | 54 +- .../linux/linux-ezx-2.6.21/patches/e680-ts.patch | 6 +- .../linux/linux-ezx-2.6.21/patches/ezx-asoc.patch | 1053 +++++++++-------- .../linux/linux-ezx-2.6.21/patches/ezx-bp.patch | 33 +- .../linux/linux-ezx-2.6.21/patches/ezx-emu.patch | 78 +- .../linux/linux-ezx-2.6.21/patches/ezx-eoc.patch | 342 ++++++ .../linux-ezx-2.6.21/patches/ezx-mtd-map.patch | 24 +- .../linux/linux-ezx-2.6.21/patches/ezx-pcap.patch | 1218 +++++++------------- .../patches/i2c-core-fix-a1200.patch | 15 + .../linux/linux-ezx-2.6.21/patches/pcap-ts.patch | 143 +-- .../patches/pxa27x-udc-fix-a1200.patch | 35 + packages/linux/linux-ezx_2.6.21.bb | 7 +- 32 files changed, 1796 insertions(+), 1626 deletions(-) create mode 100644 packages/linux/linux-ezx-2.6.21/patches/a1200-eoc.patch create mode 100644 packages/linux/linux-ezx-2.6.21/patches/asoc-fix-loopback.patch create mode 100644 packages/linux/linux-ezx-2.6.21/patches/ezx-eoc.patch create mode 100644 packages/linux/linux-ezx-2.6.21/patches/i2c-core-fix-a1200.patch create mode 100644 packages/linux/linux-ezx-2.6.21/patches/pxa27x-udc-fix-a1200.patch diff --git a/packages/linux/linux-ezx-2.6.21/a1200/defconfig b/packages/linux/linux-ezx-2.6.21/a1200/defconfig index 5a089bc1bb..ea7475ced2 100755 --- a/packages/linux/linux-ezx-2.6.21/a1200/defconfig +++ b/packages/linux/linux-ezx-2.6.21/a1200/defconfig @@ -152,6 +152,7 @@ CONFIG_PXA_EZX_A1200=y # CONFIG_PXA_EZX_E6 is not set CONFIG_EZX_BP=y CONFIG_EZX_PCAP=y +CONFIG_EZX_EOC=y CONFIG_EZX_EMU=y CONFIG_EZX_EMU_USB=y # CONFIG_EZX_EMU_UART is not set diff --git a/packages/linux/linux-ezx-2.6.21/patches/a1200-eoc.patch b/packages/linux/linux-ezx-2.6.21/patches/a1200-eoc.patch new file mode 100644 index 0000000000..577aa66303 --- /dev/null +++ b/packages/linux/linux-ezx-2.6.21/patches/a1200-eoc.patch @@ -0,0 +1,82 @@ +Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c +=================================================================== +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a1200.c 2007-09-07 22:15:52.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c 2007-09-09 13:29:56.000000000 -0300 +@@ -25,6 +25,7 @@ + #include + + #include "generic.h" ++#include "ezx-eoc.h" + + extern void ezx_lcd_power(int, struct fb_var_screeninfo *); + extern void ezx_backlight_power(int); +@@ -227,11 +228,69 @@ + .resource = pcap_ts_resources, + }; + ++ ++/* EOC */ ++static const unsigned int tab_init_eoc_reg[][2] = ++{ ++ {POWER_IC_REG_EOC_INT_MASK, 0x00000FEF}, ++ {POWER_IC_REG_EOC_POWER_CONTROL_0, 0x00000C00}, ++ {POWER_IC_REG_EOC_POWER_CONTROL_1, 0x0000000C}, ++ {POWER_IC_REG_EOC_CONN_CONTROL, 0x00021044}, ++}; ++ ++static void dump_eoc_registers(void) ++{ ++ int i, val = 0; ++ ++ printk("========DUMP EOC=========\n"); ++ for (i = 0; i < POWER_IC_REG_EOC_NUM; i++) { ++ eoc_reg_read(i, &val); ++ printk("eoc_registers[%d] = 0x%08X\n", i, val); ++ } ++ printk("========END DUMP=========\n"); ++} ++ ++/* ++ * FIXME: The same about the PCAP driver applies here. ++ * This is the initial state only. ++ * Which bits does the change to USB/UART/AUDIO mode? ++ * I think that this is causing the crash on pxa27x-udc ++ * you are setting the 'port connected' bit, and thats why ++ * you are getting interrupts early. ++ * --WM ++ */ ++ ++static int __init a1200_eoc_init(void) ++{ ++ int i; ++ ++ for (i = 0; i < sizeof(tab_init_eoc_reg)/sizeof(unsigned int)/2; i++) ++ { ++ eoc_reg_write(tab_init_eoc_reg[i][0], tab_init_eoc_reg[i][1]); ++ } ++ dump_eoc_registers(); ++ return 0; ++} ++ ++static struct ezx_eoc_platform_data a1200_eoc_platform_data = { ++ .init = a1200_eoc_init, ++}; ++ ++struct platform_device a1200_eoc_device = { ++ .name = "ezx-eoc", ++ .id = -1, ++ .dev = { ++ .platform_data = &a1200_eoc_platform_data, ++ }, ++}; ++ + static struct platform_device *devices[] __initdata = { + &a1200_pcap_device, + &pcap_ts_device, ++ &a1200_eoc_device, + }; + ++ + static void __init a1200_init(void) + { + set_pxa_fb_info(&a1200_fb_info); diff --git a/packages/linux/linux-ezx-2.6.21/patches/a1200-mci.patch b/packages/linux/linux-ezx-2.6.21/patches/a1200-mci.patch index 0bd7581965..042254b115 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/a1200-mci.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/a1200-mci.patch @@ -1,7 +1,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a1200.c 2007-06-28 22:48:05.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c 2007-06-28 22:53:19.000000000 -0300 +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a1200.c 2007-09-07 11:51:55.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c 2007-09-07 11:54:52.000000000 -0300 @@ -13,6 +13,8 @@ #include #include @@ -114,7 +114,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c static struct pxafb_mode_info mode_a1200 = { .pixclock = 192308, .xres = 240, -@@ -88,6 +180,7 @@ +@@ -118,6 +210,7 @@ static void __init a1200_init(void) { set_pxa_fb_info(&a1200_fb_info); diff --git a/packages/linux/linux-ezx-2.6.21/patches/a1200-pcap.patch b/packages/linux/linux-ezx-2.6.21/patches/a1200-pcap.patch index 9bc17555cd..8aa1e46d73 100644 --- a/packages/linux/linux-ezx-2.6.21/patches/a1200-pcap.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/a1200-pcap.patch @@ -1,7 +1,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a1200.c 2007-06-28 22:44:12.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c 2007-06-28 22:45:56.000000000 -0300 +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a1200.c 2007-09-07 11:32:32.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c 2007-09-07 11:51:55.000000000 -0300 @@ -19,6 +19,7 @@ #include #include @@ -10,13 +10,43 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c #include "generic.h" -@@ -48,7 +49,40 @@ +@@ -48,7 +49,70 @@ .pxafb_lcd_power = &ezx_lcd_power, }; +/* PCAP */ +static int __init a1200_pcap_init(void) +{ ++ /* ++ * FIXME: this is the PCAP INITIAL STATE. ++ * most of these writes should NOT be done here ++ * * voltage regulators, voltage enablers should be set by the ++ * driver which uses the connected hardware. Otherwise you ++ * drain power unnecessarily. ++ * * interrupt related registers should be set by the irq functions ++ * only. I think that the INT_SEL register selects on which irq ++ * pin the (ap/bp) the irq goes. This should go on ezx-pcap.c, but ++ * only if it actually makes any difference. ++ * * Only power state automatic changes should be done here. ++ * (*LOWPWR, *STBY, LOWPWR*) ++ * * I removed some writes which i consider extremelly wrong. And ++ * which i think will not break anything (they were overwritten ++ * later anyway). ++ * ++ * --WM ++ */ ++ ezx_pcap_write(PCAP_REG_INT_SEL, 0x0); /* wrong */ ++ ezx_pcap_write(PCAP_REG_SWCTRL, 0x2ee6); /* partially wrong */ ++ ezx_pcap_write(PCAP_REG_VREG1, 0x15778e3); /* wrong */ ++ ezx_pcap_write(PCAP_REG_VREG2, 0x810234); /* partially wrong */ ++ ezx_pcap_write(PCAP_REG_AUXVREG, 0x1024bec); /* wrong */ ++ ezx_pcap_write(PCAP_REG_PWR, 0x94108); /* partially wrong */ ++ ezx_pcap_write(PCAP_REG_AUXVREG_MASK, 0x214d48); /* wrong */ ++ ezx_pcap_write(PCAP_REG_BUSCTRL, 0x2a0); /* wrong */ ++ ezx_pcap_write(PCAP_REG_LOWPWR, 0x1d9610c); ++ ezx_pcap_write(PCAP_REG_PERIPH, 0x0); /* wrong */ ++ ezx_pcap_write(PCAP_REG_GP, 0x107); /* probably unnecessary */ ++ + return 0; +} + diff --git a/packages/linux/linux-ezx-2.6.21/patches/a1200-ts.patch b/packages/linux/linux-ezx-2.6.21/patches/a1200-ts.patch index bcac76d16c..a8c8f2ee29 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/a1200-ts.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/a1200-ts.patch @@ -1,16 +1,16 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a1200.c 2007-06-28 22:54:35.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c 2007-06-28 22:55:00.000000000 -0300 -@@ -173,8 +173,33 @@ +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a1200.c 2007-09-07 11:54:52.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-a1200.c 2007-09-07 11:55:10.000000000 -0300 +@@ -203,8 +203,33 @@ }, }; +/* PCAP_TS */ +struct resource pcap_ts_resources[] = { + [0] = { -+ .start = EZX_IRQ_ADCDONE2, -+ .end = EZX_IRQ_ADCDONE2, ++ .start = EZX_IRQ_ADCDONE, ++ .end = EZX_IRQ_ADCDONE, + .flags = IORESOURCE_IRQ, + }, + [1] = { diff --git a/packages/linux/linux-ezx-2.6.21/patches/a780-emu.patch b/packages/linux/linux-ezx-2.6.21/patches/a780-emu.patch index 1477ce48ea..f6121c6e7f 100644 --- a/packages/linux/linux-ezx-2.6.21/patches/a780-emu.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/a780-emu.patch @@ -1,8 +1,8 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-01 19:46:15.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-01 19:52:09.000000000 -0300 -@@ -219,8 +219,33 @@ +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:02:13.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:03:16.000000000 -0300 +@@ -211,8 +211,33 @@ }, }; diff --git a/packages/linux/linux-ezx-2.6.21/patches/a780-flip.patch b/packages/linux/linux-ezx-2.6.21/patches/a780-flip.patch index 4c61a35ec2..88f15041db 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/a780-flip.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/a780-flip.patch @@ -1,7 +1,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-01 19:58:07.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-01 20:02:00.000000000 -0300 +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:58:17.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:59:03.000000000 -0300 @@ -17,6 +17,7 @@ #include #include @@ -10,7 +10,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c #include #include -@@ -319,10 +320,33 @@ +@@ -311,10 +312,33 @@ .resource = pcap_ts_resources, }; diff --git a/packages/linux/linux-ezx-2.6.21/patches/a780-kbd.patch b/packages/linux/linux-ezx-2.6.21/patches/a780-kbd.patch index 9f26b3dd94..d7d114cfed 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/a780-kbd.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/a780-kbd.patch @@ -1,7 +1,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-01 19:52:09.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-01 19:56:13.000000000 -0300 +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:03:16.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:05:18.000000000 -0300 @@ -16,6 +16,7 @@ #include #include @@ -24,7 +24,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c #ifdef CONFIG_EZX_PCAP extern int ezx_pcap_mmcsd_power(int); -@@ -243,6 +246,55 @@ +@@ -235,6 +238,55 @@ .resource = a780_emu_resources, }; @@ -80,7 +80,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c static struct platform_device *devices[] __initdata = { &a780_pcap_device, &a780_emu_device, -@@ -263,6 +315,7 @@ +@@ -255,6 +307,7 @@ set_pxa_fb_info(&a780_fb_info); pxa_set_mci_info(&a780_mci_platform_data); diff --git a/packages/linux/linux-ezx-2.6.21/patches/a780-leds.patch b/packages/linux/linux-ezx-2.6.21/patches/a780-leds.patch index ff7a0b3dab..e8336d8855 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/a780-leds.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/a780-leds.patch @@ -5,8 +5,8 @@ Index: linux-2.6.21/drivers/leds/Kconfig =================================================================== ---- linux-2.6.21.orig/drivers/leds/Kconfig 2007-08-01 19:38:44.000000000 -0300 -+++ linux-2.6.21/drivers/leds/Kconfig 2007-08-01 20:03:29.000000000 -0300 +--- linux-2.6.21.orig/drivers/leds/Kconfig 2007-08-31 22:27:41.000000000 -0300 ++++ linux-2.6.21/drivers/leds/Kconfig 2007-08-31 23:59:27.000000000 -0300 @@ -104,6 +104,13 @@ These triggers allow kernel events to drive the LEDs and can be configured via sysfs. If unsure, say Y. @@ -23,8 +23,8 @@ Index: linux-2.6.21/drivers/leds/Kconfig depends on LEDS_TRIGGERS Index: linux-2.6.21/drivers/leds/Makefile =================================================================== ---- linux-2.6.21.orig/drivers/leds/Makefile 2007-08-01 19:38:44.000000000 -0300 -+++ linux-2.6.21/drivers/leds/Makefile 2007-08-01 20:03:29.000000000 -0300 +--- linux-2.6.21.orig/drivers/leds/Makefile 2007-08-31 22:27:41.000000000 -0300 ++++ linux-2.6.21/drivers/leds/Makefile 2007-08-31 23:59:27.000000000 -0300 @@ -16,6 +16,7 @@ obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o obj-$(CONFIG_LEDS_H1940) += leds-h1940.o @@ -36,7 +36,7 @@ Index: linux-2.6.21/drivers/leds/Makefile Index: linux-2.6.21/drivers/leds/leds-a780.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.21/drivers/leds/leds-a780.c 2007-08-01 20:03:29.000000000 -0300 ++++ linux-2.6.21/drivers/leds/leds-a780.c 2007-08-31 23:59:27.000000000 -0300 @@ -0,0 +1,122 @@ +/* + * EZX Platform LED Driver for the Motorola A780 GSM Phone @@ -62,22 +62,22 @@ Index: linux-2.6.21/drivers/leds/leds-a780.c +{ + if ( value > 31 ) value = 31; + printk( KERN_DEBUG "a780led_main_set: %d\n", value ); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL_CTRL0, value & 0x01); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL_CTRL1, value & 0x02); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL_CTRL2, value & 0x04); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL_CTRL3, value & 0x08); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL_CTRL4, value & 0x10); ++ ezx_pcap_bit_set(PCAP_BIT_PERIPH_BL_CTRL0, value & 0x01); ++ ezx_pcap_bit_set(PCAP_BIT_PERIPH_BL_CTRL1, value & 0x02); ++ ezx_pcap_bit_set(PCAP_BIT_PERIPH_BL_CTRL2, value & 0x04); ++ ezx_pcap_bit_set(PCAP_BIT_PERIPH_BL_CTRL3, value & 0x08); ++ ezx_pcap_bit_set(PCAP_BIT_PERIPH_BL_CTRL4, value & 0x10); +} + +static void a780led_aux_set(struct led_classdev *led_cdev, enum led_brightness value) +{ + if ( value > 31 ) value = 31; + printk( KERN_DEBUG "a780led_aux_set: %d\n", value ); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL2_CTRL0, value & 0x01); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL2_CTRL1, value & 0x02); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL2_CTRL2, value & 0x04); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL2_CTRL3, value & 0x08); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL2_CTRL4, value & 0x10); ++ ezx_pcap_bit_set(PCAP_BIT_PERIPH_BL2_CTRL0, value & 0x01); ++ ezx_pcap_bit_set(PCAP_BIT_PERIPH_BL2_CTRL1, value & 0x02); ++ ezx_pcap_bit_set(PCAP_BIT_PERIPH_BL2_CTRL2, value & 0x04); ++ ezx_pcap_bit_set(PCAP_BIT_PERIPH_BL2_CTRL3, value & 0x08); ++ ezx_pcap_bit_set(PCAP_BIT_PERIPH_BL2_CTRL4, value & 0x10); +} + +static struct led_classdev a780_main_led = { @@ -162,9 +162,9 @@ Index: linux-2.6.21/drivers/leds/leds-a780.c +MODULE_LICENSE("GPL"); Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-01 20:02:00.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-01 20:03:29.000000000 -0300 -@@ -341,12 +341,20 @@ +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:59:03.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:59:27.000000000 -0300 +@@ -333,12 +333,20 @@ }, }; diff --git a/packages/linux/linux-ezx-2.6.21/patches/a780-mci.patch b/packages/linux/linux-ezx-2.6.21/patches/a780-mci.patch index 3cf1848502..1238c1cf71 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/a780-mci.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/a780-mci.patch @@ -1,7 +1,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-06-28 22:45:00.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-06-28 22:53:03.000000000 -0300 +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:01:54.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:02:13.000000000 -0300 @@ -14,6 +14,8 @@ #include #include @@ -114,7 +114,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c static struct pxafb_mode_info mode_a780 = { .pixclock = 150000, .xres = 240, -@@ -145,6 +237,7 @@ +@@ -137,6 +229,7 @@ PSLR = 0x05800f00; set_pxa_fb_info(&a780_fb_info); diff --git a/packages/linux/linux-ezx-2.6.21/patches/a780-pcap.patch b/packages/linux/linux-ezx-2.6.21/patches/a780-pcap.patch index 35417344e0..afb5d9c005 100644 --- a/packages/linux/linux-ezx-2.6.21/patches/a780-pcap.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/a780-pcap.patch @@ -1,7 +1,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-06-28 22:44:12.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-06-28 22:45:00.000000000 -0300 +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 22:33:03.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:01:17.000000000 -0300 @@ -20,6 +20,7 @@ #include #include @@ -10,7 +10,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c #include "generic.h" -@@ -49,7 +50,85 @@ +@@ -49,7 +50,77 @@ .pxafb_lcd_power = &ezx_lcd_power, }; @@ -18,49 +18,41 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c +static int __init a780_pcap_init(void) +{ + /* initialize PCAP registers */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL, 1); -+// ezx_pcap_vibrator_level(PCAP_VIBRATOR_VOLTAGE_LEVEL3); -+ + /* set SW1 sleep to keep SW1 1.3v in sync mode */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW1_MODE10, 0); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW1_MODE11, 0); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW1_MODE10, 0); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW1_MODE11, 0); + + /* SW1 active in sync mode */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW1_MODE00, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW1_MODE01, 0); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW1_MODE00, 1); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW1_MODE01, 0); + + /* at SW1 -core voltage to 1.30V */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW10_DVS, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW11_DVS, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW12_DVS, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW13_DVS, 0); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW10_DVS, 1); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW11_DVS, 1); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW12_DVS, 1); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW13_DVS, 0); + + /* when STANDY2 PIN ACTIVE (high) set V3-- sram V8 -- pll off */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V3_STBY, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V3_LOWPWR, 0); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V8_STBY, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V8_LOWPWR, 0); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V3_STBY, 1); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V3_LOWPWR, 0); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V8_STBY, 1); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V8_LOWPWR, 0); + + /* + * when STANDY2 PIN ACTIVE (high) set V4-- lcd only for e680 V6 --- + * camera for e680 + */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V4_STBY, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V4_LOWPWR, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V6_STBY, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V6_LOWPWR, 0); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V4_STBY, 1); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V4_LOWPWR, 1); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V6_STBY, 1); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V6_LOWPWR, 0); + + /* set Vc to low power mode when AP sleep */ -+// SSP_PCAP_bit_set( SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_VC_STBY); -+ -+ /* set VAUX2 to voltage 2.775V and low power mode when AP sleep */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_VAUX2_1, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_VAUX2_0, 0); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_VAUX2_STBY, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_VAUX2_LOWPWR, 1); -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_VAUX2_EN, 1); ++// SSP_PCAP_bit_set(PCAP_BIT_LOWPWR_CTRL_VC_STBY); + -+// PGSR(GPIO34_TXENB) |= GPIO_bit(GPIO34_TXENB); ++ /* set VAUX2 to low power mode when AP sleep */ ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_VAUX2_STBY, 1); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_VAUX2_LOWPWR, 1); + + return 0; +} diff --git a/packages/linux/linux-ezx-2.6.21/patches/a780-ts.patch b/packages/linux/linux-ezx-2.6.21/patches/a780-ts.patch index 7c455cfb3a..e7ca3c106a 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/a780-ts.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/a780-ts.patch @@ -1,8 +1,8 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-01 19:56:13.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-01 19:58:07.000000000 -0300 -@@ -295,9 +295,34 @@ +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:05:18.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:06:53.000000000 -0300 +@@ -287,9 +287,34 @@ }, }; diff --git a/packages/linux/linux-ezx-2.6.21/patches/a780-vibrator.patch b/packages/linux/linux-ezx-2.6.21/patches/a780-vibrator.patch index 7436c40f5f..aa903feea7 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/a780-vibrator.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/a780-vibrator.patch @@ -1,74 +1,26 @@ Index: linux-2.6.21/drivers/leds/leds-a780.c =================================================================== ---- linux-2.6.21.orig/drivers/leds/leds-a780.c 2007-05-08 15:09:26.000000000 -0300 -+++ linux-2.6.21/drivers/leds/leds-a780.c 2007-05-08 15:19:26.000000000 -0300 -@@ -18,10 +18,13 @@ - #include - #include - -+extern void ezx_pcap_vibrator_level(u_int32_t); -+ - static void a780led_main_set(struct led_classdev *led_cdev, enum led_brightness value) - { - if ( value > 31 ) value = 31; - printk( KERN_DEBUG "a780led_main_set: %d\n", value ); -+#warning FIXME: use read/write operations - ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL_CTRL0, value & 0x01); - ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL_CTRL1, value & 0x02); - ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL_CTRL2, value & 0x04); -@@ -33,6 +36,7 @@ - { - if ( value > 31 ) value = 31; - printk( KERN_DEBUG "a780led_aux_set: %d\n", value ); -+#warning FIXME: use read/write operations - ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL2_CTRL0, value & 0x01); - ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL2_CTRL1, value & 0x02); - ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL2_CTRL2, value & 0x04); -@@ -40,6 +44,43 @@ - ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_PERIPH_BL2_CTRL4, value & 0x10); +--- linux-2.6.21.orig/drivers/leds/leds-a780.c 2007-09-01 00:15:03.000000000 -0300 ++++ linux-2.6.21/drivers/leds/leds-a780.c 2007-09-01 00:23:39.000000000 -0300 +@@ -40,6 +40,17 @@ + ezx_pcap_bit_set(PCAP_BIT_PERIPH_BL2_CTRL4, value & 0x10); } +static void a780vibrator_set(struct led_classdev *led_cdev, enum led_brightness value) +{ -+ if ( value > 4 ) value = 4; ++ if (value > 4) value = 4; + printk( KERN_DEBUG "a780vibrator_set: %d\n", value ); -+ -+ switch(value) -+ { -+ case 0: -+ /* turn off vibrator */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_V_VIB_EN, 0); -+ break; -+ -+ case 1: -+ ezx_pcap_vibrator_level(PCAP_VIBRATOR_VOLTAGE_LEVEL0); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_V_VIB_EN, 1); -+ break; -+ -+ case 2: -+ ezx_pcap_vibrator_level(PCAP_VIBRATOR_VOLTAGE_LEVEL1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_V_VIB_EN, 1); -+ break; -+ -+ case 3: -+ ezx_pcap_vibrator_level(PCAP_VIBRATOR_VOLTAGE_LEVEL2); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_V_VIB_EN, 1); -+ break; -+ -+ case 4: -+ ezx_pcap_vibrator_level(PCAP_VIBRATOR_VOLTAGE_LEVEL3); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_V_VIB_EN, 1); -+ break; -+ -+ default: -+ break; -+ } ++ ezx_pcap_vibrator_level(value-1); ++ if (value == 0) ++ ezx_pcap_bit_set(PCAP_BIT_AUXVREG_V_VIB_EN, 0); ++ else ++ ezx_pcap_bit_set(PCAP_BIT_AUXVREG_V_VIB_EN, 1); +} + static struct led_classdev a780_main_led = { .name = "a780:main", .default_trigger = "none", -@@ -52,11 +93,18 @@ +@@ -52,11 +63,18 @@ .brightness_set = a780led_aux_set, }; @@ -87,7 +39,7 @@ Index: linux-2.6.21/drivers/leds/leds-a780.c return 0; } -@@ -64,6 +112,7 @@ +@@ -64,6 +82,7 @@ { led_classdev_resume(&a780_main_led); led_classdev_resume(&a780_aux_led); @@ -95,7 +47,7 @@ Index: linux-2.6.21/drivers/leds/leds-a780.c return 0; } #endif -@@ -77,8 +126,16 @@ +@@ -77,8 +96,16 @@ return ret; ret = led_classdev_register(&pdev->dev, &a780_aux_led); @@ -113,7 +65,7 @@ Index: linux-2.6.21/drivers/leds/leds-a780.c return ret; } -@@ -87,6 +144,7 @@ +@@ -87,6 +114,7 @@ { led_classdev_unregister(&a780_main_led); led_classdev_unregister(&a780_aux_led); @@ -121,19 +73,18 @@ Index: linux-2.6.21/drivers/leds/leds-a780.c return 0; } -@@ -111,6 +169,8 @@ +@@ -111,6 +139,7 @@ { a780led_main_set( &a780_main_led, 0 ); a780led_aux_set( &a780_aux_led, 0 ); + a780vibrator_set( &a780_vibrator, 0 ); -+ platform_driver_unregister(&a780led_driver); } Index: linux-2.6.21/drivers/leds/Kconfig =================================================================== ---- linux-2.6.21.orig/drivers/leds/Kconfig 2007-05-08 15:09:26.000000000 -0300 -+++ linux-2.6.21/drivers/leds/Kconfig 2007-05-08 15:09:26.000000000 -0300 +--- linux-2.6.21.orig/drivers/leds/Kconfig 2007-09-01 00:15:03.000000000 -0300 ++++ linux-2.6.21/drivers/leds/Kconfig 2007-09-01 00:15:08.000000000 -0300 @@ -105,11 +105,11 @@ be configured via sysfs. If unsure, say Y. diff --git a/packages/linux/linux-ezx-2.6.21/patches/asoc-fix-loopback.patch b/packages/linux/linux-ezx-2.6.21/patches/asoc-fix-loopback.patch new file mode 100644 index 0000000000..feea138984 --- /dev/null +++ b/packages/linux/linux-ezx-2.6.21/patches/asoc-fix-loopback.patch @@ -0,0 +1,14 @@ +Index: linux-2.6.21/sound/soc/pxa/pxa2xx-pcm.c +=================================================================== +--- linux-2.6.21.orig/sound/soc/pxa/pxa2xx-pcm.c 2007-09-02 22:30:56.000000000 -0300 ++++ linux-2.6.21/sound/soc/pxa/pxa2xx-pcm.c 2007-09-02 22:36:26.000000000 -0300 +@@ -153,7 +153,8 @@ + static int pxa2xx_pcm_prepare(struct snd_pcm_substream *substream) + { + struct pxa2xx_runtime_data *prtd = substream->runtime->private_data; +- ++ /* no dma if on loopback */ ++ if (!prtd->params) return 0; + DCSR(prtd->dma_ch) &= ~DCSR_RUN; + DCSR(prtd->dma_ch) = 0; + DCMD(prtd->dma_ch) = 0; diff --git a/packages/linux/linux-ezx-2.6.21/patches/asoc-pxa-ssp.patch b/packages/linux/linux-ezx-2.6.21/patches/asoc-pxa-ssp.patch index 1fc8283ca2..dd5b71a512 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/asoc-pxa-ssp.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/asoc-pxa-ssp.patch @@ -1,7 +1,7 @@ Index: linux-2.6.21/sound/soc/pxa/pxa2xx-ssp.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.21/sound/soc/pxa/pxa2xx-ssp.c 2007-05-14 21:14:38.000000000 -0300 ++++ linux-2.6.21/sound/soc/pxa/pxa2xx-ssp.c 2007-09-02 22:50:31.000000000 -0300 @@ -0,0 +1,671 @@ +/* + * pxa2xx-ssp.c -- ALSA Soc Audio Layer @@ -43,7 +43,7 @@ Index: linux-2.6.21/sound/soc/pxa/pxa2xx-ssp.c +#include "pxa2xx-pcm.h" +#include "pxa2xx-ssp.h" + -+#define PXA_SSP_DEBUG 1 ++#define PXA_SSP_DEBUG 0 + +/* + * The following should be defined in pxa-regs.h @@ -677,7 +677,7 @@ Index: linux-2.6.21/sound/soc/pxa/pxa2xx-ssp.c Index: linux-2.6.21/sound/soc/pxa/pxa2xx-ssp.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.21/sound/soc/pxa/pxa2xx-ssp.h 2007-05-14 21:14:38.000000000 -0300 ++++ linux-2.6.21/sound/soc/pxa/pxa2xx-ssp.h 2007-09-02 22:48:59.000000000 -0300 @@ -0,0 +1,42 @@ +/* + * linux/sound/arm/pxa2xx-ssp.h @@ -723,8 +723,8 @@ Index: linux-2.6.21/sound/soc/pxa/pxa2xx-ssp.h +#endif Index: linux-2.6.21/sound/soc/pxa/Kconfig =================================================================== ---- linux-2.6.21.orig/sound/soc/pxa/Kconfig 2007-05-14 21:16:22.000000000 -0300 -+++ linux-2.6.21/sound/soc/pxa/Kconfig 2007-05-14 21:17:01.000000000 -0300 +--- linux-2.6.21.orig/sound/soc/pxa/Kconfig 2007-09-02 22:48:51.000000000 -0300 ++++ linux-2.6.21/sound/soc/pxa/Kconfig 2007-09-02 22:50:18.000000000 -0300 @@ -20,6 +20,10 @@ config SND_PXA2XX_SOC_I2S tristate @@ -738,8 +738,8 @@ Index: linux-2.6.21/sound/soc/pxa/Kconfig depends on SND_PXA2XX_SOC && PXA_SHARP_C7xx Index: linux-2.6.21/sound/soc/pxa/Makefile =================================================================== ---- linux-2.6.21.orig/sound/soc/pxa/Makefile 2007-05-14 21:14:52.000000000 -0300 -+++ linux-2.6.21/sound/soc/pxa/Makefile 2007-05-14 21:16:10.000000000 -0300 +--- linux-2.6.21.orig/sound/soc/pxa/Makefile 2007-09-02 22:48:51.000000000 -0300 ++++ linux-2.6.21/sound/soc/pxa/Makefile 2007-09-02 22:50:18.000000000 -0300 @@ -2,10 +2,12 @@ snd-soc-pxa2xx-objs := pxa2xx-pcm.o snd-soc-pxa2xx-ac97-objs := pxa2xx-ac97.o diff --git a/packages/linux/linux-ezx-2.6.21/patches/e680-emu.patch b/packages/linux/linux-ezx-2.6.21/patches/e680-emu.patch index 572485dde6..3645aef040 100644 --- a/packages/linux/linux-ezx-2.6.21/patches/e680-emu.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/e680-emu.patch @@ -1,8 +1,8 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 19:53:13.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 19:55:54.000000000 -0300 -@@ -222,8 +222,33 @@ +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-09-06 00:47:32.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-09-06 00:48:06.000000000 -0300 +@@ -214,8 +214,33 @@ }, }; diff --git a/packages/linux/linux-ezx-2.6.21/patches/e680-kbd.patch b/packages/linux/linux-ezx-2.6.21/patches/e680-kbd.patch index 0d2047c2c1..ffd8bbb754 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/e680-kbd.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/e680-kbd.patch @@ -1,7 +1,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 19:55:54.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 19:56:21.000000000 -0300 +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-09-07 11:07:33.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-09-07 11:10:47.000000000 -0300 @@ -15,6 +15,7 @@ #include #include @@ -24,7 +24,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c #ifdef CONFIG_EZX_PCAP extern int ezx_pcap_mmcsd_power(int); -@@ -246,6 +249,58 @@ +@@ -238,6 +241,58 @@ .resource = e680_emu_resources, }; @@ -83,7 +83,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c static struct platform_device *devices[] __initdata = { &e680_pcap_device, &e680_emu_device, -@@ -266,6 +321,7 @@ +@@ -258,6 +313,7 @@ set_pxa_fb_info(&e680_fb_info); pxa_set_mci_info(&e680_mci_platform_data); diff --git a/packages/linux/linux-ezx-2.6.21/patches/e680-leds.patch b/packages/linux/linux-ezx-2.6.21/patches/e680-leds.patch index beffb28a04..72ba219a44 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/e680-leds.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/e680-leds.patch @@ -5,8 +5,8 @@ Index: linux-2.6.21/drivers/leds/Kconfig =================================================================== ---- linux-2.6.21.orig/drivers/leds/Kconfig 2007-08-01 20:03:29.000000000 -0300 -+++ linux-2.6.21/drivers/leds/Kconfig 2007-08-01 20:04:02.000000000 -0300 +--- linux-2.6.21.orig/drivers/leds/Kconfig 2007-09-06 00:49:29.000000000 -0300 ++++ linux-2.6.21/drivers/leds/Kconfig 2007-09-06 00:51:36.000000000 -0300 @@ -111,6 +111,13 @@ This option enables support for the LEDs on the Motorola A780 GSM Phone. @@ -23,8 +23,8 @@ Index: linux-2.6.21/drivers/leds/Kconfig depends on LEDS_TRIGGERS Index: linux-2.6.21/drivers/leds/Makefile =================================================================== ---- linux-2.6.21.orig/drivers/leds/Makefile 2007-08-01 20:03:29.000000000 -0300 -+++ linux-2.6.21/drivers/leds/Makefile 2007-08-01 20:04:02.000000000 -0300 +--- linux-2.6.21.orig/drivers/leds/Makefile 2007-09-06 00:49:29.000000000 -0300 ++++ linux-2.6.21/drivers/leds/Makefile 2007-09-06 00:49:30.000000000 -0300 @@ -17,6 +17,7 @@ obj-$(CONFIG_LEDS_H1940) += leds-h1940.o obj-$(CONFIG_LEDS_COBALT) += leds-cobalt.o @@ -36,7 +36,7 @@ Index: linux-2.6.21/drivers/leds/Makefile Index: linux-2.6.21/drivers/leds/leds-e680.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.21/drivers/leds/leds-e680.c 2007-08-01 20:04:02.000000000 -0300 ++++ linux-2.6.21/drivers/leds/leds-e680.c 2007-09-06 00:51:22.000000000 -0300 @@ -0,0 +1,235 @@ +/* + * EZX Platform LED Driver for the Motorola E680(i) GSM Phone @@ -154,7 +154,7 @@ Index: linux-2.6.21/drivers/leds/leds-e680.c + ledr_i = led_register_value[color].pcap_LEDR_I; + ledg_i = led_register_value[color].pcap_LEDG_I; + -+ ezx_pcap_read(SSP_PCAP_ADJ_PERIPH_REGISTER,&tempValue); ++ ezx_pcap_read(PCAP_REG_PERIPH,&tempValue); + + tempValue &= (~SSP_PCAP_LED_MASK); + @@ -166,7 +166,7 @@ Index: linux-2.6.21/drivers/leds/leds-e680.c + (ledg_ctrl << 6) | (ledr_i << 10) | (ledg_i << 12) | + (skip << 14)) & 0x7fff) << SSP_PCAP_LED_SHIFT; + -+ ezx_pcap_write(SSP_PCAP_ADJ_PERIPH_REGISTER,tempValue); ++ ezx_pcap_write(PCAP_REG_PERIPH,tempValue); +} + +static void e680led_keypad_set(struct led_classdev *led_cdev, enum led_brightness value) @@ -275,9 +275,9 @@ Index: linux-2.6.21/drivers/leds/leds-e680.c +MODULE_LICENSE("GPL"); Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 20:02:32.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 20:04:02.000000000 -0300 -@@ -347,11 +347,20 @@ +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-09-06 00:49:23.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-09-06 00:49:30.000000000 -0300 +@@ -339,11 +339,20 @@ }, }; diff --git a/packages/linux/linux-ezx-2.6.21/patches/e680-locksw.patch b/packages/linux/linux-ezx-2.6.21/patches/e680-locksw.patch index a0c1ebbfbe..e669a51957 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/e680-locksw.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/e680-locksw.patch @@ -1,7 +1,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 19:58:54.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 20:02:32.000000000 -0300 +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-09-06 00:48:32.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-09-06 00:49:23.000000000 -0300 @@ -16,6 +16,7 @@ #include #include @@ -10,7 +10,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c #include #include -@@ -325,10 +326,32 @@ +@@ -317,10 +318,32 @@ .resource = pcap_ts_resources, }; diff --git a/packages/linux/linux-ezx-2.6.21/patches/e680-mci.patch b/packages/linux/linux-ezx-2.6.21/patches/e680-mci.patch index 40b56b9b6c..7f0826163d 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/e680-mci.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/e680-mci.patch @@ -1,7 +1,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-06-28 22:45:27.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-06-28 22:53:10.000000000 -0300 +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-09-07 11:32:30.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-09-07 11:54:44.000000000 -0300 @@ -13,6 +13,8 @@ #include #include @@ -118,7 +118,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c static struct pxafb_mode_info mode_e680 = { .pixclock = 150000, .xres = 240, -@@ -144,6 +240,7 @@ +@@ -136,6 +232,7 @@ PSLR = 0x05800f00; set_pxa_fb_info(&e680_fb_info); diff --git a/packages/linux/linux-ezx-2.6.21/patches/e680-pcap.patch b/packages/linux/linux-ezx-2.6.21/patches/e680-pcap.patch index e974be9b4e..12ce023749 100644 --- a/packages/linux/linux-ezx-2.6.21/patches/e680-pcap.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/e680-pcap.patch @@ -1,7 +1,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-06-28 22:44:12.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-06-28 22:45:27.000000000 -0300 +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-09-06 00:41:38.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-09-06 00:44:56.000000000 -0300 @@ -19,6 +19,7 @@ #include #include @@ -10,7 +10,7 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c #include "generic.h" -@@ -48,7 +49,85 @@ +@@ -48,7 +49,77 @@ .pxafb_lcd_power = &ezx_lcd_power, }; @@ -18,49 +18,41 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c +static int __init e680_pcap_init(void) +{ + /* initialize PCAP registers */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL, 1); -+// ezx_pcap_vibrator_level(PCAP_VIBRATOR_VOLTAGE_LEVEL3); -+ + /* set SW1 sleep to keep SW1 1.3v in sync mode */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW1_MODE10, 0); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW1_MODE11, 0); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW1_MODE10, 0); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW1_MODE11, 0); + + /* SW1 active in sync mode */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW1_MODE00, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW1_MODE01, 0); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW1_MODE00, 1); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW1_MODE01, 0); + + /* at SW1 -core voltage to 1.30V */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW10_DVS, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW11_DVS, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW12_DVS, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_SW13_DVS, 0); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW10_DVS, 1); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW11_DVS, 1); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW12_DVS, 1); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_SW13_DVS, 0); + + /* when STANDY2 PIN ACTIVE (high) set V3-- sram V8 -- pll off */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V3_STBY, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V3_LOWPWR, 0); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V8_STBY, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V8_LOWPWR, 0); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V3_STBY, 1); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V3_LOWPWR, 0); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V8_STBY, 1); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V8_LOWPWR, 0); + + /* + * when STANDY2 PIN ACTIVE (high) set V4-- lcd only for e680 V6 --- + * camera for e680 + */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V4_STBY, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V4_LOWPWR, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V6_STBY, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_VREG2_V6_LOWPWR, 0); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V4_STBY, 1); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V4_LOWPWR, 1); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V6_STBY, 1); ++ ezx_pcap_bit_set(PCAP_BIT_VREG2_V6_LOWPWR, 0); + + /* set Vc to low power mode when AP sleep */ -+// SSP_PCAP_bit_set( SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_VC_STBY); -+ -+ /* set VAUX2 to voltage 2.775V and low power mode when AP sleep */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_VAUX2_1, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_VAUX2_0, 0); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_VAUX2_STBY, 1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_LOWPWR_CTRL_VAUX2_LOWPWR, 1); -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUX_VREG_VAUX2_EN, 1); ++// SSP_PCAP_bit_set( PCAP_BIT_LOWPWR_CTRL_VC_STBY); + -+// PGSR(GPIO34_TXENB) |= GPIO_bit(GPIO34_TXENB); ++ /* set VAUX2 to low power mode when AP sleep */ ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_VAUX2_STBY, 1); ++ ezx_pcap_bit_set(PCAP_BIT_LOWPWR_VAUX2_LOWPWR, 1); + + return 0; +} diff --git a/packages/linux/linux-ezx-2.6.21/patches/e680-ts.patch b/packages/linux/linux-ezx-2.6.21/patches/e680-ts.patch index 7a7a1be7fd..109623c68c 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/e680-ts.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/e680-ts.patch @@ -1,8 +1,8 @@ Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 19:56:21.000000000 -0300 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 19:58:54.000000000 -0300 -@@ -301,9 +301,34 @@ +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-09-07 11:10:47.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-09-07 11:11:01.000000000 -0300 +@@ -293,9 +293,34 @@ }, }; diff --git a/packages/linux/linux-ezx-2.6.21/patches/ezx-asoc.patch b/packages/linux/linux-ezx-2.6.21/patches/ezx-asoc.patch index 4b1f39b7d2..1dda2e544c 100644 --- a/packages/linux/linux-ezx-2.6.21/patches/ezx-asoc.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/ezx-asoc.patch @@ -1,10 +1,12 @@ Index: linux-2.6.21/sound/soc/codecs/pcap2.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.21/sound/soc/codecs/pcap2.c 2007-08-04 22:20:36.000000000 -0300 -@@ -0,0 +1,709 @@ ++++ linux-2.6.21/sound/soc/codecs/pcap2.c 2007-09-07 14:28:32.000000000 -0300 +@@ -0,0 +1,796 @@ +/* -+ * pcap2.c -- Template Codec Audio driver ++ * pcap2.c - PCAP2 ASIC Audio driver ++ * ++ * Copyright (C) 2007 Daniel Ribeiro + * + * 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 @@ -37,18 +39,19 @@ Index: linux-2.6.21/sound/soc/codecs/pcap2.c + +extern int ezx_pcap_write(u_int8_t, u_int32_t); +extern int ezx_pcap_read(u_int8_t, u_int32_t *); ++static struct snd_soc_device *pcap2_codec_socdev; + +/* + * Debug + */ + -+#define PCAP2_DEBUG 1 ++//#define PCAP2_DEBUG + +#ifdef PCAP2_DEBUG +#define dbg(format, arg...) \ + printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg) +#else -+#define dbg(format, arg...) do {} while (0) ++#define dbg(format, arg...) +#endif + +#define err(format, arg...) \ @@ -67,53 +70,89 @@ Index: linux-2.6.21/sound/soc/codecs/pcap2.c + + +/* -+ * write to the pcap2 codec register space ++ * ASoC limits register value to 16 bits and pcap uses 32 bit registers ++ * to work around this, we get 16 bits from low, mid or high positions. ++ * ASoC limits register number to 8 bits we use 0x1f for register ++ * number and 0xe0 for register offset. -WM + */ +static int pcap2_codec_write(struct snd_soc_codec *codec, unsigned int reg, + unsigned int value) +{ -+ dbg("codec_write reg=%08x, val=%08x", reg, value); -+ ezx_pcap_write(reg, value); ++ unsigned int tmp; ++ ++ ezx_pcap_read((reg & 0x1f), &tmp); ++ ++ if (reg & SL) { ++ tmp &= 0xffff0000; ++ tmp |= (value & 0xffff); ++ } ++ else if (reg & SM) { ++ tmp &= 0xff0000ff; ++ tmp |= ((value << 8) & 0x00ffff00); ++ } ++ else if (reg & SH) { ++ tmp &= 0xffff; ++ tmp |= ((value << 16) & 0xffff0000); ++ } ++ else ++ tmp = value; ++ ++ dbg("codec_write reg=%x, rval=%08x, fval=%08x", reg, tmp, value); ++ ezx_pcap_write((reg & 0x1f), tmp); + return 0; + +} + +static unsigned int pcap2_codec_read(struct snd_soc_codec *codec, unsigned int reg) +{ -+ unsigned int ret; -+ -+ ezx_pcap_read(reg, &ret); -+ dbg("codec_read reg=%08x, val=%08x", reg, ret); ++ unsigned int tmp, ret; ++ ++ ezx_pcap_read((reg & 0x1f), &tmp); ++ ret = tmp; ++ if (reg & SL) ++ ret = (tmp & 0xffff); ++ else if (reg & SM) ++ ret = ((tmp >> 8) & 0xffff); ++ else if (reg & SH) ++ ret = ((tmp >> 16) & 0xffff); ++ ++ dbg("codec_read reg=%x, rval=%08x, fval=%08x", reg, tmp, ret); + return(ret); + +} + -+static const char *pcap2_amp_output[] = {"R L Stereo", "RL", "RL3db", "RL6db"}; ++static const char *pcap2_output_select[] = {"2ch", "2->1ch", "2->1ch -3db", "2->1ch -6db"}; + +static const struct soc_enum pcap2_enum[] = { -+SOC_ENUM_SINGLE(PCAP2_OUTPUT_AMP, 19, 4, pcap2_amp_output), ++SOC_ENUM_SINGLE((PCAP2_OUTPUT_AMP|SH), 3, 4, pcap2_output_select), ++}; ++ ++static const struct snd_kcontrol_new pcap2_input_mixer_controls[] = { ++SOC_DAPM_SINGLE("A3 Switch", (PCAP2_INPUT_AMP|SL), 6, 1, 0), ++SOC_DAPM_SINGLE("A5 Switch", (PCAP2_INPUT_AMP|SL), 8, 1, 0), ++}; + ++static const struct snd_kcontrol_new pcap2_output_mixer_controls[] = { ++SOC_DAPM_SINGLE("A1 Switch", (PCAP2_OUTPUT_AMP|SL), 0, 1, 0), ++SOC_DAPM_SINGLE("A2 Switch", (PCAP2_OUTPUT_AMP|SL), 1, 1, 0), ++SOC_DAPM_SINGLE("AR Switch", (PCAP2_OUTPUT_AMP|SL), 5, 1, 0), ++SOC_DAPM_SINGLE("AL Switch", (PCAP2_OUTPUT_AMP|SL), 6, 1, 0), +}; + +/* pcap2 codec non DAPM controls */ +static const struct snd_kcontrol_new pcap2_codec_snd_controls[] = { -+SOC_SINGLE("Output gain", PCAP2_OUTPUT_AMP, 13, 15, 0), -+SOC_SINGLE("Input gain", PCAP2_INPUT_AMP, 0, 31, 0), -+SOC_SINGLE("louderspeaker sw", PCAP2_OUTPUT_AMP, 1, 1, 0), -+SOC_SINGLE("Earpiece switch", PCAP2_OUTPUT_AMP, 0, 1, 0), -+SOC_SINGLE("Earpctrl switch", PCAP2_OUTPUT_AMP, 17, 1, 0), -+SOC_SINGLE("Aright switch", PCAP2_OUTPUT_AMP, 5, 1, 0), -+SOC_SINGLE("Aleft switch", PCAP2_OUTPUT_AMP, 6, 1, 0), -+//SOC_SINGLE("AHS switch", PCAP2_INPUT_AMP, 14, 1, 0), -+//SOC_SINGLE("pga in switch", PCAP2_OUTPUT_AMP, 10, 1, 0), -+SOC_ENUM("Output mode", pcap2_enum[0]), ++SOC_SINGLE("Output gain", (PCAP2_OUTPUT_AMP|SM), 5, 15, 0), ++SOC_SINGLE("Input gain", (PCAP2_INPUT_AMP|SL), 0, 31, 0), ++}; ++ ++static const struct snd_kcontrol_new pcap2_codec_dm_mux_control[] = { ++ SOC_DAPM_ENUM("Output Mode", pcap2_enum[0]), +}; + +/* add non dapm controls */ +static int pcap2_codec_add_controls(struct snd_soc_codec *codec) +{ + int err, i; -+ dbg("pcap2_codec_add_controls"); + + for (i = 0; i < ARRAY_SIZE(pcap2_codec_snd_controls); i++) { + if ((err = snd_ctl_add(codec->card, @@ -126,13 +165,67 @@ Index: linux-2.6.21/sound/soc/codecs/pcap2.c + +/* pcap2 codec DAPM controls */ +static const struct snd_soc_dapm_widget pcap2_codec_dapm_widgets[] = { ++ SND_SOC_DAPM_DAC("ST_DAC", "ST_DAC playback", SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_DAC("CDC_DAC", "CDC_DAC playback", SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_ADC("CDC_ADC", "CDC_DAC capture", SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_PGA("PGA_ST", (PCAP2_OUTPUT_AMP|SL), 9, 0, NULL, 0), ++ SND_SOC_DAPM_PGA("PGA_CDC", (PCAP2_OUTPUT_AMP|SL), 8, 0, NULL, 0), ++ SND_SOC_DAPM_PGA("PGA_R", (PCAP2_OUTPUT_AMP|SL), 11, 0, NULL, 0), ++ SND_SOC_DAPM_PGA("PGA_L", (PCAP2_OUTPUT_AMP|SL), 12, 0, NULL, 0), ++ SND_SOC_DAPM_MUX("Downmixer", SND_SOC_NOPM, 0, 0, pcap2_codec_dm_mux_control), ++ SND_SOC_DAPM_PGA("PGA_A1CTRL", (PCAP2_OUTPUT_AMP|SH), 1, 1, NULL, 0), ++ SND_SOC_DAPM_MIXER("Output Mixer", SND_SOC_NOPM, 0, 0, &pcap2_output_mixer_controls[0], ARRAY_SIZE(pcap2_output_mixer_controls)), ++ SND_SOC_DAPM_OUTPUT("A1"), /* Earpiece */ ++ SND_SOC_DAPM_OUTPUT("A2"), /* LoudSpeaker */ ++ SND_SOC_DAPM_OUTPUT("AR"), /* headset right */ ++ SND_SOC_DAPM_OUTPUT("AL"), /* headset left */ ++ ++ SND_SOC_DAPM_MICBIAS("BIAS1", (PCAP2_INPUT_AMP|SL), 10, 0), ++ SND_SOC_DAPM_MICBIAS("BIAS2", (PCAP2_INPUT_AMP|SL), 11, 0), ++ SND_SOC_DAPM_MIXER("Input Mixer", SND_SOC_NOPM, 0, 0, &pcap2_input_mixer_controls[0], ARRAY_SIZE(pcap2_input_mixer_controls)), ++ SND_SOC_DAPM_INPUT("A3"), /* Headset Mic */ ++ SND_SOC_DAPM_INPUT("A5"), /* Builtin Mic */ +}; + -+/* -+ * template codec audio interconnectiosn between sink and source. -+ */ +static const char *audio_map[][3] = { ++ { "A1", NULL, "Output Mixer" }, ++ { "A2", NULL, "Output Mixer" }, ++ { "AR", NULL, "Output Mixer" }, ++ { "AL", NULL, "Output Mixer" }, ++ ++ { "Output Mixer", "A1 Switch", "PGA_A1CTRL" }, ++ { "Output Mixer", "A2 Switch", "Downmixer" }, ++ { "Output Mixer", "AR Switch", "PGA_R" }, ++ { "Output Mixer", "AL Switch", "PGA_L" }, ++ ++ { "PGA_A1CTRL", NULL, "Downmixer" }, ++ ++ { "Downmixer", "2->1ch", "PGA_L" }, ++ { "Downmixer", "2->1ch", "PGA_R" }, ++ { "Downmixer", "2->1ch -3db", "PGA_L" }, ++ { "Downmixer", "2->1ch -3db", "PGA_R" }, ++ { "Downmixer", "2->1ch -6db", "PGA_L" }, ++ { "Downmixer", "2->1ch -6db", "PGA_R" }, ++ { "Downmixer", "2ch", "PGA_R" }, ++ ++ { "PGA_R", NULL, "PGA_ST" }, ++ { "PGA_L", NULL, "PGA_ST" }, ++ { "PGA_R", NULL, "PGA_CDC" }, ++ ++ { "PGA_ST", NULL, "ST_DAC" }, ++ { "PGA_CDC", NULL, "CDC_DAC" }, ++ ++ /* input path */ ++ { "BIAS1", NULL, "A3" }, ++ { "BIAS2", NULL, "A5" }, + ++ { "Input Mixer", "A3 Switch", "BIAS1" }, ++ { "Input Mixer", "A5 Switch", "BIAS2" }, ++ ++ { "PGA_R", NULL, "Input Mixer" }, ++ ++ { "PGA_CDC", NULL, "PGA_R" }, ++ { "CDC_ADC", NULL, "PGA_CDC" }, + + /* terminator */ + {NULL, NULL, NULL}, @@ -141,7 +234,6 @@ Index: linux-2.6.21/sound/soc/codecs/pcap2.c +static int pcap2_codec_add_widgets(struct snd_soc_codec *codec) +{ + int i; -+ dbg("pcap2_codec_add_widgets"); + + for(i = 0; i < ARRAY_SIZE(pcap2_codec_dapm_widgets); i++) { + snd_soc_dapm_new_control(codec, &pcap2_codec_dapm_widgets[i]); @@ -157,118 +249,213 @@ Index: linux-2.6.21/sound/soc/codecs/pcap2.c + return 0; +} + -+/* -+ * Alsa operations -+ * Only implement the required operations for your platform. -+ * These operations are specific to the codec only. -+ */ -+ -+ /* -+ * Called by ALSA when a PCM substream is opened, private data can be allocated. -+ */ -+static int pcap2mono_codec_startup(struct snd_pcm_substream *substream) ++static int pcap2_codec_dapm_event(struct snd_soc_codec *codec, int event) +{ -+ dbg("pcap2 codec startup"); ++ unsigned int input = pcap2_codec_read(codec, PCAP2_INPUT_AMP); + ++ input &= ~PCAP2_INPUT_AMP_LOWPWR; ++ ++ switch (event) { ++ case SNDRV_CTL_POWER_D0: ++ case SNDRV_CTL_POWER_D1: ++ case SNDRV_CTL_POWER_D2: ++ case SNDRV_CTL_POWER_D3hot: /* Off, with power */ ++ dbg("dapm: ON\n"); ++ break; ++ case SNDRV_CTL_POWER_D3cold: /* Off, without power */ ++ input |= PCAP2_INPUT_AMP_LOWPWR; ++ dbg("dapm: OFF\n"); ++ break; ++ } ++ codec->dapm_state = event; ++ pcap2_codec_write(codec, PCAP2_INPUT_AMP, input); + return 0; +} + -+/* -+ * Called by ALSA when a PCM substream is closed. Private data can be -+ * freed here. -+ */ -+static int pcap2mono_codec_shutdown(struct snd_pcm_substream *substream) ++static int pcap2_hw_params(struct snd_pcm_substream *substream, ++ struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; -+ struct snd_soc_device *socdev = rtd->socdev; -+ struct snd_soc_codec *codec = socdev->codec; ++ struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai; ++ struct snd_soc_codec *codec = codec_dai->codec; ++ unsigned int tmp; + -+ dbg("pcap2mono codec shutdown"); ++ if (codec_dai->id == PCAP2_STEREO_DAI) { ++ tmp = pcap2_codec_read(codec, PCAP2_ST_DAC); + -+ pcap2_codec_write(codec, PCAP2_CODEC, 0); -+ return 0; -+} ++ tmp &= ~PCAP2_ST_DAC_RATE_MASK; ++ switch(params_rate(params)) { ++ case 8000: ++ break; ++ case 11025: ++ tmp |= PCAP2_ST_DAC_RATE_11025; ++ break; ++ case 12000: ++ tmp |= PCAP2_ST_DAC_RATE_12000; ++ break; ++ case 16000: ++ tmp |= PCAP2_ST_DAC_RATE_16000; ++ break; ++ case 22050: ++ tmp |= PCAP2_ST_DAC_RATE_22050; ++ break; ++ case 24000: ++ tmp |= PCAP2_ST_DAC_RATE_24000; ++ break; ++ case 32000: ++ tmp |= PCAP2_ST_DAC_RATE_32000; ++ break; ++ case 44100: ++ tmp |= PCAP2_ST_DAC_RATE_44100; ++ break; ++ case 48000: ++ tmp |= PCAP2_ST_DAC_RATE_48000; ++ break; ++ default: ++ return -EINVAL; ++ } ++ tmp |= PCAP2_ST_DAC_RESET_DF; ++ pcap2_codec_write(codec, PCAP2_ST_DAC, tmp); ++ } ++ else { ++ tmp = pcap2_codec_read(codec, PCAP2_CODEC); + -+/* -+ * Called by ALSA when the hardware params are set by application. This -+ * function can also be called multiple times and can allocate buffers -+ * (using snd_pcm_lib_* ). It's non-atomic. -+ */ -+static int pcap2mono_codec_hw_params(struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *params) -+{ -+// u_int32_t tmp; -+ dbg("pcap2mono_codec_hw_params"); ++ tmp &= ~PCAP2_CODEC_RATE_MASK; ++ switch(params_rate(params)) { ++ case 8000: ++ break; ++ case 16000: ++ tmp |= PCAP2_CODEC_RATE_16000; ++ break; ++ default: ++ return -EINVAL; ++ } ++ tmp |= PCAP2_CODEC_RESET_DF; ++ pcap2_codec_write(codec, PCAP2_CODEC, tmp); ++ } + + return 0; +} + -+/* -+ * Free's resources allocated by hw_params, can be called multiple times -+ */ -+static int pcap2mono_codec_hw_free(struct snd_pcm_substream *substream) ++static int pcap2_hw_free(struct snd_pcm_substream *substream) +{ -+ dbg("pcap2mono_codec_hw_free"); -+ return 0; -+} ++ struct snd_soc_pcm_runtime *rtd = substream->private_data; ++ struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai; ++ struct snd_soc_codec *codec = codec_dai->codec; ++ struct snd_soc_dapm_widget *w; ++ unsigned int tmp; + -+static int pcap2_set_dai_sysclk(struct snd_soc_codec_dai *codec_dai, -+ int clk_id, unsigned int freq, int dir) -+{ ++ if (codec_dai->id == PCAP2_STEREO_DAI) { ++ snd_soc_dapm_set_endpoint(codec, "ST_DAC", 0); ++ tmp = pcap2_codec_read(codec, PCAP2_ST_DAC); ++ tmp &= ~(PCAP2_ST_DAC_EN | PCAP2_ST_DAC_CLK_EN); ++ pcap2_codec_write(codec, PCAP2_ST_DAC, tmp); ++ } ++ else { ++ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ++ snd_soc_dapm_set_endpoint(codec, "CDC_DAC", 0); ++ else ++ snd_soc_dapm_set_endpoint(codec, "CDC_ADC", 0); ++ list_for_each_entry(w, &codec->dapm_widgets, list) { ++ if ((!strcmp(w->name, "CDC_DAC") || !strcmp(w->name, "CDC_ADC")) && w->connected) ++ goto in_use; ++ } ++ tmp = pcap2_codec_read(codec, PCAP2_CODEC); ++ tmp &= ~(PCAP2_CODEC_EN | PCAP2_CODEC_CLK_EN); ++ pcap2_codec_write(codec, PCAP2_CODEC, tmp); ++ } ++in_use: ++ snd_soc_dapm_sync_endpoints(codec); + -+ dbg("pcap2 set dai sysclk"); + return 0; +} + -+static int pcap2_set_dai_pll(struct snd_soc_codec_dai *codec_dai, -+ int pll_id, unsigned int freq_in, unsigned int freq_out) ++static int pcap2_set_dai_sysclk(struct snd_soc_codec_dai *codec_dai, ++ int clk_id, unsigned int freq, int dir) +{ + struct snd_soc_codec *codec = codec_dai->codec; -+ u_int32_t tmp; -+ -+ dbg("pcap2 set dai pll"); + ++ unsigned int tmp; + if (codec_dai->id == PCAP2_STEREO_DAI) { + /* ST_DAC */ -+ dbg("stereo codec not supported yet."); -+ return -ENODEV; ++ ++ tmp = pcap2_codec_read(codec, PCAP2_ST_DAC); ++ ++ tmp &= ~PCAP2_ST_DAC_CLKSEL_MASK; ++ switch (clk_id) { ++ case PCAP2_CLK_AP: ++ tmp |= PCAP2_ST_DAC_CLKSEL_AP; ++ break; ++ case PCAP2_CLK_BP: ++ break; ++ default: ++ return -ENODEV; ++ } ++ ++ tmp &= ~PCAP2_ST_DAC_CLK_MASK; ++ switch (freq) { ++ case 13000000: ++ break; ++/* case 15M36: ++ tmp |= PCAP2_ST_DAC_CLK_15M36; ++ break; ++ case 16M8: ++ tmp |= PCAP2_ST_DAC_CLK_16M8; ++ break; ++ case 19M44: ++ tmp |= PCAP2_ST_DAC_CLK_19M44; ++ break; ++*/ case 26000000: ++ tmp |= PCAP2_ST_DAC_CLK_26M; ++ break; ++/* case EXT_MCLK: ++ tmp |= PCAP2_ST_DAC_CLK_MCLK; ++ break; ++ case FSYNC: ++ tmp |= PCAP2_ST_DAC_CLK_FSYNC; ++ break; ++ case BITCLK: ++ tmp |= PCAP2_ST_DAC_CLK_BITCLK; ++ break; ++*/ default: ++ return -EINVAL; ++ } ++ pcap2_codec_write(codec, PCAP2_ST_DAC, tmp); + } + else { + /* MONO_DAC */ + tmp = pcap2_codec_read(codec, PCAP2_CODEC); + -+ tmp &= ~0x10000; -+ switch (pll_id) { -+ case PCAP2_PLL_AP: -+ tmp |= 0x10000; ++ tmp &= ~PCAP2_CODEC_CLKSEL_MASK; ++ switch (clk_id) { ++ case PCAP2_CLK_AP: ++ tmp |= PCAP2_CODEC_CLKSEL_AP; + break; -+ case PCAP2_PLL_BP: ++ case PCAP2_CLK_BP: + break; + default: + return -ENODEV; + } + -+ tmp &= ~0x1c0; -+ switch (freq_in) { ++ tmp &= ~PCAP2_CODEC_CLK_MASK; ++ switch (freq) { + case 13000000: + break; +/* case 15M36: -+ tmp |= 0x40; ++ tmp |= PCAP2_CODEC_CLK_15M36; + break; + case 16M8: -+ tmp |= 0x80; ++ tmp |= PCAP2_CODEC_CLK_16M8; + break; + case 19M44: -+ tmp |= 0xc0; ++ tmp |= PCAP2_CODEC_CLK_19M44; + break; +*/ case 26000000: -+ tmp |= 0x100; ++ tmp |= PCAP2_CODEC_CLK_26M; + break; + default: + return -EINVAL; + } -+ -+ + pcap2_codec_write(codec, PCAP2_CODEC, tmp); + } + return 0; @@ -278,26 +465,19 @@ Index: linux-2.6.21/sound/soc/codecs/pcap2.c + unsigned int fmt) +{ + struct snd_soc_codec *codec = codec_dai->codec; -+ u_int32_t tmp = 0; -+ -+ dbg("pcap2_set_dai_fmt"); ++ unsigned int tmp = 0; + + if (codec_dai->id == PCAP2_STEREO_DAI) { + /* ST_DAC */ -+ dbg("stereo codec not supported yet."); -+ return -ENODEV; -+ } -+ else { -+ /* MONO_DAC */ + -+ /* disable ST_DAC */ -+ pcap2_codec_write(codec, PCAP2_ST_DAC, 0); ++ /* disable CODEC */ ++ pcap2_codec_write(codec, PCAP2_CODEC, 0); + + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBM_CFM: + break; + case SND_SOC_DAIFMT_CBS_CFS: -+ tmp |= 0x2; ++ tmp |= 0x1; + break; + default: + return -EINVAL; @@ -320,6 +500,50 @@ Index: linux-2.6.21/sound/soc/codecs/pcap2.c + case SND_SOC_DAIFMT_IB_IF: + break; + case SND_SOC_DAIFMT_NB_NF: ++ tmp |= 0x60000; ++ break; ++ case SND_SOC_DAIFMT_IB_NF: ++ tmp |= 0x40000; ++ break; ++ case SND_SOC_DAIFMT_NB_IF: ++ tmp |= 0x20000; ++ break; ++ } ++ /* set dai to AP */ ++ tmp |= 0x1000; ++ ++ /* set BCLK */ ++ tmp |= 0x18000; ++ ++ pcap2_codec_write(codec, PCAP2_ST_DAC, tmp); ++ } ++ else { ++ /* MONO_DAC */ ++ ++ /* disable ST_DAC */ ++ pcap2_codec_write(codec, PCAP2_ST_DAC, 0); ++ ++ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { ++ case SND_SOC_DAIFMT_CBM_CFM: ++ break; ++ case SND_SOC_DAIFMT_CBS_CFS: ++ tmp |= 0x2; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { ++ case SND_SOC_DAIFMT_DSP_B: ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ switch (fmt & SND_SOC_DAIFMT_INV_MASK) { ++ case SND_SOC_DAIFMT_IB_IF: ++ break; ++ case SND_SOC_DAIFMT_NB_NF: + tmp |= 0x600; + break; + case SND_SOC_DAIFMT_IB_NF: @@ -333,173 +557,44 @@ Index: linux-2.6.21/sound/soc/codecs/pcap2.c + /* set dai to AP */ + tmp |= 0x8000; + ++ tmp |= 0x5; /* IHF / OHF */ ++ + pcap2_codec_write(codec, PCAP2_CODEC, tmp); + } + return 0; +} + ++static int pcap2_prepare(struct snd_pcm_substream *substream) ++{ + -+#if 0 -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A1_CONFIG, 1); -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG, 1); -+ -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_CLK_EN, 0); -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_EN, 0); -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_SMB_ST_DAC,1); -+ -+// dbg ("configure pcap to use ap clock"); -+// OSCC |= 0x00000008; -+// pxa_gpio_mode(AP_13MHZ_OUTPUT_PIN | GPIO_ALT_FN_3_OUT); -+ -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_IN_SEL, 1); -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_CLK_IN_SEL, 1); -+ -+ -+ -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_V2_EN_2, 1); -+ -+ -+ -+ -+ /* configure bitclk, pllclock, mode */ -+ ezx_pcap_write(PCAP2_ST_DAC, 0); -+ -+ tmp = PCAP_CDC_CLK_IN_13M0; -+ ezx_pcap_write(PCAP2_CODEC, tmp); -+ -+ /* codec 0=master 1=slave */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_SMB, 0); -+ -+ /* bitrate 0=8k 1=16k */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_FS_8K_16K, 0); -+ -+ /* clock source */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_IN_SEL,1); -+ -+ /* dai select 0=neptune 1=pxa */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DIG_AUD_IN,1); -+ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_AUDIHPF,1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_AUDOHPF,1); -+ -+ /* clock/frame inv */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_INV,0); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_FS_INV,0); -+ -+ /*(3) reset digital filter(DF_RESET=1) */ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DF_RESET,1); -+ -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_ADITH,0); -+ -+ /* (4) enable pcap clk(CDC_CLK_EN=1),enable CODEC(CDC_EN=1) */ -+ -+// ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_CD_BYP,0); -+ -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_CLK_EN,1); -+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN,1); ++ struct snd_soc_pcm_runtime *rtd = substream->private_data; ++ struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai; ++ struct snd_soc_codec *codec = codec_dai->codec; ++ unsigned int tmp; ++ /* FIXME enable clock only if codec is master */ ++ if (codec_dai->id == PCAP2_STEREO_DAI) { ++ snd_soc_dapm_set_endpoint(codec, "ST_DAC", 1); ++ snd_soc_dapm_set_endpoint(codec, "CDC_DAC", 0); ++ snd_soc_dapm_set_endpoint(codec, "CDC_ADC", 0); ++ tmp = pcap2_codec_read(codec, PCAP2_ST_DAC); ++ tmp |= (PCAP2_ST_DAC_EN | PCAP2_ST_DAC_CLK_EN); ++ pcap2_codec_write(codec, PCAP2_ST_DAC, tmp); ++ } ++ else { ++ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ++ snd_soc_dapm_set_endpoint(codec, "CDC_DAC", 1); ++ else ++ snd_soc_dapm_set_endpoint(codec, "CDC_ADC", 1); ++ snd_soc_dapm_set_endpoint(codec, "ST_DAC", 0); ++ tmp = pcap2_codec_read(codec, PCAP2_CODEC); ++ tmp |= (PCAP2_CODEC_EN | P