bmips: drop unneeded ath9k fixup
We no longer need the custom ath9k fixup now that we're using the standard kmod-owl-loader. Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
This commit is contained in:
parent
db4f158c03
commit
16b0cbbde0
2 changed files with 1 additions and 243 deletions
|
@ -1,242 +0,0 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
/*
|
|
||||||
* ATH9K Fixup Driver
|
|
||||||
*
|
|
||||||
* Copyright (C) 2020 Álvaro Fernández Rojas <noltari@gmail.com>
|
|
||||||
* Copyright (C) 2014 Jonas Gorski <jonas.gorski@gmail.com>
|
|
||||||
* Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
|
|
||||||
* Copyright (C) 2008 Florian Fainelli <f.fainelli@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/delay.h>
|
|
||||||
#include <linux/etherdevice.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/mtd/mtd.h>
|
|
||||||
#include <linux/of_net.h>
|
|
||||||
#include <linux/of_platform.h>
|
|
||||||
#include <linux/pci.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/ath9k_platform.h>
|
|
||||||
|
|
||||||
#define ATH9K_MAX_FIXUPS 2
|
|
||||||
|
|
||||||
#define ATH9K_DEF_LED_PIN -1
|
|
||||||
#define ATH9K_DEF_PCI_DEV 255
|
|
||||||
|
|
||||||
struct ath9k_fixup {
|
|
||||||
struct device *dev;
|
|
||||||
struct resource *mem_res;
|
|
||||||
u32 pci_dev;
|
|
||||||
u8 mac[ETH_ALEN];
|
|
||||||
struct ath9k_platform_data pdata;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int ath9k_num_fixups;
|
|
||||||
static struct ath9k_fixup *ath9k_fixups[ATH9K_MAX_FIXUPS];
|
|
||||||
|
|
||||||
static void ath9k_pci_fixup(struct pci_dev *dev)
|
|
||||||
{
|
|
||||||
void __iomem *mem;
|
|
||||||
struct ath9k_fixup *priv = NULL;
|
|
||||||
struct ath9k_platform_data *pdata = NULL;
|
|
||||||
struct pci_dev *bridge = pci_upstream_bridge(dev);
|
|
||||||
u16 *cal_data = NULL;
|
|
||||||
u16 cmd;
|
|
||||||
u32 bar0;
|
|
||||||
u32 val;
|
|
||||||
unsigned i;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
for (i = 0; i < ath9k_num_fixups; i++) {
|
|
||||||
if (ath9k_fixups[i]->pci_dev != PCI_SLOT(dev->devfn))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
priv = ath9k_fixups[i];
|
|
||||||
cal_data = priv->pdata.eeprom_data;
|
|
||||||
pdata = &priv->pdata;
|
|
||||||
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));
|
|
||||||
|
|
||||||
val = priv->mem_res->start;
|
|
||||||
mem = ioremap(priv->mem_res->start, resource_size(priv->mem_res));
|
|
||||||
if (!mem) {
|
|
||||||
pr_err("pci %s: ioremap error\n", pci_name(dev));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bridge) {
|
|
||||||
rc = pci_enable_device(bridge);
|
|
||||||
if (rc < 0)
|
|
||||||
pr_err("pci %s: bridge enable error\n", pci_name(dev));
|
|
||||||
}
|
|
||||||
|
|
||||||
pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar0);
|
|
||||||
pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar0);
|
|
||||||
pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, val);
|
|
||||||
|
|
||||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
|
||||||
cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
|
|
||||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
|
||||||
|
|
||||||
/* set offset to first reg address */
|
|
||||||
cal_data += 3;
|
|
||||||
while(*cal_data != 0xffff) {
|
|
||||||
u32 reg;
|
|
||||||
|
|
||||||
reg = *cal_data++;
|
|
||||||
val = *cal_data++;
|
|
||||||
val |= (*cal_data++) << 16;
|
|
||||||
|
|
||||||
writel(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 */
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
if (bridge)
|
|
||||||
pci_disable_device(bridge);
|
|
||||||
|
|
||||||
iounmap(mem);
|
|
||||||
|
|
||||||
dev->dev.platform_data = pdata;
|
|
||||||
}
|
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATHEROS, PCI_ANY_ID, ath9k_pci_fixup);
|
|
||||||
|
|
||||||
static int ath9k_mtd_eeprom(struct ath9k_fixup *priv)
|
|
||||||
{
|
|
||||||
struct device *dev = priv->dev;
|
|
||||||
struct device_node *node = dev->of_node;
|
|
||||||
struct device_node *mtd_np = NULL;
|
|
||||||
struct mtd_info *the_mtd;
|
|
||||||
phandle phandle;
|
|
||||||
size_t eeprom_readlen;
|
|
||||||
const char *part;
|
|
||||||
const __be32 *list;
|
|
||||||
int ret, i;
|
|
||||||
|
|
||||||
list = of_get_property(node, "ath,eeprom", &i);
|
|
||||||
if (!list || (i != (2 * sizeof(*list))))
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
phandle = be32_to_cpup(list++);
|
|
||||||
if (phandle)
|
|
||||||
mtd_np = of_find_node_by_phandle(phandle);
|
|
||||||
if (!mtd_np)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
part = of_get_property(mtd_np, "label", NULL);
|
|
||||||
if (!part)
|
|
||||||
part = mtd_np->name;
|
|
||||||
|
|
||||||
the_mtd = get_mtd_device_nm(part);
|
|
||||||
if (IS_ERR(the_mtd))
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
ret = mtd_read(the_mtd, be32_to_cpup(list),
|
|
||||||
ATH9K_PLAT_EEP_MAX_WORDS * sizeof(u16),
|
|
||||||
&eeprom_readlen, (void *) priv->pdata.eeprom_data);
|
|
||||||
put_mtd_device(the_mtd);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ath9k_fixup_probe(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
struct device *dev = &pdev->dev;
|
|
||||||
struct device_node *node = dev->of_node;
|
|
||||||
struct ath9k_fixup *priv;
|
|
||||||
struct resource *res;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (ath9k_num_fixups >= ATH9K_MAX_FIXUPS)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
||||||
if (!res)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
|
||||||
if (!priv)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
priv->dev = dev;
|
|
||||||
priv->mem_res = res;
|
|
||||||
|
|
||||||
ret = of_property_read_u32(node, "pci-dev", &priv->pci_dev);
|
|
||||||
if (ret)
|
|
||||||
priv->pci_dev = ATH9K_DEF_PCI_DEV;
|
|
||||||
|
|
||||||
ret = ath9k_mtd_eeprom(priv);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
priv->pdata.endian_check = of_property_read_bool(node,
|
|
||||||
"ath,endian-check");
|
|
||||||
ret = of_property_read_s32(node, "ath,led-pin", &priv->pdata.led_pin);
|
|
||||||
if (ret)
|
|
||||||
priv->pdata.led_pin = ATH9K_DEF_LED_PIN;
|
|
||||||
priv->pdata.led_active_high = of_property_read_bool(node,
|
|
||||||
"ath,led-active-high");
|
|
||||||
|
|
||||||
of_get_mac_address(node, priv->mac);
|
|
||||||
if (is_valid_ether_addr(priv->mac)) {
|
|
||||||
dev_info(dev, "mtd mac %pM\n", priv->mac);
|
|
||||||
} else {
|
|
||||||
random_ether_addr(priv->mac);
|
|
||||||
dev_info(dev, "random mac %pM\n", priv->mac);
|
|
||||||
}
|
|
||||||
|
|
||||||
priv->pdata.macaddr = priv->mac;
|
|
||||||
|
|
||||||
ath9k_fixups[ath9k_num_fixups] = priv;
|
|
||||||
ath9k_num_fixups++;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct of_device_id ath9k_fixup_of_match[] = {
|
|
||||||
{ .compatible = "brcm,ath9k-fixup" },
|
|
||||||
{ /* sentinel */ }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_driver ath9k_fixup_driver = {
|
|
||||||
.probe = ath9k_fixup_probe,
|
|
||||||
.driver = {
|
|
||||||
.name = "ath9k-fixup",
|
|
||||||
.of_match_table = ath9k_fixup_of_match,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
int __init ath9k_fixup_init(void)
|
|
||||||
{
|
|
||||||
int ret = platform_driver_register(&ath9k_fixup_driver);
|
|
||||||
if (ret)
|
|
||||||
pr_err("ath9k_fixup: Error registering platform driver!\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
late_initcall(ath9k_fixup_init);
|
|
|
@ -3,4 +3,4 @@
|
||||||
@@ -1,2 +1,3 @@
|
@@ -1,2 +1,3 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0-only
|
# SPDX-License-Identifier: GPL-2.0-only
|
||||||
obj-y += setup.o irq.o dma.o
|
obj-y += setup.o irq.o dma.o
|
||||||
+obj-y += ath9k-fixup.o b43-sprom.o
|
+obj-y += b43-sprom.o
|
||||||
|
|
Loading…
Reference in a new issue