Link: https://lore.kernel.org/r/20260217200002.683975158@linuxfoundation.org Tested-by: Florian Fainelli <florian.fainelli@broadcom.com> Tested-by: Takeshi Ogasawara <takeshi.ogasawara@futuring-girl.com> Tested-by: Peter Schneider <pschneider1968@googlemail.com> Tested-by: Jon Hunter <jonathanh@nvidia.com> Tested-by: Salvatore Bonaccorso <carnil@debian.org> Tested-by: Brett A C Sheffield <bacs@librecast.net> Tested-by: Mark Brown <broonie@kernel.org> Tested-by: Luna Jernberg <droidbittin@gmail.com> Tested-by: Ronald Warsow <rwarsow@gmx.de> Tested-by: Justin M. Forbes <jforbes@fedoraproject.org> Tested-by: Ron Economos <re@w6rz.net> Tested-by: Miguel Ojeda <ojeda@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
200 lines
6.0 KiB
YAML
200 lines
6.0 KiB
YAML
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
|
%YAML 1.2
|
|
---
|
|
$id: http://devicetree.org/schemas/pinctrl/sprd,sc9860-pinctrl.yaml#
|
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
|
|
|
title: Spreadtrum SC9860 Pin Controller
|
|
|
|
maintainers:
|
|
- Baolin Wang <baolin.wang@linux.alibaba.com>
|
|
|
|
description: >
|
|
The Spreadtrum pin controller are organized in 3 blocks (types).
|
|
|
|
The first block comprises some global control registers, and each
|
|
register contains several bit fields with one bit or several bits
|
|
to configure for some global common configuration, such as domain
|
|
pad driving level, system control select and so on ("domain pad
|
|
driving level": One pin can output 3.0v or 1.8v, depending on the
|
|
related domain pad driving selection, if the related domain pad
|
|
select 3.0v, then the pin can output 3.0v. "system control" is used
|
|
to choose one function (like: UART0) for which system, since we
|
|
have several systems (AP/CP/CM4) on one SoC.).
|
|
|
|
There are too much various configuration that we can not list all
|
|
of them, so we can not make every Spreadtrum-special configuration
|
|
as one generic configuration, and maybe it will add more strange
|
|
global configuration in future. Then we add one "sprd,control" to
|
|
set these various global control configuration, and we need use
|
|
magic number for this property.
|
|
|
|
Moreover we recognize every fields comprising one bit or several
|
|
bits in one global control register as one pin, thus we should
|
|
record every pin's bit offset, bit width and register offset to
|
|
configure this field (pin).
|
|
|
|
The second block comprises some common registers which have unified
|
|
register definition, and each register described one pin is used
|
|
to configure the pin sleep mode, function select and sleep related
|
|
configuration.
|
|
|
|
Now we have 4 systems for sleep mode on SC9860 SoC: AP system,
|
|
PUBCP system, TGLDSP system and AGDSP system. And the pin sleep
|
|
related configuration are:
|
|
- input-enable
|
|
- input-disable
|
|
- output-high
|
|
- output-low
|
|
- bias-pull-up
|
|
- bias-pull-down
|
|
|
|
In some situation we need set the pin sleep mode and pin sleep related
|
|
configuration, to set the pin sleep related configuration automatically
|
|
by hardware when the system specified by sleep mode goes into deep
|
|
sleep mode. For example, if we set the pin sleep mode as PUBCP_SLEEP
|
|
and set the pin sleep related configuration as "input-enable", which
|
|
means when PUBCP system goes into deep sleep mode, this pin will be set
|
|
input enable automatically.
|
|
|
|
Moreover we can not use the "sleep" state, since some systems (like:
|
|
PUBCP system) do not run linux kernel OS (only AP system run linux
|
|
kernel on SC9860 platform), then we can not select "sleep" state
|
|
when the PUBCP system goes into deep sleep mode. Thus we introduce
|
|
"sprd,sleep-mode" property to set pin sleep mode.
|
|
|
|
The last block comprises some misc registers which also have unified
|
|
register definition, and each register described one pin is used to
|
|
configure drive strength, pull up/down and so on. Especially for pull
|
|
up, we have two kind pull up resistor: 20K and 4.7K.
|
|
|
|
properties:
|
|
compatible:
|
|
const: sprd,sc9860-pinctrl
|
|
|
|
reg:
|
|
maxItems: 1
|
|
|
|
additionalProperties:
|
|
$ref: '#/$defs/pin-node'
|
|
unevaluatedProperties: false
|
|
|
|
properties:
|
|
function:
|
|
description: Function to assign to the pins.
|
|
enum:
|
|
- func1
|
|
- func2
|
|
- func3
|
|
- func4
|
|
|
|
drive-strength:
|
|
description: Drive strength in mA.
|
|
$ref: /schemas/types.yaml#/definitions/uint32
|
|
enum: [2, 4, 6, 8, 10, 12, 14, 16, 20, 21, 24, 25, 27, 29, 31, 33]
|
|
|
|
input-schmitt-disable: true
|
|
|
|
input-schmitt-enable: true
|
|
|
|
bias-pull-up:
|
|
enum: [20000, 4700]
|
|
|
|
sprd,sleep-mode:
|
|
description: Pin sleep mode selection.
|
|
$ref: /schemas/types.yaml#/definitions/uint32
|
|
maximum: 0x1f
|
|
|
|
sprd,control:
|
|
description: Control values referring to databook for global control pins.
|
|
$ref: /schemas/types.yaml#/definitions/uint32
|
|
|
|
patternProperties:
|
|
'sleep$':
|
|
$ref: '#/$defs/pin-node'
|
|
unevaluatedProperties: false
|
|
|
|
properties:
|
|
bias-pull-up:
|
|
type: boolean
|
|
|
|
sleep-hardware-state:
|
|
description: Indicate these configs in sleep related state.
|
|
type: boolean
|
|
|
|
$defs:
|
|
pin-node:
|
|
type: object
|
|
allOf:
|
|
- $ref: /schemas/pinctrl/pincfg-node.yaml#
|
|
- $ref: /schemas/pinctrl/pinmux-node.yaml#
|
|
|
|
properties:
|
|
pins:
|
|
description: Names of pins to configure.
|
|
$ref: /schemas/types.yaml#/definitions/string-array
|
|
|
|
bias-disable:
|
|
description: Disable pin bias.
|
|
type: boolean
|
|
|
|
bias-pull-down:
|
|
description: Pull down on pin.
|
|
type: boolean
|
|
|
|
bias-pull-up: true
|
|
|
|
input-enable:
|
|
description: Enable pin input.
|
|
type: boolean
|
|
|
|
input-disable:
|
|
description: Enable pin output.
|
|
type: boolean
|
|
|
|
output-high:
|
|
description: Set the pin as an output level high.
|
|
type: boolean
|
|
|
|
output-low:
|
|
description: Set the pin as an output level low.
|
|
type: boolean
|
|
|
|
required:
|
|
- compatible
|
|
- reg
|
|
|
|
examples:
|
|
- |
|
|
pin_controller: pinctrl@402a0000 {
|
|
compatible = "sprd,sc9860-pinctrl";
|
|
reg = <0x402a0000 0x10000>;
|
|
|
|
grp1: sd0 {
|
|
pins = "SC9860_VIO_SD2_IRTE", "SC9860_VIO_SD0_IRTE";
|
|
sprd,control = <0x1>;
|
|
};
|
|
|
|
grp2: rfctl_33 {
|
|
pins = "SC9860_RFCTL33";
|
|
function = "func2";
|
|
sprd,sleep-mode = <3>;
|
|
grp2_sleep_mode: rfctl_33_sleep {
|
|
pins = "SC9860_RFCTL33";
|
|
sleep-hardware-state;
|
|
output-low;
|
|
};
|
|
};
|
|
|
|
grp3: rfctl_misc_20 {
|
|
pins = "SC9860_RFCTL20_MISC";
|
|
drive-strength = <10>;
|
|
bias-pull-up = <4700>;
|
|
grp3_sleep_mode: rfctl_misc_sleep {
|
|
pins = "SC9860_RFCTL20_MISC";
|
|
sleep-hardware-state;
|
|
bias-pull-up;
|
|
};
|
|
};
|
|
};
|