|
@@ -16,6 +16,7 @@
|
|
|
#include <linux/param.h>
|
|
|
#include <linux/ptrace.h>
|
|
|
#include <linux/mtd/physmap.h>
|
|
|
+#include <linux/platform_device.h>
|
|
|
#include <asm/reboot.h>
|
|
|
#include <asm/traps.h>
|
|
|
#include <asm/txx9irq.h>
|
|
@@ -335,6 +336,52 @@ void __init tx4938_mtd_init(int ch)
|
|
|
txx9_physmap_flash_init(ch, start, size, &pdata);
|
|
|
}
|
|
|
|
|
|
+void __init tx4938_ata_init(unsigned int irq, unsigned int shift, int tune)
|
|
|
+{
|
|
|
+ struct platform_device *pdev;
|
|
|
+ struct resource res[] = {
|
|
|
+ {
|
|
|
+ /* .start and .end are filled in later */
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ }, {
|
|
|
+ .start = irq,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+ };
|
|
|
+ struct tx4938ide_platform_info pdata = {
|
|
|
+ .ioport_shift = shift,
|
|
|
+ /*
|
|
|
+ * The IDE driver should not change bus timings if other ISA
|
|
|
+ * devices existed.
|
|
|
+ */
|
|
|
+ .gbus_clock = tune ? txx9_gbus_clock : 0,
|
|
|
+ };
|
|
|
+ u64 ebccr;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if ((__raw_readq(&tx4938_ccfgptr->pcfg) &
|
|
|
+ (TX4938_PCFG_ATA_SEL | TX4938_PCFG_NDF_SEL))
|
|
|
+ != TX4938_PCFG_ATA_SEL)
|
|
|
+ return;
|
|
|
+ for (i = 0; i < 8; i++) {
|
|
|
+ /* check EBCCRn.ISA, EBCCRn.BSZ, EBCCRn.ME */
|
|
|
+ ebccr = __raw_readq(&tx4938_ebuscptr->cr[i]);
|
|
|
+ if ((ebccr & 0x00f00008) == 0x00e00008)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (i == 8)
|
|
|
+ return;
|
|
|
+ pdata.ebus_ch = i;
|
|
|
+ res[0].start = ((ebccr >> 48) << 20) + 0x10000;
|
|
|
+ res[0].end = res[0].start + 0x20000 - 1;
|
|
|
+ pdev = platform_device_alloc("tx4938ide", -1);
|
|
|
+ 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);
|
|
|
+}
|
|
|
+
|
|
|
static void __init tx4938_stop_unused_modules(void)
|
|
|
{
|
|
|
__u64 pcfg, rst = 0, ckd = 0;
|