summaryrefslogtreecommitdiff
path: root/target/linux/ar71xx/files/arch/mips/ath79/mach-rb941.c
blob: 5a8c7c0251505d7d05bc0a5d6704e5ddf8e00bc4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/*
 *  MikroTik RouterBOARD 941-2nD support
 *
 *  Copyright (C) 2016 Sergey Sergeev <adron@yapic.net>
 *
 *  This program is free software; you can redistribute it and/or modify it
 *  under the terms of the GNU General Public License version 2 as published
 *  by the Free Software Foundation.
 */

#include <linux/export.h>
#include <linux/pci.h>
#include <linux/ath9k_platform.h>
#include <linux/platform_device.h>
#include <linux/phy.h>
#include <linux/ar8216_platform.h>
#include <linux/rle.h>
#include <linux/routerboot.h>
#include <linux/gpio.h>

#include <linux/mtd/mtd.h>
//#include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h>

#include <asm/mach-ath79/ar71xx_regs.h>
#include <asm/mach-ath79/ath79.h>
#include <asm/mach-ath79/irq.h>

#include "common.h"
#include "dev-ap9x-pci.h"
#include "dev-eth.h"
#include "dev-spi.h"
#include "dev-gpio-buttons.h"
#include "dev-leds-gpio.h"
#include "dev-m25p80.h"
//#include "dev-usb.h"
#include "dev-wmac.h"
#include "machtypes.h"
#include "routerboot.h"

#define RB941_GPIO_LED_ACT      14
#define RB941_GPIO_BTN_RESET    16

#define RB941_KEYS_POLL_INTERVAL 20 /* msecs */
#define RB941_KEYS_DEBOUNCE_INTERVAL (3 * RB941_KEYS_POLL_INTERVAL)

#define RB_ROUTERBOOT_OFFSET    0x0000
#define RB_ROUTERBOOT_SIZE      0xe000
#define RB_HARD_CFG_OFFSET      0xe000
#define RB_HARD_CFG_SIZE        0x1000
#define RB_BIOS_OFFSET          0xf000
#define RB_BIOS_SIZE            0x1000
#define RB_ROUTERBOOT2_OFFSET   0x10000
#define RB_ROUTERBOOT2_SIZE     0xf000
#define RB_SOFT_CFG_OFFSET      0x1f000
#define RB_SOFT_CFG_SIZE        0x1000
#define RB_ROOTFS_OFFSET        0x20000
#define RB_ROOTFS_SIZE          0x9e0000
#define RB_KERNEL_OFFSET        0xa00000
#define RB_KERNEL_SIZE          MTDPART_SIZ_FULL

void __init rb941_wlan_init(void)
{
    char *art_buf;
    u8 wlan_mac[ETH_ALEN];

    art_buf = rb_get_wlan_data();
    if (art_buf == NULL)
            return;

    ath79_init_mac(wlan_mac, ath79_mac_base, 11);
    ath79_register_wmac(art_buf + 0x1000, wlan_mac);

    kfree(art_buf);
}

static struct mtd_partition rb941_spi_partitions[] = {
    {
            .name = "routerboot",
            .offset = RB_ROUTERBOOT_OFFSET,
            .mask_flags = MTD_WRITEABLE,
            .size = RB_ROUTERBOOT_SIZE,
    }, {
            .name = "hard_config",
            .offset = RB_HARD_CFG_OFFSET,
            .size = RB_HARD_CFG_SIZE,
            .mask_flags = MTD_WRITEABLE,
    }, {
            .name = "bios",
            .offset = RB_BIOS_OFFSET,
            .size = RB_BIOS_SIZE,
            .mask_flags = MTD_WRITEABLE,
    }, {
            .name = "routerboot2",
            .offset = RB_ROUTERBOOT2_OFFSET,
            .size = RB_ROUTERBOOT2_SIZE,
            .mask_flags = MTD_WRITEABLE,
    }, {
            .name = "soft_config",
            .offset = RB_SOFT_CFG_OFFSET,
            .size = RB_SOFT_CFG_SIZE,
            .mask_flags = MTD_WRITEABLE,
    }, {
            .name = "rootfs",
            .offset = RB_ROOTFS_OFFSET,
            .size = RB_ROOTFS_SIZE,
    }, {
            .name = "kernel",
            .offset = RB_KERNEL_OFFSET,
            .size = RB_KERNEL_SIZE,
    }
};

static struct flash_platform_data rb941_spi_flash_data = {
    .parts          = rb941_spi_partitions,
    .nr_parts       = ARRAY_SIZE(rb941_spi_partitions),
};

static struct gpio_led rb941_leds[] __initdata = {
    {
        .name = "rb:green:act",
        .gpio = RB941_GPIO_LED_ACT,
        .active_low = 1,
    },
};

static struct gpio_keys_button rb941_gpio_keys[] __initdata = {
    {
        .desc = "Reset button",
        .type = EV_KEY,
        .code = KEY_RESTART,
        .debounce_interval = RB941_KEYS_DEBOUNCE_INTERVAL,
        .gpio = RB941_GPIO_BTN_RESET,
        .active_low = 1,
    },
};

static void __init rb941_setup(void)
{
    const struct rb_info *info;
    //try to get rb_info data
    info = rb_init_info((void *)(KSEG1ADDR(AR71XX_SPI_BASE)), 0x20000);
    if (!info){
        pr_err("%s: Can't get rb_info data from flash!\n", __func__);
        //return -EINVAL; //Not critical ... continue!
    }
    ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_SW_ONLY_MODE);
    ath79_register_m25p80(&rb941_spi_flash_data);
    ath79_register_mdio(0, 0x0);

    /* WAN. We have no WAN. Only LAN. */
    /*ath79_switch_data.phy4_mii_en = 1;
    ath79_switch_data.phy_poll_mask = BIT(4);
    ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
    ath79_eth0_data.phy_mask = BIT(4);
    ath79_init_mac(ath79_eth0_data.mac_addr, ath79_mac_base, 0);
    ath79_register_eth(0); */

    /* LAN */
    ath79_init_mac(ath79_eth1_data.mac_addr, ath79_mac_base, 0);
    ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
    ath79_register_eth(1);

    //ath79_register_usb();

    rb941_wlan_init();

    ath79_register_leds_gpio(-1, ARRAY_SIZE(rb941_leds), rb941_leds);
    ath79_register_gpio_keys_polled(-1, RB941_KEYS_POLL_INTERVAL,
                                    ARRAY_SIZE(rb941_gpio_keys),
                                    rb941_gpio_keys);
}

MIPS_MACHINE(ATH79_MACH_RB_941, "H951L", "MikroTik RouterBOARD 941-2nD", rb941_setup);