blob: 59d23eb8aa973d2c70747f092714671dc0d11102 [file] [edit]
# 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;
};
};
};