mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-31 08:25:29 +00:00
kernel: drop everything not on kernel version 4.14
* Remove testing patches for kernel version 4.19 * remove targets ar7, ixp4xx, orion Those targets are still on kernel 4.9, patches for 4.14 were not ready in time. They may be readded once people prepare and test patches for kernel 4.14. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
parent
c4e727f01c
commit
000d400baa
@ -14,7 +14,6 @@ MAINTAINER:=Chris Blake <chrisrblake93@gmail.com>, \
|
||||
SUBTARGETS:=nand sata
|
||||
|
||||
KERNEL_PATCHVER:=4.14
|
||||
KERNEL_TESTING_PATCHVER := 4.19
|
||||
|
||||
define Target/Description
|
||||
Build images for AppliedMicro APM821xx based boards.
|
||||
|
@ -1,141 +0,0 @@
|
||||
From 7b0c03ecc42fb223baf015877fee9d517c2c8af1 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Sat, 17 Nov 2018 17:17:21 +0100
|
||||
Subject: dmaengine: dw-dmac: implement dma protection control setting
|
||||
|
||||
This patch adds a new device-tree property that allows to
|
||||
specify the dma protection control bits for the all of the
|
||||
DMA controller's channel uniformly.
|
||||
|
||||
Setting the "correct" bits can have a huge impact on the
|
||||
PPC460EX and APM82181 that use this DMA engine in combination
|
||||
with a DesignWare' SATA-II core (sata_dwc_460ex driver).
|
||||
|
||||
In the OpenWrt Forum, the user takimata reported that:
|
||||
|It seems your patch unleashed the full power of the SATA port.
|
||||
|Where I was previously hitting a really hard limit at around
|
||||
|82 MB/s for reading and 27 MB/s for writing, I am now getting this:
|
||||
|
|
||||
|root@OpenWrt:/mnt# time dd if=/dev/zero of=tempfile bs=1M count=1024
|
||||
|1024+0 records in
|
||||
|1024+0 records out
|
||||
|real 0m 13.65s
|
||||
|user 0m 0.01s
|
||||
|sys 0m 11.89s
|
||||
|
|
||||
|root@OpenWrt:/mnt# time dd if=tempfile of=/dev/null bs=1M count=1024
|
||||
|1024+0 records in
|
||||
|1024+0 records out
|
||||
|real 0m 8.41s
|
||||
|user 0m 0.01s
|
||||
|sys 0m 4.70s
|
||||
|
|
||||
|This means: 121 MB/s reading and 75 MB/s writing!
|
||||
|
|
||||
|The drive is a WD Green WD10EARX taken from an older MBL Single.
|
||||
|I repeated the test a few times with even larger files to rule out
|
||||
|any caching, I'm still seeing the same great performance. OpenWrt is
|
||||
|now completely on par with the original MBL firmware's performance.
|
||||
|
||||
Another user And.short reported:
|
||||
|I can report that your fix worked! Boots up fine with two
|
||||
|drives even with more partitions, and no more reboot on
|
||||
|concurrent disk access!
|
||||
|
||||
A closer look into the sata_dwc_460ex code revealed that
|
||||
the driver did initally set the correct protection control
|
||||
bits. However, this feature was lost when the sata_dwc_460ex
|
||||
driver was converted to the generic DMA driver framework.
|
||||
|
||||
BugLink: https://forum.openwrt.org/t/wd-mybook-live-duo-two-disks/16195/55
|
||||
BugLink: https://forum.openwrt.org/t/wd-mybook-live-duo-two-disks/16195/50
|
||||
Fixes: 8b3444852a2b ("sata_dwc_460ex: move to generic DMA driver")
|
||||
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
||||
---
|
||||
|
||||
--- a/drivers/dma/dw/core.c
|
||||
+++ b/drivers/dma/dw/core.c
|
||||
@@ -160,12 +160,14 @@ static void dwc_initialize_chan_idma32(s
|
||||
|
||||
static void dwc_initialize_chan_dw(struct dw_dma_chan *dwc)
|
||||
{
|
||||
+ struct dw_dma *dw = to_dw_dma(dwc->chan.device);
|
||||
u32 cfghi = DWC_CFGH_FIFO_MODE;
|
||||
u32 cfglo = DWC_CFGL_CH_PRIOR(dwc->priority);
|
||||
bool hs_polarity = dwc->dws.hs_polarity;
|
||||
|
||||
cfghi |= DWC_CFGH_DST_PER(dwc->dws.dst_id);
|
||||
cfghi |= DWC_CFGH_SRC_PER(dwc->dws.src_id);
|
||||
+ cfghi |= DWC_CFGH_PROTCTL(dw->pdata->protctl);
|
||||
|
||||
/* Set polarity of handshake interface */
|
||||
cfglo |= hs_polarity ? DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL : 0;
|
||||
--- a/drivers/dma/dw/platform.c
|
||||
+++ b/drivers/dma/dw/platform.c
|
||||
@@ -162,6 +162,12 @@ dw_dma_parse_dt(struct platform_device *
|
||||
pdata->multi_block[tmp] = 1;
|
||||
}
|
||||
|
||||
+ if (!of_property_read_u32(np, "snps,dma-protection-control", &tmp)) {
|
||||
+ if (tmp > CHAN_PROTCTL_MASK)
|
||||
+ return NULL;
|
||||
+ pdata->protctl = tmp;
|
||||
+ }
|
||||
+
|
||||
return pdata;
|
||||
}
|
||||
#else
|
||||
--- a/drivers/dma/dw/regs.h
|
||||
+++ b/drivers/dma/dw/regs.h
|
||||
@@ -200,6 +200,10 @@ enum dw_dma_msize {
|
||||
#define DWC_CFGH_FCMODE (1 << 0)
|
||||
#define DWC_CFGH_FIFO_MODE (1 << 1)
|
||||
#define DWC_CFGH_PROTCTL(x) ((x) << 2)
|
||||
+#define DWC_CFGH_PROTCTL_DATA (0 << 2) /* data access - always set */
|
||||
+#define DWC_CFGH_PROTCTL_PRIV (1 << 2) /* privileged -> AHB HPROT[1] */
|
||||
+#define DWC_CFGH_PROTCTL_BUFFER (2 << 2) /* bufferable -> AHB HPROT[2] */
|
||||
+#define DWC_CFGH_PROTCTL_CACHE (4 << 2) /* cacheable -> AHB HPROT[3] */
|
||||
#define DWC_CFGH_DS_UPD_EN (1 << 5)
|
||||
#define DWC_CFGH_SS_UPD_EN (1 << 6)
|
||||
#define DWC_CFGH_SRC_PER(x) ((x) << 7)
|
||||
--- a/include/linux/platform_data/dma-dw.h
|
||||
+++ b/include/linux/platform_data/dma-dw.h
|
||||
@@ -49,6 +49,7 @@ struct dw_dma_slave {
|
||||
* @data_width: Maximum data width supported by hardware per AHB master
|
||||
* (in bytes, power of 2)
|
||||
* @multi_block: Multi block transfers supported by hardware per channel.
|
||||
+ * @protctl: Protection control signals setting per channel.
|
||||
*/
|
||||
struct dw_dma_platform_data {
|
||||
unsigned int nr_channels;
|
||||
@@ -65,6 +66,11 @@ struct dw_dma_platform_data {
|
||||
unsigned char nr_masters;
|
||||
unsigned char data_width[DW_DMA_MAX_NR_MASTERS];
|
||||
unsigned char multi_block[DW_DMA_MAX_NR_CHANNELS];
|
||||
+#define CHAN_PROTCTL_PRIVILEGED BIT(0)
|
||||
+#define CHAN_PROTCTL_BUFFERABLE BIT(1)
|
||||
+#define CHAN_PROTCTL_CACHEABLE BIT(2)
|
||||
+#define CHAN_PROTCTL_MASK GENMASK(2, 0)
|
||||
+ unsigned char protctl;
|
||||
};
|
||||
|
||||
#endif /* _PLATFORM_DATA_DMA_DW_H */
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/dma/dw-dmac.h
|
||||
@@ -0,0 +1,14 @@
|
||||
+/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
|
||||
+
|
||||
+#ifndef __DT_BINDINGS_DMA_DW_DMAC_H__
|
||||
+#define __DT_BINDINGS_DMA_DW_DMAC_H__
|
||||
+
|
||||
+/*
|
||||
+ * Protection Control bits provide protection against illegal transactions.
|
||||
+ * The protection bits[0:2] are one-to-one mapped to AHB HPROT[3:1] signals.
|
||||
+ */
|
||||
+#define DW_DMAC_HPROT1_PRIVILEGED_MODE (1 << 0) /* Privileged Mode */
|
||||
+#define DW_DMAC_HPROT2_BUFFERABLE (1 << 1) /* DMA is bufferable */
|
||||
+#define DW_DMAC_HPROT3_CACHEABLE (1 << 2) /* DMA is cacheable */
|
||||
+
|
||||
+#endif /* __DT_BINDINGS_DMA_DW_DMAC_H__ */
|
@ -1,34 +0,0 @@
|
||||
From 1ad0f1603a6b2afb62a1c065409aaa4e43ca7627 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Biggers <ebiggers@google.com>
|
||||
Date: Wed, 14 Nov 2018 12:19:39 -0800
|
||||
Subject: [PATCH 03/15] crypto: drop mask=CRYPTO_ALG_ASYNC from 'cipher' tfm
|
||||
allocations
|
||||
|
||||
'cipher' algorithms (single block ciphers) are always synchronous, so
|
||||
passing CRYPTO_ALG_ASYNC in the mask to crypto_alloc_cipher() has no
|
||||
effect. Many users therefore already don't pass it, but some still do.
|
||||
This inconsistency can cause confusion, especially since the way the
|
||||
'mask' argument works is somewhat counterintuitive.
|
||||
|
||||
Thus, just remove the unneeded CRYPTO_ALG_ASYNC flags.
|
||||
|
||||
This patch shouldn't change any actual behavior.
|
||||
|
||||
Signed-off-by: Eric Biggers <ebiggers@google.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
drivers/crypto/amcc/crypto4xx_alg.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_alg.c
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_alg.c
|
||||
@@ -526,8 +526,7 @@ static int crypto4xx_compute_gcm_hash_ke
|
||||
uint8_t src[16] = { 0 };
|
||||
int rc = 0;
|
||||
|
||||
- aes_tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC |
|
||||
- CRYPTO_ALG_NEED_FALLBACK);
|
||||
+ aes_tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_NEED_FALLBACK);
|
||||
if (IS_ERR(aes_tfm)) {
|
||||
rc = PTR_ERR(aes_tfm);
|
||||
pr_warn("could not load aes cipher driver: %d\n", rc);
|
@ -1,30 +0,0 @@
|
||||
From 67d8208fba1324fa0198f9fc58a9edbe09596947 Mon Sep 17 00:00:00 2001
|
||||
From: Christoph Hellwig <hch@lst.de>
|
||||
Date: Sun, 16 Dec 2018 18:19:46 +0100
|
||||
Subject: [PATCH 04/15] crypto4xx_core: don't abuse __dma_sync_page
|
||||
|
||||
This function is internal to the DMA API implementation. Instead use
|
||||
the DMA API to properly unmap. Note that the DMA API usage in this
|
||||
driver is a disaster and urgently needs some work - it is missing all
|
||||
the unmaps, seems to do a secondary map where it looks like it should
|
||||
to a unmap in one place to work around cache coherency and the
|
||||
directions passed in seem to be partially wrong.
|
||||
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
Tested-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
|
||||
---
|
||||
drivers/crypto/amcc/crypto4xx_core.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_core.c
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_core.c
|
||||
@@ -596,7 +596,7 @@ static void crypto4xx_aead_done(struct c
|
||||
pd->pd_ctl_len.bf.pkt_len,
|
||||
dst);
|
||||
} else {
|
||||
- __dma_sync_page(sg_page(dst), dst->offset, dst->length,
|
||||
+ dma_unmap_page(dev->core_dev->device, pd->dest, dst->length,
|
||||
DMA_FROM_DEVICE);
|
||||
}
|
||||
|
@ -1,40 +0,0 @@
|
||||
From 750afb08ca71310fcf0c4e2cb1565c63b8235b60 Mon Sep 17 00:00:00 2001
|
||||
From: Luis Chamberlain <mcgrof@kernel.org>
|
||||
Date: Fri, 4 Jan 2019 09:23:09 +0100
|
||||
Subject: [PATCH 05/15] cross-tree: phase out dma_zalloc_coherent()
|
||||
|
||||
We already need to zero out memory for dma_alloc_coherent(), as such
|
||||
using dma_zalloc_coherent() is superflous. Phase it out.
|
||||
|
||||
This change was generated with the following Coccinelle SmPL patch:
|
||||
|
||||
@ replace_dma_zalloc_coherent @
|
||||
expression dev, size, data, handle, flags;
|
||||
@@
|
||||
|
||||
-dma_zalloc_coherent(dev, size, handle, flags)
|
||||
+dma_alloc_coherent(dev, size, handle, flags)
|
||||
|
||||
Suggested-by: Christoph Hellwig <hch@lst.de>
|
||||
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
|
||||
[hch: re-ran the script on the latest tree]
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
drivers/crypto/amcc/crypto4xx_core.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_core.c
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_core.c
|
||||
@@ -283,9 +283,9 @@ static u32 crypto4xx_put_pd_to_pdr(struc
|
||||
*/
|
||||
static u32 crypto4xx_build_gdr(struct crypto4xx_device *dev)
|
||||
{
|
||||
- dev->gdr = dma_zalloc_coherent(dev->core_dev->device,
|
||||
- sizeof(struct ce_gd) * PPC4XX_NUM_GD,
|
||||
- &dev->gdr_pa, GFP_ATOMIC);
|
||||
+ dev->gdr = dma_alloc_coherent(dev->core_dev->device,
|
||||
+ sizeof(struct ce_gd) * PPC4XX_NUM_GD,
|
||||
+ &dev->gdr_pa, GFP_ATOMIC);
|
||||
if (!dev->gdr)
|
||||
return -ENOMEM;
|
||||
|
@ -1,199 +0,0 @@
|
||||
From d072bfa4885354fff86aa1fb1dbc4f1533c9e0bf Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Sun, 23 Dec 2018 02:16:13 +0100
|
||||
Subject: [PATCH 06/15] crypto: crypto4xx - add prng crypto support
|
||||
|
||||
This patch adds support for crypto4xx's ANSI X9.17 Annex C compliant
|
||||
pseudo random number generator which provides a pseudo random source
|
||||
for the purpose of generating Initialization Vectors (IV's) for AES
|
||||
algorithms to the Packet Engine and other pseudo random number
|
||||
requirements.
|
||||
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
drivers/crypto/amcc/crypto4xx_core.c | 87 +++++++++++++++++++++++++
|
||||
drivers/crypto/amcc/crypto4xx_core.h | 4 ++
|
||||
drivers/crypto/amcc/crypto4xx_reg_def.h | 1 +
|
||||
3 files changed, 92 insertions(+)
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_core.c
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_core.c
|
||||
@@ -40,9 +40,11 @@
|
||||
#include <crypto/ctr.h>
|
||||
#include <crypto/gcm.h>
|
||||
#include <crypto/sha.h>
|
||||
+#include <crypto/rng.h>
|
||||
#include <crypto/scatterwalk.h>
|
||||
#include <crypto/skcipher.h>
|
||||
#include <crypto/internal/aead.h>
|
||||
+#include <crypto/internal/rng.h>
|
||||
#include <crypto/internal/skcipher.h>
|
||||
#include "crypto4xx_reg_def.h"
|
||||
#include "crypto4xx_core.h"
|
||||
@@ -1046,6 +1048,10 @@ static int crypto4xx_register_alg(struct
|
||||
rc = crypto_register_ahash(&alg->alg.u.hash);
|
||||
break;
|
||||
|
||||
+ case CRYPTO_ALG_TYPE_RNG:
|
||||
+ rc = crypto_register_rng(&alg->alg.u.rng);
|
||||
+ break;
|
||||
+
|
||||
default:
|
||||
rc = crypto_register_skcipher(&alg->alg.u.cipher);
|
||||
break;
|
||||
@@ -1075,6 +1081,10 @@ static void crypto4xx_unregister_alg(str
|
||||
crypto_unregister_aead(&alg->alg.u.aead);
|
||||
break;
|
||||
|
||||
+ case CRYPTO_ALG_TYPE_RNG:
|
||||
+ crypto_unregister_rng(&alg->alg.u.rng);
|
||||
+ break;
|
||||
+
|
||||
default:
|
||||
crypto_unregister_skcipher(&alg->alg.u.cipher);
|
||||
}
|
||||
@@ -1133,6 +1143,69 @@ static irqreturn_t crypto4xx_ce_interrup
|
||||
PPC4XX_TMO_ERR_INT);
|
||||
}
|
||||
|
||||
+static int ppc4xx_prng_data_read(struct crypto4xx_device *dev,
|
||||
+ u8 *data, unsigned int max)
|
||||
+{
|
||||
+ unsigned int i, curr = 0;
|
||||
+ u32 val[2];
|
||||
+
|
||||
+ do {
|
||||
+ /* trigger PRN generation */
|
||||
+ writel(PPC4XX_PRNG_CTRL_AUTO_EN,
|
||||
+ dev->ce_base + CRYPTO4XX_PRNG_CTRL);
|
||||
+
|
||||
+ for (i = 0; i < 1024; i++) {
|
||||
+ /* usually 19 iterations are enough */
|
||||
+ if ((readl(dev->ce_base + CRYPTO4XX_PRNG_STAT) &
|
||||
+ CRYPTO4XX_PRNG_STAT_BUSY))
|
||||
+ continue;
|
||||
+
|
||||
+ val[0] = readl_be(dev->ce_base + CRYPTO4XX_PRNG_RES_0);
|
||||
+ val[1] = readl_be(dev->ce_base + CRYPTO4XX_PRNG_RES_1);
|
||||
+ break;
|
||||
+ }
|
||||
+ if (i == 1024)
|
||||
+ return -ETIMEDOUT;
|
||||
+
|
||||
+ if ((max - curr) >= 8) {
|
||||
+ memcpy(data, &val, 8);
|
||||
+ data += 8;
|
||||
+ curr += 8;
|
||||
+ } else {
|
||||
+ /* copy only remaining bytes */
|
||||
+ memcpy(data, &val, max - curr);
|
||||
+ break;
|
||||
+ }
|
||||
+ } while (curr < max);
|
||||
+
|
||||
+ return curr;
|
||||
+}
|
||||
+
|
||||
+static int crypto4xx_prng_generate(struct crypto_rng *tfm,
|
||||
+ const u8 *src, unsigned int slen,
|
||||
+ u8 *dstn, unsigned int dlen)
|
||||
+{
|
||||
+ struct rng_alg *alg = crypto_rng_alg(tfm);
|
||||
+ struct crypto4xx_alg *amcc_alg;
|
||||
+ struct crypto4xx_device *dev;
|
||||
+ int ret;
|
||||
+
|
||||
+ amcc_alg = container_of(alg, struct crypto4xx_alg, alg.u.rng);
|
||||
+ dev = amcc_alg->dev;
|
||||
+
|
||||
+ mutex_lock(&dev->core_dev->rng_lock);
|
||||
+ ret = ppc4xx_prng_data_read(dev, dstn, dlen);
|
||||
+ mutex_unlock(&dev->core_dev->rng_lock);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int crypto4xx_prng_seed(struct crypto_rng *tfm, const u8 *seed,
|
||||
+ unsigned int slen)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* Supported Crypto Algorithms
|
||||
*/
|
||||
@@ -1302,6 +1375,18 @@ static struct crypto4xx_alg_common crypt
|
||||
.cra_module = THIS_MODULE,
|
||||
},
|
||||
} },
|
||||
+ { .type = CRYPTO_ALG_TYPE_RNG, .u.rng = {
|
||||
+ .base = {
|
||||
+ .cra_name = "stdrng",
|
||||
+ .cra_driver_name = "crypto4xx_rng",
|
||||
+ .cra_priority = 300,
|
||||
+ .cra_ctxsize = 0,
|
||||
+ .cra_module = THIS_MODULE,
|
||||
+ },
|
||||
+ .generate = crypto4xx_prng_generate,
|
||||
+ .seed = crypto4xx_prng_seed,
|
||||
+ .seedsize = 0,
|
||||
+ } },
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1371,6 +1456,7 @@ static int crypto4xx_probe(struct platfo
|
||||
core_dev->dev->core_dev = core_dev;
|
||||
core_dev->dev->is_revb = is_revb;
|
||||
core_dev->device = dev;
|
||||
+ mutex_init(&core_dev->rng_lock);
|
||||
spin_lock_init(&core_dev->lock);
|
||||
INIT_LIST_HEAD(&core_dev->dev->alg_list);
|
||||
ratelimit_default_init(&core_dev->dev->aead_ratelimit);
|
||||
@@ -1450,6 +1536,7 @@ static int crypto4xx_remove(struct platf
|
||||
tasklet_kill(&core_dev->tasklet);
|
||||
/* Un-register with Linux CryptoAPI */
|
||||
crypto4xx_unregister_alg(core_dev->dev);
|
||||
+ mutex_destroy(&core_dev->rng_lock);
|
||||
/* Free all allocated memory */
|
||||
crypto4xx_stop_all(core_dev);
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_core.h
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_core.h
|
||||
@@ -23,8 +23,10 @@
|
||||
#define __CRYPTO4XX_CORE_H__
|
||||
|
||||
#include <linux/ratelimit.h>
|
||||
+#include <linux/mutex.h>
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <crypto/internal/aead.h>
|
||||
+#include <crypto/internal/rng.h>
|
||||
#include <crypto/internal/skcipher.h>
|
||||
#include "crypto4xx_reg_def.h"
|
||||
#include "crypto4xx_sa.h"
|
||||
@@ -119,6 +121,7 @@ struct crypto4xx_core_device {
|
||||
u32 irq;
|
||||
struct tasklet_struct tasklet;
|
||||
spinlock_t lock;
|
||||
+ struct mutex rng_lock;
|
||||
};
|
||||
|
||||
struct crypto4xx_ctx {
|
||||
@@ -143,6 +146,7 @@ struct crypto4xx_alg_common {
|
||||
struct skcipher_alg cipher;
|
||||
struct ahash_alg hash;
|
||||
struct aead_alg aead;
|
||||
+ struct rng_alg rng;
|
||||
} u;
|
||||
};
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_reg_def.h
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_reg_def.h
|
||||
@@ -100,6 +100,7 @@
|
||||
#define CRYPTO4XX_ENDIAN_CFG 0x000600d8
|
||||
|
||||
#define CRYPTO4XX_PRNG_STAT 0x00070000
|
||||
+#define CRYPTO4XX_PRNG_STAT_BUSY 0x1
|
||||
#define CRYPTO4XX_PRNG_CTRL 0x00070004
|
||||
#define CRYPTO4XX_PRNG_SEED_L 0x00070008
|
||||
#define CRYPTO4XX_PRNG_SEED_H 0x0007000c
|
@ -1,39 +0,0 @@
|
||||
From 6e88098ca43a3d80ae86908f7badba683c8a0d84 Mon Sep 17 00:00:00 2001
|
||||
From: Corentin Labbe <clabbe@baylibre.com>
|
||||
Date: Wed, 23 Jan 2019 11:24:18 +0000
|
||||
Subject: [PATCH 07/15] crypto: crypto4xx - Fix wrong
|
||||
ppc4xx_trng_probe()/ppc4xx_trng_remove() arguments
|
||||
|
||||
When building without CONFIG_HW_RANDOM_PPC4XX, I hit the following build failure:
|
||||
drivers/crypto/amcc/crypto4xx_core.c: In function 'crypto4xx_probe':
|
||||
drivers/crypto/amcc/crypto4xx_core.c:1407:20: error: passing argument 1 of 'ppc4xx_trng_probe' from incompatible pointer type [-Werror=incompatible-pointer-types]
|
||||
In file included from drivers/crypto/amcc/crypto4xx_core.c:50:0:
|
||||
drivers/crypto/amcc/crypto4xx_trng.h:28:20: note: expected 'struct crypto4xx_device *' but argument is of type 'struct crypto4xx_core_device *'
|
||||
drivers/crypto/amcc/crypto4xx_core.c: In function 'crypto4xx_remove':
|
||||
drivers/crypto/amcc/crypto4xx_core.c:1434:21: error: passing argument 1 of 'ppc4xx_trng_remove' from incompatible pointer type [-Werror=incompatible-pointer-types]
|
||||
In file included from drivers/crypto/amcc/crypto4xx_core.c:50:0:
|
||||
drivers/crypto/amcc/crypto4xx_trng.h:30:20: note: expected 'struct crypto4xx_device *' but argument is of type 'struct crypto4xx_core_device *'
|
||||
|
||||
This patch fix the needed argument of ppc4xx_trng_probe()/ppc4xx_trng_remove() in that case.
|
||||
|
||||
Fixes: 5343e674f32f ("crypto4xx: integrate ppc4xx-rng into crypto4xx")
|
||||
Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
drivers/crypto/amcc/crypto4xx_trng.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_trng.h
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_trng.h
|
||||
@@ -26,9 +26,9 @@ void ppc4xx_trng_probe(struct crypto4xx_
|
||||
void ppc4xx_trng_remove(struct crypto4xx_core_device *core_dev);
|
||||
#else
|
||||
static inline void ppc4xx_trng_probe(
|
||||
- struct crypto4xx_device *dev __maybe_unused) { }
|
||||
+ struct crypto4xx_core_device *dev __maybe_unused) { }
|
||||
static inline void ppc4xx_trng_remove(
|
||||
- struct crypto4xx_device *dev __maybe_unused) { }
|
||||
+ struct crypto4xx_core_device *dev __maybe_unused) { }
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,63 +0,0 @@
|
||||
From 38cf5533d7a876f75088bacc1277046f30005f28 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Mon, 22 Apr 2019 13:26:01 +0200
|
||||
Subject: [PATCH 12/15] crypto: crypto4xx - get rid of redundant using_sd
|
||||
variable
|
||||
|
||||
using_sd is used as a stand-in for sa_command_0.bf.scatter
|
||||
that we need to set anyway, so we might as well just prevent
|
||||
double-accounting.
|
||||
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
drivers/crypto/amcc/crypto4xx_core.c | 6 ++----
|
||||
drivers/crypto/amcc/crypto4xx_core.h | 1 -
|
||||
2 files changed, 2 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_core.c
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_core.c
|
||||
@@ -539,7 +539,7 @@ static void crypto4xx_cipher_done(struct
|
||||
|
||||
req = skcipher_request_cast(pd_uinfo->async_req);
|
||||
|
||||
- if (pd_uinfo->using_sd) {
|
||||
+ if (pd_uinfo->sa_va->sa_command_0.bf.scatter) {
|
||||
crypto4xx_copy_pkt_to_dst(dev, pd, pd_uinfo,
|
||||
req->cryptlen, req->dst);
|
||||
} else {
|
||||
@@ -593,7 +593,7 @@ static void crypto4xx_aead_done(struct c
|
||||
u32 icv[AES_BLOCK_SIZE];
|
||||
int err = 0;
|
||||
|
||||
- if (pd_uinfo->using_sd) {
|
||||
+ if (pd_uinfo->sa_va->sa_command_0.bf.scatter) {
|
||||
crypto4xx_copy_pkt_to_dst(dev, pd, pd_uinfo,
|
||||
pd->pd_ctl_len.bf.pkt_len,
|
||||
dst);
|
||||
@@ -887,7 +887,6 @@ int crypto4xx_build_pd(struct crypto_asy
|
||||
* we know application give us dst a whole piece of memory
|
||||
* no need to use scatter ring.
|
||||
*/
|
||||
- pd_uinfo->using_sd = 0;
|
||||
pd_uinfo->first_sd = 0xffffffff;
|
||||
sa->sa_command_0.bf.scatter = 0;
|
||||
pd->dest = (u32)dma_map_page(dev->core_dev->device,
|
||||
@@ -901,7 +900,6 @@ int crypto4xx_build_pd(struct crypto_asy
|
||||
u32 sd_idx = fst_sd;
|
||||
nbytes = datalen;
|
||||
sa->sa_command_0.bf.scatter = 1;
|
||||
- pd_uinfo->using_sd = 1;
|
||||
pd_uinfo->first_sd = fst_sd;
|
||||
sd = crypto4xx_get_sdp(dev, &sd_dma, sd_idx);
|
||||
pd->dest = sd_dma;
|
||||
--- a/drivers/crypto/amcc/crypto4xx_core.h
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_core.h
|
||||
@@ -64,7 +64,6 @@ union shadow_sa_buf {
|
||||
struct pd_uinfo {
|
||||
struct crypto4xx_device *dev;
|
||||
u32 state;
|
||||
- u32 using_sd;
|
||||
u32 first_gd; /* first gather discriptor
|
||||
used by this packet */
|
||||
u32 num_gd; /* number of gather discriptor
|
@ -1,60 +0,0 @@
|
||||
From bfa2ba7d9e6b20aca82b99e6842fe18842ae3a0f Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Fri, 17 May 2019 23:15:57 +0200
|
||||
Subject: [PATCH 13/15] crypto: crypto4xx - fix AES CTR blocksize value
|
||||
|
||||
This patch fixes a issue with crypto4xx's ctr(aes) that was
|
||||
discovered by libcapi's kcapi-enc-test.sh test.
|
||||
|
||||
The some of the ctr(aes) encryptions test were failing on the
|
||||
non-power-of-two test:
|
||||
|
||||
kcapi-enc - Error: encryption failed with error 0
|
||||
kcapi-enc - Error: decryption failed with error 0
|
||||
[FAILED: 32-bit - 5.1.0-rc1+] 15 bytes: STDIN / STDOUT enc test (128 bits):
|
||||
original file (1d100e..cc96184c) and generated file (e3b0c442..1b7852b855)
|
||||
[FAILED: 32-bit - 5.1.0-rc1+] 15 bytes: STDIN / STDOUT enc test (128 bits)
|
||||
(openssl generated CT): original file (e3b0..5) and generated file (3..8e)
|
||||
[PASSED: 32-bit - 5.1.0-rc1+] 15 bytes: STDIN / STDOUT enc test (128 bits)
|
||||
(openssl generated PT)
|
||||
[FAILED: 32-bit - 5.1.0-rc1+] 15 bytes: STDIN / STDOUT enc test (password):
|
||||
original file (1d1..84c) and generated file (e3b..852b855)
|
||||
|
||||
But the 16, 32, 512, 65536 tests always worked.
|
||||
|
||||
Thankfully, this isn't a hidden hardware problem like previously,
|
||||
instead this turned out to be a copy and paste issue.
|
||||
|
||||
With this patch, all the tests are passing with and
|
||||
kcapi-enc-test.sh gives crypto4xx's a clean bill of health:
|
||||
"Number of failures: 0" :).
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 98e87e3d933b ("crypto: crypto4xx - add aes-ctr support")
|
||||
Fixes: f2a13e7cba9e ("crypto: crypto4xx - enable AES RFC3686, ECB, CFB and OFB offloads")
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
drivers/crypto/amcc/crypto4xx_core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_core.c
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_core.c
|
||||
@@ -1257,7 +1257,7 @@ static struct crypto4xx_alg_common crypt
|
||||
.cra_flags = CRYPTO_ALG_NEED_FALLBACK |
|
||||
CRYPTO_ALG_ASYNC |
|
||||
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
||||
- .cra_blocksize = AES_BLOCK_SIZE,
|
||||
+ .cra_blocksize = 1,
|
||||
.cra_ctxsize = sizeof(struct crypto4xx_ctx),
|
||||
.cra_module = THIS_MODULE,
|
||||
},
|
||||
@@ -1277,7 +1277,7 @@ static struct crypto4xx_alg_common crypt
|
||||
.cra_priority = CRYPTO4XX_CRYPTO_PRIORITY,
|
||||
.cra_flags = CRYPTO_ALG_ASYNC |
|
||||
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
||||
- .cra_blocksize = AES_BLOCK_SIZE,
|
||||
+ .cra_blocksize = 1,
|
||||
.cra_ctxsize = sizeof(struct crypto4xx_ctx),
|
||||
.cra_module = THIS_MODULE,
|
||||
},
|
@ -1,44 +0,0 @@
|
||||
From 70c4997f34b6c6888b3ac157adec49e01d0df2d5 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Sat, 18 May 2019 23:28:11 +0200
|
||||
Subject: [PATCH 14/15] crypto: crypto4xx - fix blocksize for cfb and ofb
|
||||
|
||||
While the hardware consider them to be blockciphers, the
|
||||
reference implementation defines them as streamciphers.
|
||||
|
||||
Do the right thing and set the blocksize to 1. This
|
||||
was found by CONFIG_CRYPTO_MANAGER_EXTRA_TESTS.
|
||||
|
||||
This fixes the following issues:
|
||||
skcipher: blocksize for ofb-aes-ppc4xx (16) doesn't match generic impl (1)
|
||||
skcipher: blocksize for cfb-aes-ppc4xx (16) doesn't match generic impl (1)
|
||||
|
||||
Cc: Eric Biggers <ebiggers@kernel.org>
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: f2a13e7cba9e ("crypto: crypto4xx - enable AES RFC3686, ECB, CFB and OFB offloads")
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
drivers/crypto/amcc/crypto4xx_core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_core.c
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_core.c
|
||||
@@ -1236,7 +1236,7 @@ static struct crypto4xx_alg_common crypt
|
||||
.cra_priority = CRYPTO4XX_CRYPTO_PRIORITY,
|
||||
.cra_flags = CRYPTO_ALG_ASYNC |
|
||||
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
||||
- .cra_blocksize = AES_BLOCK_SIZE,
|
||||
+ .cra_blocksize = 1,
|
||||
.cra_ctxsize = sizeof(struct crypto4xx_ctx),
|
||||
.cra_module = THIS_MODULE,
|
||||
},
|
||||
@@ -1316,7 +1316,7 @@ static struct crypto4xx_alg_common crypt
|
||||
.cra_priority = CRYPTO4XX_CRYPTO_PRIORITY,
|
||||
.cra_flags = CRYPTO_ALG_ASYNC |
|
||||
CRYPTO_ALG_KERN_DRIVER_ONLY,
|
||||
- .cra_blocksize = AES_BLOCK_SIZE,
|
||||
+ .cra_blocksize = 1,
|
||||
.cra_ctxsize = sizeof(struct crypto4xx_ctx),
|
||||
.cra_module = THIS_MODULE,
|
||||
},
|
@ -1,172 +0,0 @@
|
||||
From 0f7a81374060828280fcfdfbaa162cb559017f9f Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Sat, 18 May 2019 23:28:12 +0200
|
||||
Subject: [PATCH 15/15] crypto: crypto4xx - block ciphers should only accept
|
||||
complete blocks
|
||||
|
||||
The hardware automatically zero pads incomplete block ciphers
|
||||
blocks without raising any errors. This is a screw-up. This
|
||||
was noticed by CONFIG_CRYPTO_MANAGER_EXTRA_TESTS tests that
|
||||
sent a incomplete blocks and expect them to fail.
|
||||
|
||||
This fixes:
|
||||
cbc-aes-ppc4xx encryption unexpectedly succeeded on test vector
|
||||
"random: len=2409 klen=32"; expected_error=-22, cfg="random:
|
||||
may_sleep use_digest src_divs=[96.90%@+2295, 2.34%@+4066,
|
||||
0.32%@alignmask+12, 0.34%@+4087, 0.9%@alignmask+1787, 0.1%@+3767]
|
||||
iv_offset=6"
|
||||
|
||||
ecb-aes-ppc4xx encryption unexpectedly succeeded on test vector
|
||||
"random: len=1011 klen=32"; expected_error=-22, cfg="random:
|
||||
may_sleep use_digest src_divs=[100.0%@alignmask+20]
|
||||
dst_divs=[3.12%@+3001, 96.88%@+4070]"
|
||||
|
||||
Cc: Eric Biggers <ebiggers@kernel.org>
|
||||
Cc: stable@vger.kernel.org [4.19, 5.0 and 5.1]
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
drivers/crypto/amcc/crypto4xx_alg.c | 36 +++++++++++++++++++---------
|
||||
drivers/crypto/amcc/crypto4xx_core.c | 16 ++++++-------
|
||||
drivers/crypto/amcc/crypto4xx_core.h | 10 ++++----
|
||||
3 files changed, 39 insertions(+), 23 deletions(-)
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_alg.c
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_alg.c
|
||||
@@ -76,12 +76,16 @@ static void set_dynamic_sa_command_1(str
|
||||
}
|
||||
|
||||
static inline int crypto4xx_crypt(struct skcipher_request *req,
|
||||
- const unsigned int ivlen, bool decrypt)
|
||||
+ const unsigned int ivlen, bool decrypt,
|
||||
+ bool check_blocksize)
|
||||
{
|
||||
struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req);
|
||||
struct crypto4xx_ctx *ctx = crypto_skcipher_ctx(cipher);
|
||||
__le32 iv[AES_IV_SIZE];
|
||||
|
||||
+ if (check_blocksize && !IS_ALIGNED(req->cryptlen, AES_BLOCK_SIZE))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
if (ivlen)
|
||||
crypto4xx_memcpy_to_le32(iv, req->iv, ivlen);
|
||||
|
||||
@@ -90,24 +94,34 @@ static inline int crypto4xx_crypt(struct
|
||||
ctx->sa_len, 0, NULL);
|
||||
}
|
||||
|
||||
-int crypto4xx_encrypt_noiv(struct skcipher_request *req)
|
||||
+int crypto4xx_encrypt_noiv_block(struct skcipher_request *req)
|
||||
+{
|
||||
+ return crypto4xx_crypt(req, 0, false, true);
|
||||
+}
|
||||
+
|
||||
+int crypto4xx_encrypt_iv_stream(struct skcipher_request *req)
|
||||
+{
|
||||
+ return crypto4xx_crypt(req, AES_IV_SIZE, false, false);
|
||||
+}
|
||||
+
|
||||
+int crypto4xx_decrypt_noiv_block(struct skcipher_request *req)
|
||||
{
|
||||
- return crypto4xx_crypt(req, 0, false);
|
||||
+ return crypto4xx_crypt(req, 0, true, true);
|
||||
}
|
||||
|
||||
-int crypto4xx_encrypt_iv(struct skcipher_request *req)
|
||||
+int crypto4xx_decrypt_iv_stream(struct skcipher_request *req)
|
||||
{
|
||||
- return crypto4xx_crypt(req, AES_IV_SIZE, false);
|
||||
+ return crypto4xx_crypt(req, AES_IV_SIZE, true, false);
|
||||
}
|
||||
|
||||
-int crypto4xx_decrypt_noiv(struct skcipher_request *req)
|
||||
+int crypto4xx_encrypt_iv_block(struct skcipher_request *req)
|
||||
{
|
||||
- return crypto4xx_crypt(req, 0, true);
|
||||
+ return crypto4xx_crypt(req, AES_IV_SIZE, false, true);
|
||||
}
|
||||
|
||||
-int crypto4xx_decrypt_iv(struct skcipher_request *req)
|
||||
+int crypto4xx_decrypt_iv_block(struct skcipher_request *req)
|
||||
{
|
||||
- return crypto4xx_crypt(req, AES_IV_SIZE, true);
|
||||
+ return crypto4xx_crypt(req, AES_IV_SIZE, true, true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -278,8 +292,8 @@ crypto4xx_ctr_crypt(struct skcipher_requ
|
||||
return ret;
|
||||
}
|
||||
|
||||
- return encrypt ? crypto4xx_encrypt_iv(req)
|
||||
- : crypto4xx_decrypt_iv(req);
|
||||
+ return encrypt ? crypto4xx_encrypt_iv_stream(req)
|
||||
+ : crypto4xx_decrypt_iv_stream(req);
|
||||
}
|
||||
|
||||
static int crypto4xx_sk_setup_fallback(struct crypto4xx_ctx *ctx,
|
||||
--- a/drivers/crypto/amcc/crypto4xx_core.c
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_core.c
|
||||
@@ -1224,8 +1224,8 @@ static struct crypto4xx_alg_common crypt
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
.ivsize = AES_IV_SIZE,
|
||||
.setkey = crypto4xx_setkey_aes_cbc,
|
||||
- .encrypt = crypto4xx_encrypt_iv,
|
||||
- .decrypt = crypto4xx_decrypt_iv,
|
||||
+ .encrypt = crypto4xx_encrypt_iv_block,
|
||||
+ .decrypt = crypto4xx_decrypt_iv_block,
|
||||
.init = crypto4xx_sk_init,
|
||||
.exit = crypto4xx_sk_exit,
|
||||
} },
|
||||
@@ -1244,8 +1244,8 @@ static struct crypto4xx_alg_common crypt
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
.ivsize = AES_IV_SIZE,
|
||||
.setkey = crypto4xx_setkey_aes_cfb,
|
||||
- .encrypt = crypto4xx_encrypt_iv,
|
||||
- .decrypt = crypto4xx_decrypt_iv,
|
||||
+ .encrypt = crypto4xx_encrypt_iv_stream,
|
||||
+ .decrypt = crypto4xx_decrypt_iv_stream,
|
||||
.init = crypto4xx_sk_init,
|
||||
.exit = crypto4xx_sk_exit,
|
||||
} },
|
||||
@@ -1304,8 +1304,8 @@ static struct crypto4xx_alg_common crypt
|
||||
.min_keysize = AES_MIN_KEY_SIZE,
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
.setkey = crypto4xx_setkey_aes_ecb,
|
||||
- .encrypt = crypto4xx_encrypt_noiv,
|
||||
- .decrypt = crypto4xx_decrypt_noiv,
|
||||
+ .encrypt = crypto4xx_encrypt_noiv_block,
|
||||
+ .decrypt = crypto4xx_decrypt_noiv_block,
|
||||
.init = crypto4xx_sk_init,
|
||||
.exit = crypto4xx_sk_exit,
|
||||
} },
|
||||
@@ -1324,8 +1324,8 @@ static struct crypto4xx_alg_common crypt
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
.ivsize = AES_IV_SIZE,
|
||||
.setkey = crypto4xx_setkey_aes_ofb,
|
||||
- .encrypt = crypto4xx_encrypt_iv,
|
||||
- .decrypt = crypto4xx_decrypt_iv,
|
||||
+ .encrypt = crypto4xx_encrypt_iv_stream,
|
||||
+ .decrypt = crypto4xx_decrypt_iv_stream,
|
||||
.init = crypto4xx_sk_init,
|
||||
.exit = crypto4xx_sk_exit,
|
||||
} },
|
||||
--- a/drivers/crypto/amcc/crypto4xx_core.h
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_core.h
|
||||
@@ -182,10 +182,12 @@ int crypto4xx_setkey_rfc3686(struct cryp
|
||||
const u8 *key, unsigned int keylen);
|
||||
int crypto4xx_encrypt_ctr(struct skcipher_request *req);
|
||||
int crypto4xx_decrypt_ctr(struct skcipher_request *req);
|
||||
-int crypto4xx_encrypt_iv(struct skcipher_request *req);
|
||||
-int crypto4xx_decrypt_iv(struct skcipher_request *req);
|
||||
-int crypto4xx_encrypt_noiv(struct skcipher_request *req);
|
||||
-int crypto4xx_decrypt_noiv(struct skcipher_request *req);
|
||||
+int crypto4xx_encrypt_iv_stream(struct skcipher_request *req);
|
||||
+int crypto4xx_decrypt_iv_stream(struct skcipher_request *req);
|
||||
+int crypto4xx_encrypt_iv_block(struct skcipher_request *req);
|
||||
+int crypto4xx_decrypt_iv_block(struct skcipher_request *req);
|
||||
+int crypto4xx_encrypt_noiv_block(struct skcipher_request *req);
|
||||
+int crypto4xx_decrypt_noiv_block(struct skcipher_request *req);
|
||||
int crypto4xx_rfc3686_encrypt(struct skcipher_request *req);
|
||||
int crypto4xx_rfc3686_decrypt(struct skcipher_request *req);
|
||||
int crypto4xx_sha1_alg_init(struct crypto_tfm *tfm);
|
@ -1,169 +0,0 @@
|
||||
From cc809a441d8f2924f785eb863dfa6aef47a25b0b Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Tue, 12 Aug 2014 20:49:27 +0200
|
||||
Subject: [PATCH 30/36] GPIO: add named gpio exports
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/gpio/gpiolib-of.c | 68 +++++++++++++++++++++++++++++++++++++++++
|
||||
drivers/gpio/gpiolib.c | 11 +++++--
|
||||
include/asm-generic/gpio.h | 5 +++
|
||||
include/linux/gpio/consumer.h | 8 +++++
|
||||
4 files changed, 90 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/gpio/gpiolib-of.c
|
||||
+++ b/drivers/gpio/gpiolib-of.c
|
||||
@@ -23,6 +23,8 @@
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/platform_device.h>
|
||||
|
||||
#include "gpiolib.h"
|
||||
|
||||
@@ -660,3 +662,72 @@ void of_gpiochip_remove(struct gpio_chip
|
||||
gpiochip_remove_pin_ranges(chip);
|
||||
of_node_put(chip->of_node);
|
||||
}
|
||||
+
|
||||
+#ifdef CONFIG_GPIO_SYSFS
|
||||
+
|
||||
+static struct of_device_id gpio_export_ids[] = {
|
||||
+ { .compatible = "gpio-export" },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+
|
||||
+static int of_gpio_export_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device_node *np = pdev->dev.of_node;
|
||||
+ struct device_node *cnp;
|
||||
+ u32 val;
|
||||
+ int nb = 0;
|
||||
+
|
||||
+ for_each_child_of_node(np, cnp) {
|
||||
+ const char *name = NULL;
|
||||
+ int gpio;
|
||||
+ bool dmc;
|
||||
+ int max_gpio = 1;
|
||||
+ int i;
|
||||
+
|
||||
+ of_property_read_string(cnp, "gpio-export,name", &name);
|
||||
+
|
||||
+ if (!name)
|
||||
+ max_gpio = of_gpio_count(cnp);
|
||||
+
|
||||
+ for (i = 0; i < max_gpio; i++) {
|
||||
+ unsigned flags = 0;
|
||||
+ enum of_gpio_flags of_flags;
|
||||
+
|
||||
+ gpio = of_get_gpio_flags(cnp, i, &of_flags);
|
||||
+ if (!gpio_is_valid(gpio))
|
||||
+ return gpio;
|
||||
+
|
||||
+ if (of_flags == OF_GPIO_ACTIVE_LOW)
|
||||
+ flags |= GPIOF_ACTIVE_LOW;
|
||||
+
|
||||
+ if (!of_property_read_u32(cnp, "gpio-export,output", &val))
|
||||
+ flags |= val ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
|
||||
+ else
|
||||
+ flags |= GPIOF_IN;
|
||||
+
|
||||
+ if (devm_gpio_request_one(&pdev->dev, gpio, flags, name ? name : of_node_full_name(np)))
|
||||
+ continue;
|
||||
+
|
||||
+ dmc = of_property_read_bool(cnp, "gpio-export,direction_may_change");
|
||||
+ gpio_export_with_name(gpio, dmc, name);
|
||||
+ nb++;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ dev_info(&pdev->dev, "%d gpio(s) exported\n", nb);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver gpio_export_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "gpio-export",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = of_match_ptr(gpio_export_ids),
|
||||
+ },
|
||||
+ .probe = of_gpio_export_probe,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(gpio_export_driver);
|
||||
+
|
||||
+#endif
|
||||
--- a/include/asm-generic/gpio.h
|
||||
+++ b/include/asm-generic/gpio.h
|
||||
@@ -127,6 +127,12 @@ static inline int gpio_export(unsigned g
|
||||
return gpiod_export(gpio_to_desc(gpio), direction_may_change);
|
||||
}
|
||||
|
||||
+int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name);
|
||||
+static inline int gpio_export_with_name(unsigned gpio, bool direction_may_change, const char *name)
|
||||
+{
|
||||
+ return __gpiod_export(gpio_to_desc(gpio), direction_may_change, name);
|
||||
+}
|
||||
+
|
||||
static inline int gpio_export_link(struct device *dev, const char *name,
|
||||
unsigned gpio)
|
||||
{
|
||||
--- a/include/linux/gpio/consumer.h
|
||||
+++ b/include/linux/gpio/consumer.h
|
||||
@@ -533,6 +533,7 @@ struct gpio_desc *devm_fwnode_get_gpiod_
|
||||
|
||||
#if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS)
|
||||
|
||||
+int _gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name);
|
||||
int gpiod_export(struct gpio_desc *desc, bool direction_may_change);
|
||||
int gpiod_export_link(struct device *dev, const char *name,
|
||||
struct gpio_desc *desc);
|
||||
@@ -540,6 +541,13 @@ void gpiod_unexport(struct gpio_desc *de
|
||||
|
||||
#else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
|
||||
|
||||
+static inline int _gpiod_export(struct gpio_desc *desc,
|
||||
+ bool direction_may_change,
|
||||
+ const char *name)
|
||||
+{
|
||||
+ return -ENOSYS;
|
||||
+}
|
||||
+
|
||||
static inline int gpiod_export(struct gpio_desc *desc,
|
||||
bool direction_may_change)
|
||||
{
|
||||
--- a/drivers/gpio/gpiolib-sysfs.c
|
||||
+++ b/drivers/gpio/gpiolib-sysfs.c
|
||||
@@ -568,7 +568,7 @@ static struct class gpio_class = {
|
||||
*
|
||||
* Returns zero on success, else an error.
|
||||
*/
|
||||
-int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
|
||||
+int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name)
|
||||
{
|
||||
struct gpio_chip *chip;
|
||||
struct gpio_device *gdev;
|
||||
@@ -630,6 +630,8 @@ int gpiod_export(struct gpio_desc *desc,
|
||||
offset = gpio_chip_hwgpio(desc);
|
||||
if (chip->names && chip->names[offset])
|
||||
ioname = chip->names[offset];
|
||||
+ if (name)
|
||||
+ ioname = name;
|
||||
|
||||
dev = device_create_with_groups(&gpio_class, &gdev->dev,
|
||||
MKDEV(0, 0), data, gpio_groups,
|
||||
@@ -651,6 +653,12 @@ err_unlock:
|
||||
gpiod_dbg(desc, "%s: status %d\n", __func__, status);
|
||||
return status;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(__gpiod_export);
|
||||
+
|
||||
+int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
|
||||
+{
|
||||
+ return __gpiod_export(desc, direction_may_change, NULL);
|
||||
+}
|
||||
EXPORT_SYMBOL_GPL(gpiod_export);
|
||||
|
||||
static int match_export(struct device *dev, const void *desc)
|
@ -1,30 +0,0 @@
|
||||
--- a/arch/powerpc/platforms/44x/Kconfig
|
||||
+++ b/arch/powerpc/platforms/44x/Kconfig
|
||||
@@ -131,6 +131,17 @@ config CANYONLANDS
|
||||
help
|
||||
This option enables support for the AMCC PPC460EX evaluation board.
|
||||
|
||||
+config APOLLO3G
|
||||
+ bool "Apollo3G"
|
||||
+ depends on 44x
|
||||
+ default n
|
||||
+ select PPC44x_SIMPLE
|
||||
+ select APM821xx
|
||||
+ select IBM_EMAC_RGMII
|
||||
+ select 460EX
|
||||
+ help
|
||||
+ This option enables support for the AMCC Apollo 3G board.
|
||||
+
|
||||
config GLACIER
|
||||
bool "Glacier"
|
||||
depends on 44x
|
||||
--- a/arch/powerpc/platforms/44x/ppc44x_simple.c
|
||||
+++ b/arch/powerpc/platforms/44x/ppc44x_simple.c
|
||||
@@ -50,6 +50,7 @@ machine_device_initcall(ppc44x_simple, p
|
||||
* board.c file for it rather than adding it to this list.
|
||||
*/
|
||||
static char *board[] __initdata = {
|
||||
+ "amcc,apollo3g",
|
||||
"amcc,arches",
|
||||
"amcc,bamboo",
|
||||
"apm,bluestone",
|
@ -1,32 +0,0 @@
|
||||
--- a/arch/powerpc/platforms/44x/Makefile
|
||||
+++ b/arch/powerpc/platforms/44x/Makefile
|
||||
@@ -4,6 +4,7 @@ ifneq ($(CONFIG_PPC4xx_CPM),y)
|
||||
obj-y += idle.o
|
||||
endif
|
||||
obj-$(CONFIG_PPC44x_SIMPLE) += ppc44x_simple.o
|
||||
+obj-$(CONFIG_WNDR4700) += wndr4700.o
|
||||
obj-$(CONFIG_EBONY) += ebony.o
|
||||
obj-$(CONFIG_SAM440EP) += sam440ep.o
|
||||
obj-$(CONFIG_WARP) += warp.o
|
||||
--- a/arch/powerpc/platforms/44x/Kconfig
|
||||
+++ b/arch/powerpc/platforms/44x/Kconfig
|
||||
@@ -260,6 +260,19 @@ config ICON
|
||||
help
|
||||
This option enables support for the AMCC PPC440SPe evaluation board.
|
||||
|
||||
+config WNDR4700
|
||||
+ bool "WNDR4700"
|
||||
+ depends on 44x
|
||||
+ default n
|
||||
+ select APM821xx
|
||||
+ select PCI_MSI
|
||||
+ select PPC4xx_MSI
|
||||
+ select PPC4xx_PCI_EXPRESS
|
||||
+ select IBM_EMAC_RGMII
|
||||
+ select 460EX
|
||||
+ help
|
||||
+ This option enables support for the Netgear WNDR4700/WNDR4720 board.
|
||||
+
|
||||
config XILINX_VIRTEX440_GENERIC_BOARD
|
||||
bool "Generic Xilinx Virtex 5 FXT board support"
|
||||
depends on 44x
|
@ -1,51 +0,0 @@
|
||||
--- a/arch/powerpc/platforms/4xx/pci.c
|
||||
+++ b/arch/powerpc/platforms/4xx/pci.c
|
||||
@@ -1060,15 +1060,24 @@ static int __init apm821xx_pciex_init_po
|
||||
u32 val;
|
||||
|
||||
/*
|
||||
- * Do a software reset on PCIe ports.
|
||||
- * This code is to fix the issue that pci drivers doesn't re-assign
|
||||
- * bus number for PCIE devices after Uboot
|
||||
- * scanned and configured all the buses (eg. PCIE NIC IntelPro/1000
|
||||
- * PT quad port, SAS LSI 1064E)
|
||||
+ * Only reset the PHY when no link is currently established.
|
||||
+ * This is for the Atheros PCIe board which has problems to establish
|
||||
+ * the link (again) after this PHY reset. All other currently tested
|
||||
+ * PCIe boards don't show this problem.
|
||||
*/
|
||||
-
|
||||
- mtdcri(SDR0, PESDR0_460EX_PHY_CTL_RST, 0x0);
|
||||
- mdelay(10);
|
||||
+ val = mfdcri(SDR0, port->sdr_base + PESDRn_LOOP);
|
||||
+ if (!(val & 0x00001000)) {
|
||||
+ /*
|
||||
+ * Do a software reset on PCIe ports.
|
||||
+ * This code is to fix the issue that pci drivers doesn't re-assign
|
||||
+ * bus number for PCIE devices after Uboot
|
||||
+ * scanned and configured all the buses (eg. PCIE NIC IntelPro/1000
|
||||
+ * PT quad port, SAS LSI 1064E)
|
||||
+ */
|
||||
+
|
||||
+ mtdcri(SDR0, PESDR0_460EX_PHY_CTL_RST, 0x0);
|
||||
+ mdelay(10);
|
||||
+ }
|
||||
|
||||
if (port->endpoint)
|
||||
val = PTYPE_LEGACY_ENDPOINT << 20;
|
||||
@@ -1085,9 +1094,12 @@ static int __init apm821xx_pciex_init_po
|
||||
mtdcri(SDR0, PESDR0_460EX_L0DRV, 0x00000130);
|
||||
mtdcri(SDR0, PESDR0_460EX_L0CLK, 0x00000006);
|
||||
|
||||
- mtdcri(SDR0, PESDR0_460EX_PHY_CTL_RST, 0x10000000);
|
||||
- mdelay(50);
|
||||
- mtdcri(SDR0, PESDR0_460EX_PHY_CTL_RST, 0x30000000);
|
||||
+ val = mfdcri(SDR0, port->sdr_base + PESDRn_LOOP);
|
||||
+ if (!(val & 0x00001000)) {
|
||||
+ mtdcri(SDR0, PESDR0_460EX_PHY_CTL_RST, 0x10000000);
|
||||
+ mdelay(50);
|
||||
+ mtdcri(SDR0, PESDR0_460EX_PHY_CTL_RST, 0x30000000);
|
||||
+ }
|
||||
|
||||
mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET,
|
||||
mfdcri(SDR0, port->sdr_base + PESDRn_RCSSET) |
|
@ -1,14 +0,0 @@
|
||||
--- a/arch/powerpc/platforms/4xx/pci.c
|
||||
+++ b/arch/powerpc/platforms/4xx/pci.c
|
||||
@@ -1905,9 +1905,9 @@ static void __init ppc4xx_configure_pcie
|
||||
* if it works
|
||||
*/
|
||||
out_le32(mbase + PECFG_PIM0LAL, 0x00000000);
|
||||
- out_le32(mbase + PECFG_PIM0LAH, 0x00000000);
|
||||
+ out_le32(mbase + PECFG_PIM0LAH, 0x00000008);
|
||||
out_le32(mbase + PECFG_PIM1LAL, 0x00000000);
|
||||
- out_le32(mbase + PECFG_PIM1LAH, 0x00000000);
|
||||
+ out_le32(mbase + PECFG_PIM1LAH, 0x0000000c);
|
||||
out_le32(mbase + PECFG_PIM01SAH, 0xffff0000);
|
||||
out_le32(mbase + PECFG_PIM01SAL, 0x00000000);
|
||||
|
@ -1,545 +0,0 @@
|
||||
From 419992bae5aaa4e06402e0b7c79fcf7bcb6b4764 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@googlemail.com>
|
||||
Date: Thu, 2 Jun 2016 00:48:46 +0200
|
||||
Subject: [PATCH] usb: xhci: add firmware loader for uPD720201 and uPD720202
|
||||
w/o ROM
|
||||
|
||||
This patch adds a firmware loader for the uPD720201K8-711-BAC-A
|
||||
and uPD720202K8-711-BAA-A variant. Both of these chips are listed
|
||||
in Renesas' R19UH0078EJ0500 Rev.5.00 "User's Manual: Hardware" as
|
||||
devices which need the firmware loader on page 2 in order to
|
||||
work as they "do not support the External ROM".
|
||||
|
||||
The "Firmware Download Sequence" is describe in chapter
|
||||
"7.1 FW Download Interface" R19UH0078EJ0500 Rev.5.00 page 131.
|
||||
|
||||
The firmware "K2013080.mem" is available from a USB3.0 Host to
|
||||
PCIe Adapter (PP2U-E card) "Firmware download" archive. An
|
||||
alternative version can be sourced from Netgear's WNDR4700 GPL
|
||||
archives.
|
||||
|
||||
The release notes of the PP2U-E's "Firmware Download" ver 2.0.1.3
|
||||
(2012-06-15) state that the firmware is for the following devices:
|
||||
- uPD720201 ES 2.0 sample whose revision ID is 2.
|
||||
- uPD720201 ES 2.1 sample & CS sample & Mass product, ID is 3.
|
||||
- uPD720202 ES 2.0 sample & CS sample & Mass product, ID is 2.
|
||||
|
||||
If someone from Renesas is listening: It would be great, if these
|
||||
firmwares could be added to linux-firmware.git.
|
||||
|
||||
Cc: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
|
||||
Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
|
||||
---
|
||||
drivers/usb/host/xhci-pci.c | 492 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 492 insertions(+)
|
||||
|
||||
--- a/drivers/usb/host/xhci-pci.c
|
||||
+++ b/drivers/usb/host/xhci-pci.c
|
||||
@@ -12,6 +12,8 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/acpi.h>
|
||||
+#include <linux/firmware.h>
|
||||
+#include <asm/unaligned.h>
|
||||
|
||||
#include "xhci.h"
|
||||
#include "xhci-trace.h"
|
||||
@@ -262,6 +264,458 @@ static void xhci_pme_acpi_rtd3_enable(st
|
||||
static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { }
|
||||
#endif /* CONFIG_ACPI */
|
||||
|
||||
+static const struct renesas_fw_entry {
|
||||
+ const char *firmware_name;
|
||||
+ u16 device;
|
||||
+ u8 revision;
|
||||
+ u16 expected_version;
|
||||
+} renesas_fw_table[] = {
|
||||
+ /*
|
||||
+ * Only the uPD720201K8-711-BAC-A or uPD720202K8-711-BAA-A
|
||||
+ * are listed in R19UH0078EJ0500 Rev.5.00 as devices which
|
||||
+ * need the software loader.
|
||||
+ *
|
||||
+ * PP2U/ReleaseNote_USB3-201-202-FW.txt:
|
||||
+ *
|
||||
+ * Note: This firmware is for the following devices.
|
||||
+ * - uPD720201 ES 2.0 sample whose revision ID is 2.
|
||||
+ * - uPD720201 ES 2.1 sample & CS sample & Mass product, ID is 3.
|
||||
+ * - uPD720202 ES 2.0 sample & CS sample & Mass product, ID is 2.
|
||||
+ */
|
||||
+ { "K2013080.mem", 0x0014, 0x02, 0x2013 },
|
||||
+ { "K2013080.mem", 0x0014, 0x03, 0x2013 },
|
||||
+ { "K2013080.mem", 0x0015, 0x02, 0x2013 },
|
||||
+};
|
||||
+
|
||||
+static const struct renesas_fw_entry *renesas_needs_fw_dl(struct pci_dev *dev)
|
||||
+{
|
||||
+ const struct renesas_fw_entry *entry;
|
||||
+ size_t i;
|
||||
+
|
||||
+ /* This loader will only work with a RENESAS device. */
|
||||
+ if (!(dev->vendor == PCI_VENDOR_ID_RENESAS))
|
||||
+ return NULL;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(renesas_fw_table); i++) {
|
||||
+ entry = &renesas_fw_table[i];
|
||||
+ if (entry->device == dev->device &&
|
||||
+ entry->revision == dev->revision)
|
||||
+ return entry;
|
||||
+ }
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static int renesas_fw_download_image(struct pci_dev *dev,
|
||||
+ const u32 *fw,
|
||||
+ size_t step)
|
||||
+{
|
||||
+ size_t i;
|
||||
+ int err;
|
||||
+ u8 fw_status;
|
||||
+ bool data0_or_data1;
|
||||
+
|
||||
+ /*
|
||||
+ * The hardware does alternate between two 32-bit pages.
|
||||
+ * (This is because each row of the firmware is 8 bytes).
|
||||
+ *
|
||||
+ * for even steps we use DATA0, for odd steps DATA1.
|
||||
+ */
|
||||
+ data0_or_data1 = (step & 1) == 1;
|
||||
+
|
||||
+ /* step+1. Read "Set DATAX" and confirm it is cleared. */
|
||||
+ for (i = 0; i < 10000; i++) {
|
||||
+ err = pci_read_config_byte(dev, 0xF5, &fw_status);
|
||||
+ if (err)
|
||||
+ return pcibios_err_to_errno(err);
|
||||
+ if (!(fw_status & BIT(data0_or_data1)))
|
||||
+ break;
|
||||
+
|
||||
+ udelay(1);
|
||||
+ }
|
||||
+ if (i == 10000)
|
||||
+ return -ETIMEDOUT;
|
||||
+
|
||||
+ /*
|
||||
+ * step+2. Write FW data to "DATAX".
|
||||
+ * "LSB is left" => force little endian
|
||||
+ */
|
||||
+ err = pci_write_config_dword(dev, data0_or_data1 ? 0xFC : 0xF8,
|
||||
+ (__force u32) cpu_to_le32(fw[step]));
|
||||
+ if (err)
|
||||
+ return pcibios_err_to_errno(err);
|
||||
+
|
||||
+ udelay(100);
|
||||
+
|
||||
+ /* step+3. Set "Set DATAX". */
|
||||
+ err = pci_write_config_byte(dev, 0xF5, BIT(data0_or_data1));
|
||||
+ if (err)
|
||||
+ return pcibios_err_to_errno(err);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int renesas_fw_verify(struct pci_dev *dev,
|
||||
+ const void *fw_data,
|
||||
+ size_t length)
|
||||
+{
|
||||
+ const struct renesas_fw_entry *entry = renesas_needs_fw_dl(dev);
|
||||
+ u16 fw_version_pointer;
|
||||
+ u16 fw_version;
|
||||
+
|
||||
+ if (!entry)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ /*
|
||||
+ * The Firmware's Data Format is describe in
|
||||
+ * "6.3 Data Format" R19UH0078EJ0500 Rev.5.00 page 124
|
||||
+ */
|
||||
+
|
||||
+ /* "Each row is 8 bytes". => firmware size must be a multiple of 8. */
|
||||
+ if (length % 8 != 0) {
|
||||
+ dev_err(&dev->dev, "firmware size is not a multipe of 8.");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * The bootrom chips of the big brother have sizes up to 64k, let's
|
||||
+ * assume that's the biggest the firmware can get.
|
||||
+ */
|
||||
+ if (length < 0x1000 || length >= 0x10000) {
|
||||
+ dev_err(&dev->dev, "firmware is size %zd is not (4k - 64k).",
|
||||
+ length);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /* The First 2 bytes are fixed value (55aa). "LSB on Left" */
|
||||
+ if (get_unaligned_le16(fw_data) != 0x55aa) {
|
||||
+ dev_err(&dev->dev, "no valid firmware header found.");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /* verify the firmware version position and print it. */
|
||||
+ fw_version_pointer = get_unaligned_le16(fw_data + 4);
|
||||
+ if (fw_version_pointer + 2 >= length) {
|
||||
+ dev_err(&dev->dev, "firmware version pointer is outside of the firmware image.");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ fw_version = get_unaligned_le16(fw_data + fw_version_pointer);
|
||||
+ dev_dbg(&dev->dev, "got firmware version: %02x.", fw_version);
|
||||
+
|
||||
+ if (fw_version != entry->expected_version) {
|
||||
+ dev_err(&dev->dev, "firmware version mismatch, expected version: %02x.",
|
||||
+ entry->expected_version);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int renesas_fw_check_running(struct pci_dev *pdev)
|
||||
+{
|
||||
+ int err;
|
||||
+ u8 fw_state;
|
||||
+
|
||||
+ /*
|
||||
+ * Test if the device is actually needing the firmware. As most
|
||||
+ * BIOSes will initialize the device for us. If the device is
|
||||
+ * initialized.
|
||||
+ */
|
||||
+ err = pci_read_config_byte(pdev, 0xF4, &fw_state);
|
||||
+ if (err)
|
||||
+ return pcibios_err_to_errno(err);
|
||||
+
|
||||
+ /*
|
||||
+ * Check if "FW Download Lock" is locked. If it is and the FW is
|
||||
+ * ready we can simply continue. If the FW is not ready, we have
|
||||
+ * to give up.
|
||||
+ */
|
||||
+ if (fw_state & BIT(1)) {
|
||||
+ dev_dbg(&pdev->dev, "FW Download Lock is engaged.");
|
||||
+
|
||||
+ if (fw_state & BIT(4))
|
||||
+ return 0;
|
||||
+
|
||||
+ dev_err(&pdev->dev, "FW Download Lock is set and FW is not ready. Giving Up.");
|
||||
+ return -EIO;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Check if "FW Download Enable" is set. If someone (us?) tampered
|
||||
+ * with it and it can't be resetted, we have to give up too... and
|
||||
+ * ask for a forgiveness and a reboot.
|
||||
+ */
|
||||
+ if (fw_state & BIT(0)) {
|
||||
+ dev_err(&pdev->dev, "FW Download Enable is stale. Giving Up (poweroff/reboot needed).");
|
||||
+ return -EIO;
|
||||
+ }
|
||||
+
|
||||
+ /* Otherwise, Check the "Result Code" Bits (6:4) and act accordingly */
|
||||
+ switch ((fw_state & 0x70)) {
|
||||
+ case 0: /* No result yet */
|
||||
+ dev_dbg(&pdev->dev, "FW is not ready/loaded yet.");
|
||||
+
|
||||
+ /* tell the caller, that this device needs the firmware. */
|
||||
+ return 1;
|
||||
+
|
||||
+ case BIT(4): /* Success, device should be working. */
|
||||
+ dev_dbg(&pdev->dev, "FW is ready.");
|
||||
+ return 0;
|
||||
+
|
||||
+ case BIT(5): /* Error State */
|
||||
+ dev_err(&pdev->dev, "hardware is in an error state. Giving up (poweroff/reboot needed).");
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ default: /* All other states are marked as "Reserved states" */
|
||||
+ dev_err(&pdev->dev, "hardware is in an invalid state %x. Giving up (poweroff/reboot needed).",
|
||||
+ (fw_state & 0x70) >> 4);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int renesas_hw_check_run_stop_busy(struct pci_dev *pdev)
|
||||
+{
|
||||
+#if 0
|
||||
+ u32 val;
|
||||
+
|
||||
+ /*
|
||||
+ * 7.1.3 Note 3: "... must not set 'FW Download Enable' when
|
||||
+ * 'RUN/STOP' of USBCMD Register is set"
|
||||
+ */
|
||||
+ val = readl(hcd->regs + 0x20);
|
||||
+ if (val & BIT(0)) {
|
||||
+ dev_err(&pdev->dev, "hardware is busy and can't receive a FW.");
|
||||
+ return -EBUSY;
|
||||
+ }
|
||||
+#endif
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int renesas_fw_download(struct pci_dev *pdev,
|
||||
+ const struct firmware *fw, unsigned int retry_counter)
|
||||
+{
|
||||
+ const u32 *fw_data = (const u32 *) fw->data;
|
||||
+ size_t i;
|
||||
+ int err;
|
||||
+ u8 fw_status;
|
||||
+
|
||||
+ /*
|
||||
+ * For more information and the big picture: please look at the
|
||||
+ * "Firmware Download Sequence" in "7.1 FW Download Interface"
|
||||
+ * of R19UH0078EJ0500 Rev.5.00 page 131
|
||||
+ */
|
||||
+ err = renesas_hw_check_run_stop_busy(pdev);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /*
|
||||
+ * 0. Set "FW Download Enable" bit in the
|
||||
+ * "FW Download Control & Status Register" at 0xF4
|
||||
+ */
|
||||
+ err = pci_write_config_byte(pdev, 0xF4, BIT(0));
|
||||
+ if (err)
|
||||
+ return pcibios_err_to_errno(err);
|
||||
+
|
||||
+ /* 1 - 10 follow one step after the other. */
|
||||
+ for (i = 0; i < fw->size / 4; i++) {
|
||||
+ err = renesas_fw_download_image(pdev, fw_data, i);
|
||||
+ if (err) {
|
||||
+ dev_err(&pdev->dev, "Firmware Download Step %zd failed at position %zd bytes with (%d).",
|
||||
+ i, i * 4, err);
|
||||
+ return err;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * This sequence continues until the last data is written to
|
||||
+ * "DATA0" or "DATA1". Naturally, we wait until "SET DATA0/1"
|
||||
+ * is cleared by the hardware beforehand.
|
||||
+ */
|
||||
+ for (i = 0; i < 10000; i++) {
|
||||
+ err = pci_read_config_byte(pdev, 0xF5, &fw_status);
|
||||
+ if (err)
|
||||
+ return pcibios_err_to_errno(err);
|
||||
+ if (!(fw_status & (BIT(0) | BIT(1))))
|
||||
+ break;
|
||||
+
|
||||
+ udelay(1);
|
||||
+ }
|
||||
+ if (i == 10000)
|
||||
+ dev_warn(&pdev->dev, "Final Firmware Download step timed out.");
|
||||
+
|
||||
+ /*
|
||||
+ * 11. After finishing writing the last data of FW, the
|
||||
+ * System Software must clear "FW Download Enable"
|
||||
+ */
|
||||
+ err = pci_write_config_byte(pdev, 0xF4, 0);
|
||||
+ if (err)
|
||||
+ return pcibios_err_to_errno(err);
|
||||
+
|
||||
+ /* 12. Read "Result Code" and confirm it is good. */
|
||||
+ for (i = 0; i < 10000; i++) {
|
||||
+ err = pci_read_config_byte(pdev, 0xF4, &fw_status);
|
||||
+ if (err)
|
||||
+ return pcibios_err_to_errno(err);
|
||||
+ if (fw_status & BIT(4))
|
||||
+ break;
|
||||
+
|
||||
+ udelay(1);
|
||||
+ }
|
||||
+ if (i == 10000) {
|
||||
+ /* Timed out / Error - let's see if we can fix this */
|
||||
+ err = renesas_fw_check_running(pdev);
|
||||
+ switch (err) {
|
||||
+ case 0: /*
|
||||
+ * we shouldn't end up here.
|
||||
+ * maybe it took a little bit longer.
|
||||
+ * But all should be well?
|
||||
+ */
|
||||
+ break;
|
||||
+
|
||||
+ case 1: /* (No result yet? - we can try to retry) */
|
||||
+ if (retry_counter < 10) {
|
||||
+ retry_counter++;
|
||||
+ dev_warn(&pdev->dev, "Retry Firmware download: %d try.",
|
||||
+ retry_counter);
|
||||
+ return renesas_fw_download(pdev, fw,
|
||||
+ retry_counter);
|
||||
+ }
|
||||
+ return -ETIMEDOUT;
|
||||
+
|
||||
+ default:
|
||||
+ return err;
|
||||
+ }
|
||||
+ }
|
||||
+ /*
|
||||
+ * Optional last step: Engage Firmware Lock
|
||||
+ *
|
||||
+ * err = pci_write_config_byte(pdev, 0xF4, BIT(2));
|
||||
+ * if (err)
|
||||
+ * return pcibios_err_to_errno(err);
|
||||
+ */
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+struct renesas_fw_ctx {
|
||||
+ struct pci_dev *pdev;
|
||||
+ const struct pci_device_id *id;
|
||||
+ bool resume;
|
||||
+};
|
||||
+
|
||||
+static int xhci_pci_probe(struct pci_dev *pdev,
|
||||
+ const struct pci_device_id *id);
|
||||
+
|
||||
+static void renesas_fw_callback(const struct firmware *fw,
|
||||
+ void *context)
|
||||
+{
|
||||
+ struct renesas_fw_ctx *ctx = context;
|
||||
+ struct pci_dev *pdev = ctx->pdev;
|
||||
+ struct device *parent = pdev->dev.parent;
|
||||
+ int err = -ENOENT;
|
||||
+
|
||||
+ if (fw) {
|
||||
+ err = renesas_fw_verify(pdev, fw->data, fw->size);
|
||||
+ if (!err) {
|
||||
+ err = renesas_fw_download(pdev, fw, 0);
|
||||
+ release_firmware(fw);
|
||||
+ if (!err) {
|
||||
+ if (ctx->resume)
|
||||
+ return;
|
||||
+
|
||||
+ err = xhci_pci_probe(pdev, ctx->id);
|
||||
+ if (!err) {
|
||||
+ /* everything worked */
|
||||
+ devm_kfree(&pdev->dev, ctx);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* in case of an error - fall through */
|
||||
+ } else {
|
||||
+ dev_err(&pdev->dev, "firmware failed to download (%d).",
|
||||
+ err);
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ dev_err(&pdev->dev, "firmware failed to load (%d).", err);
|
||||
+ }
|
||||
+
|
||||
+ dev_info(&pdev->dev, "Unloading driver");
|
||||
+
|
||||
+ if (parent)
|
||||
+ device_lock(parent);
|
||||
+
|
||||
+ device_release_driver(&pdev->dev);
|
||||
+
|
||||
+ if (parent)
|
||||
+ device_unlock(parent);
|
||||
+
|
||||
+ pci_dev_put(pdev);
|
||||
+}
|
||||
+
|
||||
+static int renesas_fw_alive_check(struct pci_dev *pdev)
|
||||
+{
|
||||
+ const struct renesas_fw_entry *entry;
|
||||
+ int err;
|
||||
+
|
||||
+ /* check if we have a eligible RENESAS' uPD720201/2 w/o FW. */
|
||||
+ entry = renesas_needs_fw_dl(pdev);
|
||||
+ if (!entry)
|
||||
+ return 0;
|
||||
+
|
||||
+ err = renesas_fw_check_running(pdev);
|
||||
+ /* Also go ahead, if the firmware is running */
|
||||
+ if (err == 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ /* At this point, we can be sure that the FW isn't ready. */
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static int renesas_fw_download_to_hw(struct pci_dev *pdev,
|
||||
+ const struct pci_device_id *id,
|
||||
+ bool do_resume)
|
||||
+{
|
||||
+ const struct renesas_fw_entry *entry;
|
||||
+ struct renesas_fw_ctx *ctx;
|
||||
+ int err;
|
||||
+
|
||||
+ /* check if we have a eligible RENESAS' uPD720201/2 w/o FW. */
|
||||
+ entry = renesas_needs_fw_dl(pdev);
|
||||
+ if (!entry)
|
||||
+ return 0;
|
||||
+
|
||||
+ err = renesas_fw_check_running(pdev);
|
||||
+ /* Continue ahead, if the firmware is already running. */
|
||||
+ if (err == 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (err != 1)
|
||||
+ return err;
|
||||
+
|
||||
+ ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
|
||||
+ if (!ctx)
|
||||
+ return -ENOMEM;
|
||||
+ ctx->pdev = pdev;
|
||||
+ ctx->resume = do_resume;
|
||||
+ ctx->id = id;
|
||||
+
|
||||
+ pci_dev_get(pdev);
|
||||
+ err = request_firmware_nowait(THIS_MODULE, 1, entry->firmware_name,
|
||||
+ &pdev->dev, GFP_KERNEL, ctx, renesas_fw_callback);
|
||||
+ if (err) {
|
||||
+ pci_dev_put(pdev);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * The renesas_fw_callback() callback will continue the probe
|
||||
+ * process, once it aquires the firmware.
|
||||
+ */
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
/* called during probe() after chip reset completes */
|
||||
static int xhci_pci_setup(struct usb_hcd *hcd)
|
||||
{
|
||||
@@ -300,6 +754,22 @@ static int xhci_pci_probe(struct pci_dev
|
||||
struct hc_driver *driver;
|
||||
struct usb_hcd *hcd;
|
||||
|
||||
+ /*
|
||||
+ * Check if this device is a RENESAS uPD720201/2 device.
|
||||
+ * Otherwise, we can continue with xhci_pci_probe as usual.
|
||||
+ */
|
||||
+ retval = renesas_fw_download_to_hw(dev, id, false);
|
||||
+ switch (retval) {
|
||||
+ case 0:
|
||||
+ break;
|
||||
+
|
||||
+ case 1: /* let it load the firmware and recontinue the probe. */
|
||||
+ return 0;
|
||||
+
|
||||
+ default:
|
||||
+ return retval;
|
||||
+ }
|
||||
+
|
||||
driver = (struct hc_driver *)id->driver_data;
|
||||
|
||||
/* Prevent runtime suspending between USB-2 and USB-3 initialization */
|
||||
@@ -361,6 +831,16 @@ static void xhci_pci_remove(struct pci_d
|
||||
{
|
||||
struct xhci_hcd *xhci;
|
||||
|
||||
+ if (renesas_fw_alive_check(dev)) {
|
||||
+ /*
|
||||
+ * bail out early, if this was a renesas device w/o FW.
|
||||
+ * Else we might hit the NMI watchdog in xhci_handsake
|
||||
+ * during xhci_reset as part of the driver's unloading.
|
||||
+ * which we forced in the renesas_fw_callback().
|
||||
+ */
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
xhci = hcd_to_xhci(pci_get_drvdata(dev));
|
||||
xhci->xhc_state |= XHCI_STATE_REMOVING;
|
||||
if (xhci->shared_hcd) {
|
@ -1,53 +0,0 @@
|
||||
From a0dc613140bab907a3d5787a7ae7b0638bf674d0 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Thu, 23 Jun 2016 20:28:20 +0200
|
||||
Subject: [PATCH] usb: xhci: force MSI for uPD720201 and
|
||||
uPD720202
|
||||
|
||||
The APM82181 does not support MSI-X. When probed, it will
|
||||
produce a noisy warning.
|
||||
|
||||
---
|
||||
drivers/usb/host/pci-quirks.c | 362 ++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 362 insertions(+)
|
||||
|
||||
--- a/drivers/usb/host/xhci-pci.c
|
||||
+++ b/drivers/usb/host/xhci-pci.c
|
||||
@@ -215,6 +215,7 @@ static void xhci_pci_quirks(struct devic
|
||||
pdev->device == 0x0015) {
|
||||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
xhci->quirks |= XHCI_ZERO_64B_REGS;
|
||||
+ xhci->quirks |= XHCI_FORCE_MSI;
|
||||
}
|
||||
if (pdev->vendor == PCI_VENDOR_ID_VIA)
|
||||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
--- a/drivers/usb/host/xhci.c
|
||||
+++ b/drivers/usb/host/xhci.c
|
||||
@@ -424,10 +424,14 @@ static int xhci_try_enable_msi(struct us
|
||||
free_irq(hcd->irq, hcd);
|
||||
hcd->irq = 0;
|
||||
|
||||
- ret = xhci_setup_msix(xhci);
|
||||
- if (ret)
|
||||
- /* fall back to msi*/
|
||||
+ if (xhci->quirks & XHCI_FORCE_MSI) {
|
||||
ret = xhci_setup_msi(xhci);
|
||||
+ } else {
|
||||
+ ret = xhci_setup_msix(xhci);
|
||||
+ if (ret)
|
||||
+ /* fall back to msi*/
|
||||
+ ret = xhci_setup_msi(xhci);
|
||||
+ }
|
||||
|
||||
if (!ret) {
|
||||
hcd->msi_enabled = 1;
|
||||
--- a/drivers/usb/host/xhci.h
|
||||
+++ b/drivers/usb/host/xhci.h
|
||||
@@ -1867,6 +1867,7 @@ struct xhci_hcd {
|
||||
/* support xHCI 0.96 spec USB2 software LPM */
|
||||
unsigned sw_lpm_support:1;
|
||||
/* support xHCI 1.0 spec USB2 hardware LPM */
|
||||
+#define XHCI_FORCE_MSI (1 << 24)
|
||||
unsigned hw_lpm_support:1;
|
||||
/* Broken Suspend flag for SNPS Suspend resume issue */
|
||||
unsigned broken_suspend:1;
|
@ -1,65 +0,0 @@
|
||||
From 694f9bfb8efaef8a33e8992015ff9d0866faf4a2 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Sun, 17 Dec 2017 17:27:15 +0100
|
||||
Subject: [PATCH 1/2] hwmon: tc654 add detection routine
|
||||
|
||||
This patch adds a detection routine for the TC654/TC655
|
||||
chips. Both IDs are listed in the Datasheet.
|
||||
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
---
|
||||
drivers/hwmon/tc654.c | 29 +++++++++++++++++++++++++++++
|
||||
1 file changed, 29 insertions(+)
|
||||
|
||||
--- a/drivers/hwmon/tc654.c
|
||||
+++ b/drivers/hwmon/tc654.c
|
||||
@@ -64,6 +64,11 @@ enum tc654_regs {
|
||||
/* Register data is read (and cached) at most once per second. */
|
||||
#define TC654_UPDATE_INTERVAL HZ
|
||||
|
||||
+/* Manufacturer and Version Identification Register Values */
|
||||
+#define TC654_MFR_ID_MICROCHIP 0x84
|
||||
+#define TC654_VER_ID 0x00
|
||||
+#define TC655_VER_ID 0x01
|
||||
+
|
||||
struct tc654_data {
|
||||
struct i2c_client *client;
|
||||
|
||||
@@ -497,6 +502,29 @@ static const struct i2c_device_id tc654_
|
||||
{}
|
||||
};
|
||||
|
||||
+static int
|
||||
+tc654_detect(struct i2c_client *new_client, struct i2c_board_info *info)
|
||||
+{
|
||||
+ struct i2c_adapter *adapter = new_client->adapter;
|
||||
+ int manufacturer, product;
|
||||
+
|
||||
+ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ manufacturer = i2c_smbus_read_byte_data(new_client, TC654_REG_MFR_ID);
|
||||
+ if (manufacturer != TC654_MFR_ID_MICROCHIP)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ product = i2c_smbus_read_byte_data(new_client, TC654_REG_VER_ID);
|
||||
+ if (!((product == TC654_VER_ID) || (product == TC655_VER_ID)))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ strlcpy(info->type, product == TC654_VER_ID ? "tc654" : "tc655",
|
||||
+ I2C_NAME_SIZE);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
MODULE_DEVICE_TABLE(i2c, tc654_id);
|
||||
|
||||
static struct i2c_driver tc654_driver = {
|
||||
@@ -505,6 +533,7 @@ static struct i2c_driver tc654_driver =
|
||||
},
|
||||
.probe = tc654_probe,
|
||||
.id_table = tc654_id,
|
||||
+ .detect = tc654_detect,
|
||||
};
|
||||
|
||||
module_i2c_driver(tc654_driver);
|
@ -1,174 +0,0 @@
|
||||
From 15ae701189744d321d3a1264ff46f8871e8765ee Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Sun, 17 Dec 2017 17:29:13 +0100
|
||||
Subject: [PATCH] hwmon: tc654: add thermal_cooling device
|
||||
|
||||
This patch adds a thermaL_cooling device to the tc654 driver.
|
||||
This allows the chip to be used for DT-based cooling.
|
||||
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
---
|
||||
drivers/hwmon/tc654.c | 103 +++++++++++++++++++++++++++++++++++++++++---------
|
||||
1 file changed, 86 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/drivers/hwmon/tc654.c
|
||||
+++ b/drivers/hwmon/tc654.c
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/thermal.h>
|
||||
#include <linux/util_macros.h>
|
||||
|
||||
enum tc654_regs {
|
||||
@@ -141,6 +142,9 @@ struct tc654_data {
|
||||
* writable register used to control the duty
|
||||
* cycle of the V OUT output.
|
||||
*/
|
||||
+
|
||||
+ /* optional cooling device */
|
||||
+ struct thermal_cooling_device *cdev;
|
||||
};
|
||||
|
||||
/* helper to grab and cache data, at most one time per second */
|
||||
@@ -376,36 +380,30 @@ static ssize_t set_pwm_mode(struct devic
|
||||
static const int tc654_pwm_map[16] = { 77, 88, 102, 112, 124, 136, 148, 160,
|
||||
172, 184, 196, 207, 219, 231, 243, 255};
|
||||
|
||||
+static int get_pwm(struct tc654_data *data)
|
||||
+{
|
||||
+ if (data->config & TC654_REG_CONFIG_SDM)
|
||||
+ return 0;
|
||||
+ else
|
||||
+ return tc654_pwm_map[data->duty_cycle];
|
||||
+}
|
||||
+
|
||||
static ssize_t show_pwm(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct tc654_data *data = tc654_update_client(dev);
|
||||
- int pwm;
|
||||
|
||||
if (IS_ERR(data))
|
||||
return PTR_ERR(data);
|
||||
|
||||
- if (data->config & TC654_REG_CONFIG_SDM)
|
||||
- pwm = 0;
|
||||
- else
|
||||
- pwm = tc654_pwm_map[data->duty_cycle];
|
||||
-
|
||||
- return sprintf(buf, "%d\n", pwm);
|
||||
+ return sprintf(buf, "%d\n", get_pwm(data));
|
||||
}
|
||||
|
||||
-static ssize_t set_pwm(struct device *dev, struct device_attribute *da,
|
||||
- const char *buf, size_t count)
|
||||
+static int _set_pwm(struct tc654_data *data, unsigned long val)
|
||||
{
|
||||
- struct tc654_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
- unsigned long val;
|
||||
int ret;
|
||||
|
||||
- if (kstrtoul(buf, 10, &val))
|
||||
- return -EINVAL;
|
||||
- if (val > 255)
|
||||
- return -EINVAL;
|
||||
-
|
||||
mutex_lock(&data->update_lock);
|
||||
|
||||
if (val == 0)
|
||||
@@ -425,6 +423,22 @@ static ssize_t set_pwm(struct device *de
|
||||
|
||||
out:
|
||||
mutex_unlock(&data->update_lock);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static ssize_t set_pwm(struct device *dev, struct device_attribute *da,
|
||||
+ const char *buf, size_t count)
|
||||
+{
|
||||
+ struct tc654_data *data = dev_get_drvdata(dev);
|
||||
+ unsigned long val;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (kstrtoul(buf, 10, &val))
|
||||
+ return -EINVAL;
|
||||
+ if (val > 255)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ ret = _set_pwm(data, val);
|
||||
return ret < 0 ? ret : count;
|
||||
}
|
||||
|
||||
@@ -462,6 +476,47 @@ static struct attribute *tc654_attrs[] =
|
||||
|
||||
ATTRIBUTE_GROUPS(tc654);
|
||||
|
||||
+/* cooling device */
|
||||
+
|
||||
+static int tc654_get_max_state(struct thermal_cooling_device *cdev,
|
||||
+ unsigned long *state)
|
||||
+{
|
||||
+ *state = 255;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int tc654_get_cur_state(struct thermal_cooling_device *cdev,
|
||||
+ unsigned long *state)
|
||||
+{
|
||||
+ struct tc654_data *data = tc654_update_client(cdev->devdata);
|
||||
+
|
||||
+ if (IS_ERR(data))
|
||||
+ return PTR_ERR(data);
|
||||
+
|
||||
+ *state = get_pwm(data);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int tc654_set_cur_state(struct thermal_cooling_device *cdev,
|
||||
+ unsigned long state)
|
||||
+{
|
||||
+ struct tc654_data *data = tc654_update_client(cdev->devdata);
|
||||
+
|
||||
+ if (IS_ERR(data))
|
||||
+ return PTR_ERR(data);
|
||||
+
|
||||
+ if (state > 255)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return _set_pwm(data, state);
|
||||
+}
|
||||
+
|
||||
+static const struct thermal_cooling_device_ops tc654_fan_cool_ops = {
|
||||
+ .get_max_state = tc654_get_max_state,
|
||||
+ .get_cur_state = tc654_get_cur_state,
|
||||
+ .set_cur_state = tc654_set_cur_state,
|
||||
+};
|
||||
+
|
||||
/*
|
||||
* device probe and removal
|
||||
*/
|
||||
@@ -493,7 +548,21 @@ static int tc654_probe(struct i2c_client
|
||||
hwmon_dev =
|
||||
devm_hwmon_device_register_with_groups(dev, client->name, data,
|
||||
tc654_groups);
|
||||
- return PTR_ERR_OR_ZERO(hwmon_dev);
|
||||
+ if (IS_ERR(hwmon_dev))
|
||||
+ return PTR_ERR(hwmon_dev);
|
||||
+
|
||||
+#if IS_ENABLED(CONFIG_OF)
|
||||
+ /* Optional cooling device register for Device tree platforms */
|
||||
+ data->cdev = thermal_of_cooling_device_register(client->dev.of_node,
|
||||
+ "tc654", hwmon_dev,
|
||||
+ &tc654_fan_cool_ops);
|
||||
+#else /* CONFIG_OF */
|
||||
+ /* Optional cooling device register for non Device tree platforms */
|
||||
+ data->cdev = thermal_cooling_device_register("tc654", hwmon_dev,
|
||||
+ &tc654_fan_cool_ops);
|
||||
+#endif /* CONFIG_OF */
|
||||
+
|
||||
+ return PTR_ERR_OR_ZERO(data->cdev);
|
||||
}
|
||||
|
||||
static const struct i2c_device_id tc654_id[] = {
|
@ -1,26 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2006-2011 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
ARCH:=mipsel
|
||||
BOARD:=ar7
|
||||
BOARDNAME:=TI AR7
|
||||
FEATURES:=squashfs atm low_mem
|
||||
MAINTAINER:=Florian Fainelli <florian@openwrt.org>
|
||||
SUBTARGETS:=generic ac49x
|
||||
|
||||
KERNEL_PATCHVER:=4.9
|
||||
|
||||
define Target/Description
|
||||
Build firmware images for TI AR7 based routers.
|
||||
endef
|
||||
|
||||
include $(INCLUDE_DIR)/target.mk
|
||||
|
||||
DEFAULT_PACKAGES+= swconfig
|
||||
|
||||
$(eval $(call BuildTarget))
|
@ -1,4 +0,0 @@
|
||||
CONFIG_AR7_AC49X=y
|
||||
CONFIG_AR7_TYPE_AC49X=y
|
||||
# CONFIG_AR7_TYPE_TI is not set
|
||||
CONFIG_MTD_AC49X_PARTS=y
|
@ -1,17 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2006 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
define Profile/None
|
||||
NAME:=No WiFi
|
||||
PACKAGES:=
|
||||
endef
|
||||
|
||||
define Profile/None/Description
|
||||
Package set without WiFi support
|
||||
endef
|
||||
$(eval $(call Profile,None))
|
||||
|
@ -1,10 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2012 OpenWrt.org
|
||||
#
|
||||
|
||||
SUBTARGET:=ac49x
|
||||
BOARDNAME:=AudioCodes AC49x
|
||||
|
||||
define Target/Description
|
||||
Build firmware images for AudioCodes AC49x based routers.
|
||||
endef
|
@ -1,11 +0,0 @@
|
||||
define Build/Compile
|
||||
$(call Build/Compile/Default)
|
||||
$(TARGET_CC) -o $(PKG_BUILD_DIR)/adam2patcher $(PLATFORM_DIR)/src/adam2patcher.c
|
||||
endef
|
||||
|
||||
define Package/base-files/install-target
|
||||
mkdir -p $(1)/sbin
|
||||
$(CP) $(PKG_BUILD_DIR)/adam2patcher $(1)/sbin
|
||||
endef
|
||||
|
||||
|
@ -1,28 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions/uci-defaults.sh
|
||||
|
||||
board_config_update
|
||||
|
||||
if [ -e "/sys/bus/mdio_bus/drivers/IC+ IP175A/1:00" -o \
|
||||
-e "/sys/bus/mdio_bus/drivers/IC+ IP17xx/1:00" ] && \
|
||||
[ -x /sbin/swconfig ];
|
||||
then
|
||||
ucidef_add_switch "eth0" \
|
||||
"0:lan" "1:lan" "2:lan" "3:lan" "4t@eth0"
|
||||
|
||||
elif [ -e "/sys/bus/mdio_bus/drivers/Infineon ADM6996/1:00" -o \
|
||||
-e "/sys/bus/mdio_bus/drivers/Marvell 88E6060/1:10" ];
|
||||
then
|
||||
ucidef_set_interface_lan "eth0.1"
|
||||
|
||||
elif [ -d "/sys/class/net/eth1" ]; then
|
||||
ucidef_set_interface_lan "eth0 eth1"
|
||||
|
||||
else
|
||||
ucidef_set_interface_lan "eth0"
|
||||
fi
|
||||
|
||||
board_config_flush
|
||||
|
||||
exit 0
|
@ -1,32 +0,0 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) 2007-2013 OpenWrt.org
|
||||
|
||||
. /lib/functions/leds.sh
|
||||
|
||||
get_status_led() {
|
||||
[ -d "/sys/class/leds/status" ] && status_led="status"
|
||||
[ -d "/sys/class/leds/power:green" ] && status_led="power:green"
|
||||
}
|
||||
|
||||
set_state() {
|
||||
get_status_led
|
||||
|
||||
case "$1" in
|
||||
preinit)
|
||||
status_led_blink_preinit
|
||||
;;
|
||||
failsafe)
|
||||
status_led_blink_failsafe
|
||||
;;
|
||||
preinit_regular)
|
||||
status_led_blink_preinit_regular
|
||||
;;
|
||||
done)
|
||||
status_led_on
|
||||
|
||||
[ "$status_led" = "power:green" ] && {
|
||||
led_off "power:red"
|
||||
}
|
||||
;;
|
||||
esac
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
# ADAM2 patcher for Netgear DG834 and compatible
|
||||
# Copyright (C) 2006 OpenWrt.org
|
||||
|
||||
START=00
|
||||
start() {
|
||||
MD5="$(md5sum /dev/mtdblock0 | awk '{print $1}')"
|
||||
[ "$MD5" = "0530bfdf00ec155f4182afd70da028c1" ] && {
|
||||
mtd unlock adam2
|
||||
/sbin/adam2patcher /dev/mtdblock0
|
||||
}
|
||||
rm -f /etc/rc.d/S${START}adam2 /etc/init.d/adam2 /sbin/adam2patcher >&- 2>&-
|
||||
}
|
@ -1,151 +0,0 @@
|
||||
CONFIG_ADM6996_PHY=y
|
||||
CONFIG_AR7=y
|
||||
CONFIG_AR7_TI=y
|
||||
# CONFIG_AR7_TYPE_AC49X is not set
|
||||
CONFIG_AR7_TYPE_TI=y
|
||||
CONFIG_AR7_WDT=y
|
||||
CONFIG_ARCH_BINFMT_ELF_STATE=y
|
||||
CONFIG_ARCH_CLOCKSOURCE_DATA=y
|
||||
CONFIG_ARCH_DISCARD_MEMBLOCK=y
|
||||
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
|
||||
# CONFIG_ARCH_HAS_GCOV_PROFILE_ALL is not set
|
||||
# CONFIG_ARCH_HAS_SG_CHAIN is not set
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
|
||||
CONFIG_ARCH_SUPPORTS_UPROBES=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||
CONFIG_BOOT_ELF32=y
|
||||
CONFIG_CEVT_R4K=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_CMDLINE="rootfstype=squashfs,jffs2"
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
# CONFIG_CMDLINE_OVERRIDE is not set
|
||||
CONFIG_CPMAC=y
|
||||
CONFIG_CPU_GENERIC_DUMP_TLB=y
|
||||
CONFIG_CPU_HAS_PREFETCH=y
|
||||
CONFIG_CPU_HAS_SYNC=y
|
||||
CONFIG_CPU_LITTLE_ENDIAN=y
|
||||
CONFIG_CPU_MIPS32=y
|
||||
CONFIG_CPU_MIPS32_R1=y
|
||||
CONFIG_CPU_MIPSR1=y
|
||||
CONFIG_CPU_NEEDS_NO_SMARTMIPS_OR_MICROMIPS=y
|
||||
CONFIG_CPU_R4K_CACHE_TLB=y
|
||||
CONFIG_CPU_R4K_FPU=y
|
||||
CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_CPU_SUPPORTS_HIGHMEM=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
CONFIG_CSRC_R4K=y
|
||||
CONFIG_DMA_NONCOHERENT=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_ETHERNET_PACKET_MANGLE=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_GENERIC_IO=y
|
||||
CONFIG_GENERIC_IRQ_CHIP=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDWARE_WATCHPOINTS=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||
# CONFIG_HAVE_ARCH_BITREVERSE is not set
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
|
||||
CONFIG_HAVE_CBPF_JIT=y
|
||||
CONFIG_HAVE_CC_STACKPROTECTOR=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_CONTEXT_TRACKING=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||
CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_CONTIGUOUS=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_IDE=y
|
||||
CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
|
||||
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
|
||||
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
||||
CONFIG_HAVE_NET_DSA=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HZ_PERIODIC=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IP17XX_PHY=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_MIPS_CPU=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||
CONFIG_MDIO_BOARDINFO=y
|
||||
CONFIG_MIPS=y
|
||||
CONFIG_MIPS_ASID_BITS=8
|
||||
CONFIG_MIPS_ASID_SHIFT=0
|
||||
CONFIG_MIPS_CLOCK_VSYSCALL=y
|
||||
# CONFIG_MIPS_CMDLINE_BUILTIN_EXTEND is not set
|
||||
CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER=y
|
||||
# CONFIG_MIPS_HUGE_TLB_SUPPORT is not set
|
||||
CONFIG_MIPS_L1_CACHE_SHIFT=5
|
||||
# CONFIG_MIPS_MACHINE is not set
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
# CONFIG_MTD_AC49X_PARTS is not set
|
||||
CONFIG_MTD_CFI_STAA=y
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MVSWITCH_PHY=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
CONFIG_NO_EXCEPT_FILL=y
|
||||
CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y
|
||||
# CONFIG_NO_IOPORT_MAP is not set
|
||||
# CONFIG_OF is not set
|
||||
CONFIG_PCI_DRIVERS_LEGACY=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
# CONFIG_RCU_STALL_COMMON is not set
|
||||
# CONFIG_SCHED_INFO is not set
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
# CONFIG_SERIAL_8250_FSL is not set
|
||||
CONFIG_SRCU=y
|
||||
CONFIG_SWAP_IO_SPACE=y
|
||||
CONFIG_SWCONFIG=y
|
||||
CONFIG_SWPHY=y
|
||||
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||
CONFIG_SYS_HAS_CPU_MIPS32_R1=y
|
||||
CONFIG_SYS_HAS_EARLY_PRINTK=y
|
||||
CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
|
||||
CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
|
||||
CONFIG_SYS_SUPPORTS_MIPS16=y
|
||||
CONFIG_SYS_SUPPORTS_ZBOOT=y
|
||||
CONFIG_SYS_SUPPORTS_ZBOOT_UART16550=y
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_VLYNQ=y
|
||||
# CONFIG_VLYNQ_DEBUG is not set
|
@ -1,221 +0,0 @@
|
||||
/*
|
||||
* AudioCodes AC49x PSPBoot-based flash partition table
|
||||
* Copyright 2012 Daniel Golle <daniel.golle@gmail.com>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/magic.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/mach-ar7/prom.h>
|
||||
|
||||
#define AC49X_MAXENVPARTS 8
|
||||
|
||||
#define AC49X_PARTTYPE_LOADER 0
|
||||
#define AC49X_PARTTYPE_BOOTENV 1
|
||||
#define AC49X_PARTTYPE_LINUX 2
|
||||
#define AC49X_PARTTYPE_ROOTFS 3
|
||||
#define AC49X_PARTTYPE_UNKNOWN 4
|
||||
#define AC49X_NUM_PARTTYPES 5
|
||||
|
||||
#define AC49X_FLASH_ADDRMASK 0x00FFFFFF
|
||||
|
||||
#define AC49X_LOADER_MAGIC 0x40809000
|
||||
#define AC49X_LINUX_MAGIC 0x464c457f /* ELF */
|
||||
#define AC49X_BOOTENV_MAGIC 0x4578614d /* MaxE */
|
||||
|
||||
#define ROOTFS_MIN_OFFSET 0xC0000
|
||||
|
||||
int parse_partvar(const unsigned char *partvar, struct mtd_partition *part)
|
||||
{
|
||||
unsigned int partstart, partend;
|
||||
unsigned int pnum;
|
||||
|
||||
pnum = sscanf(partvar, "0x%x,0x%x", &partstart, &partend);
|
||||
if (pnum != 2)
|
||||
return 1;
|
||||
|
||||
part->offset = partstart & AC49X_FLASH_ADDRMASK;
|
||||
part->size = partend - partstart;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int detect_parttype(struct mtd_info *master, struct mtd_partition part)
|
||||
{
|
||||
unsigned int magic;
|
||||
size_t len;
|
||||
|
||||
if (part.size < 4)
|
||||
return -1;
|
||||
|
||||
mtd_read(master, part.offset, sizeof(magic), &len,
|
||||
(uint8_t *)&magic);
|
||||
|
||||
if (len != sizeof(magic))
|
||||
return -1;
|
||||
|
||||
switch (magic) {
|
||||
case AC49X_LOADER_MAGIC:
|
||||
return AC49X_PARTTYPE_LOADER;
|
||||
case AC49X_LINUX_MAGIC:
|
||||
return AC49X_PARTTYPE_LINUX;
|
||||
case SQUASHFS_MAGIC:
|
||||
case CRAMFS_MAGIC:
|
||||
case CRAMFS_MAGIC_WEND:
|
||||
return AC49X_PARTTYPE_ROOTFS;
|
||||
case AC49X_BOOTENV_MAGIC:
|
||||
return AC49X_PARTTYPE_BOOTENV;
|
||||
default:
|
||||
switch (magic & 0xFF) {
|
||||
case JFFS2_SUPER_MAGIC:
|
||||
return AC49X_PARTTYPE_ROOTFS;
|
||||
}
|
||||
switch (magic >> 8) {
|
||||
case JFFS2_SUPER_MAGIC:
|
||||
return AC49X_PARTTYPE_ROOTFS;
|
||||
}
|
||||
return AC49X_PARTTYPE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
const char *partnames[] = {
|
||||
"loader",
|
||||
"config",
|
||||
"linux",
|
||||
"rootfs",
|
||||
"data"
|
||||
};
|
||||
|
||||
void gen_partname(unsigned int type,
|
||||
unsigned int *typenumeration,
|
||||
struct mtd_partition *part)
|
||||
{
|
||||
char *s = kzalloc(sizeof(char) * 8, GFP_KERNEL);
|
||||
|
||||
(typenumeration[type])++;
|
||||
if (typenumeration[type] == 1)
|
||||
sprintf(s, "%s", partnames[type]);
|
||||
else
|
||||
sprintf(s, "%s%d", partnames[type], typenumeration[type]);
|
||||
|
||||
part->name = s;
|
||||
}
|
||||
|
||||
static int create_mtd_partitions(struct mtd_info *master,
|
||||
const struct mtd_partition **pparts,
|
||||
struct mtd_part_parser_data *data)
|
||||
{
|
||||
unsigned int envpartnum = 0, linuxpartnum = 0;
|
||||
unsigned int typenumeration[5] = { 0, 0, 0, 0, 0 };
|
||||
unsigned char evn[5];
|
||||
const unsigned char *partvar = NULL;
|
||||
|
||||
struct mtd_partition *ac49x_parts;
|
||||
|
||||
ac49x_parts = kzalloc(sizeof(*ac49x_parts) * AC49X_MAXENVPARTS,
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!ac49x_parts)
|
||||
return -ENOMEM;
|
||||
|
||||
linuxpartnum = 0;
|
||||
for (envpartnum = 0; envpartnum < AC49X_MAXENVPARTS; envpartnum++) {
|
||||
struct mtd_partition parsepart;
|
||||
unsigned int offset, size, type;
|
||||
int err;
|
||||
sprintf(evn, "mtd%d", envpartnum);
|
||||
partvar = prom_getenv(evn);
|
||||
if (!partvar)
|
||||
continue;
|
||||
err = parse_partvar(partvar, &parsepart);
|
||||
if (err)
|
||||
continue;
|
||||
offset = parsepart.offset;
|
||||
size = parsepart.size;
|
||||
type = detect_parttype(master, parsepart);
|
||||
gen_partname(type, typenumeration, &parsepart);
|
||||
/* protect loader */
|
||||
if (type == AC49X_PARTTYPE_LOADER)
|
||||
parsepart.mask_flags = MTD_WRITEABLE;
|
||||
else
|
||||
parsepart.mask_flags = 0;
|
||||
|
||||
memcpy(&(ac49x_parts[linuxpartnum]), &parsepart,
|
||||
sizeof(struct mtd_partition));
|
||||
|
||||
/* scan for contained rootfs */
|
||||
if (type == AC49X_PARTTYPE_LINUX) {
|
||||
parsepart.offset += ROOTFS_MIN_OFFSET &
|
||||
~(master->erasesize - 1);
|
||||
parsepart.size -= ROOTFS_MIN_OFFSET &
|
||||
~(master->erasesize - 1);
|
||||
do {
|
||||
unsigned int size, offset;
|
||||
size = parsepart.size;
|
||||
offset = parsepart.offset;
|
||||
|
||||
type = detect_parttype(master, parsepart);
|
||||
if (type == AC49X_PARTTYPE_ROOTFS) {
|
||||
gen_partname(type, typenumeration,
|
||||
&parsepart);
|
||||
printk(KERN_INFO
|
||||
"%s %s: 0x%08x@0x%08x\n",
|
||||
"detected sub-partition",
|
||||
parsepart.name,
|
||||
(unsigned int)parsepart.size,
|
||||
(unsigned int)parsepart.offset);
|
||||
linuxpartnum++;
|
||||
memcpy(&(ac49x_parts[linuxpartnum]),
|
||||
&parsepart,
|
||||
sizeof(struct mtd_partition));
|
||||
break;
|
||||
}
|
||||
parsepart.offset += master->erasesize;
|
||||
parsepart.size -= master->erasesize;
|
||||
} while (parsepart.size >= master->erasesize);
|
||||
}
|
||||
linuxpartnum++;
|
||||
}
|
||||
|
||||
*pparts = ac49x_parts;
|
||||
return linuxpartnum;
|
||||
}
|
||||
|
||||
static struct mtd_part_parser ac49x_parser = {
|
||||
.owner = THIS_MODULE,
|
||||
.parse_fn = create_mtd_partitions,
|
||||
.name = "ac49xpart",
|
||||
};
|
||||
|
||||
static int __init ac49x_parser_init(void)
|
||||
{
|
||||
register_mtd_parser(&ac49x_parser);
|
||||
return 0;
|
||||
}
|
||||
|
||||
module_init(ac49x_parser_init);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Daniel Golle <daniel.golle@gmail.com>");
|
||||
MODULE_DESCRIPTION("MTD partitioning for AudioCodes AC49x");
|
@ -1,234 +0,0 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/magic.h>
|
||||
#include <asm/mach-ar7/prom.h>
|
||||
|
||||
#define IMAGE_A_SIZE 0X3c0000
|
||||
#define WRTP_PARTS 14
|
||||
#define NSP_IMG_MAGIC_NUMBER le32_to_cpu(0x4D544443)
|
||||
#define NSP_IMG_SECTION_TYPE_KERNEL (0x01)
|
||||
#define NSP_IMG_SECTION_TYPE_FILESYSTEM_ROOT (0x02)
|
||||
#define NSP_IMG_SECTION_TYPE_FILESYSTEM (0x03)
|
||||
#define MAX_NUM_PARTITIONS 14
|
||||
|
||||
static int part_count=0;
|
||||
static struct mtd_partition titan_parts[WRTP_PARTS];
|
||||
|
||||
|
||||
struct nsp_img_hdr_head
|
||||
{
|
||||
unsigned int magic; /* Magic number to identify this image header */
|
||||
unsigned int boot_offset; /* Offset from start of header to kernel code. */
|
||||
unsigned int flags; /* Image flags. */
|
||||
unsigned int hdr_version; /* Version of this header. */
|
||||
unsigned int hdr_size; /* The complete size of all portions of the header */
|
||||
unsigned int prod_id; /* This product id */
|
||||
unsigned int rel_id; /* Which release this is */
|
||||
unsigned int version; /* name-MMM.nnn.ooo-rxx => 0xMMnnooxx. See comment
|
||||
below */
|
||||
unsigned int image_size; /* Image size (including header) */
|
||||
unsigned int info_offset; /* Offset from start of header to info block */
|
||||
unsigned int sect_info_offset; /* Offset from start of header to section desc */
|
||||
unsigned int chksum_offset; /* Offset from start of header to chksum block */
|
||||
unsigned int pad1;
|
||||
};
|
||||
|
||||
struct nsp_img_hdr_section_info
|
||||
{
|
||||
unsigned int num_sects; /* Number of section (and section desc blocks) in this image */
|
||||
unsigned int sect_size; /* Size of a SINGLE section_desc block */
|
||||
unsigned int sections_offset; /* Offset to from start of header to the start of the section blocks */
|
||||
};
|
||||
|
||||
/* There will be one of more of the following stuctures in the image header. Each
|
||||
section will have one of these blocks. */
|
||||
struct nsp_img_hdr_sections
|
||||
{
|
||||
unsigned int offset; /* Offset of section from start of NSP_IMG_HDR_HEAD */
|
||||
unsigned int total_size; /* Size of section (including pad size.) */
|
||||
unsigned int raw_size; /* Size of section only */
|
||||
unsigned int flags; /* Section flags */
|
||||
unsigned int chksum; /* Section checksum */
|
||||
unsigned int type; /* Section type. What kind of info does this section describe */
|
||||
char name[16]; /* Reference name for this section. */
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static int titan_parse_env_address(char *env_name, unsigned int *flash_base,
|
||||
unsigned int *flash_end)
|
||||
{
|
||||
char image_name[30];
|
||||
char *env_ptr;
|
||||
char *base_ptr;
|
||||
char *end_ptr;
|
||||
char * string_ptr;
|
||||
/* Get the image variable */
|
||||
env_ptr = prom_getenv(env_name);
|
||||
if(!env_ptr){
|
||||
printk("titan: invalid env name, %s.\n", env_name);
|
||||
return -1; /* Error, no image variable */
|
||||
}
|
||||
strncpy(image_name, env_ptr, 30);
|
||||
image_name[29]=0;
|
||||
string_ptr = image_name;
|
||||
/* Extract the start and stop addresses of the partition */
|
||||
base_ptr = strsep(&string_ptr, ",");
|
||||
end_ptr = strsep(&string_ptr, ",");
|
||||
if ((base_ptr == NULL) || (end_ptr == NULL)) {
|
||||
printk("titan: Couldn't tokenize %s start,end.\n", image_name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
*flash_base = (unsigned int) simple_strtol(base_ptr, NULL, 0);
|
||||
*flash_end = (unsigned int) simple_strtol(end_ptr, NULL, 0);
|
||||
if((!*flash_base) || (!*flash_end)) {
|
||||
printk("titan: Unable to convert :%s: :%s: into start,end values.\n",
|
||||
env_name, image_name);
|
||||
return -1;
|
||||
}
|
||||
*flash_base &= 0x0fffffff;
|
||||
*flash_end &= 0x0fffffff;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int titan_get_single_image(char *bootcfg_name, unsigned int *flash_base,
|
||||
unsigned int *flash_end)
|
||||
{
|
||||
char *env_ptr;
|
||||
char *base_ptr;
|
||||
char *end_ptr;
|
||||
char image_name[30];
|
||||
char * string_ptr;
|
||||
|
||||
if(!bootcfg_name || !flash_base || !flash_end)
|
||||
return -1;
|
||||
|
||||
env_ptr = prom_getenv(bootcfg_name);
|
||||
if(!env_ptr){
|
||||
printk("titan: %s variable not found.\n", bootcfg_name);
|
||||
return -1; /* Error, no bootcfg variable */
|
||||
}
|
||||
|
||||
string_ptr = image_name;
|
||||
/* Save off the image name */
|
||||
strncpy(image_name, env_ptr, 30);
|
||||
image_name[29]=0;
|
||||
|
||||
end_ptr=strsep(&string_ptr, "\"");
|
||||
base_ptr=strsep(&string_ptr, "\""); /* Loose the last " */
|
||||
if(!end_ptr || !base_ptr){
|
||||
printk("titan: invalid bootcfg format, %s.\n", image_name);
|
||||
return -1; /* Error, invalid bootcfg variable */
|
||||
}
|
||||
|
||||
/* Now, parse the addresses */
|
||||
return titan_parse_env_address(base_ptr, flash_base, flash_end);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void titan_add_partition(char * env_name, unsigned int flash_base, unsigned int flash_end)
|
||||
{
|
||||
titan_parts[part_count].name = env_name;
|
||||
titan_parts[part_count].offset = flash_base;
|
||||
titan_parts[part_count].size = flash_end-flash_base;
|
||||
titan_parts[part_count].mask_flags = (strcmp(env_name, "bootloader")==0||
|
||||
strcmp(env_name, "boot_env")==0 ||
|
||||
strcmp(env_name, "full_image")==0 )?MTD_WRITEABLE:0;
|
||||
part_count++;
|
||||
|
||||
}
|
||||
int create_titan_partitions(struct mtd_info *master,
|
||||
struct mtd_partition **pparts,
|
||||
unsigned long origin)
|
||||
{
|
||||
struct nsp_img_hdr_head hdr;
|
||||
struct nsp_img_hdr_section_info sect_info;
|
||||
struct nsp_img_hdr_sections section;
|
||||
unsigned int flash_base, flash_end;
|
||||
unsigned int start, end;
|
||||
char *name;
|
||||
int i;
|
||||
int total_sects=0;
|
||||
size_t len;
|
||||
|
||||
/* Get the bootcfg env variable first */
|
||||
if(titan_get_single_image("BOOTCFG", &flash_base, &flash_end)) {
|
||||
/* Error, fallback */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Get access to the header, and do some validation checks */
|
||||
//hdr=(struct nsp_img_hdr_head*)flash_base;
|
||||
mtd_read(master, flash_base, sizeof(struct nsp_img_hdr_head), &len, (uint8_t *)&hdr);
|
||||
if(hdr.magic != NSP_IMG_MAGIC_NUMBER)
|
||||
return -1; /* Not a single image */
|
||||
|
||||
mtd_read(master, flash_base + hdr.sect_info_offset, sizeof(struct nsp_img_hdr_section_info), &len, (uint8_t *)§_info);
|
||||
|
||||
/* Look for the root fs, and add it first. This way we KNOW where the rootfs is */
|
||||
for(i=0; i< sect_info.num_sects && i<MAX_NUM_PARTITIONS; i++){
|
||||
mtd_read(master, flash_base + sect_info.sections_offset + (i * sect_info.sect_size) , sizeof(struct nsp_img_hdr_sections), &len, (uint8_t *)§ion);
|
||||
/* Add only the root partition */
|
||||
if(section.type != NSP_IMG_SECTION_TYPE_FILESYSTEM_ROOT){
|
||||
continue;
|
||||
}
|
||||
start=flash_base + section.offset;
|
||||
end=start + section.total_size;
|
||||
titan_add_partition("root", start, end);
|
||||
total_sects++;
|
||||
|
||||
}
|
||||
|
||||
for(i=0; i< sect_info.num_sects && i<MAX_NUM_PARTITIONS; i++){
|
||||
|
||||
mtd_read(master, flash_base + sect_info.sections_offset + (i * sect_info.sect_size) , sizeof(struct nsp_img_hdr_sections), &len, (uint8_t *)§ion);
|
||||
|
||||
name=section.name;
|
||||
if(section.type == NSP_IMG_SECTION_TYPE_FILESYSTEM_ROOT)
|
||||
{
|
||||
name = "rootfs";
|
||||
start=flash_base + section.offset;
|
||||
end=flash_end;
|
||||
titan_add_partition(name, start, end);
|
||||
total_sects++;
|
||||
}
|
||||
else if(section.type == NSP_IMG_SECTION_TYPE_KERNEL)
|
||||
{
|
||||
name = "kernel";
|
||||
start=flash_base + section.offset;
|
||||
end=start + section.total_size;
|
||||
titan_add_partition(name, start, end);
|
||||
total_sects++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Next, lets add the single image */
|
||||
titan_add_partition("primary_image", flash_base, flash_end);
|
||||
total_sects++;
|
||||
|
||||
|
||||
titan_add_partition("full_image", 0, master->size);
|
||||
total_sects++;
|
||||
|
||||
if (!titan_parse_env_address("BOOTLOADER", &start, &end)){
|
||||
titan_add_partition("bootloader", start, end);
|
||||
total_sects++;
|
||||
}
|
||||
if (!titan_parse_env_address("boot_env", &start, &end)){
|
||||
titan_add_partition("boot_env", start, end);
|
||||
total_sects++;
|
||||
}
|
||||
*pparts = titan_parts;
|
||||
return total_sects;
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
CONFIG_AR7_TI=y
|
||||
# CONFIG_AR7_TYPE_AC49X is not set
|
||||
CONFIG_AR7_TYPE_TI=y
|
||||
# CONFIG_MTD_AC49X_PARTS is not set
|
||||
CONFIG_MTD_AR7_PARTS=y
|
@ -1,18 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2009 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
define Profile/Annex-A
|
||||
NAME:=Annex-A DSL firmware (default)
|
||||
PACKAGES:=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl \
|
||||
kmod-sangam-atm-annex-a
|
||||
endef
|
||||
|
||||
define Profile/Annex-A/Description
|
||||
Package set compatible with Annex-A DSL lines (most countries).
|
||||
endef
|
||||
$(eval $(call Profile,Annex-A))
|
||||
|
@ -1,18 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2009 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
define Profile/Annex-B
|
||||
NAME:=Annex-B DSL firmware
|
||||
PACKAGES:=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl \
|
||||
kmod-sangam-atm-annex-b
|
||||
endef
|
||||
|
||||
define Profile/Annex-B/Description
|
||||
Package set compatible with Annex-B DSL lines (Germany).
|
||||
endef
|
||||
$(eval $(call Profile,Annex-B))
|
||||
|
@ -1,18 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2006-2009 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
define Profile/Texas
|
||||
NAME:=Texas Instruments WiFi (mac80211)
|
||||
PACKAGES:=kmod-acx-mac80211
|
||||
endef
|
||||
|
||||
define Profile/Texas/Description
|
||||
Package set compatible with hardware using Texas Instruments WiFi cards
|
||||
using the mac80211 driver.
|
||||
endef
|
||||
$(eval $(call Profile,Texas))
|
||||
|
@ -1,17 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2006 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
define Profile/None
|
||||
NAME:=No WiFi
|
||||
PACKAGES:=
|
||||
endef
|
||||
|
||||
define Profile/None/Description
|
||||
Package set without WiFi support
|
||||
endef
|
||||
$(eval $(call Profile,None))
|
||||
|
@ -1,12 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2012 OpenWrt.org
|
||||
#
|
||||
|
||||
SUBTARGET:=generic
|
||||
BOARDNAME:=Texas Instruments AR7 boards
|
||||
|
||||
DEFAULT_PACKAGES+= kmod-mac80211 kmod-acx-mac80211 wpad-basic
|
||||
|
||||
define Target/Description
|
||||
Build firmware images for TI AR7 based routers.
|
||||
endef
|
@ -1,137 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2006-2015 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/image.mk
|
||||
|
||||
DROP_SECTIONS:=.reginfo .mdebug .comment .note .pdr .options .MIPS.options
|
||||
OBJCOPY_SREC:=$(TARGET_CROSS)objcopy -S -O srec $(addprefix --remove-section=,$(DROP_SECTIONS))
|
||||
|
||||
LOADADDR:=0x94600000
|
||||
KERNEL_ENTRY:=0x94100000
|
||||
RAMSTART:=0x94000000
|
||||
RAMSIZE:=0x00100000
|
||||
|
||||
EVA_LOADADDR := 0x94100000
|
||||
|
||||
LOADER_MAKEOPTS= \
|
||||
KDIR=$(KDIR) \
|
||||
LOADADDR=$(LOADADDR) \
|
||||
KERNEL_ENTRY=$(KERNEL_ENTRY) \
|
||||
RAMSTART=$(RAMSTART) \
|
||||
RAMSIZE=$(RAMSIZE)
|
||||
|
||||
CFLAGS := -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -Os \
|
||||
-fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic \
|
||||
-pipe -mlong-calls -fno-common \
|
||||
-mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap \
|
||||
-DLOADADDR=$(LOADADDR)
|
||||
|
||||
define Build/Clean
|
||||
$(MAKE) -C $(GENERIC_PLATFORM_DIR)/image/lzma-loader $(LOADER_MAKEOPTS) clean
|
||||
endef
|
||||
|
||||
define Image/Prepare
|
||||
cat $(KDIR)/vmlinux | $(STAGING_DIR_HOST)/bin/lzma e -si -so -eos -lc1 -lp2 -pb2 > $(KDIR)/vmlinux.lzma
|
||||
$(STAGING_DIR_HOST)/bin/lzma2eva $(EVA_LOADADDR) 0x$${shell $(TARGET_CROSS)nm $(KDIR)/vmlinux | grep -w kernel_entry | cut -d' ' -f1} $(KDIR)/vmlinux.lzma $(KDIR)/loader.eva
|
||||
|
||||
$(MAKE) -C $(GENERIC_PLATFORM_DIR)/image/lzma-loader \
|
||||
$(LOADER_MAKEOPTS) \
|
||||
clean compile
|
||||
$(OBJCOPY_SREC) $(KDIR)/loader.elf $(KDIR)/loader.srec
|
||||
$(OBJCOPY_SREC) $(KDIR)/vmlinux.elf $(KDIR)/vmlinux.srec
|
||||
srec2bin $(KDIR)/loader.srec $(KDIR)/loader.bin
|
||||
srec2bin $(KDIR)/vmlinux.srec $(KDIR)/vmlinux.bin
|
||||
ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),)
|
||||
$(OBJCOPY_SREC) $(KDIR)/vmlinux-initramfs.elf \
|
||||
$(KDIR)/vmlinux-initramfs.srec
|
||||
srec2bin $(KDIR)/vmlinux-initramfs.srec $(KDIR)/vmlinux-initramfs.bin
|
||||
endif
|
||||
endef
|
||||
|
||||
define align/jffs2-64k
|
||||
bs=65536 conv=sync
|
||||
endef
|
||||
|
||||
define align/jffs2-128k
|
||||
bs=131072 conv=sync
|
||||
endef
|
||||
|
||||
define align/squashfs
|
||||
endef
|
||||
|
||||
define Image/Build/CyberTAN
|
||||
(dd if=/dev/zero bs=16 count=1; cat $(BIN_DIR)/$(IMG_PREFIX)-$(1).bin) | \
|
||||
$(STAGING_DIR_HOST)/bin/addpattern -p $(3) -o $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(4)-code.bin
|
||||
endef
|
||||
|
||||
define Image/Build/Titan
|
||||
$(STAGING_DIR_HOST)/bin/mktitanimg -o $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(4)-code.bin -i $(KDIR)/loader.bin $(KDIR)/root.$(1) -a 0x10000 0x10000 -h 2 -p 0x4C575943 -s 0x0b010000
|
||||
$(STAGING_DIR_HOST)/bin/mktitanimg -o $(BIN_DIR)/$(IMG_PREFIX)-$(2)-na-$(4)-code.bin -i $(KDIR)/loader.bin $(KDIR)/root.$(1) -a 0x10000 0x10000 -h 2 -p 0x4D575943 -s 0x0b010000
|
||||
endef
|
||||
|
||||
define Image/Build/AudioCodes
|
||||
( dd if=$(KDIR)/vmlinux.elf bs=64k conv=sync ; dd if=$(KDIR)/root.$(1) ) > $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(1).bin
|
||||
endef
|
||||
|
||||
#define Image/Build/sErCoMm
|
||||
# cat sercomm/adam2.bin "$(BIN_DIR)/$(IMG_PREFIX)-$(1).bin" > "$(KDIR)/dgfw.tmp"
|
||||
# dd if=sercomm/$(2) of="$(KDIR)/dgfw.tmp" bs=$$$$((0x3e0000 - 80)) seek=1 conv=notrunc
|
||||
# $(STAGING_DIR_HOST)/bin/dgfirmware -f -w "$(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(3).img" "$(KDIR)/dgfw.tmp"
|
||||
# rm -f "$(KDIR)/dgfw.tmp"
|
||||
#endef
|
||||
|
||||
define Image/Build/EVA
|
||||
dd if=$(KDIR)/loader.eva $(call align/$(1)) > $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(KERNEL)-$(1).bin
|
||||
cat $(KDIR)/root.$(1) >> $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(KERNEL)-$(1).bin
|
||||
$(call prepare_generic_squashfs,$(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(KERNEL)-$(1).bin)
|
||||
endef
|
||||
|
||||
define Image/Build/Initramfs
|
||||
$(CP) $(KDIR)/vmlinux-initramfs.bin $(BIN_DIR)/$(IMG_PREFIX)-initramfs.bin
|
||||
endef
|
||||
|
||||
ifeq ($(CONFIG_AR7_TI),y)
|
||||
define Image/Build
|
||||
dd if=$(KDIR)/loader.bin $(call align/$(1)) > $(BIN_DIR)/$(IMG_PREFIX)-$(1).bin
|
||||
cat $(KDIR)/root.$(1) >> $(BIN_DIR)/$(IMG_PREFIX)-$(1).bin
|
||||
$(call prepare_generic_squashfs,$(BIN_DIR)/$(IMG_PREFIX)-$(1).bin)
|
||||
$(call Image/Build/CyberTAN,$(1),AG1B,AG1B,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),AG1A,AG1A,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WA21,WA21,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WA22,WA22,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WAG2,WAG2,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),AG310,AV2A -b -r 1.0,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),AG241v2,AG3A -b -r 2.0,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),AG241v2b,AG3B -b -r 2.0,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),AG241v1,AG3A -b,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WAG54GP2v1,ATWL -b,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WAG54GP2v2,CTWL -b,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WA31,WA31 -b,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WA32,WA32 -b,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WA7A,WA7A -b,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WA7B,WA7B -b,$(1))
|
||||
# $(call Image/Build/sErCoMm,$(1),dg834,$(1))
|
||||
# $(call Image/Build/sErCoMm,$(1),jdr454wb,$(1))
|
||||
$(call Image/Build/EVA,$(1),EVA)
|
||||
$(call Image/Build/Titan,$(1),Titan,Titan,$(1))
|
||||
ifeq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
|
||||
$(call Image/Build/Initramfs)
|
||||
endif
|
||||
endef
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_AR7_AC49X),y)
|
||||
define Image/Build
|
||||
# $(call prepare_generic_squashfs,$(BIN_DIR)/$(IMG_PREFIX)-$(1).bin)
|
||||
$(call Image/Build/AudioCodes,$(1),mp202,$(1))
|
||||
ifeq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
|
||||
$(call Image/Build/Initramfs)
|
||||
endif
|
||||
endef
|
||||
endif
|
||||
|
||||
$(eval $(call BuildImage))
|
@ -1,11 +0,0 @@
|
||||
--- a/arch/mips/include/asm/mach-ar7/spaces.h
|
||||
+++ b/arch/mips/include/asm/mach-ar7/spaces.h
|
||||
@@ -20,6 +20,8 @@
|
||||
#define UNCAC_BASE _AC(0xb4000000, UL) /* 0xa0000000 + PHYS_OFFSET */
|
||||
#define IO_BASE UNCAC_BASE
|
||||
|
||||
+#define HIGHMEM_START _AC(0x20000000, UL)
|
||||
+
|
||||
#include <asm/mach-generic/spaces.h>
|
||||
|
||||
#endif /* __ASM_AR7_SPACES_H */
|
@ -1,45 +0,0 @@
|
||||
From patchwork Tue Jul 18 10:17:26 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [5/9] MIPS: AR7: allow NULL clock for clk_get_rate
|
||||
X-Patchwork-Submitter: Jonas Gorski <jonas.gorski@gmail.com>
|
||||
X-Patchwork-Id: 16775
|
||||
Message-Id: <20170718101730.2541-6-jonas.gorski@gmail.com>
|
||||
To: unlisted-recipients:; (no To-header on input)
|
||||
Cc: Ralf Baechle <ralf@linux-mips.org>,
|
||||
Paul Gortmaker <paul.gortmaker@windriver.com>,
|
||||
James Hogan <james.hogan@imgtec.com>,
|
||||
linux-mips@linux-mips.org, linux-kernel@vger.kernel.org
|
||||
Date: Tue, 18 Jul 2017 12:17:26 +0200
|
||||
From: Jonas Gorski <jonas.gorski@gmail.com>
|
||||
List-Id: linux-mips <linux-mips.eddie.linux-mips.org>
|
||||
|
||||
Make the behaviour of clk_get_rate consistent with common clk's
|
||||
clk_get_rate by accepting NULL clocks as parameter. Some device
|
||||
drivers rely on this, and will cause an OOPS otherwise.
|
||||
|
||||
Fixes: 780019ddf02f ("MIPS: AR7: Implement clock API")
|
||||
Cc: Ralf Baechle <ralf@linux-mips.org>
|
||||
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
|
||||
Cc: James Hogan <james.hogan@imgtec.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: linux-kernel@vger.kernel.org
|
||||
Reported-by: Mathias Kresin <dev@kresin.me>
|
||||
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
|
||||
---
|
||||
arch/mips/ar7/clock.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/arch/mips/ar7/clock.c
|
||||
+++ b/arch/mips/ar7/clock.c
|
||||
@@ -430,6 +430,9 @@ EXPORT_SYMBOL(clk_disable);
|
||||
|
||||
unsigned long clk_get_rate(struct clk *clk)
|
||||
{
|
||||
+ if (!clk)
|
||||
+ return 0;
|
||||
+
|
||||
return clk->rate;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_get_rate);
|
@ -1,22 +0,0 @@
|
||||
--- a/drivers/mtd/Makefile
|
||||
+++ b/drivers/mtd/Makefile
|
||||
@@ -12,7 +12,7 @@ obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
|
||||
obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
|
||||
obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
|
||||
obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
|
||||
-obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o
|
||||
+obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o titanpart.o
|
||||
obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63xxpart.o
|
||||
obj-$(CONFIG_MTD_BCM47XX_PARTS) += bcm47xxpart.o
|
||||
obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
|
||||
--- a/arch/mips/ar7/platform.c
|
||||
+++ b/arch/mips/ar7/platform.c
|
||||
@@ -198,7 +198,7 @@ static struct resource physmap_flash_res
|
||||
.name = "mem",
|
||||
.flags = IORESOURCE_MEM,
|
||||
.start = 0x10000000,
|
||||
- .end = 0x107fffff,
|
||||
+ .end = 0x11ffffff,
|
||||
};
|
||||
|
||||
static const char *ar7_probe_types[] = { "ar7part", NULL };
|
@ -1,300 +0,0 @@
|
||||
--- a/drivers/vlynq/vlynq.c
|
||||
+++ b/drivers/vlynq/vlynq.c
|
||||
@@ -119,20 +119,40 @@ static int vlynq_linked(struct vlynq_dev
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static volatile int vlynq_delay_value_new = 0;
|
||||
+
|
||||
+static void vlynq_delay_wait(u32 count)
|
||||
+{
|
||||
+ /* Code adopted from original vlynq driver */
|
||||
+ int i = 0;
|
||||
+ volatile int *ptr = &vlynq_delay_value_new;
|
||||
+ *ptr = 0;
|
||||
+
|
||||
+ /* We are assuming that the each cycle takes about
|
||||
+ * 23 assembly instructions. */
|
||||
+ for(i = 0; i < (count + 23)/23; i++)
|
||||
+ *ptr = *ptr + 1;
|
||||
+}
|
||||
+
|
||||
static void vlynq_reset(struct vlynq_device *dev)
|
||||
{
|
||||
+ u32 rtm = readl(&dev->local->revision);
|
||||
+
|
||||
+ rtm = rtm < 0x00010205 || readl(&dev->local->status) & 0x800 == 0 ?
|
||||
+ 0 : 0x600000;
|
||||
+
|
||||
writel(readl(&dev->local->control) | VLYNQ_CTRL_RESET,
|
||||
&dev->local->control);
|
||||
|
||||
/* Wait for the devices to finish resetting */
|
||||
- msleep(5);
|
||||
+ vlynq_delay_wait(0xffffff);
|
||||
|
||||
/* Remove reset bit */
|
||||
- writel(readl(&dev->local->control) & ~VLYNQ_CTRL_RESET,
|
||||
+ writel(readl(&dev->local->control) & ~VLYNQ_CTRL_RESET | rtm,
|
||||
&dev->local->control);
|
||||
|
||||
/* Give some time for the devices to settle */
|
||||
- msleep(5);
|
||||
+ vlynq_delay_wait(0xffffff);
|
||||
}
|
||||
|
||||
static void vlynq_irq_unmask(struct irq_data *d)
|
||||
@@ -379,6 +399,61 @@ void vlynq_unregister_driver(struct vlyn
|
||||
}
|
||||
EXPORT_SYMBOL(vlynq_unregister_driver);
|
||||
|
||||
+enum vlynq_clk_src {
|
||||
+ vlynq_clk_external,
|
||||
+ vlynq_clk_local,
|
||||
+ vlynq_clk_remote,
|
||||
+ vlynq_clk_invalid,
|
||||
+};
|
||||
+
|
||||
+static int __vlynq_set_clocks(struct vlynq_device *dev,
|
||||
+ enum vlynq_clk_src clk_dir,
|
||||
+ int lclk_div, int rclk_div)
|
||||
+{
|
||||
+ u32 reg;
|
||||
+
|
||||
+ if (clk_dir == vlynq_clk_invalid) {
|
||||
+ printk(KERN_ERR "%s: attempt to set invalid clocking\n",
|
||||
+ dev_name(&dev->dev));
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ reg = readl(&dev->local->control);
|
||||
+ if (readl(&dev->local->revision) < 0x00010205) {
|
||||
+ if (clk_dir & vlynq_clk_local)
|
||||
+ reg |= VLYNQ_CTRL_CLOCK_INT;
|
||||
+ else
|
||||
+ reg &= ~VLYNQ_CTRL_CLOCK_INT;
|
||||
+ }
|
||||
+ reg &= ~VLYNQ_CTRL_CLOCK_MASK;
|
||||
+ reg |= VLYNQ_CTRL_CLOCK_DIV(lclk_div);
|
||||
+ writel(reg, &dev->local->control);
|
||||
+
|
||||
+ if (!vlynq_linked(dev))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ printk(KERN_INFO "%s: local VLYNQ protocol rev. is 0x%08x\n",
|
||||
+ dev_name(&dev->dev), readl(&dev->local->revision));
|
||||
+ printk(KERN_INFO "%s: remote VLYNQ protocol rev. is 0x%08x\n",
|
||||
+ dev_name(&dev->dev), readl(&dev->remote->revision));
|
||||
+
|
||||
+ reg = readl(&dev->remote->control);
|
||||
+ if (readl(&dev->remote->revision) < 0x00010205) {
|
||||
+ if (clk_dir & vlynq_clk_remote)
|
||||
+ reg |= VLYNQ_CTRL_CLOCK_INT;
|
||||
+ else
|
||||
+ reg &= ~VLYNQ_CTRL_CLOCK_INT;
|
||||
+ }
|
||||
+ reg &= ~VLYNQ_CTRL_CLOCK_MASK;
|
||||
+ reg |= VLYNQ_CTRL_CLOCK_DIV(rclk_div);
|
||||
+ writel(reg, &dev->remote->control);
|
||||
+
|
||||
+ if (!vlynq_linked(dev))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* A VLYNQ remote device can clock the VLYNQ bus master
|
||||
* using a dedicated clock line. In that case, both the
|
||||
@@ -392,29 +467,16 @@ static int __vlynq_try_remote(struct vly
|
||||
int i;
|
||||
|
||||
vlynq_reset(dev);
|
||||
- for (i = dev->dev_id ? vlynq_rdiv2 : vlynq_rdiv8; dev->dev_id ?
|
||||
- i <= vlynq_rdiv8 : i >= vlynq_rdiv2;
|
||||
- dev->dev_id ? i++ : i--) {
|
||||
+ for (i = 0; i <= 7; i++) {
|
||||
|
||||
if (!vlynq_linked(dev))
|
||||
break;
|
||||
|
||||
- writel((readl(&dev->remote->control) &
|
||||
- ~VLYNQ_CTRL_CLOCK_MASK) |
|
||||
- VLYNQ_CTRL_CLOCK_INT |
|
||||
- VLYNQ_CTRL_CLOCK_DIV(i - vlynq_rdiv1),
|
||||
- &dev->remote->control);
|
||||
- writel((readl(&dev->local->control)
|
||||
- & ~(VLYNQ_CTRL_CLOCK_INT |
|
||||
- VLYNQ_CTRL_CLOCK_MASK)) |
|
||||
- VLYNQ_CTRL_CLOCK_DIV(i - vlynq_rdiv1),
|
||||
- &dev->local->control);
|
||||
-
|
||||
- if (vlynq_linked(dev)) {
|
||||
- printk(KERN_DEBUG
|
||||
- "%s: using remote clock divisor %d\n",
|
||||
- dev_name(&dev->dev), i - vlynq_rdiv1 + 1);
|
||||
- dev->divisor = i;
|
||||
+ if (!__vlynq_set_clocks(dev, vlynq_clk_remote, i, i)) {
|
||||
+ printk(KERN_INFO
|
||||
+ "%s: using remote clock divisor %d\n",
|
||||
+ dev_name(&dev->dev), i + 1);
|
||||
+ dev->divisor = i + vlynq_rdiv1;
|
||||
return 0;
|
||||
} else {
|
||||
vlynq_reset(dev);
|
||||
@@ -433,25 +495,17 @@ static int __vlynq_try_remote(struct vly
|
||||
*/
|
||||
static int __vlynq_try_local(struct vlynq_device *dev)
|
||||
{
|
||||
- int i;
|
||||
+ int i, dir = !dev->dev_id;
|
||||
|
||||
vlynq_reset(dev);
|
||||
|
||||
- for (i = dev->dev_id ? vlynq_ldiv2 : vlynq_ldiv8; dev->dev_id ?
|
||||
- i <= vlynq_ldiv8 : i >= vlynq_ldiv2;
|
||||
- dev->dev_id ? i++ : i--) {
|
||||
-
|
||||
- writel((readl(&dev->local->control) &
|
||||
- ~VLYNQ_CTRL_CLOCK_MASK) |
|
||||
- VLYNQ_CTRL_CLOCK_INT |
|
||||
- VLYNQ_CTRL_CLOCK_DIV(i - vlynq_ldiv1),
|
||||
- &dev->local->control);
|
||||
-
|
||||
- if (vlynq_linked(dev)) {
|
||||
- printk(KERN_DEBUG
|
||||
- "%s: using local clock divisor %d\n",
|
||||
- dev_name(&dev->dev), i - vlynq_ldiv1 + 1);
|
||||
- dev->divisor = i;
|
||||
+ for (i = dir ? 7 : 0; dir ? i >= 0 : i <= 7; dir ? i-- : i++) {
|
||||
+
|
||||
+ if (!__vlynq_set_clocks(dev, vlynq_clk_local, i, 0)) {
|
||||
+ printk(KERN_INFO
|
||||
+ "%s: using local clock divisor %d\n",
|
||||
+ dev_name(&dev->dev), i + 1);
|
||||
+ dev->divisor = i + vlynq_ldiv1;
|
||||
return 0;
|
||||
} else {
|
||||
vlynq_reset(dev);
|
||||
@@ -473,18 +527,10 @@ static int __vlynq_try_external(struct v
|
||||
if (!vlynq_linked(dev))
|
||||
return -ENODEV;
|
||||
|
||||
- writel((readl(&dev->remote->control) &
|
||||
- ~VLYNQ_CTRL_CLOCK_INT),
|
||||
- &dev->remote->control);
|
||||
-
|
||||
- writel((readl(&dev->local->control) &
|
||||
- ~VLYNQ_CTRL_CLOCK_INT),
|
||||
- &dev->local->control);
|
||||
-
|
||||
- if (vlynq_linked(dev)) {
|
||||
- printk(KERN_DEBUG "%s: using external clock\n",
|
||||
- dev_name(&dev->dev));
|
||||
- dev->divisor = vlynq_div_external;
|
||||
+ if (!__vlynq_set_clocks(dev, vlynq_clk_external, 0, 0)) {
|
||||
+ printk(KERN_INFO "%s: using external clock\n",
|
||||
+ dev_name(&dev->dev));
|
||||
+ dev->divisor = vlynq_div_external;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -501,24 +547,16 @@ static int __vlynq_enable_device(struct
|
||||
return result;
|
||||
|
||||
switch (dev->divisor) {
|
||||
- case vlynq_div_external:
|
||||
case vlynq_div_auto:
|
||||
/* When the device is brought from reset it should have clock
|
||||
* generation negotiated by hardware.
|
||||
* Check which device is generating clocks and perform setup
|
||||
* accordingly */
|
||||
- if (vlynq_linked(dev) && readl(&dev->remote->control) &
|
||||
- VLYNQ_CTRL_CLOCK_INT) {
|
||||
- if (!__vlynq_try_remote(dev) ||
|
||||
- !__vlynq_try_local(dev) ||
|
||||
- !__vlynq_try_external(dev))
|
||||
- return 0;
|
||||
- } else {
|
||||
- if (!__vlynq_try_external(dev) ||
|
||||
- !__vlynq_try_local(dev) ||
|
||||
- !__vlynq_try_remote(dev))
|
||||
- return 0;
|
||||
- }
|
||||
+ if (!__vlynq_try_remote(dev) || !__vlynq_try_local(dev))
|
||||
+ return 0;
|
||||
+ case vlynq_div_external:
|
||||
+ if (!__vlynq_try_external(dev))
|
||||
+ return 0;
|
||||
break;
|
||||
case vlynq_ldiv1:
|
||||
case vlynq_ldiv2:
|
||||
@@ -528,15 +566,12 @@ static int __vlynq_enable_device(struct
|
||||
case vlynq_ldiv6:
|
||||
case vlynq_ldiv7:
|
||||
case vlynq_ldiv8:
|
||||
- writel(VLYNQ_CTRL_CLOCK_INT |
|
||||
- VLYNQ_CTRL_CLOCK_DIV(dev->divisor -
|
||||
- vlynq_ldiv1), &dev->local->control);
|
||||
- writel(0, &dev->remote->control);
|
||||
- if (vlynq_linked(dev)) {
|
||||
- printk(KERN_DEBUG
|
||||
- "%s: using local clock divisor %d\n",
|
||||
- dev_name(&dev->dev),
|
||||
- dev->divisor - vlynq_ldiv1 + 1);
|
||||
+ if (!__vlynq_set_clocks(dev, vlynq_clk_local, dev->divisor -
|
||||
+ vlynq_ldiv1, 0)) {
|
||||
+ printk(KERN_INFO
|
||||
+ "%s: using local clock divisor %d\n",
|
||||
+ dev_name(&dev->dev),
|
||||
+ dev->divisor - vlynq_ldiv1 + 1);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -548,20 +583,17 @@ static int __vlynq_enable_device(struct
|
||||
case vlynq_rdiv6:
|
||||
case vlynq_rdiv7:
|
||||
case vlynq_rdiv8:
|
||||
- writel(0, &dev->local->control);
|
||||
- writel(VLYNQ_CTRL_CLOCK_INT |
|
||||
- VLYNQ_CTRL_CLOCK_DIV(dev->divisor -
|
||||
- vlynq_rdiv1), &dev->remote->control);
|
||||
- if (vlynq_linked(dev)) {
|
||||
- printk(KERN_DEBUG
|
||||
- "%s: using remote clock divisor %d\n",
|
||||
- dev_name(&dev->dev),
|
||||
- dev->divisor - vlynq_rdiv1 + 1);
|
||||
+ if (!__vlynq_set_clocks(dev, vlynq_clk_remote, 0,
|
||||
+ dev->divisor - vlynq_rdiv1)) {
|
||||
+ printk(KERN_INFO
|
||||
+ "%s: using remote clock divisor %d\n",
|
||||
+ dev_name(&dev->dev),
|
||||
+ dev->divisor - vlynq_rdiv1 + 1);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
-
|
||||
+ vlynq_reset(dev);
|
||||
ops->off(dev);
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -732,14 +764,14 @@ static int vlynq_probe(struct platform_d
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
||||
printk(KERN_INFO "%s: regs 0x%p, irq %d, mem 0x%p\n",
|
||||
- dev_name(&dev->dev), (void *)dev->regs_start, dev->irq,
|
||||
- (void *)dev->mem_start);
|
||||
+ dev_name(&dev->dev), (void *)dev->regs_start,
|
||||
+ dev->irq, (void *)dev->mem_start);
|
||||
|
||||
dev->dev_id = 0;
|
||||
dev->divisor = vlynq_div_auto;
|
||||
- result = __vlynq_enable_device(dev);
|
||||
- if (result == 0) {
|
||||
+ if (!__vlynq_enable_device(dev)) {
|
||||
dev->dev_id = readl(&dev->remote->chip);
|
||||
+ vlynq_reset(dev);
|
||||
((struct plat_vlynq_ops *)(dev->dev.platform_data))->off(dev);
|
||||
}
|
||||
if (dev->dev_id)
|
@ -1,15 +0,0 @@
|
||||
--- a/arch/mips/ar7/memory.c
|
||||
+++ b/arch/mips/ar7/memory.c
|
||||
@@ -66,5 +66,11 @@ void __init prom_meminit(void)
|
||||
|
||||
void __init prom_free_prom_memory(void)
|
||||
{
|
||||
- /* Nothing to free */
|
||||
+ /* adapted from arch/mips/txx9/generic/setup.c */
|
||||
+ unsigned long saddr = PHYS_OFFSET + PAGE_SIZE;
|
||||
+ unsigned long eaddr = __pa_symbol(&_text);
|
||||
+
|
||||
+ /* free memory between prom-record and kernel _text base */
|
||||
+ if (saddr < eaddr)
|
||||
+ free_init_pages("prom memory", saddr, eaddr);
|
||||
}
|
@ -1,85 +0,0 @@
|
||||
--- a/arch/mips/ar7/Platform
|
||||
+++ b/arch/mips/ar7/Platform
|
||||
@@ -3,4 +3,9 @@
|
||||
#
|
||||
platform-$(CONFIG_AR7) += ar7/
|
||||
cflags-$(CONFIG_AR7) += -I$(srctree)/arch/mips/include/asm/mach-ar7
|
||||
-load-$(CONFIG_AR7) += 0xffffffff94100000
|
||||
+load-$(CONFIG_AR7_TI) += 0xffffffff94100000
|
||||
+
|
||||
+#
|
||||
+# AudioCodes AC49x
|
||||
+#
|
||||
+load-$(CONFIG_AR7_AC49X) += 0xffffffff945ca000
|
||||
--- a/arch/mips/ar7/setup.c
|
||||
+++ b/arch/mips/ar7/setup.c
|
||||
@@ -68,6 +68,10 @@ const char *get_system_type(void)
|
||||
return "TI AR7 (TNETV1056)";
|
||||
case TITAN_CHIP_1060:
|
||||
return "TI AR7 (TNETV1060)";
|
||||
+ case TITAN_CHIP_AC495:
|
||||
+ return "AudioCodes AC495";
|
||||
+ case TITAN_CHIP_AC496:
|
||||
+ return "AudioCodes AC496";
|
||||
}
|
||||
default:
|
||||
return "TI AR7 (unknown)";
|
||||
--- a/arch/mips/include/asm/mach-ar7/ar7.h
|
||||
+++ b/arch/mips/include/asm/mach-ar7/ar7.h
|
||||
@@ -92,6 +92,8 @@
|
||||
#define TITAN_CHIP_1055 0x0e
|
||||
#define TITAN_CHIP_1056 0x0d
|
||||
#define TITAN_CHIP_1060 0x07
|
||||
+#define TITAN_CHIP_AC495 0x00
|
||||
+#define TITAN_CHIP_AC496 0x02
|
||||
|
||||
/* Interrupts */
|
||||
#define AR7_IRQ_UART0 15
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -161,7 +161,7 @@ config AR7
|
||||
select HAVE_CLK
|
||||
help
|
||||
Support for the Texas Instruments AR7 System-on-a-Chip
|
||||
- family: TNETD7100, 7200 and 7300.
|
||||
+ family: TI TNETD7100, 7200, 7300 and AudioCodes AC49x.
|
||||
|
||||
config ATH25
|
||||
bool "Atheros AR231x/AR531x SoC support"
|
||||
@@ -1008,6 +1008,7 @@ config MIPS_PARAVIRT
|
||||
endchoice
|
||||
|
||||
source "arch/mips/alchemy/Kconfig"
|
||||
+source "arch/mips/ar7/Kconfig"
|
||||
source "arch/mips/ath25/Kconfig"
|
||||
source "arch/mips/ath79/Kconfig"
|
||||
source "arch/mips/bcm47xx/Kconfig"
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/ar7/Kconfig
|
||||
@@ -0,0 +1,26 @@
|
||||
+if AR7
|
||||
+
|
||||
+config AR7_TI
|
||||
+ bool
|
||||
+
|
||||
+config AR7_AC49X
|
||||
+ bool
|
||||
+
|
||||
+choice
|
||||
+ prompt "AR7 SoC family selection"
|
||||
+ default AR7_TYPE_TI
|
||||
+ depends on AR7
|
||||
+ help
|
||||
+ Select AR7 MIPS SoC implementation.
|
||||
+
|
||||
+ config AR7_TYPE_TI
|
||||
+ bool "Texas Instruments AR7"
|
||||
+ select AR7_TI
|
||||
+
|
||||
+ config AR7_TYPE_AC49X
|
||||
+ bool "AudioCodes AC49X"
|
||||
+ select AR7_AC49X
|
||||
+
|
||||
+endchoice
|
||||
+
|
||||
+endif
|
@ -1,20 +0,0 @@
|
||||
--- a/arch/mips/ar7/prom.c
|
||||
+++ b/arch/mips/ar7/prom.c
|
||||
@@ -70,6 +70,7 @@ struct psbl_rec {
|
||||
};
|
||||
|
||||
static const char psp_env_version[] __initconst = "TIENV0.8";
|
||||
+static const char psp_env_version_ac49x[] __initconst = "MaxENV0.2";
|
||||
|
||||
struct psp_env_chunk {
|
||||
u8 num;
|
||||
@@ -186,7 +187,8 @@ static void __init ar7_init_env(struct e
|
||||
struct psbl_rec *psbl = (struct psbl_rec *)(KSEG1ADDR(0x14000300));
|
||||
void *psp_env = (void *)KSEG1ADDR(psbl->env_base);
|
||||
|
||||
- if (strcmp(psp_env, psp_env_version) == 0) {
|
||||
+ if (strcmp(psp_env, psp_env_version) == 0 ||
|
||||
+ strcmp(psp_env, psp_env_version_ac49x) == 0) {
|
||||
parse_psp_env(psp_env);
|
||||
} else {
|
||||
for (i = 0; i < MAX_ENTRY; i++, env++)
|
@ -1,35 +0,0 @@
|
||||
--- a/drivers/mtd/Kconfig
|
||||
+++ b/drivers/mtd/Kconfig
|
||||
@@ -154,6 +154,11 @@ config MTD_OF_PARTS
|
||||
the partition map from the children of the flash node,
|
||||
as described in Documentation/devicetree/bindings/mtd/partition.txt.
|
||||
|
||||
+config MTD_AC49X_PARTS
|
||||
+ tristate "AudioCodes AC49X partitioning support"
|
||||
+ ---help---
|
||||
+ AudioCodes AC49X partitioning support
|
||||
+
|
||||
config MTD_AR7_PARTS
|
||||
tristate "TI AR7 partitioning support"
|
||||
---help---
|
||||
--- a/drivers/mtd/Makefile
|
||||
+++ b/drivers/mtd/Makefile
|
||||
@@ -11,6 +11,7 @@ obj-$(CONFIG_MTD_SPLIT) += mtdsplit/
|
||||
obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
|
||||
obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
|
||||
obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
|
||||
+obj-$(CONFIG_MTD_AC49X_PARTS) += ac49xpart.o
|
||||
obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
|
||||
obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o titanpart.o
|
||||
obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63xxpart.o
|
||||
--- a/arch/mips/ar7/platform.c
|
||||
+++ b/arch/mips/ar7/platform.c
|
||||
@@ -201,7 +201,7 @@ static struct resource physmap_flash_res
|
||||
.end = 0x11ffffff,
|
||||
};
|
||||
|
||||
-static const char *ar7_probe_types[] = { "ar7part", NULL };
|
||||
+static const char *ar7_probe_types[] = { "ac49xpart", "ar7part", NULL };
|
||||
|
||||
static struct physmap_flash_data physmap_flash_data = {
|
||||
.width = 2,
|
@ -1,120 +0,0 @@
|
||||
--- a/drivers/mtd/ar7part.c
|
||||
+++ b/drivers/mtd/ar7part.c
|
||||
@@ -30,11 +30,14 @@
|
||||
|
||||
#include <uapi/linux/magic.h>
|
||||
|
||||
+#include <asm/mach-ar7/prom.h>
|
||||
+
|
||||
#define AR7_PARTS 4
|
||||
#define ROOT_OFFSET 0xe0000
|
||||
|
||||
#define LOADER_MAGIC1 le32_to_cpu(0xfeedfa42)
|
||||
#define LOADER_MAGIC2 le32_to_cpu(0xfeed1281)
|
||||
+#define LOADER_MAGIC3 le32_to_cpu(0x434d4d4c)
|
||||
|
||||
struct ar7_bin_rec {
|
||||
unsigned int checksum;
|
||||
@@ -42,12 +45,16 @@ struct ar7_bin_rec {
|
||||
unsigned int address;
|
||||
};
|
||||
|
||||
+int create_titan_partitions(struct mtd_info *master,
|
||||
+ const struct mtd_partition **pparts,
|
||||
+ struct mtd_part_parser_data *data);
|
||||
+
|
||||
static int create_mtd_partitions(struct mtd_info *master,
|
||||
const struct mtd_partition **pparts,
|
||||
struct mtd_part_parser_data *data)
|
||||
{
|
||||
struct ar7_bin_rec header;
|
||||
- unsigned int offset;
|
||||
+ unsigned int offset, mtd_start, mtd_end;
|
||||
size_t len;
|
||||
unsigned int pre_size = master->erasesize, post_size = 0;
|
||||
unsigned int root_offset = ROOT_OFFSET;
|
||||
@@ -55,6 +62,16 @@ static int create_mtd_partitions(struct
|
||||
int retries = 10;
|
||||
struct mtd_partition *ar7_parts;
|
||||
|
||||
+ const char *prom_str = prom_getenv("ProductID");
|
||||
+ char mtd_name[] = "mtd1";
|
||||
+ if(prom_str &&
|
||||
+ (strcmp(prom_str, "CYWL")==0 ||
|
||||
+ strcmp(prom_str, "CYWM")==0 ||
|
||||
+ strcmp(prom_str, "CYLM")==0 ||
|
||||
+ strcmp(prom_str, "CYLL")==0)){
|
||||
+ return create_titan_partitions(master, pparts, data);
|
||||
+ }
|
||||
+
|
||||
ar7_parts = kzalloc(sizeof(*ar7_parts) * AR7_PARTS, GFP_KERNEL);
|
||||
if (!ar7_parts)
|
||||
return -ENOMEM;
|
||||
@@ -83,34 +100,39 @@ static int create_mtd_partitions(struct
|
||||
|
||||
pre_size = offset;
|
||||
|
||||
- if (!ar7_parts[1].offset) {
|
||||
- ar7_parts[1].offset = master->size - master->erasesize;
|
||||
- post_size = master->erasesize;
|
||||
- }
|
||||
-
|
||||
switch (header.checksum) {
|
||||
- case LOADER_MAGIC1:
|
||||
- while (header.length) {
|
||||
- offset += sizeof(header) + header.length;
|
||||
- mtd_read(master, offset, sizeof(header), &len,
|
||||
- (uint8_t *)&header);
|
||||
- }
|
||||
- root_offset = offset + sizeof(header) + 4;
|
||||
- break;
|
||||
case LOADER_MAGIC2:
|
||||
+ for (retries = 0; retries <= 9; retries++) {
|
||||
+ mtd_name[3] = '0' + retries;
|
||||
+ prom_str = prom_getenv(mtd_name);
|
||||
+ if (prom_str == NULL)
|
||||
+ continue;
|
||||
+ sscanf(prom_str, "%i,%i", &mtd_start, &mtd_end);
|
||||
+ if (pre_size == (mtd_start & 0x1ffffff)) {
|
||||
+ ar7_parts[1].offset = mtd_end &= 0x1ffffff;
|
||||
+ ar7_parts[1].size = post_size = master->size - mtd_end;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ case LOADER_MAGIC1:
|
||||
+ root_offset = (header.checksum == LOADER_MAGIC1) ? 4 : 0;
|
||||
while (header.length) {
|
||||
offset += sizeof(header) + header.length;
|
||||
mtd_read(master, offset, sizeof(header), &len,
|
||||
(uint8_t *)&header);
|
||||
}
|
||||
- root_offset = offset + sizeof(header) + 4 + 0xff;
|
||||
- root_offset &= ~(uint32_t)0xff;
|
||||
+ root_offset += offset + sizeof(header);
|
||||
break;
|
||||
default:
|
||||
printk(KERN_WARNING "Unknown magic: %08x\n", header.checksum);
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (!ar7_parts[1].offset) {
|
||||
+ post_size = master->erasesize;
|
||||
+ ar7_parts[1].offset = master->size - post_size;
|
||||
+ }
|
||||
+
|
||||
mtd_read(master, root_offset, sizeof(header), &len, (u8 *)&header);
|
||||
if (header.checksum != SQUASHFS_MAGIC) {
|
||||
root_offset += master->erasesize - 1;
|
||||
--- a/drivers/mtd/titanpart.c
|
||||
+++ b/drivers/mtd/titanpart.c
|
||||
@@ -148,8 +148,8 @@ static void titan_add_partition(char * e
|
||||
|
||||
}
|
||||
int create_titan_partitions(struct mtd_info *master,
|
||||
- struct mtd_partition **pparts,
|
||||
- unsigned long origin)
|
||||
+ const struct mtd_partition **pparts,
|
||||
+ struct mtd_part_parser_data *data)
|
||||
{
|
||||
struct nsp_img_hdr_head hdr;
|
||||
struct nsp_img_hdr_section_info sect_info;
|
@ -1,95 +0,0 @@
|
||||
--- a/arch/mips/ar7/platform.c
|
||||
+++ b/arch/mips/ar7/platform.c
|
||||
@@ -460,31 +460,22 @@ static struct gpio_led fb_fon_leds[] = {
|
||||
},
|
||||
};
|
||||
|
||||
-static struct gpio_led gt701_leds[] = {
|
||||
+static struct gpio_led actiontec_leds[] = {
|
||||
{
|
||||
.name = "inet:green",
|
||||
.gpio = 13,
|
||||
- .active_low = 1,
|
||||
- },
|
||||
- {
|
||||
- .name = "usb",
|
||||
- .gpio = 12,
|
||||
- .active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "inet:red",
|
||||
.gpio = 9,
|
||||
- .active_low = 1,
|
||||
},
|
||||
{
|
||||
- .name = "power:red",
|
||||
+ .name = "power:green",
|
||||
.gpio = 7,
|
||||
- .active_low = 1,
|
||||
},
|
||||
{
|
||||
- .name = "power:green",
|
||||
+ .name = "power:red",
|
||||
.gpio = 8,
|
||||
- .active_low = 1,
|
||||
.default_trigger = "default-on",
|
||||
},
|
||||
{
|
||||
@@ -492,6 +483,44 @@ static struct gpio_led gt701_leds[] = {
|
||||
.gpio = 10,
|
||||
.active_low = 1,
|
||||
},
|
||||
+ {
|
||||
+ .name = "wifi",
|
||||
+ .gpio = 6,
|
||||
+ .active_low = 1,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "wifi:red",
|
||||
+ .gpio = 3,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "standby",
|
||||
+ .gpio = 4,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "wps",
|
||||
+ .gpio = 16,
|
||||
+ .active_low = 1,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "usb",
|
||||
+ .gpio = 12,
|
||||
+ .active_low = 1,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "voip",
|
||||
+ .gpio = 15,
|
||||
+ .active_low = 1,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "line1",
|
||||
+ .gpio = 23,
|
||||
+ .active_low = 1,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "line2",
|
||||
+ .gpio = 25,
|
||||
+ .active_low = 1,
|
||||
+ },
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data ar7_led_data;
|
||||
@@ -535,9 +564,9 @@ static void __init detect_leds(void)
|
||||
} else if (strstr(prid, "CYWM") || strstr(prid, "CYWL")) {
|
||||
ar7_led_data.num_leds = ARRAY_SIZE(titan_leds);
|
||||
ar7_led_data.leds = titan_leds;
|
||||
- } else if (strstr(prid, "GT701")) {
|
||||
- ar7_led_data.num_leds = ARRAY_SIZE(gt701_leds);
|
||||
- ar7_led_data.leds = gt701_leds;
|
||||
+ } else if (strstr(prid, "GT7") || strstr(prid, "PK5000")) {
|
||||
+ ar7_led_data.num_leds = ARRAY_SIZE(actiontec_leds);
|
||||
+ ar7_led_data.leds = actiontec_leds;
|
||||
}
|
||||
}
|
||||
|
@ -1,52 +0,0 @@
|
||||
--- a/drivers/net/ethernet/ti/cpmac.c
|
||||
+++ b/drivers/net/ethernet/ti/cpmac.c
|
||||
@@ -1124,6 +1124,8 @@ static int cpmac_probe(struct platform_d
|
||||
goto fail;
|
||||
}
|
||||
|
||||
+ ar7_device_reset(pdata->reset_bit);
|
||||
+
|
||||
dev->irq = platform_get_irq_byname(pdev, "irq");
|
||||
|
||||
dev->netdev_ops = &cpmac_netdev_ops;
|
||||
@@ -1203,7 +1205,7 @@ int cpmac_init(void)
|
||||
cpmac_mii->write = cpmac_mdio_write;
|
||||
cpmac_mii->reset = cpmac_mdio_reset;
|
||||
|
||||
- cpmac_mii->priv = ioremap(AR7_REGS_MDIO, 256);
|
||||
+ cpmac_mii->priv = ioremap(ar7_is_titan() ? TITAN_REGS_MDIO : AR7_REGS_MDIO, 256);
|
||||
|
||||
if (!cpmac_mii->priv) {
|
||||
pr_err("Can't ioremap mdio registers\n");
|
||||
@@ -1214,10 +1216,16 @@ int cpmac_init(void)
|
||||
/* FIXME: unhardcode gpio&reset bits */
|
||||
ar7_gpio_disable(26);
|
||||
ar7_gpio_disable(27);
|
||||
- ar7_device_reset(AR7_RESET_BIT_CPMAC_LO);
|
||||
- ar7_device_reset(AR7_RESET_BIT_CPMAC_HI);
|
||||
+
|
||||
+ if (!ar7_is_titan()) {
|
||||
+ ar7_device_reset(AR7_RESET_BIT_CPMAC_LO);
|
||||
+ ar7_device_reset(AR7_RESET_BIT_CPMAC_HI);
|
||||
+ }
|
||||
ar7_device_reset(AR7_RESET_BIT_EPHY);
|
||||
|
||||
+ if (ar7_is_titan())
|
||||
+ ar7_device_reset(TITAN_RESET_BIT_EPHY1);
|
||||
+
|
||||
cpmac_mii->reset(cpmac_mii);
|
||||
|
||||
for (i = 0; i < 300; i++) {
|
||||
@@ -1234,7 +1242,11 @@ int cpmac_init(void)
|
||||
mask = 0;
|
||||
}
|
||||
|
||||
- cpmac_mii->phy_mask = ~(mask | 0x80000000);
|
||||
+ if (ar7_is_titan())
|
||||
+ cpmac_mii->phy_mask = ~(mask | 0x80000000 | 0x40000000);
|
||||
+ else
|
||||
+ cpmac_mii->phy_mask = ~(mask | 0x80000000);
|
||||
+
|
||||
snprintf(cpmac_mii->id, MII_BUS_ID_SIZE, "cpmac-1");
|
||||
|
||||
res = mdiobus_register(cpmac_mii);
|
@ -1,59 +0,0 @@
|
||||
/*
|
||||
* patcher.c - ADAM2 patcher for Netgear DG834 (and compatible)
|
||||
*
|
||||
* Copyright (C) 2006 Felix Fietkau
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int fd;
|
||||
char *ptr;
|
||||
uint32_t *i;
|
||||
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (((fd = open(argv[1], O_RDWR)) < 0)
|
||||
|| ((ptr = mmap(0, 128 * 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == (void *) (-1))) {
|
||||
fprintf(stderr, "Can't open file\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
i = (uint32_t *) &ptr[0x3944];
|
||||
if (*i == 0x0c000944) {
|
||||
fprintf(stderr, "Unpatched ADAM2 detected. Patching... ");
|
||||
*i = 0x00000000;
|
||||
msync(i, sizeof(*i), MS_SYNC|MS_INVALIDATE);
|
||||
fprintf(stderr, "done!\n");
|
||||
} else if (*i == 0x00000000) {
|
||||
fprintf(stderr, "Patched ADAM2 detected.\n");
|
||||
} else {
|
||||
fprintf(stderr, "Unknown ADAM2 detected. Can't patch!\n");
|
||||
}
|
||||
|
||||
close(fd);
|
||||
}
|
@ -9,7 +9,6 @@ SUBTARGETS:=generic nand tiny
|
||||
FEATURES:=ramdisk
|
||||
|
||||
KERNEL_PATCHVER:=4.14
|
||||
KERNEL_TESTING_PATCHVER := 4.19
|
||||
|
||||
include $(INCLUDE_DIR)/target.mk
|
||||
|
||||
|
@ -1,32 +0,0 @@
|
||||
From 5f5c9858af167f842ee8df053920b98387a71af1 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Mon, 5 Mar 2018 11:41:25 +0100
|
||||
Subject: [PATCH 02/27] watchdog: ath79: fix maximum timeout
|
||||
|
||||
If the userland tries to set a timeout higher than the max_timeout,
|
||||
then we should fallback to max_timeout.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/watchdog/ath79_wdt.c | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/watchdog/ath79_wdt.c
|
||||
+++ b/drivers/watchdog/ath79_wdt.c
|
||||
@@ -115,10 +115,14 @@ static inline void ath79_wdt_disable(voi
|
||||
|
||||
static int ath79_wdt_set_timeout(int val)
|
||||
{
|
||||
- if (val < 1 || val > max_timeout)
|
||||
+ if (val < 1)
|
||||
return -EINVAL;
|
||||
|
||||
- timeout = val;
|
||||
+ if (val > max_timeout)
|
||||
+ timeout = max_timeout;
|
||||
+ else
|
||||
+ timeout = val;
|
||||
+
|
||||
ath79_wdt_keepalive();
|
||||
|
||||
return 0;
|
@ -1,186 +0,0 @@
|
||||
From ecbd9c87f073f097d9fe56390353e64e963e866a Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 6 Mar 2018 10:03:03 +0100
|
||||
Subject: [PATCH 03/27] leds: add reset-controller based driver
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/leds/Kconfig | 11 ++++
|
||||
drivers/leds/Makefile | 1 +
|
||||
drivers/leds/leds-reset.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 149 insertions(+)
|
||||
create mode 100644 drivers/leds/leds-reset.c
|
||||
|
||||
--- a/drivers/leds/Kconfig
|
||||
+++ b/drivers/leds/Kconfig
|
||||
@@ -756,6 +756,17 @@ config LEDS_NIC78BX
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called leds-nic78bx.
|
||||
|
||||
+config LEDS_RESET
|
||||
+ tristate "LED support for reset-controller API"
|
||||
+ depends on LEDS_CLASS
|
||||
+ depends on RESET_CONTROLLER
|
||||
+ help
|
||||
+ This option enables support for LEDs connected to pins driven by reset
|
||||
+ controllers. Yes, DNI actual built HW like that.
|
||||
+
|
||||
+ To compile this driver as a module, choose M here: the module
|
||||
+ will be called leds-reset.
|
||||
+
|
||||
comment "LED Triggers"
|
||||
source "drivers/leds/trigger/Kconfig"
|
||||
|
||||
--- /dev/null
|
||||
+++ b/drivers/leds/leds-reset.c
|
||||
@@ -0,0 +1,140 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2018 John Crispin <john@phrozen.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/err.h>
|
||||
+#include <linux/reset.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/leds.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/reset.h>
|
||||
+
|
||||
+struct reset_led_data {
|
||||
+ struct led_classdev cdev;
|
||||
+ struct reset_control *rst;
|
||||
+};
|
||||
+
|
||||
+static inline struct reset_led_data *
|
||||
+ cdev_to_reset_led_data(struct led_classdev *led_cdev)
|
||||
+{
|
||||
+ return container_of(led_cdev, struct reset_led_data, cdev);
|
||||
+}
|
||||
+
|
||||
+static void reset_led_set(struct led_classdev *led_cdev,
|
||||
+ enum led_brightness value)
|
||||
+{
|
||||
+ struct reset_led_data *led_dat = cdev_to_reset_led_data(led_cdev);
|
||||
+
|
||||
+ if (value == LED_OFF)
|
||||
+ reset_control_assert(led_dat->rst);
|
||||
+ else
|
||||
+ reset_control_deassert(led_dat->rst);
|
||||
+}
|
||||
+
|
||||
+struct reset_leds_priv {
|
||||
+ int num_leds;
|
||||
+ struct reset_led_data leds[];
|
||||
+};
|
||||
+
|
||||
+static inline int sizeof_reset_leds_priv(int num_leds)
|
||||
+{
|
||||
+ return sizeof(struct reset_leds_priv) +
|
||||
+ (sizeof(struct reset_led_data) * num_leds);
|
||||
+}
|
||||
+
|
||||
+static struct reset_leds_priv *reset_leds_create(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct fwnode_handle *child;
|
||||
+ struct reset_leds_priv *priv;
|
||||
+ int count, ret;
|
||||
+
|
||||
+ count = device_get_child_node_count(dev);
|
||||
+ if (!count)
|
||||
+ return ERR_PTR(-ENODEV);
|
||||
+
|
||||
+ priv = devm_kzalloc(dev, sizeof_reset_leds_priv(count), GFP_KERNEL);
|
||||
+ if (!priv)
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+
|
||||
+ device_for_each_child_node(dev, child) {
|
||||
+ struct reset_led_data *led = &priv->leds[priv->num_leds];
|
||||
+ struct device_node *np = to_of_node(child);
|
||||
+
|
||||
+ ret = fwnode_property_read_string(child, "label", &led->cdev.name);
|
||||
+ if (!led->cdev.name) {
|
||||
+ fwnode_handle_put(child);
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+ }
|
||||
+ led->rst = __of_reset_control_get(np, NULL, 0, 0, 0);
|
||||
+ if (IS_ERR(led->rst))
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+
|
||||
+ fwnode_property_read_string(child, "linux,default-trigger",
|
||||
+ &led->cdev.default_trigger);
|
||||
+
|
||||
+ led->cdev.brightness_set = reset_led_set;
|
||||
+ ret = devm_of_led_classdev_register(&pdev->dev, np, &led->cdev);
|
||||
+ if (ret < 0)
|
||||
+ return ERR_PTR(ret);
|
||||
+ led->cdev.dev->of_node = np;
|
||||
+ priv->num_leds++;
|
||||
+ }
|
||||
+
|
||||
+ return priv;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id of_reset_leds_match[] = {
|
||||
+ { .compatible = "reset-leds", },
|
||||
+ {},
|
||||
+};
|
||||
+
|
||||
+MODULE_DEVICE_TABLE(of, of_reset_leds_match);
|
||||
+
|
||||
+static int reset_led_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct reset_leds_priv *priv;
|
||||
+
|
||||
+ priv = reset_leds_create(pdev);
|
||||
+ if (IS_ERR(priv))
|
||||
+ return PTR_ERR(priv);
|
||||
+
|
||||
+ platform_set_drvdata(pdev, priv);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void reset_led_shutdown(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct reset_leds_priv *priv = platform_get_drvdata(pdev);
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < priv->num_leds; i++) {
|
||||
+ struct reset_led_data *led = &priv->leds[i];
|
||||
+
|
||||
+ if (!(led->cdev.flags & LED_RETAIN_AT_SHUTDOWN))
|
||||
+ reset_led_set(&led->cdev, LED_OFF);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver reset_led_driver = {
|
||||
+ .probe = reset_led_probe,
|
||||
+ .shutdown = reset_led_shutdown,
|
||||
+ .driver = {
|
||||
+ .name = "leds-reset",
|
||||
+ .of_match_table = of_reset_leds_match,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(reset_led_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("John Crispin <john@phrozen.org>");
|
||||
+MODULE_DESCRIPTION("reset controller LED driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_ALIAS("platform:leds-reset");
|
||||
--- a/drivers/leds/Makefile
|
||||
+++ b/drivers/leds/Makefile
|
||||
@@ -78,6 +78,7 @@ obj-$(CONFIG_LEDS_MT6323) += leds-mt632
|
||||
obj-$(CONFIG_LEDS_LM3692X) += leds-lm3692x.o
|
||||
obj-$(CONFIG_LEDS_SC27XX_BLTC) += leds-sc27xx-bltc.o
|
||||
obj-$(CONFIG_LEDS_LM3601X) += leds-lm3601x.o
|
||||
+obj-$(CONFIG_LEDS_RESET) += leds-reset.o
|
||||
|
||||
# LED SPI Drivers
|
||||
obj-$(CONFIG_LEDS_CR0014114) += leds-cr0014114.o
|
@ -1,320 +0,0 @@
|
||||
From 08c9d6ceef01893678a5d2e8a15517c745417f21 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 6 Mar 2018 10:04:05 +0100
|
||||
Subject: [PATCH 04/27] phy: add ath79 usb phys
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/phy/Kconfig | 16 ++++++
|
||||
drivers/phy/Makefile | 2 +
|
||||
drivers/phy/phy-ar7100-usb.c | 124 +++++++++++++++++++++++++++++++++++++++++++
|
||||
drivers/phy/phy-ar7200-usb.c | 108 +++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 250 insertions(+)
|
||||
create mode 100644 drivers/phy/phy-ar7100-usb.c
|
||||
create mode 100644 drivers/phy/phy-ar7200-usb.c
|
||||
|
||||
--- a/drivers/phy/Kconfig
|
||||
+++ b/drivers/phy/Kconfig
|
||||
@@ -15,6 +15,22 @@ config GENERIC_PHY
|
||||
phy users can obtain reference to the PHY. All the users of this
|
||||
framework should select this config.
|
||||
|
||||
+config PHY_AR7100_USB
|
||||
+ tristate "Atheros AR7100 USB PHY driver"
|
||||
+ depends on ATH79 || COMPILE_TEST
|
||||
+ default y if USB_EHCI_HCD_PLATFORM
|
||||
+ select PHY_SIMPLE
|
||||
+ help
|
||||
+ Enable this to support the USB PHY on Atheros AR7100 SoCs.
|
||||
+
|
||||
+config PHY_AR7200_USB
|
||||
+ tristate "Atheros AR7200 USB PHY driver"
|
||||
+ depends on ATH79 || COMPILE_TEST
|
||||
+ default y if USB_EHCI_HCD_PLATFORM
|
||||
+ select PHY_SIMPLE
|
||||
+ help
|
||||
+ Enable this to support the USB PHY on Atheros AR7200 SoCs.
|
||||
+
|
||||
config PHY_LPC18XX_USB_OTG
|
||||
tristate "NXP LPC18xx/43xx SoC USB OTG PHY driver"
|
||||
depends on OF && (ARCH_LPC18XX || COMPILE_TEST)
|
||||
--- a/drivers/phy/Makefile
|
||||
+++ b/drivers/phy/Makefile
|
||||
@@ -4,6 +4,8 @@
|
||||
#
|
||||
|
||||
obj-$(CONFIG_GENERIC_PHY) += phy-core.o
|
||||
+obj-$(CONFIG_PHY_AR7100_USB) += phy-ar7100-usb.o
|
||||
+obj-$(CONFIG_PHY_AR7200_USB) += phy-ar7200-usb.o
|
||||
obj-$(CONFIG_PHY_LPC18XX_USB_OTG) += phy-lpc18xx-usb-otg.o
|
||||
obj-$(CONFIG_PHY_XGENE) += phy-xgene.o
|
||||
obj-$(CONFIG_PHY_PISTACHIO_USB) += phy-pistachio-usb.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/phy/phy-ar7100-usb.c
|
||||
@@ -0,0 +1,140 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2018 John Crispin <john@phrozen.org>
|
||||
+ *
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/phy/phy.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/reset.h>
|
||||
+#include <linux/of_gpio.h>
|
||||
+
|
||||
+#include <asm/mach-ath79/ath79.h>
|
||||
+#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
+
|
||||
+struct ar7100_usb_phy {
|
||||
+ struct reset_control *rst_phy;
|
||||
+ struct reset_control *rst_host;
|
||||
+ struct reset_control *rst_ohci_dll;
|
||||
+ void __iomem *io_base;
|
||||
+ struct phy *phy;
|
||||
+ int gpio;
|
||||
+};
|
||||
+
|
||||
+static int ar7100_usb_phy_power_off(struct phy *phy)
|
||||
+{
|
||||
+ struct ar7100_usb_phy *priv = phy_get_drvdata(phy);
|
||||
+ int err = 0;
|
||||
+
|
||||
+ err |= reset_control_assert(priv->rst_host);
|
||||
+ err |= reset_control_assert(priv->rst_phy);
|
||||
+ err |= reset_control_assert(priv->rst_ohci_dll);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static int ar7100_usb_phy_power_on(struct phy *phy)
|
||||
+{
|
||||
+ struct ar7100_usb_phy *priv = phy_get_drvdata(phy);
|
||||
+ int err = 0;
|
||||
+
|
||||
+ err |= ar7100_usb_phy_power_off(phy);
|
||||
+ mdelay(100);
|
||||
+ err |= reset_control_deassert(priv->rst_ohci_dll);
|
||||
+ err |= reset_control_deassert(priv->rst_phy);
|
||||
+ err |= reset_control_deassert(priv->rst_host);
|
||||
+ mdelay(500);
|
||||
+ iowrite32(0xf0000, priv->io_base + AR71XX_USB_CTRL_REG_CONFIG);
|
||||
+ iowrite32(0x20c00, priv->io_base + AR71XX_USB_CTRL_REG_FLADJ);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static const struct phy_ops ar7100_usb_phy_ops = {
|
||||
+ .power_on = ar7100_usb_phy_power_on,
|
||||
+ .power_off = ar7100_usb_phy_power_off,
|
||||
+ .owner = THIS_MODULE,
|
||||
+};
|
||||
+
|
||||
+static int ar7100_usb_phy_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct phy_provider *phy_provider;
|
||||
+ struct resource *res;
|
||||
+ struct ar7100_usb_phy *priv;
|
||||
+
|
||||
+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
+ if (!priv)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ priv->io_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
+ if (IS_ERR(priv->io_base))
|
||||
+ return PTR_ERR(priv->io_base);
|
||||
+
|
||||
+ priv->rst_phy = devm_reset_control_get(&pdev->dev, "usb-phy");
|
||||
+ if (IS_ERR(priv->rst_phy)) {
|
||||
+ dev_err(&pdev->dev, "phy reset is missing\n");
|
||||
+ return PTR_ERR(priv->rst_phy);
|
||||
+ }
|
||||
+
|
||||
+ priv->rst_host = devm_reset_control_get(&pdev->dev, "usb-host");
|
||||
+ if (IS_ERR(priv->rst_host)) {
|
||||
+ dev_err(&pdev->dev, "host reset is missing\n");
|
||||
+ return PTR_ERR(priv->rst_host);
|
||||
+ }
|
||||
+
|
||||
+ priv->rst_ohci_dll = devm_reset_control_get(&pdev->dev, "usb-ohci-dll");
|
||||
+ if (IS_ERR(priv->rst_ohci_dll)) {
|
||||
+ dev_err(&pdev->dev, "ohci-dll reset is missing\n");
|
||||
+ return PTR_ERR(priv->rst_host);
|
||||
+ }
|
||||
+
|
||||
+ priv->phy = devm_phy_create(&pdev->dev, NULL, &ar7100_usb_phy_ops);
|
||||
+ if (IS_ERR(priv->phy)) {
|
||||
+ dev_err(&pdev->dev, "failed to create PHY\n");
|
||||
+ return PTR_ERR(priv->phy);
|
||||
+ }
|
||||
+
|
||||
+ priv->gpio = of_get_gpio(pdev->dev.of_node, 0);
|
||||
+ if (priv->gpio >= 0) {
|
||||
+ int ret = devm_gpio_request(&pdev->dev, priv->gpio, dev_name(&pdev->dev));
|
||||
+
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to request gpio\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+ gpio_export_with_name(priv->gpio, 0, dev_name(&pdev->dev));
|
||||
+ gpio_set_value(priv->gpio, 1);
|
||||
+ }
|
||||
+
|
||||
+ phy_set_drvdata(priv->phy, priv);
|
||||
+
|
||||
+ phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate);
|
||||
+
|
||||
+
|
||||
+ return PTR_ERR_OR_ZERO(phy_provider);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id ar7100_usb_phy_of_match[] = {
|
||||
+ { .compatible = "qca,ar7100-usb-phy" },
|
||||
+ {}
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, ar7100_usb_phy_of_match);
|
||||
+
|
||||
+static struct platform_driver ar7100_usb_phy_driver = {
|
||||
+ .probe = ar7100_usb_phy_probe,
|
||||
+ .driver = {
|
||||
+ .of_match_table = ar7100_usb_phy_of_match,
|
||||
+ .name = "ar7100-usb-phy",
|
||||
+ }
|
||||
+};
|
||||
+module_platform_driver(ar7100_usb_phy_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("ATH79 USB PHY driver");
|
||||
+MODULE_AUTHOR("Alban Bedel <albeu@free.fr>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
--- /dev/null
|
||||
+++ b/drivers/phy/phy-ar7200-usb.c
|
||||
@@ -0,0 +1,123 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2015 Alban Bedel <albeu@free.fr>
|
||||
+ *
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/phy/phy.h>
|
||||
+#include <linux/reset.h>
|
||||
+#include <linux/of_gpio.h>
|
||||
+
|
||||
+struct ar7200_usb_phy {
|
||||
+ struct reset_control *rst_phy;
|
||||
+ struct reset_control *suspend_override;
|
||||
+ struct phy *phy;
|
||||
+ int gpio;
|
||||
+};
|
||||
+
|
||||
+static int ar7200_usb_phy_power_on(struct phy *phy)
|
||||
+{
|
||||
+ struct ar7200_usb_phy *priv = phy_get_drvdata(phy);
|
||||
+ int err = 0;
|
||||
+
|
||||
+ if (priv->rst_phy)
|
||||
+ err = reset_control_deassert(priv->rst_phy);
|
||||
+ if (!err && priv->suspend_override)
|
||||
+ err = reset_control_assert(priv->suspend_override);
|
||||
+ if (err && priv->rst_phy)
|
||||
+ err = reset_control_assert(priv->rst_phy);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static int ar7200_usb_phy_power_off(struct phy *phy)
|
||||
+{
|
||||
+ struct ar7200_usb_phy *priv = phy_get_drvdata(phy);
|
||||
+ int err = 0;
|
||||
+
|
||||
+ if (priv->suspend_override)
|
||||
+ err = reset_control_deassert(priv->suspend_override);
|
||||
+ if (priv->rst_phy)
|
||||
+ err |= reset_control_assert(priv->rst_phy);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static const struct phy_ops ar7200_usb_phy_ops = {
|
||||
+ .power_on = ar7200_usb_phy_power_on,
|
||||
+ .power_off = ar7200_usb_phy_power_off,
|
||||
+ .owner = THIS_MODULE,
|
||||
+};
|
||||
+
|
||||
+static int ar7200_usb_phy_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct phy_provider *phy_provider;
|
||||
+ struct ar7200_usb_phy *priv;
|
||||
+
|
||||
+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
+ if (!priv)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ priv->rst_phy = devm_reset_control_get(&pdev->dev, "usb-phy");
|
||||
+ if (IS_ERR(priv->rst_phy)) {
|
||||
+ dev_err(&pdev->dev, "phy reset is missing\n");
|
||||
+ return PTR_ERR(priv->rst_phy);
|
||||
+ }
|
||||
+
|
||||
+ priv->suspend_override = devm_reset_control_get_optional(
|
||||
+ &pdev->dev, "usb-suspend-override");
|
||||
+ if (IS_ERR(priv->suspend_override)) {
|
||||
+ if (PTR_ERR(priv->suspend_override) == -ENOENT)
|
||||
+ priv->suspend_override = NULL;
|
||||
+ else
|
||||
+ return PTR_ERR(priv->suspend_override);
|
||||
+ }
|
||||
+
|
||||
+ priv->phy = devm_phy_create(&pdev->dev, NULL, &ar7200_usb_phy_ops);
|
||||
+ if (IS_ERR(priv->phy)) {
|
||||
+ dev_err(&pdev->dev, "failed to create PHY\n");
|
||||
+ return PTR_ERR(priv->phy);
|
||||
+ }
|
||||
+
|
||||
+ priv->gpio = of_get_gpio(pdev->dev.of_node, 0);
|
||||
+ if (priv->gpio >= 0) {
|
||||
+ int ret = devm_gpio_request(&pdev->dev, priv->gpio, dev_name(&pdev->dev));
|
||||
+
|
||||
+ if (ret) {
|
||||
+ dev_err(&pdev->dev, "failed to request gpio\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+ gpio_export_with_name(priv->gpio, 0, dev_name(&pdev->dev));
|
||||
+ gpio_set_value(priv->gpio, 1);
|
||||
+ }
|
||||
+
|
||||
+ phy_set_drvdata(priv->phy, priv);
|
||||
+
|
||||
+ phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate);
|
||||
+
|
||||
+ return PTR_ERR_OR_ZERO(phy_provider);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id ar7200_usb_phy_of_match[] = {
|
||||
+ { .compatible = "qca,ar7200-usb-phy" },
|
||||
+ {}
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, ar7200_usb_phy_of_match);
|
||||
+
|
||||
+static struct platform_driver ar7200_usb_phy_driver = {
|
||||
+ .probe = ar7200_usb_phy_probe,
|
||||
+ .driver = {
|
||||
+ .of_match_table = ar7200_usb_phy_of_match,
|
||||
+ .name = "ar7200-usb-phy",
|
||||
+ }
|
||||
+};
|
||||
+module_platform_driver(ar7200_usb_phy_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("ATH79 USB PHY driver");
|
||||
+MODULE_AUTHOR("Alban Bedel <albeu@free.fr>");
|
||||
+MODULE_LICENSE("GPL");
|
@ -1,24 +0,0 @@
|
||||
From 2201818e5bd33f389beceb3943fdfcf5a698fc5b Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 6 Mar 2018 10:01:43 +0100
|
||||
Subject: [PATCH 05/27] usb: add more OF/quirk properties
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/usb/host/ehci-platform.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/usb/host/ehci-platform.c
|
||||
+++ b/drivers/usb/host/ehci-platform.c
|
||||
@@ -161,6 +161,11 @@ static int ehci_platform_probe(struct pl
|
||||
ehci = hcd_to_ehci(hcd);
|
||||
|
||||
if (pdata == &ehci_platform_defaults && dev->dev.of_node) {
|
||||
+ of_property_read_u32(dev->dev.of_node, "caps-offset", &pdata->caps_offset);
|
||||
+
|
||||
+ if (of_property_read_bool(dev->dev.of_node, "has-synopsys-hc-bug"))
|
||||
+ pdata->has_synopsys_hc_bug = 1;
|
||||
+
|
||||
if (of_property_read_bool(dev->dev.of_node, "big-endian-regs"))
|
||||
ehci->big_endian_mmio = 1;
|
||||
|
@ -1,168 +0,0 @@
|
||||
From f3eacff2310a60348a755c50a8da6fc251fc8587 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 6 Mar 2018 09:55:13 +0100
|
||||
Subject: [PATCH 07/33] irqchip/irq-ath79-intc: add irq cascade driver for
|
||||
QCA9556 SoCs
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/irqchip/Makefile | 1 +
|
||||
drivers/irqchip/irq-ath79-intc.c | 142 +++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 143 insertions(+)
|
||||
create mode 100644 drivers/irqchip/irq-ath79-intc.c
|
||||
|
||||
--- a/drivers/irqchip/Makefile
|
||||
+++ b/drivers/irqchip/Makefile
|
||||
@@ -3,6 +3,7 @@ obj-$(CONFIG_IRQCHIP) += irqchip.o
|
||||
|
||||
obj-$(CONFIG_ALPINE_MSI) += irq-alpine-msi.o
|
||||
obj-$(CONFIG_ATH79) += irq-ath79-cpu.o
|
||||
+obj-$(CONFIG_ATH79) += irq-ath79-intc.o
|
||||
obj-$(CONFIG_ATH79) += irq-ath79-misc.o
|
||||
obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o
|
||||
obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2836.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/irqchip/irq-ath79-intc.c
|
||||
@@ -0,0 +1,142 @@
|
||||
+/*
|
||||
+ * Atheros AR71xx/AR724x/AR913x specific interrupt handling
|
||||
+ *
|
||||
+ * Copyright (C) 2018 John Crispin <john@phrozen.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/interrupt.h>
|
||||
+#include <linux/irqchip.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include <linux/irqdomain.h>
|
||||
+
|
||||
+#include <asm/irq_cpu.h>
|
||||
+#include <asm/mach-ath79/ath79.h>
|
||||
+#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
+
|
||||
+#define ATH79_MAX_INTC_CASCADE 3
|
||||
+
|
||||
+struct ath79_intc {
|
||||
+ struct irq_chip chip;
|
||||
+ u32 irq;
|
||||
+ u32 pending_mask;
|
||||
+ u32 int_status;
|
||||
+ u32 irq_mask[ATH79_MAX_INTC_CASCADE];
|
||||
+ u32 irq_wb_chan[ATH79_MAX_INTC_CASCADE];
|
||||
+};
|
||||
+
|
||||
+static void ath79_intc_irq_handler(struct irq_desc *desc)
|
||||
+{
|
||||
+ struct irq_domain *domain = irq_desc_get_handler_data(desc);
|
||||
+ struct ath79_intc *intc = domain->host_data;
|
||||
+ u32 pending;
|
||||
+
|
||||
+ pending = ath79_reset_rr(intc->int_status);
|
||||
+ pending &= intc->pending_mask;
|
||||
+
|
||||
+ if (pending) {
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < domain->hwirq_max; i++)
|
||||
+ if (pending & intc->irq_mask[i]) {
|
||||
+ if (intc->irq_wb_chan[i] != 0xffffffff)
|
||||
+ ath79_ddr_wb_flush(intc->irq_wb_chan[i]);
|
||||
+ generic_handle_irq(irq_find_mapping(domain, i));
|
||||
+ }
|
||||
+ } else {
|
||||
+ spurious_interrupt();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void ath79_intc_irq_enable(struct irq_data *d)
|
||||
+{
|
||||
+ struct ath79_intc *intc = d->domain->host_data;
|
||||
+ enable_irq(intc->irq);
|
||||
+}
|
||||
+
|
||||
+static void ath79_intc_irq_disable(struct irq_data *d)
|
||||
+{
|
||||
+ struct ath79_intc *intc = d->domain->host_data;
|
||||
+ disable_irq(intc->irq);
|
||||
+}
|
||||
+
|
||||
+static int ath79_intc_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
|
||||
+{
|
||||
+ struct ath79_intc *intc = d->host_data;
|
||||
+
|
||||
+ irq_set_chip_and_handler(irq, &intc->chip, handle_level_irq);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct irq_domain_ops ath79_irq_domain_ops = {
|
||||
+ .xlate = irq_domain_xlate_onecell,
|
||||
+ .map = ath79_intc_map,
|
||||
+};
|
||||
+
|
||||
+static int __init ath79_intc_of_init(
|
||||
+ struct device_node *node, struct device_node *parent)
|
||||
+{
|
||||
+ struct irq_domain *domain;
|
||||
+ struct ath79_intc *intc;
|
||||
+ int cnt, cntwb, i, err;
|
||||
+
|
||||
+ cnt = of_property_count_u32_elems(node, "qca,pending-bits");
|
||||
+ if (cnt > ATH79_MAX_INTC_CASCADE)
|
||||
+ panic("Too many INTC pending bits\n");
|
||||
+
|
||||
+ intc = kzalloc(sizeof(*intc), GFP_KERNEL);
|
||||
+ if (!intc)
|
||||
+ panic("Failed to allocate INTC memory\n");
|
||||
+ intc->chip = dummy_irq_chip;
|
||||
+ intc->chip.name = "INTC";
|
||||
+ intc->chip.irq_disable = ath79_intc_irq_disable;
|
||||
+ intc->chip.irq_enable = ath79_intc_irq_enable;
|
||||
+
|
||||
+ if (of_property_read_u32(node, "qca,int-status-addr", &intc->int_status) < 0) {
|
||||
+ panic("Missing address of interrupt status register\n");
|
||||
+ }
|
||||
+
|
||||
+ of_property_read_u32_array(node, "qca,pending-bits", intc->irq_mask, cnt);
|
||||
+ for (i = 0; i < cnt; i++) {
|
||||
+ intc->pending_mask |= intc->irq_mask[i];
|
||||
+ intc->irq_wb_chan[i] = 0xffffffff;
|
||||
+ }
|
||||
+
|
||||
+ cntwb = of_count_phandle_with_args(
|
||||
+ node, "qca,ddr-wb-channels", "#qca,ddr-wb-channel-cells");
|
||||
+
|
||||
+ for (i = 0; i < cntwb; i++) {
|
||||
+ struct of_phandle_args args;
|
||||
+ u32 irq = i;
|
||||
+
|
||||
+ of_property_read_u32_index(
|
||||
+ node, "qca,ddr-wb-channel-interrupts", i, &irq);
|
||||
+ if (irq >= ATH79_MAX_INTC_CASCADE)
|
||||
+ continue;
|
||||
+
|
||||
+ err = of_parse_phandle_with_args(
|
||||
+ node, "qca,ddr-wb-channels",
|
||||
+ "#qca,ddr-wb-channel-cells",
|
||||
+ i, &args);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ intc->irq_wb_chan[irq] = args.args[0];
|
||||
+ }
|
||||
+
|
||||
+ intc->irq = irq_of_parse_and_map(node, 0);
|
||||
+ if (!intc->irq)
|
||||
+ panic("Failed to get INTC IRQ");
|
||||
+
|
||||
+ domain = irq_domain_add_linear(node, cnt, &ath79_irq_domain_ops, intc);
|
||||
+ irq_set_chained_handler_and_data(intc->irq, ath79_intc_irq_handler, domain);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+IRQCHIP_DECLARE(ath79_intc, "qca,ar9340-intc",
|
||||
+ ath79_intc_of_init);
|
@ -1,23 +0,0 @@
|
||||
From e029f998594f151008ecbfa024e2957edd2a5189 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 6 Mar 2018 09:58:19 +0100
|
||||
Subject: [PATCH 08/33] irqchip/irq-ath79-cpu: drop !OF init helper
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/irqchip/irq-ath79-cpu.c | 7 -------
|
||||
1 file changed, 7 deletions(-)
|
||||
|
||||
--- a/drivers/irqchip/irq-ath79-cpu.c
|
||||
+++ b/drivers/irqchip/irq-ath79-cpu.c
|
||||
@@ -88,10 +88,3 @@ static int __init ar79_cpu_intc_of_init(
|
||||
}
|
||||
IRQCHIP_DECLARE(ar79_cpu_intc, "qca,ar7100-cpu-intc",
|
||||
ar79_cpu_intc_of_init);
|
||||
-
|
||||
-void __init ath79_cpu_irq_init(unsigned irq_wb_chan2, unsigned irq_wb_chan3)
|
||||
-{
|
||||
- irq_wb_chan[2] = irq_wb_chan2;
|
||||
- irq_wb_chan[3] = irq_wb_chan3;
|
||||
- mips_cpu_irq_init();
|
||||
-}
|
@ -1,24 +0,0 @@
|
||||
From 0c8856211d26f84277f7fcb0b9595e5c646bc464 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 6 Mar 2018 10:00:55 +0100
|
||||
Subject: [PATCH 11/33] MIPS: ath79: select the PINCTRL subsystem
|
||||
|
||||
The pinmux on QCA SoCs is controlled by a single register. The
|
||||
"pinctrl-single" driver can be used but requires the target
|
||||
to select PINCTRL.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -288,6 +288,7 @@ config BCM63XX
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
select SWAP_IO_SPACE
|
||||
select GPIOLIB
|
||||
+ select PINCTRL
|
||||
select HAVE_CLK
|
||||
select MIPS_L1_CACHE_SHIFT_4
|
||||
select CLKDEV_LOOKUP
|
@ -1,57 +0,0 @@
|
||||
From 4a4f869ec58ed8910b9b2e68d0eee50957e9bb20 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Mon, 25 Jun 2018 15:52:10 +0200
|
||||
Subject: [PATCH 17/33] dt-bindings: PCI: qcom,ar7100: adds binding doc
|
||||
|
||||
With the driver being converted from platform_data to pure OF, we need to
|
||||
also add some docs.
|
||||
|
||||
Cc: Rob Herring <robh+dt@kernel.org>
|
||||
Cc: devicetree@vger.kernel.org
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
.../devicetree/bindings/pci/qcom,ar7100-pci.txt | 38 ++++++++++++++++++++++
|
||||
1 file changed, 38 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/pci/qcom,ar7100-pci.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/pci/qcom,ar7100-pci.txt
|
||||
@@ -0,0 +1,38 @@
|
||||
+* Qualcomm Atheros AR7100 PCI express root complex
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible: should contain "qcom,ar7100-pci" to identify the core.
|
||||
+- reg: Should contain the register ranges as listed in the reg-names property.
|
||||
+- reg-names: Definition: Must include the following entries
|
||||
+ - "cfg_base" IO Memory
|
||||
+- #address-cells: set to <3>
|
||||
+- #size-cells: set to <2>
|
||||
+- ranges: ranges for the PCI memory and I/O regions
|
||||
+- interrupt-map-mask and interrupt-map: standard PCI
|
||||
+ properties to define the mapping of the PCIe interface to interrupt
|
||||
+ numbers.
|
||||
+- #interrupt-cells: set to <1>
|
||||
+- interrupt-controller: define to enable the builtin IRQ cascade.
|
||||
+
|
||||
+Optional properties:
|
||||
+- interrupt-parent: phandle to the MIPS IRQ controller
|
||||
+
|
||||
+* Example for ar7100
|
||||
+ pcie-controller@180c0000 {
|
||||
+ compatible = "qca,ar7100-pci";
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ bus-range = <0x0 0x0>;
|
||||
+ reg = <0x17010000 0x100>;
|
||||
+ reg-names = "cfg_base";
|
||||
+ ranges = <0x2000000 0 0x10000000 0x10000000 0 0x07000000
|
||||
+ 0x1000000 0 0x00000000 0x00000000 0 0x00000001>;
|
||||
+ interrupt-parent = <&cpuintc>;
|
||||
+ interrupts = <2>;
|
||||
+
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <1>;
|
||||
+
|
||||
+ interrupt-map-mask = <0 0 0 1>;
|
||||
+ interrupt-map = <0 0 0 0 &pcie0 0>;
|
||||
+ };
|
@ -1,202 +0,0 @@
|
||||
From 1855ab6b1d27f5b38a648baf57ff6a534afec26d Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Jun 2018 15:07:23 +0200
|
||||
Subject: [PATCH 18/33] MIPS: pci-ar71xx: convert to OF
|
||||
|
||||
With the ath79 target getting converted to pure OF, we can drop all the
|
||||
platform data code and add the missing OF bits to the driver. We also add
|
||||
a irq domain for the PCI/e controllers cascade, thus making it usable from
|
||||
dts files.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/pci/pci-ar71xx.c | 82 +++++++++++++++++++++++-----------------------
|
||||
1 file changed, 41 insertions(+), 41 deletions(-)
|
||||
|
||||
--- a/arch/mips/pci/pci-ar71xx.c
|
||||
+++ b/arch/mips/pci/pci-ar71xx.c
|
||||
@@ -18,8 +18,11 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_regs.h>
|
||||
#include <linux/interrupt.h>
|
||||
+#include <linux/irqchip/chained_irq.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include <linux/of_pci.h>
|
||||
|
||||
#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
#include <asm/mach-ath79/ath79.h>
|
||||
@@ -49,12 +52,13 @@
|
||||
#define AR71XX_PCI_IRQ_COUNT 5
|
||||
|
||||
struct ar71xx_pci_controller {
|
||||
+ struct device_node *np;
|
||||
void __iomem *cfg_base;
|
||||
int irq;
|
||||
- int irq_base;
|
||||
struct pci_controller pci_ctrl;
|
||||
struct resource io_res;
|
||||
struct resource mem_res;
|
||||
+ struct irq_domain *domain;
|
||||
};
|
||||
|
||||
/* Byte lane enable bits */
|
||||
@@ -228,29 +232,30 @@ static struct pci_ops ar71xx_pci_ops = {
|
||||
|
||||
static void ar71xx_pci_irq_handler(struct irq_desc *desc)
|
||||
{
|
||||
- struct ar71xx_pci_controller *apc;
|
||||
void __iomem *base = ath79_reset_base;
|
||||
+ struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
+ struct ar71xx_pci_controller *apc = irq_desc_get_handler_data(desc);
|
||||
u32 pending;
|
||||
|
||||
- apc = irq_desc_get_handler_data(desc);
|
||||
-
|
||||
+ chained_irq_enter(chip, desc);
|
||||
pending = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_STATUS) &
|
||||
__raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
|
||||
if (pending & AR71XX_PCI_INT_DEV0)
|
||||
- generic_handle_irq(apc->irq_base + 0);
|
||||
+ generic_handle_irq(irq_linear_revmap(apc->domain, 1));
|
||||
|
||||
else if (pending & AR71XX_PCI_INT_DEV1)
|
||||
- generic_handle_irq(apc->irq_base + 1);
|
||||
+ generic_handle_irq(irq_linear_revmap(apc->domain, 2));
|
||||
|
||||
else if (pending & AR71XX_PCI_INT_DEV2)
|
||||
- generic_handle_irq(apc->irq_base + 2);
|
||||
+ generic_handle_irq(irq_linear_revmap(apc->domain, 3));
|
||||
|
||||
else if (pending & AR71XX_PCI_INT_CORE)
|
||||
- generic_handle_irq(apc->irq_base + 4);
|
||||
+ generic_handle_irq(irq_linear_revmap(apc->domain, 4));
|
||||
|
||||
else
|
||||
spurious_interrupt();
|
||||
+ chained_irq_exit(chip, desc);
|
||||
}
|
||||
|
||||
static void ar71xx_pci_irq_unmask(struct irq_data *d)
|
||||
@@ -261,7 +266,7 @@ static void ar71xx_pci_irq_unmask(struct
|
||||
u32 t;
|
||||
|
||||
apc = irq_data_get_irq_chip_data(d);
|
||||
- irq = d->irq - apc->irq_base;
|
||||
+ irq = irq_linear_revmap(apc->domain, d->irq);
|
||||
|
||||
t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
__raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
@@ -278,7 +283,7 @@ static void ar71xx_pci_irq_mask(struct i
|
||||
u32 t;
|
||||
|
||||
apc = irq_data_get_irq_chip_data(d);
|
||||
- irq = d->irq - apc->irq_base;
|
||||
+ irq = irq_linear_revmap(apc->domain, d->irq);
|
||||
|
||||
t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
__raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
@@ -294,24 +299,31 @@ static struct irq_chip ar71xx_pci_irq_ch
|
||||
.irq_mask_ack = ar71xx_pci_irq_mask,
|
||||
};
|
||||
|
||||
+static int ar71xx_pci_irq_map(struct irq_domain *d,
|
||||
+ unsigned int irq, irq_hw_number_t hw)
|
||||
+{
|
||||
+ struct ar71xx_pci_controller *apc = d->host_data;
|
||||
+
|
||||
+ irq_set_chip_and_handler(irq, &ar71xx_pci_irq_chip, handle_level_irq);
|
||||
+ irq_set_chip_data(irq, apc);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct irq_domain_ops ar71xx_pci_domain_ops = {
|
||||
+ .xlate = irq_domain_xlate_onecell,
|
||||
+ .map = ar71xx_pci_irq_map,
|
||||
+};
|
||||
+
|
||||
static void ar71xx_pci_irq_init(struct ar71xx_pci_controller *apc)
|
||||
{
|
||||
void __iomem *base = ath79_reset_base;
|
||||
- int i;
|
||||
|
||||
__raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
__raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_STATUS);
|
||||
|
||||
- BUILD_BUG_ON(ATH79_PCI_IRQ_COUNT < AR71XX_PCI_IRQ_COUNT);
|
||||
-
|
||||
- apc->irq_base = ATH79_PCI_IRQ_BASE;
|
||||
- for (i = apc->irq_base;
|
||||
- i < apc->irq_base + AR71XX_PCI_IRQ_COUNT; i++) {
|
||||
- irq_set_chip_and_handler(i, &ar71xx_pci_irq_chip,
|
||||
- handle_level_irq);
|
||||
- irq_set_chip_data(i, apc);
|
||||
- }
|
||||
-
|
||||
+ apc->domain = irq_domain_add_linear(apc->np, AR71XX_PCI_IRQ_COUNT,
|
||||
+ &ar71xx_pci_domain_ops, apc);
|
||||
irq_set_chained_handler_and_data(apc->irq, ar71xx_pci_irq_handler,
|
||||
apc);
|
||||
}
|
||||
@@ -328,6 +340,11 @@ static void ar71xx_pci_reset(void)
|
||||
mdelay(100);
|
||||
}
|
||||
|
||||
+static const struct of_device_id ar71xx_pci_ids[] = {
|
||||
+ { .compatible = "qca,ar7100-pci" },
|
||||
+ {},
|
||||
+};
|
||||
+
|
||||
static int ar71xx_pci_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ar71xx_pci_controller *apc;
|
||||
@@ -348,26 +365,6 @@ static int ar71xx_pci_probe(struct platf
|
||||
if (apc->irq < 0)
|
||||
return -EINVAL;
|
||||
|
||||
- res = platform_get_resource_byname(pdev, IORESOURCE_IO, "io_base");
|
||||
- if (!res)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- apc->io_res.parent = res;
|
||||
- apc->io_res.name = "PCI IO space";
|
||||
- apc->io_res.start = res->start;
|
||||
- apc->io_res.end = res->end;
|
||||
- apc->io_res.flags = IORESOURCE_IO;
|
||||
-
|
||||
- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mem_base");
|
||||
- if (!res)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- apc->mem_res.parent = res;
|
||||
- apc->mem_res.name = "PCI memory space";
|
||||
- apc->mem_res.start = res->start;
|
||||
- apc->mem_res.end = res->end;
|
||||
- apc->mem_res.flags = IORESOURCE_MEM;
|
||||
-
|
||||
ar71xx_pci_reset();
|
||||
|
||||
/* setup COMMAND register */
|
||||
@@ -380,9 +377,11 @@ static int ar71xx_pci_probe(struct platf
|
||||
|
||||
ar71xx_pci_irq_init(apc);
|
||||
|
||||
+ apc->np = pdev->dev.of_node;
|
||||
apc->pci_ctrl.pci_ops = &ar71xx_pci_ops;
|
||||
apc->pci_ctrl.mem_resource = &apc->mem_res;
|
||||
apc->pci_ctrl.io_resource = &apc->io_res;
|
||||
+ pci_load_of_ranges(&apc->pci_ctrl, pdev->dev.of_node);
|
||||
|
||||
register_pci_controller(&apc->pci_ctrl);
|
||||
|
||||
@@ -393,6 +392,7 @@ static struct platform_driver ar71xx_pci
|
||||
.probe = ar71xx_pci_probe,
|
||||
.driver = {
|
||||
.name = "ar71xx-pci",
|
||||
+ .of_match_table = of_match_ptr(ar71xx_pci_ids),
|
||||
},
|
||||
};
|
||||
|
@ -1,61 +0,0 @@
|
||||
From ea27764bc3ef2a05decf3ae05edffc289cd0d93c Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Mon, 25 Jun 2018 15:52:02 +0200
|
||||
Subject: [PATCH 19/33] dt-bindings: PCI: qcom,ar7240: adds binding doc
|
||||
|
||||
With the driver being converted from platform_data to pure OF, we need to
|
||||
also add some docs.
|
||||
|
||||
Cc: Rob Herring <robh+dt@kernel.org>
|
||||
Cc: devicetree@vger.kernel.org
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
.../devicetree/bindings/pci/qcom,ar7240-pci.txt | 42 ++++++++++++++++++++++
|
||||
1 file changed, 42 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/pci/qcom,ar7240-pci.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/pci/qcom,ar7240-pci.txt
|
||||
@@ -0,0 +1,42 @@
|
||||
+* Qualcomm Atheros AR724X PCI express root complex
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible: should contain "qcom,ar7240-pci" to identify the core.
|
||||
+- reg: Should contain the register ranges as listed in the reg-names property.
|
||||
+- reg-names: Definition: Must include the following entries
|
||||
+ - "crp_base" Configuration registers
|
||||
+ - "ctrl_base" Control registers
|
||||
+ - "cfg_base" IO Memory
|
||||
+- #address-cells: set to <3>
|
||||
+- #size-cells: set to <2>
|
||||
+- ranges: ranges for the PCI memory and I/O regions
|
||||
+- interrupt-map-mask and interrupt-map: standard PCI
|
||||
+ properties to define the mapping of the PCIe interface to interrupt
|
||||
+ numbers.
|
||||
+- #interrupt-cells: set to <1>
|
||||
+- interrupt-parent: phandle to the MIPS IRQ controller
|
||||
+
|
||||
+Optional properties:
|
||||
+- interrupt-controller: define to enable the builtin IRQ cascade.
|
||||
+
|
||||
+* Example for qca9557
|
||||
+ pcie-controller@180c0000 {
|
||||
+ compatible = "qcom,ar7240-pci";
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ bus-range = <0x0 0x0>;
|
||||
+ reg = <0x180c0000 0x1000>,
|
||||
+ <0x180f0000 0x100>,
|
||||
+ <0x14000000 0x1000>;
|
||||
+ reg-names = "crp_base", "ctrl_base", "cfg_base";
|
||||
+ ranges = <0x2000000 0 0x10000000 0x10000000 0 0x04000000
|
||||
+ 0x1000000 0 0x00000000 0x00000000 0 0x00000001>;
|
||||
+ interrupt-parent = <&intc2>;
|
||||
+ interrupts = <1>;
|
||||
+
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <1>;
|
||||
+
|
||||
+ interrupt-map-mask = <0 0 0 1>;
|
||||
+ interrupt-map = <0 0 0 0 &pcie0 0>;
|
||||
+ };
|
@ -1,205 +0,0 @@
|
||||
From a522ee0199d5d3ea114ca2e211f6ac398d3e8e0b Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Jun 2018 15:07:37 +0200
|
||||
Subject: [PATCH 20/33] MIPS: pci-ar724x: convert to OF
|
||||
|
||||
With the ath79 target getting converted to pure OF, we can drop all the
|
||||
platform data code and add the missing OF bits to the driver. We also add
|
||||
a irq domain for the PCI/e controllers cascade, thus making it usable from
|
||||
dts files.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/pci/pci-ar724x.c | 88 ++++++++++++++++++++++------------------------
|
||||
1 file changed, 42 insertions(+), 46 deletions(-)
|
||||
|
||||
--- a/arch/mips/pci/pci-ar724x.c
|
||||
+++ b/arch/mips/pci/pci-ar724x.c
|
||||
@@ -14,8 +14,11 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/irqchip/chained_irq.h>
|
||||
#include <asm/mach-ath79/ath79.h>
|
||||
#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include <linux/of_pci.h>
|
||||
|
||||
#define AR724X_PCI_REG_APP 0x00
|
||||
#define AR724X_PCI_REG_RESET 0x18
|
||||
@@ -45,17 +48,20 @@ struct ar724x_pci_controller {
|
||||
void __iomem *crp_base;
|
||||
|
||||
int irq;
|
||||
- int irq_base;
|
||||
|
||||
bool link_up;
|
||||
bool bar0_is_cached;
|
||||
u32 bar0_value;
|
||||
|
||||
+ struct device_node *np;
|
||||
struct pci_controller pci_controller;
|
||||
+ struct irq_domain *domain;
|
||||
struct resource io_res;
|
||||
struct resource mem_res;
|
||||
};
|
||||
|
||||
+static struct irq_chip ar724x_pci_irq_chip;
|
||||
+
|
||||
static inline bool ar724x_pci_check_link(struct ar724x_pci_controller *apc)
|
||||
{
|
||||
u32 reset;
|
||||
@@ -231,35 +237,31 @@ static struct pci_ops ar724x_pci_ops = {
|
||||
|
||||
static void ar724x_pci_irq_handler(struct irq_desc *desc)
|
||||
{
|
||||
- struct ar724x_pci_controller *apc;
|
||||
- void __iomem *base;
|
||||
+ struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
+ struct ar724x_pci_controller *apc = irq_desc_get_handler_data(desc);
|
||||
u32 pending;
|
||||
|
||||
- apc = irq_desc_get_handler_data(desc);
|
||||
- base = apc->ctrl_base;
|
||||
-
|
||||
- pending = __raw_readl(base + AR724X_PCI_REG_INT_STATUS) &
|
||||
- __raw_readl(base + AR724X_PCI_REG_INT_MASK);
|
||||
+ chained_irq_enter(chip, desc);
|
||||
+ pending = __raw_readl(apc->ctrl_base + AR724X_PCI_REG_INT_STATUS) &
|
||||
+ __raw_readl(apc->ctrl_base + AR724X_PCI_REG_INT_MASK);
|
||||
|
||||
if (pending & AR724X_PCI_INT_DEV0)
|
||||
- generic_handle_irq(apc->irq_base + 0);
|
||||
-
|
||||
+ generic_handle_irq(irq_linear_revmap(apc->domain, 1));
|
||||
else
|
||||
spurious_interrupt();
|
||||
+ chained_irq_exit(chip, desc);
|
||||
}
|
||||
|
||||
static void ar724x_pci_irq_unmask(struct irq_data *d)
|
||||
{
|
||||
struct ar724x_pci_controller *apc;
|
||||
void __iomem *base;
|
||||
- int offset;
|
||||
u32 t;
|
||||
|
||||
apc = irq_data_get_irq_chip_data(d);
|
||||
base = apc->ctrl_base;
|
||||
- offset = apc->irq_base - d->irq;
|
||||
|
||||
- switch (offset) {
|
||||
+ switch (irq_linear_revmap(apc->domain, d->irq)) {
|
||||
case 0:
|
||||
t = __raw_readl(base + AR724X_PCI_REG_INT_MASK);
|
||||
__raw_writel(t | AR724X_PCI_INT_DEV0,
|
||||
@@ -273,14 +275,12 @@ static void ar724x_pci_irq_mask(struct i
|
||||
{
|
||||
struct ar724x_pci_controller *apc;
|
||||
void __iomem *base;
|
||||
- int offset;
|
||||
u32 t;
|
||||
|
||||
apc = irq_data_get_irq_chip_data(d);
|
||||
base = apc->ctrl_base;
|
||||
- offset = apc->irq_base - d->irq;
|
||||
|
||||
- switch (offset) {
|
||||
+ switch (irq_linear_revmap(apc->domain, d->irq)) {
|
||||
case 0:
|
||||
t = __raw_readl(base + AR724X_PCI_REG_INT_MASK);
|
||||
__raw_writel(t & ~AR724X_PCI_INT_DEV0,
|
||||
@@ -305,26 +305,34 @@ static struct irq_chip ar724x_pci_irq_ch
|
||||
.irq_mask_ack = ar724x_pci_irq_mask,
|
||||
};
|
||||
|
||||
+static int ar724x_pci_irq_map(struct irq_domain *d,
|
||||
+ unsigned int irq, irq_hw_number_t hw)
|
||||
+{
|
||||
+ struct ar724x_pci_controller *apc = d->host_data;
|
||||
+
|
||||
+ irq_set_chip_and_handler(irq, &ar724x_pci_irq_chip, handle_level_irq);
|
||||
+ irq_set_chip_data(irq, apc);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct irq_domain_ops ar724x_pci_domain_ops = {
|
||||
+ .xlate = irq_domain_xlate_onecell,
|
||||
+ .map = ar724x_pci_irq_map,
|
||||
+};
|
||||
+
|
||||
static void ar724x_pci_irq_init(struct ar724x_pci_controller *apc,
|
||||
int id)
|
||||
{
|
||||
void __iomem *base;
|
||||
- int i;
|
||||
|
||||
base = apc->ctrl_base;
|
||||
|
||||
__raw_writel(0, base + AR724X_PCI_REG_INT_MASK);
|
||||
__raw_writel(0, base + AR724X_PCI_REG_INT_STATUS);
|
||||
|
||||
- apc->irq_base = ATH79_PCI_IRQ_BASE + (id * AR724X_PCI_IRQ_COUNT);
|
||||
-
|
||||
- for (i = apc->irq_base;
|
||||
- i < apc->irq_base + AR724X_PCI_IRQ_COUNT; i++) {
|
||||
- irq_set_chip_and_handler(i, &ar724x_pci_irq_chip,
|
||||
- handle_level_irq);
|
||||
- irq_set_chip_data(i, apc);
|
||||
- }
|
||||
-
|
||||
+ apc->domain = irq_domain_add_linear(apc->np, 2,
|
||||
+ &ar724x_pci_domain_ops, apc);
|
||||
irq_set_chained_handler_and_data(apc->irq, ar724x_pci_irq_handler,
|
||||
apc);
|
||||
}
|
||||
@@ -394,29 +402,11 @@ static int ar724x_pci_probe(struct platf
|
||||
if (apc->irq < 0)
|
||||
return -EINVAL;
|
||||
|
||||
- res = platform_get_resource_byname(pdev, IORESOURCE_IO, "io_base");
|
||||
- if (!res)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- apc->io_res.parent = res;
|
||||
- apc->io_res.name = "PCI IO space";
|
||||
- apc->io_res.start = res->start;
|
||||
- apc->io_res.end = res->end;
|
||||
- apc->io_res.flags = IORESOURCE_IO;
|
||||
-
|
||||
- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mem_base");
|
||||
- if (!res)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- apc->mem_res.parent = res;
|
||||
- apc->mem_res.name = "PCI memory space";
|
||||
- apc->mem_res.start = res->start;
|
||||
- apc->mem_res.end = res->end;
|
||||
- apc->mem_res.flags = IORESOURCE_MEM;
|
||||
-
|
||||
+ apc->np = pdev->dev.of_node;
|
||||
apc->pci_controller.pci_ops = &ar724x_pci_ops;
|
||||
apc->pci_controller.io_resource = &apc->io_res;
|
||||
apc->pci_controller.mem_resource = &apc->mem_res;
|
||||
+ pci_load_of_ranges(&apc->pci_controller, pdev->dev.of_node);
|
||||
|
||||
/*
|
||||
* Do the full PCIE Root Complex Initialization Sequence if the PCIe
|
||||
@@ -438,10 +428,16 @@ static int ar724x_pci_probe(struct platf
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static const struct of_device_id ar724x_pci_ids[] = {
|
||||
+ { .compatible = "qcom,ar7240-pci" },
|
||||
+ {},
|
||||
+};
|
||||
+
|
||||
static struct platform_driver ar724x_pci_driver = {
|
||||
.probe = ar724x_pci_probe,
|
||||
.driver = {
|
||||
.name = "ar724x-pci",
|
||||
+ .of_match_table = of_match_ptr(ar724x_pci_ids),
|
||||
},
|
||||
};
|
||||
|
@ -1,243 +0,0 @@
|
||||
From 288a8eb0d41f09fda242e05f8a7bd1f5b3489477 Mon Sep 17 00:00:00 2001
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Tue, 6 Mar 2018 13:19:26 +0100
|
||||
Subject: [PATCH 21/33] MIPS: ath79: add helpers for setting clocks and expose
|
||||
the ref clock
|
||||
|
||||
Preparation for transitioning the legacy clock setup code over
|
||||
to OF.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/ath79/clock.c | 128 ++++++++++++++++++----------------
|
||||
include/dt-bindings/clock/ath79-clk.h | 3 +-
|
||||
2 files changed, 68 insertions(+), 63 deletions(-)
|
||||
|
||||
--- a/arch/mips/ath79/clock.c
|
||||
+++ b/arch/mips/ath79/clock.c
|
||||
@@ -37,20 +37,46 @@ static struct clk_onecell_data clk_data
|
||||
.clk_num = ARRAY_SIZE(clks),
|
||||
};
|
||||
|
||||
-static struct clk *__init ath79_add_sys_clkdev(
|
||||
- const char *id, unsigned long rate)
|
||||
+static const char * const clk_names[ATH79_CLK_END] = {
|
||||
+ [ATH79_CLK_CPU] = "cpu",
|
||||
+ [ATH79_CLK_DDR] = "ddr",
|
||||
+ [ATH79_CLK_AHB] = "ahb",
|
||||
+ [ATH79_CLK_REF] = "ref",
|
||||
+};
|
||||
+
|
||||
+static const char * __init ath79_clk_name(int type)
|
||||
{
|
||||
- struct clk *clk;
|
||||
- int err;
|
||||
+ BUG_ON(type >= ARRAY_SIZE(clk_names) || !clk_names[type]);
|
||||
+ return clk_names[type];
|
||||
+}
|
||||
|
||||
- clk = clk_register_fixed_rate(NULL, id, NULL, 0, rate);
|
||||
+static void __init __ath79_set_clk(int type, const char *name, struct clk *clk)
|
||||
+{
|
||||
if (IS_ERR(clk))
|
||||
- panic("failed to allocate %s clock structure", id);
|
||||
+ panic("failed to allocate %s clock structure", clk_names[type]);
|
||||
|
||||
- err = clk_register_clkdev(clk, id, NULL);
|
||||
- if (err)
|
||||
- panic("unable to register %s clock device", id);
|
||||
+ clks[type] = clk;
|
||||
+ clk_register_clkdev(clk, name, NULL);
|
||||
+}
|
||||
|
||||
+static struct clk * __init ath79_set_clk(int type, unsigned long rate)
|
||||
+{
|
||||
+ const char *name = ath79_clk_name(type);
|
||||
+ struct clk *clk;
|
||||
+
|
||||
+ clk = clk_register_fixed_rate(NULL, name, NULL, 0, rate);
|
||||
+ __ath79_set_clk(type, name, clk);
|
||||
+ return clk;
|
||||
+}
|
||||
+
|
||||
+static struct clk * __init ath79_set_ff_clk(int type, const char *parent,
|
||||
+ unsigned int mult, unsigned int div)
|
||||
+{
|
||||
+ const char *name = ath79_clk_name(type);
|
||||
+ struct clk *clk;
|
||||
+
|
||||
+ clk = clk_register_fixed_factor(NULL, name, parent, 0, mult, div);
|
||||
+ __ath79_set_clk(type, name, clk);
|
||||
return clk;
|
||||
}
|
||||
|
||||
@@ -80,27 +106,15 @@ static void __init ar71xx_clocks_init(vo
|
||||
div = (((pll >> AR71XX_AHB_DIV_SHIFT) & AR71XX_AHB_DIV_MASK) + 1) * 2;
|
||||
ahb_rate = cpu_rate / div;
|
||||
|
||||
- ath79_add_sys_clkdev("ref", ref_rate);
|
||||
- clks[ATH79_CLK_CPU] = ath79_add_sys_clkdev("cpu", cpu_rate);
|
||||
- clks[ATH79_CLK_DDR] = ath79_add_sys_clkdev("ddr", ddr_rate);
|
||||
- clks[ATH79_CLK_AHB] = ath79_add_sys_clkdev("ahb", ahb_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
|
||||
clk_add_alias("wdt", NULL, "ahb", NULL);
|
||||
clk_add_alias("uart", NULL, "ahb", NULL);
|
||||
}
|
||||
|
||||
-static struct clk * __init ath79_reg_ffclk(const char *name,
|
||||
- const char *parent_name, unsigned int mult, unsigned int div)
|
||||
-{
|
||||
- struct clk *clk;
|
||||
-
|
||||
- clk = clk_register_fixed_factor(NULL, name, parent_name, 0, mult, div);
|
||||
- if (IS_ERR(clk))
|
||||
- panic("failed to allocate %s clock structure", name);
|
||||
-
|
||||
- return clk;
|
||||
-}
|
||||
-
|
||||
static void __init ar724x_clk_init(struct clk *ref_clk, void __iomem *pll_base)
|
||||
{
|
||||
u32 pll;
|
||||
@@ -114,24 +128,19 @@ static void __init ar724x_clk_init(struc
|
||||
ddr_div = ((pll >> AR724X_DDR_DIV_SHIFT) & AR724X_DDR_DIV_MASK) + 1;
|
||||
ahb_div = (((pll >> AR724X_AHB_DIV_SHIFT) & AR724X_AHB_DIV_MASK) + 1) * 2;
|
||||
|
||||
- clks[ATH79_CLK_CPU] = ath79_reg_ffclk("cpu", "ref", mult, div);
|
||||
- clks[ATH79_CLK_DDR] = ath79_reg_ffclk("ddr", "ref", mult, div * ddr_div);
|
||||
- clks[ATH79_CLK_AHB] = ath79_reg_ffclk("ahb", "ref", mult, div * ahb_div);
|
||||
+ ath79_set_ff_clk(ATH79_CLK_CPU, "ref", mult, div);
|
||||
+ ath79_set_ff_clk(ATH79_CLK_DDR, "ref", mult, div * ddr_div);
|
||||
+ ath79_set_ff_clk(ATH79_CLK_AHB, "ref", mult, div * ahb_div);
|
||||
}
|
||||
|
||||
static void __init ar724x_clocks_init(void)
|
||||
{
|
||||
struct clk *ref_clk;
|
||||
|
||||
- ref_clk = ath79_add_sys_clkdev("ref", AR724X_BASE_FREQ);
|
||||
+ ref_clk = ath79_set_clk(ATH79_CLK_REF, AR724X_BASE_FREQ);
|
||||
|
||||
ar724x_clk_init(ref_clk, ath79_pll_base);
|
||||
|
||||
- /* just make happy plat_time_init() from arch/mips/ath79/setup.c */
|
||||
- clk_register_clkdev(clks[ATH79_CLK_CPU], "cpu", NULL);
|
||||
- clk_register_clkdev(clks[ATH79_CLK_DDR], "ddr", NULL);
|
||||
- clk_register_clkdev(clks[ATH79_CLK_AHB], "ahb", NULL);
|
||||
-
|
||||
clk_add_alias("wdt", NULL, "ahb", NULL);
|
||||
clk_add_alias("uart", NULL, "ahb", NULL);
|
||||
}
|
||||
@@ -186,12 +195,12 @@ static void __init ar9330_clk_init(struc
|
||||
AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK) + 1;
|
||||
}
|
||||
|
||||
- clks[ATH79_CLK_CPU] = ath79_reg_ffclk("cpu", "ref",
|
||||
- ninit_mul, ref_div * out_div * cpu_div);
|
||||
- clks[ATH79_CLK_DDR] = ath79_reg_ffclk("ddr", "ref",
|
||||
- ninit_mul, ref_div * out_div * ddr_div);
|
||||
- clks[ATH79_CLK_AHB] = ath79_reg_ffclk("ahb", "ref",
|
||||
- ninit_mul, ref_div * out_div * ahb_div);
|
||||
+ ath79_set_ff_clk(ATH79_CLK_CPU, "ref", ninit_mul,
|
||||
+ ref_div * out_div * cpu_div);
|
||||
+ ath79_set_ff_clk(ATH79_CLK_DDR, "ref", ninit_mul,
|
||||
+ ref_div * out_div * ddr_div);
|
||||
+ ath79_set_ff_clk(ATH79_CLK_AHB, "ref", ninit_mul,
|
||||
+ ref_div * out_div * ahb_div);
|
||||
}
|
||||
|
||||
static void __init ar933x_clocks_init(void)
|
||||
@@ -206,15 +215,10 @@ static void __init ar933x_clocks_init(vo
|
||||
else
|
||||
ref_rate = (25 * 1000 * 1000);
|
||||
|
||||
- ref_clk = ath79_add_sys_clkdev("ref", ref_rate);
|
||||
+ ref_clk = ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
|
||||
ar9330_clk_init(ref_clk, ath79_pll_base);
|
||||
|
||||
- /* just make happy plat_time_init() from arch/mips/ath79/setup.c */
|
||||
- clk_register_clkdev(clks[ATH79_CLK_CPU], "cpu", NULL);
|
||||
- clk_register_clkdev(clks[ATH79_CLK_DDR], "ddr", NULL);
|
||||
- clk_register_clkdev(clks[ATH79_CLK_AHB], "ahb", NULL);
|
||||
-
|
||||
clk_add_alias("wdt", NULL, "ahb", NULL);
|
||||
clk_add_alias("uart", NULL, "ref", NULL);
|
||||
}
|
||||
@@ -344,10 +348,10 @@ static void __init ar934x_clocks_init(vo
|
||||
else
|
||||
ahb_rate = cpu_pll / (postdiv + 1);
|
||||
|
||||
- ath79_add_sys_clkdev("ref", ref_rate);
|
||||
- clks[ATH79_CLK_CPU] = ath79_add_sys_clkdev("cpu", cpu_rate);
|
||||
- clks[ATH79_CLK_DDR] = ath79_add_sys_clkdev("ddr", ddr_rate);
|
||||
- clks[ATH79_CLK_AHB] = ath79_add_sys_clkdev("ahb", ahb_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
|
||||
clk_add_alias("wdt", NULL, "ref", NULL);
|
||||
clk_add_alias("uart", NULL, "ref", NULL);
|
||||
@@ -431,10 +435,10 @@ static void __init qca953x_clocks_init(v
|
||||
else
|
||||
ahb_rate = cpu_pll / (postdiv + 1);
|
||||
|
||||
- ath79_add_sys_clkdev("ref", ref_rate);
|
||||
- ath79_add_sys_clkdev("cpu", cpu_rate);
|
||||
- ath79_add_sys_clkdev("ddr", ddr_rate);
|
||||
- ath79_add_sys_clkdev("ahb", ahb_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
|
||||
clk_add_alias("wdt", NULL, "ref", NULL);
|
||||
clk_add_alias("uart", NULL, "ref", NULL);
|
||||
@@ -516,10 +520,10 @@ static void __init qca955x_clocks_init(v
|
||||
else
|
||||
ahb_rate = cpu_pll / (postdiv + 1);
|
||||
|
||||
- ath79_add_sys_clkdev("ref", ref_rate);
|
||||
- clks[ATH79_CLK_CPU] = ath79_add_sys_clkdev("cpu", cpu_rate);
|
||||
- clks[ATH79_CLK_DDR] = ath79_add_sys_clkdev("ddr", ddr_rate);
|
||||
- clks[ATH79_CLK_AHB] = ath79_add_sys_clkdev("ahb", ahb_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
|
||||
clk_add_alias("wdt", NULL, "ref", NULL);
|
||||
clk_add_alias("uart", NULL, "ref", NULL);
|
||||
@@ -620,10 +624,10 @@ static void __init qca956x_clocks_init(v
|
||||
else
|
||||
ahb_rate = cpu_pll / (postdiv + 1);
|
||||
|
||||
- ath79_add_sys_clkdev("ref", ref_rate);
|
||||
- ath79_add_sys_clkdev("cpu", cpu_rate);
|
||||
- ath79_add_sys_clkdev("ddr", ddr_rate);
|
||||
- ath79_add_sys_clkdev("ahb", ahb_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
+ ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
|
||||
clk_add_alias("wdt", NULL, "ref", NULL);
|
||||
clk_add_alias("uart", NULL, "ref", NULL);
|
||||
--- a/include/dt-bindings/clock/ath79-clk.h
|
||||
+++ b/include/dt-bindings/clock/ath79-clk.h
|
||||
@@ -13,7 +13,8 @@
|
||||
#define ATH79_CLK_CPU 0
|
||||
#define ATH79_CLK_DDR 1
|
||||
#define ATH79_CLK_AHB 2
|
||||
+#define ATH79_CLK_REF 3
|
||||
|
||||
-#define ATH79_CLK_END 3
|
||||
+#define ATH79_CLK_END 4
|
||||
|
||||
#endif /* __DT_BINDINGS_ATH79_CLK_H */
|
@ -1,114 +0,0 @@
|
||||
From 339c191a95e978353c9ba3aafab0261e14de109b Mon Sep 17 00:00:00 2001
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Tue, 6 Mar 2018 13:22:43 +0100
|
||||
Subject: [PATCH 22/33] MIPS: ath79: move legacy "wdt" and "uart" clock aliases
|
||||
out of soc init
|
||||
|
||||
Preparation for reusing functions for DT
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/ath79/clock.c | 38 +++++++++++++++++---------------------
|
||||
1 file changed, 17 insertions(+), 21 deletions(-)
|
||||
|
||||
--- a/arch/mips/ath79/clock.c
|
||||
+++ b/arch/mips/ath79/clock.c
|
||||
@@ -110,9 +110,6 @@ static void __init ar71xx_clocks_init(vo
|
||||
ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
-
|
||||
- clk_add_alias("wdt", NULL, "ahb", NULL);
|
||||
- clk_add_alias("uart", NULL, "ahb", NULL);
|
||||
}
|
||||
|
||||
static void __init ar724x_clk_init(struct clk *ref_clk, void __iomem *pll_base)
|
||||
@@ -140,9 +137,6 @@ static void __init ar724x_clocks_init(vo
|
||||
ref_clk = ath79_set_clk(ATH79_CLK_REF, AR724X_BASE_FREQ);
|
||||
|
||||
ar724x_clk_init(ref_clk, ath79_pll_base);
|
||||
-
|
||||
- clk_add_alias("wdt", NULL, "ahb", NULL);
|
||||
- clk_add_alias("uart", NULL, "ahb", NULL);
|
||||
}
|
||||
|
||||
static void __init ar9330_clk_init(struct clk *ref_clk, void __iomem *pll_base)
|
||||
@@ -218,9 +212,6 @@ static void __init ar933x_clocks_init(vo
|
||||
ref_clk = ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
|
||||
ar9330_clk_init(ref_clk, ath79_pll_base);
|
||||
-
|
||||
- clk_add_alias("wdt", NULL, "ahb", NULL);
|
||||
- clk_add_alias("uart", NULL, "ref", NULL);
|
||||
}
|
||||
|
||||
static u32 __init ar934x_get_pll_freq(u32 ref, u32 ref_div, u32 nint, u32 nfrac,
|
||||
@@ -353,9 +344,6 @@ static void __init ar934x_clocks_init(vo
|
||||
ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
|
||||
- clk_add_alias("wdt", NULL, "ref", NULL);
|
||||
- clk_add_alias("uart", NULL, "ref", NULL);
|
||||
-
|
||||
iounmap(dpll_base);
|
||||
}
|
||||
|
||||
@@ -439,9 +427,6 @@ static void __init qca953x_clocks_init(v
|
||||
ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
-
|
||||
- clk_add_alias("wdt", NULL, "ref", NULL);
|
||||
- clk_add_alias("uart", NULL, "ref", NULL);
|
||||
}
|
||||
|
||||
static void __init qca955x_clocks_init(void)
|
||||
@@ -524,9 +509,6 @@ static void __init qca955x_clocks_init(v
|
||||
ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
-
|
||||
- clk_add_alias("wdt", NULL, "ref", NULL);
|
||||
- clk_add_alias("uart", NULL, "ref", NULL);
|
||||
}
|
||||
|
||||
static void __init qca956x_clocks_init(void)
|
||||
@@ -628,13 +610,13 @@ static void __init qca956x_clocks_init(v
|
||||
ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
-
|
||||
- clk_add_alias("wdt", NULL, "ref", NULL);
|
||||
- clk_add_alias("uart", NULL, "ref", NULL);
|
||||
}
|
||||
|
||||
void __init ath79_clocks_init(void)
|
||||
{
|
||||
+ const char *wdt;
|
||||
+ const char *uart;
|
||||
+
|
||||
if (soc_is_ar71xx())
|
||||
ar71xx_clocks_init();
|
||||
else if (soc_is_ar724x() || soc_is_ar913x())
|
||||
@@ -651,6 +633,20 @@ void __init ath79_clocks_init(void)
|
||||
qca956x_clocks_init();
|
||||
else
|
||||
BUG();
|
||||
+
|
||||
+ if (soc_is_ar71xx() || soc_is_ar724x() || soc_is_ar913x()) {
|
||||
+ wdt = "ahb";
|
||||
+ uart = "ahb";
|
||||
+ } else if (soc_is_ar933x()) {
|
||||
+ wdt = "ahb";
|
||||
+ uart = "ref";
|
||||
+ } else {
|
||||
+ wdt = "ref";
|
||||
+ uart = "ref";
|
||||
+ }
|
||||
+
|
||||
+ clk_add_alias("wdt", NULL, wdt, NULL);
|
||||
+ clk_add_alias("uart", NULL, uart, NULL);
|
||||
}
|
||||
|
||||
unsigned long __init
|
@ -1,242 +0,0 @@
|
||||
From 6350b2c36c522fecbc91a80b63f49319dafd2a72 Mon Sep 17 00:00:00 2001
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Tue, 6 Mar 2018 13:23:20 +0100
|
||||
Subject: [PATCH 23/33] MIPS: ath79: pass PLL base to clock init functions
|
||||
|
||||
Preparation for passing the mapped base via DT
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/ath79/clock.c | 60 ++++++++++++++++++++++++-------------------------
|
||||
1 file changed, 30 insertions(+), 30 deletions(-)
|
||||
|
||||
--- a/arch/mips/ath79/clock.c
|
||||
+++ b/arch/mips/ath79/clock.c
|
||||
@@ -80,7 +80,7 @@ static struct clk * __init ath79_set_ff_
|
||||
return clk;
|
||||
}
|
||||
|
||||
-static void __init ar71xx_clocks_init(void)
|
||||
+static void __init ar71xx_clocks_init(void __iomem *pll_base)
|
||||
{
|
||||
unsigned long ref_rate;
|
||||
unsigned long cpu_rate;
|
||||
@@ -92,7 +92,7 @@ static void __init ar71xx_clocks_init(vo
|
||||
|
||||
ref_rate = AR71XX_BASE_FREQ;
|
||||
|
||||
- pll = ath79_pll_rr(AR71XX_PLL_REG_CPU_CONFIG);
|
||||
+ pll = __raw_readl(pll_base + AR71XX_PLL_REG_CPU_CONFIG);
|
||||
|
||||
div = ((pll >> AR71XX_PLL_FB_SHIFT) & AR71XX_PLL_FB_MASK) + 1;
|
||||
freq = div * ref_rate;
|
||||
@@ -130,13 +130,13 @@ static void __init ar724x_clk_init(struc
|
||||
ath79_set_ff_clk(ATH79_CLK_AHB, "ref", mult, div * ahb_div);
|
||||
}
|
||||
|
||||
-static void __init ar724x_clocks_init(void)
|
||||
+static void __init ar724x_clocks_init(void __iomem *pll_base)
|
||||
{
|
||||
struct clk *ref_clk;
|
||||
|
||||
ref_clk = ath79_set_clk(ATH79_CLK_REF, AR724X_BASE_FREQ);
|
||||
|
||||
- ar724x_clk_init(ref_clk, ath79_pll_base);
|
||||
+ ar724x_clk_init(ref_clk, pll_base);
|
||||
}
|
||||
|
||||
static void __init ar9330_clk_init(struct clk *ref_clk, void __iomem *pll_base)
|
||||
@@ -197,7 +197,7 @@ static void __init ar9330_clk_init(struc
|
||||
ref_div * out_div * ahb_div);
|
||||
}
|
||||
|
||||
-static void __init ar933x_clocks_init(void)
|
||||
+static void __init ar933x_clocks_init(void __iomem *pll_base)
|
||||
{
|
||||
struct clk *ref_clk;
|
||||
unsigned long ref_rate;
|
||||
@@ -234,7 +234,7 @@ static u32 __init ar934x_get_pll_freq(u3
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static void __init ar934x_clocks_init(void)
|
||||
+static void __init ar934x_clocks_init(void __iomem *pll_base)
|
||||
{
|
||||
unsigned long ref_rate;
|
||||
unsigned long cpu_rate;
|
||||
@@ -265,7 +265,7 @@ static void __init ar934x_clocks_init(vo
|
||||
AR934X_SRIF_DPLL1_REFDIV_MASK;
|
||||
frac = 1 << 18;
|
||||
} else {
|
||||
- pll = ath79_pll_rr(AR934X_PLL_CPU_CONFIG_REG);
|
||||
+ pll = __raw_readl(pll_base + AR934X_PLL_CPU_CONFIG_REG);
|
||||
out_div = (pll >> AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
|
||||
AR934X_PLL_CPU_CONFIG_OUTDIV_MASK;
|
||||
ref_div = (pll >> AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
|
||||
@@ -292,7 +292,7 @@ static void __init ar934x_clocks_init(vo
|
||||
AR934X_SRIF_DPLL1_REFDIV_MASK;
|
||||
frac = 1 << 18;
|
||||
} else {
|
||||
- pll = ath79_pll_rr(AR934X_PLL_DDR_CONFIG_REG);
|
||||
+ pll = __raw_readl(pll_base + AR934X_PLL_DDR_CONFIG_REG);
|
||||
out_div = (pll >> AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
|
||||
AR934X_PLL_DDR_CONFIG_OUTDIV_MASK;
|
||||
ref_div = (pll >> AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
|
||||
@@ -307,7 +307,7 @@ static void __init ar934x_clocks_init(vo
|
||||
ddr_pll = ar934x_get_pll_freq(ref_rate, ref_div, nint,
|
||||
nfrac, frac, out_div);
|
||||
|
||||
- clk_ctrl = ath79_pll_rr(AR934X_PLL_CPU_DDR_CLK_CTRL_REG);
|
||||
+ clk_ctrl = __raw_readl(pll_base + AR934X_PLL_CPU_DDR_CLK_CTRL_REG);
|
||||
|
||||
postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_SHIFT) &
|
||||
AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_MASK;
|
||||
@@ -347,7 +347,7 @@ static void __init ar934x_clocks_init(vo
|
||||
iounmap(dpll_base);
|
||||
}
|
||||
|
||||
-static void __init qca953x_clocks_init(void)
|
||||
+static void __init qca953x_clocks_init(void __iomem *pll_base)
|
||||
{
|
||||
unsigned long ref_rate;
|
||||
unsigned long cpu_rate;
|
||||
@@ -363,7 +363,7 @@ static void __init qca953x_clocks_init(v
|
||||
else
|
||||
ref_rate = 25 * 1000 * 1000;
|
||||
|
||||
- pll = ath79_pll_rr(QCA953X_PLL_CPU_CONFIG_REG);
|
||||
+ pll = __raw_readl(pll_base + QCA953X_PLL_CPU_CONFIG_REG);
|
||||
out_div = (pll >> QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
|
||||
QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK;
|
||||
ref_div = (pll >> QCA953X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
|
||||
@@ -377,7 +377,7 @@ static void __init qca953x_clocks_init(v
|
||||
cpu_pll += frac * (ref_rate >> 6) / ref_div;
|
||||
cpu_pll /= (1 << out_div);
|
||||
|
||||
- pll = ath79_pll_rr(QCA953X_PLL_DDR_CONFIG_REG);
|
||||
+ pll = __raw_readl(pll_base + QCA953X_PLL_DDR_CONFIG_REG);
|
||||
out_div = (pll >> QCA953X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
|
||||
QCA953X_PLL_DDR_CONFIG_OUTDIV_MASK;
|
||||
ref_div = (pll >> QCA953X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
|
||||
@@ -391,7 +391,7 @@ static void __init qca953x_clocks_init(v
|
||||
ddr_pll += frac * (ref_rate >> 6) / (ref_div << 4);
|
||||
ddr_pll /= (1 << out_div);
|
||||
|
||||
- clk_ctrl = ath79_pll_rr(QCA953X_PLL_CLK_CTRL_REG);
|
||||
+ clk_ctrl = __raw_readl(pll_base + QCA953X_PLL_CLK_CTRL_REG);
|
||||
|
||||
postdiv = (clk_ctrl >> QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) &
|
||||
QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_MASK;
|
||||
@@ -429,7 +429,7 @@ static void __init qca953x_clocks_init(v
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
}
|
||||
|
||||
-static void __init qca955x_clocks_init(void)
|
||||
+static void __init qca955x_clocks_init(void __iomem *pll_base)
|
||||
{
|
||||
unsigned long ref_rate;
|
||||
unsigned long cpu_rate;
|
||||
@@ -445,7 +445,7 @@ static void __init qca955x_clocks_init(v
|
||||
else
|
||||
ref_rate = 25 * 1000 * 1000;
|
||||
|
||||
- pll = ath79_pll_rr(QCA955X_PLL_CPU_CONFIG_REG);
|
||||
+ pll = __raw_readl(pll_base + QCA955X_PLL_CPU_CONFIG_REG);
|
||||
out_div = (pll >> QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
|
||||
QCA955X_PLL_CPU_CONFIG_OUTDIV_MASK;
|
||||
ref_div = (pll >> QCA955X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
|
||||
@@ -459,7 +459,7 @@ static void __init qca955x_clocks_init(v
|
||||
cpu_pll += frac * ref_rate / (ref_div * (1 << 6));
|
||||
cpu_pll /= (1 << out_div);
|
||||
|
||||
- pll = ath79_pll_rr(QCA955X_PLL_DDR_CONFIG_REG);
|
||||
+ pll = __raw_readl(pll_base + QCA955X_PLL_DDR_CONFIG_REG);
|
||||
out_div = (pll >> QCA955X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
|
||||
QCA955X_PLL_DDR_CONFIG_OUTDIV_MASK;
|
||||
ref_div = (pll >> QCA955X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
|
||||
@@ -473,7 +473,7 @@ static void __init qca955x_clocks_init(v
|
||||
ddr_pll += frac * ref_rate / (ref_div * (1 << 10));
|
||||
ddr_pll /= (1 << out_div);
|
||||
|
||||
- clk_ctrl = ath79_pll_rr(QCA955X_PLL_CLK_CTRL_REG);
|
||||
+ clk_ctrl = __raw_readl(pll_base + QCA955X_PLL_CLK_CTRL_REG);
|
||||
|
||||
postdiv = (clk_ctrl >> QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) &
|
||||
QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_MASK;
|
||||
@@ -511,7 +511,7 @@ static void __init qca955x_clocks_init(v
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
}
|
||||
|
||||
-static void __init qca956x_clocks_init(void)
|
||||
+static void __init qca956x_clocks_init(void __iomem *pll_base)
|
||||
{
|
||||
unsigned long ref_rate;
|
||||
unsigned long cpu_rate;
|
||||
@@ -537,13 +537,13 @@ static void __init qca956x_clocks_init(v
|
||||
else
|
||||
ref_rate = 25 * 1000 * 1000;
|
||||
|
||||
- pll = ath79_pll_rr(QCA956X_PLL_CPU_CONFIG_REG);
|
||||
+ pll = __raw_readl(pll_base + QCA956X_PLL_CPU_CONFIG_REG);
|
||||
out_div = (pll >> QCA956X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
|
||||
QCA956X_PLL_CPU_CONFIG_OUTDIV_MASK;
|
||||
ref_div = (pll >> QCA956X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
|
||||
QCA956X_PLL_CPU_CONFIG_REFDIV_MASK;
|
||||
|
||||
- pll = ath79_pll_rr(QCA956X_PLL_CPU_CONFIG1_REG);
|
||||
+ pll = __raw_readl(pll_base + QCA956X_PLL_CPU_CONFIG1_REG);
|
||||
nint = (pll >> QCA956X_PLL_CPU_CONFIG1_NINT_SHIFT) &
|
||||
QCA956X_PLL_CPU_CONFIG1_NINT_MASK;
|
||||
hfrac = (pll >> QCA956X_PLL_CPU_CONFIG1_NFRAC_H_SHIFT) &
|
||||
@@ -556,12 +556,12 @@ static void __init qca956x_clocks_init(v
|
||||
cpu_pll += (hfrac >> 13) * ref_rate / ref_div;
|
||||
cpu_pll /= (1 << out_div);
|
||||
|
||||
- pll = ath79_pll_rr(QCA956X_PLL_DDR_CONFIG_REG);
|
||||
+ pll = __raw_readl(pll_base + QCA956X_PLL_DDR_CONFIG_REG);
|
||||
out_div = (pll >> QCA956X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
|
||||
QCA956X_PLL_DDR_CONFIG_OUTDIV_MASK;
|
||||
ref_div = (pll >> QCA956X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
|
||||
QCA956X_PLL_DDR_CONFIG_REFDIV_MASK;
|
||||
- pll = ath79_pll_rr(QCA956X_PLL_DDR_CONFIG1_REG);
|
||||
+ pll = __raw_readl(pll_base + QCA956X_PLL_DDR_CONFIG1_REG);
|
||||
nint = (pll >> QCA956X_PLL_DDR_CONFIG1_NINT_SHIFT) &
|
||||
QCA956X_PLL_DDR_CONFIG1_NINT_MASK;
|
||||
hfrac = (pll >> QCA956X_PLL_DDR_CONFIG1_NFRAC_H_SHIFT) &
|
||||
@@ -574,7 +574,7 @@ static void __init qca956x_clocks_init(v
|
||||
ddr_pll += (hfrac >> 13) * ref_rate / ref_div;
|
||||
ddr_pll /= (1 << out_div);
|
||||
|
||||
- clk_ctrl = ath79_pll_rr(QCA956X_PLL_CLK_CTRL_REG);
|
||||
+ clk_ctrl = __raw_readl(pll_base + QCA956X_PLL_CLK_CTRL_REG);
|
||||
|
||||
postdiv = (clk_ctrl >> QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) &
|
||||
QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_MASK;
|
||||
@@ -618,19 +618,19 @@ void __init ath79_clocks_init(void)
|
||||
const char *uart;
|
||||
|
||||
if (soc_is_ar71xx())
|
||||
- ar71xx_clocks_init();
|
||||
+ ar71xx_clocks_init(ath79_pll_base);
|
||||
else if (soc_is_ar724x() || soc_is_ar913x())
|
||||
- ar724x_clocks_init();
|
||||
+ ar724x_clocks_init(ath79_pll_base);
|
||||
else if (soc_is_ar933x())
|
||||
- ar933x_clocks_init();
|
||||
+ ar933x_clocks_init(ath79_pll_base);
|
||||
else if (soc_is_ar934x())
|
||||
- ar934x_clocks_init();
|
||||
+ ar934x_clocks_init(ath79_pll_base);
|
||||
else if (soc_is_qca953x())
|
||||
- qca953x_clocks_init();
|
||||
+ qca953x_clocks_init(ath79_pll_base);
|
||||
else if (soc_is_qca955x())
|
||||
- qca955x_clocks_init();
|
||||
+ qca955x_clocks_init(ath79_pll_base);
|
||||
else if (soc_is_qca956x() || soc_is_tp9343())
|
||||
- qca956x_clocks_init();
|
||||
+ qca956x_clocks_init(ath79_pll_base);
|
||||
else
|
||||
BUG();
|
||||
|
@ -1,229 +0,0 @@
|
||||
From 5fadb2544ed0bb72ddddd846aa303bb9ed2d211c Mon Sep 17 00:00:00 2001
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Tue, 6 Mar 2018 13:24:07 +0100
|
||||
Subject: [PATCH 24/33] MIPS: ath79: make specifying the reference clock in DT
|
||||
optional
|
||||
|
||||
It can be autodetected for many SoCs using the strapping options.
|
||||
If the clock is specified in DT, the autodetected value is ignored
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/ath79/clock.c | 84 +++++++++++++++++++++++--------------------------
|
||||
1 file changed, 40 insertions(+), 44 deletions(-)
|
||||
|
||||
--- a/arch/mips/ath79/clock.c
|
||||
+++ b/arch/mips/ath79/clock.c
|
||||
@@ -80,6 +80,18 @@ static struct clk * __init ath79_set_ff_
|
||||
return clk;
|
||||
}
|
||||
|
||||
+static unsigned long __init ath79_setup_ref_clk(unsigned long rate)
|
||||
+{
|
||||
+ struct clk *clk = clks[ATH79_CLK_REF];
|
||||
+
|
||||
+ if (clk)
|
||||
+ rate = clk_get_rate(clk);
|
||||
+ else
|
||||
+ clk = ath79_set_clk(ATH79_CLK_REF, rate);
|
||||
+
|
||||
+ return rate;
|
||||
+}
|
||||
+
|
||||
static void __init ar71xx_clocks_init(void __iomem *pll_base)
|
||||
{
|
||||
unsigned long ref_rate;
|
||||
@@ -90,7 +102,7 @@ static void __init ar71xx_clocks_init(vo
|
||||
u32 freq;
|
||||
u32 div;
|
||||
|
||||
- ref_rate = AR71XX_BASE_FREQ;
|
||||
+ ref_rate = ath79_setup_ref_clk(AR71XX_BASE_FREQ);
|
||||
|
||||
pll = __raw_readl(pll_base + AR71XX_PLL_REG_CPU_CONFIG);
|
||||
|
||||
@@ -106,16 +118,17 @@ static void __init ar71xx_clocks_init(vo
|
||||
div = (((pll >> AR71XX_AHB_DIV_SHIFT) & AR71XX_AHB_DIV_MASK) + 1) * 2;
|
||||
ahb_rate = cpu_rate / div;
|
||||
|
||||
- ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
}
|
||||
|
||||
-static void __init ar724x_clk_init(struct clk *ref_clk, void __iomem *pll_base)
|
||||
+static void __init ar724x_clocks_init(void __iomem *pll_base)
|
||||
{
|
||||
- u32 pll;
|
||||
u32 mult, div, ddr_div, ahb_div;
|
||||
+ u32 pll;
|
||||
+
|
||||
+ ath79_setup_ref_clk(AR71XX_BASE_FREQ);
|
||||
|
||||
pll = __raw_readl(pll_base + AR724X_PLL_REG_CPU_CONFIG);
|
||||
|
||||
@@ -130,17 +143,9 @@ static void __init ar724x_clk_init(struc
|
||||
ath79_set_ff_clk(ATH79_CLK_AHB, "ref", mult, div * ahb_div);
|
||||
}
|
||||
|
||||
-static void __init ar724x_clocks_init(void __iomem *pll_base)
|
||||
-{
|
||||
- struct clk *ref_clk;
|
||||
-
|
||||
- ref_clk = ath79_set_clk(ATH79_CLK_REF, AR724X_BASE_FREQ);
|
||||
-
|
||||
- ar724x_clk_init(ref_clk, pll_base);
|
||||
-}
|
||||
-
|
||||
-static void __init ar9330_clk_init(struct clk *ref_clk, void __iomem *pll_base)
|
||||
+static void __init ar933x_clocks_init(void __iomem *pll_base)
|
||||
{
|
||||
+ unsigned long ref_rate;
|
||||
u32 clock_ctrl;
|
||||
u32 ref_div;
|
||||
u32 ninit_mul;
|
||||
@@ -149,6 +154,15 @@ static void __init ar9330_clk_init(struc
|
||||
u32 cpu_div;
|
||||
u32 ddr_div;
|
||||
u32 ahb_div;
|
||||
+ u32 t;
|
||||
+
|
||||
+ t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
|
||||
+ if (t & AR933X_BOOTSTRAP_REF_CLK_40)
|
||||
+ ref_rate = (40 * 1000 * 1000);
|
||||
+ else
|
||||
+ ref_rate = (25 * 1000 * 1000);
|
||||
+
|
||||
+ ath79_setup_ref_clk(ref_rate);
|
||||
|
||||
clock_ctrl = __raw_readl(pll_base + AR933X_PLL_CLOCK_CTRL_REG);
|
||||
if (clock_ctrl & AR933X_PLL_CLOCK_CTRL_BYPASS) {
|
||||
@@ -197,23 +211,6 @@ static void __init ar9330_clk_init(struc
|
||||
ref_div * out_div * ahb_div);
|
||||
}
|
||||
|
||||
-static void __init ar933x_clocks_init(void __iomem *pll_base)
|
||||
-{
|
||||
- struct clk *ref_clk;
|
||||
- unsigned long ref_rate;
|
||||
- u32 t;
|
||||
-
|
||||
- t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
|
||||
- if (t & AR933X_BOOTSTRAP_REF_CLK_40)
|
||||
- ref_rate = (40 * 1000 * 1000);
|
||||
- else
|
||||
- ref_rate = (25 * 1000 * 1000);
|
||||
-
|
||||
- ref_clk = ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
-
|
||||
- ar9330_clk_init(ref_clk, ath79_pll_base);
|
||||
-}
|
||||
-
|
||||
static u32 __init ar934x_get_pll_freq(u32 ref, u32 ref_div, u32 nint, u32 nfrac,
|
||||
u32 frac, u32 out_div)
|
||||
{
|
||||
@@ -253,6 +250,8 @@ static void __init ar934x_clocks_init(vo
|
||||
else
|
||||
ref_rate = 25 * 1000 * 1000;
|
||||
|
||||
+ ref_rate = ath79_setup_ref_clk(ref_rate);
|
||||
+
|
||||
pll = __raw_readl(dpll_base + AR934X_SRIF_CPU_DPLL2_REG);
|
||||
if (pll & AR934X_SRIF_DPLL2_LOCAL_PLL) {
|
||||
out_div = (pll >> AR934X_SRIF_DPLL2_OUTDIV_SHIFT) &
|
||||
@@ -339,7 +338,6 @@ static void __init ar934x_clocks_init(vo
|
||||
else
|
||||
ahb_rate = cpu_pll / (postdiv + 1);
|
||||
|
||||
- ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
@@ -363,6 +361,8 @@ static void __init qca953x_clocks_init(v
|
||||
else
|
||||
ref_rate = 25 * 1000 * 1000;
|
||||
|
||||
+ ref_rate = ath79_setup_ref_clk(ref_rate);
|
||||
+
|
||||
pll = __raw_readl(pll_base + QCA953X_PLL_CPU_CONFIG_REG);
|
||||
out_div = (pll >> QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
|
||||
QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK;
|
||||
@@ -423,7 +423,6 @@ static void __init qca953x_clocks_init(v
|
||||
else
|
||||
ahb_rate = cpu_pll / (postdiv + 1);
|
||||
|
||||
- ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
@@ -445,6 +444,8 @@ static void __init qca955x_clocks_init(v
|
||||
else
|
||||
ref_rate = 25 * 1000 * 1000;
|
||||
|
||||
+ ref_rate = ath79_setup_ref_clk(ref_rate);
|
||||
+
|
||||
pll = __raw_readl(pll_base + QCA955X_PLL_CPU_CONFIG_REG);
|
||||
out_div = (pll >> QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
|
||||
QCA955X_PLL_CPU_CONFIG_OUTDIV_MASK;
|
||||
@@ -505,7 +506,6 @@ static void __init qca955x_clocks_init(v
|
||||
else
|
||||
ahb_rate = cpu_pll / (postdiv + 1);
|
||||
|
||||
- ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
@@ -537,6 +537,8 @@ static void __init qca956x_clocks_init(v
|
||||
else
|
||||
ref_rate = 25 * 1000 * 1000;
|
||||
|
||||
+ ref_rate = ath79_setup_ref_clk(ref_rate);
|
||||
+
|
||||
pll = __raw_readl(pll_base + QCA956X_PLL_CPU_CONFIG_REG);
|
||||
out_div = (pll >> QCA956X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
|
||||
QCA956X_PLL_CPU_CONFIG_OUTDIV_MASK;
|
||||
@@ -606,7 +608,6 @@ static void __init qca956x_clocks_init(v
|
||||
else
|
||||
ahb_rate = cpu_pll / (postdiv + 1);
|
||||
|
||||
- ath79_set_clk(ATH79_CLK_REF, ref_rate);
|
||||
ath79_set_clk(ATH79_CLK_CPU, cpu_rate);
|
||||
ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
@@ -682,10 +683,8 @@ static void __init ath79_clocks_init_dt_
|
||||
void __iomem *pll_base;
|
||||
|
||||
ref_clk = of_clk_get(np, 0);
|
||||
- if (IS_ERR(ref_clk)) {
|
||||
- pr_err("%pOF: of_clk_get failed\n", np);
|
||||
- goto err;
|
||||
- }
|
||||
+ if (!IS_ERR(ref_clk))
|
||||
+ clks[ATH79_CLK_REF] = ref_clk;
|
||||
|
||||
pll_base = of_iomap(np, 0);
|
||||
if (!pll_base) {
|
||||
@@ -694,9 +693,9 @@ static void __init ath79_clocks_init_dt_
|
||||
}
|
||||
|
||||
if (of_device_is_compatible(np, "qca,ar9130-pll"))
|
||||
- ar724x_clk_init(ref_clk, pll_base);
|
||||
+ ar724x_clocks_init(pll_base);
|
||||
else if (of_device_is_compatible(np, "qca,ar9330-pll"))
|
||||
- ar9330_clk_init(ref_clk, pll_base);
|
||||
+ ar933x_clocks_init(pll_base);
|
||||
else {
|
||||
pr_err("%pOF: could not find any appropriate clk_init()\n", np);
|
||||
goto err_iounmap;
|
||||
@@ -714,9 +713,6 @@ err_iounmap:
|
||||
|
||||
err_clk:
|
||||
clk_put(ref_clk);
|
||||
-
|
||||
-err:
|
||||
- return;
|
||||
}
|
||||
CLK_OF_DECLARE(ar9130_clk, "qca,ar9130-pll", ath79_clocks_init_dt_ng);
|
||||
CLK_OF_DECLARE(ar9330_clk, "qca,ar9330-pll", ath79_clocks_init_dt_ng);
|
@ -1,77 +0,0 @@
|
||||
From 6325626de001df98aebe51f3008b1aca05798d19 Mon Sep 17 00:00:00 2001
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Tue, 6 Mar 2018 13:26:27 +0100
|
||||
Subject: [PATCH 25/33] MIPS: ath79: support setting up clock via DT on all SoC
|
||||
types
|
||||
|
||||
Use the same functions as the legacy code
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/ath79/clock.c | 39 ++++++++++++++++++++++-----------------
|
||||
1 file changed, 22 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/arch/mips/ath79/clock.c
|
||||
+++ b/arch/mips/ath79/clock.c
|
||||
@@ -669,16 +669,6 @@ ath79_get_sys_clk_rate(const char *id)
|
||||
#ifdef CONFIG_OF
|
||||
static void __init ath79_clocks_init_dt(struct device_node *np)
|
||||
{
|
||||
- of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
|
||||
-}
|
||||
-
|
||||
-CLK_OF_DECLARE(ar7100, "qca,ar7100-pll", ath79_clocks_init_dt);
|
||||
-CLK_OF_DECLARE(ar7240, "qca,ar7240-pll", ath79_clocks_init_dt);
|
||||
-CLK_OF_DECLARE(ar9340, "qca,ar9340-pll", ath79_clocks_init_dt);
|
||||
-CLK_OF_DECLARE(ar9550, "qca,qca9550-pll", ath79_clocks_init_dt);
|
||||
-
|
||||
-static void __init ath79_clocks_init_dt_ng(struct device_node *np)
|
||||
-{
|
||||
struct clk *ref_clk;
|
||||
void __iomem *pll_base;
|
||||
|
||||
@@ -692,14 +682,21 @@ static void __init ath79_clocks_init_dt_
|
||||
goto err_clk;
|
||||
}
|
||||
|
||||
- if (of_device_is_compatible(np, "qca,ar9130-pll"))
|
||||
+ if (of_device_is_compatible(np, "qca,ar7100-pll"))
|
||||
+ ar71xx_clocks_init(pll_base);
|
||||
+ else if (of_device_is_compatible(np, "qca,ar7240-pll") ||
|
||||
+ of_device_is_compatible(np, "qca,ar9130-pll"))
|
||||
ar724x_clocks_init(pll_base);
|
||||
else if (of_device_is_compatible(np, "qca,ar9330-pll"))
|
||||
ar933x_clocks_init(pll_base);
|
||||
- else {
|
||||
- pr_err("%pOF: could not find any appropriate clk_init()\n", np);
|
||||
- goto err_iounmap;
|
||||
- }
|
||||
+ else if (of_device_is_compatible(np, "qca,ar9340-pll"))
|
||||
+ ar934x_clocks_init(pll_base);
|
||||
+ else if (of_device_is_compatible(np, "qca,qca9530-pll"))
|
||||
+ qca953x_clocks_init(pll_base);
|
||||
+ else if (of_device_is_compatible(np, "qca,qca9550-pll"))
|
||||
+ qca955x_clocks_init(pll_base);
|
||||
+ else if (of_device_is_compatible(np, "qca,qca9560-pll"))
|
||||
+ qca956x_clocks_init(pll_base);
|
||||
|
||||
if (of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data)) {
|
||||
pr_err("%pOF: could not register clk provider\n", np);
|
||||
@@ -714,6 +711,14 @@ err_iounmap:
|
||||
err_clk:
|
||||
clk_put(ref_clk);
|
||||
}
|
||||
-CLK_OF_DECLARE(ar9130_clk, "qca,ar9130-pll", ath79_clocks_init_dt_ng);
|
||||
-CLK_OF_DECLARE(ar9330_clk, "qca,ar9330-pll", ath79_clocks_init_dt_ng);
|
||||
+
|
||||
+CLK_OF_DECLARE(ar7100_clk, "qca,ar7100-pll", ath79_clocks_init_dt);
|
||||
+CLK_OF_DECLARE(ar7240_clk, "qca,ar7240-pll", ath79_clocks_init_dt);
|
||||
+CLK_OF_DECLARE(ar9130_clk, "qca,ar9130-pll", ath79_clocks_init_dt);
|
||||
+CLK_OF_DECLARE(ar9330_clk, "qca,ar9330-pll", ath79_clocks_init_dt);
|
||||
+CLK_OF_DECLARE(ar9340_clk, "qca,ar9340-pll", ath79_clocks_init_dt);
|
||||
+CLK_OF_DECLARE(ar9530_clk, "qca,qca9530-pll", ath79_clocks_init_dt);
|
||||
+CLK_OF_DECLARE(ar9550_clk, "qca,qca9550-pll", ath79_clocks_init_dt);
|
||||
+CLK_OF_DECLARE(ar9560_clk, "qca,qca9560-pll", ath79_clocks_init_dt);
|
||||
+
|
||||
#endif
|
@ -1,59 +0,0 @@
|
||||
From 78538d673801902108797f2c813e70cfbce280c9 Mon Sep 17 00:00:00 2001
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Tue, 6 Mar 2018 13:27:28 +0100
|
||||
Subject: [PATCH 26/33] MIPS: ath79: export switch MDIO reference clock
|
||||
|
||||
On AR934x, the MDIO reference clock can be configured to a fixed 100 MHz
|
||||
clock. If that feature is not used, it defaults to the main reference
|
||||
clock, like on all other SoC.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/ath79/clock.c | 8 ++++++++
|
||||
include/dt-bindings/clock/ath79-clk.h | 3 ++-
|
||||
2 files changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/mips/ath79/clock.c
|
||||
+++ b/arch/mips/ath79/clock.c
|
||||
@@ -42,6 +42,7 @@ static const char * const clk_names[ATH7
|
||||
[ATH79_CLK_DDR] = "ddr",
|
||||
[ATH79_CLK_AHB] = "ahb",
|
||||
[ATH79_CLK_REF] = "ref",
|
||||
+ [ATH79_CLK_MDIO] = "mdio",
|
||||
};
|
||||
|
||||
static const char * __init ath79_clk_name(int type)
|
||||
@@ -342,6 +343,10 @@ static void __init ar934x_clocks_init(vo
|
||||
ath79_set_clk(ATH79_CLK_DDR, ddr_rate);
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
|
||||
+ clk_ctrl = __raw_readl(pll_base + AR934X_PLL_SWITCH_CLOCK_CONTROL_REG);
|
||||
+ if (clk_ctrl & AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL)
|
||||
+ ath79_set_clk(ATH79_CLK_MDIO, 100 * 1000 * 1000);
|
||||
+
|
||||
iounmap(dpll_base);
|
||||
}
|
||||
|
||||
@@ -698,6 +703,9 @@ static void __init ath79_clocks_init_dt(
|
||||
else if (of_device_is_compatible(np, "qca,qca9560-pll"))
|
||||
qca956x_clocks_init(pll_base);
|
||||
|
||||
+ if (!clks[ATH79_CLK_MDIO])
|
||||
+ clks[ATH79_CLK_MDIO] = clks[ATH79_CLK_REF];
|
||||
+
|
||||
if (of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data)) {
|
||||
pr_err("%pOF: could not register clk provider\n", np);
|
||||
goto err_iounmap;
|
||||
--- a/include/dt-bindings/clock/ath79-clk.h
|
||||
+++ b/include/dt-bindings/clock/ath79-clk.h
|
||||
@@ -14,7 +14,8 @@
|
||||
#define ATH79_CLK_DDR 1
|
||||
#define ATH79_CLK_AHB 2
|
||||
#define ATH79_CLK_REF 3
|
||||
+#define ATH79_CLK_MDIO 4
|
||||
|
||||
-#define ATH79_CLK_END 4
|
||||
+#define ATH79_CLK_END 5
|
||||
|
||||
#endif /* __DT_BINDINGS_ATH79_CLK_H */
|
@ -1,233 +0,0 @@
|
||||
From 3765b1f79593a0a9098ed15e48074c95403a53ee Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Jun 2018 15:05:08 +0200
|
||||
Subject: [PATCH 27/33] MIPS: ath79: drop legacy IRQ code
|
||||
|
||||
With the target now being fully OF based, we can drop the legacy IRQ code.
|
||||
All IRQs are now handled via the new irqchip drivers.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/ath79/Makefile | 2 +-
|
||||
arch/mips/ath79/irq.c | 169 -------------------------------
|
||||
arch/mips/ath79/setup.c | 6 ++
|
||||
arch/mips/include/asm/mach-ath79/ath79.h | 4 -
|
||||
4 files changed, 7 insertions(+), 174 deletions(-)
|
||||
delete mode 100644 arch/mips/ath79/irq.c
|
||||
|
||||
--- a/arch/mips/ath79/Makefile
|
||||
+++ b/arch/mips/ath79/Makefile
|
||||
@@ -8,7 +8,7 @@
|
||||
# under the terms of the GNU General Public License version 2 as published
|
||||
# by the Free Software Foundation.
|
||||
|
||||
-obj-y := prom.o setup.o irq.o common.o clock.o
|
||||
+obj-y := prom.o setup.o common.o clock.o
|
||||
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
obj-$(CONFIG_PCI) += pci.o
|
||||
--- a/arch/mips/ath79/irq.c
|
||||
+++ /dev/null
|
||||
@@ -1,169 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71xx/AR724x/AR913x specific interrupt handling
|
||||
- *
|
||||
- * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
|
||||
- * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
|
||||
- * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
|
||||
- *
|
||||
- * Parts of this file are based on Atheros' 2.6.15/2.6.31 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/kernel.h>
|
||||
-#include <linux/init.h>
|
||||
-#include <linux/interrupt.h>
|
||||
-#include <linux/irqchip.h>
|
||||
-#include <linux/of_irq.h>
|
||||
-
|
||||
-#include <asm/irq_cpu.h>
|
||||
-#include <asm/mipsregs.h>
|
||||
-
|
||||
-#include <asm/mach-ath79/ath79.h>
|
||||
-#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
-#include "common.h"
|
||||
-#include "machtypes.h"
|
||||
-
|
||||
-
|
||||
-static void ar934x_ip2_irq_dispatch(struct irq_desc *desc)
|
||||
-{
|
||||
- u32 status;
|
||||
-
|
||||
- status = ath79_reset_rr(AR934X_RESET_REG_PCIE_WMAC_INT_STATUS);
|
||||
-
|
||||
- if (status & AR934X_PCIE_WMAC_INT_PCIE_ALL) {
|
||||
- ath79_ddr_wb_flush(3);
|
||||
- generic_handle_irq(ATH79_IP2_IRQ(0));
|
||||
- } else if (status & AR934X_PCIE_WMAC_INT_WMAC_ALL) {
|
||||
- ath79_ddr_wb_flush(4);
|
||||
- generic_handle_irq(ATH79_IP2_IRQ(1));
|
||||
- } else {
|
||||
- spurious_interrupt();
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-static void ar934x_ip2_irq_init(void)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- for (i = ATH79_IP2_IRQ_BASE;
|
||||
- i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++)
|
||||
- irq_set_chip_and_handler(i, &dummy_irq_chip,
|
||||
- handle_level_irq);
|
||||
-
|
||||
- irq_set_chained_handler(ATH79_CPU_IRQ(2), ar934x_ip2_irq_dispatch);
|
||||
-}
|
||||
-
|
||||
-static void qca955x_ip2_irq_dispatch(struct irq_desc *desc)
|
||||
-{
|
||||
- u32 status;
|
||||
-
|
||||
- status = ath79_reset_rr(QCA955X_RESET_REG_EXT_INT_STATUS);
|
||||
- status &= QCA955X_EXT_INT_PCIE_RC1_ALL | QCA955X_EXT_INT_WMAC_ALL;
|
||||
-
|
||||
- if (status == 0) {
|
||||
- spurious_interrupt();
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- if (status & QCA955X_EXT_INT_PCIE_RC1_ALL) {
|
||||
- /* TODO: flush DDR? */
|
||||
- generic_handle_irq(ATH79_IP2_IRQ(0));
|
||||
- }
|
||||
-
|
||||
- if (status & QCA955X_EXT_INT_WMAC_ALL) {
|
||||
- /* TODO: flush DDR? */
|
||||
- generic_handle_irq(ATH79_IP2_IRQ(1));
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-static void qca955x_ip3_irq_dispatch(struct irq_desc *desc)
|
||||
-{
|
||||
- u32 status;
|
||||
-
|
||||
- status = ath79_reset_rr(QCA955X_RESET_REG_EXT_INT_STATUS);
|
||||
- status &= QCA955X_EXT_INT_PCIE_RC2_ALL |
|
||||
- QCA955X_EXT_INT_USB1 |
|
||||
- QCA955X_EXT_INT_USB2;
|
||||
-
|
||||
- if (status == 0) {
|
||||
- spurious_interrupt();
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- if (status & QCA955X_EXT_INT_USB1) {
|
||||
- /* TODO: flush DDR? */
|
||||
- generic_handle_irq(ATH79_IP3_IRQ(0));
|
||||
- }
|
||||
-
|
||||
- if (status & QCA955X_EXT_INT_USB2) {
|
||||
- /* TODO: flush DDR? */
|
||||
- generic_handle_irq(ATH79_IP3_IRQ(1));
|
||||
- }
|
||||
-
|
||||
- if (status & QCA955X_EXT_INT_PCIE_RC2_ALL) {
|
||||
- /* TODO: flush DDR? */
|
||||
- generic_handle_irq(ATH79_IP3_IRQ(2));
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-static void qca955x_irq_init(void)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- for (i = ATH79_IP2_IRQ_BASE;
|
||||
- i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++)
|
||||
- irq_set_chip_and_handler(i, &dummy_irq_chip,
|
||||
- handle_level_irq);
|
||||
-
|
||||
- irq_set_chained_handler(ATH79_CPU_IRQ(2), qca955x_ip2_irq_dispatch);
|
||||
-
|
||||
- for (i = ATH79_IP3_IRQ_BASE;
|
||||
- i < ATH79_IP3_IRQ_BASE + ATH79_IP3_IRQ_COUNT; i++)
|
||||
- irq_set_chip_and_handler(i, &dummy_irq_chip,
|
||||
- handle_level_irq);
|
||||
-
|
||||
- irq_set_chained_handler(ATH79_CPU_IRQ(3), qca955x_ip3_irq_dispatch);
|
||||
-}
|
||||
-
|
||||
-void __init arch_init_irq(void)
|
||||
-{
|
||||
- unsigned irq_wb_chan2 = -1;
|
||||
- unsigned irq_wb_chan3 = -1;
|
||||
- bool misc_is_ar71xx;
|
||||
-
|
||||
- if (mips_machtype == ATH79_MACH_GENERIC_OF) {
|
||||
- irqchip_init();
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- if (soc_is_ar71xx() || soc_is_ar724x() ||
|
||||
- soc_is_ar913x() || soc_is_ar933x()) {
|
||||
- irq_wb_chan2 = 3;
|
||||
- irq_wb_chan3 = 2;
|
||||
- } else if (soc_is_ar934x()) {
|
||||
- irq_wb_chan3 = 2;
|
||||
- }
|
||||
-
|
||||
- ath79_cpu_irq_init(irq_wb_chan2, irq_wb_chan3);
|
||||
-
|
||||
- if (soc_is_ar71xx() || soc_is_ar913x())
|
||||
- misc_is_ar71xx = true;
|
||||
- else if (soc_is_ar724x() ||
|
||||
- soc_is_ar933x() ||
|
||||
- soc_is_ar934x() ||
|
||||
- soc_is_qca955x())
|
||||
- misc_is_ar71xx = false;
|
||||
- else
|
||||
- BUG();
|
||||
- ath79_misc_irq_init(
|
||||
- ath79_reset_base + AR71XX_RESET_REG_MISC_INT_STATUS,
|
||||
- ATH79_CPU_IRQ(6), ATH79_MISC_IRQ_BASE, misc_is_ar71xx);
|
||||
-
|
||||
- if (soc_is_ar934x())
|
||||
- ar934x_ip2_irq_init();
|
||||
- else if (soc_is_qca955x())
|
||||
- qca955x_irq_init();
|
||||
-}
|
||||
--- a/arch/mips/ath79/setup.c
|
||||
+++ b/arch/mips/ath79/setup.c
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of_fdt.h>
|
||||
+#include <linux/irqchip.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/idle.h>
|
||||
@@ -305,6 +306,11 @@ void __init plat_time_init(void)
|
||||
mips_hpt_frequency = cpu_clk_rate / 2;
|
||||
}
|
||||
|
||||
+void __init arch_init_irq(void)
|
||||
+{
|
||||
+ irqchip_init();
|
||||
+}
|
||||
+
|
||||
static int __init ath79_setup(void)
|
||||
{
|
||||
if (mips_machtype == ATH79_MACH_GENERIC_OF)
|
||||
--- a/arch/mips/include/asm/mach-ath79/ath79.h
|
||||
+++ b/arch/mips/include/asm/mach-ath79/ath79.h
|
||||
@@ -178,8 +178,4 @@ static inline u32 ath79_reset_rr(unsigne
|
||||
void ath79_device_reset_set(u32 mask);
|
||||
void ath79_device_reset_clear(u32 mask);
|
||||
|
||||
-void ath79_cpu_irq_init(unsigned irq_wb_chan2, unsigned irq_wb_chan3);
|
||||
-void ath79_misc_irq_init(void __iomem *regs, int irq,
|
||||
- int irq_base, bool is_ar71xx);
|
||||
-
|
||||
#endif /* __ASM_MACH_ATH79_H */
|
File diff suppressed because it is too large
Load Diff
@ -1,379 +0,0 @@
|
||||
From d0f1420702ed47a82572aaf39e7407055518d14e Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Jun 2018 15:05:19 +0200
|
||||
Subject: [PATCH 29/33] MIPS: ath79: drop legacy pci code
|
||||
|
||||
With the target now being fully OF based, we can drop the legacy pci
|
||||
platform code. The only bits that we need to keep is the fixup code
|
||||
which we move to its own code file.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/ath79/Makefile | 1 -
|
||||
arch/mips/ath79/pci.c | 273 --------------------------------------------
|
||||
arch/mips/ath79/pci.h | 35 ------
|
||||
arch/mips/pci/Makefile | 1 +
|
||||
arch/mips/pci/fixup-ath79.c | 21 ++++
|
||||
5 files changed, 22 insertions(+), 309 deletions(-)
|
||||
delete mode 100644 arch/mips/ath79/pci.c
|
||||
delete mode 100644 arch/mips/ath79/pci.h
|
||||
create mode 100644 arch/mips/pci/fixup-ath79.c
|
||||
|
||||
--- a/arch/mips/ath79/Makefile
|
||||
+++ b/arch/mips/ath79/Makefile
|
||||
@@ -11,7 +11,6 @@
|
||||
obj-y := prom.o setup.o common.o clock.o
|
||||
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
-obj-$(CONFIG_PCI) += pci.o
|
||||
|
||||
#
|
||||
# Devices
|
||||
--- a/arch/mips/ath79/pci.c
|
||||
+++ /dev/null
|
||||
@@ -1,273 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71XX/AR724X specific PCI setup code
|
||||
- *
|
||||
- * Copyright (C) 2011 René Bolldorf <xsecute@googlemail.com>
|
||||
- * Copyright (C) 2008-2011 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/pci.h>
|
||||
-#include <linux/resource.h>
|
||||
-#include <linux/platform_device.h>
|
||||
-#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
-#include <asm/mach-ath79/ath79.h>
|
||||
-#include <asm/mach-ath79/irq.h>
|
||||
-#include "pci.h"
|
||||
-
|
||||
-static int (*ath79_pci_plat_dev_init)(struct pci_dev *dev);
|
||||
-static const struct ath79_pci_irq *ath79_pci_irq_map;
|
||||
-static unsigned ath79_pci_nr_irqs;
|
||||
-
|
||||
-static const struct ath79_pci_irq ar71xx_pci_irq_map[] = {
|
||||
- {
|
||||
- .slot = 17,
|
||||
- .pin = 1,
|
||||
- .irq = ATH79_PCI_IRQ(0),
|
||||
- }, {
|
||||
- .slot = 18,
|
||||
- .pin = 1,
|
||||
- .irq = ATH79_PCI_IRQ(1),
|
||||
- }, {
|
||||
- .slot = 19,
|
||||
- .pin = 1,
|
||||
- .irq = ATH79_PCI_IRQ(2),
|
||||
- }
|
||||
-};
|
||||
-
|
||||
-static const struct ath79_pci_irq ar724x_pci_irq_map[] = {
|
||||
- {
|
||||
- .slot = 0,
|
||||
- .pin = 1,
|
||||
- .irq = ATH79_PCI_IRQ(0),
|
||||
- }
|
||||
-};
|
||||
-
|
||||
-static const struct ath79_pci_irq qca955x_pci_irq_map[] = {
|
||||
- {
|
||||
- .bus = 0,
|
||||
- .slot = 0,
|
||||
- .pin = 1,
|
||||
- .irq = ATH79_PCI_IRQ(0),
|
||||
- },
|
||||
- {
|
||||
- .bus = 1,
|
||||
- .slot = 0,
|
||||
- .pin = 1,
|
||||
- .irq = ATH79_PCI_IRQ(1),
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-int pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
|
||||
-{
|
||||
- int irq = -1;
|
||||
- int i;
|
||||
-
|
||||
- if (ath79_pci_nr_irqs == 0 ||
|
||||
- ath79_pci_irq_map == NULL) {
|
||||
- if (soc_is_ar71xx()) {
|
||||
- ath79_pci_irq_map = ar71xx_pci_irq_map;
|
||||
- ath79_pci_nr_irqs = ARRAY_SIZE(ar71xx_pci_irq_map);
|
||||
- } else if (soc_is_ar724x() ||
|
||||
- soc_is_ar9342() ||
|
||||
- soc_is_ar9344()) {
|
||||
- ath79_pci_irq_map = ar724x_pci_irq_map;
|
||||
- ath79_pci_nr_irqs = ARRAY_SIZE(ar724x_pci_irq_map);
|
||||
- } else if (soc_is_qca955x()) {
|
||||
- ath79_pci_irq_map = qca955x_pci_irq_map;
|
||||
- ath79_pci_nr_irqs = ARRAY_SIZE(qca955x_pci_irq_map);
|
||||
- } else {
|
||||
- pr_crit("pci %s: invalid irq map\n",
|
||||
- pci_name((struct pci_dev *) dev));
|
||||
- return irq;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- for (i = 0; i < ath79_pci_nr_irqs; i++) {
|
||||
- const struct ath79_pci_irq *entry;
|
||||
-
|
||||
- entry = &ath79_pci_irq_map[i];
|
||||
- if (entry->bus == dev->bus->number &&
|
||||
- entry->slot == slot &&
|
||||
- entry->pin == pin) {
|
||||
- irq = entry->irq;
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (irq < 0)
|
||||
- pr_crit("pci %s: no irq found for pin %u\n",
|
||||
- pci_name((struct pci_dev *) dev), pin);
|
||||
- else
|
||||
- pr_info("pci %s: using irq %d for pin %u\n",
|
||||
- pci_name((struct pci_dev *) dev), irq, pin);
|
||||
-
|
||||
- return irq;
|
||||
-}
|
||||
-
|
||||
-int pcibios_plat_dev_init(struct pci_dev *dev)
|
||||
-{
|
||||
- if (ath79_pci_plat_dev_init)
|
||||
- return ath79_pci_plat_dev_init(dev);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-void __init ath79_pci_set_irq_map(unsigned nr_irqs,
|
||||
- const struct ath79_pci_irq *map)
|
||||
-{
|
||||
- ath79_pci_nr_irqs = nr_irqs;
|
||||
- ath79_pci_irq_map = map;
|
||||
-}
|
||||
-
|
||||
-void __init ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev))
|
||||
-{
|
||||
- ath79_pci_plat_dev_init = func;
|
||||
-}
|
||||
-
|
||||
-static struct platform_device *
|
||||
-ath79_register_pci_ar71xx(void)
|
||||
-{
|
||||
- struct platform_device *pdev;
|
||||
- struct resource res[4];
|
||||
-
|
||||
- memset(res, 0, sizeof(res));
|
||||
-
|
||||
- res[0].name = "cfg_base";
|
||||
- res[0].flags = IORESOURCE_MEM;
|
||||
- res[0].start = AR71XX_PCI_CFG_BASE;
|
||||
- res[0].end = AR71XX_PCI_CFG_BASE + AR71XX_PCI_CFG_SIZE - 1;
|
||||
-
|
||||
- res[1].flags = IORESOURCE_IRQ;
|
||||
- res[1].start = ATH79_CPU_IRQ(2);
|
||||
- res[1].end = ATH79_CPU_IRQ(2);
|
||||
-
|
||||
- res[2].name = "io_base";
|
||||
- res[2].flags = IORESOURCE_IO;
|
||||
- res[2].start = 0;
|
||||
- res[2].end = 0;
|
||||
-
|
||||
- res[3].name = "mem_base";
|
||||
- res[3].flags = IORESOURCE_MEM;
|
||||
- res[3].start = AR71XX_PCI_MEM_BASE;
|
||||
- res[3].end = AR71XX_PCI_MEM_BASE + AR71XX_PCI_MEM_SIZE - 1;
|
||||
-
|
||||
- pdev = platform_device_register_simple("ar71xx-pci", -1,
|
||||
- res, ARRAY_SIZE(res));
|
||||
- return pdev;
|
||||
-}
|
||||
-
|
||||
-static struct platform_device *
|
||||
-ath79_register_pci_ar724x(int id,
|
||||
- unsigned long cfg_base,
|
||||
- unsigned long ctrl_base,
|
||||
- unsigned long crp_base,
|
||||
- unsigned long mem_base,
|
||||
- unsigned long mem_size,
|
||||
- unsigned long io_base,
|
||||
- int irq)
|
||||
-{
|
||||
- struct platform_device *pdev;
|
||||
- struct resource res[6];
|
||||
-
|
||||
- memset(res, 0, sizeof(res));
|
||||
-
|
||||
- res[0].name = "cfg_base";
|
||||
- res[0].flags = IORESOURCE_MEM;
|
||||
- res[0].start = cfg_base;
|
||||
- res[0].end = cfg_base + AR724X_PCI_CFG_SIZE - 1;
|
||||
-
|
||||
- res[1].name = "ctrl_base";
|
||||
- res[1].flags = IORESOURCE_MEM;
|
||||
- res[1].start = ctrl_base;
|
||||
- res[1].end = ctrl_base + AR724X_PCI_CTRL_SIZE - 1;
|
||||
-
|
||||
- res[2].flags = IORESOURCE_IRQ;
|
||||
- res[2].start = irq;
|
||||
- res[2].end = irq;
|
||||
-
|
||||
- res[3].name = "mem_base";
|
||||
- res[3].flags = IORESOURCE_MEM;
|
||||
- res[3].start = mem_base;
|
||||
- res[3].end = mem_base + mem_size - 1;
|
||||
-
|
||||
- res[4].name = "io_base";
|
||||
- res[4].flags = IORESOURCE_IO;
|
||||
- res[4].start = io_base;
|
||||
- res[4].end = io_base;
|
||||
-
|
||||
- res[5].name = "crp_base";
|
||||
- res[5].flags = IORESOURCE_MEM;
|
||||
- res[5].start = crp_base;
|
||||
- res[5].end = crp_base + AR724X_PCI_CRP_SIZE - 1;
|
||||
-
|
||||
- pdev = platform_device_register_simple("ar724x-pci", id,
|
||||
- res, ARRAY_SIZE(res));
|
||||
- return pdev;
|
||||
-}
|
||||
-
|
||||
-int __init ath79_register_pci(void)
|
||||
-{
|
||||
- struct platform_device *pdev = NULL;
|
||||
-
|
||||
- if (soc_is_ar71xx()) {
|
||||
- pdev = ath79_register_pci_ar71xx();
|
||||
- } else if (soc_is_ar724x()) {
|
||||
- pdev = ath79_register_pci_ar724x(-1,
|
||||
- AR724X_PCI_CFG_BASE,
|
||||
- AR724X_PCI_CTRL_BASE,
|
||||
- AR724X_PCI_CRP_BASE,
|
||||
- AR724X_PCI_MEM_BASE,
|
||||
- AR724X_PCI_MEM_SIZE,
|
||||
- 0,
|
||||
- ATH79_CPU_IRQ(2));
|
||||
- } else if (soc_is_ar9342() ||
|
||||
- soc_is_ar9344()) {
|
||||
- u32 bootstrap;
|
||||
-
|
||||
- bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
|
||||
- if ((bootstrap & AR934X_BOOTSTRAP_PCIE_RC) == 0)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- pdev = ath79_register_pci_ar724x(-1,
|
||||
- AR724X_PCI_CFG_BASE,
|
||||
- AR724X_PCI_CTRL_BASE,
|
||||
- AR724X_PCI_CRP_BASE,
|
||||
- AR724X_PCI_MEM_BASE,
|
||||
- AR724X_PCI_MEM_SIZE,
|
||||
- 0,
|
||||
- ATH79_IP2_IRQ(0));
|
||||
- } else if (soc_is_qca9558()) {
|
||||
- pdev = ath79_register_pci_ar724x(0,
|
||||
- QCA955X_PCI_CFG_BASE0,
|
||||
- QCA955X_PCI_CTRL_BASE0,
|
||||
- QCA955X_PCI_CRP_BASE0,
|
||||
- QCA955X_PCI_MEM_BASE0,
|
||||
- QCA955X_PCI_MEM_SIZE,
|
||||
- 0,
|
||||
- ATH79_IP2_IRQ(0));
|
||||
-
|
||||
- pdev = ath79_register_pci_ar724x(1,
|
||||
- QCA955X_PCI_CFG_BASE1,
|
||||
- QCA955X_PCI_CTRL_BASE1,
|
||||
- QCA955X_PCI_CRP_BASE1,
|
||||
- QCA955X_PCI_MEM_BASE1,
|
||||
- QCA955X_PCI_MEM_SIZE,
|
||||
- 1,
|
||||
- ATH79_IP3_IRQ(2));
|
||||
- } else {
|
||||
- /* No PCI support */
|
||||
- return -ENODEV;
|
||||
- }
|
||||
-
|
||||
- if (!pdev)
|
||||
- pr_err("unable to register PCI controller device\n");
|
||||
-
|
||||
- return pdev ? 0 : -ENODEV;
|
||||
-}
|
||||
--- a/arch/mips/ath79/pci.h
|
||||
+++ /dev/null
|
||||
@@ -1,35 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71XX/AR724X PCI support
|
||||
- *
|
||||
- * Copyright (C) 2011 René Bolldorf <xsecute@googlemail.com>
|
||||
- * Copyright (C) 2008-2011 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 _ATH79_PCI_H
|
||||
-#define _ATH79_PCI_H
|
||||
-
|
||||
-struct ath79_pci_irq {
|
||||
- int bus;
|
||||
- u8 slot;
|
||||
- u8 pin;
|
||||
- int irq;
|
||||
-};
|
||||
-
|
||||
-#ifdef CONFIG_PCI
|
||||
-void ath79_pci_set_irq_map(unsigned nr_irqs, const struct ath79_pci_irq *map);
|
||||
-void ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev));
|
||||
-int ath79_register_pci(void);
|
||||
-#else
|
||||
-static inline void
|
||||
-ath79_pci_set_irq_map(unsigned nr_irqs, const struct ath79_pci_irq *map) {}
|
||||
-static inline void
|
||||
-ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *)) {}
|
||||
-static inline int ath79_register_pci(void) { return 0; }
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _ATH79_PCI_H */
|
||||
--- a/arch/mips/pci/Makefile
|
||||
+++ b/arch/mips/pci/Makefile
|
||||
@@ -29,6 +29,7 @@ obj-$(CONFIG_MIPS_PCI_VIRTIO) += pci-vir
|
||||
#
|
||||
# These are still pretty much in the old state, watch, go blind.
|
||||
#
|
||||
+obj-$(CONFIG_ATH79) += fixup-ath79.o
|
||||
obj-$(CONFIG_LASAT) += pci-lasat.o
|
||||
obj-$(CONFIG_MIPS_COBALT) += fixup-cobalt.o
|
||||
obj-$(CONFIG_LEMOTE_FULOONG2E) += fixup-fuloong2e.o ops-loongson2.o
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/pci/fixup-ath79.c
|
||||
@@ -0,0 +1,21 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2018 John Crispin <john@phrozen.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/of_irq.h>
|
||||
+#include <linux/of_pci.h>
|
||||
+
|
||||
+int pcibios_plat_dev_init(struct pci_dev *dev)
|
||||
+{
|
||||
+ return PCIBIOS_SUCCESSFUL;
|
||||
+}
|
||||
+
|
||||
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
+{
|
||||
+ return of_irq_parse_and_map_pci(dev, slot, pin);
|
||||
+}
|
@ -1,933 +0,0 @@
|
||||
From dce930fba8ad3a90ccd164f199e57c2d61937ccd Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Jun 2018 15:12:38 +0200
|
||||
Subject: [PATCH 30/33] MIPS: ath79: drop platform device registration code
|
||||
|
||||
With the target now being fully OF based, we can drop the legacy platform
|
||||
device registration code. All devices and their drivers are now probed
|
||||
via OF.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/ath79/Makefile | 10 --
|
||||
arch/mips/ath79/common.h | 2 -
|
||||
arch/mips/ath79/dev-common.c | 159 ------------------------
|
||||
arch/mips/ath79/dev-common.h | 18 ---
|
||||
arch/mips/ath79/dev-gpio-buttons.c | 56 ---------
|
||||
arch/mips/ath79/dev-gpio-buttons.h | 23 ----
|
||||
arch/mips/ath79/dev-leds-gpio.c | 54 ---------
|
||||
arch/mips/ath79/dev-leds-gpio.h | 21 ----
|
||||
arch/mips/ath79/dev-spi.c | 38 ------
|
||||
arch/mips/ath79/dev-spi.h | 22 ----
|
||||
arch/mips/ath79/dev-usb.c | 242 -------------------------------------
|
||||
arch/mips/ath79/dev-usb.h | 17 ---
|
||||
arch/mips/ath79/dev-wmac.c | 155 ------------------------
|
||||
arch/mips/ath79/dev-wmac.h | 17 ---
|
||||
arch/mips/ath79/setup.c | 1 -
|
||||
15 files changed, 835 deletions(-)
|
||||
delete mode 100644 arch/mips/ath79/dev-common.c
|
||||
delete mode 100644 arch/mips/ath79/dev-common.h
|
||||
delete mode 100644 arch/mips/ath79/dev-gpio-buttons.c
|
||||
delete mode 100644 arch/mips/ath79/dev-gpio-buttons.h
|
||||
delete mode 100644 arch/mips/ath79/dev-leds-gpio.c
|
||||
delete mode 100644 arch/mips/ath79/dev-leds-gpio.h
|
||||
delete mode 100644 arch/mips/ath79/dev-spi.c
|
||||
delete mode 100644 arch/mips/ath79/dev-spi.h
|
||||
delete mode 100644 arch/mips/ath79/dev-usb.c
|
||||
delete mode 100644 arch/mips/ath79/dev-usb.h
|
||||
delete mode 100644 arch/mips/ath79/dev-wmac.c
|
||||
delete mode 100644 arch/mips/ath79/dev-wmac.h
|
||||
|
||||
--- a/arch/mips/ath79/Makefile
|
||||
+++ b/arch/mips/ath79/Makefile
|
||||
@@ -11,13 +11,3 @@
|
||||
obj-y := prom.o setup.o common.o clock.o
|
||||
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
-
|
||||
-#
|
||||
-# Devices
|
||||
-#
|
||||
-obj-y += dev-common.o
|
||||
-obj-$(CONFIG_ATH79_DEV_GPIO_BUTTONS) += dev-gpio-buttons.o
|
||||
-obj-$(CONFIG_ATH79_DEV_LEDS_GPIO) += dev-leds-gpio.o
|
||||
-obj-$(CONFIG_ATH79_DEV_SPI) += dev-spi.o
|
||||
-obj-$(CONFIG_ATH79_DEV_USB) += dev-usb.o
|
||||
-obj-$(CONFIG_ATH79_DEV_WMAC) += dev-wmac.o
|
||||
--- a/arch/mips/ath79/common.h
|
||||
+++ b/arch/mips/ath79/common.h
|
||||
@@ -24,6 +24,4 @@ unsigned long ath79_get_sys_clk_rate(con
|
||||
|
||||
void ath79_ddr_ctrl_init(void);
|
||||
|
||||
-void ath79_gpio_init(void);
|
||||
-
|
||||
#endif /* __ATH79_COMMON_H */
|
||||
--- a/arch/mips/ath79/dev-common.c
|
||||
+++ /dev/null
|
||||
@@ -1,159 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71XX/AR724X/AR913X common devices
|
||||
- *
|
||||
- * Copyright (C) 2008-2011 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/kernel.h>
|
||||
-#include <linux/init.h>
|
||||
-#include <linux/platform_device.h>
|
||||
-#include <linux/platform_data/gpio-ath79.h>
|
||||
-#include <linux/serial_8250.h>
|
||||
-#include <linux/clk.h>
|
||||
-#include <linux/err.h>
|
||||
-
|
||||
-#include <asm/mach-ath79/ath79.h>
|
||||
-#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
-#include "common.h"
|
||||
-#include "dev-common.h"
|
||||
-
|
||||
-static struct resource ath79_uart_resources[] = {
|
||||
- {
|
||||
- .start = AR71XX_UART_BASE,
|
||||
- .end = AR71XX_UART_BASE + AR71XX_UART_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-#define AR71XX_UART_FLAGS (UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP)
|
||||
-static struct plat_serial8250_port ath79_uart_data[] = {
|
||||
- {
|
||||
- .mapbase = AR71XX_UART_BASE,
|
||||
- .irq = ATH79_MISC_IRQ(3),
|
||||
- .flags = AR71XX_UART_FLAGS,
|
||||
- .iotype = UPIO_MEM32,
|
||||
- .regshift = 2,
|
||||
- }, {
|
||||
- /* terminating entry */
|
||||
- }
|
||||
-};
|
||||
-
|
||||
-static struct platform_device ath79_uart_device = {
|
||||
- .name = "serial8250",
|
||||
- .id = PLAT8250_DEV_PLATFORM,
|
||||
- .resource = ath79_uart_resources,
|
||||
- .num_resources = ARRAY_SIZE(ath79_uart_resources),
|
||||
- .dev = {
|
||||
- .platform_data = ath79_uart_data
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-static struct resource ar933x_uart_resources[] = {
|
||||
- {
|
||||
- .start = AR933X_UART_BASE,
|
||||
- .end = AR933X_UART_BASE + AR71XX_UART_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
- },
|
||||
- {
|
||||
- .start = ATH79_MISC_IRQ(3),
|
||||
- .end = ATH79_MISC_IRQ(3),
|
||||
- .flags = IORESOURCE_IRQ,
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-static struct platform_device ar933x_uart_device = {
|
||||
- .name = "ar933x-uart",
|
||||
- .id = -1,
|
||||
- .resource = ar933x_uart_resources,
|
||||
- .num_resources = ARRAY_SIZE(ar933x_uart_resources),
|
||||
-};
|
||||
-
|
||||
-void __init ath79_register_uart(void)
|
||||
-{
|
||||
- unsigned long uart_clk_rate;
|
||||
-
|
||||
- uart_clk_rate = ath79_get_sys_clk_rate("uart");
|
||||
-
|
||||
- if (soc_is_ar71xx() ||
|
||||
- soc_is_ar724x() ||
|
||||
- soc_is_ar913x() ||
|
||||
- soc_is_ar934x() ||
|
||||
- soc_is_qca955x()) {
|
||||
- ath79_uart_data[0].uartclk = uart_clk_rate;
|
||||
- platform_device_register(&ath79_uart_device);
|
||||
- } else if (soc_is_ar933x()) {
|
||||
- platform_device_register(&ar933x_uart_device);
|
||||
- } else {
|
||||
- BUG();
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-void __init ath79_register_wdt(void)
|
||||
-{
|
||||
- struct resource res;
|
||||
-
|
||||
- memset(&res, 0, sizeof(res));
|
||||
-
|
||||
- res.flags = IORESOURCE_MEM;
|
||||
- res.start = AR71XX_RESET_BASE + AR71XX_RESET_REG_WDOG_CTRL;
|
||||
- res.end = res.start + 0x8 - 1;
|
||||
-
|
||||
- platform_device_register_simple("ath79-wdt", -1, &res, 1);
|
||||
-}
|
||||
-
|
||||
-static struct ath79_gpio_platform_data ath79_gpio_pdata;
|
||||
-
|
||||
-static struct resource ath79_gpio_resources[] = {
|
||||
- {
|
||||
- .flags = IORESOURCE_MEM,
|
||||
- .start = AR71XX_GPIO_BASE,
|
||||
- .end = AR71XX_GPIO_BASE + AR71XX_GPIO_SIZE - 1,
|
||||
- },
|
||||
- {
|
||||
- .start = ATH79_MISC_IRQ(2),
|
||||
- .end = ATH79_MISC_IRQ(2),
|
||||
- .flags = IORESOURCE_IRQ,
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-static struct platform_device ath79_gpio_device = {
|
||||
- .name = "ath79-gpio",
|
||||
- .id = -1,
|
||||
- .resource = ath79_gpio_resources,
|
||||
- .num_resources = ARRAY_SIZE(ath79_gpio_resources),
|
||||
- .dev = {
|
||||
- .platform_data = &ath79_gpio_pdata
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-void __init ath79_gpio_init(void)
|
||||
-{
|
||||
- if (soc_is_ar71xx()) {
|
||||
- ath79_gpio_pdata.ngpios = AR71XX_GPIO_COUNT;
|
||||
- } else if (soc_is_ar7240()) {
|
||||
- ath79_gpio_pdata.ngpios = AR7240_GPIO_COUNT;
|
||||
- } else if (soc_is_ar7241() || soc_is_ar7242()) {
|
||||
- ath79_gpio_pdata.ngpios = AR7241_GPIO_COUNT;
|
||||
- } else if (soc_is_ar913x()) {
|
||||
- ath79_gpio_pdata.ngpios = AR913X_GPIO_COUNT;
|
||||
- } else if (soc_is_ar933x()) {
|
||||
- ath79_gpio_pdata.ngpios = AR933X_GPIO_COUNT;
|
||||
- } else if (soc_is_ar934x()) {
|
||||
- ath79_gpio_pdata.ngpios = AR934X_GPIO_COUNT;
|
||||
- ath79_gpio_pdata.oe_inverted = 1;
|
||||
- } else if (soc_is_qca955x()) {
|
||||
- ath79_gpio_pdata.ngpios = QCA955X_GPIO_COUNT;
|
||||
- ath79_gpio_pdata.oe_inverted = 1;
|
||||
- } else {
|
||||
- BUG();
|
||||
- }
|
||||
-
|
||||
- platform_device_register(&ath79_gpio_device);
|
||||
-}
|
||||
--- a/arch/mips/ath79/dev-common.h
|
||||
+++ /dev/null
|
||||
@@ -1,18 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71XX/AR724X/AR913X common devices
|
||||
- *
|
||||
- * Copyright (C) 2008-2010 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 _ATH79_DEV_COMMON_H
|
||||
-#define _ATH79_DEV_COMMON_H
|
||||
-
|
||||
-void ath79_register_uart(void);
|
||||
-void ath79_register_wdt(void);
|
||||
-
|
||||
-#endif /* _ATH79_DEV_COMMON_H */
|
||||
--- a/arch/mips/ath79/dev-gpio-buttons.c
|
||||
+++ /dev/null
|
||||
@@ -1,56 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71XX/AR724X/AR913X GPIO button support
|
||||
- *
|
||||
- * Copyright (C) 2008-2010 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 ath79_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 = kmemdup(buttons, nbuttons * sizeof(*p), GFP_KERNEL);
|
||||
- if (!p)
|
||||
- return;
|
||||
-
|
||||
- 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);
|
||||
-}
|
||||
--- a/arch/mips/ath79/dev-gpio-buttons.h
|
||||
+++ /dev/null
|
||||
@@ -1,23 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71XX/AR724X/AR913X GPIO button support
|
||||
- *
|
||||
- * Copyright (C) 2008-2010 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 _ATH79_DEV_GPIO_BUTTONS_H
|
||||
-#define _ATH79_DEV_GPIO_BUTTONS_H
|
||||
-
|
||||
-#include <linux/input.h>
|
||||
-#include <linux/gpio_keys.h>
|
||||
-
|
||||
-void ath79_register_gpio_keys_polled(int id,
|
||||
- unsigned poll_interval,
|
||||
- unsigned nbuttons,
|
||||
- struct gpio_keys_button *buttons);
|
||||
-
|
||||
-#endif /* _ATH79_DEV_GPIO_BUTTONS_H */
|
||||
--- a/arch/mips/ath79/dev-leds-gpio.c
|
||||
+++ /dev/null
|
||||
@@ -1,54 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71XX/AR724X/AR913X common GPIO LEDs support
|
||||
- *
|
||||
- * Copyright (C) 2008-2010 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-leds-gpio.h"
|
||||
-
|
||||
-void __init ath79_register_leds_gpio(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 = kmemdup(leds, num_leds * sizeof(*p), GFP_KERNEL);
|
||||
- if (!p)
|
||||
- return;
|
||||
-
|
||||
- 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);
|
||||
-}
|
||||
--- a/arch/mips/ath79/dev-leds-gpio.h
|
||||
+++ /dev/null
|
||||
@@ -1,21 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71XX/AR724X/AR913X common GPIO LEDs support
|
||||
- *
|
||||
- * Copyright (C) 2008-2010 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 _ATH79_DEV_LEDS_GPIO_H
|
||||
-#define _ATH79_DEV_LEDS_GPIO_H
|
||||
-
|
||||
-#include <linux/leds.h>
|
||||
-
|
||||
-void ath79_register_leds_gpio(int id,
|
||||
- unsigned num_leds,
|
||||
- struct gpio_led *leds);
|
||||
-
|
||||
-#endif /* _ATH79_DEV_LEDS_GPIO_H */
|
||||
--- a/arch/mips/ath79/dev-spi.c
|
||||
+++ /dev/null
|
||||
@@ -1,38 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71XX/AR724X/AR913X SPI controller device
|
||||
- *
|
||||
- * Copyright (C) 2008-2010 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/platform_device.h>
|
||||
-#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
-#include "dev-spi.h"
|
||||
-
|
||||
-static struct resource ath79_spi_resources[] = {
|
||||
- {
|
||||
- .start = AR71XX_SPI_BASE,
|
||||
- .end = AR71XX_SPI_BASE + AR71XX_SPI_SIZE - 1,
|
||||
- .flags = IORESOURCE_MEM,
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-static struct platform_device ath79_spi_device = {
|
||||
- .name = "ath79-spi",
|
||||
- .id = -1,
|
||||
- .resource = ath79_spi_resources,
|
||||
- .num_resources = ARRAY_SIZE(ath79_spi_resources),
|
||||
-};
|
||||
-
|
||||
-void __init ath79_register_spi(struct ath79_spi_platform_data *pdata,
|
||||
- struct spi_board_info const *info,
|
||||
- unsigned n)
|
||||
-{
|
||||
- spi_register_board_info(info, n);
|
||||
- ath79_spi_device.dev.platform_data = pdata;
|
||||
- platform_device_register(&ath79_spi_device);
|
||||
-}
|
||||
--- a/arch/mips/ath79/dev-spi.h
|
||||
+++ /dev/null
|
||||
@@ -1,22 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71XX/AR724X/AR913X SPI controller device
|
||||
- *
|
||||
- * Copyright (C) 2008-2010 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 _ATH79_DEV_SPI_H
|
||||
-#define _ATH79_DEV_SPI_H
|
||||
-
|
||||
-#include <linux/spi/spi.h>
|
||||
-#include <asm/mach-ath79/ath79_spi_platform.h>
|
||||
-
|
||||
-void ath79_register_spi(struct ath79_spi_platform_data *pdata,
|
||||
- struct spi_board_info const *info,
|
||||
- unsigned n);
|
||||
-
|
||||
-#endif /* _ATH79_DEV_SPI_H */
|
||||
--- a/arch/mips/ath79/dev-usb.c
|
||||
+++ /dev/null
|
||||
@@ -1,242 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR7XXX/AR9XXX USB Host Controller device
|
||||
- *
|
||||
- * Copyright (C) 2008-2011 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/kernel.h>
|
||||
-#include <linux/init.h>
|
||||
-#include <linux/delay.h>
|
||||
-#include <linux/irq.h>
|
||||
-#include <linux/dma-mapping.h>
|
||||
-#include <linux/platform_device.h>
|
||||
-#include <linux/usb/ehci_pdriver.h>
|
||||
-#include <linux/usb/ohci_pdriver.h>
|
||||
-
|
||||
-#include <asm/mach-ath79/ath79.h>
|
||||
-#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
-#include "common.h"
|
||||
-#include "dev-usb.h"
|
||||
-
|
||||
-static u64 ath79_usb_dmamask = DMA_BIT_MASK(32);
|
||||
-
|
||||
-static struct usb_ohci_pdata ath79_ohci_pdata = {
|
||||
-};
|
||||
-
|
||||
-static struct usb_ehci_pdata ath79_ehci_pdata_v1 = {
|
||||
- .has_synopsys_hc_bug = 1,
|
||||
-};
|
||||
-
|
||||
-static struct usb_ehci_pdata ath79_ehci_pdata_v2 = {
|
||||
- .caps_offset = 0x100,
|
||||
- .has_tt = 1,
|
||||
-};
|
||||
-
|
||||
-static void __init ath79_usb_register(const char *name, int id,
|
||||
- unsigned long base, unsigned long size,
|
||||
- int irq, const void *data,
|
||||
- size_t data_size)
|
||||
-{
|
||||
- struct resource res[2];
|
||||
- struct platform_device *pdev;
|
||||
-
|
||||
- memset(res, 0, sizeof(res));
|
||||
-
|
||||
- res[0].flags = IORESOURCE_MEM;
|
||||
- res[0].start = base;
|
||||
- res[0].end = base + size - 1;
|
||||
-
|
||||
- res[1].flags = IORESOURCE_IRQ;
|
||||
- res[1].start = irq;
|
||||
- res[1].end = irq;
|
||||
-
|
||||
- pdev = platform_device_register_resndata(NULL, name, id,
|
||||
- res, ARRAY_SIZE(res),
|
||||
- data, data_size);
|
||||
-
|
||||
- if (IS_ERR(pdev)) {
|
||||
- pr_err("ath79: unable to register USB at %08lx, err=%d\n",
|
||||
- base, (int) PTR_ERR(pdev));
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- pdev->dev.dma_mask = &ath79_usb_dmamask;
|
||||
- pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
-}
|
||||
-
|
||||
-#define AR71XX_USB_RESET_MASK (AR71XX_RESET_USB_HOST | \
|
||||
- AR71XX_RESET_USB_PHY | \
|
||||
- AR71XX_RESET_USB_OHCI_DLL)
|
||||
-
|
||||
-static void __init ath79_usb_setup(void)
|
||||
-{
|
||||
- void __iomem *usb_ctrl_base;
|
||||
-
|
||||
- ath79_device_reset_set(AR71XX_USB_RESET_MASK);
|
||||
- mdelay(1000);
|
||||
- ath79_device_reset_clear(AR71XX_USB_RESET_MASK);
|
||||
-
|
||||
- usb_ctrl_base = ioremap(AR71XX_USB_CTRL_BASE, AR71XX_USB_CTRL_SIZE);
|
||||
-
|
||||
- /* Turning on the Buff and Desc swap bits */
|
||||
- __raw_writel(0xf0000, usb_ctrl_base + AR71XX_USB_CTRL_REG_CONFIG);
|
||||
-
|
||||
- /* WAR for HW bug. Here it adjusts the duration between two SOFS */
|
||||
- __raw_writel(0x20c00, usb_ctrl_base + AR71XX_USB_CTRL_REG_FLADJ);
|
||||
-
|
||||
- iounmap(usb_ctrl_base);
|
||||
-
|
||||
- mdelay(900);
|
||||
-
|
||||
- ath79_usb_register("ohci-platform", -1,
|
||||
- AR71XX_OHCI_BASE, AR71XX_OHCI_SIZE,
|
||||
- ATH79_MISC_IRQ(6),
|
||||
- &ath79_ohci_pdata, sizeof(ath79_ohci_pdata));
|
||||
-
|
||||
- ath79_usb_register("ehci-platform", -1,
|
||||
- AR71XX_EHCI_BASE, AR71XX_EHCI_SIZE,
|
||||
- ATH79_CPU_IRQ(3),
|
||||
- &ath79_ehci_pdata_v1, sizeof(ath79_ehci_pdata_v1));
|
||||
-}
|
||||
-
|
||||
-static void __init ar7240_usb_setup(void)
|
||||
-{
|
||||
- void __iomem *usb_ctrl_base;
|
||||
-
|
||||
- ath79_device_reset_clear(AR7240_RESET_OHCI_DLL);
|
||||
- ath79_device_reset_set(AR7240_RESET_USB_HOST);
|
||||
-
|
||||
- mdelay(1000);
|
||||
-
|
||||
- ath79_device_reset_set(AR7240_RESET_OHCI_DLL);
|
||||
- ath79_device_reset_clear(AR7240_RESET_USB_HOST);
|
||||
-
|
||||
- usb_ctrl_base = ioremap(AR7240_USB_CTRL_BASE, AR7240_USB_CTRL_SIZE);
|
||||
-
|
||||
- /* WAR for HW bug. Here it adjusts the duration between two SOFS */
|
||||
- __raw_writel(0x3, usb_ctrl_base + AR71XX_USB_CTRL_REG_FLADJ);
|
||||
-
|
||||
- iounmap(usb_ctrl_base);
|
||||
-
|
||||
- ath79_usb_register("ohci-platform", -1,
|
||||
- AR7240_OHCI_BASE, AR7240_OHCI_SIZE,
|
||||
- ATH79_CPU_IRQ(3),
|
||||
- &ath79_ohci_pdata, sizeof(ath79_ohci_pdata));
|
||||
-}
|
||||
-
|
||||
-static void __init ar724x_usb_setup(void)
|
||||
-{
|
||||
- ath79_device_reset_set(AR724X_RESET_USBSUS_OVERRIDE);
|
||||
- mdelay(10);
|
||||
-
|
||||
- ath79_device_reset_clear(AR724X_RESET_USB_HOST);
|
||||
- mdelay(10);
|
||||
-
|
||||
- ath79_device_reset_clear(AR724X_RESET_USB_PHY);
|
||||
- mdelay(10);
|
||||
-
|
||||
- ath79_usb_register("ehci-platform", -1,
|
||||
- AR724X_EHCI_BASE, AR724X_EHCI_SIZE,
|
||||
- ATH79_CPU_IRQ(3),
|
||||
- &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
-}
|
||||
-
|
||||
-static void __init ar913x_usb_setup(void)
|
||||
-{
|
||||
- ath79_device_reset_set(AR913X_RESET_USBSUS_OVERRIDE);
|
||||
- mdelay(10);
|
||||
-
|
||||
- ath79_device_reset_clear(AR913X_RESET_USB_HOST);
|
||||
- mdelay(10);
|
||||
-
|
||||
- ath79_device_reset_clear(AR913X_RESET_USB_PHY);
|
||||
- mdelay(10);
|
||||
-
|
||||
- ath79_usb_register("ehci-platform", -1,
|
||||
- AR913X_EHCI_BASE, AR913X_EHCI_SIZE,
|
||||
- ATH79_CPU_IRQ(3),
|
||||
- &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
-}
|
||||
-
|
||||
-static void __init ar933x_usb_setup(void)
|
||||
-{
|
||||
- ath79_device_reset_set(AR933X_RESET_USBSUS_OVERRIDE);
|
||||
- mdelay(10);
|
||||
-
|
||||
- ath79_device_reset_clear(AR933X_RESET_USB_HOST);
|
||||
- mdelay(10);
|
||||
-
|
||||
- ath79_device_reset_clear(AR933X_RESET_USB_PHY);
|
||||
- mdelay(10);
|
||||
-
|
||||
- ath79_usb_register("ehci-platform", -1,
|
||||
- AR933X_EHCI_BASE, AR933X_EHCI_SIZE,
|
||||
- ATH79_CPU_IRQ(3),
|
||||
- &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
-}
|
||||
-
|
||||
-static void __init ar934x_usb_setup(void)
|
||||
-{
|
||||
- u32 bootstrap;
|
||||
-
|
||||
- bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
|
||||
- if (bootstrap & AR934X_BOOTSTRAP_USB_MODE_DEVICE)
|
||||
- return;
|
||||
-
|
||||
- ath79_device_reset_set(AR934X_RESET_USBSUS_OVERRIDE);
|
||||
- udelay(1000);
|
||||
-
|
||||
- ath79_device_reset_clear(AR934X_RESET_USB_PHY);
|
||||
- udelay(1000);
|
||||
-
|
||||
- ath79_device_reset_clear(AR934X_RESET_USB_PHY_ANALOG);
|
||||
- udelay(1000);
|
||||
-
|
||||
- ath79_device_reset_clear(AR934X_RESET_USB_HOST);
|
||||
- udelay(1000);
|
||||
-
|
||||
- ath79_usb_register("ehci-platform", -1,
|
||||
- AR934X_EHCI_BASE, AR934X_EHCI_SIZE,
|
||||
- ATH79_CPU_IRQ(3),
|
||||
- &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
-}
|
||||
-
|
||||
-static void __init qca955x_usb_setup(void)
|
||||
-{
|
||||
- ath79_usb_register("ehci-platform", 0,
|
||||
- QCA955X_EHCI0_BASE, QCA955X_EHCI_SIZE,
|
||||
- ATH79_IP3_IRQ(0),
|
||||
- &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
-
|
||||
- ath79_usb_register("ehci-platform", 1,
|
||||
- QCA955X_EHCI1_BASE, QCA955X_EHCI_SIZE,
|
||||
- ATH79_IP3_IRQ(1),
|
||||
- &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
-}
|
||||
-
|
||||
-void __init ath79_register_usb(void)
|
||||
-{
|
||||
- if (soc_is_ar71xx())
|
||||
- ath79_usb_setup();
|
||||
- else if (soc_is_ar7240())
|
||||
- ar7240_usb_setup();
|
||||
- else if (soc_is_ar7241() || soc_is_ar7242())
|
||||
- ar724x_usb_setup();
|
||||
- else if (soc_is_ar913x())
|
||||
- ar913x_usb_setup();
|
||||
- else if (soc_is_ar933x())
|
||||
- ar933x_usb_setup();
|
||||
- else if (soc_is_ar934x())
|
||||
- ar934x_usb_setup();
|
||||
- else if (soc_is_qca955x())
|
||||
- qca955x_usb_setup();
|
||||
- else
|
||||
- BUG();
|
||||
-}
|
||||
--- a/arch/mips/ath79/dev-usb.h
|
||||
+++ /dev/null
|
||||
@@ -1,17 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR71XX/AR724X/AR913X USB Host Controller support
|
||||
- *
|
||||
- * Copyright (C) 2008-2010 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 _ATH79_DEV_USB_H
|
||||
-#define _ATH79_DEV_USB_H
|
||||
-
|
||||
-void ath79_register_usb(void);
|
||||
-
|
||||
-#endif /* _ATH79_DEV_USB_H */
|
||||
--- a/arch/mips/ath79/dev-wmac.c
|
||||
+++ /dev/null
|
||||
@@ -1,155 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR913X/AR933X SoC built-in WMAC device support
|
||||
- *
|
||||
- * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
|
||||
- * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
|
||||
- * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
|
||||
- *
|
||||
- * Parts of this file are based on Atheros 2.6.15/2.6.31 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/delay.h>
|
||||
-#include <linux/irq.h>
|
||||
-#include <linux/platform_device.h>
|
||||
-#include <linux/ath9k_platform.h>
|
||||
-
|
||||
-#include <asm/mach-ath79/ath79.h>
|
||||
-#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
-#include "dev-wmac.h"
|
||||
-
|
||||
-static struct ath9k_platform_data ath79_wmac_data;
|
||||
-
|
||||
-static struct resource ath79_wmac_resources[] = {
|
||||
- {
|
||||
- /* .start and .end fields are filled dynamically */
|
||||
- .flags = IORESOURCE_MEM,
|
||||
- }, {
|
||||
- /* .start and .end fields are filled dynamically */
|
||||
- .flags = IORESOURCE_IRQ,
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-static struct platform_device ath79_wmac_device = {
|
||||
- .name = "ath9k",
|
||||
- .id = -1,
|
||||
- .resource = ath79_wmac_resources,
|
||||
- .num_resources = ARRAY_SIZE(ath79_wmac_resources),
|
||||
- .dev = {
|
||||
- .platform_data = &ath79_wmac_data,
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-static void __init ar913x_wmac_setup(void)
|
||||
-{
|
||||
- /* reset the WMAC */
|
||||
- ath79_device_reset_set(AR913X_RESET_AMBA2WMAC);
|
||||
- mdelay(10);
|
||||
-
|
||||
- ath79_device_reset_clear(AR913X_RESET_AMBA2WMAC);
|
||||
- mdelay(10);
|
||||
-
|
||||
- ath79_wmac_resources[0].start = AR913X_WMAC_BASE;
|
||||
- ath79_wmac_resources[0].end = AR913X_WMAC_BASE + AR913X_WMAC_SIZE - 1;
|
||||
- ath79_wmac_resources[1].start = ATH79_CPU_IRQ(2);
|
||||
- ath79_wmac_resources[1].end = ATH79_CPU_IRQ(2);
|
||||
-}
|
||||
-
|
||||
-
|
||||
-static int ar933x_wmac_reset(void)
|
||||
-{
|
||||
- ath79_device_reset_set(AR933X_RESET_WMAC);
|
||||
- ath79_device_reset_clear(AR933X_RESET_WMAC);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int ar933x_r1_get_wmac_revision(void)
|
||||
-{
|
||||
- return ath79_soc_rev;
|
||||
-}
|
||||
-
|
||||
-static void __init ar933x_wmac_setup(void)
|
||||
-{
|
||||
- u32 t;
|
||||
-
|
||||
- ar933x_wmac_reset();
|
||||
-
|
||||
- ath79_wmac_device.name = "ar933x_wmac";
|
||||
-
|
||||
- ath79_wmac_resources[0].start = AR933X_WMAC_BASE;
|
||||
- ath79_wmac_resources[0].end = AR933X_WMAC_BASE + AR933X_WMAC_SIZE - 1;
|
||||
- ath79_wmac_resources[1].start = ATH79_CPU_IRQ(2);
|
||||
- ath79_wmac_resources[1].end = ATH79_CPU_IRQ(2);
|
||||
-
|
||||
- t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
|
||||
- if (t & AR933X_BOOTSTRAP_REF_CLK_40)
|
||||
- ath79_wmac_data.is_clk_25mhz = false;
|
||||
- else
|
||||
- ath79_wmac_data.is_clk_25mhz = true;
|
||||
-
|
||||
- if (ath79_soc_rev == 1)
|
||||
- ath79_wmac_data.get_mac_revision = ar933x_r1_get_wmac_revision;
|
||||
-
|
||||
- ath79_wmac_data.external_reset = ar933x_wmac_reset;
|
||||
-}
|
||||
-
|
||||
-static void ar934x_wmac_setup(void)
|
||||
-{
|
||||
- u32 t;
|
||||
-
|
||||
- ath79_wmac_device.name = "ar934x_wmac";
|
||||
-
|
||||
- ath79_wmac_resources[0].start = AR934X_WMAC_BASE;
|
||||
- ath79_wmac_resources[0].end = AR934X_WMAC_BASE + AR934X_WMAC_SIZE - 1;
|
||||
- ath79_wmac_resources[1].start = ATH79_IP2_IRQ(1);
|
||||
- ath79_wmac_resources[1].end = ATH79_IP2_IRQ(1);
|
||||
-
|
||||
- t = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
|
||||
- if (t & AR934X_BOOTSTRAP_REF_CLK_40)
|
||||
- ath79_wmac_data.is_clk_25mhz = false;
|
||||
- else
|
||||
- ath79_wmac_data.is_clk_25mhz = true;
|
||||
-}
|
||||
-
|
||||
-static void qca955x_wmac_setup(void)
|
||||
-{
|
||||
- u32 t;
|
||||
-
|
||||
- ath79_wmac_device.name = "qca955x_wmac";
|
||||
-
|
||||
- ath79_wmac_resources[0].start = QCA955X_WMAC_BASE;
|
||||
- ath79_wmac_resources[0].end = QCA955X_WMAC_BASE + QCA955X_WMAC_SIZE - 1;
|
||||
- ath79_wmac_resources[1].start = ATH79_IP2_IRQ(1);
|
||||
- ath79_wmac_resources[1].end = ATH79_IP2_IRQ(1);
|
||||
-
|
||||
- t = ath79_reset_rr(QCA955X_RESET_REG_BOOTSTRAP);
|
||||
- if (t & QCA955X_BOOTSTRAP_REF_CLK_40)
|
||||
- ath79_wmac_data.is_clk_25mhz = false;
|
||||
- else
|
||||
- ath79_wmac_data.is_clk_25mhz = true;
|
||||
-}
|
||||
-
|
||||
-void __init ath79_register_wmac(u8 *cal_data)
|
||||
-{
|
||||
- if (soc_is_ar913x())
|
||||
- ar913x_wmac_setup();
|
||||
- else if (soc_is_ar933x())
|
||||
- ar933x_wmac_setup();
|
||||
- else if (soc_is_ar934x())
|
||||
- ar934x_wmac_setup();
|
||||
- else if (soc_is_qca955x())
|
||||
- qca955x_wmac_setup();
|
||||
- else
|
||||
- BUG();
|
||||
-
|
||||
- if (cal_data)
|
||||
- memcpy(ath79_wmac_data.eeprom_data, cal_data,
|
||||
- sizeof(ath79_wmac_data.eeprom_data));
|
||||
-
|
||||
- platform_device_register(&ath79_wmac_device);
|
||||
-}
|
||||
--- a/arch/mips/ath79/dev-wmac.h
|
||||
+++ /dev/null
|
||||
@@ -1,17 +0,0 @@
|
||||
-/*
|
||||
- * Atheros AR913X/AR933X SoC built-in WMAC device support
|
||||
- *
|
||||
- * Copyright (C) 2008-2011 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 _ATH79_DEV_WMAC_H
|
||||
-#define _ATH79_DEV_WMAC_H
|
||||
-
|
||||
-void ath79_register_wmac(u8 *cal_data);
|
||||
-
|
||||
-#endif /* _ATH79_DEV_WMAC_H */
|
||||
--- a/arch/mips/ath79/setup.c
|
||||
+++ b/arch/mips/ath79/setup.c
|
||||
@@ -32,7 +32,6 @@
|
||||
#include <asm/mach-ath79/ath79.h>
|
||||
#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
#include "common.h"
|
||||
-#include "dev-common.h"
|
||||
|
||||
#define ATH79_SYS_TYPE_LEN 64
|
||||
|
@ -1,95 +0,0 @@
|
||||
From 00e4313da4609074fff134e61dd9ffe3fd37474d Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sun, 24 Jun 2018 09:39:41 +0200
|
||||
Subject: [PATCH 31/33] MIPS: ath79: drop !OF clock code
|
||||
|
||||
With the target now being fully OF based, we can drop the legacy clock
|
||||
registration code. All clocks are now probed via devicetree.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/ath79/clock.c | 56 ------------------------------------------------
|
||||
arch/mips/ath79/common.h | 3 ---
|
||||
2 files changed, 59 deletions(-)
|
||||
|
||||
--- a/arch/mips/ath79/clock.c
|
||||
+++ b/arch/mips/ath79/clock.c
|
||||
@@ -617,60 +617,6 @@ static void __init qca956x_clocks_init(v
|
||||
ath79_set_clk(ATH79_CLK_AHB, ahb_rate);
|
||||
}
|
||||
|
||||
-void __init ath79_clocks_init(void)
|
||||
-{
|
||||
- const char *wdt;
|
||||
- const char *uart;
|
||||
-
|
||||
- if (soc_is_ar71xx())
|
||||
- ar71xx_clocks_init(ath79_pll_base);
|
||||
- else if (soc_is_ar724x() || soc_is_ar913x())
|
||||
- ar724x_clocks_init(ath79_pll_base);
|
||||
- else if (soc_is_ar933x())
|
||||
- ar933x_clocks_init(ath79_pll_base);
|
||||
- else if (soc_is_ar934x())
|
||||
- ar934x_clocks_init(ath79_pll_base);
|
||||
- else if (soc_is_qca953x())
|
||||
- qca953x_clocks_init(ath79_pll_base);
|
||||
- else if (soc_is_qca955x())
|
||||
- qca955x_clocks_init(ath79_pll_base);
|
||||
- else if (soc_is_qca956x() || soc_is_tp9343())
|
||||
- qca956x_clocks_init(ath79_pll_base);
|
||||
- else
|
||||
- BUG();
|
||||
-
|
||||
- if (soc_is_ar71xx() || soc_is_ar724x() || soc_is_ar913x()) {
|
||||
- wdt = "ahb";
|
||||
- uart = "ahb";
|
||||
- } else if (soc_is_ar933x()) {
|
||||
- wdt = "ahb";
|
||||
- uart = "ref";
|
||||
- } else {
|
||||
- wdt = "ref";
|
||||
- uart = "ref";
|
||||
- }
|
||||
-
|
||||
- clk_add_alias("wdt", NULL, wdt, NULL);
|
||||
- clk_add_alias("uart", NULL, uart, NULL);
|
||||
-}
|
||||
-
|
||||
-unsigned long __init
|
||||
-ath79_get_sys_clk_rate(const char *id)
|
||||
-{
|
||||
- struct clk *clk;
|
||||
- unsigned long rate;
|
||||
-
|
||||
- clk = clk_get(NULL, id);
|
||||
- if (IS_ERR(clk))
|
||||
- panic("unable to get %s clock, err=%d", id, (int) PTR_ERR(clk));
|
||||
-
|
||||
- rate = clk_get_rate(clk);
|
||||
- clk_put(clk);
|
||||
-
|
||||
- return rate;
|
||||
-}
|
||||
-
|
||||
-#ifdef CONFIG_OF
|
||||
static void __init ath79_clocks_init_dt(struct device_node *np)
|
||||
{
|
||||
struct clk *ref_clk;
|
||||
@@ -727,5 +673,3 @@ CLK_OF_DECLARE(ar9340_clk, "qca,ar9340-p
|
||||
CLK_OF_DECLARE(ar9530_clk, "qca,qca9530-pll", ath79_clocks_init_dt);
|
||||
CLK_OF_DECLARE(ar9550_clk, "qca,qca9550-pll", ath79_clocks_init_dt);
|
||||
CLK_OF_DECLARE(ar9560_clk, "qca,qca9560-pll", ath79_clocks_init_dt);
|
||||
-
|
||||
-#endif
|
||||
--- a/arch/mips/ath79/common.h
|
||||
+++ b/arch/mips/ath79/common.h
|
||||
@@ -19,9 +19,6 @@
|
||||
#define ATH79_MEM_SIZE_MIN (2 * 1024 * 1024)
|
||||
#define ATH79_MEM_SIZE_MAX (256 * 1024 * 1024)
|
||||
|
||||
-void ath79_clocks_init(void);
|
||||
-unsigned long ath79_get_sys_clk_rate(const char *id);
|
||||
-
|
||||
void ath79_ddr_ctrl_init(void);
|
||||
|
||||
#endif /* __ATH79_COMMON_H */
|
@ -1,93 +0,0 @@
|
||||
From 3fc8585cf76022dba7496627074d42af88c30718 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Jun 2018 15:16:55 +0200
|
||||
Subject: [PATCH 32/33] MIPS: ath79: sanitize symbols
|
||||
|
||||
We no longer need to select which SoCs are supported as the whole arch
|
||||
code is always built. So lets drop all the SoC symbols
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/Kconfig | 2 ++
|
||||
arch/mips/ath79/Kconfig | 44 +++++---------------------------------------
|
||||
arch/mips/pci/Makefile | 2 +-
|
||||
3 files changed, 8 insertions(+), 40 deletions(-)
|
||||
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -208,6 +208,8 @@ config ATH79
|
||||
select SYS_SUPPORTS_BIG_ENDIAN
|
||||
select SYS_SUPPORTS_MIPS16
|
||||
select SYS_SUPPORTS_ZBOOT_UART_PROM
|
||||
+ select HW_HAS_PCI
|
||||
+ select USB_ARCH_HAS_EHCI
|
||||
select USE_OF
|
||||
select USB_EHCI_ROOT_HUB_TT if USB_EHCI_HCD_PLATFORM
|
||||
help
|
||||
--- a/arch/mips/ath79/Kconfig
|
||||
+++ b/arch/mips/ath79/Kconfig
|
||||
@@ -1,48 +1,14 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
if ATH79
|
||||
|
||||
-config SOC_AR71XX
|
||||
- select HW_HAS_PCI
|
||||
- def_bool n
|
||||
-
|
||||
-config SOC_AR724X
|
||||
- select HW_HAS_PCI
|
||||
- select PCI_AR724X if PCI
|
||||
- def_bool n
|
||||
-
|
||||
-config SOC_AR913X
|
||||
- def_bool n
|
||||
-
|
||||
-config SOC_AR933X
|
||||
- def_bool n
|
||||
-
|
||||
-config SOC_AR934X
|
||||
- select HW_HAS_PCI
|
||||
- select PCI_AR724X if PCI
|
||||
- def_bool n
|
||||
-
|
||||
-config SOC_QCA955X
|
||||
- select HW_HAS_PCI
|
||||
- select PCI_AR724X if PCI
|
||||
+config PCI_AR71XX
|
||||
+ bool "PCI support for AR7100 type SoCs"
|
||||
+ depends on PCI
|
||||
def_bool n
|
||||
|
||||
config PCI_AR724X
|
||||
- def_bool n
|
||||
-
|
||||
-config ATH79_DEV_GPIO_BUTTONS
|
||||
- def_bool n
|
||||
-
|
||||
-config ATH79_DEV_LEDS_GPIO
|
||||
- def_bool n
|
||||
-
|
||||
-config ATH79_DEV_SPI
|
||||
- def_bool n
|
||||
-
|
||||
-config ATH79_DEV_USB
|
||||
- def_bool n
|
||||
-
|
||||
-config ATH79_DEV_WMAC
|
||||
- depends on (SOC_AR913X || SOC_AR933X || SOC_AR934X || SOC_QCA955X)
|
||||
+ bool "PCI support for AR724x type SoCs"
|
||||
+ depends on PCI
|
||||
def_bool n
|
||||
|
||||
endif
|
||||
--- a/arch/mips/pci/Makefile
|
||||
+++ b/arch/mips/pci/Makefile
|
||||
@@ -23,7 +23,7 @@ obj-$(CONFIG_BCM63XX) += pci-bcm63xx.o
|
||||
ops-bcm63xx.o
|
||||
obj-$(CONFIG_MIPS_ALCHEMY) += pci-alchemy.o
|
||||
obj-$(CONFIG_PCI_AR2315) += pci-ar2315.o
|
||||
-obj-$(CONFIG_SOC_AR71XX) += pci-ar71xx.o
|
||||
+obj-$(CONFIG_PCI_AR71XX) += pci-ar71xx.o
|
||||
obj-$(CONFIG_PCI_AR724X) += pci-ar724x.o
|
||||
obj-$(CONFIG_MIPS_PCI_VIRTIO) += pci-virtio-guest.o
|
||||
#
|
@ -1,73 +0,0 @@
|
||||
From c4e197bbcecc7233aa9e553e7047fa50e4e1fe77 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Mon, 25 Jun 2018 15:52:34 +0200
|
||||
Subject: [PATCH 33/33] spi: ath79: drop pdata support
|
||||
|
||||
The target is being converted to pure OF. We can therefore drop all of the
|
||||
platform data code from the driver.
|
||||
|
||||
Cc: linux-spi@vger.kernel.org
|
||||
Acked-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/include/asm/mach-ath79/ath79_spi_platform.h | 19 -------------------
|
||||
drivers/spi/spi-ath79.c | 8 --------
|
||||
2 files changed, 27 deletions(-)
|
||||
delete mode 100644 arch/mips/include/asm/mach-ath79/ath79_spi_platform.h
|
||||
|
||||
--- a/arch/mips/include/asm/mach-ath79/ath79_spi_platform.h
|
||||
+++ /dev/null
|
||||
@@ -1,19 +0,0 @@
|
||||
-/*
|
||||
- * Platform data definition for Atheros AR71XX/AR724X/AR913X SPI controller
|
||||
- *
|
||||
- * Copyright (C) 2008-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.
|
||||
- */
|
||||
-
|
||||
-#ifndef _ATH79_SPI_PLATFORM_H
|
||||
-#define _ATH79_SPI_PLATFORM_H
|
||||
-
|
||||
-struct ath79_spi_platform_data {
|
||||
- unsigned bus_num;
|
||||
- unsigned num_chipselect;
|
||||
-};
|
||||
-
|
||||
-#endif /* _ATH79_SPI_PLATFORM_H */
|
||||
--- a/drivers/spi/spi-ath79.c
|
||||
+++ b/drivers/spi/spi-ath79.c
|
||||
@@ -26,7 +26,6 @@
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
-#include <asm/mach-ath79/ath79_spi_platform.h>
|
||||
|
||||
#define DRV_NAME "ath79-spi"
|
||||
|
||||
@@ -208,7 +207,6 @@ static int ath79_spi_probe(struct platfo
|
||||
{
|
||||
struct spi_master *master;
|
||||
struct ath79_spi *sp;
|
||||
- struct ath79_spi_platform_data *pdata;
|
||||
struct resource *r;
|
||||
unsigned long rate;
|
||||
int ret;
|
||||
@@ -223,15 +221,9 @@ static int ath79_spi_probe(struct platfo
|
||||
master->dev.of_node = pdev->dev.of_node;
|
||||
platform_set_drvdata(pdev, sp);
|
||||
|
||||
- pdata = dev_get_platdata(&pdev->dev);
|
||||
-
|
||||
master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32);
|
||||
master->setup = ath79_spi_setup;
|
||||
master->cleanup = ath79_spi_cleanup;
|
||||
- if (pdata) {
|
||||
- master->bus_num = pdata->bus_num;
|
||||
- master->num_chipselect = pdata->num_chipselect;
|
||||
- }
|
||||
|
||||
sp->bitbang.master = master;
|
||||
sp->bitbang.chipselect = ath79_spi_chipselect;
|
@ -1,27 +0,0 @@
|
||||
--- a/arch/mips/ath79/common.c
|
||||
+++ b/arch/mips/ath79/common.c
|
||||
@@ -34,11 +34,13 @@ EXPORT_SYMBOL_GPL(ath79_ddr_freq);
|
||||
|
||||
enum ath79_soc_type ath79_soc;
|
||||
unsigned int ath79_soc_rev;
|
||||
+EXPORT_SYMBOL_GPL(ath79_soc_rev);
|
||||
|
||||
void __iomem *ath79_pll_base;
|
||||
void __iomem *ath79_reset_base;
|
||||
EXPORT_SYMBOL_GPL(ath79_reset_base);
|
||||
-static void __iomem *ath79_ddr_base;
|
||||
+void __iomem *ath79_ddr_base;
|
||||
+EXPORT_SYMBOL_GPL(ath79_ddr_base);
|
||||
static void __iomem *ath79_ddr_wb_flush_base;
|
||||
static void __iomem *ath79_ddr_pci_win_base;
|
||||
|
||||
--- a/arch/mips/include/asm/mach-ath79/ath79.h
|
||||
+++ b/arch/mips/include/asm/mach-ath79/ath79.h
|
||||
@@ -152,6 +152,7 @@ void ath79_ddr_wb_flush(unsigned int reg
|
||||
void ath79_ddr_set_pci_windows(void);
|
||||
|
||||
extern void __iomem *ath79_pll_base;
|
||||
+extern void __iomem *ath79_ddr_base;
|
||||
extern void __iomem *ath79_reset_base;
|
||||
|
||||
static inline void ath79_pll_wr(unsigned reg, u32 val)
|
@ -1,165 +0,0 @@
|
||||
From 4267880319bc1a2270d352e0ded6d6386242a7ef Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Tue, 12 Aug 2014 20:49:27 +0200
|
||||
Subject: [PATCH 24/53] GPIO: add named gpio exports
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/gpio/gpiolib-of.c | 68 +++++++++++++++++++++++++++++++++++++++++
|
||||
drivers/gpio/gpiolib-sysfs.c | 10 +++++-
|
||||
include/asm-generic/gpio.h | 6 ++++
|
||||
include/linux/gpio/consumer.h | 8 +++++
|
||||
4 files changed, 91 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/gpio/gpiolib-of.c
|
||||
+++ b/drivers/gpio/gpiolib-of.c
|
||||
@@ -23,6 +23,8 @@
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/platform_device.h>
|
||||
|
||||
#include "gpiolib.h"
|
||||
|
||||
@@ -660,3 +662,68 @@ void of_gpiochip_remove(struct gpio_chip
|
||||
gpiochip_remove_pin_ranges(chip);
|
||||
of_node_put(chip->of_node);
|
||||
}
|
||||
+
|
||||
+static struct of_device_id gpio_export_ids[] = {
|
||||
+ { .compatible = "gpio-export" },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+
|
||||
+static int of_gpio_export_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device_node *np = pdev->dev.of_node;
|
||||
+ struct device_node *cnp;
|
||||
+ u32 val;
|
||||
+ int nb = 0;
|
||||
+
|
||||
+ for_each_child_of_node(np, cnp) {
|
||||
+ const char *name = NULL;
|
||||
+ int gpio;
|
||||
+ bool dmc;
|
||||
+ int max_gpio = 1;
|
||||
+ int i;
|
||||
+
|
||||
+ of_property_read_string(cnp, "gpio-export,name", &name);
|
||||
+
|
||||
+ if (!name)
|
||||
+ max_gpio = of_gpio_count(cnp);
|
||||
+
|
||||
+ for (i = 0; i < max_gpio; i++) {
|
||||
+ unsigned flags = 0;
|
||||
+ enum of_gpio_flags of_flags;
|
||||
+
|
||||
+ gpio = of_get_gpio_flags(cnp, i, &of_flags);
|
||||
+ if (!gpio_is_valid(gpio))
|
||||
+ return gpio;
|
||||
+
|
||||
+ if (of_flags == OF_GPIO_ACTIVE_LOW)
|
||||
+ flags |= GPIOF_ACTIVE_LOW;
|
||||
+
|
||||
+ if (!of_property_read_u32(cnp, "gpio-export,output", &val))
|
||||
+ flags |= val ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
|
||||
+ else
|
||||
+ flags |= GPIOF_IN;
|
||||
+
|
||||
+ if (devm_gpio_request_one(&pdev->dev, gpio, flags, name ? name : of_node_full_name(np)))
|
||||
+ continue;
|
||||
+
|
||||
+ dmc = of_property_read_bool(cnp, "gpio-export,direction_may_change");
|
||||
+ gpio_export_with_name(gpio, dmc, name);
|
||||
+ nb++;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ dev_info(&pdev->dev, "%d gpio(s) exported\n", nb);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver gpio_export_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "gpio-export",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = of_match_ptr(gpio_export_ids),
|
||||
+ },
|
||||
+ .probe = of_gpio_export_probe,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(gpio_export_driver);
|
||||
--- a/drivers/gpio/gpiolib-sysfs.c
|
||||
+++ b/drivers/gpio/gpiolib-sysfs.c
|
||||
@@ -568,7 +568,7 @@ static struct class gpio_class = {
|
||||
*
|
||||
* Returns zero on success, else an error.
|
||||
*/
|
||||
-int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
|
||||
+int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name)
|
||||
{
|
||||
struct gpio_chip *chip;
|
||||
struct gpio_device *gdev;
|
||||
@@ -630,6 +630,8 @@ int gpiod_export(struct gpio_desc *desc,
|
||||
offset = gpio_chip_hwgpio(desc);
|
||||
if (chip->names && chip->names[offset])
|
||||
ioname = chip->names[offset];
|
||||
+ if (name)
|
||||
+ ioname = name;
|
||||
|
||||
dev = device_create_with_groups(&gpio_class, &gdev->dev,
|
||||
MKDEV(0, 0), data, gpio_groups,
|
||||
@@ -651,6 +653,12 @@ err_unlock:
|
||||
gpiod_dbg(desc, "%s: status %d\n", __func__, status);
|
||||
return status;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(__gpiod_export);
|
||||
+
|
||||
+int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
|
||||
+{
|
||||
+ return __gpiod_export(desc, direction_may_change, NULL);
|
||||
+}
|
||||
EXPORT_SYMBOL_GPL(gpiod_export);
|
||||
|
||||
static int match_export(struct device *dev, const void *desc)
|
||||
--- a/include/asm-generic/gpio.h
|
||||
+++ b/include/asm-generic/gpio.h
|
||||
@@ -127,6 +127,12 @@ static inline int gpio_export(unsigned g
|
||||
return gpiod_export(gpio_to_desc(gpio), direction_may_change);
|
||||
}
|
||||
|
||||
+int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name);
|
||||
+static inline int gpio_export_with_name(unsigned gpio, bool direction_may_change, const char *name)
|
||||
+{
|
||||
+ return __gpiod_export(gpio_to_desc(gpio), direction_may_change, name);
|
||||
+}
|
||||
+
|
||||
static inline int gpio_export_link(struct device *dev, const char *name,
|
||||
unsigned gpio)
|
||||
{
|
||||
--- a/include/linux/gpio/consumer.h
|
||||
+++ b/include/linux/gpio/consumer.h
|
||||
@@ -533,6 +533,7 @@ struct gpio_desc *devm_fwnode_get_gpiod_
|
||||
|
||||
#if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS)
|
||||
|
||||
+int _gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name);
|
||||
int gpiod_export(struct gpio_desc *desc, bool direction_may_change);
|
||||
int gpiod_export_link(struct device *dev, const char *name,
|
||||
struct gpio_desc *desc);
|
||||
@@ -540,6 +541,13 @@ void gpiod_unexport(struct gpio_desc *de
|
||||
|
||||
#else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
|
||||
|
||||
+static inline int _gpiod_export(struct gpio_desc *desc,
|
||||
+ bool direction_may_change,
|
||||
+ const char *name)
|
||||
+{
|
||||
+ return -ENOSYS;
|
||||
+}
|
||||
+
|
||||
static inline int gpiod_export(struct gpio_desc *desc,
|
||||
bool direction_may_change)
|
||||
{
|
@ -1,139 +0,0 @@
|
||||
--- a/arch/mips/pci/pci-ar71xx.c
|
||||
+++ b/arch/mips/pci/pci-ar71xx.c
|
||||
@@ -54,11 +54,9 @@
|
||||
struct ar71xx_pci_controller {
|
||||
struct device_node *np;
|
||||
void __iomem *cfg_base;
|
||||
- int irq;
|
||||
struct pci_controller pci_ctrl;
|
||||
struct resource io_res;
|
||||
struct resource mem_res;
|
||||
- struct irq_domain *domain;
|
||||
};
|
||||
|
||||
/* Byte lane enable bits */
|
||||
@@ -230,104 +228,6 @@ static struct pci_ops ar71xx_pci_ops = {
|
||||
.write = ar71xx_pci_write_config,
|
||||
};
|
||||
|
||||
-static void ar71xx_pci_irq_handler(struct irq_desc *desc)
|
||||
-{
|
||||
- void __iomem *base = ath79_reset_base;
|
||||
- struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
- struct ar71xx_pci_controller *apc = irq_desc_get_handler_data(desc);
|
||||
- u32 pending;
|
||||
-
|
||||
- chained_irq_enter(chip, desc);
|
||||
- pending = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_STATUS) &
|
||||
- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
-
|
||||
- if (pending & AR71XX_PCI_INT_DEV0)
|
||||
- generic_handle_irq(irq_linear_revmap(apc->domain, 1));
|
||||
-
|
||||
- else if (pending & AR71XX_PCI_INT_DEV1)
|
||||
- generic_handle_irq(irq_linear_revmap(apc->domain, 2));
|
||||
-
|
||||
- else if (pending & AR71XX_PCI_INT_DEV2)
|
||||
- generic_handle_irq(irq_linear_revmap(apc->domain, 3));
|
||||
-
|
||||
- else if (pending & AR71XX_PCI_INT_CORE)
|
||||
- generic_handle_irq(irq_linear_revmap(apc->domain, 4));
|
||||
-
|
||||
- else
|
||||
- spurious_interrupt();
|
||||
- chained_irq_exit(chip, desc);
|
||||
-}
|
||||
-
|
||||
-static void ar71xx_pci_irq_unmask(struct irq_data *d)
|
||||
-{
|
||||
- struct ar71xx_pci_controller *apc;
|
||||
- unsigned int irq;
|
||||
- void __iomem *base = ath79_reset_base;
|
||||
- u32 t;
|
||||
-
|
||||
- apc = irq_data_get_irq_chip_data(d);
|
||||
- irq = irq_linear_revmap(apc->domain, d->irq);
|
||||
-
|
||||
- t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
- __raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
-
|
||||
- /* flush write */
|
||||
- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
-}
|
||||
-
|
||||
-static void ar71xx_pci_irq_mask(struct irq_data *d)
|
||||
-{
|
||||
- struct ar71xx_pci_controller *apc;
|
||||
- unsigned int irq;
|
||||
- void __iomem *base = ath79_reset_base;
|
||||
- u32 t;
|
||||
-
|
||||
- apc = irq_data_get_irq_chip_data(d);
|
||||
- irq = irq_linear_revmap(apc->domain, d->irq);
|
||||
-
|
||||
- t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
- __raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
-
|
||||
- /* flush write */
|
||||
- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
-}
|
||||
-
|
||||
-static struct irq_chip ar71xx_pci_irq_chip = {
|
||||
- .name = "AR71XX PCI",
|
||||
- .irq_mask = ar71xx_pci_irq_mask,
|
||||
- .irq_unmask = ar71xx_pci_irq_unmask,
|
||||
- .irq_mask_ack = ar71xx_pci_irq_mask,
|
||||
-};
|
||||
-
|
||||
-static int ar71xx_pci_irq_map(struct irq_domain *d,
|
||||
- unsigned int irq, irq_hw_number_t hw)
|
||||
-{
|
||||
- struct ar71xx_pci_controller *apc = d->host_data;
|
||||
-
|
||||
- irq_set_chip_and_handler(irq, &ar71xx_pci_irq_chip, handle_level_irq);
|
||||
- irq_set_chip_data(irq, apc);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static const struct irq_domain_ops ar71xx_pci_domain_ops = {
|
||||
- .xlate = irq_domain_xlate_onecell,
|
||||
- .map = ar71xx_pci_irq_map,
|
||||
-};
|
||||
-
|
||||
-static void ar71xx_pci_irq_init(struct ar71xx_pci_controller *apc)
|
||||
-{
|
||||
- void __iomem *base = ath79_reset_base;
|
||||
-
|
||||
- __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
- __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_STATUS);
|
||||
-
|
||||
- apc->domain = irq_domain_add_linear(apc->np, AR71XX_PCI_IRQ_COUNT,
|
||||
- &ar71xx_pci_domain_ops, apc);
|
||||
- irq_set_chained_handler_and_data(apc->irq, ar71xx_pci_irq_handler,
|
||||
- apc);
|
||||
-}
|
||||
-
|
||||
static void ar71xx_pci_reset(void)
|
||||
{
|
||||
ath79_device_reset_set(AR71XX_RESET_PCI_BUS | AR71XX_RESET_PCI_CORE);
|
||||
@@ -361,10 +261,6 @@ static int ar71xx_pci_probe(struct platf
|
||||
if (IS_ERR(apc->cfg_base))
|
||||
return PTR_ERR(apc->cfg_base);
|
||||
|
||||
- apc->irq = platform_get_irq(pdev, 0);
|
||||
- if (apc->irq < 0)
|
||||
- return -EINVAL;
|
||||
-
|
||||
ar71xx_pci_reset();
|
||||
|
||||
/* setup COMMAND register */
|
||||
@@ -375,8 +271,6 @@ static int ar71xx_pci_probe(struct platf
|
||||
/* clear bus errors */
|
||||
ar71xx_pci_check_error(apc, 1);
|
||||
|
||||
- ar71xx_pci_irq_init(apc);
|
||||
-
|
||||
apc->np = pdev->dev.of_node;
|
||||
apc->pci_ctrl.pci_ops = &ar71xx_pci_ops;
|
||||
apc->pci_ctrl.mem_resource = &apc->mem_res;
|
@ -1,21 +0,0 @@
|
||||
commit f3ffac90bc7266b7d917616f3233f58e8c08a196
|
||||
Author: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Fri Aug 10 23:24:47 2018 +0200
|
||||
|
||||
ath79: gmac: add parsers for rxd(v)- and tx(d|en)-delay for AR9344
|
||||
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
|
||||
--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
|
||||
+++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
|
||||
@@ -1229,6 +1229,10 @@
|
||||
#define AR934X_ETH_CFG_RDV_DELAY BIT(16)
|
||||
#define AR934X_ETH_CFG_RDV_DELAY_MASK 0x3
|
||||
#define AR934X_ETH_CFG_RDV_DELAY_SHIFT 16
|
||||
+#define AR934X_ETH_CFG_TXD_DELAY_MASK 0x3
|
||||
+#define AR934X_ETH_CFG_TXD_DELAY_SHIFT 18
|
||||
+#define AR934X_ETH_CFG_TXE_DELAY_MASK 0x3
|
||||
+#define AR934X_ETH_CFG_TXE_DELAY_SHIFT 20
|
||||
|
||||
/*
|
||||
* QCA953X GMAC Interface
|
@ -1,18 +0,0 @@
|
||||
HACK: register the GPIO driver earlier to ensure that gpio_request calls
|
||||
from mach files succeed.
|
||||
|
||||
--- a/drivers/gpio/gpio-ath79.c
|
||||
+++ b/drivers/gpio/gpio-ath79.c
|
||||
@@ -325,7 +325,11 @@ static struct platform_driver ath79_gpio
|
||||
.remove = ath79_gpio_remove,
|
||||
};
|
||||
|
||||
-module_platform_driver(ath79_gpio_driver);
|
||||
+static int __init ath79_gpio_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&ath79_gpio_driver);
|
||||
+}
|
||||
+postcore_initcall(ath79_gpio_init);
|
||||
|
||||
MODULE_DESCRIPTION("Atheros AR71XX/AR724X/AR913X GPIO API support");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -1,64 +0,0 @@
|
||||
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
|
||||
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
|
||||
@@ -1634,8 +1634,8 @@ static int __xipram do_write_oneword(str
|
||||
break;
|
||||
}
|
||||
|
||||
- if (chip_ready(map, adr))
|
||||
- break;
|
||||
+ if (chip_good(map, adr, datum))
|
||||
+ goto enable_xip;
|
||||
|
||||
/* Latency issues. Drop the lock, wait a while and retry */
|
||||
UDELAY(map, chip, adr, 1);
|
||||
@@ -1651,6 +1651,8 @@ static int __xipram do_write_oneword(str
|
||||
|
||||
ret = -EIO;
|
||||
}
|
||||
+
|
||||
+ enable_xip:
|
||||
xip_enable(map, chip, adr);
|
||||
op_done:
|
||||
if (mode == FL_OTP_WRITE)
|
||||
@@ -2229,7 +2231,6 @@ static int cfi_amdstd_panic_write(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
-
|
||||
/*
|
||||
* Handle devices with one erase region, that only implement
|
||||
* the chip erase command.
|
||||
@@ -2297,7 +2298,7 @@ static int __xipram do_erase_chip(struct
|
||||
}
|
||||
|
||||
if (chip_good(map, adr, map_word_ff(map)))
|
||||
- break;
|
||||
+ goto op_done;
|
||||
|
||||
if (time_after(jiffies, timeo)) {
|
||||
printk(KERN_WARNING "MTD %s(): software timeout\n",
|
||||
@@ -2321,6 +2322,7 @@ static int __xipram do_erase_chip(struct
|
||||
}
|
||||
}
|
||||
|
||||
+ op_done:
|
||||
chip->state = FL_READY;
|
||||
xip_enable(map, chip, adr);
|
||||
DISABLE_VPP(map);
|
||||
@@ -2393,7 +2395,7 @@ static int __xipram do_erase_oneblock(st
|
||||
}
|
||||
|
||||
if (chip_good(map, adr, map_word_ff(map)))
|
||||
- break;
|
||||
+ goto op_done;
|
||||
|
||||
if (time_after(jiffies, timeo)) {
|
||||
printk(KERN_WARNING "MTD %s(): software timeout\n",
|
||||
@@ -2417,6 +2419,7 @@ static int __xipram do_erase_oneblock(st
|
||||
}
|
||||
}
|
||||
|
||||
+ op_done:
|
||||
chip->state = FL_READY;
|
||||
xip_enable(map, chip, adr);
|
||||
DISABLE_VPP(map);
|
@ -1,20 +0,0 @@
|
||||
--- a/drivers/mtd/parsers/Makefile
|
||||
+++ b/drivers/mtd/parsers/Makefile
|
||||
@@ -1,2 +1,3 @@
|
||||
+obj-$(CONFIG_MTD_PARSER_CYBERTAN) += parser_cybertan.o
|
||||
obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o
|
||||
obj-$(CONFIG_MTD_SHARPSL_PARTS) += sharpslpart.o
|
||||
--- a/drivers/mtd/parsers/Kconfig
|
||||
+++ b/drivers/mtd/parsers/Kconfig
|
||||
@@ -1,3 +1,11 @@
|
||||
+config MTD_PARSER_CYBERTAN
|
||||
+ tristate "Parser for Cybertan format partitions"
|
||||
+ depends on MTD && (ATH79 || COMPILE_TEST)
|
||||
+ help
|
||||
+ Cybertan has a proprietory header than encompasses a Broadcom trx
|
||||
+ header. This driver will parse the header and take care of the
|
||||
+ special offsets that result in the extra headers.
|
||||
+
|
||||
config MTD_PARSER_TRX
|
||||
tristate "Parser for TRX format partitions"
|
||||
depends on MTD && (BCM47XX || ARCH_BCM_5301X || COMPILE_TEST)
|
@ -1,25 +0,0 @@
|
||||
--- a/drivers/mtd/Kconfig
|
||||
+++ b/drivers/mtd/Kconfig
|
||||
@@ -193,6 +193,12 @@ config MTD_MYLOADER_PARTS
|
||||
You will still need the parsing functions to be called by the driver
|
||||
for your particular device. It won't happen automatically.
|
||||
|
||||
+config MTD_TPLINK_PARTS
|
||||
+ tristate "TP-Link AR7XXX/AR9XXX partitioning support"
|
||||
+ depends on ATH79
|
||||
+ ---help---
|
||||
+ TBD.
|
||||
+
|
||||
comment "User Modules And Translation Layers"
|
||||
|
||||
#
|
||||
--- a/drivers/mtd/Makefile
|
||||
+++ b/drivers/mtd/Makefile
|
||||
@@ -18,6 +18,7 @@ obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63
|
||||
obj-$(CONFIG_MTD_BCM47XX_PARTS) += bcm47xxpart.o
|
||||
obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
|
||||
obj-y += parsers/
|
||||
+obj-$(CONFIG_MTD_TPLINK_PARTS) += tplinkpart.o
|
||||
|
||||
# 'Users' - code which presents functionality to userspace.
|
||||
obj-$(CONFIG_MTD_BLKDEVS) += mtd_blkdevs.o
|
@ -1,28 +0,0 @@
|
||||
--- a/drivers/net/ethernet/atheros/Kconfig
|
||||
+++ b/drivers/net/ethernet/atheros/Kconfig
|
||||
@@ -5,7 +5,7 @@
|
||||
config NET_VENDOR_ATHEROS
|
||||
bool "Atheros devices"
|
||||
default y
|
||||
- depends on PCI
|
||||
+ depends on (PCI || ATH79)
|
||||
---help---
|
||||
If you have a network (Ethernet) card belonging to this class, say Y.
|
||||
|
||||
@@ -78,4 +78,6 @@ config ALX
|
||||
To compile this driver as a module, choose M here. The module
|
||||
will be called alx.
|
||||
|
||||
+source drivers/net/ethernet/atheros/ag71xx/Kconfig
|
||||
+
|
||||
endif # NET_VENDOR_ATHEROS
|
||||
--- a/drivers/net/ethernet/atheros/Makefile
|
||||
+++ b/drivers/net/ethernet/atheros/Makefile
|
||||
@@ -3,6 +3,7 @@
|
||||
# Makefile for the Atheros network device drivers.
|
||||
#
|
||||
|
||||
+obj-$(CONFIG_AG71XX) += ag71xx/
|
||||
obj-$(CONFIG_ATL1) += atlx/
|
||||
obj-$(CONFIG_ATL2) += atlx/
|
||||
obj-$(CONFIG_ATL1E) += atl1e/
|
@ -1,12 +0,0 @@
|
||||
--- a/drivers/Makefile
|
||||
+++ b/drivers/Makefile
|
||||
@@ -80,8 +80,8 @@ obj-y += scsi/
|
||||
obj-y += nvme/
|
||||
obj-$(CONFIG_ATA) += ata/
|
||||
obj-$(CONFIG_TARGET_CORE) += target/
|
||||
-obj-$(CONFIG_MTD) += mtd/
|
||||
obj-$(CONFIG_SPI) += spi/
|
||||
+obj-$(CONFIG_MTD) += mtd/
|
||||
obj-$(CONFIG_SPMI) += spmi/
|
||||
obj-$(CONFIG_HSI) += hsi/
|
||||
obj-$(CONFIG_SLIMBUS) += slimbus/
|
@ -1,98 +0,0 @@
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/include/asm/mach-ath79/mangle-port.h
|
||||
@@ -0,0 +1,37 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
|
||||
+ *
|
||||
+ * This file was derived from: inlude/asm-mips/mach-generic/mangle-port.h
|
||||
+ * Copyright (C) 2003, 2004 Ralf Baechle
|
||||
+ *
|
||||
+ * 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 __ASM_MACH_ATH79_MANGLE_PORT_H
|
||||
+#define __ASM_MACH_ATH79_MANGLE_PORT_H
|
||||
+
|
||||
+#ifdef CONFIG_PCI_AR71XX
|
||||
+extern unsigned long (ath79_pci_swizzle_b)(unsigned long port);
|
||||
+extern unsigned long (ath79_pci_swizzle_w)(unsigned long port);
|
||||
+#else
|
||||
+#define ath79_pci_swizzle_b(port) (port)
|
||||
+#define ath79_pci_swizzle_w(port) (port)
|
||||
+#endif
|
||||
+
|
||||
+#define __swizzle_addr_b(port) ath79_pci_swizzle_b(port)
|
||||
+#define __swizzle_addr_w(port) ath79_pci_swizzle_w(port)
|
||||
+#define __swizzle_addr_l(port) (port)
|
||||
+#define __swizzle_addr_q(port) (port)
|
||||
+
|
||||
+# define ioswabb(a, x) (x)
|
||||
+# define __mem_ioswabb(a, x) (x)
|
||||
+# define ioswabw(a, x) (x)
|
||||
+# define __mem_ioswabw(a, x) cpu_to_le16(x)
|
||||
+# define ioswabl(a, x) (x)
|
||||
+# define __mem_ioswabl(a, x) cpu_to_le32(x)
|
||||
+# define ioswabq(a, x) (x)
|
||||
+# define __mem_ioswabq(a, x) cpu_to_le64(x)
|
||||
+
|
||||
+#endif /* __ASM_MACH_ATH79_MANGLE_PORT_H */
|
||||
--- a/arch/mips/pci/pci-ar71xx.c
|
||||
+++ b/arch/mips/pci/pci-ar71xx.c
|
||||
@@ -71,6 +71,45 @@ static const u32 ar71xx_pci_read_mask[8]
|
||||
0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0
|
||||
};
|
||||
|
||||
+static unsigned long (*__ath79_pci_swizzle_b)(unsigned long port);
|
||||
+static unsigned long (*__ath79_pci_swizzle_w)(unsigned long port);
|
||||
+
|
||||
+static inline bool ar71xx_is_pci_addr(unsigned long port)
|
||||
+{
|
||||
+ unsigned long phys = CPHYSADDR(port);
|
||||
+
|
||||
+ return (phys >= AR71XX_PCI_MEM_BASE &&
|
||||
+ phys < AR71XX_PCI_MEM_BASE + AR71XX_PCI_MEM_SIZE);
|
||||
+}
|
||||
+
|
||||
+static unsigned long ar71xx_pci_swizzle_b(unsigned long port)
|
||||
+{
|
||||
+ return ar71xx_is_pci_addr(port) ? port ^ 3 : port;
|
||||
+}
|
||||
+
|
||||
+static unsigned long ar71xx_pci_swizzle_w(unsigned long port)
|
||||
+{
|
||||
+ return ar71xx_is_pci_addr(port) ? port ^ 2 : port;
|
||||
+}
|
||||
+
|
||||
+unsigned long ath79_pci_swizzle_b(unsigned long port)
|
||||
+{
|
||||
+ if (__ath79_pci_swizzle_b)
|
||||
+ return __ath79_pci_swizzle_b(port);
|
||||
+
|
||||
+ return port;
|
||||
+}
|
||||
+EXPORT_SYMBOL(ath79_pci_swizzle_b);
|
||||
+
|
||||
+unsigned long ath79_pci_swizzle_w(unsigned long port)
|
||||
+{
|
||||
+ if (__ath79_pci_swizzle_w)
|
||||
+ return __ath79_pci_swizzle_w(port);
|
||||
+
|
||||
+ return port;
|
||||
+}
|
||||
+EXPORT_SYMBOL(ath79_pci_swizzle_w);
|
||||
+
|
||||
static inline u32 ar71xx_pci_get_ble(int where, int size, int local)
|
||||
{
|
||||
u32 t;
|
||||
@@ -279,6 +318,9 @@ static int ar71xx_pci_probe(struct platf
|
||||
|
||||
register_pci_controller(&apc->pci_ctrl);
|
||||
|
||||
+ __ath79_pci_swizzle_b = ar71xx_pci_swizzle_b;
|
||||
+ __ath79_pci_swizzle_w = ar71xx_pci_swizzle_w;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,103 +0,0 @@
|
||||
--- a/drivers/usb/host/ehci-hcd.c
|
||||
+++ b/drivers/usb/host/ehci-hcd.c
|
||||
@@ -239,6 +239,37 @@ int ehci_reset(struct ehci_hcd *ehci)
|
||||
command |= CMD_RESET;
|
||||
dbg_cmd (ehci, "reset", command);
|
||||
ehci_writel(ehci, command, &ehci->regs->command);
|
||||
+
|
||||
+ if (ehci->qca_force_host_mode) {
|
||||
+ u32 usbmode;
|
||||
+
|
||||
+ udelay(1000);
|
||||
+
|
||||
+ usbmode = ehci_readl(ehci, &ehci->regs->usbmode);
|
||||
+ usbmode |= USBMODE_CM_HC | (1 << 4);
|
||||
+ ehci_writel(ehci, usbmode, &ehci->regs->usbmode);
|
||||
+
|
||||
+ ehci_dbg(ehci, "forced host mode, usbmode: %08x\n",
|
||||
+ ehci_readl(ehci, &ehci->regs->usbmode));
|
||||
+ }
|
||||
+
|
||||
+ if (ehci->qca_force_16bit_ptw) {
|
||||
+ u32 port_status;
|
||||
+
|
||||
+ udelay(1000);
|
||||
+
|
||||
+ /* enable 16-bit UTMI interface */
|
||||
+ port_status = ehci_readl(ehci, &ehci->regs->port_status[0]);
|
||||
+ port_status |= BIT(28);
|
||||
+ ehci_writel(ehci, port_status, &ehci->regs->port_status[0]);
|
||||
+
|
||||
+ ehci_dbg(ehci, "16-bit UTMI interface enabled, status: %08x\n",
|
||||
+ ehci_readl(ehci, &ehci->regs->port_status[0]));
|
||||
+ }
|
||||
+
|
||||
+ if (ehci->reset_notifier)
|
||||
+ ehci->reset_notifier(ehci_to_hcd(ehci));
|
||||
+
|
||||
ehci->rh_state = EHCI_RH_HALTED;
|
||||
ehci->next_statechange = jiffies;
|
||||
retval = ehci_handshake(ehci, &ehci->regs->command,
|
||||
--- a/drivers/usb/host/ehci.h
|
||||
+++ b/drivers/usb/host/ehci.h
|
||||
@@ -219,6 +219,10 @@ struct ehci_hcd { /* one per controlle
|
||||
unsigned need_oc_pp_cycle:1; /* MPC834X port power */
|
||||
unsigned imx28_write_fix:1; /* For Freescale i.MX28 */
|
||||
unsigned ignore_oc:1;
|
||||
+ unsigned qca_force_host_mode:1;
|
||||
+ unsigned qca_force_16bit_ptw:1; /* force 16 bit UTMI */
|
||||
+
|
||||
+ void (*reset_notifier)(struct usb_hcd *hcd);
|
||||
|
||||
/* required for usb32 quirk */
|
||||
#define OHCI_CTRL_HCFS (3 << 6)
|
||||
--- a/include/linux/usb/ehci_pdriver.h
|
||||
+++ b/include/linux/usb/ehci_pdriver.h
|
||||
@@ -51,6 +51,8 @@ struct usb_ehci_pdata {
|
||||
unsigned reset_on_resume:1;
|
||||
unsigned dma_mask_64:1;
|
||||
unsigned ignore_oc:1;
|
||||
+ unsigned qca_force_host_mode:1;
|
||||
+ unsigned qca_force_16bit_ptw:1;
|
||||
|
||||
/* Turn on all power and clocks */
|
||||
int (*power_on)(struct platform_device *pdev);
|
||||
@@ -60,6 +62,7 @@ struct usb_ehci_pdata {
|
||||
* turn off everything else */
|
||||
void (*power_suspend)(struct platform_device *pdev);
|
||||
int (*pre_setup)(struct usb_hcd *hcd);
|
||||
+ void (*reset_notifier)(struct platform_device *pdev);
|
||||
};
|
||||
|
||||
#endif /* __USB_CORE_EHCI_PDRIVER_H */
|
||||
--- a/drivers/usb/host/ehci-platform.c
|
||||
+++ b/drivers/usb/host/ehci-platform.c
|
||||
@@ -48,6 +48,14 @@ struct ehci_platform_priv {
|
||||
|
||||
static const char hcd_name[] = "ehci-platform";
|
||||
|
||||
+static void ehci_platform_reset_notifier(struct usb_hcd *hcd)
|
||||
+{
|
||||
+ struct platform_device *pdev = to_platform_device(hcd->self.controller);
|
||||
+ struct usb_ehci_pdata *pdata = pdev->dev.platform_data;
|
||||
+
|
||||
+ pdata->reset_notifier(pdev);
|
||||
+}
|
||||
+
|
||||
static int ehci_platform_reset(struct usb_hcd *hcd)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(hcd->self.controller);
|
||||
@@ -215,6 +223,13 @@ static int ehci_platform_probe(struct pl
|
||||
priv->reset_on_resume = true;
|
||||
if (pdata->ignore_oc)
|
||||
ehci->ignore_oc = 1;
|
||||
+ if (pdata->qca_force_host_mode)
|
||||
+ ehci->qca_force_host_mode = 1;
|
||||
+ if (pdata->qca_force_16bit_ptw)
|
||||
+ ehci->qca_force_16bit_ptw = 1;
|
||||
+
|
||||
+ if (pdata->reset_notifier)
|
||||
+ ehci->reset_notifier = ehci_platform_reset_notifier;
|
||||
|
||||
#ifndef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO
|
||||
if (ehci->big_endian_mmio) {
|
@ -1,32 +0,0 @@
|
||||
--- a/drivers/net/phy/mdio-bitbang.c
|
||||
+++ b/drivers/net/phy/mdio-bitbang.c
|
||||
@@ -155,7 +155,7 @@ static int mdiobb_cmd_addr(struct mdiobb
|
||||
static int mdiobb_read(struct mii_bus *bus, int phy, int reg)
|
||||
{
|
||||
struct mdiobb_ctrl *ctrl = bus->priv;
|
||||
- int ret, i;
|
||||
+ int ret;
|
||||
|
||||
if (reg & MII_ADDR_C45) {
|
||||
reg = mdiobb_cmd_addr(ctrl, phy, reg);
|
||||
@@ -165,19 +165,7 @@ static int mdiobb_read(struct mii_bus *b
|
||||
|
||||
ctrl->ops->set_mdio_dir(ctrl, 0);
|
||||
|
||||
- /* check the turnaround bit: the PHY should be driving it to zero, if this
|
||||
- * PHY is listed in phy_ignore_ta_mask as having broken TA, skip that
|
||||
- */
|
||||
- if (mdiobb_get_bit(ctrl) != 0 &&
|
||||
- !(bus->phy_ignore_ta_mask & (1 << phy))) {
|
||||
- /* PHY didn't drive TA low -- flush any bits it
|
||||
- * may be trying to send.
|
||||
- */
|
||||
- for (i = 0; i < 32; i++)
|
||||
- mdiobb_get_bit(ctrl);
|
||||
-
|
||||
- return 0xffff;
|
||||
- }
|
||||
+ mdiobb_get_bit(ctrl);
|
||||
|
||||
ret = mdiobb_get_num(ctrl, 16);
|
||||
mdiobb_get_bit(ctrl);
|
@ -1,61 +0,0 @@
|
||||
From 66e584435ac0de6e0abeb6d7166fe4fe25d6bb73 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Gorski <jogo@openwrt.org>
|
||||
Date: Tue, 16 Jun 2015 13:15:08 +0200
|
||||
Subject: [PATCH] phy/mdio-bitbang: prevent rescheduling during command
|
||||
|
||||
It seems some phys have some maximum timings for accessing the MDIO line,
|
||||
resulting in bit errors under cpu stress. Prevent this from happening by
|
||||
disabling interrupts when sending commands.
|
||||
|
||||
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||
---
|
||||
drivers/net/phy/mdio-bitbang.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
--- a/drivers/net/phy/mdio-bitbang.c
|
||||
+++ b/drivers/net/phy/mdio-bitbang.c
|
||||
@@ -17,6 +17,7 @@
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
+#include <linux/irqflags.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mdio-bitbang.h>
|
||||
#include <linux/types.h>
|
||||
@@ -156,7 +157,9 @@ static int mdiobb_read(struct mii_bus *b
|
||||
{
|
||||
struct mdiobb_ctrl *ctrl = bus->priv;
|
||||
int ret;
|
||||
+ unsigned long flags;
|
||||
|
||||
+ local_irq_save(flags);
|
||||
if (reg & MII_ADDR_C45) {
|
||||
reg = mdiobb_cmd_addr(ctrl, phy, reg);
|
||||
mdiobb_cmd(ctrl, MDIO_C45_READ, phy, reg);
|
||||
@@ -169,13 +172,17 @@ static int mdiobb_read(struct mii_bus *b
|
||||
|
||||
ret = mdiobb_get_num(ctrl, 16);
|
||||
mdiobb_get_bit(ctrl);
|
||||
+ local_irq_restore(flags);
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mdiobb_write(struct mii_bus *bus, int phy, int reg, u16 val)
|
||||
{
|
||||
struct mdiobb_ctrl *ctrl = bus->priv;
|
||||
+ unsigned long flags;
|
||||
|
||||
+ local_irq_save(flags);
|
||||
if (reg & MII_ADDR_C45) {
|
||||
reg = mdiobb_cmd_addr(ctrl, phy, reg);
|
||||
mdiobb_cmd(ctrl, MDIO_C45_WRITE, phy, reg);
|
||||
@@ -190,6 +197,8 @@ static int mdiobb_write(struct mii_bus *
|
||||
|
||||
ctrl->ops->set_mdio_dir(ctrl, 0);
|
||||
mdiobb_get_bit(ctrl);
|
||||
+ local_irq_restore(flags);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,891 +0,0 @@
|
||||
--- a/arch/mips/include/asm/checksum.h
|
||||
+++ b/arch/mips/include/asm/checksum.h
|
||||
@@ -134,26 +134,30 @@ static inline __sum16 ip_fast_csum(const
|
||||
const unsigned int *stop = word + ihl;
|
||||
unsigned int csum;
|
||||
int carry;
|
||||
+ unsigned int w;
|
||||
|
||||
- csum = word[0];
|
||||
- csum += word[1];
|
||||
- carry = (csum < word[1]);
|
||||
+ csum = net_hdr_word(word++);
|
||||
+
|
||||
+ w = net_hdr_word(word++);
|
||||
+ csum += w;
|
||||
+ carry = (csum < w);
|
||||
csum += carry;
|
||||
|
||||
- csum += word[2];
|
||||
- carry = (csum < word[2]);
|
||||
+ w = net_hdr_word(word++);
|
||||
+ csum += w;
|
||||
+ carry = (csum < w);
|
||||
csum += carry;
|
||||
|
||||
- csum += word[3];
|
||||
- carry = (csum < word[3]);
|
||||
+ w = net_hdr_word(word++);
|
||||
+ csum += w;
|
||||
+ carry = (csum < w);
|
||||
csum += carry;
|
||||
|
||||
- word += 4;
|
||||
do {
|
||||
- csum += *word;
|
||||
- carry = (csum < *word);
|
||||
+ w = net_hdr_word(word++);
|
||||
+ csum += w;
|
||||
+ carry = (csum < w);
|
||||
csum += carry;
|
||||
- word++;
|
||||
} while (word != stop);
|
||||
|
||||
return csum_fold(csum);
|
||||
@@ -214,73 +218,6 @@ static inline __sum16 ip_compute_csum(co
|
||||
return csum_fold(csum_partial(buff, len, 0));
|
||||
}
|
||||
|
||||
-#define _HAVE_ARCH_IPV6_CSUM
|
||||
-static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
|
||||
- const struct in6_addr *daddr,
|
||||
- __u32 len, __u8 proto,
|
||||
- __wsum sum)
|
||||
-{
|
||||
- __wsum tmp;
|
||||
-
|
||||
- __asm__(
|
||||
- " .set push # csum_ipv6_magic\n"
|
||||
- " .set noreorder \n"
|
||||
- " .set noat \n"
|
||||
- " addu %0, %5 # proto (long in network byte order)\n"
|
||||
- " sltu $1, %0, %5 \n"
|
||||
- " addu %0, $1 \n"
|
||||
-
|
||||
- " addu %0, %6 # csum\n"
|
||||
- " sltu $1, %0, %6 \n"
|
||||
- " lw %1, 0(%2) # four words source address\n"
|
||||
- " addu %0, $1 \n"
|
||||
- " addu %0, %1 \n"
|
||||
- " sltu $1, %0, %1 \n"
|
||||
-
|
||||
- " lw %1, 4(%2) \n"
|
||||
- " addu %0, $1 \n"
|
||||
- " addu %0, %1 \n"
|
||||
- " sltu $1, %0, %1 \n"
|
||||
-
|
||||
- " lw %1, 8(%2) \n"
|
||||
- " addu %0, $1 \n"
|
||||
- " addu %0, %1 \n"
|
||||
- " sltu $1, %0, %1 \n"
|
||||
-
|
||||
- " lw %1, 12(%2) \n"
|
||||
- " addu %0, $1 \n"
|
||||
- " addu %0, %1 \n"
|
||||
- " sltu $1, %0, %1 \n"
|
||||
-
|
||||
- " lw %1, 0(%3) \n"
|
||||
- " addu %0, $1 \n"
|
||||
- " addu %0, %1 \n"
|
||||
- " sltu $1, %0, %1 \n"
|
||||
-
|
||||
- " lw %1, 4(%3) \n"
|
||||
- " addu %0, $1 \n"
|
||||
- " addu %0, %1 \n"
|
||||
- " sltu $1, %0, %1 \n"
|
||||
-
|
||||
- " lw %1, 8(%3) \n"
|
||||
- " addu %0, $1 \n"
|
||||
- " addu %0, %1 \n"
|
||||
- " sltu $1, %0, %1 \n"
|
||||
-
|
||||
- " lw %1, 12(%3) \n"
|
||||
- " addu %0, $1 \n"
|
||||
- " addu %0, %1 \n"
|
||||
- " sltu $1, %0, %1 \n"
|
||||
-
|
||||
- " addu %0, $1 # Add final carry\n"
|
||||
- " .set pop"
|
||||
- : "=&r" (sum), "=&r" (tmp)
|
||||
- : "r" (saddr), "r" (daddr),
|
||||
- "0" (htonl(len)), "r" (htonl(proto)), "r" (sum));
|
||||
-
|
||||
- return csum_fold(sum);
|
||||
-}
|
||||
-
|
||||
#include <asm-generic/checksum.h>
|
||||
#endif /* CONFIG_GENERIC_CSUM */
|
||||
|
||||
--- a/include/uapi/linux/ip.h
|
||||
+++ b/include/uapi/linux/ip.h
|
||||
@@ -103,7 +103,7 @@ struct iphdr {
|
||||
__be32 saddr;
|
||||
__be32 daddr;
|
||||
/*The options start here. */
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
|
||||
struct ip_auth_hdr {
|
||||
--- a/include/uapi/linux/ipv6.h
|
||||
+++ b/include/uapi/linux/ipv6.h
|
||||
@@ -131,7 +131,7 @@ struct ipv6hdr {
|
||||
|
||||
struct in6_addr saddr;
|
||||
struct in6_addr daddr;
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
|
||||
/* index values for the variables in ipv6_devconf */
|
||||
--- a/include/uapi/linux/tcp.h
|
||||
+++ b/include/uapi/linux/tcp.h
|
||||
@@ -55,7 +55,7 @@ struct tcphdr {
|
||||
__be16 window;
|
||||
__sum16 check;
|
||||
__be16 urg_ptr;
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
/*
|
||||
* The union cast uses a gcc extension to avoid aliasing problems
|
||||
@@ -65,7 +65,7 @@ struct tcphdr {
|
||||
union tcp_word_hdr {
|
||||
struct tcphdr hdr;
|
||||
__be32 words[5];
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3])
|
||||
|
||||
--- a/include/uapi/linux/udp.h
|
||||
+++ b/include/uapi/linux/udp.h
|
||||
@@ -25,7 +25,7 @@ struct udphdr {
|
||||
__be16 dest;
|
||||
__be16 len;
|
||||
__sum16 check;
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
/* UDP socket options */
|
||||
#define UDP_CORK 1 /* Never send partially complete segments */
|
||||
--- a/net/netfilter/nf_conntrack_core.c
|
||||
+++ b/net/netfilter/nf_conntrack_core.c
|
||||
@@ -263,8 +263,8 @@ nf_ct_get_tuple(const struct sk_buff *sk
|
||||
|
||||
switch (l3num) {
|
||||
case NFPROTO_IPV4:
|
||||
- tuple->src.u3.ip = ap[0];
|
||||
- tuple->dst.u3.ip = ap[1];
|
||||
+ tuple->src.u3.ip = net_hdr_word(ap++);
|
||||
+ tuple->dst.u3.ip = net_hdr_word(ap);
|
||||
break;
|
||||
case NFPROTO_IPV6:
|
||||
memcpy(tuple->src.u3.ip6, ap, sizeof(tuple->src.u3.ip6));
|
||||
--- a/include/uapi/linux/icmp.h
|
||||
+++ b/include/uapi/linux/icmp.h
|
||||
@@ -82,7 +82,7 @@ struct icmphdr {
|
||||
} frag;
|
||||
__u8 reserved[4];
|
||||
} un;
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
|
||||
/*
|
||||
--- a/include/uapi/linux/in6.h
|
||||
+++ b/include/uapi/linux/in6.h
|
||||
@@ -43,7 +43,7 @@ struct in6_addr {
|
||||
#define s6_addr16 in6_u.u6_addr16
|
||||
#define s6_addr32 in6_u.u6_addr32
|
||||
#endif
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
#endif /* __UAPI_DEF_IN6_ADDR */
|
||||
|
||||
#if __UAPI_DEF_SOCKADDR_IN6
|
||||
--- a/net/ipv6/tcp_ipv6.c
|
||||
+++ b/net/ipv6/tcp_ipv6.c
|
||||
@@ -39,6 +39,7 @@
|
||||
#include <linux/ipsec.h>
|
||||
#include <linux/times.h>
|
||||
#include <linux/slab.h>
|
||||
+#include <asm/unaligned.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/icmpv6.h>
|
||||
@@ -836,10 +837,10 @@ static void tcp_v6_send_response(const s
|
||||
topt = (__be32 *)(t1 + 1);
|
||||
|
||||
if (tsecr) {
|
||||
- *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
|
||||
- (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
|
||||
- *topt++ = htonl(tsval);
|
||||
- *topt++ = htonl(tsecr);
|
||||
+ put_unaligned_be32((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
|
||||
+ (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP, topt++);
|
||||
+ put_unaligned_be32(tsval, topt++);
|
||||
+ put_unaligned_be32(tsecr, topt++);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
--- a/include/linux/ipv6.h
|
||||
+++ b/include/linux/ipv6.h
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
#define ipv6_optlen(p) (((p)->hdrlen+1) << 3)
|
||||
#define ipv6_authlen(p) (((p)->hdrlen+2) << 2)
|
||||
+
|
||||
/*
|
||||
* This structure contains configuration options per IPv6 link.
|
||||
*/
|
||||
--- a/net/ipv6/datagram.c
|
||||
+++ b/net/ipv6/datagram.c
|
||||
@@ -478,7 +478,7 @@ int ipv6_recv_error(struct sock *sk, str
|
||||
ipv6_iface_scope_id(&sin->sin6_addr,
|
||||
IP6CB(skb)->iif);
|
||||
} else {
|
||||
- ipv6_addr_set_v4mapped(*(__be32 *)(nh + serr->addr_offset),
|
||||
+ ipv6_addr_set_v4mapped(net_hdr_word(nh + serr->addr_offset),
|
||||
&sin->sin6_addr);
|
||||
sin->sin6_scope_id = 0;
|
||||
}
|
||||
@@ -828,12 +828,12 @@ int ip6_datagram_send_ctl(struct net *ne
|
||||
}
|
||||
|
||||
if (fl6->flowlabel&IPV6_FLOWINFO_MASK) {
|
||||
- if ((fl6->flowlabel^*(__be32 *)CMSG_DATA(cmsg))&~IPV6_FLOWINFO_MASK) {
|
||||
+ if ((fl6->flowlabel^net_hdr_word(CMSG_DATA(cmsg)))&~IPV6_FLOWINFO_MASK) {
|
||||
err = -EINVAL;
|
||||
goto exit_f;
|
||||
}
|
||||
}
|
||||
- fl6->flowlabel = IPV6_FLOWINFO_MASK & *(__be32 *)CMSG_DATA(cmsg);
|
||||
+ fl6->flowlabel = IPV6_FLOWINFO_MASK & net_hdr_word(CMSG_DATA(cmsg));
|
||||
break;
|
||||
|
||||
case IPV6_2292HOPOPTS:
|
||||
--- a/net/ipv6/ip6_gre.c
|
||||
+++ b/net/ipv6/ip6_gre.c
|
||||
@@ -452,7 +452,7 @@ static void ip6gre_err(struct sk_buff *s
|
||||
return;
|
||||
ipv6h = (const struct ipv6hdr *)skb->data;
|
||||
greh = (const struct gre_base_hdr *)(skb->data + offset);
|
||||
- key = key_off ? *(__be32 *)(skb->data + key_off) : 0;
|
||||
+ key = key_off ? net_hdr_word((__be32 *)(skb->data + key_off)) : 0;
|
||||
|
||||
t = ip6gre_tunnel_lookup(skb->dev, &ipv6h->daddr, &ipv6h->saddr,
|
||||
key, greh->protocol);
|
||||
--- a/net/ipv6/exthdrs.c
|
||||
+++ b/net/ipv6/exthdrs.c
|
||||
@@ -756,7 +756,7 @@ static bool ipv6_hop_jumbo(struct sk_buf
|
||||
goto drop;
|
||||
}
|
||||
|
||||
- pkt_len = ntohl(*(__be32 *)(nh + optoff + 2));
|
||||
+ pkt_len = ntohl(net_hdr_word(nh + optoff + 2));
|
||||
if (pkt_len <= IPV6_MAXPLEN) {
|
||||
__IP6_INC_STATS(net, idev, IPSTATS_MIB_INHDRERRORS);
|
||||
icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2);
|
||||
--- a/include/linux/types.h
|
||||
+++ b/include/linux/types.h
|
||||
@@ -230,5 +230,11 @@ struct callback_head {
|
||||
typedef void (*rcu_callback_t)(struct rcu_head *head);
|
||||
typedef void (*call_rcu_func_t)(struct rcu_head *head, rcu_callback_t func);
|
||||
|
||||
+struct net_hdr_word {
|
||||
+ u32 words[1];
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
+
|
||||
+#define net_hdr_word(_p) (((struct net_hdr_word *) (_p))->words[0])
|
||||
+
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* _LINUX_TYPES_H */
|
||||
--- a/net/ipv4/af_inet.c
|
||||
+++ b/net/ipv4/af_inet.c
|
||||
@@ -1422,8 +1422,8 @@ struct sk_buff *inet_gro_receive(struct
|
||||
if (unlikely(ip_fast_csum((u8 *)iph, 5)))
|
||||
goto out_unlock;
|
||||
|
||||
- id = ntohl(*(__be32 *)&iph->id);
|
||||
- flush = (u16)((ntohl(*(__be32 *)iph) ^ skb_gro_len(skb)) | (id & ~IP_DF));
|
||||
+ id = ntohl(net_hdr_word(&iph->id));
|
||||
+ flush = (u16)((ntohl(net_hdr_word(iph)) ^ skb_gro_len(skb)) | (id & ~IP_DF));
|
||||
id >>= 16;
|
||||
|
||||
list_for_each_entry(p, head, list) {
|
||||
--- a/net/ipv4/route.c
|
||||
+++ b/net/ipv4/route.c
|
||||
@@ -448,7 +448,7 @@ static struct neighbour *ipv4_neigh_look
|
||||
else if (skb)
|
||||
pkey = &ip_hdr(skb)->daddr;
|
||||
|
||||
- n = __ipv4_neigh_lookup(dev, *(__force u32 *)pkey);
|
||||
+ n = __ipv4_neigh_lookup(dev, net_hdr_word(pkey));
|
||||
if (n)
|
||||
return n;
|
||||
return neigh_create(&arp_tbl, pkey, dev);
|
||||
--- a/net/ipv4/tcp_output.c
|
||||
+++ b/net/ipv4/tcp_output.c
|
||||
@@ -461,48 +461,53 @@ static void tcp_options_write(__be32 *pt
|
||||
u16 options = opts->options; /* mungable copy */
|
||||
|
||||
if (unlikely(OPTION_MD5 & options)) {
|
||||
- *ptr++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
|
||||
- (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG);
|
||||
+ net_hdr_word(ptr++) =
|
||||
+ htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
|
||||
+ (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG);
|
||||
/* overload cookie hash location */
|
||||
opts->hash_location = (__u8 *)ptr;
|
||||
ptr += 4;
|
||||
}
|
||||
|
||||
if (unlikely(opts->mss)) {
|
||||
- *ptr++ = htonl((TCPOPT_MSS << 24) |
|
||||
- (TCPOLEN_MSS << 16) |
|
||||
- opts->mss);
|
||||
+ net_hdr_word(ptr++) =
|
||||
+ htonl((TCPOPT_MSS << 24) | (TCPOLEN_MSS << 16) |
|
||||
+ opts->mss);
|
||||
}
|
||||
|
||||
if (likely(OPTION_TS & options)) {
|
||||
if (unlikely(OPTION_SACK_ADVERTISE & options)) {
|
||||
- *ptr++ = htonl((TCPOPT_SACK_PERM << 24) |
|
||||
- (TCPOLEN_SACK_PERM << 16) |
|
||||
- (TCPOPT_TIMESTAMP << 8) |
|
||||
- TCPOLEN_TIMESTAMP);
|
||||
+ net_hdr_word(ptr++) =
|
||||
+ htonl((TCPOPT_SACK_PERM << 24) |
|
||||
+ (TCPOLEN_SACK_PERM << 16) |
|
||||
+ (TCPOPT_TIMESTAMP << 8) |
|
||||
+ TCPOLEN_TIMESTAMP);
|
||||
options &= ~OPTION_SACK_ADVERTISE;
|
||||
} else {
|
||||
- *ptr++ = htonl((TCPOPT_NOP << 24) |
|
||||
- (TCPOPT_NOP << 16) |
|
||||
- (TCPOPT_TIMESTAMP << 8) |
|
||||
- TCPOLEN_TIMESTAMP);
|
||||
+ net_hdr_word(ptr++) =
|
||||
+ htonl((TCPOPT_NOP << 24) |
|
||||
+ (TCPOPT_NOP << 16) |
|
||||
+ (TCPOPT_TIMESTAMP << 8) |
|
||||
+ TCPOLEN_TIMESTAMP);
|
||||
}
|
||||
- *ptr++ = htonl(opts->tsval);
|
||||
- *ptr++ = htonl(opts->tsecr);
|
||||
+ net_hdr_word(ptr++) = htonl(opts->tsval);
|
||||
+ net_hdr_word(ptr++) = htonl(opts->tsecr);
|
||||
}
|
||||
|
||||
if (unlikely(OPTION_SACK_ADVERTISE & options)) {
|
||||
- *ptr++ = htonl((TCPOPT_NOP << 24) |
|
||||
- (TCPOPT_NOP << 16) |
|
||||
- (TCPOPT_SACK_PERM << 8) |
|
||||
- TCPOLEN_SACK_PERM);
|
||||
+ net_hdr_word(ptr++) =
|
||||
+ htonl((TCPOPT_NOP << 24) |
|
||||
+ (TCPOPT_NOP << 16) |
|
||||
+ (TCPOPT_SACK_PERM << 8) |
|
||||
+ TCPOLEN_SACK_PERM);
|
||||
}
|
||||
|
||||
if (unlikely(OPTION_WSCALE & options)) {
|
||||
- *ptr++ = htonl((TCPOPT_NOP << 24) |
|
||||
- (TCPOPT_WINDOW << 16) |
|
||||
- (TCPOLEN_WINDOW << 8) |
|
||||
- opts->ws);
|
||||
+ net_hdr_word(ptr++) =
|
||||
+ htonl((TCPOPT_NOP << 24) |
|
||||
+ (TCPOPT_WINDOW << 16) |
|
||||
+ (TCPOLEN_WINDOW << 8) |
|
||||
+ opts->ws);
|
||||
}
|
||||
|
||||
if (unlikely(opts->num_sack_blocks)) {
|
||||
@@ -510,16 +515,17 @@ static void tcp_options_write(__be32 *pt
|
||||
tp->duplicate_sack : tp->selective_acks;
|
||||
int this_sack;
|
||||
|
||||
- *ptr++ = htonl((TCPOPT_NOP << 24) |
|
||||
- (TCPOPT_NOP << 16) |
|
||||
- (TCPOPT_SACK << 8) |
|
||||
- (TCPOLEN_SACK_BASE + (opts->num_sack_blocks *
|
||||
+ net_hdr_word(ptr++) =
|
||||
+ htonl((TCPOPT_NOP << 24) |
|
||||
+ (TCPOPT_NOP << 16) |
|
||||
+ (TCPOPT_SACK << 8) |
|
||||
+ (TCPOLEN_SACK_BASE + (opts->num_sack_blocks *
|
||||
TCPOLEN_SACK_PERBLOCK)));
|
||||
|
||||
for (this_sack = 0; this_sack < opts->num_sack_blocks;
|
||||
++this_sack) {
|
||||
- *ptr++ = htonl(sp[this_sack].start_seq);
|
||||
- *ptr++ = htonl(sp[this_sack].end_seq);
|
||||
+ net_hdr_word(ptr++) = htonl(sp[this_sack].start_seq);
|
||||
+ net_hdr_word(ptr++) = htonl(sp[this_sack].end_seq);
|
||||
}
|
||||
|
||||
tp->rx_opt.dsack = 0;
|
||||
@@ -532,13 +538,14 @@ static void tcp_options_write(__be32 *pt
|
||||
|
||||
if (foc->exp) {
|
||||
len = TCPOLEN_EXP_FASTOPEN_BASE + foc->len;
|
||||
- *ptr = htonl((TCPOPT_EXP << 24) | (len << 16) |
|
||||
+ net_hdr_word(ptr) =
|
||||
+ htonl((TCPOPT_EXP << 24) | (len << 16) |
|
||||
TCPOPT_FASTOPEN_MAGIC);
|
||||
p += TCPOLEN_EXP_FASTOPEN_BASE;
|
||||
} else {
|
||||
len = TCPOLEN_FASTOPEN_BASE + foc->len;
|
||||
- *p++ = TCPOPT_FASTOPEN;
|
||||
- *p++ = len;
|
||||
+ net_hdr_word(p++) = TCPOPT_FASTOPEN;
|
||||
+ net_hdr_word(p++) = len;
|
||||
}
|
||||
|
||||
memcpy(p, foc->val, foc->len);
|
||||
--- a/include/uapi/linux/igmp.h
|
||||
+++ b/include/uapi/linux/igmp.h
|
||||
@@ -33,7 +33,7 @@ struct igmphdr {
|
||||
__u8 code; /* For newer IGMP */
|
||||
__sum16 csum;
|
||||
__be32 group;
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
/* V3 group record types [grec_type] */
|
||||
#define IGMPV3_MODE_IS_INCLUDE 1
|
||||
@@ -49,7 +49,7 @@ struct igmpv3_grec {
|
||||
__be16 grec_nsrcs;
|
||||
__be32 grec_mca;
|
||||
__be32 grec_src[0];
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
struct igmpv3_report {
|
||||
__u8 type;
|
||||
@@ -58,7 +58,7 @@ struct igmpv3_report {
|
||||
__be16 resv2;
|
||||
__be16 ngrec;
|
||||
struct igmpv3_grec grec[0];
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
struct igmpv3_query {
|
||||
__u8 type;
|
||||
@@ -79,7 +79,7 @@ struct igmpv3_query {
|
||||
__u8 qqic;
|
||||
__be16 nsrcs;
|
||||
__be32 srcs[0];
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
#define IGMP_HOST_MEMBERSHIP_QUERY 0x11 /* From RFC1112 */
|
||||
#define IGMP_HOST_MEMBERSHIP_REPORT 0x12 /* Ditto */
|
||||
--- a/net/core/flow_dissector.c
|
||||
+++ b/net/core/flow_dissector.c
|
||||
@@ -111,7 +111,7 @@ __be32 __skb_flow_get_ports(const struct
|
||||
ports = __skb_header_pointer(skb, thoff + poff,
|
||||
sizeof(_ports), data, hlen, &_ports);
|
||||
if (ports)
|
||||
- return *ports;
|
||||
+ return (__be32)net_hdr_word(ports);
|
||||
}
|
||||
|
||||
return 0;
|
||||
--- a/include/uapi/linux/icmpv6.h
|
||||
+++ b/include/uapi/linux/icmpv6.h
|
||||
@@ -77,7 +77,7 @@ struct icmp6hdr {
|
||||
#define icmp6_addrconf_other icmp6_dataun.u_nd_ra.other
|
||||
#define icmp6_rt_lifetime icmp6_dataun.u_nd_ra.rt_lifetime
|
||||
#define icmp6_router_pref icmp6_dataun.u_nd_ra.router_pref
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
|
||||
#define ICMPV6_ROUTER_PREF_LOW 0x3
|
||||
--- a/include/net/ndisc.h
|
||||
+++ b/include/net/ndisc.h
|
||||
@@ -89,7 +89,7 @@ struct ra_msg {
|
||||
struct icmp6hdr icmph;
|
||||
__be32 reachable_time;
|
||||
__be32 retrans_timer;
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
struct rd_msg {
|
||||
struct icmp6hdr icmph;
|
||||
@@ -368,10 +368,10 @@ static inline u32 ndisc_hashfn(const voi
|
||||
{
|
||||
const u32 *p32 = pkey;
|
||||
|
||||
- return (((p32[0] ^ hash32_ptr(dev)) * hash_rnd[0]) +
|
||||
- (p32[1] * hash_rnd[1]) +
|
||||
- (p32[2] * hash_rnd[2]) +
|
||||
- (p32[3] * hash_rnd[3]));
|
||||
+ return (((net_hdr_word(&p32[0]) ^ hash32_ptr(dev)) * hash_rnd[0]) +
|
||||
+ (net_hdr_word(&p32[1]) * hash_rnd[1]) +
|
||||
+ (net_hdr_word(&p32[2]) * hash_rnd[2]) +
|
||||
+ (net_hdr_word(&p32[3]) * hash_rnd[3]));
|
||||
}
|
||||
|
||||
static inline struct neighbour *__ipv6_neigh_lookup_noref(struct net_device *dev, const void *pkey)
|
||||
--- a/net/sched/cls_u32.c
|
||||
+++ b/net/sched/cls_u32.c
|
||||
@@ -165,7 +165,7 @@ next_knode:
|
||||
data = skb_header_pointer(skb, toff, 4, &hdata);
|
||||
if (!data)
|
||||
goto out;
|
||||
- if ((*data ^ key->val) & key->mask) {
|
||||
+ if ((net_hdr_word(data) ^ key->val) & key->mask) {
|
||||
n = rcu_dereference_bh(n->next);
|
||||
goto next_knode;
|
||||
}
|
||||
@@ -218,8 +218,8 @@ check_terminal:
|
||||
&hdata);
|
||||
if (!data)
|
||||
goto out;
|
||||
- sel = ht->divisor & u32_hash_fold(*data, &n->sel,
|
||||
- n->fshift);
|
||||
+ sel = ht->divisor & u32_hash_fold(net_hdr_word(data),
|
||||
+ &n->sel, n->fshift);
|
||||
}
|
||||
if (!(n->sel.flags & (TC_U32_VAROFFSET | TC_U32_OFFSET | TC_U32_EAT)))
|
||||
goto next_ht;
|
||||
--- a/net/ipv6/ip6_offload.c
|
||||
+++ b/net/ipv6/ip6_offload.c
|
||||
@@ -223,7 +223,7 @@ static struct sk_buff *ipv6_gro_receive(
|
||||
continue;
|
||||
|
||||
iph2 = (struct ipv6hdr *)(p->data + off);
|
||||
- first_word = *(__be32 *)iph ^ *(__be32 *)iph2;
|
||||
+ first_word = net_hdr_word(iph) ^ net_hdr_word(iph2);
|
||||
|
||||
/* All fields must match except length and Traffic Class.
|
||||
* XXX skbs on the gro_list have all been parsed and pulled
|
||||
--- a/include/net/addrconf.h
|
||||
+++ b/include/net/addrconf.h
|
||||
@@ -47,7 +47,7 @@ struct prefix_info {
|
||||
__be32 reserved2;
|
||||
|
||||
struct in6_addr prefix;
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
#include <net/if_inet6.h>
|
||||
--- a/include/net/inet_ecn.h
|
||||
+++ b/include/net/inet_ecn.h
|
||||
@@ -125,9 +125,9 @@ static inline int IP6_ECN_set_ce(struct
|
||||
if (INET_ECN_is_not_ect(ipv6_get_dsfield(iph)))
|
||||
return 0;
|
||||
|
||||
- from = *(__be32 *)iph;
|
||||
+ from = net_hdr_word(iph);
|
||||
to = from | htonl(INET_ECN_CE << 20);
|
||||
- *(__be32 *)iph = to;
|
||||
+ net_hdr_word(iph) = to;
|
||||
if (skb->ip_summed == CHECKSUM_COMPLETE)
|
||||
skb->csum = csum_add(csum_sub(skb->csum, (__force __wsum)from),
|
||||
(__force __wsum)to);
|
||||
--- a/include/net/ipv6.h
|
||||
+++ b/include/net/ipv6.h
|
||||
@@ -149,7 +149,7 @@ struct frag_hdr {
|
||||
__u8 reserved;
|
||||
__be16 frag_off;
|
||||
__be32 identification;
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
|
||||
#define IP6_MF 0x0001
|
||||
#define IP6_OFFSET 0xFFF8
|
||||
@@ -499,8 +499,8 @@ static inline void __ipv6_addr_set_half(
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
- addr[0] = wh;
|
||||
- addr[1] = wl;
|
||||
+ net_hdr_word(&addr[0]) = wh;
|
||||
+ net_hdr_word(&addr[1]) = wl;
|
||||
}
|
||||
|
||||
static inline void ipv6_addr_set(struct in6_addr *addr,
|
||||
@@ -559,6 +559,8 @@ static inline bool ipv6_prefix_equal(con
|
||||
const __be32 *a1 = addr1->s6_addr32;
|
||||
const __be32 *a2 = addr2->s6_addr32;
|
||||
unsigned int pdw, pbi;
|
||||
+ /* Used for last <32-bit fraction of prefix */
|
||||
+ u32 pbia1, pbia2;
|
||||
|
||||
/* check complete u32 in prefix */
|
||||
pdw = prefixlen >> 5;
|
||||
@@ -567,7 +569,9 @@ static inline bool ipv6_prefix_equal(con
|
||||
|
||||
/* check incomplete u32 in prefix */
|
||||
pbi = prefixlen & 0x1f;
|
||||
- if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi))))
|
||||
+ pbia1 = net_hdr_word(&a1[pdw]);
|
||||
+ pbia2 = net_hdr_word(&a2[pdw]);
|
||||
+ if (pbi && ((pbia1 ^ pbia2) & htonl((0xffffffff) << (32 - pbi))))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -683,13 +687,13 @@ static inline void ipv6_addr_set_v4mappe
|
||||
*/
|
||||
static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen)
|
||||
{
|
||||
- const __be32 *a1 = token1, *a2 = token2;
|
||||
+ const struct in6_addr *a1 = token1, *a2 = token2;
|
||||
int i;
|
||||
|
||||
addrlen >>= 2;
|
||||
|
||||
for (i = 0; i < addrlen; i++) {
|
||||
- __be32 xb = a1[i] ^ a2[i];
|
||||
+ __be32 xb = a1->s6_addr32[i] ^ a2->s6_addr32[i];
|
||||
if (xb)
|
||||
return i * 32 + 31 - __fls(ntohl(xb));
|
||||
}
|
||||
@@ -876,17 +880,18 @@ static inline int ip6_multipath_hash_pol
|
||||
static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass,
|
||||
__be32 flowlabel)
|
||||
{
|
||||
- *(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | flowlabel;
|
||||
+ net_hdr_word((__be32 *)hdr) =
|
||||
+ htonl(0x60000000 | (tclass << 20)) | flowlabel;
|
||||
}
|
||||
|
||||
static inline __be32 ip6_flowinfo(const struct ipv6hdr *hdr)
|
||||
{
|
||||
- return *(__be32 *)hdr & IPV6_FLOWINFO_MASK;
|
||||
+ return net_hdr_word((__be32 *)hdr) & IPV6_FLOWINFO_MASK;
|
||||
}
|
||||
|
||||
static inline __be32 ip6_flowlabel(const struct ipv6hdr *hdr)
|
||||
{
|
||||
- return *(__be32 *)hdr & IPV6_FLOWLABEL_MASK;
|
||||
+ return net_hdr_word((__be32 *)hdr) & IPV6_FLOWLABEL_MASK;
|
||||
}
|
||||
|
||||
static inline u8 ip6_tclass(__be32 flowinfo)
|
||||
--- a/include/net/secure_seq.h
|
||||
+++ b/include/net/secure_seq.h
|
||||
@@ -3,6 +3,7 @@
|
||||
#define _NET_SECURE_SEQ
|
||||
|
||||
#include <linux/types.h>
|
||||
+#include <linux/in6.h>
|
||||
|
||||
u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport);
|
||||
u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,
|
||||
--- a/include/uapi/linux/in.h
|
||||
+++ b/include/uapi/linux/in.h
|
||||
@@ -84,7 +84,7 @@ enum {
|
||||
/* Internet address. */
|
||||
struct in_addr {
|
||||
__be32 s_addr;
|
||||
-};
|
||||
+} __attribute__((packed, aligned(2)));
|
||||
#endif
|
||||
|
||||
#define IP_TOS 1
|
||||
--- a/net/ipv6/ip6_fib.c
|
||||
+++ b/net/ipv6/ip6_fib.c
|
||||
@@ -142,7 +142,7 @@ static __be32 addr_bit_set(const void *t
|
||||
* See include/asm-generic/bitops/le.h.
|
||||
*/
|
||||
return (__force __be32)(1 << ((~fn_bit ^ BITOP_BE32_SWIZZLE) & 0x1f)) &
|
||||
- addr[fn_bit >> 5];
|
||||
+ net_hdr_word(&addr[fn_bit >> 5]);
|
||||
}
|
||||
|
||||
struct fib6_info *fib6_info_alloc(gfp_t gfp_flags)
|
||||
--- a/net/netfilter/nf_conntrack_proto_tcp.c
|
||||
+++ b/net/netfilter/nf_conntrack_proto_tcp.c
|
||||
@@ -423,7 +423,7 @@ static void tcp_sack(const struct sk_buf
|
||||
|
||||
/* Fast path for timestamp-only option */
|
||||
if (length == TCPOLEN_TSTAMP_ALIGNED
|
||||
- && *(__be32 *)ptr == htonl((TCPOPT_NOP << 24)
|
||||
+ && net_hdr_word(ptr) == htonl((TCPOPT_NOP << 24)
|
||||
| (TCPOPT_NOP << 16)
|
||||
| (TCPOPT_TIMESTAMP << 8)
|
||||
| TCPOLEN_TIMESTAMP))
|
||||
--- a/net/xfrm/xfrm_input.c
|
||||
+++ b/net/xfrm/xfrm_input.c
|
||||
@@ -194,8 +194,8 @@ int xfrm_parse_spi(struct sk_buff *skb,
|
||||
if (!pskb_may_pull(skb, hlen))
|
||||
return -EINVAL;
|
||||
|
||||
- *spi = *(__be32 *)(skb_transport_header(skb) + offset);
|
||||
- *seq = *(__be32 *)(skb_transport_header(skb) + offset_seq);
|
||||
+ *spi = net_hdr_word(skb_transport_header(skb) + offset);
|
||||
+ *seq = net_hdr_word(skb_transport_header(skb) + offset_seq);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_parse_spi);
|
||||
--- a/net/ipv4/tcp_input.c
|
||||
+++ b/net/ipv4/tcp_input.c
|
||||
@@ -3898,14 +3898,16 @@ static bool tcp_parse_aligned_timestamp(
|
||||
{
|
||||
const __be32 *ptr = (const __be32 *)(th + 1);
|
||||
|
||||
- if (*ptr == htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16)
|
||||
- | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) {
|
||||
+ if (net_hdr_word(ptr) ==
|
||||
+ htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
|
||||
+ (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) {
|
||||
tp->rx_opt.saw_tstamp = 1;
|
||||
++ptr;
|
||||
- tp->rx_opt.rcv_tsval = ntohl(*ptr);
|
||||
+ tp->rx_opt.rcv_tsval = get_unaligned_be32(ptr);
|
||||
++ptr;
|
||||
- if (*ptr)
|
||||
- tp->rx_opt.rcv_tsecr = ntohl(*ptr) - tp->tsoffset;
|
||||
+ if (net_hdr_word(ptr))
|
||||
+ tp->rx_opt.rcv_tsecr = get_unaligned_be32(ptr) -
|
||||
+ tp->tsoffset;
|
||||
else
|
||||
tp->rx_opt.rcv_tsecr = 0;
|
||||
return true;
|
||||
--- a/include/uapi/linux/if_pppox.h
|
||||
+++ b/include/uapi/linux/if_pppox.h
|
||||
@@ -51,6 +51,7 @@ struct pppoe_addr {
|
||||
*/
|
||||
struct pptp_addr {
|
||||
__u16 call_id;
|
||||
+ __u16 pad;
|
||||
struct in_addr sin_addr;
|
||||
};
|
||||
|
||||
--- a/net/ipv6/netfilter/nf_log_ipv6.c
|
||||
+++ b/net/ipv6/netfilter/nf_log_ipv6.c
|
||||
@@ -66,9 +66,9 @@ static void dump_ipv6_packet(struct net
|
||||
/* Max length: 44 "LEN=65535 TC=255 HOPLIMIT=255 FLOWLBL=FFFFF " */
|
||||
nf_log_buf_add(m, "LEN=%zu TC=%u HOPLIMIT=%u FLOWLBL=%u ",
|
||||
ntohs(ih->payload_len) + sizeof(struct ipv6hdr),
|
||||
- (ntohl(*(__be32 *)ih) & 0x0ff00000) >> 20,
|
||||
+ (ntohl(net_hdr_word(ih)) & 0x0ff00000) >> 20,
|
||||
ih->hop_limit,
|
||||
- (ntohl(*(__be32 *)ih) & 0x000fffff));
|
||||
+ (ntohl(net_hdr_word(ih)) & 0x000fffff));
|
||||
|
||||
fragment = 0;
|
||||
ptr = ip6hoff + sizeof(struct ipv6hdr);
|
||||
--- a/include/net/neighbour.h
|
||||
+++ b/include/net/neighbour.h
|
||||
@@ -266,8 +266,10 @@ static inline bool neigh_key_eq128(const
|
||||
const u32 *n32 = (const u32 *)n->primary_key;
|
||||
const u32 *p32 = pkey;
|
||||
|
||||
- return ((n32[0] ^ p32[0]) | (n32[1] ^ p32[1]) |
|
||||
- (n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0;
|
||||
+ return ((n32[0] ^ net_hdr_word(&p32[0])) |
|
||||
+ (n32[1] ^ net_hdr_word(&p32[1])) |
|
||||
+ (n32[2] ^ net_hdr_word(&p32[2])) |
|
||||
+ (n32[3] ^ net_hdr_word(&p32[3]))) == 0;
|
||||
}
|
||||
|
||||
static inline struct neighbour *___neigh_lookup_noref(
|
||||
--- a/include/uapi/linux/netfilter_arp/arp_tables.h
|
||||
+++ b/include/uapi/linux/netfilter_arp/arp_tables.h
|
||||
@@ -70,7 +70,7 @@ struct arpt_arp {
|
||||
__u8 flags;
|
||||
/* Inverse flags */
|
||||
__u16 invflags;
|
||||
-};
|
||||
+} __attribute__((aligned(4)));
|
||||
|
||||
/* Values for "flag" field in struct arpt_ip (general arp structure).
|
||||
* No flags defined yet.
|
||||
--- a/net/core/utils.c
|
||||
+++ b/net/core/utils.c
|
||||
@@ -447,8 +447,14 @@ void inet_proto_csum_replace16(__sum16 *
|
||||
bool pseudohdr)
|
||||
{
|
||||
__be32 diff[] = {
|
||||
- ~from[0], ~from[1], ~from[2], ~from[3],
|
||||
- to[0], to[1], to[2], to[3],
|
||||
+ ~net_hdr_word(&from[0]),
|
||||
+ ~net_hdr_word(&from[1]),
|
||||
+ ~net_hdr_word(&from[2]),
|
||||
+ ~net_hdr_word(&from[3]),
|
||||
+ net_hdr_word(&to[0]),
|
||||
+ net_hdr_word(&to[1]),
|
||||
+ net_hdr_word(&to[2]),
|
||||
+ net_hdr_word(&to[3]),
|
||||
};
|
||||
if (skb->ip_summed != CHECKSUM_PARTIAL) {
|
||||
*sum = csum_fold(csum_partial(diff, sizeof(diff),
|
||||
--- a/include/linux/etherdevice.h
|
||||
+++ b/include/linux/etherdevice.h
|
||||
@@ -480,7 +480,7 @@ static inline bool is_etherdev_addr(cons
|
||||
* @b: Pointer to Ethernet header
|
||||
*
|
||||
* Compare two Ethernet headers, returns 0 if equal.
|
||||
- * This assumes that the network header (i.e., IP header) is 4-byte
|
||||
+ * This assumes that the network header (i.e., IP header) is 2-byte
|
||||
* aligned OR the platform can handle unaligned access. This is the
|
||||
* case for all packets coming into netif_receive_skb or similar
|
||||
* entry points.
|
||||
@@ -503,11 +503,12 @@ static inline unsigned long compare_ethe
|
||||
fold |= *(unsigned long *)(a + 6) ^ *(unsigned long *)(b + 6);
|
||||
return fold;
|
||||
#else
|
||||
- u32 *a32 = (u32 *)((u8 *)a + 2);
|
||||
- u32 *b32 = (u32 *)((u8 *)b + 2);
|
||||
+ const u16 *a16 = a;
|
||||
+ const u16 *b16 = b;
|
||||
|
||||
- return (*(u16 *)a ^ *(u16 *)b) | (a32[0] ^ b32[0]) |
|
||||
- (a32[1] ^ b32[1]) | (a32[2] ^ b32[2]);
|
||||
+ return (a16[0] ^ b16[0]) | (a16[1] ^ b16[1]) | (a16[2] ^ b16[2]) |
|
||||
+ (a16[3] ^ b16[3]) | (a16[4] ^ b16[4]) | (a16[5] ^ b16[5]) |
|
||||
+ (a16[6] ^ b16[6]);
|
||||
#endif
|
||||
}
|
||||
|
||||
--- a/net/ipv4/tcp_offload.c
|
||||
+++ b/net/ipv4/tcp_offload.c
|
||||
@@ -226,7 +226,7 @@ struct sk_buff *tcp_gro_receive(struct l
|
||||
|
||||
th2 = tcp_hdr(p);
|
||||
|
||||
- if (*(u32 *)&th->source ^ *(u32 *)&th2->source) {
|
||||
+ if (net_hdr_word(&th->source) ^ net_hdr_word(&th2->source)) {
|
||||
NAPI_GRO_CB(p)->same_flow = 0;
|
||||
continue;
|
||||
}
|
||||
@@ -244,8 +244,8 @@ found:
|
||||
~(TCP_FLAG_CWR | TCP_FLAG_FIN | TCP_FLAG_PSH));
|
||||
flush |= (__force int)(th->ack_seq ^ th2->ack_seq);
|
||||
for (i = sizeof(*th); i < thlen; i += 4)
|
||||
- flush |= *(u32 *)((u8 *)th + i) ^
|
||||
- *(u32 *)((u8 *)th2 + i);
|
||||
+ flush |= net_hdr_word((u8 *)th + i) ^
|
||||
+ net_hdr_word((u8 *)th2 + i);
|
||||
|
||||
/* When we receive our second frame we can made a decision on if we
|
||||
* continue this flow as an atomic flow with a fixed ID or if we use
|
||||
--- a/net/ipv6/netfilter/ip6table_mangle.c
|
||||
+++ b/net/ipv6/netfilter/ip6table_mangle.c
|
||||
@@ -50,7 +50,7 @@ ip6t_mangle_out(struct sk_buff *skb, con
|
||||
hop_limit = ipv6_hdr(skb)->hop_limit;
|
||||
|
||||
/* flowlabel and prio (includes version, which shouldn't change either */
|
||||
- flowlabel = *((u_int32_t *)ipv6_hdr(skb));
|
||||
+ flowlabel = net_hdr_word(ipv6_hdr(skb));
|
||||
|
||||
ret = ip6t_do_table(skb, state, state->net->ipv6.ip6table_mangle);
|
||||
|
||||
@@ -59,7 +59,7 @@ ip6t_mangle_out(struct sk_buff *skb, con
|
||||
!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, &daddr) ||
|
||||
skb->mark != mark ||
|
||||
ipv6_hdr(skb)->hop_limit != hop_limit ||
|
||||
- flowlabel != *((u_int32_t *)ipv6_hdr(skb)))) {
|
||||
+ flowlabel != net_hdr_word(ipv6_hdr(skb)))) {
|
||||
err = ip6_route_me_harder(state->net, skb);
|
||||
if (err < 0)
|
||||
ret = NF_DROP_ERR(err);
|
@ -14,7 +14,6 @@ MAINTAINER:=Hauke Mehrtens <hauke@hauke-m.de>
|
||||
CPU_TYPE:=cortex-a9
|
||||
|
||||
KERNEL_PATCHVER:=4.14
|
||||
KERNEL_TESTING_PATCHVER := 4.19
|
||||
|
||||
define Target/Description
|
||||
Build firmware images for Broadcom based BCM47xx/53xx routers with ARM CPU, *not* MIPS.
|
||||
|
@ -1,167 +0,0 @@
|
||||
From b0465fdfdd7e7c1afe2fae1cb36b94e1ce89732e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sat, 28 Jul 2018 14:13:57 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Specify flash partitions
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Most devices use Broadcom standard partitions which allows them to be
|
||||
described with the "brcm,bcm947xx-cfe-partitions". Exceptions are:
|
||||
1) TP-LINK devices which use "os-image" partition with TRX containing
|
||||
kernel only + separated rootfs partition.
|
||||
2) Asus RT-AC87U with custom "asus" partition.
|
||||
|
||||
This commit also removes undocumented and unsupported linux,part-probe
|
||||
binding which got accidentally upstreamed while describing SPI
|
||||
controller.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts | 28 +++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts | 31 ++++++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts | 28 +++++++++++++++++++
|
||||
arch/arm/boot/dts/bcm5301x-nand-cs0.dtsi | 4 +++
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 5 +++-
|
||||
5 files changed, 95 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts
|
||||
@@ -94,6 +94,34 @@
|
||||
|
||||
&spi_nor {
|
||||
status = "okay";
|
||||
+
|
||||
+ partitions {
|
||||
+ compatible = "fixed-partitions";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ boot@0 {
|
||||
+ label = "boot";
|
||||
+ reg = <0x000000 0x040000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+
|
||||
+ os-image@100000 {
|
||||
+ label = "os-image";
|
||||
+ reg = <0x040000 0x200000>;
|
||||
+ compatible = "brcm,trx";
|
||||
+ };
|
||||
+
|
||||
+ rootfs@240000 {
|
||||
+ label = "rootfs";
|
||||
+ reg = <0x240000 0xc00000>;
|
||||
+ };
|
||||
+
|
||||
+ nvram@ff0000 {
|
||||
+ label = "nvram";
|
||||
+ reg = <0xff0000 0x010000>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
&usb2 {
|
||||
--- a/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
|
||||
@@ -66,3 +66,34 @@
|
||||
&usb3_phy {
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&nandcs {
|
||||
+ partitions {
|
||||
+ compatible = "fixed-partitions";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ boot@0 {
|
||||
+ label = "boot";
|
||||
+ reg = <0x00000000 0x00080000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+
|
||||
+ nvram@80000 {
|
||||
+ label = "nvram";
|
||||
+ reg = <0x00080000 0x00180000>;
|
||||
+ };
|
||||
+
|
||||
+ firmware@200000 {
|
||||
+ label = "firmware";
|
||||
+ reg = <0x00200000 0x07cc0000>;
|
||||
+ compatible = "brcm,trx";
|
||||
+ };
|
||||
+
|
||||
+ asus@7ec0000 {
|
||||
+ label = "asus";
|
||||
+ reg = <0x07ec0000 0x00140000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
|
||||
+++ b/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
|
||||
@@ -103,6 +103,34 @@
|
||||
|
||||
&spi_nor {
|
||||
status = "okay";
|
||||
+
|
||||
+ partitions {
|
||||
+ compatible = "fixed-partitions";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ boot@0 {
|
||||
+ label = "boot";
|
||||
+ reg = <0x000000 0x040000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+
|
||||
+ os-image@100000 {
|
||||
+ label = "os-image";
|
||||
+ reg = <0x040000 0x200000>;
|
||||
+ compatible = "brcm,trx";
|
||||
+ };
|
||||
+
|
||||
+ rootfs@240000 {
|
||||
+ label = "rootfs";
|
||||
+ reg = <0x240000 0xc00000>;
|
||||
+ };
|
||||
+
|
||||
+ nvram@ff0000 {
|
||||
+ label = "nvram";
|
||||
+ reg = <0xff0000 0x010000>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
&usb3_phy {
|
||||
--- a/arch/arm/boot/dts/bcm5301x-nand-cs0.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x-nand-cs0.dtsi
|
||||
@@ -12,6 +12,10 @@
|
||||
reg = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
+
|
||||
+ partitions {
|
||||
+ compatible = "brcm,bcm947xx-cfe-partitions";
|
||||
+ };
|
||||
};
|
||||
};
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -475,8 +475,11 @@
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <20000000>;
|
||||
- linux,part-probe = "ofpart", "bcm47xxpart";
|
||||
status = "disabled";
|
||||
+
|
||||
+ partitions {
|
||||
+ compatible = "brcm,bcm947xx-cfe-partitions";
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
@ -1,58 +0,0 @@
|
||||
From 26ff86f7794b9466481ccf29ac79925d327f106d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 20 Sep 2018 13:18:47 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Relicense BCM47081/BCM4709 files to the
|
||||
GPL 2.0+ / MIT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This matches licensing used by other BCM5301X files and is preferred as:
|
||||
1) GPL 2.0+ makes it clearly compatible with Linux kernel
|
||||
2) MIT is also permissive but preferred over ISC
|
||||
|
||||
Both files were fully developed by me. Commits touching them were signed
|
||||
by Florian and Hauke due to submitting process only.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47081.dtsi | 13 +------------
|
||||
arch/arm/boot/dts/bcm4709.dtsi | 3 +--
|
||||
2 files changed, 2 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47081.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm47081.dtsi
|
||||
@@ -1,20 +1,9 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/*
|
||||
* Broadcom BCM470X / BCM5301X ARM platform code.
|
||||
* DTS for BCM47081 SoC.
|
||||
*
|
||||
* Copyright © 2014 Rafał Miłecki <zajec5@gmail.com>
|
||||
- *
|
||||
- * Permission to use, copy, modify, and/or distribute this software for any
|
||||
- * purpose with or without fee is hereby granted, provided that the above
|
||||
- * copyright notice and this permission notice appear in all copies.
|
||||
- *
|
||||
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
- * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
- * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
- * PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "bcm5301x.dtsi"
|
||||
--- a/arch/arm/boot/dts/bcm4709.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm4709.dtsi
|
||||
@@ -1,7 +1,6 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/*
|
||||
* Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
- *
|
||||
- * Licensed under the ISC license.
|
||||
*/
|
||||
|
||||
#include "bcm4708.dtsi"
|
@ -1,33 +0,0 @@
|
||||
From d10967344375026ca8762b6080dec2585d895906 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 20 Sep 2018 13:20:19 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Relicense BCM47094 file to the GPL 2.0+ /
|
||||
MIT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This matches licensing used by other BCM5301X files and is preferred as:
|
||||
1) GPL 2.0+ makes it clearly compatible with Linux kernel
|
||||
2) MIT is also permissive but preferred over ISC
|
||||
|
||||
This file has been developed by me & once modified by Vivek.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Vivek Unune <npcomplete13@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47094.dtsi | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47094.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm47094.dtsi
|
||||
@@ -1,7 +1,6 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/*
|
||||
* Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
- *
|
||||
- * Licensed under the ISC license.
|
||||
*/
|
||||
|
||||
#include "bcm4708.dtsi"
|
@ -1,32 +0,0 @@
|
||||
From 1c9001b4f69a37820862286b3bbcdde152a52dcf Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 20 Sep 2018 13:37:47 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Relicense Tenda AC9 file to the GPL 2.0+
|
||||
/ MIT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This matches licensing used by most of BCM5301X files and is preferred as:
|
||||
1) GPL 2.0+ makes it clearly compatible with Linux kernel
|
||||
2) MIT is also permissive but preferred over ISC
|
||||
|
||||
This file was fully developed by me.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47189-tenda-ac9.dts | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
@@ -1,7 +1,6 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/*
|
||||
* Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
- *
|
||||
- * Licensed under the ISC license.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
@ -1,33 +0,0 @@
|
||||
From ca3a6e705cad10662827093d5426abe078861793 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 20 Sep 2018 13:39:28 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Relicense SoC file to the GPL 2.0+ / MIT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This matches licensing used by most of BCM5301X files and is preferred as:
|
||||
1) GPL 2.0+ makes it clearly compatible with Linux kernel
|
||||
2) MIT is also permissive but preferred over ISC
|
||||
|
||||
This file has been developed by me & once modified by Rob dropping a
|
||||
single leading zero in an UART address.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm53573.dtsi | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm53573.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm53573.dtsi
|
||||
@@ -1,7 +1,6 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/*
|
||||
* Copyright (C) 2016 Rafał Miłecki <rafal@milecki.pl>
|
||||
- *
|
||||
- * Licensed under the ISC license.
|
||||
*/
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
@ -1,75 +0,0 @@
|
||||
From 03e96644d7a810916fc4997d572577e876908b18 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Ren=C3=A9=20Kjellerup?= <rk.katana.steel@gmail.com>
|
||||
Date: Mon, 1 Oct 2018 15:07:16 -0700
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add basic DT for Linksys EA6500 V2
|
||||
|
||||
It is wireless home router based on BCM4708A0 with BCM4360 + BCM4331
|
||||
wireless chipsets. The BCM4331 5GHz chip currently isn't supported only
|
||||
due to missing compatible firmware.
|
||||
|
||||
Signed-off-by: Rene Kjellerup <rk.katana.steel@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm4708-linksys-ea6500-v2.dts | 45 +++++++++++++++++++++++++
|
||||
2 files changed, 46 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm4708-linksys-ea6500-v2.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -88,6 +88,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4708-asus-rt-ac68u.dtb \
|
||||
bcm4708-buffalo-wzr-1750dhp.dtb \
|
||||
bcm4708-linksys-ea6300-v1.dtb \
|
||||
+ bcm4708-linksys-ea6500-v2.dtb \
|
||||
bcm4708-luxul-xap-1510.dtb \
|
||||
bcm4708-luxul-xwc-1000.dtb \
|
||||
bcm4708-netgear-r6250.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm4708-linksys-ea6500-v2.dts
|
||||
@@ -0,0 +1,45 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
+/*
|
||||
+ * Copyright (C) 2017 Rafał Miłecki <rafal@milecki.pl>
|
||||
+ * Copyright (C) 2018 Rene Kjellerup <rk.katana.steel@gmail.com>
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm4708.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "linksys,ea6500-v2", "brcm,bcm4708";
|
||||
+ model = "Linksys EA6500 V2";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "console=ttyS0,115200";
|
||||
+ };
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000>;
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ wps {
|
||||
+ label = "WPS";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&chipcommon 7 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&usb3_phy {
|
||||
+ status = "okay";
|
||||
+};
|
@ -1,77 +0,0 @@
|
||||
From 9994241ac97cb84d1df98fdc172d3cc6b04b11bf Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 9 Nov 2018 09:56:49 +0100
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Describe Northstar pins mux controller
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This describes hardware & will allow referencing pin functions. The
|
||||
first usage is UART1 which allows supporting devices using it.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm5301x.dtsi | 44 +++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 44 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
|
||||
@@ -37,6 +37,8 @@
|
||||
reg = <0x0400 0x100>;
|
||||
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&iprocslow>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinmux_uart1>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
@@ -391,6 +393,48 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ dmu@1800c000 {
|
||||
+ compatible = "simple-bus";
|
||||
+ ranges = <0 0x1800c000 0x1000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ cru@100 {
|
||||
+ compatible = "simple-bus";
|
||||
+ reg = <0x100 0x1a4>;
|
||||
+ ranges;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ pin-controller@1c0 {
|
||||
+ compatible = "brcm,bcm4708-pinmux";
|
||||
+ reg = <0x1c0 0x24>;
|
||||
+ reg-names = "cru_gpio_control";
|
||||
+
|
||||
+ spi-pins {
|
||||
+ groups = "spi_grp";
|
||||
+ function = "spi";
|
||||
+ };
|
||||
+
|
||||
+ i2c {
|
||||
+ groups = "i2c_grp";
|
||||
+ function = "i2c";
|
||||
+ };
|
||||
+
|
||||
+ pwm {
|
||||
+ groups = "pwm0_grp", "pwm1_grp",
|
||||
+ "pwm2_grp", "pwm3_grp";
|
||||
+ function = "pwm";
|
||||
+ };
|
||||
+
|
||||
+ pinmux_uart1: uart1 {
|
||||
+ groups = "uart1_grp";
|
||||
+ function = "uart1";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
lcpll0: lcpll0@1800c100 {
|
||||
#clock-cells = <1>;
|
||||
compatible = "brcm,nsp-lcpll0";
|
@ -1,41 +0,0 @@
|
||||
From b7f264fa496eb2a6dd1d67dc91dbe8ffcb142487 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <riproute@gmail.com>
|
||||
Date: Sun, 2 Dec 2018 17:00:15 -0700
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Relicense Luxul files to the GPL 2.0+ /
|
||||
MIT
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This matches licensing used by other BCM53573 files and BCM5301X.
|
||||
|
||||
Signed-off-by: Dan Haab <dan.haab@luxul.com>
|
||||
Acked-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts | 3 +--
|
||||
arch/arm/boot/dts/bcm47189-luxul-xap-810.dts | 3 +--
|
||||
2 files changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts
|
||||
@@ -1,7 +1,6 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/*
|
||||
* Copyright 2017 Luxul Inc.
|
||||
- *
|
||||
- * Licensed under the ISC license.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
--- a/arch/arm/boot/dts/bcm47189-luxul-xap-810.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47189-luxul-xap-810.dts
|
||||
@@ -1,7 +1,6 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/*
|
||||
* Copyright 2017 Luxul Inc.
|
||||
- *
|
||||
- * Licensed under the ISC license.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
@ -1,107 +0,0 @@
|
||||
From 40a17923367118e32e5e413a952736dd83635b32 Mon Sep 17 00:00:00 2001
|
||||
From: Hao Dong <halbertdong@gmail.com>
|
||||
Date: Sun, 20 Jan 2019 23:33:27 +0100
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add basic DT for Phicomm K3
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This router has BCM4709C0 SoC, 128 MiB NAND flash (MX30LF1G18AC-TI),
|
||||
512 MiB memory and 3 x LAN and 1 x WAN ports. WiFi chips are
|
||||
BCM4366C0 x 2. The router has a small LCD and 3 capactive keys driven by
|
||||
a PIC microcontroller, which is in turn wired to UART1 of main board.
|
||||
|
||||
Signed-off-by: Hao Dong <halbertdong@gmail.com>
|
||||
[rmilecki: drop chosen { }, fix whitespaces, update commit message]
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47094-phicomm-k3.dts | 71 +++++++++++++++++++++++
|
||||
2 files changed, 72 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47094-phicomm-k3.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -114,6 +114,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm47094-luxul-xwr-3100.dtb \
|
||||
bcm47094-luxul-xwr-3150-v1.dtb \
|
||||
bcm47094-netgear-r8500.dtb \
|
||||
+ bcm47094-phicomm-k3.dtb \
|
||||
bcm94708.dtb \
|
||||
bcm94709.dtb \
|
||||
bcm953012er.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47094-phicomm-k3.dts
|
||||
@@ -0,0 +1,71 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
+/*
|
||||
+ * Copyright (C) 2017 Hamster Tian <haotia@gmail.com>
|
||||
+ * Copyright (C) 2019 Hao Dong <halbertdong@gmail.com>
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm47094.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch4.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "phicomm,k3", "brcm,bcm47094", "brcm,bcm4708";
|
||||
+ model = "Phicomm K3";
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0x00000000 0x08000000
|
||||
+ 0x88000000 0x18000000>;
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ restart {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb3_phy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&nandcs {
|
||||
+ partitions {
|
||||
+ compatible = "fixed-partitions";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ partition@0 {
|
||||
+ label = "boot";
|
||||
+ reg = <0x0000000 0x0080000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+
|
||||
+ partition@80000 {
|
||||
+ label = "nvram";
|
||||
+ reg = <0x0080000 0x0100000>;
|
||||
+ };
|
||||
+
|
||||
+ partition@180000{
|
||||
+ label = "phicomm";
|
||||
+ reg = <0x0180000 0x0280000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+
|
||||
+ partition@400000 {
|
||||
+ label = "firmware";
|
||||
+ reg = <0x0400000 0x7C00000>;
|
||||
+ compatible = "brcm,trx";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user