mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-12-01 13:05:18 +02:00
3953 lines
116 KiB
Diff
3953 lines
116 KiB
Diff
diff -ru linux-2.6/arch/mips/boot/Makefile /plain/src/qi/linux-2.6.27.git.svn/arch/mips/boot/Makefile
|
|
--- linux-2.6/arch/mips/boot/Makefile 2009-08-18 00:01:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/arch/mips/boot/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -7,6 +7,9 @@
|
|
# Copyright (C) 2004 Maciej W. Rozycki
|
|
#
|
|
|
|
+# This one must match the LOADADDR in arch/mips/Makefile!
|
|
+LOADADDR=0x80010000
|
|
+
|
|
#
|
|
# Some DECstations need all possible sections of an ECOFF executable
|
|
#
|
|
@@ -25,7 +28,7 @@
|
|
|
|
VMLINUX = vmlinux
|
|
|
|
-all: vmlinux.ecoff vmlinux.srec addinitrd
|
|
+all: vmlinux.ecoff vmlinux.srec addinitrd uImage zImage
|
|
|
|
vmlinux.ecoff: $(obj)/elf2ecoff $(VMLINUX)
|
|
$(obj)/elf2ecoff $(VMLINUX) vmlinux.ecoff $(E2EFLAGS)
|
|
@@ -42,8 +45,24 @@
|
|
$(obj)/addinitrd: $(obj)/addinitrd.c
|
|
$(HOSTCC) -o $@ $^
|
|
|
|
+uImage: $(VMLINUX) vmlinux.bin
|
|
+ rm -f $(obj)/vmlinux.bin.gz
|
|
+ gzip -9 $(obj)/vmlinux.bin
|
|
+ mkimage -A mips -O linux -T kernel -C gzip \
|
|
+ -a $(LOADADDR) -e $(shell sh ./$(obj)/tools/entry $(NM) $(VMLINUX) ) \
|
|
+ -n 'Linux-$(KERNELRELEASE)' \
|
|
+ -d $(obj)/vmlinux.bin.gz $(obj)/uImage
|
|
+ @echo ' Kernel: arch/mips/boot/$@ is ready'
|
|
+
|
|
+zImage:
|
|
+ $(Q)$(MAKE) $(build)=$(obj)/compressed loadaddr=$(LOADADDR) $@
|
|
+ @echo ' Kernel: arch/mips/boot/compressed/$@ is ready'
|
|
+
|
|
clean-files += addinitrd \
|
|
elf2ecoff \
|
|
vmlinux.bin \
|
|
vmlinux.ecoff \
|
|
- vmlinux.srec
|
|
+ vmlinux.srec \
|
|
+ vmlinux.bin.gz \
|
|
+ uImage \
|
|
+ zImage
|
|
diff -ru linux-2.6/arch/mips/Kconfig /plain/src/qi/linux-2.6.27.git.svn/arch/mips/Kconfig
|
|
--- linux-2.6/arch/mips/Kconfig 2009-08-18 00:01:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/arch/mips/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -19,6 +19,90 @@
|
|
prompt "System type"
|
|
default SGI_IP22
|
|
|
|
+config JZ4730_PMP
|
|
+ bool "Ingenic JZ4730 PMP board"
|
|
+ select DMA_NONCOHERENT
|
|
+ select SYS_HAS_CPU_MIPS32_R1
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+ select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
+ select SOC_JZ4730
|
|
+
|
|
+config JZ4740_PAVO
|
|
+ bool "Ingenic JZ4740 PAVO board"
|
|
+ select DMA_NONCOHERENT
|
|
+ select SYS_HAS_CPU_MIPS32_R1
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+ select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
+ select SOC_JZ4740
|
|
+
|
|
+config JZ4740_LEO
|
|
+ bool "Ingenic JZ4740 LEO board"
|
|
+ select DMA_NONCOHERENT
|
|
+ select SYS_HAS_CPU_MIPS32_R1
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+ select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
+ select SOC_JZ4740
|
|
+
|
|
+config JZ4740_LYRA
|
|
+ bool "Ingenic JZ4740 LYRA board"
|
|
+ select DMA_NONCOHERENT
|
|
+ select SYS_HAS_CPU_MIPS32_R1
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+ select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
+ select SOC_JZ4740
|
|
+
|
|
+config JZ4725_DIPPER
|
|
+ bool "Ingenic JZ4725 DIPPER board"
|
|
+ select DMA_NONCOHERENT
|
|
+ select SYS_HAS_CPU_MIPS32_R1
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+ select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
+ select SOC_JZ4740
|
|
+ select SOC_JZ4725
|
|
+
|
|
+config JZ4720_VIRGO
|
|
+ bool "Ingenic JZ4720 VIRGO board"
|
|
+ select DMA_NONCOHERENT
|
|
+ select SYS_HAS_CPU_MIPS32_R1
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+ select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
+ select SOC_JZ4740
|
|
+ select SOC_JZ4720
|
|
+
|
|
+config JZ4750_FUWA
|
|
+ bool "Ingenic JZ4750 FUWA board"
|
|
+ select DMA_NONCOHERENT
|
|
+ select SYS_HAS_CPU_MIPS32_R1
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+ select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
+ select SOC_JZ4750
|
|
+ select JZ_FPGA
|
|
+
|
|
+config JZ4750_APUS
|
|
+ bool "Ingenic JZ4750 APUS board"
|
|
+ select DMA_NONCOHERENT
|
|
+ select SYS_HAS_CPU_MIPS32_R1
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+ select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
+ select SOC_JZ4750
|
|
+
|
|
+config JZ4750D_CETUS
|
|
+ bool "Ingenic JZ4750D CETUS board"
|
|
+ select DMA_NONCOHERENT
|
|
+ select SYS_HAS_CPU_MIPS32_R1
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+ select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
+ select SOC_JZ4750D
|
|
+
|
|
+config JZ4760_F4760
|
|
+ bool "Ingenic JZ4760 FPGA board"
|
|
+ select DMA_NONCOHERENT
|
|
+ select SYS_HAS_CPU_MIPS32_R1
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+ select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
+ select SOC_JZ4760
|
|
+ select JZ_FPGA
|
|
+
|
|
config MACH_ALCHEMY
|
|
bool "Alchemy processor based machines"
|
|
|
|
@@ -610,6 +694,52 @@
|
|
|
|
endmenu
|
|
|
|
+#####################################################
|
|
+# Ingenic SOC series
|
|
+#####################################################
|
|
+
|
|
+config SOC_JZ4730
|
|
+ bool
|
|
+ select JZSOC
|
|
+
|
|
+config SOC_JZ4740
|
|
+ bool
|
|
+ select JZSOC
|
|
+
|
|
+config SOC_JZ4725
|
|
+ bool
|
|
+ select JZSOC
|
|
+
|
|
+config SOC_JZ4720
|
|
+ bool
|
|
+ select JZSOC
|
|
+
|
|
+config SOC_JZ4750
|
|
+ bool
|
|
+ select JZSOC
|
|
+
|
|
+config SOC_JZ4750D
|
|
+ bool
|
|
+ select JZSOC
|
|
+
|
|
+config SOC_JZ4760
|
|
+ bool
|
|
+ select JZSOC
|
|
+
|
|
+config JZ_FPGA
|
|
+ bool
|
|
+
|
|
+config JZSOC
|
|
+ bool
|
|
+ select JZRISC
|
|
+ select SYS_HAS_CPU_MIPS32_R1
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+
|
|
+config JZRISC
|
|
+ bool
|
|
+
|
|
+####################################################
|
|
+
|
|
config GENERIC_LOCKBREAK
|
|
bool
|
|
default y
|
|
@@ -1740,6 +1870,14 @@
|
|
|
|
source "kernel/time/Kconfig"
|
|
|
|
+# the value of (max order + 1)
|
|
+config FORCE_MAX_ZONEORDER
|
|
+ prompt "MAX_ZONEORDER"
|
|
+ int
|
|
+ default "12"
|
|
+ help
|
|
+ The max memory that can be allocated = 4KB * 2^(CONFIG_FORCE_MAX_ZONEORDER - 1)
|
|
+
|
|
#
|
|
# Timer Interrupt Frequency Configuration
|
|
#
|
|
@@ -2013,6 +2151,23 @@
|
|
|
|
endmenu
|
|
|
|
+menu "CPU Frequency scaling"
|
|
+
|
|
+config CPU_FREQ_JZ
|
|
+ tristate "CPUfreq driver for JZ CPUs"
|
|
+ depends on JZSOC
|
|
+ default n
|
|
+ help
|
|
+ This enables the CPUfreq driver for JZ CPUs.
|
|
+
|
|
+ If in doubt, say N.
|
|
+
|
|
+if (CPU_FREQ_JZ)
|
|
+source "drivers/cpufreq/Kconfig"
|
|
+endif
|
|
+
|
|
+endmenu
|
|
+
|
|
menu "Power management options"
|
|
|
|
config ARCH_SUSPEND_POSSIBLE
|
|
diff -ru linux-2.6/arch/mips/kernel/cpu-probe.c /plain/src/qi/linux-2.6.27.git.svn/arch/mips/kernel/cpu-probe.c
|
|
--- linux-2.6/arch/mips/kernel/cpu-probe.c 2009-08-17 23:58:00.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/arch/mips/kernel/cpu-probe.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -153,6 +153,7 @@
|
|
case CPU_25KF:
|
|
case CPU_PR4450:
|
|
case CPU_BCM3302:
|
|
+ case CPU_JZRISC:
|
|
cpu_wait = r4k_wait;
|
|
break;
|
|
|
|
@@ -813,6 +814,22 @@
|
|
}
|
|
}
|
|
|
|
+static inline void cpu_probe_ingenic(struct cpuinfo_mips *c)
|
|
+{
|
|
+ decode_configs(c);
|
|
+ c->options &= ~MIPS_CPU_COUNTER; /* JZRISC does not implement the CP0 counter. */
|
|
+ switch (c->processor_id & 0xff00) {
|
|
+ case PRID_IMP_JZRISC:
|
|
+ c->cputype = CPU_JZRISC;
|
|
+ c->isa_level = MIPS_CPU_ISA_M32R1;
|
|
+ c->tlbsize = 32;
|
|
+ break;
|
|
+ default:
|
|
+ panic("Unknown Ingenic Processor ID!");
|
|
+ break;
|
|
+ }
|
|
+}
|
|
+
|
|
const char *__cpu_name[NR_CPUS];
|
|
|
|
/*
|
|
@@ -894,6 +911,7 @@
|
|
case CPU_BCM4710: name = "Broadcom BCM4710"; break;
|
|
case CPU_PR4450: name = "Philips PR4450"; break;
|
|
case CPU_LOONGSON2: name = "ICT Loongson-2"; break;
|
|
+ case CPU_JZRISC: name = "Ingenic JZRISC"; break;
|
|
default:
|
|
BUG();
|
|
}
|
|
@@ -933,6 +951,9 @@
|
|
case PRID_COMP_NXP:
|
|
cpu_probe_nxp(c);
|
|
break;
|
|
+ case PRID_COMP_INGENIC:
|
|
+ cpu_probe_ingenic(c);
|
|
+ break;
|
|
default:
|
|
c->cputype = CPU_UNKNOWN;
|
|
}
|
|
diff -ru linux-2.6/arch/mips/kernel/signal.c /plain/src/qi/linux-2.6.27.git.svn/arch/mips/kernel/signal.c
|
|
--- linux-2.6/arch/mips/kernel/signal.c 2009-08-17 23:58:00.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/arch/mips/kernel/signal.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -351,6 +351,7 @@
|
|
if (!access_ok(VERIFY_READ, act, sizeof(*act)))
|
|
return -EFAULT;
|
|
err |= __get_user(new_ka.sa.sa_handler, &act->sa_handler);
|
|
+ err |= __get_user(new_ka.sa.sa_restorer, &act->sa_restorer);
|
|
err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
|
|
err |= __get_user(mask, &act->sa_mask.sig[0]);
|
|
if (err)
|
|
@@ -366,6 +367,7 @@
|
|
return -EFAULT;
|
|
err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
|
|
err |= __put_user(old_ka.sa.sa_handler, &oact->sa_handler);
|
|
+ err |= __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer);
|
|
err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
|
|
err |= __put_user(0, &oact->sa_mask.sig[1]);
|
|
err |= __put_user(0, &oact->sa_mask.sig[2]);
|
|
@@ -565,6 +567,10 @@
|
|
regs->regs[31] = (unsigned long) frame->rs_code;
|
|
regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
|
|
|
|
+ /* Add for bionic. I'm not sure whether it works. */
|
|
+ if (ka->sa.sa_flags & SA_RESTORER)
|
|
+ regs->regs[31] = (unsigned long)ka->sa.sa_restorer;
|
|
+
|
|
DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
|
|
current->comm, current->pid,
|
|
frame, regs->cp0_epc, regs->regs[31]);
|
|
diff -ru linux-2.6/arch/mips/kernel/unaligned.c /plain/src/qi/linux-2.6.27.git.svn/arch/mips/kernel/unaligned.c
|
|
--- linux-2.6/arch/mips/kernel/unaligned.c 2009-08-17 23:58:00.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/arch/mips/kernel/unaligned.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -497,6 +497,11 @@
|
|
send_sig(SIGILL, current, 1);
|
|
}
|
|
|
|
+#if defined(CONFIG_JZ_TCSM)
|
|
+#undef user_mode
|
|
+#define user_mode(regs) ((((regs)->cp0_status & KU_MASK) == KU_USER) || (regs->cp0_badvaddr < 0x80000000))
|
|
+#endif
|
|
+
|
|
asmlinkage void do_ade(struct pt_regs *regs)
|
|
{
|
|
extern int do_dsemulret(struct pt_regs *);
|
|
diff -ru linux-2.6/arch/mips/Makefile /plain/src/qi/linux-2.6.27.git.svn/arch/mips/Makefile
|
|
--- linux-2.6/arch/mips/Makefile 2009-08-17 23:58:00.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/arch/mips/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -167,6 +167,46 @@
|
|
#
|
|
|
|
#
|
|
+# Commond Ingenic JZ4730 series
|
|
+#
|
|
+core-$(CONFIG_SOC_JZ4730) += arch/mips/jz4730/
|
|
+cflags-$(CONFIG_SOC_JZ4730) += -Iinclude/asm-mips/mach-jz4730
|
|
+load-$(CONFIG_SOC_JZ4730) += 0xffffffff80010000
|
|
+
|
|
+#
|
|
+# Commond Ingenic JZ4740 series
|
|
+#
|
|
+
|
|
+core-$(CONFIG_SOC_JZ4740) += arch/mips/jz4740/
|
|
+cflags-$(CONFIG_SOC_JZ4740) += -Iinclude/asm-mips/mach-jz4740
|
|
+load-$(CONFIG_SOC_JZ4740) += 0xffffffff80010000
|
|
+
|
|
+#
|
|
+# Commond Ingenic JZ4750 series
|
|
+#
|
|
+
|
|
+core-$(CONFIG_SOC_JZ4750) += arch/mips/jz4750/
|
|
+cflags-$(CONFIG_SOC_JZ4750) += -Iinclude/asm-mips/mach-jz4750
|
|
+load-$(CONFIG_SOC_JZ4750) += 0xffffffff80010000
|
|
+
|
|
+
|
|
+#
|
|
+# Commond Ingenic JZ4750D series
|
|
+#
|
|
+
|
|
+core-$(CONFIG_SOC_JZ4750D) += arch/mips/jz4750d/
|
|
+cflags-$(CONFIG_SOC_JZ4750D) += -Iinclude/asm-mips/mach-jz4750d
|
|
+load-$(CONFIG_SOC_JZ4750D) += 0xffffffff80010000
|
|
+
|
|
+#
|
|
+# Commond Ingenic JZ4760 series
|
|
+#
|
|
+
|
|
+core-$(CONFIG_SOC_JZ4760) += arch/mips/jz4760/
|
|
+cflags-$(CONFIG_SOC_JZ4760) += -Iinclude/asm-mips/mach-jz4760
|
|
+load-$(CONFIG_SOC_JZ4760) += 0xffffffff80010000
|
|
+
|
|
+#
|
|
# Acer PICA 61, Mips Magnum 4000 and Olivetti M700.
|
|
#
|
|
core-$(CONFIG_MACH_JAZZ) += arch/mips/jazz/
|
|
@@ -673,6 +713,12 @@
|
|
|
|
all: $(all-y)
|
|
|
|
+uImage: $(vmlinux-32)
|
|
+ +@$(call makeboot,$@)
|
|
+
|
|
+zImage: $(vmlinux-32)
|
|
+ +@$(call makeboot,$@)
|
|
+
|
|
vmlinux.bin: $(vmlinux-32)
|
|
+@$(call makeboot,$@)
|
|
|
|
@@ -697,6 +743,7 @@
|
|
|
|
archclean:
|
|
@$(MAKE) $(clean)=arch/mips/boot
|
|
+ @$(MAKE) $(clean)=arch/mips/boot/compressed
|
|
@$(MAKE) $(clean)=arch/mips/lasat
|
|
|
|
define archhelp
|
|
@@ -703,6 +746,9 @@
|
|
echo ' vmlinux.ecoff - ECOFF boot image'
|
|
echo ' vmlinux.bin - Raw binary boot image'
|
|
echo ' vmlinux.srec - SREC boot image'
|
|
+ echo ' uImage - u-boot format image (arch/$(ARCH)/boot/uImage)'
|
|
+ echo ' zImage - Compressed binary image (arch/$(ARCH)/boot/compressed/zImage)'
|
|
+ echo ' vmlinux.bin - Uncompressed binary image (arch/$(ARCH)/boot/vmlinux.bin)'
|
|
echo
|
|
echo ' These will be default as apropriate for a configured platform.'
|
|
endef
|
|
diff -ru linux-2.6/arch/mips/mm/cache.c /plain/src/qi/linux-2.6.27.git.svn/arch/mips/mm/cache.c
|
|
--- linux-2.6/arch/mips/mm/cache.c 2009-08-17 23:58:00.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/arch/mips/mm/cache.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -51,6 +51,8 @@
|
|
void (*_dma_cache_inv)(unsigned long start, unsigned long size);
|
|
|
|
EXPORT_SYMBOL(_dma_cache_wback_inv);
|
|
+EXPORT_SYMBOL(_dma_cache_wback);
|
|
+EXPORT_SYMBOL(_dma_cache_inv);
|
|
|
|
#endif /* CONFIG_DMA_NONCOHERENT */
|
|
|
|
diff -ru linux-2.6/arch/mips/mm/c-r4k.c /plain/src/qi/linux-2.6.27.git.svn/arch/mips/mm/c-r4k.c
|
|
--- linux-2.6/arch/mips/mm/c-r4k.c 2009-08-17 23:58:00.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/arch/mips/mm/c-r4k.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -895,6 +895,36 @@
|
|
c->dcache.waybit = 0;
|
|
break;
|
|
|
|
+ case CPU_JZRISC:
|
|
+ config1 = read_c0_config1();
|
|
+ config1 = (config1 >> 22) & 0x07;
|
|
+ if (config1 == 0x07)
|
|
+ config1 = 10;
|
|
+ else
|
|
+ config1 = config1 + 11;
|
|
+ config1 += 2;
|
|
+ icache_size = (1 << config1);
|
|
+ c->icache.linesz = 32;
|
|
+ c->icache.ways = 4;
|
|
+ c->icache.waybit = __ffs(icache_size / c->icache.ways);
|
|
+
|
|
+ config1 = read_c0_config1();
|
|
+ config1 = (config1 >> 13) & 0x07;
|
|
+ if (config1 == 0x07)
|
|
+ config1 = 10;
|
|
+ else
|
|
+ config1 = config1 + 11;
|
|
+ config1 += 2;
|
|
+ dcache_size = (1 << config1);
|
|
+ c->dcache.linesz = 32;
|
|
+ c->dcache.ways = 4;
|
|
+ c->dcache.waybit = __ffs(dcache_size / c->dcache.ways);
|
|
+
|
|
+ c->dcache.flags = 0;
|
|
+ c->options |= MIPS_CPU_PREFETCH;
|
|
+
|
|
+ break;
|
|
+
|
|
default:
|
|
if (!(config & MIPS_CONF_M))
|
|
panic("Don't know how to probe P-caches on this cpu.");
|
|
diff -ru linux-2.6/arch/mips/mm/tlbex.c /plain/src/qi/linux-2.6.27.git.svn/arch/mips/mm/tlbex.c
|
|
--- linux-2.6/arch/mips/mm/tlbex.c 2009-08-17 23:58:00.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/arch/mips/mm/tlbex.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -379,6 +379,11 @@
|
|
tlbw(p);
|
|
break;
|
|
|
|
+ case CPU_JZRISC:
|
|
+ tlbw(p);
|
|
+ uasm_i_nop(p);
|
|
+ break;
|
|
+
|
|
default:
|
|
panic("No TLB refill handler yet (CPU type: %d)",
|
|
current_cpu_data.cputype);
|
|
diff -ru linux-2.6/drivers/i2c/busses/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/i2c/busses/Kconfig
|
|
--- linux-2.6/drivers/i2c/busses/Kconfig 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/i2c/busses/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -7,6 +7,14 @@
|
|
comment "PC SMBus host controller drivers"
|
|
depends on PCI
|
|
|
|
+config I2C_JZ47XX
|
|
+ tristate "JZ47XX I2C Interface support"
|
|
+ depends on JZSOC
|
|
+ help
|
|
+ If you have devices in the Ingenic JZ4730/JZ4740 I2C bus, say yes to
|
|
+ this option. This driver can also be built as a module. If so, the
|
|
+ module will be called i2c-jz47xx.
|
|
+
|
|
config I2C_ALI1535
|
|
tristate "ALI 1535"
|
|
depends on PCI
|
|
diff -ru linux-2.6/drivers/i2c/busses/Makefile /plain/src/qi/linux-2.6.27.git.svn/drivers/i2c/busses/Makefile
|
|
--- linux-2.6/drivers/i2c/busses/Makefile 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/i2c/busses/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -3,6 +3,7 @@
|
|
#
|
|
|
|
# PC SMBus host controller drivers
|
|
+obj-$(CONFIG_I2C_JZ47XX) += i2c-jz47xx.o
|
|
obj-$(CONFIG_I2C_ALI1535) += i2c-ali1535.o
|
|
obj-$(CONFIG_I2C_ALI1563) += i2c-ali1563.o
|
|
obj-$(CONFIG_I2C_ALI15X3) += i2c-ali15x3.o
|
|
diff -ru linux-2.6/drivers/i2c/i2c-dev.c /plain/src/qi/linux-2.6.27.git.svn/drivers/i2c/i2c-dev.c
|
|
--- linux-2.6/drivers/i2c/i2c-dev.c 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/i2c/i2c-dev.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -37,6 +37,8 @@
|
|
#include <linux/smp_lock.h>
|
|
#include <asm/uaccess.h>
|
|
|
|
+extern unsigned short sub_addr;
|
|
+extern int addr_val;
|
|
static struct i2c_driver i2cdev_driver;
|
|
|
|
/*
|
|
@@ -424,6 +426,14 @@
|
|
case I2C_TIMEOUT:
|
|
client->adapter->timeout = arg;
|
|
break;
|
|
+ case I2C_SET_SUB_ADDRESS:
|
|
+ addr_val = 1;
|
|
+ sub_addr = arg;
|
|
+ break;
|
|
+ case I2C_SET_CLOCK:
|
|
+ i2c_jz_setclk(arg);
|
|
+ break;
|
|
+
|
|
default:
|
|
/* NOTE: returning a fault code here could cause trouble
|
|
* in buggy userspace code. Some old kernel bugs returned
|
|
diff -ru linux-2.6/drivers/input/keyboard/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/input/keyboard/Kconfig
|
|
--- linux-2.6/drivers/input/keyboard/Kconfig 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/input/keyboard/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -280,6 +280,39 @@
|
|
To compile this driver as a module, choose M here: the
|
|
module will be called aaed2000_kbd.
|
|
|
|
+config KEYBOARD_JZ_GPIO
|
|
+ tristate "JZ keypad driver based on GPIO Buttons"
|
|
+ depends on JZSOC
|
|
+ help
|
|
+ This driver implements support for buttons connected
|
|
+ to GPIO pins of various CPUs (and some other chips).
|
|
+
|
|
+ Say Y here if your device has buttons connected
|
|
+ directly to such GPIO pins. Your board-specific
|
|
+ setup logic must also provide a platform device,
|
|
+ with configuration data saying which GPIOs are used.
|
|
+
|
|
+ To compile this driver as a module, choose M here: the
|
|
+ module will be called jz_gpio_keypad.
|
|
+
|
|
+config KEYBOARD_JZ
|
|
+ tristate "JZ keypad support"
|
|
+ depends on JZSOC
|
|
+ help
|
|
+ Enable Y here to support JZ keypad.
|
|
+
|
|
+ To compile this driver as a module, choose M here: the
|
|
+ module will be called jz_keypad.
|
|
+
|
|
+config KEYBOARD_JZ_5x5
|
|
+ tristate "JZ 5x5 keypad support"
|
|
+ depends on JZSOC
|
|
+ help
|
|
+ Enable Y here to support JZ keypad.
|
|
+
|
|
+ To compile this driver as a module, choose M here: the
|
|
+ module will be called jz_keypad_5x5.
|
|
+
|
|
config KEYBOARD_GPIO
|
|
tristate "GPIO Buttons"
|
|
depends on GENERIC_GPIO
|
|
diff -ru linux-2.6/drivers/input/keyboard/Makefile /plain/src/qi/linux-2.6.27.git.svn/drivers/input/keyboard/Makefile
|
|
--- linux-2.6/drivers/input/keyboard/Makefile 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/input/keyboard/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -20,6 +20,9 @@
|
|
obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o
|
|
obj-$(CONFIG_KEYBOARD_OMAP) += omap-keypad.o
|
|
obj-$(CONFIG_KEYBOARD_PXA27x) += pxa27x_keypad.o
|
|
+obj-$(CONFIG_KEYBOARD_JZ_GPIO) += jz_gpio_keypad.o
|
|
+obj-$(CONFIG_KEYBOARD_JZ_5x5) += jz_keypad_5x5.o
|
|
+obj-$(CONFIG_KEYBOARD_JZ) += jz_keypad.o
|
|
obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o
|
|
obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o
|
|
obj-$(CONFIG_KEYBOARD_HP6XX) += jornada680_kbd.o
|
|
diff -ru linux-2.6/drivers/input/touchscreen/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/input/touchscreen/Kconfig
|
|
--- linux-2.6/drivers/input/touchscreen/Kconfig 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/input/touchscreen/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -115,6 +115,24 @@
|
|
To compile this driver as a module, choose M here: the
|
|
module will be called inexio.
|
|
|
|
+config TOUCHSCREEN_JZ
|
|
+ tristate "JZ touchscreen"
|
|
+ default y
|
|
+ help
|
|
+ Say Y here to enable JZ SAR A/D controller if you use touchscreen
|
|
+ on JZ platform.
|
|
+
|
|
+ To compile this driver as a module, choose M here, and the
|
|
+ module jz_ts should be called.
|
|
+
|
|
+config JZ_ADKEY
|
|
+ bool "JZ ADKEY"
|
|
+ depends on TOUCHSCREEN_JZ
|
|
+ help
|
|
+ The AD value of the key is get by JZ SAR A/D controller when any ad key
|
|
+ is pressed down.
|
|
+
|
|
+
|
|
config TOUCHSCREEN_MK712
|
|
tristate "ICS MicroClock MK712 touchscreen"
|
|
help
|
|
@@ -181,6 +199,12 @@
|
|
To compile this driver as a module, choose M here: the
|
|
module will be called migor_ts.
|
|
|
|
+config TOUCHSCREEN_SYNAPTICS_I2C_RMI
|
|
+ tristate "Synaptics i2c touchscreen"
|
|
+ depends on I2C
|
|
+ help
|
|
+ This enables support for Synaptics RMI over I2C based touchscreens.
|
|
+
|
|
config TOUCHSCREEN_TOUCHRIGHT
|
|
tristate "Touchright serial touchscreen"
|
|
select SERIO
|
|
diff -ru linux-2.6/drivers/input/touchscreen/Makefile /plain/src/qi/linux-2.6.27.git.svn/drivers/input/touchscreen/Makefile
|
|
--- linux-2.6/drivers/input/touchscreen/Makefile 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/input/touchscreen/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -14,6 +14,7 @@
|
|
obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o
|
|
obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o
|
|
obj-$(CONFIG_TOUCHSCREEN_INEXIO) += inexio.o
|
|
+obj-$(CONFIG_TOUCHSCREEN_JZ) += jz_ts.o
|
|
obj-$(CONFIG_TOUCHSCREEN_MIGOR) += migor_ts.o
|
|
obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o
|
|
obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o
|
|
@@ -22,6 +23,7 @@
|
|
obj-$(CONFIG_TOUCHSCREEN_HTCPEN) += htcpen.o
|
|
obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE) += usbtouchscreen.o
|
|
obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o
|
|
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI) += synaptics_i2c_rmi.o
|
|
obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o
|
|
obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o
|
|
obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o
|
|
diff -ru linux-2.6/drivers/misc/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/misc/Kconfig
|
|
--- linux-2.6/drivers/misc/Kconfig 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/misc/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -13,6 +13,40 @@
|
|
|
|
if MISC_DEVICES
|
|
|
|
+config JZ_TCSM
|
|
+ bool "JZ TCSM for multimedia"
|
|
+ default y
|
|
+
|
|
+config JZ_CIM
|
|
+ bool "JZ CIM for Camera driver"
|
|
+ default y
|
|
+
|
|
+choice
|
|
+ depends on JZ_CIM
|
|
+ prompt "Camera Sensor"
|
|
+ default OV3640
|
|
+
|
|
+config OV3640
|
|
+ bool "OmniVision OV3640 sensor support (3.1 MegaPixel)"
|
|
+config OV2640
|
|
+ bool "OmniVision OV2640 sensor support (2.0 MegaPixel)"
|
|
+config OV9650
|
|
+ bool "OmniVision OV9650 sensor support (1.3 MegaPixel)"
|
|
+endchoice
|
|
+
|
|
+config ANDROID_PMEM
|
|
+ bool "Android pmem allocator"
|
|
+ default y
|
|
+
|
|
+config TIMED_OUTPUT
|
|
+ bool "Timed output class driver"
|
|
+ default y
|
|
+
|
|
+config TIMED_GPIO
|
|
+ bool "Android timed gpio driver"
|
|
+ depends on GENERIC_GPIO && TIMED_OUTPUT
|
|
+ default y
|
|
+
|
|
config ATMEL_PWM
|
|
tristate "Atmel AT32/AT91 PWM support"
|
|
depends on AVR32 || ARCH_AT91
|
|
@@ -55,6 +89,10 @@
|
|
TC can be used for other purposes, such as PWM generation and
|
|
interval timing.
|
|
|
|
+config BINDER_IPC
|
|
+ tristate "Binder IPC Driver"
|
|
+ default y
|
|
+
|
|
config IBM_ASM
|
|
tristate "Device driver for IBM RSA service processor"
|
|
depends on X86 && PCI && INPUT && EXPERIMENTAL
|
|
@@ -424,6 +462,13 @@
|
|
driver (SCSI/ATA) which supports enclosures
|
|
or a SCSI enclosure device (SES) to use these services.
|
|
|
|
+config KERNEL_DEBUGGER_CORE
|
|
+ bool "Kernel Debugger Core"
|
|
+ default n
|
|
+ ---help---
|
|
+ Generic kernel debugging command processor used by low level
|
|
+ (interrupt context) platform-specific debuggers.
|
|
+
|
|
config SGI_XP
|
|
tristate "Support communication between SGI SSIs"
|
|
depends on NET
|
|
@@ -475,4 +520,75 @@
|
|
This option enables addition debugging code for the SGI GRU driver. If
|
|
you are unsure, say N.
|
|
|
|
+config LOW_MEMORY_KILLER
|
|
+ tristate "Low Memory Killer"
|
|
+ ---help---
|
|
+ Register processes to be killed when memory is low
|
|
+
|
|
+config LOGGER
|
|
+ bool "High-speed in-kernel logging driver"
|
|
+ default y
|
|
+
|
|
+config UID_STAT
|
|
+ bool "UID based statistics tracking exported to /proc/uid_stat"
|
|
+ default n
|
|
+
|
|
+config ANDROID_RAM_CONSOLE
|
|
+ bool "RAM buffer console"
|
|
+ default n
|
|
+
|
|
+config ANDROID_RAM_CONSOLE_ENABLE_VERBOSE
|
|
+ bool "Enable verbose console messages"
|
|
+ default y
|
|
+ depends on ANDROID_RAM_CONSOLE
|
|
+
|
|
+menuconfig ANDROID_RAM_CONSOLE_ERROR_CORRECTION
|
|
+ bool "Enable error correction"
|
|
+ default n
|
|
+ depends on ANDROID_RAM_CONSOLE
|
|
+ depends on !ANDROID_RAM_CONSOLE_EARLY_INIT
|
|
+ select REED_SOLOMON
|
|
+ select REED_SOLOMON_ENC8
|
|
+ select REED_SOLOMON_DEC8
|
|
+
|
|
+if ANDROID_RAM_CONSOLE_ERROR_CORRECTION
|
|
+
|
|
+config ANDROID_RAM_CONSOLE_ERROR_CORRECTION_DATA_SIZE
|
|
+ int "Data data size"
|
|
+ default 128
|
|
+ help
|
|
+ Must be a power of 2.
|
|
+
|
|
+config ANDROID_RAM_CONSOLE_ERROR_CORRECTION_ECC_SIZE
|
|
+ int "ECC size"
|
|
+ default 16
|
|
+
|
|
+config ANDROID_RAM_CONSOLE_ERROR_CORRECTION_SYMBOL_SIZE
|
|
+ int "Symbol size"
|
|
+ default 8
|
|
+config ANDROID_RAM_CONSOLE_ERROR_CORRECTION_POLYNOMIAL
|
|
+ hex "Polynomial"
|
|
+ default 0x19 if (ANDROID_RAM_CONSOLE_ERROR_CORRECTION_SYMBOL_SIZE = 4)
|
|
+ default 0x29 if (ANDROID_RAM_CONSOLE_ERROR_CORRECTION_SYMBOL_SIZE = 5)
|
|
+ default 0x61 if (ANDROID_RAM_CONSOLE_ERROR_CORRECTION_SYMBOL_SIZE = 6)
|
|
+ default 0x89 if (ANDROID_RAM_CONSOLE_ERROR_CORRECTION_SYMBOL_SIZE = 7)
|
|
+ default 0x11d if (ANDROID_RAM_CONSOLE_ERROR_CORRECTION_SYMBOL_SIZE = 8)
|
|
+
|
|
+endif #ANDROID_RAM_CONSOLE_ERROR_CORRECTION
|
|
+
|
|
+config ANDROID_RAM_CONSOLE_EARLY_INIT
|
|
+ bool "Start ram console early"
|
|
+ default n
|
|
+ depends on ANDROID_RAM_CONSOLE
|
|
+
|
|
+config ANDROID_RAM_CONSOLE_EARLY_ADDR
|
|
+ hex "RAM console virtual address"
|
|
+ default 0
|
|
+ depends on ANDROID_RAM_CONSOLE_EARLY_INIT
|
|
+
|
|
+config ANDROID_RAM_CONSOLE_EARLY_SIZE
|
|
+ hex "RAM console buffer size"
|
|
+ default 0
|
|
+ depends on ANDROID_RAM_CONSOLE_EARLY_INIT
|
|
+
|
|
endif # MISC_DEVICES
|
|
diff -ru linux-2.6/drivers/misc/Makefile /plain/src/qi/linux-2.6.27.git.svn/drivers/misc/Makefile
|
|
--- linux-2.6/drivers/misc/Makefile 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/misc/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -10,9 +10,13 @@
|
|
obj-$(CONFIG_MSI_LAPTOP) += msi-laptop.o
|
|
obj-$(CONFIG_COMPAL_LAPTOP) += compal-laptop.o
|
|
obj-$(CONFIG_ACER_WMI) += acer-wmi.o
|
|
+obj-$(CONFIG_ANDROID_PMEM) += pmem.o
|
|
+obj-$(CONFIG_TIMED_OUTPUT) += timed_output.o
|
|
+obj-$(CONFIG_TIMED_GPIO) += timed_gpio.o
|
|
obj-$(CONFIG_ATMEL_PWM) += atmel_pwm.o
|
|
obj-$(CONFIG_ATMEL_SSC) += atmel-ssc.o
|
|
obj-$(CONFIG_ATMEL_TCLIB) += atmel_tclib.o
|
|
+obj-$(CONFIG_BINDER_IPC) += binder.o
|
|
obj-$(CONFIG_HP_WMI) += hp-wmi.o
|
|
obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o
|
|
obj-$(CONFIG_LKDTM) += lkdtm.o
|
|
@@ -26,7 +30,14 @@
|
|
obj-$(CONFIG_EEPROM_93CX6) += eeprom_93cx6.o
|
|
obj-$(CONFIG_INTEL_MENLOW) += intel_menlow.o
|
|
obj-$(CONFIG_ENCLOSURE_SERVICES) += enclosure.o
|
|
+obj-$(CONFIG_KERNEL_DEBUGGER_CORE) += kernel_debugger.o
|
|
obj-$(CONFIG_KGDB_TESTS) += kgdbts.o
|
|
obj-$(CONFIG_SGI_XP) += sgi-xp/
|
|
obj-$(CONFIG_SGI_GRU) += sgi-gru/
|
|
obj-$(CONFIG_HP_ILO) += hpilo.o
|
|
+obj-$(CONFIG_LOGGER) += logger.o
|
|
+obj-$(CONFIG_UID_STAT) += uid_stat.o
|
|
+obj-$(CONFIG_LOW_MEMORY_KILLER) += lowmemorykiller.o
|
|
+obj-$(CONFIG_ANDROID_RAM_CONSOLE) += ram_console.o
|
|
+obj-$(CONFIG_JZ_TCSM) += jz_tcsm.o
|
|
+obj-$(CONFIG_JZ_CIM) += jz_sensor.o jz_cim.o
|
|
diff -ru linux-2.6/drivers/mmc/card/block.c /plain/src/qi/linux-2.6.27.git.svn/drivers/mmc/card/block.c
|
|
--- linux-2.6/drivers/mmc/card/block.c 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/mmc/card/block.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -228,7 +228,11 @@
|
|
brq.mrq.cmd = &brq.cmd;
|
|
brq.mrq.data = &brq.data;
|
|
|
|
+#ifdef CONFIG_JZ4750_BOOT_FROM_MSC0
|
|
+ brq.cmd.arg = req->sector + 8192;
|
|
+#else
|
|
brq.cmd.arg = req->sector;
|
|
+#endif
|
|
if (!mmc_card_blockaddr(card))
|
|
brq.cmd.arg <<= 9;
|
|
brq.cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
|
|
@@ -594,6 +598,9 @@
|
|
|
|
if (md) {
|
|
mmc_blk_set_blksize(md, card);
|
|
+#ifdef CONFIG_MMC_BLOCK_PARANOID_RESUME
|
|
+ md->queue.check_status = 1;
|
|
+#endif
|
|
mmc_queue_resume(&md->queue);
|
|
}
|
|
return 0;
|
|
diff -ru linux-2.6/drivers/mmc/core/mmc.c /plain/src/qi/linux-2.6.27.git.svn/drivers/mmc/core/mmc.c
|
|
--- linux-2.6/drivers/mmc/core/mmc.c 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/mmc/core/mmc.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -140,8 +140,12 @@
|
|
|
|
e = UNSTUFF_BITS(resp, 47, 3);
|
|
m = UNSTUFF_BITS(resp, 62, 12);
|
|
+#ifdef CONFIG_JZ4750_BOOT_FROM_MSC0
|
|
csd->capacity = (1 + m) << (e + 2);
|
|
-
|
|
+ csd->capacity -= 8192;
|
|
+#else
|
|
+ csd->capacity = (1 + m) << (e + 2);
|
|
+#endif
|
|
csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
|
|
csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
|
|
csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
|
|
diff -ru linux-2.6/drivers/mmc/core/sd.c /plain/src/qi/linux-2.6.27.git.svn/drivers/mmc/core/sd.c
|
|
--- linux-2.6/drivers/mmc/core/sd.c 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/mmc/core/sd.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -109,8 +109,12 @@
|
|
|
|
e = UNSTUFF_BITS(resp, 47, 3);
|
|
m = UNSTUFF_BITS(resp, 62, 12);
|
|
+#ifdef CONFIG_JZ4750_BOOT_FROM_MSC0
|
|
csd->capacity = (1 + m) << (e + 2);
|
|
-
|
|
+ csd->capacity -= 8192;
|
|
+#else
|
|
+ csd->capacity = (1 + m) << (e + 2);
|
|
+#endif
|
|
csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
|
|
csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
|
|
csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
|
|
@@ -137,7 +141,12 @@
|
|
csd->cmdclass = UNSTUFF_BITS(resp, 84, 12);
|
|
|
|
m = UNSTUFF_BITS(resp, 48, 22);
|
|
+#ifdef CONFIG_JZ4750_BOOT_FROM_MSC0
|
|
+ csd->capacity = (1 + m) << 10;
|
|
+ csd->capacity -= 8192;
|
|
+#else
|
|
csd->capacity = (1 + m) << 10;
|
|
+#endif
|
|
|
|
csd->read_blkbits = 9;
|
|
csd->read_partial = 0;
|
|
@@ -336,7 +345,9 @@
|
|
int err;
|
|
u32 cid[4];
|
|
unsigned int max_dtr;
|
|
-
|
|
+#ifdef CONFIG_MMC_PARANOID_SD_INIT
|
|
+ int retries;
|
|
+#endif
|
|
BUG_ON(!host);
|
|
WARN_ON(!host->claimed);
|
|
|
|
@@ -448,11 +459,29 @@
|
|
err = mmc_decode_scr(card);
|
|
if (err < 0)
|
|
goto free_card;
|
|
-
|
|
/*
|
|
* Fetch switch information from card.
|
|
*/
|
|
+#ifdef CONFIG_MMC_PARANOID_SD_INIT
|
|
+ for (retries = 1; retries <= 3; retries++) {
|
|
+ err = mmc_read_switch(card);
|
|
+ if (!err) {
|
|
+ if (retries > 1) {
|
|
+ printk(KERN_WARNING
|
|
+ "%s: recovered\n",
|
|
+ mmc_hostname(host));
|
|
+ }
|
|
+ break;
|
|
+ } else {
|
|
+ printk(KERN_WARNING
|
|
+ "%s: read switch failed (attempt %d)\n",
|
|
+ mmc_hostname(host), retries);
|
|
+ }
|
|
+ }
|
|
+#else
|
|
err = mmc_read_switch(card);
|
|
+#endif
|
|
+
|
|
if (err)
|
|
goto free_card;
|
|
}
|
|
@@ -535,18 +564,37 @@
|
|
*/
|
|
static void mmc_sd_detect(struct mmc_host *host)
|
|
{
|
|
- int err;
|
|
+ int err = 0;
|
|
+#ifdef CONFIG_MMC_PARANOID_SD_INIT
|
|
+ int retries = 5;
|
|
+#endif
|
|
|
|
BUG_ON(!host);
|
|
BUG_ON(!host->card);
|
|
-
|
|
+
|
|
mmc_claim_host(host);
|
|
|
|
/*
|
|
* Just check if our card has been removed.
|
|
*/
|
|
+#ifdef CONFIG_MMC_PARANOID_SD_INIT
|
|
+ while(retries) {
|
|
+ err = mmc_send_status(host->card, NULL);
|
|
+ printk("%s(%s): err = %d\n", __func__, mmc_hostname(host), err);
|
|
+ if (err) {
|
|
+ retries--;
|
|
+ udelay(5);
|
|
+ continue;
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
+ if (!retries) {
|
|
+ printk(KERN_ERR "%s(%s): Unable to re-detect card (%d)\n",
|
|
+ __func__, mmc_hostname(host), err);
|
|
+ }
|
|
+#else
|
|
err = mmc_send_status(host->card, NULL);
|
|
-
|
|
+#endif
|
|
mmc_release_host(host);
|
|
|
|
if (err) {
|
|
@@ -584,12 +632,31 @@
|
|
static void mmc_sd_resume(struct mmc_host *host)
|
|
{
|
|
int err;
|
|
+#ifdef CONFIG_MMC_PARANOID_SD_INIT
|
|
+ int retries;
|
|
+#endif
|
|
|
|
BUG_ON(!host);
|
|
BUG_ON(!host->card);
|
|
|
|
mmc_claim_host(host);
|
|
+#ifdef CONFIG_MMC_PARANOID_SD_INIT
|
|
+ retries = 5;
|
|
+ while (retries) {
|
|
+ err = mmc_sd_init_card(host, host->ocr, host->card);
|
|
+
|
|
+ if (err) {
|
|
+ printk(KERN_ERR "%s: Re-init card rc = %d (retries = %d)\n",
|
|
+ mmc_hostname(host), err, retries);
|
|
+ mdelay(5);
|
|
+ retries--;
|
|
+ continue;
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
+#else
|
|
err = mmc_sd_init_card(host, host->ocr, host->card);
|
|
+#endif
|
|
mmc_release_host(host);
|
|
|
|
if (err) {
|
|
@@ -622,6 +689,9 @@
|
|
int mmc_attach_sd(struct mmc_host *host, u32 ocr)
|
|
{
|
|
int err;
|
|
+#ifdef CONFIG_MMC_PARANOID_SD_INIT
|
|
+ int retries;
|
|
+#endif
|
|
|
|
BUG_ON(!host);
|
|
WARN_ON(!host->claimed);
|
|
@@ -670,9 +740,27 @@
|
|
/*
|
|
* Detect and init the card.
|
|
*/
|
|
+#ifdef CONFIG_MMC_PARANOID_SD_INIT
|
|
+ retries = 5;
|
|
+ while (retries) {
|
|
+ err = mmc_sd_init_card(host, host->ocr, NULL);
|
|
+ if (err) {
|
|
+ retries--;
|
|
+ continue;
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ if (!retries) {
|
|
+ printk(KERN_ERR "%s: mmc_sd_init_card() failure (err = %d)\n",
|
|
+ mmc_hostname(host), err);
|
|
+ goto err;
|
|
+ }
|
|
+#else
|
|
err = mmc_sd_init_card(host, host->ocr, NULL);
|
|
if (err)
|
|
goto err;
|
|
+#endif
|
|
|
|
mmc_release_host(host);
|
|
|
|
diff -ru linux-2.6/drivers/mmc/host/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/mmc/host/Kconfig
|
|
--- linux-2.6/drivers/mmc/host/Kconfig 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/mmc/host/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -4,6 +4,104 @@
|
|
|
|
comment "MMC/SD Host Controller Drivers"
|
|
|
|
+config MMC_JZ
|
|
+ tristate "JZ SD/Multimedia Card Interface support"
|
|
+ depends on SOC_JZ4730 || SOC_JZ4740
|
|
+ help
|
|
+ This selects the Ingenic JZ4730/JZ4740 SD/Multimedia card Interface.
|
|
+ If you have abIngenic platform with a Multimedia Card slot,
|
|
+ say Y or M here.
|
|
+
|
|
+ If unsure, say N.
|
|
+choice
|
|
+ depends on MMC_JZ
|
|
+ prompt "MMC BUS Width"
|
|
+ default JZ_MMC_BUS_4
|
|
+ help
|
|
+ This defines the BUS Width of the Ingenic JZ4730/JZ4740 SD/Multimedia card Interface.
|
|
+
|
|
+config JZ_MMC_BUS_1
|
|
+ bool "1 Bit Bus"
|
|
+ help
|
|
+ 1 Bit SD/Multimedia Card Bus
|
|
+
|
|
+config JZ_MMC_BUS_4
|
|
+ bool "4 Bit Bus"
|
|
+ help
|
|
+ 4 Bit SD/Multimedia Card Bus
|
|
+
|
|
+endchoice
|
|
+
|
|
+config MSC0_JZ4750
|
|
+ tristate "JZ4750 SD/Multimedia Card 0 Interface support"
|
|
+ depends on SOC_JZ4750 || SOC_JZ4750D
|
|
+ help
|
|
+ This selects the Ingenic JZ4750 SD/Multimedia card 0 Interface.
|
|
+ If you have a Ingenic platform with a Multimedia Card slot,
|
|
+ say Y or M here.
|
|
+
|
|
+ If unsure, say N.
|
|
+
|
|
+choice
|
|
+ depends on MSC0_JZ4750
|
|
+ prompt "MSC0 BUS Width"
|
|
+ default JZ4750_MSC0_BUS_4
|
|
+ help
|
|
+ This defines the BUS Width of the Ingenic JZ4750 SD/Multimedia card Interface.
|
|
+
|
|
+config JZ4750_MSC0_BUS_1
|
|
+ bool "1 Bit Bus"
|
|
+ help
|
|
+ 1 Bit SD/Multimedia Card Bus
|
|
+
|
|
+config JZ4750_MSC0_BUS_4
|
|
+ bool "4 Bit Bus"
|
|
+ help
|
|
+ 4 Bit SD/Multimedia Card Bus
|
|
+
|
|
+config JZ4750_MSC0_BUS_8
|
|
+ bool "8 Bit Bus"
|
|
+ help
|
|
+ 8 Bit Multimedia Card Bus
|
|
+
|
|
+endchoice
|
|
+
|
|
+config MSC1_JZ4750
|
|
+ tristate "JZ4750 SD/Multimedia Card 1 Interface support"
|
|
+ depends on SOC_JZ4750 || SOC_JZ4750D
|
|
+ help
|
|
+ This selects the Ingenic JZ4750 SD/Multimedia card 1 Interface.
|
|
+ If you have a Ingenic platform with a Multimedia Card slot,
|
|
+ say Y or M here.
|
|
+
|
|
+ If unsure, say N.
|
|
+
|
|
+choice
|
|
+ depends on MSC1_JZ4750
|
|
+ prompt "MSC1 BUS Width"
|
|
+ default JZ4750_MSC1_BUS_4
|
|
+ help
|
|
+ This defines the BUS Width of the Ingenic JZ4750 SD/Multimedia card Interface.
|
|
+
|
|
+config JZ4750_MSC1_BUS_1
|
|
+ bool "1 Bit Bus"
|
|
+ help
|
|
+ 1 Bit SD/Multimedia Card Bus
|
|
+
|
|
+config JZ4750_MSC1_BUS_4
|
|
+ bool "4 Bit Bus"
|
|
+ help
|
|
+ 4 Bit SD/Multimedia Card Bus
|
|
+endchoice
|
|
+
|
|
+config JZ4750_BOOT_FROM_MSC0
|
|
+ tristate "JZ4750 Boot from SD/Multimedia Card Interface support"
|
|
+ depends on SOC_JZ4750 || SOC_JZ4750D
|
|
+ help
|
|
+ This selects boot from the Sd/Multimedia Card.
|
|
+
|
|
+ If unsure,say N.
|
|
+
|
|
config MMC_ARMMMCI
|
|
tristate "ARM AMBA Multimedia Card Interface support"
|
|
depends on ARM_AMBA
|
|
diff -ru linux-2.6/drivers/mmc/host/Makefile /plain/src/qi/linux-2.6.27.git.svn/drivers/mmc/host/Makefile
|
|
--- linux-2.6/drivers/mmc/host/Makefile 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/mmc/host/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -6,6 +6,9 @@
|
|
EXTRA_CFLAGS += -DDEBUG
|
|
endif
|
|
|
|
+obj-$(CONFIG_MMC_JZ) += jz_mmc.o
|
|
+obj-$(CONFIG_MSC0_JZ4750) += jz4750_mmc.o
|
|
+obj-$(CONFIG_MSC1_JZ4750) += jz4750_mmc.o
|
|
obj-$(CONFIG_MMC_ARMMMCI) += mmci.o
|
|
obj-$(CONFIG_MMC_PXA) += pxamci.o
|
|
obj-$(CONFIG_MMC_IMX) += imxmmc.o
|
|
diff -ru linux-2.6/drivers/net/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/net/Kconfig
|
|
--- linux-2.6/drivers/net/Kconfig 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/net/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -207,6 +207,33 @@
|
|
or internal device. It is safe to say Y or M here even if your
|
|
ethernet card lack MII.
|
|
|
|
+config JZ_ETH
|
|
+ tristate "JZ4730/JZ5730 On-Chip Ethernet support"
|
|
+ depends on NET_ETHERNET && (SOC_JZ4730 || SOC_JZ5730 || JZ_FPGA)
|
|
+ help
|
|
+ Say Y for support of JZ4730/JZ5730 On-Chip Ethernet interface.
|
|
+
|
|
+ To compile this driver as a module, choose M here: the module
|
|
+ will be called jz_eth.
|
|
+
|
|
+config JZCS8900
|
|
+ tristate "JZ CS8900A Ethernet support"
|
|
+ depends on NET_ETHERNET && (SOC_JZ4740 || SOC_JZ4750)
|
|
+ help
|
|
+ Say Y for support of JZ CS8900A Ethernet interface.
|
|
+
|
|
+ To compile this driver as a module, choose M here: the module
|
|
+ will be called jzcs8900a.
|
|
+
|
|
+config JZ4760_ETH
|
|
+ tristate "JZ4760 On-Chip Ethernet support"
|
|
+ depends on NET_ETHERNET && (SOC_JZ4760 || SOC_JZ4810 || JZ_FPGA)
|
|
+ help
|
|
+ Say Y for support of JZ4760 On-Chip Ethernet interface.
|
|
+
|
|
+ To compile this driver as a module, choose M here: the module
|
|
+ will be called jz4760_eth.
|
|
+
|
|
config MACB
|
|
tristate "Atmel MACB support"
|
|
depends on AVR32 || ARCH_AT91SAM9260 || ARCH_AT91SAM9263 || ARCH_AT91SAM9G20 || ARCH_AT91CAP9
|
|
diff -ru linux-2.6/drivers/net/Makefile /plain/src/qi/linux-2.6.27.git.svn/drivers/net/Makefile
|
|
--- linux-2.6/drivers/net/Makefile 2009-08-17 23:58:01.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/net/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -90,6 +90,9 @@
|
|
obj-$(CONFIG_MII) += mii.o
|
|
obj-$(CONFIG_PHYLIB) += phy/
|
|
|
|
+obj-$(CONFIG_JZ_ETH) += jz_eth.o
|
|
+obj-$(CONFIG_JZCS8900) += jzcs8900a.o
|
|
+obj-$(CONFIG_JZ4760_ETH) += jz4760_eth.o
|
|
obj-$(CONFIG_SUNDANCE) += sundance.o
|
|
obj-$(CONFIG_HAMACHI) += hamachi.o
|
|
obj-$(CONFIG_NET) += Space.o loopback.o
|
|
diff -ru linux-2.6/drivers/power/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/power/Kconfig
|
|
--- linux-2.6/drivers/power/Kconfig 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/power/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -62,4 +62,9 @@
|
|
help
|
|
Say Y to enable support for the battery in Palm T|X.
|
|
|
|
+config BATTERY_JZ
|
|
+ tristate "JZ battery"
|
|
+ help
|
|
+ Say Y to enable support for the battery in JZ SOC.
|
|
+
|
|
endif # POWER_SUPPLY
|
|
diff -ru linux-2.6/drivers/power/Makefile /plain/src/qi/linux-2.6.27.git.svn/drivers/power/Makefile
|
|
--- linux-2.6/drivers/power/Makefile 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/power/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -22,3 +22,4 @@
|
|
obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o
|
|
obj-$(CONFIG_BATTERY_TOSA) += tosa_battery.o
|
|
obj-$(CONFIG_BATTERY_PALMTX) += palmtx_battery.o
|
|
+obj-$(CONFIG_BATTERY_JZ) += jz_battery.o
|
|
diff -ru linux-2.6/drivers/power/power_supply_sysfs.c /plain/src/qi/linux-2.6.27.git.svn/drivers/power/power_supply_sysfs.c
|
|
--- linux-2.6/drivers/power/power_supply_sysfs.c 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/power/power_supply_sysfs.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -107,7 +107,8 @@
|
|
POWER_SUPPLY_ATTR(energy_now),
|
|
POWER_SUPPLY_ATTR(energy_avg),
|
|
POWER_SUPPLY_ATTR(capacity),
|
|
- POWER_SUPPLY_ATTR(temp),
|
|
+ POWER_SUPPLY_ATTR(batt_temp),
|
|
+ POWER_SUPPLY_ATTR(batt_vol),
|
|
POWER_SUPPLY_ATTR(temp_ambient),
|
|
POWER_SUPPLY_ATTR(time_to_empty_now),
|
|
POWER_SUPPLY_ATTR(time_to_empty_avg),
|
|
diff -ru linux-2.6/drivers/rtc/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/rtc/Kconfig
|
|
--- linux-2.6/drivers/rtc/Kconfig 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/rtc/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -105,6 +105,16 @@
|
|
driver does not expose RTC_UIE ioctls. Those requests generate
|
|
once-per-second update interrupts, used for synchronization.
|
|
|
|
+config RTC_INTF_ALARM
|
|
+ bool "Android alarm driver"
|
|
+ depends on RTC_CLASS
|
|
+ default y
|
|
+ help
|
|
+ Provides non-wakeup and rtc backed wakeup alarms based on rtc or
|
|
+ elapsed realtime, and a non-wakeup alarm on the monotonic clock.
|
|
+ Also provides an ioctl to set the wall time which must be used
|
|
+ for elapsed realtime to work.
|
|
+
|
|
config RTC_DRV_TEST
|
|
tristate "Test driver/device"
|
|
help
|
|
@@ -468,6 +478,16 @@
|
|
To compile this driver as a module, choose M here: the
|
|
module will be called rtc-sa1100.
|
|
|
|
+config RTC_DRV_JZ4750
|
|
+ tristate "JZ4750/JZ4750D"
|
|
+ depends on SOC_JZ4750 || SOC_JZ4750D
|
|
+ help
|
|
+ If you say Y here you will get access to the real time clock
|
|
+ built into your JZ4750 or JZ4750D CPU.
|
|
+
|
|
+ To compile this driver as a module, choose M here: the
|
|
+ module will be called rtc-jz4750.
|
|
+
|
|
config RTC_DRV_SH
|
|
tristate "SuperH On-Chip RTC"
|
|
depends on RTC_CLASS && SUPERH
|
|
diff -ru linux-2.6/drivers/rtc/Makefile /plain/src/qi/linux-2.6.27.git.svn/drivers/rtc/Makefile
|
|
--- linux-2.6/drivers/rtc/Makefile 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/rtc/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -11,6 +11,7 @@
|
|
obj-$(CONFIG_RTC_CLASS) += rtc-core.o
|
|
rtc-core-y := class.o interface.o
|
|
|
|
+rtc-core-$(CONFIG_RTC_INTF_ALARM) += alarm.o
|
|
rtc-core-$(CONFIG_RTC_INTF_DEV) += rtc-dev.o
|
|
rtc-core-$(CONFIG_RTC_INTF_PROC) += rtc-proc.o
|
|
rtc-core-$(CONFIG_RTC_INTF_SYSFS) += rtc-sysfs.o
|
|
@@ -59,3 +60,4 @@
|
|
obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o
|
|
obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o
|
|
obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o
|
|
+obj-$(CONFIG_RTC_DRV_JZ4750) += rtc-jz4750.o
|
|
diff -ru linux-2.6/drivers/serial/8250.c /plain/src/qi/linux-2.6.27.git.svn/drivers/serial/8250.c
|
|
--- linux-2.6/drivers/serial/8250.c 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/serial/8250.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -178,7 +178,7 @@
|
|
[PORT_16550A] = {
|
|
.name = "16550A",
|
|
.fifo_size = 16,
|
|
- .tx_loadsz = 16,
|
|
+ .tx_loadsz = 8,
|
|
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
|
|
.flags = UART_CAP_FIFO,
|
|
},
|
|
@@ -397,6 +397,10 @@
|
|
break;
|
|
|
|
case UPIO_MEM:
|
|
+#if defined(CONFIG_JZSOC)
|
|
+ if (offset == (UART_FCR << up->port.regshift))
|
|
+ value |= 0x10; /* set FCR.UUE */
|
|
+#endif
|
|
writeb(value, up->port.membase + offset);
|
|
break;
|
|
|
|
@@ -2057,6 +2061,83 @@
|
|
serial_unlink_irq_chain(up);
|
|
}
|
|
|
|
+#if defined(CONFIG_JZSOC) && !defined(CONFIG_SOC_JZ4730)
|
|
+static unsigned short quot1[3] = {0}; /* quot[0]:baud_div, quot[1]:umr, quot[2]:uacr */
|
|
+static unsigned short * serial8250_get_divisor(struct uart_port *port, unsigned int baud)
|
|
+{
|
|
+ int err, sum, i, j;
|
|
+ int a[12], b[12];
|
|
+ unsigned short div, umr, uacr;
|
|
+ unsigned short umr_best, div_best, uacr_best;
|
|
+ long long t0, t1, t2, t3;
|
|
+
|
|
+ sum = 0;
|
|
+ umr_best = div_best = uacr_best = 0;
|
|
+ div = 1;
|
|
+
|
|
+ if ((port->uartclk % (16 * baud)) == 0) {
|
|
+ quot1[0] = port->uartclk / (16 * baud);
|
|
+ quot1[1] = 16;
|
|
+ quot1[2] = 0;
|
|
+ return quot1;
|
|
+ }
|
|
+
|
|
+ while (1) {
|
|
+ umr = port->uartclk / (baud * div);
|
|
+ if (umr > 32) {
|
|
+ div++;
|
|
+ continue;
|
|
+ }
|
|
+ if (umr < 4) {
|
|
+ break;
|
|
+ }
|
|
+ for (i = 0; i < 12; i++) {
|
|
+ a[i] = umr;
|
|
+ b[i] = 0;
|
|
+ sum = 0;
|
|
+ for (j = 0; j <= i; j++) {
|
|
+ sum += a[j];
|
|
+ }
|
|
+
|
|
+ /* the precision could be 1/2^(36) due to the value of t0 */
|
|
+ t0 = 0x1000000000LL;
|
|
+ t1 = (i + 1) * t0;
|
|
+ t2 = (sum * div) * t0;
|
|
+ t3 = div * t0;
|
|
+ do_div(t1, baud);
|
|
+ do_div(t2, port->uartclk);
|
|
+ do_div(t3, (2 * port->uartclk));
|
|
+ err = t1 - t2 - t3;
|
|
+
|
|
+ if (err > 0) {
|
|
+ a[i] += 1;
|
|
+ b[i] = 1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ uacr = 0;
|
|
+ for (i = 0; i < 12; i++) {
|
|
+ if (b[i] == 1) {
|
|
+ uacr |= 1 << i;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* the best value of umr should be near 16, and the value of uacr should better be smaller */
|
|
+ if (abs(umr - 16) < abs(umr_best - 16) || (abs(umr - 16) == abs(umr_best - 16) && uacr_best > uacr)) {
|
|
+ div_best = div;
|
|
+ umr_best = umr;
|
|
+ uacr_best = uacr;
|
|
+ }
|
|
+ div++;
|
|
+ }
|
|
+
|
|
+ quot1[0] = div_best;
|
|
+ quot1[1] = umr_best;
|
|
+ quot1[2] = uacr_best;
|
|
+
|
|
+ return quot1;
|
|
+}
|
|
+#else
|
|
static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
|
|
{
|
|
unsigned int quot;
|
|
@@ -2076,6 +2157,7 @@
|
|
|
|
return quot;
|
|
}
|
|
+#endif
|
|
|
|
static void
|
|
serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
@@ -2085,6 +2167,9 @@
|
|
unsigned char cval, fcr = 0;
|
|
unsigned long flags;
|
|
unsigned int baud, quot;
|
|
+#if defined(CONFIG_JZSOC) && !defined(CONFIG_SOC_JZ4730)
|
|
+ unsigned short *quot1;
|
|
+#endif
|
|
|
|
switch (termios->c_cflag & CSIZE) {
|
|
case CS5:
|
|
@@ -2117,7 +2202,12 @@
|
|
* Ask the core to calculate the divisor for us.
|
|
*/
|
|
baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
|
|
+#if defined(CONFIG_JZSOC) && !defined(CONFIG_SOC_JZ4730)
|
|
+ quot1 = serial8250_get_divisor(port, baud);
|
|
+ quot = quot1[0]; /* not usefull, just let gcc happy */
|
|
+#else
|
|
quot = serial8250_get_divisor(port, baud);
|
|
+#endif
|
|
|
|
/*
|
|
* Oxford Semi 952 rev B workaround
|
|
@@ -2195,6 +2285,10 @@
|
|
if (up->capabilities & UART_CAP_UUE)
|
|
up->ier |= UART_IER_UUE | UART_IER_RTOIE;
|
|
|
|
+#ifdef CONFIG_JZSOC
|
|
+ up->ier |= UART_IER_RTOIE; /* Set this flag, or very slow */
|
|
+#endif
|
|
+
|
|
serial_out(up, UART_IER, up->ier);
|
|
|
|
if (up->capabilities & UART_CAP_EFR) {
|
|
@@ -2229,7 +2323,15 @@
|
|
serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
|
|
}
|
|
|
|
+#if defined(CONFIG_JZSOC) && !defined(CONFIG_SOC_JZ4730)
|
|
+#define UART_UMR 9
|
|
+#define UART_UACR 10
|
|
+ serial_dl_write(up, quot1[0]);
|
|
+ serial_outp(up, UART_UMR, quot1[1]);
|
|
+ serial_outp(up, UART_UACR, quot1[2]);
|
|
+#else
|
|
serial_dl_write(up, quot);
|
|
+#endif
|
|
|
|
/*
|
|
* LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
|
|
diff -ru linux-2.6/drivers/usb/core/hub.c /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/core/hub.c
|
|
--- linux-2.6/drivers/usb/core/hub.c 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/core/hub.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -1749,6 +1749,25 @@
|
|
{
|
|
int i, status;
|
|
|
|
+#ifdef CONFIG_SOC_JZ4730
|
|
+ /*
|
|
+ * On Jz4730, we assume that the first USB port was used as device.
|
|
+ * If not, please comment next lines.
|
|
+ */
|
|
+ if (port1 == 1) {
|
|
+ return 0;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SOC_JZ4740) || defined(CONFIG_SOC_JZ4750) || defined(CONFIG_SOC_JZ4750D)
|
|
+ /*
|
|
+ * On Jz4740 and Jz4750, the second USB port was used as device.
|
|
+ */
|
|
+ if (port1 == 2) {
|
|
+ return 0;
|
|
+ }
|
|
+#endif
|
|
+
|
|
/* Block EHCI CF initialization during the port reset.
|
|
* Some companion controllers don't like it when they mix.
|
|
*/
|
|
@@ -2666,11 +2685,35 @@
|
|
le16_to_cpu(hub->descriptor->wHubCharacteristics);
|
|
struct usb_device *udev;
|
|
int status, i;
|
|
+#ifdef CONFIG_JZSOC
|
|
+ static char jzhub = 1; /* the hub first to be initialized is jzsoc on-chip hub */
|
|
+#endif
|
|
|
|
dev_dbg (hub_dev,
|
|
"port %d, status %04x, change %04x, %s\n",
|
|
port1, portstatus, portchange, portspeed (portstatus));
|
|
|
|
+#ifdef CONFIG_SOC_JZ4730
|
|
+ /*
|
|
+ * On Jz4730, we assume that the first USB port was used as device.
|
|
+ * If not, please comment next lines.
|
|
+ */
|
|
+ if ((port1 == 1) && (jzhub)) {
|
|
+ jzhub = 0;
|
|
+ return;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SOC_JZ4740) || defined(CONFIG_SOC_JZ4750) || defined(CONFIG_SOC_JZ4750D)
|
|
+ /*
|
|
+ * On Jz4740 and Jz4750, the second USB port was used as device.
|
|
+ */
|
|
+ if ((port1 == 2) && (jzhub)) {
|
|
+ jzhub = 0;
|
|
+ return;
|
|
+ }
|
|
+#endif
|
|
+
|
|
if (hub->has_indicators) {
|
|
set_port_led(hub, port1, HUB_LED_AUTO);
|
|
hub->indicator[port1-1] = INDICATOR_AUTO;
|
|
diff -ru linux-2.6/drivers/usb/gadget/composite.c /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/gadget/composite.c
|
|
--- linux-2.6/drivers/usb/gadget/composite.c 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/gadget/composite.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -492,7 +492,8 @@
|
|
|
|
while (*sp) {
|
|
s = *sp++;
|
|
- if (s->language != language)
|
|
+
|
|
+ if (language && s->language != language)
|
|
continue;
|
|
value = usb_gadget_get_string(s, id, buf);
|
|
if (value > 0)
|
|
@@ -612,8 +613,8 @@
|
|
* housekeeping for the gadget function we're implementing. Most of
|
|
* the work is in config and function specific setup.
|
|
*/
|
|
-static int
|
|
-composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
|
|
+
|
|
+int composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
|
|
{
|
|
struct usb_composite_dev *cdev = get_gadget_data(gadget);
|
|
struct usb_request *req = cdev->req;
|
|
@@ -984,7 +985,7 @@
|
|
.speed = USB_SPEED_HIGH,
|
|
|
|
.bind = composite_bind,
|
|
- .unbind = __exit_p(composite_unbind),
|
|
+ .unbind = composite_unbind,
|
|
|
|
.setup = composite_setup,
|
|
.disconnect = composite_disconnect,
|
|
diff -ru linux-2.6/drivers/usb/gadget/file_storage.c /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/gadget/file_storage.c
|
|
--- linux-2.6/drivers/usb/gadget/file_storage.c 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/gadget/file_storage.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -274,6 +274,18 @@
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
+#if defined(CONFIG_UDC_USE_LB_CACHE)
|
|
+#define GHOST
|
|
+#endif
|
|
+
|
|
+#ifdef GHOST
|
|
+extern unsigned long udc_read(unsigned int offset, unsigned int len, unsigned char *);
|
|
+extern unsigned long udc_write(unsigned int offset, unsigned int len, unsigned char *);
|
|
+extern int NAND_LB_Init(void);
|
|
+extern int NAND_LB_FLASHCACHE(void);
|
|
+extern int NAND_MTD_FLASHCACHE(void);
|
|
+extern int FlushDataState;
|
|
+#endif
|
|
|
|
#define LDBG(lun,fmt,args...) \
|
|
dev_dbg(&(lun)->dev , fmt , ## args)
|
|
@@ -345,8 +357,8 @@
|
|
} mod_data = { // Default values
|
|
.transport_parm = "BBB",
|
|
.protocol_parm = "SCSI",
|
|
- .removable = 0,
|
|
- .can_stall = 1,
|
|
+ .removable = 1,
|
|
+ .can_stall = 0,
|
|
.vendor = DRIVER_VENDOR_ID,
|
|
.product = DRIVER_PRODUCT_ID,
|
|
.release = 0xffff, // Use controller chip type
|
|
@@ -806,6 +818,7 @@
|
|
#define STRING_SERIAL 3
|
|
#define STRING_CONFIG 4
|
|
#define STRING_INTERFACE 5
|
|
+#define STRING_MS_OS 0xee
|
|
|
|
/* There is only one configuration. */
|
|
#define CONFIG_VALUE 1
|
|
@@ -993,6 +1006,7 @@
|
|
{STRING_SERIAL, serial},
|
|
{STRING_CONFIG, "Self-powered"},
|
|
{STRING_INTERFACE, "Mass Storage"},
|
|
+ {STRING_MS_OS, "Microsoft"},
|
|
{}
|
|
};
|
|
|
|
@@ -1614,9 +1628,13 @@
|
|
|
|
/* Perform the read */
|
|
file_offset_tmp = file_offset;
|
|
+#ifdef GHOST
|
|
+ nread = udc_read(file_offset_tmp, amount, bh->buf);
|
|
+#else
|
|
nread = vfs_read(curlun->filp,
|
|
(char __user *) bh->buf,
|
|
amount, &file_offset_tmp);
|
|
+#endif
|
|
VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
|
|
(unsigned long long) file_offset,
|
|
(int) nread);
|
|
@@ -1795,9 +1813,13 @@
|
|
|
|
/* Perform the write */
|
|
file_offset_tmp = file_offset;
|
|
+#ifdef GHOST
|
|
+ nwritten = udc_write(file_offset_tmp, amount, bh->buf);
|
|
+#else
|
|
nwritten = vfs_write(curlun->filp,
|
|
(char __user *) bh->buf,
|
|
amount, &file_offset_tmp);
|
|
+#endif
|
|
VLDBG(curlun, "file write %u @ %llu -> %d\n", amount,
|
|
(unsigned long long) file_offset,
|
|
(int) nwritten);
|
|
@@ -1972,9 +1994,13 @@
|
|
|
|
/* Perform the read */
|
|
file_offset_tmp = file_offset;
|
|
+#ifdef GHOST
|
|
+ nread = udc_read(file_offset_tmp, amount, bh->buf);
|
|
+#else
|
|
nread = vfs_read(curlun->filp,
|
|
(char __user *) bh->buf,
|
|
amount, &file_offset_tmp);
|
|
+#endif
|
|
VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
|
|
(unsigned long long) file_offset,
|
|
(int) nread);
|
|
@@ -2009,7 +2035,7 @@
|
|
{
|
|
u8 *buf = (u8 *) bh->buf;
|
|
|
|
- static char vendor_id[] = "Linux ";
|
|
+ static char vendor_id[] = "Ingenic ";
|
|
static char product_id[] = "File-Stor Gadget";
|
|
|
|
if (!fsg->curlun) { // Unsupported LUNs are okay
|
|
@@ -2876,6 +2902,15 @@
|
|
reply = check_command(fsg, 6, DATA_DIR_NONE,
|
|
0, 1,
|
|
"TEST UNIT READY");
|
|
+#ifdef GHOST
|
|
+ if( FlushDataState >= 1)
|
|
+ FlushDataState++;
|
|
+ if(FlushDataState > 6)
|
|
+ {
|
|
+ NAND_LB_FLASHCACHE();
|
|
+ FlushDataState = 0;
|
|
+ }
|
|
+#endif
|
|
break;
|
|
|
|
/* Although optional, this command is used by MS-Windows. We
|
|
@@ -3425,6 +3460,13 @@
|
|
|
|
/* The main loop */
|
|
while (fsg->state != FSG_STATE_TERMINATED) {
|
|
+#ifdef GHOST
|
|
+ if ((fsg->atomic_bitflags & SUSPENDED))
|
|
+ {
|
|
+ NAND_LB_FLASHCACHE();
|
|
+ NAND_MTD_FLASHCACHE();
|
|
+ }
|
|
+#endif
|
|
if (exception_in_progress(fsg) || signal_pending(current)) {
|
|
handle_exception(fsg);
|
|
continue;
|
|
@@ -3547,6 +3589,10 @@
|
|
LDBG(curlun, "open backing file: %s\n", filename);
|
|
rc = 0;
|
|
|
|
+#ifdef GHOST
|
|
+ NAND_LB_Init();
|
|
+#endif
|
|
+
|
|
out:
|
|
filp_close(filp, current->files);
|
|
return rc;
|
|
diff -ru linux-2.6/drivers/usb/gadget/gadget_chips.h /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/gadget/gadget_chips.h
|
|
--- linux-2.6/drivers/usb/gadget/gadget_chips.h 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/gadget/gadget_chips.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -15,6 +15,24 @@
|
|
#ifndef __GADGET_CHIPS_H
|
|
#define __GADGET_CHIPS_H
|
|
|
|
+#ifdef CONFIG_USB_GADGET_JZ4750
|
|
+#define gadget_is_jz4750(g) !strcmp("ingenic_hsusb", (g)->name) /* same driver */
|
|
+#else
|
|
+#define gadget_is_jz4750(g) 0
|
|
+#endif
|
|
+
|
|
+#ifdef CONFIG_USB_GADGET_JZ4740
|
|
+#define gadget_is_jz4740(g) !strcmp("ingenic_hsusb", (g)->name)
|
|
+#else
|
|
+#define gadget_is_jz4740(g) 0
|
|
+#endif
|
|
+
|
|
+#ifdef CONFIG_USB_GADGET_JZ4730
|
|
+#define gadget_is_jz4730(g) !strcmp("jz4730_udc", (g)->name)
|
|
+#else
|
|
+#define gadget_is_jz4730(g) 0
|
|
+#endif
|
|
+
|
|
#ifdef CONFIG_USB_GADGET_NET2280
|
|
#define gadget_is_net2280(g) !strcmp("net2280", (g)->name)
|
|
#else
|
|
@@ -216,6 +234,13 @@
|
|
return 0x20;
|
|
else if (gadget_is_m66592(gadget))
|
|
return 0x21;
|
|
+ else if (gadget_is_jz4730(gadget))
|
|
+ return 0x22;
|
|
+ else if (gadget_is_jz4740(gadget))
|
|
+ return 0x23;
|
|
+ else if (gadget_is_jz4750(gadget))
|
|
+ return 0x24;
|
|
+
|
|
return -ENOENT;
|
|
}
|
|
|
|
diff -ru linux-2.6/drivers/usb/gadget/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/gadget/Kconfig
|
|
--- linux-2.6/drivers/usb/gadget/Kconfig 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/gadget/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -94,6 +94,47 @@
|
|
Many controller drivers are platform-specific; these
|
|
often need board-specific hooks.
|
|
|
|
+config USB_GADGET_JZ4740
|
|
+ boolean "JZ4740 UDC"
|
|
+ depends on SOC_JZ4740
|
|
+ select USB_GADGET_DUALSPEED
|
|
+ help
|
|
+ Select this to support the Ingenic JZ4740 processor
|
|
+ high speed USB device controller.
|
|
+
|
|
+config USB_JZ4740
|
|
+ tristate
|
|
+ depends on USB_GADGET_JZ4740
|
|
+ default USB_GADGET
|
|
+ select USB_GADGET_SELECTED
|
|
+
|
|
+config USB_GADGET_JZ4750
|
|
+ boolean "JZ4750 UDC"
|
|
+ depends on SOC_JZ4750 || SOC_JZ4750D
|
|
+ select USB_GADGET_DUALSPEED
|
|
+ help
|
|
+ Select this to support the Ingenic JZ4750 processor
|
|
+ high speed USB device controller.
|
|
+
|
|
+config USB_JZ4750
|
|
+ tristate
|
|
+ depends on USB_GADGET_JZ4750
|
|
+ default USB_GADGET
|
|
+ select USB_GADGET_SELECTED
|
|
+
|
|
+config USB_GADGET_JZ4730
|
|
+ boolean "JZ4730 UDC"
|
|
+ depends on SOC_JZ4730
|
|
+ help
|
|
+ Select this to support the Ingenic JZ4730 processor
|
|
+ full speed USB device controller.
|
|
+
|
|
+config USB_JZ4730
|
|
+ tristate
|
|
+ depends on USB_GADGET_JZ4730
|
|
+ default USB_GADGET
|
|
+ select USB_GADGET_SELECTED
|
|
+
|
|
config USB_GADGET_AMD5536UDC
|
|
boolean "AMD5536 UDC"
|
|
depends on PCI
|
|
@@ -399,6 +440,18 @@
|
|
|
|
endchoice
|
|
|
|
+config USB_JZ_UDC_HOTPLUG
|
|
+ boolean "Ingenic USB Device Controller Hotplug Support"
|
|
+ depends on USB_GADGET_JZ4750
|
|
+
|
|
+config UDC_USE_LB_CACHE
|
|
+ bool "NAND LB Cache Support"
|
|
+ depends on (USB_FILE_STORAGE || USB_ANDROID) && (SOC_JZ4740 || SOC_JZ4750 || SOC_JZ4750D)
|
|
+ default y
|
|
+ help
|
|
+ say "y" to enable lb cache and UDC work in faster speed.
|
|
+ say "n" to disable lb cache and UDC work in normal speed.
|
|
+
|
|
config USB_GADGET_DUALSPEED
|
|
bool
|
|
depends on USB_GADGET
|
|
@@ -406,7 +459,6 @@
|
|
help
|
|
Means that gadget drivers should include extra descriptors
|
|
and code to handle dual-speed controllers.
|
|
-
|
|
#
|
|
# USB Gadget Drivers
|
|
#
|
|
@@ -596,6 +648,16 @@
|
|
For more information, see Documentation/usb/gadget_printer.txt
|
|
which includes sample code for accessing the device file.
|
|
|
|
+config USB_ANDROID
|
|
+ tristate "Android Gadget"
|
|
+ select USB_JZ_UDC_HOTPLUG
|
|
+
|
|
+ help
|
|
+ The Android gadget provides mass storage and adb transport.
|
|
+
|
|
+ Say "y" to link the driver statically, or "m" to build a
|
|
+ dynamically linked module called "g_android".
|
|
+
|
|
config USB_CDC_COMPOSITE
|
|
tristate "CDC Composite Device (Ethernet and ACM)"
|
|
depends on NET
|
|
diff -ru linux-2.6/drivers/usb/gadget/Makefile /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/gadget/Makefile
|
|
--- linux-2.6/drivers/usb/gadget/Makefile 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/gadget/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -18,6 +18,11 @@
|
|
obj-$(CONFIG_USB_ATMEL_USBA) += atmel_usba_udc.o
|
|
obj-$(CONFIG_USB_FSL_USB2) += fsl_usb2_udc.o
|
|
obj-$(CONFIG_USB_M66592) += m66592-udc.o
|
|
+obj-$(CONFIG_USB_JZ4740) += jz4740_udc.o
|
|
+obj-$(CONFIG_USB_JZ4730) += jz4730_udc.o
|
|
+obj-$(CONFIG_USB_JZ4750) += jz4740_udc.o
|
|
+
|
|
+obj-$(CONFIG_USB_JZ_UDC_HOTPLUG)+= udc_hotplug_core.o
|
|
|
|
#
|
|
# USB gadget drivers
|
|
@@ -35,6 +40,7 @@
|
|
epautoconf.o
|
|
g_cdc-objs := cdc2.o u_ether.o f_ecm.o \
|
|
u_serial.o f_acm.o $(C_UTILS)
|
|
+g_android-objs := android.o f_adb.o f_mass_storage.o $(C_UTILS)
|
|
|
|
ifeq ($(CONFIG_USB_ETH_RNDIS),y)
|
|
g_ether-objs += f_rndis.o rndis.o
|
|
@@ -48,4 +54,5 @@
|
|
obj-$(CONFIG_USB_G_PRINTER) += g_printer.o
|
|
obj-$(CONFIG_USB_MIDI_GADGET) += g_midi.o
|
|
obj-$(CONFIG_USB_CDC_COMPOSITE) += g_cdc.o
|
|
+obj-$(CONFIG_USB_ANDROID) += g_android.o
|
|
|
|
diff -ru linux-2.6/drivers/usb/host/ohci-hcd.c /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/host/ohci-hcd.c
|
|
--- linux-2.6/drivers/usb/host/ohci-hcd.c 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/host/ohci-hcd.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -995,6 +995,11 @@
|
|
#define PCI_DRIVER ohci_pci_driver
|
|
#endif
|
|
|
|
+#ifdef CONFIG_JZSOC
|
|
+#include "ohci-jz.c"
|
|
+#define PLATFORM_DRIVER ohci_hcd_jz_driver
|
|
+#endif
|
|
+
|
|
#if defined(CONFIG_ARCH_SA1100) && defined(CONFIG_SA1111)
|
|
#include "ohci-sa1111.c"
|
|
#define SA1111_DRIVER ohci_hcd_sa1111_driver
|
|
diff -ru linux-2.6/drivers/usb/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/Kconfig
|
|
--- linux-2.6/drivers/usb/Kconfig 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -42,6 +42,7 @@
|
|
default y if PPC_MPC52xx
|
|
# MIPS:
|
|
default y if SOC_AU1X00
|
|
+ default y if JZSOC
|
|
# SH:
|
|
default y if CPU_SUBTYPE_SH7720
|
|
default y if CPU_SUBTYPE_SH7721
|
|
diff -ru linux-2.6/drivers/usb/musb/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/Kconfig
|
|
--- linux-2.6/drivers/usb/musb/Kconfig 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -8,7 +8,10 @@
|
|
|
|
# (M)HDRC = (Multipoint) Highspeed Dual-Role Controller
|
|
config USB_MUSB_HDRC
|
|
- depends on (USB || USB_GADGET) && HAVE_CLK
|
|
+ depends on (USB || USB_GADGET)
|
|
+
|
|
+#&& HAVE_CLK Disabled by River
|
|
+
|
|
depends on !SUPERH
|
|
select TWL4030_USB if MACH_OMAP_3430SDP
|
|
tristate 'Inventra Highspeed Dual Role Controller (TI, ...)'
|
|
@@ -144,12 +147,17 @@
|
|
parameter.
|
|
|
|
config USB_INVENTRA_DMA
|
|
- bool
|
|
+ bool 'Use INVENTRA DMA'
|
|
depends on USB_MUSB_HDRC && !MUSB_PIO_ONLY
|
|
- default ARCH_OMAP2430 || ARCH_OMAP34XX
|
|
+ default ARCH_OMAP2430 || ARCH_OMAP34XX || SOC_JZ4760
|
|
help
|
|
Enable DMA transfers using Mentor's engine.
|
|
|
|
+config USB_MUSB_HSDMA_IRQ_SHARED
|
|
+ bool 'INVENTRA DMA IRQ shared with USB IRQ'
|
|
+ depends on USB_MUSB_HDRC && USB_INVENTRA_DMA && !MUSB_PIO_ONLY
|
|
+ default SOC_JZ4760
|
|
+
|
|
config USB_TI_CPPI_DMA
|
|
bool
|
|
depends on USB_MUSB_HDRC && !MUSB_PIO_ONLY
|
|
diff -ru linux-2.6/drivers/usb/musb/Makefile /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/Makefile
|
|
--- linux-2.6/drivers/usb/musb/Makefile 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -22,6 +22,10 @@
|
|
musb_hdrc-objs += omap2430.o
|
|
endif
|
|
|
|
+ifeq ($(CONFIG_SOC_JZ4760),y)
|
|
+ musb_hdrc-objs += jz4760.o
|
|
+endif
|
|
+
|
|
ifeq ($(CONFIG_USB_GADGET_MUSB_HDRC),y)
|
|
musb_hdrc-objs += musb_gadget_ep0.o musb_gadget.o
|
|
endif
|
|
diff -ru linux-2.6/drivers/usb/musb/musb_core.c /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_core.c
|
|
--- linux-2.6/drivers/usb/musb/musb_core.c 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_core.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -107,13 +107,10 @@
|
|
|
|
#include "musb_core.h"
|
|
|
|
-
|
|
#ifdef CONFIG_ARCH_DAVINCI
|
|
#include "davinci.h"
|
|
#endif
|
|
|
|
-
|
|
-
|
|
unsigned debug;
|
|
module_param(debug, uint, S_IRUGO | S_IWUSR);
|
|
MODULE_PARM_DESC(debug, "Debug message level. Default = 0");
|
|
@@ -148,6 +145,34 @@
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
+static inline void musb_dump_packet(int epnum, const u8 *packet, u16 len)
|
|
+{
|
|
+ u16 i;
|
|
+
|
|
+#ifdef MUSB_DUMP_EP_NUM
|
|
+ if (epnum != MUSB_DUMP_EP_NUM)
|
|
+ return;
|
|
+#endif
|
|
+
|
|
+ printk(KERN_ERR "\nMUSB Packet Dump: Length: %d bytes.\n", len);
|
|
+ printk(KERN_ERR "==============================================\n");
|
|
+
|
|
+ for (i = 0; i < len; i++) {
|
|
+ printk("0x%02x ", packet[i]);
|
|
+ if ((i+ 1) % 10 == 0)
|
|
+ printk("\n");
|
|
+ }
|
|
+
|
|
+ printk("\n");
|
|
+ printk(KERN_ERR "==============================================\n");
|
|
+}
|
|
+
|
|
+#define MUSB_DUMP_TX_PACKET(epnum, packet, len) \
|
|
+// musb_dump_packet(epnum, packet, len)
|
|
+
|
|
+#define MUSB_DUMP_RX_PACKET(epnum, packet, len) \
|
|
+// musb_dump_packet(epnum, packet, len)
|
|
+
|
|
#ifndef CONFIG_USB_TUSB6010
|
|
/*
|
|
* Load an endpoint's FIFO
|
|
@@ -187,6 +212,8 @@
|
|
/* byte aligned */
|
|
writesb(fifo, src, len);
|
|
}
|
|
+
|
|
+ MUSB_DUMP_TX_PACKET(hw_ep->num, src, len);
|
|
}
|
|
|
|
/*
|
|
@@ -225,6 +252,8 @@
|
|
/* byte aligned */
|
|
readsb(fifo, dst, len);
|
|
}
|
|
+
|
|
+ MUSB_DUMP_RX_PACKET(hw_ep->epnum, dst, len);
|
|
}
|
|
|
|
#endif /* normal PIO */
|
|
@@ -477,6 +506,20 @@
|
|
|
|
#ifdef CONFIG_USB_MUSB_HDRC_HCD
|
|
/* see manual for the order of the tests */
|
|
+
|
|
+#ifdef CONFIG_SOC_JZ4760
|
|
+ /*
|
|
+ * Modified by River
|
|
+ * Note: There is a strange Session request IRQ asserted in the MUSB IP core of JZ4760 when MUSB is operating in DEVICE mode.
|
|
+ * We just ignore it.
|
|
+ */
|
|
+
|
|
+ if ((int_usb & MUSB_INTR_SESSREQ) && !(devctl & MUSB_DEVCTL_HM)) {
|
|
+ DBG(1, "SESSION_REQUEST (%s)\n", otg_state_string(musb));
|
|
+
|
|
+ handled = IRQ_HANDLED;
|
|
+ }
|
|
+#else
|
|
if (int_usb & MUSB_INTR_SESSREQ) {
|
|
DBG(1, "SESSION_REQUEST (%s)\n", otg_state_string(musb));
|
|
|
|
@@ -495,6 +538,7 @@
|
|
|
|
handled = IRQ_HANDLED;
|
|
}
|
|
+#endif
|
|
|
|
if (int_usb & MUSB_INTR_VBUSERROR) {
|
|
int ignore = 0;
|
|
@@ -766,6 +810,7 @@
|
|
#ifdef CONFIG_USB_MUSB_HDRC_HCD
|
|
case OTG_STATE_A_HOST:
|
|
case OTG_STATE_A_SUSPEND:
|
|
+ usb_hcd_resume_root_hub(musb_to_hcd(musb)); /* River - from Linux-2.6.29-rc6 usb-musb-resume-suspend-root-hub-on-disconnect.patch */
|
|
musb_root_disconnect(musb);
|
|
if (musb->a_wait_bcon != 0)
|
|
musb_platform_try_idle(musb, jiffies
|
|
@@ -959,10 +1004,13 @@
|
|
spin_lock_irqsave(&musb->lock, flags);
|
|
musb_platform_disable(musb);
|
|
musb_generic_disable(musb);
|
|
+
|
|
+#ifdef CONFIG_HAVE_CLK
|
|
if (musb->clock) {
|
|
clk_put(musb->clock);
|
|
musb->clock = NULL;
|
|
}
|
|
+#endif
|
|
spin_unlock_irqrestore(&musb->lock, flags);
|
|
|
|
/* FIXME power down */
|
|
@@ -1259,7 +1307,7 @@
|
|
hw_ep = musb->endpoints + epnum;
|
|
|
|
/* read from core using indexed model */
|
|
- reg = musb_readb(hw_ep->regs, 0x10 + MUSB_FIFOSIZE);
|
|
+ reg = musb_readb(mbase, 0x10 + MUSB_FIFOSIZE); /* Do not use hw_ep->regs before it's initialized. - Fixed by River. */
|
|
if (!reg) {
|
|
/* 0's returned when no more endpoints */
|
|
break;
|
|
@@ -1402,6 +1450,9 @@
|
|
/* configure ep0 */
|
|
musb->endpoints[0].max_packet_sz_tx = MUSB_EP0_FIFOSIZE;
|
|
musb->endpoints[0].max_packet_sz_rx = MUSB_EP0_FIFOSIZE;
|
|
+
|
|
+ /* Added by River */
|
|
+ musb->endpoints[0].is_shared_fifo = 1;
|
|
|
|
/* discover endpoint configuration */
|
|
musb->nr_endpoints = 1;
|
|
@@ -1477,8 +1528,48 @@
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
-#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3430)
|
|
+#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3430) || defined(CONFIG_SOC_JZ4760) /* Added by River */
|
|
+
|
|
+/* Modified by River - For DMA IRQ Sharing */
|
|
+#if defined(CONFIG_USB_MUSB_HSDMA_IRQ_SHARED)
|
|
+static irqreturn_t generic_interrupt(int irq, void *__hci)
|
|
+{
|
|
+ unsigned long flags;
|
|
+ struct musb *musb = __hci;
|
|
+
|
|
+ irqreturn_t rv, rv_dma, rv_usb;
|
|
+
|
|
+ rv = rv_dma = rv_usb = IRQ_NONE;
|
|
+
|
|
+ spin_lock_irqsave(&musb->lock, flags);
|
|
+
|
|
+ /* Process DMA IRQ. */
|
|
+ if (dma_controller_fetch_intr(musb->dma_controller))
|
|
+ rv_dma = dma_controller_irq(irq, (void *)musb);
|
|
+
|
|
+ musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB);
|
|
+ musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX);
|
|
+ musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX);
|
|
+
|
|
+ if (musb->int_usb || musb->int_tx || musb->int_rx)
|
|
+ rv_usb = musb_interrupt(musb);
|
|
+
|
|
+ spin_unlock_irqrestore(&musb->lock, flags);
|
|
+
|
|
+ /* REVISIT we sometimes get spurious IRQs on g_ep0
|
|
+ * not clear why...
|
|
+ */
|
|
+
|
|
+ rv = (rv_dma == IRQ_HANDLED || rv_usb == IRQ_HANDLED) ? IRQ_HANDLED : IRQ_NONE;
|
|
|
|
+ if (rv != IRQ_HANDLED)
|
|
+ DBG(5, "spurious?\n");
|
|
+
|
|
+ return IRQ_HANDLED;
|
|
+}
|
|
+
|
|
+#else /* !CONFIG_USB_MUSB_HSDMA_IRQ_SHARED */
|
|
+/* Original IRQ Handler */
|
|
static irqreturn_t generic_interrupt(int irq, void *__hci)
|
|
{
|
|
unsigned long flags;
|
|
@@ -1504,6 +1595,7 @@
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
+#endif /* Defined CONFIG_USB_MUSB_HSDMA_IRQ_SHARED - End added */
|
|
|
|
#else
|
|
#define generic_interrupt NULL
|
|
@@ -1525,11 +1617,14 @@
|
|
|
|
devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
|
|
power = musb_readb(musb->mregs, MUSB_POWER);
|
|
+
|
|
+ D("DEVCTL: 0x%x, POWER: 0x%x.\n", devctl, power);
|
|
+ D("musb->int_usb: 0x%x, musb->int_tx: 0x%x, musb->int_rx: 0x%x.\n", musb->int_usb, musb->int_tx, musb->int_rx);
|
|
|
|
DBG(4, "** IRQ %s usb%04x tx%04x rx%04x\n",
|
|
(devctl & MUSB_DEVCTL_HM) ? "host" : "peripheral",
|
|
musb->int_usb, musb->int_tx, musb->int_rx);
|
|
-
|
|
+
|
|
/* the core can interrupt us for multiple reasons; docs have
|
|
* a generic interrupt flowchart to follow
|
|
*/
|
|
@@ -1652,6 +1747,30 @@
|
|
#ifdef CONFIG_SYSFS
|
|
|
|
static ssize_t
|
|
+musb_devctl_show(struct device *dev, struct device_attribute *attr, char *buf)
|
|
+{
|
|
+ struct musb *musb = dev_to_musb(dev);
|
|
+ unsigned long flags;
|
|
+ int ret = -EINVAL;
|
|
+
|
|
+
|
|
+ spin_lock_irqsave(&musb->lock, flags);
|
|
+ ret = sprintf(buf, "0x%x\n", musb_readb(musb->mregs, MUSB_DEVCTL));
|
|
+ spin_unlock_irqrestore(&musb->lock, flags);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static ssize_t
|
|
+musb_devctl_store(struct device *dev, struct device_attribute *attr,
|
|
+ const char *buf, size_t n)
|
|
+{
|
|
+ return n;
|
|
+}
|
|
+static DEVICE_ATTR(devctl, 0644, musb_devctl_show, musb_devctl_store);
|
|
+
|
|
+
|
|
+static ssize_t
|
|
musb_mode_show(struct device *dev, struct device_attribute *attr, char *buf)
|
|
{
|
|
struct musb *musb = dev_to_musb(dev);
|
|
@@ -1826,6 +1945,7 @@
|
|
*/
|
|
|
|
#ifdef CONFIG_SYSFS
|
|
+ device_remove_file(musb->controller, &dev_attr_devctl);
|
|
device_remove_file(musb->controller, &dev_attr_mode);
|
|
device_remove_file(musb->controller, &dev_attr_vbus);
|
|
#ifdef CONFIG_USB_MUSB_OTG
|
|
@@ -1838,9 +1958,12 @@
|
|
#endif
|
|
|
|
if (musb->nIrq >= 0) {
|
|
- disable_irq_wake(musb->nIrq);
|
|
+ if (musb->b_irq_wake) /* Fixed by River. - Don't call disable_irq_wake() when set_irq_wake() fails. */
|
|
+ disable_irq_wake(musb->nIrq);
|
|
+
|
|
free_irq(musb->nIrq, musb);
|
|
}
|
|
+
|
|
if (is_dma_capable() && musb->dma_controller) {
|
|
struct dma_controller *c = musb->dma_controller;
|
|
|
|
@@ -1852,10 +1975,12 @@
|
|
musb_platform_exit(musb);
|
|
musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
|
|
|
|
+#ifdef CONFIG_HAVE_CLK /* Added by River */
|
|
if (musb->clock) {
|
|
clk_disable(musb->clock);
|
|
clk_put(musb->clock);
|
|
}
|
|
+#endif
|
|
|
|
#ifdef CONFIG_USB_MUSB_OTG
|
|
put_device(musb->xceiv.dev);
|
|
@@ -1922,9 +2047,13 @@
|
|
spin_lock_init(&musb->lock);
|
|
musb->board_mode = plat->mode;
|
|
musb->board_set_power = plat->set_power;
|
|
+
|
|
+#ifdef CONFIG_HAVE_CLK /* Added by River */
|
|
musb->set_clock = plat->set_clock;
|
|
+#endif
|
|
musb->min_power = plat->min_power;
|
|
|
|
+#ifdef CONFIG_HAVE_CLK /* Added by River */
|
|
/* Clock usage is chip-specific ... functional clock (DaVinci,
|
|
* OMAP2430), or PHY ref (some TUSB6010 boards). All this core
|
|
* code does is make sure a clock handle is available; platform
|
|
@@ -1938,6 +2067,7 @@
|
|
goto fail;
|
|
}
|
|
}
|
|
+#endif
|
|
|
|
/* assume vbus is off */
|
|
|
|
@@ -1990,8 +2120,10 @@
|
|
}
|
|
musb->nIrq = nIrq;
|
|
/* FIXME this handles wakeup irqs wrong */
|
|
- if (enable_irq_wake(nIrq) == 0)
|
|
+ if (enable_irq_wake(nIrq) == 0) { /* Fixe by River. */
|
|
device_init_wakeup(dev, 1);
|
|
+ musb->b_irq_wake = 1;
|
|
+ }
|
|
|
|
pr_info("%s: USB %s mode controller at %p using %s, IRQ %d\n",
|
|
musb_driver_name,
|
|
@@ -2057,13 +2189,18 @@
|
|
return 0;
|
|
|
|
fail:
|
|
+
|
|
+#ifdef CONFIG_HAVE_CLK
|
|
if (musb->clock)
|
|
clk_put(musb->clock);
|
|
+#endif
|
|
+
|
|
device_init_wakeup(dev, 0);
|
|
musb_free(musb);
|
|
return status;
|
|
|
|
#ifdef CONFIG_SYSFS
|
|
+ status = device_create_file(dev, &dev_attr_devctl);
|
|
status = device_create_file(dev, &dev_attr_mode);
|
|
status = device_create_file(dev, &dev_attr_vbus);
|
|
#ifdef CONFIG_USB_GADGET_MUSB_HDRC
|
|
@@ -2144,8 +2281,10 @@
|
|
unsigned long flags;
|
|
struct musb *musb = dev_to_musb(&pdev->dev);
|
|
|
|
+#ifdef CONFIG_HAVE_CLK
|
|
if (!musb->clock)
|
|
return 0;
|
|
+#endif
|
|
|
|
spin_lock_irqsave(&musb->lock, flags);
|
|
|
|
@@ -2159,10 +2298,13 @@
|
|
*/
|
|
}
|
|
|
|
+#ifdef CONFIG_HAVE_CLK
|
|
if (musb->set_clock)
|
|
musb->set_clock(musb->clock, 0);
|
|
else
|
|
clk_disable(musb->clock);
|
|
+#endif
|
|
+
|
|
spin_unlock_irqrestore(&musb->lock, flags);
|
|
return 0;
|
|
}
|
|
@@ -2172,15 +2314,18 @@
|
|
unsigned long flags;
|
|
struct musb *musb = dev_to_musb(&pdev->dev);
|
|
|
|
+#ifdef CONFIG_HAVE_CLK
|
|
if (!musb->clock)
|
|
return 0;
|
|
-
|
|
+#endif
|
|
spin_lock_irqsave(&musb->lock, flags);
|
|
|
|
+#ifdef CONFIG_HAVE_CLK
|
|
if (musb->set_clock)
|
|
musb->set_clock(musb->clock, 1);
|
|
else
|
|
clk_enable(musb->clock);
|
|
+#endif
|
|
|
|
/* for static cmos like DaVinci, register values were preserved
|
|
* unless for some reason the whole soc powered down and we're
|
|
diff -ru linux-2.6/drivers/usb/musb/musb_core.h /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_core.h
|
|
--- linux-2.6/drivers/usb/musb/musb_core.h 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_core.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -52,7 +52,6 @@
|
|
struct musb_hw_ep;
|
|
struct musb_ep;
|
|
|
|
-
|
|
#include "musb_debug.h"
|
|
#include "musb_dma.h"
|
|
|
|
@@ -63,7 +62,8 @@
|
|
#include "../core/hcd.h"
|
|
#include "musb_host.h"
|
|
|
|
-
|
|
+#define D(fmt, args...) \
|
|
+// printk(KERN_ERR "%s(): LINE: %d "fmt, __func__, __LINE__, ##args)
|
|
|
|
#ifdef CONFIG_USB_MUSB_OTG
|
|
|
|
@@ -306,7 +306,10 @@
|
|
struct musb {
|
|
/* device lock */
|
|
spinlock_t lock;
|
|
+
|
|
+#ifdef CONFIG_HAVE_CLK /* Added by River */
|
|
struct clk *clock;
|
|
+#endif
|
|
irqreturn_t (*isr)(int, void *);
|
|
struct work_struct irq_work;
|
|
|
|
@@ -359,7 +362,8 @@
|
|
struct otg_transceiver xceiv;
|
|
|
|
int nIrq;
|
|
-
|
|
+ u8 b_irq_wake; /* Added by River. */
|
|
+
|
|
struct musb_hw_ep endpoints[MUSB_C_NUM_EPS];
|
|
#define control_ep endpoints
|
|
|
|
@@ -371,8 +375,9 @@
|
|
u8 board_mode; /* enum musb_mode */
|
|
int (*board_set_power)(int state);
|
|
|
|
+#ifdef CONFIG_HAVE_CLK /* Added by River */
|
|
int (*set_clock)(struct clk *clk, int is_active);
|
|
-
|
|
+#endif
|
|
u8 min_power; /* vbus for periph, in mA/2 */
|
|
|
|
bool is_host;
|
|
diff -ru linux-2.6/drivers/usb/musb/musb_dma.h /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_dma.h
|
|
--- linux-2.6/drivers/usb/musb/musb_dma.h 2009-08-17 23:57:37.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_dma.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -148,6 +148,13 @@
|
|
* Controllers manage dma channels.
|
|
*/
|
|
struct dma_controller {
|
|
+
|
|
+/* Added by River - For DMA IRQ Sharing */
|
|
+#ifdef CONFIG_USB_MUSB_HSDMA_IRQ_SHARED
|
|
+ u8 int_hsdma; /* MUSB_HSDMA_INTR */
|
|
+#endif
|
|
+/* End added */
|
|
+
|
|
int (*start)(struct dma_controller *);
|
|
int (*stop)(struct dma_controller *);
|
|
struct dma_channel *(*channel_alloc)(struct dma_controller *,
|
|
@@ -163,10 +170,18 @@
|
|
/* called after channel_program(), may indicate a fault */
|
|
extern void musb_dma_completion(struct musb *musb, u8 epnum, u8 transmit);
|
|
|
|
-
|
|
extern struct dma_controller *__init
|
|
dma_controller_create(struct musb *, void __iomem *);
|
|
|
|
extern void dma_controller_destroy(struct dma_controller *);
|
|
|
|
+/* Added by River - For DMA IRQ Sharing */
|
|
+#ifdef CONFIG_USB_MUSB_HSDMA_IRQ_SHARED
|
|
+extern u8 dma_controller_fetch_intr(struct dma_controller *c);
|
|
+
|
|
+irqreturn_t dma_controller_irq(int irq, void *private_data);
|
|
+
|
|
+#endif /* End added */
|
|
+
|
|
#endif /* __MUSB_DMA_H__ */
|
|
+
|
|
diff -ru linux-2.6/drivers/usb/musb/musb_gadget_ep0.c /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_gadget_ep0.c
|
|
--- linux-2.6/drivers/usb/musb/musb_gadget_ep0.c 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_gadget_ep0.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -405,7 +405,8 @@
|
|
csr |= MUSB_RXCSR_P_SENDSTALL
|
|
| MUSB_RXCSR_FLUSHFIFO
|
|
| MUSB_RXCSR_CLRDATATOG
|
|
- | MUSB_TXCSR_P_WZC_BITS;
|
|
+// | MUSB_TXCSR_P_WZC_BITS;
|
|
+ | MUSB_RXCSR_P_WZC_BITS; /* Corrected by River. */
|
|
musb_writew(regs, MUSB_RXCSR,
|
|
csr);
|
|
}
|
|
diff -ru linux-2.6/drivers/usb/musb/musb_host.c /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_host.c
|
|
--- linux-2.6/drivers/usb/musb/musb_host.c 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_host.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -40,10 +40,16 @@
|
|
#include <linux/errno.h>
|
|
#include <linux/init.h>
|
|
#include <linux/list.h>
|
|
+#include <linux/autoconf.h>
|
|
|
|
#include "musb_core.h"
|
|
#include "musb_host.h"
|
|
|
|
+/* Added by River. */
|
|
+/* The MUSBHDRC core RTL V1.8 in JZ4760 has no data toogle control. */
|
|
+#ifndef CONFIG_SOC_JZ4760
|
|
+#define HAVE_DATA_TOGGLE_CONTROL 1
|
|
+#endif
|
|
|
|
/* MUSB HOST status 22-mar-2006
|
|
*
|
|
@@ -296,9 +302,10 @@
|
|
spin_lock(&musb->lock);
|
|
}
|
|
|
|
+/* Modified by River. */
|
|
+#ifdef HAVE_DATA_TOGGLE_CONTROL
|
|
/* for bulk/interrupt endpoints only */
|
|
-static inline void
|
|
-musb_save_toggle(struct musb_hw_ep *ep, int is_in, struct urb *urb)
|
|
+static inline void musb_save_toggle(struct musb_hw_ep *ep, int is_in, struct urb *urb)
|
|
{
|
|
struct usb_device *udev = urb->dev;
|
|
u16 csr;
|
|
@@ -326,6 +333,12 @@
|
|
? 1 : 0);
|
|
}
|
|
}
|
|
+#else /* !HAVE_DATA_TOGGLE_CONTROL */
|
|
+static inline void musb_save_toggle(struct musb_hw_ep *ep, int is_in, struct urb *urb)
|
|
+{
|
|
+ return;
|
|
+}
|
|
+#endif
|
|
|
|
/* caller owns controller lock, irqs are blocked */
|
|
static struct musb_qh *
|
|
@@ -563,7 +576,7 @@
|
|
musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep)
|
|
{
|
|
u16 csr;
|
|
-
|
|
+
|
|
/* NOTE: we know the "rx" fifo reinit never triggers for ep0.
|
|
* That always uses tx_reinit since ep0 repurposes TX register
|
|
* offsets; the initial SETUP packet is also a kind of OUT.
|
|
@@ -586,8 +599,12 @@
|
|
if (csr & MUSB_RXCSR_RXPKTRDY)
|
|
WARNING("rx%d, packet/%d ready?\n", ep->epnum,
|
|
musb_readw(ep->regs, MUSB_RXCOUNT));
|
|
-
|
|
+/* Modified by River. */
|
|
+#ifdef HAVE_DATA_TOGGLE_CONTROL
|
|
musb_h_flush_rxfifo(ep, MUSB_RXCSR_CLRDATATOG);
|
|
+#else
|
|
+ musb_h_flush_rxfifo(ep, 0);
|
|
+#endif
|
|
}
|
|
|
|
/* target addr and (for multipoint) hub addr/port */
|
|
@@ -688,13 +705,15 @@
|
|
| MUSB_TXCSR_TXPKTRDY
|
|
);
|
|
csr |= MUSB_TXCSR_MODE;
|
|
-
|
|
+/* Modified by River. */
|
|
+#ifdef HAVE_DATA_TOGGLE_CONTROL
|
|
if (usb_gettoggle(urb->dev,
|
|
qh->epnum, 1))
|
|
csr |= MUSB_TXCSR_H_WR_DATATOGGLE
|
|
| MUSB_TXCSR_H_DATATOGGLE;
|
|
else
|
|
csr |= MUSB_TXCSR_CLRDATATOG;
|
|
+#endif
|
|
|
|
/* twice in case of double packet buffering */
|
|
musb_writew(epio, MUSB_TXCSR, csr);
|
|
@@ -867,13 +886,18 @@
|
|
|
|
if (hw_ep->rx_reinit) {
|
|
musb_rx_reinit(musb, qh, hw_ep);
|
|
-
|
|
+/* Modified by River. */
|
|
+#ifdef HAVE_DATA_TOGGLE_CONTROL
|
|
/* init new state: toggle and NYET, maybe DMA later */
|
|
- if (usb_gettoggle(urb->dev, qh->epnum, 0))
|
|
+ if (usb_gettoggle(urb->dev, qh->epnum, 0)) {
|
|
csr = MUSB_RXCSR_H_WR_DATATOGGLE
|
|
| MUSB_RXCSR_H_DATATOGGLE;
|
|
- else
|
|
+ }else{
|
|
csr = 0;
|
|
+ }
|
|
+#else
|
|
+ csr = 0;
|
|
+#endif
|
|
if (qh->type == USB_ENDPOINT_XFER_INT)
|
|
csr |= MUSB_RXCSR_DISNYET;
|
|
|
|
diff -ru linux-2.6/drivers/usb/musb/musbhsdma.c /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musbhsdma.c
|
|
--- linux-2.6/drivers/usb/musb/musbhsdma.c 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musbhsdma.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -294,7 +294,11 @@
|
|
return 0;
|
|
}
|
|
|
|
+#ifdef CONFIG_USB_MUSB_HSDMA_IRQ_SHARED
|
|
+irqreturn_t dma_controller_irq(int irq, void *private_data)
|
|
+#else
|
|
static irqreturn_t dma_controller_irq(int irq, void *private_data)
|
|
+#endif /* Defined CONFIG_USB_MUSB_HSDMA_IRQ_SHARED */
|
|
{
|
|
struct musb_dma_controller *controller =
|
|
(struct musb_dma_controller *)private_data;
|
|
@@ -311,7 +315,14 @@
|
|
|
|
spin_lock_irqsave(&musb->lock, flags);
|
|
|
|
+ /* Added By River - For DMA IRQ Sharing */
|
|
+#ifdef CONFIG_USB_MUSB_HSDMA_IRQ_SHARED
|
|
+ int_hsdma = controller->Controller.int_hsdma;
|
|
+#else
|
|
int_hsdma = musb_readb(mbase, MUSB_HSDMA_INTR);
|
|
+#endif
|
|
+ /* End added */
|
|
+
|
|
if (!int_hsdma)
|
|
goto done;
|
|
|
|
@@ -419,15 +430,32 @@
|
|
controller->Controller.channel_release = dma_channel_release;
|
|
controller->Controller.channel_program = dma_channel_program;
|
|
controller->Controller.channel_abort = dma_channel_abort;
|
|
-
|
|
+
|
|
+ /* Modified By River - For DMA IRQ Sharing */
|
|
+#ifdef CONFIG_USB_MUSB_HSDMA_IRQ_SHARED
|
|
+ irq = 0; /* Skip free_irq() when the controller will be removed. */
|
|
+#else
|
|
if (request_irq(irq, dma_controller_irq, IRQF_DISABLED,
|
|
musb->controller->bus_id, &controller->Controller)) {
|
|
dev_err(dev, "request_irq %d failed!\n", irq);
|
|
dma_controller_destroy(&controller->Controller);
|
|
return NULL;
|
|
}
|
|
-
|
|
+#endif
|
|
+ /* End modified */
|
|
controller->irq = irq;
|
|
|
|
return &controller->Controller;
|
|
}
|
|
+
|
|
+/* Added by river - For DMA IRQ Sharing */
|
|
+#ifdef CONFIG_USB_MUSB_HSDMA_IRQ_SHARED
|
|
+u8 dma_controller_fetch_intr(struct dma_controller *c)
|
|
+{
|
|
+ struct musb_dma_controller *mc = (struct musb_dma_controller *)c; /* See the defination... */
|
|
+
|
|
+ c->int_hsdma = musb_readb(mc->pCoreBase, MUSB_HSDMA_INTR);
|
|
+
|
|
+ return c->int_hsdma;
|
|
+}
|
|
+#endif
|
|
diff -ru linux-2.6/drivers/usb/musb/musb_io.h /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_io.h
|
|
--- linux-2.6/drivers/usb/musb/musb_io.h 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/usb/musb/musb_io.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -37,7 +37,7 @@
|
|
|
|
#include <linux/io.h>
|
|
|
|
-#ifndef CONFIG_ARM
|
|
+#if !defined(CONFIG_ARM) && !defined(CONFIG_MIPS)
|
|
static inline void readsl(const void __iomem *addr, void *buf, int len)
|
|
{ insl((unsigned long)addr, buf, len); }
|
|
static inline void readsw(const void __iomem *addr, void *buf, int len)
|
|
diff -ru linux-2.6/drivers/video/Kconfig /plain/src/qi/linux-2.6.27.git.svn/drivers/video/Kconfig
|
|
--- linux-2.6/drivers/video/Kconfig 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/video/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -234,6 +234,454 @@
|
|
comment "Frame buffer hardware drivers"
|
|
depends on FB
|
|
|
|
+/************************************************************/
|
|
+
|
|
+config JZSOC_BOOT_LOGO
|
|
+ tristate "JZSOC boot up LOGO support"
|
|
+ depends on FB && JZSOC
|
|
+ ---help---
|
|
+ If you select this function, you need put a logo file at ramdisk root directory,
|
|
+ whose name should be "/logo.rle" or "/logo.rgb565".
|
|
+
|
|
+choice
|
|
+ prompt "Boot LOGO File Format Select"
|
|
+ depends on JZSOC_BOOT_LOGO
|
|
+
|
|
+config FB_565RLE_LOGO
|
|
+ bool "Boot logo is 565REL file"
|
|
+
|
|
+config FB_565RGB_LOGO
|
|
+ bool "Boot logo a 565RGB file"
|
|
+
|
|
+endchoice
|
|
+
|
|
+
|
|
+config FB_ANDROID_JZ4755SOC
|
|
+ tristate "JZ4755SOC ANDROID LCD controller support"
|
|
+ depends on FB && JZSOC
|
|
+ select FB_CFB_FILLRECT
|
|
+ select FB_CFB_COPYAREA
|
|
+ select FB_CFB_IMAGEBLIT
|
|
+ ---help---
|
|
+ JZSOC ANDROID LCD Controller driver support.
|
|
+
|
|
+config IPU_ANDROID_JZ4755
|
|
+ bool "Jz4755 android ipu support"
|
|
+ depends on FB_ANDROID_JZ4755SOC && SOC_JZ4750D
|
|
+ ---help---
|
|
+ Use JZ4755 Android IPU, if need, please select this.
|
|
+config FB_JZ4755_ANDROID_LCD
|
|
+ tristate "JZ4755 Android LCD Controller support"
|
|
+ depends on FB_ANDROID_JZ4755SOC && SOC_JZ4750D
|
|
+ ---help---
|
|
+ JZ4755 Android LCD Controller driver.
|
|
+ JZ4755 Android LCD Controller support OSD function(refer jz4755_lcdc_spec.pdf).
|
|
+ JZ4755 Android LCD OSD implement 2 framebuffer layers: foreground0 and foreground1.
|
|
+# JZ4755 LCD driver support 2 foregrounds default.
|
|
+
|
|
+choice
|
|
+ prompt "Android LCD Type Select"
|
|
+ depends on FB_JZ4755_ANDROID_LCD
|
|
+ default FB_JZ4755_ANDROID_TFT_LCD
|
|
+
|
|
+config FB_JZ4755_ANDROID_TFT
|
|
+ bool "JZ4755 Android LCD Controller TFT LCD support"
|
|
+
|
|
+endchoice
|
|
+
|
|
+choice
|
|
+ depends on FB_JZ4755_ANDROID_LCD && FB_JZ4755_ANDROID_TFT
|
|
+ prompt "JZ4755 Android LCD TFT Panels Support"
|
|
+ default JZ4755_ANDROID_LCD_AUO_A043FL01V2
|
|
+ ---help---
|
|
+ Please select the lcd panel in you board
|
|
+
|
|
+config JZ4755_ANDROID_LCD_AUO_A043FL01V2
|
|
+ bool "AUO A043FL01V2 TFT panel (480x272)(24bits)"
|
|
+
|
|
+config JZ4755_ANDROID_LCD_TOPPOLY_TD043MGEB1
|
|
+ bool "TOPPOLY_TD043MGEB1 TFT panel(800x480)(24bit mode)"
|
|
+
|
|
+endchoice
|
|
+
|
|
+
|
|
+config FB_ANDROID_JZSOC
|
|
+ tristate "JZSOC ANDROID LCD controller support"
|
|
+ depends on FB && JZSOC
|
|
+ select FB_CFB_FILLRECT
|
|
+ select FB_CFB_COPYAREA
|
|
+ select FB_CFB_IMAGEBLIT
|
|
+ ---help---
|
|
+ JZSOC ANDROID LCD Controller driver support.
|
|
+
|
|
+config IPU_ANDROID_JZ4750
|
|
+ bool "Jz4750 android ipu support"
|
|
+ depends on FB_ANDROID_JZSOC && SOC_JZ4750
|
|
+ ---help---
|
|
+ Use JZ4750 Android IPU, if need, please select this.
|
|
+config FB_JZ4750_ANDROID_LCD
|
|
+ tristate "JZ4750 Android LCD Controller support"
|
|
+ depends on FB_ANDROID_JZSOC && SOC_JZ4750
|
|
+ ---help---
|
|
+ JZ4750 Android LCD Controller driver.
|
|
+ JZ4750 Android LCD Controller support OSD function(refer jz4750_lcdc_spec.pdf).
|
|
+ JZ4750 Android LCD OSD implement 2 framebuffer layers: foreground0 and foreground1.
|
|
+# JZ4750 LCD driver support 2 foregrounds default.
|
|
+
|
|
+choice
|
|
+ prompt "Android LCD Type Select"
|
|
+ depends on FB_JZ4750_ANDROID_LCD
|
|
+ default FB_JZ4750_ANDROID_TFT_LCD
|
|
+
|
|
+config FB_JZ4750_ANDROID_TFT
|
|
+ bool "JZ4750 Android LCD Controller TFT LCD support"
|
|
+
|
|
+endchoice
|
|
+
|
|
+choice
|
|
+ depends on FB_JZ4750_ANDROID_LCD && FB_JZ4750_ANDROID_TFT
|
|
+ prompt "JZ4750 Android LCD TFT Panels Support"
|
|
+ default JZ4750_ANDROID_LCD_AUO_A043FL01V2
|
|
+ ---help---
|
|
+ Please select the lcd panel in you board
|
|
+
|
|
+config JZ4750_ANDROID_LCD_AUO_A043FL01V2
|
|
+ bool "AUO A043FL01V2 TFT panel (480x272)(24bits)"
|
|
+
|
|
+config JZ4750_ANDROID_LCD_TOPPOLY_TD043MGEB1
|
|
+ bool "TOPPOLY_TD043MGEB1 TFT panel(800x480)(24bit mode)"
|
|
+
|
|
+endchoice
|
|
+
|
|
+/************************************************************/
|
|
+config FB_JZSOC
|
|
+ tristate "JZSOC LCD controller support"
|
|
+ depends on FB && JZSOC
|
|
+ select FB_CFB_FILLRECT
|
|
+ select FB_CFB_COPYAREA
|
|
+ select FB_CFB_IMAGEBLIT
|
|
+ ---help---
|
|
+ JZSOC LCD Controller and Smart LCD Controller driver support.
|
|
+
|
|
+config FB_JZ4740_SLCD
|
|
+ tristate "JZ4740 Smart LCD controller support"
|
|
+ depends on FB_JZSOC && SOC_JZ4740
|
|
+ default n
|
|
+ ---help---
|
|
+ This is the frame buffer device driver for the JZ4740 Smart LCD controller.
|
|
+ If select this, please set <JZ4740 LCD controller support> to <n>.
|
|
+
|
|
+choice
|
|
+ depends on FB_JZ4740_SLCD
|
|
+ prompt "SLCD Panel"
|
|
+ default JZ_SLCD_LGDP4551_8BUS
|
|
+
|
|
+config JZ_SLCD_LGDP4551
|
|
+ bool "LG LGDP4551 Smart LCD panel"
|
|
+ ---help---
|
|
+ Driver for Smart LCD LGDP4551, 8-bit sytem interface, 16BPP.
|
|
+
|
|
+config JZ_SLCD_SPFD5420A
|
|
+ bool "SPFD5420A Smart LCD panel"
|
|
+ ---help---
|
|
+ Driver for Smart LCD SPFD5420A 18-bit sytem interface, 18BPP.
|
|
+
|
|
+config JZ_SLCD_TRULY
|
|
+ bool "TRULY Smart LCD panel (MAX Pixels 400x240)"
|
|
+ ---help---
|
|
+
|
|
+endchoice
|
|
+
|
|
+config FB_JZLCD_4730_4740
|
|
+ tristate "JZ4730 JZ4740 LCD controller support"
|
|
+ depends on FB_JZSOC && (SOC_JZ4730 || SOC_JZ4740)
|
|
+ help
|
|
+ This is the frame buffer device driver for the JZ4730 and JZ4740 LCD controller.
|
|
+config JZLCD_FRAMEBUFFER_MAX
|
|
+ int "Default FrameBuffer num"
|
|
+ depends on FB_JZLCD_4730_4740
|
|
+ default "1"
|
|
+ ---help---
|
|
+ JZ LCD driver support multi-framebuffers for video applications.
|
|
+config JZLCD_FRAMEBUFFER_ROTATE_SUPPORT
|
|
+ bool "JZLCD FrameBuffer Rotate Support(For TEST)"
|
|
+ depends on FB_JZLCD_4730_4740
|
|
+ default n
|
|
+ ---help---
|
|
+ JZ LCD driver framebuffer rotate support. Rotate angle can be 0,90,180,270.
|
|
+ Note, this fearture is implemented by software, and will cost a lot of cpu capcity.
|
|
+ That is to say, if you select this function, you system will become slowly.
|
|
+ Rotate cost cpu about:
|
|
+ ratate angle 0'C: 0% cpu
|
|
+ ratate angle 90'C: 40% cpu
|
|
+ ratate angle 180'C: 20% cpu
|
|
+ ratate angle 270'C: 40% cpu
|
|
+
|
|
+config JZLCD_FRAMEBUFFER_DEFAULT_ROTATE_ANGLE
|
|
+ int "FrameBuffer default rotate angle"
|
|
+ depends on JZLCD_FRAMEBUFFER_ROTATE_SUPPORT
|
|
+ default 0
|
|
+ ---help---
|
|
+ JZ LCD driver framebuffer angle value can be:
|
|
+ 0: 0'C
|
|
+ 1: 90'C
|
|
+ 2: 180'C
|
|
+ 3: 270'C
|
|
+config JZLCD_FRAMEBUFFER_BPP
|
|
+ int "FrameBuffer bit per pixel"
|
|
+ depends on JZLCD_FRAMEBUFFER_ROTATE_SUPPORT
|
|
+ default 32
|
|
+ ---help---
|
|
+ JZ LCD driver framebuffer support 8bpp, 16bpp, 32bpp
|
|
+choice
|
|
+ depends on FB_JZLCD_4730_4740
|
|
+ prompt "LCD Panel"
|
|
+ default JZLCD_SAMSUNG_LTP400WQF01
|
|
+
|
|
+config JZLCD_SHARP_LQ035Q7
|
|
+ bool "SHARP LQ035Q7 TFT panel (240x320)"
|
|
+
|
|
+config JZLCD_SAMSUNG_LTS350Q1
|
|
+ bool "SAMSUNG LTS350Q1 TFT panel (240x320)"
|
|
+
|
|
+config JZLCD_SAMSUNG_LTV350QVF04
|
|
+ bool "SAMSUNG LTV350QV_F04 TFT panel (320x240)"
|
|
+
|
|
+config JZLCD_SAMSUNG_LTP400WQF01
|
|
+ bool "SAMSUNG LTP400WQF01 TFT panel (480x272)(16bits)"
|
|
+
|
|
+config JZLCD_SAMSUNG_LTP400WQF02
|
|
+ bool "SAMSUNG LTP400WQF02 TFT panel (480x272)(18bits)"
|
|
+
|
|
+config JZLCD_AUO_A030FL01_V1
|
|
+ bool "AUO A030FL01_V1 TFT panel (480x272)"
|
|
+
|
|
+config JZLCD_TRULY_TFTG320240DTSW
|
|
+ bool "TRULY TFTG320240DTSW TFT panel (320x240)"
|
|
+
|
|
+config JZLCD_TRULY_TFTG320240DTSW_SERIAL
|
|
+ bool "TRULY TFTG320240DTSW TFT panel (320x240)(8bit-serial mode)"
|
|
+
|
|
+config JZLCD_TRULY_TFTG240320UTSW_63W_E
|
|
+ bool "TRULY TFTG240320UTSW-63W-E TFT panel (240x320,2.5in)"
|
|
+
|
|
+config JZLCD_FOXCONN_PT035TN01
|
|
+ bool "FOXCONN PT035TN01 TFT panel (320x240)"
|
|
+
|
|
+config JZLCD_INNOLUX_PT035TN01_SERIAL
|
|
+ bool "INNOLUX PT035TN01 TFT panel (320x240,3.5in)(8bit-serial mode)"
|
|
+
|
|
+config JZLCD_TOSHIBA_LTM084P363
|
|
+ bool "Toshiba LTM084P363 TFT panel (800x600)"
|
|
+
|
|
+config JZLCD_HYNIX_HT10X21
|
|
+ bool "Hynix HT10X21_300 TFT panel (1024x768)"
|
|
+
|
|
+config JZLCD_INNOLUX_AT080TN42
|
|
+ bool "INNOLUX AT080TN42 TFT panel (800x600)"
|
|
+
|
|
+config JZLCD_CSTN_800x600
|
|
+ bool "800x600 colorDSTN panel"
|
|
+
|
|
+config JZLCD_CSTN_320x240
|
|
+ bool "320x240 colorSTN panel"
|
|
+
|
|
+config JZLCD_MSTN_480x320
|
|
+ bool "480x320 monoSTN panel"
|
|
+
|
|
+config JZLCD_MSTN_320x240
|
|
+ bool "320x240 monoSTN panel"
|
|
+
|
|
+config JZLCD_MSTN_240x128
|
|
+ bool "240x128 monoSTN panel"
|
|
+
|
|
+config JZLCD_MSTN_INVERSE
|
|
+ bool "Use an inverse color display."
|
|
+ depends on (JZLCD_MSTN_480x320 || JZLCD_MSTN_240x128)
|
|
+
|
|
+endchoice
|
|
+
|
|
+
|
|
+config FB_JZ4750_TVE
|
|
+ bool "Jz4750 TV Encode support"
|
|
+ depends on FB_JZSOC && (SOC_JZ4750 || SOC_JZ4750D)
|
|
+ ---help---
|
|
+ Use JZ4750 TV Encoder controller to display on TV.
|
|
+
|
|
+config IPU_JZ4750
|
|
+ bool "Jz4750 ipu support"
|
|
+ depends on FB_JZSOC && (SOC_JZ4750 || SOC_JZ4750D)
|
|
+ ---help---
|
|
+ Use JZ4750 IPU, if need, please select this.
|
|
+
|
|
+config FB_JZ4750_LCD
|
|
+ tristate "JZ4750 LCD Controller support"
|
|
+ depends on FB_JZSOC && (SOC_JZ4750 || SOC_JZ4750D)
|
|
+ ---help---
|
|
+ JZ4750 LCD Controller driver.
|
|
+ JZ4750 LCD Controller support OSD function(refer jz4750_lcdc_spec.pdf).
|
|
+ JZ4750 LCD OSD implement 2 framebuffer layers: foreground0 and foreground1.
|
|
+# JZ4750 LCD driver support only foreground0 default.
|
|
+
|
|
+choice
|
|
+ depends on FB_JZ4750_LCD
|
|
+ prompt "JZ4750 LCD OSD Mode select"
|
|
+ default JZ4750_LCD_USE_FG1_ONLY
|
|
+
|
|
+config JZ4750_LCD_USE_FG0_ONLY
|
|
+ bool "Only use foreground 0"
|
|
+
|
|
+config JZ4750_LCD_USE_FG1_ONLY
|
|
+ bool "Only use foreground 1"
|
|
+
|
|
+config JZ4750_LCD_USE_2LAYER_FG
|
|
+ bool "Use two-layer foregrounds."
|
|
+endchoice
|
|
+
|
|
+
|
|
+choice
|
|
+ prompt "LCD Type Select"
|
|
+ depends on FB_JZ4750_LCD
|
|
+ default FB_JZ4750_TFT_LCD
|
|
+
|
|
+config FB_JZ4750_TFT
|
|
+ bool "JZ4750 LCD Controller TFT LCD support"
|
|
+
|
|
+config FB_JZ4750_SLCD
|
|
+ bool "JZ4750 LCD Controller Smart LCD support"
|
|
+endchoice
|
|
+
|
|
+choice
|
|
+ depends on FB_JZ4750_LCD && FB_JZ4750_TFT
|
|
+ prompt "JZ4750 LCD TFT Panels Support"
|
|
+ default JZ4750_LCD_SAMSUNG_LTP400WQF02
|
|
+ ---help---
|
|
+ Please select the lcd panel in you board
|
|
+
|
|
+config JZ4750_LCD_SAMSUNG_LTP400WQF01
|
|
+ bool "SAMSUNG LTP400WQF01 TFT panel (480x272)(16bits)"
|
|
+
|
|
+config JZ4750_LCD_SAMSUNG_LTP400WQF02
|
|
+ bool "SAMSUNG LTP400WQF02 TFT panel (480x272)(18bits)"
|
|
+
|
|
+config JZ4750_LCD_AUO_A043FL01V2
|
|
+ bool "AUO A043FL01V2 TFT panel (480x272)(24bits)"
|
|
+
|
|
+config JZ4750_LCD_FOXCONN_PT035TN01
|
|
+ bool "FOXCONN PT035TN01 TFT panel (320x240,3.5in)(18bit-parallel mode)"
|
|
+
|
|
+config JZ4750_LCD_INNOLUX_PT035TN01_SERIAL
|
|
+ bool "INNOLUX PT035TN01 TFT panel (320x240,3.5in)(8bit-serial mode)"
|
|
+
|
|
+config JZ4750_LCD_TOPPOLY_TD025THEA7_RGB_DELTA
|
|
+ bool "TOPPOLY_TD025THEA7 TFT panel(320x240)(serial RGB delta mode)"
|
|
+
|
|
+config JZ4750_LCD_TRULY_TFTG320240DTSW_18BIT
|
|
+ bool "TRULY_TFTG320240DTSW TFT panel (320x240) (Parallel 18bit mode)"
|
|
+
|
|
+config JZ4750D_VGA_DISPLAY
|
|
+ depends on SOC_JZ4750D
|
|
+ bool "Jz4750D VGA Display, Jz4750 don't support"
|
|
+endchoice
|
|
+
|
|
+choice
|
|
+ depends on FB_JZ4750_LCD && FB_JZ4750_SLCD
|
|
+ prompt "JZ4750 Smart LCD Panels Support"
|
|
+ default JZ4750_SLCD_KGM701A3_TFT_SPFD5420A
|
|
+ ---help---
|
|
+ Please select the lcd panel in you board
|
|
+config JZ4750_LCD_TRULY_TFT_GG1P0319LTSW_W
|
|
+ bool "TRULY_TFT_GG1P0319LTSW_W (240x320) (Smart LCD 16bit)"
|
|
+
|
|
+config JZ4750_SLCD_KGM701A3_TFT_SPFD5420A
|
|
+ bool "KGM701A3_TFT_SPFD5420A (400x240) (Smart LCD 18bit)"
|
|
+
|
|
+endchoice
|
|
+
|
|
+config FB_JZ4760_LCD
|
|
+ tristate "JZ4760 LCD Controller support"
|
|
+ depends on FB_JZSOC && SOC_JZ4760
|
|
+ ---help---
|
|
+ JZ4760 LCD Controller driver.
|
|
+ JZ4760 LCD Controller support OSD function(refer jz4760_lcdc_spec.pdf).
|
|
+ JZ4760 LCD OSD implement 2 framebuffer layers: foreground0 and foreground1.
|
|
+# JZ4760 LCD driver support only foreground0 default.
|
|
+
|
|
+choice
|
|
+ depends on FB_JZ4760_LCD
|
|
+ prompt "JZ4760 LCD OSD Mode select"
|
|
+ default JZ4760_LCD_USE_FG1_ONLY
|
|
+
|
|
+config JZ4760_LCD_USE_FG0_ONLY
|
|
+ bool "Only use foreground 0"
|
|
+
|
|
+config JZ4760_LCD_USE_FG1_ONLY
|
|
+ bool "Only use foreground 1"
|
|
+
|
|
+config JZ4760_LCD_USE_2LAYER_FG
|
|
+ bool "Use two-layer foregrounds."
|
|
+endchoice
|
|
+
|
|
+
|
|
+choice
|
|
+ prompt "LCD Type Select"
|
|
+ depends on FB_JZ4760_LCD
|
|
+ default FB_JZ4760_TFT_LCD
|
|
+
|
|
+config FB_JZ4760_TFT
|
|
+ bool "JZ4760 LCD Controller TFT LCD support"
|
|
+
|
|
+config FB_JZ4760_SLCD
|
|
+ bool "JZ4760 LCD Controller Smart LCD support"
|
|
+endchoice
|
|
+
|
|
+choice
|
|
+ depends on FB_JZ4760_LCD && FB_JZ4760_TFT
|
|
+ prompt "JZ4760 LCD TFT Panels Support"
|
|
+ default JZ4760_LCD_SAMSUNG_LTP400WQF02
|
|
+ ---help---
|
|
+ Please select the lcd panel in you board
|
|
+
|
|
+config JZ4760_LCD_SAMSUNG_LTP400WQF01
|
|
+ bool "SAMSUNG LTP400WQF01 TFT panel (480x272)(16bits)"
|
|
+
|
|
+config JZ4760_LCD_SAMSUNG_LTP400WQF02
|
|
+ bool "SAMSUNG LTP400WQF02 TFT panel (480x272)(18bits)"
|
|
+
|
|
+config JZ4760_LCD_AUO_A043FL01V2
|
|
+ bool "AUO A043FL01V2 TFT panel (480x272)(24bits)"
|
|
+
|
|
+config JZ4760_LCD_FOXCONN_PT035TN01
|
|
+ bool "FOXCONN PT035TN01 TFT panel (320x240,3.5in)(18bit-parallel mode)"
|
|
+
|
|
+config JZ4760_LCD_INNOLUX_PT035TN01_SERIAL
|
|
+ bool "INNOLUX PT035TN01 TFT panel (320x240,3.5in)(8bit-serial mode)"
|
|
+
|
|
+config JZ4760_LCD_TOPPOLY_TD025THEA7_RGB_DELTA
|
|
+ bool "TOPPOLY_TD025THEA7 TFT panel(320x240)(serial RGB delta mode)"
|
|
+
|
|
+config JZ4760_LCD_TRULY_TFTG320240DTSW_18BIT
|
|
+ bool "TRULY_TFTG320240DTSW TFT panel (320x240) (Parallel 18bit mode)"
|
|
+
|
|
+config JZ4760_VGA_DISPLAY
|
|
+ bool "Jz4760 VGA Display, Jz4760 don't support"
|
|
+endchoice
|
|
+
|
|
+choice
|
|
+ depends on FB_JZ4760_LCD && FB_JZ4760_SLCD
|
|
+ prompt "JZ4760 Smart LCD Panels Support"
|
|
+ default JZ4760_SLCD_KGM701A3_TFT_SPFD5420A
|
|
+ ---help---
|
|
+ Please select the lcd panel in you board
|
|
+config JZ4760_LCD_TRULY_TFT_GG1P0319LTSW_W
|
|
+ bool "TRULY_TFT_GG1P0319LTSW_W (240x320) (Smart LCD 16bit)"
|
|
+
|
|
+config JZ4760_SLCD_KGM701A3_TFT_SPFD5420A
|
|
+ bool "KGM701A3_TFT_SPFD5420A (400x240) (Smart LCD 18bit)"
|
|
+
|
|
+endchoice
|
|
+
|
|
+
|
|
config FB_CIRRUS
|
|
tristate "Cirrus Logic support"
|
|
depends on FB && (ZORRO || PCI)
|
|
diff -ru linux-2.6/drivers/video/Makefile /plain/src/qi/linux-2.6.27.git.svn/drivers/video/Makefile
|
|
--- linux-2.6/drivers/video/Makefile 2009-08-17 23:58:02.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/drivers/video/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -28,6 +28,17 @@
|
|
obj-$(CONFIG_FB_DEFERRED_IO) += fb_defio.o
|
|
|
|
# Hardware specific drivers go first
|
|
+obj-$(CONFIG_JZSOC_BOOT_LOGO) += logo.o
|
|
+obj-$(CONFIG_FB_JZLCD_4730_4740) += jzlcd.o
|
|
+obj-$(CONFIG_FB_JZ4740_SLCD) += jz4740_slcd.o
|
|
+obj-$(CONFIG_FB_JZ4750_TFT) += jz4750_lcd.o
|
|
+obj-$(CONFIG_FB_JZ4750_SLCD) += jz4750_slcd.o
|
|
+obj-$(CONFIG_FB_JZ4760_TFT) += jz4760_lcd.o
|
|
+obj-$(CONFIG_FB_JZ4760_SLCD) += jz4760_slcd.o
|
|
+obj-$(CONFIG_FB_JZ4750_TVE) += jz4750_tve.o
|
|
+obj-$(CONFIG_FB_JZ4750_ANDROID_TFT) += jz4750_android_lcd.o
|
|
+obj-$(CONFIG_FB_JZ4755_ANDROID_TFT) += jz4755_android_lcd.o
|
|
+
|
|
obj-$(CONFIG_FB_AMIGA) += amifb.o c2p.o
|
|
obj-$(CONFIG_FB_AM200EPD) += am200epd.o
|
|
obj-$(CONFIG_FB_ARC) += arcfb.o
|
|
diff -ru linux-2.6/include/asm-mips/bootinfo.h /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/bootinfo.h
|
|
--- linux-2.6/include/asm-mips/bootinfo.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/bootinfo.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -57,6 +57,15 @@
|
|
#define MACH_MIKROTIK_RB532 0 /* Mikrotik RouterBoard 532 */
|
|
#define MACH_MIKROTIK_RB532A 1 /* Mikrotik RouterBoard 532A */
|
|
|
|
+/*
|
|
+ * Valid machtype for group INGENIC
|
|
+ */
|
|
+#define MACH_INGENIC_JZ4730 0 /* JZ4730 SOC */
|
|
+#define MACH_INGENIC_JZ4740 1 /* JZ4740 SOC */
|
|
+#define MACH_INGENIC_JZ4750 2 /* JZ4750 SOC */
|
|
+#define MACH_INGENIC_JZ4750D 3 /* JZ4750D SOC */
|
|
+#define MACH_INGENIC_JZ4760 4 /* JZ4760 SOC */
|
|
+
|
|
#define CL_SIZE COMMAND_LINE_SIZE
|
|
|
|
extern char *system_type;
|
|
diff -ru linux-2.6/include/asm-mips/cpu.h /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/cpu.h
|
|
--- linux-2.6/include/asm-mips/cpu.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/cpu.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -33,8 +33,11 @@
|
|
#define PRID_COMP_TOSHIBA 0x070000
|
|
#define PRID_COMP_LSI 0x080000
|
|
#define PRID_COMP_LEXRA 0x0b0000
|
|
-
|
|
-
|
|
+#if defined(CONFIG_JZ_FPGA) && defined(CONFIG_SOC_JZ4760)
|
|
+#define PRID_COMP_INGENIC 0xd80000
|
|
+#else
|
|
+#define PRID_COMP_INGENIC 0xd00000
|
|
+#endif
|
|
/*
|
|
* Assigned values for the product ID register. In order to detect a
|
|
* certain CPU type exactly eventually additional registers may need to
|
|
@@ -114,6 +117,12 @@
|
|
#define PRID_IMP_BCM3302 0x9000
|
|
|
|
/*
|
|
+ * These are the PRID's for when 23:16 == PRID_COMP_INGENIC
|
|
+ */
|
|
+
|
|
+#define PRID_IMP_JZRISC 0x0200
|
|
+
|
|
+/*
|
|
* Definitions for 7:0 on legacy processors
|
|
*/
|
|
|
|
@@ -204,6 +213,11 @@
|
|
*/
|
|
CPU_5KC, CPU_20KC, CPU_25KF, CPU_SB1, CPU_SB1A, CPU_LOONGSON2,
|
|
|
|
+ /*
|
|
+ * Ingenic class processors
|
|
+ */
|
|
+ CPU_JZRISC, CPU_XBURST,
|
|
+
|
|
CPU_LAST
|
|
};
|
|
|
|
diff -ru linux-2.6/include/asm-mips/mach-generic/irq.h /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/mach-generic/irq.h
|
|
--- linux-2.6/include/asm-mips/mach-generic/irq.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/mach-generic/irq.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -9,7 +9,7 @@
|
|
#define __ASM_MACH_GENERIC_IRQ_H
|
|
|
|
#ifndef NR_IRQS
|
|
-#define NR_IRQS 128
|
|
+#define NR_IRQS 256
|
|
#endif
|
|
|
|
#ifdef CONFIG_I8259
|
|
diff -ru linux-2.6/include/asm-mips/ptrace.h /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/ptrace.h
|
|
--- linux-2.6/include/asm-mips/ptrace.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/ptrace.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -79,7 +79,12 @@
|
|
/*
|
|
* Does the process account for user or for system time?
|
|
*/
|
|
+
|
|
+#if defined(CONFIG_JZ_TCSM)
|
|
+#define user_mode(regs) ((((regs)->cp0_status & KU_MASK) == KU_USER) || (((regs)->cp0_status & 0x08000000) == 0x08000000))
|
|
+# else
|
|
#define user_mode(regs) (((regs)->cp0_status & KU_MASK) == KU_USER)
|
|
+#endif
|
|
|
|
#define instruction_pointer(regs) ((regs)->cp0_epc)
|
|
#define profile_pc(regs) instruction_pointer(regs)
|
|
diff -ru linux-2.6/include/asm-mips/r4kcache.h /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/r4kcache.h
|
|
--- linux-2.6/include/asm-mips/r4kcache.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/r4kcache.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -17,6 +17,58 @@
|
|
#include <asm/cpu-features.h>
|
|
#include <asm/mipsmtregs.h>
|
|
|
|
+#ifdef CONFIG_JZRISC
|
|
+
|
|
+#define K0_TO_K1() \
|
|
+do { \
|
|
+ unsigned long __k0_addr; \
|
|
+ \
|
|
+ __asm__ __volatile__( \
|
|
+ "la %0, 1f\n\t" \
|
|
+ "or %0, %0, %1\n\t" \
|
|
+ "jr %0\n\t" \
|
|
+ "nop\n\t" \
|
|
+ "1: nop\n" \
|
|
+ : "=&r"(__k0_addr) \
|
|
+ : "r" (0x20000000) ); \
|
|
+} while(0)
|
|
+
|
|
+#define K1_TO_K0() \
|
|
+do { \
|
|
+ unsigned long __k0_addr; \
|
|
+ __asm__ __volatile__( \
|
|
+ "nop;nop;nop;nop;nop;nop;nop\n\t" \
|
|
+ "la %0, 1f\n\t" \
|
|
+ "jr %0\n\t" \
|
|
+ "nop\n\t" \
|
|
+ "1: nop\n" \
|
|
+ : "=&r" (__k0_addr)); \
|
|
+} while (0)
|
|
+
|
|
+#define INVALIDATE_BTB() \
|
|
+do { \
|
|
+ unsigned long tmp; \
|
|
+ __asm__ __volatile__( \
|
|
+ ".set mips32\n\t" \
|
|
+ "mfc0 %0, $16, 7\n\t" \
|
|
+ "nop\n\t" \
|
|
+ "ori %0, 2\n\t" \
|
|
+ "mtc0 %0, $16, 7\n\t" \
|
|
+ "nop\n\t" \
|
|
+ : "=&r" (tmp)); \
|
|
+} while (0)
|
|
+
|
|
+#define SYNC_WB() __asm__ __volatile__ ("sync")
|
|
+
|
|
+#else /* CONFIG_JZRISC */
|
|
+
|
|
+#define K0_TO_K1() do { } while (0)
|
|
+#define K1_TO_K0() do { } while (0)
|
|
+#define INVALIDATE_BTB() do { } while (0)
|
|
+#define SYNC_WB() do { } while (0)
|
|
+
|
|
+#endif /* CONFIG_JZRISC */
|
|
+
|
|
/*
|
|
* This macro return a properly sign-extended address suitable as base address
|
|
* for indexed cache operations. Two issues here:
|
|
@@ -144,6 +196,7 @@
|
|
{
|
|
__iflush_prologue
|
|
cache_op(Index_Invalidate_I, addr);
|
|
+ INVALIDATE_BTB();
|
|
__iflush_epilogue
|
|
}
|
|
|
|
@@ -151,6 +204,7 @@
|
|
{
|
|
__dflush_prologue
|
|
cache_op(Index_Writeback_Inv_D, addr);
|
|
+ SYNC_WB();
|
|
__dflush_epilogue
|
|
}
|
|
|
|
@@ -163,6 +217,7 @@
|
|
{
|
|
__iflush_prologue
|
|
cache_op(Hit_Invalidate_I, addr);
|
|
+ INVALIDATE_BTB();
|
|
__iflush_epilogue
|
|
}
|
|
|
|
@@ -170,6 +225,7 @@
|
|
{
|
|
__dflush_prologue
|
|
cache_op(Hit_Writeback_Inv_D, addr);
|
|
+ SYNC_WB();
|
|
__dflush_epilogue
|
|
}
|
|
|
|
@@ -177,6 +233,7 @@
|
|
{
|
|
__dflush_prologue
|
|
cache_op(Hit_Invalidate_D, addr);
|
|
+ SYNC_WB();
|
|
__dflush_epilogue
|
|
}
|
|
|
|
@@ -209,6 +266,7 @@
|
|
static inline void protected_flush_icache_line(unsigned long addr)
|
|
{
|
|
protected_cache_op(Hit_Invalidate_I, addr);
|
|
+ INVALIDATE_BTB();
|
|
}
|
|
|
|
/*
|
|
@@ -220,6 +278,7 @@
|
|
static inline void protected_writeback_dcache_line(unsigned long addr)
|
|
{
|
|
protected_cache_op(Hit_Writeback_Inv_D, addr);
|
|
+ SYNC_WB();
|
|
}
|
|
|
|
static inline void protected_writeback_scache_line(unsigned long addr)
|
|
@@ -396,20 +455,132 @@
|
|
__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16)
|
|
__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 16)
|
|
__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 16)
|
|
+#ifndef CONFIG_JZRISC
|
|
__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 32)
|
|
__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 32)
|
|
+#endif
|
|
__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 32)
|
|
__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64)
|
|
__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 64)
|
|
__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 128)
|
|
|
|
__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 16)
|
|
+#ifndef CONFIG_JZRISC
|
|
__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 32)
|
|
+#endif
|
|
__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 16)
|
|
__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 32)
|
|
__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 64)
|
|
__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 128)
|
|
|
|
+#ifdef CONFIG_JZRISC
|
|
+
|
|
+static inline void blast_dcache32(void)
|
|
+{
|
|
+ unsigned long start = INDEX_BASE;
|
|
+ unsigned long end = start + current_cpu_data.dcache.waysize;
|
|
+ unsigned long ws_inc = 1UL << current_cpu_data.dcache.waybit;
|
|
+ unsigned long ws_end = current_cpu_data.dcache.ways <<
|
|
+ current_cpu_data.dcache.waybit;
|
|
+ unsigned long ws, addr;
|
|
+
|
|
+ for (ws = 0; ws < ws_end; ws += ws_inc)
|
|
+ for (addr = start; addr < end; addr += 0x400)
|
|
+ cache32_unroll32(addr|ws,Index_Writeback_Inv_D);
|
|
+
|
|
+ SYNC_WB();
|
|
+}
|
|
+
|
|
+static inline void blast_dcache32_page(unsigned long page)
|
|
+{
|
|
+ unsigned long start = page;
|
|
+ unsigned long end = page + PAGE_SIZE;
|
|
+
|
|
+ do {
|
|
+ cache32_unroll32(start,Hit_Writeback_Inv_D);
|
|
+ start += 0x400;
|
|
+ } while (start < end);
|
|
+
|
|
+ SYNC_WB();
|
|
+}
|
|
+
|
|
+static inline void blast_dcache32_page_indexed(unsigned long page)
|
|
+{
|
|
+ unsigned long indexmask = current_cpu_data.dcache.waysize - 1;
|
|
+ unsigned long start = INDEX_BASE + (page & indexmask);
|
|
+ unsigned long end = start + PAGE_SIZE;
|
|
+ unsigned long ws_inc = 1UL << current_cpu_data.dcache.waybit;
|
|
+ unsigned long ws_end = current_cpu_data.dcache.ways <<
|
|
+ current_cpu_data.dcache.waybit;
|
|
+ unsigned long ws, addr;
|
|
+
|
|
+ for (ws = 0; ws < ws_end; ws += ws_inc)
|
|
+ for (addr = start; addr < end; addr += 0x400)
|
|
+ cache32_unroll32(addr|ws,Index_Writeback_Inv_D);
|
|
+
|
|
+ SYNC_WB();
|
|
+}
|
|
+
|
|
+static inline void blast_icache32(void)
|
|
+{
|
|
+ unsigned long start = INDEX_BASE;
|
|
+ unsigned long end = start + current_cpu_data.icache.waysize;
|
|
+ unsigned long ws_inc = 1UL << current_cpu_data.icache.waybit;
|
|
+ unsigned long ws_end = current_cpu_data.icache.ways <<
|
|
+ current_cpu_data.icache.waybit;
|
|
+ unsigned long ws, addr;
|
|
+
|
|
+ K0_TO_K1();
|
|
+
|
|
+ for (ws = 0; ws < ws_end; ws += ws_inc)
|
|
+ for (addr = start; addr < end; addr += 0x400)
|
|
+ cache32_unroll32(addr|ws,Index_Invalidate_I);
|
|
+
|
|
+ INVALIDATE_BTB();
|
|
+
|
|
+ K1_TO_K0();
|
|
+}
|
|
+
|
|
+static inline void blast_icache32_page(unsigned long page)
|
|
+{
|
|
+ unsigned long start = page;
|
|
+ unsigned long end = page + PAGE_SIZE;
|
|
+
|
|
+ K0_TO_K1();
|
|
+
|
|
+ do {
|
|
+ cache32_unroll32(start,Hit_Invalidate_I);
|
|
+ start += 0x400;
|
|
+ } while (start < end);
|
|
+
|
|
+ INVALIDATE_BTB();
|
|
+
|
|
+ K1_TO_K0();
|
|
+}
|
|
+
|
|
+static inline void blast_icache32_page_indexed(unsigned long page)
|
|
+{
|
|
+ unsigned long indexmask = current_cpu_data.icache.waysize - 1;
|
|
+ unsigned long start = INDEX_BASE + (page & indexmask);
|
|
+ unsigned long end = start + PAGE_SIZE;
|
|
+ unsigned long ws_inc = 1UL << current_cpu_data.icache.waybit;
|
|
+ unsigned long ws_end = current_cpu_data.icache.ways <<
|
|
+ current_cpu_data.icache.waybit;
|
|
+ unsigned long ws, addr;
|
|
+
|
|
+ K0_TO_K1();
|
|
+
|
|
+ for (ws = 0; ws < ws_end; ws += ws_inc)
|
|
+ for (addr = start; addr < end; addr += 0x400)
|
|
+ cache32_unroll32(addr|ws,Index_Invalidate_I);
|
|
+
|
|
+ INVALIDATE_BTB();
|
|
+
|
|
+ K1_TO_K0();
|
|
+}
|
|
+
|
|
+#endif /* CONFIG_JZRISC */
|
|
+
|
|
/* build blast_xxx_range, protected_blast_xxx_range */
|
|
#define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop, prot) \
|
|
static inline void prot##blast_##pfx##cache##_range(unsigned long start, \
|
|
@@ -431,13 +602,73 @@
|
|
__##pfx##flush_epilogue \
|
|
}
|
|
|
|
+#ifndef CONFIG_JZRISC
|
|
__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_)
|
|
+#endif
|
|
__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, protected_)
|
|
+#ifndef CONFIG_JZRISC
|
|
__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, protected_)
|
|
__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, )
|
|
+#endif
|
|
__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, )
|
|
/* blast_inv_dcache_range */
|
|
__BUILD_BLAST_CACHE_RANGE(inv_d, dcache, Hit_Invalidate_D, )
|
|
__BUILD_BLAST_CACHE_RANGE(inv_s, scache, Hit_Invalidate_SD, )
|
|
|
|
+#ifdef CONFIG_JZRISC
|
|
+
|
|
+static inline void protected_blast_dcache_range(unsigned long start,
|
|
+ unsigned long end)
|
|
+{
|
|
+ unsigned long lsize = cpu_dcache_line_size();
|
|
+ unsigned long addr = start & ~(lsize - 1);
|
|
+ unsigned long aend = (end - 1) & ~(lsize - 1);
|
|
+
|
|
+ while (1) {
|
|
+ protected_cache_op(Hit_Writeback_Inv_D, addr);
|
|
+ if (addr == aend)
|
|
+ break;
|
|
+ addr += lsize;
|
|
+ }
|
|
+ SYNC_WB();
|
|
+}
|
|
+
|
|
+static inline void protected_blast_icache_range(unsigned long start,
|
|
+ unsigned long end)
|
|
+{
|
|
+ unsigned long lsize = cpu_icache_line_size();
|
|
+ unsigned long addr = start & ~(lsize - 1);
|
|
+ unsigned long aend = (end - 1) & ~(lsize - 1);
|
|
+
|
|
+ K0_TO_K1();
|
|
+
|
|
+ while (1) {
|
|
+ protected_cache_op(Hit_Invalidate_I, addr);
|
|
+ if (addr == aend)
|
|
+ break;
|
|
+ addr += lsize;
|
|
+ }
|
|
+ INVALIDATE_BTB();
|
|
+
|
|
+ K1_TO_K0();
|
|
+}
|
|
+
|
|
+static inline void blast_dcache_range(unsigned long start,
|
|
+ unsigned long end)
|
|
+{
|
|
+ unsigned long lsize = cpu_dcache_line_size();
|
|
+ unsigned long addr = start & ~(lsize - 1);
|
|
+ unsigned long aend = (end - 1) & ~(lsize - 1);
|
|
+
|
|
+ while (1) {
|
|
+ cache_op(Hit_Writeback_Inv_D, addr);
|
|
+ if (addr == aend)
|
|
+ break;
|
|
+ addr += lsize;
|
|
+ }
|
|
+ SYNC_WB();
|
|
+}
|
|
+
|
|
+#endif /* CONFIG_JZRISC */
|
|
+
|
|
#endif /* _ASM_R4KCACHE_H */
|
|
diff -ru linux-2.6/include/asm-mips/signal.h /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/signal.h
|
|
--- linux-2.6/include/asm-mips/signal.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/signal.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -11,6 +11,11 @@
|
|
|
|
#include <linux/types.h>
|
|
|
|
+/* Avoid too many header ordering problems. */
|
|
+struct siginfo;
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+
|
|
#define _NSIG 128
|
|
#define _NSIG_BPW (sizeof(unsigned long) * 8)
|
|
#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
|
|
@@ -21,6 +26,14 @@
|
|
|
|
typedef unsigned long old_sigset_t; /* at least 32 bits */
|
|
|
|
+#else
|
|
+/* Here we must cater to libcs that poke about in kernel headers. */
|
|
+
|
|
+#define NSIG 32
|
|
+typedef unsigned long sigset_t;
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+
|
|
#define SIGHUP 1 /* Hangup (POSIX). */
|
|
#define SIGINT 2 /* Interrupt (ANSI). */
|
|
#define SIGQUIT 3 /* Quit (POSIX). */
|
|
@@ -55,6 +68,9 @@
|
|
#define SIGPROF 29 /* Profiling alarm clock (4.2 BSD). */
|
|
#define SIGXCPU 30 /* CPU limit exceeded (4.2 BSD). */
|
|
#define SIGXFSZ 31 /* File size limit exceeded (4.2 BSD). */
|
|
+/* Define these two used by Android's bionic */
|
|
+#define SIGUNUSED SIGSYS
|
|
+#define SIGSTKFLT SIGEMT
|
|
|
|
/* These should not be considered constants from userland. */
|
|
#define SIGRTMIN 32
|
|
@@ -111,16 +127,38 @@
|
|
|
|
#include <asm-generic/signal.h>
|
|
|
|
+#ifdef __KERNEL__
|
|
+
|
|
struct sigaction {
|
|
unsigned int sa_flags;
|
|
__sighandler_t sa_handler;
|
|
sigset_t sa_mask;
|
|
+ __sigrestore_t sa_restorer;
|
|
};
|
|
|
|
struct k_sigaction {
|
|
struct sigaction sa;
|
|
};
|
|
|
|
+#else
|
|
+/* Here we must cater to libcs that poke about in kernel headers. */
|
|
+
|
|
+struct sigaction {
|
|
+ unsigned long sa_flags;
|
|
+ union {
|
|
+ __sighandler_t _sa_handler;
|
|
+ void (*_sa_sigaction)(int, struct siginfo *, void *);
|
|
+ } _u;
|
|
+ sigset_t sa_mask;
|
|
+ unsigned long pad[3]; /* padding for sa_mask */
|
|
+ void (*sa_restorer)(void);
|
|
+};
|
|
+
|
|
+#define sa_handler _u._sa_handler
|
|
+#define sa_sigaction _u._sa_sigaction
|
|
+
|
|
+#endif
|
|
+
|
|
/* IRIX compatible stack_t */
|
|
typedef struct sigaltstack {
|
|
void __user *ss_sp;
|
|
diff -ru linux-2.6/include/asm-mips/suspend.h /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/suspend.h
|
|
--- linux-2.6/include/asm-mips/suspend.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/asm-mips/suspend.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -1,6 +1,11 @@
|
|
#ifndef __ASM_SUSPEND_H
|
|
#define __ASM_SUSPEND_H
|
|
|
|
-/* Somewhen... Maybe :-) */
|
|
+/* Jz suspend interfaces */
|
|
+
|
|
+#if defined(CONFIG_PM) && defined(CONFIG_JZSOC)
|
|
+extern int jz_pm_init(void);
|
|
+static inline int arch_prepare_suspend(void) { return 0; }
|
|
+#endif
|
|
|
|
#endif /* __ASM_SUSPEND_H */
|
|
diff -ru linux-2.6/include/linux/miscdevice.h /plain/src/qi/linux-2.6.27.git.svn/include/linux/miscdevice.h
|
|
--- linux-2.6/include/linux/miscdevice.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/linux/miscdevice.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -30,6 +30,8 @@
|
|
#define TUN_MINOR 200
|
|
#define HPET_MINOR 228
|
|
#define KVM_MINOR 232
|
|
+#define TCSM_MINOR 233 /* JZ TCSM for multimedia */
|
|
+#define CIM_MINOR 234 /* JZ CIM for multimedia */
|
|
|
|
struct device;
|
|
|
|
diff -ru linux-2.6/include/linux/mmc/host.h /plain/src/qi/linux-2.6.27.git.svn/include/linux/mmc/host.h
|
|
--- linux-2.6/include/linux/mmc/host.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/linux/mmc/host.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -41,6 +41,7 @@
|
|
|
|
#define MMC_BUS_WIDTH_1 0
|
|
#define MMC_BUS_WIDTH_4 2
|
|
+#define MMC_BUS_WIDTH_8 4
|
|
|
|
unsigned char timing; /* timing specification used */
|
|
|
|
@@ -159,6 +160,15 @@
|
|
|
|
struct dentry *debugfs_root;
|
|
|
|
+#ifdef CONFIG_MMC_EMBEDDED_SDIO
|
|
+ struct {
|
|
+ struct sdio_cis *cis;
|
|
+ struct sdio_cccr *cccr;
|
|
+ struct sdio_embedded_func *funcs;
|
|
+ int num_funcs;
|
|
+ } embedded_sdio_data;
|
|
+#endif
|
|
+
|
|
unsigned long private[0] ____cacheline_aligned;
|
|
};
|
|
|
|
@@ -167,6 +177,14 @@
|
|
extern void mmc_remove_host(struct mmc_host *);
|
|
extern void mmc_free_host(struct mmc_host *);
|
|
|
|
+#ifdef CONFIG_MMC_EMBEDDED_SDIO
|
|
+extern void mmc_set_embedded_sdio_data(struct mmc_host *host,
|
|
+ struct sdio_cis *cis,
|
|
+ struct sdio_cccr *cccr,
|
|
+ struct sdio_embedded_func *funcs,
|
|
+ int num_funcs);
|
|
+#endif
|
|
+
|
|
static inline void *mmc_priv(struct mmc_host *host)
|
|
{
|
|
return (void *)host->private;
|
|
diff -ru linux-2.6/include/linux/power_supply.h /plain/src/qi/linux-2.6.27.git.svn/include/linux/power_supply.h
|
|
--- linux-2.6/include/linux/power_supply.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/linux/power_supply.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -86,7 +86,8 @@
|
|
POWER_SUPPLY_PROP_ENERGY_NOW,
|
|
POWER_SUPPLY_PROP_ENERGY_AVG,
|
|
POWER_SUPPLY_PROP_CAPACITY, /* in percents! */
|
|
- POWER_SUPPLY_PROP_TEMP,
|
|
+ POWER_SUPPLY_PROP_TEMP, /* for android, but not supported */
|
|
+ POWER_SUPPLY_PROP_VOL, /* for android, but not supported */
|
|
POWER_SUPPLY_PROP_TEMP_AMBIENT,
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,
|
|
diff -ru linux-2.6/include/linux/suspend.h /plain/src/qi/linux-2.6.27.git.svn/include/linux/suspend.h
|
|
--- linux-2.6/include/linux/suspend.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/linux/suspend.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -1,9 +1,11 @@
|
|
#ifndef _LINUX_SUSPEND_H
|
|
#define _LINUX_SUSPEND_H
|
|
|
|
-#if defined(CONFIG_X86) || defined(CONFIG_FRV) || defined(CONFIG_PPC32) || defined(CONFIG_PPC64)
|
|
+#if defined(CONFIG_X86) || defined(CONFIG_FRV) || defined(CONFIG_PPC32)\
|
|
+ || defined(CONFIG_PPC64) || defined(CONFIG_MIPS)
|
|
#include <asm/suspend.h>
|
|
#endif
|
|
+
|
|
#include <linux/swap.h>
|
|
#include <linux/notifier.h>
|
|
#include <linux/init.h>
|
|
@@ -245,6 +247,9 @@
|
|
void save_processor_state(void);
|
|
void restore_processor_state(void);
|
|
|
|
+//void save_processor_state(void){}
|
|
+//void restore_processor_state(void){}
|
|
+
|
|
/* kernel/power/main.c */
|
|
extern int register_pm_notifier(struct notifier_block *nb);
|
|
extern int unregister_pm_notifier(struct notifier_block *nb);
|
|
diff -ru linux-2.6/include/sound/pcm.h /plain/src/qi/linux-2.6.27.git.svn/include/sound/pcm.h
|
|
--- linux-2.6/include/sound/pcm.h 2009-08-17 23:58:03.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/include/sound/pcm.h 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -107,23 +107,23 @@
|
|
#define SNDRV_PCM_RATE_5512 (1<<0) /* 5512Hz */
|
|
#define SNDRV_PCM_RATE_8000 (1<<1) /* 8000Hz */
|
|
#define SNDRV_PCM_RATE_11025 (1<<2) /* 11025Hz */
|
|
-#define SNDRV_PCM_RATE_16000 (1<<3) /* 16000Hz */
|
|
-#define SNDRV_PCM_RATE_22050 (1<<4) /* 22050Hz */
|
|
-#define SNDRV_PCM_RATE_32000 (1<<5) /* 32000Hz */
|
|
-#define SNDRV_PCM_RATE_44100 (1<<6) /* 44100Hz */
|
|
-#define SNDRV_PCM_RATE_48000 (1<<7) /* 48000Hz */
|
|
-#define SNDRV_PCM_RATE_64000 (1<<8) /* 64000Hz */
|
|
-#define SNDRV_PCM_RATE_88200 (1<<9) /* 88200Hz */
|
|
-#define SNDRV_PCM_RATE_96000 (1<<10) /* 96000Hz */
|
|
-#define SNDRV_PCM_RATE_176400 (1<<11) /* 176400Hz */
|
|
-#define SNDRV_PCM_RATE_192000 (1<<12) /* 192000Hz */
|
|
+#define SNDRV_PCM_RATE_12000 (1<<3) /* 12000Hz */
|
|
+#define SNDRV_PCM_RATE_16000 (1<<4) /* 16000Hz */
|
|
+#define SNDRV_PCM_RATE_22050 (1<<5) /* 22050Hz */
|
|
+#define SNDRV_PCM_RATE_24000 (1<<6) /* 24000Hz */
|
|
+#define SNDRV_PCM_RATE_32000 (1<<7) /* 32000Hz */
|
|
+#define SNDRV_PCM_RATE_44100 (1<<8) /* 44100Hz */
|
|
+#define SNDRV_PCM_RATE_48000 (1<<9) /* 48000Hz */
|
|
+#define SNDRV_PCM_RATE_64000 (1<<10) /* 64000Hz */
|
|
+#define SNDRV_PCM_RATE_88200 (1<<11) /* 88200Hz */
|
|
+#define SNDRV_PCM_RATE_96000 (1<<12) /* 96000Hz */
|
|
+#define SNDRV_PCM_RATE_176400 (1<<13) /* 176400Hz */
|
|
+#define SNDRV_PCM_RATE_192000 (1<<14) /* 192000Hz */
|
|
|
|
#define SNDRV_PCM_RATE_CONTINUOUS (1<<30) /* continuous range */
|
|
#define SNDRV_PCM_RATE_KNOT (1<<31) /* supports more non-continuos rates */
|
|
|
|
-#define SNDRV_PCM_RATE_8000_44100 (SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_11025|\
|
|
- SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_22050|\
|
|
- SNDRV_PCM_RATE_32000|SNDRV_PCM_RATE_44100)
|
|
+#define SNDRV_PCM_RATE_8000_44100 (SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_11025|SNDRV_PCM_RATE_12000|SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_22050|SNDRV_PCM_RATE_24000|SNDRV_PCM_RATE_32000|SNDRV_PCM_RATE_44100)
|
|
#define SNDRV_PCM_RATE_8000_48000 (SNDRV_PCM_RATE_8000_44100|SNDRV_PCM_RATE_48000)
|
|
#define SNDRV_PCM_RATE_8000_96000 (SNDRV_PCM_RATE_8000_48000|SNDRV_PCM_RATE_64000|\
|
|
SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000)
|
|
diff -ru linux-2.6/sound/core/pcm_lib.c /plain/src/qi/linux-2.6.27.git.svn/sound/core/pcm_lib.c
|
|
--- linux-2.6/sound/core/pcm_lib.c 2009-08-17 23:58:04.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/sound/core/pcm_lib.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -1875,6 +1875,7 @@
|
|
return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
|
|
}
|
|
|
|
+#if 0
|
|
snd_pcm_sframes_t snd_pcm_lib_read(struct snd_pcm_substream *substream, void __user *buf, snd_pcm_uframes_t size)
|
|
{
|
|
struct snd_pcm_runtime *runtime;
|
|
@@ -1892,6 +1893,99 @@
|
|
return -EINVAL;
|
|
return snd_pcm_lib_read1(substream, (unsigned long)buf, size, nonblock, snd_pcm_lib_read_transfer);
|
|
}
|
|
+#else
|
|
+snd_pcm_sframes_t snd_pcm_lib_read(struct snd_pcm_substream *substream, void __user *buf, snd_pcm_uframes_t size)
|
|
+{
|
|
+ struct snd_pcm_runtime *runtime;
|
|
+ int nonblock;
|
|
+
|
|
+ snd_pcm_sframes_t tmp_frames;
|
|
+ snd_pcm_sframes_t final_frames;
|
|
+ int channels;
|
|
+
|
|
+ snd_assert(substream != NULL, return -ENXIO);
|
|
+ runtime = substream->runtime;
|
|
+ snd_assert(runtime != NULL, return -ENXIO);
|
|
+ snd_assert(substream->ops->copy != NULL || runtime->dma_area != NULL, return -EINVAL);
|
|
+ if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
|
|
+ return -EBADFD;
|
|
+
|
|
+ nonblock = !!(substream->f_flags & O_NONBLOCK);
|
|
+ if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED)
|
|
+ return -EINVAL;
|
|
+
|
|
+ /*
|
|
+ * mono capture process for no mono codec
|
|
+ * function codec such as ipcood and dlv
|
|
+ */
|
|
+
|
|
+ tmp_frames = snd_pcm_lib_read1(substream, (unsigned long)buf, size, nonblock, snd_pcm_lib_read_transfer);
|
|
+
|
|
+ channels = runtime->channels;
|
|
+
|
|
+ if (channels == 1) {
|
|
+ short *tmpbuf = kcalloc(tmp_frames, sizeof(short), GFP_KERNEL);
|
|
+ short *src, *dst, *end;
|
|
+
|
|
+ memcpy(tmpbuf, buf, frames_to_bytes(runtime, tmp_frames));
|
|
+
|
|
+ src = (short *)buf;
|
|
+ dst = (short *)tmpbuf;
|
|
+ end = dst + tmp_frames - 1;
|
|
+
|
|
+ src++;
|
|
+ dst++;
|
|
+ dst++;
|
|
+ final_frames = 1;
|
|
+ while (dst <= end) {
|
|
+ *src = *dst;
|
|
+ final_frames++;
|
|
+ src++;
|
|
+ dst++;
|
|
+ dst++;
|
|
+ }
|
|
+ tmp_frames = final_frames;
|
|
+ kfree(tmpbuf);
|
|
+
|
|
+#if 0
|
|
+ /* when i have time, i will try the code, no kcalloc */
|
|
+ snd_assert(runtime->dma_area, return -EFAULT);
|
|
+ if (copy_to_user(buf, hwbuf, frames_to_bytes(runtime, frames)))
|
|
+ return -EFAULT;
|
|
+
|
|
+ unsigned int up_bytes = frames_to_bytes(runtime, frames);
|
|
+
|
|
+ int while_cnt = 4;
|
|
+ int while_all = up_bytes - 2;
|
|
+
|
|
+ while (while_cnt <= while_all) {
|
|
+ //printk("[%d = %d]\n",(while_cnt/2),while_cnt);
|
|
+ buf[(while_cnt/2)] = buf[while_cnt];
|
|
+ //printk("[%d = %d]\n",((while_cnt/2)+1),(while_cnt+1));
|
|
+ buf[((while_cnt/2)+1)] = buf[(while_cnt+1)];
|
|
+ while_cnt += 4;
|
|
+#if 0
|
|
+ buf[2] = buf[4];
|
|
+ buf[3] = buf[5];
|
|
+
|
|
+ buf[4] = buf[8];
|
|
+ buf[5] = buf[9];
|
|
+
|
|
+ buf[6] = buf[12];
|
|
+ buf[7] = buf[13];
|
|
+
|
|
+ buf[8] = buf[16];
|
|
+ buf[9] = buf[17];
|
|
+#endif
|
|
+ }
|
|
+ /* when i have time, i will try the code, no kcalloc */
|
|
+#endif
|
|
+
|
|
+ }
|
|
+
|
|
+ return tmp_frames;
|
|
+}
|
|
+#endif
|
|
|
|
EXPORT_SYMBOL(snd_pcm_lib_read);
|
|
|
|
diff -ru linux-2.6/sound/core/pcm_native.c /plain/src/qi/linux-2.6.27.git.svn/sound/core/pcm_native.c
|
|
--- linux-2.6/sound/core/pcm_native.c 2009-08-17 23:58:04.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/sound/core/pcm_native.c 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -1756,12 +1756,13 @@
|
|
return snd_interval_refine(hw_param_interval(params, rule->var), &t);
|
|
}
|
|
|
|
-#if SNDRV_PCM_RATE_5512 != 1 << 0 || SNDRV_PCM_RATE_192000 != 1 << 12
|
|
+#if SNDRV_PCM_RATE_5512 != 1 << 0 || SNDRV_PCM_RATE_192000 != 1 << 14
|
|
#error "Change this table"
|
|
#endif
|
|
|
|
-static unsigned int rates[] = { 5512, 8000, 11025, 16000, 22050, 32000, 44100,
|
|
- 48000, 64000, 88200, 96000, 176400, 192000 };
|
|
+static unsigned int rates[] = { 5512, 8000, 11025, 12000, 16000, 22050, 24000,
|
|
+ 32000, 44100, 48000, 64000, 88200, 96000,
|
|
+ 176400, 192000 };
|
|
|
|
const struct snd_pcm_hw_constraint_list snd_pcm_known_rates = {
|
|
.count = ARRAY_SIZE(rates),
|
|
@@ -1772,9 +1773,17 @@
|
|
struct snd_pcm_hw_rule *rule)
|
|
{
|
|
struct snd_pcm_hardware *hw = rule->private;
|
|
+#if 0
|
|
return snd_interval_list(hw_param_interval(params, rule->var),
|
|
snd_pcm_known_rates.count,
|
|
snd_pcm_known_rates.list, hw->rates);
|
|
+#else
|
|
+ //printk("hw->rates=0x%08x\n",hw->rates);//0x3b6
|
|
+ hw->rates = 0x3fe;//12KHz and 24KHz bits are all zero,you need set 1
|
|
+ return snd_interval_list(hw_param_interval(params, rule->var),
|
|
+ snd_pcm_known_rates.count,
|
|
+ snd_pcm_known_rates.list, hw->rates);
|
|
+#endif
|
|
}
|
|
|
|
static int snd_pcm_hw_rule_buffer_bytes_max(struct snd_pcm_hw_params *params,
|
|
diff -ru linux-2.6/sound/soc/codecs/Kconfig /plain/src/qi/linux-2.6.27.git.svn/sound/soc/codecs/Kconfig
|
|
--- linux-2.6/sound/soc/codecs/Kconfig 2009-08-17 23:58:04.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/sound/soc/codecs/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -50,3 +50,15 @@
|
|
config SND_SOC_TLV320AIC3X
|
|
tristate
|
|
depends on I2C
|
|
+
|
|
+config SND_SOC_ICODEC
|
|
+ tristate "Jz4740 internal codec"
|
|
+ depends on SND_SOC && SND_JZ4740_SOC_PAVO && SND_JZ4740_SOC_I2S
|
|
+ help
|
|
+ Say Y if you want to use internal codec on Ingenic Jz4740 PAVO board.
|
|
+
|
|
+config SND_SOC_DLV
|
|
+ tristate "Jz4750 internal codec"
|
|
+ depends on SND_SOC && SND_JZ4750_SOC_APUS && SND_JZ4750_SOC_I2S
|
|
+ help
|
|
+ Say Y if you want to use internal codec on Ingenic Jz4750 APUS board.
|
|
\ No newline at end of file
|
|
diff -ru linux-2.6/sound/soc/codecs/Makefile /plain/src/qi/linux-2.6.27.git.svn/sound/soc/codecs/Makefile
|
|
--- linux-2.6/sound/soc/codecs/Makefile 2009-08-17 23:58:04.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/sound/soc/codecs/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -10,6 +10,8 @@
|
|
snd-soc-wm9713-objs := wm9713.o
|
|
snd-soc-cs4270-objs := cs4270.o
|
|
snd-soc-tlv320aic3x-objs := tlv320aic3x.o
|
|
+snd-soc-jzcodec-objs := jzcodec.o
|
|
+snd-soc-jzdlv-objs := jzdlv.o
|
|
|
|
obj-$(CONFIG_SND_SOC_AC97_CODEC) += snd-soc-ac97.o
|
|
obj-$(CONFIG_SND_SOC_AK4535) += snd-soc-ak4535.o
|
|
@@ -23,3 +25,5 @@
|
|
obj-$(CONFIG_SND_SOC_WM9713) += snd-soc-wm9713.o
|
|
obj-$(CONFIG_SND_SOC_CS4270) += snd-soc-cs4270.o
|
|
obj-$(CONFIG_SND_SOC_TLV320AIC3X) += snd-soc-tlv320aic3x.o
|
|
+obj-$(CONFIG_SND_SOC_ICODEC) += snd-soc-jzcodec.o
|
|
+obj-$(CONFIG_SND_SOC_DLV) += snd-soc-jzdlv.o
|
|
\ No newline at end of file
|
|
diff -ru linux-2.6/sound/soc/Kconfig /plain/src/qi/linux-2.6.27.git.svn/sound/soc/Kconfig
|
|
--- linux-2.6/sound/soc/Kconfig 2009-08-17 23:58:04.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/sound/soc/Kconfig 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -31,6 +31,8 @@
|
|
source "sound/soc/fsl/Kconfig"
|
|
source "sound/soc/davinci/Kconfig"
|
|
source "sound/soc/omap/Kconfig"
|
|
+source "sound/soc/jz4740/Kconfig"
|
|
+source "sound/soc/jz4750/Kconfig"
|
|
|
|
# Supported codecs
|
|
source "sound/soc/codecs/Kconfig"
|
|
diff -ru linux-2.6/sound/soc/Makefile /plain/src/qi/linux-2.6.27.git.svn/sound/soc/Makefile
|
|
--- linux-2.6/sound/soc/Makefile 2009-08-17 23:58:04.000000000 +0200
|
|
+++ /plain/src/qi/linux-2.6.27.git.svn/sound/soc/Makefile 2009-08-12 10:39:09.000000000 +0200
|
|
@@ -2,4 +2,4 @@
|
|
|
|
obj-$(CONFIG_SND_SOC) += snd-soc-core.o
|
|
obj-$(CONFIG_SND_SOC) += codecs/ at32/ at91/ pxa/ s3c24xx/ sh/ fsl/ davinci/
|
|
-obj-$(CONFIG_SND_SOC) += omap/ au1x/
|
|
+obj-$(CONFIG_SND_SOC) += omap/ au1x/ jz4740/ jz4750/
|