Commit f48c8c95 authored by Atsushi Nemoto's avatar Atsushi Nemoto Committed by Ralf Baechle

MIPS: TXx9: Add DMAC support

Add platform support for DMAC of TXx9 SoCs.
Signed-off-by: default avatarAtsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent ea76f0b3
...@@ -45,4 +45,7 @@ struct txx9dmac_slave { ...@@ -45,4 +45,7 @@ struct txx9dmac_slave {
unsigned int reg_width; unsigned int reg_width;
}; };
void txx9_dmac_init(int id, unsigned long baseaddr, int irq,
const struct txx9dmac_platform_data *pdata);
#endif /* __ASM_TXX9_DMAC_H */ #endif /* __ASM_TXX9_DMAC_H */
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#define TX4927_SDRAMC_REG (TX4927_REG_BASE + 0x8000) #define TX4927_SDRAMC_REG (TX4927_REG_BASE + 0x8000)
#define TX4927_EBUSC_REG (TX4927_REG_BASE + 0x9000) #define TX4927_EBUSC_REG (TX4927_REG_BASE + 0x9000)
#define TX4927_DMA_REG (TX4927_REG_BASE + 0xb000)
#define TX4927_PCIC_REG (TX4927_REG_BASE + 0xd000) #define TX4927_PCIC_REG (TX4927_REG_BASE + 0xd000)
#define TX4927_CCFG_REG (TX4927_REG_BASE + 0xe000) #define TX4927_CCFG_REG (TX4927_REG_BASE + 0xe000)
#define TX4927_IRC_REG (TX4927_REG_BASE + 0xf600) #define TX4927_IRC_REG (TX4927_REG_BASE + 0xf600)
...@@ -265,5 +266,6 @@ int tx4927_pciclk66_setup(void); ...@@ -265,5 +266,6 @@ int tx4927_pciclk66_setup(void);
void tx4927_setup_pcierr_irq(void); void tx4927_setup_pcierr_irq(void);
void tx4927_irq_init(void); void tx4927_irq_init(void);
void tx4927_mtd_init(int ch); void tx4927_mtd_init(int ch);
void tx4927_dmac_init(int memcpy_chan);
#endif /* __ASM_TXX9_TX4927_H */ #endif /* __ASM_TXX9_TX4927_H */
...@@ -305,5 +305,6 @@ struct tx4938ide_platform_info { ...@@ -305,5 +305,6 @@ struct tx4938ide_platform_info {
}; };
void tx4938_ata_init(unsigned int irq, unsigned int shift, int tune); void tx4938_ata_init(unsigned int irq, unsigned int shift, int tune);
void tx4938_dmac_init(int memcpy_chan0, int memcpy_chan1);
#endif #endif
...@@ -544,5 +544,6 @@ void tx4939_ata_init(void); ...@@ -544,5 +544,6 @@ void tx4939_ata_init(void);
void tx4939_rtc_init(void); void tx4939_rtc_init(void);
void tx4939_ndfmc_init(unsigned int hold, unsigned int spw, void tx4939_ndfmc_init(unsigned int hold, unsigned int spw,
unsigned char ch_mask, unsigned char wide_mask); unsigned char ch_mask, unsigned char wide_mask);
void tx4939_dmac_init(int memcpy_chan0, int memcpy_chan1);
#endif /* __ASM_TXX9_TX4939_H */ #endif /* __ASM_TXX9_TX4939_H */
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <asm/txx9/pci.h> #include <asm/txx9/pci.h>
#include <asm/txx9tmr.h> #include <asm/txx9tmr.h>
#include <asm/txx9/ndfmc.h> #include <asm/txx9/ndfmc.h>
#include <asm/txx9/dmac.h>
#ifdef CONFIG_CPU_TX49XX #ifdef CONFIG_CPU_TX49XX
#include <asm/txx9/tx4938.h> #include <asm/txx9/tx4938.h>
#endif #endif
...@@ -821,3 +822,57 @@ void __init txx9_iocled_init(unsigned long baseaddr, ...@@ -821,3 +822,57 @@ void __init txx9_iocled_init(unsigned long baseaddr,
{ {
} }
#endif /* CONFIG_LEDS_GPIO */ #endif /* CONFIG_LEDS_GPIO */
void __init txx9_dmac_init(int id, unsigned long baseaddr, int irq,
const struct txx9dmac_platform_data *pdata)
{
#if defined(CONFIG_TXX9_DMAC) || defined(CONFIG_TXX9_DMAC_MODULE)
struct resource res[] = {
{
.start = baseaddr,
.end = baseaddr + 0x800 - 1,
.flags = IORESOURCE_MEM,
#ifndef CONFIG_MACH_TX49XX
}, {
.start = irq,
.flags = IORESOURCE_IRQ,
#endif
}
};
#ifdef CONFIG_MACH_TX49XX
struct resource chan_res[] = {
{
.flags = IORESOURCE_IRQ,
}
};
#endif
struct platform_device *pdev = platform_device_alloc("txx9dmac", id);
struct txx9dmac_chan_platform_data cpdata;
int i;
if (!pdev ||
platform_device_add_resources(pdev, res, ARRAY_SIZE(res)) ||
platform_device_add_data(pdev, pdata, sizeof(*pdata)) ||
platform_device_add(pdev)) {
platform_device_put(pdev);
return;
}
memset(&cpdata, 0, sizeof(cpdata));
cpdata.dmac_dev = pdev;
for (i = 0; i < TXX9_DMA_MAX_NR_CHANNELS; i++) {
#ifdef CONFIG_MACH_TX49XX
chan_res[0].start = irq + i;
#endif
pdev = platform_device_alloc("txx9dmac-chan",
id * TXX9_DMA_MAX_NR_CHANNELS + i);
if (!pdev ||
#ifdef CONFIG_MACH_TX49XX
platform_device_add_resources(pdev, chan_res,
ARRAY_SIZE(chan_res)) ||
#endif
platform_device_add_data(pdev, &cpdata, sizeof(cpdata)) ||
platform_device_add(pdev))
platform_device_put(pdev);
}
#endif
}
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <asm/txx9tmr.h> #include <asm/txx9tmr.h>
#include <asm/txx9pio.h> #include <asm/txx9pio.h>
#include <asm/txx9/generic.h> #include <asm/txx9/generic.h>
#include <asm/txx9/dmac.h>
#include <asm/txx9/tx4927.h> #include <asm/txx9/tx4927.h>
static void __init tx4927_wdr_init(void) static void __init tx4927_wdr_init(void)
...@@ -253,6 +254,17 @@ void __init tx4927_mtd_init(int ch) ...@@ -253,6 +254,17 @@ void __init tx4927_mtd_init(int ch)
txx9_physmap_flash_init(ch, start, size, &pdata); txx9_physmap_flash_init(ch, start, size, &pdata);
} }
void __init tx4927_dmac_init(int memcpy_chan)
{
struct txx9dmac_platform_data plat_data = {
.memcpy_chan = memcpy_chan,
.have_64bit_regs = true,
};
txx9_dmac_init(0, TX4927_DMA_REG & 0xfffffffffULL,
TXX9_IRQ_BASE + TX4927_IR_DMA(0), &plat_data);
}
static void __init tx4927_stop_unused_modules(void) static void __init tx4927_stop_unused_modules(void)
{ {
__u64 pcfg, rst = 0, ckd = 0; __u64 pcfg, rst = 0, ckd = 0;
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <asm/txx9pio.h> #include <asm/txx9pio.h>
#include <asm/txx9/generic.h> #include <asm/txx9/generic.h>
#include <asm/txx9/ndfmc.h> #include <asm/txx9/ndfmc.h>
#include <asm/txx9/dmac.h>
#include <asm/txx9/tx4938.h> #include <asm/txx9/tx4938.h>
static void __init tx4938_wdr_init(void) static void __init tx4938_wdr_init(void)
...@@ -239,11 +240,6 @@ void __init tx4938_setup(void) ...@@ -239,11 +240,6 @@ void __init tx4938_setup(void)
for (i = 0; i < TX4938_NR_TMR; i++) for (i = 0; i < TX4938_NR_TMR; i++)
txx9_tmr_init(TX4938_TMR_REG(i) & 0xfffffffffULL); txx9_tmr_init(TX4938_TMR_REG(i) & 0xfffffffffULL);
/* DMA */
for (i = 0; i < 2; i++)
____raw_writeq(TX4938_DMA_MCR_MSTEN,
(void __iomem *)(TX4938_DMA_REG(i) + 0x50));
/* PIO */ /* PIO */
txx9_gpio_init(TX4938_PIO_REG & 0xfffffffffULL, 0, TX4938_NUM_PIO); txx9_gpio_init(TX4938_PIO_REG & 0xfffffffffULL, 0, TX4938_NUM_PIO);
__raw_writel(0, &tx4938_pioptr->maskcpu); __raw_writel(0, &tx4938_pioptr->maskcpu);
...@@ -403,6 +399,21 @@ void __init tx4938_ndfmc_init(unsigned int hold, unsigned int spw) ...@@ -403,6 +399,21 @@ void __init tx4938_ndfmc_init(unsigned int hold, unsigned int spw)
txx9_ndfmc_init(baseaddr, &plat_data); txx9_ndfmc_init(baseaddr, &plat_data);
} }
void __init tx4938_dmac_init(int memcpy_chan0, int memcpy_chan1)
{
struct txx9dmac_platform_data plat_data = {
.have_64bit_regs = true,
};
int i;
for (i = 0; i < 2; i++) {
plat_data.memcpy_chan = i ? memcpy_chan1 : memcpy_chan0;
txx9_dmac_init(i, TX4938_DMA_REG(i) & 0xfffffffffULL,
TXX9_IRQ_BASE + TX4938_IR_DMA(i, 0),
&plat_data);
}
}
static void __init tx4938_stop_unused_modules(void) static void __init tx4938_stop_unused_modules(void)
{ {
__u64 pcfg, rst = 0, ckd = 0; __u64 pcfg, rst = 0, ckd = 0;
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <asm/txx9tmr.h> #include <asm/txx9tmr.h>
#include <asm/txx9/generic.h> #include <asm/txx9/generic.h>
#include <asm/txx9/ndfmc.h> #include <asm/txx9/ndfmc.h>
#include <asm/txx9/dmac.h>
#include <asm/txx9/tx4939.h> #include <asm/txx9/tx4939.h>
static void __init tx4939_wdr_init(void) static void __init tx4939_wdr_init(void)
...@@ -259,11 +260,6 @@ void __init tx4939_setup(void) ...@@ -259,11 +260,6 @@ void __init tx4939_setup(void)
for (i = 0; i < TX4939_NR_TMR; i++) for (i = 0; i < TX4939_NR_TMR; i++)
txx9_tmr_init(TX4939_TMR_REG(i) & 0xfffffffffULL); txx9_tmr_init(TX4939_TMR_REG(i) & 0xfffffffffULL);
/* DMA */
for (i = 0; i < 2; i++)
____raw_writeq(TX4938_DMA_MCR_MSTEN,
(void __iomem *)(TX4939_DMA_REG(i) + 0x50));
/* set PCIC1 reset (required to prevent hangup on BIST) */ /* set PCIC1 reset (required to prevent hangup on BIST) */
txx9_set64(&tx4939_ccfgptr->clkctr, TX4939_CLKCTR_PCI1RST); txx9_set64(&tx4939_ccfgptr->clkctr, TX4939_CLKCTR_PCI1RST);
pcfg = ____raw_readq(&tx4939_ccfgptr->pcfg); pcfg = ____raw_readq(&tx4939_ccfgptr->pcfg);
...@@ -474,6 +470,21 @@ void __init tx4939_ndfmc_init(unsigned int hold, unsigned int spw, ...@@ -474,6 +470,21 @@ void __init tx4939_ndfmc_init(unsigned int hold, unsigned int spw,
txx9_ndfmc_init(TX4939_NDFMC_REG & 0xfffffffffULL, &plat_data); txx9_ndfmc_init(TX4939_NDFMC_REG & 0xfffffffffULL, &plat_data);
} }
void __init tx4939_dmac_init(int memcpy_chan0, int memcpy_chan1)
{
struct txx9dmac_platform_data plat_data = {
.have_64bit_regs = true,
};
int i;
for (i = 0; i < 2; i++) {
plat_data.memcpy_chan = i ? memcpy_chan1 : memcpy_chan0;
txx9_dmac_init(i, TX4939_DMA_REG(i) & 0xfffffffffULL,
TXX9_IRQ_BASE + TX4939_IR_DMA(i, 0),
&plat_data);
}
}
static void __init tx4939_stop_unused_modules(void) static void __init tx4939_stop_unused_modules(void)
{ {
__u64 pcfg, rst = 0, ckd = 0; __u64 pcfg, rst = 0, ckd = 0;
......
...@@ -337,6 +337,10 @@ static void __init rbtx4927_device_init(void) ...@@ -337,6 +337,10 @@ static void __init rbtx4927_device_init(void)
rbtx4927_ne_init(); rbtx4927_ne_init();
tx4927_wdt_init(); tx4927_wdt_init();
rbtx4927_mtd_init(); rbtx4927_mtd_init();
if (TX4927_REV_PCODE() == 0x4927)
tx4927_dmac_init(2);
else
tx4938_dmac_init(0, 2);
txx9_iocled_init(RBTX4927_LED_ADDR - IO_BASE, -1, 3, 1, "green", NULL); txx9_iocled_init(RBTX4927_LED_ADDR - IO_BASE, -1, 3, 1, "green", NULL);
rbtx4927_gpioled_init(); rbtx4927_gpioled_init();
} }
......
...@@ -355,6 +355,7 @@ static void __init rbtx4938_device_init(void) ...@@ -355,6 +355,7 @@ static void __init rbtx4938_device_init(void)
/* TC58DVM82A1FT: tDH=10ns, tWP=tRP=tREADID=35ns */ /* TC58DVM82A1FT: tDH=10ns, tWP=tRP=tREADID=35ns */
tx4938_ndfmc_init(10, 35); tx4938_ndfmc_init(10, 35);
tx4938_ata_init(RBTX4938_IRQ_IOC_ATA, 0, 1); tx4938_ata_init(RBTX4938_IRQ_IOC_ATA, 0, 1);
tx4938_dmac_init(0, 2);
txx9_iocled_init(RBTX4938_LED_ADDR - IO_BASE, -1, 8, 1, "green", NULL); txx9_iocled_init(RBTX4938_LED_ADDR - IO_BASE, -1, 8, 1, "green", NULL);
} }
......
...@@ -498,6 +498,7 @@ static void __init rbtx4939_device_init(void) ...@@ -498,6 +498,7 @@ static void __init rbtx4939_device_init(void)
tx4939_wdt_init(); tx4939_wdt_init();
tx4939_ata_init(); tx4939_ata_init();
tx4939_rtc_init(); tx4939_rtc_init();
tx4939_dmac_init(0, 2);
} }
static void __init rbtx4939_setup(void) static void __init rbtx4939_setup(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment