#include #include #include #include #include #include struct smsc911x_platform_config sbnet_cfg = { .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH, .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, .shift = 1, .flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY, }; struct resource sbnet_res[] = { { .name = "smsc911x-memory", .start = (0x5000 << 16), .end = (0x5000 << 16) + 0x3ff, .flags = IORESOURCE_MEM, },{ .start = GPIO_TO_IRQ(140), .end = GPIO_TO_IRQ(140), .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, }, }; struct platform_device sbnet_dev = { .name = "smsc911x", .num_resources = ARRAY_SIZE(sbnet_res), .resource = sbnet_res, .dev = { .platform_data = &sbnet_cfg, }, }; int sbnet_init(void) { volatile u32 *ptr = ioremap(0x80000000, 0x10000); if (!machine_is_snowball()) { printk("no netdev: no snowball\n"); return 0; } printk("init netdev: is snowball\n"); /* * Horribly, fix all the configuration by hand */ /* Turn on the FSMC device */ *(ptr + 0xf000 / 4) = 1; *(ptr + 0xf008 / 4) = 1; /* Configure the FSMC device */ *(ptr + 0x0000 / 4) = 0x0000305b; *(ptr + 0x0004 / 4) = 0x01010110; /* Fix some gpio bits */ *(ptr + 0xe120 / 4) &= ~0x7f8; *(ptr + 0xe124 / 4) |= 0x7f8; iounmap(ptr); return platform_device_register(&sbnet_dev); } void sbnet_exit(void) { platform_device_unregister(&sbnet_dev); } module_init(sbnet_init); module_exit(sbnet_exit); MODULE_LICENSE("GPL");