summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/memory-controllers/baikal,bt1-l2-ctl.yaml63
-rw-r--r--drivers/bus/Kconfig4
-rw-r--r--drivers/bus/bt1-apb.c19
-rw-r--r--drivers/bus/bt1-axi.c22
4 files changed, 82 insertions, 26 deletions
diff --git a/Documentation/devicetree/bindings/memory-controllers/baikal,bt1-l2-ctl.yaml b/Documentation/devicetree/bindings/memory-controllers/baikal,bt1-l2-ctl.yaml
new file mode 100644
index 000000000000..1fca282f64a2
--- /dev/null
+++ b/Documentation/devicetree/bindings/memory-controllers/baikal,bt1-l2-ctl.yaml
@@ -0,0 +1,63 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+# Copyright (C) 2020 BAIKAL ELECTRONICS, JSC
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/memory-controllers/baikal,bt1-l2-ctl.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Baikal-T1 L2-cache Control Block
+
+maintainers:
+ - Serge Semin <fancer.lancer@gmail.com>
+
+description: |
+ By means of the System Controller Baikal-T1 SoC exposes a few settings to
+ tune the MIPS P5600 CM2 L2 cache performance up. In particular it's possible
+ to change the Tag, Data and Way-select RAM access latencies. Baikal-T1
+ L2-cache controller block is responsible for the tuning. Its DT node is
+ supposed to be a child of the system controller.
+
+properties:
+ compatible:
+ const: baikal,bt1-l2-ctl
+
+ reg:
+ maxItems: 1
+
+ baikal,l2-ws-latency:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: Cycles of latency for Way-select RAM accesses
+ default: 0
+ minimum: 0
+ maximum: 3
+
+ baikal,l2-tag-latency:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: Cycles of latency for Tag RAM accesses
+ default: 0
+ minimum: 0
+ maximum: 3
+
+ baikal,l2-data-latency:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: Cycles of latency for Data RAM accesses
+ default: 1
+ minimum: 0
+ maximum: 3
+
+additionalProperties: false
+
+required:
+ - compatible
+
+examples:
+ - |
+ l2@1f04d028 {
+ compatible = "baikal,bt1-l2-ctl";
+ reg = <0x1f04d028 0x004>;
+
+ baikal,l2-ws-latency = <1>;
+ baikal,l2-tag-latency = <1>;
+ baikal,l2-data-latency = <2>;
+ };
+...
diff --git a/drivers/bus/Kconfig b/drivers/bus/Kconfig
index 030f0e59f193..4be793c5ab4d 100644
--- a/drivers/bus/Kconfig
+++ b/drivers/bus/Kconfig
@@ -30,7 +30,7 @@ config BRCMSTB_GISB_ARB
and internal bus master decoding.
config BT1_APB
- tristate "Baikal-T1 APB-bus driver"
+ bool "Baikal-T1 APB-bus driver"
depends on MIPS_BAIKAL_T1 || COMPILE_TEST
select REGMAP_MMIO
help
@@ -45,7 +45,7 @@ config BT1_APB
accessed via corresponding sysfs nodes.
config BT1_AXI
- tristate "Baikal-T1 AXI-bus driver"
+ bool "Baikal-T1 AXI-bus driver"
depends on MIPS_BAIKAL_T1 || COMPILE_TEST
select MFD_SYSCON
help
diff --git a/drivers/bus/bt1-apb.c b/drivers/bus/bt1-apb.c
index abccd1dfc544..b25ff941e7c7 100644
--- a/drivers/bus/bt1-apb.c
+++ b/drivers/bus/bt1-apb.c
@@ -15,6 +15,7 @@
#include <linux/atomic.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
+#include <linux/io.h>
#include <linux/nmi.h>
#include <linux/of.h>
#include <linux/regmap.h>
@@ -163,12 +164,10 @@ static int bt1_apb_request_regs(struct bt1_apb *apb)
}
apb->res = devm_platform_ioremap_resource_byname(pdev, "nodev");
- if (IS_ERR(apb->res)) {
+ if (IS_ERR(apb->res))
dev_err(apb->dev, "Couldn't map reserved region\n");
- return PTR_ERR(apb->res);
- }
- return 0;
+ return PTR_ERR_OR_ZERO(apb->res);
}
static int bt1_apb_request_rst(struct bt1_apb *apb)
@@ -310,15 +309,15 @@ static ssize_t timeout_store(struct device *dev,
}
static DEVICE_ATTR_RW(timeout);
-static ssize_t inject_error_show(struct device *dev, struct device_attribute *attr,
- char *buf)
+static ssize_t inject_error_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
return scnprintf(buf, PAGE_SIZE, "Error injection: nodev irq\n");
}
static ssize_t inject_error_store(struct device *dev,
- struct device_attribute *attr,
- const char *data, size_t count)
+ struct device_attribute *attr,
+ const char *data, size_t count)
{
struct bt1_apb *apb = dev_get_drvdata(dev);
@@ -326,9 +325,9 @@ static ssize_t inject_error_store(struct device *dev,
* Either dummy read from the unmapped address in the APB IO area
* or manually set the IRQ status.
*/
- if (!strncmp(data, "nodev", 5))
+ if (sysfs_streq(data, "nodev"))
readl(apb->res);
- else if (!strncmp(data, "irq", 3))
+ else if (sysfs_streq(data, "irq"))
regmap_update_bits(apb->regs, APB_EHB_ISR, APB_EHB_ISR_PENDING,
APB_EHB_ISR_PENDING);
else
diff --git a/drivers/bus/bt1-axi.c b/drivers/bus/bt1-axi.c
index 2005f9174118..e7a6744acc7b 100644
--- a/drivers/bus/bt1-axi.c
+++ b/drivers/bus/bt1-axi.c
@@ -124,12 +124,10 @@ static int bt1_axi_request_regs(struct bt1_axi *axi)
}
axi->qos_regs = devm_platform_ioremap_resource_byname(pdev, "qos");
- if (IS_ERR(axi->qos_regs)) {
+ if (IS_ERR(axi->qos_regs))
dev_err(dev, "Couldn't map AXI-bus QoS registers\n");
- return PTR_ERR(axi->qos_regs);
- }
- return 0;
+ return PTR_ERR_OR_ZERO(axi->qos_regs);
}
static int bt1_axi_request_rst(struct bt1_axi *axi)
@@ -173,12 +171,10 @@ static int bt1_axi_request_clk(struct bt1_axi *axi)
}
ret = devm_add_action_or_reset(axi->dev, bt1_axi_disable_clk, axi);
- if (ret) {
+ if (ret)
dev_err(axi->dev, "Can't add AXI clock disable action\n");
- return ret;
- }
- return 0;
+ return ret;
}
static int bt1_axi_request_irq(struct bt1_axi *axi)
@@ -192,12 +188,10 @@ static int bt1_axi_request_irq(struct bt1_axi *axi)
ret = devm_request_irq(axi->dev, axi->irq, bt1_axi_isr, IRQF_SHARED,
"bt1-axi", axi);
- if (ret) {
+ if (ret)
dev_err(axi->dev, "Couldn't request AXI EHB IRQ\n");
- return ret;
- }
- return 0;
+ return ret;
}
static ssize_t count_show(struct device *dev,
@@ -226,9 +220,9 @@ static ssize_t inject_error_store(struct device *dev,
* error while unaligned writing - the AXI bus write error handled
* by this driver.
*/
- if (!strncmp(data, "bus", 3))
+ if (sysfs_streq(data, "bus"))
readb(axi->qos_regs);
- else if (!strncmp(data, "unaligned", 9))
+ else if (sysfs_streq(data, "unaligned"))
writeb(0, axi->qos_regs);
else
return -EINVAL;