Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: (25 commits) sh: fix up sh7785lcr_32bit_defconfig. arch/sh/lib/strlen.S: Checkpatch cleanup sh: fix up sh7786 dmaengine build. sh: guard cookie consistency across termination in the DMA driver sh: prevent the DMA driver from unloading, while in use sh: fix Oops in the serial SCI driver sh: allow platforms to specify SD-card supported voltages mmc: let MFD's provide supported Vdd card voltages to tmio_mmc sh: disable SD-card write-protection detection on kfr2r09 mfd: pass platform flags down to the tmio_mmc driver tmio: add a platform flag to disable card write-protection detection sh: Add SDHI DMA support to migor sh: Add SDHI DMA support to kfr2r09 sh: Add SDHI DMA support to ms7724se sh: Add SDHI DMA support to ecovec mmc: add DMA support to tmio_mmc driver, when used on SuperH sh: prepare the SDHI MFD driver to pass DMA configuration to tmio_mmc.c mmc: prepare tmio_mmc for passing of DMA configuration from the MFD cell sh: add DMA slave definitions to sh7724 sh: add DMA slaves for two SDHI controllers to sh7722 ...
This commit is contained in:
Коммит
0fed2b5cb4
|
@ -11,6 +11,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/sh_mobile_sdhi.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
@ -442,7 +443,9 @@ static void sdhi0_set_pwr(struct platform_device *pdev, int state)
|
|||
}
|
||||
|
||||
static struct sh_mobile_sdhi_info sdhi0_info = {
|
||||
.set_pwr = sdhi0_set_pwr,
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
|
||||
.set_pwr = sdhi0_set_pwr,
|
||||
};
|
||||
|
||||
static struct resource sdhi0_resources[] = {
|
||||
|
@ -478,7 +481,9 @@ static void sdhi1_set_pwr(struct platform_device *pdev, int state)
|
|||
}
|
||||
|
||||
static struct sh_mobile_sdhi_info sdhi1_info = {
|
||||
.set_pwr = sdhi1_set_pwr,
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI1_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI1_RX,
|
||||
.set_pwr = sdhi1_set_pwr,
|
||||
};
|
||||
|
||||
static struct resource sdhi1_resources[] = {
|
||||
|
@ -769,6 +774,51 @@ static struct platform_device irda_device = {
|
|||
.resource = irda_resources,
|
||||
};
|
||||
|
||||
#include <media/ak881x.h>
|
||||
#include <media/sh_vou.h>
|
||||
|
||||
struct ak881x_pdata ak881x_pdata = {
|
||||
.flags = AK881X_IF_MODE_SLAVE,
|
||||
};
|
||||
|
||||
static struct i2c_board_info ak8813 = {
|
||||
I2C_BOARD_INFO("ak8813", 0x20),
|
||||
.platform_data = &ak881x_pdata,
|
||||
};
|
||||
|
||||
struct sh_vou_pdata sh_vou_pdata = {
|
||||
.bus_fmt = SH_VOU_BUS_8BIT,
|
||||
.flags = SH_VOU_HSYNC_LOW | SH_VOU_VSYNC_LOW,
|
||||
.board_info = &ak8813,
|
||||
.i2c_adap = 0,
|
||||
.module_name = "ak881x",
|
||||
};
|
||||
|
||||
static struct resource sh_vou_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xfe960000,
|
||||
.end = 0xfe962043,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 55,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device vou_device = {
|
||||
.name = "sh-vou",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(sh_vou_resources),
|
||||
.resource = sh_vou_resources,
|
||||
.dev = {
|
||||
.platform_data = &sh_vou_pdata,
|
||||
},
|
||||
.archdata = {
|
||||
.hwblk_id = HWBLK_VOU,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *ecovec_devices[] __initdata = {
|
||||
&heartbeat_device,
|
||||
&nor_flash_device,
|
||||
|
@ -790,6 +840,7 @@ static struct platform_device *ecovec_devices[] __initdata = {
|
|||
&camera_devices[2],
|
||||
&fsi_device,
|
||||
&irda_device,
|
||||
&vou_device,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_I2C
|
||||
|
@ -1179,6 +1230,38 @@ static int __init arch_setup(void)
|
|||
i2c_register_board_info(1, i2c1_devices,
|
||||
ARRAY_SIZE(i2c1_devices));
|
||||
|
||||
/* VOU */
|
||||
gpio_request(GPIO_FN_DV_D15, NULL);
|
||||
gpio_request(GPIO_FN_DV_D14, NULL);
|
||||
gpio_request(GPIO_FN_DV_D13, NULL);
|
||||
gpio_request(GPIO_FN_DV_D12, NULL);
|
||||
gpio_request(GPIO_FN_DV_D11, NULL);
|
||||
gpio_request(GPIO_FN_DV_D10, NULL);
|
||||
gpio_request(GPIO_FN_DV_D9, NULL);
|
||||
gpio_request(GPIO_FN_DV_D8, NULL);
|
||||
gpio_request(GPIO_FN_DV_CLKI, NULL);
|
||||
gpio_request(GPIO_FN_DV_CLK, NULL);
|
||||
gpio_request(GPIO_FN_DV_VSYNC, NULL);
|
||||
gpio_request(GPIO_FN_DV_HSYNC, NULL);
|
||||
|
||||
/* AK8813 power / reset sequence */
|
||||
gpio_request(GPIO_PTG4, NULL);
|
||||
gpio_request(GPIO_PTU3, NULL);
|
||||
/* Reset */
|
||||
gpio_direction_output(GPIO_PTG4, 0);
|
||||
/* Power down */
|
||||
gpio_direction_output(GPIO_PTU3, 1);
|
||||
|
||||
udelay(10);
|
||||
|
||||
/* Power up, reset */
|
||||
gpio_set_value(GPIO_PTU3, 0);
|
||||
|
||||
udelay(10);
|
||||
|
||||
/* Remove reset */
|
||||
gpio_set_value(GPIO_PTG4, 1);
|
||||
|
||||
return platform_add_devices(ecovec_devices,
|
||||
ARRAY_SIZE(ecovec_devices));
|
||||
}
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mfd/sh_mobile_sdhi.h>
|
||||
#include <linux/mfd/tmio.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/mtd/onenand.h>
|
||||
#include <linux/delay.h>
|
||||
|
@ -356,10 +358,19 @@ static struct resource kfr2r09_sh_sdhi0_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct sh_mobile_sdhi_info sh7724_sdhi0_data = {
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
|
||||
.tmio_flags = TMIO_MMC_WRPROTECT_DISABLE,
|
||||
};
|
||||
|
||||
static struct platform_device kfr2r09_sh_sdhi0_device = {
|
||||
.name = "sh_mobile_sdhi",
|
||||
.num_resources = ARRAY_SIZE(kfr2r09_sh_sdhi0_resources),
|
||||
.resource = kfr2r09_sh_sdhi0_resources,
|
||||
.dev = {
|
||||
.platform_data = &sh7724_sdhi0_data,
|
||||
},
|
||||
.archdata = {
|
||||
.hwblk_id = HWBLK_SDHI0,
|
||||
},
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input/sh_keysc.h>
|
||||
#include <linux/mfd/sh_mobile_sdhi.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/i2c.h>
|
||||
|
@ -402,10 +403,18 @@ static struct resource sdhi_cn9_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct sh_mobile_sdhi_info sh7724_sdhi_data = {
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
|
||||
};
|
||||
|
||||
static struct platform_device sdhi_cn9_device = {
|
||||
.name = "sh_mobile_sdhi",
|
||||
.num_resources = ARRAY_SIZE(sdhi_cn9_resources),
|
||||
.resource = sdhi_cn9_resources,
|
||||
.dev = {
|
||||
.platform_data = &sh7724_sdhi_data,
|
||||
},
|
||||
.archdata = {
|
||||
.hwblk_id = HWBLK_SDHI,
|
||||
},
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/sh_mobile_sdhi.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/smc91x.h>
|
||||
|
@ -462,11 +463,19 @@ static struct resource sdhi0_cn7_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct sh_mobile_sdhi_info sh7724_sdhi0_data = {
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
|
||||
};
|
||||
|
||||
static struct platform_device sdhi0_cn7_device = {
|
||||
.name = "sh_mobile_sdhi",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(sdhi0_cn7_resources),
|
||||
.resource = sdhi0_cn7_resources,
|
||||
.dev = {
|
||||
.platform_data = &sh7724_sdhi0_data,
|
||||
},
|
||||
.archdata = {
|
||||
.hwblk_id = HWBLK_SDHI0,
|
||||
},
|
||||
|
@ -485,11 +494,19 @@ static struct resource sdhi1_cn8_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct sh_mobile_sdhi_info sh7724_sdhi1_data = {
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI1_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI1_RX,
|
||||
};
|
||||
|
||||
static struct platform_device sdhi1_cn8_device = {
|
||||
.name = "sh_mobile_sdhi",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(sdhi1_cn8_resources),
|
||||
.resource = sdhi1_cn8_resources,
|
||||
.dev = {
|
||||
.platform_data = &sh7724_sdhi1_data,
|
||||
},
|
||||
.archdata = {
|
||||
.hwblk_id = HWBLK_SDHI1,
|
||||
},
|
||||
|
@ -515,6 +532,52 @@ static struct platform_device irda_device = {
|
|||
.resource = irda_resources,
|
||||
};
|
||||
|
||||
#include <media/ak881x.h>
|
||||
#include <media/sh_vou.h>
|
||||
|
||||
struct ak881x_pdata ak881x_pdata = {
|
||||
.flags = AK881X_IF_MODE_SLAVE,
|
||||
};
|
||||
|
||||
static struct i2c_board_info ak8813 = {
|
||||
/* With open J18 jumper address is 0x21 */
|
||||
I2C_BOARD_INFO("ak8813", 0x20),
|
||||
.platform_data = &ak881x_pdata,
|
||||
};
|
||||
|
||||
struct sh_vou_pdata sh_vou_pdata = {
|
||||
.bus_fmt = SH_VOU_BUS_8BIT,
|
||||
.flags = SH_VOU_HSYNC_LOW | SH_VOU_VSYNC_LOW,
|
||||
.board_info = &ak8813,
|
||||
.i2c_adap = 0,
|
||||
.module_name = "ak881x",
|
||||
};
|
||||
|
||||
static struct resource sh_vou_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xfe960000,
|
||||
.end = 0xfe962043,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 55,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device vou_device = {
|
||||
.name = "sh-vou",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(sh_vou_resources),
|
||||
.resource = sh_vou_resources,
|
||||
.dev = {
|
||||
.platform_data = &sh_vou_pdata,
|
||||
},
|
||||
.archdata = {
|
||||
.hwblk_id = HWBLK_VOU,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *ms7724se_devices[] __initdata = {
|
||||
&heartbeat_device,
|
||||
&smc91x_eth_device,
|
||||
|
@ -530,6 +593,7 @@ static struct platform_device *ms7724se_devices[] __initdata = {
|
|||
&sdhi0_cn7_device,
|
||||
&sdhi1_cn8_device,
|
||||
&irda_device,
|
||||
&vou_device,
|
||||
};
|
||||
|
||||
/* I2C device */
|
||||
|
@ -614,6 +678,7 @@ static int __init devices_setup(void)
|
|||
{
|
||||
u16 sw = __raw_readw(SW4140); /* select camera, monitor */
|
||||
struct clk *clk;
|
||||
u16 fpga_out;
|
||||
|
||||
/* register board specific self-refresh code */
|
||||
sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF |
|
||||
|
@ -623,14 +688,26 @@ static int __init devices_setup(void)
|
|||
&ms7724se_sdram_leave_start,
|
||||
&ms7724se_sdram_leave_end);
|
||||
/* Reset Release */
|
||||
__raw_writew(__raw_readw(FPGA_OUT) &
|
||||
~((1 << 1) | /* LAN */
|
||||
(1 << 6) | /* VIDEO DAC */
|
||||
(1 << 7) | /* AK4643 */
|
||||
(1 << 8) | /* IrDA */
|
||||
(1 << 12) | /* USB0 */
|
||||
(1 << 14)), /* RMII */
|
||||
FPGA_OUT);
|
||||
fpga_out = __raw_readw(FPGA_OUT);
|
||||
/* bit4: NTSC_PDN, bit5: NTSC_RESET */
|
||||
fpga_out &= ~((1 << 1) | /* LAN */
|
||||
(1 << 4) | /* AK8813 PDN */
|
||||
(1 << 5) | /* AK8813 RESET */
|
||||
(1 << 6) | /* VIDEO DAC */
|
||||
(1 << 7) | /* AK4643 */
|
||||
(1 << 8) | /* IrDA */
|
||||
(1 << 12) | /* USB0 */
|
||||
(1 << 14)); /* RMII */
|
||||
__raw_writew(fpga_out | (1 << 4), FPGA_OUT);
|
||||
|
||||
udelay(10);
|
||||
|
||||
/* AK8813 RESET */
|
||||
__raw_writew(fpga_out | (1 << 5), FPGA_OUT);
|
||||
|
||||
udelay(10);
|
||||
|
||||
__raw_writew(fpga_out, FPGA_OUT);
|
||||
|
||||
/* turn on USB clocks, use external clock */
|
||||
__raw_writew((__raw_readw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB);
|
||||
|
@ -862,6 +939,20 @@ static int __init devices_setup(void)
|
|||
lcdc_info.ch[0].flags = LCDC_FLAGS_DWPOL;
|
||||
}
|
||||
|
||||
/* VOU */
|
||||
gpio_request(GPIO_FN_DV_D15, NULL);
|
||||
gpio_request(GPIO_FN_DV_D14, NULL);
|
||||
gpio_request(GPIO_FN_DV_D13, NULL);
|
||||
gpio_request(GPIO_FN_DV_D12, NULL);
|
||||
gpio_request(GPIO_FN_DV_D11, NULL);
|
||||
gpio_request(GPIO_FN_DV_D10, NULL);
|
||||
gpio_request(GPIO_FN_DV_D9, NULL);
|
||||
gpio_request(GPIO_FN_DV_D8, NULL);
|
||||
gpio_request(GPIO_FN_DV_CLKI, NULL);
|
||||
gpio_request(GPIO_FN_DV_CLK, NULL);
|
||||
gpio_request(GPIO_FN_DV_VSYNC, NULL);
|
||||
gpio_request(GPIO_FN_DV_HSYNC, NULL);
|
||||
|
||||
return platform_add_devices(ms7724se_devices,
|
||||
ARRAY_SIZE(ms7724se_devices));
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.34-rc5
|
||||
# Tue May 18 17:22:09 2010
|
||||
# Linux kernel version: 2.6.34
|
||||
# Mon May 24 08:33:02 2010
|
||||
#
|
||||
CONFIG_SUPERH=y
|
||||
CONFIG_SUPERH32=y
|
||||
|
@ -76,7 +76,7 @@ CONFIG_RCU_FANOUT=32
|
|||
# CONFIG_TREE_RCU_TRACE is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
# CONFIG_CGROUPS is not set
|
||||
# CONFIG_SYSFS_DEPRECATED_V2 is not set
|
||||
# CONFIG_RELAY is not set
|
||||
|
@ -111,18 +111,17 @@ CONFIG_PERF_USE_VMALLOC=y
|
|||
#
|
||||
CONFIG_PERF_EVENTS=y
|
||||
CONFIG_PERF_COUNTERS=y
|
||||
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_PCI_QUIRKS=y
|
||||
CONFIG_COMPAT_BRK=y
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_SLUB is not set
|
||||
# CONFIG_SLOB is not set
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_TRACEPOINTS=y
|
||||
CONFIG_OPROFILE=y
|
||||
# CONFIG_OPROFILE is not set
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_KPROBES=y
|
||||
CONFIG_KRETPROBES=y
|
||||
# CONFIG_KPROBES is not set
|
||||
CONFIG_HAVE_KPROBES=y
|
||||
CONFIG_HAVE_KRETPROBES=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
|
@ -130,6 +129,7 @@ CONFIG_HAVE_DMA_ATTRS=y
|
|||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_HW_BREAKPOINT=y
|
||||
CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
|
||||
|
||||
#
|
||||
# GCOV-based kernel profiling
|
||||
|
@ -243,8 +243,9 @@ CONFIG_PAGE_OFFSET=0x80000000
|
|||
CONFIG_FORCE_MAX_ZONEORDER=11
|
||||
CONFIG_MEMORY_START=0x40000000
|
||||
CONFIG_MEMORY_SIZE=0x20000000
|
||||
CONFIG_29BIT=y
|
||||
# CONFIG_PMB is not set
|
||||
# CONFIG_29BIT is not set
|
||||
CONFIG_32BIT=y
|
||||
CONFIG_PMB=y
|
||||
CONFIG_X2TLB=y
|
||||
CONFIG_VSYSCALL=y
|
||||
# CONFIG_NUMA is not set
|
||||
|
@ -262,9 +263,9 @@ CONFIG_PAGE_SIZE_4KB=y
|
|||
# CONFIG_PAGE_SIZE_8KB is not set
|
||||
# CONFIG_PAGE_SIZE_16KB is not set
|
||||
# CONFIG_PAGE_SIZE_64KB is not set
|
||||
CONFIG_HUGETLB_PAGE_SIZE_64K=y
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_64K is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_256K is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_1MB is not set
|
||||
CONFIG_HUGETLB_PAGE_SIZE_1MB=y
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_4MB is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_64MB is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_512MB is not set
|
||||
|
@ -276,7 +277,7 @@ CONFIG_SPARSEMEM=y
|
|||
CONFIG_HAVE_MEMORY_PRESENT=y
|
||||
CONFIG_SPARSEMEM_STATIC=y
|
||||
# CONFIG_MEMORY_HOTPLUG is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=999999
|
||||
CONFIG_MIGRATION=y
|
||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
|
@ -298,7 +299,7 @@ CONFIG_CPU_LITTLE_ENDIAN=y
|
|||
# CONFIG_CPU_BIG_ENDIAN is not set
|
||||
CONFIG_SH_FPU=y
|
||||
CONFIG_SH_STORE_QUEUES=y
|
||||
# CONFIG_SPECULATIVE_EXECUTION is not set
|
||||
CONFIG_SPECULATIVE_EXECUTION=y
|
||||
CONFIG_CPU_HAS_INTEVT=y
|
||||
CONFIG_CPU_HAS_SR_RB=y
|
||||
CONFIG_CPU_HAS_FPU=y
|
||||
|
@ -308,7 +309,7 @@ CONFIG_CPU_HAS_FPU=y
|
|||
#
|
||||
# CONFIG_SH_HIGHLANDER is not set
|
||||
CONFIG_SH_SH7785LCR=y
|
||||
CONFIG_SH_SH7785LCR_29BIT_PHYSMAPS=y
|
||||
# CONFIG_SH_SH7785LCR_PT is not set
|
||||
|
||||
#
|
||||
# Timer and clock configuration
|
||||
|
@ -371,7 +372,7 @@ CONFIG_SECCOMP=y
|
|||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_GUSA=y
|
||||
# CONFIG_INTC_USERIMASK is not set
|
||||
CONFIG_INTC_USERIMASK=y
|
||||
|
||||
#
|
||||
# Boot options
|
||||
|
@ -389,6 +390,7 @@ CONFIG_PCI=y
|
|||
CONFIG_PCI_DOMAINS=y
|
||||
# CONFIG_PCIEPORTBUS is not set
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
CONFIG_PCI_DEBUG=y
|
||||
# CONFIG_PCI_STUB is not set
|
||||
# CONFIG_PCI_IOV is not set
|
||||
# CONFIG_PCCARD is not set
|
||||
|
@ -465,6 +467,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
|||
# CONFIG_RDS is not set
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_L2TP is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_NET_DSA is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
|
@ -485,8 +488,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NET_TCPPROBE is not set
|
||||
# CONFIG_NET_DROP_MONITOR is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_CAN is not set
|
||||
# CONFIG_IRDA is not set
|
||||
|
@ -499,10 +500,19 @@ CONFIG_WIRELESS=y
|
|||
#
|
||||
# CFG80211 needs to be enabled for MAC80211
|
||||
#
|
||||
|
||||
#
|
||||
# Some wireless drivers require a rate control algorithm
|
||||
#
|
||||
# CONFIG_WIMAX is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_NET_9P is not set
|
||||
|
||||
#
|
||||
# CAIF Support
|
||||
#
|
||||
# CONFIG_CAIF is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
@ -514,7 +524,11 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
|||
# CONFIG_DEVTMPFS is not set
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
CONFIG_FW_LOADER=y
|
||||
CONFIG_FIRMWARE_IN_KERNEL=y
|
||||
CONFIG_EXTRA_FIRMWARE=""
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_DEBUG_DEVRES is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
# CONFIG_CONNECTOR is not set
|
||||
CONFIG_MTD=y
|
||||
|
@ -537,6 +551,7 @@ CONFIG_MTD_BLOCK=y
|
|||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
# CONFIG_SSFDC is not set
|
||||
# CONFIG_SM_FTL is not set
|
||||
# CONFIG_MTD_OOPS is not set
|
||||
|
||||
#
|
||||
|
@ -668,7 +683,9 @@ CONFIG_ATA=y
|
|||
CONFIG_ATA_VERBOSE_ERROR=y
|
||||
CONFIG_SATA_PMP=y
|
||||
# CONFIG_SATA_AHCI is not set
|
||||
# CONFIG_SATA_AHCI_PLATFORM is not set
|
||||
# CONFIG_SATA_SIL24 is not set
|
||||
# CONFIG_SATA_INIC162X is not set
|
||||
CONFIG_ATA_SFF=y
|
||||
# CONFIG_SATA_SVW is not set
|
||||
# CONFIG_ATA_PIIX is not set
|
||||
|
@ -683,7 +700,6 @@ CONFIG_SATA_SIL=y
|
|||
# CONFIG_SATA_ULI is not set
|
||||
# CONFIG_SATA_VIA is not set
|
||||
# CONFIG_SATA_VITESSE is not set
|
||||
# CONFIG_SATA_INIC162X is not set
|
||||
# CONFIG_PATA_ALI is not set
|
||||
# CONFIG_PATA_AMD is not set
|
||||
# CONFIG_PATA_ARTOP is not set
|
||||
|
@ -753,8 +769,36 @@ CONFIG_NETDEVICES=y
|
|||
# CONFIG_TUN is not set
|
||||
# CONFIG_VETH is not set
|
||||
# CONFIG_ARCNET is not set
|
||||
# CONFIG_NET_ETHERNET is not set
|
||||
# CONFIG_PHYLIB is not set
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_AX88796 is not set
|
||||
# CONFIG_STNIC is not set
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_CASSINI is not set
|
||||
CONFIG_NET_VENDOR_3COM=y
|
||||
CONFIG_VORTEX=y
|
||||
# CONFIG_TYPHOON is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_ETHOC is not set
|
||||
# CONFIG_SMC911X is not set
|
||||
# CONFIG_SMSC911X is not set
|
||||
# CONFIG_DNET is not set
|
||||
# CONFIG_NET_TULIP is not set
|
||||
# CONFIG_HP100 is not set
|
||||
# CONFIG_IBM_NEW_EMAC_ZMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_RGMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_TAH is not set
|
||||
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
|
||||
# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
|
||||
# CONFIG_NET_PCI is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_KS8842 is not set
|
||||
# CONFIG_KS8851_MLL is not set
|
||||
# CONFIG_ATL2 is not set
|
||||
CONFIG_NETDEV_1000=y
|
||||
# CONFIG_ACENIC is not set
|
||||
# CONFIG_DL2K is not set
|
||||
|
@ -836,6 +880,7 @@ CONFIG_INPUT_KEYBOARD=y
|
|||
CONFIG_KEYBOARD_ATKBD=y
|
||||
# CONFIG_QT2160 is not set
|
||||
# CONFIG_KEYBOARD_LKKBD is not set
|
||||
# CONFIG_KEYBOARD_TCA6416 is not set
|
||||
# CONFIG_KEYBOARD_MAX7359 is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
# CONFIG_KEYBOARD_OPENCORES is not set
|
||||
|
@ -884,6 +929,7 @@ CONFIG_HW_CONSOLE=y
|
|||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
# CONFIG_N_GSM is not set
|
||||
# CONFIG_NOZOMI is not set
|
||||
|
||||
#
|
||||
|
@ -901,6 +947,8 @@ CONFIG_SERIAL_CORE=y
|
|||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
# CONFIG_SERIAL_TIMBERDALE is not set
|
||||
# CONFIG_SERIAL_ALTERA_JTAGUART is not set
|
||||
# CONFIG_SERIAL_ALTERA_UART is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
|
@ -1071,7 +1119,7 @@ CONFIG_FB_CFB_IMAGEBLIT=y
|
|||
# CONFIG_FB_SIS is not set
|
||||
# CONFIG_FB_VIA is not set
|
||||
# CONFIG_FB_NEOMAGIC is not set
|
||||
# CONFIG_FB_KYRO is not set
|
||||
CONFIG_FB_KYRO=y
|
||||
# CONFIG_FB_3DFX is not set
|
||||
# CONFIG_FB_VOODOO1 is not set
|
||||
# CONFIG_FB_VT8623 is not set
|
||||
|
@ -1097,15 +1145,15 @@ CONFIG_FB_SM501=y
|
|||
#
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
|
||||
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_8x16=y
|
||||
CONFIG_LOGO=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
||||
CONFIG_LOGO_LINUX_MONO=y
|
||||
CONFIG_LOGO_LINUX_VGA16=y
|
||||
CONFIG_LOGO_LINUX_CLUT224=y
|
||||
CONFIG_LOGO_SUPERH_MONO=y
|
||||
CONFIG_LOGO_SUPERH_VGA16=y
|
||||
CONFIG_LOGO_SUPERH_CLUT224=y
|
||||
|
@ -1129,15 +1177,18 @@ CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
|
|||
CONFIG_SND_DYNAMIC_MINORS=y
|
||||
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||
# CONFIG_SND_DEBUG is not set
|
||||
CONFIG_SND_VERBOSE_PRINTK=y
|
||||
CONFIG_SND_DEBUG=y
|
||||
CONFIG_SND_DEBUG_VERBOSE=y
|
||||
CONFIG_SND_VMASTER=y
|
||||
CONFIG_SND_RAWMIDI_SEQ=y
|
||||
CONFIG_SND_OPL3_LIB_SEQ=y
|
||||
# CONFIG_SND_OPL4_LIB_SEQ is not set
|
||||
# CONFIG_SND_SBAWE_SEQ is not set
|
||||
# CONFIG_SND_EMU10K1_SEQ is not set
|
||||
CONFIG_SND_EMU10K1_SEQ=y
|
||||
CONFIG_SND_MPU401_UART=y
|
||||
CONFIG_SND_OPL3_LIB=y
|
||||
CONFIG_SND_AC97_CODEC=y
|
||||
# CONFIG_SND_DRIVERS is not set
|
||||
CONFIG_SND_PCI=y
|
||||
# CONFIG_SND_AD1889 is not set
|
||||
|
@ -1172,7 +1223,7 @@ CONFIG_SND_CMIPCI=y
|
|||
# CONFIG_SND_INDIGODJ is not set
|
||||
# CONFIG_SND_INDIGOIOX is not set
|
||||
# CONFIG_SND_INDIGODJX is not set
|
||||
# CONFIG_SND_EMU10K1 is not set
|
||||
CONFIG_SND_EMU10K1=y
|
||||
# CONFIG_SND_EMU10K1X is not set
|
||||
# CONFIG_SND_ENS1370 is not set
|
||||
# CONFIG_SND_ENS1371 is not set
|
||||
|
@ -1211,6 +1262,7 @@ CONFIG_SND_USB=y
|
|||
# CONFIG_SND_USB_CAIAQ is not set
|
||||
# CONFIG_SND_SOC is not set
|
||||
# CONFIG_SOUND_PRIME is not set
|
||||
CONFIG_AC97_BUS=y
|
||||
CONFIG_HID_SUPPORT=y
|
||||
CONFIG_HID=y
|
||||
# CONFIG_HIDRAW is not set
|
||||
|
@ -1226,44 +1278,42 @@ CONFIG_USB_HID=y
|
|||
# Special HID drivers
|
||||
#
|
||||
# CONFIG_HID_3M_PCT is not set
|
||||
CONFIG_HID_A4TECH=m
|
||||
CONFIG_HID_APPLE=m
|
||||
CONFIG_HID_BELKIN=m
|
||||
CONFIG_HID_CHERRY=m
|
||||
CONFIG_HID_CHICONY=m
|
||||
CONFIG_HID_CYPRESS=m
|
||||
CONFIG_HID_DRAGONRISE=m
|
||||
# CONFIG_DRAGONRISE_FF is not set
|
||||
CONFIG_HID_EZKEY=m
|
||||
CONFIG_HID_KYE=m
|
||||
CONFIG_HID_GYRATION=m
|
||||
CONFIG_HID_TWINHAN=m
|
||||
CONFIG_HID_KENSINGTON=m
|
||||
CONFIG_HID_LOGITECH=m
|
||||
# CONFIG_LOGITECH_FF is not set
|
||||
# CONFIG_LOGIRUMBLEPAD2_FF is not set
|
||||
# CONFIG_LOGIG940_FF is not set
|
||||
CONFIG_HID_MICROSOFT=m
|
||||
# CONFIG_HID_A4TECH is not set
|
||||
# CONFIG_HID_APPLE is not set
|
||||
# CONFIG_HID_BELKIN is not set
|
||||
# CONFIG_HID_CANDO is not set
|
||||
# CONFIG_HID_CHERRY is not set
|
||||
# CONFIG_HID_CHICONY is not set
|
||||
# CONFIG_HID_PRODIKEYS is not set
|
||||
# CONFIG_HID_CYPRESS is not set
|
||||
# CONFIG_HID_DRAGONRISE is not set
|
||||
# CONFIG_HID_EGALAX is not set
|
||||
# CONFIG_HID_EZKEY is not set
|
||||
# CONFIG_HID_KYE is not set
|
||||
# CONFIG_HID_GYRATION is not set
|
||||
# CONFIG_HID_TWINHAN is not set
|
||||
# CONFIG_HID_KENSINGTON is not set
|
||||
# CONFIG_HID_LOGITECH is not set
|
||||
# CONFIG_HID_MICROSOFT is not set
|
||||
# CONFIG_HID_MOSART is not set
|
||||
CONFIG_HID_MONTEREY=m
|
||||
CONFIG_HID_NTRIG=m
|
||||
# CONFIG_HID_MONTEREY is not set
|
||||
# CONFIG_HID_NTRIG is not set
|
||||
# CONFIG_HID_ORTEK is not set
|
||||
CONFIG_HID_PANTHERLORD=m
|
||||
# CONFIG_PANTHERLORD_FF is not set
|
||||
CONFIG_HID_PETALYNX=m
|
||||
# CONFIG_HID_PANTHERLORD is not set
|
||||
# CONFIG_HID_PETALYNX is not set
|
||||
# CONFIG_HID_PICOLCD is not set
|
||||
# CONFIG_HID_QUANTA is not set
|
||||
CONFIG_HID_SAMSUNG=m
|
||||
CONFIG_HID_SONY=m
|
||||
# CONFIG_HID_ROCCAT_KONE is not set
|
||||
# CONFIG_HID_SAMSUNG is not set
|
||||
# CONFIG_HID_SONY is not set
|
||||
# CONFIG_HID_STANTUM is not set
|
||||
CONFIG_HID_SUNPLUS=m
|
||||
CONFIG_HID_GREENASIA=m
|
||||
# CONFIG_GREENASIA_FF is not set
|
||||
CONFIG_HID_SMARTJOYPLUS=m
|
||||
# CONFIG_SMARTJOYPLUS_FF is not set
|
||||
CONFIG_HID_TOPSEED=m
|
||||
# CONFIG_HID_SUNPLUS is not set
|
||||
# CONFIG_HID_GREENASIA is not set
|
||||
# CONFIG_HID_SMARTJOYPLUS is not set
|
||||
# CONFIG_HID_TOPSEED is not set
|
||||
# CONFIG_HID_THRUSTMASTER is not set
|
||||
CONFIG_HID_ZEROPLUS=m
|
||||
# CONFIG_ZEROPLUS_FF is not set
|
||||
# CONFIG_HID_ZEROPLUS is not set
|
||||
# CONFIG_HID_ZYDACRON is not set
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
|
@ -1276,9 +1326,8 @@ CONFIG_USB=y
|
|||
# Miscellaneous USB options
|
||||
#
|
||||
# CONFIG_USB_DEVICEFS is not set
|
||||
CONFIG_USB_DEVICE_CLASS=y
|
||||
# CONFIG_USB_DEVICE_CLASS is not set
|
||||
# CONFIG_USB_DYNAMIC_MINORS is not set
|
||||
# CONFIG_USB_OTG is not set
|
||||
# CONFIG_USB_OTG_WHITELIST is not set
|
||||
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
|
||||
# CONFIG_USB_MON is not set
|
||||
|
@ -1290,9 +1339,7 @@ CONFIG_USB_DEVICE_CLASS=y
|
|||
#
|
||||
# CONFIG_USB_C67X00_HCD is not set
|
||||
# CONFIG_USB_XHCI_HCD is not set
|
||||
CONFIG_USB_EHCI_HCD=m
|
||||
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
|
||||
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
|
||||
# CONFIG_USB_EHCI_HCD is not set
|
||||
# CONFIG_USB_OXU210HP_HCD is not set
|
||||
# CONFIG_USB_ISP116X_HCD is not set
|
||||
# CONFIG_USB_ISP1760_HCD is not set
|
||||
|
@ -1361,7 +1408,6 @@ CONFIG_USB_STORAGE=y
|
|||
# CONFIG_USB_IDMOUSE is not set
|
||||
# CONFIG_USB_FTDI_ELAN is not set
|
||||
# CONFIG_USB_APPLEDISPLAY is not set
|
||||
# CONFIG_USB_SISUSBVGA is not set
|
||||
# CONFIG_USB_LD is not set
|
||||
# CONFIG_USB_TRANCEVIBRATOR is not set
|
||||
# CONFIG_USB_IOWARRIOR is not set
|
||||
|
@ -1464,6 +1510,7 @@ CONFIG_DMADEVICES=y
|
|||
#
|
||||
# DMA Devices
|
||||
#
|
||||
# CONFIG_TIMB_DMA is not set
|
||||
# CONFIG_AUXDISPLAY is not set
|
||||
CONFIG_UIO=m
|
||||
# CONFIG_UIO_CIF is not set
|
||||
|
@ -1473,10 +1520,6 @@ CONFIG_UIO=m
|
|||
# CONFIG_UIO_SERCOS3 is not set
|
||||
# CONFIG_UIO_PCI_GENERIC is not set
|
||||
# CONFIG_UIO_NETX is not set
|
||||
|
||||
#
|
||||
# TI VLYNQ
|
||||
#
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
#
|
||||
|
@ -1653,63 +1696,75 @@ CONFIG_MAGIC_SYSRQ=y
|
|||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
# CONFIG_DEBUG_KERNEL is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_DEBUG_SHIRQ is not set
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
|
||||
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
|
||||
CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
|
||||
CONFIG_SCHED_DEBUG=y
|
||||
CONFIG_SCHEDSTATS=y
|
||||
CONFIG_TRACE_IRQFLAGS=y
|
||||
# CONFIG_TIMER_STATS is not set
|
||||
# CONFIG_DEBUG_OBJECTS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_KMEMLEAK=y
|
||||
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=400
|
||||
# CONFIG_DEBUG_KMEMLEAK_TEST is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_LOCK_STAT is not set
|
||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
CONFIG_STACKTRACE=y
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_WRITECOUNT is not set
|
||||
# CONFIG_DEBUG_MEMORY_INIT is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
# CONFIG_DEBUG_NOTIFIERS is not set
|
||||
# CONFIG_DEBUG_CREDENTIALS is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_BACKTRACE_SELF_TEST is not set
|
||||
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
||||
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
||||
# CONFIG_LKDTM is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
CONFIG_LATENCYTOP=y
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
CONFIG_NOP_TRACER=y
|
||||
CONFIG_HAVE_FTRACE_NMI_ENTER=y
|
||||
# CONFIG_PAGE_POISONING is not set
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
CONFIG_TRACER_MAX_TRACE=y
|
||||
CONFIG_RING_BUFFER=y
|
||||
CONFIG_FTRACE_NMI_ENTER=y
|
||||
CONFIG_EVENT_TRACING=y
|
||||
CONFIG_CONTEXT_SWITCH_TRACER=y
|
||||
CONFIG_RING_BUFFER_ALLOW_SWAP=y
|
||||
CONFIG_TRACING=y
|
||||
CONFIG_GENERIC_TRACER=y
|
||||
CONFIG_TRACING_SUPPORT=y
|
||||
CONFIG_FTRACE=y
|
||||
CONFIG_FUNCTION_TRACER=y
|
||||
CONFIG_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_IRQSOFF_TRACER=y
|
||||
# CONFIG_PREEMPT_TRACER is not set
|
||||
CONFIG_SCHED_TRACER=y
|
||||
# CONFIG_FTRACE_SYSCALLS is not set
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
CONFIG_BRANCH_PROFILE_NONE=y
|
||||
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
|
||||
# CONFIG_PROFILE_ALL_BRANCHES is not set
|
||||
# CONFIG_KSYM_TRACER is not set
|
||||
CONFIG_STACK_TRACER=y
|
||||
CONFIG_KMEMTRACE=y
|
||||
CONFIG_WORKQUEUE_TRACER=y
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
CONFIG_DYNAMIC_FTRACE=y
|
||||
# CONFIG_FUNCTION_PROFILER is not set
|
||||
CONFIG_FTRACE_MCOUNT_RECORD=y
|
||||
# CONFIG_FTRACE_STARTUP_TEST is not set
|
||||
# CONFIG_RING_BUFFER_BENCHMARK is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_DYNAMIC_DEBUG is not set
|
||||
# CONFIG_DMA_API_DEBUG is not set
|
||||
# CONFIG_ATOMIC64_SELFTEST is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
# CONFIG_KGDB is not set
|
||||
# CONFIG_SH_STANDARD_BIOS is not set
|
||||
CONFIG_DWARF_UNWINDER=y
|
||||
CONFIG_MCOUNT=y
|
||||
# CONFIG_STACK_DEBUG is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
# CONFIG_4KSTACKS is not set
|
||||
CONFIG_DUMP_CODE=y
|
||||
# CONFIG_DWARF_UNWINDER is not set
|
||||
# CONFIG_SH_NO_BSS_INIT is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
|
@ -1820,7 +1875,7 @@ CONFIG_CRYPTO_DES=y
|
|||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||
# CONFIG_CRYPTO_HW is not set
|
||||
# CONFIG_VIRTUALIZATION is not set
|
||||
CONFIG_BINARY_PRINTF=y
|
||||
# CONFIG_BINARY_PRINTF is not set
|
||||
|
||||
#
|
||||
# Library routines
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* Header for the new SH dmaengine driver
|
||||
*
|
||||
* Copyright (C) 2010 Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef ASM_DMAENGINE_H
|
||||
#define ASM_DMAENGINE_H
|
||||
|
||||
#include <linux/sh_dma.h>
|
||||
|
||||
enum {
|
||||
SHDMA_SLAVE_SCIF0_TX,
|
||||
SHDMA_SLAVE_SCIF0_RX,
|
||||
SHDMA_SLAVE_SCIF1_TX,
|
||||
SHDMA_SLAVE_SCIF1_RX,
|
||||
SHDMA_SLAVE_SCIF2_TX,
|
||||
SHDMA_SLAVE_SCIF2_RX,
|
||||
SHDMA_SLAVE_SCIF3_TX,
|
||||
SHDMA_SLAVE_SCIF3_RX,
|
||||
SHDMA_SLAVE_SCIF4_TX,
|
||||
SHDMA_SLAVE_SCIF4_RX,
|
||||
SHDMA_SLAVE_SCIF5_TX,
|
||||
SHDMA_SLAVE_SCIF5_RX,
|
||||
SHDMA_SLAVE_SIUA_TX,
|
||||
SHDMA_SLAVE_SIUA_RX,
|
||||
SHDMA_SLAVE_SIUB_TX,
|
||||
SHDMA_SLAVE_SIUB_RX,
|
||||
};
|
||||
|
||||
#endif
|
|
@ -11,8 +11,6 @@
|
|||
#ifndef ASM_SIU_H
|
||||
#define ASM_SIU_H
|
||||
|
||||
#include <asm/dmaengine.h>
|
||||
|
||||
struct device;
|
||||
|
||||
struct siu_platform {
|
||||
|
|
|
@ -235,4 +235,19 @@ enum {
|
|||
HWBLK_NR,
|
||||
};
|
||||
|
||||
enum {
|
||||
SHDMA_SLAVE_SCIF0_TX,
|
||||
SHDMA_SLAVE_SCIF0_RX,
|
||||
SHDMA_SLAVE_SCIF1_TX,
|
||||
SHDMA_SLAVE_SCIF1_RX,
|
||||
SHDMA_SLAVE_SCIF2_TX,
|
||||
SHDMA_SLAVE_SCIF2_RX,
|
||||
SHDMA_SLAVE_SIUA_TX,
|
||||
SHDMA_SLAVE_SIUA_RX,
|
||||
SHDMA_SLAVE_SIUB_TX,
|
||||
SHDMA_SLAVE_SIUB_RX,
|
||||
SHDMA_SLAVE_SDHI0_TX,
|
||||
SHDMA_SLAVE_SDHI0_RX,
|
||||
};
|
||||
|
||||
#endif /* __ASM_SH7722_H__ */
|
||||
|
|
|
@ -283,4 +283,23 @@ enum {
|
|||
HWBLK_NR,
|
||||
};
|
||||
|
||||
enum {
|
||||
SHDMA_SLAVE_SCIF0_TX,
|
||||
SHDMA_SLAVE_SCIF0_RX,
|
||||
SHDMA_SLAVE_SCIF1_TX,
|
||||
SHDMA_SLAVE_SCIF1_RX,
|
||||
SHDMA_SLAVE_SCIF2_TX,
|
||||
SHDMA_SLAVE_SCIF2_RX,
|
||||
SHDMA_SLAVE_SCIF3_TX,
|
||||
SHDMA_SLAVE_SCIF3_RX,
|
||||
SHDMA_SLAVE_SCIF4_TX,
|
||||
SHDMA_SLAVE_SCIF4_RX,
|
||||
SHDMA_SLAVE_SCIF5_TX,
|
||||
SHDMA_SLAVE_SCIF5_RX,
|
||||
SHDMA_SLAVE_SDHI0_TX,
|
||||
SHDMA_SLAVE_SDHI0_RX,
|
||||
SHDMA_SLAVE_SDHI1_TX,
|
||||
SHDMA_SLAVE_SDHI1_RX,
|
||||
};
|
||||
|
||||
#endif /* __ASM_SH7724_H__ */
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/clk.h>
|
||||
#include <asm/clkdev.h>
|
||||
#include <asm/clock.h>
|
||||
#include <asm/freq.h>
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
#include <linux/usb/m66592.h>
|
||||
|
||||
#include <asm/clock.h>
|
||||
#include <asm/dmaengine.h>
|
||||
#include <asm/mmzone.h>
|
||||
#include <asm/siu.h>
|
||||
|
||||
|
@ -75,6 +74,16 @@ static const struct sh_dmae_slave_config sh7722_dmae_slaves[] = {
|
|||
.addr = 0xa454c094,
|
||||
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
|
||||
.mid_rid = 0xb6,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI0_TX,
|
||||
.addr = 0x04ce0030,
|
||||
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xc1,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI0_RX,
|
||||
.addr = 0x04ce0030,
|
||||
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xc2,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -18,19 +18,103 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/serial_sci.h>
|
||||
#include <linux/uio_driver.h>
|
||||
#include <linux/sh_dma.h>
|
||||
#include <linux/sh_timer.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/notifier.h>
|
||||
|
||||
#include <asm/suspend.h>
|
||||
#include <asm/clock.h>
|
||||
#include <asm/dmaengine.h>
|
||||
#include <asm/mmzone.h>
|
||||
|
||||
#include <cpu/dma-register.h>
|
||||
#include <cpu/sh7724.h>
|
||||
|
||||
/* DMA */
|
||||
static const struct sh_dmae_slave_config sh7724_dmae_slaves[] = {
|
||||
{
|
||||
.slave_id = SHDMA_SLAVE_SCIF0_TX,
|
||||
.addr = 0xffe0000c,
|
||||
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x21,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF0_RX,
|
||||
.addr = 0xffe00014,
|
||||
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x22,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF1_TX,
|
||||
.addr = 0xffe1000c,
|
||||
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x25,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF1_RX,
|
||||
.addr = 0xffe10014,
|
||||
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x26,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF2_TX,
|
||||
.addr = 0xffe2000c,
|
||||
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x29,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF2_RX,
|
||||
.addr = 0xffe20014,
|
||||
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x2a,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF3_TX,
|
||||
.addr = 0xa4e30020,
|
||||
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x2d,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF3_RX,
|
||||
.addr = 0xa4e30024,
|
||||
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x2e,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF4_TX,
|
||||
.addr = 0xa4e40020,
|
||||
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x31,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF4_RX,
|
||||
.addr = 0xa4e40024,
|
||||
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x32,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF5_TX,
|
||||
.addr = 0xa4e50020,
|
||||
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x35,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SCIF5_RX,
|
||||
.addr = 0xa4e50024,
|
||||
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||
.mid_rid = 0x36,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI0_TX,
|
||||
.addr = 0x04ce0030,
|
||||
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xc1,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI0_RX,
|
||||
.addr = 0x04ce0030,
|
||||
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xc2,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI1_TX,
|
||||
.addr = 0x04cf0030,
|
||||
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xc9,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI1_RX,
|
||||
.addr = 0x04cf0030,
|
||||
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xca,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct sh_dmae_channel sh7724_dmae_channels[] = {
|
||||
{
|
||||
.offset = 0,
|
||||
|
@ -62,6 +146,8 @@ static const struct sh_dmae_channel sh7724_dmae_channels[] = {
|
|||
static const unsigned int ts_shift[] = TS_SHIFT;
|
||||
|
||||
static struct sh_dmae_pdata dma_platform_data = {
|
||||
.slave = sh7724_dmae_slaves,
|
||||
.slave_num = ARRAY_SIZE(sh7724_dmae_slaves),
|
||||
.channel = sh7724_dmae_channels,
|
||||
.channel_num = ARRAY_SIZE(sh7724_dmae_channels),
|
||||
.ts_low_shift = CHCR_TS_LOW_SHIFT,
|
||||
|
|
|
@ -12,10 +12,9 @@
|
|||
#include <linux/serial.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/serial_sci.h>
|
||||
#include <linux/sh_dma.h>
|
||||
#include <linux/sh_timer.h>
|
||||
|
||||
#include <asm/dmaengine.h>
|
||||
|
||||
#include <cpu/dma-register.h>
|
||||
|
||||
static struct plat_sci_port scif0_platform_data = {
|
||||
|
|
|
@ -13,9 +13,9 @@
|
|||
#include <linux/serial_sci.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sh_dma.h>
|
||||
#include <linux/sh_timer.h>
|
||||
|
||||
#include <asm/dmaengine.h>
|
||||
#include <asm/mmzone.h>
|
||||
|
||||
#include <cpu/dma-register.h>
|
||||
|
|
|
@ -21,10 +21,10 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/sh_timer.h>
|
||||
#include <linux/sh_dma.h>
|
||||
#include <linux/sh_intc.h>
|
||||
#include <cpu/dma-register.h>
|
||||
#include <asm/mmzone.h>
|
||||
#include <asm/dmaengine.h>
|
||||
|
||||
static struct plat_sci_port scif0_platform_data = {
|
||||
.mapbase = 0xffea0000,
|
||||
|
|
|
@ -845,8 +845,10 @@ static int dwarf_parse_cie(void *entry, void *p, unsigned long len,
|
|||
rb_link_node(&cie->node, parent, rb_node);
|
||||
rb_insert_color(&cie->node, &cie_root);
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
if (mod != NULL)
|
||||
list_add_tail(&cie->link, &mod->arch.cie_list);
|
||||
#endif
|
||||
|
||||
spin_unlock_irqrestore(&dwarf_cie_lock, flags);
|
||||
|
||||
|
@ -935,8 +937,10 @@ static int dwarf_parse_fde(void *entry, u32 entry_type,
|
|||
rb_link_node(&fde->node, parent, rb_node);
|
||||
rb_insert_color(&fde->node, &fde_root);
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
if (mod != NULL)
|
||||
list_add_tail(&fde->link, &mod->arch.fde_list);
|
||||
#endif
|
||||
|
||||
spin_unlock_irqrestore(&dwarf_fde_lock, flags);
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ ENTRY(strlen)
|
|||
mov.b @r4+,r1
|
||||
tst r1,r1
|
||||
bt 8f
|
||||
add #1,r2
|
||||
add #1,r2
|
||||
|
||||
1:
|
||||
mov #0,r3
|
||||
|
|
|
@ -722,6 +722,10 @@ static void sh_dmae_chan_ld_cleanup(struct sh_dmae_chan *sh_chan, bool all)
|
|||
{
|
||||
while (__ld_cleanup(sh_chan, all))
|
||||
;
|
||||
|
||||
if (all)
|
||||
/* Terminating - forgive uncompleted cookies */
|
||||
sh_chan->completed_cookie = sh_chan->common.cookie;
|
||||
}
|
||||
|
||||
static void sh_chan_xfer_ld_queue(struct sh_dmae_chan *sh_chan)
|
||||
|
@ -1188,6 +1192,7 @@ static struct platform_driver sh_dmae_driver = {
|
|||
.remove = __exit_p(sh_dmae_remove),
|
||||
.shutdown = sh_dmae_shutdown,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "sh-dma-engine",
|
||||
},
|
||||
};
|
||||
|
|
|
@ -49,6 +49,7 @@ config MFD_SH_MOBILE_SDHI
|
|||
bool "Support for SuperH Mobile SDHI"
|
||||
depends on SUPERH || ARCH_SHMOBILE
|
||||
select MFD_CORE
|
||||
select TMIO_MMC_DMA
|
||||
---help---
|
||||
This driver supports the SDHI hardware block found in many
|
||||
SuperH Mobile SoCs.
|
||||
|
@ -162,6 +163,11 @@ config MFD_TMIO
|
|||
bool
|
||||
default n
|
||||
|
||||
config TMIO_MMC_DMA
|
||||
bool
|
||||
select DMA_ENGINE
|
||||
select DMADEVICES
|
||||
|
||||
config MFD_T7L66XB
|
||||
bool "Support Toshiba T7L66XB"
|
||||
depends on ARM && HAVE_CLK
|
||||
|
|
|
@ -26,11 +26,15 @@
|
|||
#include <linux/mfd/core.h>
|
||||
#include <linux/mfd/tmio.h>
|
||||
#include <linux/mfd/sh_mobile_sdhi.h>
|
||||
#include <linux/sh_dma.h>
|
||||
|
||||
struct sh_mobile_sdhi {
|
||||
struct clk *clk;
|
||||
struct tmio_mmc_data mmc_data;
|
||||
struct mfd_cell cell_mmc;
|
||||
struct sh_dmae_slave param_tx;
|
||||
struct sh_dmae_slave param_rx;
|
||||
struct tmio_mmc_dma dma_priv;
|
||||
};
|
||||
|
||||
static struct resource sh_mobile_sdhi_resources[] = {
|
||||
|
@ -64,6 +68,8 @@ static void sh_mobile_sdhi_set_pwr(struct platform_device *tmio, int state)
|
|||
static int __init sh_mobile_sdhi_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct sh_mobile_sdhi *priv;
|
||||
struct tmio_mmc_data *mmc_data;
|
||||
struct sh_mobile_sdhi_info *p = pdev->dev.platform_data;
|
||||
struct resource *mem;
|
||||
char clk_name[8];
|
||||
int ret, irq;
|
||||
|
@ -85,6 +91,8 @@ static int __init sh_mobile_sdhi_probe(struct platform_device *pdev)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mmc_data = &priv->mmc_data;
|
||||
|
||||
snprintf(clk_name, sizeof(clk_name), "sdhi%d", pdev->id);
|
||||
priv->clk = clk_get(&pdev->dev, clk_name);
|
||||
if (IS_ERR(priv->clk)) {
|
||||
|
@ -96,12 +104,24 @@ static int __init sh_mobile_sdhi_probe(struct platform_device *pdev)
|
|||
|
||||
clk_enable(priv->clk);
|
||||
|
||||
priv->mmc_data.hclk = clk_get_rate(priv->clk);
|
||||
priv->mmc_data.set_pwr = sh_mobile_sdhi_set_pwr;
|
||||
priv->mmc_data.capabilities = MMC_CAP_MMC_HIGHSPEED;
|
||||
mmc_data->hclk = clk_get_rate(priv->clk);
|
||||
mmc_data->set_pwr = sh_mobile_sdhi_set_pwr;
|
||||
mmc_data->capabilities = MMC_CAP_MMC_HIGHSPEED;
|
||||
if (p) {
|
||||
mmc_data->flags = p->tmio_flags;
|
||||
mmc_data->ocr_mask = p->tmio_ocr_mask;
|
||||
}
|
||||
|
||||
if (p && p->dma_slave_tx >= 0 && p->dma_slave_rx >= 0) {
|
||||
priv->param_tx.slave_id = p->dma_slave_tx;
|
||||
priv->param_rx.slave_id = p->dma_slave_rx;
|
||||
priv->dma_priv.chan_priv_tx = &priv->param_tx;
|
||||
priv->dma_priv.chan_priv_rx = &priv->param_rx;
|
||||
mmc_data->dma = &priv->dma_priv;
|
||||
}
|
||||
|
||||
memcpy(&priv->cell_mmc, &sh_mobile_sdhi_cell, sizeof(priv->cell_mmc));
|
||||
priv->cell_mmc.driver_data = &priv->mmc_data;
|
||||
priv->cell_mmc.driver_data = mmc_data;
|
||||
priv->cell_mmc.platform_data = &priv->cell_mmc;
|
||||
priv->cell_mmc.data_size = sizeof(priv->cell_mmc);
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <linux/irq.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/mfd/tmio.h>
|
||||
|
@ -131,8 +132,8 @@ tmio_mmc_start_command(struct tmio_mmc_host *host, struct mmc_command *cmd)
|
|||
|
||||
host->cmd = cmd;
|
||||
|
||||
/* FIXME - this seems to be ok comented out but the spec suggest this bit should
|
||||
* be set when issuing app commands.
|
||||
/* FIXME - this seems to be ok commented out but the spec suggest this bit
|
||||
* should be set when issuing app commands.
|
||||
* if(cmd->flags & MMC_FLAG_ACMD)
|
||||
* c |= APP_CMD;
|
||||
*/
|
||||
|
@ -155,12 +156,12 @@ tmio_mmc_start_command(struct tmio_mmc_host *host, struct mmc_command *cmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* This chip always returns (at least?) as much data as you ask for.
|
||||
/*
|
||||
* This chip always returns (at least?) as much data as you ask for.
|
||||
* I'm unsure what happens if you ask for less than a block. This should be
|
||||
* looked into to ensure that a funny length read doesnt hose the controller.
|
||||
*
|
||||
*/
|
||||
static inline void tmio_mmc_pio_irq(struct tmio_mmc_host *host)
|
||||
static void tmio_mmc_pio_irq(struct tmio_mmc_host *host)
|
||||
{
|
||||
struct mmc_data *data = host->data;
|
||||
unsigned short *buf;
|
||||
|
@ -180,7 +181,7 @@ static inline void tmio_mmc_pio_irq(struct tmio_mmc_host *host)
|
|||
count = data->blksz;
|
||||
|
||||
pr_debug("count: %08x offset: %08x flags %08x\n",
|
||||
count, host->sg_off, data->flags);
|
||||
count, host->sg_off, data->flags);
|
||||
|
||||
/* Transfer the data */
|
||||
if (data->flags & MMC_DATA_READ)
|
||||
|
@ -198,7 +199,7 @@ static inline void tmio_mmc_pio_irq(struct tmio_mmc_host *host)
|
|||
return;
|
||||
}
|
||||
|
||||
static inline void tmio_mmc_data_irq(struct tmio_mmc_host *host)
|
||||
static void tmio_mmc_do_data_irq(struct tmio_mmc_host *host)
|
||||
{
|
||||
struct mmc_data *data = host->data;
|
||||
struct mmc_command *stop;
|
||||
|
@ -206,7 +207,7 @@ static inline void tmio_mmc_data_irq(struct tmio_mmc_host *host)
|
|||
host->data = NULL;
|
||||
|
||||
if (!data) {
|
||||
pr_debug("Spurious data end IRQ\n");
|
||||
dev_warn(&host->pdev->dev, "Spurious data end IRQ\n");
|
||||
return;
|
||||
}
|
||||
stop = data->stop;
|
||||
|
@ -219,7 +220,8 @@ static inline void tmio_mmc_data_irq(struct tmio_mmc_host *host)
|
|||
|
||||
pr_debug("Completed data request\n");
|
||||
|
||||
/*FIXME - other drivers allow an optional stop command of any given type
|
||||
/*
|
||||
* FIXME: other drivers allow an optional stop command of any given type
|
||||
* which we dont do, as the chip can auto generate them.
|
||||
* Perhaps we can be smarter about when to use auto CMD12 and
|
||||
* only issue the auto request when we know this is the desired
|
||||
|
@ -227,10 +229,17 @@ static inline void tmio_mmc_data_irq(struct tmio_mmc_host *host)
|
|||
* upper layers expect. For now, we do what works.
|
||||
*/
|
||||
|
||||
if (data->flags & MMC_DATA_READ)
|
||||
disable_mmc_irqs(host, TMIO_MASK_READOP);
|
||||
else
|
||||
disable_mmc_irqs(host, TMIO_MASK_WRITEOP);
|
||||
if (data->flags & MMC_DATA_READ) {
|
||||
if (!host->chan_rx)
|
||||
disable_mmc_irqs(host, TMIO_MASK_READOP);
|
||||
dev_dbg(&host->pdev->dev, "Complete Rx request %p\n",
|
||||
host->mrq);
|
||||
} else {
|
||||
if (!host->chan_tx)
|
||||
disable_mmc_irqs(host, TMIO_MASK_WRITEOP);
|
||||
dev_dbg(&host->pdev->dev, "Complete Tx request %p\n",
|
||||
host->mrq);
|
||||
}
|
||||
|
||||
if (stop) {
|
||||
if (stop->opcode == 12 && !stop->arg)
|
||||
|
@ -242,7 +251,35 @@ static inline void tmio_mmc_data_irq(struct tmio_mmc_host *host)
|
|||
tmio_mmc_finish_request(host);
|
||||
}
|
||||
|
||||
static inline void tmio_mmc_cmd_irq(struct tmio_mmc_host *host,
|
||||
static void tmio_mmc_data_irq(struct tmio_mmc_host *host)
|
||||
{
|
||||
struct mmc_data *data = host->data;
|
||||
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
if (host->chan_tx && (data->flags & MMC_DATA_WRITE)) {
|
||||
/*
|
||||
* Has all data been written out yet? Testing on SuperH showed,
|
||||
* that in most cases the first interrupt comes already with the
|
||||
* BUSY status bit clear, but on some operations, like mount or
|
||||
* in the beginning of a write / sync / umount, there is one
|
||||
* DATAEND interrupt with the BUSY bit set, in this cases
|
||||
* waiting for one more interrupt fixes the problem.
|
||||
*/
|
||||
if (!(sd_ctrl_read32(host, CTL_STATUS) & TMIO_STAT_CMD_BUSY)) {
|
||||
disable_mmc_irqs(host, TMIO_STAT_DATAEND);
|
||||
tasklet_schedule(&host->dma_complete);
|
||||
}
|
||||
} else if (host->chan_rx && (data->flags & MMC_DATA_READ)) {
|
||||
disable_mmc_irqs(host, TMIO_STAT_DATAEND);
|
||||
tasklet_schedule(&host->dma_complete);
|
||||
} else {
|
||||
tmio_mmc_do_data_irq(host);
|
||||
}
|
||||
}
|
||||
|
||||
static void tmio_mmc_cmd_irq(struct tmio_mmc_host *host,
|
||||
unsigned int stat)
|
||||
{
|
||||
struct mmc_command *cmd = host->cmd;
|
||||
|
@ -282,10 +319,16 @@ static inline void tmio_mmc_cmd_irq(struct tmio_mmc_host *host,
|
|||
* If theres no data or we encountered an error, finish now.
|
||||
*/
|
||||
if (host->data && !cmd->error) {
|
||||
if (host->data->flags & MMC_DATA_READ)
|
||||
enable_mmc_irqs(host, TMIO_MASK_READOP);
|
||||
else
|
||||
enable_mmc_irqs(host, TMIO_MASK_WRITEOP);
|
||||
if (host->data->flags & MMC_DATA_READ) {
|
||||
if (!host->chan_rx)
|
||||
enable_mmc_irqs(host, TMIO_MASK_READOP);
|
||||
} else {
|
||||
struct dma_chan *chan = host->chan_tx;
|
||||
if (!chan)
|
||||
enable_mmc_irqs(host, TMIO_MASK_WRITEOP);
|
||||
else
|
||||
tasklet_schedule(&host->dma_issue);
|
||||
}
|
||||
} else {
|
||||
tmio_mmc_finish_request(host);
|
||||
}
|
||||
|
@ -293,7 +336,6 @@ static inline void tmio_mmc_cmd_irq(struct tmio_mmc_host *host,
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
static irqreturn_t tmio_mmc_irq(int irq, void *devid)
|
||||
{
|
||||
struct tmio_mmc_host *host = devid;
|
||||
|
@ -311,7 +353,7 @@ static irqreturn_t tmio_mmc_irq(int irq, void *devid)
|
|||
if (!ireg) {
|
||||
disable_mmc_irqs(host, status & ~irq_mask);
|
||||
|
||||
pr_debug("tmio_mmc: Spurious irq, disabling! "
|
||||
pr_warning("tmio_mmc: Spurious irq, disabling! "
|
||||
"0x%08x 0x%08x 0x%08x\n", status, irq_mask, ireg);
|
||||
pr_debug_status(status);
|
||||
|
||||
|
@ -363,16 +405,265 @@ out:
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TMIO_MMC_DMA
|
||||
static void tmio_mmc_enable_dma(struct tmio_mmc_host *host, bool enable)
|
||||
{
|
||||
#if defined(CONFIG_SUPERH) || defined(CONFIG_ARCH_SHMOBILE)
|
||||
/* Switch DMA mode on or off - SuperH specific? */
|
||||
sd_ctrl_write16(host, 0xd8, enable ? 2 : 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void tmio_dma_complete(void *arg)
|
||||
{
|
||||
struct tmio_mmc_host *host = arg;
|
||||
|
||||
dev_dbg(&host->pdev->dev, "Command completed\n");
|
||||
|
||||
if (!host->data)
|
||||
dev_warn(&host->pdev->dev, "NULL data in DMA completion!\n");
|
||||
else
|
||||
enable_mmc_irqs(host, TMIO_STAT_DATAEND);
|
||||
}
|
||||
|
||||
static int tmio_mmc_start_dma_rx(struct tmio_mmc_host *host)
|
||||
{
|
||||
struct scatterlist *sg = host->sg_ptr;
|
||||
struct dma_async_tx_descriptor *desc = NULL;
|
||||
struct dma_chan *chan = host->chan_rx;
|
||||
int ret;
|
||||
|
||||
ret = dma_map_sg(&host->pdev->dev, sg, host->sg_len, DMA_FROM_DEVICE);
|
||||
if (ret > 0) {
|
||||
host->dma_sglen = ret;
|
||||
desc = chan->device->device_prep_slave_sg(chan, sg, ret,
|
||||
DMA_FROM_DEVICE, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
||||
}
|
||||
|
||||
if (desc) {
|
||||
host->desc = desc;
|
||||
desc->callback = tmio_dma_complete;
|
||||
desc->callback_param = host;
|
||||
host->cookie = desc->tx_submit(desc);
|
||||
if (host->cookie < 0) {
|
||||
host->desc = NULL;
|
||||
ret = host->cookie;
|
||||
} else {
|
||||
chan->device->device_issue_pending(chan);
|
||||
}
|
||||
}
|
||||
dev_dbg(&host->pdev->dev, "%s(): mapped %d -> %d, cookie %d, rq %p\n",
|
||||
__func__, host->sg_len, ret, host->cookie, host->mrq);
|
||||
|
||||
if (!host->desc) {
|
||||
/* DMA failed, fall back to PIO */
|
||||
if (ret >= 0)
|
||||
ret = -EIO;
|
||||
host->chan_rx = NULL;
|
||||
dma_release_channel(chan);
|
||||
/* Free the Tx channel too */
|
||||
chan = host->chan_tx;
|
||||
if (chan) {
|
||||
host->chan_tx = NULL;
|
||||
dma_release_channel(chan);
|
||||
}
|
||||
dev_warn(&host->pdev->dev,
|
||||
"DMA failed: %d, falling back to PIO\n", ret);
|
||||
tmio_mmc_enable_dma(host, false);
|
||||
reset(host);
|
||||
/* Fail this request, let above layers recover */
|
||||
host->mrq->cmd->error = ret;
|
||||
tmio_mmc_finish_request(host);
|
||||
}
|
||||
|
||||
dev_dbg(&host->pdev->dev, "%s(): desc %p, cookie %d, sg[%d]\n", __func__,
|
||||
desc, host->cookie, host->sg_len);
|
||||
|
||||
return ret > 0 ? 0 : ret;
|
||||
}
|
||||
|
||||
static int tmio_mmc_start_dma_tx(struct tmio_mmc_host *host)
|
||||
{
|
||||
struct scatterlist *sg = host->sg_ptr;
|
||||
struct dma_async_tx_descriptor *desc = NULL;
|
||||
struct dma_chan *chan = host->chan_tx;
|
||||
int ret;
|
||||
|
||||
ret = dma_map_sg(&host->pdev->dev, sg, host->sg_len, DMA_TO_DEVICE);
|
||||
if (ret > 0) {
|
||||
host->dma_sglen = ret;
|
||||
desc = chan->device->device_prep_slave_sg(chan, sg, ret,
|
||||
DMA_TO_DEVICE, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
||||
}
|
||||
|
||||
if (desc) {
|
||||
host->desc = desc;
|
||||
desc->callback = tmio_dma_complete;
|
||||
desc->callback_param = host;
|
||||
host->cookie = desc->tx_submit(desc);
|
||||
if (host->cookie < 0) {
|
||||
host->desc = NULL;
|
||||
ret = host->cookie;
|
||||
}
|
||||
}
|
||||
dev_dbg(&host->pdev->dev, "%s(): mapped %d -> %d, cookie %d, rq %p\n",
|
||||
__func__, host->sg_len, ret, host->cookie, host->mrq);
|
||||
|
||||
if (!host->desc) {
|
||||
/* DMA failed, fall back to PIO */
|
||||
if (ret >= 0)
|
||||
ret = -EIO;
|
||||
host->chan_tx = NULL;
|
||||
dma_release_channel(chan);
|
||||
/* Free the Rx channel too */
|
||||
chan = host->chan_rx;
|
||||
if (chan) {
|
||||
host->chan_rx = NULL;
|
||||
dma_release_channel(chan);
|
||||
}
|
||||
dev_warn(&host->pdev->dev,
|
||||
"DMA failed: %d, falling back to PIO\n", ret);
|
||||
tmio_mmc_enable_dma(host, false);
|
||||
reset(host);
|
||||
/* Fail this request, let above layers recover */
|
||||
host->mrq->cmd->error = ret;
|
||||
tmio_mmc_finish_request(host);
|
||||
}
|
||||
|
||||
dev_dbg(&host->pdev->dev, "%s(): desc %p, cookie %d\n", __func__,
|
||||
desc, host->cookie);
|
||||
|
||||
return ret > 0 ? 0 : ret;
|
||||
}
|
||||
|
||||
static int tmio_mmc_start_dma(struct tmio_mmc_host *host,
|
||||
struct mmc_data *data)
|
||||
{
|
||||
if (data->flags & MMC_DATA_READ) {
|
||||
if (host->chan_rx)
|
||||
return tmio_mmc_start_dma_rx(host);
|
||||
} else {
|
||||
if (host->chan_tx)
|
||||
return tmio_mmc_start_dma_tx(host);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tmio_issue_tasklet_fn(unsigned long priv)
|
||||
{
|
||||
struct tmio_mmc_host *host = (struct tmio_mmc_host *)priv;
|
||||
struct dma_chan *chan = host->chan_tx;
|
||||
|
||||
chan->device->device_issue_pending(chan);
|
||||
}
|
||||
|
||||
static void tmio_tasklet_fn(unsigned long arg)
|
||||
{
|
||||
struct tmio_mmc_host *host = (struct tmio_mmc_host *)arg;
|
||||
|
||||
if (host->data->flags & MMC_DATA_READ)
|
||||
dma_unmap_sg(&host->pdev->dev, host->sg_ptr, host->dma_sglen,
|
||||
DMA_FROM_DEVICE);
|
||||
else
|
||||
dma_unmap_sg(&host->pdev->dev, host->sg_ptr, host->dma_sglen,
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
tmio_mmc_do_data_irq(host);
|
||||
}
|
||||
|
||||
/* It might be necessary to make filter MFD specific */
|
||||
static bool tmio_mmc_filter(struct dma_chan *chan, void *arg)
|
||||
{
|
||||
dev_dbg(chan->device->dev, "%s: slave data %p\n", __func__, arg);
|
||||
chan->private = arg;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void tmio_mmc_request_dma(struct tmio_mmc_host *host,
|
||||
struct tmio_mmc_data *pdata)
|
||||
{
|
||||
host->cookie = -EINVAL;
|
||||
host->desc = NULL;
|
||||
|
||||
/* We can only either use DMA for both Tx and Rx or not use it at all */
|
||||
if (pdata->dma) {
|
||||
dma_cap_mask_t mask;
|
||||
|
||||
dma_cap_zero(mask);
|
||||
dma_cap_set(DMA_SLAVE, mask);
|
||||
|
||||
host->chan_tx = dma_request_channel(mask, tmio_mmc_filter,
|
||||
pdata->dma->chan_priv_tx);
|
||||
dev_dbg(&host->pdev->dev, "%s: TX: got channel %p\n", __func__,
|
||||
host->chan_tx);
|
||||
|
||||
if (!host->chan_tx)
|
||||
return;
|
||||
|
||||
host->chan_rx = dma_request_channel(mask, tmio_mmc_filter,
|
||||
pdata->dma->chan_priv_rx);
|
||||
dev_dbg(&host->pdev->dev, "%s: RX: got channel %p\n", __func__,
|
||||
host->chan_rx);
|
||||
|
||||
if (!host->chan_rx) {
|
||||
dma_release_channel(host->chan_tx);
|
||||
host->chan_tx = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
tasklet_init(&host->dma_complete, tmio_tasklet_fn, (unsigned long)host);
|
||||
tasklet_init(&host->dma_issue, tmio_issue_tasklet_fn, (unsigned long)host);
|
||||
|
||||
tmio_mmc_enable_dma(host, true);
|
||||
}
|
||||
}
|
||||
|
||||
static void tmio_mmc_release_dma(struct tmio_mmc_host *host)
|
||||
{
|
||||
if (host->chan_tx) {
|
||||
struct dma_chan *chan = host->chan_tx;
|
||||
host->chan_tx = NULL;
|
||||
dma_release_channel(chan);
|
||||
}
|
||||
if (host->chan_rx) {
|
||||
struct dma_chan *chan = host->chan_rx;
|
||||
host->chan_rx = NULL;
|
||||
dma_release_channel(chan);
|
||||
}
|
||||
|
||||
host->cookie = -EINVAL;
|
||||
host->desc = NULL;
|
||||
}
|
||||
#else
|
||||
static int tmio_mmc_start_dma(struct tmio_mmc_host *host,
|
||||
struct mmc_data *data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tmio_mmc_request_dma(struct tmio_mmc_host *host,
|
||||
struct tmio_mmc_data *pdata)
|
||||
{
|
||||
host->chan_tx = NULL;
|
||||
host->chan_rx = NULL;
|
||||
}
|
||||
|
||||
static void tmio_mmc_release_dma(struct tmio_mmc_host *host)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static int tmio_mmc_start_data(struct tmio_mmc_host *host,
|
||||
struct mmc_data *data)
|
||||
{
|
||||
pr_debug("setup data transfer: blocksize %08x nr_blocks %d\n",
|
||||
data->blksz, data->blocks);
|
||||
data->blksz, data->blocks);
|
||||
|
||||
/* Hardware cannot perform 1 and 2 byte requests in 4 bit mode */
|
||||
if (data->blksz < 4 && host->mmc->ios.bus_width == MMC_BUS_WIDTH_4) {
|
||||
printk(KERN_ERR "%s: %d byte block unsupported in 4 bit mode\n",
|
||||
mmc_hostname(host->mmc), data->blksz);
|
||||
pr_err("%s: %d byte block unsupported in 4 bit mode\n",
|
||||
mmc_hostname(host->mmc), data->blksz);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -383,7 +674,7 @@ static int tmio_mmc_start_data(struct tmio_mmc_host *host,
|
|||
sd_ctrl_write16(host, CTL_SD_XFER_LEN, data->blksz);
|
||||
sd_ctrl_write16(host, CTL_XFER_BLK_COUNT, data->blocks);
|
||||
|
||||
return 0;
|
||||
return tmio_mmc_start_dma(host, data);
|
||||
}
|
||||
|
||||
/* Process requests from the MMC layer */
|
||||
|
@ -404,7 +695,6 @@ static void tmio_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|||
}
|
||||
|
||||
ret = tmio_mmc_start_command(host, mrq->cmd);
|
||||
|
||||
if (!ret)
|
||||
return;
|
||||
|
||||
|
@ -458,11 +748,14 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|||
static int tmio_mmc_get_ro(struct mmc_host *mmc)
|
||||
{
|
||||
struct tmio_mmc_host *host = mmc_priv(mmc);
|
||||
struct mfd_cell *cell = host->pdev->dev.platform_data;
|
||||
struct tmio_mmc_data *pdata = cell->driver_data;
|
||||
|
||||
return (sd_ctrl_read16(host, CTL_STATUS) & TMIO_STAT_WRPROTECT) ? 0 : 1;
|
||||
return ((pdata->flags & TMIO_MMC_WRPROTECT_DISABLE) ||
|
||||
(sd_ctrl_read32(host, CTL_STATUS) & TMIO_STAT_WRPROTECT)) ? 0 : 1;
|
||||
}
|
||||
|
||||
static struct mmc_host_ops tmio_mmc_ops = {
|
||||
static const struct mmc_host_ops tmio_mmc_ops = {
|
||||
.request = tmio_mmc_request,
|
||||
.set_ios = tmio_mmc_set_ios,
|
||||
.get_ro = tmio_mmc_get_ro,
|
||||
|
@ -515,6 +808,7 @@ static int __devinit tmio_mmc_probe(struct platform_device *dev)
|
|||
struct tmio_mmc_host *host;
|
||||
struct mmc_host *mmc;
|
||||
int ret = -EINVAL;
|
||||
u32 irq_mask = TMIO_MASK_CMD;
|
||||
|
||||
if (dev->num_resources != 2)
|
||||
goto out;
|
||||
|
@ -553,7 +847,10 @@ static int __devinit tmio_mmc_probe(struct platform_device *dev)
|
|||
mmc->caps |= pdata->capabilities;
|
||||
mmc->f_max = pdata->hclk;
|
||||
mmc->f_min = mmc->f_max / 512;
|
||||
mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||
if (pdata->ocr_mask)
|
||||
mmc->ocr_avail = pdata->ocr_mask;
|
||||
else
|
||||
mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||
|
||||
/* Tell the MFD core we are ready to be enabled */
|
||||
if (cell->enable) {
|
||||
|
@ -578,13 +875,20 @@ static int __devinit tmio_mmc_probe(struct platform_device *dev)
|
|||
if (ret)
|
||||
goto cell_disable;
|
||||
|
||||
/* See if we also get DMA */
|
||||
tmio_mmc_request_dma(host, pdata);
|
||||
|
||||
mmc_add_host(mmc);
|
||||
|
||||
printk(KERN_INFO "%s at 0x%08lx irq %d\n", mmc_hostname(host->mmc),
|
||||
(unsigned long)host->ctl, host->irq);
|
||||
pr_info("%s at 0x%08lx irq %d\n", mmc_hostname(host->mmc),
|
||||
(unsigned long)host->ctl, host->irq);
|
||||
|
||||
/* Unmask the IRQs we want to know about */
|
||||
enable_mmc_irqs(host, TMIO_MASK_IRQ);
|
||||
if (!host->chan_rx)
|
||||
irq_mask |= TMIO_MASK_READOP;
|
||||
if (!host->chan_tx)
|
||||
irq_mask |= TMIO_MASK_WRITEOP;
|
||||
enable_mmc_irqs(host, irq_mask);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -609,6 +913,7 @@ static int __devexit tmio_mmc_remove(struct platform_device *dev)
|
|||
if (mmc) {
|
||||
struct tmio_mmc_host *host = mmc_priv(mmc);
|
||||
mmc_remove_host(mmc);
|
||||
tmio_mmc_release_dma(host);
|
||||
free_irq(host->irq, host);
|
||||
if (cell->disable)
|
||||
cell->disable(dev);
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
*/
|
||||
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/dmaengine.h>
|
||||
|
||||
#define CTL_SD_CMD 0x00
|
||||
#define CTL_ARG_REG 0x04
|
||||
|
@ -106,6 +108,17 @@ struct tmio_mmc_host {
|
|||
unsigned int sg_off;
|
||||
|
||||
struct platform_device *pdev;
|
||||
|
||||
/* DMA support */
|
||||
struct dma_chan *chan_rx;
|
||||
struct dma_chan *chan_tx;
|
||||
struct tasklet_struct dma_complete;
|
||||
struct tasklet_struct dma_issue;
|
||||
#ifdef CONFIG_TMIO_MMC_DMA
|
||||
struct dma_async_tx_descriptor *desc;
|
||||
unsigned int dma_sglen;
|
||||
dma_cookie_t cookie;
|
||||
#endif
|
||||
};
|
||||
|
||||
#include <linux/io.h>
|
||||
|
|
|
@ -1004,8 +1004,9 @@ static void sci_rx_dma_release(struct sci_port *s, bool enable_pio)
|
|||
s->chan_rx = NULL;
|
||||
s->cookie_rx[0] = s->cookie_rx[1] = -EINVAL;
|
||||
dma_release_channel(chan);
|
||||
dma_free_coherent(port->dev, s->buf_len_rx * 2,
|
||||
sg_virt(&s->sg_rx[0]), sg_dma_address(&s->sg_rx[0]));
|
||||
if (sg_dma_address(&s->sg_rx[0]))
|
||||
dma_free_coherent(port->dev, s->buf_len_rx * 2,
|
||||
sg_virt(&s->sg_rx[0]), sg_dma_address(&s->sg_rx[0]));
|
||||
if (enable_pio)
|
||||
sci_start_rx(port);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,13 @@
|
|||
#ifndef __SH_MOBILE_SDHI_H__
|
||||
#define __SH_MOBILE_SDHI_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct sh_mobile_sdhi_info {
|
||||
int dma_slave_tx;
|
||||
int dma_slave_rx;
|
||||
unsigned long tmio_flags;
|
||||
u32 tmio_ocr_mask; /* available MMC voltages */
|
||||
void (*set_pwr)(struct platform_device *pdev, int state);
|
||||
};
|
||||
|
||||
|
|
|
@ -50,17 +50,28 @@
|
|||
tmio_iowrite16((val) >> 16, (base) + ((reg + 2) << (shift))); \
|
||||
} while (0)
|
||||
|
||||
/* tmio MMC platform flags */
|
||||
#define TMIO_MMC_WRPROTECT_DISABLE (1 << 0)
|
||||
|
||||
int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base);
|
||||
int tmio_core_mmc_resume(void __iomem *cnf, int shift, unsigned long base);
|
||||
void tmio_core_mmc_pwr(void __iomem *cnf, int shift, int state);
|
||||
void tmio_core_mmc_clk_div(void __iomem *cnf, int shift, int state);
|
||||
|
||||
struct tmio_mmc_dma {
|
||||
void *chan_priv_tx;
|
||||
void *chan_priv_rx;
|
||||
};
|
||||
|
||||
/*
|
||||
* data for the MMC controller
|
||||
*/
|
||||
struct tmio_mmc_data {
|
||||
unsigned int hclk;
|
||||
unsigned long capabilities;
|
||||
unsigned long flags;
|
||||
u32 ocr_mask; /* available voltages */
|
||||
struct tmio_mmc_dma *dma;
|
||||
void (*set_pwr)(struct platform_device *host, int state);
|
||||
void (*set_clk_div)(struct platform_device *host, int state);
|
||||
};
|
||||
|
|
|
@ -71,8 +71,7 @@ struct siu_firmware {
|
|||
#include <linux/dmaengine.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/dmaengine.h>
|
||||
#include <linux/sh_dma.h>
|
||||
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include <sound/pcm_params.h>
|
||||
#include <sound/soc-dai.h>
|
||||
|
||||
#include <asm/dmaengine.h>
|
||||
#include <asm/siu.h>
|
||||
|
||||
#include "siu.h"
|
||||
|
@ -358,13 +357,13 @@ static int siu_pcm_open(struct snd_pcm_substream *ss)
|
|||
if (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
siu_stream = &port_info->playback;
|
||||
param = &siu_stream->param;
|
||||
param->slave_id = port ? SHDMA_SLAVE_SIUB_TX :
|
||||
SHDMA_SLAVE_SIUA_TX;
|
||||
param->slave_id = port ? pdata->dma_slave_tx_b :
|
||||
pdata->dma_slave_tx_a;
|
||||
} else {
|
||||
siu_stream = &port_info->capture;
|
||||
param = &siu_stream->param;
|
||||
param->slave_id = port ? SHDMA_SLAVE_SIUB_RX :
|
||||
SHDMA_SLAVE_SIUA_RX;
|
||||
param->slave_id = port ? pdata->dma_slave_rx_b :
|
||||
pdata->dma_slave_rx_a;
|
||||
}
|
||||
|
||||
param->dma_dev = pdata->dma_dev;
|
||||
|
|
Загрузка…
Ссылка в новой задаче