Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'amlogic-dt64-2.1' of git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic into arm/dt

arm64: dts: Amlogic updates for v5.4 (round 2)
- new board: Khadas VIM3L (SM1/S905D3 SoC)
- support power domains on G12[AB] and SM1 SoCs
- DT binding fixups based on YAML schema
- add a bunch of remote control keymap
- enable DVFS on SM1/SEI610 board

* tag 'amlogic-dt64-2.1' of git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-amlogic: (44 commits)
arm64: dts: meson-sm1-sei610: add stdout-path property back
arm64: dts: meson-sm1-sei610: enable DVFS
arm64: dts: khadas-vim3: add support for the SM1 based VIM3L
dt-bindings: arm: amlogic: add Amlogic SM1 based Khadas VIM3L bindings
arm64: dts: khadas-vim3: move common nodes into meson-khadas-vim3.dtsi
arm64: dts: meson: g12a: add reset to tdm formatters
arm64: dts: meson: g12a: audio clock controller provides resets
arm64: dts: meson-sm1-sei610: enable DVFS
arm64: dts: meson-gxm-khadas-vim2: use rc-khadas keymap
arm64: dts: meson-gxl-s905w-tx3-mini: add rc-tx3mini keymap
arm64: dts: meson-gxl-s905x-khadas-vim: use rc-khadas keymap
arm64: dts: meson-gxbb-wetek-play2: add rc-wetek-play2 keymap
arm64: dts: meson-gxbb-wetek-hub: add rc-wetek-hub keymap
arm64: dts: meson-g12a-x96-max: add rc-x96max keymap
arm64: dts: meson-g12b-odroid-n2: add rc-odroid keymap
arm64: dts: meson-sm1-sei610: add USB support
arm64: dts: meson-sm1-sei610: add HDMI display support
arm64: dts: meson-g12: add Everything-Else power domain controller
arm64: dts: meson: fix boards regulators states format
arm64: dts: meson-gxbb-p201: fix snps, reset-delays-us format
...

Link: https://patchwork.kernel.org/patch/11122331/
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+1553 -443
+2 -1
Documentation/devicetree/bindings/arm/amlogic.yaml
··· 150 150 - const: amlogic,s922x 151 151 - const: amlogic,g12b 152 152 153 - - description: Boards with the Amlogic Meson SM1 S905X3 SoC 153 + - description: Boards with the Amlogic Meson SM1 S905X3/D3/Y3 SoC 154 154 items: 155 155 - enum: 156 156 - seirobotics,sei610 157 + - khadas,vim3l 157 158 - const: amlogic,sm1 158 159 ...
+1
Documentation/devicetree/bindings/clock/amlogic,axg-audio-clkc.txt
··· 22 22 components. 23 23 - resets : phandle of the internal reset line 24 24 - #clock-cells : should be 1. 25 + - #reset-cells : should be 1 on the g12a (and following) soc family 25 26 26 27 Each clock is assigned an identifier and client nodes can use this identifier 27 28 to specify the clock which they consume. All available clocks are defined as
+1
Documentation/devicetree/bindings/clock/amlogic,gxbb-clkc.txt
··· 11 11 "amlogic,axg-clkc" for AXG SoC. 12 12 "amlogic,g12a-clkc" for G12A SoC. 13 13 "amlogic,g12b-clkc" for G12B SoC. 14 + "amlogic,sm1-clkc" for SM1 SoC. 14 15 - clocks : list of clock phandle, one for each entry clock-names. 15 16 - clock-names : should contain the following: 16 17 * "xtal": the platform xtal
+93
Documentation/devicetree/bindings/power/amlogic,meson-ee-pwrc.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + # Copyright 2019 BayLibre, SAS 3 + %YAML 1.2 4 + --- 5 + $id: "http://devicetree.org/schemas/power/amlogic,meson-ee-pwrc.yaml#" 6 + $schema: "http://devicetree.org/meta-schemas/core.yaml#" 7 + 8 + title: Amlogic Meson Everything-Else Power Domains 9 + 10 + maintainers: 11 + - Neil Armstrong <narmstrong@baylibre.com> 12 + 13 + description: |+ 14 + The Everything-Else Power Domains node should be the child of a syscon 15 + node with the required property: 16 + 17 + - compatible: Should be the following: 18 + "amlogic,meson-gx-hhi-sysctrl", "simple-mfd", "syscon" 19 + 20 + Refer to the the bindings described in 21 + Documentation/devicetree/bindings/mfd/syscon.txt 22 + 23 + properties: 24 + compatible: 25 + enum: 26 + - amlogic,meson-g12a-pwrc 27 + - amlogic,meson-sm1-pwrc 28 + 29 + clocks: 30 + minItems: 2 31 + 32 + clock-names: 33 + items: 34 + - const: vpu 35 + - const: vapb 36 + 37 + resets: 38 + minItems: 11 39 + 40 + reset-names: 41 + items: 42 + - const: viu 43 + - const: venc 44 + - const: vcbus 45 + - const: bt656 46 + - const: rdma 47 + - const: venci 48 + - const: vencp 49 + - const: vdac 50 + - const: vdi6 51 + - const: vencl 52 + - const: vid_lock 53 + 54 + "#power-domain-cells": 55 + const: 1 56 + 57 + amlogic,ao-sysctrl: 58 + description: phandle to the AO sysctrl node 59 + allOf: 60 + - $ref: /schemas/types.yaml#/definitions/phandle 61 + 62 + required: 63 + - compatible 64 + - clocks 65 + - clock-names 66 + - resets 67 + - reset-names 68 + - "#power-domain-cells" 69 + - amlogic,ao-sysctrl 70 + 71 + examples: 72 + - | 73 + pwrc: power-controller { 74 + compatible = "amlogic,meson-sm1-pwrc"; 75 + #power-domain-cells = <1>; 76 + amlogic,ao-sysctrl = <&rti>; 77 + resets = <&reset_viu>, 78 + <&reset_venc>, 79 + <&reset_vcbus>, 80 + <&reset_bt656>, 81 + <&reset_rdma>, 82 + <&reset_venci>, 83 + <&reset_vencp>, 84 + <&reset_vdac>, 85 + <&reset_vdi6>, 86 + <&reset_vencl>, 87 + <&reset_vid_lock>; 88 + reset-names = "viu", "venc", "vcbus", "bt656", 89 + "rdma", "venci", "vencp", "vdac", 90 + "vdi6", "vencl", "vid_lock"; 91 + clocks = <&clk_vpu>, <&clk_vapb>; 92 + clock-names = "vpu", "vapb"; 93 + };
+1
Documentation/devicetree/bindings/soc/amlogic/clk-measure.txt
··· 11 11 "amlogic,meson8b-clk-measure" for Meson8b SoCs 12 12 "amlogic,meson-axg-clk-measure" for AXG SoCs 13 13 "amlogic,meson-g12a-clk-measure" for G12a SoCs 14 + "amlogic,meson-sm1-clk-measure" for SM1 SoCs 14 15 - reg: base address and size of the Clock Measurer register space. 15 16 16 17 Example:
+1
arch/arm64/boot/dts/amlogic/Makefile
··· 35 35 dtb-$(CONFIG_ARCH_MESON) += meson-gxm-rbox-pro.dtb 36 36 dtb-$(CONFIG_ARCH_MESON) += meson-gxm-vega-s96.dtb 37 37 dtb-$(CONFIG_ARCH_MESON) += meson-sm1-sei610.dtb 38 + dtb-$(CONFIG_ARCH_MESON) += meson-sm1-khadas-vim3l.dtb
+3 -3
arch/arm64/boot/dts/amlogic/meson-axg.dtsi
··· 174 174 compatible = "amlogic,meson-axg-dwmac", 175 175 "snps,dwmac-3.70a", 176 176 "snps,dwmac"; 177 - reg = <0x0 0xff3f0000 0x0 0x10000 178 - 0x0 0xff634540 0x0 0x8>; 177 + reg = <0x0 0xff3f0000 0x0 0x10000>, 178 + <0x0 0xff634540 0x0 0x8>; 179 179 interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>; 180 180 interrupt-names = "macirq"; 181 181 clocks = <&clkc CLKID_ETH>, ··· 1118 1118 }; 1119 1119 1120 1120 mailbox: mailbox@ff63c404 { 1121 - compatible = "amlogic,meson-gx-mhu", "amlogic,meson-gxbb-mhu"; 1121 + compatible = "amlogic,meson-gxbb-mhu"; 1122 1122 reg = <0 0xff63c404 0 0x4c>; 1123 1123 interrupts = <GIC_SPI 208 IRQ_TYPE_EDGE_RISING>, 1124 1124 <GIC_SPI 209 IRQ_TYPE_EDGE_RISING>,
+64 -49
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
··· 11 11 #include <dt-bindings/interrupt-controller/irq.h> 12 12 #include <dt-bindings/interrupt-controller/arm-gic.h> 13 13 #include <dt-bindings/reset/amlogic,meson-axg-audio-arb.h> 14 + #include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h> 14 15 #include <dt-bindings/reset/amlogic,meson-g12a-reset.h> 15 16 16 17 / { ··· 99 98 compatible = "amlogic,meson-axg-dwmac", 100 99 "snps,dwmac-3.70a", 101 100 "snps,dwmac"; 102 - reg = <0x0 0xff3f0000 0x0 0x10000 103 - 0x0 0xff634540 0x0 0x8>; 101 + reg = <0x0 0xff3f0000 0x0 0x10000>, 102 + <0x0 0xff634540 0x0 0x8>; 104 103 interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>; 105 104 interrupt-names = "macirq"; 106 105 clocks = <&clkc CLKID_ETH>, ··· 1407 1406 clocks = <&xtal>; 1408 1407 clock-names = "xtal"; 1409 1408 }; 1409 + 1410 + pwrc: power-controller { 1411 + compatible = "amlogic,meson-g12a-pwrc"; 1412 + #power-domain-cells = <1>; 1413 + amlogic,ao-sysctrl = <&rti>; 1414 + resets = <&reset RESET_VIU>, 1415 + <&reset RESET_VENC>, 1416 + <&reset RESET_VCBUS>, 1417 + <&reset RESET_BT656>, 1418 + <&reset RESET_RDMA>, 1419 + <&reset RESET_VENCI>, 1420 + <&reset RESET_VENCP>, 1421 + <&reset RESET_VDAC>, 1422 + <&reset RESET_VDI6>, 1423 + <&reset RESET_VENCL>, 1424 + <&reset RESET_VID_LOCK>; 1425 + reset-names = "viu", "venc", "vcbus", "bt656", 1426 + "rdma", "venci", "vencp", "vdac", 1427 + "vdi6", "vencl", "vid_lock"; 1428 + clocks = <&clkc CLKID_VPU>, 1429 + <&clkc CLKID_VAPB>; 1430 + clock-names = "vpu", "vapb"; 1431 + /* 1432 + * VPU clocking is provided by two identical clock paths 1433 + * VPU_0 and VPU_1 muxed to a single clock by a glitch 1434 + * free mux to safely change frequency while running. 1435 + * Same for VAPB but with a final gate after the glitch free mux. 1436 + */ 1437 + assigned-clocks = <&clkc CLKID_VPU_0_SEL>, 1438 + <&clkc CLKID_VPU_0>, 1439 + <&clkc CLKID_VPU>, /* Glitch free mux */ 1440 + <&clkc CLKID_VAPB_0_SEL>, 1441 + <&clkc CLKID_VAPB_0>, 1442 + <&clkc CLKID_VAPB_SEL>; /* Glitch free mux */ 1443 + assigned-clock-parents = <&clkc CLKID_FCLK_DIV3>, 1444 + <0>, /* Do Nothing */ 1445 + <&clkc CLKID_VPU_0>, 1446 + <&clkc CLKID_FCLK_DIV4>, 1447 + <0>, /* Do Nothing */ 1448 + <&clkc CLKID_VAPB_0>; 1449 + assigned-clock-rates = <0>, /* Do Nothing */ 1450 + <666666666>, 1451 + <0>, /* Do Nothing */ 1452 + <0>, /* Do Nothing */ 1453 + <250000000>, 1454 + <0>; /* Do Nothing */ 1455 + }; 1410 1456 }; 1411 1457 }; 1412 1458 ··· 1482 1434 compatible = "amlogic,g12a-audio-clkc"; 1483 1435 reg = <0x0 0x0 0x0 0xb4>; 1484 1436 #clock-cells = <1>; 1437 + #reset-cells = <1>; 1485 1438 1486 1439 clocks = <&clkc CLKID_AUDIO>, 1487 1440 <&clkc CLKID_MPLL0>, ··· 1591 1542 "amlogic,axg-tdmin"; 1592 1543 reg = <0x0 0x300 0x0 0x40>; 1593 1544 sound-name-prefix = "TDMIN_A"; 1545 + resets = <&clkc_audio AUD_RESET_TDMIN_A>; 1594 1546 clocks = <&clkc_audio AUD_CLKID_TDMIN_A>, 1595 1547 <&clkc_audio AUD_CLKID_TDMIN_A_SCLK>, 1596 1548 <&clkc_audio AUD_CLKID_TDMIN_A_SCLK_SEL>, ··· 1607 1557 "amlogic,axg-tdmin"; 1608 1558 reg = <0x0 0x340 0x0 0x40>; 1609 1559 sound-name-prefix = "TDMIN_B"; 1560 + resets = <&clkc_audio AUD_RESET_TDMIN_B>; 1610 1561 clocks = <&clkc_audio AUD_CLKID_TDMIN_B>, 1611 1562 <&clkc_audio AUD_CLKID_TDMIN_B_SCLK>, 1612 1563 <&clkc_audio AUD_CLKID_TDMIN_B_SCLK_SEL>, ··· 1623 1572 "amlogic,axg-tdmin"; 1624 1573 reg = <0x0 0x380 0x0 0x40>; 1625 1574 sound-name-prefix = "TDMIN_C"; 1575 + resets = <&clkc_audio AUD_RESET_TDMIN_C>; 1626 1576 clocks = <&clkc_audio AUD_CLKID_TDMIN_C>, 1627 1577 <&clkc_audio AUD_CLKID_TDMIN_C_SCLK>, 1628 1578 <&clkc_audio AUD_CLKID_TDMIN_C_SCLK_SEL>, ··· 1639 1587 "amlogic,axg-tdmin"; 1640 1588 reg = <0x0 0x3c0 0x0 0x40>; 1641 1589 sound-name-prefix = "TDMIN_LB"; 1590 + resets = <&clkc_audio AUD_RESET_TDMIN_LB>; 1642 1591 clocks = <&clkc_audio AUD_CLKID_TDMIN_LB>, 1643 1592 <&clkc_audio AUD_CLKID_TDMIN_LB_SCLK>, 1644 1593 <&clkc_audio AUD_CLKID_TDMIN_LB_SCLK_SEL>, ··· 1679 1626 compatible = "amlogic,g12a-tdmout"; 1680 1627 reg = <0x0 0x500 0x0 0x40>; 1681 1628 sound-name-prefix = "TDMOUT_A"; 1629 + resets = <&clkc_audio AUD_RESET_TDMOUT_A>; 1682 1630 clocks = <&clkc_audio AUD_CLKID_TDMOUT_A>, 1683 1631 <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK>, 1684 1632 <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK_SEL>, ··· 1694 1640 compatible = "amlogic,g12a-tdmout"; 1695 1641 reg = <0x0 0x540 0x0 0x40>; 1696 1642 sound-name-prefix = "TDMOUT_B"; 1643 + resets = <&clkc_audio AUD_RESET_TDMOUT_B>; 1697 1644 clocks = <&clkc_audio AUD_CLKID_TDMOUT_B>, 1698 1645 <&clkc_audio AUD_CLKID_TDMOUT_B_SCLK>, 1699 1646 <&clkc_audio AUD_CLKID_TDMOUT_B_SCLK_SEL>, ··· 1709 1654 compatible = "amlogic,g12a-tdmout"; 1710 1655 reg = <0x0 0x580 0x0 0x40>; 1711 1656 sound-name-prefix = "TDMOUT_C"; 1657 + resets = <&clkc_audio AUD_RESET_TDMOUT_C>; 1712 1658 clocks = <&clkc_audio AUD_CLKID_TDMOUT_C>, 1713 1659 <&clkc_audio AUD_CLKID_TDMOUT_C_SCLK>, 1714 1660 <&clkc_audio AUD_CLKID_TDMOUT_C_SCLK_SEL>, ··· 1807 1751 #reset-cells = <1>; 1808 1752 clocks = <&xtal>, <&clkc CLKID_CLK81>; 1809 1753 clock-names = "xtal", "mpeg-clk"; 1810 - }; 1811 - 1812 - pwrc_vpu: power-controller-vpu { 1813 - compatible = "amlogic,meson-g12a-pwrc-vpu"; 1814 - #power-domain-cells = <0>; 1815 - amlogic,hhi-sysctrl = <&hhi>; 1816 - resets = <&reset RESET_VIU>, 1817 - <&reset RESET_VENC>, 1818 - <&reset RESET_VCBUS>, 1819 - <&reset RESET_BT656>, 1820 - <&reset RESET_RDMA>, 1821 - <&reset RESET_VENCI>, 1822 - <&reset RESET_VENCP>, 1823 - <&reset RESET_VDAC>, 1824 - <&reset RESET_VDI6>, 1825 - <&reset RESET_VENCL>, 1826 - <&reset RESET_VID_LOCK>; 1827 - clocks = <&clkc CLKID_VPU>, 1828 - <&clkc CLKID_VAPB>; 1829 - clock-names = "vpu", "vapb"; 1830 - /* 1831 - * VPU clocking is provided by two identical clock paths 1832 - * VPU_0 and VPU_1 muxed to a single clock by a glitch 1833 - * free mux to safely change frequency while running. 1834 - * Same for VAPB but with a final gate after the glitch free mux. 1835 - */ 1836 - assigned-clocks = <&clkc CLKID_VPU_0_SEL>, 1837 - <&clkc CLKID_VPU_0>, 1838 - <&clkc CLKID_VPU>, /* Glitch free mux */ 1839 - <&clkc CLKID_VAPB_0_SEL>, 1840 - <&clkc CLKID_VAPB_0>, 1841 - <&clkc CLKID_VAPB_SEL>; /* Glitch free mux */ 1842 - assigned-clock-parents = <&clkc CLKID_FCLK_DIV3>, 1843 - <0>, /* Do Nothing */ 1844 - <&clkc CLKID_VPU_0>, 1845 - <&clkc CLKID_FCLK_DIV4>, 1846 - <0>, /* Do Nothing */ 1847 - <&clkc CLKID_VAPB_0>; 1848 - assigned-clock-rates = <0>, /* Do Nothing */ 1849 - <666666666>, 1850 - <0>, /* Do Nothing */ 1851 - <0>, /* Do Nothing */ 1852 - <250000000>, 1853 - <0>; /* Do Nothing */ 1854 1754 }; 1855 1755 1856 1756 ao_pinctrl: pinctrl@14 { ··· 2057 2045 }; 2058 2046 }; 2059 2047 2048 + vrtc: rtc@0a8 { 2049 + compatible = "amlogic,meson-vrtc"; 2050 + reg = <0x0 0x000a8 0x0 0x4>; 2051 + }; 2052 + 2060 2053 cec_AO: cec@100 { 2061 2054 compatible = "amlogic,meson-gx-ao-cec"; 2062 2055 reg = <0x0 0x00100 0x0 0x14>; ··· 2161 2144 #address-cells = <1>; 2162 2145 #size-cells = <0>; 2163 2146 amlogic,canvas = <&canvas>; 2164 - power-domains = <&pwrc_vpu>; 2165 2147 2166 2148 /* CVBS VDAC output port */ 2167 2149 cvbs_vdac_port: port@0 { ··· 2198 2182 ranges = <0x0 0x0 0x0 0xffd00000 0x0 0x100000>; 2199 2183 2200 2184 reset: reset-controller@1004 { 2201 - compatible = "amlogic,meson-g12a-reset", 2202 - "amlogic,meson-axg-reset"; 2185 + compatible = "amlogic,meson-axg-reset"; 2203 2186 reg = <0x0 0x1004 0x0 0x9c>; 2204 2187 #reset-cells = <1>; 2205 2188 };
+2 -1
arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts
··· 11 11 #include <dt-bindings/sound/meson-g12a-tohdmitx.h> 12 12 13 13 / { 14 - compatible = "amediatech,x96-max", "amlogic,u200", "amlogic,g12a"; 14 + compatible = "amediatech,x96-max", "amlogic,g12a"; 15 15 model = "Shenzhen Amediatech Technology Co., Ltd X96 Max"; 16 16 17 17 aliases { ··· 321 321 status = "okay"; 322 322 pinctrl-0 = <&remote_input_ao_pins>; 323 323 pinctrl-names = "default"; 324 + linux,rc-map-name = "rc-x96max"; 324 325 }; 325 326 326 327 &pwm_AO_cd {
+9
arch/arm64/boot/dts/amlogic/meson-g12a.dtsi
··· 4 4 */ 5 5 6 6 #include "meson-g12-common.dtsi" 7 + #include <dt-bindings/power/meson-g12a-power.h> 7 8 8 9 / { 9 10 compatible = "amlogic,g12a"; ··· 109 108 opp-microvolt = <981000>; 110 109 }; 111 110 }; 111 + }; 112 + 113 + &ethmac { 114 + power-domains = <&pwrc PWRC_G12A_ETH_ID>; 115 + }; 116 + 117 + &vpu { 118 + power-domains = <&pwrc PWRC_G12A_VPU_ID>; 112 119 }; 113 120 114 121 &sd_emmc_a {
+1
arch/arm64/boot/dts/amlogic/meson-g12b-a311d-khadas-vim3.dts
··· 8 8 /dts-v1/; 9 9 10 10 #include "meson-g12b-a311d.dtsi" 11 + #include "meson-khadas-vim3.dtsi" 11 12 #include "meson-g12b-khadas-vim3.dtsi" 12 13 13 14 / {
-355
arch/arm64/boot/dts/amlogic/meson-g12b-khadas-vim3.dtsi
··· 5 5 * Copyright (c) 2019 Christian Hewitt <christianshewitt@gmail.com> 6 6 */ 7 7 8 - #include <dt-bindings/input/input.h> 9 - #include <dt-bindings/gpio/meson-g12a-gpio.h> 10 8 #include <dt-bindings/sound/meson-g12a-tohdmitx.h> 11 9 12 10 / { 13 - model = "Khadas VIM3"; 14 - 15 - aliases { 16 - serial0 = &uart_AO; 17 - ethernet0 = &ethmac; 18 - }; 19 - 20 - chosen { 21 - stdout-path = "serial0:115200n8"; 22 - }; 23 - 24 - memory@0 { 25 - device_type = "memory"; 26 - reg = <0x0 0x0 0x0 0x80000000>; 27 - }; 28 - 29 - adc-keys { 30 - compatible = "adc-keys"; 31 - io-channels = <&saradc 2>; 32 - io-channel-names = "buttons"; 33 - keyup-threshold-microvolt = <1710000>; 34 - 35 - button-function { 36 - label = "Function"; 37 - linux,code = <KEY_FN>; 38 - press-threshold-microvolt = <10000>; 39 - }; 40 - }; 41 - 42 - leds { 43 - compatible = "gpio-leds"; 44 - 45 - white { 46 - label = "vim3:white:sys"; 47 - gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_LOW>; 48 - linux,default-trigger = "heartbeat"; 49 - }; 50 - 51 - red { 52 - label = "vim3:red"; 53 - gpios = <&gpio_expander 5 GPIO_ACTIVE_LOW>; 54 - }; 55 - }; 56 - 57 - emmc_pwrseq: emmc-pwrseq { 58 - compatible = "mmc-pwrseq-emmc"; 59 - reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; 60 - }; 61 - 62 - gpio-keys-polled { 63 - compatible = "gpio-keys-polled"; 64 - poll-interval = <100>; 65 - 66 - power-button { 67 - label = "power"; 68 - linux,code = <KEY_POWER>; 69 - gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_LOW>; 70 - }; 71 - }; 72 - 73 - sdio_pwrseq: sdio-pwrseq { 74 - compatible = "mmc-pwrseq-simple"; 75 - reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; 76 - clocks = <&wifi32k>; 77 - clock-names = "ext_clock"; 78 - }; 79 - 80 - dc_in: regulator-dc_in { 81 - compatible = "regulator-fixed"; 82 - regulator-name = "DC_IN"; 83 - regulator-min-microvolt = <5000000>; 84 - regulator-max-microvolt = <5000000>; 85 - regulator-always-on; 86 - }; 87 - 88 - vcc_5v: regulator-vcc_5v { 89 - compatible = "regulator-fixed"; 90 - regulator-name = "VCC_5V"; 91 - regulator-min-microvolt = <5000000>; 92 - regulator-max-microvolt = <5000000>; 93 - vin-supply = <&dc_in>; 94 - 95 - gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>; 96 - enable-active-high; 97 - }; 98 - 99 - vcc_1v8: regulator-vcc_1v8 { 100 - compatible = "regulator-fixed"; 101 - regulator-name = "VCC_1V8"; 102 - regulator-min-microvolt = <1800000>; 103 - regulator-max-microvolt = <1800000>; 104 - vin-supply = <&vcc_3v3>; 105 - regulator-always-on; 106 - }; 107 - 108 - vcc_3v3: regulator-vcc_3v3 { 109 - compatible = "regulator-fixed"; 110 - regulator-name = "VCC_3V3"; 111 - regulator-min-microvolt = <3300000>; 112 - regulator-max-microvolt = <3300000>; 113 - vin-supply = <&vsys_3v3>; 114 - regulator-always-on; 115 - /* FIXME: actually controlled by VDDCPU_B_EN */ 116 - }; 117 - 118 11 vddcpu_a: regulator-vddcpu-a { 119 12 /* 120 13 * MP8756GD Regulator. ··· 44 151 45 152 regulator-boot-on; 46 153 regulator-always-on; 47 - }; 48 - 49 - vddao_1v8: regulator-vddao_1v8 { 50 - compatible = "regulator-fixed"; 51 - regulator-name = "VDDIO_AO1V8"; 52 - regulator-min-microvolt = <1800000>; 53 - regulator-max-microvolt = <1800000>; 54 - vin-supply = <&vsys_3v3>; 55 - regulator-always-on; 56 - }; 57 - 58 - emmc_1v8: regulator-emmc_1v8 { 59 - compatible = "regulator-fixed"; 60 - regulator-name = "EMMC_AO1V8"; 61 - regulator-min-microvolt = <1800000>; 62 - regulator-max-microvolt = <1800000>; 63 - vin-supply = <&vcc_3v3>; 64 - regulator-always-on; 65 - }; 66 - 67 - vsys_3v3: regulator-vsys_3v3 { 68 - compatible = "regulator-fixed"; 69 - regulator-name = "VSYS_3V3"; 70 - regulator-min-microvolt = <3300000>; 71 - regulator-max-microvolt = <3300000>; 72 - vin-supply = <&dc_in>; 73 - regulator-always-on; 74 - }; 75 - 76 - usb_pwr: regulator-usb_pwr { 77 - compatible = "regulator-fixed"; 78 - regulator-name = "USB_PWR"; 79 - regulator-min-microvolt = <5000000>; 80 - regulator-max-microvolt = <5000000>; 81 - vin-supply = <&vcc_5v>; 82 - 83 - gpio = <&gpio GPIOA_6 GPIO_ACTIVE_HIGH>; 84 - enable-active-high; 85 - }; 86 - 87 - hdmi-connector { 88 - compatible = "hdmi-connector"; 89 - type = "a"; 90 - 91 - port { 92 - hdmi_connector_in: endpoint { 93 - remote-endpoint = <&hdmi_tx_tmds_out>; 94 - }; 95 - }; 96 - }; 97 - 98 - wifi32k: wifi32k { 99 - compatible = "pwm-clock"; 100 - #clock-cells = <0>; 101 - clock-frequency = <32768>; 102 - pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ 103 154 }; 104 155 105 156 sound { ··· 106 269 status = "okay"; 107 270 }; 108 271 109 - &cec_AO { 110 - pinctrl-0 = <&cec_ao_a_h_pins>; 111 - pinctrl-names = "default"; 112 - status = "disabled"; 113 - hdmi-phandle = <&hdmi_tx>; 114 - }; 115 - 116 - &cecb_AO { 117 - pinctrl-0 = <&cec_ao_b_h_pins>; 118 - pinctrl-names = "default"; 119 - status = "okay"; 120 - hdmi-phandle = <&hdmi_tx>; 121 - }; 122 - 123 272 &clkc_audio { 124 273 status = "okay"; 125 274 }; ··· 152 329 clock-latency = <50000>; 153 330 }; 154 331 155 - &ext_mdio { 156 - external_phy: ethernet-phy@0 { 157 - /* Realtek RTL8211F (0x001cc916) */ 158 - reg = <0>; 159 - max-speed = <1000>; 160 - 161 - interrupt-parent = <&gpio_intc>; 162 - /* MAC_INTR on GPIOZ_14 */ 163 - interrupts = <26 IRQ_TYPE_LEVEL_LOW>; 164 - }; 165 - }; 166 - 167 - &ethmac { 168 - pinctrl-0 = <&eth_pins>, <&eth_rgmii_pins>; 169 - pinctrl-names = "default"; 170 - status = "okay"; 171 - phy-mode = "rgmii"; 172 - phy-handle = <&external_phy>; 173 - amlogic,tx-delay-ns = <2>; 174 - }; 175 - 176 - &frddr_a { 177 - status = "okay"; 178 - }; 179 - 180 332 &frddr_b { 181 333 status = "okay"; 182 334 }; 183 335 184 336 &frddr_c { 185 337 status = "okay"; 186 - }; 187 - 188 - &hdmi_tx { 189 - status = "okay"; 190 - pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; 191 - pinctrl-names = "default"; 192 - hdmi-supply = <&vcc_5v>; 193 - }; 194 - 195 - &hdmi_tx_tmds_port { 196 - hdmi_tx_tmds_out: endpoint { 197 - remote-endpoint = <&hdmi_connector_in>; 198 - }; 199 - }; 200 - 201 - &i2c_AO { 202 - status = "okay"; 203 - pinctrl-0 = <&i2c_ao_sck_pins>, <&i2c_ao_sda_pins>; 204 - pinctrl-names = "default"; 205 - 206 - gpio_expander: gpio-controller@20 { 207 - compatible = "ti,tca6408"; 208 - reg = <0x20>; 209 - vcc-supply = <&vcc_3v3>; 210 - gpio-controller; 211 - #gpio-cells = <2>; 212 - }; 213 - 214 - rtc@51 { 215 - compatible = "haoyu,hym8563"; 216 - reg = <0x51>; 217 - #clock-cells = <0>; 218 - }; 219 - }; 220 - 221 - &ir { 222 - status = "okay"; 223 - pinctrl-0 = <&remote_input_ao_pins>; 224 - pinctrl-names = "default"; 225 - linux,rc-map-name = "rc-khadas"; 226 338 }; 227 339 228 340 &pwm_ab { ··· 176 418 status = "okay"; 177 419 }; 178 420 179 - &pwm_ef { 180 - status = "okay"; 181 - pinctrl-0 = <&pwm_e_pins>; 182 - pinctrl-names = "default"; 183 - }; 184 - 185 - &saradc { 186 - status = "okay"; 187 - vref-supply = <&vddao_1v8>; 188 - }; 189 - 190 - /* SDIO */ 191 - &sd_emmc_a { 192 - status = "okay"; 193 - pinctrl-0 = <&sdio_pins>; 194 - pinctrl-1 = <&sdio_clk_gate_pins>; 195 - pinctrl-names = "default", "clk-gate"; 196 - #address-cells = <1>; 197 - #size-cells = <0>; 198 - 199 - bus-width = <4>; 200 - cap-sd-highspeed; 201 - sd-uhs-sdr50; 202 - max-frequency = <100000000>; 203 - 204 - non-removable; 205 - disable-wp; 206 - 207 - mmc-pwrseq = <&sdio_pwrseq>; 208 - 209 - vmmc-supply = <&vsys_3v3>; 210 - vqmmc-supply = <&vddao_1v8>; 211 - 212 - brcmf: wifi@1 { 213 - reg = <1>; 214 - compatible = "brcm,bcm4329-fmac"; 215 - }; 216 - }; 217 - 218 - /* SD card */ 219 - &sd_emmc_b { 220 - status = "okay"; 221 - pinctrl-0 = <&sdcard_c_pins>; 222 - pinctrl-1 = <&sdcard_clk_gate_c_pins>; 223 - pinctrl-names = "default", "clk-gate"; 224 - 225 - bus-width = <4>; 226 - cap-sd-highspeed; 227 - max-frequency = <50000000>; 228 - disable-wp; 229 - 230 - cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; 231 - vmmc-supply = <&vsys_3v3>; 232 - vqmmc-supply = <&vsys_3v3>; 233 - }; 234 - 235 - /* eMMC */ 236 - &sd_emmc_c { 237 - status = "okay"; 238 - pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>; 239 - pinctrl-1 = <&emmc_clk_gate_pins>; 240 - pinctrl-names = "default", "clk-gate"; 241 - 242 - bus-width = <8>; 243 - cap-mmc-highspeed; 244 - mmc-ddr-1_8v; 245 - mmc-hs200-1_8v; 246 - max-frequency = <200000000>; 247 - disable-wp; 248 - 249 - mmc-pwrseq = <&emmc_pwrseq>; 250 - vmmc-supply = <&vcc_3v3>; 251 - vqmmc-supply = <&emmc_1v8>; 252 - }; 253 - 254 421 &tdmif_b { 255 422 status = "okay"; 256 423 }; ··· 186 503 187 504 &tohdmitx { 188 505 status = "okay"; 189 - }; 190 - 191 - &uart_A { 192 - status = "okay"; 193 - pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; 194 - pinctrl-names = "default"; 195 - uart-has-rtscts; 196 - 197 - bluetooth { 198 - compatible = "brcm,bcm43438-bt"; 199 - shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; 200 - max-speed = <2000000>; 201 - clocks = <&wifi32k>; 202 - clock-names = "lpo"; 203 - }; 204 - }; 205 - 206 - &uart_AO { 207 - status = "okay"; 208 - pinctrl-0 = <&uart_ao_a_pins>; 209 - pinctrl-names = "default"; 210 - }; 211 - 212 - &usb2_phy0 { 213 - phy-supply = <&dc_in>; 214 - }; 215 - 216 - &usb2_phy1 { 217 - phy-supply = <&usb_pwr>; 218 - }; 219 - 220 - &usb3_pcie_phy { 221 - phy-supply = <&usb_pwr>; 222 - }; 223 - 224 - &usb { 225 - status = "okay"; 226 - dr_mode = "peripheral"; 227 506 };
+3 -2
arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts
··· 66 66 gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>; 67 67 gpios-states = <0>; 68 68 69 - states = <3300000 0 70 - 1800000 1>; 69 + states = <3300000 0>, 70 + <1800000 1>; 71 71 }; 72 72 73 73 flash_1v8: regulator-flash_1v8 { ··· 395 395 status = "okay"; 396 396 pinctrl-0 = <&remote_input_ao_pins>; 397 397 pinctrl-names = "default"; 398 + linux,rc-map-name = "rc-odroid"; 398 399 }; 399 400 400 401 &pwm_ab {
+1
arch/arm64/boot/dts/amlogic/meson-g12b-s922x-khadas-vim3.dts
··· 8 8 /dts-v1/; 9 9 10 10 #include "meson-g12b-s922x.dtsi" 11 + #include "meson-khadas-vim3.dtsi" 11 12 #include "meson-g12b-khadas-vim3.dtsi" 12 13 13 14 / {
+9
arch/arm64/boot/dts/amlogic/meson-g12b.dtsi
··· 5 5 */ 6 6 7 7 #include "meson-g12-common.dtsi" 8 + #include <dt-bindings/power/meson-g12a-power.h> 8 9 9 10 / { 10 11 compatible = "amlogic,g12b"; ··· 100 99 101 100 &clkc { 102 101 compatible = "amlogic,g12b-clkc"; 102 + }; 103 + 104 + &ethmac { 105 + power-domains = <&pwrc PWRC_G12A_ETH_ID>; 106 + }; 107 + 108 + &vpu { 109 + power-domains = <&pwrc PWRC_G12A_VPU_ID>; 103 110 }; 104 111 105 112 &sd_emmc_a {
+9 -10
arch/arm64/boot/dts/amlogic/meson-gx.dtsi
··· 220 220 }; 221 221 222 222 reset: reset-controller@4404 { 223 - compatible = "amlogic,meson-gx-reset", "amlogic,meson-gxbb-reset"; 223 + compatible = "amlogic,meson-gxbb-reset"; 224 224 reg = <0x0 0x04404 0x0 0x9c>; 225 225 #reset-cells = <1>; 226 226 }; ··· 317 317 }; 318 318 319 319 spifc: spi@8c80 { 320 - compatible = "amlogic,meson-gx-spifc", "amlogic,meson-gxbb-spifc"; 320 + compatible = "amlogic,meson-gxbb-spifc"; 321 321 reg = <0x0 0x08c80 0x0 0x80>; 322 322 #address-cells = <1>; 323 323 #size-cells = <0>; ··· 325 325 }; 326 326 327 327 watchdog@98d0 { 328 - compatible = "amlogic,meson-gx-wdt", "amlogic,meson-gxbb-wdt"; 328 + compatible = "amlogic,meson-gxbb-wdt"; 329 329 reg = <0x0 0x098d0 0x0 0x10>; 330 330 clocks = <&xtal>; 331 331 }; ··· 451 451 amlogic,canvas = <&canvas>; 452 452 }; 453 453 454 - periphs: periphs@c8834000 { 454 + periphs: bus@c8834000 { 455 455 compatible = "simple-bus"; 456 456 reg = <0x0 0xc8834000 0x0 0x2000>; 457 457 #address-cells = <2>; ··· 490 490 }; 491 491 492 492 mailbox: mailbox@404 { 493 - compatible = "amlogic,meson-gx-mhu", "amlogic,meson-gxbb-mhu"; 493 + compatible = "amlogic,meson-gxbb-mhu"; 494 494 reg = <0 0x404 0 0x4c>; 495 495 interrupts = <GIC_SPI 208 IRQ_TYPE_EDGE_RISING>, 496 496 <GIC_SPI 209 IRQ_TYPE_EDGE_RISING>, ··· 503 503 compatible = "amlogic,meson-gxbb-dwmac", 504 504 "snps,dwmac-3.70a", 505 505 "snps,dwmac"; 506 - reg = <0x0 0xc9410000 0x0 0x10000 507 - 0x0 0xc8834540 0x0 0x4>; 506 + reg = <0x0 0xc9410000 0x0 0x10000>, 507 + <0x0 0xc8834540 0x0 0x4>; 508 508 interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>; 509 509 interrupt-names = "macirq"; 510 510 rx-fifo-depth = <4096>; ··· 544 544 vpu: vpu@d0100000 { 545 545 compatible = "amlogic,meson-gx-vpu"; 546 546 reg = <0x0 0xd0100000 0x0 0x100000>, 547 - <0x0 0xc883c000 0x0 0x1000>, 548 - <0x0 0xc8838000 0x0 0x1000>; 549 - reg-names = "vpu", "hhi", "dmc"; 547 + <0x0 0xc883c000 0x0 0x1000>; 548 + reg-names = "vpu", "hhi"; 550 549 interrupts = <GIC_SPI 3 IRQ_TYPE_EDGE_RISING>; 551 550 #address-cells = <1>; 552 551 #size-cells = <0>;
+1
arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
··· 10 10 11 11 / { 12 12 compatible = "friendlyarm,nanopi-k2", "amlogic,meson-gxbb"; 13 + model = "FriendlyARM NanoPi K2"; 13 14 14 15 aliases { 15 16 serial0 = &uart_AO;
+2 -2
arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
··· 75 75 gpios-states = <1>; 76 76 77 77 /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ 78 - states = <1800000 0 79 - 3300000 1>; 78 + states = <1800000 0>, 79 + <3300000 1>; 80 80 }; 81 81 82 82 vddio_boot: regulator-vddio_boot {
+2 -2
arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
··· 77 77 gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_HIGH>; 78 78 gpios-states = <0>; 79 79 80 - states = <3300000 0 81 - 1800000 1>; 80 + states = <3300000 0>, 81 + <1800000 1>; 82 82 }; 83 83 84 84 vcc1v8: regulator-vcc1v8 {
+1 -1
arch/arm64/boot/dts/amlogic/meson-gxbb-p201.dts
··· 21 21 phy-mode = "rmii"; 22 22 23 23 snps,reset-gpio = <&gpio GPIOZ_14 0>; 24 - snps,reset-delays-us = <0 10000 1000000>; 24 + snps,reset-delays-us = <0>, <10000>, <1000000>; 25 25 snps,reset-active-low; 26 26 };
+2 -2
arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi
··· 46 46 gpios-states = <1>; 47 47 48 48 /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ 49 - states = <1800000 0 50 - 3300000 1>; 49 + states = <1800000 0>, 50 + <3300000 1>; 51 51 52 52 regulator-settling-time-up-us = <10000>; 53 53 regulator-settling-time-down-us = <150000>;
+4
arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-hub.dts
··· 12 12 compatible = "wetek,hub", "amlogic,meson-gxbb"; 13 13 model = "WeTek Hub"; 14 14 }; 15 + 16 + &ir { 17 + linux,rc-map-name = "rc-wetek-hub"; 18 + };
+4
arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts
··· 54 54 &usb1 { 55 55 status = "okay"; 56 56 }; 57 + 58 + &ir { 59 + linux,rc-map-name = "rc-wetek-play2"; 60 + };
+4
arch/arm64/boot/dts/amlogic/meson-gxl-s905w-tx3-mini.dts
··· 20 20 reg = <0x0 0x0 0x0 0x40000000>; /* 1 GiB or 2 GiB */ 21 21 }; 22 22 }; 23 + 24 + &ir { 25 + linux,rc-map-name = "rc-tanix-tx3mini"; 26 + };
+2 -2
arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts
··· 38 38 gpios-states = <1>; 39 39 40 40 /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ 41 - states = <1800000 0 42 - 3300000 1>; 41 + states = <1800000 0>, 42 + <3300000 1>; 43 43 }; 44 44 45 45 vddio_boot: regulator-vddio_boot {
+1 -1
arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts
··· 110 110 }; 111 111 112 112 &ir { 113 - linux,rc-map-name = "rc-geekbox"; 113 + linux,rc-map-name = "rc-khadas"; 114 114 }; 115 115 116 116 &gpio_ao {
+2 -2
arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts
··· 38 38 gpios-states = <1>; 39 39 40 40 /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ 41 - states = <1800000 0 42 - 3300000 1>; 41 + states = <1800000 0>, 42 + <3300000 1>; 43 43 }; 44 44 45 45 vddio_boot: regulator-vddio_boot {
+1 -4
arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
··· 80 80 }; 81 81 82 82 &ethmac { 83 - reg = <0x0 0xc9410000 0x0 0x10000 84 - 0x0 0xc8834540 0x0 0x4>; 85 - 86 83 clocks = <&clkc CLKID_ETH>, 87 84 <&clkc CLKID_FCLK_DIV2>, 88 85 <&clkc CLKID_MPLL2>; ··· 709 712 #size-cells = <0>; 710 713 711 714 internal_phy: ethernet-phy@8 { 712 - compatible = "ethernet-phy-id0181.4400", "ethernet-phy-ieee802.3-c22"; 715 + compatible = "ethernet-phy-id0181.4400"; 713 716 interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>; 714 717 reg = <8>; 715 718 max-speed = <100>;
+1 -1
arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
··· 299 299 status = "okay"; 300 300 pinctrl-0 = <&remote_input_ao_pins>; 301 301 pinctrl-names = "default"; 302 - linux,rc-map-name = "rc-geekbox"; 302 + linux,rc-map-name = "rc-khadas"; 303 303 }; 304 304 305 305 &pwm_AO_ab {
+360
arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi
··· 1 + // SPDX-License-Identifier: (GPL-2.0+ OR MIT) 2 + /* 3 + * Copyright (c) 2019 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + * Copyright (c) 2019 Christian Hewitt <christianshewitt@gmail.com> 6 + */ 7 + 8 + #include <dt-bindings/input/input.h> 9 + #include <dt-bindings/gpio/meson-g12a-gpio.h> 10 + 11 + / { 12 + model = "Khadas VIM3"; 13 + 14 + aliases { 15 + serial0 = &uart_AO; 16 + ethernet0 = &ethmac; 17 + }; 18 + 19 + chosen { 20 + stdout-path = "serial0:115200n8"; 21 + }; 22 + 23 + memory@0 { 24 + device_type = "memory"; 25 + reg = <0x0 0x0 0x0 0x80000000>; 26 + }; 27 + 28 + adc-keys { 29 + compatible = "adc-keys"; 30 + io-channels = <&saradc 2>; 31 + io-channel-names = "buttons"; 32 + keyup-threshold-microvolt = <1710000>; 33 + 34 + button-function { 35 + label = "Function"; 36 + linux,code = <KEY_FN>; 37 + press-threshold-microvolt = <10000>; 38 + }; 39 + }; 40 + 41 + leds { 42 + compatible = "gpio-leds"; 43 + 44 + white { 45 + label = "vim3:white:sys"; 46 + gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_LOW>; 47 + linux,default-trigger = "heartbeat"; 48 + }; 49 + 50 + red { 51 + label = "vim3:red"; 52 + gpios = <&gpio_expander 5 GPIO_ACTIVE_LOW>; 53 + }; 54 + }; 55 + 56 + emmc_pwrseq: emmc-pwrseq { 57 + compatible = "mmc-pwrseq-emmc"; 58 + reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; 59 + }; 60 + 61 + gpio-keys-polled { 62 + compatible = "gpio-keys-polled"; 63 + poll-interval = <100>; 64 + 65 + power-button { 66 + label = "power"; 67 + linux,code = <KEY_POWER>; 68 + gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_LOW>; 69 + }; 70 + }; 71 + 72 + sdio_pwrseq: sdio-pwrseq { 73 + compatible = "mmc-pwrseq-simple"; 74 + reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; 75 + clocks = <&wifi32k>; 76 + clock-names = "ext_clock"; 77 + }; 78 + 79 + dc_in: regulator-dc_in { 80 + compatible = "regulator-fixed"; 81 + regulator-name = "DC_IN"; 82 + regulator-min-microvolt = <5000000>; 83 + regulator-max-microvolt = <5000000>; 84 + regulator-always-on; 85 + }; 86 + 87 + vcc_5v: regulator-vcc_5v { 88 + compatible = "regulator-fixed"; 89 + regulator-name = "VCC_5V"; 90 + regulator-min-microvolt = <5000000>; 91 + regulator-max-microvolt = <5000000>; 92 + vin-supply = <&dc_in>; 93 + 94 + gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>; 95 + enable-active-high; 96 + }; 97 + 98 + vcc_1v8: regulator-vcc_1v8 { 99 + compatible = "regulator-fixed"; 100 + regulator-name = "VCC_1V8"; 101 + regulator-min-microvolt = <1800000>; 102 + regulator-max-microvolt = <1800000>; 103 + vin-supply = <&vcc_3v3>; 104 + regulator-always-on; 105 + }; 106 + 107 + vcc_3v3: regulator-vcc_3v3 { 108 + compatible = "regulator-fixed"; 109 + regulator-name = "VCC_3V3"; 110 + regulator-min-microvolt = <3300000>; 111 + regulator-max-microvolt = <3300000>; 112 + vin-supply = <&vsys_3v3>; 113 + regulator-always-on; 114 + /* FIXME: actually controlled by VDDCPU_B_EN */ 115 + }; 116 + 117 + vddao_1v8: regulator-vddao_1v8 { 118 + compatible = "regulator-fixed"; 119 + regulator-name = "VDDIO_AO1V8"; 120 + regulator-min-microvolt = <1800000>; 121 + regulator-max-microvolt = <1800000>; 122 + vin-supply = <&vsys_3v3>; 123 + regulator-always-on; 124 + }; 125 + 126 + emmc_1v8: regulator-emmc_1v8 { 127 + compatible = "regulator-fixed"; 128 + regulator-name = "EMMC_AO1V8"; 129 + regulator-min-microvolt = <1800000>; 130 + regulator-max-microvolt = <1800000>; 131 + vin-supply = <&vcc_3v3>; 132 + regulator-always-on; 133 + }; 134 + 135 + vsys_3v3: regulator-vsys_3v3 { 136 + compatible = "regulator-fixed"; 137 + regulator-name = "VSYS_3V3"; 138 + regulator-min-microvolt = <3300000>; 139 + regulator-max-microvolt = <3300000>; 140 + vin-supply = <&dc_in>; 141 + regulator-always-on; 142 + }; 143 + 144 + usb_pwr: regulator-usb_pwr { 145 + compatible = "regulator-fixed"; 146 + regulator-name = "USB_PWR"; 147 + regulator-min-microvolt = <5000000>; 148 + regulator-max-microvolt = <5000000>; 149 + vin-supply = <&vcc_5v>; 150 + 151 + gpio = <&gpio GPIOA_6 GPIO_ACTIVE_HIGH>; 152 + enable-active-high; 153 + }; 154 + 155 + hdmi-connector { 156 + compatible = "hdmi-connector"; 157 + type = "a"; 158 + 159 + port { 160 + hdmi_connector_in: endpoint { 161 + remote-endpoint = <&hdmi_tx_tmds_out>; 162 + }; 163 + }; 164 + }; 165 + 166 + wifi32k: wifi32k { 167 + compatible = "pwm-clock"; 168 + #clock-cells = <0>; 169 + clock-frequency = <32768>; 170 + pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ 171 + }; 172 + }; 173 + 174 + &cec_AO { 175 + pinctrl-0 = <&cec_ao_a_h_pins>; 176 + pinctrl-names = "default"; 177 + status = "disabled"; 178 + hdmi-phandle = <&hdmi_tx>; 179 + }; 180 + 181 + &cecb_AO { 182 + pinctrl-0 = <&cec_ao_b_h_pins>; 183 + pinctrl-names = "default"; 184 + status = "okay"; 185 + hdmi-phandle = <&hdmi_tx>; 186 + }; 187 + 188 + &ext_mdio { 189 + external_phy: ethernet-phy@0 { 190 + /* Realtek RTL8211F (0x001cc916) */ 191 + reg = <0>; 192 + max-speed = <1000>; 193 + 194 + interrupt-parent = <&gpio_intc>; 195 + /* MAC_INTR on GPIOZ_14 */ 196 + interrupts = <26 IRQ_TYPE_LEVEL_LOW>; 197 + }; 198 + }; 199 + 200 + &ethmac { 201 + pinctrl-0 = <&eth_pins>, <&eth_rgmii_pins>; 202 + pinctrl-names = "default"; 203 + status = "okay"; 204 + phy-mode = "rgmii"; 205 + phy-handle = <&external_phy>; 206 + amlogic,tx-delay-ns = <2>; 207 + }; 208 + 209 + &hdmi_tx { 210 + status = "okay"; 211 + pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; 212 + pinctrl-names = "default"; 213 + hdmi-supply = <&vcc_5v>; 214 + }; 215 + 216 + &hdmi_tx_tmds_port { 217 + hdmi_tx_tmds_out: endpoint { 218 + remote-endpoint = <&hdmi_connector_in>; 219 + }; 220 + }; 221 + 222 + &i2c_AO { 223 + status = "okay"; 224 + pinctrl-0 = <&i2c_ao_sck_pins>, <&i2c_ao_sda_pins>; 225 + pinctrl-names = "default"; 226 + 227 + gpio_expander: gpio-controller@20 { 228 + compatible = "ti,tca6408"; 229 + reg = <0x20>; 230 + vcc-supply = <&vcc_3v3>; 231 + gpio-controller; 232 + #gpio-cells = <2>; 233 + }; 234 + 235 + rtc@51 { 236 + compatible = "haoyu,hym8563"; 237 + reg = <0x51>; 238 + #clock-cells = <0>; 239 + }; 240 + }; 241 + 242 + &ir { 243 + status = "okay"; 244 + pinctrl-0 = <&remote_input_ao_pins>; 245 + pinctrl-names = "default"; 246 + linux,rc-map-name = "rc-khadas"; 247 + }; 248 + 249 + &pwm_ef { 250 + status = "okay"; 251 + pinctrl-0 = <&pwm_e_pins>; 252 + pinctrl-names = "default"; 253 + }; 254 + 255 + &saradc { 256 + status = "okay"; 257 + vref-supply = <&vddao_1v8>; 258 + }; 259 + 260 + /* SDIO */ 261 + &sd_emmc_a { 262 + status = "okay"; 263 + pinctrl-0 = <&sdio_pins>; 264 + pinctrl-1 = <&sdio_clk_gate_pins>; 265 + pinctrl-names = "default", "clk-gate"; 266 + #address-cells = <1>; 267 + #size-cells = <0>; 268 + 269 + bus-width = <4>; 270 + cap-sd-highspeed; 271 + sd-uhs-sdr50; 272 + max-frequency = <100000000>; 273 + 274 + non-removable; 275 + disable-wp; 276 + 277 + mmc-pwrseq = <&sdio_pwrseq>; 278 + 279 + vmmc-supply = <&vsys_3v3>; 280 + vqmmc-supply = <&vddao_1v8>; 281 + 282 + brcmf: wifi@1 { 283 + reg = <1>; 284 + compatible = "brcm,bcm4329-fmac"; 285 + }; 286 + }; 287 + 288 + /* SD card */ 289 + &sd_emmc_b { 290 + status = "okay"; 291 + pinctrl-0 = <&sdcard_c_pins>; 292 + pinctrl-1 = <&sdcard_clk_gate_c_pins>; 293 + pinctrl-names = "default", "clk-gate"; 294 + 295 + bus-width = <4>; 296 + cap-sd-highspeed; 297 + max-frequency = <50000000>; 298 + disable-wp; 299 + 300 + cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; 301 + vmmc-supply = <&vsys_3v3>; 302 + vqmmc-supply = <&vsys_3v3>; 303 + }; 304 + 305 + /* eMMC */ 306 + &sd_emmc_c { 307 + status = "okay"; 308 + pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>; 309 + pinctrl-1 = <&emmc_clk_gate_pins>; 310 + pinctrl-names = "default", "clk-gate"; 311 + 312 + bus-width = <8>; 313 + cap-mmc-highspeed; 314 + mmc-ddr-1_8v; 315 + mmc-hs200-1_8v; 316 + max-frequency = <200000000>; 317 + disable-wp; 318 + 319 + mmc-pwrseq = <&emmc_pwrseq>; 320 + vmmc-supply = <&vcc_3v3>; 321 + vqmmc-supply = <&emmc_1v8>; 322 + }; 323 + 324 + &uart_A { 325 + status = "okay"; 326 + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; 327 + pinctrl-names = "default"; 328 + uart-has-rtscts; 329 + 330 + bluetooth { 331 + compatible = "brcm,bcm43438-bt"; 332 + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; 333 + max-speed = <2000000>; 334 + clocks = <&wifi32k>; 335 + clock-names = "lpo"; 336 + }; 337 + }; 338 + 339 + &uart_AO { 340 + status = "okay"; 341 + pinctrl-0 = <&uart_ao_a_pins>; 342 + pinctrl-names = "default"; 343 + }; 344 + 345 + &usb2_phy0 { 346 + phy-supply = <&dc_in>; 347 + }; 348 + 349 + &usb2_phy1 { 350 + phy-supply = <&usb_pwr>; 351 + }; 352 + 353 + &usb3_pcie_phy { 354 + phy-supply = <&usb_pwr>; 355 + }; 356 + 357 + &usb { 358 + status = "okay"; 359 + dr_mode = "peripheral"; 360 + };
+70
arch/arm64/boot/dts/amlogic/meson-sm1-khadas-vim3l.dts
··· 1 + // SPDX-License-Identifier: (GPL-2.0+ OR MIT) 2 + /* 3 + * Copyright (c) 2019 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + */ 6 + 7 + /dts-v1/; 8 + 9 + #include "meson-sm1.dtsi" 10 + #include "meson-khadas-vim3.dtsi" 11 + 12 + / { 13 + compatible = "khadas,vim3l", "amlogic,sm1"; 14 + model = "Khadas VIM3L"; 15 + 16 + vddcpu: regulator-vddcpu { 17 + /* 18 + * Silergy SY8030DEC Regulator. 19 + */ 20 + compatible = "pwm-regulator"; 21 + 22 + regulator-name = "VDDCPU"; 23 + regulator-min-microvolt = <690000>; 24 + regulator-max-microvolt = <1050000>; 25 + 26 + vin-supply = <&vsys_3v3>; 27 + 28 + pwms = <&pwm_AO_cd 1 1250 0>; 29 + pwm-dutycycle-range = <100 0>; 30 + 31 + regulator-boot-on; 32 + regulator-always-on; 33 + }; 34 + }; 35 + 36 + &cpu0 { 37 + cpu-supply = <&vddcpu>; 38 + operating-points-v2 = <&cpu_opp_table>; 39 + clocks = <&clkc CLKID_CPU_CLK>; 40 + clock-latency = <50000>; 41 + }; 42 + 43 + &cpu1 { 44 + cpu-supply = <&vddcpu>; 45 + operating-points-v2 = <&cpu_opp_table>; 46 + clocks = <&clkc CLKID_CPU1_CLK>; 47 + clock-latency = <50000>; 48 + }; 49 + 50 + &cpu2 { 51 + cpu-supply = <&vddcpu>; 52 + operating-points-v2 = <&cpu_opp_table>; 53 + clocks = <&clkc CLKID_CPU2_CLK>; 54 + clock-latency = <50000>; 55 + }; 56 + 57 + &cpu3 { 58 + cpu-supply = <&vddcpu>; 59 + operating-points-v2 = <&cpu_opp_table>; 60 + clocks = <&clkc CLKID_CPU3_CLK>; 61 + clock-latency = <50000>; 62 + }; 63 + 64 + &pwm_AO_cd { 65 + pinctrl-0 = <&pwm_ao_d_e_pins>; 66 + pinctrl-names = "default"; 67 + clocks = <&xtal>; 68 + clock-names = "clkin1"; 69 + status = "okay"; 70 + };
+83
arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts
··· 51 51 }; 52 52 }; 53 53 54 + hdmi-connector { 55 + compatible = "hdmi-connector"; 56 + type = "a"; 57 + 58 + port { 59 + hdmi_connector_in: endpoint { 60 + remote-endpoint = <&hdmi_tx_tmds_out>; 61 + }; 62 + }; 63 + }; 64 + 54 65 leds { 55 66 compatible = "gpio-leds"; 56 67 ··· 136 125 regulator-always-on; 137 126 }; 138 127 128 + vddcpu: regulator-vddcpu { 129 + /* 130 + * SY8120B1ABC DC/DC Regulator. 131 + */ 132 + compatible = "pwm-regulator"; 133 + 134 + regulator-name = "VDDCPU"; 135 + regulator-min-microvolt = <690000>; 136 + regulator-max-microvolt = <1050000>; 137 + 138 + vin-supply = <&dc_in>; 139 + 140 + pwms = <&pwm_AO_cd 1 1500 0>; 141 + pwm-dutycycle-range = <100 0>; 142 + 143 + regulator-boot-on; 144 + regulator-always-on; 145 + }; 146 + 139 147 vddio_ao1v8: regulator-vddio_ao1v8 { 140 148 compatible = "regulator-fixed"; 141 149 regulator-name = "VDDIO_AO1V8"; ··· 201 171 hdmi-phandle = <&hdmi_tx>; 202 172 }; 203 173 174 + &cpu0 { 175 + cpu-supply = <&vddcpu>; 176 + operating-points-v2 = <&cpu_opp_table>; 177 + clocks = <&clkc CLKID_CPU_CLK>; 178 + clock-latency = <50000>; 179 + }; 180 + 181 + &cpu1 { 182 + cpu-supply = <&vddcpu>; 183 + operating-points-v2 = <&cpu_opp_table>; 184 + clocks = <&clkc CLKID_CPU1_CLK>; 185 + clock-latency = <50000>; 186 + }; 187 + 188 + &cpu2 { 189 + cpu-supply = <&vddcpu>; 190 + operating-points-v2 = <&cpu_opp_table>; 191 + clocks = <&clkc CLKID_CPU2_CLK>; 192 + clock-latency = <50000>; 193 + }; 194 + 195 + &cpu3 { 196 + cpu-supply = <&vddcpu>; 197 + operating-points-v2 = <&cpu_opp_table>; 198 + clocks = <&clkc CLKID_CPU3_CLK>; 199 + clock-latency = <50000>; 200 + }; 201 + 204 202 &ethmac { 205 203 status = "okay"; 206 204 phy-handle = <&internal_ephy>; 207 205 phy-mode = "rmii"; 206 + }; 207 + 208 + &hdmi_tx { 209 + status = "okay"; 210 + pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; 211 + pinctrl-names = "default"; 212 + }; 213 + 214 + &hdmi_tx_tmds_port { 215 + hdmi_tx_tmds_out: endpoint { 216 + remote-endpoint = <&hdmi_connector_in>; 217 + }; 208 218 }; 209 219 210 220 &i2c3 { ··· 265 195 pinctrl-names = "default"; 266 196 clocks = <&xtal>; 267 197 clock-names = "clkin0"; 198 + }; 199 + 200 + &pwm_AO_cd { 201 + pinctrl-0 = <&pwm_ao_d_e_pins>; 202 + pinctrl-names = "default"; 203 + clocks = <&xtal>; 204 + clock-names = "clkin1"; 205 + status = "okay"; 268 206 }; 269 207 270 208 &pwm_ef { ··· 375 297 status = "okay"; 376 298 pinctrl-0 = <&uart_ao_a_pins>; 377 299 pinctrl-names = "default"; 300 + }; 301 + 302 + &usb { 303 + status = "okay"; 304 + dr_mode = "otg"; 378 305 };
+82 -3
arch/arm64/boot/dts/amlogic/meson-sm1.dtsi
··· 5 5 */ 6 6 7 7 #include "meson-g12-common.dtsi" 8 + #include <dt-bindings/power/meson-sm1-power.h> 8 9 9 10 / { 10 11 compatible = "amlogic,sm1"; ··· 50 49 compatible = "cache"; 51 50 }; 52 51 }; 52 + 53 + cpu_opp_table: opp-table { 54 + compatible = "operating-points-v2"; 55 + opp-shared; 56 + 57 + opp-100000000 { 58 + opp-hz = /bits/ 64 <100000000>; 59 + opp-microvolt = <730000>; 60 + }; 61 + 62 + opp-250000000 { 63 + opp-hz = /bits/ 64 <250000000>; 64 + opp-microvolt = <730000>; 65 + }; 66 + 67 + opp-500000000 { 68 + opp-hz = /bits/ 64 <500000000>; 69 + opp-microvolt = <730000>; 70 + }; 71 + 72 + opp-667000000 { 73 + opp-hz = /bits/ 64 <666666666>; 74 + opp-microvolt = <750000>; 75 + }; 76 + 77 + opp-1000000000 { 78 + opp-hz = /bits/ 64 <1000000000>; 79 + opp-microvolt = <770000>; 80 + }; 81 + 82 + opp-1200000000 { 83 + opp-hz = /bits/ 64 <1200000000>; 84 + opp-microvolt = <780000>; 85 + }; 86 + 87 + opp-1404000000 { 88 + opp-hz = /bits/ 64 <1404000000>; 89 + opp-microvolt = <790000>; 90 + }; 91 + 92 + opp-1512000000 { 93 + opp-hz = /bits/ 64 <1500000000>; 94 + opp-microvolt = <800000>; 95 + }; 96 + 97 + opp-1608000000 { 98 + opp-hz = /bits/ 64 <1608000000>; 99 + opp-microvolt = <810000>; 100 + }; 101 + 102 + opp-1704000000 { 103 + opp-hz = /bits/ 64 <1704000000>; 104 + opp-microvolt = <850000>; 105 + }; 106 + 107 + opp-1800000000 { 108 + opp-hz = /bits/ 64 <1800000000>; 109 + opp-microvolt = <900000>; 110 + }; 111 + 112 + opp-1908000000 { 113 + opp-hz = /bits/ 64 <1908000000>; 114 + opp-microvolt = <950000>; 115 + }; 116 + }; 53 117 }; 54 118 55 119 &cecb_AO { ··· 125 59 compatible = "amlogic,meson-sm1-clk-measure"; 126 60 }; 127 61 128 - &pwrc_vpu { 129 - status = "disabled"; 62 + 63 + &clkc { 64 + compatible = "amlogic,sm1-clkc"; 65 + }; 66 + 67 + &ethmac { 68 + power-domains = <&pwrc PWRC_SM1_ETH_ID>; 69 + }; 70 + 71 + &pwrc { 72 + compatible = "amlogic,meson-sm1-pwrc"; 130 73 }; 131 74 132 75 &vpu { 133 - status = "disabled"; 76 + power-domains = <&pwrc PWRC_SM1_VPU_ID>; 77 + }; 78 + 79 + &usb { 80 + power-domains = <&pwrc PWRC_SM1_USB_ID>; 134 81 };
+11
drivers/soc/amlogic/Kconfig
··· 37 37 Say yes to expose Amlogic Meson GX Power Domains as 38 38 Generic Power Domains. 39 39 40 + config MESON_EE_PM_DOMAINS 41 + bool "Amlogic Meson Everything-Else Power Domains driver" 42 + depends on ARCH_MESON || COMPILE_TEST 43 + depends on PM && OF 44 + default ARCH_MESON 45 + select PM_GENERIC_DOMAINS 46 + select PM_GENERIC_DOMAINS_OF 47 + help 48 + Say yes to expose Amlogic Meson Everything-Else Power Domains as 49 + Generic Power Domains. 50 + 40 51 config MESON_MX_SOCINFO 41 52 bool "Amlogic Meson MX SoC Information driver" 42 53 depends on ARCH_MESON || COMPILE_TEST
+1
drivers/soc/amlogic/Makefile
··· 4 4 obj-$(CONFIG_MESON_GX_SOCINFO) += meson-gx-socinfo.o 5 5 obj-$(CONFIG_MESON_GX_PM_DOMAINS) += meson-gx-pwrc-vpu.o 6 6 obj-$(CONFIG_MESON_MX_SOCINFO) += meson-mx-socinfo.o 7 + obj-$(CONFIG_MESON_EE_PM_DOMAINS) += meson-ee-pwrc.o
+147 -1
drivers/soc/amlogic/meson-clk-measure.c
··· 11 11 #include <linux/debugfs.h> 12 12 #include <linux/regmap.h> 13 13 14 + static DEFINE_MUTEX(measure_lock); 15 + 14 16 #define MSR_CLK_DUTY 0x0 15 17 #define MSR_CLK_REG0 0x4 16 18 #define MSR_CLK_REG1 0x8 ··· 324 322 CLK_MSR_ID(84, "co_tx"), 325 323 CLK_MSR_ID(89, "hdmi_todig"), 326 324 CLK_MSR_ID(90, "hdmitx_sys"), 325 + CLK_MSR_ID(91, "sys_cpub_div16"), 326 + CLK_MSR_ID(92, "sys_pll_cpub_div16"), 327 327 CLK_MSR_ID(94, "eth_phy_rx"), 328 328 CLK_MSR_ID(95, "eth_phy_pll"), 329 329 CLK_MSR_ID(96, "vpu_b"), ··· 357 353 CLK_MSR_ID(122, "audio_pdm_dclk"), 358 354 }; 359 355 356 + static struct meson_msr_id clk_msr_sm1[CLK_MSR_MAX] = { 357 + CLK_MSR_ID(0, "ring_osc_out_ee_0"), 358 + CLK_MSR_ID(1, "ring_osc_out_ee_1"), 359 + CLK_MSR_ID(2, "ring_osc_out_ee_2"), 360 + CLK_MSR_ID(3, "ring_osc_out_ee_3"), 361 + CLK_MSR_ID(4, "gp0_pll"), 362 + CLK_MSR_ID(5, "gp1_pll"), 363 + CLK_MSR_ID(6, "enci"), 364 + CLK_MSR_ID(7, "clk81"), 365 + CLK_MSR_ID(8, "encp"), 366 + CLK_MSR_ID(9, "encl"), 367 + CLK_MSR_ID(10, "vdac"), 368 + CLK_MSR_ID(11, "eth_tx"), 369 + CLK_MSR_ID(12, "hifi_pll"), 370 + CLK_MSR_ID(13, "mod_tcon"), 371 + CLK_MSR_ID(14, "fec_0"), 372 + CLK_MSR_ID(15, "fec_1"), 373 + CLK_MSR_ID(16, "fec_2"), 374 + CLK_MSR_ID(17, "sys_pll_div16"), 375 + CLK_MSR_ID(18, "sys_cpu_div16"), 376 + CLK_MSR_ID(19, "lcd_an_ph2"), 377 + CLK_MSR_ID(20, "rtc_osc_out"), 378 + CLK_MSR_ID(21, "lcd_an_ph3"), 379 + CLK_MSR_ID(22, "eth_phy_ref"), 380 + CLK_MSR_ID(23, "mpll_50m"), 381 + CLK_MSR_ID(24, "eth_125m"), 382 + CLK_MSR_ID(25, "eth_rmii"), 383 + CLK_MSR_ID(26, "sc_int"), 384 + CLK_MSR_ID(27, "in_mac"), 385 + CLK_MSR_ID(28, "sar_adc"), 386 + CLK_MSR_ID(29, "pcie_inp"), 387 + CLK_MSR_ID(30, "pcie_inn"), 388 + CLK_MSR_ID(31, "mpll_test_out"), 389 + CLK_MSR_ID(32, "vdec"), 390 + CLK_MSR_ID(34, "eth_mpll_50m"), 391 + CLK_MSR_ID(35, "mali"), 392 + CLK_MSR_ID(36, "hdmi_tx_pixel"), 393 + CLK_MSR_ID(37, "cdac"), 394 + CLK_MSR_ID(38, "vdin_meas"), 395 + CLK_MSR_ID(39, "bt656"), 396 + CLK_MSR_ID(40, "arm_ring_osc_out_4"), 397 + CLK_MSR_ID(41, "eth_rx_or_rmii"), 398 + CLK_MSR_ID(42, "mp0_out"), 399 + CLK_MSR_ID(43, "fclk_div5"), 400 + CLK_MSR_ID(44, "pwm_b"), 401 + CLK_MSR_ID(45, "pwm_a"), 402 + CLK_MSR_ID(46, "vpu"), 403 + CLK_MSR_ID(47, "ddr_dpll_pt"), 404 + CLK_MSR_ID(48, "mp1_out"), 405 + CLK_MSR_ID(49, "mp2_out"), 406 + CLK_MSR_ID(50, "mp3_out"), 407 + CLK_MSR_ID(51, "sd_emmc_c"), 408 + CLK_MSR_ID(52, "sd_emmc_b"), 409 + CLK_MSR_ID(53, "sd_emmc_a"), 410 + CLK_MSR_ID(54, "vpu_clkc"), 411 + CLK_MSR_ID(55, "vid_pll_div_out"), 412 + CLK_MSR_ID(56, "wave420l_a"), 413 + CLK_MSR_ID(57, "wave420l_c"), 414 + CLK_MSR_ID(58, "wave420l_b"), 415 + CLK_MSR_ID(59, "hcodec"), 416 + CLK_MSR_ID(60, "arm_ring_osc_out_5"), 417 + CLK_MSR_ID(61, "gpio_msr"), 418 + CLK_MSR_ID(62, "hevcb"), 419 + CLK_MSR_ID(63, "dsi_meas"), 420 + CLK_MSR_ID(64, "spicc_1"), 421 + CLK_MSR_ID(65, "spicc_0"), 422 + CLK_MSR_ID(66, "vid_lock"), 423 + CLK_MSR_ID(67, "dsi_phy"), 424 + CLK_MSR_ID(68, "hdcp22_esm"), 425 + CLK_MSR_ID(69, "hdcp22_skp"), 426 + CLK_MSR_ID(70, "pwm_f"), 427 + CLK_MSR_ID(71, "pwm_e"), 428 + CLK_MSR_ID(72, "pwm_d"), 429 + CLK_MSR_ID(73, "pwm_c"), 430 + CLK_MSR_ID(74, "arm_ring_osc_out_6"), 431 + CLK_MSR_ID(75, "hevcf"), 432 + CLK_MSR_ID(76, "arm_ring_osc_out_7"), 433 + CLK_MSR_ID(77, "rng_ring_osc_0"), 434 + CLK_MSR_ID(78, "rng_ring_osc_1"), 435 + CLK_MSR_ID(79, "rng_ring_osc_2"), 436 + CLK_MSR_ID(80, "rng_ring_osc_3"), 437 + CLK_MSR_ID(81, "vapb"), 438 + CLK_MSR_ID(82, "ge2d"), 439 + CLK_MSR_ID(83, "co_rx"), 440 + CLK_MSR_ID(84, "co_tx"), 441 + CLK_MSR_ID(85, "arm_ring_osc_out_8"), 442 + CLK_MSR_ID(86, "arm_ring_osc_out_9"), 443 + CLK_MSR_ID(87, "mipi_dsi_phy"), 444 + CLK_MSR_ID(88, "cis2_adapt"), 445 + CLK_MSR_ID(89, "hdmi_todig"), 446 + CLK_MSR_ID(90, "hdmitx_sys"), 447 + CLK_MSR_ID(91, "nna_core"), 448 + CLK_MSR_ID(92, "nna_axi"), 449 + CLK_MSR_ID(93, "vad"), 450 + CLK_MSR_ID(94, "eth_phy_rx"), 451 + CLK_MSR_ID(95, "eth_phy_pll"), 452 + CLK_MSR_ID(96, "vpu_b"), 453 + CLK_MSR_ID(97, "cpu_b_tmp"), 454 + CLK_MSR_ID(98, "ts"), 455 + CLK_MSR_ID(99, "arm_ring_osc_out_10"), 456 + CLK_MSR_ID(100, "arm_ring_osc_out_11"), 457 + CLK_MSR_ID(101, "arm_ring_osc_out_12"), 458 + CLK_MSR_ID(102, "arm_ring_osc_out_13"), 459 + CLK_MSR_ID(103, "arm_ring_osc_out_14"), 460 + CLK_MSR_ID(104, "arm_ring_osc_out_15"), 461 + CLK_MSR_ID(105, "arm_ring_osc_out_16"), 462 + CLK_MSR_ID(106, "ephy_test"), 463 + CLK_MSR_ID(107, "au_dac_g128x"), 464 + CLK_MSR_ID(108, "audio_locker_out"), 465 + CLK_MSR_ID(109, "audio_locker_in"), 466 + CLK_MSR_ID(110, "audio_tdmout_c_sclk"), 467 + CLK_MSR_ID(111, "audio_tdmout_b_sclk"), 468 + CLK_MSR_ID(112, "audio_tdmout_a_sclk"), 469 + CLK_MSR_ID(113, "audio_tdmin_lb_sclk"), 470 + CLK_MSR_ID(114, "audio_tdmin_c_sclk"), 471 + CLK_MSR_ID(115, "audio_tdmin_b_sclk"), 472 + CLK_MSR_ID(116, "audio_tdmin_a_sclk"), 473 + CLK_MSR_ID(117, "audio_resample"), 474 + CLK_MSR_ID(118, "audio_pdm_sys"), 475 + CLK_MSR_ID(119, "audio_spdifout_b"), 476 + CLK_MSR_ID(120, "audio_spdifout"), 477 + CLK_MSR_ID(121, "audio_spdifin"), 478 + CLK_MSR_ID(122, "audio_pdm_dclk"), 479 + CLK_MSR_ID(123, "audio_resampled"), 480 + CLK_MSR_ID(124, "earcrx_pll"), 481 + CLK_MSR_ID(125, "earcrx_pll_test"), 482 + CLK_MSR_ID(126, "csi_phy0"), 483 + CLK_MSR_ID(127, "csi2_data"), 484 + }; 485 + 360 486 static int meson_measure_id(struct meson_msr_id *clk_msr_id, 361 487 unsigned int duration) 362 488 { 363 489 struct meson_msr *priv = clk_msr_id->priv; 364 490 unsigned int val; 365 491 int ret; 492 + 493 + ret = mutex_lock_interruptible(&measure_lock); 494 + if (ret) 495 + return ret; 366 496 367 497 regmap_write(priv->regmap, MSR_CLK_REG0, 0); 368 498 ··· 515 377 516 378 ret = regmap_read_poll_timeout(priv->regmap, MSR_CLK_REG0, 517 379 val, !(val & MSR_BUSY), 10, 10000); 518 - if (ret) 380 + if (ret) { 381 + mutex_unlock(&measure_lock); 519 382 return ret; 383 + } 520 384 521 385 /* Disable */ 522 386 regmap_update_bits(priv->regmap, MSR_CLK_REG0, MSR_ENABLE, 0); 523 387 524 388 /* Get the value in multiple of gate time counts */ 525 389 regmap_read(priv->regmap, MSR_CLK_REG2, &val); 390 + 391 + mutex_unlock(&measure_lock); 526 392 527 393 if (val >= MSR_VAL_MASK) 528 394 return -EINVAL; ··· 674 532 { 675 533 .compatible = "amlogic,meson-g12a-clk-measure", 676 534 .data = (void *)clk_msr_g12a, 535 + }, 536 + { 537 + .compatible = "amlogic,meson-sm1-clk-measure", 538 + .data = (void *)clk_msr_sm1, 677 539 }, 678 540 { /* sentinel */ } 679 541 };
+492
drivers/soc/amlogic/meson-ee-pwrc.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Copyright (c) 2019 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + */ 6 + 7 + #include <linux/of_address.h> 8 + #include <linux/platform_device.h> 9 + #include <linux/pm_domain.h> 10 + #include <linux/bitfield.h> 11 + #include <linux/regmap.h> 12 + #include <linux/mfd/syscon.h> 13 + #include <linux/of_device.h> 14 + #include <linux/reset-controller.h> 15 + #include <linux/reset.h> 16 + #include <linux/clk.h> 17 + #include <dt-bindings/power/meson-g12a-power.h> 18 + #include <dt-bindings/power/meson-sm1-power.h> 19 + 20 + /* AO Offsets */ 21 + 22 + #define AO_RTI_GEN_PWR_SLEEP0 (0x3a << 2) 23 + #define AO_RTI_GEN_PWR_ISO0 (0x3b << 2) 24 + 25 + /* HHI Offsets */ 26 + 27 + #define HHI_MEM_PD_REG0 (0x40 << 2) 28 + #define HHI_VPU_MEM_PD_REG0 (0x41 << 2) 29 + #define HHI_VPU_MEM_PD_REG1 (0x42 << 2) 30 + #define HHI_VPU_MEM_PD_REG3 (0x43 << 2) 31 + #define HHI_VPU_MEM_PD_REG4 (0x44 << 2) 32 + #define HHI_AUDIO_MEM_PD_REG0 (0x45 << 2) 33 + #define HHI_NANOQ_MEM_PD_REG0 (0x46 << 2) 34 + #define HHI_NANOQ_MEM_PD_REG1 (0x47 << 2) 35 + #define HHI_VPU_MEM_PD_REG2 (0x4d << 2) 36 + 37 + struct meson_ee_pwrc; 38 + struct meson_ee_pwrc_domain; 39 + 40 + struct meson_ee_pwrc_mem_domain { 41 + unsigned int reg; 42 + unsigned int mask; 43 + }; 44 + 45 + struct meson_ee_pwrc_top_domain { 46 + unsigned int sleep_reg; 47 + unsigned int sleep_mask; 48 + unsigned int iso_reg; 49 + unsigned int iso_mask; 50 + }; 51 + 52 + struct meson_ee_pwrc_domain_desc { 53 + char *name; 54 + unsigned int reset_names_count; 55 + unsigned int clk_names_count; 56 + struct meson_ee_pwrc_top_domain *top_pd; 57 + unsigned int mem_pd_count; 58 + struct meson_ee_pwrc_mem_domain *mem_pd; 59 + bool (*get_power)(struct meson_ee_pwrc_domain *pwrc_domain); 60 + }; 61 + 62 + struct meson_ee_pwrc_domain_data { 63 + unsigned int count; 64 + struct meson_ee_pwrc_domain_desc *domains; 65 + }; 66 + 67 + /* TOP Power Domains */ 68 + 69 + static struct meson_ee_pwrc_top_domain g12a_pwrc_vpu = { 70 + .sleep_reg = AO_RTI_GEN_PWR_SLEEP0, 71 + .sleep_mask = BIT(8), 72 + .iso_reg = AO_RTI_GEN_PWR_SLEEP0, 73 + .iso_mask = BIT(9), 74 + }; 75 + 76 + #define SM1_EE_PD(__bit) \ 77 + { \ 78 + .sleep_reg = AO_RTI_GEN_PWR_SLEEP0, \ 79 + .sleep_mask = BIT(__bit), \ 80 + .iso_reg = AO_RTI_GEN_PWR_ISO0, \ 81 + .iso_mask = BIT(__bit), \ 82 + } 83 + 84 + static struct meson_ee_pwrc_top_domain sm1_pwrc_vpu = SM1_EE_PD(8); 85 + static struct meson_ee_pwrc_top_domain sm1_pwrc_nna = SM1_EE_PD(16); 86 + static struct meson_ee_pwrc_top_domain sm1_pwrc_usb = SM1_EE_PD(17); 87 + static struct meson_ee_pwrc_top_domain sm1_pwrc_pci = SM1_EE_PD(18); 88 + static struct meson_ee_pwrc_top_domain sm1_pwrc_ge2d = SM1_EE_PD(19); 89 + 90 + /* Memory PD Domains */ 91 + 92 + #define VPU_MEMPD(__reg) \ 93 + { __reg, GENMASK(1, 0) }, \ 94 + { __reg, GENMASK(3, 2) }, \ 95 + { __reg, GENMASK(5, 4) }, \ 96 + { __reg, GENMASK(7, 6) }, \ 97 + { __reg, GENMASK(9, 8) }, \ 98 + { __reg, GENMASK(11, 10) }, \ 99 + { __reg, GENMASK(13, 12) }, \ 100 + { __reg, GENMASK(15, 14) }, \ 101 + { __reg, GENMASK(17, 16) }, \ 102 + { __reg, GENMASK(19, 18) }, \ 103 + { __reg, GENMASK(21, 20) }, \ 104 + { __reg, GENMASK(23, 22) }, \ 105 + { __reg, GENMASK(25, 24) }, \ 106 + { __reg, GENMASK(27, 26) }, \ 107 + { __reg, GENMASK(29, 28) }, \ 108 + { __reg, GENMASK(31, 30) } 109 + 110 + #define VPU_HHI_MEMPD(__reg) \ 111 + { __reg, BIT(8) }, \ 112 + { __reg, BIT(9) }, \ 113 + { __reg, BIT(10) }, \ 114 + { __reg, BIT(11) }, \ 115 + { __reg, BIT(12) }, \ 116 + { __reg, BIT(13) }, \ 117 + { __reg, BIT(14) }, \ 118 + { __reg, BIT(15) } 119 + 120 + static struct meson_ee_pwrc_mem_domain g12a_pwrc_mem_vpu[] = { 121 + VPU_MEMPD(HHI_VPU_MEM_PD_REG0), 122 + VPU_MEMPD(HHI_VPU_MEM_PD_REG1), 123 + VPU_MEMPD(HHI_VPU_MEM_PD_REG2), 124 + VPU_HHI_MEMPD(HHI_MEM_PD_REG0), 125 + }; 126 + 127 + static struct meson_ee_pwrc_mem_domain g12a_pwrc_mem_eth[] = { 128 + { HHI_MEM_PD_REG0, GENMASK(3, 2) }, 129 + }; 130 + 131 + static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_vpu[] = { 132 + VPU_MEMPD(HHI_VPU_MEM_PD_REG0), 133 + VPU_MEMPD(HHI_VPU_MEM_PD_REG1), 134 + VPU_MEMPD(HHI_VPU_MEM_PD_REG2), 135 + VPU_MEMPD(HHI_VPU_MEM_PD_REG3), 136 + { HHI_VPU_MEM_PD_REG4, GENMASK(1, 0) }, 137 + { HHI_VPU_MEM_PD_REG4, GENMASK(3, 2) }, 138 + { HHI_VPU_MEM_PD_REG4, GENMASK(5, 4) }, 139 + { HHI_VPU_MEM_PD_REG4, GENMASK(7, 6) }, 140 + VPU_HHI_MEMPD(HHI_MEM_PD_REG0), 141 + }; 142 + 143 + static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_nna[] = { 144 + { HHI_NANOQ_MEM_PD_REG0, 0xff }, 145 + { HHI_NANOQ_MEM_PD_REG1, 0xff }, 146 + }; 147 + 148 + static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_usb[] = { 149 + { HHI_MEM_PD_REG0, GENMASK(31, 30) }, 150 + }; 151 + 152 + static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_pcie[] = { 153 + { HHI_MEM_PD_REG0, GENMASK(29, 26) }, 154 + }; 155 + 156 + static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_ge2d[] = { 157 + { HHI_MEM_PD_REG0, GENMASK(25, 18) }, 158 + }; 159 + 160 + static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_audio[] = { 161 + { HHI_MEM_PD_REG0, GENMASK(5, 4) }, 162 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(1, 0) }, 163 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(3, 2) }, 164 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(5, 4) }, 165 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(7, 6) }, 166 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(13, 12) }, 167 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(15, 14) }, 168 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(17, 16) }, 169 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(19, 18) }, 170 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(21, 20) }, 171 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(23, 22) }, 172 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(25, 24) }, 173 + { HHI_AUDIO_MEM_PD_REG0, GENMASK(27, 26) }, 174 + }; 175 + 176 + #define VPU_PD(__name, __top_pd, __mem, __get_power, __resets, __clks) \ 177 + { \ 178 + .name = __name, \ 179 + .reset_names_count = __resets, \ 180 + .clk_names_count = __clks, \ 181 + .top_pd = __top_pd, \ 182 + .mem_pd_count = ARRAY_SIZE(__mem), \ 183 + .mem_pd = __mem, \ 184 + .get_power = __get_power, \ 185 + } 186 + 187 + #define TOP_PD(__name, __top_pd, __mem, __get_power) \ 188 + { \ 189 + .name = __name, \ 190 + .top_pd = __top_pd, \ 191 + .mem_pd_count = ARRAY_SIZE(__mem), \ 192 + .mem_pd = __mem, \ 193 + .get_power = __get_power, \ 194 + } 195 + 196 + #define MEM_PD(__name, __mem) \ 197 + TOP_PD(__name, NULL, __mem, NULL) 198 + 199 + static bool pwrc_ee_get_power(struct meson_ee_pwrc_domain *pwrc_domain); 200 + 201 + static struct meson_ee_pwrc_domain_desc g12a_pwrc_domains[] = { 202 + [PWRC_G12A_VPU_ID] = VPU_PD("VPU", &g12a_pwrc_vpu, g12a_pwrc_mem_vpu, 203 + pwrc_ee_get_power, 11, 2), 204 + [PWRC_G12A_ETH_ID] = MEM_PD("ETH", g12a_pwrc_mem_eth), 205 + }; 206 + 207 + static struct meson_ee_pwrc_domain_desc sm1_pwrc_domains[] = { 208 + [PWRC_SM1_VPU_ID] = VPU_PD("VPU", &sm1_pwrc_vpu, sm1_pwrc_mem_vpu, 209 + pwrc_ee_get_power, 11, 2), 210 + [PWRC_SM1_NNA_ID] = TOP_PD("NNA", &sm1_pwrc_nna, sm1_pwrc_mem_nna, 211 + pwrc_ee_get_power), 212 + [PWRC_SM1_USB_ID] = TOP_PD("USB", &sm1_pwrc_usb, sm1_pwrc_mem_usb, 213 + pwrc_ee_get_power), 214 + [PWRC_SM1_PCIE_ID] = TOP_PD("PCI", &sm1_pwrc_pci, sm1_pwrc_mem_pcie, 215 + pwrc_ee_get_power), 216 + [PWRC_SM1_GE2D_ID] = TOP_PD("GE2D", &sm1_pwrc_ge2d, sm1_pwrc_mem_ge2d, 217 + pwrc_ee_get_power), 218 + [PWRC_SM1_AUDIO_ID] = MEM_PD("AUDIO", sm1_pwrc_mem_audio), 219 + [PWRC_SM1_ETH_ID] = MEM_PD("ETH", g12a_pwrc_mem_eth), 220 + }; 221 + 222 + struct meson_ee_pwrc_domain { 223 + struct generic_pm_domain base; 224 + bool enabled; 225 + struct meson_ee_pwrc *pwrc; 226 + struct meson_ee_pwrc_domain_desc desc; 227 + struct clk_bulk_data *clks; 228 + int num_clks; 229 + struct reset_control *rstc; 230 + int num_rstc; 231 + }; 232 + 233 + struct meson_ee_pwrc { 234 + struct regmap *regmap_ao; 235 + struct regmap *regmap_hhi; 236 + struct meson_ee_pwrc_domain *domains; 237 + struct genpd_onecell_data xlate; 238 + }; 239 + 240 + static bool pwrc_ee_get_power(struct meson_ee_pwrc_domain *pwrc_domain) 241 + { 242 + u32 reg; 243 + 244 + regmap_read(pwrc_domain->pwrc->regmap_ao, 245 + pwrc_domain->desc.top_pd->sleep_reg, &reg); 246 + 247 + return (reg & pwrc_domain->desc.top_pd->sleep_mask); 248 + } 249 + 250 + static int meson_ee_pwrc_off(struct generic_pm_domain *domain) 251 + { 252 + struct meson_ee_pwrc_domain *pwrc_domain = 253 + container_of(domain, struct meson_ee_pwrc_domain, base); 254 + int i; 255 + 256 + if (pwrc_domain->desc.top_pd) 257 + regmap_update_bits(pwrc_domain->pwrc->regmap_ao, 258 + pwrc_domain->desc.top_pd->sleep_reg, 259 + pwrc_domain->desc.top_pd->sleep_mask, 260 + pwrc_domain->desc.top_pd->sleep_mask); 261 + udelay(20); 262 + 263 + for (i = 0 ; i < pwrc_domain->desc.mem_pd_count ; ++i) 264 + regmap_update_bits(pwrc_domain->pwrc->regmap_hhi, 265 + pwrc_domain->desc.mem_pd[i].reg, 266 + pwrc_domain->desc.mem_pd[i].mask, 267 + pwrc_domain->desc.mem_pd[i].mask); 268 + 269 + udelay(20); 270 + 271 + if (pwrc_domain->desc.top_pd) 272 + regmap_update_bits(pwrc_domain->pwrc->regmap_ao, 273 + pwrc_domain->desc.top_pd->iso_reg, 274 + pwrc_domain->desc.top_pd->iso_mask, 275 + pwrc_domain->desc.top_pd->iso_mask); 276 + 277 + if (pwrc_domain->num_clks) { 278 + msleep(20); 279 + clk_bulk_disable_unprepare(pwrc_domain->num_clks, 280 + pwrc_domain->clks); 281 + } 282 + 283 + return 0; 284 + } 285 + 286 + static int meson_ee_pwrc_on(struct generic_pm_domain *domain) 287 + { 288 + struct meson_ee_pwrc_domain *pwrc_domain = 289 + container_of(domain, struct meson_ee_pwrc_domain, base); 290 + int i, ret; 291 + 292 + if (pwrc_domain->desc.top_pd) 293 + regmap_update_bits(pwrc_domain->pwrc->regmap_ao, 294 + pwrc_domain->desc.top_pd->sleep_reg, 295 + pwrc_domain->desc.top_pd->sleep_mask, 0); 296 + udelay(20); 297 + 298 + for (i = 0 ; i < pwrc_domain->desc.mem_pd_count ; ++i) 299 + regmap_update_bits(pwrc_domain->pwrc->regmap_hhi, 300 + pwrc_domain->desc.mem_pd[i].reg, 301 + pwrc_domain->desc.mem_pd[i].mask, 0); 302 + 303 + udelay(20); 304 + 305 + ret = reset_control_assert(pwrc_domain->rstc); 306 + if (ret) 307 + return ret; 308 + 309 + if (pwrc_domain->desc.top_pd) 310 + regmap_update_bits(pwrc_domain->pwrc->regmap_ao, 311 + pwrc_domain->desc.top_pd->iso_reg, 312 + pwrc_domain->desc.top_pd->iso_mask, 0); 313 + 314 + ret = reset_control_deassert(pwrc_domain->rstc); 315 + if (ret) 316 + return ret; 317 + 318 + return clk_bulk_prepare_enable(pwrc_domain->num_clks, 319 + pwrc_domain->clks); 320 + } 321 + 322 + static int meson_ee_pwrc_init_domain(struct platform_device *pdev, 323 + struct meson_ee_pwrc *pwrc, 324 + struct meson_ee_pwrc_domain *dom) 325 + { 326 + dom->pwrc = pwrc; 327 + dom->num_rstc = dom->desc.reset_names_count; 328 + dom->num_clks = dom->desc.clk_names_count; 329 + 330 + if (dom->num_rstc) { 331 + int count = reset_control_get_count(&pdev->dev); 332 + 333 + if (count != dom->num_rstc) 334 + dev_warn(&pdev->dev, "Invalid resets count %d for domain %s\n", 335 + count, dom->desc.name); 336 + 337 + dom->rstc = devm_reset_control_array_get(&pdev->dev, false, 338 + false); 339 + if (IS_ERR(dom->rstc)) 340 + return PTR_ERR(dom->rstc); 341 + } 342 + 343 + if (dom->num_clks) { 344 + int ret = devm_clk_bulk_get_all(&pdev->dev, &dom->clks); 345 + if (ret < 0) 346 + return ret; 347 + 348 + if (dom->num_clks != ret) { 349 + dev_warn(&pdev->dev, "Invalid clocks count %d for domain %s\n", 350 + ret, dom->desc.name); 351 + dom->num_clks = ret; 352 + } 353 + } 354 + 355 + dom->base.name = dom->desc.name; 356 + dom->base.power_on = meson_ee_pwrc_on; 357 + dom->base.power_off = meson_ee_pwrc_off; 358 + 359 + /* 360 + * TOFIX: This is a special case for the VPU power domain, which can 361 + * be enabled previously by the bootloader. In this case the VPU 362 + * pipeline may be functional but no driver maybe never attach 363 + * to this power domain, and if the domain is disabled it could 364 + * cause system errors. This is why the pm_domain_always_on_gov 365 + * is used here. 366 + * For the same reason, the clocks should be enabled in case 367 + * we need to power the domain off, otherwise the internal clocks 368 + * prepare/enable counters won't be in sync. 369 + */ 370 + if (dom->num_clks && dom->desc.get_power && !dom->desc.get_power(dom)) { 371 + int ret = clk_bulk_prepare_enable(dom->num_clks, dom->clks); 372 + if (ret) 373 + return ret; 374 + 375 + pm_genpd_init(&dom->base, &pm_domain_always_on_gov, false); 376 + } else 377 + pm_genpd_init(&dom->base, NULL, 378 + (dom->desc.get_power ? 379 + dom->desc.get_power(dom) : true)); 380 + 381 + return 0; 382 + } 383 + 384 + static int meson_ee_pwrc_probe(struct platform_device *pdev) 385 + { 386 + const struct meson_ee_pwrc_domain_data *match; 387 + struct regmap *regmap_ao, *regmap_hhi; 388 + struct meson_ee_pwrc *pwrc; 389 + int i, ret; 390 + 391 + match = of_device_get_match_data(&pdev->dev); 392 + if (!match) { 393 + dev_err(&pdev->dev, "failed to get match data\n"); 394 + return -ENODEV; 395 + } 396 + 397 + pwrc = devm_kzalloc(&pdev->dev, sizeof(*pwrc), GFP_KERNEL); 398 + if (!pwrc) 399 + return -ENOMEM; 400 + 401 + pwrc->xlate.domains = devm_kcalloc(&pdev->dev, match->count, 402 + sizeof(*pwrc->xlate.domains), 403 + GFP_KERNEL); 404 + if (!pwrc->xlate.domains) 405 + return -ENOMEM; 406 + 407 + pwrc->domains = devm_kcalloc(&pdev->dev, match->count, 408 + sizeof(*pwrc->domains), GFP_KERNEL); 409 + if (!pwrc->domains) 410 + return -ENOMEM; 411 + 412 + pwrc->xlate.num_domains = match->count; 413 + 414 + regmap_hhi = syscon_node_to_regmap(of_get_parent(pdev->dev.of_node)); 415 + if (IS_ERR(regmap_hhi)) { 416 + dev_err(&pdev->dev, "failed to get HHI regmap\n"); 417 + return PTR_ERR(regmap_hhi); 418 + } 419 + 420 + regmap_ao = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, 421 + "amlogic,ao-sysctrl"); 422 + if (IS_ERR(regmap_ao)) { 423 + dev_err(&pdev->dev, "failed to get AO regmap\n"); 424 + return PTR_ERR(regmap_ao); 425 + } 426 + 427 + pwrc->regmap_ao = regmap_ao; 428 + pwrc->regmap_hhi = regmap_hhi; 429 + 430 + platform_set_drvdata(pdev, pwrc); 431 + 432 + for (i = 0 ; i < match->count ; ++i) { 433 + struct meson_ee_pwrc_domain *dom = &pwrc->domains[i]; 434 + 435 + memcpy(&dom->desc, &match->domains[i], sizeof(dom->desc)); 436 + 437 + ret = meson_ee_pwrc_init_domain(pdev, pwrc, dom); 438 + if (ret) 439 + return ret; 440 + 441 + pwrc->xlate.domains[i] = &dom->base; 442 + } 443 + 444 + of_genpd_add_provider_onecell(pdev->dev.of_node, &pwrc->xlate); 445 + 446 + return 0; 447 + } 448 + 449 + static void meson_ee_pwrc_shutdown(struct platform_device *pdev) 450 + { 451 + struct meson_ee_pwrc *pwrc = platform_get_drvdata(pdev); 452 + int i; 453 + 454 + for (i = 0 ; i < pwrc->xlate.num_domains ; ++i) { 455 + struct meson_ee_pwrc_domain *dom = &pwrc->domains[i]; 456 + 457 + if (dom->desc.get_power && !dom->desc.get_power(dom)) 458 + meson_ee_pwrc_off(&dom->base); 459 + } 460 + } 461 + 462 + static struct meson_ee_pwrc_domain_data meson_ee_g12a_pwrc_data = { 463 + .count = ARRAY_SIZE(g12a_pwrc_domains), 464 + .domains = g12a_pwrc_domains, 465 + }; 466 + 467 + static struct meson_ee_pwrc_domain_data meson_ee_sm1_pwrc_data = { 468 + .count = ARRAY_SIZE(sm1_pwrc_domains), 469 + .domains = sm1_pwrc_domains, 470 + }; 471 + 472 + static const struct of_device_id meson_ee_pwrc_match_table[] = { 473 + { 474 + .compatible = "amlogic,meson-g12a-pwrc", 475 + .data = &meson_ee_g12a_pwrc_data, 476 + }, 477 + { 478 + .compatible = "amlogic,meson-sm1-pwrc", 479 + .data = &meson_ee_sm1_pwrc_data, 480 + }, 481 + { /* sentinel */ } 482 + }; 483 + 484 + static struct platform_driver meson_ee_pwrc_driver = { 485 + .probe = meson_ee_pwrc_probe, 486 + .shutdown = meson_ee_pwrc_shutdown, 487 + .driver = { 488 + .name = "meson_ee_pwrc", 489 + .of_match_table = meson_ee_pwrc_match_table, 490 + }, 491 + }; 492 + builtin_platform_driver(meson_ee_pwrc_driver);
+6 -1
drivers/soc/amlogic/meson-gx-socinfo.c
··· 39 39 { "TXHD", 0x27 }, 40 40 { "G12A", 0x28 }, 41 41 { "G12B", 0x29 }, 42 + { "SM1", 0x2b }, 42 43 }; 43 44 44 45 static const struct meson_gx_package_id { ··· 66 65 { "S905D2", 0x28, 0x10, 0xf0 }, 67 66 { "S905X2", 0x28, 0x40, 0xf0 }, 68 67 { "S922X", 0x29, 0x40, 0xf0 }, 68 + { "A311D", 0x29, 0x10, 0xf0 }, 69 + { "S905X3", 0x2b, 0x5, 0xf }, 69 70 }; 70 71 71 72 static inline unsigned int socinfo_to_major(u32 socinfo) ··· 141 138 } 142 139 143 140 /* check if chip-id is available */ 144 - if (!of_property_read_bool(np, "amlogic,has-chip-id")) 141 + if (!of_property_read_bool(np, "amlogic,has-chip-id")) { 142 + of_node_put(np); 145 143 return -ENODEV; 144 + } 146 145 147 146 /* node should be a syscon */ 148 147 regmap = syscon_node_to_regmap(np);
+5
include/dt-bindings/clock/g12a-clkc.h
··· 138 138 #define CLKID_VDEC_HEVCF 210 139 139 #define CLKID_TS 212 140 140 #define CLKID_CPUB_CLK 224 141 + #define CLKID_GP1_PLL 243 142 + #define CLKID_DSU_CLK 252 143 + #define CLKID_CPU1_CLK 253 144 + #define CLKID_CPU2_CLK 254 145 + #define CLKID_CPU3_CLK 255 141 146 142 147 #endif /* __G12A_CLKC_H */
+13
include/dt-bindings/power/meson-g12a-power.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0+ or MIT) */ 2 + /* 3 + * Copyright (c) 2019 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + */ 6 + 7 + #ifndef _DT_BINDINGS_MESON_G12A_POWER_H 8 + #define _DT_BINDINGS_MESON_G12A_POWER_H 9 + 10 + #define PWRC_G12A_VPU_ID 0 11 + #define PWRC_G12A_ETH_ID 1 12 + 13 + #endif
+18
include/dt-bindings/power/meson-sm1-power.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0+ or MIT) */ 2 + /* 3 + * Copyright (c) 2019 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + */ 6 + 7 + #ifndef _DT_BINDINGS_MESON_SM1_POWER_H 8 + #define _DT_BINDINGS_MESON_SM1_POWER_H 9 + 10 + #define PWRC_SM1_VPU_ID 0 11 + #define PWRC_SM1_NNA_ID 1 12 + #define PWRC_SM1_USB_ID 2 13 + #define PWRC_SM1_PCIE_ID 3 14 + #define PWRC_SM1_GE2D_ID 4 15 + #define PWRC_SM1_AUDIO_ID 5 16 + #define PWRC_SM1_ETH_ID 6 17 + 18 + #endif
+38
include/dt-bindings/reset/amlogic,meson-g12a-audio-reset.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2019 BayLibre, SAS. 4 + * Author: Jerome Brunet <jbrunet@baylibre.com> 5 + * 6 + */ 7 + 8 + #ifndef _DT_BINDINGS_AMLOGIC_MESON_G12A_AUDIO_RESET_H 9 + #define _DT_BINDINGS_AMLOGIC_MESON_G12A_AUDIO_RESET_H 10 + 11 + #define AUD_RESET_PDM 0 12 + #define AUD_RESET_TDMIN_A 1 13 + #define AUD_RESET_TDMIN_B 2 14 + #define AUD_RESET_TDMIN_C 3 15 + #define AUD_RESET_TDMIN_LB 4 16 + #define AUD_RESET_LOOPBACK 5 17 + #define AUD_RESET_TODDR_A 6 18 + #define AUD_RESET_TODDR_B 7 19 + #define AUD_RESET_TODDR_C 8 20 + #define AUD_RESET_FRDDR_A 9 21 + #define AUD_RESET_FRDDR_B 10 22 + #define AUD_RESET_FRDDR_C 11 23 + #define AUD_RESET_TDMOUT_A 12 24 + #define AUD_RESET_TDMOUT_B 13 25 + #define AUD_RESET_TDMOUT_C 14 26 + #define AUD_RESET_SPDIFOUT 15 27 + #define AUD_RESET_SPDIFOUT_B 16 28 + #define AUD_RESET_SPDIFIN 17 29 + #define AUD_RESET_EQDRC 18 30 + #define AUD_RESET_RESAMPLE 19 31 + #define AUD_RESET_DDRARB 20 32 + #define AUD_RESET_POWDET 21 33 + #define AUD_RESET_TORAM 22 34 + #define AUD_RESET_TOACODEC 23 35 + #define AUD_RESET_TOHDMITX 24 36 + #define AUD_RESET_CLKTREE 25 37 + 38 + #endif