Reset controller updates for v5.5
This tag adds support for Meson SM1 ARB resets, Uniphier Pro5 USB3 resets, the Meson-A1 reset controller, SocFPGA Agilex resets, and Realtek RTD1195/RTD1295 resets. It adds some reset controller API keywords for get_maintainers.pl and makes a few remaining reset_control_ops const. Also included are a conversion of the Qualcomm device tree bindings to yaml and a few small kerneldoc improvements. -----BEGIN PGP SIGNATURE----- iI0EABYIADUWIQRRO6F6WdpH1R0vGibVhaclGDdiwAUCXbbwUxcccC56YWJlbEBw ZW5ndXRyb25peC5kZQAKCRDVhaclGDdiwEKeAP498UhJ8+GB8PUCpRIPAmFwjAON n+2EFHTn5Od08ueqqAEA4SH13tR5PJBo6G/J6KgLULUFts4Uc/Hb760/2ai3eQw= =eyHx -----END PGP SIGNATURE----- Merge tag 'reset-for-v5.5' of git://git.pengutronix.de/git/pza/linux into arm/drivers Reset controller updates for v5.5 This tag adds support for Meson SM1 ARB resets, Uniphier Pro5 USB3 resets, the Meson-A1 reset controller, SocFPGA Agilex resets, and Realtek RTD1195/RTD1295 resets. It adds some reset controller API keywords for get_maintainers.pl and makes a few remaining reset_control_ops const. Also included are a conversion of the Qualcomm device tree bindings to yaml and a few small kerneldoc improvements. * tag 'reset-for-v5.5' of git://git.pengutronix.de/git/pza/linux: reset: document (devm_)reset_control_get_optional variants reset: improve of_xlate documentation reset: simple: Add Realtek RTD1195/RTD1295 reset: simple: Keep alphabetical order MAINTAINERS: add reset controller framework keywords reset: zynqmp: Make reset_control_ops const reset: hisilicon: hi3660: Make reset_control_ops const reset: build simple reset controller driver for Agilex reset: add support for the Meson-A1 SoC Reset Controller dt-bindings: reset: add bindings for the Meson-A1 SoC Reset Controller reset: uniphier-glue: Add Pro5 USB3 support dt-bindings: reset: pdc: Convert PDC Global bindings to yaml dt-bindings: reset: aoss: Convert AOSS reset bindings to yaml reset: Remove copy'n'paste redundancy in the comments reset: meson-audio-arb: add sm1 support reset: dt-bindings: meson: update arb bindings for sm1 Link: https://lore.kernel.org/r/ede6874508472d0917dca770ef80b90626b0f205.camel@pengutronix.de Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
b7f7a0b58f
|
@ -4,7 +4,8 @@ The Amlogic Audio ARB is a simple device which enables or
|
||||||
disables the access of Audio FIFOs to DDR on AXG based SoC.
|
disables the access of Audio FIFOs to DDR on AXG based SoC.
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: 'amlogic,meson-axg-audio-arb'
|
- compatible: 'amlogic,meson-axg-audio-arb' or
|
||||||
|
'amlogic,meson-sm1-audio-arb'
|
||||||
- reg: physical base address of the controller and length of memory
|
- reg: physical base address of the controller and length of memory
|
||||||
mapped region.
|
mapped region.
|
||||||
- clocks: phandle to the fifo peripheral clock provided by the audio
|
- clocks: phandle to the fifo peripheral clock provided by the audio
|
||||||
|
|
|
@ -16,6 +16,7 @@ properties:
|
||||||
- amlogic,meson8b-reset # Reset Controller on Meson8b and compatible SoCs
|
- amlogic,meson8b-reset # Reset Controller on Meson8b and compatible SoCs
|
||||||
- amlogic,meson-gxbb-reset # Reset Controller on GXBB and compatible SoCs
|
- amlogic,meson-gxbb-reset # Reset Controller on GXBB and compatible SoCs
|
||||||
- amlogic,meson-axg-reset # Reset Controller on AXG and compatible SoCs
|
- amlogic,meson-axg-reset # Reset Controller on AXG and compatible SoCs
|
||||||
|
- amlogic,meson-a1-reset # Reset Controller on A1 and compatible SoCs
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
Qualcomm AOSS Reset Controller
|
|
||||||
======================================
|
|
||||||
|
|
||||||
This binding describes a reset-controller found on AOSS-CC (always on subsystem)
|
|
||||||
for Qualcomm SDM845 SoCs.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible:
|
|
||||||
Usage: required
|
|
||||||
Value type: <string>
|
|
||||||
Definition: must be:
|
|
||||||
"qcom,sdm845-aoss-cc"
|
|
||||||
|
|
||||||
- reg:
|
|
||||||
Usage: required
|
|
||||||
Value type: <prop-encoded-array>
|
|
||||||
Definition: must specify the base address and size of the register
|
|
||||||
space.
|
|
||||||
|
|
||||||
- #reset-cells:
|
|
||||||
Usage: required
|
|
||||||
Value type: <uint>
|
|
||||||
Definition: must be 1; cell entry represents the reset index.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
aoss_reset: reset-controller@c2a0000 {
|
|
||||||
compatible = "qcom,sdm845-aoss-cc";
|
|
||||||
reg = <0xc2a0000 0x31000>;
|
|
||||||
#reset-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
Specifying reset lines connected to IP modules
|
|
||||||
==============================================
|
|
||||||
|
|
||||||
Device nodes that need access to reset lines should
|
|
||||||
specify them as a reset phandle in their corresponding node as
|
|
||||||
specified in reset.txt.
|
|
||||||
|
|
||||||
For list of all valid reset indicies see
|
|
||||||
<dt-bindings/reset/qcom,sdm845-aoss.h>
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
modem-pil@4080000 {
|
|
||||||
...
|
|
||||||
|
|
||||||
resets = <&aoss_reset AOSS_CC_MSS_RESTART>;
|
|
||||||
reset-names = "mss_restart";
|
|
||||||
|
|
||||||
...
|
|
||||||
};
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/reset/qcom,aoss-reset.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Qualcomm AOSS Reset Controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Sibi Sankar <sibis@codeaurora.org>
|
||||||
|
|
||||||
|
description:
|
||||||
|
The bindings describe the reset-controller found on AOSS-CC (always on
|
||||||
|
subsystem) for Qualcomm Technologies Inc SoCs.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- description: on SC7180 SoCs the following compatibles must be specified
|
||||||
|
items:
|
||||||
|
- const: "qcom,sc7180-aoss-cc"
|
||||||
|
- const: "qcom,sdm845-aoss-cc"
|
||||||
|
|
||||||
|
- description: on SDM845 SoCs the following compatibles must be specified
|
||||||
|
items:
|
||||||
|
- const: "qcom,sdm845-aoss-cc"
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
'#reset-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- '#reset-cells'
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
aoss_reset: reset-controller@c2a0000 {
|
||||||
|
compatible = "qcom,sdm845-aoss-cc";
|
||||||
|
reg = <0xc2a0000 0x31000>;
|
||||||
|
#reset-cells = <1>;
|
||||||
|
};
|
|
@ -1,52 +0,0 @@
|
||||||
PDC Global
|
|
||||||
======================================
|
|
||||||
|
|
||||||
This binding describes a reset-controller found on PDC-Global (Power Domain
|
|
||||||
Controller) block for Qualcomm Technologies Inc SDM845 SoCs.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible:
|
|
||||||
Usage: required
|
|
||||||
Value type: <string>
|
|
||||||
Definition: must be:
|
|
||||||
"qcom,sdm845-pdc-global"
|
|
||||||
|
|
||||||
- reg:
|
|
||||||
Usage: required
|
|
||||||
Value type: <prop-encoded-array>
|
|
||||||
Definition: must specify the base address and size of the register
|
|
||||||
space.
|
|
||||||
|
|
||||||
- #reset-cells:
|
|
||||||
Usage: required
|
|
||||||
Value type: <uint>
|
|
||||||
Definition: must be 1; cell entry represents the reset index.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
pdc_reset: reset-controller@b2e0000 {
|
|
||||||
compatible = "qcom,sdm845-pdc-global";
|
|
||||||
reg = <0xb2e0000 0x20000>;
|
|
||||||
#reset-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
PDC reset clients
|
|
||||||
======================================
|
|
||||||
|
|
||||||
Device nodes that need access to reset lines should
|
|
||||||
specify them as a reset phandle in their corresponding node as
|
|
||||||
specified in reset.txt.
|
|
||||||
|
|
||||||
For a list of all valid reset indices see
|
|
||||||
<dt-bindings/reset/qcom,sdm845-pdc.h>
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
modem-pil@4080000 {
|
|
||||||
...
|
|
||||||
|
|
||||||
resets = <&pdc_reset PDC_MODEM_SYNC_RESET>;
|
|
||||||
reset-names = "pdc_reset";
|
|
||||||
|
|
||||||
...
|
|
||||||
};
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/reset/qcom,pdc-global.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Qualcomm PDC Global
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Sibi Sankar <sibis@codeaurora.org>
|
||||||
|
|
||||||
|
description:
|
||||||
|
The bindings describes the reset-controller found on PDC-Global (Power Domain
|
||||||
|
Controller) block for Qualcomm Technologies Inc SoCs.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- description: on SC7180 SoCs the following compatibles must be specified
|
||||||
|
items:
|
||||||
|
- const: "qcom,sc7180-pdc-global"
|
||||||
|
- const: "qcom,sdm845-pdc-global"
|
||||||
|
|
||||||
|
- description: on SDM845 SoCs the following compatibles must be specified
|
||||||
|
items:
|
||||||
|
- const: "qcom,sdm845-pdc-global"
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
'#reset-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- '#reset-cells'
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
pdc_reset: reset-controller@b2e0000 {
|
||||||
|
compatible = "qcom,sdm845-pdc-global";
|
||||||
|
reg = <0xb2e0000 0x20000>;
|
||||||
|
#reset-cells = <1>;
|
||||||
|
};
|
|
@ -130,6 +130,7 @@ 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 USB3
|
"socionext,uniphier-pro4-usb3-reset" - for Pro4 SoC USB3
|
||||||
|
"socionext,uniphier-pro5-usb3-reset" - for Pro5 SoC USB3
|
||||||
"socionext,uniphier-pxs2-usb3-reset" - for PXs2 SoC USB3
|
"socionext,uniphier-pxs2-usb3-reset" - for PXs2 SoC USB3
|
||||||
"socionext,uniphier-ld20-usb3-reset" - for LD20 SoC USB3
|
"socionext,uniphier-ld20-usb3-reset" - for LD20 SoC USB3
|
||||||
"socionext,uniphier-pxs3-usb3-reset" - for PXs3 SoC USB3
|
"socionext,uniphier-pxs3-usb3-reset" - for PXs3 SoC USB3
|
||||||
|
@ -141,12 +142,12 @@ Required properties:
|
||||||
- clocks: A list of phandles to the clock gate for the 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 and Pro5 SoCs
|
||||||
"link" - for others
|
"link" - for others
|
||||||
- resets: A list of phandles to the reset control for the 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 and Pro5 SoCs
|
||||||
"link" - for others
|
"link" - for others
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
|
@ -13872,6 +13872,7 @@ F: include/dt-bindings/reset/
|
||||||
F: include/linux/reset.h
|
F: include/linux/reset.h
|
||||||
F: include/linux/reset/
|
F: include/linux/reset/
|
||||||
F: include/linux/reset-controller.h
|
F: include/linux/reset-controller.h
|
||||||
|
K: \b(?:devm_|of_)?reset_control(?:ler_[a-z]+|_[a-z_]+)?\b
|
||||||
|
|
||||||
RESTARTABLE SEQUENCES SUPPORT
|
RESTARTABLE SEQUENCES SUPPORT
|
||||||
M: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
|
M: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
|
||||||
|
|
|
@ -129,7 +129,7 @@ config RESET_SCMI
|
||||||
|
|
||||||
config RESET_SIMPLE
|
config RESET_SIMPLE
|
||||||
bool "Simple Reset Controller Driver" if COMPILE_TEST
|
bool "Simple Reset Controller Driver" if COMPILE_TEST
|
||||||
default ARCH_STM32 || ARCH_STRATIX10 || ARCH_SUNXI || ARCH_ZX || ARCH_ASPEED || ARCH_BITMAIN || ARC
|
default ARCH_AGILEX || ARCH_ASPEED || ARCH_BITMAIN || ARCH_REALTEK || ARCH_STM32 || ARCH_STRATIX10 || ARCH_SUNXI || ARCH_ZX || ARC
|
||||||
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,
|
||||||
|
@ -138,10 +138,11 @@ config RESET_SIMPLE
|
||||||
Currently this driver supports:
|
Currently this driver supports:
|
||||||
- Altera SoCFPGAs
|
- Altera SoCFPGAs
|
||||||
- ASPEED BMC SoCs
|
- ASPEED BMC SoCs
|
||||||
|
- Bitmain BM1880 SoC
|
||||||
|
- Realtek SoCs
|
||||||
- RCC reset controller in STM32 MCUs
|
- RCC reset controller in STM32 MCUs
|
||||||
- Allwinner SoCs
|
- Allwinner SoCs
|
||||||
- ZTE's zx2967 family
|
- ZTE's zx2967 family
|
||||||
- Bitmain BM1880 SoC
|
|
||||||
|
|
||||||
config RESET_STM32MP157
|
config RESET_STM32MP157
|
||||||
bool "STM32MP157 Reset Driver" if COMPILE_TEST
|
bool "STM32MP157 Reset Driver" if COMPILE_TEST
|
||||||
|
|
|
@ -78,8 +78,10 @@ static const char *rcdev_name(struct reset_controller_dev *rcdev)
|
||||||
* @reset_spec: reset line specifier as found in the device tree
|
* @reset_spec: reset line specifier as found in the device tree
|
||||||
* @flags: a flags pointer to fill in (optional)
|
* @flags: a flags pointer to fill in (optional)
|
||||||
*
|
*
|
||||||
* This simple translation function should be used for reset controllers
|
* This static translation function is used by default if of_xlate in
|
||||||
* with 1:1 mapping, where reset lines can be indexed by number without gaps.
|
* :c:type:`reset_controller_dev` is not set. It is useful for all reset
|
||||||
|
* controllers with 1:1 mapping, where reset lines can be indexed by number
|
||||||
|
* without gaps.
|
||||||
*/
|
*/
|
||||||
static int of_reset_simple_xlate(struct reset_controller_dev *rcdev,
|
static int of_reset_simple_xlate(struct reset_controller_dev *rcdev,
|
||||||
const struct of_phandle_args *reset_spec)
|
const struct of_phandle_args *reset_spec)
|
||||||
|
@ -334,7 +336,6 @@ EXPORT_SYMBOL_GPL(reset_control_reset);
|
||||||
* internal state to be reset, but must be prepared for this to happen.
|
* internal state to be reset, but must be prepared for this to happen.
|
||||||
* Consumers must not use reset_control_reset on shared reset lines when
|
* Consumers must not use reset_control_reset on shared reset lines when
|
||||||
* reset_control_(de)assert has been used.
|
* reset_control_(de)assert has been used.
|
||||||
* return 0.
|
|
||||||
*
|
*
|
||||||
* If rstc is NULL it is an optional reset and the function will just
|
* If rstc is NULL it is an optional reset and the function will just
|
||||||
* return 0.
|
* return 0.
|
||||||
|
@ -393,7 +394,6 @@ EXPORT_SYMBOL_GPL(reset_control_assert);
|
||||||
* After calling this function, the reset is guaranteed to be deasserted.
|
* After calling this function, the reset is guaranteed to be deasserted.
|
||||||
* Consumers must not use reset_control_reset on shared reset lines when
|
* Consumers must not use reset_control_reset on shared reset lines when
|
||||||
* reset_control_(de)assert has been used.
|
* reset_control_(de)assert has been used.
|
||||||
* return 0.
|
|
||||||
*
|
*
|
||||||
* If rstc is NULL it is an optional reset and the function will just
|
* If rstc is NULL it is an optional reset and the function will just
|
||||||
* return 0.
|
* return 0.
|
||||||
|
|
|
@ -56,7 +56,7 @@ static int hi3660_reset_dev(struct reset_controller_dev *rcdev,
|
||||||
return hi3660_reset_deassert(rcdev, idx);
|
return hi3660_reset_deassert(rcdev, idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct reset_control_ops hi3660_reset_ops = {
|
static const struct reset_control_ops hi3660_reset_ops = {
|
||||||
.reset = hi3660_reset_dev,
|
.reset = hi3660_reset_dev,
|
||||||
.assert = hi3660_reset_assert,
|
.assert = hi3660_reset_assert,
|
||||||
.deassert = hi3660_reset_deassert,
|
.deassert = hi3660_reset_deassert,
|
||||||
|
|
|
@ -19,6 +19,11 @@ struct meson_audio_arb_data {
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct meson_audio_arb_match_data {
|
||||||
|
const unsigned int *reset_bits;
|
||||||
|
unsigned int reset_num;
|
||||||
|
};
|
||||||
|
|
||||||
#define ARB_GENERAL_BIT 31
|
#define ARB_GENERAL_BIT 31
|
||||||
|
|
||||||
static const unsigned int axg_audio_arb_reset_bits[] = {
|
static const unsigned int axg_audio_arb_reset_bits[] = {
|
||||||
|
@ -30,6 +35,27 @@ static const unsigned int axg_audio_arb_reset_bits[] = {
|
||||||
[AXG_ARB_FRDDR_C] = 6,
|
[AXG_ARB_FRDDR_C] = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct meson_audio_arb_match_data axg_audio_arb_match = {
|
||||||
|
.reset_bits = axg_audio_arb_reset_bits,
|
||||||
|
.reset_num = ARRAY_SIZE(axg_audio_arb_reset_bits),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const unsigned int sm1_audio_arb_reset_bits[] = {
|
||||||
|
[AXG_ARB_TODDR_A] = 0,
|
||||||
|
[AXG_ARB_TODDR_B] = 1,
|
||||||
|
[AXG_ARB_TODDR_C] = 2,
|
||||||
|
[AXG_ARB_FRDDR_A] = 4,
|
||||||
|
[AXG_ARB_FRDDR_B] = 5,
|
||||||
|
[AXG_ARB_FRDDR_C] = 6,
|
||||||
|
[AXG_ARB_TODDR_D] = 3,
|
||||||
|
[AXG_ARB_FRDDR_D] = 7,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct meson_audio_arb_match_data sm1_audio_arb_match = {
|
||||||
|
.reset_bits = sm1_audio_arb_reset_bits,
|
||||||
|
.reset_num = ARRAY_SIZE(sm1_audio_arb_reset_bits),
|
||||||
|
};
|
||||||
|
|
||||||
static int meson_audio_arb_update(struct reset_controller_dev *rcdev,
|
static int meson_audio_arb_update(struct reset_controller_dev *rcdev,
|
||||||
unsigned long id, bool assert)
|
unsigned long id, bool assert)
|
||||||
{
|
{
|
||||||
|
@ -82,7 +108,13 @@ static const struct reset_control_ops meson_audio_arb_rstc_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct of_device_id meson_audio_arb_of_match[] = {
|
static const struct of_device_id meson_audio_arb_of_match[] = {
|
||||||
{ .compatible = "amlogic,meson-axg-audio-arb", },
|
{
|
||||||
|
.compatible = "amlogic,meson-axg-audio-arb",
|
||||||
|
.data = &axg_audio_arb_match,
|
||||||
|
}, {
|
||||||
|
.compatible = "amlogic,meson-sm1-audio-arb",
|
||||||
|
.data = &sm1_audio_arb_match,
|
||||||
|
},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, meson_audio_arb_of_match);
|
MODULE_DEVICE_TABLE(of, meson_audio_arb_of_match);
|
||||||
|
@ -104,10 +136,15 @@ static int meson_audio_arb_remove(struct platform_device *pdev)
|
||||||
static int meson_audio_arb_probe(struct platform_device *pdev)
|
static int meson_audio_arb_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
|
const struct meson_audio_arb_match_data *data;
|
||||||
struct meson_audio_arb_data *arb;
|
struct meson_audio_arb_data *arb;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
data = of_device_get_match_data(dev);
|
||||||
|
if (!data)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
arb = devm_kzalloc(dev, sizeof(*arb), GFP_KERNEL);
|
arb = devm_kzalloc(dev, sizeof(*arb), GFP_KERNEL);
|
||||||
if (!arb)
|
if (!arb)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -126,8 +163,8 @@ static int meson_audio_arb_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(arb->regs);
|
return PTR_ERR(arb->regs);
|
||||||
|
|
||||||
spin_lock_init(&arb->lock);
|
spin_lock_init(&arb->lock);
|
||||||
arb->reset_bits = axg_audio_arb_reset_bits;
|
arb->reset_bits = data->reset_bits;
|
||||||
arb->rstc.nr_resets = ARRAY_SIZE(axg_audio_arb_reset_bits);
|
arb->rstc.nr_resets = data->reset_num;
|
||||||
arb->rstc.ops = &meson_audio_arb_rstc_ops;
|
arb->rstc.ops = &meson_audio_arb_rstc_ops;
|
||||||
arb->rstc.of_node = dev->of_node;
|
arb->rstc.of_node = dev->of_node;
|
||||||
arb->rstc.owner = THIS_MODULE;
|
arb->rstc.owner = THIS_MODULE;
|
||||||
|
|
|
@ -15,12 +15,16 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
|
|
||||||
#define REG_COUNT 8
|
|
||||||
#define BITS_PER_REG 32
|
#define BITS_PER_REG 32
|
||||||
#define LEVEL_OFFSET 0x7c
|
|
||||||
|
struct meson_reset_param {
|
||||||
|
int reg_count;
|
||||||
|
int level_offset;
|
||||||
|
};
|
||||||
|
|
||||||
struct meson_reset {
|
struct meson_reset {
|
||||||
void __iomem *reg_base;
|
void __iomem *reg_base;
|
||||||
|
const struct meson_reset_param *param;
|
||||||
struct reset_controller_dev rcdev;
|
struct reset_controller_dev rcdev;
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
};
|
};
|
||||||
|
@ -46,10 +50,12 @@ static int meson_reset_level(struct reset_controller_dev *rcdev,
|
||||||
container_of(rcdev, struct meson_reset, rcdev);
|
container_of(rcdev, struct meson_reset, rcdev);
|
||||||
unsigned int bank = id / BITS_PER_REG;
|
unsigned int bank = id / BITS_PER_REG;
|
||||||
unsigned int offset = id % BITS_PER_REG;
|
unsigned int offset = id % BITS_PER_REG;
|
||||||
void __iomem *reg_addr = data->reg_base + LEVEL_OFFSET + (bank << 2);
|
void __iomem *reg_addr;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
|
||||||
|
reg_addr = data->reg_base + data->param->level_offset + (bank << 2);
|
||||||
|
|
||||||
spin_lock_irqsave(&data->lock, flags);
|
spin_lock_irqsave(&data->lock, flags);
|
||||||
|
|
||||||
reg = readl(reg_addr);
|
reg = readl(reg_addr);
|
||||||
|
@ -81,10 +87,21 @@ static const struct reset_control_ops meson_reset_ops = {
|
||||||
.deassert = meson_reset_deassert,
|
.deassert = meson_reset_deassert,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct meson_reset_param meson8b_param = {
|
||||||
|
.reg_count = 8,
|
||||||
|
.level_offset = 0x7c,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct meson_reset_param meson_a1_param = {
|
||||||
|
.reg_count = 3,
|
||||||
|
.level_offset = 0x40,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct of_device_id meson_reset_dt_ids[] = {
|
static const struct of_device_id meson_reset_dt_ids[] = {
|
||||||
{ .compatible = "amlogic,meson8b-reset" },
|
{ .compatible = "amlogic,meson8b-reset", .data = &meson8b_param},
|
||||||
{ .compatible = "amlogic,meson-gxbb-reset" },
|
{ .compatible = "amlogic,meson-gxbb-reset", .data = &meson8b_param},
|
||||||
{ .compatible = "amlogic,meson-axg-reset" },
|
{ .compatible = "amlogic,meson-axg-reset", .data = &meson8b_param},
|
||||||
|
{ .compatible = "amlogic,meson-a1-reset", .data = &meson_a1_param},
|
||||||
{ /* sentinel */ },
|
{ /* sentinel */ },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -102,12 +119,16 @@ static int meson_reset_probe(struct platform_device *pdev)
|
||||||
if (IS_ERR(data->reg_base))
|
if (IS_ERR(data->reg_base))
|
||||||
return PTR_ERR(data->reg_base);
|
return PTR_ERR(data->reg_base);
|
||||||
|
|
||||||
|
data->param = of_device_get_match_data(&pdev->dev);
|
||||||
|
if (!data->param)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
platform_set_drvdata(pdev, data);
|
platform_set_drvdata(pdev, data);
|
||||||
|
|
||||||
spin_lock_init(&data->lock);
|
spin_lock_init(&data->lock);
|
||||||
|
|
||||||
data->rcdev.owner = THIS_MODULE;
|
data->rcdev.owner = THIS_MODULE;
|
||||||
data->rcdev.nr_resets = REG_COUNT * BITS_PER_REG;
|
data->rcdev.nr_resets = data->param->reg_count * BITS_PER_REG;
|
||||||
data->rcdev.ops = &meson_reset_ops;
|
data->rcdev.ops = &meson_reset_ops;
|
||||||
data->rcdev.of_node = pdev->dev.of_node;
|
data->rcdev.of_node = pdev->dev.of_node;
|
||||||
|
|
||||||
|
|
|
@ -140,6 +140,10 @@ 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,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.compatible = "socionext,uniphier-pro5-usb3-reset",
|
||||||
|
.data = &uniphier_pro4_data,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.compatible = "socionext,uniphier-pxs2-usb3-reset",
|
.compatible = "socionext,uniphier-pxs2-usb3-reset",
|
||||||
.data = &uniphier_pxs2_data,
|
.data = &uniphier_pxs2_data,
|
||||||
|
|
|
@ -64,7 +64,7 @@ static int zynqmp_reset_reset(struct reset_controller_dev *rcdev,
|
||||||
PM_RESET_ACTION_PULSE);
|
PM_RESET_ACTION_PULSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct reset_control_ops zynqmp_reset_ops = {
|
static const struct reset_control_ops zynqmp_reset_ops = {
|
||||||
.reset = zynqmp_reset_reset,
|
.reset = zynqmp_reset_reset,
|
||||||
.assert = zynqmp_reset_assert,
|
.assert = zynqmp_reset_assert,
|
||||||
.deassert = zynqmp_reset_deassert,
|
.deassert = zynqmp_reset_deassert,
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
|
||||||
|
* Author: Xingyu Chen <xingyu.chen@amlogic.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DT_BINDINGS_AMLOGIC_MESON_A1_RESET_H
|
||||||
|
#define _DT_BINDINGS_AMLOGIC_MESON_A1_RESET_H
|
||||||
|
|
||||||
|
/* RESET0 */
|
||||||
|
/* 0 */
|
||||||
|
#define RESET_AM2AXI_VAD 1
|
||||||
|
/* 2-3 */
|
||||||
|
#define RESET_PSRAM 4
|
||||||
|
#define RESET_PAD_CTRL 5
|
||||||
|
/* 6 */
|
||||||
|
#define RESET_TEMP_SENSOR 7
|
||||||
|
#define RESET_AM2AXI_DEV 8
|
||||||
|
/* 9 */
|
||||||
|
#define RESET_SPICC_A 10
|
||||||
|
#define RESET_MSR_CLK 11
|
||||||
|
#define RESET_AUDIO 12
|
||||||
|
#define RESET_ANALOG_CTRL 13
|
||||||
|
#define RESET_SAR_ADC 14
|
||||||
|
#define RESET_AUDIO_VAD 15
|
||||||
|
#define RESET_CEC 16
|
||||||
|
#define RESET_PWM_EF 17
|
||||||
|
#define RESET_PWM_CD 18
|
||||||
|
#define RESET_PWM_AB 19
|
||||||
|
/* 20 */
|
||||||
|
#define RESET_IR_CTRL 21
|
||||||
|
#define RESET_I2C_S_A 22
|
||||||
|
/* 23 */
|
||||||
|
#define RESET_I2C_M_D 24
|
||||||
|
#define RESET_I2C_M_C 25
|
||||||
|
#define RESET_I2C_M_B 26
|
||||||
|
#define RESET_I2C_M_A 27
|
||||||
|
#define RESET_I2C_PROD_AHB 28
|
||||||
|
#define RESET_I2C_PROD 29
|
||||||
|
/* 30-31 */
|
||||||
|
|
||||||
|
/* RESET1 */
|
||||||
|
#define RESET_ACODEC 32
|
||||||
|
#define RESET_DMA 33
|
||||||
|
#define RESET_SD_EMMC_A 34
|
||||||
|
/* 35 */
|
||||||
|
#define RESET_USBCTRL 36
|
||||||
|
/* 37 */
|
||||||
|
#define RESET_USBPHY 38
|
||||||
|
/* 39-41 */
|
||||||
|
#define RESET_RSA 42
|
||||||
|
#define RESET_DMC 43
|
||||||
|
/* 44 */
|
||||||
|
#define RESET_IRQ_CTRL 45
|
||||||
|
/* 46 */
|
||||||
|
#define RESET_NIC_VAD 47
|
||||||
|
#define RESET_NIC_AXI 48
|
||||||
|
#define RESET_RAMA 49
|
||||||
|
#define RESET_RAMB 50
|
||||||
|
/* 51-52 */
|
||||||
|
#define RESET_ROM 53
|
||||||
|
#define RESET_SPIFC 54
|
||||||
|
#define RESET_GIC 55
|
||||||
|
#define RESET_UART_C 56
|
||||||
|
#define RESET_UART_B 57
|
||||||
|
#define RESET_UART_A 58
|
||||||
|
#define RESET_OSC_RING 59
|
||||||
|
/* 60-63 */
|
||||||
|
|
||||||
|
/* RESET2 */
|
||||||
|
/* 64-95 */
|
||||||
|
|
||||||
|
#endif
|
|
@ -13,5 +13,7 @@
|
||||||
#define AXG_ARB_FRDDR_A 3
|
#define AXG_ARB_FRDDR_A 3
|
||||||
#define AXG_ARB_FRDDR_B 4
|
#define AXG_ARB_FRDDR_B 4
|
||||||
#define AXG_ARB_FRDDR_C 5
|
#define AXG_ARB_FRDDR_C 5
|
||||||
|
#define AXG_ARB_TODDR_D 6
|
||||||
|
#define AXG_ARB_FRDDR_D 7
|
||||||
|
|
||||||
#endif /* _DT_BINDINGS_AMLOGIC_MESON_AXG_AUDIO_ARB_H */
|
#endif /* _DT_BINDINGS_AMLOGIC_MESON_AXG_AUDIO_ARB_H */
|
||||||
|
|
|
@ -62,7 +62,8 @@ struct reset_control_lookup {
|
||||||
* @of_node: corresponding device tree node as phandle target
|
* @of_node: corresponding device tree node as phandle target
|
||||||
* @of_reset_n_cells: number of cells in reset line specifiers
|
* @of_reset_n_cells: number of cells in reset line specifiers
|
||||||
* @of_xlate: translation function to translate from specifier as found in the
|
* @of_xlate: translation function to translate from specifier as found in the
|
||||||
* device tree to id as given to the reset control ops
|
* device tree to id as given to the reset control ops, defaults
|
||||||
|
* to :c:func:`of_reset_simple_xlate`.
|
||||||
* @nr_resets: number of reset controls in this reset controller device
|
* @nr_resets: number of reset controls in this reset controller device
|
||||||
*/
|
*/
|
||||||
struct reset_controller_dev {
|
struct reset_controller_dev {
|
||||||
|
|
|
@ -203,12 +203,34 @@ static inline struct reset_control *reset_control_get_shared(
|
||||||
return __reset_control_get(dev, id, 0, true, false, false);
|
return __reset_control_get(dev, id, 0, true, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* reset_control_get_optional_exclusive - optional reset_control_get_exclusive()
|
||||||
|
* @dev: device to be reset by the controller
|
||||||
|
* @id: reset line name
|
||||||
|
*
|
||||||
|
* Optional variant of reset_control_get_exclusive(). If the requested reset
|
||||||
|
* is not specified in the device tree, this function returns NULL instead of
|
||||||
|
* an error.
|
||||||
|
*
|
||||||
|
* See reset_control_get_exclusive() for more information.
|
||||||
|
*/
|
||||||
static inline struct reset_control *reset_control_get_optional_exclusive(
|
static inline struct reset_control *reset_control_get_optional_exclusive(
|
||||||
struct device *dev, const char *id)
|
struct device *dev, const char *id)
|
||||||
{
|
{
|
||||||
return __reset_control_get(dev, id, 0, false, true, true);
|
return __reset_control_get(dev, id, 0, false, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* reset_control_get_optional_shared - optional reset_control_get_shared()
|
||||||
|
* @dev: device to be reset by the controller
|
||||||
|
* @id: reset line name
|
||||||
|
*
|
||||||
|
* Optional variant of reset_control_get_shared(). If the requested reset
|
||||||
|
* is not specified in the device tree, this function returns NULL instead of
|
||||||
|
* an error.
|
||||||
|
*
|
||||||
|
* See reset_control_get_shared() for more information.
|
||||||
|
*/
|
||||||
static inline struct reset_control *reset_control_get_optional_shared(
|
static inline struct reset_control *reset_control_get_optional_shared(
|
||||||
struct device *dev, const char *id)
|
struct device *dev, const char *id)
|
||||||
{
|
{
|
||||||
|
@ -354,12 +376,36 @@ static inline struct reset_control *devm_reset_control_get_shared(
|
||||||
return __devm_reset_control_get(dev, id, 0, true, false, false);
|
return __devm_reset_control_get(dev, id, 0, true, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* devm_reset_control_get_optional_exclusive - resource managed
|
||||||
|
* reset_control_get_optional_exclusive()
|
||||||
|
* @dev: device to be reset by the controller
|
||||||
|
* @id: reset line name
|
||||||
|
*
|
||||||
|
* Managed reset_control_get_optional_exclusive(). For reset controllers
|
||||||
|
* returned from this function, reset_control_put() is called automatically on
|
||||||
|
* driver detach.
|
||||||
|
*
|
||||||
|
* See reset_control_get_optional_exclusive() for more information.
|
||||||
|
*/
|
||||||
static inline struct reset_control *devm_reset_control_get_optional_exclusive(
|
static inline struct reset_control *devm_reset_control_get_optional_exclusive(
|
||||||
struct device *dev, const char *id)
|
struct device *dev, const char *id)
|
||||||
{
|
{
|
||||||
return __devm_reset_control_get(dev, id, 0, false, true, true);
|
return __devm_reset_control_get(dev, id, 0, false, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* devm_reset_control_get_optional_shared - resource managed
|
||||||
|
* reset_control_get_optional_shared()
|
||||||
|
* @dev: device to be reset by the controller
|
||||||
|
* @id: reset line name
|
||||||
|
*
|
||||||
|
* Managed reset_control_get_optional_shared(). For reset controllers returned
|
||||||
|
* from this function, reset_control_put() is called automatically on driver
|
||||||
|
* detach.
|
||||||
|
*
|
||||||
|
* See reset_control_get_optional_shared() for more information.
|
||||||
|
*/
|
||||||
static inline struct reset_control *devm_reset_control_get_optional_shared(
|
static inline struct reset_control *devm_reset_control_get_optional_shared(
|
||||||
struct device *dev, const char *id)
|
struct device *dev, const char *id)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue