Index: kernel26/arch/arm/mach-pxa/magician/magician.c =================================================================== --- kernel26.orig/arch/arm/mach-pxa/magician/magician.c 2007-06-17 15:01:03.000000000 +0200 +++ kernel26/arch/arm/mach-pxa/magician/magician.c 2007-06-17 16:05:33.000000000 +0200 @@ -61,10 +61,7 @@ unsigned long flags; local_irq_save(flags); - if (mode & IR_OFF) - gpio_set_value(GPIO83_MAGICIAN_nIR_EN, 1); - else - gpio_set_value(GPIO83_MAGICIAN_nIR_EN, 0); + gpio_set_value(GPIO83_MAGICIAN_nIR_EN, mode & IR_OFF); local_irq_restore(flags); } @@ -216,7 +213,16 @@ .num_resources = ARRAY_SIZE(magician_cpld_resources), .resource = magician_cpld_resources, }; -EXPORT_SYMBOL(magician_cpld); + +/* Compatibility wrapper */ +void magician_egpio_set(int bit, int value) +{ + if (value) + magician_egpio_enable(&magician_cpld, bit); + else + magician_egpio_disable(&magician_cpld, bit); +} +EXPORT_SYMBOL(magician_egpio_set); /* * USB Device Controller Index: kernel26/arch/arm/mach-pxa/magician/magician_phone.c =================================================================== --- kernel26.orig/arch/arm/mach-pxa/magician/magician_phone.c 2007-06-17 15:10:35.000000000 +0200 +++ kernel26/arch/arm/mach-pxa/magician/magician_phone.c 2007-06-17 15:11:24.000000000 +0200 @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -32,8 +31,6 @@ MODULE_PARM_DESC(bootloader, "Start in radio bootloader mode"); #endif -extern struct platform_device magician_cpld; - int suspending; void *magician_gsm_ready; @@ -76,7 +73,7 @@ /* stop display to avoid interference? */ gpio_set_value(GPIO74_LCD_FCLK, 0); - magician_egpio_enable (&magician_cpld, EGPIO_NR_MAGICIAN_GSM_POWER); + magician_egpio_set (EGPIO_NR_MAGICIAN_GSM_POWER, 1); msleep (150); gpio_set_value(GPIO74_LCD_FCLK, 1); @@ -155,7 +152,7 @@ disable_irq_wake(gpio_to_irq(GPIO10_MAGICIAN_GSM_IRQ)); - magician_egpio_disable(&magician_cpld, EGPIO_NR_MAGICIAN_GSM_POWER); + magician_egpio_set(EGPIO_NR_MAGICIAN_GSM_POWER, 0); } static void magician_phone_configure (int state) Index: kernel26/arch/arm/mach-pxa/magician/magician_pm.c =================================================================== --- kernel26.orig/arch/arm/mach-pxa/magician/magician_pm.c 2007-06-17 15:10:33.000000000 +0200 +++ kernel26/arch/arm/mach-pxa/magician/magician_pm.c 2007-06-17 15:11:58.000000000 +0200 @@ -21,9 +21,6 @@ #include #include #include -#include - -extern struct platform_device magician_cpld; static int htc_bootloader = 0; /* Is the stock HTC bootloader installed? */ static u32 save[4]; @@ -147,7 +144,7 @@ resume = 1; if (PEDR == 0) { /* wince clears PEDR for CPLD interrupts */ - +#if 0 int irq = magician_cpld_get_wakeup_irq(&magician_cpld); switch(irq) { @@ -167,13 +164,14 @@ // update LED state here resume = 0; } +#endif } PEDR = 0xffffffff; if (resume == 0) { printk(KERN_NOTICE "magician_pm back to sleep (cs = %d)\n", - magician_cable_state(&magician_cpld)); + 12345/*magician_cable_state(&magician_cpld)*/); pxa_pm_enter(state); } Index: kernel26/include/asm-arm/arch-pxa/magician.h =================================================================== --- kernel26.orig/include/asm-arm/arch-pxa/magician.h 2007-06-17 15:02:14.000000000 +0200 +++ kernel26/include/asm-arm/arch-pxa/magician.h 2007-06-17 15:44:30.000000000 +0200 @@ -17,8 +17,8 @@ /* magician specific */ -#define GPIO0_MAGICIAN_KEY_POWER 0 -// 9 IN /* unknown input */ +#define GPIO0_MAGICIAN_KEY_POWER 0 +#define GPIO9_MAGICIAN_UNKNOWN 9 /* unknown input */ #define GPIO10_MAGICIAN_GSM_IRQ 10 #define GPIO11_MAGICIAN_GSM_OUT1 11 /* SILENCE? */ #define GPIO13_MAGICIAN_CPLD_IRQ 13 @@ -97,7 +97,7 @@ // 6 IN (reserved) PWR_CAP_1 // 7 IN (reserved) PWR_CAP_2 // 8 IN (reserved) PWR_CAP_3 -// 9 IN +#define GPIO9_MAGICIAN_UNKNOWN_MD (9 | GPIO_IN) #define GPIO10_MAGICIAN_GSM_IRQ_MD (10 | GPIO_IN) #define GPIO11_MAGICIAN_GSM_OUT1_MD (11 | GPIO_OUT) /* SILENCE? */ @@ -287,34 +287,32 @@ #define EGPIO_NR_MAGICIAN_LED_POWER 5 /* 0x200000 */ #define EGPIO_NR_MAGICIAN_GSM_RESET 6 /* 0x400000 */ #define EGPIO_NR_MAGICIAN_LCD_POWER 7 /* 0x800000 */ -#define EGPIO_NR_MAGICIAN_SPK_POWER (0+16) /* 0x0001 */ -#define EGPIO_NR_MAGICIAN_EP_POWER (1+16) /* 0x0002 */ -#define EGPIO_NR_MAGICIAN_IN_SEL0 (2+16) /* 0x0004 */ -#define EGPIO_NR_MAGICIAN_IN_SEL1 (3+16) /* 0x0008 */ -#define EGPIO_NR_MAGICIAN_MIC_POWER (4+16) /* 0x0010 */ -#define EGPIO_NR_MAGICIAN_CODEC_RESET (5+16) /* 0x0020 */ -#define EGPIO_NR_MAGICIAN_CODEC_POWER (6+16) /* 0x0040 */ -#define EGPIO_NR_MAGICIAN_BL_POWER (7+16) /* 0x0080 */ -#define EGPIO_NR_MAGICIAN_SD_POWER (0+32) /* 0x0100 */ -#define EGPIO_NR_MAGICIAN_CARKIT_MIC (1+32) /* 0x0200 */ -#define EGPIO_NR_MAGICIAN_UNKNOWN_WAVEDEV_DLL (2+32) /* 0x0400 */ -#define EGPIO_NR_MAGICIAN_FLASH_VPP (3+32) /* 0x0800 */ -#define EGPIO_NR_MAGICIAN_BL_POWER2 (4+32) /* 0x1000 */ -#define EGPIO_NR_MAGICIAN_CHARGE_EN (5+32) /* 0x2000 <-- set by wince SleepSetting if cable_state == 5 */ -#define EGPIO_NR_MAGICIAN_GSM_POWER (7+32) /* 0x8000 */ - -#define EGPIO_NR_MAGICIAN_CABLE_STATE_AC (0+64) /* 0x01 */ -#define EGPIO_NR_MAGICIAN_CABLE_STATE_USB (1+64) /* 0x01 */ - -#define EGPIO_NR_MAGICIAN_BOARD_ID0 (0+80) /* 0x01 */ -#define EGPIO_NR_MAGICIAN_BOARD_ID1 (1+80) /* 0x02 */ -#define EGPIO_NR_MAGICIAN_BOARD_ID2 (2+80) /* 0x04 */ -#define EGPIO_NR_MAGICIAN_LCD_SELECT (3+80) /* 0x08 */ -#define EGPIO_NR_MAGICIAN_nSD_READONLY (4+80) /* 0x10 */ +#define EGPIO_NR_MAGICIAN_SPK_POWER (0+1*8) /* 0x0001 */ +#define EGPIO_NR_MAGICIAN_EP_POWER (1+1*8) /* 0x0002 */ +#define EGPIO_NR_MAGICIAN_IN_SEL0 (2+1*8) /* 0x0004 */ +#define EGPIO_NR_MAGICIAN_IN_SEL1 (3+1*8) /* 0x0008 */ +#define EGPIO_NR_MAGICIAN_MIC_POWER (4+1*8) /* 0x0010 */ +#define EGPIO_NR_MAGICIAN_CODEC_RESET (5+1*8) /* 0x0020 */ +#define EGPIO_NR_MAGICIAN_CODEC_POWER (6+1*8) /* 0x0040 */ +#define EGPIO_NR_MAGICIAN_BL_POWER (7+1*8) /* 0x0080 */ +#define EGPIO_NR_MAGICIAN_SD_POWER (0+2*8) /* 0x0100 */ +#define EGPIO_NR_MAGICIAN_CARKIT_MIC (1+2*8) /* 0x0200 */ +#define EGPIO_NR_MAGICIAN_UNKNOWN_WAVEDEV_DLL (2+2*8) /* 0x0400 */ +#define EGPIO_NR_MAGICIAN_FLASH_VPP (3+2*8) /* 0x0800 */ +#define EGPIO_NR_MAGICIAN_BL_POWER2 (4+2*8) /* 0x1000 */ +#define EGPIO_NR_MAGICIAN_CHARGE_EN (5+2*8) /* 0x2000 <-- set by wince SleepSetting if cable_state == 5 */ +#define EGPIO_NR_MAGICIAN_GSM_POWER (7+2*8) /* 0x8000 */ + +#define EGPIO_NR_MAGICIAN_CABLE_STATE_AC (0+4*8) +#define EGPIO_NR_MAGICIAN_CABLE_STATE_USB (1+4*8) + +#define EGPIO_NR_MAGICIAN_BOARD_ID0 (0+5*8) +#define EGPIO_NR_MAGICIAN_BOARD_ID1 (1+5*8) +#define EGPIO_NR_MAGICIAN_BOARD_ID2 (2+5*8) +#define EGPIO_NR_MAGICIAN_LCD_SELECT (3+5*8) +#define EGPIO_NR_MAGICIAN_nSD_READONLY (4+5*8) /* Compatibility wrappers */ -extern int magician_egpio_get(int bit); extern void magician_egpio_set(int bit, int value); -extern int magician_egpio_to_irq(int bit); #endif /* _MAGICIAN_H_ */ Index: kernel26/sound/soc/pxa/magician.c =================================================================== --- kernel26.orig/sound/soc/pxa/magician.c 2007-06-17 15:14:03.000000000 +0200 +++ kernel26/sound/soc/pxa/magician.c 2007-06-17 15:16:41.000000000 +0200 @@ -29,7 +29,6 @@ #include #include #include -#include #include #include "../codecs/uda1380.h" #include "pxa2xx-pcm.h" @@ -50,7 +49,6 @@ static int magician_spk_switch = 1; static int magician_in_sel = MAGICIAN_MIC; -extern struct platform_device magician_cpld; static void magician_ext_control(struct snd_soc_codec *codec) { @@ -301,18 +299,13 @@ magician_in_sel = ucontrol->value.integer.value[0]; + magician_egpio_set(EGPIO_NR_MAGICIAN_IN_SEL0, 0); switch (magician_in_sel) { case MAGICIAN_MIC: - magician_egpio_disable(&magician_cpld, - EGPIO_NR_MAGICIAN_IN_SEL0); - magician_egpio_enable(&magician_cpld, - EGPIO_NR_MAGICIAN_IN_SEL1); + magician_egpio_set(EGPIO_NR_MAGICIAN_IN_SEL1, 1); break; case MAGICIAN_MIC_EXT: - magician_egpio_disable(&magician_cpld, - EGPIO_NR_MAGICIAN_IN_SEL0); - magician_egpio_disable(&magician_cpld, - EGPIO_NR_MAGICIAN_IN_SEL1); + magician_egpio_set(EGPIO_NR_MAGICIAN_IN_SEL1, 0); } return 1; @@ -320,34 +313,19 @@ static int magician_spk_power(struct snd_soc_dapm_widget *w, int event) { - if (SND_SOC_DAPM_EVENT_ON(event)) - magician_egpio_enable(&magician_cpld, - EGPIO_NR_MAGICIAN_SPK_POWER); - else - magician_egpio_disable(&magician_cpld, - EGPIO_NR_MAGICIAN_SPK_POWER); + magician_egpio_set(EGPIO_NR_MAGICIAN_SPK_POWER, SND_SOC_DAPM_EVENT_ON(event)); return 0; } static int magician_hp_power(struct snd_soc_dapm_widget *w, int event) { - if (SND_SOC_DAPM_EVENT_ON(event)) - magician_egpio_enable(&magician_cpld, - EGPIO_NR_MAGICIAN_EP_POWER); - else - magician_egpio_disable(&magician_cpld, - EGPIO_NR_MAGICIAN_EP_POWER); + magician_egpio_set(EGPIO_NR_MAGICIAN_EP_POWER, SND_SOC_DAPM_EVENT_ON(event)); return 0; } static int magician_mic_bias(struct snd_soc_dapm_widget *w, int event) { - if (SND_SOC_DAPM_EVENT_ON(event)) - magician_egpio_enable(&magician_cpld, - EGPIO_NR_MAGICIAN_MIC_POWER); - else - magician_egpio_disable(&magician_cpld, - EGPIO_NR_MAGICIAN_MIC_POWER); + magician_egpio_set(EGPIO_NR_MAGICIAN_MIC_POWER, SND_SOC_DAPM_EVENT_ON(event)); return 0; } @@ -477,12 +455,12 @@ if (!machine_is_magician()) return -ENODEV; - magician_egpio_enable(&magician_cpld, EGPIO_NR_MAGICIAN_CODEC_POWER); + magician_egpio_set(EGPIO_NR_MAGICIAN_CODEC_POWER, 1); /* we may need to have the clock running here - pH5 */ - magician_egpio_enable(&magician_cpld, EGPIO_NR_MAGICIAN_CODEC_RESET); + magician_egpio_set(EGPIO_NR_MAGICIAN_CODEC_RESET, 1); udelay(5); - magician_egpio_disable(&magician_cpld, EGPIO_NR_MAGICIAN_CODEC_RESET); + magician_egpio_set(EGPIO_NR_MAGICIAN_CODEC_RESET, 0); /* correct place? we'll need it to talk to the uda1380 */ request_module("i2c-pxa"); @@ -509,10 +487,10 @@ { platform_device_unregister(magician_snd_device); - magician_egpio_disable(&magician_cpld, EGPIO_NR_MAGICIAN_SPK_POWER); - magician_egpio_disable(&magician_cpld, EGPIO_NR_MAGICIAN_EP_POWER); - magician_egpio_disable(&magician_cpld, EGPIO_NR_MAGICIAN_MIC_POWER); - magician_egpio_disable(&magician_cpld, EGPIO_NR_MAGICIAN_CODEC_POWER); + magician_egpio_set(EGPIO_NR_MAGICIAN_SPK_POWER, 0); + magician_egpio_set(EGPIO_NR_MAGICIAN_EP_POWER, 0); + magician_egpio_set(EGPIO_NR_MAGICIAN_MIC_POWER, 0); + magician_egpio_set(EGPIO_NR_MAGICIAN_CODEC_POWER, 0); } module_init(magician_init); Index: kernel26/arch/arm/mach-pxa/magician/magician_lcd.c =================================================================== --- kernel26.orig/arch/arm/mach-pxa/magician/magician_lcd.c 2007-06-17 15:54:15.000000000 +0200 +++ kernel26/arch/arm/mach-pxa/magician/magician_lcd.c 2007-06-17 16:00:36.000000000 +0200 @@ -23,7 +23,6 @@ #include #include -#include #include #include #include @@ -87,8 +86,6 @@ .pxafb_lcd_power = toppoly_lcd_power, }; -extern struct platform_device magician_cpld; - static void samsung_lcd_power(int on, struct fb_var_screeninfo *si) { /* FIXME: implement samsung power switching */ @@ -106,14 +103,14 @@ pxa_gpio_mode(GPIO74_LCD_FCLK_MD); pxa_gpio_mode(GPIO75_LCD_LCLK_MD); // done by pxafb */ - magician_egpio_enable(&magician_cpld, EGPIO2_MAGICIAN_TOPPOLY_POWER); + magician_egpio_set(EGPIO2_MAGICIAN_TOPPOLY_POWER, 1); pxa_gpio_mode(GPIO104_MAGICIAN_LCD_POWER_1_MD); pxa_gpio_mode(GPIO104_MAGICIAN_LCD_POWER_1_MD); pxa_gpio_mode(GPIO104_MAGICIAN_LCD_POWER_1_MD); gpio_set_value(GPIO106_MAGICIAN_LCD_POWER_3, 1); udelay(2000); - magician_egpio_enable(&magician_cpld, EGPIO_NR_MAGICIAN_LCD_POWER); + magician_egpio_set(EGPIO_NR_MAGICIAN_LCD_POWER, 1); udelay(2000); /* LCCR0 = 0x04000081; // <-- already done by pxafb_enable_controller */ udelay(2000); @@ -129,7 +126,7 @@ gpio_set_value(GPIO104_MAGICIAN_LCD_POWER_1, 0); udelay(1000); gpio_set_value(GPIO106_MAGICIAN_LCD_POWER_3, 0); - magician_egpio_disable(&magician_cpld, EGPIO_NR_MAGICIAN_LCD_POWER); + magician_egpio_set(EGPIO_NR_MAGICIAN_LCD_POWER, 0); } } @@ -142,7 +139,7 @@ /* Check which LCD we have */ p = (volatile u8 *)ioremap_nocache(PXA_CS3_PHYS, 0x1000); if (p) { - lcd_select = p[14] & 0x8; + lcd_select = p[0x14] & 0x8; printk("magician_lcd: lcd_select = %d (%s)\n", lcd_select, lcd_select ? "samsung" : "toppoly"); iounmap((void *)p);