summaryrefslogtreecommitdiff
path: root/packages/linux/linux-ezx-2.6.23/patches/a780-mci.patch
diff options
context:
space:
mode:
authorKoen Kooi <koen@openembedded.org>2007-10-31 13:46:47 +0000
committerKoen Kooi <koen@openembedded.org>2007-10-31 13:46:47 +0000
commit44cbb9985f111ce87e6990061c89e2e061b6c6ea (patch)
treef26c7f7df66d468547e5b5cc8ba8dc328c44f08d /packages/linux/linux-ezx-2.6.23/patches/a780-mci.patch
parent43b6ecbcb39354a32e0b8dd7c02ec8789be0ab9a (diff)
parent821528ad116a72c2323d88d21e979614c78f1b41 (diff)
propagate from branch 'org.openembedded.dev' (head a6b798a43c05aef43ed650ab880f3edd386d0aa3)
to branch 'org.openembedded.dev.avr32' (head 77e1041de2eef682f183f3f5199826818cb9c5b1)
Diffstat (limited to 'packages/linux/linux-ezx-2.6.23/patches/a780-mci.patch')
-rw-r--r--packages/linux/linux-ezx-2.6.23/patches/a780-mci.patch125
1 files changed, 125 insertions, 0 deletions
diff --git a/packages/linux/linux-ezx-2.6.23/patches/a780-mci.patch b/packages/linux/linux-ezx-2.6.23/patches/a780-mci.patch
new file mode 100644
index 0000000000..1e427b33f9
--- /dev/null
+++ b/packages/linux/linux-ezx-2.6.23/patches/a780-mci.patch
@@ -0,0 +1,125 @@
+Index: linux-2.6.23/arch/arm/mach-pxa/ezx-a780.c
+===================================================================
+--- linux-2.6.23.orig/arch/arm/mach-pxa/ezx-a780.c 2007-10-23 12:38:08.000000000 +0200
++++ linux-2.6.23/arch/arm/mach-pxa/ezx-a780.c 2007-10-23 12:44:42.000000000 +0200
+@@ -14,6 +14,9 @@
+ #include <linux/init.h>
+ #include <linux/platform_device.h>
+ #include <linux/fb.h>
++#include <linux/mmc/host.h>
++#include <linux/irq.h>
++#include <linux/log2.h>
+
+ #include <asm/mach-types.h>
+ #include <asm/mach/arch.h>
+@@ -21,12 +24,102 @@
+ #include <asm/arch/pxafb.h>
+ #include <asm/arch/ezx.h>
+ #include <asm/arch/ezx-pcap.h>
++#include <asm/arch/mmc.h>
+
+ #include "generic.h"
+
+ extern void ezx_lcd_power(int, struct fb_var_screeninfo *);
+ extern void ezx_backlight_power(int);
+
++#ifdef CONFIG_EZX_PCAP
++extern int ezx_pcap_mmcsd_power(int);
++extern void ezx_pcap_mmcsd_voltage(u_int32_t);
++#else
++#define ezx_pcap_mmcsd_voltage(x) {}
++#define ezx_pcap_mmcsd_power(x) {}
++#endif
++
++static struct pxamci_platform_data a780_mci_platform_data;
++
++static u_int8_t mmc_voltage[] = {
++ [ilog2(MMC_VDD_165_195)] = 6,
++ [ilog2(MMC_VDD_20_21)] = 7,
++ [ilog2(MMC_VDD_21_22)] = 8,
++ [ilog2(MMC_VDD_22_23)] = 8,
++ [ilog2(MMC_VDD_23_24)] = 9,
++ [ilog2(MMC_VDD_24_25)] = 9,
++ [ilog2(MMC_VDD_25_26)] = 10,
++ [ilog2(MMC_VDD_26_27)] = 10,
++ [ilog2(MMC_VDD_27_28)] = 11,
++ [ilog2(MMC_VDD_28_29)] = 11,
++ [ilog2(MMC_VDD_29_30)] = 12,
++ [ilog2(MMC_VDD_30_31)] = 12,
++ [ilog2(MMC_VDD_31_32)] = 13,
++ [ilog2(MMC_VDD_32_33)] = 13,
++ [ilog2(MMC_VDD_33_34)] = 14,
++ [ilog2(MMC_VDD_34_35)] = 14,
++ [ilog2(MMC_VDD_35_36)] = 15,
++};
++
++static int a780_mci_init(struct device *dev,
++ irqreturn_t (*ezx_detect_int)(int, void *),
++ void *data)
++{
++ int err;
++
++ /* Setup GPIO for PXA27x MMC/SD controller */
++ pxa_gpio_mode(GPIO32_MMCCLK_MD);
++ pxa_gpio_mode(GPIO112_MMCCMD_MD);
++ pxa_gpio_mode(GPIO92_MMCDAT0_MD);
++ pxa_gpio_mode(GPIO109_MMCDAT1_MD);
++ pxa_gpio_mode(GPIO110_MMCDAT2_MD);
++ pxa_gpio_mode(GPIO111_MMCDAT3_MD);
++
++ ezx_pcap_mmcsd_power(1);
++
++ a780_mci_platform_data.detect_delay = msecs_to_jiffies(250);
++
++ err = request_irq(0x49, ezx_detect_int, IRQF_DISABLED,
++ "MMC card detect", data);
++ if (err) {
++ printk(KERN_ERR "ezx_mci_detect: MMC/SD: can't request "
++ "MMC card detect IRQ\n");
++ return -1;
++ }
++
++ set_irq_type(0x0b, IRQT_BOTHEDGE);
++
++ return 0;
++}
++
++static void a780_mci_setpower(struct device *dev, unsigned int vdd)
++{
++ struct pxamci_platform_data* p_d = dev->platform_data;
++
++ if (( 1 << vdd) & p_d->ocr_mask)
++ ezx_pcap_mmcsd_voltage(mmc_voltage[vdd]);
++
++ ezx_pcap_mmcsd_power(1);
++}
++
++static void a780_mci_exit(struct device *dev, void *data)
++{
++ ezx_pcap_mmcsd_power(0);
++ free_irq(0x49, data);
++}
++
++static struct pxamci_platform_data a780_mci_platform_data = {
++ .ocr_mask = MMC_VDD_165_195|MMC_VDD_20_21|MMC_VDD_21_22
++ |MMC_VDD_22_23|MMC_VDD_23_24|MMC_VDD_24_25
++ |MMC_VDD_25_26|MMC_VDD_26_27|MMC_VDD_27_28
++ |MMC_VDD_28_29|MMC_VDD_29_30|MMC_VDD_30_31
++ |MMC_VDD_31_32|MMC_VDD_32_33|MMC_VDD_33_34
++ |MMC_VDD_34_35|MMC_VDD_35_36,
++ .init = a780_mci_init,
++ .setpower = a780_mci_setpower,
++ .exit = a780_mci_exit,
++};
++
+ static struct pxafb_mode_info mode_a780 = {
+ .pixclock = 150000,
+ .xres = 240,
+@@ -137,6 +230,7 @@
+ PSLR = 0x05800f00;
+
+ set_pxa_fb_info(&a780_fb_info);
++ pxa_set_mci_info(&a780_mci_platform_data);
+
+ /* clear EMU MUX1/MUX2 (low) to close the audio path to EMU */
+ pxa_gpio_mode(GPIO_EMU_MUX1|GPIO_OUT);