Commit 46561217 authored by Olof Johansson's avatar Olof Johansson

Merge tag 'reset-for-5.0-rc2' of git://git.pengutronix.de/git/pza/linux into fixes

Late reset controller changes for v5.0

This adds missing deassert functionality to the ARC HSDK reset driver,
fixes some indentation and grammar issues in the kernel docs, adds a
helper to count the number of resets on a device for the non-DT case
as well, adds an early reset driver for SoCFPGA and simple reset driver
support for Stratix10, and generalizes the uniphier USB3 glue layer
reset to also cover AHCI.

* tag 'reset-for-5.0-rc2' of git://git.pengutronix.de/git/pza/linux:
  reset: uniphier-glue: Add AHCI reset control support in glue layer
  dt-bindings: reset: uniphier: Add AHCI core reset description
  reset: uniphier-usb3: Rename to reset-uniphier-glue
  dt-bindings: reset: uniphier: Replace the expression of USB3 with generic peripherals
  ARM: socfpga: dts: document "altr,stratix10-rst-mgr" binding
  reset: socfpga: add an early reset driver for SoCFPGA
  reset: fix null pointer dereference on dev by dev_name
  reset: Add reset_control_get_count()
  reset: Improve reset controller kernel docs
  ARC: HSDK: improve reset driver
Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
parents 56acb3ef d0c2d210
Altera SOCFPGA Reset Manager Altera SOCFPGA Reset Manager
Required properties: Required properties:
- compatible : "altr,rst-mgr" - compatible : "altr,rst-mgr" for (Cyclone5/Arria5/Arria10)
"altr,stratix10-rst-mgr","altr,rst-mgr" for Stratix10 ARM64 SoC
- reg : Should contain 1 register ranges(address and length) - reg : Should contain 1 register ranges(address and length)
- altr,modrst-offset : Should contain the offset of the first modrst register. - altr,modrst-offset : Should contain the offset of the first modrst register.
- #reset-cells: 1 - #reset-cells: 1
......
...@@ -120,27 +120,30 @@ Example: ...@@ -120,27 +120,30 @@ Example:
}; };
USB3 core reset Peripheral core reset in glue layer
--------------- -----------------------------------
USB3 core reset belongs to USB3 glue layer. Before using the core reset, Some peripheral core reset belongs to its own glue layer. Before using
it is necessary to control the clocks and resets to enable this layer. this core reset, it is necessary to control the clocks and resets to enable
These clocks and resets should be described in each property. this layer. These clocks and resets should be described in each property.
Required properties: Required properties:
- compatible: Should be - compatible: Should be
"socionext,uniphier-pro4-usb3-reset" - for Pro4 SoC "socionext,uniphier-pro4-usb3-reset" - for Pro4 SoC USB3
"socionext,uniphier-pxs2-usb3-reset" - for PXs2 SoC "socionext,uniphier-pxs2-usb3-reset" - for PXs2 SoC USB3
"socionext,uniphier-ld20-usb3-reset" - for LD20 SoC "socionext,uniphier-ld20-usb3-reset" - for LD20 SoC USB3
"socionext,uniphier-pxs3-usb3-reset" - for PXs3 SoC "socionext,uniphier-pxs3-usb3-reset" - for PXs3 SoC USB3
"socionext,uniphier-pro4-ahci-reset" - for Pro4 SoC AHCI
"socionext,uniphier-pxs2-ahci-reset" - for PXs2 SoC AHCI
"socionext,uniphier-pxs3-ahci-reset" - for PXs3 SoC AHCI
- #reset-cells: Should be 1. - #reset-cells: Should be 1.
- reg: Specifies offset and length of the register set for the device. - reg: Specifies offset and length of the register set for the device.
- clocks: A list of phandles to the clock gate for USB3 glue layer. - clocks: A list of phandles to the clock gate for the glue layer.
According to the clock-names, appropriate clocks are required. According to the clock-names, appropriate clocks are required.
- clock-names: Should contain - clock-names: Should contain
"gio", "link" - for Pro4 SoC "gio", "link" - for Pro4 SoC
"link" - for others "link" - for others
- resets: A list of phandles to the reset control for USB3 glue layer. - resets: A list of phandles to the reset control for the glue layer.
According to the reset-names, appropriate resets are required. According to the reset-names, appropriate resets are required.
- reset-names: Should contain - reset-names: Should contain
"gio", "link" - for Pro4 SoC "gio", "link" - for Pro4 SoC
......
...@@ -32,6 +32,8 @@ void __iomem *rst_manager_base_addr; ...@@ -32,6 +32,8 @@ void __iomem *rst_manager_base_addr;
void __iomem *sdr_ctl_base_addr; void __iomem *sdr_ctl_base_addr;
unsigned long socfpga_cpu1start_addr; unsigned long socfpga_cpu1start_addr;
extern void __init socfpga_reset_init(void);
static void __init socfpga_sysmgr_init(void) static void __init socfpga_sysmgr_init(void)
{ {
struct device_node *np; struct device_node *np;
...@@ -64,6 +66,7 @@ static void __init socfpga_init_irq(void) ...@@ -64,6 +66,7 @@ static void __init socfpga_init_irq(void)
if (IS_ENABLED(CONFIG_EDAC_ALTERA_OCRAM)) if (IS_ENABLED(CONFIG_EDAC_ALTERA_OCRAM))
socfpga_init_ocram_ecc(); socfpga_init_ocram_ecc();
socfpga_reset_init();
} }
static void __init socfpga_arria10_init_irq(void) static void __init socfpga_arria10_init_irq(void)
...@@ -74,6 +77,7 @@ static void __init socfpga_arria10_init_irq(void) ...@@ -74,6 +77,7 @@ static void __init socfpga_arria10_init_irq(void)
socfpga_init_arria10_l2_ecc(); socfpga_init_arria10_l2_ecc();
if (IS_ENABLED(CONFIG_EDAC_ALTERA_OCRAM)) if (IS_ENABLED(CONFIG_EDAC_ALTERA_OCRAM))
socfpga_init_arria10_ocram_ecc(); socfpga_init_arria10_ocram_ecc();
socfpga_reset_init();
} }
static void socfpga_cyclone5_restart(enum reboot_mode mode, const char *cmd) static void socfpga_cyclone5_restart(enum reboot_mode mode, const char *cmd)
......
...@@ -109,7 +109,7 @@ config RESET_QCOM_PDC ...@@ -109,7 +109,7 @@ config RESET_QCOM_PDC
config RESET_SIMPLE config RESET_SIMPLE
bool "Simple Reset Controller Driver" if COMPILE_TEST bool "Simple Reset Controller Driver" if COMPILE_TEST
default ARCH_SOCFPGA || ARCH_STM32 || ARCH_STRATIX10 || ARCH_SUNXI || ARCH_ZX || ARCH_ASPEED default ARCH_STM32 || ARCH_STRATIX10 || ARCH_SUNXI || ARCH_ZX || ARCH_ASPEED
help help
This enables a simple reset controller driver for reset lines that This enables a simple reset controller driver for reset lines that
that can be asserted and deasserted by toggling bits in a contiguous, that can be asserted and deasserted by toggling bits in a contiguous,
...@@ -128,6 +128,14 @@ config RESET_STM32MP157 ...@@ -128,6 +128,14 @@ config RESET_STM32MP157
help help
This enables the RCC reset controller driver for STM32 MPUs. This enables the RCC reset controller driver for STM32 MPUs.
config RESET_SOCFPGA
bool "SoCFPGA Reset Driver" if COMPILE_TEST && !ARCH_SOCFPGA
default ARCH_SOCFPGA
select RESET_SIMPLE
help
This enables the reset driver for the SoCFPGA ARMv7 platforms. This
driver gets initialized early during platform init calls.
config RESET_SUNXI config RESET_SUNXI
bool "Allwinner SoCs Reset Driver" if COMPILE_TEST && !ARCH_SUNXI bool "Allwinner SoCs Reset Driver" if COMPILE_TEST && !ARCH_SUNXI
default ARCH_SUNXI default ARCH_SUNXI
...@@ -163,15 +171,15 @@ config RESET_UNIPHIER ...@@ -163,15 +171,15 @@ config RESET_UNIPHIER
Say Y if you want to control reset signals provided by System Control Say Y if you want to control reset signals provided by System Control
block, Media I/O block, Peripheral Block. block, Media I/O block, Peripheral Block.
config RESET_UNIPHIER_USB3 config RESET_UNIPHIER_GLUE
tristate "USB3 reset driver for UniPhier SoCs" tristate "Reset driver in glue layer for UniPhier SoCs"
depends on (ARCH_UNIPHIER || COMPILE_TEST) && OF depends on (ARCH_UNIPHIER || COMPILE_TEST) && OF
default ARCH_UNIPHIER default ARCH_UNIPHIER
select RESET_SIMPLE select RESET_SIMPLE
help help
Support for the USB3 core reset on UniPhier SoCs. Support for peripheral core reset included in its own glue layer
Say Y if you want to control reset signals provided by on UniPhier SoCs. Say Y if you want to control reset signals
USB3 glue layer. provided by the glue layer.
config RESET_ZYNQ config RESET_ZYNQ
bool "ZYNQ Reset Driver" if COMPILE_TEST bool "ZYNQ Reset Driver" if COMPILE_TEST
......
...@@ -19,10 +19,11 @@ obj-$(CONFIG_RESET_QCOM_AOSS) += reset-qcom-aoss.o ...@@ -19,10 +19,11 @@ obj-$(CONFIG_RESET_QCOM_AOSS) += reset-qcom-aoss.o
obj-$(CONFIG_RESET_QCOM_PDC) += reset-qcom-pdc.o obj-$(CONFIG_RESET_QCOM_PDC) += reset-qcom-pdc.o
obj-$(CONFIG_RESET_SIMPLE) += reset-simple.o obj-$(CONFIG_RESET_SIMPLE) += reset-simple.o
obj-$(CONFIG_RESET_STM32MP157) += reset-stm32mp1.o obj-$(CONFIG_RESET_STM32MP157) += reset-stm32mp1.o
obj-$(CONFIG_RESET_SOCFPGA) += reset-socfpga.o
obj-$(CONFIG_RESET_SUNXI) += reset-sunxi.o obj-$(CONFIG_RESET_SUNXI) += reset-sunxi.o
obj-$(CONFIG_RESET_TI_SCI) += reset-ti-sci.o obj-$(CONFIG_RESET_TI_SCI) += reset-ti-sci.o
obj-$(CONFIG_RESET_TI_SYSCON) += reset-ti-syscon.o obj-$(CONFIG_RESET_TI_SYSCON) += reset-ti-syscon.o
obj-$(CONFIG_RESET_UNIPHIER) += reset-uniphier.o obj-$(CONFIG_RESET_UNIPHIER) += reset-uniphier.o
obj-$(CONFIG_RESET_UNIPHIER_USB3) += reset-uniphier-usb3.o obj-$(CONFIG_RESET_UNIPHIER_GLUE) += reset-uniphier-glue.o
obj-$(CONFIG_RESET_ZYNQ) += reset-zynq.o obj-$(CONFIG_RESET_ZYNQ) += reset-zynq.o
...@@ -795,3 +795,45 @@ devm_reset_control_array_get(struct device *dev, bool shared, bool optional) ...@@ -795,3 +795,45 @@ devm_reset_control_array_get(struct device *dev, bool shared, bool optional)
return rstc; return rstc;
} }
EXPORT_SYMBOL_GPL(devm_reset_control_array_get); EXPORT_SYMBOL_GPL(devm_reset_control_array_get);
static int reset_control_get_count_from_lookup(struct device *dev)
{
const struct reset_control_lookup *lookup;
const char *dev_id;
int count = 0;
if (!dev)
return -EINVAL;
dev_id = dev_name(dev);
mutex_lock(&reset_lookup_mutex);
list_for_each_entry(lookup, &reset_lookup_list, list) {
if (!strcmp(lookup->dev_id, dev_id))
count++;
}
mutex_unlock(&reset_lookup_mutex);
if (count == 0)
count = -ENOENT;
return count;
}
/**
* reset_control_get_count - Count number of resets available with a device
*
* @dev: device for which to return the number of resets
*
* Returns positive reset count on success, or error number on failure and
* on count being zero.
*/
int reset_control_get_count(struct device *dev)
{
if (dev->of_node)
return of_reset_control_get_count(dev->of_node);
return reset_control_get_count_from_lookup(dev);
}
EXPORT_SYMBOL_GPL(reset_control_get_count);
...@@ -86,6 +86,7 @@ static int hsdk_reset_reset(struct reset_controller_dev *rcdev, ...@@ -86,6 +86,7 @@ static int hsdk_reset_reset(struct reset_controller_dev *rcdev,
static const struct reset_control_ops hsdk_reset_ops = { static const struct reset_control_ops hsdk_reset_ops = {
.reset = hsdk_reset_reset, .reset = hsdk_reset_reset,
.deassert = hsdk_reset_reset,
}; };
static int hsdk_reset_probe(struct platform_device *pdev) static int hsdk_reset_probe(struct platform_device *pdev)
......
...@@ -109,7 +109,7 @@ struct reset_simple_devdata { ...@@ -109,7 +109,7 @@ struct reset_simple_devdata {
#define SOCFPGA_NR_BANKS 8 #define SOCFPGA_NR_BANKS 8
static const struct reset_simple_devdata reset_simple_socfpga = { static const struct reset_simple_devdata reset_simple_socfpga = {
.reg_offset = 0x10, .reg_offset = 0x20,
.nr_resets = SOCFPGA_NR_BANKS * 32, .nr_resets = SOCFPGA_NR_BANKS * 32,
.status_active_low = true, .status_active_low = true,
}; };
...@@ -120,7 +120,8 @@ static const struct reset_simple_devdata reset_simple_active_low = { ...@@ -120,7 +120,8 @@ static const struct reset_simple_devdata reset_simple_active_low = {
}; };
static const struct of_device_id reset_simple_dt_ids[] = { static const struct of_device_id reset_simple_dt_ids[] = {
{ .compatible = "altr,rst-mgr", .data = &reset_simple_socfpga }, { .compatible = "altr,stratix10-rst-mgr",
.data = &reset_simple_socfpga },
{ .compatible = "st,stm32-rcc", }, { .compatible = "st,stm32-rcc", },
{ .compatible = "allwinner,sun6i-a31-clock-reset", { .compatible = "allwinner,sun6i-a31-clock-reset",
.data = &reset_simple_active_low }, .data = &reset_simple_active_low },
...@@ -166,14 +167,6 @@ static int reset_simple_probe(struct platform_device *pdev) ...@@ -166,14 +167,6 @@ static int reset_simple_probe(struct platform_device *pdev)
data->status_active_low = devdata->status_active_low; data->status_active_low = devdata->status_active_low;
} }
if (of_device_is_compatible(dev->of_node, "altr,rst-mgr") &&
of_property_read_u32(dev->of_node, "altr,modrst-offset",
&reg_offset)) {
dev_warn(dev,
"missing altr,modrst-offset property, assuming 0x%x!\n",
reg_offset);
}
data->membase += reg_offset; data->membase += reg_offset;
return devm_reset_controller_register(dev, &data->rcdev); return devm_reset_controller_register(dev, &data->rcdev);
......
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2018, Intel Corporation
* Copied from reset-sunxi.c
*/
#include <linux/err.h>
#include <linux/io.h>
#include <linux/init.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/reset-controller.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/types.h>
#include "reset-simple.h"
#define SOCFPGA_NR_BANKS 8
void __init socfpga_reset_init(void);
static int a10_reset_init(struct device_node *np)
{
struct reset_simple_data *data;
struct resource res;
resource_size_t size;
int ret;
u32 reg_offset = 0x10;
data = kzalloc(sizeof(*data), GFP_KERNEL);
if (!data)
return -ENOMEM;
ret = of_address_to_resource(np, 0, &res);
if (ret)
goto err_alloc;
size = resource_size(&res);
if (!request_mem_region(res.start, size, np->name)) {
ret = -EBUSY;
goto err_alloc;
}
data->membase = ioremap(res.start, size);
if (!data->membase) {
ret = -ENOMEM;
goto err_alloc;
}
if (of_property_read_u32(np, "altr,modrst-offset", &reg_offset))
pr_warn("missing altr,modrst-offset property, assuming 0x10\n");
data->membase += reg_offset;
spin_lock_init(&data->lock);
data->rcdev.owner = THIS_MODULE;
data->rcdev.nr_resets = SOCFPGA_NR_BANKS * 32;
data->rcdev.ops = &reset_simple_ops;
data->rcdev.of_node = np;
data->status_active_low = true;
return reset_controller_register(&data->rcdev);
err_alloc:
kfree(data);
return ret;
};
/*
* These are the reset controller we need to initialize early on in
* our system, before we can even think of using a regular device
* driver for it.
* The controllers that we can register through the regular device
* model are handled by the simple reset driver directly.
*/
static const struct of_device_id socfpga_early_reset_dt_ids[] __initconst = {
{ .compatible = "altr,rst-mgr", },
{ /* sentinel */ },
};
void __init socfpga_reset_init(void)
{
struct device_node *np;
for_each_matching_node(np, socfpga_early_reset_dt_ids)
a10_reset_init(np);
}
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
// //
// reset-uniphier-usb3.c - USB3 reset driver for UniPhier // reset-uniphier-glue.c - Glue layer reset driver for UniPhier
// Copyright 2018 Socionext Inc. // Copyright 2018 Socionext Inc.
// Author: Kunihiko Hayashi <hayashi.kunihiko@socionext.com> // Author: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
...@@ -15,24 +15,24 @@ ...@@ -15,24 +15,24 @@
#define MAX_CLKS 2 #define MAX_CLKS 2
#define MAX_RSTS 2 #define MAX_RSTS 2
struct uniphier_usb3_reset_soc_data { struct uniphier_glue_reset_soc_data {
int nclks; int nclks;
const char * const *clock_names; const char * const *clock_names;
int nrsts; int nrsts;
const char * const *reset_names; const char * const *reset_names;
}; };
struct uniphier_usb3_reset_priv { struct uniphier_glue_reset_priv {
struct clk_bulk_data clk[MAX_CLKS]; struct clk_bulk_data clk[MAX_CLKS];
struct reset_control *rst[MAX_RSTS]; struct reset_control *rst[MAX_RSTS];
struct reset_simple_data rdata; struct reset_simple_data rdata;
const struct uniphier_usb3_reset_soc_data *data; const struct uniphier_glue_reset_soc_data *data;
}; };
static int uniphier_usb3_reset_probe(struct platform_device *pdev) static int uniphier_glue_reset_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct uniphier_usb3_reset_priv *priv; struct uniphier_glue_reset_priv *priv;
struct resource *res; struct resource *res;
resource_size_t size; resource_size_t size;
const char *name; const char *name;
...@@ -100,9 +100,9 @@ static int uniphier_usb3_reset_probe(struct platform_device *pdev) ...@@ -100,9 +100,9 @@ static int uniphier_usb3_reset_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int uniphier_usb3_reset_remove(struct platform_device *pdev) static int uniphier_glue_reset_remove(struct platform_device *pdev)
{ {
struct uniphier_usb3_reset_priv *priv = platform_get_drvdata(pdev); struct uniphier_glue_reset_priv *priv = platform_get_drvdata(pdev);
int i; int i;
for (i = 0; i < priv->data->nrsts; i++) for (i = 0; i < priv->data->nrsts; i++)
...@@ -117,7 +117,7 @@ static const char * const uniphier_pro4_clock_reset_names[] = { ...@@ -117,7 +117,7 @@ static const char * const uniphier_pro4_clock_reset_names[] = {
"gio", "link", "gio", "link",
}; };
static const struct uniphier_usb3_reset_soc_data uniphier_pro4_data = { static const struct uniphier_glue_reset_soc_data uniphier_pro4_data = {
.nclks = ARRAY_SIZE(uniphier_pro4_clock_reset_names), .nclks = ARRAY_SIZE(uniphier_pro4_clock_reset_names),
.clock_names = uniphier_pro4_clock_reset_names, .clock_names = uniphier_pro4_clock_reset_names,
.nrsts = ARRAY_SIZE(uniphier_pro4_clock_reset_names), .nrsts = ARRAY_SIZE(uniphier_pro4_clock_reset_names),
...@@ -128,14 +128,14 @@ static const char * const uniphier_pxs2_clock_reset_names[] = { ...@@ -128,14 +128,14 @@ static const char * const uniphier_pxs2_clock_reset_names[] = {
"link", "link",
}; };
static const struct uniphier_usb3_reset_soc_data uniphier_pxs2_data = { static const struct uniphier_glue_reset_soc_data uniphier_pxs2_data = {
.nclks = ARRAY_SIZE(uniphier_pxs2_clock_reset_names), .nclks = ARRAY_SIZE(uniphier_pxs2_clock_reset_names),
.clock_names = uniphier_pxs2_clock_reset_names, .clock_names = uniphier_pxs2_clock_reset_names,
.nrsts = ARRAY_SIZE(uniphier_pxs2_clock_reset_names), .nrsts = ARRAY_SIZE(uniphier_pxs2_clock_reset_names),
.reset_names = uniphier_pxs2_clock_reset_names, .reset_names = uniphier_pxs2_clock_reset_names,
}; };
static const struct of_device_id uniphier_usb3_reset_match[] = { static const struct of_device_id uniphier_glue_reset_match[] = {
{ {
.compatible = "socionext,uniphier-pro4-usb3-reset", .compatible = "socionext,uniphier-pro4-usb3-reset",
.data = &uniphier_pro4_data, .data = &uniphier_pro4_data,
...@@ -152,20 +152,32 @@ static const struct of_device_id uniphier_usb3_reset_match[] = { ...@@ -152,20 +152,32 @@ static const struct of_device_id uniphier_usb3_reset_match[] = {
.compatible = "socionext,uniphier-pxs3-usb3-reset", .compatible = "socionext,uniphier-pxs3-usb3-reset",
.data = &uniphier_pxs2_data, .data = &uniphier_pxs2_data,
}, },
{
.compatible = "socionext,uniphier-pro4-ahci-reset",
.data = &uniphier_pro4_data,
},
{
.compatible = "socionext,uniphier-pxs2-ahci-reset",
.data = &uniphier_pxs2_data,
},
{
.compatible = "socionext,uniphier-pxs3-ahci-reset",
.data = &uniphier_pxs2_data,
},
{ /* Sentinel */ } { /* Sentinel */ }
}; };
MODULE_DEVICE_TABLE(of, uniphier_usb3_reset_match); MODULE_DEVICE_TABLE(of, uniphier_glue_reset_match);
static struct platform_driver uniphier_usb3_reset_driver = { static struct platform_driver uniphier_glue_reset_driver = {
.probe = uniphier_usb3_reset_probe, .probe = uniphier_glue_reset_probe,
.remove = uniphier_usb3_reset_remove, .remove = uniphier_glue_reset_remove,
.driver = { .driver = {
.name = "uniphier-usb3-reset", .name = "uniphier-glue-reset",
.of_match_table = uniphier_usb3_reset_match, .of_match_table = uniphier_glue_reset_match,
}, },
}; };
module_platform_driver(uniphier_usb3_reset_driver); module_platform_driver(uniphier_glue_reset_driver);
MODULE_AUTHOR("Kunihiko Hayashi <hayashi.kunihiko@socionext.com>"); MODULE_AUTHOR("Kunihiko Hayashi <hayashi.kunihiko@socionext.com>");
MODULE_DESCRIPTION("UniPhier USB3 Reset Driver"); MODULE_DESCRIPTION("UniPhier Glue layer reset driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -32,6 +32,8 @@ struct reset_control *devm_reset_control_array_get(struct device *dev, ...@@ -32,6 +32,8 @@ struct reset_control *devm_reset_control_array_get(struct device *dev,
struct reset_control *of_reset_control_array_get(struct device_node *np, struct reset_control *of_reset_control_array_get(struct device_node *np,
bool shared, bool optional); bool shared, bool optional);
int reset_control_get_count(struct device *dev);
#else #else
static inline int reset_control_reset(struct reset_control *rstc) static inline int reset_control_reset(struct reset_control *rstc)
...@@ -97,6 +99,11 @@ of_reset_control_array_get(struct device_node *np, bool shared, bool optional) ...@@ -97,6 +99,11 @@ of_reset_control_array_get(struct device_node *np, bool shared, bool optional)
return optional ? NULL : ERR_PTR(-ENOTSUPP); return optional ? NULL : ERR_PTR(-ENOTSUPP);
} }
static inline int reset_control_get_count(struct device *dev)
{
return -ENOENT;
}
#endif /* CONFIG_RESET_CONTROLLER */ #endif /* CONFIG_RESET_CONTROLLER */
static inline int __must_check device_reset(struct device *dev) static inline int __must_check device_reset(struct device *dev)
...@@ -138,7 +145,7 @@ __must_check reset_control_get_exclusive(struct device *dev, const char *id) ...@@ -138,7 +145,7 @@ __must_check reset_control_get_exclusive(struct device *dev, const char *id)
* *
* Returns a struct reset_control or IS_ERR() condition containing errno. * Returns a struct reset_control or IS_ERR() condition containing errno.
* This function is intended for use with reset-controls which are shared * This function is intended for use with reset-controls which are shared
* between hardware-blocks. * between hardware blocks.
* *
* When a reset-control is shared, the behavior of reset_control_assert / * When a reset-control is shared, the behavior of reset_control_assert /
* deassert is changed, the reset-core will keep track of a deassert_count * deassert is changed, the reset-core will keep track of a deassert_count
...@@ -187,7 +194,7 @@ static inline struct reset_control *of_reset_control_get_exclusive( ...@@ -187,7 +194,7 @@ static inline struct reset_control *of_reset_control_get_exclusive(
} }
/** /**
* of_reset_control_get_shared - Lookup and obtain an shared reference * of_reset_control_get_shared - Lookup and obtain a shared reference
* to a reset controller. * to a reset controller.
* @node: device to be reset by the controller * @node: device to be reset by the controller
* @id: reset line name * @id: reset line name
...@@ -229,7 +236,7 @@ static inline struct reset_control *of_reset_control_get_exclusive_by_index( ...@@ -229,7 +236,7 @@ static inline struct reset_control *of_reset_control_get_exclusive_by_index(
} }
/** /**
* of_reset_control_get_shared_by_index - Lookup and obtain an shared * of_reset_control_get_shared_by_index - Lookup and obtain a shared
* reference to a reset controller * reference to a reset controller
* by index. * by index.
* @node: device to be reset by the controller * @node: device to be reset by the controller
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment