diff options
-rw-r--r-- | Documentation/devicetree/bindings/memory-controllers/baikal,bt1-l2-ctl.yaml | 63 | ||||
-rw-r--r-- | drivers/bus/Kconfig | 4 | ||||
-rw-r--r-- | drivers/bus/bt1-apb.c | 19 | ||||
-rw-r--r-- | drivers/bus/bt1-axi.c | 22 |
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; |