* by the Free Software Foundation.
*/
+#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/physmap.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi_gpio.h>
+#include <linux/spi/vsc7385.h>
#include <asm/mips_machine.h>
#include <asm/mach-ar71xx/ar71xx.h>
#define AP83_GPIO_BTN_JUMPSTART 12
#define AP83_GPIO_BTN_RESET 21
-#define AP83_GPIO_VSC7385_CS 1
-#define AP83_GPIO_VSC7385_MISO 3
-#define AP83_GPIO_VSC7385_MOSI 16
-#define AP83_GPIO_VSC7385_SCK 17
+#define AP83_050_GPIO_VSC7385_CS 1
+#define AP83_050_GPIO_VSC7385_MISO 3
+#define AP83_050_GPIO_VSC7385_MOSI 16
+#define AP83_050_GPIO_VSC7385_SCK 17
#ifdef CONFIG_MTD_PARTITIONS
static struct mtd_partition ap83_flash_partitions[] = {
}
};
-static struct spi_gpio_platform_data ap83_spi_data = {
- .miso = AP83_GPIO_VSC7385_MISO,
- .mosi = AP83_GPIO_VSC7385_MOSI,
- .sck = AP83_GPIO_VSC7385_SCK,
+static struct resource ap83_040_spi_resources[] = {
+ [0] = {
+ .start = AR71XX_SPI_BASE,
+ .end = AR71XX_SPI_BASE + AR71XX_SPI_SIZE - 1,
+ .flags = IORESOURCE_MEM,
+ },
+};
+
+static struct platform_device ap83_040_spi_device = {
+ .name = "ap83-spi",
+ .id = 0,
+ .resource = ap83_040_spi_resources,
+ .num_resources = ARRAY_SIZE(ap83_040_spi_resources),
+};
+
+static struct spi_gpio_platform_data ap83_050_spi_data = {
+ .miso = AP83_050_GPIO_VSC7385_MISO,
+ .mosi = AP83_050_GPIO_VSC7385_MOSI,
+ .sck = AP83_050_GPIO_VSC7385_SCK,
.num_chipselect = 1,
};
-static struct platform_device ap83_spi_device = {
+static struct platform_device ap83_050_spi_device = {
.name = "spi_gpio",
.id = 0,
.dev = {
- .platform_data = &ap83_spi_data,
+ .platform_data = &ap83_050_spi_data,
}
};
-static void __init ap83_setup(void)
+static void ap83_vsc7385_reset(void)
+{
+ ar71xx_device_stop(RESET_MODULE_GE1_PHY);
+ udelay(10);
+ ar71xx_device_start(RESET_MODULE_GE1_PHY);
+ mdelay(50);
+}
+
+static struct vsc7385_platform_data ap83_vsc7385_data = {
+ .reset = ap83_vsc7385_reset,
+};
+
+static struct spi_board_info ap83_spi_info[] = {
+ {
+ .bus_num = 0,
+ .chip_select = 0,
+ .max_speed_hz = 25000000,
+ .modalias = "spi-vsc7385",
+ .platform_data = &ap83_vsc7385_data,
+ .controller_data = (void *) AP83_050_GPIO_VSC7385_CS,
+ }
+};
+
+static void __init ap83_generic_setup(void)
{
+ u8 *mac = (u8 *) KSEG1ADDR(0x1fff1000);
+
+ ar71xx_set_mac_base(mac);
+
ar71xx_add_device_mdio(0xfffffffe);
ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
ar91xx_add_device_wmac();
- platform_device_register(&ap83_spi_device);
platform_device_register(&ap83_flash_device);
+
+ spi_register_board_info(ap83_spi_info, ARRAY_SIZE(ap83_spi_info));
+}
+
+static void __init ap83_040_setup(void)
+{
+ ar71xx_flash_lock_enable();
+ ap83_generic_setup();
+ platform_device_register(&ap83_040_spi_device);
+}
+
+static void __init ap83_050_setup(void)
+{
+ ap83_generic_setup();
+ platform_device_register(&ap83_050_spi_device);
+}
+
+static void __init ap83_setup(void)
+{
+ u8 *board_id = (u8 *) KSEG1ADDR(0x1fff1244);
+ unsigned int board_version;
+
+ board_version = (unsigned int)(board_id[0] - '0');
+ board_version += ((unsigned int)(board_id[1] - '0')) * 10;
+
+ switch (board_version) {
+ case 40:
+ ap83_040_setup();
+ break;
+ case 50:
+ ap83_050_setup();
+ break;
+ default:
+ printk(KERN_WARNING "AP83-%03u board is not yet supported\n",
+ board_version);
+ }
}
MIPS_MACHINE(AR71XX_MACH_AP83, "Atheros AP83", ap83_setup);