mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2025-04-21 12:27:27 +03:00
[lantiq] move files-3.3 -> files
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@31912 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Lantiq GPIO button support
|
||||
*
|
||||
* Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _LANTIQ_DEV_GPIO_BUTTONS_H
|
||||
#define _LANTIQ_DEV_GPIO_BUTTONS_H
|
||||
|
||||
#include <linux/input.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
|
||||
#define LTQ_KEYS_POLL_INTERVAL 20 /* msecs */
|
||||
#define LTQ_KEYS_DEBOUNCE_INTERVAL (3 * LTQ_KEYS_POLL_INTERVAL)
|
||||
|
||||
void ltq_register_gpio_keys_polled(int id,
|
||||
unsigned poll_interval,
|
||||
unsigned nbuttons,
|
||||
struct gpio_keys_button *buttons);
|
||||
|
||||
#endif /* _LANTIQ_DEV_GPIO_BUTTONS_H */
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Lantiq GPIO LED device support
|
||||
*
|
||||
* Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _LANTIQ_DEV_LEDS_GPIO_H
|
||||
#define _LANTIQ_DEV_LEDS_GPIO_H
|
||||
|
||||
#include <linux/leds.h>
|
||||
|
||||
void ltq_add_device_gpio_leds(int id,
|
||||
unsigned num_leds,
|
||||
struct gpio_led *leds) __init;
|
||||
|
||||
#endif /* _LANTIQ_DEV_LEDS_GPIO_H */
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Lantiq GPIO button support
|
||||
*
|
||||
* Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <dev-gpio-buttons.h>
|
||||
|
||||
void __init ltq_register_gpio_keys_polled(int id,
|
||||
unsigned poll_interval,
|
||||
unsigned nbuttons,
|
||||
struct gpio_keys_button *buttons)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct gpio_keys_platform_data pdata;
|
||||
struct gpio_keys_button *p;
|
||||
int err;
|
||||
|
||||
p = kmalloc(nbuttons * sizeof(*p), GFP_KERNEL);
|
||||
if (!p)
|
||||
return;
|
||||
|
||||
memcpy(p, buttons, nbuttons * sizeof(*p));
|
||||
|
||||
pdev = platform_device_alloc("gpio-keys-polled", id);
|
||||
if (!pdev)
|
||||
goto err_free_buttons;
|
||||
|
||||
memset(&pdata, 0, sizeof(pdata));
|
||||
pdata.poll_interval = poll_interval;
|
||||
pdata.nbuttons = nbuttons;
|
||||
pdata.buttons = p;
|
||||
|
||||
err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
|
||||
if (err)
|
||||
goto err_put_pdev;
|
||||
|
||||
err = platform_device_add(pdev);
|
||||
if (err)
|
||||
goto err_put_pdev;
|
||||
|
||||
return;
|
||||
|
||||
err_put_pdev:
|
||||
platform_device_put(pdev);
|
||||
|
||||
err_free_buttons:
|
||||
kfree(p);
|
||||
}
|
||||
57
target/linux/lantiq/files/arch/mips/lantiq/dev-gpio-leds.c
Normal file
57
target/linux/lantiq/files/arch/mips/lantiq/dev-gpio-leds.c
Normal file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Lantiq GPIO LED device support
|
||||
*
|
||||
* Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
|
||||
*
|
||||
* Parts of this file are based on Atheros' 2.6.15 BSP
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <dev-gpio-leds.h>
|
||||
|
||||
void __init ltq_add_device_gpio_leds(int id, unsigned num_leds,
|
||||
struct gpio_led *leds)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct gpio_led_platform_data pdata;
|
||||
struct gpio_led *p;
|
||||
int err;
|
||||
|
||||
p = kmalloc(num_leds * sizeof(*p), GFP_KERNEL);
|
||||
if (!p)
|
||||
return;
|
||||
|
||||
memcpy(p, leds, num_leds * sizeof(*p));
|
||||
|
||||
pdev = platform_device_alloc("leds-gpio", id);
|
||||
if (!pdev)
|
||||
goto err_free_leds;
|
||||
|
||||
memset(&pdata, 0, sizeof(pdata));
|
||||
pdata.num_leds = num_leds;
|
||||
pdata.leds = p;
|
||||
|
||||
err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
|
||||
if (err)
|
||||
goto err_put_pdev;
|
||||
|
||||
err = platform_device_add(pdev);
|
||||
if (err)
|
||||
goto err_put_pdev;
|
||||
|
||||
return;
|
||||
|
||||
err_put_pdev:
|
||||
platform_device_put(pdev);
|
||||
|
||||
err_free_leds:
|
||||
kfree(p);
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
/*
|
||||
* EASY98000 CPLD Addon driver
|
||||
*
|
||||
* Copyright (C) 2011 Thomas Langer <thomas.langer@lantiq.com>
|
||||
*
|
||||
* 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/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
struct easy98000_reg_cpld {
|
||||
u16 cmdreg1; /* 0x1 */
|
||||
u16 cmdreg0; /* 0x0 */
|
||||
u16 idreg0; /* 0x3 */
|
||||
u16 resreg; /* 0x2 */
|
||||
u16 intreg; /* 0x5 */
|
||||
u16 idreg1; /* 0x4 */
|
||||
u16 ledreg; /* 0x7 */
|
||||
u16 pcmconconfig; /* 0x6 */
|
||||
u16 res0; /* 0x9 */
|
||||
u16 ethledreg; /* 0x8 */
|
||||
u16 res1[4]; /* 0xa-0xd */
|
||||
u16 cpld1v; /* 0xf */
|
||||
u16 cpld2v; /* 0xe */
|
||||
};
|
||||
static struct easy98000_reg_cpld * const cpld =
|
||||
(struct easy98000_reg_cpld *)(KSEG1 | 0x17c00000);
|
||||
#define cpld_r8(reg) (__raw_readw(&cpld->reg) & 0xFF)
|
||||
#define cpld_w8(val, reg) __raw_writew((val) & 0xFF, &cpld->reg)
|
||||
|
||||
int easy98000_addon_has_dm9000(void)
|
||||
{
|
||||
if ((cpld_r8(idreg0) & 0xF) == 1)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PROC_FS)
|
||||
typedef void (*cpld_dump) (struct seq_file *s);
|
||||
struct proc_entry {
|
||||
char *name;
|
||||
void *callback;
|
||||
};
|
||||
|
||||
static int cpld_proc_show ( struct seq_file *s, void *p )
|
||||
{
|
||||
cpld_dump dump = s->private;
|
||||
|
||||
if ( dump != NULL )
|
||||
dump(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cpld_proc_open ( struct inode *inode, struct file *file )
|
||||
{
|
||||
return single_open ( file, cpld_proc_show, PDE(inode)->data );
|
||||
}
|
||||
|
||||
static void cpld_versions_get ( struct seq_file *s )
|
||||
{
|
||||
seq_printf(s, "CPLD1: V%d\n", cpld_r8(cpld1v));
|
||||
seq_printf(s, "CPLD2: V%d\n", cpld_r8(cpld2v));
|
||||
}
|
||||
|
||||
static void cpld_ebu_module_get ( struct seq_file *s )
|
||||
{
|
||||
u8 addon_id;
|
||||
|
||||
addon_id = cpld_r8(idreg0) & 0xF;
|
||||
switch (addon_id) {
|
||||
case 0xF: /* nothing connected */
|
||||
break;
|
||||
case 1:
|
||||
seq_printf(s, "Ethernet Controller module (dm9000)\n");
|
||||
break;
|
||||
default:
|
||||
seq_printf(s, "Unknown EBU module (EBU_ID=0x%02X)\n", addon_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void cpld_xmii_module_get ( struct seq_file *s )
|
||||
{
|
||||
u8 addon_id;
|
||||
char *mod = NULL;
|
||||
|
||||
addon_id = cpld_r8(idreg1) & 0xF;
|
||||
switch (addon_id) {
|
||||
case 0xF:
|
||||
mod = "no module";
|
||||
break;
|
||||
case 0x1:
|
||||
mod = "RGMII module";
|
||||
break;
|
||||
case 0x4:
|
||||
mod = "GMII MAC Mode (XWAY TANTOS-3G)";
|
||||
break;
|
||||
case 0x6:
|
||||
mod = "TMII MAC Mode (XWAY TANTOS-3G)";
|
||||
break;
|
||||
case 0x8:
|
||||
mod = "GMII PHY module";
|
||||
break;
|
||||
case 0x9:
|
||||
mod = "MII PHY module";
|
||||
break;
|
||||
case 0xA:
|
||||
mod = "RMII PHY module";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (mod)
|
||||
seq_printf(s, "%s\n", mod);
|
||||
else
|
||||
seq_printf(s, "unknown xMII module (xMII_ID=0x%02X)\n", addon_id);
|
||||
}
|
||||
|
||||
static struct proc_entry proc_entries[] = {
|
||||
{"versions", cpld_versions_get},
|
||||
{"ebu", cpld_ebu_module_get},
|
||||
{"xmii", cpld_xmii_module_get},
|
||||
};
|
||||
|
||||
static struct file_operations ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = cpld_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static void cpld_proc_entry_create(struct proc_dir_entry *parent_node,
|
||||
struct proc_entry *proc_entry)
|
||||
{
|
||||
proc_create_data ( proc_entry->name, (S_IFREG | S_IRUGO), parent_node,
|
||||
&ops, proc_entry->callback);
|
||||
}
|
||||
|
||||
static int cpld_proc_install(void)
|
||||
{
|
||||
struct proc_dir_entry *driver_proc_node;
|
||||
|
||||
driver_proc_node = proc_mkdir("cpld", NULL);
|
||||
if (driver_proc_node != NULL) {
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(proc_entries); i++)
|
||||
cpld_proc_entry_create(driver_proc_node,
|
||||
&proc_entries[i]);
|
||||
} else {
|
||||
printk("cannot create proc entry");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static inline int cpld_proc_install(void) {}
|
||||
#endif
|
||||
|
||||
static int easy98000_addon_probe(struct platform_device *pdev)
|
||||
{
|
||||
return cpld_proc_install();
|
||||
}
|
||||
|
||||
static int easy98000_addon_remove(struct platform_device *pdev)
|
||||
{
|
||||
#if defined(CONFIG_PROC_FS)
|
||||
char buf[64];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < sizeof(proc_entries) / sizeof(proc_entries[0]); i++) {
|
||||
sprintf(buf, "cpld/%s", proc_entries[i].name);
|
||||
remove_proc_entry(buf, 0);
|
||||
}
|
||||
remove_proc_entry("cpld", 0);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver easy98000_addon_driver = {
|
||||
.probe = easy98000_addon_probe,
|
||||
.remove = __devexit_p(easy98000_addon_remove),
|
||||
.driver = {
|
||||
.name = "easy98000_addon",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
int __init easy98000_addon_init(void)
|
||||
{
|
||||
return platform_driver_register(&easy98000_addon_driver);
|
||||
}
|
||||
|
||||
void __exit easy98000_addon_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&easy98000_addon_driver);
|
||||
}
|
||||
|
||||
module_init(easy98000_addon_init);
|
||||
module_exit(easy98000_addon_exit);
|
||||
@@ -0,0 +1,161 @@
|
||||
/*
|
||||
* EASY98000 CPLD LED driver
|
||||
*
|
||||
* Copyright (C) 2010 Ralph Hempel <ralph.hempel@lantiq.com>
|
||||
*
|
||||
* 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/kernel.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "dev-leds-easy98000-cpld.h"
|
||||
|
||||
const char *led_name[8] = {
|
||||
"ge0_act",
|
||||
"ge0_link",
|
||||
"ge1_act",
|
||||
"ge1_link",
|
||||
"fe2_act",
|
||||
"fe2_link",
|
||||
"fe3_act",
|
||||
"fe3_link"
|
||||
};
|
||||
|
||||
#define cpld_base7 ((u16 *)(KSEG1 | 0x17c0000c))
|
||||
#define cpld_base8 ((u16 *)(KSEG1 | 0x17c00012))
|
||||
|
||||
#define ltq_r16(reg) __raw_readw(reg)
|
||||
#define ltq_w16(val, reg) __raw_writew(val, reg)
|
||||
|
||||
struct cpld_led_dev {
|
||||
struct led_classdev cdev;
|
||||
u8 mask;
|
||||
u16 *base;
|
||||
};
|
||||
|
||||
struct cpld_led_drvdata {
|
||||
struct cpld_led_dev *led_devs;
|
||||
int num_leds;
|
||||
};
|
||||
|
||||
void led_set(u8 mask, u16 *base)
|
||||
{
|
||||
ltq_w16(ltq_r16(base) | mask, base);
|
||||
}
|
||||
|
||||
void led_clear(u8 mask, u16 *base)
|
||||
{
|
||||
ltq_w16(ltq_r16(base) & (~mask), base);
|
||||
}
|
||||
|
||||
void led_blink_clear(u8 mask, u16 *base)
|
||||
{
|
||||
led_clear(mask, base);
|
||||
}
|
||||
|
||||
static void led_brightness(struct led_classdev *led_cdev,
|
||||
enum led_brightness value)
|
||||
{
|
||||
struct cpld_led_dev *led_dev =
|
||||
container_of(led_cdev, struct cpld_led_dev, cdev);
|
||||
|
||||
if (value)
|
||||
led_set(led_dev->mask, led_dev->base);
|
||||
else
|
||||
led_clear(led_dev->mask, led_dev->base);
|
||||
}
|
||||
|
||||
static int led_probe(struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
char name[32];
|
||||
struct cpld_led_drvdata *drvdata;
|
||||
int ret = 0;
|
||||
|
||||
drvdata = kzalloc(sizeof(struct cpld_led_drvdata) +
|
||||
sizeof(struct cpld_led_dev) * MAX_LED,
|
||||
GFP_KERNEL);
|
||||
if (!drvdata)
|
||||
return -ENOMEM;
|
||||
|
||||
drvdata->led_devs = (struct cpld_led_dev *) &drvdata[1];
|
||||
|
||||
for (i = 0; i < MAX_LED; i++) {
|
||||
struct cpld_led_dev *led_dev = &drvdata->led_devs[i];
|
||||
led_dev->cdev.brightness_set = led_brightness;
|
||||
led_dev->cdev.default_trigger = NULL;
|
||||
led_dev->mask = 1 << (i % 8);
|
||||
if(i < 8) {
|
||||
sprintf(name, "easy98000-cpld:%s", led_name[i]);
|
||||
led_dev->base = cpld_base8;
|
||||
} else {
|
||||
sprintf(name, "easy98000-cpld:red:%d", i-8);
|
||||
led_dev->base = cpld_base7;
|
||||
}
|
||||
led_dev->cdev.name = name;
|
||||
ret = led_classdev_register(&pdev->dev, &led_dev->cdev);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
platform_set_drvdata(pdev, drvdata);
|
||||
return 0;
|
||||
|
||||
err:
|
||||
printk("led_probe: 3\n");
|
||||
for (i = i - 1; i >= 0; i--)
|
||||
led_classdev_unregister(&drvdata->led_devs[i].cdev);
|
||||
|
||||
kfree(drvdata);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int led_remove(struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
struct cpld_led_drvdata *drvdata = platform_get_drvdata(pdev);
|
||||
for (i = 0; i < MAX_LED; i++)
|
||||
led_classdev_unregister(&drvdata->led_devs[i].cdev);
|
||||
kfree(drvdata);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver led_driver = {
|
||||
.probe = led_probe,
|
||||
.remove = __devexit_p(led_remove),
|
||||
.driver = {
|
||||
.name = LED_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
int __init easy98000_cpld_led_init(void)
|
||||
{
|
||||
pr_info(LED_DESC ", Version " LED_VERSION
|
||||
" (c) Copyright 2011, Lantiq Deutschland GmbH\n");
|
||||
return platform_driver_register(&led_driver);
|
||||
}
|
||||
|
||||
void __exit easy98000_cpld_led_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&led_driver);
|
||||
}
|
||||
|
||||
module_init(easy98000_cpld_led_init);
|
||||
module_exit(easy98000_cpld_led_exit);
|
||||
|
||||
MODULE_DESCRIPTION(LED_NAME);
|
||||
MODULE_DESCRIPTION(LED_DESC);
|
||||
MODULE_AUTHOR("Ralph Hempel <ralph.hempel@lantiq.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* EASY98000 CPLD LED driver
|
||||
*
|
||||
* Copyright (C) 2010 Ralph Hempel <ralph.hempel@lantiq.com>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
#ifndef _INCLUDE_EASY98000_CPLD_LED_H_
|
||||
#define _INCLUDE_EASY98000_CPLD_LED_H_
|
||||
|
||||
#define LED_NAME "easy98000_cpld_led"
|
||||
#define LED_DESC "EASY98000 LED driver"
|
||||
#define LED_VERSION "1.0.0"
|
||||
|
||||
#define MAX_LED 16
|
||||
|
||||
#endif /* _INCLUDE_EASY98000_CPLD_LED_H_ */
|
||||
@@ -0,0 +1,94 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
|
||||
#include <dev-gpio-leds.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
|
||||
#define BOARD_95C3AM1_GPIO_LED_0 10
|
||||
#define BOARD_95C3AM1_GPIO_LED_1 11
|
||||
#define BOARD_95C3AM1_GPIO_LED_2 12
|
||||
#define BOARD_95C3AM1_GPIO_LED_3 13
|
||||
|
||||
static struct mtd_partition board_95C3AM1_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x40000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x40000,
|
||||
.size = 0x40000, /* 2 sectors for redundant env. */
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x80000,
|
||||
.size = 0xF80000, /* map only 16 MiB */
|
||||
},
|
||||
};
|
||||
|
||||
static struct flash_platform_data board_95C3AM1_flash_platform_data = {
|
||||
.name = "sflash",
|
||||
.parts = board_95C3AM1_partitions,
|
||||
.nr_parts = ARRAY_SIZE(board_95C3AM1_partitions)
|
||||
};
|
||||
|
||||
static struct spi_board_info board_95C3AM1_flash_data __initdata = {
|
||||
.modalias = "m25p80",
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.max_speed_hz = 10 * 1000 * 1000,
|
||||
.mode = SPI_MODE_3,
|
||||
.platform_data = &board_95C3AM1_flash_platform_data
|
||||
};
|
||||
|
||||
static struct gpio_led board_95C3AM1_gpio_leds[] __initdata = {
|
||||
{
|
||||
.name = "power",
|
||||
.gpio = BOARD_95C3AM1_GPIO_LED_0,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "optical",
|
||||
.gpio = BOARD_95C3AM1_GPIO_LED_1,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "lan",
|
||||
.gpio = BOARD_95C3AM1_GPIO_LED_2,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "update",
|
||||
.gpio = BOARD_95C3AM1_GPIO_LED_3,
|
||||
.active_low = 0,
|
||||
}
|
||||
};
|
||||
|
||||
static struct i2c_gpio_platform_data board_95C3AM1_i2c_gpio_data = {
|
||||
.sda_pin = 107,
|
||||
.scl_pin = 108,
|
||||
};
|
||||
|
||||
static struct platform_device board_95C3AM1_i2c_gpio_device = {
|
||||
.name = "i2c-gpio",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &board_95C3AM1_i2c_gpio_data,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init board_95C3AM1_init(void)
|
||||
{
|
||||
falcon_register_i2c();
|
||||
falcon_register_spi_flash(&board_95C3AM1_flash_data);
|
||||
platform_device_register(&board_95C3AM1_i2c_gpio_device);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(board_95C3AM1_gpio_leds),
|
||||
board_95C3AM1_gpio_leds);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_95C3AM1,
|
||||
"95C3AM1",
|
||||
"95C3AM1 Board",
|
||||
board_95C3AM1_init);
|
||||
@@ -0,0 +1,118 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_buttons.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
|
||||
#include <dev-gpio-leds.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
|
||||
#define EASY98020_GPIO_LED_0 9
|
||||
#define EASY98020_GPIO_LED_1 10
|
||||
#define EASY98020_GPIO_LED_2 11
|
||||
#define EASY98020_GPIO_LED_3 12
|
||||
#define EASY98020_GPIO_LED_GE0_ACT 110
|
||||
#define EASY98020_GPIO_LED_GE0_LINK 109
|
||||
#define EASY98020_GPIO_LED_GE1_ACT 106
|
||||
#define EASY98020_GPIO_LED_GE1_LINK 105
|
||||
|
||||
static struct mtd_partition easy98020_spi_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x40000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x40000,
|
||||
.size = 0x40000, /* 2 sectors for redundant env. */
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x80000,
|
||||
.size = 0xF80000, /* map only 16 MiB */
|
||||
},
|
||||
};
|
||||
|
||||
static struct flash_platform_data easy98020_spi_flash_platform_data = {
|
||||
.name = "sflash",
|
||||
.parts = easy98020_spi_partitions,
|
||||
.nr_parts = ARRAY_SIZE(easy98020_spi_partitions)
|
||||
};
|
||||
|
||||
static struct spi_board_info easy98020_spi_flash_data __initdata = {
|
||||
.modalias = "m25p80",
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.max_speed_hz = 10 * 1000 * 1000,
|
||||
.mode = SPI_MODE_3,
|
||||
.platform_data = &easy98020_spi_flash_platform_data
|
||||
};
|
||||
|
||||
static struct gpio_led easy98020_gpio_leds[] __initdata = {
|
||||
{
|
||||
.name = "easy98020:green:0",
|
||||
.gpio = EASY98020_GPIO_LED_0,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:green:1",
|
||||
.gpio = EASY98020_GPIO_LED_1,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:green:2",
|
||||
.gpio = EASY98020_GPIO_LED_2,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:green:3",
|
||||
.gpio = EASY98020_GPIO_LED_3,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:ge0_act",
|
||||
.gpio = EASY98020_GPIO_LED_GE0_ACT,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:ge0_link",
|
||||
.gpio = EASY98020_GPIO_LED_GE0_LINK,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:ge1_act",
|
||||
.gpio = EASY98020_GPIO_LED_GE1_ACT,
|
||||
.active_low = 0,
|
||||
}, {
|
||||
.name = "easy98020:ge1_link",
|
||||
.gpio = EASY98020_GPIO_LED_GE1_LINK,
|
||||
.active_low = 0,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init easy98020_init(void)
|
||||
{
|
||||
falcon_register_i2c();
|
||||
falcon_register_spi_flash(&easy98020_spi_flash_data);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(easy98020_gpio_leds),
|
||||
easy98020_gpio_leds);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_EASY98020,
|
||||
"EASY98020",
|
||||
"EASY98020 Eval Board",
|
||||
easy98020_init);
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_EASY98020_1LAN,
|
||||
"EASY98020_1LAN",
|
||||
"EASY98020 Eval Board (1 LAN port)",
|
||||
easy98020_init);
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_EASY98020_2LAN,
|
||||
"EASY98020_2LAN",
|
||||
"EASY98020 Eval Board (2 LAN ports)",
|
||||
easy98020_init);
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <lantiq_irq.h>
|
||||
#include <lantiq_platform.h>
|
||||
|
||||
#define LTQ_USB_IOMEM_BASE 0x1e101000
|
||||
#define LTQ_USB_IOMEM_SIZE 0x00001000
|
||||
|
||||
static struct resource resources[] =
|
||||
{
|
||||
[0] = {
|
||||
.name = "dwc_otg_membase",
|
||||
.start = LTQ_USB_IOMEM_BASE,
|
||||
.end = LTQ_USB_IOMEM_BASE + LTQ_USB_IOMEM_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = "dwc_otg_irq",
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 dwc_dmamask = (u32)0x1fffffff;
|
||||
|
||||
static struct platform_device platform_dev = {
|
||||
.name = "dwc_otg",
|
||||
.dev = {
|
||||
.dma_mask = &dwc_dmamask,
|
||||
},
|
||||
.resource = resources,
|
||||
.num_resources = ARRAY_SIZE(resources),
|
||||
};
|
||||
|
||||
int __init
|
||||
xway_register_dwc(int pin)
|
||||
{
|
||||
struct irq_data d;
|
||||
d.irq = resources[1].start;
|
||||
ltq_enable_irq(&d);
|
||||
resources[1].start = ltq_is_ase() ? LTQ_USB_ASE_INT : LTQ_USB_INT;
|
||||
platform_dev.dev.platform_data = (void*) pin;
|
||||
return platform_device_register(&platform_dev);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#ifndef _LTQ_DEV_DWC_H__
|
||||
#define _LTQ_DEV_DWC_H__
|
||||
|
||||
#include <lantiq_platform.h>
|
||||
|
||||
extern void __init xway_register_dwc(int pin);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (C) 2011 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2011 Andrej Vlašić <andrej.vlasic0@gmail.com>
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/ath5k_platform.h>
|
||||
#include <linux/ath9k_platform.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "dev-wifi-athxk.h"
|
||||
|
||||
extern int (*ltqpci_plat_dev_init)(struct pci_dev *dev);
|
||||
struct ath5k_platform_data ath5k_pdata;
|
||||
struct ath9k_platform_data ath9k_pdata = {
|
||||
.led_pin = -1,
|
||||
.endian_check = true,
|
||||
};
|
||||
|
||||
static int
|
||||
ath5k_pci_plat_dev_init(struct pci_dev *dev)
|
||||
{
|
||||
dev->dev.platform_data = &ath5k_pdata;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
ath9k_pci_plat_dev_init(struct pci_dev *dev)
|
||||
{
|
||||
dev->dev.platform_data = &ath9k_pdata;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init
|
||||
ltq_register_ath5k(u16 *eeprom_data, u8 *macaddr)
|
||||
{
|
||||
ath5k_pdata.eeprom_data = eeprom_data;
|
||||
ath5k_pdata.macaddr = macaddr;
|
||||
ltqpci_plat_dev_init = ath5k_pci_plat_dev_init;
|
||||
}
|
||||
|
||||
void __init
|
||||
ltq_register_ath9k(u16 *eeprom_data, u8 *macaddr)
|
||||
{
|
||||
memcpy(ath9k_pdata.eeprom_data, eeprom_data, sizeof(ath9k_pdata.eeprom_data));
|
||||
ath9k_pdata.macaddr = macaddr;
|
||||
ltqpci_plat_dev_init = ath9k_pci_plat_dev_init;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (C) 2011 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2011 Andrej Vlašić <andrej.vlasic0@gmail.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _DEV_WIFI_ATHXK_H__
|
||||
#define _DEV_WIFI_ATHXK_H__
|
||||
|
||||
extern void ltq_register_ath5k(u16 *eeprom_data, u8 *macaddr);
|
||||
extern void ltq_register_ath9k(u16 *eeprom_data, u8 *macaddr);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2011 John Crispin <blogic@openwrt.org>
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/rt2x00_platform.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "dev-wifi-rt2x00.h"
|
||||
|
||||
extern int (*ltqpci_plat_dev_init)(struct pci_dev *dev);
|
||||
struct rt2x00_platform_data rt2x00_pdata;
|
||||
|
||||
static int
|
||||
rt2x00_pci_plat_dev_init(struct pci_dev *dev)
|
||||
{
|
||||
dev->dev.platform_data = &rt2x00_pdata;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init
|
||||
ltq_register_rt2x00(const char *firmware, const u8 *mac)
|
||||
{
|
||||
rt2x00_pdata.eeprom_file_name = kstrdup(firmware, GFP_KERNEL);
|
||||
rt2x00_pdata.mac_address = mac;
|
||||
ltqpci_plat_dev_init = rt2x00_pci_plat_dev_init;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (C) 2011 John Crispin <blogic@openwrt.org>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _DEV_WIFI_RT2X00_H__
|
||||
#define _DEV_WIFI_RT2X00_H__
|
||||
|
||||
extern void ltq_register_rt2x00(const char *firmware, const u8 *mac);
|
||||
|
||||
#endif
|
||||
788
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-arv.c
Normal file
788
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-arv.c
Normal file
@@ -0,0 +1,788 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_buttons.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/ath5k_platform.h>
|
||||
#include <linux/ath9k_platform.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <lantiq_platform.h>
|
||||
#include <dev-gpio-leds.h>
|
||||
#include <dev-gpio-buttons.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "dev-wifi-rt2x00.h"
|
||||
#include "dev-wifi-athxk.h"
|
||||
#include "devices.h"
|
||||
#include "dev-dwc_otg.h"
|
||||
#include "pci-ath-fixup.h"
|
||||
|
||||
static struct mtd_partition arv45xx_brnboot_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "brn-boot",
|
||||
.offset = 0x0,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "config",
|
||||
.offset = 0x20000,
|
||||
.size = 0x30000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x50000,
|
||||
.size = 0x390000,
|
||||
},
|
||||
{
|
||||
.name = "reserved", /* 12-byte signature at 0x3efff4 :/ */
|
||||
.offset = 0x3e0000,
|
||||
.size = 0x010000,
|
||||
},
|
||||
{
|
||||
.name = "eeprom",
|
||||
.offset = 0x3f0000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition arv75xx_brnboot_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "brn-boot",
|
||||
.offset = 0x0,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "config",
|
||||
.offset = 0x20000,
|
||||
.size = 0x40000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x440000,
|
||||
.size = 0x3a0000,
|
||||
},
|
||||
{
|
||||
.name = "reserved", /* 12-byte signature at 0x7efff4 :/ */
|
||||
.offset = 0x7e0000,
|
||||
.size = 0x010000,
|
||||
},
|
||||
{
|
||||
.name = "board_config",
|
||||
.offset = 0x7f0000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* this is generic configuration for all arv based boards, note that it can be
|
||||
* rewriten in arv_load_nor()
|
||||
*/
|
||||
static struct mtd_partition arv_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x20000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x30000,
|
||||
.size = 0x3c0000,
|
||||
},
|
||||
{
|
||||
.name = "board_config",
|
||||
.offset = 0x3f0000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data arv45xx_brnboot_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(arv45xx_brnboot_partitions),
|
||||
.parts = arv45xx_brnboot_partitions,
|
||||
};
|
||||
|
||||
static struct physmap_flash_data arv75xx_brnboot_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(arv75xx_brnboot_partitions),
|
||||
.parts = arv75xx_brnboot_partitions,
|
||||
};
|
||||
|
||||
static struct physmap_flash_data arv_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(arv_partitions),
|
||||
.parts = arv_partitions,
|
||||
};
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_EXT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = {
|
||||
[14] = INT_NUM_IM0_IRL0 + 22,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv4510pw_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:green:foo", .gpio = 4, .active_low = 1, },
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv4518pw_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:green:power", .gpio = 3, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:adsl", .gpio = 4, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:internet", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:wifi", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:yellow:wps", .gpio = 7, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:fail", .gpio = 8, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:usb", .gpio = 19, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:voip", .gpio = 100, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:fxs1", .gpio = 101, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:fxs2", .gpio = 102, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:fxo", .gpio = 103, .active_low = 1, .default_trigger = "default-on" },
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
arv4518pw_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "wifi",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_0,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 28,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "reset",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_1,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 30,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "wps",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_2,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 29,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv4519pw_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:red:power", .gpio = 7, .active_low = 1, },
|
||||
{ .name = "soc:green:power", .gpio = 2, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:wifi", .gpio = 6, .active_low = 1, },
|
||||
{ .name = "soc:green:adsl", .gpio = 4, .active_low = 1, },
|
||||
{ .name = "soc:green:internet", .gpio = 5, .active_low = 1, },
|
||||
{ .name = "soc:red:internet", .gpio = 8, .active_low = 1, },
|
||||
{ .name = "soc:green:voip", .gpio = 100, .active_low = 1, },
|
||||
{ .name = "soc:green:phone1", .gpio = 101, .active_low = 1, },
|
||||
{ .name = "soc:green:phone2", .gpio = 102, .active_low = 1, },
|
||||
{ .name = "soc:green:fxo", .gpio = 103, .active_low = 1, },
|
||||
{ .name = "soc:green:usb", .gpio = 19, .active_low = 1, },
|
||||
{ .name = "soc:orange:wps", .gpio = 104, .active_low = 1, },
|
||||
{ .name = "soc:green:wps", .gpio = 105, .active_low = 1, },
|
||||
{ .name = "soc:red:wps", .gpio = 106, .active_low = 1, },
|
||||
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
arv4519pw_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "reset",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_1,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 30,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "wlan",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_2,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 28,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv4520pw_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:blue:power", .gpio = 3, .active_low = 1, },
|
||||
{ .name = "soc:blue:adsl", .gpio = 4, .active_low = 1, },
|
||||
{ .name = "soc:blue:internet", .gpio = 5, .active_low = 1, },
|
||||
{ .name = "soc:red:power", .gpio = 6, .active_low = 1, },
|
||||
{ .name = "soc:yellow:wps", .gpio = 7, .active_low = 1, },
|
||||
{ .name = "soc:red:wps", .gpio = 9, .active_low = 1, },
|
||||
{ .name = "soc:blue:voip", .gpio = 100, .active_low = 1, },
|
||||
{ .name = "soc:blue:fxs1", .gpio = 101, .active_low = 1, },
|
||||
{ .name = "soc:blue:fxs2", .gpio = 102, .active_low = 1, },
|
||||
{ .name = "soc:blue:fxo", .gpio = 103, .active_low = 1, },
|
||||
{ .name = "soc:blue:voice", .gpio = 104, .active_low = 1, },
|
||||
{ .name = "soc:blue:usb", .gpio = 105, .active_low = 1, },
|
||||
{ .name = "soc:blue:wifi", .gpio = 106, .active_low = 1, },
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv452cpw_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:blue:power", .gpio = 3, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:adsl", .gpio = 4, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:isdn", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:power", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:yellow:wps", .gpio = 7, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:wps", .gpio = 9, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:fxs1", .gpio = 100, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:fxs2", .gpio = 101, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:wps", .gpio = 102, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:fxo", .gpio = 103, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:voice", .gpio = 104, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:usb", .gpio = 105, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:wifi", .gpio = 106, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:internet", .gpio = 108, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:internet", .gpio = 109, .active_low = 1, .default_trigger = "default-on" },
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv4525pw_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:green:dsl", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:wifi", .gpio = 8, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:online", .gpio = 9, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:fxs-internet", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:fxs-festnetz", .gpio = 4, .active_low = 1, .default_trigger = "default-on" },
|
||||
};
|
||||
|
||||
#define ARV4525PW_PHYRESET 13
|
||||
#define ARV4525PW_RELAY 31
|
||||
|
||||
static struct gpio
|
||||
arv4525pw_gpios[] __initdata = {
|
||||
{ ARV4525PW_PHYRESET, GPIOF_OUT_INIT_HIGH, "phyreset" },
|
||||
{ ARV4525PW_RELAY, GPIOF_OUT_INIT_HIGH, "relay" },
|
||||
};
|
||||
|
||||
|
||||
static struct gpio_led
|
||||
arv752dpw22_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:blue:power", .gpio = 3, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:internet", .gpio = 5, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:power", .gpio = 6, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:wps", .gpio = 8, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:fxo", .gpio = 103, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:voice", .gpio = 104, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:usb", .gpio = 105, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:wifi", .gpio = 106, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:wifi1", .gpio = 107, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:wifi", .gpio = 108, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:blue:wifi1", .gpio = 109, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:eth1", .gpio = 111, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:eth2", .gpio = 112, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:eth3", .gpio = 113, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:eth4", .gpio = 114, .active_low = 1, .default_trigger = "default-on", },
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
arv752dpw22_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "btn0",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_0,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 12,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "btn1",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_1,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 13,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "btn2",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_2,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 28,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
arv7518pw_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:red:power", .gpio = 7, .active_low = 1, },
|
||||
{ .name = "soc:green:power", .gpio = 2, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:wifi", .gpio = 6, .active_low = 1, },
|
||||
{ .name = "soc:green:adsl", .gpio = 4, .active_low = 1, },
|
||||
{ .name = "soc:green:internet", .gpio = 5, .active_low = 1, },
|
||||
{ .name = "soc:red:internet", .gpio = 8, .active_low = 1, },
|
||||
{ .name = "soc:green:voip", .gpio = 100, .active_low = 1, },
|
||||
{ .name = "soc:green:phone1", .gpio = 101, .active_low = 1, },
|
||||
{ .name = "soc:green:phone2", .gpio = 102, .active_low = 1, },
|
||||
{ .name = "soc:orange:fail", .gpio = 103, .active_low = 1, },
|
||||
{ .name = "soc:green:usb", .gpio = 19, .active_low = 1, },
|
||||
{ .name = "soc:orange:wps", .gpio = 104, .active_low = 1, },
|
||||
{ .name = "soc:green:wps", .gpio = 105, .active_low = 1, },
|
||||
{ .name = "soc:red:wps", .gpio = 106, .active_low = 1, },
|
||||
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
arv7518pw_gpio_keys[] __initdata = {
|
||||
/*{
|
||||
.desc = "reset",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_1,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 23,
|
||||
.active_low = 1,
|
||||
},*/
|
||||
{
|
||||
.desc = "wifi",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_2,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 25,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
arv7525pw_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "restart",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_0,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 29,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init
|
||||
arv_load_nor(unsigned int max)
|
||||
{
|
||||
#define UBOOT_MAGIC 0x27051956
|
||||
|
||||
int i;
|
||||
int sector = -1;
|
||||
|
||||
if (ltq_brn_boot) {
|
||||
if (max == 0x800000)
|
||||
ltq_register_nor(&arv75xx_brnboot_flash_data);
|
||||
else
|
||||
ltq_register_nor(&arv45xx_brnboot_flash_data);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 1; i < 4 && sector < 0; i++) {
|
||||
unsigned int uboot_magic;
|
||||
memcpy_fromio(&uboot_magic, (void *)KSEG1ADDR(LTQ_FLASH_START) + (i * 0x10000), 4);
|
||||
if (uboot_magic == UBOOT_MAGIC)
|
||||
sector = i;
|
||||
}
|
||||
|
||||
if (sector < 0)
|
||||
return;
|
||||
|
||||
arv_partitions[0].size = arv_partitions[1].offset = (sector - 1) * 0x10000;
|
||||
arv_partitions[2].offset = arv_partitions[0].size + 0x10000;
|
||||
arv_partitions[2].size = max - arv_partitions[2].offset - 0x10000;
|
||||
arv_partitions[3].offset = max - 0x10000;
|
||||
ltq_register_nor(&arv_flash_data);
|
||||
}
|
||||
|
||||
static void __init
|
||||
arv_register_ethernet(unsigned int mac_addr)
|
||||
{
|
||||
memcpy_fromio(<q_eth_data.mac.sa_data,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + mac_addr), 6);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
}
|
||||
|
||||
static u16 arv_ath5k_eeprom_data[ATH5K_PLAT_EEP_MAX_WORDS];
|
||||
static u16 arv_ath9k_eeprom_data[ATH9K_PLAT_EEP_MAX_WORDS];
|
||||
static u8 arv_athxk_eeprom_mac[6];
|
||||
|
||||
static void __init
|
||||
arv_register_ath5k(unsigned int ath_addr, unsigned int mac_addr)
|
||||
{
|
||||
int i;
|
||||
|
||||
memcpy_fromio(arv_athxk_eeprom_mac,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + mac_addr), 6);
|
||||
arv_athxk_eeprom_mac[5]++;
|
||||
memcpy_fromio(arv_ath5k_eeprom_data,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + ath_addr), ATH5K_PLAT_EEP_MAX_WORDS);
|
||||
// swap eeprom bytes
|
||||
for (i = 0; i < ATH5K_PLAT_EEP_MAX_WORDS>>1; i++) {
|
||||
arv_ath5k_eeprom_data[i] = swab16(arv_ath5k_eeprom_data[i]);
|
||||
if (i == 0x17e>>1) {
|
||||
/*
|
||||
* regdomain is invalid. it's unknown how did original
|
||||
* fw convered value to 0x82d4 so for now force to 0x67
|
||||
*/
|
||||
arv_ath5k_eeprom_data[i] &= 0x0000;
|
||||
arv_ath5k_eeprom_data[i] |= 0x67;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void __init
|
||||
arv_register_ath9k(unsigned int ath_addr, unsigned int mac_addr)
|
||||
{
|
||||
int i;
|
||||
u16 *eepdata, sum, el;
|
||||
|
||||
memcpy_fromio(arv_athxk_eeprom_mac,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + mac_addr), 6);
|
||||
arv_athxk_eeprom_mac[5]++;
|
||||
memcpy_fromio(arv_ath9k_eeprom_data,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + ath_addr), ATH9K_PLAT_EEP_MAX_WORDS);
|
||||
|
||||
// force regdomain to 0x67
|
||||
arv_ath9k_eeprom_data[0x208>>1] = 0x67;
|
||||
|
||||
// calculate new checksum
|
||||
sum = arv_ath9k_eeprom_data[0x200>>1];
|
||||
el = sum / sizeof(u16) - 2; /* skip length and (old) checksum */
|
||||
eepdata = (u16 *) (&arv_ath9k_eeprom_data[0x204>>1]); /* after checksum */
|
||||
for (i = 0; i < el; i++)
|
||||
sum ^= *eepdata++;
|
||||
sum ^= 0xffff;
|
||||
arv_ath9k_eeprom_data[0x202>>1] = sum;
|
||||
}
|
||||
|
||||
static void __init
|
||||
arv3527p_init(void)
|
||||
{
|
||||
#define ARV3527P_MAC_ADDR 0x3f0016
|
||||
|
||||
ltq_register_gpio_stp();
|
||||
// ltq_add_device_gpio_leds(arv3527p_gpio_leds, ARRAY_SIZE(arv3527p_gpio_leds));
|
||||
arv_load_nor(0x400000);
|
||||
arv_register_ethernet(ARV3527P_MAC_ADDR);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV3527P,
|
||||
"ARV3527P",
|
||||
"ARV3527P - Arcor Easybox 401",
|
||||
arv3527p_init);
|
||||
|
||||
static void __init
|
||||
arv4510pw_init(void)
|
||||
{
|
||||
#define ARV4510PW_MAC_ADDR 0x3f0014
|
||||
|
||||
ltq_register_gpio_stp();
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(arv4510pw_gpio_leds), arv4510pw_gpio_leds);
|
||||
arv_load_nor(0x400000);
|
||||
ltq_pci_data.irq[12] = (INT_NUM_IM2_IRL0 + 31);
|
||||
ltq_pci_data.irq[15] = (INT_NUM_IM0_IRL0 + 26);
|
||||
ltq_pci_data.gpio |= PCI_EXIN2 | PCI_REQ2;
|
||||
ltq_register_pci(<q_pci_data);
|
||||
arv_register_ethernet(ARV4510PW_MAC_ADDR);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV4510PW,
|
||||
"ARV4510PW",
|
||||
"ARV4510PW - Wippies Homebox",
|
||||
arv4510pw_init);
|
||||
|
||||
static void __init
|
||||
arv4518pw_init(void)
|
||||
{
|
||||
#define ARV4518PW_EBU 0
|
||||
#define ARV4518PW_USB 14
|
||||
#define ARV4518PW_SWITCH_RESET 13
|
||||
#define ARV4518PW_ATH_ADDR 0x3f0400
|
||||
#define ARV4518PW_MADWIFI_ADDR 0xb03f0400
|
||||
#define ARV4518PW_MAC_ADDR 0x3f0016
|
||||
|
||||
ltq_register_gpio_ebu(ARV4518PW_EBU);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(arv4518pw_gpio_leds), arv4518pw_gpio_leds);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL,
|
||||
ARRAY_SIZE(arv4518pw_gpio_keys), arv4518pw_gpio_keys);
|
||||
arv_load_nor(0x400000);
|
||||
ltq_pci_data.gpio = PCI_GNT2 | PCI_REQ2;
|
||||
ltq_register_pci(<q_pci_data);
|
||||
xway_register_dwc(ARV4518PW_USB);
|
||||
arv_register_ethernet(ARV4518PW_MAC_ADDR);
|
||||
arv_register_ath5k(ARV4518PW_ATH_ADDR, ARV4518PW_MAC_ADDR);
|
||||
ltq_register_ath5k(arv_ath5k_eeprom_data, arv_athxk_eeprom_mac);
|
||||
|
||||
gpio_request(ARV4518PW_SWITCH_RESET, "switch");
|
||||
gpio_direction_output(ARV4518PW_SWITCH_RESET, 1);
|
||||
gpio_export(ARV4518PW_SWITCH_RESET, 0);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV4518PW,
|
||||
"ARV4518PW",
|
||||
"ARV4518PW - SMC7908A-ISP, Airties WAV-221",
|
||||
arv4518pw_init);
|
||||
|
||||
static void __init
|
||||
arv4519pw_init(void)
|
||||
{
|
||||
#define ARV4519PW_EBU 0
|
||||
#define ARV4519PW_USB 14
|
||||
#define ARV4519PW_RELAY 31
|
||||
#define ARV4519PW_SWITCH_RESET 13
|
||||
#define ARV4519PW_ATH_ADDR 0x3f0400
|
||||
#define ARV4519PW_MAC_ADDR 0x3f0016
|
||||
|
||||
arv_load_nor(0x400000);
|
||||
ltq_register_gpio_ebu(ARV4519PW_EBU);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(arv4519pw_gpio_leds), arv4519pw_gpio_leds);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL,
|
||||
ARRAY_SIZE(arv4519pw_gpio_keys), arv4519pw_gpio_keys);
|
||||
ltq_pci_data.gpio = PCI_GNT2 | PCI_REQ1;
|
||||
ltq_register_pci(<q_pci_data);
|
||||
xway_register_dwc(ARV4519PW_USB);
|
||||
arv_register_ethernet(ARV4519PW_MAC_ADDR);
|
||||
arv_register_ath5k(ARV4519PW_ATH_ADDR, ARV4519PW_MAC_ADDR);
|
||||
ltq_register_ath5k(arv_ath5k_eeprom_data, arv_athxk_eeprom_mac);
|
||||
|
||||
gpio_request(ARV4519PW_RELAY, "relay");
|
||||
gpio_direction_output(ARV4519PW_RELAY, 1);
|
||||
gpio_export(ARV4519PW_RELAY, 0);
|
||||
|
||||
gpio_request(ARV4519PW_SWITCH_RESET, "switch");
|
||||
gpio_set_value(ARV4519PW_SWITCH_RESET, 1);
|
||||
gpio_export(ARV4519PW_SWITCH_RESET, 0);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV4519PW,
|
||||
"ARV4519PW",
|
||||
"ARV4519PW - Vodafone, Pirelli",
|
||||
arv4519pw_init);
|
||||
|
||||
static void __init
|
||||
arv4520pw_init(void)
|
||||
{
|
||||
#define ARV4520PW_EBU 0x400
|
||||
#define ARV4520PW_USB 28
|
||||
#define ARV4520PW_SWITCH_RESET 110
|
||||
#define ARV4520PW_MAC_ADDR 0x3f0016
|
||||
|
||||
ltq_register_gpio_ebu(ARV4520PW_EBU);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(arv4520pw_gpio_leds), arv4520pw_gpio_leds);
|
||||
arv_load_nor(0x400000);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_tapi();
|
||||
arv_register_ethernet(ARV4520PW_MAC_ADDR);
|
||||
ltq_register_rt2x00(NULL, (const u8 *) ltq_eth_data.mac.sa_data);
|
||||
xway_register_dwc(ARV4520PW_USB);
|
||||
|
||||
gpio_request(ARV4520PW_SWITCH_RESET, "switch");
|
||||
gpio_set_value(ARV4520PW_SWITCH_RESET, 1);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV4520PW,
|
||||
"ARV4520PW",
|
||||
"ARV4520PW - Airties WAV-281, Arcor A800",
|
||||
arv4520pw_init);
|
||||
|
||||
static void __init
|
||||
arv452Cpw_init(void)
|
||||
{
|
||||
#define ARV452CPW_EBU 0x77f
|
||||
#define ARV452CPW_USB 28
|
||||
#define ARV452CPW_RELAY1 31
|
||||
#define ARV452CPW_RELAY2 107
|
||||
#define ARV452CPW_SWITCH_RESET 110
|
||||
#define ARV452CPW_ATH_ADDR 0x3f0400
|
||||
#define ARV452CPW_MADWIFI_ADDR 0xb03f0400
|
||||
#define ARV452CPW_MAC_ADDR 0x3f0016
|
||||
|
||||
ltq_register_gpio_ebu(ARV452CPW_EBU);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(arv452cpw_gpio_leds), arv452cpw_gpio_leds);
|
||||
arv_load_nor(0x400000);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
xway_register_dwc(ARV452CPW_USB);
|
||||
arv_register_ethernet(ARV452CPW_MAC_ADDR);
|
||||
arv_register_ath5k(ARV452CPW_ATH_ADDR, ARV452CPW_MAC_ADDR);
|
||||
ltq_register_ath5k(arv_ath5k_eeprom_data, arv_athxk_eeprom_mac);
|
||||
|
||||
gpio_request(ARV452CPW_SWITCH_RESET, "switch");
|
||||
gpio_set_value(ARV452CPW_SWITCH_RESET, 1);
|
||||
gpio_export(ARV452CPW_SWITCH_RESET, 0);
|
||||
|
||||
gpio_request(ARV452CPW_RELAY1, "relay1");
|
||||
gpio_direction_output(ARV452CPW_RELAY1, 1);
|
||||
gpio_export(ARV452CPW_RELAY1, 0);
|
||||
|
||||
gpio_request(ARV452CPW_RELAY2, "relay2");
|
||||
gpio_set_value(ARV452CPW_RELAY2, 1);
|
||||
gpio_export(ARV452CPW_RELAY2, 0);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV452CPW,
|
||||
"ARV452CPW",
|
||||
"ARV452CPW - Arcor A801",
|
||||
arv452Cpw_init);
|
||||
|
||||
static void __init
|
||||
arv4525pw_init(void)
|
||||
{
|
||||
#define ARV4525PW_ATH_ADDR 0x3f0400
|
||||
#define ARV4525PW_MADWIFI_ADDR 0xb03f0400
|
||||
#define ARV4525PW_MAC_ADDR 0x3f0016
|
||||
|
||||
arv_load_nor(0x400000);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(arv4525pw_gpio_leds), arv4525pw_gpio_leds);
|
||||
gpio_request_array(arv4525pw_gpios, ARRAY_SIZE(arv4525pw_gpios));
|
||||
gpio_export(ARV4525PW_RELAY, false);
|
||||
gpio_export(ARV4525PW_PHYRESET, false);
|
||||
ltq_pci_data.clock = PCI_CLOCK_INT;
|
||||
ltq_register_pci(<q_pci_data);
|
||||
arv_register_ath5k(ARV4525PW_ATH_ADDR, ARV4525PW_MADWIFI_ADDR);
|
||||
ltq_register_ath5k(arv_ath5k_eeprom_data, arv_athxk_eeprom_mac);
|
||||
ltq_eth_data.mii_mode = PHY_INTERFACE_MODE_MII;
|
||||
arv_register_ethernet(ARV4525PW_MAC_ADDR);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV4525PW,
|
||||
"ARV4525PW",
|
||||
"ARV4525PW - Speedport W502V",
|
||||
arv4525pw_init);
|
||||
|
||||
static void __init
|
||||
arv7525pw_init(void)
|
||||
{
|
||||
#define ARV7525P_MAC_ADDR 0x3f0016
|
||||
|
||||
arv_load_nor(0x400000);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(arv4525pw_gpio_leds), arv4525pw_gpio_leds);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL,
|
||||
ARRAY_SIZE(arv7525pw_gpio_keys), arv7525pw_gpio_keys);
|
||||
ltq_pci_data.clock = PCI_CLOCK_INT;
|
||||
ltq_pci_data.gpio = PCI_GNT1 | PCI_EXIN1;
|
||||
ltq_pci_data.irq[14] = (INT_NUM_IM3_IRL0 + 31);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_eth_data.mii_mode = PHY_INTERFACE_MODE_MII;
|
||||
ltq_register_rt2x00("RT2860.eeprom", NULL);
|
||||
ltq_register_tapi();
|
||||
arv_register_ethernet(ARV7525P_MAC_ADDR);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV7525PW,
|
||||
"ARV7525PW",
|
||||
"ARV7525PW - Speedport W303V",
|
||||
arv7525pw_init);
|
||||
|
||||
static void __init
|
||||
arv7518pw_init(void)
|
||||
{
|
||||
#define ARV7518PW_EBU 0x2
|
||||
#define ARV7518PW_USB 14
|
||||
#define ARV7518PW_SWITCH_RESET 13
|
||||
#define ARV7518PW_ATH_ADDR 0x7f0400
|
||||
#define ARV7518PW_MAC_ADDR 0x7f0016
|
||||
|
||||
arv_load_nor(0x800000);
|
||||
ltq_register_gpio_ebu(ARV7518PW_EBU);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(arv7518pw_gpio_leds), arv7518pw_gpio_leds);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL,
|
||||
ARRAY_SIZE(arv7518pw_gpio_keys), arv7518pw_gpio_keys);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_tapi();
|
||||
xway_register_dwc(ARV7518PW_USB);
|
||||
arv_register_ethernet(ARV7518PW_MAC_ADDR);
|
||||
arv_register_ath9k(ARV7518PW_ATH_ADDR, ARV7518PW_MAC_ADDR);
|
||||
ltq_register_ath9k(arv_ath9k_eeprom_data, arv_athxk_eeprom_mac);
|
||||
ltq_pci_ath_fixup(14, arv_ath9k_eeprom_data);
|
||||
|
||||
gpio_request(ARV7518PW_SWITCH_RESET, "switch");
|
||||
gpio_direction_output(ARV7518PW_SWITCH_RESET, 1);
|
||||
gpio_export(ARV7518PW_SWITCH_RESET, 0);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV7518PW,
|
||||
"ARV7518PW",
|
||||
"ARV7518PW - ASTORIA",
|
||||
arv7518pw_init);
|
||||
|
||||
static void __init
|
||||
arv752dpw22_init(void)
|
||||
{
|
||||
#define ARV752DPW22_EBU 0x2
|
||||
#define ARV752DPW22_USB 100
|
||||
#define ARV752DPW22_RELAY 101
|
||||
#define ARV752DPW22_MAC_ADDR 0x7f0016
|
||||
|
||||
arv_load_nor(0x800000);
|
||||
ltq_register_gpio_ebu(ARV752DPW22_EBU);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(arv752dpw22_gpio_leds), arv752dpw22_gpio_leds);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL,
|
||||
ARRAY_SIZE(arv752dpw22_gpio_keys), arv752dpw22_gpio_keys);
|
||||
ltq_pci_data.irq[15] = (INT_NUM_IM3_IRL0 + 31);
|
||||
ltq_pci_data.gpio |= PCI_EXIN1 | PCI_REQ2;
|
||||
ltq_register_pci(<q_pci_data);
|
||||
xway_register_dwc(ARV752DPW22_USB);
|
||||
arv_register_ethernet(ARV752DPW22_MAC_ADDR);
|
||||
|
||||
gpio_request(ARV752DPW22_RELAY, "relay");
|
||||
gpio_set_value(ARV752DPW22_RELAY, 1);
|
||||
gpio_export(ARV752DPW22_RELAY, 0);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV752DPW22,
|
||||
"ARV752DPW22",
|
||||
"ARV752DPW22 - Arcor A803",
|
||||
arv752dpw22_init);
|
||||
|
||||
static void __init
|
||||
arv752dpw_init(void)
|
||||
{
|
||||
#define ARV752DPW22_EBU 0x2
|
||||
#define ARV752DPW22_USB 100
|
||||
#define ARV752DPW22_RELAY 101
|
||||
#define ARV752DPW22_MAC_ADDR 0x7f0016
|
||||
|
||||
arv_load_nor(0x800000);
|
||||
ltq_register_gpio_ebu(ARV752DPW22_EBU);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(arv752dpw22_gpio_leds), arv752dpw22_gpio_leds);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL, ARRAY_SIZE(arv752dpw22_gpio_keys), arv752dpw22_gpio_keys);
|
||||
ltq_pci_data.irq[14] = (INT_NUM_IM3_IRL0 + 31);
|
||||
ltq_pci_data.gpio |= PCI_EXIN1 | PCI_REQ2;
|
||||
ltq_register_pci(<q_pci_data);
|
||||
xway_register_dwc(ARV752DPW22_USB);
|
||||
ltq_register_rt2x00("RT2860.eeprom", NULL);
|
||||
arv_register_ethernet(ARV752DPW22_MAC_ADDR);
|
||||
gpio_request(ARV752DPW22_RELAY, "relay");
|
||||
gpio_set_value(ARV752DPW22_RELAY, 1);
|
||||
gpio_export(ARV752DPW22_RELAY, 0);
|
||||
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_ARV752DPW,
|
||||
"ARV752DPW",
|
||||
"ARV752DPW - Arcor A802",
|
||||
arv752dpw_init);
|
||||
@@ -0,0 +1,542 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2011 Andrej Vlašić
|
||||
* Copyright (C) 2011 Luka Perkov
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/ath5k_platform.h>
|
||||
#include <linux/ath9k_platform.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <irq.h>
|
||||
#include <lantiq_soc.h>
|
||||
#include <lantiq_platform.h>
|
||||
#include <dev-gpio-leds.h>
|
||||
#include <dev-gpio-buttons.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
//#include "dev-wifi-ath9k.h"
|
||||
#include "devices.h"
|
||||
#include "dev-dwc_otg.h"
|
||||
|
||||
#undef USE_BTHH_GPIO_INIT
|
||||
|
||||
// this reads certain data from u-boot if it's there
|
||||
#define USE_UBOOT_ENV_DATA
|
||||
|
||||
#define UBOOT_ENV_OFFSET 0x040000
|
||||
#define UBOOT_ENV_SIZE 0x010000
|
||||
|
||||
#ifdef NAND_ORGLAYOUT
|
||||
// this is only here for reference
|
||||
// definition of NAND flash area
|
||||
static struct mtd_partition bthomehubv2b_nand_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "ART",
|
||||
.offset = 0x0000000,
|
||||
.size = 0x0004000,
|
||||
},
|
||||
{
|
||||
.name = "image1",
|
||||
.offset = 0x0004000,
|
||||
.size = 0x0E00000,
|
||||
},
|
||||
{
|
||||
.name = "unknown1",
|
||||
.offset = 0x0E04000,
|
||||
.size = 0x00FC000,
|
||||
},
|
||||
{
|
||||
.name = "image2",
|
||||
.offset = 0x0F00000,
|
||||
.size = 0x0E00000,
|
||||
},
|
||||
{
|
||||
.name = "unknown2",
|
||||
.offset = 0x1D00000,
|
||||
.size = 0x0300000,
|
||||
},
|
||||
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef NAND_KEEPOPENRG
|
||||
// this allows both firmwares to co-exist
|
||||
|
||||
static struct mtd_partition bthomehubv2b_nand_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "art",
|
||||
.offset = 0x0000000,
|
||||
.size = 0x0004000,
|
||||
},
|
||||
{
|
||||
.name = "Image1",
|
||||
.offset = 0x0004000,
|
||||
.size = 0x0E00000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x0E04000,
|
||||
.size = 0x11fC000,
|
||||
},
|
||||
{
|
||||
.name = "wholeflash",
|
||||
.offset = 0x0000000,
|
||||
.size = 0x2000000,
|
||||
},
|
||||
|
||||
};
|
||||
#endif
|
||||
|
||||
// this gives more jffs2 by overwriting openrg
|
||||
|
||||
static struct mtd_partition bthomehubv2b_nand_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "art",
|
||||
.offset = 0x0000000,
|
||||
.size = 0x0004000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x0004000,
|
||||
.size = 0x1ffC000,
|
||||
},
|
||||
{
|
||||
.name = "wholeflash",
|
||||
.offset = 0x0000000,
|
||||
.size = 0x2000000,
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
extern void __init xway_register_nand(struct mtd_partition *parts, int count);
|
||||
|
||||
// end BTHH_USE_NAND
|
||||
|
||||
static struct gpio_led
|
||||
bthomehubv2b_gpio_leds[] __initdata = {
|
||||
|
||||
{ .name = "soc:orange:upgrading", .gpio = 213, },
|
||||
{ .name = "soc:orange:phone", .gpio = 214, },
|
||||
{ .name = "soc:blue:phone", .gpio = 215, },
|
||||
{ .name = "soc:orange:wireless", .gpio = 216, },
|
||||
{ .name = "soc:blue:wireless", .gpio = 217, },
|
||||
{ .name = "soc:red:broadband", .gpio = 218, },
|
||||
{ .name = "soc:orange:broadband", .gpio = 219, },
|
||||
{ .name = "soc:blue:broadband", .gpio = 220, },
|
||||
{ .name = "soc:red:power", .gpio = 221, },
|
||||
{ .name = "soc:orange:power", .gpio = 222, },
|
||||
{ .name = "soc:blue:power", .gpio = 223, },
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
bthomehubv2b_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "restart",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_0,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 2,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "findhandset",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_1,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 15,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "wps",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_2,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 22,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
// definition of NOR flash area - as per original.
|
||||
static struct mtd_partition bthomehubv2b_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x000000,
|
||||
.size = 0x040000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = UBOOT_ENV_OFFSET,
|
||||
.size = UBOOT_ENV_SIZE,
|
||||
},
|
||||
{
|
||||
.name = "rg_conf_1",
|
||||
.offset = 0x050000,
|
||||
.size = 0x010000,
|
||||
},
|
||||
{
|
||||
.name = "rg_conf_2",
|
||||
.offset = 0x060000,
|
||||
.size = 0x010000,
|
||||
},
|
||||
{
|
||||
.name = "rg_conf_factory",
|
||||
.offset = 0x070000,
|
||||
.size = 0x010000,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
/* nor flash */
|
||||
/* bt homehubv2b has a very small nor flash */
|
||||
/* so make it look for a small one, else we get a lot of alias chips identified - */
|
||||
/* not a bug problem, but fills the logs. */
|
||||
static struct resource bthhv2b_nor_resource =
|
||||
MEM_RES("nor", LTQ_FLASH_START, 0x80000);
|
||||
|
||||
static struct platform_device ltq_nor = {
|
||||
.name = "ltq_nor",
|
||||
.resource = &bthhv2b_nor_resource,
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
static void __init bthhv2b_register_nor(struct physmap_flash_data *data)
|
||||
{
|
||||
ltq_nor.dev.platform_data = data;
|
||||
platform_device_register(<q_nor);
|
||||
}
|
||||
|
||||
static struct physmap_flash_data bthomehubv2b_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(bthomehubv2b_partitions),
|
||||
.parts = bthomehubv2b_partitions,
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_INT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = { [14] = INT_NUM_IM0_IRL0 + 22, },
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_MII,
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
static char __init *get_uboot_env_var(char *haystack, int haystack_len, char *needle, int needle_len) {
|
||||
int i;
|
||||
for (i = 0; i <= haystack_len - needle_len; i++) {
|
||||
if (memcmp(haystack + i, needle, needle_len) == 0) {
|
||||
return haystack + i + needle_len;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* bthomehubv2b_parse_hex_* are not uniq. in arm/orion there are also duplicates:
|
||||
* dns323_parse_hex_*
|
||||
* TODO: one day write a patch for this :)
|
||||
*/
|
||||
static int __init bthomehubv2b_parse_hex_nibble(char n) {
|
||||
if (n >= '0' && n <= '9')
|
||||
return n - '0';
|
||||
|
||||
if (n >= 'A' && n <= 'F')
|
||||
return n - 'A' + 10;
|
||||
|
||||
if (n >= 'a' && n <= 'f')
|
||||
return n - 'a' + 10;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int __init bthomehubv2b_parse_hex_byte(const char *b) {
|
||||
int hi;
|
||||
int lo;
|
||||
|
||||
hi = bthomehubv2b_parse_hex_nibble(b[0]);
|
||||
lo = bthomehubv2b_parse_hex_nibble(b[1]);
|
||||
|
||||
if (hi < 0 || lo < 0)
|
||||
return -1;
|
||||
|
||||
return (hi << 4) | lo;
|
||||
}
|
||||
|
||||
static int __init bthomehubv2b_register_ethernet(void) {
|
||||
u_int8_t addr[6];
|
||||
int i;
|
||||
char *mac = "01:02:03:04:05:06";
|
||||
int gotmac = 0;
|
||||
char *boardid = "BTHHV2B";
|
||||
int gotboardid = 0;
|
||||
|
||||
char *uboot_env_page;
|
||||
uboot_env_page = ioremap(LTQ_FLASH_START + UBOOT_ENV_OFFSET, UBOOT_ENV_SIZE);
|
||||
if (uboot_env_page)
|
||||
{
|
||||
char *Data = NULL;
|
||||
Data = get_uboot_env_var(uboot_env_page, UBOOT_ENV_SIZE, "\0ethaddr=", 9);
|
||||
if (Data)
|
||||
{
|
||||
mac = Data;
|
||||
}
|
||||
|
||||
Data = get_uboot_env_var(uboot_env_page, UBOOT_ENV_SIZE, "\0boardid=", 9);
|
||||
|
||||
if (Data)
|
||||
boardid = Data;
|
||||
}
|
||||
else
|
||||
{
|
||||
printk("bthomehubv2b: Failed to get uboot_env_page");
|
||||
}
|
||||
|
||||
if (!mac) {
|
||||
goto error_fail;
|
||||
}
|
||||
|
||||
if (!boardid) {
|
||||
goto error_fail;
|
||||
}
|
||||
|
||||
/* Sanity check the string we're looking at */
|
||||
for (i = 0; i < 5; i++) {
|
||||
if (*(mac + (i * 3) + 2) != ':') {
|
||||
goto error_fail;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
int byte;
|
||||
byte = bthomehubv2b_parse_hex_byte(mac + (i * 3));
|
||||
if (byte < 0) {
|
||||
goto error_fail;
|
||||
}
|
||||
addr[i] = byte;
|
||||
}
|
||||
|
||||
if (gotmac)
|
||||
printk("bthomehubv2b: Found ethernet MAC address: ");
|
||||
else
|
||||
printk("bthomehubv2b: using default MAC (pls set ethaddr in u-boot): ");
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
printk("%.2x%s", addr[i], (i < 5) ? ":" : ".\n");
|
||||
|
||||
memcpy(<q_eth_data.mac.sa_data, addr, 6);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
|
||||
//memcpy(&bthomehubv2b_ath5k_eeprom_mac, addr, 6);
|
||||
//bthomehubv2b_ath5k_eeprom_mac[5]++;
|
||||
|
||||
if (gotboardid)
|
||||
printk("bthomehubv2b: Board id is %s.", boardid);
|
||||
else
|
||||
printk("bthomehubv2b: Default Board id is %s.", boardid);
|
||||
|
||||
if (strncmp(boardid, "BTHHV2B", 7) == 0) {
|
||||
// read in dev-wifi-ath9k
|
||||
//memcpy(&bthomehubv2b_ath5k_eeprom_data, sx763_eeprom_data, ATH5K_PLAT_EEP_MAX_WORDS);
|
||||
}
|
||||
else {
|
||||
printk("bthomehubv2b: Board id is unknown, fix uboot_env data.");
|
||||
}
|
||||
|
||||
|
||||
// should not unmap while we are using the ram?
|
||||
if (uboot_env_page)
|
||||
iounmap(uboot_env_page);
|
||||
|
||||
return 0;
|
||||
|
||||
error_fail:
|
||||
if (uboot_env_page)
|
||||
iounmap(uboot_env_page);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
#define PORTA2_HW_PASS1 0
|
||||
#define PORTA2_HW_PASS1_SC14480 1
|
||||
#define PORTA2_HW_PASS2 2
|
||||
|
||||
int porta2_hw_revision = -1;
|
||||
EXPORT_SYMBOL(porta2_hw_revision);
|
||||
|
||||
#define LTQ_GPIO_OUT 0x00
|
||||
#define LTQ_GPIO_IN 0x04
|
||||
#define LTQ_GPIO_DIR 0x08
|
||||
#define LTQ_GPIO_ALTSEL0 0x0C
|
||||
#define LTQ_GPIO_ALTSEL1 0x10
|
||||
#define LTQ_GPIO_OD 0x14
|
||||
#define LTQ_GPIO_PUDSEL 0x1C
|
||||
#define LTQ_GPIO_PUDEN 0x20
|
||||
|
||||
#ifdef USE_BTHH_GPIO_INIT
|
||||
static void bthomehubv2b_board_prom_init(void)
|
||||
{
|
||||
int revision = 0;
|
||||
unsigned int gpio = 0;
|
||||
void __iomem *mem = ioremap(LTQ_GPIO0_BASE_ADDR, LTQ_GPIO_SIZE*2);
|
||||
|
||||
#define DANUBE_GPIO_P0_OUT (unsigned short *)(mem + LTQ_GPIO_OUT)
|
||||
#define DANUBE_GPIO_P0_IN (unsigned short *)(mem + LTQ_GPIO_IN)
|
||||
#define DANUBE_GPIO_P0_DIR (unsigned short *)(mem + LTQ_GPIO_DIR)
|
||||
#define DANUBE_GPIO_P0_ALTSEL0 (unsigned short *)(mem + LTQ_GPIO_ALTSEL0)
|
||||
#define DANUBE_GPIO_P0_ALTSEL1 (unsigned short *)(mem + LTQ_GPIO_ALTSEL1)
|
||||
|
||||
#define DANUBE_GPIO_P1_OUT (unsigned short *)(mem + LTQ_GPIO_SIZE + LTQ_GPIO_OUT)
|
||||
#define DANUBE_GPIO_P1_IN (unsigned short *)(mem + LTQ_GPIO_SIZE + LTQ_GPIO_IN)
|
||||
#define DANUBE_GPIO_P1_DIR (unsigned short *)(mem + LTQ_GPIO_SIZE + LTQ_GPIO_DIR)
|
||||
#define DANUBE_GPIO_P1_ALTSEL0 (unsigned short *)(mem + LTQ_GPIO_SIZE + LTQ_GPIO_ALTSEL0)
|
||||
#define DANUBE_GPIO_P1_ALTSEL1 (unsigned short *)(mem + LTQ_GPIO_SIZE + LTQ_GPIO_ALTSEL1)
|
||||
#define DANUBE_GPIO_P1_OD (unsigned short *)(mem + LTQ_GPIO_SIZE + LTQ_GPIO_OD)
|
||||
|
||||
printk("About to sense board using GPIOs at %8.8X\n", (unsigned int)mem);
|
||||
|
||||
|
||||
/* First detect HW revision of the board. For that we need to set the GPIO
|
||||
* lines according to table 7.2.1/7.2.2 in HSI */
|
||||
*DANUBE_GPIO_P0_OUT = 0x0200;
|
||||
*DANUBE_GPIO_P0_DIR = 0x2610;
|
||||
*DANUBE_GPIO_P0_ALTSEL0 = 0x7812;
|
||||
*DANUBE_GPIO_P0_ALTSEL1 = 0x0000;
|
||||
|
||||
*DANUBE_GPIO_P1_OUT = 0x7008;
|
||||
*DANUBE_GPIO_P1_DIR = 0xF3AE;
|
||||
*DANUBE_GPIO_P1_ALTSEL0 = 0x83A7;
|
||||
*DANUBE_GPIO_P1_ALTSEL1 = 0x0400;
|
||||
|
||||
gpio = (*DANUBE_GPIO_P0_IN & 0xFFFF) |
|
||||
((*DANUBE_GPIO_P1_IN & 0xFFFF) << 16);
|
||||
|
||||
revision |= (gpio & (1 << 27)) ? (1 << 0) : 0;
|
||||
revision |= (gpio & (1 << 20)) ? (1 << 1) : 0;
|
||||
revision |= (gpio & (1 << 8)) ? (1 << 2) : 0;
|
||||
revision |= (gpio & (1 << 6)) ? (1 << 3) : 0;
|
||||
revision |= (gpio & (1 << 5)) ? (1 << 4) : 0;
|
||||
revision |= (gpio & (1 << 0)) ? (1 << 5) : 0;
|
||||
|
||||
porta2_hw_revision = revision;
|
||||
printk("PORTA2: detected HW revision %d\n", revision);
|
||||
|
||||
/* Set GPIO lines according to HW revision. */
|
||||
/* !!! Note that we are setting SPI_CS5 (GPIO 9) to be GPIO out with value
|
||||
* of HIGH since the FXO does not use the SPI CS mechanism, it does it
|
||||
* manually by controlling the GPIO line. We need the CS line to be disabled
|
||||
* (HIGH) until needed since it will intefere with other devices on the SPI
|
||||
* bus. */
|
||||
*DANUBE_GPIO_P0_OUT = 0x0200;
|
||||
/*
|
||||
* During the manufacturing process a different machine takes over uart0
|
||||
* so set it as input (so it wouldn't drive the line)
|
||||
*/
|
||||
#define cCONFIG_SHC_BT_MFG_TEST 0
|
||||
*DANUBE_GPIO_P0_DIR = 0x2671 | (cCONFIG_SHC_BT_MFG_TEST ? 0 : (1 << 12));
|
||||
|
||||
if (revision == PORTA2_HW_PASS1_SC14480 || revision == PORTA2_HW_PASS2)
|
||||
*DANUBE_GPIO_P0_ALTSEL0 = 0x7873;
|
||||
else
|
||||
*DANUBE_GPIO_P0_ALTSEL0 = 0x3873;
|
||||
|
||||
*DANUBE_GPIO_P0_ALTSEL1 = 0x0001;
|
||||
|
||||
|
||||
//###################################################################################
|
||||
// Register values before patch
|
||||
// P1_ALTSEL0 = 0x83A7
|
||||
// P1_ALTSEL1 = 0x0400
|
||||
// P1_OU T = 0x7008
|
||||
// P1_DIR = 0xF3AE
|
||||
// P1_OD = 0xE3Fc
|
||||
printk("\nApplying Patch for CPU1 IRQ Issue\n");
|
||||
*DANUBE_GPIO_P1_ALTSEL0 &= ~(1<<12); // switch P1.12 (GPIO28) to GPIO functionality
|
||||
*DANUBE_GPIO_P1_ALTSEL1 &= ~(1<<12); // switch P1.12 (GPIO28) to GPIO functionality
|
||||
*DANUBE_GPIO_P1_OUT &= ~(1<<12); // set P1.12 (GPIO28) to 0
|
||||
*DANUBE_GPIO_P1_DIR |= (1<<12); // configure P1.12 (GPIO28) as output
|
||||
*DANUBE_GPIO_P1_OD |= (1<<12); // activate Push/Pull mode
|
||||
udelay(100); // wait a little bit (100us)
|
||||
*DANUBE_GPIO_P1_OD &= ~(1<<12); // switch back from Push/Pull to Open Drain
|
||||
// important: before! setting output to 1 (3,3V) the mode must be switched
|
||||
// back to Open Drain because the reset pin of the SC14488 is internally
|
||||
// pulled to 1,8V
|
||||
*DANUBE_GPIO_P1_OUT |= (1<<12); // set output P1.12 (GPIO28) to 1
|
||||
// Register values after patch, should be the same as before
|
||||
// P1_ALTSEL0 = 0x83A7
|
||||
// P1_ALTSEL1 = 0x0400
|
||||
// P1_OUT = 0x7008
|
||||
// P1_DIR = 0xF3AE
|
||||
// P1_OD = 0xE3Fc
|
||||
//###################################################################################
|
||||
|
||||
|
||||
*DANUBE_GPIO_P1_OUT = 0x7008;
|
||||
*DANUBE_GPIO_P1_DIR = 0xEBAE | (revision == PORTA2_HW_PASS2 ? 0x1000 : 0);
|
||||
*DANUBE_GPIO_P1_ALTSEL0 = 0x8BA7;
|
||||
*DANUBE_GPIO_P1_ALTSEL1 = 0x0400;
|
||||
|
||||
iounmap(mem);
|
||||
}
|
||||
#endif
|
||||
static void __init bthomehubv2b_init(void) {
|
||||
#define bthomehubv2b_USB 13
|
||||
|
||||
// read the board version
|
||||
#ifdef USE_BTHH_GPIO_INIT
|
||||
bthomehubv2b_board_prom_init();
|
||||
#endif
|
||||
|
||||
// register extra GPPOs used by LEDs as GPO 0x200+
|
||||
ltq_register_gpio_stp();
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(bthomehubv2b_gpio_leds), bthomehubv2b_gpio_leds);
|
||||
bthhv2b_register_nor(&bthomehubv2b_flash_data);
|
||||
xway_register_nand(bthomehubv2b_nand_partitions, ARRAY_SIZE(bthomehubv2b_nand_partitions));
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_tapi();
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL, ARRAY_SIZE(bthomehubv2b_gpio_keys), bthomehubv2b_gpio_keys);
|
||||
// ltq_register_ath9k();
|
||||
xway_register_dwc(bthomehubv2b_USB);
|
||||
bthomehubv2b_register_ethernet();
|
||||
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_BTHOMEHUBV2BOPENRG,
|
||||
"BTHOMEHUBV2BOPENRG",
|
||||
"BTHOMEHUBV2B - BT Homehub V2.0 Type B with OpenRG image retained",
|
||||
bthomehubv2b_init);
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_BTHOMEHUBV2B,
|
||||
"BTHOMEHUBV2B",
|
||||
"BTHOMEHUBV2B - BT Homehub V2.0 Type B",
|
||||
bthomehubv2b_init);
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <lantiq.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
|
||||
static struct mtd_partition easy50601_partitions[] = {
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x10000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x20000,
|
||||
.size = 0x3d0000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data easy50601_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(easy50601_partitions),
|
||||
.parts = easy50601_partitions,
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = -1, /* use EPHY */
|
||||
};
|
||||
|
||||
static void __init
|
||||
easy50601_init(void)
|
||||
{
|
||||
ltq_register_nor(&easy50601_flash_data);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LTQ_MACH_EASY50601,
|
||||
"EASY50601",
|
||||
"EASY50601 Eval Board",
|
||||
easy50601_init);
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <irq.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
|
||||
static struct mtd_partition easy50712_partitions[] = {
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x10000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x20000,
|
||||
.size = 0x3d0000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data easy50712_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(easy50712_partitions),
|
||||
.parts = easy50712_partitions,
|
||||
};
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_INT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = {
|
||||
[14] = INT_NUM_IM0_IRL0 + 22,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_MII,
|
||||
};
|
||||
|
||||
static void __init
|
||||
easy50712_init(void)
|
||||
{
|
||||
ltq_register_gpio_stp();
|
||||
ltq_register_nor(&easy50712_flash_data);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
ltq_register_tapi();
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LTQ_MACH_EASY50712,
|
||||
"EASY50712",
|
||||
"EASY50712 Eval Board",
|
||||
easy50712_init);
|
||||
115
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-fritz_ar9.c
Normal file
115
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-fritz_ar9.c
Normal file
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/spi/spi_gpio.h>
|
||||
#include <linux/spi/flash.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <irq.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
#include "dev-ifxhcd.h"
|
||||
#include "dev-gpio-leds.h"
|
||||
#include "dev-gpio-buttons.h"
|
||||
|
||||
static struct mtd_partition fritz7320_partitions[] = {
|
||||
{
|
||||
.name = "urlader",
|
||||
.offset = 0x0,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x20000,
|
||||
.size = 0xf60000,
|
||||
},
|
||||
{
|
||||
.name = "tffs (1)",
|
||||
.offset = 0xf80000,
|
||||
.size = 0x40000,
|
||||
},
|
||||
{
|
||||
.name = "tffs (2)",
|
||||
.offset = 0xfc0000,
|
||||
.size = 0x40000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data fritz7320_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(fritz7320_partitions),
|
||||
.parts = fritz7320_partitions,
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
fritz7320_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:green:power", .gpio = 44, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:internet", .gpio = 47, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:dect", .gpio = 38, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:wlan", .gpio = 37, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:dual1", .gpio = 35, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:dual2", .gpio = 45, .active_low = 1, .default_trigger = "default-on" },
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
fritz7320_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "wifi",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_0,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 1,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "dect",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_1,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 2,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_INT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = {
|
||||
[14] = INT_NUM_IM0_IRL0 + 22,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
static int usb_pins[2] = { 50, 51 };
|
||||
|
||||
static void __init
|
||||
fritz7320_init(void)
|
||||
{
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL,
|
||||
ARRAY_SIZE(fritz7320_gpio_keys), fritz7320_gpio_keys);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(fritz7320_gpio_leds), fritz7320_gpio_leds);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
ltq_register_nor(&fritz7320_flash_data);
|
||||
xway_register_hcd(usb_pins);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_FRITZ7320,
|
||||
"FRITZ7320",
|
||||
"FRITZ!BOX 7320",
|
||||
fritz7320_init);
|
||||
164
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-fritz_vr9.c
Normal file
164
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-fritz_vr9.c
Normal file
@@ -0,0 +1,164 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/spi/spi_gpio.h>
|
||||
#include <linux/spi/flash.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <irq.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
#include "dev-ifxhcd.h"
|
||||
#include "dev-gpio-leds.h"
|
||||
#include "dev-gpio-buttons.h"
|
||||
|
||||
static struct mtd_partition fritz3370_partitions[] = {
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x0,
|
||||
.size = 0x400000,
|
||||
},
|
||||
{
|
||||
.name = "filesystem",
|
||||
.offset = 0x400000,
|
||||
.size = 0x3000000,
|
||||
},
|
||||
{
|
||||
.name = "reserved-kernel",
|
||||
.offset = 0x3400000,
|
||||
.size = 0x400000,
|
||||
},
|
||||
{
|
||||
.name = "reserved",
|
||||
.offset = 0x3800000,
|
||||
.size = 0x3000000,
|
||||
},
|
||||
{
|
||||
.name = "config",
|
||||
.offset = 0x6800000,
|
||||
.size = 0x200000,
|
||||
},
|
||||
{
|
||||
.name = "nand-filesystem",
|
||||
.offset = 0x6a00000,
|
||||
.size = 0x1600000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition spi_flash_partitions[] = {
|
||||
{
|
||||
.name = "urlader",
|
||||
.offset = 0x0,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "tffs",
|
||||
.offset = 0x20000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "tffs",
|
||||
.offset = 0x30000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
fritz3370_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:green:1", .gpio = 32, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:2", .gpio = 33, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:red:3", .gpio = 34, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:4", .gpio = 35, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:5", .gpio = 36, .active_low = 1, .default_trigger = "default-on" },
|
||||
{ .name = "soc:green:6", .gpio = 47, .active_low = 1, .default_trigger = "default-on" },
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
fritz3370_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "wifi",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_0,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 29,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
static int usb_pins[2] = { 5, 14 };
|
||||
|
||||
#define SPI_GPIO_MRST 16
|
||||
#define SPI_GPIO_MTSR 17
|
||||
#define SPI_GPIO_CLK 18
|
||||
#define SPI_GPIO_CS0 10
|
||||
|
||||
static struct spi_gpio_platform_data spi_gpio_data = {
|
||||
.sck = SPI_GPIO_CLK,
|
||||
.mosi = SPI_GPIO_MTSR,
|
||||
.miso = SPI_GPIO_MRST,
|
||||
.num_chipselect = 2,
|
||||
};
|
||||
|
||||
static struct platform_device spi_gpio_device = {
|
||||
.name = "spi_gpio",
|
||||
.dev.platform_data = &spi_gpio_data,
|
||||
};
|
||||
|
||||
static struct flash_platform_data spi_flash_data = {
|
||||
.name = "SPL",
|
||||
.parts = spi_flash_partitions,
|
||||
.nr_parts = ARRAY_SIZE(spi_flash_partitions),
|
||||
};
|
||||
|
||||
static struct spi_board_info spi_flash __initdata = {
|
||||
.modalias = "m25p80",
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.max_speed_hz = 10 * 1000 * 1000,
|
||||
.mode = SPI_MODE_3,
|
||||
.chip_select = 0,
|
||||
.controller_data = (void *) SPI_GPIO_CS0,
|
||||
.platform_data = &spi_flash_data
|
||||
};
|
||||
|
||||
static void __init
|
||||
spi_gpio_init(void)
|
||||
{
|
||||
spi_register_board_info(&spi_flash, 1);
|
||||
platform_device_register(&spi_gpio_device);
|
||||
}
|
||||
|
||||
static void __init
|
||||
fritz3370_init(void)
|
||||
{
|
||||
spi_gpio_init();
|
||||
platform_device_register_simple("pcie-xway", 0, NULL, 0);
|
||||
xway_register_nand(fritz3370_partitions, ARRAY_SIZE(fritz3370_partitions));
|
||||
xway_register_hcd(usb_pins);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(fritz3370_gpio_leds), fritz3370_gpio_leds);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL,
|
||||
ARRAY_SIZE(fritz3370_gpio_keys), fritz3370_gpio_keys);
|
||||
ltq_register_vrx200(<q_eth_data);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_FRITZ3370,
|
||||
"FRITZ3370",
|
||||
"FRITZ!BOX 3370",
|
||||
fritz3370_init);
|
||||
168
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-gigasx76x.c
Normal file
168
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-gigasx76x.c
Normal file
@@ -0,0 +1,168 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2011 Andrej Vlašić
|
||||
* Copyright (C) 2011 Luka Perkov
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include <irq.h>
|
||||
#include <lantiq_soc.h>
|
||||
#include <lantiq_platform.h>
|
||||
#include <dev-gpio-leds.h>
|
||||
#include <dev-gpio-buttons.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "dev-wifi-athxk.h"
|
||||
#include "devices.h"
|
||||
#include "dev-dwc_otg.h"
|
||||
|
||||
#include "mach-gigasx76x.h"
|
||||
|
||||
static u8 ltq_ethaddr[6] = { 0 };
|
||||
|
||||
static int __init
|
||||
setup_ethaddr(char *str)
|
||||
{
|
||||
if (!mac_pton(str, ltq_ethaddr))
|
||||
memset(ltq_ethaddr, 0, 6);
|
||||
return 0;
|
||||
}
|
||||
__setup("ethaddr=", setup_ethaddr);
|
||||
|
||||
|
||||
enum {
|
||||
UNKNOWN = 0,
|
||||
SX761,
|
||||
SX762,
|
||||
SX763,
|
||||
};
|
||||
static u8 board __initdata = SX763;
|
||||
|
||||
static int __init
|
||||
setup_board(char *str)
|
||||
{
|
||||
if (!strcmp(str, "sx761"))
|
||||
board = SX761;
|
||||
else if (!strcmp(str, "sx762"))
|
||||
board = SX762;
|
||||
else if (!strcmp(str, "sx763"))
|
||||
board = SX763;
|
||||
else
|
||||
board = UNKNOWN;
|
||||
return 0;
|
||||
}
|
||||
__setup("board=", setup_board);
|
||||
|
||||
static struct mtd_partition gigasx76x_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x10000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x20000,
|
||||
.size = 0x7e0000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
gigasx76x_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:green:voip", .gpio = 216, },
|
||||
{ .name = "soc:green:adsl", .gpio = 217, },
|
||||
{ .name = "soc:green:usb", .gpio = 218, },
|
||||
{ .name = "soc:green:wifi", .gpio = 219, },
|
||||
{ .name = "soc:green:phone2", .gpio = 220, },
|
||||
{ .name = "soc:green:phone1", .gpio = 221, },
|
||||
{ .name = "soc:green:line", .gpio = 222, },
|
||||
{ .name = "soc:green:online", .gpio = 223, },
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
gigasx76x_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "wps",
|
||||
.type = EV_KEY,
|
||||
.code = KEY_WPS_BUTTON,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 22,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "reset",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_0,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 14,
|
||||
.active_low = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data gigasx76x_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(gigasx76x_partitions),
|
||||
.parts = gigasx76x_partitions,
|
||||
};
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_INT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = { [14] = INT_NUM_IM0_IRL0 + 22, },
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_MII,
|
||||
};
|
||||
|
||||
static void __init
|
||||
gigasx76x_init(void)
|
||||
{
|
||||
#define GIGASX76X_USB 29
|
||||
|
||||
ltq_register_gpio_stp();
|
||||
ltq_register_nor(&gigasx76x_flash_data);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
ltq_register_tapi();
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(gigasx76x_gpio_leds), gigasx76x_gpio_leds);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL, ARRAY_SIZE(gigasx76x_gpio_keys), gigasx76x_gpio_keys);
|
||||
xway_register_dwc(GIGASX76X_USB);
|
||||
|
||||
if (!is_valid_ether_addr(ltq_ethaddr))
|
||||
random_ether_addr(ltq_ethaddr);
|
||||
|
||||
memcpy(<q_eth_data.mac.sa_data, ltq_ethaddr, 6);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
if (board == SX762)
|
||||
ltq_register_ath5k(sx762_eeprom_data, ltq_ethaddr);
|
||||
else
|
||||
ltq_register_ath5k(sx763_eeprom_data, ltq_ethaddr);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_GIGASX76X,
|
||||
"GIGASX76X",
|
||||
"GIGASX76X - Gigaset SX761,SX762,SX763",
|
||||
gigasx76x_init);
|
||||
210
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-gigasx76x.h
Normal file
210
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-gigasx76x.h
Normal file
@@ -0,0 +1,210 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2011 Andrej Vlašić
|
||||
* Copyright (C) 2011 Luka Perkov
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _MACH_GIGASX76X_H__
|
||||
#define _MACH_GIGASX76X_H__
|
||||
|
||||
#include <linux/ath5k_platform.h>
|
||||
|
||||
static u16 sx763_eeprom_data[ATH5K_PLAT_EEP_MAX_WORDS] =
|
||||
{
|
||||
0x0013,0x168c,0x0200,0x0001,0x0000,0x5001,0x0000,0x2051,0x2051,0x1c0a,0x0100,
|
||||
0x0000,0x01c2,0x0002,0xc606,0x0001,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf165,0x7fbe,0x0003,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x5aa5,0x0000,0x0000,0x0313,0x4943,
|
||||
0x2053,0x7104,0x1202,0x0400,0x0306,0x0001,0x0000,0x0500,0x410e,0x39b1,0x1eb5,
|
||||
0x4e2d,0x3056,0xffff,0xe902,0x0700,0x0106,0x0000,0x0100,0x1500,0x0752,0x4101,
|
||||
0x6874,0x7265,0x736f,0x4320,0x6d6f,0x756d,0x696e,0x6163,0x6974,0x6e6f,0x2c73,
|
||||
0x4920,0x636e,0x002e,0x5241,0x3035,0x3130,0x302d,0x3030,0x2d30,0x3030,0x3030,
|
||||
0x5700,0x7269,0x6c65,0x7365,0x2073,0x414c,0x204e,0x6552,0x6566,0x6572,0x636e,
|
||||
0x2065,0x6143,0x6472,0x3000,0x0030,0x00ff,0x2100,0x0602,0x2201,0x0205,0x8d80,
|
||||
0x005b,0x0522,0x4002,0x8954,0x2200,0x0205,0x1b00,0x00b7,0x0522,0x8002,0x12a8,
|
||||
0x2201,0x0205,0x3600,0x016e,0x0522,0x0002,0x2551,0x2202,0x0205,0x6c00,0x02dc,
|
||||
0x0522,0x8002,0x37f9,0x2203,0x0205,0xa200,0x044a,0x0222,0x0803,0x0822,0x0604,
|
||||
0x0300,0xbe7f,0x65f1,0x0222,0x0105,0x00ff,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0x0037,0x971f,0x5003,0x9a66,0x0001,0x81c4,0x016a,
|
||||
0x02ff,0x84ff,0x15a3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x2d2c,0x0000,0x0000,0x0000,0x0000,0xe028,0xa492,0x1c00,
|
||||
0x000e,0xb8ca,0x0013,0x0000,0x0000,0x6b4b,0xc059,0x1571,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x2370,0x00a5,0x9618,0x419a,0x68a2,0xda35,0x001c,0x0007,0xb0ff,0x01b5,0x0000,
|
||||
0x0000,0xff70,0x19ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x3170,0x00a5,0x9618,0x419a,0x68a2,0xda35,
|
||||
0x001c,0x000e,0xb0ff,0x21b5,0x0000,0x2fd8,0xff70,0x1226,0x19ff,0x07be,0x6201,
|
||||
0x032e,0x0587,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1112,
|
||||
0x1441,0x4231,0x3234,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000,0x0000,0x8000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4d31,0x7f54,0x3c93,0x1205,0x1931,
|
||||
0x492d,0x7f50,0x3c93,0x0e01,0x192d,0x0070,0x0000,0x8140,0x724b,0x2ba9,0x3a09,
|
||||
0x99d9,0x1949,0x0070,0x0000,0x80e0,0x624a,0x2af8,0x35c7,0x9d47,0x1938,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x7082,0x0820,0xb882,0x0820,0x7092,0x28a0,0x8992,
|
||||
0x28a0,0xa292,0x28a0,0x70a2,0xa7ac,0x0000,0x0000,0x2464,0x6424,0x0000,0x0000,
|
||||
0x70a2,0xa7ac,0x0000,0x0000,0x2464,0x6424,0x0000,0x0000,0x8989,0x0000,0x0000,
|
||||
0x0000,0x2424,0x0000,0x0000,0x0000,0x7075,0xa2ac,0xb800,0x0000,0x2464,0x2424,
|
||||
0x2400,0x0000,0x7075,0xa2ac,0x0000,0x0000,0x2464,0x2424,0x0000,0x0000,0x7075,
|
||||
0xa7ac,0x0000,0x0000,0x2464,0x6424,0x0000,0x0000,0x7075,0xa7ac,0x0000,0x0000,
|
||||
0x2464,0x6424,0x0000,0x0000,0x8989,0x0000,0x0000,0x0000,0x2424,0x0000,0x0000,
|
||||
0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff};
|
||||
|
||||
static u16 sx762_eeprom_data[ATH5K_PLAT_EEP_MAX_WORDS] =
|
||||
{
|
||||
0x001a,0x168c,0x0200,0x0001,0x0000,0x5001,0x0000,0x2051,0x2051,0x1c0a,0x0100,
|
||||
0x0000,0x01c2,0x0002,0xc606,0x0001,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xf165,0x7fbe,0x0003,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x5aa5,0x0000,0x0000,0x0313,0x4943,
|
||||
0x2053,0x7104,0x1202,0x0400,0x0306,0x0001,0x0000,0x0500,0x410e,0x39b1,0x1eb5,
|
||||
0x4e2d,0x3056,0xffff,0xe902,0x0700,0x0106,0x0000,0x0100,0x1500,0x0752,0x4101,
|
||||
0x6874,0x7265,0x736f,0x4320,0x6d6f,0x756d,0x696e,0x6163,0x6974,0x6e6f,0x2c73,
|
||||
0x4920,0x636e,0x002e,0x5241,0x3035,0x3130,0x302d,0x3030,0x2d30,0x3030,0x3030,
|
||||
0x5700,0x7269,0x6c65,0x7365,0x2073,0x414c,0x204e,0x6552,0x6566,0x6572,0x636e,
|
||||
0x2065,0x6143,0x6472,0x3000,0x0030,0x00ff,0x2100,0x0602,0x2201,0x0205,0x8d80,
|
||||
0x005b,0x0522,0x4002,0x8954,0x2200,0x0205,0x1b00,0x00b7,0x0522,0x8002,0x12a8,
|
||||
0x2201,0x0205,0x3600,0x016e,0x0522,0x0002,0x2551,0x2202,0x0205,0x6c00,0x02dc,
|
||||
0x0522,0x8002,0x37f9,0x2203,0x0205,0xa200,0x044a,0x0222,0x0803,0x0822,0x0604,
|
||||
0x0300,0xbe7f,0x65f1,0x0222,0x0105,0x00ff,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0x0037,0x6aaa,0x5003,0x9a66,0x0001,0x81c4,0x016a,
|
||||
0x02ff,0x84ff,0x15a3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x2d2c,0x0000,0x0000,0x0000,0x0000,0xe028,0xa492,0x1c00,
|
||||
0x000e,0xb8ca,0x0013,0x0000,0x0000,0x6b4b,0xc059,0x1571,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x2370,0x00a5,0x9618,0x419a,0x68a2,0xda35,0x001c,0x0007,0xb0ff,0x01b5,0x0000,
|
||||
0x0000,0xff70,0x19ff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x3170,0x00a5,0x9618,0x419a,0x68a2,0xda35,
|
||||
0x001c,0x000e,0xb0ff,0x21b5,0x0000,0x2fd8,0xff70,0x1226,0x19ff,0x07fa,0x6201,
|
||||
0x032e,0x0587,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1112,
|
||||
0x1441,0x4231,0x3234,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000,0x0000,0x8000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4d31,0x7f54,0x3c93,0x1205,0x1931,
|
||||
0x492d,0x7f50,0x3c93,0x0e01,0x192d,0x0070,0x0000,0x8180,0x724d,0xab59,0x3a08,
|
||||
0xdd79,0x2559,0x0070,0x0000,0x81a0,0x6e4d,0x2b99,0x3a09,0x9989,0x2157,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
|
||||
0x0000,0x0000,0x0000,0x0000,0x7092,0x4924,0xb892,0x4924,0x7092,0x289e,0x8992,
|
||||
0x289e,0xa292,0x289e,0x70a2,0xa7ac,0x0000,0x0000,0x2462,0x5e13,0x0000,0x0000,
|
||||
0x70a2,0xa7ac,0x0000,0x0000,0x1e5c,0x5713,0x0000,0x0000,0x8989,0x0000,0x0000,
|
||||
0x0000,0x2424,0x0000,0x0000,0x0000,0x7075,0xa2ac,0xb800,0x0000,0x2868,0x2828,
|
||||
0x2800,0x0000,0x7075,0xa2ac,0x0000,0x0000,0x2868,0x2828,0x0000,0x0000,0x7075,
|
||||
0xac00,0x0000,0x0000,0x2161,0x2100,0x0000,0x0000,0x7075,0xac00,0x0000,0x0000,
|
||||
0x1b5b,0x1b00,0x0000,0x0000,0x8989,0x0000,0x0000,0x0000,0x2121,0x0000,0x0000,
|
||||
0x0000,0x0000,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
|
||||
0xffff,0xffff};
|
||||
|
||||
#endif
|
||||
100
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-h201l.c
Normal file
100
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-h201l.c
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2012 Luka Perkov <openwrt@lukaperkov.net>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <lantiq_platform.h>
|
||||
#include <dev-gpio-leds.h>
|
||||
#include <dev-gpio-buttons.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
#include "dev-dwc_otg.h"
|
||||
|
||||
static u8 ltq_ethaddr[6] = { 0 };
|
||||
|
||||
static int __init
|
||||
setup_ethaddr(char *str)
|
||||
{
|
||||
if (!mac_pton(str, ltq_ethaddr))
|
||||
memset(ltq_ethaddr, 0, 6);
|
||||
return 0;
|
||||
}
|
||||
__setup("ethaddr=", setup_ethaddr);
|
||||
|
||||
static struct mtd_partition h201l_partitions[] __initdata =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x20000,
|
||||
.size = 0x10000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x30000,
|
||||
.size = 0x7d0000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data h201l_flash_data __initdata = {
|
||||
.nr_parts = ARRAY_SIZE(h201l_partitions),
|
||||
.parts = h201l_partitions,
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
h201l_leds_gpio[] __initdata = {
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
h201l_gpio_keys[] __initdata = {
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
static void __init
|
||||
h201l_init(void)
|
||||
{
|
||||
ltq_register_gpio_stp();
|
||||
ltq_register_nor(&h201l_flash_data);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(h201l_leds_gpio), h201l_leds_gpio);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL, ARRAY_SIZE(h201l_gpio_keys), h201l_gpio_keys);
|
||||
|
||||
if (!is_valid_ether_addr(ltq_ethaddr))
|
||||
random_ether_addr(ltq_ethaddr);
|
||||
|
||||
memcpy(<q_eth_data.mac.sa_data, ltq_ethaddr, 6);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
|
||||
xway_register_dwc(-1);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_H201L,
|
||||
"H201L",
|
||||
"ZTE ZXV10 H201L",
|
||||
h201l_init);
|
||||
239
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-netgear.c
Normal file
239
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-netgear.c
Normal file
@@ -0,0 +1,239 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
* Copyright (C) 2012 Pieter Voorthuijsen <p.voorthuijsen@gmail.com>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#include <linux/spi/spi_gpio.h>
|
||||
#include <linux/ath9k_platform.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/sysfs.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <irq.h>
|
||||
#include <dev-gpio-leds.h>
|
||||
#include <dev-gpio-buttons.h>
|
||||
#include "dev-wifi-athxk.h"
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
#include "dev-dwc_otg.h"
|
||||
#include "pci-ath-fixup.h"
|
||||
#include <mtd/mtd-abi.h>
|
||||
#include <asm-generic/sizes.h>
|
||||
|
||||
static struct mtd_partition dgn3500_partitions[] = {
|
||||
{
|
||||
.name = "u-boot",
|
||||
.offset = 0,
|
||||
.size = 0x10000,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
{
|
||||
.name = "environment",
|
||||
.offset = 0x10000,
|
||||
.size = 0x10000,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
{
|
||||
.name = "calibration",
|
||||
.offset = 0x20000,
|
||||
.size = 0x10000,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x50000,
|
||||
.size = 0xfa0000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_INT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = {
|
||||
[14] = INT_NUM_IM0_IRL0 + 22,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_MII,
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
dgn3500_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:green:power", .gpio = 34, .active_low = 1, },
|
||||
{ .name = "soc:red:power", .gpio = 39, .active_low = 1, },
|
||||
{ .name = "soc:orange:wlan", .gpio = 51, .active_low = 1, },
|
||||
{ .name = "soc:green:wps", .gpio = 52, .active_low = 1, },
|
||||
{ .name = "soc:green:usb", .gpio = 22, .active_low = 1, },
|
||||
{ .name = "soc:green:dsl", .gpio = 4, .active_low = 1, },
|
||||
{ .name = "soc:green:internet", .gpio = 2, .active_low = 1, },
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
dgn3500_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "wps",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_0,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 54,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "reset",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_1,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 36,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
#define SPI_GPIO_MRST 16
|
||||
#define SPI_GPIO_MTSR 17
|
||||
#define SPI_GPIO_CLK 18
|
||||
#define SPI_GPIO_CS0 10
|
||||
|
||||
static struct spi_gpio_platform_data spi_gpio_data = {
|
||||
.sck = SPI_GPIO_CLK,
|
||||
.mosi = SPI_GPIO_MTSR,
|
||||
.miso = SPI_GPIO_MRST,
|
||||
.num_chipselect = 2,
|
||||
};
|
||||
|
||||
static struct platform_device spi_gpio_device = {
|
||||
.name = "spi_gpio",
|
||||
.dev.platform_data = &spi_gpio_data,
|
||||
};
|
||||
|
||||
static struct flash_platform_data spi_flash_data = {
|
||||
.name = "sflash",
|
||||
.parts = dgn3500_partitions,
|
||||
.nr_parts = ARRAY_SIZE(dgn3500_partitions),
|
||||
};
|
||||
|
||||
static struct spi_board_info spi_flash __initdata = {
|
||||
.modalias = "m25p80",
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.max_speed_hz = 10 * 1000 * 1000,
|
||||
.mode = SPI_MODE_3,
|
||||
.chip_select = 0,
|
||||
.controller_data = (void *) SPI_GPIO_CS0,
|
||||
.platform_data = &spi_flash_data
|
||||
};
|
||||
|
||||
static u8 ltq_ethaddr[6] = { 0 };
|
||||
|
||||
static int __init setup_ethaddr(char *str)
|
||||
{
|
||||
if (!mac_pton(str, ltq_ethaddr))
|
||||
memset(ltq_ethaddr, 0, 6);
|
||||
return 0;
|
||||
}
|
||||
__setup("ethaddr=", setup_ethaddr);
|
||||
|
||||
static u16 dgn3500_eeprom_data[ATH9K_PLAT_EEP_MAX_WORDS] = {0};
|
||||
|
||||
static ssize_t ath_eeprom_read(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *attr, char *buf,
|
||||
loff_t offset, size_t count)
|
||||
{
|
||||
if (unlikely(offset >= sizeof(dgn3500_eeprom_data)))
|
||||
return 0;
|
||||
if ((offset + count) > sizeof(dgn3500_eeprom_data))
|
||||
count = sizeof(dgn3500_eeprom_data) - offset;
|
||||
if (unlikely(!count))
|
||||
return count;
|
||||
|
||||
memcpy(buf, (char *)(dgn3500_eeprom_data) + offset, count);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
extern struct ath9k_platform_data ath9k_pdata;
|
||||
|
||||
static ssize_t ath_eeprom_write(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *attr, char *buf,
|
||||
loff_t offset, size_t count)
|
||||
{
|
||||
int i;
|
||||
char *eeprom_bytes = (char *)dgn3500_eeprom_data;
|
||||
|
||||
if (unlikely(offset >= sizeof(dgn3500_eeprom_data)))
|
||||
return -EFBIG;
|
||||
if ((offset + count) > sizeof(dgn3500_eeprom_data))
|
||||
count = sizeof(dgn3500_eeprom_data) - offset;
|
||||
if (unlikely(!count))
|
||||
return count;
|
||||
if (count % 2)
|
||||
return 0;
|
||||
|
||||
/* The PCI fixup routine requires an endian swap of the calibartion data
|
||||
* stored in flash */
|
||||
for (i = 0; i < count; i += 2) {
|
||||
eeprom_bytes[offset + i + 1] = buf[i];
|
||||
eeprom_bytes[offset + i] = buf[i+1];
|
||||
}
|
||||
|
||||
/* The original data does not contain a checksum. Set the country and
|
||||
* calculate new checksum when all data is received */
|
||||
if ((count + offset) == sizeof(dgn3500_eeprom_data))
|
||||
memcpy(ath9k_pdata.eeprom_data, dgn3500_eeprom_data,
|
||||
sizeof(ath9k_pdata.eeprom_data));
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static struct bin_attribute dev_attr_ath_eeprom = {
|
||||
.attr = {
|
||||
.name = "ath_eeprom",
|
||||
.mode = S_IRUGO|S_IWUSR,
|
||||
},
|
||||
.read = ath_eeprom_read,
|
||||
.write = ath_eeprom_write,
|
||||
};
|
||||
|
||||
static void __init dgn3500_init(void)
|
||||
{
|
||||
if (sysfs_create_bin_file(firmware_kobj, &dev_attr_ath_eeprom))
|
||||
printk(KERN_INFO "Failed to create ath eeprom sysfs entry\n");
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(dgn3500_gpio_leds),
|
||||
dgn3500_gpio_leds);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL,
|
||||
ARRAY_SIZE(dgn3500_gpio_keys), dgn3500_gpio_keys);
|
||||
platform_device_register(&spi_gpio_device);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
spi_register_board_info(&spi_flash, 1);
|
||||
if (!is_valid_ether_addr(ltq_ethaddr)) {
|
||||
printk(KERN_INFO "MAC invalid using random\n");
|
||||
random_ether_addr(ltq_ethaddr);
|
||||
}
|
||||
memcpy(<q_eth_data.mac.sa_data, ltq_ethaddr, 6);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
ltq_register_ath9k(dgn3500_eeprom_data, ltq_ethaddr);
|
||||
ltq_pci_ath_fixup(14, dgn3500_eeprom_data);
|
||||
/* The usb power is always enabled, protected by a fuse */
|
||||
xway_register_dwc(-1);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_DGN3500B,
|
||||
"DGN3500B",
|
||||
"Netgear DGN3500B",
|
||||
dgn3500_init);
|
||||
113
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-p2601hnfx.c
Normal file
113
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-p2601hnfx.c
Normal file
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_buttons.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/mdio-gpio.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <lantiq_platform.h>
|
||||
#include <dev-gpio-leds.h>
|
||||
#include <dev-gpio-buttons.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
#include "dev-dwc_otg.h"
|
||||
|
||||
static struct mtd_partition p2601hnfx_partitions[] __initdata =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "uboot_env",
|
||||
.offset = 0x20000,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x40000,
|
||||
.size = 0xfc0000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data p2601hnfx_flash_data __initdata = {
|
||||
.nr_parts = ARRAY_SIZE(p2601hnfx_partitions),
|
||||
.parts = p2601hnfx_partitions,
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
p2601hnfx_leds_gpio[] __initdata = {
|
||||
{ .name = "soc:yellow:phone", .gpio = 216, .active_low = 1 },
|
||||
{ .name = "soc:green:phone", .gpio = 217, .active_low = 1 },
|
||||
{ .name = "soc:yellow:wifi", .gpio = 218, .active_low = 1 },
|
||||
{ .name = "soc:green:power", .gpio = 219, .active_low = 1 },
|
||||
{ .name = "soc:red:internet", .gpio = 220, .active_low = 1 },
|
||||
{ .name = "soc:green:internet", .gpio = 221, .active_low = 1 },
|
||||
{ .name = "soc:green:dsl", .gpio = 222, .active_low = 1 },
|
||||
{ .name = "soc:green:wifi", .gpio = 223, .active_low = 1 },
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
p2601hnfx_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "reset",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_0,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 53,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "wifi",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_1,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 54,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
static void __init
|
||||
p2601hnfx_init(void)
|
||||
{
|
||||
#define P2601HNFX_USB 9
|
||||
|
||||
ltq_register_gpio_stp();
|
||||
ltq_register_nor(&p2601hnfx_flash_data);
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(p2601hnfx_leds_gpio), p2601hnfx_leds_gpio);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL, ARRAY_SIZE(p2601hnfx_gpio_keys), p2601hnfx_gpio_keys);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
xway_register_dwc(P2601HNFX_USB);
|
||||
|
||||
// enable the ethernet ports on the SoC
|
||||
// ltq_w32((ltq_r32(LTQ_GPORT_P0_CTL) & ~(1 << 17)) | (1 << 18), LTQ_GPORT_P0_CTL);
|
||||
// ltq_w32((ltq_r32(LTQ_GPORT_P1_CTL) & ~(1 << 17)) | (1 << 18), LTQ_GPORT_P1_CTL);
|
||||
// ltq_w32((ltq_r32(LTQ_GPORT_P2_CTL) & ~(1 << 17)) | (1 << 18), LTQ_GPORT_P2_CTL);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_P2601HNFX,
|
||||
"P2601HNFX",
|
||||
"ZyXEL P-2601HN-Fx",
|
||||
p2601hnfx_init);
|
||||
120
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-wbmr.c
Normal file
120
target/linux/lantiq/files/arch/mips/lantiq/xway/mach-wbmr.c
Normal file
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Copyright (C) 2010 John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_buttons.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
#include <irq.h>
|
||||
#include <dev-gpio-leds.h>
|
||||
#include <dev-gpio-buttons.h>
|
||||
|
||||
#include "../machtypes.h"
|
||||
#include "devices.h"
|
||||
#include "dev-dwc_otg.h"
|
||||
|
||||
static struct mtd_partition wbmr_partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = 0x0,
|
||||
.size = 0x40000,
|
||||
},
|
||||
{
|
||||
.name = "uboot-env",
|
||||
.offset = 0x40000,
|
||||
.size = 0x20000,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = 0x60000,
|
||||
.size = 0x1f20000,
|
||||
},
|
||||
{
|
||||
.name = "calibration",
|
||||
.offset = 0x1fe0000,
|
||||
.size = 0x20000,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data wbmr_flash_data = {
|
||||
.nr_parts = ARRAY_SIZE(wbmr_partitions),
|
||||
.parts = wbmr_partitions,
|
||||
};
|
||||
|
||||
static struct gpio_led
|
||||
wbmr_gpio_leds[] __initdata = {
|
||||
{ .name = "soc:blue:movie", .gpio = 20, .active_low = 1, },
|
||||
{ .name = "soc:red:internet", .gpio = 18, .active_low = 1, },
|
||||
{ .name = "soc:green:internet", .gpio = 17, .active_low = 1, },
|
||||
{ .name = "soc:green:adsl", .gpio = 16, .active_low = 1, },
|
||||
{ .name = "soc:green:wlan", .gpio = 15, .active_low = 1, },
|
||||
{ .name = "soc:red:security", .gpio = 14, .active_low = 1, },
|
||||
{ .name = "soc:green:power", .gpio = 1, .active_low = 1, },
|
||||
{ .name = "soc:red:power", .gpio = 5, .active_low = 1, },
|
||||
{ .name = "soc:green:usb", .gpio = 28, .active_low = 1, },
|
||||
};
|
||||
|
||||
static struct gpio_keys_button
|
||||
wbmr_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "aoss",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_0,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 0,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "reset",
|
||||
.type = EV_KEY,
|
||||
.code = BTN_1,
|
||||
.debounce_interval = LTQ_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = 37,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_pci_data ltq_pci_data = {
|
||||
.clock = PCI_CLOCK_INT,
|
||||
.gpio = PCI_GNT1 | PCI_REQ1,
|
||||
.irq = {
|
||||
[14] = INT_NUM_IM0_IRL0 + 22,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ltq_eth_data ltq_eth_data = {
|
||||
.mii_mode = PHY_INTERFACE_MODE_RGMII,
|
||||
};
|
||||
|
||||
static void __init
|
||||
wbmr_init(void)
|
||||
{
|
||||
#define WMBR_BRN_MAC 0x1fd0024
|
||||
|
||||
ltq_add_device_gpio_leds(-1, ARRAY_SIZE(wbmr_gpio_leds), wbmr_gpio_leds);
|
||||
ltq_register_gpio_keys_polled(-1, LTQ_KEYS_POLL_INTERVAL, ARRAY_SIZE(wbmr_gpio_keys), wbmr_gpio_keys);
|
||||
ltq_register_nor(&wbmr_flash_data);
|
||||
ltq_register_pci(<q_pci_data);
|
||||
memcpy_fromio(<q_eth_data.mac.sa_data,
|
||||
(void *)KSEG1ADDR(LTQ_FLASH_START + WMBR_BRN_MAC), 6);
|
||||
ltq_register_etop(<q_eth_data);
|
||||
xway_register_dwc(36);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(LANTIQ_MACH_WBMR,
|
||||
"WBMR",
|
||||
"WBMR",
|
||||
wbmr_init);
|
||||
109
target/linux/lantiq/files/arch/mips/lantiq/xway/pci-ath-fixup.c
Normal file
109
target/linux/lantiq/files/arch/mips/lantiq/xway/pci-ath-fixup.c
Normal file
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Atheros AP94 reference board PCI initialization
|
||||
*
|
||||
* Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
|
||||
*
|
||||
* 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/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <lantiq_soc.h>
|
||||
|
||||
#define LTQ_PCI_MEM_BASE 0x18000000
|
||||
|
||||
struct ath_fixup {
|
||||
u16 *cal_data;
|
||||
unsigned slot;
|
||||
};
|
||||
|
||||
static int ath_num_fixups;
|
||||
static struct ath_fixup ath_fixups[2];
|
||||
|
||||
static void ath_pci_fixup(struct pci_dev *dev)
|
||||
{
|
||||
void __iomem *mem;
|
||||
u16 *cal_data = NULL;
|
||||
u16 cmd;
|
||||
u32 bar0;
|
||||
u32 val;
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < ath_num_fixups; i++) {
|
||||
if (ath_fixups[i].cal_data == NULL)
|
||||
continue;
|
||||
|
||||
if (ath_fixups[i].slot != PCI_SLOT(dev->devfn))
|
||||
continue;
|
||||
|
||||
cal_data = ath_fixups[i].cal_data;
|
||||
break;
|
||||
}
|
||||
|
||||
if (cal_data == NULL)
|
||||
return;
|
||||
|
||||
if (*cal_data != 0xa55a) {
|
||||
pr_err("pci %s: invalid calibration data\n", pci_name(dev));
|
||||
return;
|
||||
}
|
||||
|
||||
pr_info("pci %s: fixup device configuration\n", pci_name(dev));
|
||||
|
||||
mem = ioremap(LTQ_PCI_MEM_BASE, 0x10000);
|
||||
if (!mem) {
|
||||
pr_err("pci %s: ioremap error\n", pci_name(dev));
|
||||
return;
|
||||
}
|
||||
|
||||
pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar0);
|
||||
pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, LTQ_PCI_MEM_BASE);
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
|
||||
/* set pointer to first reg address */
|
||||
cal_data += 3;
|
||||
while (*cal_data != 0xffff) {
|
||||
u32 reg;
|
||||
reg = *cal_data++;
|
||||
val = *cal_data++;
|
||||
val |= (*cal_data++) << 16;
|
||||
|
||||
ltq_w32(swab32(val), mem + reg);
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
pci_read_config_dword(dev, PCI_VENDOR_ID, &val);
|
||||
dev->vendor = val & 0xffff;
|
||||
dev->device = (val >> 16) & 0xffff;
|
||||
|
||||
pci_read_config_dword(dev, PCI_CLASS_REVISION, &val);
|
||||
dev->revision = val & 0xff;
|
||||
dev->class = val >> 8; /* upper 3 bytes */
|
||||
|
||||
pr_info("pci %s: fixup info: [%04x:%04x] revision %02x class %#08x\n",
|
||||
pci_name(dev), dev->vendor, dev->device, dev->revision, dev->class);
|
||||
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
cmd &= ~(PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
|
||||
pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, bar0);
|
||||
|
||||
iounmap(mem);
|
||||
}
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATHEROS, PCI_ANY_ID, ath_pci_fixup);
|
||||
|
||||
void __init ltq_pci_ath_fixup(unsigned slot, u16 *cal_data)
|
||||
{
|
||||
if (ath_num_fixups >= ARRAY_SIZE(ath_fixups))
|
||||
return;
|
||||
|
||||
ath_fixups[ath_num_fixups].slot = slot;
|
||||
ath_fixups[ath_num_fixups].cal_data = cal_data;
|
||||
ath_num_fixups++;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#ifndef _PCI_ATH_FIXUP
|
||||
#define _PCI_ATH_FIXUP
|
||||
|
||||
void ltq_pci_ath_fixup(unsigned slot, u16 *cal_data) __init;
|
||||
|
||||
#endif /* _PCI_ATH_FIXUP */
|
||||
Reference in New Issue
Block a user