MIPS: TXx9: Add ACLC support
Add platform support for ACLC of TXx9 SoCs. Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp> Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
committed by
Ralf Baechle
parent
e8635b484f
commit
742cd5867b
@@ -91,4 +91,9 @@ void txx9_7segled_init(unsigned int num,
|
|||||||
void (*putc)(unsigned int pos, unsigned char val));
|
void (*putc)(unsigned int pos, unsigned char val));
|
||||||
int txx9_7segled_putc(unsigned int pos, char c);
|
int txx9_7segled_putc(unsigned int pos, char c);
|
||||||
|
|
||||||
|
void __init txx9_aclc_init(unsigned long baseaddr, int irq,
|
||||||
|
unsigned int dmac_id,
|
||||||
|
unsigned int dma_chan_out,
|
||||||
|
unsigned int dma_chan_in);
|
||||||
|
|
||||||
#endif /* __ASM_TXX9_GENERIC_H */
|
#endif /* __ASM_TXX9_GENERIC_H */
|
||||||
|
@@ -50,6 +50,7 @@
|
|||||||
#define TX4927_NR_SIO 2
|
#define TX4927_NR_SIO 2
|
||||||
#define TX4927_SIO_REG(ch) (TX4927_REG_BASE + 0xf300 + (ch) * 0x100)
|
#define TX4927_SIO_REG(ch) (TX4927_REG_BASE + 0xf300 + (ch) * 0x100)
|
||||||
#define TX4927_PIO_REG (TX4927_REG_BASE + 0xf500)
|
#define TX4927_PIO_REG (TX4927_REG_BASE + 0xf500)
|
||||||
|
#define TX4927_ACLC_REG (TX4927_REG_BASE + 0xf700)
|
||||||
|
|
||||||
#define TX4927_IR_ECCERR 0
|
#define TX4927_IR_ECCERR 0
|
||||||
#define TX4927_IR_WTOERR 1
|
#define TX4927_IR_WTOERR 1
|
||||||
@@ -267,5 +268,6 @@ 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);
|
void tx4927_dmac_init(int memcpy_chan);
|
||||||
|
void tx4927_aclc_init(unsigned int dma_chan_out, unsigned int dma_chan_in);
|
||||||
|
|
||||||
#endif /* __ASM_TXX9_TX4927_H */
|
#endif /* __ASM_TXX9_TX4927_H */
|
||||||
|
@@ -306,5 +306,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);
|
void tx4938_dmac_init(int memcpy_chan0, int memcpy_chan1);
|
||||||
|
void tx4938_aclc_init(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -545,5 +545,6 @@ 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);
|
void tx4939_dmac_init(int memcpy_chan0, int memcpy_chan1);
|
||||||
|
void tx4939_aclc_init(void);
|
||||||
|
|
||||||
#endif /* __ASM_TXX9_TX4939_H */
|
#endif /* __ASM_TXX9_TX4939_H */
|
||||||
|
@@ -69,6 +69,7 @@ config SOC_TX4927
|
|||||||
select IRQ_TXX9
|
select IRQ_TXX9
|
||||||
select PCI_TX4927
|
select PCI_TX4927
|
||||||
select GPIO_TXX9
|
select GPIO_TXX9
|
||||||
|
select HAS_TXX9_ACLC
|
||||||
|
|
||||||
config SOC_TX4938
|
config SOC_TX4938
|
||||||
bool
|
bool
|
||||||
@@ -78,6 +79,7 @@ config SOC_TX4938
|
|||||||
select IRQ_TXX9
|
select IRQ_TXX9
|
||||||
select PCI_TX4927
|
select PCI_TX4927
|
||||||
select GPIO_TXX9
|
select GPIO_TXX9
|
||||||
|
select HAS_TXX9_ACLC
|
||||||
|
|
||||||
config SOC_TX4939
|
config SOC_TX4939
|
||||||
bool
|
bool
|
||||||
@@ -85,6 +87,7 @@ config SOC_TX4939
|
|||||||
select HAS_TXX9_SERIAL
|
select HAS_TXX9_SERIAL
|
||||||
select HW_HAS_PCI
|
select HW_HAS_PCI
|
||||||
select PCI_TX4927
|
select PCI_TX4927
|
||||||
|
select HAS_TXX9_ACLC
|
||||||
|
|
||||||
config TXX9_7SEGLED
|
config TXX9_7SEGLED
|
||||||
bool
|
bool
|
||||||
|
@@ -876,3 +876,39 @@ void __init txx9_dmac_init(int id, unsigned long baseaddr, int irq,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init txx9_aclc_init(unsigned long baseaddr, int irq,
|
||||||
|
unsigned int dmac_id,
|
||||||
|
unsigned int dma_chan_out,
|
||||||
|
unsigned int dma_chan_in)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_SND_SOC_TXX9ACLC) || \
|
||||||
|
defined(CONFIG_SND_SOC_TXX9ACLC_MODULE)
|
||||||
|
unsigned int dma_base = dmac_id * TXX9_DMA_MAX_NR_CHANNELS;
|
||||||
|
struct resource res[] = {
|
||||||
|
{
|
||||||
|
.start = baseaddr,
|
||||||
|
.end = baseaddr + 0x100 - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = irq,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
}, {
|
||||||
|
.name = "txx9dmac-chan",
|
||||||
|
.start = dma_base + dma_chan_out,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
}, {
|
||||||
|
.name = "txx9dmac-chan",
|
||||||
|
.start = dma_base + dma_chan_in,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
struct platform_device *pdev =
|
||||||
|
platform_device_alloc("txx9aclc-ac97", -1);
|
||||||
|
|
||||||
|
if (!pdev ||
|
||||||
|
platform_device_add_resources(pdev, res, ARRAY_SIZE(res)) ||
|
||||||
|
platform_device_add(pdev))
|
||||||
|
platform_device_put(pdev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
@@ -265,6 +265,49 @@ void __init tx4927_dmac_init(int memcpy_chan)
|
|||||||
TXX9_IRQ_BASE + TX4927_IR_DMA(0), &plat_data);
|
TXX9_IRQ_BASE + TX4927_IR_DMA(0), &plat_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init tx4927_aclc_init(unsigned int dma_chan_out,
|
||||||
|
unsigned int dma_chan_in)
|
||||||
|
{
|
||||||
|
u64 pcfg = __raw_readq(&tx4927_ccfgptr->pcfg);
|
||||||
|
__u64 dmasel_mask = 0, dmasel = 0;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (!(pcfg & TX4927_PCFG_SEL2))
|
||||||
|
return;
|
||||||
|
/* setup DMASEL (playback:ACLC ch0, capture:ACLC ch1) */
|
||||||
|
switch (dma_chan_out) {
|
||||||
|
case 0:
|
||||||
|
dmasel_mask |= TX4927_PCFG_DMASEL0_MASK;
|
||||||
|
dmasel |= TX4927_PCFG_DMASEL0_ACL0;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
dmasel_mask |= TX4927_PCFG_DMASEL2_MASK;
|
||||||
|
dmasel |= TX4927_PCFG_DMASEL2_ACL0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (dma_chan_in) {
|
||||||
|
case 1:
|
||||||
|
dmasel_mask |= TX4927_PCFG_DMASEL1_MASK;
|
||||||
|
dmasel |= TX4927_PCFG_DMASEL1_ACL1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
dmasel_mask |= TX4927_PCFG_DMASEL3_MASK;
|
||||||
|
dmasel |= TX4927_PCFG_DMASEL3_ACL1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
local_irq_save(flags);
|
||||||
|
txx9_clear64(&tx4927_ccfgptr->pcfg, dmasel_mask);
|
||||||
|
txx9_set64(&tx4927_ccfgptr->pcfg, dmasel);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
txx9_aclc_init(TX4927_ACLC_REG & 0xfffffffffULL,
|
||||||
|
TXX9_IRQ_BASE + TX4927_IR_ACLC,
|
||||||
|
0, dma_chan_out, dma_chan_in);
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
@@ -414,6 +414,17 @@ void __init tx4938_dmac_init(int memcpy_chan0, int memcpy_chan1)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init tx4938_aclc_init(void)
|
||||||
|
{
|
||||||
|
u64 pcfg = __raw_readq(&tx4938_ccfgptr->pcfg);
|
||||||
|
|
||||||
|
if ((pcfg & TX4938_PCFG_SEL2) &&
|
||||||
|
!(pcfg & TX4938_PCFG_ETH0_SEL))
|
||||||
|
txx9_aclc_init(TX4938_ACLC_REG & 0xfffffffffULL,
|
||||||
|
TXX9_IRQ_BASE + TX4938_IR_ACLC,
|
||||||
|
1, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
@@ -485,6 +485,15 @@ void __init tx4939_dmac_init(int memcpy_chan0, int memcpy_chan1)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init tx4939_aclc_init(void)
|
||||||
|
{
|
||||||
|
u64 pcfg = __raw_readq(&tx4939_ccfgptr->pcfg);
|
||||||
|
|
||||||
|
if ((pcfg & TX4939_PCFG_I2SMODE_MASK) == TX4939_PCFG_I2SMODE_ACLC)
|
||||||
|
txx9_aclc_init(TX4939_ACLC_REG & 0xfffffffffULL,
|
||||||
|
TXX9_IRQ_BASE + TX4939_IR_ACLC, 1, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
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,10 +337,14 @@ 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)
|
if (TX4927_REV_PCODE() == 0x4927) {
|
||||||
tx4927_dmac_init(2);
|
tx4927_dmac_init(2);
|
||||||
else
|
tx4927_aclc_init(0, 1);
|
||||||
|
} else {
|
||||||
tx4938_dmac_init(0, 2);
|
tx4938_dmac_init(0, 2);
|
||||||
|
tx4938_aclc_init();
|
||||||
|
}
|
||||||
|
platform_device_register_simple("txx9aclc-generic", -1, NULL, 0);
|
||||||
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();
|
||||||
}
|
}
|
||||||
|
@@ -356,6 +356,8 @@ static void __init rbtx4938_device_init(void)
|
|||||||
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);
|
tx4938_dmac_init(0, 2);
|
||||||
|
tx4938_aclc_init();
|
||||||
|
platform_device_register_simple("txx9aclc-generic", -1, NULL, 0);
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -499,6 +499,8 @@ static void __init rbtx4939_device_init(void)
|
|||||||
tx4939_ata_init();
|
tx4939_ata_init();
|
||||||
tx4939_rtc_init();
|
tx4939_rtc_init();
|
||||||
tx4939_dmac_init(0, 2);
|
tx4939_dmac_init(0, 2);
|
||||||
|
tx4939_aclc_init();
|
||||||
|
platform_device_register_simple("txx9aclc-generic", -1, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init rbtx4939_setup(void)
|
static void __init rbtx4939_setup(void)
|
||||||
|
Reference in New Issue
Block a user